You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:15:42