使用 Python 进行数据分析:分步指南与最佳实践

使用 Python 进行数据分析:分步指南与最佳实践

学习如何使用 Pandas、NumPy 和 Matplotlib 在 Python 中执行数据分析。按照分步教程并了解最佳实践,从数据中获取洞察。

在本分步指南中掌握使用 Python 进行数据分析的技能。学习关键库、最佳实践,以及如何从真实的数据集中提取见解。

2025 年:Python 数据分析指南

在本 Python 数据分析指南中,你将了解:

为什么使用 Python 来进行数据分析

Python 常用的数据分析库

如何分步骤完成 Python 数据分析

分析数据时应遵循的流程

让我们开始吧!

为什么使用 Python 进行数据分析

通常,数据分析主要使用两种编程语言:

R:更适合研究人员和统计学家。

Python:最适合其他所有专业人士

具体来说,以下是使用 Python 进行数据分析的主要原因:

学习曲线平缓:Python 语法简单且可读性强,对初学者和专家都很友好。

多功能性:Python 能处理多种类型和格式的数据,包括 CSV、Excel、JSON、SQL 数据库、Parquet 等。它可从简单的数据清洗任务扩展到复杂的机器学习与深度学习应用。

可扩展性:Python 具有可扩展性,可以处理小型数据集,也能执行大规模数据处理。例如,Dask 和 PySpark 等库可轻松应对大数据。

社区支持:Python 拥有庞大且活跃的开发者与数据科学家社区,他们共同推动其生态的发展。

机器学习和人工智能集成:Python 是机器学习和人工智能领域的首选语言,TensorFlow、PyTorch 和 Keras 等库支持高级分析和预测建模。

可复现性与协作:Jupyter Notebooks 能够分享并复现数据分析代码片段,对数据科学协作十分重要。

用于不同目的的统一环境:Python 提供在同一环境中完成不同任务的可能性。例如,你可以使用同一个Jupyter Notebook 来抓取网页数据再进行分析。在同一环境中,你也可以使用机器学习模型进行预测。

Python 数据分析的常用库

Python 在数据分析领域广受欢迎,也得益于其庞大的库生态系统。以下是 Python 数据分析中最常见的库:

NumPy:用于数值计算和多维数组处理。

Pandas:用于数据操作和分析,特别是表格数据。

Matplotlib 和 Seaborn:用于数据可视化和创建有洞察力的图表。

SciPy:用于科学计算和高级统计分析。

Plotly:用于创建动画图表。

在接下来的指南部分,你将学到它们的具体用法!

Python 数据分析:完整示例

你已经了解了使用 Python 进行数据分析的原因以及支持该任务的常用库。接下来,按照这个分步教程学习如何用 Python 进行数据分析。

在本节中,你将分析来自 Bright Data 免费数据集的 Airbnb 房源信息。

环境要求

要跟随本指南,你需要在本地机器上安装 Python 3.6 或更新版本。

步骤 1:设置环境并安装依赖

假设你将项目的主文件夹命名为 data_analysis/。在完成此步骤后,文件夹将拥有以下结构:

data_analysis/

├── analysis.ipynb

└── venv/

其中:

analysis.ipynb 是包含所有 Python 数据分析代码的 Jupyter Notebook。

venv/ 是 Python 虚拟环境文件夹。

你可以通过以下命令创建 venv/ 虚拟环境目录:

python -m venv venv

在 Windows 上激活它:

venvScriptsactivate

在 macOS/Linux 上执行:

source venv/bin/activate

在激活的虚拟环境中,安装所有所需的库:

pip install pandas jupyter matplotlib seaborn numpy

要创建 analysis.ipynb 文件,你需要先进入 data_analysis/ 文件夹:

cd data_analysis

然后使用以下命令初始化一个新的 Jupyter Notebook:

jupyter notebook

现在你可以在浏览器中通过 http://locahost:8888 访问 Jupyter Notebook App。

在界面中点击 “New > Python 3 (ipykernel)” 来创建一个新的文件:

默认情况下,新文件名为 untitled.ipynb。你可以在控制台中将其重命名:

很好!至此,你已经为 Python 数据分析设置好了环境。

步骤 2:下载并打开数据

本教程中使用的数据集来自 Bright Data 的数据集市场。要下载该数据集,你可以在平台上免费注册,并进入你的用户仪表盘。然后,依次进入 “Web Datasets > Dataset” 查找数据集市场:

向下滚动并在页面中寻找 “Airbnb Properties Information” 卡片:

点击 “Download sample > Download as CSV” 即可下载数据集:

