关联分析:
通过寻找最能够解释数据变量之间的关系的规则,来找出大量多元数据集中有用的关联规则,它是从大量数据中发现多种数据之间关系的一种方法。
常见算法:
Apriori、FP-Growth、PrefixSpan、SPADE、ApriooriAll、AprioriSome等
应用:
购物篮分析、捆绑销售、库存管理、商品促销设计、页面促销设计、货架设计、商品陈列设计、页面内容排版、推荐系统、商品价格策略和基于购买的用户特征分析等。
案例——使用python实现商品交叉销售分析
基本场景
业务部门希望数据部门能对用户购买数据做分析,从而得到用户的商品频繁模式,以此来帮助业务部门根据的频繁模式,做相应的打包销售或产品组合销售。
实现方法
基于自定义开发的Apriori关联算法库,导入python环境中挖掘关联模式
代码
part 1 导入库
import pandas as pd
import apriori
part 2 定义数据文件
data = pd.read_csv('order_table.csv')
转换为关联所用的记录模式。
由于导入的是事务性的数据记录,这里转换为关联算法所需的记录,记录的格式为每个订单ID对应的商品合并为一条记录。
order_ids = pd.unique(data['order_id'])
order_records = [data[data['order_id'] == each_id]['product_name'].tolist() for each_id in order_ids]
part 3 调用自定义的apriori做关联分析
minS = 0.01 #定义最小支持度阈值
minC = 0.05 #定义最小置信度阈值
L, suppData = apriori.apriori(order_records, minSupport=minS) #计算得到满足最小支持度的规则
rules = apriori.generateRules(order_records, L, suppData, minConf=minC) #计算得到满足最小置信度的规则
步骤:
第一步,通过定义好的最小支持度查找频繁项集
第二步,通过最小置信度查找满足条件的规则
part 4 关联结果报表评估
先输出数据集记录以及满足阈值定义的规则数量,再将规则转换为数据框,并用sort_values方法提升度排序,使用head()展示前十条记录。
model_summary = 'data record: {1} \nassociation rules count : {0}'
print(model_summary.format(len(rules), len(order_records)), '\n', '-'*60)
rules_all = pd.DataFrame(rules, columns=['item1', 'item2', 'instance', 'support', 'confidence', 'lift'])
rules_sort = rules_all.sort_values(['lift'], ascending=False)
rules_sort.head(10)
#输出结果
data record: 2240
association rules count : 582
------------------------------------------------------------
part 5 关联分析结果展示
导入库
from pyecharts.charts.basic_charts.graph import Graph
from pyecharts import options as opts
选择有效数据
rules_sort_filt = rules_sort[rules_sort['lift']>1]
display_data = rules_sort_filt.iloc[:,:3]
汇总每个item出现次数
item1 = display_data[['item1', 'instance']].rename(index=str, columns={"item1":"item"})
item2 = display_data[['item2', 'instance']].rename(index=str, columns={"item2":"item"})
item_concat = pd.concat((item1, item2),axis=0)
item_count = item_concat.groupby(['item'])['instance'].sum()
取出规则最多的TOP N items
control_num = 10
top_n_rules = item_count.sort_values(ascending=False).iloc[:control_num]
top_n_items = top_n_rules.index
top_rule_list = [all((item1 in top_n_items, item2 in top_n_items)) for item1, item2 in zip(display_data['item1'], display_data['item2'])]
top_display_data = display_data[top_rule_list]
画图
node_data = top_n_rules/100
nodes = [{"name": ('').join(i[0]), "symbolSize": i[1], "value": j} for i,j in zip(node_data.to_dict().items(), item_count)]
#创建边数据以及边权重数据
edges = [{"source": ('').join(i), "target": ('').join(j), "value": k} for i,j,k in top_display_data.values]
#创建关系图
graph = Graph(init_opts=opts.InitOpts(width="800px", height="800px"))
graph.add("", nodes, edges, repulsion=8000,layout="circular",is_rotate_label=True)
graph.set_global_opts(title_opts=opts.TitleOpts(title="商品关联结果图"))
graph.render_notebook()
结果图显示了每个Item之间的关联关系,标记点越大的item产生的关联规则越多。