데이터 사이언스/데이터 사이언스 코딩
분석 결측치 처리 시각화 나이 그룹화 다중 조건 시각화 EDA 프로세스
윤슬새벽
2025. 7. 29. 17:10
반응형
🚢 타이타닉 생존자 분석 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(변수별 통찰 도출)
→ 보고서/시각화
→ 피처 정의(나이 그룹화 등)
→ 모델 학습 준비
반응형