你可以将下载好的文件重命名,比如叫 airbnb.csv。在 Jupyter Notebook 中打开 CSV 文件,代码如下:

import pandas as pd

# Open CSV

data = pd.read_csv("airbnb.csv")

# Show head

data.head()

具体说明如下:

read_csv() 方法将 CSV 文件读取为 pandas 数据集。

head() 方法显示该数据集的前 5 行。

预期输出如下所示:

如你所见,该数据集包含 45 列。虽然可以向右滚动查看更多列,但由于列数量较多,依旧有部分列被隐藏。

要完整显示所有列,请在单独的 cell 中输入:

# Show all columns

pd.set_option("display.max_columns", None)

# Display the data frame

print(data)

步骤 3:处理 NaN

在计算中,NaN 表示 “Not a Number”。在使用 Python 进行数据分析时,可能遇到数值空缺、字符串类型数据原本应该是数字,或已经标记为 NaN 的情况(比如上图中的 discount 列)。

你的目标是分析数据,因此必须妥善处理 NaN。一般有三种应对方式:

删除所有包含 NaN 的行。

将某列的 NaN 替换为该列中其他数字的均值。

寻找新的数据来丰富源数据集。

在本例中,我们为了简单起见,采用第一种方式。

首先,你需要检查 discount 列的所有值是否都是 NaN。如果是,就可以删除整个列。以下代码可以实现检查:

import numpy as np

is_discount_all_nan = data["discount"].isna().all()

print(f"Is the 'discount' column all NaNs? {is_discount_all_nan}")

在这个示例中,isna().all() 用来查看 discount 列(通过 data["discount"] 筛选得到)是否全部为 NaN。

运行后会得到结果 True,说明 discount 列的值全为 NaN。因此可将其删除:

data = data.drop(columns=["discount"])

这样,原始数据集就被新的数据集覆盖,现在没有 discount 列了。

然后你可以分析整个数据集,检查是否还有其他 NaN 值:

total_nans = data.isna().sum().sum()

print(f"Total number of NaN values in the data frame: {total_nans}")

输出结果如下:

Total number of NaN values in the data frame: 1248

这说明数据框中还有 1248 个 NaN。要删除所有包含至少一个 NaN 的行,可执行:

data = data.dropna()

现在 data 数据框中已经没有 NaN 值了,不用担心它会对分析结果造成偏差。

可使用以下命令确认是否操作成功:

print(data.isna().sum().sum())

预期结果是 0。

步骤 4:数据探索

在可视化 Airbnb 数据之前,你需要先熟悉它。一个很好的做法是先查看数据的统计信息:

# Show statistics of the entire dataset

statistics = data.describe()

# Print statistics

print(statistics)

预期结果如下:

price ratings lat long guests

count 182.000000 182.000000 182.000000 182.000000 182.000000

mean 147.523352 4.804505 6.754955 -68.300942 6.554945

std 156.574795 0.209834 27.795750 24.498326 3.012818

min 16.000000 4.000000 -21.837300 -106.817450 2.000000

25% 50.000000 4.710000 -21.717270 -86.628968 4.000000

50% 89.500000 4.865000 30.382710 -83.479890 6.000000

75% 180.750000 4.950000 30.398860 -43.925480 8.000000

max 1003.000000 5.000000 40.481580 -43.801300 16.000000

property_id host_number_of_reviews host_rating hosts_year

count 1.820000e+02 182.000000 182.000000 182.000000

mean 1.323460e+17 3216.879121 4.776099 7.324176

std 3.307809e+17 4812.876819 0.138849 2.583280

min 3.089381e+06 2.000000 4.290000 1.000000

25% 3.107102e+07 73.000000 4.710000 6.000000

50% 4.375321e+07 3512.000000 4.710000 9.000000

75% 4.538668e+07 3512.000000 4.890000 9.000000

max 1.242049e+18 20189.000000 5.000000 11.000000

host_response_rate total_price

count 182.000000 182.000000

mean 98.538462 859.317363

std 8.012156 1498.684990

min 25.000000 19.000000

25% 100.000000 111.500000

50% 100.000000 350.000000

75% 100.000000 934.750000

max 100.000000 13165.000000

describe() 方法会显示所有数值型列的统计信息,这是理解数据的第一步。例如,host_rating 列包含以下有趣的统计结果:

数据集中有 182 条评价(count 值)。

最高评分是 5,最低评分是 4.29,平均评分是 4.77。

如果想更深入地了解 host_rating 列中是否存在一些特殊的分布,可以画一张散点图。下面是使用 seaborn 画散点图的示例:

import seaborn as sns

import matplotlib.pyplot as plt

