R语言如何最优可视化二分类变量的回归关联结果
二分类变量关联可视化问题
问题描述
我所用数据集的所有变量(包含因变量、自变量)均为分类变量,仅存在1、2两种分类取值,示例数据集结构如下:
lp1=structure(list(a = c(2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L), b = c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L), c = c(1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L ), d = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, NA, 2L, 2L, 2L, 2L, 2L, 2L, 2L), e = c(1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, NA, 2L, 2L, 2L, 2L, 1L, 2L, 1L), f = c(2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L), g = c(NA, 1L, 2L, NA, 2L, 2L, 1L, 2L, 1L, NA, NA, NA, NA, NA, 1L, NA, NA, NA), h = c(2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), i = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), j = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), k = c(2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, NA, 1L, 2L, 1L, 1L, 1L, 1L, 1L), l = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, NA, 2L, NA, 1L, 1L, 1L, 1L, 2L), m = c(1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, NA, 2L, 2L, 2L, 1L), n = c(1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, NA, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L), xxx = c(2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L)), class = "data.frame", row.names = c(NA, -18L))
我尝试绘制两个变量的关联图,其中xxx为因变量,a为自变量,使用的ggplot2绘图代码如下:
library(ggplot2) ggplot(lp1, aes(xxx, a)) + geom_point() + theme_minimal()
由于两个变量仅存在1、2两个取值,生成的散点图所有样本点完全重叠,信息量极低、展示效果差。请问是否存在更优的方案来可视化两个分类变量间的关联关系?是否需要对数据做归一化类的预处理?
解答
不需要做归一化这类预处理。二分类变量关联可视化的核心是展示每个交叉分类下的样本量/占比,普通散点图把所有重叠的点压在同一个坐标位置,自然没有参考价值,几个实用的实现方案如下:
扰动散点图
给点增加微小的随机位置偏移,把重叠的点错开,就能直观看到每个分类组合的样本密度,改一行代码就能实现:# 提前把分类变量转成因子,避免被ggplot识别为连续数值 lp1 <- lp1 |> dplyr::mutate(across(c(a, xxx), as.factor)) ggplot(lp1, aes(x = xxx, y = a)) + geom_jitter(width = 0.2, height = 0.2, alpha = 0.7, size = 2) + theme_minimal()参数
width、height控制扰动幅度,不要设太大避免点偏离原本的分类位置,搭配半透明参数alpha可以更清晰体现点的重叠程度。堆叠比例条形图
直接展示自变量不同取值下,因变量的分布占比,是看分类变量关联最直观的形式:ggplot(lp1, aes(x = as.factor(a), fill = as.factor(xxx))) + geom_bar(position = "fill") + labs(x = "a", y = "占比", fill = "xxx取值") + theme_minimal()马赛克图
用矩形面积对应每个交叉分组的样本量,是分类变量关联分析的经典可视化方式,可以用ggmosaic包适配ggplot语法:# install.packages("ggmosaic") library(ggmosaic) ggplot(lp1) + geom_mosaic(aes(x = product(xxx, a), fill = as.factor(xxx))) + labs(x = "a", y = "xxx", fill = "xxx取值") + theme_minimal()计数热图
先统计每个分类组合的样本数,用颜色映射数量,搭配数值标注,信息展示最直接:library(dplyr) count_data <- lp1 |> filter(!is.na(a), !is.na(xxx)) |> count(a, xxx) ggplot(count_data, aes(x = as.factor(a), y = as.factor(xxx), fill = n)) + geom_tile() + geom_text(aes(label = n), color = "white", size = 5) + labs(x = "a", y = "xxx", fill = "样本数") + theme_minimal()
注意:所有分类变量传入ggplot前最好先转成因子类型,能避免很多坐标轴刻度、统计变换的异常问题,归一化、标准化这类针对连续变量的预处理操作,对二分类变量的可视化完全没有必要。
内容的提问来源于stack exchange,提问作者quest
相关产品推荐
相关产品推荐

