🚢 泰坦尼克实战

从零开始的数据分析之旅

📖 泰坦尼克:EDA实战项目

泰坦尼克号数据集是数据分析的"Hello World"——每个数据科学家的入门项目。1912年泰坦尼克号沉没,2224名乘客中1502人遇难。通过分析乘客数据,我们试图回答:什么因素影响了生存?

EDA流程: 1. 数据加载 2. 数据概览 3. 数据清洗 ──────── ──────── ──────── sns.load_dataset() df.head() 缺失值处理 pd.read_csv() df.info() ├ age → 中位数填充 df.describe() ├ embarked → 众数填充 df.isnull().sum() └ deck → 删除 4. 单变量分析 5. 双变量分析 6. 多变量分析 ──────── ──────── ──────── 直方图/计数图 交叉分析 分面图 ├ 年龄分布 ├ 性别×生存 ├ 性别+舱位+生存 ├ 票价分布 ├ 舱位×生存 └ 年龄+性别+生存 └ 乘客等级 └ 年龄×生存 7. 特征工程 8. 结论报告 ──────── ──────── 家庭大小= siblings 生存关键因素排名 + parents + 1 ├ 性别(女>男) 是否独乘 ├ 舱位(一等>三等) └ 年龄(儿童优先)

1. 数据概览

import seaborn as sns
import pandas as pd

df = sns.load_dataset('titanic')
print(f"形状: {df.shape}")     # (891, 15)
print(f"缺失值:\n{df.isnull().sum()}")
# age: 177, deck: 688, embarked: 2

🔍 生存率分析

总体与分组生存率

# 总生存率
print(f"总生存率: {df['survived'].mean():.2%}")  # 38.4%

# 按性别
gender_survival = df.groupby('sex')['survived'].mean()
# female: 74.2%, male: 18.9%  → 女性生存率是男性的4倍!

# 按舱位
class_survival = df.groupby('class')['survived'].mean()
# First: 63.0%, Second: 47.3%, Third: 24.2%

# 按年龄组
df['age_group'] = pd.cut(df['age'], bins=[0,12,18,35,60,100],
                         labels=['儿童','青少年','青年','中年','老年'])
age_survival = df.groupby('age_group', observed=True)['survived'].mean()
# 儿童: 58.0% → 最高!
因素分组生存率差异
性别女 / 男74.2% / 18.9%55.3pp
舱位一等 / 三等63.0% / 24.2%38.8pp
年龄儿童 / 老年58.0% / 27.1%30.9pp

🎨 可视化分析

import matplotlib.pyplot as plt

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

# 生存分布(按性别)
sns.countplot(data=df, x='survived', hue='sex', ax=axes[0,0], palette='coolwarm')

# 舱位与生存率
sns.barplot(data=df, x='class', y='survived', hue='sex', ax=axes[0,1])

# 年龄分布
sns.histplot(data=df, x='age', hue='survived', bins=30, ax=axes[1,0])

# 票价箱线图
sns.boxplot(data=df, x='class', y='fare', ax=axes[1,1])

家庭大小分析

df['family_size'] = df['sibsp'] + df['parch'] + 1
family_survival = df.groupby('family_size')['survived'].agg(['mean', 'count'])
# family=4时生存率最高(72.4%)
# 独行(family=1)和大家庭(>6)生存率低

📝 EDA结论

关键发现:
性别是最强预测因子:女性生存率74.2% vs 男性18.9%("妇孺优先"原则)
舱位影响显著:一等舱63.0% vs 三等舱24.2%(阶层差异)
儿童优先:0-12岁生存率58.0%,显著高于其他年龄组
小家庭优势:3-4人家庭生存率最高,独行和大家庭都不利
交互效应:一等舱女性生存率96.8%,三等舱男性仅13.5%
泰坦尼克数据集揭示了当时社会的阶层和性别不平等。数据分析不只是数字——它也是理解社会的一扇窗。

📐 2024-2025 EDA前沿

📊 高级可视化分析

import seaborn as sns, matplotlib.pyplot as plt

df = sns.load_dataset('titanic')
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# 年龄-票价联合分布
sns.kdeplot(data=df, x='age', y='fare', hue='survived',
            ax=axes[0,0], fill=True, alpha=0.5, palette='coolwarm')

# 生存率热力图
df['age_bin'] = pd.cut(df['age'], bins=[0,12,18,35,60,100])
heat = df.pivot_table('survived', index='age_bin',
                      columns='class', observed=True)
sns.heatmap(heat, annot=True, fmt='.2f', cmap='coolwarm', ax=axes[0,1])

# 家庭大小与生存率
df['family_size'] = df['sibsp'] + df['parch'] + 1
sns.barplot(data=df, x='family_size', y='survived',
            ax=axes[1,1], color='#3b82f6')

🧮 统计检验

from scipy import stats

# 卡方检验: 性别与生存
contingency = pd.crosstab(df['sex'], df['survived'])
chi2, p, dof, expected = stats.chi2_contingency(contingency)
print(f"chi2={chi2:.2f}, p={p:.2e}")

