멋쟁이사자처럼 그로스마케터2기

[멋쟁이사자처럼부트캠프 그로스마케팅 2기 회고] 14일차 (EDA)

전젬민 2025. 6. 25. 15:37

오늘은 EDA 에 대해서 배웠다. 데이터를 시각화하고, 데이터를 이해하는 단계로 꽤 재밌는 시간이었다.

그래프를 만들고, 정제하는 과정은 나에게 꽤 잘 맞는 것 같다.

 


EDA

EDA의 주요 목적

  1. 데이터의 기본 정보 파악:
  2. 결측치 및 이상치 탐색: 누락된 값과 비정상적인 값을 찾아 적절한 처리 방안을 결정.
  3. 기술통계를 이용한 데이터 요약: 평균, 중앙값, 표준편차 등 주요 통계량을 분석.
  4. 데이터의 분포 확인: 데이터가 정규분포를 따르는지 여부 등을 시각적으로 확인.
  5. 변수 간 관계 분석: 변수 간 상관관계를 분석하여 데이터의 패턴을 이해.

데이터 기본 정보 확인

: 데이터 크기, 컬럼 수, 데이터 타입 등을 확인

import pandas as pd

# 데이터 로드 (예제 데이터)
df = pd.read_csv("sample_data.csv")

# 데이터 크기 확인 (행, 열 개수)
print(f"데이터 크기: {df.shape}")

# 컬럼명 확인
print(f"컬럼명: {df.columns.tolist()}")

# 데이터 타입 확인
print(df.info())

# 상위 5개 행 출력
print(df.head())

결측치 및 이상치 탐색

# 결측치 확인
print(df.isnull().sum())
# 결측치 처리 방법
# 평균으로 대체
df['나이'] = df['나이'].fillna(df['나이'].mean())

# 최빈값으로 대체
df['소득'] = df['소득'].fillna(df['소득'].median())

이상치 탐색

  • 박스플롯(Box Plot) 활용: 사분위수를 기반으로 이상치를 탐색.
  • Z-score 활용: 데이터가 평균에서 얼마나 벗어났는지 확인.
# 박스플롯
import matplotlib.pyplot as plt
import seaborn as sns

# 박스플롯으로 이상치 확인
plt.figure(figsize=(6, 4))
sns.boxplot(x=df['소득'])
plt.title("소득 이상치 탐색")
plt.show()
# Z-score
from scipy import stats

# Z-score 계산
df["소득_Z"] = stats.zscore(df["소득"])

# Z-score가 3 이상인 데이터 조회
outliers = df[df["소득_Z"].abs() > 3]
print(outliers)

 

데이터 분포 확인

plt.figure(figsize=(6, 4))
sns.histplot(df["소득"], bins=30, kde=True)
plt.title("소득 분포")
plt.show()

import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt

stats.probplot(df["소득"].dropna(), dist="norm", plot=plt)
plt.title("QQ-Plot")
plt.show()

 

 

# 수치형 변수 간의 상관계수 확인
correlation_matrix = df.select_dtypes(include=[float, int]).corr()
print(correlation_matrix)

 

 

히트맵

plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("상관관계 히트맵")
plt.show()

 

 

plt.figure(figsize=(6, 4))
sns.scatterplot(x=df["소득"], y=df["구매횟수"])
plt.xlabel("소득")
plt.ylabel("구매횟수")
plt.title("소득과 구매횟수 관계")
plt.show()

 

 

박스플롯

plt.figure(figsize=(6, 4))
sns.boxplot(x=df["성별"], y=df["소득"])
plt.title("성별에 따른 소득 분포")
plt.show()

 

이상치 제거, 컬럼 제거

# 이상치 제거 (소득이 Z-score 3 초과인 데이터 제거)
df_cleaned = df[df["소득_Z"].abs() <= 3]

# 필요 없는 컬럼 제거 (Z-score 컬럼 삭제)
df_cleaned.drop(columns=["소득_Z"], inplace=True)

print(df_cleaned.info())  # 데이터 정리 후 구조 확인