使用Python进行数据分析与可视化:从入门到实战
在当今数据驱动的时代,数据分析和可视化已成为各个行业不可或缺的技能。Python凭借其丰富的库(如Pandas、NumPy、Matplotlib 和 Seaborn)成为了数据分析领域的首选语言之一。本文将通过一个完整的案例,带您从读取数据、清洗数据、分析数据到最终的可视化展示,逐步掌握使用Python进行数据分析的基本流程。
环境准备
首先,确保你已经安装了以下Python库:
pip install pandas numpy matplotlib seaborn
我们将在Jupyter Notebook或任何Python IDE中运行代码。
数据集介绍
我们将使用Kaggle上的“Titanic: Machine Learning from Disaster”数据集。该数据集包含乘客信息及其是否幸存的信息,非常适合用于学习数据清洗、探索性数据分析和建模。
你可以从Kaggle官网下载数据文件 train.csv
。
导入必要的库
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 设置图表风格sns.set(style="whitegrid")
加载数据
# 加载数据df = pd.read_csv('train.csv')# 查看前几行数据print(df.head())
输出结果如下:
PassengerId Survived Pclass \0 1 0 3 1 2 1 1 2 3 1 3 3 4 1 1 4 5 0 3 Name Sex Age SibSp \0 Braund, Mr. Owen Harris male 22.0 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 2 Heikkinen, Miss. Laina female 26.0 0 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 4 Allen, Mr. William Henry male 35.0 0 Parch Ticket Fare Cabin Embarked 0 0 A/5 21171 7.2500 NaN S 1 0 PC 17599 71.2833 C85 C 2 0 STON/O2. 3101282 7.9250 NaN S 3 0 113803 53.1000 C123 S 4 0 373450 8.0500 NaN S
数据清洗
1. 检查缺失值
# 检查每列的缺失值数量print(df.isnull().sum())
输出:
PassengerId 0Survived 0Pclass 0Name 0Sex 0Age 177SibSp 0Parch 0Ticket 0Fare 0Cabin 687Embarked 2
可以看到,Age
和 Cabin
列存在大量缺失值。
2. 处理缺失值
填充年龄(Age)
我们可以用平均值或中位数填充缺失的年龄值:
# 计算年龄中位数并填充median_age = df['Age'].median()df['Age'].fillna(median_age, inplace=True)
删除Cabin列(因为缺失太多)
# 删除Cabin列df.drop('Cabin', axis=1, inplace=True)
填充Embarked缺失值
# 找出最常见的登船港口mode_embarked = df['Embarked'].mode()[0]df['Embarked'].fillna(mode_embarked, inplace=True)
探索性数据分析(EDA)
1. 幸存率与性别关系
# 性别与生存的关系sns.barplot(x='Sex', y='Survived', data=df)plt.title('Survival Rate by Gender')plt.ylabel('Survival Rate')plt.show()
可以看出女性的幸存率显著高于男性。
2. 幸存率与舱位等级(Pclass)
# 舱位等级与生存的关系sns.barplot(x='Pclass', y='Survived', data=df)plt.title('Survival Rate by Pclass')plt.ylabel('Survival Rate')plt.show()
可以发现头等舱乘客的幸存率更高。
3. 年龄分布
# 绘制年龄直方图plt.hist(df['Age'], bins=20, edgecolor='black')plt.title('Age Distribution')plt.xlabel('Age')plt.ylabel('Count')plt.show()
特征工程
我们可以构造新的特征,例如家庭成员总数(SibSp + Parch):
# 家庭成员数量df['FamilySize'] = df['SibSp'] + df['Parch']# 查看新特征print(df[['SibSp', 'Parch', 'FamilySize']].head())
输出:
SibSp Parch FamilySize0 1 0 11 1 0 12 0 0 03 1 0 14 0 0 0
构建预测模型(可选)
虽然本文重点是数据分析与可视化,但为了完整性,我们简要演示如何使用Scikit-learn建立一个简单的分类模型来预测生存情况。
from sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_score# 特征选择features = ['Pclass', 'Sex', 'Age', 'Fare', 'Embarked', 'FamilySize']X = pd.get_dummies(df[features])y = df['Survived']# 划分训练集和测试集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"Model Accuracy: {accuracy:.2f}")
输出示例:
Model Accuracy: 0.81
总结
通过本篇文章的学习,我们掌握了以下技能:
如何使用Pandas加载和清洗数据;使用Seaborn和Matplotlib进行基本的数据可视化;构造新的特征以增强模型表现;简单了解如何使用Scikit-learn进行分类建模。数据分析不仅仅是写代码,更重要的是理解数据背后的故事。希望这篇文章能帮助你迈出数据分析的第一步,并激发你对数据科学的兴趣。
十、参考资料
Kaggle Titanic DatasetPandas DocumentationSeaborn GalleryScikit-learn User Guide如果你喜欢这篇文章,欢迎点赞、收藏或分享给更多人学习!