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

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

by Pymoon 2022. 12. 17.

 

 

데이터분석을 진행하다 보면 공통적으로 혹은 필수적으로 거쳐야 할 과정들이 있다.

그중 여기서 다루고자 하는 것은..

 

 

바로 전처리 과정이다.

 

 

아래의 코드들은 실제로 내가 분석을 진행할 때 쓰는 코드들이고,

분명한 건 이 글은 내가 데이터분석을 거듭할수록 수정의 여지가 존재하는 것이다.

 

 

아는 것보다 알아야 할 것들이 많은 나에겐 공부해야 할 것들이 많은 것은 매 번 분석을 진행하면서 느끼는 부분이다.

 

 


 

 

 

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
6
7
8
9
10
11
# 이상치 정제
 
def IQR(data, col):
    Q1, Q3 = np.percentile(data[col], [2575])
    IQR = Q3 - Q1
    lower = Q1 - (IQR * 1.5)
    upper = Q3 + (IQR * 1.5)
    outlier = data[(data[col] > upper) | (data[col] < lower)]
    data = data[(data[col] <= upper) & (data[col] >= lower)]
    
    return data[[col]]
cs

 

> 주로 수치형 변수에서 나타나는 이상치를 IQR을 가지고 구분할 수 있는 코드를 함수화 시킨 것이다.

 

> 코드를 요약하자면 IQR을 가지고 상한선과 하한선을 정한다.

 

> 데이터들 중 그 기준을 넘어가는 데이터가 있다면 그것을 이상치라 부르고 이상치를 return 할 수도 있고, 이상치를 제외한 데이터를 return 할 수도 있는 코드이다.

 

 

> 이상치를 정제하고자 한다면 이상치를 우리가 흔히 아는 기초 통계량(평균, 중앙값, 최솟값, 최대값, 최빈값 등등)으로 변환하여 return 하면 될 것이다.

 

 

 


데이터 정규화

 

 

 

1
2
3
4
5
6
# 로그 변환
 
1. 히스토그램 확인 -> 분포가 좌측으로 치우쳐진 경우
 
train[col] = np.log1p(train[col])
print(train[col].skew())
cs

 

> 로그 변환이다.

 

 

> 데이터의 분포를 확인하기 위해 히스토그램을 찍어본다.

 

> 그 결과가 좌측으로 치우쳐진 경우에 로그 변환을 진행하면 데이터의 분포가 정규분포에 가까워지는 현상을 볼 수 있을 것이다. 그리고 로그 변환 전 후로 왜도를 찍어보면 수치로서 그 차이를 확인할 수 있었다.

 

 

> 코드에서 np.log()가 아닌 np.log1p()를 사용한 이유는 혹, 데이터 값들 중 음수가 있는 경우를 방지한 것이다.

> 데이터 값이 0이라면 변환 후 무한대가 나오는 것을 방지하기 위함이다.

 

 

 

 

1
2
3
4
5
6
7
# 루트 변환
 
1. 히스토그램 확인 -> 분포가 좌측으로 치우쳐진 경우
2. 데이터 값이 0 이상인 경우
 
train[col] = np.sqrt(train[col])
print(train[col].skew())
cs

 

> 루트 변환이다.

 

 

> 로그 변환과 같은 목적을 가지지만 데이터의 값이 0이상 이어야 한다는 한 가지의 조건이 더 붙는다.

 

> 그 이외의 결과는 로그 변환과 같음을 알 수 있다. 데이터 정규화를 위한 것이다.

 

 

 

1
2
3
4
5
6
7
8
# Box-cox 변환
 
1. 히스토그램 확인 -> 분포가 좌측으로 치우쳐진 경우
2. 데이터 값이 양수인 경우
 
train[col] = pd.Series(stats.boxcox(train[col])
print(train[col].skew())
sns.distplot(df_boxcox);
cs

 

> 박스-콕스 변환이다

 

 

> 박스-콕스 변환은 데이터의 값이 모두 양수여야 한다는 조건을 가지고 있다.

 

> 이러한 조건 때문인지 접근성이 좋지 않아보인다고 판단하기에는 분석의 경험이 적다.

 

 

> 마찬가지로 히스토그램에서 분포가 좌측으로 치우쳐진 경우 사용 가능하고 데이터 정규화를 위한 것이다.

 

 

 


 

'내가 하는 데이터분석' 카테고리의 다른 글

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