使用Python实现数据处理与可视化:探索泰坦尼克号幸存者数据
数据分析是当今技术领域中一个至关重要的技能。它不仅可以帮助我们从大量数据中提取有价值的信息,还能为决策提供依据。本文将通过分析泰坦尼克号幸存者数据集来展示如何使用Python进行数据处理和可视化。我们将探讨如何加载、清理、分析数据,并最终生成一些有意义的图表来揭示数据中的模式。
数据集介绍
泰坦尼克号沉没事件是历史上最著名的海难之一。1912年4月15日,这艘豪华客轮在首次航行时撞上冰山并沉没,导致超过1500人丧生。为了纪念这一事件并从中学习,Kaggle提供了泰坦尼克号乘客数据集(Titanic: Machine Learning from Disaster),该数据集包含了乘客的基本信息以及他们是否幸存。
数据字段说明
PassengerId
:乘客IDSurvived
:是否幸存(0 = No, 1 = Yes)Pclass
:船票等级(1 = 一等舱, 2 = 二等舱, 3 = 三等舱)Name
:姓名Sex
:性别Age
:年龄SibSp
:兄弟姐妹/配偶数量Parch
:父母/子女数量Ticket
:船票编号Fare
:票价Cabin
:客舱编号Embarked
:登船港口(C = Cherbourg, Q = Queenstown, S = Southampton)环境搭建
在开始分析之前,我们需要确保安装了必要的Python库。可以通过以下命令安装这些库:
pip install pandas numpy matplotlib seaborn scikit-learn
接下来,导入所需的库:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_score
数据加载与初步查看
首先,我们需要加载数据集。假设你已经下载了数据集并将其保存为titanic.csv
文件。
# 加载数据集df = pd.read_csv('titanic.csv')# 查看前几行数据print(df.head())
输出结果如下:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S1 2 1 1 Cumings, Mrs. John Bradley female 38.0 1 0 PC 17599 71.2833 C85 C2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
从上面的结果可以看出,数据集中包含了许多字段。接下来,我们可以查看数据的基本统计信息:
# 查看数据的基本统计信息print(df.describe())
输出结果如下:
PassengerId Survived Pclass Age SibSp Parch Farecount 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.00000025% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.91040050% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.45420075% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
数据清洗
在进行进一步分析之前,我们需要对数据进行清洗。主要包括处理缺失值、异常值和重复值。
处理缺失值
检查每个字段的缺失值情况:
# 检查缺失值print(df.isnull().sum())
输出结果如下:
PassengerId 0Survived 0Pclass 0Name 0Sex 0Age 177SibSp 0Parch 0Ticket 0Fare 0Cabin 687Embarked 2dtype: int64
可以看到,Age
、Cabin
和Embarked
字段存在较多的缺失值。对于Age
字段,我们可以用中位数填充;对于Cabin
字段,由于缺失值太多,可以考虑删除或用特殊标记替换;对于Embarked
字段,可以用众数填充。
# 填充缺失值df['Age'].fillna(df['Age'].median(), inplace=True)df['Cabin'].fillna('Unknown', inplace=True)df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)# 再次检查缺失值print(df.isnull().sum())
处理异常值
检查是否有异常值,特别是票价和年龄字段。可以通过箱线图来直观地查看异常值。
# 绘制箱线图plt.figure(figsize=(10, 6))sns.boxplot(x='Pclass', y='Fare', data=df)plt.title('Fare Distribution by Pclass')plt.show()
根据箱线图,我们可以发现票价中存在一些极端值。可以考虑将这些极端值处理掉,或者直接忽略它们的影响。
删除重复值
检查是否存在重复值:
# 检查重复值print(df.duplicated().sum())
如果没有重复值,则不需要进一步处理。
数据分析
探索性数据分析(EDA)
通过可视化手段探索数据中的模式和关系。以下是几个常见的可视化方法:
幸存者比例
# 幸存者比例survival_counts = df['Survived'].value_counts()plt.figure(figsize=(6, 6))plt.pie(survival_counts, labels=['Not Survived', 'Survived'], autopct='%1.1f%%', startangle=90)plt.title('Survival Rate')plt.show()
性别与幸存的关系
# 性别与幸存的关系sns.countplot(x='Sex', hue='Survived', data=df)plt.title('Survival by Gender')plt.show()
船票等级与幸存的关系
# 船票等级与幸存的关系sns.countplot(x='Pclass', hue='Survived', data=df)plt.title('Survival by Pclass')plt.show()
年龄分布
# 年龄分布plt.figure(figsize=(10, 6))sns.histplot(df['Age'], bins=30, kde=True)plt.title('Age Distribution')plt.show()
特征工程
为了更好地进行预测建模,我们可以创建一些新的特征,例如家庭成员总数、是否有亲属等。
# 创建新特征df['FamilySize'] = df['SibSp'] + df['Parch'] + 1df['IsAlone'] = 1df.loc[df['FamilySize'] > 1, 'IsAlone'] = 0
模型训练与评估
使用随机森林分类器进行预测建模,并评估模型的准确性。
# 准备训练数据X = df[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'FamilySize', 'IsAlone']]y = df['Survived']# 将类别变量转换为数值X = pd.get_dummies(X, drop_first=True)# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练模型model = RandomForestClassifier(n_estimators=100, random_state=42)model.fit(X_train, y_train)# 预测并评估模型y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)print(f'Accuracy: {accuracy:.4f}')
通过对泰坦尼克号幸存者数据集的分析,我们不仅掌握了如何使用Python进行数据处理和可视化,还学会了如何构建和评估机器学习模型。数据分析不仅仅是简单的数据操作,更是一种探索和发现的过程。通过不断地实践和学习,我们可以从数据中挖掘出更多的价值。
希望这篇文章对你有所帮助!如果你有任何问题或建议,请随时留言交流。