{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a1f2420a",
   "metadata": {},
   "source": [
    "# 5. 실전 데이터 분석: 타이타닉 데이터셋\n",
    "\n",
    "## 📚 학습 목표\n",
    "- 실제 데이터셋을 활용한 데이터 분석 과정 이해\n",
    "- 데이터 로딩과 탐색적 데이터 분석(EDA) 수행\n",
    "- 결측치 처리와 데이터 전처리 기법 습득\n",
    "- 통계적 분석과 시각화를 통한 인사이트 도출\n",
    "\n",
    "## 🔍 문제 설명\n",
    "\n",
    "타이타닉 데이터셋은 데이터 분석과 머신러닝 학습에서 가장 유명한 데이터셋 중 하나입니다. 1912년 타이타닉호 침몰 사고에서 승객들의 생존 여부와 관련된 다양한 정보를 포함하고 있어, 데이터 분석의 전 과정을 연습하기에 적합합니다.\n",
    "\n",
    "### 실전 활용 사례\n",
    "- **데이터 분석**: 실제 비즈니스 데이터 분석 과정 학습\n",
    "- **머신러닝**: 분류 모델 개발을 위한 데이터 전처리\n",
    "- **통계 분석**: 요인별 생존율 분석\n",
    "- **시각화**: 데이터 인사이트를 시각적으로 표현\n",
    "\n",
    "## 📝 문제\n",
    "\n",
    "### 문제 5-1: 데이터 로딩과 탐색\n",
    "1. 타이타닉 데이터셋을 로드하고 기본 정보를 확인하세요.\n",
    "2. 데이터의 형태, 컬럼명, 데이터 타입을 파악하세요.\n",
    "3. 결측치 현황을 확인하고 분석하세요.\n",
    "\n",
    "### 문제 5-2: 데이터 전처리\n",
    "4. 결측치를 적절한 방법으로 처리하세요.\n",
    "5. 범주형 변수를 수치형으로 변환하세요.\n",
    "6. 새로운 특성을 생성하세요.\n",
    "\n",
    "### 문제 5-3: 탐색적 데이터 분석\n",
    "7. 성별에 따른 생존율을 분석하세요.\n",
    "8. 좌석 등급에 따른 생존율을 분석하세요.\n",
    "9. 나이와 생존율의 관계를 분석하세요.\n",
    "\n",
    "### 문제 5-4: 고급 분석\n",
    "10. 여러 변수를 조합한 생존율 분석을 수행하세요.\n",
    "11. 시각화를 통해 인사이트를 도출하세요.\n",
    "12. 통계적 검정을 통해 유의성을 확인하세요.\n",
    "\n",
    "## 💡 해답 및 설명\n",
    "\n",
    "### 해답 5-1: 데이터 로딩과 탐색\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "984388d4",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from scipy import stats\n",
    "\n",
    "# 한글 폰트 설정\n",
    "plt.rcParams['font.family'] = 'DejaVu Sans'\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# 1. 타이타닉 데이터셋 로드\n",
    "url = 'https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'\n",
    "titanic = pd.read_csv(url)\n",
    "\n",
    "print(\"데이터셋 기본 정보:\")\n",
    "print(f\"데이터 형태: {titanic.shape}\")\n",
    "print(f\"컬럼명: {list(titanic.columns)}\")\n",
    "print(f\"인덱스: {titanic.index}\")\n",
    "\n",
    "# 2. 데이터 타입과 기본 정보 확인\n",
    "print(\"\\n데이터 타입:\")\n",
    "print(titanic.dtypes)\n",
    "\n",
    "print(\"\\n기본 통계 정보:\")\n",
    "print(titanic.describe())\n",
    "\n",
    "print(\"\\n데이터 미리보기:\")\n",
    "print(titanic.head())\n",
    "\n",
    "# 3. 결측치 현황 확인\n",
    "print(\"\\n결측치 현황:\")\n",
    "missing_data = titanic.isnull().sum()\n",
    "missing_percent = (missing_data / len(titanic)) * 100\n",
    "missing_info = pd.DataFrame({\n",
    "    '결측치 개수': missing_data,\n",
    "    '결측치 비율(%)': missing_percent\n",
    "})\n",
    "print(missing_info[missing_info['결측치 개수'] > 0])\n",
    "\n",
    "# 결측치 시각화\n",
    "plt.figure(figsize=(10, 6))\n",
    "missing_info[missing_info['결측치 개수'] > 0]['결측치 비율(%)'].plot(kind='bar')\n",
    "plt.title('컬럼별 결측치 비율')\n",
    "plt.ylabel('결측치 비율 (%)')\n",
    "plt.xticks(rotation=45)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "84671df1",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 해답 5-2: 데이터 전처리\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a724729",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4. 결측치 처리\n",
    "print(\"결측치 처리:\")\n",
    "\n",
    "# Age 결측치 처리 (평균값으로 대체)\n",
    "age_mean = titanic['Age'].mean()\n",
    "titanic['Age'].fillna(age_mean, inplace=True)\n",
    "print(f\"Age 결측치를 평균값({age_mean:.1f})으로 대체\")\n",
    "\n",
    "# Cabin 결측치 처리 (결측치가 많으므로 'Unknown'으로 대체)\n",
    "titanic['Cabin'].fillna('Unknown', inplace=True)\n",
    "print(\"Cabin 결측치를 'Unknown'으로 대체\")\n",
    "\n",
    "# Embarked 결측치 처리 (최빈값으로 대체)\n",
    "embarked_mode = titanic['Embarked'].mode()[0]\n",
    "titanic['Embarked'].fillna(embarked_mode, inplace=True)\n",
    "print(f\"Embarked 결측치를 최빈값({embarked_mode})으로 대체\")\n",
    "\n",
    "# 결측치 처리 후 확인\n",
    "print(\"\\n결측치 처리 후 현황:\")\n",
    "print(titanic.isnull().sum())\n",
    "\n",
    "# 5. 범주형 변수 수치화\n",
    "print(\"\\n범주형 변수 수치화:\")\n",
    "\n",
    "# Sex 변수 수치화\n",
    "titanic['Sex_numeric'] = titanic['Sex'].map({'male': 0, 'female': 1})\n",
    "print(\"Sex 변수 수치화 완료\")\n",
    "\n",
    "# Embarked 변수 수치화\n",
    "embarked_mapping = {'S': 0, 'C': 1, 'Q': 2}\n",
    "titanic['Embarked_numeric'] = titanic['Embarked'].map(embarked_mapping)\n",
    "print(\"Embarked 변수 수치화 완료\")\n",
    "\n",
    "# 6. 새로운 특성 생성\n",
    "print(\"\\n새로운 특성 생성:\")\n",
    "\n",
    "# 가족 크기 (SibSp + Parch + 1)\n",
    "titanic['FamilySize'] = titanic['SibSp'] + titanic['Parch'] + 1\n",
    "print(\"FamilySize 특성 생성 완료\")\n",
    "\n",
    "# 혼자 여행하는지 여부\n",
    "titanic['IsAlone'] = (titanic['FamilySize'] == 1).astype(int)\n",
    "print(\"IsAlone 특성 생성 완료\")\n",
    "\n",
    "# 나이 그룹\n",
    "titanic['AgeGroup'] = pd.cut(titanic['Age'], \n",
    "                            bins=[0, 12, 18, 35, 60, 100], \n",
    "                            labels=['Child', 'Teenager', 'Young Adult', 'Adult', 'Senior'])\n",
    "print(\"AgeGroup 특성 생성 완료\")\n",
    "\n",
    "# 요금 그룹\n",
    "titanic['FareGroup'] = pd.qcut(titanic['Fare'], \n",
    "                              q=4, \n",
    "                              labels=['Low', 'Medium', 'High', 'Very High'])\n",
    "print(\"FareGroup 특성 생성 완료\")\n",
    "\n",
    "print(\"\\n새로 생성된 특성들:\")\n",
    "print(titanic[['FamilySize', 'IsAlone', 'AgeGroup', 'FareGroup']].head())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c6ae8941",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 해답 5-3: 탐색적 데이터 분석\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ccaaf4d4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 7. 성별에 따른 생존율 분석\n",
    "print(\"성별에 따른 생존율 분석:\")\n",
    "gender_survival = titanic.groupby('Sex')['Survived'].agg(['count', 'sum', 'mean'])\n",
    "gender_survival.columns = ['전체 인원', '생존자 수', '생존율']\n",
    "print(gender_survival)\n",
    "\n",
    "# 시각화\n",
    "plt.figure(figsize=(12, 5))\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "sns.countplot(data=titanic, x='Sex', hue='Survived')\n",
    "plt.title('성별 생존자 수')\n",
    "plt.ylabel('인원 수')\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "sns.barplot(data=titanic, x='Sex', y='Survived')\n",
    "plt.title('성별 생존율')\n",
    "plt.ylabel('생존율')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "# 8. 좌석 등급에 따른 생존율 분석\n",
    "print(\"\\n좌석 등급에 따른 생존율 분석:\")\n",
    "class_survival = titanic.groupby('Pclass')['Survived'].agg(['count', 'sum', 'mean'])\n",
    "class_survival.columns = ['전체 인원', '생존자 수', '생존율']\n",
    "print(class_survival)\n",
    "\n",
    "# 시각화\n",
    "plt.figure(figsize=(12, 5))\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "sns.countplot(data=titanic, x='Pclass', hue='Survived')\n",
    "plt.title('좌석 등급별 생존자 수')\n",
    "plt.ylabel('인원 수')\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "sns.barplot(data=titanic, x='Pclass', y='Survived')\n",
    "plt.title('좌석 등급별 생존율')\n",
    "plt.ylabel('생존율')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "# 9. 나이와 생존율의 관계 분석\n",
    "print(\"\\n나이와 생존율의 관계 분석:\")\n",
    "\n",
    "# 나이 그룹별 생존율\n",
    "age_survival = titanic.groupby('AgeGroup')['Survived'].agg(['count', 'sum', 'mean'])\n",
    "age_survival.columns = ['전체 인원', '생존자 수', '생존율']\n",
    "print(age_survival)\n",
    "\n",
    "# 나이 분포와 생존율\n",
    "plt.figure(figsize=(15, 5))\n",
    "\n",
    "plt.subplot(1, 3, 1)\n",
    "sns.histplot(data=titanic, x='Age', hue='Survived', multiple='stack')\n",
    "plt.title('나이 분포와 생존 여부')\n",
    "\n",
    "plt.subplot(1, 3, 2)\n",
    "sns.boxplot(data=titanic, x='Survived', y='Age')\n",
    "plt.title('생존 여부별 나이 분포')\n",
    "\n",
    "plt.subplot(1, 3, 3)\n",
    "sns.barplot(data=titanic, x='AgeGroup', y='Survived')\n",
    "plt.title('나이 그룹별 생존율')\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4237800c",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 해답 5-4: 고급 분석\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "34aed3f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 10. 여러 변수를 조합한 생존율 분석\n",
    "print(\"여러 변수를 조합한 생존율 분석:\")\n",
    "\n",
    "# 성별과 좌석 등급 조합\n",
    "gender_class_survival = titanic.groupby(['Sex', 'Pclass'])['Survived'].mean().unstack()\n",
    "print(\"\\n성별과 좌석 등급별 생존율:\")\n",
    "print(gender_class_survival)\n",
    "\n",
    "# 시각화\n",
    "plt.figure(figsize=(10, 6))\n",
    "sns.heatmap(gender_class_survival, annot=True, fmt='.3f', cmap='YlOrRd')\n",
    "plt.title('성별과 좌석 등급별 생존율 히트맵')\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "# 가족 크기별 생존율\n",
    "family_survival = titanic.groupby('FamilySize')['Survived'].agg(['count', 'mean'])\n",
    "family_survival.columns = ['인원 수', '생존율']\n",
    "print(\"\\n가족 크기별 생존율:\")\n",
    "print(family_survival)\n",
    "\n",
    "# 11. 종합 시각화\n",
    "plt.figure(figsize=(15, 10))\n",
    "\n",
    "# 생존율 분포\n",
    "plt.subplot(2, 3, 1)\n",
    "titanic['Survived'].value_counts().plot(kind='pie', autopct='%1.1f%%')\n",
    "plt.title('전체 생존율')\n",
    "\n",
    "# 성별 생존율\n",
    "plt.subplot(2, 3, 2)\n",
    "sns.barplot(data=titanic, x='Sex', y='Survived')\n",
    "plt.title('성별 생존율')\n",
    "\n",
    "# 좌석 등급별 생존율\n",
    "plt.subplot(2, 3, 3)\n",
    "sns.barplot(data=titanic, x='Pclass', y='Survived')\n",
    "plt.title('좌석 등급별 생존율')\n",
    "\n",
    "# 나이 그룹별 생존율\n",
    "plt.subplot(2, 3, 4)\n",
    "sns.barplot(data=titanic, x='AgeGroup', y='Survived')\n",
    "plt.title('나이 그룹별 생존율')\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "# 가족 크기별 생존율\n",
    "plt.subplot(2, 3, 5)\n",
    "sns.barplot(data=titanic, x='FamilySize', y='Survived')\n",
    "plt.title('가족 크기별 생존율')\n",
    "\n",
    "# 요금 그룹별 생존율\n",
    "plt.subplot(2, 3, 6)\n",
    "sns.barplot(data=titanic, x='FareGroup', y='Survived')\n",
    "plt.title('요금 그룹별 생존율')\n",
    "plt.xticks(rotation=45)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "# 12. 통계적 검정\n",
    "print(\"\\n통계적 검정:\")\n",
    "\n",
    "# 성별과 생존율의 독립성 검정 (카이제곱 검정)\n",
    "from scipy.stats import chi2_contingency\n",
    "gender_survival_table = pd.crosstab(titanic['Sex'], titanic['Survived'])\n",
    "chi2, p_value, dof, expected = chi2_contingency(gender_survival_table)\n",
    "print(f\"성별과 생존율 독립성 검정:\")\n",
    "print(f\"카이제곱 통계량: {chi2:.4f}\")\n",
    "print(f\"p-value: {p_value:.4f}\")\n",
    "print(f\"결론: {'독립이 아님' if p_value < 0.05 else '독립'}\")\n",
    "\n",
    "# 좌석 등급과 생존율의 독립성 검정\n",
    "class_survival_table = pd.crosstab(titanic['Pclass'], titanic['Survived'])\n",
    "chi2, p_value, dof, expected = chi2_contingency(class_survival_table)\n",
    "print(f\"\\n좌석 등급과 생존율 독립성 검정:\")\n",
    "print(f\"카이제곱 통계량: {chi2:.4f}\")\n",
    "print(f\"p-value: {p_value:.4f}\")\n",
    "print(f\"결론: {'독립이 아님' if p_value < 0.05 else '독립'}\")\n",
    "\n",
    "# 나이와 생존율의 상관관계 (점이연상관계)\n",
    "age_survived_corr = titanic['Age'].corr(titanic['Survived'])\n",
    "print(f\"\\n나이와 생존율의 상관계수: {age_survived_corr:.4f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68907412",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "## 🔧 주요 분석 기법\n",
    "\n",
    "### 데이터 탐색\n",
    "- `df.info()`: 데이터 기본 정보\n",
    "- `df.describe()`: 수치형 데이터 통계\n",
    "- `df.isnull().sum()`: 결측치 확인\n",
    "- `df.value_counts()`: 범주형 데이터 빈도\n",
    "\n",
    "### 데이터 전처리\n",
    "- `df.fillna()`: 결측치 채우기\n",
    "- `df.map()`: 범주형 변수 수치화\n",
    "- `pd.cut()`: 연속형 변수 구간화\n",
    "- `pd.qcut()`: 분위수 기반 구간화\n",
    "\n",
    "### 그룹화와 집계\n",
    "- `df.groupby()`: 그룹별 분석\n",
    "- `df.agg()`: 다양한 집계 함수 적용\n",
    "- `df.unstack()`: 피벗 테이블 형태로 변환\n",
    "\n",
    "### 시각화\n",
    "- `sns.countplot()`: 범주형 데이터 빈도\n",
    "- `sns.barplot()`: 평균값 비교\n",
    "- `sns.heatmap()`: 상관관계 히트맵\n",
    "- `sns.boxplot()`: 분포 비교\n",
    "\n",
    "### 통계적 검정\n",
    "- `chi2_contingency()`: 카이제곱 독립성 검정\n",
    "- `corr()`: 상관계수 계산\n",
    "- `ttest_ind()`: t-검정\n",
    "\n",
    "## 📊 추가 연습문제\n",
    "\n",
    "### 연습문제 1: 추가 특성 생성\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5278aee6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 다음 특성들을 추가로 생성해보세요:\n",
    "# 1. 승객의 호칭(Mr, Mrs, Miss, Dr 등)을 추출하여 새로운 컬럼을 만드세요.\n",
    "# 2. 승선 항구별 생존율을 분석하세요.\n",
    "# 3. 요금과 생존율의 관계를 분석하세요."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a20a5d0f",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 연습문제 2: 고급 시각화\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fce993ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 다음 시각화를 수행해보세요:\n",
    "# 1. 나이, 요금, 가족 크기를 모두 고려한 3D 산점도를 그려보세요.\n",
    "# 2. 생존자와 사망자의 나이 분포를 커널 밀도 추정으로 비교해보세요.\n",
    "# 3. 좌석 등급별 요금 분포를 박스플롯으로 비교해보세요."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "396ad785",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 연습문제 3: 머신러닝 준비\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dc857098",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 다음 작업을 수행해보세요:\n",
    "# 1. 생존 예측을 위한 특성 선택을 수행하세요.\n",
    "# 2. 특성 간 상관관계를 분석하세요.\n",
    "# 3. 데이터를 훈련/테스트 세트로 분할하세요."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5d6cc1d",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "## ⚠️ 주의사항 및 팁\n",
    "\n",
    "1. **결측치 처리**: 데이터의 특성에 따라 적절한 방법을 선택해야 합니다.\n",
    "2. **범주형 변수**: 수치화 시 순서가 있는지 없는지를 고려해야 합니다.\n",
    "3. **새로운 특성**: 도메인 지식을 활용하여 의미 있는 특성을 생성해야 합니다.\n",
    "4. **시각화**: 데이터의 특성에 맞는 적절한 시각화 방법을 선택해야 합니다.\n",
    "5. **통계적 검정**: 검정의 가정을 확인하고 적절한 검정 방법을 선택해야 합니다.\n",
    "\n",
    "## 🎯 실전 활용 예제\n",
    "\n",
    "### 예제 1: 고객 이탈 예측\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8db36612",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 고객 이탈 데이터 분석 예제\n",
    "# 타이타닉 데이터셋의 분석 방법을 고객 이탈 예측에 적용"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ebab22e",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 예제 2: 신용카드 사기 탐지\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ab5e027c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 신용카드 사기 탐지 데이터 분석 예제\n",
    "# 불균형 데이터셋에서의 분석 방법"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "859ef18f",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 예제 3: 주식 가격 예측\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5b675a95",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 주식 가격 예측을 위한 데이터 분석 예제\n",
    "# 시계열 데이터의 특성 분석"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2744099b",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "## 📚 다음 단계\n",
    "\n",
    "이제 실제 데이터셋을 활용한 데이터 분석을 익혔습니다. 다음 단계에서는:\n",
    "- 더 복잡한 데이터 전처리 기법\n",
    "- 고급 시각화 방법\n",
    "- 머신러닝 모델 개발\n",
    "- 모델 성능 평가\n",
    "\n",
    "을 학습하게 됩니다.\n",
    "\n",
    "---\n",
    "\n",
    "**참고 자료:**\n",
    "- [Kaggle 타이타닉 튜토리얼](https://www.kaggle.com/c/titanic)\n",
    "- [Pandas 공식 문서](https://pandas.pydata.org/docs/)\n",
    "- [Seaborn 시각화 가이드](https://seaborn.pydata.org/) "
   ]
  }
 ],
 "metadata": {},
 "nbformat": 4,
 "nbformat_minor": 5
}
