新零售数据分析:AI 智能选品与库存优化的数据驱动方案
新零售数据分析:AI 智能选品与库存优化的数据驱动方案
一、新零售场景的数据挑战
新零售的本质是"人货场"的数字化重构,而数据分析师站在这个重构的中央。传统零售靠店长经验选品、靠人工盘点库存,新零售则把这两件事交给数据和算法来做。
但实际落地远没那么简单。我参与的某连锁便利店的选品项目,刚拿到数据时就遇到了一堆麻烦:SKU 信息混乱(同一商品在不同门店叫不同名字)、销售数据跟库存数据对不上、线上渠道跟线下渠道的口径打架。更头疼的是,品类经理坚持认为"这个品类就该这么选,数据说了不算"。
新零售数据的核心挑战可以归纳为三点:
- 数据口径统一:线上线下、不同区域、不同系统的数据标准化
- 业务指标定义:什么算"好卖"、什么算"滞销",不同角色有不同标准
- 时效性与可解释性:选品建议要快,还得让品类经理信服
这个闭环才是新零售数据分析的灵魂——不是一次性输出结果,而是持续迭代优化。
二、AI 智能选品:从关联分析到个性化推荐
选品的核心问题是:在一个有限货架空间的门店里,应该放哪些商品,才能最大化销售额和利润?
关联规则挖掘:找"搭着卖"的组合
我们先用了 Apriori 算法做关联规则挖掘,看看哪些商品经常被一起购买。
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules
# 加载交易数据,每行一个交易,每列一个SKU,值为是否购买
transactions = pd.read_csv('transaction_data.csv')
# 生成频繁项集,最小支持度设为0.01(至少1%的交易中出现)
frequent_items = apriori(transactions, min_support=0.01, use_colnames=True)
# 生成关联规则,最小置信度0.3,最小提升度1.2
rules = association_rules(frequent_items, metric='confidence', min_threshold=0.3)
rules = rules[rules['lift'] > 1.2]
# 按提升度排序,取前20条最强关联
top_rules = rules.sort_values('lift', ascending=False).head(20)
print(top_rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
结果很有意思:牛奶和面包的组合提升度高达3.5,咖啡和甜点的提升度2.8。品类经理看完说"这不就是常识嘛",但当数据显示某门店的咖啡和能量饮料组合提升度4.2时,他沉默了——这个组合他完全没注意到。
门店画像 + 选品个性化
关联规则只是第一步。不同门店的客群差异巨大:写字楼门店的早餐品类占比40%,社区门店的生鲜品类占比35%。我们需要给每个门店做"画像",然后基于画像做个性化选品。
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# 构建门店特征矩阵:客流量、客单价、品类结构、时段分布等
store_features = pd.read_csv('store_features.csv')
# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(store_features)
# KMeans聚类,将门店分为6个画像群
kmeans = KMeans(n_clusters=6, random_state=42, n_init=10)
store_features['cluster'] = kmeans.fit_predict(X_scaled)
# 查看每个画像群的典型特征
for c in range(6):
cluster_data = store_features[store_features['cluster'] == c]
print(f"画像群{c}: 平均客流量={cluster_data['avg_traffic'].mean():.0f}, "
f"客单价={cluster_data['avg_ticket'].mean():.1f}, "
f"门店数={len(cluster_data)}")
6个画像群出来了:写字楼白领群、社区家庭群、学校学生群、交通枢纽群、商业区混合群、郊区价格敏感群。每个群的选品策略截然不同,这比一刀切的全局推荐精准得多。
三、库存优化:需求预测与安全库存计算
选品解决了"放什么"的问题,库存优化解决"放多少"和"什么时候补"的问题。
需求预测:不是简单的历史平均
库存优化的第一个关键是需求预测。很多人以为用过去30天的平均销量乘个系数就行,但季节性、促销活动、天气因素都会扰动需求。
import numpy as np
from statsforecast import StatsForecast
from statsforecast.models import AutoETS
# 准备时序数据:sku_id, date, sales_qty
sales_ts = pd.read_csv('daily_sales.csv')
sales_ts['unique_id'] = sales_ts['sku_id']
sales_ts['ds'] = pd.to_datetime(sales_ts['date'])
sales_ts['y'] = sales_ts['sales_qty']
# 使用AutoETS自动选择最佳ETS模型
sf = StatsForecast(
models=[AutoETS(season_length=7)], # 周度季节性
freq='D',
n_jobs=-1
)
# 预测未来14天的需求
forecast = sf.forecast(df=sales_ts, h=14)
print(forecast.head())
ETS模型自动识别趋势和季节性成分,比简单均值靠谱。但别忘了加上天气和促销的外生变量——下雨天便利店客流涨15%,促销期间单品销量可能翻3倍。
安全库存:用统计学算"够用"的量
安全库存的核心公式是:
安全库存 = Z × σ_demand × √(LT + review_period)
其中 Z 是服务水平对应的标准正态分位数,σ_demand 是需求标准差,LT 是补货提前期。
from scipy.stats import norm
def calc_safety_stock(daily_demand_mean, daily_demand_std, lead_time_days,
review_period_days, service_level=0.95):
"""
计算安全库存量
参数:
daily_demand_mean: 日均需求量
daily_demand_std: 日需求标准差
lead_time_days: 补货提前期(天)
review_period_days: 盘点周期(天)
service_level: 目标服务水平(如0.95表示95%不缺货)
"""
# 根据服务水平计算Z值
z_score = norm.ppf(service_level)
# 计算安全库存
ss = z_score * daily_demand_std * np.sqrt(lead_time_days + review_period_days)
# 计算补货点
reorder_point = daily_demand_mean * (lead_time_days + review_period_days) + ss
return ss, reorder_point
# 批量计算所有SKU的安全库存和补货点
sku_stats = pd.read_csv('sku_demand_stats.csv')
results = []
for _, row in sku_stats.iterrows():
ss, rop = calc_safety_stock(
row['demand_mean'], row['demand_std'],
row['lead_time'], row['review_period'],
service_level=0.95
)
results.append({'sku_id': row['sku_id'], 'safety_stock': ss, 'reorder_point': rop})
safety_stock_df = pd.DataFrame(results)
print(safety_stock_df.head(10))
95%的服务水平意味着只有5%的概率会缺货,这个参数可以根据品类重要性调整——核心品类可以设到99%,边缘品类降到90%。
四、从模型到业务:选品与库存的联动闭环
选品和库存不是独立的两个模块,它们必须联动。一个商品被选品模型推荐上架,但库存模型预测它在未来7天会断货——这时候就得提前安排补货。反过来,库存模型发现某个SKU连续3周库存周转率低于阈值,选品模型就应该考虑下架它。
联动闭环的关键是数据回流速度。传统零售的周报模式太慢了,我们推动门店实现了日报——每天凌晨T+1数据就到位,选品和库存模型每天重新跑一次。
# 联动评分:选品得分 × 库存保障系数
def calc_joint_score(selection_score, stock_availability, turnover_rate):
"""
计算选品与库存联动评分
参数:
selection_score: 选品模型得分(0-1)
stock_availability: 库存保障系数(0-1,库存满足需求的比例)
turnover_rate: 近4周库存周转率
"""
# 库存保障不足时,降低联动评分
if stock_availability < 0.5:
stock_factor = stock_availability * 0.5 # 严重惩罚
elif stock_availability < 0.8:
stock_factor = stock_availability * 0.8
else:
stock_factor = 1.0 # 库存充足不影响
# 周转率过低时,降低联动评分
turnover_factor = min(turnover_rate / 4, 1.0) # 周转率4为满分基准
# 综合评分
joint_score = selection_score * stock_factor * turnover_factor
return joint_score
# 批量计算联动评分
sku_scores = pd.read_csv('sku_model_scores.csv')
sku_scores['joint_score'] = sku_scores.apply(
lambda r: calc_joint_score(r['selection_score'], r['stock_avail'], r['turnover']),
axis=1
)
# 按联动评分排序,取每个门店的Top50
top_skus = sku_scores.sort_values('joint_score', ascending=False).groupby('store_id').head(50)
print(top_skus[['store_id', 'sku_id', 'joint_score']].head(20))
五、总结
新零售的AI选品和库存优化,说到底是在有限资源下做最优配置。几个关键经验:
- 数据口径先行:选品和库存模型都依赖干净数据,花30%时间在数据清洗上不亏
- 门店画像是个杠杆:一刀切的推荐效果很差,门店聚类后的个性化推荐提升显著
- 安全库存的参数要因地制宜:核心品类99%,边缘品类90%,一刀切的95%反而浪费
- 联动闭环比单模块优化更重要:选品不考虑库存,库存不反馈选品,两个模块各自优化但整体烂
- 业务信任是最大的瓶颈:模型再好,品类经理不信就不执行,可解释性比精度更重要
新零售数据分析的终点不是模型精度,而是门店货架上的商品是不是真的更好卖了。