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

如何在R中按SKU分组执行回归分析并获取各组系数与最优值

多SKU场景下需求-价格线性回归与最优利润/收入计算

一、单SKU分析代码回顾

先回顾单SKU的基础实现逻辑,以R语言为例:

# 单SKU示例数据
sku_data <- data.frame(
  hist.demand = c(100, 80, 60, 40),
  hist.prices = c(10, 15, 20, 25),
  unit_cost = 5  # 单位成本
)

# 拟合需求-价格线性回归
lm_model <- lm(hist.demand ~ hist.prices, data = sku_data)
coeffs <- coef(lm_model)
a <- coeffs[1]  # 截距项(需求基线)
b <- coeffs[2]  # 价格系数(需求对价格的敏感度)

# 计算收入最大化的最优价格与收入
opt_price_rev <- -a/(2*b)
opt.revenue <- opt_price_rev * (a + b*opt_price_rev)

# 计算利润最大化的最优价格与利润
unit_cost <- sku_data$unit_cost[1]
opt_price_profit <- (b*unit_cost - a)/(2*b)
opt.profit <- (opt_price_profit - unit_cost) * (a + b*opt_price_profit)

# 输出单SKU结果
data.frame(
  SKU = "SKU001",
  intercept = a,
  price_coeff = b,
  opt_price_rev = opt_price_rev,
  opt.revenue = opt.revenue,
  opt_price_profit = opt_price_profit,
  opt.profit = opt.profit
)

二、多SKU场景扩展实现

针对包含多个SKU的数据集,我们可以通过分组处理自动完成每个SKU的回归拟合与最优值计算,以下提供R和Python两种实现方案:

R语言实现(基于dplyr分组)

# 多SKU示例数据集
multi_sku_data <- data.frame(
  SKU = rep(c("SKU001", "SKU002", "SKU003"), each=4),
  hist.demand = c(100,80,60,40, 200,160,120,80, 150,120,90,60),
  hist.prices = c(10,15,20,25, 8,10,12,14, 12,15,18,21),
  unit_cost = c(5,5,5,5, 3,3,3,3, 4,4,4,4)
)

# 加载dplyr包用于分组处理
library(dplyr)

# 按SKU分组执行回归与最优值计算
sku_results <- multi_sku_data %>%
  group_by(SKU) %>%
  do({
    # 拟合当前SKU的线性回归
    lm_model <- lm(hist.demand ~ hist.prices, data = .)
    coeffs <- coef(lm_model)
    a <- coeffs[1]
    b <- coeffs[2]
    unit_cost <- .$unit_cost[1]
    
    # 计算收入最优指标
    opt_price_rev <- -a/(2*b)
    opt.revenue <- opt_price_rev * (a + b*opt_price_rev)
    
    # 计算利润最优指标
    opt_price_profit <- (b*unit_cost - a)/(2*b)
    opt.profit <- (opt_price_profit - unit_cost) * (a + b*opt_price_profit)
    
    # 返回当前SKU的结果
    data.frame(
      intercept = round(a, 2),
      price_coeff = round(b, 2),
      opt_price_rev = round(opt_price_rev, 2),
      opt.revenue = round(opt.revenue, 2),
      opt_price_profit = round(opt_price_profit, 2),
      opt.profit = round(opt.profit, 2),
      stringsAsFactors = FALSE
    )
  }) %>%
  ungroup()

# 输出所有SKU的结果
print(sku_results)

Python语言实现(基于pandas分组)

import pandas as pd
import statsmodels.api as sm

# 多SKU示例数据集
multi_sku_data = pd.DataFrame({
    'SKU': ['SKU001']*4 + ['SKU002']*4 + ['SKU003']*4,
    'hist.demand': [100,80,60,40, 200,160,120,80, 150,120,90,60],
    'hist.prices': [10,15,20,25, 8,10,12,14, 12,15,18,21],
    'unit_cost': [5]*4 + [3]*4 + [4]*4
})

# 定义单个SKU的处理函数
def process_single_sku(group):
    # 准备回归变量(添加截距项)
    X = sm.add_constant(group['hist.prices'])
    y = group['hist.demand']
    
    # 拟合线性回归模型
    model = sm.OLS(y, X).fit()
    a = model.params['const']  # 截距项
    b = model.params['hist.prices']  # 价格系数
    unit_cost = group['unit_cost'].iloc[0]
    
    # 计算收入最大化的最优值
    opt_price_rev = -a / (2 * b)
    opt_revenue = opt_price_rev * (a + b * opt_price_rev)
    
    # 计算利润最大化的最优值
    opt_price_profit = (b * unit_cost - a) / (2 * b)
    opt_profit = (opt_price_profit - unit_cost) * (a + b * opt_price_profit)
    
    # 返回结果序列
    return pd.Series({
        'intercept': round(a, 2),
        'price_coeff': round(b, 2),
        'opt_price_rev': round(opt_price_rev, 2),
        'opt.revenue': round(opt_revenue, 2),
        'opt_price_profit': round(opt_price_profit, 2),
        'opt.profit': round(opt_profit, 2)
    })

# 按SKU分组应用处理函数
sku_results = multi_sku_data.groupby('SKU').apply(process_single_sku).reset_index()

# 打印最终结果
print(sku_results)

三、关键注意事项

  • 数据有效性:每个SKU需至少包含2条历史观测数据,否则无法拟合线性回归模型
  • 模型假设:该方案基于需求与价格线性相关的假设,若实际需求曲线为非线性(如指数型),需调整回归模型形式
  • 成本参数:需确保unit_cost字段按SKU正确赋值,若所有SKU成本一致可统一设置为固定值
  • 系数合理性:价格系数b通常应为负值(价格越高需求越低),若出现正值需检查数据是否异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:35:17