콘텐츠로 이동

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 버전: