天池比赛——产品关联分析
目录
前言
数据挖掘的入门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链接