목차
1. 데이터 변환 (로그변환, 스퀘어 루트 변환)
1-1 데이터 변환이란
1-2 로그 변환(Log Transformation)
1-3 스퀘어 루트 변환(Square Root Transformation)
1-4 예제
2. 데이터 스케일링 (표준화, 정규화)
2-1 데이터 스케일링이란
2-2 표준화(Standardization)
2-3 정규화(Normalization)
2-3 예제
3. 범주형 데이터 처리(레이블 인코딩, 원-핫 인코딩)
3-1 범주형 데이터란
3-2 레이블 인코딩(Label Encoding)
3-3 원-핫 인코딩(One-Hot Encoding)
3-4 예제
1. 데이터 변환 (로그변환, 스퀘어 루트 변환)
1-1 데이터 변환이란
데이터 변환은 데이터의 분포를 변화시켜 분석이나 모델링에 유리한 형태로 만드는 과정을 의미한다.
데이터 변환에 자주 사용되는 2가지 기법이 있다.
- 로그 변환
- 스퀘어 루트 변환
특히 데이터의 왜도(Skewness)를 줄이고 더 정규 분포에 가깝게 만들기 위해 활용한다.
1-2 로그 변환(Log Transformation)
로그 변환은 데이터 값의 로그(log)를 취하는 방법이다.
보통 다음과 같은 경우에 사용한다.
- 데이터 값이 매우 클 경우
- 몇 개의 값이 지나치게 크고 나머지는 작은 경우
로그 변환을 적용하면 큰 값의 차이는 줄어들고 작은 값의 차이는 상대적으로 유지된다.
주의할 점은 다음과 같다.
- 데이터에 0이나 음수가 있으면 로그를 계산할 수 없다.
- 변환 전에 값에 작은 상수를 더해야 한다.
- 예시) 0 값이 존재하는 경우 log(x+1) 변환을 사용한다
1-3 스퀘어 루트 변환(Square Root Transformation)
스퀘어 루트 변환은 데이터의 제곱근을 구하는 방법이다.
스퀘어 루트 변환은 로그 변환보다 완만한 데이터 변환 방법으로, 데이터의 오른쪽 치우침(right skew)을 완화하는 데 자주 사용된다.
보통 다음과 같은 경우에 사용한다.
- 데이터의 값 범위를 완만하게 줄이고 싶을 경우
- 오른쪽 치우침을 완화할 경우
주의할 점은 다음과 같다.
- 음수 값에 사용할 수 없다.
- 음수에는 제곱근이 실수로 정의되지 않기 때문이다.
스퀘어 루트의 장점은 다음과 같다.
- 데이터의 스케일을 줄이면서도 값 간의 상대적인 관계는 유지된다.
- 비선형적인 데이터 관계를 완화하여 선형 모델에서 더 잘 학습될 수 있도록 도와준다.
1-4 예제
예제 1) 데이터 생성
import pandas as pd
import numpy as np
data = {
'Sales': [10, 50, 200, 500, 1000]
}
df = pd.DataFrame(data)
print(df)
예제 1) 출력 결과
Sales
0 10
1 50
2 200
3 500
4 1000
예제 2) 스퀘어 루트 변환 적용
NumPy의 sqrt() 함수를 사용하여 제곱근 변환을 수행한다.
df['Sales_sqrt'] = np.sqrt(df['Sales'])
print(df)
예제 2) 출력 결과
Sales Sales_sqrt
0 10 3.162278
1 50 7.071068
2 200 14.142136
3 500 22.360680
4 1000 31.622777
2. 데이터 스케일링 (표준화, 정규화)
2-1 데이터 스케일링이란
데이터 스케일링은 서로 다른 범위를 가진 데이터를 비슷한 범위로 맞추는 과정이다.
특히 머신러닝 모델에서는 데이터의 크기 차이가 학습 결과에 영향을 줄 수 있기 때문에 스케일링이 중요하다.
2-2 표준화(Standardization)
표준화는 데이터의 평균을 0으로, 표준편차를 1로 만드는 과정을 의미한다.
표준화의 공식은 다음과 같다.

예를 들어 KNN(K-Nearest Neighbors) 알고리즘은 데이터 간의 거리(distance)를 계산하여 가장 가까운 이웃을 찾는다.
만약 특정 변수의 값 범위가 매우 크다면, 해당 변수의 영향이 과도하게 커질 수 있다.
따라서 표준화를 통해 모든 변수의 스케일을 비슷하게 만들어 거리 계산이 공정하게 이루어지도록 한다.
또한 SVM(Support Vector Machine) 역시 데이터 간의 거리와 경계를 기반으로 작동하는 알고리즘이기 때문에, 데이터의 스케일이 크게 다르면 모델의 성능에 영향을 줄 수 있다.
따라서 표준화를 통해 각 변수의 영향력을 균형 있게 조정할 수 있다.
2-3 정규화(Normalizatioon)
정규화는 서로 다른 척도로 측정된 값을 공통된 척도로 조정하는 과정이다.
보통 0~1사이의 범위로 조정한다.
정규화는 이상치에 대한 처리가 선행되어야 한다.

