在R中实现订单SKU两两组合求和,用于仓库关联分析
R语言实现订单SKU两两组合频次统计(仓库关联性分析)
需求回顾
基于订单-SKU原始数据,先转换为订单级的SKU出现二值表,再统计任意两个SKU共同出现在同一订单的频次,用于仓库订单关联性分析。
示例数据构造
Raw_table <- data.frame( Order = c("#1", "#1", "#1", "#1", "#2", "#2", "#2", "#3", "#3"), SKU = c("Banana", "Apple", "Pear", "Cherry", "Banana", "Apple", "Grape", "Banana", "Pear"), QTY = c(1, 2, 1, 2, 4, 1, 1, 2, 1) )
步骤1:转换为出库频次二值表
将原始数据转换为订单为行、SKU为列的二值矩阵(SKU在订单中出现则记1,未出现记0):
library(dplyr) library(tidyr) sku_binary <- Raw_table %>% mutate(present = 1) %>% pivot_wider( id_cols = Order, names_from = SKU, values_from = present, values_fill = 0 )
输出结果与需求中的出库频次表一致(空值对应0)。
步骤2:生成SKU两两组合频次统计
方法1:普通矩阵运算(适合SKU数量较少场景)
通过矩阵交叉乘积直接计算两两SKU共同出现的次数:
# 提取SKU列的数值矩阵 sku_matrix <- as.matrix(sku_binary[, -1]) # 计算交叉乘积:矩阵[i,j]为SKU i与SKU j共同出现的订单数 cooccur_matrix <- t(sku_matrix) %*% sku_matrix # 转换为长格式并过滤重复组合 cooccur_result <- cooccur_matrix %>% as.data.frame() %>% tibble::rownames_to_column("SKU1") %>% pivot_longer(cols = -SKU1, names_to = "SKU2", values_to = "Freq") %>% # 过滤自身组合及重复的反向组合(仅保留SKU1名称小于SKU2的记录) filter(SKU1 < SKU2, Freq > 0) %>% arrange(SKU1, SKU2)
最终输出结果:
# A tibble: 8 × 3 SKU1 SKU2 Freq <chr> <chr> <dbl> 1 Banana Apple 2 2 Banana Cherry 1 3 Banana Grape 1 4 Banana Pear 2 5 Apple Cherry 1 6 Apple Grape 1 7 Apple Pear 1 8 Cherry Pear 1
方法2:稀疏矩阵运算(适合10000+ SKU的大场景)
当SKU数量超过1万时,普通矩阵会占用大量内存,改用稀疏矩阵处理:
library(Matrix) # 将二值表转换为稀疏矩阵 sku_sparse <- sparse.model.matrix(~ 0 + ., data = sku_binary[, -1]) # 稀疏矩阵交叉乘积,内存占用仅为非零元素的大小 cooccur_sparse <- t(sku_sparse) %*% sku_sparse # 转换为长格式结果 cooccur_sparse_result <- cooccur_sparse %>% as("dgTMatrix") %>% as.data.frame() %>% rename(SKU1 = i, SKU2 = j, Freq = x) %>% # 将矩阵索引映射为SKU名称 mutate( SKU1 = colnames(sku_sparse)[SKU1], SKU2 = colnames(sku_sparse)[SKU2] ) %>% filter(SKU1 < SKU2, Freq > 0) %>% arrange(SKU1, SKU2)
关键说明
- 二值化逻辑:无论QTY多少,只要SKU出现在订单中就记1,符合出库频次的统计需求;若需按QTY加权,可将
present = 1替换为present = QTY,交叉乘积结果即为两两SKU的QTY总和。 - 大场景优化:稀疏矩阵仅存储非零元素,能大幅降低内存消耗,处理1万+ SKU时必须使用该方法。
- 去重逻辑:通过
SKU1 < SKU2过滤重复组合,避免同一关联对出现两次(如Banana-Apple与Apple-Banana)。
内容的提问来源于stack exchange,提问作者Stephen JH Kim
相关产品推荐
相关产品推荐

