使用Python进行数据分析:从数据加载到可视化
在当今大数据时代,数据分析已经成为各行各业不可或缺的技能。Python凭借其简洁、易读的语法和强大的第三方库(如NumPy、Pandas、Matplotlib、Seaborn等),成为了数据分析领域的首选语言之一。
本文将通过一个完整的案例,展示如何使用Python进行数据分析,包括数据加载、清洗、处理以及可视化。我们将使用Kaggle上经典的“泰坦尼克号”数据集作为分析对象,来演示整个流程。
环境准备与数据加载
首先,我们需要安装必要的Python库。如果你还没有安装这些库,可以使用以下命令进行安装:
pip install pandas numpy matplotlib seaborn scikit-learn
接下来,我们开始导入所需的库并加载数据:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 加载训练集和测试集train_df = pd.read_csv('train.csv')test_df = pd.read_csv('test.csv')# 显示前几行数据print(train_df.head())
输出示例:
PassengerId Survived Pclass ... Fare Cabin Embarked0 1 0 3 ... 7.2500 NaN S1 2 1 1 ... 71.2833 C85 C2 3 1 3 ... 7.9250 NaN S3 4 1 1 ... 53.1000 C123 S4 5 0 3 ... 8.0500 NaN S[5 rows × 12 columns]
我们可以看到,训练集中包含乘客ID、是否生还、舱位等级、姓名、性别、年龄、兄弟姐妹数量、父母/子女数量、船票编号、票价、客舱号和登船港口等字段。
数据探索与初步分析
在进行建模之前,我们需要了解数据的基本情况,包括缺失值、分布、相关性等。
2.1 查看缺失值
print(train_df.isnull().sum())
输出示例:
PassengerId 0Survived 0Pclass 0Name 0Sex 0Age 177SibSp 0Parch 0Ticket 0Fare 0Cabin 687Embarked 2dtype: int64
可以看到,Age
和 Embarked
字段存在缺失值,而 Cabin
缺失非常严重。
2.2 基本统计信息
print(train_df.describe())
输出略...
2.3 生存率与各特征的关系
我们可以绘制一些图表来观察不同特征对生存率的影响。
性别与生存率
sns.barplot(x='Sex', y='Survived', data=train_df)plt.title('Survival Rate by Gender')plt.show()
舱位等级与生存率
sns.barplot(x='Pclass', y='Survived', data=train_df)plt.title('Survival Rate by Class')plt.show()
年龄与生存率
g = sns.FacetGrid(train_df, col='Survived')g.map(plt.hist, 'Age', bins=20)plt.show()
数据预处理
为了后续建模,我们需要对数据进行预处理,包括填补缺失值、编码分类变量、构造新特征等。
3.1 填补缺失值
# 填补年龄缺失值为中位数train_df['Age'].fillna(train_df['Age'].median(), inplace=True)# 填补登船港口缺失值为众数train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace=True)# 删除Cabin列,因为缺失太多train_df.drop('Cabin', axis=1, inplace=True)
3.2 编码分类变量
# 将性别映射为0和1train_df['Sex'] = train_df['Sex'].map({'male': 0, 'female': 1})# 对Embarked进行独热编码train_df = pd.get_dummies(train_df, columns=['Embarked'])
3.3 构造新特征
我们可以根据名字提取头衔(Title)作为一个新特征:
train_df['Title'] = train_df['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)train_df['Title'] = train_df['Title'].replace(['Lady', 'Countess','Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')train_df['Title'] = train_df['Title'].replace('Mlle', 'Miss')train_df['Title'] = train_df['Title'].replace('Ms', 'Miss')train_df['Title'] = train_df['Title'].replace('Mme', 'Mrs')title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}train_df['Title'] = train_df['Title'].map(title_mapping).astype(int)
建模与预测
我们可以使用Scikit-learn中的模型来进行预测。这里我们以随机森林为例:
from sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score# 准备特征和标签features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Title']X = train_df[features]y = train_df['Survived']# 划分训练集和验证集X_train, X_val, y_train, y_val = 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_val)accuracy = accuracy_score(y_val, y_pred)print(f'模型准确率为:{accuracy:.2f}')
输出示例:
模型准确率为:0.83
与展望
通过本文的演示,我们完成了从数据加载、探索、预处理到建模预测的完整流程。使用Python进行数据分析不仅高效而且灵活,尤其适合快速迭代和实验。
未来你可以尝试:
引入更多特征工程方法;使用更复杂的模型如梯度提升树(XGBoost、LightGBM);进行交叉验证优化超参数;提交结果到Kaggle进行排名。完整代码汇总
以下是本文所有步骤的完整代码整合版本:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score# 加载数据train_df = pd.read_csv('train.csv')# 缺失值处理train_df['Age'].fillna(train_df['Age'].median(), inplace=True)train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace=True)train_df.drop('Cabin', axis=1, inplace=True)# 特征编码train_df['Sex'] = train_df['Sex'].map({'male': 0, 'female': 1})train_df = pd.get_dummies(train_df, columns=['Embarked'])# 构造新特征 - Titletrain_df['Title'] = train_df['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)train_df['Title'] = train_df['Title'].replace(['Lady', 'Countess','Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')train_df['Title'] = train_df['Title'].replace('Mlle', 'Miss')train_df['Title'] = train_df['Title'].replace('Ms', 'Miss')train_df['Title'] = train_df['Title'].replace('Mme', 'Mrs')title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}train_df['Title'] = train_df['Title'].map(title_mapping).astype(int)# 可视化sns.barplot(x='Sex', y='Survived', data=train_df)plt.title('Survival Rate by Gender')plt.show()# 准备特征和标签features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Title']X = train_df[features]y = train_df['Survived']# 拆分数据集X_train, X_val, y_train, y_val = 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_val)accuracy = accuracy_score(y_val, y_pred)print(f'模型准确率为:{accuracy:.2f}')
总结:
本文介绍了如何使用Python进行端到端的数据分析流程,涵盖了数据加载、清洗、探索、建模等多个环节,并附有完整的可运行代码。希望读者能够通过这篇文章掌握数据分析的基本方法,并在实际项目中加以应用。