Python Pandas – 使用 Seaborn 按分类变量对小团体进行分组
在数据分析中,我们常需要对数据进行分类变量的分组,以便更加深入的探究数据背后的规律,Pandas 是数据分析中常用的工具库之一,而 Seaborn 是 Pandas 可视化的理想伙伴,提供了在 Pandas 的 DataFrame 中通过分类变量进行分组的方法,使得我们可以轻松地绘制出数据的分布情况。
本篇文章将带着大家了解如何使用 Pandas 和 Seaborn 来进行分组分析,包括以下内容:
- 如何创建一个 DataFrame
- 如何使用 Seaborn 绘制基本图形
- 如何使用 groupby 执行分组操作
- 如何使用 Seaborn 绘制分组统计图
更多Pandas相关文章,请阅读:Pandas 教程
创建一个 DataFrame
在开始之前,我们需要创建一个 DataFrame,并将它保存成 CSV 文件。以下是一个 Python 命令,生成了一个 DataFrame,包含两列,分别为客户姓名 name
和客户花费 spent
:
import pandas as pd
import numpy as np
# 创建 10 条数据,每个村庄最多有 3 个客户记录
villages = ['Village A', 'Village B', 'Village C', 'Village D']
clients_per_village = 3
n_clients = clients_per_village*len(villages)
names = ['Customer {}'.format(i) for i in range(1,n_clients+1)]
spents = np.random.randint(low=10, high=100, size=n_clients)
# 使用 Pandas 创建 DataFrame
data = {'name': names, 'spent': spents, 'village':np.repeat(villages, clients_per_village)}
df = pd.DataFrame(data)
print(df)
# 将 DataFrame 保存成 CSV 文件
df.to_csv('clients.csv', index=False)
上述代码将会输出如下 DataFrame:
name spent village
0 Customer 1 57 Village A
1 Customer 2 42 Village A
2 Customer 3 20 Village A
3 Customer 4 27 Village B
4 Customer 5 89 Village B
5 Customer 6 92 Village B
6 Customer 7 14 Village C
7 Customer 8 58 Village C
8 Customer 9 66 Village C
9 Customer 10 52 Village D
10 Customer 11 70 Village D
11 Customer 12 99 Village D
这个 DataFrame 有三列,其中 name
表示客户姓名,spent
表示客户花费,village
表示客户所在村庄。我们将数据保存成 CSV 文件,并使用这个文件作为我们分组分析的数据源。
使用 Seaborn 绘制基本图形
在开始分组之前,我们需要先了解如何使用 Seaborn 绘制基本图形。在这里,我们将用 Seaborn 绘制一个柱状图(Bar Plot)和一个箱线图(Box Plot)。
首先,我们要安装 Seaborn。在命令行中输入下面的命令:
pip install seaborn
绘制一个简单的柱状图:
import seaborn as sns
# 加载 CSV 文件
df = pd.read_csv('clients.csv')
# 绘制小组花费的平均值条形图
sns.barplot(data=df, x="village", y="spent")
上述代码将会输出一个柱状图,其中横轴为村庄,纵轴为平均花费。
接着我们来绘制一个箱线图:
# 绘制箱线图
sns.boxplot(data=df, x="village", y="spent")
上述代码中,我们可以看到箱线图展示了四个村庄的客户花费的分布情况,并且明显出 Village D 的客户花费最高,Village C 的客户花费最低。
使用 groupby 执行分组操作
使用 Pandas 中的 groupby 方法,我们可以方便地对数据进行分组。
首先,我们将数据按照村庄进行分组,计算每个小组的均值和标准差:
# 对数据按村庄分组,并计算每个小组的均值和标准差
grouped = df.groupby(['village']).agg({'spent': ['mean', 'std']})
print(grouped)
上述代码输出了每个村庄客户花费的平均数和标准差:
spent
mean std
village
Village A 39.666667 19.613841
Village B 69.333333 31.345749
Village C 46.000000 25.495097
Village D 77.000000 19.148542
接着,我们可以使用 reset_index 方法,将每一列的数据还原为单独的列,并将列名重新命名:
# 将每一列的数据还原为单独的列,并将列名更改为更加清晰的名称
grouped = grouped.reset_index()
grouped.columns = ['village', 'mean_spent', 'std_spent']
print(grouped)
最后,我们将分组后的数据保存为 CSV 文件,并将其作为我们绘制分组统计图的数据源。
# 保存为 CSV 文件
grouped.to_csv('groups.csv', index=False)
使用 Seaborn 绘制分组统计图
现在,我们已经完成了分组,并且将它保存为了 CSV 文件。我们可以使用 Seaborn 来可视化这些数据,以更好地理解小团体间的差异。
首先,我们使用 Pandas 加载 CSV 文件,然后绘制平均花费条形图:
# 加载 CSV 文件
grouped = pd.read_csv('groups.csv')
# 绘制小组的平均花费条形图
sns.barplot(data=grouped, x="village", y="mean_spent")
接着,我们绘制每个 villa 的平均和标准差的误差条形图:
# 绘制每个村庄的平均和标准差误差条形图
sns.barplot(data=grouped, x="village", y="mean_spent", yerr="std_spent")
上述代码将绘制出每个村庄客户花费的平均数和标准差误差条形图。
最后,我们可以使用 Seaborn 绘制箱线图:
# 绘制箱线图,显示每个村庄客户花费的分布情况,遵循由 Village A 到 Village D 的顺序。
sns.boxplot(data=df, x="village", y="spent", order=villages)
上述代码将显示每个村庄客户花费的分布情况,根据 Village A 到 Village D 进行排序。
结论
在本文中,我们学习了如何通过使用 Pandas 和 Seaborn 对数据进行小团体的分组分析。通过对客户姓名和花费的简单数据集进行分组,我们已经了解到如何绘制基础的可视化图形(例如柱状图和箱线图),并如何使用 groupby 对数据进行分组。
最后,我们使用 Seaborn 绘制了分组统计图,展示了每个 villa 客户花费的平均值和误差范围,以及每个 villa 客户花费的分布情况。这些可视化图形帮助我们更加深入地了解小团体间的差异,为后续的数据分析提供了指导和参考。
希望本文能帮助您更好地掌握 Pandas 和 Seaborn,以便在数据分析中能够更好地进行分类变量的分组分析。