파이썬을 활용한 데이터 분석 입문

[Python]데이터 전처리 - 정규화와 표준화

엔피디 2024. 8. 18. 22:17

 

이번 포스팅에서는 데이터셋에서 수치 데이터를 다룰 때 유용하게 쓰이는 스케일링 기법에 대해 알아보고 스케일링 기법의 대표적인 정규화와 표준화에 대해 알아보겠습니다.

 


 

실습 준비

import pandas as pd

# 샘플 데이터프레임 생성
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50]})
df 

 


 

스케일링(scaling)

스케일링 기법은 데이터를 일정한 범위나 분포로 변환하는 방법을 의미합니다. 이는 서로 다른 크기나 범위를 가지는 데이터들을 비교하거나, 데이터의 각 특성(feature)을 동일한 기준으로 맞출 수 있게 하여 데이터 분석을 용이하게 합니다.

 

정규화(Normalization)

정규화는 데이터를 일정한 범위로 변환하는 과정입니다. 일반적으로, 데이터를 0(최솟값)과 1(최댓값) 사이의 값으로 변환합니다. 이는 서로 다른 스케일의 데이터를 통일하고 싶을 때 사용합니다.

 

Min-Max 정규화

가장 일반적인 방법으로, 각 값을 데이터셋의 최소값과 최대값을 사용해 다음과 같이 변환합니다.

 

x_new = (x - x_min) / (x_max - x_min)

 

여기서 x는 원본 데이터, x_min은 데이터셋의 최소값, x_max는 데이터셋의 최대값을 의미합니다.

# 정규화 (0-1 스케일)
df_normalized = (df - df.min()) / (df.max() - df.min())
df_normalized 

표준화(Standardization)

표준화는 데이터의 평균0, 분산1로 변환하는 과정입니다. 이는 데이터가 평균에서 얼마나 떨어져 있는지를 상대적으로 측정할 수 있도록 도와줍니다.

 

Z-score 표준화

가장 일반적인 방법으로, 데이터의 평균과 표준편차를 사용하여 다음과 같이 계산됩니다.

 

x_new = (x - x_mean) / x_std

 

여기서 x는 원본 데이터, x_mean은 데이터셋의 평균, x_std는 데이터셋의 표준편차를 의미합니다.

# 표준화 (평균 0, 표준편차 1)
df_standardized = (df - df.mean()) / df.std()
df_standardized 

 


 

참고사항

*표준 편차 : 표준 편차(Standard Deviation)는 데이터의 분산 정도를 나타내는 통계적 지표로, 데이터 값들이 평균을 중심으로 얼마나 퍼져 있는지 측정합니다.

  • 표준 편차가 크다 → 데이터 값들이 평균에서 멀리 떨어져 넓게 분포되어 있다.
  • 표준 편차가 작다 → 데이터 값들이 평균에 가까이 모여 있다.

표준 편차를 구하는 법

df = pd.DataFrame({'height': [177, 183, 160, 164]})
df 

  • 평균 구하기 : 데이터 집합의 모든 값을 더한 다음, 데이터의 개수로 나눠서 구합니다.
# (177 + 183 + 160 + 164) / 4
print(df.mean()) # 평균 계산
  • 분산 구하기 : 각 데이터 값과 평균의 차이를 제곱한 값의 평균을 계산합니다.
# (6**2 + 12**2 + 11 ** 2 + 7**2) / 4
print(df.var(ddof=0)) # 분산 계산
  • 표준 편차 구하기 분산의 제곱근을 취합니다.
import math

var = df['height'].var(ddof=0)
std = math.sqrt(var)
print(std) 

9.354143466934854

print(df.std(ddof=0))

9.354143

 

ddof=0을 붙이는 이유

ddof는 Delta Degrees of Freedom 의 약자로, 표본의 자유도 조정을 위한 매개변수입니다. 모집단이 아닌 표본에서 분산과 표준 편차를 계산할 때는, 표본의 크기가 작아 모집단의 분산을 과소평가하는 경향이 있습니다. 이를 보정하기 위해 ddof를 1로 설정하여 자유도를 줄여 계산합니다. 하지만 지금은 수학적으로 계산하므로 이 값을 1이 아닌 0으로 설정하여 계산하여야 앞선 예시 연산과 값이 같습니다.

# 표본 분산으로 인한 n-1 나누기
print(df['height'].var())

116.666667

# 분산의 영향으로 값이 달라짐
print(df['height'].std())

10.801234

 


 

 

이번 포스팅에서는 스케일링 기법, 정규화와 표준화, 그리고 평균, 분산, 표준편차 등 기초 통계에 관해 알아보았습니다. 명령어로 식을 외우지 않아도 값을 구할 수 있지만, 그 원리를 알아야 사용에 용이하기에 차근차근 개념부터 접근하는 것이 좋을 것 같습니다.