함께하는 데이터 분석

[Scikit Learn] Standard Scaling 본문

데이터분석 공부/ML | DL

[Scikit Learn] Standard Scaling

JEONGHEON 2022. 5. 10. 15:45

안녕하세요.

 

오늘은 Numerical feature를 Scaling을 해보겠습니다.

 

Scaling의 여러 가지 방법 중 Standard Scaling을 알아보겠습니다.

 

우선 Scaling을 하는 이유를 말씀드리겠습니다.

 

예를 들어 머신러닝을 진행할 때 종속변수 Y가 토익점수이고

 

반응 변수 X1은 하루에 영어를 공부하는 시간(단위 : 분)

 

반응 변수 X2는 모의토익에 응시한 횟수라고 생각해볼게요.

 

그렇다면 토익 시험이 얼마 남지 않았을 때 하루 6시간을 공부했다고 하면

 

X1의 값은 360이 되고, 모의토익의 응시 횟수가 10번 정도라고 하면

 

값의 차이가 너무 크게 나오는 것을 볼 수 있습니다.

 

이럴 때 반응 변수인 토익점수는 X1인 영어를 공부한 시간에 대해 영향을 크게 받습니다. 

 

반대로 말하면 X2인 모의토익에 응시한 횟수는 반응 변수에 미치는 영향이 작겠죠.

 

이러한 것을 방지해주기 위해 Scaling을 진행합니다.

 

이것은 예를 든 것이고 더 드라마틱하게 단위에 따라 값의 편차가 클 수가 있습니다.

 

이제 Scaling 중 Standard Scaling에 대해 알아보겠습니다.

 

 

 

 

Standard Scaling

Standard Scaling은 통계를 공부한 사람이나

 

공부하지 않은 사람도 본 적이 있는 스케일링입니다.

 

데이터의 값에서 평균을 뺀 후 표준편차로 나눠준 것입니다.

 

이렇게 표준화를 진행하면 데이터의 평균은 0, 표준편차는 1로 설정됩니다.

 

장점은 데이터가 표준 정규분포를 따르므로 모델링을 할때 성능이 좋다는 것이 장점이고

 

단점은 이상치에 민감할 수 있다는 것입니다.

 

이제 Python을 통하여 실제로 Standard Scaling을 진행해보겠습니다.

 

 

 

 

라이브러리 불러오기

import numpy as np
import pandas as pd
import seaborn as sns
import sklearn

오늘 Standard Scaling의 핵심은 sklearn입니다.

 

seaborn은 데이터를 시각화하는 라이브러리이지만

 

seaborn의 내장 데이터인 mpg데이터를 활용하기 위해 불러왔습니다.

 

 

 

 

데이터 불러오기 및 정제하기

mpg = sns.load_dataset('mpg')

mpg.head()

mpg데이터를 불러오고 앞 5개의 데이터를 확인했습니다.

 

Scaling은 수치형 변수에 적용해야 하므로

 

범주형 변수인 origin, name은 제외해야 합니다.

 

변수의 타입을 확인해볼게요.

 

mpg.info()

역시 origin과 name변수가 object 타입인 것을 확인할 수 있습니다.

 

이제 수치형 변수를 분리해보겠습니다.

 

numerical_mpg = mpg.dtypes[mpg.dtypes != "object"].index.tolist()

numerical_mpg

>>> ['mpg',
     'cylinders',
     'displacement',
     'horsepower',
     'weight',
     'acceleration',
     'model_year']

numerical_mpg에 mpg의 데이터 타입 중 object가 아닌 데이터 변수명을 할당했습니다.

 

우리가 위에서 확인한 대로 origin과 name 말고 다 뽑아져 나온 것을 확인할 수 있습니다.

 

mpg = mpg[numerical_mpg]

mpg.head()

이렇게 수치형 변수로만 이루어진 mpg데이터를 만들어줬습니다.

 

mpg데이터의 요약 통계량을 살펴보겠습니다.

 

mpg.describe()

min과 max를 살펴보면 값의 차이가 천차만별인 것을 확인할 수 있습니다.

 

이제 Standard Scaling을 해보겠습니다.

 

 

 

 

수식을 통한 Standard Scaling

fmmpg = (mpg - np.mean(mpg)) / np.std(mpg)

formulampg의 약자인 fmmpg에 위의 수식을 넣어줬습니다.

 

데이터 값에서 평균을 빼고 표준편차로 나눠준 것입니다.

 

fmmpg.head()

값이 0에서 크게 벗어나지 않게 스케일링된 것을 확인할 수 있습니다.

 

요약 통계량을 확인해볼게요.

 

fmmpg.describe()

이렇게 스케일링된 것을 요약 통계량 표를 통해서도 확인할 수 있습니다.

 

평균을 보면 e-16은 소수점 뒤 16번째 자리에서 처음으로 0이 아닌 숫자가 나오는 것인데

 

따라서 평균값은 0이라고 할 수 있습니다.

 

마찬가지로 표준편차 값도 1인 것을 확인할 수 있습니다.

 

이제 Scikit Learn을 통해 Standard Scaling을 진행해보겠습니다.

 

 

 

 

Scikit Learn을 활용한 Standard Scaling

from sklearn.preprocessing import StandardScaler

sdscaler = StandardScaler()

앞서 불러온 sklearn의 preprocessing 패키지에서 

 

StandardScaler를 불러온 후 sdscaler에 할당해줬습니다.

 

skmpg = sdscaler.fit_transform(mpg)

이후 sklearn mpg의 약자인 skmpg에 Standard Scaling을 할 mpg데이터를 할당했습니다.

 

이제 Standard Scaling이 제대로 됐는지 확인해보겠습니다.

 

skmpg.describe() # sklearn 사용하면 numpy.ndarray

describe가 작동이 안 되는 것이 보입니다.

 

sklearn을 사용한 skmpg가 데이터 프레임 형식이 아니기 때문이죠.

 

그렇다면 pandas로 데이터 프레임 형식으로 바꿔주겠습니다.

 

skmpg = pd.DataFrame(skmpg, columns = mpg.columns)

 pd.DataFrame을 통해 데이터프레임 형식으로 바꿔줬습니다.

 

추가로 column을 mpg의 column으로 설정했습니다.

 

설정하지 않으면 0, 1, 2... 이렇게 숫자로 표현됩니다.

 

이제 skmpg를 살펴보겠습니다.

 

skmpg.head()

아까 수식을 통해 스케일링한 것과 똑같은 것을 확인할 수 있죠.

 

skmpg.describe()

요약 통계량도 마찬가지입니다.

 

여기까지가 Standard Scaling이었습니다.

 

다음에는 Min-Max Scaling으로 찾아뵐게요!

'데이터분석 공부 > ML | DL' 카테고리의 다른 글

[Scikit Learn] One-Hot Encoding  (0) 2022.05.13
[Scikit Learn] Label Encoding  (0) 2022.05.13
[Scikit Learn] Robust Scaling  (0) 2022.05.10
[Scikit Learn] MaxAbs Scaling  (0) 2022.05.10
[Scikit Learn] Min-Max Scaling  (1) 2022.05.10