在上一个部分,我们学习了市场篮子分析,发现了产品之间的关联关系。但市场篮子分析只是关联规则分析的一个应用。关联规则分析是一种更通用的数据挖掘技术,它能够发现数据中各种“如果...那么...”的规律。 在这一个部分,我们将深入学习关联规则的基本概念,探索更复杂的关联模式。

关联规则(Association Rules)是一种"如果...那么..."的规则形式。比如,"如果客户购买了牛奶,那么他很可能会购买面包"。这种规则能够帮助我们理解数据中的关联关系,并用于预测和推荐。
一个关联规则通常表示为:A → B,读作"如果A,那么B"。其中,A是前件(Antecedent),B是后件(Consequent)。比如,"牛奶 → 面包"表示"如果购买了牛奶,那么会购买面包"。
关联规则有两个重要的指标:支持度(Support)和置信度(Confidence)。支持度表示规则出现的频率,置信度表示规则的可信程度。这两个指标我们在上一个部分的课程中已经接触过,现在让我们更深入地理解它们。
为了更好地理解关联规则,我们先来看一个示例数据集。假设我们有一个订单详情测试表,记录了客户的购买记录:
从这个数据集中,我们可以发现一些关联规则。比如,在订单001和002中,牛奶和面包同时出现,这说明"牛奶 → 面包"这个规则具有一定的支持度。
支持度和置信度是关联规则的两个基本指标,但它们各有局限性。支持度高但置信度低的规则可能不够有用,置信度高但支持度低的规则可能只适用于少数情况。我们需要综合考虑这两个指标。
基础的关联规则分析只考虑两个产品之间的关系,但在实际应用中,我们可能需要分析更复杂的关联模式,比如多个产品之间的关系,或者考虑其他因素(如时间、地点等)的关联规则。
让我们分析三个产品之间的关联关系。比如,我们想知道"如果购买了产品A和产品B,那么会购买产品C":
|WITH 两产品组合 AS ( SELECT o1.订单ID, o1.产品名称 AS 产品A, o2.产品名称 AS 产品B FROM 订单详情测试表 o1 INNER JOIN 订单详情测试表 o2 ON o1.订单ID = o2.订单ID AND o1.产品名称 < o2.产品名称 ), 三产品规则 AS ( SELECT c.产品A, c.产品B, o.产品名称 AS 产品C, COUNT(DISTINCT c.订单ID) AS 规则出现次数 FROM 两产品组合 c INNER JOIN 订单详情测试表 o ON c.订单ID = o.订单ID AND o.产品名称 NOT IN (c.产品A, c.产品B) GROUP BY c.产品A, c.产品B, o.产品名称 HAVING COUNT(DISTINCT c.订单ID) >= 2 -- 至少出现2次 ), 两产品订单数 AS ( SELECT o1.产品名称 AS 产品A, o2.产品名称 AS 产品B, COUNT(DISTINCT o1.订单ID) AS 订单数 FROM 订单详情测试表 o1 INNER JOIN 订单详情测试表 o2 ON o1.订单ID = o2.订单ID AND o1.产品名称 < o2.产品名称 GROUP BY o1.产品名称, o2.产品名称 ) SELECT r.产品A, r.产品B, r.产品C, r.规则出现次数, t.订单数 AS 前件订单数, ROUND(r.规则出现次数 * 100.0 / t.订单数, 2) AS 置信度百分比 FROM 三产品规则 r INNER JOIN 两产品订单数 t ON r.产品A = t.产品A AND r.产品B = t.产品B ORDER BY 置信度百分比 DESC;
这个查询分析三产品组合的关联规则。从结果中,我们能够发现更复杂的关联模式,比如"如果购买了牛奶和面包,那么很可能会购买鸡蛋"。这种规则对于产品推荐和交叉销售非常有用。
假设我们使用上面的测试数据执行这个查询,可能会得到类似下面的结果:
从这个结果可以看出,当客户同时购买面包和黄油时,有100%的概率会购买果酱。虽然这个规则的支持度不高(只出现了1次),但置信度非常高,说明这个组合具有很强的关联性。
在实际应用中,时间因素可能也很重要。比如,某些产品可能在特定时间段更容易一起购买。让我们分析考虑时间因素的关联规则:
|-- 假设我们有一个包含订单日期的表 WITH 产品组合时间 AS ( SELECT o1.订单ID, o1.产品名称 AS 产品A, o2.产品名称 AS 产品B, DATE_FORMAT(o1.订单日期, '%Y-%m') AS 月份 FROM 订单详情表 o1 INNER JOIN 订单详情表 o2 ON o1.订单ID =
这个查询分析不同月份的关联规则。从结果中,我们可能会发现某些产品组合在特定月份更常见,这可能与季节性、促销活动等因素有关。
假设我们有一个包含订单日期的订单详情表,执行这个查询后可能会得到类似下面的结果:
从这个结果可以看出,牛奶和面包的组合在2024年2月份出现了18次,比1月份的15次更多。这可能是因为2月份有促销活动,或者这个时间段客户更倾向于同时购买这两种产品。这种时间维度的分析能够帮助我们理解产品关联关系的季节性变化。
除了正关联(产品经常一起出现),我们还可以分析负关联(产品很少一起出现)。负关联规则同样有价值,比如,如果两个产品很少一起购买,可能是因为它们是替代品,或者客户通常只需要其中一个。
|WITH 所有产品 AS ( SELECT DISTINCT 产品名称 FROM 订单详情测试表 ), 产品组合 AS ( SELECT a.产品名称 AS 产品A, b.产品名称 AS 产品B, COUNT(DISTINCT o1.订单ID) AS 共现次数 FROM 所有产品 a CROSS JOIN 所有产品 b LEFT JOIN 订单详情测试表 o1
这个查询识别负关联规则。如果两个产品很少一起出现,或者它们的共现频率远低于预期,说明它们可能是负关联的。这种信息对于理解产品关系、优化商品陈列同样有价值。
假设我们使用上面的测试数据执行这个查询,可能会得到类似下面的结果:
从这个结果可以看出,牛奶和黄油从未在同一订单中出现过,虽然它们各自都有一定的订单数(牛奶3次,黄油2次),但它们的共现次数为0。实际支持度为0%,而期望支持度为24%,说明这两个产品之间存在明显的负关联关系。这可能意味着它们是替代品,或者客户通常只需要其中一个。
这节课我们简单理解了“如果……那么……”这种数据关联关系的本质,还会用SQL高效地进行支持度、置信度、提升度等指标的计算和挖掘复杂的多产品关系,包括正关联和负关联以及时间维度分析。
实际应用中,我们要特别关注数据时间范围和质量,谨记关联不等于因果。在下一节课,我们探索SQL中的数据挖掘模型,学习如何借助SQL实现基础的预测与分类任务,理解它在数据挖掘中的能力和边界。