EDA와 데이터 전처리

이주현·2023년 12월 12일
1

머신러닝

목록 보기
9/14

EDA(탐색적 데이터 분석)와 데이터 전처리는
데이터 분석 및 모델링 과정에서 중요한 두 단계이다.
두 단계를 명확하게 구분하고 차례대로 진행하는 것이 좋다.

EDA는 데이터의 특성과 문제점을 발견하는 데 도움이 되며, 전처리 단계에서 보다 효과적인 전략을 수립할 수 있다

EDA (탐색적 데이터 분석)

EDA의 목적

  • EDA는 데이터를 깊이 있게 이해하고, 데이터에 숨겨진 패턴, 이상치, 변수 간의 관계 등을 파악하는 것

EDA의 순서

  1. 데이터 구조 파악
    데이터의 크기, 변수의 수, 데이터 타입 확인

  2. 결측치 확인
    데이터 내 결측치 존재 여부와 분포 확인

  3. 단변량 분석
    각 변수의 분포, 중심 경향, 변동성 파악

  4. 이변량 분석
    변수 간 관계, 상관관계 분석.

  5. 시각화
    히스토그램, 박스플롯, 산점도 등을 통한 시각적 분석

  6. 기초 통계 분석
    평균, 중앙값, 표준편차 등 기초 통계량 계산

EDA 순서별 사용 메소드

1. 데이터 구조파악

df.shape = 데이터프레임의 크기와 변수 확인

df.dtype() = 데이터 타입 확인

df.info() = 자세한 데이터 확인(요약 정보)

df.count() = 데이터 개수 확인

df.describe() = 데이터의 통계적인 수치 확인(이상점있는지)

df.['타깃데이터'].describe() =target데이터 확인하기

2. 결측치 확인

df.insull().sum() = 결측치 존재 여부 확인

#결측치 분포 시각화 
import seaborn as sns

sns.heatmap(df.isnull(), cbar=False)

3. 다변량 분석

df.describe() = 각 변수의 요약 통계량 확인

# 변수의 분포 시각화(히스토그램)
import matplotlib.pyplot as plt

df['변수명'].hist()

plt.xlabel('변수명')

plt.ylabel('빈도')

plt.title('변수명 분포')

plt.show()

4. 이변량 분석

#변수 간 관계 시각화(산점도)
plt.scatter(df['변수1'], df['변수2'])

plt.xlabel('변수1')

plt.ylabel('변수2')

plt.title('변수1 vs. 변수2')

plt.show()

#상관 행렬 계산
df.corr()

5. 시각화

  • 수치형 데이터 = 히스토그램
  • 카테고리형 데이터 = 파이차트
#히스토그램
df['변수명'].hist()

#박스플롯
sns.boxplot(x='변수1', y='변수2', data=df)

#산점도
plt.scatter(df['변수1'], df['변수2'])

6. 기초 통계 분석

#평균, 중앙값, 표준편차 계산
mean = df['변수명'].mean()

median = df['변수명'].median()

std_dev = df['변수명'].std()



데이터 전처리

데이터 전처리 목적

  • 분석이나 모델링을 위해 데이터를 정제하고 변환하는 과정

데이터 전처리 순서

  1. 결측치 처리
    결측치 제거, 대체, 보간 방법 적용

  2. 이상치 처리
    이상치 탐지 및 제거 또는 수정

  3. 데이터 변환
    로그 변환, 스케일링, 정규화

  4. 인코딩
    범주형 변수를 수치형으로 변환 (원-핫 인코딩, 레이블 인코딩)

  5. 특성 선택 및 생성
    중요한 변수 선택, 새로운 변수 생성

  6. 데이터 세트 분할
    훈련, 검증, 테스트 데이터 세트로 분할

데이터 전처리 순서별 사용 메소드

1. 결측치 처리

#결측치 확인
df.innull().sum()

#결측치 제거
df.dropna(inplace=True)

# 결측치 대체(예: 평균 값으로 대체)
df['변수명'].fillna(df['변수명'].mean(), inplace=True)

# 보간 방법 적용 (선형 또는 다항식 보간)
df['변수명'].interpolate(method='linear', inplace=True)

2. 이상치 처리

#이상치 탐지(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)

3. 데이터 변환

스케일링 쓰는 이유

  • 특성 간 범위 조절

    • 데이터들간의 다른 범우외 단위를 가질 수 있어서 사용
  • 수렴 속도 향상

    • 특성 간의 가중치를 균일하게 만들어
      학습과정 안정성과 속도를 개선
  • 이상치 영향 감소

  • 알고리즘 요구사항 충족

  • 모델 해석 용이성

스케일링 방법 2가지

  • 정규화(Normalization)
    • 목적 : 데이터의 값들을 0과 1사이의 범위로 조정

    • 방법 : 각 데이터 포인트에서 최소값을 빼고, 이를 최대값과 최소값의 차이로 나눔

    • 수식 : 정규화된값=(원래값−최소값)/(최대값−최소값)

    • 사용 예 : Min-Max Scaling


  • 표준화(Standardization)
    • 목적 : 데이터가 평균 0, 표준편차 1을 갖는 분포를 따르도록 조정
    • 방법 : 각 데이터 포인트에서 평균을 빼고, 이를 표준편차로 나눔
    • 수식 : 표준화된값=(원래값−평균)/표준편차
    • 사용 예 : 사용 예: Z-Score 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'])

4. 인코딩

#원-핫 인코딩
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)
profile
Backend Delveloper

3개의 댓글

comment-user-thumbnail
2024년 8월 29일

좋은 글 보고 갑니다!
혹시 정리해주신 내용의 출처도 알 수 있을까요?

1개의 답글