Pandas crosstab实战:用一份超市销售数据,搞定会员复购率与商品关联分析
Pandas crosstab实战用一份超市销售数据搞定会员复购率与商品关联分析超市运营团队经常面临两个关键问题如何提升会员忠诚度哪些商品组合能带来更高客单价本文将用一份模拟超市交易数据带你用Pandas的crosstab函数破解这些业务难题。我们会从原始交易记录出发逐步构建可落地的分析方案最终产出可直接用于商业决策的数据洞察。1. 数据准备与清洗假设我们获得了一份包含3个月交易记录的CSV文件字段包括import pandas as pd df pd.read_csv(supermarket_transactions.csv) print(df.head(3))输出示例member_id purchase_date product_category amount 0 10001 2023-01-05 dairy 58 1 10002 2023-01-05 beverage 23 2 10001 2023-01-08 snacks 42关键预处理步骤日期格式标准化df[purchase_date] pd.to_datetime(df[purchase_date]) df[purchase_week] df[purchase_date].dt.isocalendar().week异常值处理# 移除金额为负的记录 df df[df[amount] 0] # 检查缺失值 print(df.isnull().sum())会员分层按消费金额member_value df.groupby(member_id)[amount].sum().reset_index() df pd.merge(df, member_value, onmember_id, suffixes(, _total))2. 会员复购行为分析2.1 基础复购率计算计算各会员在不同周次的购买频率weekly_repurchase pd.crosstab( indexdf[member_id], columnsdf[purchase_week], valuesdf[amount], aggfunccount, marginsTrue )输出示例purchase_week 1 2 3 4 5 All member_id 10001 2 1 0 3 1 7 10002 1 2 1 0 0 4 All 3 3 1 3 1 112.2 进阶价值分析结合消费金额评估会员价值repurchase_matrix pd.crosstab( indexdf[member_id], columnsdf[purchase_week], valuesdf[amount], aggfuncsum, marginsTrue )关键洞察方法高频率低金额可能需要促销刺激低频率高金额重点维护对象稳定型客户核心用户群体3. 商品关联分析实战3.1 基础关联矩阵统计商品类别共同购买情况# 生成交易ID与商品类别的交叉表 item_matrix pd.crosstab( indexdf[purchase_date].astype(str) df[member_id].astype(str), columnsdf[product_category] ) # 计算关联度 from mlxtend.frequent_patterns import association_rules from mlxtend.frequent_patterns import apriori frequent_itemsets apriori(item_matrix, min_support0.05, use_colnamesTrue) rules association_rules(frequent_itemsets, metriclift, min_threshold1)3.2 可视化呈现import seaborn as sns import matplotlib.pyplot as plt # 热力图展示 plt.figure(figsize(10,8)) sns.heatmap(rules.pivot(indexantecedents, columnsconsequents, valueslift), annotTrue, cmapYlGnBu) plt.title(商品关联强度热力图) plt.show()典型业务应用场景高关联度商品捆绑销售或邻近陈列互斥商品避免同时促销潜在组合开发新品套餐4. 多维交叉分析技巧4.1 时间维度叠加分析不同时段的商品偏好变化time_category pd.crosstab( indexdf[purchase_week], columnsdf[product_category], valuesdf[amount], aggfuncsum, normalizeindex )4.2 会员分层交叉高价值会员的消费特征vip_analysis pd.crosstab( index[pd.qcut(df[amount_total], 3, labels[低, 中, 高])], columnsdf[product_category], valuesdf[amount], aggfuncmean )输出优化技巧# 添加百分比格式 def format_percent(x): return f{x*100:.1f}% styled_table (time_category .style .background_gradient(cmapBlues) .format(format_percent))5. 分析报告自动化输出5.1 关键指标计算模板def generate_kpi_report(df): report {} # 复购率 repeat_customers len(df[member_id].unique()) / df.shape[0] report[repeat_rate] repeat_customers # 商品组合收益 top_combos rules.nlargest(3, lift) report[top_combinations] top_combos[[antecedents,consequents,lift]] return pd.DataFrame.from_dict(report, orientindex)5.2 邮件自动发送集成import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText def send_report(report_df): msg MIMEMultipart() msg[Subject] 每周超市销售分析报告 html report_df.to_html() msg.attach(MIMEText(html, html)) with smtplib.SMTP(smtp.example.com, 587) as server: server.login(user, password) server.sendmail(fromexample.com, toexample.com, msg.as_string())实际项目中我发现最有效的分析策略是先用简单交叉表快速验证业务假设再逐步添加维度进行深度挖掘。比如先看整体复购率再按会员等级拆分最后结合时间维度分析变化趋势。这种渐进式分析方法既能保证效率又能避免陷入数据沼泽。