데이터 전처리는 어떻게 할까?
데이터 전처리는 머신러닝이나 데이터 분석에서 매우 중요한 단계이다. 이 과정은 데이터의 품질을 높이고 분석에 적합하게 만드는 것을 목표로 한다. 데이터 천저리를 통해 고객 이탈 예측 하는 방법을 예로 들자면 다음과 같다.
1. 데이터 수집 및 이해
데이터 구조
- 고객 ID: 고객을 식별하는 고유한 ID
- 나이: 고객의 나이
- 성별: 고객의 성별 (예: 남성, 여성)
- 거주 지역: 고객의 거주 지역을 나타내는 범주형 변수
- 가입 기간: 고객이 서비스를 사용한 기간 (개월 단위)
- 월 요금: 고객이 매달 지불하는 요금
- 총 사용량: 고객이 총 사용한 데이터량 (예: GB 단위)
- 서비스 해지 여부: 고객의 이탈 여부 (0: 유지, 1: 해지)
2. 데이터 정리
결측치 처리
(1) 결측치 확인:
python 코드
df.isnull().sum()
- 각 변수에 대해 결측치의 개수를 확인.
(2) 결측치 대체:
- 평균 또는 중앙값으로 대체: 연속형 변수(나이, 월 요금 등)의 결측치는 평균값 또는 중앙값으로 대체.
python 코드
df['나이'].fillna(df['나이'].mean(), inplace=True)
df['월 요금'].fillna(df['월 요금'].median(), inplace=True)
- 최빈값으로 대체: 범주형 변수(성별, 거주 지역 등)의 결측치는 최빈값으로 대체.
python코드
df['성별'].fillna(df['성별'].mode()[0], inplace=True)
df['거주 지역'].fillna(df['거주 지역'].mode()[0], inplace=True)
중복 데이터 제거
중복된 데이터를 제거하여 데이터의 품질을 높임
python코드
df.drop_duplicates(inplace=True)
3. 데이터 변환
범주형 데이터 인코딩
범주형 데이터를 숫자로 변환.
- 레이블 인코딩: 순서가 있는 범주형 데이터에 사용.
python코드
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['성별'] = le.fit_transform(df['성별'])
- 원-핫 인코딩: 순서가 없는 범주형 데이터에 사용.
python코드
df = pd.get_dummies(df, columns=['거주 지역'])
스케일링
연속형 데이터를 표준화 또는 정규화합니다.
- 표준화: 평균을 0, 표준편차를 1로 맞추는 방법임.
python코드
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['나이', '월 요금', '총 사용량']] = scaler.fit_transform(df[['나이', '월 요금', '총 사용량']])
- 정규화: 데이터를 0과 1 사이로 변환.
python 코드
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[['나이', '월 요금', '총 사용량']] = scaler.fit_transform(df[['나이', '월 요금', '총 사용량']])
4. 특성 선택 및 추출
상관관계 분석
변수 간의 상관관계를 분석하여 중요하지 않은 변수를 제거.
python코드
import seaborn as sns
import matplotlib.pyplot as plt
corr_matrix = df.corr()
plt.figure(figsize=(12, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()
특성 추출
기존의 변수에서 새로운 변수를 만든는 과정.
python코드
df['평균 사용 요금'] = df['월 요금'] / df['총 사용량']
5. 데이터 분할
훈련, 검증, 테스트 데이터 분할
데이터를 모델 훈련, 검증, 테스트용으로 나눕니다.
python코드
from sklearn.model_selection import train_test_split
X = df.drop('서비스 해지 여부', axis=1)
y = df['서비스 해지 여부']
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
- 70%는 훈련 데이터
- 15%는 검증 데이터
- 15%는 테스트 데이터
전처리 후 데이터 예시
전처리가 완료된 데이터는 다음과 같은 형태를 가질 수 있다.
고객 ID | 나이 | 성별 | 가입 기간 | 월 요금 | 총 사용량 | 거주 지역_1 | 거주 지역_2 | 거주 지역_3 | 서비스 해지 여부 |
1 | 0.4 | 1 | 24 | 0.6 | 0.5 | 0 | 1 | 0 | 0 |
2 | 0.7 | 0 | 36 | 0.8 | 0.7 | 0 | 0 | 1 | 1 |
3 | 0.2 | 1 | 12 | 0.3 | 0.4 | 1 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
이러한 전처리 과정을 통해 데이터의 품질을 높이고, 모델이 더 정확하게 예측할 수 있도록 한다.