产品关联分析——数据挖掘
·
基于阿里天池算法大赛-天池大赛-阿里云的赛制日常学习赛【教学赛】——产品关联分析。赛题以购物篮分析为背景,要求选手对品牌的历史订单数据,挖掘频繁项集与关联规则。通过这道赛题,鼓励学习者利用订单数据,为企业提供销售策略,产品关联组合,为企业提升销量的同时,也为消费者提供更适合的商品推荐。
我们将介绍以关联规则为基础的方案,对品牌订单数据分析。
1.数据预处理
数据有很多个表,只有order表是我们需要的。我们的目标是挖掘出每个客户在这一天购买产品的情况(相当于一张小票),看看这些产品之间的联系,我们用apriori算法去分析出规则。
导入数据,查看缺失,异常处理。将订单日期(int64)转换成(datetime64[ns])
df_order['订单日期'] = pd.to_datetime(df_order['订单日期'])
我们通过使用groupby对每个客户的购买情况进行挖掘。
order_series = df_order.groupby(["客户ID","订单日期"])["产品名称"].unique()

先对"客户ID","订单日期"分类;再对"产品名称"分组并取unique值(唯一值)。
最后我们要把它放到一个列表里。
order_list = []
for i in order_series:
order_list.append(list(i))
order_list
因为apriori算法要求数据为(0/1),(True/False)值;所以我们对其标准化,变成array数组后,再转换成dateframe。
te = TransactionEncoder()
te_ary = te.fit(order_list).transform(order_list)
df2 = pd.DataFrame(te_ary,columns=te.columns_)

这样,基本的数据我们就准备好了。
2.apriori算法
我们要在每一次订单中,找出频繁项集(大于最小支持度),通过一项集—>二项集—>多项集;在频繁项集中找规则(大于最小置信度)。
frequent_itemsets = apriori2(df2,min_support=0.03,use_colnames=True)
rules = association_rules(frequent_itemsets,metric='lift',min_threshold=0.5)
frequent_itemsets.sort_values('support',ascending=False)

rules.sort_values('confidence',ascending=False)

3.可视化分析
我们对项集进行柱状图可视化。
start = time.time()
itemsets,rules = apriori(order_list,min_support=0.02,min_confidence=0.4)
print("频繁项集: ",itemsets)
print("关联规则: ",rules)
end = time.time()
print("总用时: ",end-start)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
items_prod = []
items_num = []
for key in itemsets.keys(): # [1,2] 表示含有一项集,二项集
df1 = itemsets[key]
for i in df1:
items_prod.append(i)
items_num.append(df1[i])
items_prod_str = []
for j in items_prod:
items_prod_str.append(','.join(list(j)))
plt.figure(figsize=(8,6),dpi=100)
plt.bar(items_prod_str,items_num)
plt.xlabel('频繁项集-产品名称',fontsize = 10)
plt.ylabel('频繁项集-频数',fontsize = 10)
plt.title('频繁项集频数分布柱状图',fontsize = 10)
plt.xticks(rotation = 90,fontsize = 10)
for a,b in zip(items_prod_str,items_num):
plt.text(a, b + 0.005, str(b), ha='center', va='bottom', fontsize=7)
plt.show()

更多推荐
所有评论(0)