데이터 준비

결측치 처리

결측치 처리: 개수 확인

# 결측치 개수
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

zerg96

Recent Posts

요양원 선택 전 반드시 확인해야 할 것들, 부모님 맡기기 전에 보세요

요양원 선택 전 반드시 확인해야 할 체크리스트를 공개합니다. 공식 평가 자료 조회법, 방문 시 확인…

2일 ago

공공기관 채용 비리, 내부에서 터져나온 충격 증언

공공기관 채용 비리의 실태와 피해 지원자의 대응법을 정리했습니다. 채용 비리 신고 방법, 공익신고자 보호제도, 취준생…

2일 ago

주식 손실 났을 때 세금 줄이는 방법, 아는 사람만 씁니다

주식 손실을 세금 절약에 활용하는 합법적 방법을 공개합니다. 해외주식 손익통산, ISA 계좌 활용, 연금계좌 절세까지…

2일 ago

음식 배달 늦으면 소비자가 취소할 수 있다, 몰랐던 권리

배달이 예상 시간보다 크게 늦으면 취소·환불을 요청할 수 있습니다. 배달앱별 지연 취소 방법과 잘못 배달됐을…

2일 ago

휴대폰 요금제 바꾸면 연 수십만원 절약, 지금 내 요금제 확인하세요

통신비 절약의 핵심은 요금제 최적화입니다. 내 데이터 사용량 확인법, 알뜰폰 전환 비교, 위약금 없이 요금제…

2일 ago

퇴직금 못 받았다면, 지금 당장 이렇게 하세요

퇴직 후 퇴직금을 받지 못했다면 즉시 노동부에 신고하세요. 지급 기한, 자격 요건, 신고 방법, 소액체당금…

2일 ago