# Define figure size

plt.figure(figsize=(15, 10))

# Plot the data

sns.scatterplot(data=data, x="host_rating", y="listing_name")

# Labeling

plt.title("HOST RATINGS SCATTERPLOT", fontsize=20)

plt.xlabel("Host ratings", fontsize=16)

plt.ylabel("Houses", fontsize=16)

# Show plot

plt.show()

上述代码:

通过 figure() 方法定义图像大小(单位英寸)。

使用 scatterplot() 绘制散点图,其中:

data=data 表示使用 data 数据框。

x="host_rating" 将房东评分放在横轴。

y="listing_name" 将房源名字放在纵轴。

预期结果如下图所示:

这张图虽然不错,但我们还可以进一步优化!

步骤 5:数据转换与可视化

上一步的散点图显示房东评分并无特别明显的模式,但多数评分都高于 4.7 分。

假设你计划去度假,想要住评分较高的地方,就会产生一个问题:“入住评分至少为 4.8 的房源要花多少钱?”

要回答这个问题,你首先需要转换数据!

操作思路是:筛选出评分大于 4.8 的数据并创建一个新的数据框,仅包含 listing_name(房源名称)和 total_price(总价格)两个列。

获取这个子集并查看统计信息:

# Filter the DataFrame

high_ratings = data[data["host_rating"] > 4.8][["listing_name", "total_price"]]

# Caltulate and print statistics

high_ratings_statistics = high_ratings.describe()

print(high_ratings_statistics)

上面这段代码中新数据框 high_ratings 的生成逻辑如下:

data["host_rating"] > 4.8:筛选出原数据集中房东评分大于 4.8 的行。

[["listing_name", "total_price"]]:从筛选后的结果中仅保留 listing_name 和 total_price 两列。

预期输出如下:

total_price

count 78.000000

mean 321.061026

std 711.340269

min 19.000000

25% 78.250000

50% 116.000000

75% 206.000000

max 4230.000000

可以看出,这些房源的平均总价是 321 美元,最低 19 美元,最高 4230 美元。这值得进一步分析!

我们可以用之前的代码范例再绘制一次散点图,只需将变量换成所需的列:

# Define figure size

plt.figure(figsize=(12, 8))

# Plot the data

sns.scatterplot(data=high_ratings, x='total_price', y='listing_name')

# Labeling

plt.title('HIGH RATING HOUSES PRICES', fontsize=20)

plt.xlabel('Prices', fontsize=16)

plt.ylabel('Houses', fontsize=16)

# Show grid for better visualization

sns.set_style("ticks", {'axes.grid': True})

# Show plot

plt.show()

生成的图表如下:

这张图揭示了两个有趣的现象:

大部分房源价格主要集中在 500 美元以下。

“Entire Cabin in Sevierville”和 “Entire Cabin in Pigeon” 的价格远高于 1000 美元。

若想更好地可视化价格区间,可以使用箱线图(box plot):

# Define figure size

plt.figure(figsize=(15, 10))

# Plotting the boxplot

sns.boxplot(data=high_ratings, x='total_price', y='listing_name')

# Labeling

plt.title('HIGH RATING HOUSES PRICES - BOXPLOT', fontsize=20)

plt.xlabel('Prices', fontsize=16)

plt.ylabel('Houses', fontsize=16)

# Show plot

plt.show()

这次生成的图表如下:

如果你想知道为什么同一个房源有不同价格,记住我们上一步筛选的是用户评分,这意味着不同用户在不同价位入住后给出了评分。

此外,Sevierville 的整套小木屋(Entire Cabin)价格跨度较大,从不到 1000 美元到超过 4000 美元,这很可能和入住时长有关。该原始数据集中有个名为 travel_details 的列,其中包含入住时长的信息。价格大幅变化说明有旅客租住的时间更久。要搞清更多细节,可以进一步在 Python 中挖掘。

步骤 6:通过相关矩阵进行更深入的探索

Python 数据分析的过程就是不断提出问题并在已有数据中寻找答案。可视化相关矩阵是激发新问题的好办法之一。

相关矩阵是一张表格,显示不同变量之间的相关系数。最常见的相关系数是皮尔逊相关系数(PCC),用于衡量两个变量之间的线性相关性,其取值范围为 -1 到 +1:

+1:如果一个变量的值增大,另一个变量也以线性关系增大。

-1:如果一个变量的值增大,另一个变量则以线性关系减小。

0:无法确定两者之间的线性关系(需进一步的非线性分析)。

在统计学中,线性相关程度往往这样分类:

0.1-0.5:低相关。

0.6-1:高度相关。

