目录
一、数据集简介与加载
1.1 数据集背景
泰坦尼克数据集记录了1912年泰坦尼克号沉船事件中部分乘客的信息,包含以下关键特征:
Survived:是否幸存(0=否,1=是)
Pclass:船舱等级(1/2/3等舱)
Sex:性别
Age:年龄
SibSp:兄弟姐妹/配偶数量
Parch:父母/子女数量
Fare:船票价格
Embarked:登船港口(C=Cherbourg, Q=Queenstown, S=Southampton)
Cabin:船舱编号
1.2 数据加载
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 从网络加载数据
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
df = pd.read_csv(url)
# 显示数据前5行
display(df.head())
二、数据质量审查
2.1 数据概览
print(f"数据集形状:{df.shape}")
df.info()
2.2 缺失值分析
missing = df.isnull().sum().sort_values(ascending=False)
missing_percent = (missing / len(df)) * 100
pd.DataFrame({'缺失数量': missing, '缺失比例(%)': missing_percent.round(2)})
输出结果:
特征 | 缺失数量 | 缺失比例(%) |
---|---|---|
Cabin | 687 | 77.10 |
Age | 177 | 19.87 |
Embarked | 2 | 0.22 |
三、数据清洗与预处理
3.1 处理缺失值
# 删除Cabin列(缺失过多)
df.drop(columns=['Cabin'], inplace=True)
# 用中位数填充Age
df['Age'].fillna(df['Age'].median(), inplace=True)
# 用众数填充Embarked
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)
3.2 特征工程
# 创建家庭人数特征
df['FamilySize'] = df['SibSp'] + df['Parch'] + 1
# 创建是否独自乘船特征
df['IsAlone'] = (df['FamilySize'] == 1).astype(int)
# 创建年龄段分组
bins = [0, 12, 18, 30, 50, 100]
labels = ['儿童', '少年', '青年', '中年', '老年']
df['AgeGroup'] = pd.cut(df['Age'], bins=bins, labels=labels)
# 转换分类变量
df['Sex'] = df['Sex'].map({'male': 0, 'female': 1})
df = pd.get_dummies(df, columns=['Embarked'], prefix='Embarked')
四、探索性数据分析(EDA)
4.1 整体幸存情况
plt.figure(figsize=(8,6))
sns.countplot(x='Survived', data=df, palette='Set2')
plt.title('幸存人数分布', fontsize=14)
plt.xlabel('是否幸存', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.show()
survival_rate = df['Survived'].mean() * 100
print(f"整体幸存率:{survival_rate:.2f}%")
4.2 性别与幸存率分析
gender_survival = df.groupby('Sex')['Survived'].agg(['mean', 'count'])
gender_survival.columns = ['幸存率', '总人数']
gender_survival['幸存率'] = gender_survival['幸存率'].apply(lambda x: f"{x*100:.1f}%")
display(gender_survival)
输出结果:
Sex | 幸存率 | 总人数 |
---|---|---|
0 | 18.9% | 577 |
1 | 74.2% | 314 |
4.3 船舱等级影响
plt.figure(figsize=(10,6))
sns.barplot(x='Pclass', y='Survived', data=df, palette='viridis', ci=None)
plt.title('不同船舱等级幸存率对比', fontsize=14)
plt.xlabel('船舱等级', fontsize=12)
plt.ylabel('幸存率', fontsize=12)
plt.ylim(0,1)
plt.show()
4.4 年龄分布分析
plt.figure(figsize=(12,6))
sns.histplot(data=df, x='Age', hue='Survived', bins=30,
kde=True, palette='Set1', element='step')
plt.title('年龄分布与幸存情况', fontsize=14)
plt.xlabel('年龄', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.legend(title='幸存', labels=['否', '是'])
plt.show()
五、深入特征分析
5.1 票价与幸存关系
plt.figure(figsize=(12,6))
sns.boxplot(x='Survived', y='Fare', data=df, palette='Set3')
plt.yscale('log') # 对数变换处理离群值
plt.title('票价分布与幸存关系', fontsize=14)
plt.xlabel('是否幸存', fontsize=12)
plt.ylabel('票价(对数尺度)', fontsize=12)
plt.show()
5.2 家庭人数影响
family_impact = df.groupby('FamilySize')['Survived'].mean().reset_index()
plt.figure(figsize=(10,6))
sns.lineplot(x='FamilySize', y='Survived', data=family_impact,
marker='o', color='darkred')
plt.title('家庭人数对幸存率的影响', fontsize=14)
plt.xlabel('家庭人数', fontsize=12)
plt.ylabel('幸存率', fontsize=12)
plt.grid(linestyle='--', alpha=0.7)
plt.show()
六、关键洞见总结
性别差异:女性幸存率(74.2%)显著高于男性(18.9%)
阶级影响:头等舱幸存率(63%)远高于三等舱(24.7%)
年龄因素:儿童(尤其5岁以下)幸存率高于其他年龄段
票价关联:幸存者的平均票价是未幸存者的4倍
家庭规模:2-4人家庭的幸存率最高,独行者幸存率最低
七、进阶分析方向
特征相关性分析:
plt.figure(figsize=(12,8))
corr = df.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt=".2f")
plt.title('特征相关性热力图', fontsize=14)
plt.show()
机器学习预测准备:
# 选择特征与目标变量
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'FamilySize', 'IsAlone']
X = df[features]
y = df['Survived']
# 数据集拆分
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
结语
通过本分析我们不仅掌握了Pandas的核心操作技巧,更揭示了影响生存的关键因素。建议下一步:
尝试构建预测模型(如随机森林)
深入分析文本字段(如姓名中的称谓)
探索更多特征组合方式
使用交叉验证评估模型性能