如何将列关联可视化为类回归图表?分析满意度与评分准确性关系
条件
我有两列1-5的评分数据:Shopping_Satisfaction(购物满意度)和Rating_Accuracy(评分准确性),相关代码如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt path = '/kaggle/input/amazon-consumer-behaviour-dataset/Amazon Customer Behavior Survey.csv' df = pd.read_csv(path) df.groupby(['Shopping_Satisfaction', 'Rating_Accuracy']).count()['age']
分组统计结果:
Shopping_Satisfaction Rating_Accuracy 1 1 37 2 47 3 24 4 6 5 1 2 1 10 2 92 3 79 4 9 5 3 3 1 10 2 34 3 145 4 18 5 2 4 1 1 2 5 3 34 4 21 5 6 5 2 1 3 5 4 2 5 9 Name: age, dtype: int64
两列的相关系数为0.514387(即51%),相关矩阵如下:
Shopping_Satisfaction Rating_Accuracy Shopping_Satisfaction 1.000000 0.514387 Rating_Accuracy 0.514387 1.000000
问题
需要基于上述分析回答:
- 购物满意度越高,评分准确性也越高?
- 或 购物满意度越高,评分准确性未必越高?
我尝试用Regression Plot(回归图)展示,但效果很差,生成的图表如下:
5 o o o o o 4 o o o o o 3 o o o o o 2 o o o o o 1 o o o o o 0 1 2 3 4 5
请问有什么解决办法?
解决方案
一、核心疑问解答
从数据和统计结果来看:
- 整体趋势上,购物满意度越高,评分准确性的平均水平越高:
- 满意度为1时,评分准确性集中在1-3区间(占比88.6%),高分段(4-5)占比极低;
- 满意度提升到5时,评分准确性集中在3-5区间(占比88.9%),低分段几乎消失;
- 结合0.51的正相关系数,足以证明两者存在正向关联。
- 但个体层面存在例外:比如满意度5的用户里有准确性为2的情况,满意度1的用户里也有准确性为5的情况,所以不能说“必然越高”,而是整体呈正相关趋势,存在个体差异。
二、可视化优化方案(替代回归图)
你的数据是有序分类数据(1-5评分),回归图不适合展示这类数据,推荐以下几种更合适的可视化方式:
1. 热力图:展示交叉分组的计数密度
把分组统计结果转换成矩阵,用热力图直观呈现高计数单元格的分布:
# 将分组结果转换为透视表 heatmap_data = df.groupby(['Shopping_Satisfaction', 'Rating_Accuracy']).count()['age'].unstack() # 绘制热力图 plt.figure(figsize=(8,6)) sns.heatmap(heatmap_data, annot=True, fmt='d', cmap='Blues') plt.xlabel('Rating_Accuracy') plt.ylabel('Shopping_Satisfaction') plt.title('Response Counts by Shopping Satisfaction & Rating Accuracy') plt.show()
这种图能清晰看到:满意度1时,准确性1-2的计数最高;满意度5时,准确性5的计数最高,直接体现正相关趋势。
2. 箱线图:展示各满意度分组下的准确性分布
按满意度分组,查看准确性的中位数、四分位数范围:
plt.figure(figsize=(8,6)) sns.boxplot(x='Shopping_Satisfaction', y='Rating_Accuracy', data=df) plt.xlabel('Shopping_Satisfaction') plt.ylabel('Rating_Accuracy') plt.title('Rating Accuracy Distribution by Shopping Satisfaction') plt.show()
箱线图能直观看到:随着满意度提升,准确性的中位数逐步上升,明确呈现整体趋势。
3. 条形图:展示各满意度分组的准确性平均值
计算每个满意度分组的准确性均值,用条形图直观展示趋势:
mean_accuracy = df.groupby('Shopping_Satisfaction')['Rating_Accuracy'].mean().reset_index() plt.figure(figsize=(8,6)) sns.barplot(x='Shopping_Satisfaction', y='Rating_Accuracy', data=mean_accuracy) plt.xlabel('Shopping_Satisfaction') plt.ylabel('Average Rating Accuracy') plt.title('Average Rating Accuracy by Shopping Satisfaction') plt.show()
这种图最直接地呈现:满意度从1到5,准确性的平均值逐步上升,清晰验证正相关趋势。
内容的提问来源于stack exchange,提问作者Yudha Hartono
相关产品推荐
相关产品推荐

