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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:07:32