# t检验: 年龄差异
surv_age = df[df['survived']==1]['age'].dropna()
died_age = df[df['survived']==0]['age'].dropna()
t, p = stats.ttest_ind(surv_age, died_age)

# ANOVA: 票价差异
f, p = stats.f_oneway(
    df[df['class']=='First']['fare'],
    df[df['class']=='Second']['fare'],
    df[df['class']=='Third']['fare'])
p值告诉你是否有显著差异,效应量(effect size)告诉你差异有多大。两者都要看!

💻 完整实战代码

#!/usr/bin/env python3
# 泰坦尼克实战 — 完整实战

import pandas as pd
import numpy as np
import seaborn as sns

# ============ 加载数据 ============
df = sns.load_dataset('titanic')
print(f"数据形状: {df.shape}")
print(f"列名: {list(df.columns)}")
print(f"\n缺失值:\n{df.isnull().sum()}")

# ============ 生存率分析 ============
survival_rate = df['survived'].mean()
print(f"\n总生存率: {survival_rate:.2%}")

gender_survival = df.groupby('sex')['survived'].mean()
print(f"按性别:\n{gender_survival.apply(lambda x: f'{x:.2%}')}")

class_survival = df.groupby('class')['survived'].mean()
print(f"按舱位:\n{class_survival.apply(lambda x: f'{x:.2%}')}")

# ============ 年龄组分析 ============
df['age_group'] = pd.cut(df['age'], bins=[0,12,18,35,60,100],
                         labels=['儿童','青少年','青年','中年','老年'])
age_survival = df.groupby('age_group', observed=True)['survived'].mean()
print(f"按年龄组:\n{age_survival.apply(lambda x: f'{x:.2%}')}")

# ============ 数据清洗 ============
df_clean = df.copy()
df_clean['age'] = df_clean['age'].fillna(df_clean['age'].median())
df_clean['embarked'] = df_clean['embarked'].fillna(df_clean['embarked'].mode()[0])
df_clean.drop(columns=['deck'], inplace=True, errors='ignore')
print(f"\n清洗后缺失值:\n{df_clean.isnull().sum()[df_clean.isnull().sum()>0]}")

# ============ 交叉分析 ============
cross = pd.crosstab([df['class'], df['sex']], df['survived'], normalize='index')
print(f"\n交叉分析(生存率):\n{(cross[1]*100).round(1).astype(str)+'%'}")

# ============ 家庭大小分析 ============
df['family_size'] = df['sibsp'] + df['parch'] + 1
family_survival = df.groupby('family_size')['survived'].agg(['mean', 'count'])
print(f"\n家庭大小与生存:\n{family_survival}")

print("\n✅ Python验证通过 — EDA完整分析报告")
🏆 成就解锁:EDA完整分析报告
Python验证通过 — 891条数据分析完成:总生存率38.4%,女性74.2% vs 男性18.9%,一等舱63.0% vs 三等舱24.2%,儿童58.0%优先。家庭4人时生存率最高72.4%。4张可视化图表全部生成。
思考题:
① 为什么性别是泰坦尼克生存的最强预测因子?
② 舱位和性别之间是否存在交互效应?
③ 如何用统计检验验证生存率差异的显著性?
④ 缺失值处理策略如何影响分析结论?

📝 课后练习

  1. 对泰坦尼克数据做完整的统计检验(卡方检验/t检验)
  2. 创建新特征(称谓/船票前缀)并分析其预测力
  3. 用决策树可视化生存决策规则
  4. 对比不同缺失值处理方法的结果差异
  5. 在Kaggle上提交你的第一个预测模型
📚 参考资料:
• Kaggle Titanic: kaggle.com/c/titanic
• Seaborn Dataset: github.com/mwaskom/seaborn-data
• Python for Data Analysis (Wes McKinney, 2022)
• ydata-profiling: ydata-profiling.ydata.ai

🗺️ EDA分析框架

EDA标准流程框架: Step 1: 数据概览 Step 2: 单变量分析 ──────────────── ──────────────── df.shape / df.info() 数值型: df.head() / df.tail() ├ 直方图 + KDE df.describe() ├ 箱线图 df.isnull().sum() └ 描述统计 df.dtypes 分类型: Step 3: 双变量分析 ├ 计数图 ──────────────── ├ 饼图 数值×数值: └ 频率表 ├ 散点图 ├ 相关热力图 Step 4: 多变量分析 └ 回归线 ──────────────── 分面图: 数值×分类: ├ FacetGrid ├ 分组箱线图 ├ pairplot ├ 分组小提琴图 └ 交叉分析 └ 分组统计 交互式: 分类×分类: ├ Plotly ├ 交叉表 ├ 下拉筛选 ├ 堆叠柱状图 └ 联动图表 └ 卡方检验 Step 5: 结论报告 ──────────────── □ 关键发现 □ 数据质量问题 □ 建议下一步

EDA自动化工具

工具特点输出适用
ydata-profiling最全面HTML报告中型数据
sweetviz对比分析HTML报告两组对比
dtale交互式Web界面探索性
PyGWalker拖拽式可视化非编程用户
autoviz自动选图图表快速预览