정규화는 특히 신경망(Neural Network)과 회귀 모델(Regression)에서 자주 사용된다.
신경망에서는 입력 데이터의 값이 너무 크거나 범위가 크게 차이 나면 학습 과정이 불안정해질 수 있다.
정규화를 통해 입력 데이터를 일정한 범위로 맞추면 모델이 더 안정적으로 학습할 수 있다.
또한 회귀 모델에서도 변수의 스케일 차이가 크면 학습 과정에서 특정 변수의 영향이 과도하게 커질 수 있다.
정규화를 통해 데이터 범위를 조정하면 모델이 변수 간 관계를 보다 균형 있게 학습할 수 있다.
2-4 예제
먼저 머신러닝 라이브러리인 scikit-leanr을 설치해 준다.
pip install scikit-learn
예제 1) 데이터 생성
import pandas as pd
data = {
'Age': [25, 32, 47, 51, 62],
'Salary': [30000, 45000, 80000, 120000, 200000],
'Experience': [1, 5, 10, 12, 20]
}
df = pd.DataFrame(data)
print(df)
예제 1) 출력 결과
Age Salary Experience
0 25 30000 1
1 32 45000 5
2 47 80000 10
3 51 120000 12
4 62 200000 20
에제 2) 표준화
표준화를 위해 sklearn의 preprocessing 모듈에 있는 StandardScaler 클래스를 사용한다.
StandardScaler는 데이터를 평균 0, 표준편차 1의 분포로 변환하는 스케일링 도구이다.
fit_transform() 메서드는 데이터의 평균과 표준편차를 계산(fit) 한 후, 그 값을 이용하여 데이터를 변환(transform) 한다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_standardized = scaler.fit_transform(df)
df_standardized = pd.DataFrame(df_standardized, columns=df.columns)
print(df_standardized)
- StandardScaler 객체를 생성한다.
- 이 객체는 데이터의 평균과 표준편차를 계산하고 데이터를 표준화하는 역할을 한다.
- df_standardized = scaler.fit_transform(df)
- fit() : 데이터의 평균(mean)과 표준편차(std)를 계산한다.
- transform() : 계산된 평균과 표준편차를 이용하여 데이터를 표준화한다
- 결과적으로 데이터의 평균은 0, 표준편차는 1에 가까운 값으로 변환된다.
- df_standardized = pd.DataFrame(df_standardized, columns=df.columns)
- fit_transform()의 결과 NumPy 배열 형태로 반환한다.
- columns=df.columns : 원래 데이터프레임의 열 이름을 그대로 사용한다
예제 2) 출력 결과
Age Salary Experience
0 -1.382872 -1.065717 -1.329544
1 -0.856780 -0.819782 -0.711151
2 0.270562 -0.245935 0.061839
3 0.571186 0.409891 0.371035
4 1.397904 1.721543 1.607820
예제 3) 정규화
정규화를 위해 sklearn의 preprocessing 모듈에 있는 MinMaxScaler 클래스를 사용한다.
MinMaxScaler는 데이터를 0과 1 사이의 범위로 변환하는 스케일링 방법이다.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_normalized = scaler.fit_transform(df)
df_normalized = pd.DataFrame(df_normalized, columns=df.columns)
print(df_normalized)
예제 3) 출력 결과
Age Salary Experience
0 0.000000 0.000000 0.000000
1 0.189189 0.088235 0.210526
2 0.594595 0.294118 0.473684
3 0.702703 0.529412 0.578947
4 1.000000 1.000000 1.000000
- sklearn.preprocessing 모듈에서 MinMaxScaler 클래스를 가져온다.
- 이 클래스는 데이터 정규화(Normalization)를 수행하는 기능을 제공한다.
- MinMaxScaler 객체를 생성한다.
- 데이터의 최솟값(min)과 최댓값(max)을 계산한 후 데이터를 0~1 범위로 변환한다.
- df_normalized = scaler.fit_transform(df)
- fit() : 데이터의 최솟값과 최댓값을 계산한다.
- transform() : 계산된 최소값과 최대값을 이용하여 데이터를 0~1 범위로 변환한다.
- df_normalized = pd.DataFrame(df_normalized, columns=df.columns)
- fit_transform()의 결과 NumPy 배열 형태로 반환한다.
- columns=df.columns : 원래 데이터프레임의 열 이름을 그대로 사용한다
머신러닝 모델은 입력 데이터의 크기에 영향을 받을 수 있다.
따라서, 서로 다른 범위를 가진 데이터를 동일한 범위로 맞추는 스케일링 과정이 필요하다.
3. 범주형 데이터 처리(레이블 인코딩, 원-핫 인코딩)
3-1 범주형 데이터란
범주형 데이터는 숫자가 아닌 범주 형태의 데이터를 의미한다.
예시
- 성별 : 남, 여
- 색상 : 빨강, 파랑, 초록
- 국가 : 한국, 미국, 일본
3-2 레이블 인코딩(Label Encoding)
레이블 인코딩은 범주형 데이터를 숫자 형태로 변환하는 방법이다.
예시
- 남 → 0
- 여 → 1
하지만 레이블 인코딩은 각 범주에 숫자를 부여하면서 값의 크기 관계가 생긴다.이에, 순서가 없는 범주형 데이터에도 순서가 있는 것처럼 해석될 수 있는 문제가 발생한다.
따라서, 레이블 인코딩은 범주 간에 자연스러운 순서가 존재하는 순서형 데이터에 사용하는 것이 적합하다.
3-3 원-핫 인코딩(One-Hot Encoding)
원-핫 인코딩은 각 범주를 독립적인 열(column)로 변환하는 방식이다.
해당 범주에만 1, 나머지는 0으로 표시한다. (이진 벡터)
예시 - 색상
- 빨강 → [1,0,0]
- 파랑 → [0,1,0]
초록 → [0,0,1]
범주의 수가 많으면 메모리 소모가 크다는 단점이 있다.
범주의 순서가 없는 데이터에 사용 가능하다.
3-4 예제
예제 1) 데이터 생성
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Gender': ['Female', 'Male', 'Male', 'Female'],
'Color': ['Red', 'Blue', 'Green', 'Blue']
}
df = pd.DataFrame(data)
print(df)
예제 1) 출력 결과
Name Gender Color
0 Alice Female Red
1 Bob Male Blue
2 Charlie Male Green
3 David Female Blue
예제 2) 레이블 인코딩
레이블 인코딩을 위해 sklearn.preprocessing 모듈의 LabelEncoder 클래스를 사용한다.
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
df['Gender_encoded'] = encoder.fit_transform(df['Gender'])
print(df)
예제 3) 원-핫 인코딩
원-핫 인코딩을 위해 sklearn.preprocessing 모듈의 OneHotEncoder 클래스를 사용한다.
OneHotEncoder는 범주형 데이터를 각 범주마다 새로운 열(column)을 생성하여 0과 1로 표현하는 인코딩 방법이다.
from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse_output=False)
encoded = one_hot_encoder.fit_transform(df[['Color']])
print(encoded)
예제 3) 출력 결과
[[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]
[1. 0. 0.]]
예제 4) 결과를 DataFrame으로 반환하기
OneHotEncoder의 결과는 NumPy 배열이기 때문에 pandas DataFrame으로 변환하면 데이터를 보기 쉽다.
color_onehot = pd.DataFrame(
encoded,
columns=one_hot_encoder.get_feature_names_out(['Color'])
)
print(color_onehot)
출력 결과
Color_Blue Color_Green Color_Red
0 0.0 0.0 1.0
1 1.0 0.0 0.0
2 0.0 1.0 0.0
3 1.0 0.0 0.0
예제 5) 원래 데이터에 결과를 추가하기
df_final = pd.concat([df, color_onehot], axis=1)
print(df_final)
예제 5) 출력 결과
Name Gender Color Gender_encoded Color_Blue Color_Green Color_Red
0 Alice Female Red 0 0 0 1
1 Bob Male Blue 1 1 0 0
2 Charlie Male Green 1 0 1 0
3 David Female Blue 0 1 0 0
대부분의 머신러닝 모델은 숫자 데이터를 입력으로 사용하기 때문에, 범주형 데이터는 반드시 숫자 형태로 변환해야 한다.
'머신러닝&딥러닝' 카테고리의 다른 글
| 머신러닝 & 딥러닝 기초 10편 | 평균, 중앙값, 최빈값 (statistics, pandas) (0) | 2026.03.14 |
|---|---|
| 머신러닝 & 딥러닝 기초 9편 | 데이터 통합, 조인(merge, concat) (0) | 2026.03.13 |
| 머신러닝 & 딥러닝 기초 7편 | 데이터 정제(결측치, 이상치 처리 등) (1) | 2026.03.12 |
| 머신러닝 & 딥러닝 기초 6편 | 데이터 전처리 (0) | 2026.03.12 |
| 머신러닝 & 딥러닝 기초 5편 | 데이터 저장 방법 (CSV, Excel, JSON, SQLite) (0) | 2026.03.12 |