基于阿里天池算法大赛-天池大赛-阿里云的赛制日常学习赛【教学赛】——产品关联分析。赛题以购物篮分析为背景,要求选手对品牌的历史订单数据,挖掘频繁项集与关联规则。通过这道赛题,鼓励学习者利用订单数据,为企业提供销售策略,产品关联组合,为企业提升销量的同时,也为消费者提供更适合的商品推荐。

我们将介绍以关联规则为基础的方案,对品牌订单数据分析。

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()

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