简单可视化
数据集介绍见 数分基础(01)示例数据集Global_Superstore
可直接下载
本文接上一篇 数分基础(03-1)客户特征分析
运行本篇代码之前,先运行上一篇的代码。
为了能够对比和总览三个客户群体Cluster 0 - Cluster 1 的特征,上一篇末尾使用了并排柱状图,并排单图中对比多个群体在多个特征上的差异。
1. 关于可视化
可视化并非主观设计,也不是追求形式,其本质是以最合适的方式呈现信息、辅助判断。
例如,分析销售额,先考虑的是条形图(柱状图),如果种类非常多,再考虑分布 —— 这基本是固定的思考范式,也能顺应受众的“潜意识”。
所以,可视化的逻辑框架是客观的,我们一般做的工作是在这个框架上补充和完善,不可过度追求“形式”。
2. 并排柱状图
三个群体在每个特征上的数据并排展示,便于直接对比,快速发现群体之间的特征差异。
import matplotlib.pyplot as plt
import numpy as np
# 设置 Pandas 显示浮点数格式,禁用科学计数法
pd.set_option('display.float_format', '{:.2f}'.format)
# 定义特征和群体标签
features = ['Avg Total Sales', 'Avg Total Quantity', 'Avg Total Profit', 'Avg Discount']
cluster_labels = ['Cluster 0', 'Cluster 1', 'Cluster 2']
# 将数据转为数组格式,便于绘制
values = cluster_summary[features].values.T
# 创建图表
fig, axes = plt.subplots(1, 4, figsize=(18, 5)) # 设置为一行四列的图表布局
# 为每个特征绘制并列的柱状图
colors = ['skyblue', 'lightgreen', 'salmon'] # 颜色配置
for i, ax in enumerate(axes):
ax.bar(cluster_labels, values[i], color=colors, width=0.5)
ax.set_title(features[i])
ax.set_xlabel('Clusters')
ax.set_ylabel('Values')
# 调整布局
plt.tight_layout()
plt.show()
# 还原 Pandas 默认显示设置(可选)
pd.reset_option('display.float_format')
3. 堆叠柱状图
3.1 画图
在一张图上直观展示各个群体的多项特征,方便对比,例如各群体在各特征上的总体情况和比例差异。
import matplotlib.pyplot as plt
import numpy as np
# 定义特征和群体标签
features = ['Avg Total Sales', 'Avg Total Quantity', 'Avg Total Profit', 'Avg Discount']
cluster_labels = ['Cluster 0', 'Cluster 1', 'Cluster 2']
# 将数据转为数组格式,便于绘制
values = cluster_summary[features].values.T
# 设置柱状图的宽度和位置
bar_width = 0.25
index = np.arange(len(features))
# 创建图表
fig, ax = plt.subplots(figsize=(14, 8))
# 为每个群体绘制柱状图
colors = ['skyblue', 'lightgreen', 'salmon'] # 颜色配置
for i, cluster in enumerate(cluster_labels):
ax.bar(index + i * bar_width, values[:, i], bar_width, label=cluster, color=colors[i])
# 设置标题和标签
ax.set_xlabel('Features', fontsize=14, labelpad=10)
ax.set_ylabel('Values', fontsize=14, labelpad=10)
ax.set_title('Comparison of Clusters', fontsize=16, pad=20)
ax.set_xticks(index + bar_width)
ax.set_xticklabels(features, fontsize=12, rotation=45)
ax.legend(title='Clusters', fontsize=12, title_fontsize='13')
# 调整图表布局和外观
plt.style.use('ggplot') # 使用更加现代的样式
fig.patch.set_facecolor('white') # 设置背景颜色
ax.grid(True, which='both', linestyle='--', linewidth=0.5) # 调整网格线
plt.tight_layout(pad=2) # 调整布局以防止裁剪和重叠
plt.show()
# 还原 Pandas 默认显示设置(可选)
pd.reset_option('display.float_format')
3.2 对数刻度
但是可以发现,由于不同特征的差异,某些特征的值相差较大,例如Avg Total Sales 平均总销售额,与折扣相比,数值非常高,导致较小的特征,例如Avg Discount 在图中几乎不可见,影响了整体的可读性
可以使用对数刻度
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 确保使用 Unicode 负号
plt.rcParams['axes.unicode_minus'] = True
# 定义特征和群体标签
features = ['Avg Total Sales', 'Avg Total Quantity', 'Avg Total Profit', 'Avg Discount']
cluster_labels = ['Cluster 0', 'Cluster 1', 'Cluster 2']
# 将数据转为数组格式,便于绘制
values = cluster_summary[features].values.T
# 设置柱状图的宽度和位置
bar_width = 0.25
index = np.arange(len(features))
# 创建图表
fig, ax = plt.subplots(figsize=(14, 8))
# 应用更加现代的样式
plt.style.use('ggplot')
# 设置背景颜色为白色
fig.patch.set_facecolor('white')
# 为每个群体绘制柱状图
colors = ['skyblue', 'lightgreen', 'salmon'] # 颜色配置
for i, cluster in enumerate(cluster_labels):
ax.bar(index + i * bar_width, values[:, i], bar_width, label=cluster, color=colors[i])
# 使用对数刻度
plt.yscale('log')
# 设置标题和标签
ax.set_xlabel('Features', fontsize=14, labelpad=10)
ax.set_ylabel('Values', fontsize=14, labelpad=10)
ax.set_title('Comparison of Clusters', fontsize=16, pad=20)
ax.set_xticks(index + bar_width)
ax.set_xticklabels(features, fontsize=12, rotation=45)
ax.legend(title='Clusters', fontsize=12, title_fontsize='13')
# 调整网格线
ax.grid(True, which='both', linestyle='--', linewidth=0.5)
# 调整布局以防止裁剪和重叠
plt.tight_layout(pad=2)
plt.show()
# 还原 Pandas 默认显示设置(可选)
pd.reset_option('display.float_format')
对数刻度,通过对数变换来缩放数据值,使得视觉表示更加均衡。对每个数据点应用对数函数,缩小了高值和低值之间的诗句差距。例如,如果一个数据集包含1,10,100,1000,当使用线性刻度时,1000会显得非常突出,但在对数刻度下,数值的间距会缩小,可以使得不同数量级数据在同一图上得到较好地表示。
但要求所有数据必须为正数,所以前面代码会有些小问题,因为cluster 2群体的利润为负值。同时也需要小心解释,因为刻度标记不再是等距的。因此使用对数刻度,是希望在特征值差异很大时候均衡展示。