1. 데이터 준비
import numpy as np
import pandas as pd
data = {
'A': [1, 2, np.nan, 4, 5, 100, 1, 2, 2, 4, '1', '2', '3', '4', '5', 10, 20, 30, 40, 50],
'B': [5, np.nan, np.nan, 8, 10, 60, 10, 20, 20, 40, '10', '20', '30', '40', '50', 5, 4, 3, 2, 1],
'C': [1, 2, 3, 4, 5, 5, 100, 200, 200, 400, 100, 200, 300, 400, 500, 1, 2, 3, 4, 5],
'D': [np.nan, np.nan, 3, 3, 3, 5, 5, 5, 5, 5, np.nan, np.nan, np.nan, np.nan, np.nan, 2, 3, 4, 5, 6],
'category_column': [np.nan]*10 + ['A', 'B', 'A', 'C', 'B'] + [np.nan]*5,
'value_column': [np.nan]*10 + [1, 2, 3, 4, 5] + [np.nan]*5,
'target': [np.nan]*15 + [1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)
2. 결측값 처리 (Missing Value Handling)
(1) 결측값 확인
print(df.isnull().sum())
(2) 결측값 제거
# 결측값이 포함된 행 제거
df_dropped_rows = df.dropna()
# 결측값이 포함된 열 제거
df_dropped_cols = df.dropna(axis=1)
(3) 결측값 대체
# 0으로 대체
df_filled = df.fillna(0)
# 평균값으로 대체
df_filled_mean = df.fillna(df.mean(numeric_only=True))
# 중간값으로 대체
df_filled_median = df.fillna(df.median(numeric_only=True))
# 최빈값으로 대체
df_filled_mode = df.fillna(df.mode().iloc[0])
(4) 머신러닝을 이용한 결측값 예측
from sklearn.linear_model import LinearRegression
# 회귀 모델을 활용한 결측값 예측
known = df[df['D'].notnull()]
unknown = df[df['D'].isnull()]
model = LinearRegression()
model.fit(known[['A', 'B', 'C']], known['D'])
predicted_values = model.predict(unknown[['A', 'B', 'C']])
df.loc[df['D'].isnull(), 'D'] = predicted_values
3. 이상값 처리 (Outlier Handling)
(1) 이상값 확인 (IQR 방법)
Q1 = df['A'].quantile(0.25)
Q3 = df['A'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['A'] < lower_bound) | (df['A'] > upper_bound)]
print(outliers)
(2) 이상값 처리
# 이상값 제거
df_no_outliers = df[(df['A'] >= lower_bound) & (df['A'] <= upper_bound)]
# 이상치를 평균값으로 대체
mean_value = df['A'].mean()
df['A'] = df['A'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)
4. 중복값 처리 (Duplicate Handling)
# 중복된 행 확인
print(df.duplicated().sum())
# 중복된 행 제거
df_no_duplicates = df.drop_duplicates()
5. 데이터 타입 변환 (Data Type Conversion)
# 정수형 변환
df['A'] = df['A'].astype(int)
# 문자열 변환
df['B'] = df['B'].astype(str)
6. 인코딩 (Encoding)
# 범주형 데이터를 원-핫 인코딩
df_encoded = pd.get_dummies(df, columns=['category_column'])
7. 샘플링 (Sampling)
# 데이터에서 50% 샘플 추출
df_sampled = df.sample(frac=0.5)
# 100개 샘플 추출
df_sampled_n = df.sample(n=100, random_state=42)
8. 특징 선택 및 추출 (Feature Selection & Extraction)
(1) 특징 선택
from sklearn.feature_selection import SelectKBest, f_classif
X = df[['A', 'B', 'C', 'D']].fillna(0)
y = df['target'].fillna(0)
selector = SelectKBest(score_func=f_classif, k=3)
X_new = selector.fit_transform(X, y)
selected_features = selector.get_support(indices=True)
print(selected_features)
(2) 특징 추출
# 두 열의 곱을 새로운 특징으로 추가
df['new_feature'] = df['A'] * df['B']
# 두 열의 합을 새로운 특징으로 추가
df['new_feature_sum'] = df['A'] + df['B']
- 결측값 처리: 제거 또는 대체
- 이상값 처리: 제거 또는 변환
- 중복값 제거: 데이터 정제
- 데이터 타입 변환: 일관성 유지
- 인코딩: 범주형 데이터를 수치형으로 변환
- 샘플링: 데이터 크기 조절
- 특징 선택 및 추출: 중요한 변수만 사용
'⊢MachineLearning' 카테고리의 다른 글
지도학습 : 회귀모델 (0) | 2025.03.06 |
---|---|
데이터 전처리(Data Cleaning) (0) | 2025.03.01 |
Kaggle과 Kaggle 데이터셋 다운로드 (0) | 2025.02.17 |
혼동행렬을 활용한 분류 성능 지표 (1) | 2025.02.02 |
titanic 데이터셋 분석 및 모델 학습 (0) | 2025.01.29 |