提示:如何将Apriori算法落地,以“分析公众号推送案例”为例,在订阅号的场景下,可以将用户在一天内看的所有文章当作是用户的一次阅读行为进行分析。
如何使用Apriori算法进行简单的数据关系挖掘(附代码操作流程)
前言
总目标:基于关联分析,对阅读行为进行分析
目标1:获取可以进行关联分析的用户数据
目标2:确定最小支持度,最小置信度
目标3:调用apriori()函数,获取强关联规则
目标1:获取可以进行关联分析的用户数据
(1)清洗数据:清洗缺失值、重复值、异常值
(2)整理数据:删除无关数据,整理阅读事务
(3)关键步骤:提取数据、数据去重、数据转换、分组聚合
import pandas as pd
user_data = pd.read_csv('./公众号用户访问数据.csv',encoding = 'utf - 8')
user_data.head(100) # 同一个用户在同一天阅读的所有文章我记做 1 次阅读
# 我们分析文章类型之间的联系
# 用户编号:ID账号;文章类别:某次阅读的文章类型;阅读数:文章阅读数;看一看:用户点击该文章“在看”的人数;访问日期:用户阅读的文章日期
第一步
# 提取列数据('用户编号', '文章类别', '访问日期'),并进行赋值
analysis_data = user_data[['用户编号', '文章类别', '访问日期']]
# 查看提取的数据
analysis_data
analysis_data.info()
第二步
# 查看提取数据后的重复数据
analysis_data.duplicated()
analysis_data[analysis_data.duplicated()]
# 去除重复数据
analysis_data = analysis_data.drop_duplicates()
analysis_data.info()
第三步
# 定义函数,将数据类型转换成列表
def conversion_data(category):
# 判断文章类别是否已经转成了列表格式
if str(category)[0] == '[':
# 直接返回文章类别
return category
# 返回转成列表格式后的文章类别
return [category]
# 获取'文章类别'列,调用 agg() 方法
analysis_data['文章类别'] = analysis_data['文章类别'].agg(conversion_data)
# 查看处理后的数据
analysis_data['文章类别']
analysis_data
第四步:分组聚合
# 根据'访问日期'和'用户编号'进行分组,并聚合'文章类别'列
adjusted_data = analysis_data.groupby(['访问日期', '用户编号']).sum()
# 查看整理后的数据
adjusted_data['文章类别']
# type(adjusted_data)
目标2:数据分析:确认最小支持度和最小置信度
目标3:调用apriori()函数,获取强关联规则
导入 apyori 模块下的 apriori() 函数
from apyori import apriori
# 提取'文章类别'列数据,调用 apriori() 函数,设置最小支持度为 0.1 ,使用默认最小置信度
results = apriori(adjusted_data['文章类别'], min_support = 0.1)
# 遍历结果数据
for result in results:
# 获取支持度,并保留 3 位小数
support = round(result.support, 3)
# 遍历ordered_statistics对象
for rule in result.ordered_statistics:
# 获取前件和后件并转成列表
head_set = list(rule.items_base)
tail_set = list(rule.items_add)
# 跳过前件为空的数据
if head_set == []:
continue
# 将前件、后件拼接成关联规则的形式
related_catogory = str(head_set) + '→' + str(tail_set)
# 提取置信度,并保留 3 位小数
confidence = round(rule.confidence, 3)
# 提取提升度,并保留 3 位小数
lift = round(rule.lift, 3)
# 查看强关联规则,支持度,置信度,提升度
print(related_catogory, support, confidence, lift)
提取关联规则置信度
# 设置空的置信度列表
confidences_list = []
# 调用 apriori() 函数,生成关联规则
results = apriori(adjusted_data['文章类别'], min_support=0.1)
# 遍历统计列表中的关联规则,提取置信度
for result in results:
for rule in result.ordered_statistics:
# 获取前件并转成列表
head_set = list(rule.items_base)
# 跳过前件为空的数据
if head_set == []:
continue
# 提取置信度,并保留 3 位小数
confidence = round(rule.confidence, 3)
# 将置信度写入置信度列表
confidences_list.append(confidence)
# 查看置信度列表
confidences_list
查看置信度列表的描述性统计信息
s = pd.Series(confidences_list)
s.describe()
s.sort_values()# 对关联规则的置信度的 Series 数据进行排序
# 提取'文章类别'列数据,调用 apriori() 函数,设置最小支持度为 0.1 ,设置最小置信度 0.3
results = apriori(adjusted_data['文章类别'], min_support=0.1)
# 创建空列表,存储关联规则列表,形成嵌套列表
extract_result = []
for result in results:
# 获取支持度,并保留 3 位小数
support = round(result.support, 3)
# 遍历ordered_statistics对象
for rule in result.ordered_statistics:
# 获取前件和后件并转成列表
head_set = list(rule.items_base)
tail_set = list(rule.items_add)
# 跳过前件为空的数据
if head_set == []:
continue
# 将前件、后件拼接成关联规则的形式
related_catogory = str(head_set) + '→' + str(tail_set)
# 提取置信度,并保留 3 位小数
confidence = round(rule.confidence, 3)
# 提取提升度,并保留 3 位小数
lift = round(rule.lift, 3)
# 将提取的数据保存到提取列表中
extract_result.append([related_catogory, support, confidence, lift])
result
extract_result
# 将数据转成 DataFrame 的形式
rules_data = pd.DataFrame(extract_result, columns=['关联规则', '支持度', '置信度', '提升度'])
rules_data
# 将数据按照“支持度”排序
sorted_by_support = rules_data.sort_values(by = '支持度')
# 查看排序后的数据
sorted_by_support
# 提取出提升度大于 1 的数据,并重置数据的索引
promoted_rules = sorted_by_support[sorted_by_support['提升度'] > 1].reset_index(drop=True)
promoted_rules
# 提取出提升度小于 1 的数据,并重置数据的索引
restrain_rules = sorted_by_support[sorted_by_support['提升度'] < 1].reset_index(drop = True)
restrain_rules
数据展现
# 绘制提升度、置信度双柱状图
# 设置画布尺寸
plt.figure(figsize=(10, 8))
# 设置横纵坐标以及柱子的宽度
width = 0.2
# 画出柱状图
plt.bar(promoted_rules.index-width/2, promoted_rules['支持度'], width=width)
plt.bar(promoted_rules.index+width/2, promoted_rules['置信度'], width=width)
# 设置图例
plt.legend(['支持度', '置信度'], fontsize=20)
# 设置标题
plt.title('促进关系的关联规则的支持度、置信度', fontsize=25)
# 设置刻度名称
plt.xticks(promoted_rules.index, promoted_rules['关联规则'], fontsize=15)
# 设置坐标轴标签
plt.xlabel('关联规则', fontsize=20)
plt.ylabel('数值', fontsize=20)
总结
本文数据均为模拟数据,小伙伴可自行下载。链接:https://pan.baidu.com/s/15zReW0m7abj86qBBhxAArw
提取码:xzyw