2025. 12. 8. 20:07ㆍTIL
1. 표준화와 정규화가 필요한 이유 (Feature Scaling)

서로 다른 범위를 가지는 변수들의 기준점을 맞추기 위해 필요하다.
예를 들어, "나이"라는 변수와 "연봉"이라는 변수가 있다고 하자.
나이 변수의 범위는 0 ~ 100 정도가 될 것이다.
그러나 연봉 변수의 범위는 0 ~ 10억, 100억 이상 될 수도 있다.
이렇게 단위가 다른 값을 머신러닝(ML) 모델에 그대로 넣게 되면, 모델은 더 큰 값에 가중치를 두기 때문에 연봉 변수에 훨씬 더 큰 가중치를 두게 되고, 그 결과 잘못된 예측 결과를 만들어낼 수 있다.
따라서 수치형 변수들의 값의 범위를 맞춰주는 (feature scaling) 작업이 우선 진행되어야 한다.
2. 표준화 (Standardization)

데이터를 값의 평균이 0이고, 분산이 1인 정규분포를 가진 형태로 변환하는 작업
표준화는 원본 데이터의 분포 모양을 바꾸지 않지만, 평균 0, 분산 1로 만들어 값에 대한 표시 기준점을 바꿔준다. (원본 데이터를 평행이동한다고 생각하면 쉽다.)
그렇지만 표준화를 진행한다고 해서 데이터가 표준정규분포가 되는 것은 아니다. 원래 데이터의 형태가 정규분포가 아니라면, 표준화를 거친 데이터도 정규분포의 형태가 아니다.
표준화의 방식은 Z-score를 구하는 방법과 동일하다.
표준화는 원본 데이터의 분포를 건드리지 않기 때문에, 이상치를 먼저 처리하지 않고 수행해도 괜찮다.
표준화는 Scikit-learn 라이브러리의 StandardScaler 함수로 구현할 수 있다.
scaler = StandardScaler()
scaler.fit(iris_df) # StandardScaler에 iris_df의 데이터를 학습시킴
iris_scaled = scaler.transform(iris_df) # iris_df에 scaler를 적용
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
d4 = iris_df_scaled.mean().reset_index() # 컬럼별 평균값 계산. 이때 컬럼명은 index가 됨.
d5 = iris_df_scaled.var().reset_index().drop(['index'], axis=1) # 컬럼별 분산 계산. 이때 컬럼명은 index가 됨. -> 이후 concat을 위해 index 컬럼은 제거.
d6 = pd.concat([d4, d5], axis=1)
d6.columns = ['index', 'scale_평균', 'scale_분산']
d7 = pd.concat([d3, d6], axis=1)
d7 = d7.loc[:, ~d7.columns.duplicated()] # 중복된 컬럼 제거
3. 정규화 (Normalization)

정규화는 데이터 값을 [0, 1] 범위로 재조정하는 작업이다.
데이터 값들의 차이를 유지한 채로, 공통척도로 변환한다는 특징이 있다.
데이터에서 최소값을 빼고 전체 범위로 나누는 과정이기 때문에, 이상치가 있을 경우 범위가 매우 커질 수 있다. 따라서 정규화 전에 이상치 제거나 분리를 수행한 후 정규화를 진행하는 것이 바람직하다.
y = np.arange(100)
scaled = MinMaxScaler().fit_transform(y.reshape(-1, 1))
print("이상치 추가 전의 데이터")
print(f"평균 : {scaled.mean()}\n표준편차 : {scaled.std()}")
- reshape : 1차원 배열(series)을 2차원 데이터(dataframe)로 변환
- -1의 의미 : 행의 위치에 -1을 넣고 열의 값을 지정해주면 변환된 배열의 행의 수는 알아서 지정이 된다는 뜻
- fit_transform : fit()과 transform()을 한 번에 처리할 수 있게 하는 메서드.
- fit : 데이터에 머신러닝 모델을 맞추는 것 (학습으로 사용되는 데이터와 타겟 데이터를 넣어준다.)
- transform : fit을 통해 처리된 데이터를 적용. (실제로 학습시킨 결과를 적용)
- fit_transform은 train data (학습 데이터)에만 사용할 수 있다.
- test data (평가 데이터)는 ML 모델의 성능을 평가하기 위해 사용하는 데이터인데, test data에 fit_transform을 적용하면test data 역시 ML model의 학습에 이용된다.
- 그러면 ML model의 성능을 평가할 수 없다.
4. 로그 변환

데이터 분석에서 로그 변환은 큰 수를 작은 수로 변환하기 위해 사용하는데, 특히 치우진 분포(skewed distribution)를 가지고 있는 경우 데이터 간의 격차를 줄이고, 운이 좋으면 치우진 분포를 정규분포 형태로 만들 수도 있다.
보통의 경우 positive skew (왼쪽으로 치우친 분포, 큰 값이 적음) 형태를 취하므로, 로그 변환을 거치면 큰 값을 큰 폭으로 작게 만들고 작은 값을 작은 폭으로 감소 또는 증가하게 만들어줄 수 있다.
우리가 데이터를 파악하기 위해서는 시각화를 해야 하는데, 매우 작은 수의 값을 가지는 경우 우리가 눈으로 확인하기 힘들다. 이럴 때 로그 변환을 사용하면 전체 데이터의 분포를 더 쉽게 파악할 수 있다.
df4 = pd.read_csv("stock_market.csv")
mask = [c for c in df4.columns if df4[c].dtype != 'object']
num_df = df4[mask]
num_df = num_df[['Capital', 'PER', 'EPS', 'ROE', 'PBR']]
num_df.hist(bins=20, figsize=(10,10))
log_df = np.log(num_df)
log_df.hist(bins=20, figsize=(10,10))

'TIL' 카테고리의 다른 글
| 251210_BootCamp Day 38_기초 통계학 (2) (1) | 2025.12.10 |
|---|---|
| 251209_BootCamp Day 37_기초 통계학 (1) (2) | 2025.12.09 |
| 251205_BootCamp Day 35_주간 회고 (1) | 2025.12.05 |
| 251204_BootCamp Day 34_데이터프레임 고급 집계 이론 (0) | 2025.12.04 |
| 251203_BootCamp Day 33_머신러닝 기초 (2) (0) | 2025.12.03 |