趋近智
我们将使用 Seaborn 的函数来查看数据集中的分类特征。实践练习将帮助您掌握如何为分类数据选择并构建合适的图表。
在这些示例中,我们将使用 Seaborn 自带的 'tips' 数据集。该数据集包含餐厅小费的信息,包括星期几、用餐时间、支付者的性别以及是否吸烟等分类变量。
首先,让我们导入所需的库并加载数据集。我们需要 Pandas 来进行可能的数据处理(尽管 Seaborn 通常直接处理 DataFrame),Matplotlib 作为底层的绘图引擎(以及可能的自定义设置),以及 Seaborn 本身。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 加载示例数据集
tips = sns.load_dataset("tips")
# 显示前几行以查看数据
print(tips.head())
您应该会看到类似以下的输出,显示 total_bill、tip、sex、smoker、day、time 和 size 等列。
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
现在,我们来创建一些图表。
countplot 查看类别频率通常,分析分类数据的第一步是查看每个类别中有多少个观测值。countplot 函数非常适合这项任务。
任务: 创建一个图表,显示每周中每天记录的小费数量。
# 创建计数图
plt.figure(figsize=(8, 5)) # 可选:调整图表大小以提高可读性
sns.countplot(data=tips, x='day', palette=['#74c0fc', '#4dabf7', '#339af0', '#228be6']) # 使用蓝色调色板中的颜色
plt.title('每天记录的小费数量')
plt.xlabel('星期几')
plt.ylabel('计数')
plt.show()
解读: 此图表直接显示了 'day' 列中每个类别的频率计数。您可能会看到周六和周日记录的小费数量多于工作日,这反映了餐厅顾客的典型模式。
barplot 比较聚合统计量条形图适用于比较不同类别之间的平均数值。Seaborn 的 barplot 默认自动计算均值并显示置信区间。
任务: 查看每周中每天的平均 total_bill。
# 创建条形图
plt.figure(figsize=(8, 5))
sns.barplot(data=tips, x='day', y='total_bill', palette=['#96f2d7', '#63e6be', '#38d9a9', '#20c997'], errorbar='sd') # 使用青色调色板中的颜色,显示标准差
plt.title('每天的平均总账单')
plt.xlabel('星期几')
plt.ylabel('平均总账单 ($)')
plt.show()
计算了每天的平均总账单金额,误差棒代表均值周围的置信区间(如果指定,则为标准差)。
解读: 此图表显示了每天的平均 total_bill。垂直线(误差棒)表示均值周围的不确定性(通常是 95% 置信区间)。这有助于查看不同日期之间平均账单金额的差异是否具有统计意义。
boxplot 检查不同类别的分布情况要查看数值变量在不同类别中的离散程度和集中趋势,箱线图是非常好的选择。
任务: 比较吸烟者和非吸烟者的小费金额分布。
# 创建箱线图
plt.figure(figsize=(7, 5))
sns.boxplot(data=tips, x='smoker', y='tip', palette=['#ffc9c9', '#74c0fc']) # 使用红色和蓝色调色板中的颜色
plt.title('按吸烟状态划分的小费金额分布')
plt.xlabel('吸烟者')
plt.ylabel('小费金额 ($)')
plt.show()
解读: 每个箱子显示中位数(中间线)、四分位距(IQR,即箱体本身)和潜在异常值(须线外的点)。通过比较“是”和“否”吸烟者的小费箱线图,您可以评估典型小费金额的差异、小费的离散程度以及各组中是否存在异常高或异常低的小费。
swarmplot 显示单个数据点有时,查看每个数据点会很有帮助,尤其是在比较不同类别(观测值数量适中)的分布时。swarmplot 会排列点,使它们不重叠,从而给人一种密度感。
任务: 查看根据用餐时间(午餐或晚餐)划分的单个 tip 金额。
# 创建蜂群图
plt.figure(figsize=(7, 5))
sns.swarmplot(data=tips, x='time', y='tip', palette=['#ffe066', '#fd7e14']) # 使用黄色和橙色调色板中的颜色
plt.title('按用餐时间划分的单个小费金额')
plt.xlabel('时间')
plt.ylabel('小费金额 ($)')
plt.show()
解读: 此图表将每个小费显示为一个单独的点,根据其值和类别(“午餐”或“晚餐”)定位。每个类别内的水平排列有助于查看不同小费值的密度。它通过显示构成汇总统计的原始数据点来补充 boxplot。
pointplot 比较估计值和趋势点图在比较不同类别(例如均值)的点估计及其置信区间时非常有效,尤其是在查看趋势或与第二个分类变量(使用 hue)的交互时。
任务: 显示根据聚会人数(size)划分的平均 tip 金额,并按支付者的性别进行区分。
# 创建点图
plt.figure(figsize=(9, 6))
sns.pointplot(data=tips, x='size', y='tip', hue='sex', palette={'Male': '#1c7ed6', 'Female': '#f06595'}, markers=['o', 's'], linestyles=['-', '--']) # 使用蓝色和粉色调色板中的颜色
plt.title('按聚会人数和支付者性别划分的平均小费金额')
plt.xlabel('聚会人数')
plt.ylabel('平均小费金额 ($)')
plt.legend(title='支付者性别')
plt.show()
解读: 此图表将每个聚会人数的平均小费金额(点)用线连接起来,男性和女性支付者分开显示。垂直线代表置信区间。这种可视化方法使比较平均小费金额如何随聚会人数变化,以及这种趋势在不同性别之间是否存在差异变得容易。例如,您可能会看到与另一性别相比,某一性别的小费是否随聚会人数的增加而更急剧地增加。
这些练习展示了如何使用几个重要的 Seaborn 函数(countplot、barplot、boxplot、swarmplot、pointplot)来有效地查看分类数据。您学会了显示频率、比较平均值、检查分布、显示单个数据点以及分析不同类别间的趋势。通过替换变量、尝试不同的图表类型(如 violinplot 或 stripplot),并查看 Seaborn 中提供的各种自定义选项,您可以从自己的分类数据中获得更好的理解。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造