0:无相关。

以下代码可显示 data 数据框的相关矩阵:

# Set the images dimensions

plt.figure(figsize=(12, 10))

# Labeling

plt.title('CORRELATION MATRIX', fontsize=20)

plt.xticks(fontsize=16) # x-axis font size

plt.yticks(fontsize=16) # y-axis font size

# Applying mask

mask = np.triu(np.ones_like(data.corr()))

# Correlation matrix

dataplot = sns.heatmap(data.corr(), annot=True, fmt='.2f', mask=mask, annot_kws={"size": 12})

上面的代码功能如下:

np.triu() 用于对矩阵进行上三角处理,以便更美观地显示为三角形而非方形。

sns.heatmap() 用于绘制热力图,其内的 data.corr() 会计算各列之间的皮尔逊相关系数。

下图是你会看到的效果:

在解释相关矩阵时,核心思路是寻找高度相关的变量,这将成为你后续深入探索的起点。例如:

lat 和 long 的相关系数约为 -0.98,表明它们在定位地理位置时高度相关,这合情合理。

host_rating 和 long 的相关系数约为 -0.69,这很有意思,意味着房东评分与经度之间存在较强的负相关关系。看起来某些区域的房东评分普遍更高。

lat 与 price 的相关系数约为 0.63,而 long 与 price 的相关系数约为 -0.69,表示地理位置确实对价格有较大影响。

同时,你也应关注不相关或低相关的变量。比如 is_supperhost 和 price 的相关系数约为 -0.18,说明超级房东并不一定收费更高。

了解完这些主要概念后,轮到你亲自探索并分析你的数据了!

步骤 7:整合所有内容

最终,你的 Jupyter Notebook 可能类似如下所示:

可以看到,Notebook 中分了多个单元格,每个单元格都有相应的输出。

Python 数据分析的流程

前面的小节带你了解了如何使用 Python 分步完成数据分析。虽然看起来像机会驱动的步骤,但其实背后有一套最佳实践:

数据获取:如果你非常幸运,所需数据保存在现成的数据库中,那就很简单。如果没有,你需要通过流行的数据采集方法(例如爬虫)来获取数据。

数据清洗:处理 NaN、聚合数据,并对初始数据集做初步筛选。

数据探索:数据探索(有时也称数据发现)是 Python 数据分析中最关键的部分,需要借助基本图表来帮助你了解数据结构并发掘它可能呈现的模式。

数据操作:在大致了解数据后,需要对其进行进一步操作,包括过滤和(在类似 SQL 的场景下)将多个数据集合并成一个。

数据可视化:这是最后一步,通过对处理后的数据集进行多种图表可视化,向他人展示数据所蕴含的价值。

总结

在这篇 Python 数据分析指南中,你了解了为什么要用 Python 来分析数据,以及可以借助哪些常用库来完成该任务。你还看到如何通过分步教程,以及要遵循的流程来完成 Python 中的数据分析。

你见识到了 Jupyter Notebook 在创建数据子集、可视化以及挖掘洞察方面的强大功能,并且一切都在同一个环境下完成。那去哪里能找到现成的数据集呢?Bright Data 已为你准备好一切!

Bright Data 拥有一个速度快且可靠的代理网络,被众多财富 500 强企业以及超过 20,000 个客户使用,以合法合规的方式从网络中获取数据,并提供在庞大会数据集市场,可供你选择:

商业数据集:来自 LinkedIn、CrunchBase、Owler 和 Indeed 等主要数据源。

电商数据集:来自 Amazon、Walmart、Target、Zara、Zalando、Asos 等。

房产数据集:来自 Zillow、MLS 等网站。

社交媒体数据集:包含 Facebook、Instagram、YouTube、Reddit 等平台的数据。

金融数据集:包括 Yahoo Finance、Market Watch、Investopedia 等在内的数据。

立即创建一个 Bright Data 免费账号,探索我们的数据集吧。

免费试用

用Gmail账号注册

支持支付宝等多种支付方式

相关推荐

365bet官方网站下载 C语言变量的声明、定义、初始化与赋值详解

C语言变量的声明、定义、初始化与赋值详解

📅 08-05 👁️ 203
sport365 Visual Studio2022 如何添加新的开发组件

Visual Studio2022 如何添加新的开发组件

📅 09-19 👁️ 2099
365在线体育app下载 将“试听

将“试听"翻译成英文

📅 08-16 👁️ 7448
365在线体育app下载 陈意涵为什么叫陈大发 揭陈意涵外号由来

陈意涵为什么叫陈大发 揭陈意涵外号由来

📅 07-19 👁️ 3141