使用Python进行数据分析与可视化:从零开始
在当今数据驱动的世界中,数据分析和可视化是理解复杂信息、发现隐藏模式以及做出决策的关键技能。Python 作为一种功能强大且易于学习的编程语言,拥有丰富的库来支持数据处理、分析和可视化。本文将介绍如何使用 Python 进行基础的数据分析与可视化操作,并提供完整的代码示例。
环境准备
在开始之前,请确保你的环境中安装了以下 Python 包:
pandas
:用于数据处理和分析。matplotlib
和 seaborn
:用于数据可视化。numpy
:用于数值计算。你可以使用 pip 安装这些包:
pip install pandas matplotlib seaborn numpy
导入必要的库
首先,我们导入本项目所需的所有库:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns
加载数据集
我们将使用一个公开数据集来进行演示。这里选择的是 Kaggle 上的“泰坦尼克号”生存预测数据集,它包含了乘客的基本信息和是否生还的信息。
假设你已经下载了 train.csv
文件并保存到当前目录下,我们可以使用 pandas
来读取数据:
# 加载数据df = pd.read_csv('train.csv')# 显示前5行数据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
数据预处理
在进行分析之前,我们需要对数据进行清洗和预处理。
4.1 缺失值处理
检查各列是否有缺失值:
print(df.isnull().sum())
输出示例:
PassengerId 0Survived 0Pclass 0Name 0Sex 0Age 177SibSp 0Parch 0Ticket 0Fare 0Cabin 687Embarked 2
可以看到,Age
和 Embarked
列存在缺失值。我们可以用平均值填充年龄,用众数填充登船港口:
# 填充年龄缺失值df['Age'].fillna(df['Age'].mean(), inplace=True)# 填充登船港口缺失值df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)
4.2 特征工程
我们可以创建新的特征,例如家庭成员总数(SibSp + Parch):
df['FamilySize'] = df['SibSp'] + df['Parch']
探索性数据分析(EDA)
5.1 生存率与性别之间的关系
sns.barplot(x='Sex', y='Survived', data=df)plt.title('Survival Rate by Gender')plt.show()
从图中可以看出,女性的生存率明显高于男性。
5.2 生存率与年龄的关系
我们可以将年龄离散化为多个区间:
df['AgeGroup'] = pd.cut(df['Age'], bins=[0, 18, 30, 50, 100], labels=['Child', 'Young Adult', 'Adult', 'Senior'])sns.barplot(x='AgeGroup', y='Survived', data=df)plt.title('Survival Rate by Age Group')plt.show()
5.3 票价分布
plt.figure(figsize=(10, 6))sns.histplot(df['Fare'], bins=50, kde=True)plt.title('Fare Distribution')plt.xlabel('Fare')plt.ylabel('Count')plt.show()
数据建模初步(可选)
虽然本文重点在于分析与可视化,但为了展示 Python 的多功能性,我们也可以快速建立一个简单的分类模型来预测生存率。
6.1 数据编码与分割
from sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import LabelEncoder# 编码类别变量le = LabelEncoder()df['Sex'] = le.fit_transform(df['Sex'])df['Embarked'] = le.fit_transform(df['Embarked'])# 选取特征与目标变量X = df[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked', 'FamilySize']]y = df['Survived']# 分割训练集与测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
6.2 训练模型
使用逻辑回归进行简单建模:
from sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_scoremodel = LogisticRegression(max_iter=1000)model.fit(X_train, y_train)y_pred = model.predict(X_test)print("Accuracy:", accuracy_score(y_test, y_pred))
输出示例:
Accuracy: 0.7820224719101124
尽管准确率不算很高,但对于一个简单的模型来说已经是一个不错的起点。
总结
通过本文的学习,我们掌握了如何使用 Python 对数据进行加载、预处理、探索性分析和可视化,并构建了一个简单的预测模型。Python 在数据分析领域的生态系统非常丰富,掌握这些技能可以帮助你更好地理解和利用数据。
如果你希望进一步深入机器学习、深度学习或大数据处理等领域,可以继续学习如 Scikit-learn、TensorFlow、PyTorch、Dask、Spark 等工具。
附录:完整代码汇总
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import LabelEncoderfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score# 加载数据df = pd.read_csv('train.csv')# 缺失值处理df['Age'].fillna(df['Age'].mean(), inplace=True)df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)# 特征工程df['FamilySize'] = df['SibSp'] + df['Parch']df['AgeGroup'] = pd.cut(df['Age'], bins=[0, 18, 30, 50, 100], labels=['Child', 'Young Adult', 'Adult', 'Senior'])# 性别与生存率关系sns.barplot(x='Sex', y='Survived', data=df)plt.title('Survival Rate by Gender')plt.show()# 年龄组与生存率关系sns.barplot(x='AgeGroup', y='Survived', data=df)plt.title('Survival Rate by Age Group')plt.show()# 票价分布plt.figure(figsize=(10, 6))sns.histplot(df['Fare'], bins=50, kde=True)plt.title('Fare Distribution')plt.xlabel('Fare')plt.ylabel('Count')plt.show()# 数据编码le = LabelEncoder()df['Sex'] = le.fit_transform(df['Sex'])df['Embarked'] = le.fit_transform(df['Embarked'])# 构造特征与标签X = df[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked', 'FamilySize']]y = df['Survived']# 数据划分X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 模型训练model = LogisticRegression(max_iter=1000)model.fit(X_train, y_train)y_pred = model.predict(X_test)# 模型评估print("Accuracy:", accuracy_score(y_test, y_pred))
如有需要,欢迎关注我的博客或 GitHub 获取更多实战项目与教程。