R dataframe分组对比与频率类描述性统计实现代码求助
R语言DataFrame描述性统计分析方案
背景说明
你当前使用的DataFrame共200005行23列,核心分析字段如下:
ID:用户标识,字符型Date:日期,Date类型Educ:教育记录,数值型,存在NAReturned:返还金额/数量,数值型Burrowed:借款金额/数量,数值型Freq:交易频次,数值型Grp:分组标识,字符型,存在NA、"A"、"B"三类取值
你需要解决以下三个分析问题:
- A组的
Returned值是否高于B组? Freq更高的用户Burrowed值是否更高?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
相关产品推荐
相关产品推荐

