Chapter 8: 더 재미있는 데이터로 - 타이타닉 생존 예측¶
한 줄 요약: 역사적 비극에서 배우는 머신러닝 - 실제 데이터의 결측치와 범주형 변수를 다루며 "누가 살아남았을까?"를 예측해봅니다.
🎯 이 장에서 배우는 것¶
- [ ] 실제 데이터에서 빈 값(결측치)을 찾고 적절히 처리할 수 있다
- [ ] 문자로 된 범주형 변수를 숫자로 변환할 수 있다
- [ ] 여러 특성을 조합해 분류 모델을 만들고 학습시킬 수 있다
- [ ] 모델의 예측 결과를 해석하고 인사이트를 도출할 수 있다
- [ ] 특성 중요도를 분석해 어떤 요인이 결과에 영향을 미쳤는지 설명할 수 있다
💡 왜 이걸 배우나요?¶
이론에서 현실로¶
지금까지 배운 머신러닝은 깔끔하게 준비된 데이터였어요. 하지만 현실의 데이터는 다릅니다:
현실 데이터의 특징:
┌─────────────────────────────────────────────────────┐
│ 🕳️ 빈 값(결측치)이 있다 │
│ 📝 숫자가 아닌 문자 데이터가 있다 │
│ 🔀 데이터 형식이 일관적이지 않다 │
│ ❓ 의미를 알 수 없는 값이 있다 │
└─────────────────────────────────────────────────────┘
이 장에서는 진짜 현실의 데이터를 다루는 법을 배웁니다.
타이타닉 데이터가 특별한 이유¶
🚢 1912년 4월 15일
- 2,224명의 승객과 승무원
- 1,502명 사망
- 역사상 가장 유명한 해양 사고
📊 데이터의 가치
- 실제 역사적 기록
- 생존에 영향을 미친 요인 분석 가능
- "여성과 어린이 먼저" 원칙이 정말 지켜졌을까?
단순히 기술을 배우는 게 아니라, 데이터로 역사를 분석합니다.
배우게 될 핵심 기술¶
실제 데이터 → [전처리] → [학습] → [해석]
│ │ │ │
├── 결측치 ├── 대체 ├── 모델 ├── 인사이트
├── 범주형 ├── 인코딩 ├── 검증 └── 시각화
└── 이상치 └── 선택 └── 예측
이 과정을 마스터하면, 어떤 데이터든 다룰 수 있게 됩니다!
📚 핵심 개념¶
개념 1: 결측치 (Missing Values)¶
비유로 시작: 결측치는 시험지에서 빈칸으로 남겨둔 문제와 같아요. 학생이 답을 몰랐거나, 시간이 부족했거나, 실수로 건너뛴 거죠. 데이터도 마찬가지로 여러 이유로 값이 비어있을 수 있어요.
정확한 정의: 결측치(Missing Value)는 데이터셋에서 특정 관측치의 특정 변수에 값이 없는 경우를 말합니다. 대부분의 머신러닝 알고리즘은 결측치를 처리하지 못하므로, 학습 전에 반드시 처리해야 합니다.
예를 들어:
타이타닉 데이터의 결측치 예시:
이름 나이 객실등급 성별
─────────────────────────────────
Rose 17 1등급 여성
Jack ??? 3등급 남성 ← 나이 정보 없음
Thomas 35 ??? 남성 ← 객실등급 정보 없음
쉽게 말하면: 데이터에 구멍이 난 것. 구멍을 메우거나 그 행을 버려야 합니다.
개념 2: 결측치 처리 전략¶
비유로 시작: 빈칸을 채우는 방법은 여러 가지예요. 모르면 0점 처리(삭제), 평균 점수로 채우기(평균 대체), 옆 친구 답 보고 쓰기(유사한 데이터로 대체) 등이 있죠.
정확한 정의: 결측치 처리 방법은 크게 세 가지입니다:
결측치 처리 전략:
1. 삭제 (Deletion)
├── 행 삭제: 해당 행 전체 제거
└── 열 삭제: 결측치가 많은 열 전체 제거
2. 대체 (Imputation)
├── 평균/중앙값: 수치형 데이터
├── 최빈값: 범주형 데이터
└── 예측 모델: 다른 특성으로 예측
3. 표시 (Flagging)
└── 결측 여부를 별도 열로 표시
예를 들어:
# 나이가 없는 경우
원본 데이터: [25, NaN, 30, NaN, 45]
# 전략 1: 삭제
삭제 후: [25, 30, 45]
# 전략 2: 평균 대체
평균 = (25 + 30 + 45) / 3 = 33.3
대체 후: [25, 33.3, 30, 33.3, 45]
# 전략 3: 중앙값 대체
중앙값 = 30
대체 후: [25, 30, 30, 30, 45]
쉽게 말하면: 빈 칸을 어떻게 채울지 선택하는 것. 데이터 특성에 맞게 골라야 합니다.
개념 3: 범주형 변수 (Categorical Variables)¶
비유로 시작: 범주형 변수는 선택지가 정해진 객관식 답과 같아요. "성별: 남/여", "혈액형: A/B/O/AB"처럼 몇 가지 선택지 중 하나를 고르는 거죠. 반면 나이나 키는 주관식 숫자처럼 다양한 값을 가질 수 있어요.
정확한 정의: 범주형 변수(Categorical Variable)는 제한된 수의 고유한 범주(카테고리)로 이루어진 변수입니다. 머신러닝 모델은 대부분 숫자만 처리하므로, 범주형 변수를 숫자로 변환(인코딩)해야 합니다.
예를 들어:
타이타닉 데이터의 변수 유형:
수치형 (Numerical) 범주형 (Categorical)
─────────────────── ───────────────────
나이: 0.42 ~ 80 성별: 남성, 여성
운임: 0 ~ 512.329 객실등급: 1, 2, 3
형제자매 수: 0 ~ 8 승선항: C, Q, S
생존여부: 0, 1
쉽게 말하면: 숫자가 아닌 선택지 데이터. 컴퓨터가 이해하려면 숫자로 바꿔야 해요.
개념 4: 인코딩 (Encoding)¶
비유로 시작: 인코딩은 외국어를 번역하는 것과 같아요. 컴퓨터는 "남성", "여성" 같은 한글을 이해 못하니까, 컴퓨터가 이해하는 숫자 언어로 번역해주는 거죠.
정확한 정의: 인코딩(Encoding)은 범주형 데이터를 수치형 데이터로 변환하는 과정입니다. 대표적인 방법으로 레이블 인코딩(Label Encoding)과 원-핫 인코딩(One-Hot Encoding)이 있습니다.
예를 들어:
레이블 인코딩 (Label Encoding):
성별: 여성 → 0, 남성 → 1
원-핫 인코딩 (One-Hot Encoding):
승선항: C, Q, S
원본 C Q S
───── ─── ─── ───
C → 1 0 0
Q → 0 1 0
S → 0 0 1
두 방식의 차이:
레이블 인코딩의 문제:
객실등급: 1등급→1, 2등급→2, 3등급→3
→ 순서/크기 의미가 있으면 OK ✓
승선항: C→0, Q→1, S→2
→ 0 < 1 < 2 라는 잘못된 관계 생성 ✗
원-핫 인코딩:
승선항: C, Q, S → 3개의 이진(0/1) 열 생성
→ 순서 없는 범주에 적합 ✓
쉽게 말하면: 문자를 숫자로 변환하는 방법. 데이터 특성에 맞는 방법을 선택해야 해요.
개념 5: 특성 중요도 (Feature Importance)¶
비유로 시작: 특성 중요도는 시험에서 어떤 과목이 총점에 가장 영향을 미쳤나 분석하는 것과 같아요. 수학 100점이 총점을 많이 올렸는지, 영어 100점이 더 많이 올렸는지 확인하는 거죠.
정확한 정의: 특성 중요도(Feature Importance)는 각 입력 변수가 모델의 예측에 얼마나 기여했는지를 나타내는 지표입니다. 트리 기반 모델에서는 각 특성이 결정을 내리는 데 얼마나 자주, 얼마나 효과적으로 사용되었는지 측정합니다.
예를 들어:
타이타닉 생존 예측 - 특성 중요도 (예시):
성별 ████████████████████████ 0.52 (52%)
객실등급 ██████████████ 0.28 (28%)
나이 ████████ 0.15 (15%)
운임 ███ 0.05 (5%)
→ "여성과 어린이 먼저" 원칙이 데이터로 확인됨!
쉽게 말하면: 어떤 정보가 예측에 가장 중요했는지 순위 매기기.
🔨 따라하기¶
Step 0: 환경 준비¶
목표: 필요한 라이브러리 설치 및 임포트
코드:
# === WHAT: 타이타닉 생존 예측에 필요한 모든 라이브러리 ===
# 이 코드를 가장 먼저 실행하세요!
# --- WHY: 각 라이브러리의 역할 ---
# pandas: 데이터 불러오기, 전처리
# numpy: 수치 계산
# seaborn: 타이타닉 데이터셋 포함 + 시각화
# matplotlib: 그래프 그리기
# sklearn: 머신러닝 모델과 평가 도구
# Colab에서 필요한 라이브러리 임포트
import pandas as pd # 데이터 처리의 핵심
import numpy as np # 수치 연산
import seaborn as sns # 데이터셋 + 시각화
import matplotlib.pyplot as plt # 그래프
# 머신러닝 도구들
from sklearn.model_selection import train_test_split # 데이터 분할
from sklearn.preprocessing import LabelEncoder # 범주형→숫자 변환
from sklearn.tree import DecisionTreeClassifier # 의사결정나무
from sklearn.ensemble import RandomForestClassifier # 랜덤포레스트
from sklearn.metrics import accuracy_score, confusion_matrix # 평가
from sklearn.metrics import classification_report
# 한글 폰트 설정 (그래프에서 한글 깨짐 방지)
plt.rc('font', family='DejaVu Sans') # Colab 기본 폰트
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 방지
# 경고 메시지 숨기기
import warnings
warnings.filterwarnings('ignore')
print("✅ 모든 라이브러리 준비 완료!")
print(f" pandas 버전: {pd.__version__}")
실행 결과: ``` ✅ 모든 라이브러리 준비 완료! pandas 버전: