密度图与条形图展示结果存差异易致误读的原因咨询
现象描述
绘制名义定性变量(首逾状态first_payment_overdue,取值Y/N)与离散定量变量(信用分score)的关联关系时,两类图表展示结果存在明显偏差:
- 条形图展示的Y、N两类样本数量分布与实际数据完全一致
- 密度图展示的Y、N两类占比存在明显误导性:250-500分数区间内的N类样本占比,视觉上远高于条形图中的实际占比
两类图表的效果对比如下:

偏差产生原因
该展示偏差本质是密度图默认统计逻辑与条形图的统计逻辑存在根本差异,和数据计算错误无关:
- 分组归一化规则差异:当前绘图代码按首逾状态字段做了分组映射,
geom_density()默认会对Y、N两个分组独立计算核密度,且强制每个分组自身的密度曲线下总面积等于1,统计过程完全不参考两个分组的实际样本量差距。如果数据集内N类总样本量远高于Y类,这种组内单独归一化的逻辑,根本无法反映两类样本在全局范围内的实际占比;而条形图默认统计各分数区间的实际样本计数,按全局总样本量计算占比,因此展示结果和真实数据分布完全匹配。 - 核平滑的扩散效应:本次分析的信用分是离散取值的定量变量,
geom_density()默认采用连续核函数做带宽平滑,会将相邻分数区间的样本概率做加权扩散。250-500区间原本N类样本的实际占比不高,但平滑算法会把邻近区间的N类样本概率分摊到该区间,进一步拉高了这个区间的视觉占比,放大了两类图表的展示差异。
问题复现代码
ggplot(pib_date, aes(x = score, fill = first_payment_overdue, color = first_payment_overdue)) + scale_color_manual(values = c("Y" = "#060606", "N" = "#f5693f")) + scale_fill_manual(values = c("Y" = "#060606", "N" = "#f5693f")) + geom_density(alpha = 0.4) + labs(title = "Distribuição de score por fpo") + scale_x_continuous("Score", breaks = seq(0, 960, by = 100)) + theme_minimal()
内容的提问来源于stack exchange,提问作者Rafael Nakamura
相关产品推荐
相关产品推荐

