데이터 전처리 실습

데이터 준비

결측치 처리

결측치 처리: 개수 확인

# 결측치 개수
df.isnull().sum()
# 결측치 개수 (전체)
df.isnull().sum().sum()
df.dropna() # df.dropna(axis=0)

결측치 처리: 데이터 혹은 컬럼 삭제

  • dropna()
  • 간편하지만, 관측점 (혹은 변수)가 감소
df.dropna(axis=1)
df.dropna(axis=1, how='all') # 컬럼의 모든 값이 NaN 경우만

결측치 처리: 대체 (imputation)

df.median()
# 결측치를 median으로 대체
df.fillna(df.median())

Outlier 탐지

  • 표준편차 3 이상
  • IQR
df = pd.DataFrame({'data': np.random.normal(size=500)})
df.head()

3표준편차 와 IQR 방법

Outlier 처리: QR 이용하는 방법

# Outlier 탐지
outlier_conds = np.abs(df['data'] - df['data'].mean()) > (3*df['data'].std())
print('row count', len(df[outlier_conds]))

Outlier 처리: IQR 이용하는 방법

df['data'].quantile([0.25, 0.75])
q1, q3 = df['data'].quantile([0.25, 0.75])
IQR = q3 - q1
lower_bound = q1 - (IQR * 1.5)
upper_bound = q3 + (IQR * 1.5)

out_conds = (df['data'] < lower_bound) | (upper_bound < df['data'])
df[out_conds]

잡음값 처리

데이터 평활화

  • 비닝(Binning)
  • 회귀(Regression)
  • 군집화 (Clustering)

잡음값 처리: 비닝

  • 연속형 변수를 범주형 변수로
  • 몇 개의 BIN (혹은 버킷)으로 분할
data = np.random.randint(1, 10, 7)
data
pd.cut(data, 3)
pd.cut(data, 3, labels=['별로', '보통', '좋음'])

데이터 변환 (Data Transformation)

정규화(Normalization) vs 표준화(Standardization)

  • 단위를 무시하고, 차이는 유지하여 비교 가능하도록 데이터를 변환
  • 정규화: 같은 범위, 표준화: 같은 통계량
  • 효과
    • 머신러닝에서 scale이 큰 feature의 영향력이 커지는 것을 방지
    • 딥러닝에서 local minima 위험↓ (학습속도↑)

정규화 (Normalization)

  • 공통 범위가 되도록 변환 (차이는 유지)
  • 피처의 범위가 크게 다른 경우
  • MinMaxScaler (0~1), Normalizer (방향 유지 + 크기 1 단위 벡터로)

표준화 (Standardization)

  • 동일한 통계량(평균, 분산)이 되도록 변환
  • Z-score 표준점수
  • StandardScaler, RobustScaler

우측 그림 설명 : 원본데이터를 0~1까지의 크기로 맞춘것이 정규화, 0기준으로 값을 맞추면 표준화라고 요약 가능

데이터 스케일링

데이터에 선형 변환을 적용 자료의 분포를 균일하게 만드는 과정

  1. scale(X): 기본 스케일, 평균이 0, 분산을 1으로 선형변환
  2. robust_scale(X): 중앙값(median)0, IQR=1이 되도록 변환 (아웃라이어의 영향 최소화)
  3. minmax_scale(X): 최대값과 최소값이 각각 1, 0이 되도록 스케일링
  4. maxabs_scale(X): 최대절대값과 0이 각각 1, 0이 되도록 스케일링
import numpy as np
from sklearn.preprocessing import scale, robust_scale, minmax_scale, maxabs_scale

df = pd.DataFrame({'x':np.arange(-3, 9, dtype=float) })
df.iloc[-1] = 50 # outlier

df['scale(x)'] = scale(df[['x']])
df['robust_scale(x)'] = robust_scale(df[['x']])
df['minmax_scale(x)'] = minmax_scale(df[['x']])
df['maxabs_scale(x)'] = maxabs_scale(df[['x']])
df
df.describe()
df.median() # robust_scale(x) == 0

출처 : https://financedata.notion.site/e3f7ea28d66e40638e33307ecc6a3dd0

Leave a Comment