如何在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
相关产品推荐
相关产品推荐

