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

R dataframe分组对比与频率类描述性统计实现代码求助

R语言DataFrame描述性统计分析方案

背景说明

你当前使用的DataFrame共200005行23列,核心分析字段如下:

  • ID:用户标识,字符型
  • Date:日期,Date类型
  • Educ:教育记录,数值型,存在NA
  • Returned:返还金额/数量,数值型
  • Burrowed:借款金额/数量,数值型
  • Freq:交易频次,数值型
  • Grp:分组标识,字符型,存在NA、"A"、"B"三类取值

你需要解决以下三个分析问题:

  1. A组的Returned值是否高于B组?
  2. Freq更高的用户Burrowed值是否更高?
  3. Freq≥10的用户是否更可能有Educ记录?

你之前使用交叉表xtabs输出行数过多的原因是:Returned为数值型变量,存在大量唯一取值,交叉表会为每个唯一值单独生成一行统计结果,不符合你要对比整体分组差异的需求。

分问题解决方案

问题1:A/B组Returned值对比

核心思路是分组统计Returned的整体汇总指标(均值、中位数),而非统计每个取值的分布:

# 加载dplyr做分组统计
library(dplyr)

df %>%
  # 过滤无效分组
  filter(!is.na(Grp), Grp %in% c("A", "B")) %>%
  group_by(Grp) %>%
  summarise(
    Returned均值 = mean(Returned, na.rm = TRUE),
    Returned中位数 = median(Returned, na.rm = TRUE),
    Returned标准差 = sd(Returned, na.rm = TRUE),
    组内样本量 = n()
  )

可视化对比分布可使用箱线图:

library(ggplot2)
df %>%
  filter(!is.na(Grp), Grp %in% c("A", "B")) %>%
  ggplot(aes(x = Grp, y = Returned)) +
  geom_boxplot(fill = c("#86B6F6", "#B4D4FF")) +
  labs(title = "A/B组Returned分布对比", x = "分组", y = "Returned值")

问题2:Freq与Burrowed的相关性分析

两个连续变量的趋势对比可直接计算相关系数,搭配散点拟合线验证趋势:

# 计算皮尔逊相关系数,需排除空值;若存在极端值可改用method="spearman"计算秩相关
cor(df$Freq, df$Burrowed, use = "complete.obs", method = "pearson")

可视化验证:

ggplot(df, aes(x = Freq, y = Burrowed)) +
  # 加透明度解决大样本点重叠问题
  geom_jitter(alpha = 0.15, size = 0.8) +
  # 添加线性拟合线看整体趋势
  geom_smooth(method = "lm", color = "#EE4E4E") +
  labs(title = "Freq与Burrowed的趋势关联", x = "Freq值", y = "Burrowed值")

如果需要更直观的分组对比,可对Freq做分箱处理:

df %>%
  mutate(Freq分箱 = cut(Freq, 
                       breaks = quantile(Freq, probs = c(0, 0.33, 0.66, 1), na.rm = TRUE),
                       include.lowest = TRUE,
                       labels = c("低频次", "中频次", "高频次"))) %>%
  group_by(Freq分箱) %>%
  summarise(
    平均Burrowed值 = mean(Burrowed, na.rm = TRUE),
    样本量 = n()
  )

问题3:Freq≥10用户的Educ记录占比对比

核心是构造二分变量统计占比,可搭配卡方检验判断差异是否显著:

df %>%
  mutate(
    有Educ记录 = ifelse(is.na(Educ), 0, 1),
    Freq分组 = ifelse(Freq >= 10, "Freq≥10", "Freq<10")
  ) %>%
  filter(!is.na(Freq分组)) %>%
  group_by(Freq分组) %>%
  summarise(
    Educ记录存在占比 = paste0(round(mean(有Educ记录, na.rm = TRUE)*100, 2), "%"),
    总样本量 = n()
  )

若要判断占比差异的统计显著性,可执行卡方检验:

# 构造交叉表
cross_tab <- xtabs(~有Educ记录 + Freq分组, 
                   data = df %>% mutate(
                     有Educ记录 = ifelse(is.na(Educ), 0, 1),
                     Freq分组 = Freq >= 10
                   ))
# 卡方检验
chisq.test(cross_tab)

内容的提问来源于stack exchange,提问作者Cryena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:06:01