如何识别学生选课中最频繁出现的课程组合?
统计学生最常共选的课程组合
问题描述
我有一张学生选课表,每行记录一名学生的一门选课信息,表结构及示例数据如下:
| Student | Course |
|---|---|
| 001 | PSYC101 |
| 001 | CHEM102 |
| 002 | PSYC101 |
| 002 | SPAN101 |
| 002 | BIO101 |
| 003 | BIO101 |
| 003 | ENG201 |
| 003 | HIND101 |
| 003 | CHEM102 |
| 004 | PSYC101 |
| 004 | CHEM102 |
| 004 | HIND101 |
我想统计学生最常一起选修的课程组合,先从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
相关产品推荐
相关产品推荐

