본문 바로가기
내가 하는 데이터분석

내가 하는 전처리(Preprocessing) EP.02

by Pymoon 2023. 1. 24.

 

이 전의 전처리 글에선 이상치 정제, 데이터 정규화에 대한 글을 정리하며 다뤄보았다.

 

내가 하는 전처리(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