오늘은 EDA 과정을 보기 쉽게 정리해보았다.
기술 통계량(평균, 중앙값, IQR, 분산, 표준편차) 파악
pandas의 df.describe()
사용.
수치형 변수만 측정하므로 범주형은 수치형으로 변환해야한다.
히스토그램으로 분포 파악
pandas의df\['column'].hist()
나 matplotlib의 plt.hist()
boxplot으로 이상치 파악
pandas의 boxplot()
함수나 seaborn의 sns.boxplot(x=df['column'])
결측치 파악
pandas의 df.isnull().sum()
사용
missing_ratio = df.isnull().mean() * 100 를 쓰면 퍼센트로 확인 가능
상관관계 파악 : 두 변수간 관계의 강도와 방향을 나타낼뿐 인과관계는 x
pandas의 corr()
이나 Seaborn의 heatmap()
사용
인과관계 파악 : 독립변수 -> 종속변수.
시간적 선후가 있어야되고 함께 변하는 패터이 있어야하고 다른 변수를 통제해야 한다.
연속형과 이산형 변수로 나뉜다.
정규화를 통해 데이터를 특정 분포(or 범위)로 바꿀 수 있다.(L1, L2 정규화)
스케일링을 통해 모든 변수의 크기를 일정하게 맞춰 모델이 특정 변수에 의존하지 않게 한다.
standard, min-max, robust, MaxAbs 방법이 있다.
트리기반 모델은 데이터를 각 특성값만 비교하기 때문에 큰 영향이 없고,
선형모델이나 KNN, SVM같은 거리기반 모델에서 중요하다.
단, 앙상블할꺼면 전체 데이터 일관성 위해서 스케일링을 트리모델에도 하는게 좋다.
(중요)
스케일링 사용시 훈련데이터로만 fit 해야한다!!
이렇게 해야 모델 평가시 편향을 방지할 수 있다.
훈련 데이터만 scaler.fit_transform(X_train)
을 사용해야한다!
테스트나 검증 데이터는 scaler.transform(X_test)
을 사용한다.
그리고 컬럼별로 할 필요는 없으며 dataframe에 바로 적용하면 된다.
명목형(순서나 크기 상관 x)과 순서형(숫자가 의미 있음) 변수로 나뉜다.
모델에서 활용하려면 숫자나 모델이 이해할 수 있는 방식으로 전처리(인코딩
)이 필요하다.
명목형은 one-hot 인코딩, pandas의 get_dummies()
사용한다.
단, 클래스 하나당 컬럼이 하나가 더 생성되므로 차원이 너무 늘어날 수 있다.
일반적으로 10~50개 정도 클래스까진 문제가 없다고는 한다.
(트리기반모델은 100~200개 피처까진 문제가 크게 없으므로 이정도 까진 괜찮다.)
순서형은 label(각 클래스에 고유 숫자 라벨 할당)이나 순서 인코딩이 좋다.
타겟인코딩 : 범주형변수를 타겟 변수의 평균값으로 변환, 편향과 과적합 위험이있음
빈도인코딩 : 각 범주를 데이터셋에서 나타나는 횟수로 변환
결측치는 삭제하거나 통계값(평균, 최빈값 등), 회귀방식사용, 특수값(-999or-1) 등으로 대체할 수 있다.
이상치는 z-score로 |Z|>=3 넘거나, IQR을 사용하거나, DBSCAN으로 밀도가 낮은 군집을 이상치로 볼 수 있다.
이상치도 삭제, 대체가 가능하고, 추가적으로 극단값은 상-하한값으로 바꾸기도 한다.
특정 분포의 데이터를 정규(에가까운)분포로 변환하거나 스케일 축소를 위해 사용하는 방법
오른쪽으로 비대칭적(skewed)인 데이터
의 분포를 개선하는 데 유용하다.cf. 왼쪽으로 치우친 데이터(대부분 높고 일부만 낮음)는 다른 Yeo-Johnson이나 거듭제곱, 지수변환 등을 사용하는게 좋다.
분포의 왜곡을 완화하고, 이상치 영향을 줄이고, 곱셈관계를 덧셈관계로 변환해주는 효과가 있다.
0이하 값에 적용되지 않으므로 음수는 미리 처리하거나 log(x + 1)
변환을 많이 사용한다.
데이터의 스케일이 바뀌므로 해석하려면 지수함수를 적용해야한다.
회귀모델에서는 손실함수로 사용되는 MAE, MSE, RMSE도 평가지표로 사용된다.
결정계수() : 1 - (잔차제곱합/전체제곱합)
모델이 종속 변수의 분산을 얼마나 설명하는지를 나타내는 비율로 1에 가까울수록 좋다.
1에 가까우면 실제 데이터와 유사하게 출력된다는 뜻.
하지만 이상치에 민감해서 왜곡될 수 있다.