이 전의 전처리 글에선 이상치 정제, 데이터 정규화에 대한 글을 정리하며 다뤄보았다.
내가 하는 전처리(Preprocessing) EP.01
데이터분석을 진행하다 보면 공통적으로 혹은 필수적으로 거쳐야 할 과정들이 있다. 그중 여기서 다루고자 하는 것은.. 바로 전처리 과정이다. 아래의 코드들은 실제로 내가 분석을 진행할 때
py-moon.tistory.com
이번 전처리에서는 데이터 스케일링에 대해서 정리해보고자 한다.
데이터 스케일링은 크게는 범주형과 수치형 데이터 스케일링으로 구분한다.
해당 순서에 맞게 적어보려 한다.
1
2
3
4
|
import pandas as pd
import numpy as np
import seaborn as sns
from scipy import stats
|
cs |
> 먼저, 미리 필요한 코드를 가져와 준다.
범주형 데이터에 대한 스케일링 방법
1
2
3
4
5
|
# 원-핫 인코딩
pd.get_dummies(df, columns=['범주형 변수'])
순서의 의미가 없을 때(국가명, 성별)
고유값의 개수가 적을 때
|
cs |
> 원-핫 인코딩이자 더미변수 활용
> 원-핫 인코딩이나 더미변수를 활용할 때는 변환할 데이터가 순서의 의미를 두지 않을 때이다.
> 모든 분석에 일반화시키긴 어렵지만 보통 성별이나 국가 명처럼 순서가 중요치 않은 데이터를 스케일링할 때 쓰인다.
> 해당 분석과제의 특성을 파악하는 것이 우선이다.
> 또한, 고유값의 개수가 적을 때 사용하면 효과적이다.
> 이 두 조건을 만족하는 대표적인 변수가 성별이 되겠다.
1
|
df['범주형 변수'] = df['범주형 변수'].map({'고윳값1':0, '고윳값2':1, '고윳값3':2})
|
cs |
> 이런 식으로 변환할 수도 있다.
1
|
train['sex'] = train['sex'].map({'male':1, 'female':2})
|
cs |
> 예를 들면, 위처럼 성별을 나타내는 변수에서 남자는 1, 여자는 2로 수치형 데이터로 바꿔줄 수 있다.
1
2
3
4
5
6
7
|
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
train_le = encoder.fit_transform(train[col])
test_le = encoder.transform(test[col])
순서의 의미가 있을 때(직급, 최종학력)
|
cs |
> LabelEncoder
> 원-핫 인코딩과는 다르게 순서의 의미가 있는 데이터를 스케일링할 때 사용하는 방법이다.
> 직급이나 최종학력처럼 고윳값 마다 가중치에 차이를 두어야 하는 변수에 사용하면 효과적이다.
> 일반적으로 범주형 변수를 스케일링할 때 원-핫 인코딩이나 LabelEncoder를 사용하면 왠만한 변수는 스케일링이 가능하다.
수치형 데이터에 대한 스케일링 방법
1
2
3
4
5
6
7
8
9
|
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
train_ss = scaler.fit_transform(train[col])
test_ss = scaler.transform(test[col])
평균이 0, 분산이 1인 정규분포로 스케일링한다.
최솟값과 최댓값의 크기를 제한하지 않아 이상치에 매우 민감, 이상치 정제 후 사용
회귀보다는 분류분석에 유용
|
cs |
> StandardScaler
> StandardScaler는 이름처럼 데이터를 평균이 0, 분산이 1인 정규분포에 맞게 정규화시켜주는 방법이다.
> 특징으로는 이상치에 민감하여 정제 후 사용하는 것을 권장하고, 주로 분류분석에 유용하다는 것이다.
1
2
3
4
5
6
7
8
9
|
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
train_mm = scaler.fit_transform(train)
test_mm = scaler.transform(test)
데이터들의 값을 0과 1사이의 값으로 스케일링, 최대 1, 최소 0
이상치에 매우 민감, 이상치 정제 후 사용
분류보다는 회귀분석에 유용
|
cs |
> MinMaxScaler
> MinMaxScaler는 데이터의 분포가 아주 넓은 데이터를 스케일링하기 좋은 방법으로, 데이터를 0과 1사이의 값으로 변환해준다.
> 마찬가지로 이상치에 예민하게 반응하므로 정제 후 사용을 권장하고, 회귀분석에 유용하다는 것이다.
1
2
3
4
5
6
7
8
9
|
from sklearn.preprocessing import MaxAbsScaler
scaler = MaxAbsScaler()
train_ma = scaler.fit_transform(train)
test_ma = scaler.transform(test)
데이터들의 값들을 -1과 1사이로 표현한다. 데이터가 양수인 경우 MinMaxScaler와 동일
이상치에 매우 민감, 이상치 정제 후 사용
분류보다는 회귀분석에 유용
|
cs |
> MaxAbsScaler
> MaxAbsScaler는 넓게 분포되어있는 데이터들을 -1과 1사이의 값으로 변환해준다.
> 양수로만 이루어져있는 데이터에서는 MinMaxScaler와 동일한 효과를 볼 수 있다.
> 마찬가지로 이상치에 예민하며 회귀분석에 효과적이다.
1
2
3
4
5
6
7
|
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
train_r = scaler.fit_transform(train)
test_r = scaler.transform(test)
중앙값을 0, IQR을 사용하여 이상치의 영향을 최소화.
|
cs |
> RobustScaler
> RobustScaler는 중앙값과 IQR을 사용하므로 이상치의 영향을 최소화할 수 있는 스케일링 방법이다.
OUTTRO.
데이터 분석에 있어서 데이터 스케일링은 필수적이다.
스케일링 방식을 위에서 다뤄보았듯이 여러가지가 있다. 하지만, 분석 목적과 성능에 맞게끔 스케일링 방식을 선택하는 것이 데이터 분석가가 할 일이다.
데이터 분석가가 분석을 수행하면서 전처리에 가장 많은 시간을 쓴다고 한다. 그만큼 중요하고도 쉽지 않은 과정임을 알 수 있다.
현재 내가 사용하는 방식에도 더 많은 전처리 방법이 있지만 추후에 다뤄보고자 한다.
'내가 하는 데이터분석' 카테고리의 다른 글
내가 하는 전처리(Preprocessing) EP.01 (0) | 2022.12.17 |
---|