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

如何识别学生选课中最频繁出现的课程组合?

统计学生最常共选的课程组合

问题描述

我有一张学生选课表,每行记录一名学生的一门选课信息,表结构及示例数据如下:

StudentCourse
001PSYC101
001CHEM102
002PSYC101
002SPAN101
002BIO101
003BIO101
003ENG201
003HIND101
003CHEM102
004PSYC101
004CHEM102
004HIND101

我想统计学生最常一起选修的课程组合,先从2门课程的组合入手,后续也可能扩展到3门课程的组合。我不清楚这种分析方法的名称。

我看到过用dplyr包的类似实现,但那不是我完全需要的方案。我需要为选修2门及以上课程的学生生成所有可能的2门课程组合(比如学生003的组合如下),之后统计所有学生中出现频率最高的组合:

  • BIO101 & ENG201
  • BIO101 & HIND101
  • BIO101 & CHEM102
  • ENG201 & HIND101
  • ENG201 & CHEM102
  • HIND101 & CHEM102

解决方案(R语言实现)

2门课程组合统计

使用tidyverse工具链可以轻松实现需求,代码如下:

library(tidyverse)

# 构建示例数据框(实际使用时替换为你的数据源)
course_data <- tibble(
  Student = c("001", "001", "002", "002", "002", "003", "003", "003", "003", "004", "004", "004"),
  Course = c("PSYC101", "CHEM102", "PSYC101", "SPAN101", "BIO101", "BIO101", "ENG201", "HIND101", "CHEM102", "PSYC101", "CHEM102", "HIND101")
)

# 生成2门课程组合并统计频率
course_pairs <- course_data %>%
  group_by(Student) %>%
  filter(n() >= 2) %>% # 仅保留选课数≥2的学生
  summarise(
    course_pair = combn(Course, 2, FUN = function(x) paste(sort(x), collapse = " & ")),
    .groups = "drop"
  ) %>%
  count(course_pair, sort = TRUE) # 统计组合出现次数并降序排列

# 查看结果
print(course_pairs)

代码说明:

  • 按学生分组后,过滤掉只选1门课的学生;
  • 用combn函数生成每个学生课程列表中所有2门的组合,同时对课程名称排序(避免出现"CHEM102 & PSYC101"和"PSYC101 & CHEM102"被算作不同组合的问题);
  • 最后统计每个组合的出现次数,按次数从高到低排序。

扩展到3门课程组合

如果要统计3门课程的组合,只需修改combn函数的第二个参数为3即可:

course_triples <- course_data %>%
  group_by(Student) %>%
  filter(n() >= 3) %>% # 仅保留选课数≥3的学生
  summarise(
    course_triple = combn(Course, 3, FUN = function(x) paste(sort(x), collapse = " & ")),
    .groups = "drop"
  ) %>%
  count(course_triple, sort = TRUE)

print(course_triples)

分析方法名称

这种分析属于频繁项集挖掘,是关联规则挖掘的基础部分。如果数据规模很大,可以使用专门的算法(如Apriori)来高效挖掘,R语言中arules包提供了相关实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:07:50