본문 바로가기
데이터 사이언스/데이터 사이언스 코딩

분석 결측치 처리 시각화 나이 그룹화 다중 조건 시각화 EDA 프로세스

by 윤슬새벽 2025. 7. 29.
반응형

🚢 타이타닉 생존자 분석 EDA 전체 정리


🧭 대분류 1. 데이터 로딩 및 전처리

📘 중분류 1-1. 라이브러리 및 시각화 설정

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams["font.family"] = "Malgun Gothic"
plt.rcParams["axes.unicode_minus"] = False

✅ 한글 폰트와 마이너스 부호 깨짐 방지


📘 중분류 1-2. 데이터 불러오기 및 구조 확인

df = sns.load_dataset("titanic")
df.head()
df.describe()
df.info()

✅ describe()는 수치 요약
✅ info()는 결측치, 데이터 타입 등 구조 확인


📘 중분류 1-3. 결측치(Missing Values) 처리

df["age"].fillna(df["age"].mean())  # 평균으로 채움
df["embarked"].fillna(df["embarked"].mode()[0])  # 최빈값으로 채움

⚠️ inplace=True 대신 원본을 보존하는 원칙
평균 또는 최빈값으로 결측치 채움 (단, 추후 모델링 목적이면 별도 전략 필요)


🧭 대분류 2. 생존자 전반 분석

📘 중분류 2-1. 생존자/사망자 비율

survived_count = df["survived"].value_counts()
survived_rate = df["survived"].mean()

print(f"생존자: {survived_count[1]}명")
print(f"사망자: {survived_count[0]}명")
print(f"생존율: {survived_rate:.2%}")

🔎 전체 생존율을 파악하는 것은 이후 변수별 영향 분석의 기준


📘 중분류 2-2. 성별에 따른 생존율 분석

📙 소분류 1: 성별 생존자 수 & 생존율 시각화

fig, axes = plt.subplots(1,2, figsize=(15,5))

sns.countplot(data=df, x='sex', hue="survived", ax=axes[0])
axes[0].set_title("성별에 따른 생존자 수")

sex_survived = df.groupby("sex")["survived"].mean().reset_index()
sns.barplot(data=sex_survived , x="sex", y="survived", ax=axes[1], 
            hue="survived", palette=["lightblue", "pink"])
axes[1].set_title("성별에 따른 생존율")
axes[1].set_ylim(0,1)
plt.tight_layout()
plt.show()

📙 소분류 2: 교차표(Crosstab)

gender_survival_counts = pd.crosstab(df["sex"], df["survived"])
gender_survival_counts.plot(kind="bar", color=["red", "green"])

🔎 시각화 + 그룹비 연산으로, 여성이 생존율이 더 높음 확인


📘 중분류 2-3. 승객 등급(Pclass)에 따른 생존율

fig, axes = plt.subplots(1,3, figsize=(15,5))

# 생존자 수
sns.countplot(data=df, x='pclass', hue="survived", ax=axes[0])

# 생존율
pclass_survived = df.groupby("pclass")["survived"].mean().reset_index()
sns.barplot(data=pclass_survived , x="pclass", y="survived", ax=axes[1], color="skyblue")

# 등급-성별 생존율 교차 히트맵
cross_tab = pd.crosstab(df["pclass"], df["sex"], values=df["survived"], aggfunc="mean")
sns.heatmap(cross_tab, annot=True, fmt=".2f", cmap="RdYlBu_r", cbar_kws={"label":"생존율"}, ax=axes[2])
plt.tight_layout()
plt.show()

🔎 1등급 승객일수록 생존 확률이 높고, 여성의 생존율이 모든 등급에서 더 높음


🧭 대분류 3. 나이에 따른 생존율 분석

📘 중분류 3-1. 성별 + 나이 + 생존 여부 시각화

fig, axes = plt.subplots(2,2, figsize=(15,10))

sns.boxplot(data=df, x="sex", y="age", hue="survived", ax=axes[0,0])
axes[0,0].set_title("성별과 나이에 따른 생존 현황")

sns.histplot(data=df, x="age", ax=axes[0,1])
axes[0,1].set_title("전체 승객 나이 현황")

boxplot은 중앙값, 이상치, 분산 시각화에 유용
✅ hue='survived'로 생존 여부 색상 구분


📘 중분류 3-2. 나이 그룹 정의 및 생존율 분석

bins = [0,5,12,18,25,35,60, np.inf]
labels = ["유아(0~4)", "어린이(5-11)", "청소년(12-17)", "청년(18-24)",
          "성인(25-34)", "중년(35-59)", "노인(60+)"]

df["age_group"] = pd.cut(df["age"], bins, labels=labels)

age_group_survived = df.groupby("age_group", observed=True)["survived"].mean().reset_index()
sns.barplot(data=age_group_survived, x="age_group", y="survived", ax=axes[1,0], color="skyblue")
axes[1,0].set_title("나이 그룹별 생존율")
axes[1,0].tick_params(axis="x", rotation=45)

나이 그룹별 생존율: 유아와 어린이의 생존율이 상대적으로 높음


📘 중분류 3-3. 생존 여부에 따른 나이 분포

sns.histplot(data=df, x="age", hue="survived", stat="density", ax=axes[1,1])
axes[1,1].set_title("생존 여부에 따른 나이 분포")

✅ stat="density"는 비교를 위한 밀도 분포 곡선


✅ 최종 요약 표

분석 대상 주요 분석 방식 시각화/통계 도구 주요 인사이트
성별 groupby, countplot, barplot seaborn, pandas 여성의 생존율이 매우 높음
등급 groupby, crosstab, heatmap seaborn 1등급 생존율 > 3등급
나이 pd.cut, groupby, boxplot, histplot seaborn, pandas 유아~청소년 생존율 ↑, 노년층 ↓
 

💡 EDA → 보고서 → 모델링 전환 흐름 요약

 
데이터 확보 → 전처리 → EDA(변수별 통찰 도출) → 보고서/시각화 → 피처 정의(나이 그룹화 등) → 모델 학습 준비
데이터 확보
 → 전처리
 → EDA(변수별 통찰 도출)
 → 보고서/시각화
 → 피처 정의(나이 그룹화 등)
 → 모델 학습 준비

반응형