인코딩(필수⭐️ 반드시 해야한다)
문자열데이터를 숫자형데이터로 변경해줘야한다!
1. 타겟 값을 별도의 변수에 저장한다.
인코딩 전 가장 먼저 해야할 일은 타겟 값을 별도의 변수에 담아놓는 것.
문자형 변수가 아니고 숫자형 변수더라도 꼭 타겟값을 별도의 변수에 저장해놓아야 나중에 변경되지 않는다!
y_train = train.pop("income")
이후, 원핫인코딩과 레이블인코딩 중 원하는 인코딩 방법을 사용해 인코딩하면 된다.
2-1. 원핫인코딩
원핫 인코딩은 단어 집합의 크기를 벡터의 차원으로 만들어 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식이다. 문자 데이터를 컬럼으로 바꾸고 0이나 1 혹은 True나 False로 값을 지정하는 방식이다.

pandas에서는 get_dummies(데이터프레임명)라는 함수를 제공해 데이터프레임을 자동으로 원핫인코딩으로 변경할 수 있다.
train_oh = pd.get_dummies(train)
test_oh = pd.get_dummies(test)
print(train.shape, test.shape, train_oh.shape, test_oh.shape)

다만 이런 경우 주의해야할 점이 있는데, 원핫인코딩으로 변경한 train데이터와 teste데이터의 컬럼 수가 같아야 한다는 점이다.
대부분 원핫인코딩 후 데이터 컬럼 수가 같은 문제를 제공해주기 때문에 걱정하지 않아도 된다.
하지만, 위처럼 컬럼의 유니크 수가 다를 경우 맞춰줘야 한다.
원핫인코딩 유니크 수가 다를 때
- train데이터와 test데이터를 concat으로 위아래 연결을 해준다(axis=0)
- 합친 데이터를 get_dummes로 원핫인코딩한다.
- 원핫인코딩한 데이터를 다시 train데이터와 test데이터로 나눈다. (이때 train데이터의 len(train)을 사용해서 iloc로 잘라낸다.)
- 많은 쪽에 맞춰서 컬럼의 유니크 수가 맞춰진다.
print(train.shape, test.shape)
data = pd.concat([train, test], axis=0)
data_oh = pd.get_dummies(data)
train_oh = data_oh.iloc[:len(train)].copy()
test_oh = data_oh.iloc[len(train):].copy()
print(train_oh.shape, test_oh.shape)
2-2. 레이블 인코딩
라벨인코딩은 문자열로 된 범주형 변수를 코드형 숫자 값으로 변환하는 방법.

우선 타겟컬럼을 제외한 타입이 object인 컬럼들을 골라내준다.
방법1이나 방법2를 많이 사용할듯. select_dtypes(include='object') 나 columns[train.dtypes == object]
# cols = train.select_dtypes(include='object').columns #방법1
# cols = train.columns[train.dtypes == object] #방법2
cols = ['workclass', 'education', 'marital.status', 'occupation', 'relationship', 'race', 'sex','native.country']
cols
레이블인코딩은 원핫인코딩처럼 제공해주는 함수가 없기 때문에 코드를 외워줘야 한다.
- sklearn.preprocessing안의 LabelEncoder를 import 해주고
- for문을 돌면서 위의 cols 컬럼들에 인코딩을 적용해주면 된다.
- 이때 LabelEncoder()를 변수에 선언해서 함수들을 가져다 사용해야 한다. ex) le = LabelEncoder()
- le.fit_trainsform(): 사전을 만들어서 적용시키는 함수
- le.transform(): 만들어진 사전을 적용시키는 함수
from sklearn.preprocessing import LabelEncoder
for col in cols:
le = LabelEncoder()
train[col] = le.fit_transform(train[col])
test[col] = le.transform(test[col])
train.head()
스케일링(선택사항)
- Scaling은 값을 조정하는 과정이기 때문에 수치형 변수에만 적용된다.
작업형2에서는 필수사항은 아니지만, 작업형1에서 스케일링을 진행하라는 문제가 나올 수도 있다.
# 수치형 컬럼명
# cols = train.select_dtypes(exclude='object').columns
# 이걸 지금 사용하게 되면 이미 위에서 object 타입이 숫자형으로 변경된 뒤이기 때문에 직접 작성해주는게 좋다.
cols = ['age', 'fnlwgt', 'education.num', 'capital.gain', 'capital.loss', 'hours.per.week']
1. Min-Max Scaler (민맥스 스케일링): 모든 값을 0과 1 사이로 변경
- sklearn.preprocessing안의 LabelEncoder를 import 해주고
- 위에서 진행했던 라벨인코딩처럼 fit_transfrom과 transfrom을 적용해주면 된다.
- 라벨인코딩과의 다른점은, 라벨인코딩은 컬럼 하나하나를 따로 적용해야해서 for문을 사용했고 MinMaxScaler는 컬럼 리스트가 있다면 한 번에 적용시킬 수 있다는 점이다.
# 민-맥스 스케일링 MinMaxScaler (모든 값이 0과 1사이)
train_copy, test_copy = get_data()
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
display(train_copy[cols].head(2))
train_copy[cols] = scaler.fit_transform(train_copy[cols])
test_copy[cols] = scaler.transform(test_copy[cols])
display(train_copy[cols].head(2))

2. Standard Scaler (표준화)
데이터의 feature가 각각 평균이 0, 분산이 1인 정규분포를 가진 값으로 변환한다. 즉, 피처가 표준정규분포의 속성을 갖도록 조정되는 것
- sklearn.preprocessing안의 StandardScaler를 import 해주고
- 위에서 진행했던 MinMaxScaler처럼 fit_transfrom과 transfrom을 적용해주면 된다.
# 표준화 StandardScaler (Z-score 정규화, 평균이 0 표준편차가 1인 표준 정규분포로 변경)
train_copy, test_copy = get_data()
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
display(train_copy[cols].head(2))
train_copy[cols] = scaler.fit_transform(train_copy[cols])
test_copy[cols] = scaler.transform(test_copy[cols])
display(train_copy[cols].head(2))

3. Robust Scaler (로버스트 스케일링)
중앙값과 사분위 값을 활용하는 스케일링 방법으로, 이상치 영향을 최소화한다는 장점이 있다.
- sklearn.preprocessing안의 RobustScaler를 import 해주고
- 위에서 진행했던 StandardScaler처럼 fit_transfrom과 transfrom을 적용해주면 된다.
# 로버스트 스케일링 : 중앙값과 사분위 값 활용, 이상치 영향 최소화 장점
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
display(train[cols].head(2))
train[cols] = scaler.fit_transform(train[cols])
test[cols] = scaler.transform(test[cols])
display(train[cols].head(2))

검증 데이터 분할
from sklearn.model_selection import train_test_split
X/X/y/y | test/val/test/val
# 검증 데이터 분할
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train,
y_train,
test_size=0.2,
random_state=0)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape
'Data > 빅데이터분석기사' 카테고리의 다른 글
| [빅데이터분석기사] 데이터전처리 100제 (0) | 2025.06.30 |
|---|---|
| [빅데이터분석기사] 작업형2 머신러닝 - 머신러닝 학습 및 평가(분류/회귀) (0) | 2025.06.16 |
| [빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(결측치, 이상치) (0) | 2025.06.15 |
| [빅데이터분석기사] 작업형1 모의문제3+4 (0) | 2025.06.13 |
| [빅데이터분석기사] 작업형1 모의문제1+2 (0) | 2025.06.13 |