Apriori算法实例——产品关联分析

天池比赛——产品关联分析

目录

天池——Apriori算法产品关联分析

前言

一、基础数据处理

读取数据,查看数据基本情况

计算频繁项集和关联规则

总结


前言

数据挖掘的入门Apriori算法的练习。

数据挖掘-Apriori算法这篇文章对这个算法讲的挺好,而且这个算法整体比较简单也容易理解。使用这个算法,我就直接调用efficient_apriori这个包实现了

这个比赛给了四个csv文件,稍微分析一下,就知道其实只有order这个csv文件是我们需要处理的

题目要求:使用关联分析(比如Apriori算法) 挖掘订单中的频繁项集及关联规则


一、基础数据处理

我们基本只要处理order这个csv文件就好了

读取数据,查看数据基本情况

import pandas as pd
from efficient_apriori import apriori  #apriori
from pylab import *
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 读取数据
df_customer = pd.read_csv('customer.csv', encoding='gbk')
df_date = pd.read_csv('date.csv', encoding='gbk')
df_order = pd.read_csv('order.csv', encoding='gbk')
df_product = pd.read_csv('product.csv', encoding='gbk')
df_order.head()

 查看一下有没有缺陷

# 无缺省值
df_order.isnull().sum()

"""
订单日期      0
年份        0
订单数量      0
产品ID      0
客户ID      0
交易类型      0
销售区域ID    0
销售大区      0
国家        0
区域        0
产品类别      0
产品型号名称    0
产品名称      0
产品成本      0
利润        0
单价        0
销售金额      0
dtype: int64
"""

计算频繁项集和关联规则

而我们如果要找频繁项集及关联规则其实主要分析客户ID,订单日期和产品名称几列就好了。

我们使用groupby将我们关心的分组即可

# 整合购买信息
df_g1 = df_order.groupby(['客户ID', '订单日期'])['产品名称'].unique()

transactions = []
for value in df_g1:
    transactions.append(list(value))
print(transactions[0:5])

得到整合后的信息

[['软式棒球'], ['垒球', '棒球服', '头盔', '棒球手套'], ['三角网架', '软式棒球'], ['软式棒球'], ['球棒与球棒袋', '软式棒球', '三角网架', '帽子', '棒球服']]

 我们只需要把这个list送入efficient_apriori包中的apriori就可以得到频繁项集和关联规则了,当然还需要我们根据数据集规定一下最小支持度和置信度。

itemsets, rules = apriori(transactions, min_support=0.035, min_confidence=0.2)

处理一下结果并做可视化

itemsets_product = []
itemsets_number = []
itemsets_str_product = []
# 只分析两个以上的商品情况
for key in itemsets.keys():
    if(key >=2 ):
        for value in itemsets[key]:
            itemsets_product.append(value)
            itemsets_number.append(itemsets[key][value])
        
#print(itemsets_product)
for value in itemsets_product:
    itemsets_str_product.append('和'.join(value))

  

 可以得到一些结论,如买头盔大概率会购买棒球手套等结论,可以通过查看rule来看详细信息

{棒球手套} -> {头盔} (conf: 0.281, supp: 0.100, lift: 1.206, conv: 1.067)
{头盔} -> {棒球手套} (conf: 0.430, supp: 0.100, lift: 1.206, conv: 1.129)
{球棒与球棒袋} -> {头盔} (conf: 0.252, supp: 0.044, lift: 1.082, conv: 1.026)
{头盔} -> {硬式棒球} (conf: 0.210, supp: 0.049, lift: 0.719, conv: 0.896)
{球棒与球棒袋} -> {硬式棒球} (conf: 0.207, supp: 0.036, lift: 0.708, conv: 0.892)

其他探索

除了对产品关联的探索,其实还可以探索国家和购买地区对不同商品的购买情况等,这种简单做个透视表就可以直观的看到效果

df_country_pivot_table = df_order.pivot_table(index=['产品名称'], columns='国家', values='订单数量',fill_value=0, dropna=True, aggfunc=np.count_nonzero)
# 查看国家和对应购买物体信息
df_country_pivot_table.plot.bar()
plt.title('不同物品在不同国家购买情况')
plt.show()

总结

notebook也分享在天池上了notebook链接 

猜你喜欢

转载自blog.csdn.net/lzzzzzzm/article/details/122498716
今日推荐