Python数据分析实战:线性回归与关联规则挖掘的组合应用
1. 项目概述当线性回归遇上关联规则挖掘最近在整理数据分析项目时我常常遇到一个场景既要预测一个连续的目标值比如销售额又想从海量的交易数据里挖掘出“买了A商品的人很可能也会买B商品”这样的隐藏规律。这听起来像是两个完全不同的任务对吧预测销售额我们通常会想到线性回归而挖掘商品组合规律则是关联规则挖掘的经典应用。这两个任务一个属于监督学习的回归问题一个属于无监督学习的模式发现看似泾渭分明。但把它们放在同一个数据分析项目里用Python一气呵成地完成却能产生112的效果。今天我就来聊聊如何用Python特别是借助mlxtend这个强大的扩展库来串联起线性回归和关联规则挖掘构建一个从宏观预测到微观洞察的完整分析闭环。这个组合拳能解决什么问题呢想象一下你是一家电商的数据分析师。老板既想知道下个季度的GMV商品交易总额大概是多少线性回归的活儿又想知道应该设计什么样的商品捆绑促销策略来提升客单价关联规则挖掘的活儿。传统的做法可能是先用statsmodels或scikit-learn跑一个回归模型再用专门的工具或者自己写复杂的循环去计算关联规则过程割裂工具不一。而我的思路是利用Python生态的统一性特别是mlxtend库在关联规则挖掘上的便捷性将这两个分析流程无缝衔接。我们不仅能得到预测数字还能深入理解构成这个数字的微观交易模式让分析报告既有高度又有深度。2. 核心思路拆解为什么是线性回归与关联规则在深入代码之前我们得先搞清楚为什么把这两个方法放在一起是有意义的而不是生拉硬拽。2.1 线性回归把握宏观趋势与关键驱动因素线性回归是我们的“望远镜”。它的核心目标是建立一个数学模型来描述一个或多个自变量特征与一个连续型因变量目标之间的线性关系。公式很简单y β₀ β₁X₁ β₂X₂ ... βₙXₙ ε。在这个电商例子里y可能就是季度GMVX可以是市场营销费用、网站访问量、季节性因素等。选择线性回归的深层考量可解释性极强每个系数β直接告诉我们当其他因素不变时某个特征每增加一个单位目标变量平均变化多少。这对于向业务部门汇报至关重要。比如你发现“社交媒体广告投入”的系数是50意味着每多投入1万元GMV平均提升50万元。这个结论清晰、直接。基准模型线性回归复杂度低运行快常作为性能基准。即使后续使用更复杂的模型如随机森林、梯度提升树线性回归的结果也是一个重要的参照点。特征工程试金石通过回归分析我们可以初步判断哪些特征可能与目标相关系数显著不为零哪些可能是噪音。这为后续更精细的分析包括关联规则挖掘中的数据准备提供了方向。注意线性回归的前提假设如线性关系、误差项独立同分布、无多重共线性等需要检验。实践中我们常使用散点图、残差图、VIF方差膨胀因子等工具进行诊断。如果假设严重违背预测结果可能不可靠。2.2 关联规则挖掘洞察微观交易模式关联规则挖掘是我们的“显微镜”。它不关心预测一个具体数值而是专注于发现数据集中项items之间有趣的共存关系。最经典的例子就是“啤酒与尿布”。它的产出是形如{A} - {B}的规则并附带三个核心指标支持度Support规则中所有项A和B同时出现的交易占总交易的比例。衡量规则的普遍性。置信度Confidence在包含A的交易中也包含B的条件概率。衡量规则的可靠性。提升度Lift规则中项集A和B同时出现的概率与它们独立出现概率的乘积之比。提升度1表示A和B正相关1表示负相关1表示独立。这是判断规则是否有价值的关键。为什么用mlxtendPython中做关联规则mlxtendMachine Learning Extensions库是后起之秀它比早期的一些实现如自己编写Apriori算法要优雅和高效得多。它提供了apriori函数来高效生成频繁项集以及association_rules函数来从频繁项集中提取规则接口非常简洁。相比于其他方案mlxtend与pandas的DataFrame无缝集成使得数据预处理和结果分析变得异常流畅。2.3 双线分析的协同价值将两者结合分析流程就形成了闭环宏观定位先用线性回归找到影响整体目标如GMV的关键宏观因素。比如发现“节假日促销”是强正相关因素。微观深挖接着我们可以聚焦于“节假日促销”期间产生的交易数据对其进行关联规则挖掘。这时我们挖掘的规则就不是泛泛的“啤酒和尿布”而是“在促销氛围下哪些商品组合更受青睐”。例如可能发现{烧烤酱} - {一次性餐具木炭}的支持度和提升度很高。策略反哺将微观洞察反馈给宏观策略。基于挖掘的规则我们可以设计更精准的促销捆绑包、优化购物车推荐、或在促销广告中突出关联商品。这些具体行动有可能进一步提升“节假日促销”这个宏观因素的效力从而在下一个回归模型中看到该因素系数β值的进一步优化。这种“宏观预测指导微观分析焦点微观洞察反哺宏观策略优化”的循环正是数据驱动业务的核心逻辑。3. 环境准备与数据理解工欲善其事必先利其器。我们先搭建好分析环境并理解我们将要使用的示例数据。3.1 工具包安装与导入确保你已安装Python3.7以上版本推荐。我们需要以下核心库pandasnumpy: 数据处理的基石。scikit-learn: 用于线性回归建模及评估。statsmodels: 提供更详细的回归统计摘要如P值、置信区间增强模型解释性。mlxtend: 本次关联规则挖掘的主角。matplotlibseaborn: 可视化用于数据探索和模型诊断。可以通过以下命令安装缺失的库pip install pandas numpy scikit-learn statsmodels mlxtend matplotlib seaborn在Jupyter Notebook或Python脚本中我们这样导入import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 线性回归相关 from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score import statsmodels.api as sm # 关联规则挖掘相关 from mlxtend.frequent_patterns import apriori, association_rules from mlxtend.preprocessing import TransactionEncoder # 设置可视化风格 sns.set_style(whitegrid) plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号3.2 构造示例数据集为了完整演示流程我们构造一个简单的综合数据集。它包含两部分宏观层面数据macro_data用于线性回归。假设我们记录了一家店铺过去24个月的月度数据。微观交易数据transaction_data用于关联规则挖掘。模拟了其中某个月比如一个大促月的顾客购物篮数据。# 1. 构造宏观回归数据 np.random.seed(42) # 确保可复现 months 24 macro_data pd.DataFrame({ month: range(1, months1), marketing_spend: np.random.normal(50, 15, months).clip(20, 80), # 营销投入 website_traffic: np.random.poisson(10000, months) np.random.randint(-1000, 1000, months), # 网站流量 holiday_flag: [1 if m in [1, 2, 7, 8, 12] else 0 for m in range(1, months1)], # 节假日标志 competitor_price_index: np.random.uniform(0.9, 1.1, months) # 竞争对手价格指数 }) # 生成模拟的GMV目标变量加入一些噪声 true_gmv (200 2.5*macro_data[marketing_spend] 0.0003*macro_data[website_traffic] 80*macro_data[holiday_flag] - 150*macro_data[competitor_price_index] np.random.normal(0, 30, months)) macro_data[gmv] true_gmv.clip(300, 1000) # 确保GMV在合理范围 print(宏观数据预览) print(macro_data.head()) print(f\n数据形状{macro_data.shape}) # 2. 构造微观交易数据 # 假设有10种商品 items [牛奶, 面包, 啤酒, 尿布, 鸡蛋, 咖啡, 香蕉, 纸巾, 洗发水, 牙膏] # 模拟1000笔交易每笔交易随机包含1-5件商品 np.random.seed(123) transactions [] for _ in range(1000): n_items np.random.randint(1, 6) transaction list(np.random.choice(items, sizen_items, replaceFalse)) transactions.append(transaction) # 将交易列表转化为mlxtend需要的格式 te TransactionEncoder() te_ary te.fit(transactions).transform(transactions) transaction_df pd.DataFrame(te_ary, columnste.columns_) print(f\n交易数据预览One-hot编码格式共{transaction_df.shape[0]}笔交易) print(transaction_df.head())数据理解要点macro_data中的holiday_flag是我们后续进行聚焦分析的关键。线性回归会告诉我们它是否重要。transaction_df是典型的“宽表”格式每一行是一笔交易每一列是一件商品值为布尔型True/False表示是否购买。这是mlxtend库apriori函数要求的输入格式。4. 线性回归建模从数据到宏观洞察现在我们开始第一部分的实战建立线性回归模型预测GMV并理解驱动因素。4.1 数据预处理与探索性分析在建模前我们必须先“认识”数据。# 查看宏观数据的基本信息和描述性统计 print(macro_data.info()) print(macro_data.describe()) # 可视化特征与目标的关系 fig, axes plt.subplots(2, 2, figsize(12, 10)) features [marketing_spend, website_traffic, holiday_flag, competitor_price_index] target gmv for idx, feat in enumerate(features): ax axes[idx//2, idx%2] if macro_data[feat].nunique() 5: # 连续变量画散点图 sns.scatterplot(datamacro_data, xfeat, ytarget, axax) # 添加趋势线 z np.polyfit(macro_data[feat], macro_data[target], 1) p np.poly1d(z) ax.plot(macro_data[feat], p(macro_data[feat]), r--, alpha0.8) else: # 分类/二值变量画箱线图 sns.boxplot(datamacro_data, xfeat, ytarget, axax) ax.set_title(f{feat} vs {target}) ax.set_xlabel(feat) ax.set_ylabel(target) plt.tight_layout() plt.show() # 检查特征间的相关性多重共线性 corr_matrix macro_data[features [target]].corr() plt.figure(figsize(8,6)) sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0, squareTrue) plt.title(特征与目标变量相关性热图) plt.show()通过散点图和相关性热图我们可以直观看到marketing_spend和website_traffic与gmv似乎存在正相关holiday_flag在节假日时GMV中位数更高而competitor_price_index呈负相关。特征之间相关性不高初步判断多重共线性问题不严重。4.2 模型训练、评估与解释我们使用scikit-learn进行快速建模和预测再用statsmodels获取详细的统计推断。# 准备数据 X macro_data[features] y macro_data[target] # 划分训练集和测试集这里时间序列不强简单随机划分 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 使用scikit-learn的LinearRegression lr_model LinearRegression() lr_model.fit(X_train, y_train) # 在测试集上预测并评估 y_pred lr_model.predict(X_test) mse mean_squared_error(y_test, y_pred) rmse np.sqrt(mse) r2 r2_score(y_test, y_pred) print(f线性回归模型性能测试集) print(f 均方误差 (MSE): {mse:.2f}) print(f 均方根误差 (RMSE): {rmse:.2f}) print(f 决定系数 (R²): {r2:.4f}) # 查看系数 coeff_df pd.DataFrame({ 特征: features, 系数: lr_model.coef_ }) print(f\n模型系数) print(coeff_df) # 使用statsmodels获取更详细的统计信息包括P值 # 需要手动添加常数项截距 X_train_sm sm.add_constant(X_train) model_sm sm.OLS(y_train, X_train_sm).fit() print(f\nStatsmodels 详细摘要) print(model_sm.summary())解读statsmodels摘要的关键点R-squared: 模型解释了目标变量变异的比例。我们的模拟数据中这个值应该比较高。Coefficient (coef): 每个特征的系数估计值。例如holiday_flag的系数如果是正且显著说明节假日能显著提升GMV。P|t|: P值。通常以0.05为阈值小于0.05表示该特征对目标的影响是统计显著的。务必关注holiday_flag的P值。[0.025 0.975]: 系数的95%置信区间。如果不包含0也说明该特征显著。实操心得在实际业务中statsmodels的摘要输出对于向非技术背景的同事解释“为什么这个因素重要”非常有帮助。你可以直接说“你看holiday_flag的P值远小于0.05这意味着我们有超过95%的把握认为节假日对GMV有正向影响。”4.3 模型诊断与验证一个好的回归模型不仅要预测准还要符合其统计假设。# 1. 绘制预测值与真实值对比图 plt.figure(figsize(10, 6)) plt.scatter(y_test, y_pred, alpha0.7) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], r--, lw2) # 对角线 plt.xlabel(真实GMV) plt.ylabel(预测GMV) plt.title(预测值 vs 真实值 (测试集)) plt.show() # 2. 残差分析检查线性、同方差、正态性假设 residuals y_test - y_pred fig, axes plt.subplots(1, 3, figsize(15, 4)) # 残差 vs 预测值图检查同方差性 axes[0].scatter(y_pred, residuals, alpha0.7) axes[0].axhline(y0, colorr, linestyle--) axes[0].set_xlabel(预测值) axes[0].set_ylabel(残差) axes[0].set_title(残差 vs 预测值) # 残差Q-Q图检查正态性 sm.qqplot(residuals, line45, fitTrue, axaxes[1]) axes[1].set_title(残差Q-Q图) # 残差直方图检查正态性 axes[2].hist(residuals, bins15, edgecolorblack, alpha0.7) axes[2].set_xlabel(残差) axes[2].set_ylabel(频数) axes[2].set_title(残差分布直方图) plt.tight_layout() plt.show() # 3. 计算VIF检查多重共线性 from statsmodels.stats.outliers_influence import variance_inflation_factor vif_data pd.DataFrame() vif_data[feature] X.columns vif_data[VIF] [variance_inflation_factor(X.values, i) for i in range(len(X.columns))] print(\n方差膨胀因子(VIF)检查) print(vif_data) # 通常VIF10认为存在严重多重共线性如果残差图随机分布在0线周围Q-Q图点大致在45度线上且VIF值都较低如5那么模型假设基本满足我们可以对结果更有信心。至此我们从宏观数据中得到了一个可解释的线性回归模型。假设分析结果显示holiday_flag是一个显著的正向预测因子。接下来我们就聚焦到“节假日”这个场景深入交易数据内部看看。5. 关联规则挖掘深入交易篮子的微观世界现在我们切换到微观视角利用mlxtend挖掘交易数据中的商品关联规律。5.1 数据预处理转换为适合挖掘的格式我们的transaction_df已经是正确的布尔矩阵格式可以直接使用。但在真实场景中数据往往是一行代表一笔交易一列代表商品购买数量。我们需要将其转换为布尔型是否购买。# 假设原始交易数据是数量型这里用我们构造的布尔型数据演示但流程一致 # 真实数据清洗步骤可能包括 # 1. 去除退货订单数量为负 # 2. 将数量0的记录转换为True # 3. 选择分析的时间范围例如只选取holiday_flag1对应月份的数据 # 本例中我们直接使用全部模拟交易数据。 print(f交易数据形状: {transaction_df.shape}) print(f总交易笔数: {transaction_df.shape[0]}) print(f商品种类数: {transaction_df.shape[1]})5.2 使用Apriori算法发现频繁项集Apriori算法的核心思想是“频繁项集的所有子集也一定是频繁的”。mlxtend的apriori函数封装了这一切。# 计算频繁项集 # min_support 是最小支持度阈值需要根据数据规模和业务理解调整。 # 这里设为0.02表示我们只关心至少在2%的交易中共同出现的商品组合。 min_support_threshold 0.02 frequent_itemsets apriori(transaction_df, min_supportmin_support_threshold, use_colnamesTrue) # use_colnamesTrue让结果中的项集用商品名称表示而不是列索引。 # 按支持度降序排列 frequent_itemsets frequent_itemsets.sort_values(bysupport, ascendingFalse).reset_index(dropTrue) print(f找到的频繁项集数量: {len(frequent_itemsets)}) print(\n支持度最高的10个频繁项集) print(frequent_itemsets.head(10)) # 查看项集的大小分布 frequent_itemsets[length] frequent_itemsets[itemsets].apply(lambda x: len(x)) length_distribution frequent_itemsets[length].value_counts().sort_index() print(f\n频繁项集大小分布\n{length_distribution})如何设定min_support这是一个需要权衡的参数。设得太高如0.2可能只找到像{牛奶}、{面包}这样极其普遍但无趣的单品项集。设得太低如0.001会找到大量包含冷门商品的组合计算量大且规则可能没有业务价值。我的经验是先从0.01或0.05开始观察频繁项集的数量和构成再逐步调整。对于交易量大的平台这个值可以设得更小。5.3 从频繁项集中提取关联规则有了频繁项集我们就可以生成并筛选关联规则了。# 从频繁项集中提取关联规则 # metric: 评估规则的标准常用‘confidence’置信度、‘lift’提升度、‘leverage’杠杆率等。 # min_threshold: 对应metric的最小阈值。 # 我们最关心提升度(lift)因为它能排除掉那些仅仅是因为后件本身就很流行而产生的规则。 rules association_rules(frequent_itemsets, metriclift, min_threshold1.0) # min_threshold1.0 表示我们只保留提升度大于1的规则正相关。 # 按提升度降序排列 rules rules.sort_values(bylift, ascendingFalse).reset_index(dropTrue) print(f生成的关联规则数量: {len(rules)}) print(\n提升度最高的10条关联规则) # 选择感兴趣的列展示 cols_of_interest [antecedents, consequents, support, confidence, lift] print(rules[cols_of_interest].head(10))5.4 规则解读与业务化现在我们来解读一条规则。假设我们得到一条高提升度的规则{啤酒} - {尿布}。支持度 (support): 0.03。意味着在所有交易中同时购买啤酒和尿布的订单占3%。这个比例不算高但若针对特定人群如年轻父亲可能很有意义。置信度 (confidence): 0.7。意味着在购买啤酒的交易中有70%也购买了尿布。这是一个很强的条件概率。提升度 (lift): 4.5。这是最关键指标。提升度 支持度(啤酒,尿布) / (支持度(啤酒)*支持度(尿布))。大于1说明啤酒和尿布的购买行为不是独立的而是正相关的。4.5意味着同时购买这两种商品的概率是它们独立购买概率的4.5倍这强烈暗示了潜在的捆绑销售或交叉销售机会。如何将规则转化为行动商品摆放在实体店或网店页面将啤酒和尿布陈列在相近区域。促销策略设计“啤酒尿布”组合优惠券或折扣包。推荐系统在用户将啤酒加入购物车时推荐尿布。注意事项关联规则反映的是相关性而非因果性。{啤酒} - {尿布}并不意味着买啤酒会导致买尿布可能是一个共同原因如“家有婴儿的男性顾客”导致了两种购买行为。业务解读时需要结合常识。5.5 高级筛选与可视化我们通常不会只看提升度还需要综合其他指标进行筛选并可视化结果。# 综合筛选规则高提升度、较高置信度、且不是过于普遍的规则 filtered_rules rules[ (rules[lift] 2.0) # 提升度强 (rules[confidence] 0.5) # 规则可靠 (rules[support] 0.01) # 有一定普遍性 ].copy() print(f经过综合筛选后剩余规则数量: {len(filtered_rules)}) # 为便于处理将集合类型的前因后果转换为字符串 filtered_rules[antecedents_str] filtered_rules[antecedents].apply(lambda x: , .join(list(x))) filtered_rules[consequents_str] filtered_rules[consequents].apply(lambda x: , .join(list(x))) # 可视化支持度 vs 置信度点的大小代表提升度 plt.figure(figsize(10, 6)) scatter plt.scatter( filtered_rules[support], filtered_rules[confidence], cfiltered_rules[lift], sfiltered_rules[lift]*50, # 点的大小与提升度成正比 alpha0.6, cmapviridis ) plt.colorbar(scatter, label提升度 (Lift)) plt.xlabel(支持度 (Support)) plt.ylabel(置信度 (Confidence)) plt.title(关联规则散点图 (点大小和颜色代表提升度)) # 为少数顶级规则添加标签可选 top_n 3 for i in range(min(top_n, len(filtered_rules))): plt.annotate(f{filtered_rules.iloc[i][antecedents_str]} - {filtered_rules.iloc[i][consequents_str]}, (filtered_rules.iloc[i][support], filtered_rules.iloc[i][confidence]), xytext(5, 5), textcoordsoffset points, fontsize9) plt.tight_layout() plt.show()通过这张图我们可以快速定位到那些位于右上角高支持、高置信且点大色深高提升的“黄金规则”这些是业务价值最高的洞察。6. 双线融合从宏观到微观的闭环分析至此我们独立完成了线性回归和关联规则挖掘。现在让它们产生化学反应。6.1 基于回归结果的聚焦分析我们的线性回归指出holiday_flag是GMV的重要推动因素。那么节假日期间的消费模式有什么特殊之处我们可以只对节假日期间的交易数据进行关联规则挖掘。# 假设我们有一个DataFrame all_transactions其中包含每笔交易的日期date。 # 我们可以根据日期判断是否为节假日然后筛选数据。 # 伪代码示例 # holiday_transactions all_transactions[all_transactions[date].isin(holiday_date_list)] # 然后对holiday_transactions进行同样的编码和挖掘流程。 # 在我们的模拟数据中我们没有日期列。但我们可以模拟 # 假设前500笔交易是节假日期间的数据量减半支持度阈值可能需要调整 holiday_transaction_df transaction_df.iloc[:500, :] print(f节假日交易数据形状: {holiday_transaction_df.shape}) # 重新计算频繁项集和规则使用相同的或调整后的支持度阈值 freq_itemsets_holiday apriori(holiday_transaction_df, min_support0.03, use_colnamesTrue) # 提高阈值因为数据量变小 rules_holiday association_rules(freq_itemsets_holiday, metriclift, min_threshold1.0) rules_holiday rules_holiday.sort_values(lift, ascendingFalse) print(f\n节假日专属规则数量: {len(rules_holiday)}) print(节假日专属高提升度规则前5) print(rules_holiday[[antecedents, consequents, support, confidence, lift]].head())你可能会发现节假日期间出现了{红酒奶酪}或{礼品卡巧克力}这类与节日氛围相关的强规则而这些在平日数据中并不突出。这个发现就让宏观的“节假日效应”有了微观的、可执行的落地方案——在节前重点备货和推广这些关联商品组合。6.2 利用关联规则优化回归特征反过来关联规则挖掘出的高频商品组合或品类是否可以转化为新的特征加入线性回归模型以提升其预测精度 例如我们发现{烧烤酱木炭一次性餐具}是一个强关联组合。我们可以创建一个新特征grill_combo_sales代表每个月这个“烧烤组合”的总销售额或订单数将其加入宏观数据集。# 伪代码为每笔交易打上“是否包含烧烤组合”的标签 # transaction_df[contains_grill_combo] transaction_df.apply(lambda row: all(item in row for item in [烧烤酱, 木炭, 一次性餐具]), axis1) # 然后按月份聚合计算每个月包含该组合的订单数合并到macro_data中作为新特征。 # 重新训练线性回归模型观察新特征的系数和显著性以及模型R²是否提升。这实际上是一种从无监督学习中获取特征灵感用于增强监督学习模型的高级技巧。7. 常见问题、避坑指南与性能优化在实际操作中你肯定会遇到各种问题。以下是我踩过的一些坑和解决方案。7.1 线性回归常见问题问题1特征与目标不是线性关系怎么办现象散点图显示曲线关系或残差图呈现明显的模式如U型。解决尝试非线性变换对特征或目标变量进行数学变换如取对数np.log1p、平方、开方等。例如对于呈现指数增长的趋势取对数常有效。使用多项式特征sklearn.preprocessing.PolynomialFeatures可以自动生成特征的高次项和交互项。换模型考虑决策树、随机森林等非线性模型。但会牺牲部分可解释性。问题2多重共线性VIF过高现象特征间高度相关导致系数估计不稳定标准误增大。解决删除相关性高的特征之一从业务角度选择保留更重要的那个。主成分分析PCA将多个相关特征压缩成少数几个不相关的主成分。但主成分的业务含义会变得模糊。正则化Ridge/Lasso回归在损失函数中加入惩罚项约束系数大小。Lasso回归甚至可以将某些不重要的系数压缩至0实现特征选择。问题3异方差性残差方差随预测值增大而增大现象残差vs预测值图中点呈“漏斗形”。解决对目标变量进行变换如取对数或使用加权最小二乘法WLS。7.2 关联规则挖掘常见问题问题1apriori运行太慢或内存溢出原因商品种类太多或支持度阈值设得太低导致候选项集爆炸。优化提升min_support这是最有效的方法。根据业务先验知识设定一个合理的下限。数据预处理过滤掉那些非常冷门的商品出现次数极少的列。在调用apriori前可以先计算每个商品的支持度然后只保留支持度大于某个阈值的商品列。item_support transaction_df.mean() # 计算每列商品的平均值即支持度 popular_items item_support[item_support 0.01].index # 保留支持度1%的商品 transaction_df_filtered transaction_df[popular_items]使用max_len参数限制寻找的频繁项集的最大长度。例如max_len3只找最多包含3件商品的组合。尝试FP-Growth算法mlxtend也提供了fpgrowth函数它通常比Apriori更快尤其对于稠密数据集。用法与apriori类似。问题2产生的规则太多且很多是 trivial 的如 {A} - {B}, {B} - {A}解决提高min_threshold对metric如lift,confidence设置更高的阈值。使用metric和min_threshold的组合筛选例如同时要求lift 3且confidence 0.6。后处理过滤生成规则后手动过滤掉那些前件或后件是单个非常流行商品如“收据纸”的规则这些规则往往没有业务意义。关注“提升度”而非“置信度”高置信度可能只是因为后件本身很流行。提升度能更好地识别出真正的正相关关系。问题3如何解读“提升度”小于1的规则含义提升度1表示前件和后件是负相关的。例如{牛奶} - {啤酒}的提升度0.8意味着买牛奶的人反而不太可能买啤酒。这同样是宝贵的洞察可能意味着这两类商品的目标客户群不同或者存在替代关系。7.3 流程整合与自动化建议对于需要定期运行的分析可以将整个流程脚本化。def combined_analysis(macro_data_path, transaction_data_path, holiday_dates): 整合线性回归与关联规则分析的函数 # 1. 加载数据 macro_df pd.read_csv(macro_data_path) trans_df pd.read_csv(transaction_data_path) # 2. 线性回归分析 # ... (特征工程、训练、评估、诊断) significant_features [...] # 存储识别出的重要特征如[holiday_flag] # 3. 关联规则聚焦分析 # 根据回归结果筛选特定场景数据如节假日 holiday_trans filter_transactions_by_date(trans_df, holiday_dates) # 挖掘关联规则 rules mine_association_rules(holiday_trans, min_support0.02, min_lift1.5) # 4. 生成报告 generate_report(macro_model_summary, rules, significant_features) return macro_model, rules # 后续可以加入调度工具如Apache Airflow, cron定期执行此脚本。8. 总结与延伸思考走完这一整套流程你会发现数据分析不再是孤立模型的堆砌。线性回归给了我们一个俯瞰全局的“战略地图”指出了高潜力的方向如“节假日”而关联规则挖掘则提供了深入战场的“战术显微镜”揭示了在这个方向下的具体作战模式如“烧烤三件套”组合。两者结合让数据驱动的决策既看得远又扎得深。在实际项目中这个流程还可以进一步扩展时序关联规则不仅看商品是否同时出现还看购买顺序先买A再买B。这需要更复杂的数据结构和算法。分层挖掘先按商品大类如“酒水”、“零食”挖掘规则再在大类内部按子类挖掘形成层次化的洞察。与聚类分析结合先用聚类如K-Means将顾客分成不同群体再对每个群体分别进行关联规则挖掘实现更精准的个性化洞察。工具上除了mlxtend对于超大规模数据集你可能需要探索Spark MLlib中的FP-Growth实现。但无论如何Pythonpandasmlxtend/scikit-learn这一套组合对于绝大多数中小规模的数据分析需求来说已经足够强大、灵活且高效。关键在于理解每个方法背后的逻辑并巧妙地将它们串联起来讲出一个完整的数据故事。