使用Python进行数据分析与可视化:从零开始

昨天 7阅读

在当今数据驱动的世界中,数据分析和可视化是理解复杂信息、发现隐藏模式以及做出决策的关键技能。Python 作为一种功能强大且易于学习的编程语言,拥有丰富的库来支持数据处理、分析和可视化。本文将介绍如何使用 Python 进行基础的数据分析与可视化操作,并提供完整的代码示例。

环境准备

在开始之前,请确保你的环境中安装了以下 Python 包:

pandas:用于数据处理和分析。matplotlibseaborn:用于数据可视化。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

可以看到,AgeEmbarked 列存在缺失值。我们可以用平均值填充年龄,用众数填充登船港口:

# 填充年龄缺失值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()

survival_by_gender.png

从图中可以看出,女性的生存率明显高于男性。

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()

survival_by_age_group.png

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()

fare_distribution.png

数据建模初步(可选)

虽然本文重点在于分析与可视化,但为了展示 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 获取更多实战项目与教程。

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第23732名访客 今日有15篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!