데이터 scaling

이경주 Junior data analyst·2023년 11월 30일
0

Python

목록 보기
3/8

1. 개요

python에서 종종 data를 scaling 해야하는 경우가 존재한다. R에선 대부분 ft option으로 제공된다(더구나 default 가 scale = T 인 경우도 있는데). 그지 같은 python에선 일일이 scaling을 입혀야한다.

1. Scaling 방법 종류

from sklearn.preprocessing import RobustScaler, StandardScaler, MinMaxScaler, MaxAbsScaler

1. StandardScaler

  • 흔히 통계에서 배울때 적용하는 데이터에 평균빼고 표준편차로 나눠주는 그 친구이다.
  • 평균은 0, 분산은 1로 맞추기 때문에 우리가 흔히 아는 정규분포의 모양을 띄게 해주는 친구이다.

1.1 box-cox, yeo-johnson

  • 우리가 흔히 standardscaler를 model 학습을 용이하게 해주는 용도로 쓰이기도 하지만, 회귀분석과 같은 regression에서 만족해야 하는 4가지 가정 중, 정규성을 만족하지 않을 때 사용하기도 한다.
  • 이럴 때, standard scaling 말고, box-cox, yeo-johnson와 같은 power function을 통해 정규성의 문제에 대해 보완한다.
  • 추가로 선형회귀에서 선형성을 만족하지 않을 때 이 방법으로 보완이 가능하다.
from scipy.stats import yeojohnson, boxcox

values, lambda = yeojohnson(data['target'])
# values : 변환된 값
# lambda : 고유의 값, 이 값에 따라 모양이 변한다. labmda = 0인 경우 ln(x)의 형태를 따른다.
  1. box-cox : data의 값이 0보다 작은 경우 적용이 안된다.
  2. yeo-johnson : box-cox의 단점을 보완한 방법. 모든 경우에 적용이 된다.

    box-cox, yeo-johnson 뭘 써야할지 모른다면 그냥 yeo-johnson 사용하면 된다. 추가로 프로젝트 보고서에는 있어보이게 둘 중 고민하다가 "yeo-johnson이 좀 더 적합한 경우이기에 사용했다"고 작성하면 된다.

2. RobustScaler

  • median과 분위수를 사용해서 scaling 한다.
  • Standard와 비교했을 때, 이상치에 대해 영향을 적게 받는다.
  • 장점이자 단점인데 이상치에 대해 영향을 적게 받으므로, 추후 모델을 세울 때 문제가 생길 수 있다. 또한 외부적 결함으로 인해 발생한 지워야하는 이상치임에도 이 scaling을 통해 무시되는 경우가 존재한다.

3. minmax scaler, MaxabsScaler

  • 음... 이걸 쓰는 경우는 앞 경우보다 드물다.
  • 장점도 딱히 없어서 필자는 이 방법을 쓰진 않는다. 간혹 데이터의 형태에 따라 써야하는 경우가 있지만, 단순 insight를 만들어내는 경우가 아니면 사용하지 않는다.

2. 사용 방법

  • 위 4가지 경우 전부다 다 같은 방법을 사용한다.
  • 추가로 R에선 data.frame output 되기에 바로 사용할 수 있지만, python의 경우 numpy로 output이 되기에 column명을 다시 입력해야한다. 젠장 R또 너야
df.info()

 #   Column       Non-Null Count  Dtype         
---  ------       --------------  -----         
 0   nume1        819 non-null   int64       
 1   nume2        819 non-null   datetime64[ns]
 2   cate1        819 non-null   category      
 3   nume3        819 non-null   float64       
 4   cate2        819 non-null   category       
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 수치형 열 선택
numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns

# StandardScaler를 사용하여 수치형 열 스케일링
transformer = StandardScaler()
df[numeric_columns] = transformer.fit_transform(df[numeric_columns])

3. 함수

  • 매일 사용 할 때마다 계속 위와같은 방법을 할 순 없으니, 간단하게 함수로 만들어 놓고 저장해서 쓰려고 한다.
# scaling : )
def scaling(data, scaler_option = 'standard'):
    
    if scaler_option == 'standard':
        scaler = StandardScaler()
    
    elif scaler_option == 'robust':
        scaler = RobustScaler()
    
    elif scaler_option == 'minmax':
        scaler = MinMaxScaler()
    else:
        raise ValueError('choose one. standard, robust, minmax')
    
    scaled_data = pd.DataFrame(scaler.fit_transform(data), columns = data.columns).reset_index(drop = True)
    
    return scaled_data
# 기본 옵션은 standard 로 적용된다.
# 위 파일을 .py로 저장한 뒤 from 파일이름.py import scaling 한 다음 적용하면 된다. 

from 파일이름.py import scaling
scaled_data = scaling(data, 'robust')    

profile
Good afternoon, Good evening and Good night

0개의 댓글