python 환경 기준
1) 라이브러리 호출 및 데이터셋 불러오기
import pandas as pd # 판다스와 넘파이 라이브러리 호출
import numpy as np
df = pd.read_csv('주소.csv') # df라는 이름으로 데이터셋 불러오기
df.head() # 생략 가능 과정. 데이터의 대략적인 모습을 확인하기 위함.
2) 실행해야할 문제 조건 뜯어보기
'데이터에서 IQR을 활용해 Fare 컬럼의 이상치를 찾고, 이상치 데이터의 여성 수를 구하시오.' 라는 문제가 나왔다면
# IQR을 활용해 Fare 컬럼의 이상치 찾기
# 이상치 데이터의 여성 수 구하기
총 두가지의 값을 도출해야한다
3) 간단한 EDA 코드
df.shape # 데이터프레임의 (행, 열) 갯수를 알려줌
df.isnull().sum() # 각 컬럼별로 결측치 갯수를 알려줌
df.info() # 각 컬럼별 행의 수, 결측치 수, 데이터 타입을 알 수 있음
df.head() # 데이터프레임의 상단 5행을 보여줌 괄호 안에 숫자를 넣으면 숫자만큼의 행을 보여줌
4) 조건별 코드
* 판다스 기본 통계 함수 정리
# 최대값
df.max()
# 최소값
df.min()
# 평균값
df.mean()
# 중앙값
df.median()
# 최빈값
df.mode()
# 합계
df.sum()
# 데이터 수
df.count() --- 결측값은 제외됨
* 분위수
df.quantile(숫자)
* 분산
df.var()
* 표준편차
df.std()
* 왜도
df.skew()
* 첨도
df.kurt()
* 누적합
df.cumsum()
* 누적곱
df.sumprod()
* 누적 최대값
df.summax()
* 누적 최소값
df.cummin()
* 평균의 표준오차
df.sem()
* 평균의 절대편차
df.mad()
* 절대값
df.abs()
* 곱
df.prod()
* IQR 구하기 --- np.percentile
# Q1, Q3값 구하기
Q1 = np.percentile(df['컬럼명'], 25) # 몇 퍼센트에 해당하는 값인지 써주기
Q3 = np.percentile(df['컬럼명'], 75)
# Q2 = np.percentile(df['컬럼명'], 50) 그러나 중앙값과 같으므로 df['컬럼명'].median() 으로 작성 가능
# IQR 구하기
IQR = Q3 - Q1
# IQR을 활용하여 이상치 판별하기
out1 = df[df['컬럼명'] < (Q1 - 1.5*IQR)] # df['컬럼명'] < (Q1 - 1.5*IQR) 조건에 해당하는 df만 필터링됨
out2 = df[df['컬럼명'] < (Q3 + 1.5*IQR)] # df['컬럼명'] < (Q3 + 1.5*IQR) 조건에 해당하는 df만 필터링됨
# 이상치 데이터에서 'kkampu'에 해당하는 수 구하기
print(sum(out1['컬럼명'] == 'kkampu') + sum(out2['컬럼명'] == 'kkampu'))
* 소수점의 올림, 내림, 버림 --- np.ceil, np.floor, np.trunc
# 올림
ceil = np.ceil(df['컬럼명'])
# 내림
floor = np.floor(df['컬럼명'])
# 버림
trunc = np.trunc(df['컬럼명'])
* 결측치 확인, 제거 --- df.isnull(), df.dropna
# 결측치 확인
df.isnull() --- true/false 형태로 결과 나옴
# 각 컬럼별 결측치 비율을 알고 싶다면
df.isnull().sum() / df.shape[0] --- isnull에 참인 값의 함 / 전체 row 수 = 비율 확인 가능
# 결측치를 어떠한 특정 값으로 대체하고자 할 때
df['컬럼명'].fillna(결측치 대체 값)
# 결측치를 제거하려고 할 때
df = df.dropna(subset= ['컬럼명'])
* 결측치 채우기 --- df.fillna
# 결측치를 바로 뒤에 나오는 값으로 채워주고 싶다면
df.fillna(method='bfill')
# 결측치를 바로 앞에 나오는 값으로 채워주고 싶다면
df.fillna(method='pad')
# 결측치를 최빈값으로 채워주고 싶다면
df['컬럼명'] = df['컬럼명'].fillna(df['컬럼명'].mode()[0])
* 왜도, 첨도 --- df.skew(), df.kurt()
# 왜도와 첨도 계산
df['컬럼명'].skew()
df['컬럼명'].kurt()
# 왜도 != 0 인 경우, 지나치케 값이 쏠려있으면 스케일링 필요성 있음
# 로그변환
np.log1p(df['컬럼명'])
* 절대값과 표준편차 --- abs, df.std()
# 특정 컬럼의 표준편차 구하기
a = df['컬럼명'].std()
b = df['컬럼명'].std()
# 두 표준편차의 차 구하기
# 어떤 값이 더 큰지 고려하는 과정을 상쇄하기위해 절대값으로 구해준다
# 이때 변수로 지정해준 a 와 b 값은 각각 값으로 계산되었기때문에 np 사용
np.abs(a - b)
* 표준화(Z-score) --- StandardScaler, scaler.fit_transform(df)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df['컬럼명'] = scaler.fit_transform(df[['컬럼명']])
* 여-존슨, 박스-콕스 변환 --- power_transform
from sklearn.preprocessing import power_transform
# 여-존슨 값 구하기
y = power_transfrom(df[['컬럼명']])
# 박스-콕스 값 구하기
b = power_transform(df[['컬럼명']], method='box-cox')
* min-max 스케일링 --- MinMaxScaler, scaler.fit_transform()
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df['컬럼명'] = scaler.fit_transform(df[['컬럼명']])
* 상,하위 값 구하기 --- df.quantile(), df.head(), df.tail()
# ex) 상위 5% 값
df['컬럼명'].quantile(0.95)
# ex) 하위 5% 값
df['컬럼명'].quantile(0.05)
# ex) 상위 10개의 값
df.sort_valeus(by='컬럼명', ascending=False) --- 내림차순으로 정렬됨
df.head(10)
# ex) 하위 10개의 값
df.tail(10)
* 상관관계 구하기 --- df.corr()
df.corr()
* 원하는 행의 값 찾기 --- df.iloc[ ], df.loc[ ]
# 행번호 1번째부터 5번째 행까지를 찾고싶을때
df.iloc[1:6]
# 행번호 5번 행을 찾고싶을때
df.iloc[5]
# "kkampu"라는 행의 값들을 찾고싶을때
df.loc["kkampu"]
* 그룹화 멀티 인덱스 --- groupby()
# city 컬럼을 기준으로 집계하고싶을때
df.groupby('city').max() --- city 기준으로 집계했을때 최대값
df.groupby('city')['population'].sum() --- city별 총 인구수 집계
* 날짜 형식으로 바꾸기 --- pd.to_datetime()
df['날짜'] = pd.to_datetime(df['날짜'])
* 시계열 데이터 다루기
# 년도 추출
df['날짜'].dt.year
# 월 추출
df['날짜'].dt,month
# 일 추출
df['날짜'].dt.day
# 요일 넘버 추출
df['날짜'].dt.dayofweek --- 숫자로 표현됨. 월0 화1 수2 목3 금4 토5 일6
# 만약 주말과 평일을 구분해야한다면
weekend = df['날짜'].dt.dayofweek >= 5
weekday = df['날짜'].dt.dayofweek < 5
# 위의 조건문을 사용하여 df[weekend], df[weekday]로 데이터 프레임을 나눌 수 있음
# 주별 집계값을 계산하고싶다면
df.resample('W').sum() --- 주별 총 인구수 or 주별 총 수익 등을 집계할 수 있음
# 주 단위 : W / 2주 단위 : 2W / 월 단위 : M
* 함수 만들어서 적용하기
# 예를 들어 a 컬럼의 값이 1이면 a_1, 1이 아니면 a_2로 만들어주고싶다면
def filtered(x) :
if df['a'] == 1 :
df['a'] = 'a_1'
else :
df['a'] = 'a_2'
return x
# 다음과 같은 함수식을 작성해주고
df = df.apply(lambda x : filtered(x), axis=1)
# 람다 표현식을 사용하여 일괄 적용해줄 수 있음
* 데이터 병합 --- pd.merge, pd.concat
pd.merge(a, b, how='left', on='key') --- how = 'left', 'right', 'outer'
pd.concat([a, b], axis=0) --- 아래로 (디폴트)
pd.concat([a, b], axis=1) --- 옆으로
* 비닝 --- pd.qcut
# 구간 분할 (SQL의 NTILE과 같음)
df['range'] = pd.qcut(df['컬럼명'], q=3, labels=['group1', 'group2', 'group3']
# range라는 새로운 컬럼에 3개로 비닝을 하는데, 각각 labels의 이름으로 라벨링됨
* 중복 제거 --- drop_duplicates
df.drop_duplicates(subset=['컬럼명'])
# 기본적으로 중복 데이터 발생 시 뒤에 나오는 데이터를 삭제함
* 이전값
# SQL LAG 함수와 유사
df['컬럼명'].shift(1) --- 한 행 이전의 값을 출력
* 문자열 다루기
* 값 변경하기 --- df.replace
# a라는 값을 b로 대체하기
df['컬럼명'] = df['컬럼명'].replace('a', 'b')
# 공백을 없앨 수 있음
df['컬럼명'].replace(' ', '')
# 문자열에 포함된 단어를 찾을 수 있음
df['컬럼명'].str.contains("단어")
'DATA | IT > 빅데이터분석기사' 카테고리의 다른 글
[공부] 빅데이터분석기사 실기 2유형 | 랜덤포레스트 모델링 | 파이썬 Python 코드 정리 (0) | 2025.01.15 |
---|---|
[후기|자격증] 빅데이터분석기사 9회 실기 벼락치기 성공 방법 | 공부법 | 합격 수기 (0) | 2025.01.15 |