EDA(탐색적 데이터 분석)와 데이터 전처리는
데이터 분석 및 모델링 과정에서 중요한 두 단계이다.
두 단계를 명확하게 구분하고 차례대로 진행하는 것이 좋다.
EDA는 데이터의 특성과 문제점을 발견하는 데 도움이 되며, 전처리 단계에서 보다 효과적인 전략을 수립할 수 있다
데이터 구조 파악
데이터의 크기, 변수의 수, 데이터 타입 확인
결측치 확인
데이터 내 결측치 존재 여부와 분포 확인
단변량 분석
각 변수의 분포, 중심 경향, 변동성 파악
이변량 분석
변수 간 관계, 상관관계 분석.
시각화
히스토그램, 박스플롯, 산점도 등을 통한 시각적 분석
기초 통계 분석
평균, 중앙값, 표준편차 등 기초 통계량 계산
df.shape = 데이터프레임의 크기와 변수 확인
df.dtype() = 데이터 타입 확인
df.info() = 자세한 데이터 확인(요약 정보)
df.count() = 데이터 개수 확인
df.describe() = 데이터의 통계적인 수치 확인(이상점있는지)
df.['타깃데이터'].describe() =target데이터 확인하기
df.insull().sum() = 결측치 존재 여부 확인
#결측치 분포 시각화
import seaborn as sns
sns.heatmap(df.isnull(), cbar=False)
df.describe() = 각 변수의 요약 통계량 확인
# 변수의 분포 시각화(히스토그램)
import matplotlib.pyplot as plt
df['변수명'].hist()
plt.xlabel('변수명')
plt.ylabel('빈도')
plt.title('변수명 분포')
plt.show()
#변수 간 관계 시각화(산점도)
plt.scatter(df['변수1'], df['변수2'])
plt.xlabel('변수1')
plt.ylabel('변수2')
plt.title('변수1 vs. 변수2')
plt.show()
#상관 행렬 계산
df.corr()
#히스토그램
df['변수명'].hist()
#박스플롯
sns.boxplot(x='변수1', y='변수2', data=df)
#산점도
plt.scatter(df['변수1'], df['변수2'])
#평균, 중앙값, 표준편차 계산
mean = df['변수명'].mean()
median = df['변수명'].median()
std_dev = df['변수명'].std()
결측치 처리
결측치 제거, 대체, 보간 방법 적용
이상치 처리
이상치 탐지 및 제거 또는 수정
데이터 변환
로그 변환, 스케일링, 정규화
인코딩
범주형 변수를 수치형으로 변환 (원-핫 인코딩, 레이블 인코딩)
특성 선택 및 생성
중요한 변수 선택, 새로운 변수 생성
데이터 세트 분할
훈련, 검증, 테스트 데이터 세트로 분할
#결측치 확인
df.innull().sum()
#결측치 제거
df.dropna(inplace=True)
# 결측치 대체(예: 평균 값으로 대체)
df['변수명'].fillna(df['변수명'].mean(), inplace=True)
# 보간 방법 적용 (선형 또는 다항식 보간)
df['변수명'].interpolate(method='linear', inplace=True)
#이상치 탐지(z-score)
from scipy import stats
z_scores = np.abs(stats.zscore(df))
outliers = (z_scores > threshold).all(axis=1)
#이상치 제거
df = df[~outliers]
#이상치 탐지(IQR)
# 1. 1사분위수(Q1)와 3사분위수(Q3) 계산
Q1 = df['values'].quantile(0.25)
Q3 = df['values'].quantile(0.75)
# 2. IQR 계산
IQR = Q3 - Q1
# 3. 이상치 식별
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['values'] < lower_bound)
| (df['values'] > upper_bound)]
# 4. 이상치 출력
print(outliers)
특성 간 범위 조절
수렴 속도 향상
이상치 영향 감소
알고리즘 요구사항 충족
모델 해석 용이성
목적 : 데이터의 값들을 0과 1사이의 범위로 조정
방법 : 각 데이터 포인트에서 최소값을 빼고, 이를 최대값과 최소값의 차이로 나눔
수식 : 정규화된값=(원래값−최소값)/(최대값−최소값)
사용 예 : Min-Max Scaling
#로그 변환
import numpy as np
df['로그변환'] = np.log(df['원본변수'])
#스케일링
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df['스케일링변수'] = scaler.fit_transform(df[['원본변수']])
#정수형으로 변환
df['column_name'] = df['column_name'].astype(int)
#부동 소수점으로 변환
df['column_name'] = df['column_name'].astype(float)
#문자열로 변환
df['column_name'] = df['column_name'].astype(str)
#카테고리형으로 변환
df['column_name'] = df['column_name'].astype('category')
#날짜 데이터로 변환
df['date_column'] = pd.to_datetime(df['date_column'])
#원-핫 인코딩
df_encoded = pd.get_dummies(df, columns=['범주형변수'])
#레이블 인코딩
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
df['범주형변수'] =
label_encoder.fit_transform(df['범주형변수'])
#중요한 변수 선택(예: feature importance 사용)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X, y)
importance = model.feature_importances_
selected_features = X.columns[importance > threshold]
#새로운 변수 생성
df['새로운변수'] = df['기존변수1'] * df['기존변수2']
#훈련, 검증, 테스트 데이터 세트로 분할
from sklearn.model_selection import train_test_split
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)
좋은 글 보고 갑니다!
혹시 정리해주신 내용의 출처도 알 수 있을까요?