Python_数据分析_关联规则和王者荣耀数据分析实战关联规则王者荣耀数据分析实战
作者:互联网
如果同学不喜欢看理论,可以直接看后面王者数据分析的部分。
关联规则
-
如果不知道尿布和啤酒问题,建议 百度百科 ,先有个大致的了解
-
我们找百度百科上面的例子来讲一下
-
tid是交易单号,后面每一纵列中1代表购买,0代表没买。
-
-
我们只需要明白
-
-
-
支持度==概率(只有这个支持度足够大,说明我们选出的集合买的人多,对于商家的价值也就越大)
-
置信度==条件概率(这是算关联程度的)
-
-
关联规则挖掘过程主要包含两个阶段:第一阶段必须先从资料集合中找出所有的高频项目组(Frequent Itemsets),第二阶段再由这些高频项目组中产生关联规则(Association Rules),这里我们说说apriori算法。
-
Apriori算法分为两部分
-
我们要算出符合支持度>0.4的集合
-
一开始我们的集合1列有 个成员,我们可以看到羽毛球小于支持度0.4,所以跟他有关的我们的直接舍去
-
集合2列 个我们同样得出支持度。
-
我们要算出里面符合置信度的。这里只有2项
-
网球拍=>网球,置信度3/5
-
网球=>网球拍,置信度3/4
-
也就数说网球拍=>网球,网球=>网球拍,这两个规则都满足要求
-
这里我们提一下: 转自
-
Apriori原理:如果某个项集是频繁的,那么它的所有子集也是频繁的。该定理的逆反定理为:如果某一个项集是非频繁的,那么它的所有超集(包含该集合的集合)也是非频繁的。Apriori原理的出现,可以在得知某些项集是非频繁之后,不需要计算该集合的超集,有效地避免项集数目的指数增长,从而在合理时间内计算出频繁项集。
-
在图中,已知阴影项集{2,3}是非频繁的。利用这个知识,我们就知道项集{0,2,3},{1,2,3}以及{0,1,2,3}也是非频繁的。也就是说,一旦计算出了{2,3}的支持度,知道它是非频繁的后,就可以紧接着排除{0,2,3}、{1,2,3}和{0,1,2,3}。
-
-
代码如下
-
-
如果我们计算组合直接调用 apriori(dataSet, min_support=0.5),修改dateset和min_support就行。
-
当然如果我们需要置信度和支持度和提升度,就需要arules(dataSet, min_support=0.5)
-
先说下什么叫 提升度 :
-
提升度表示含有X的条件下,同时含有Y的概率,与只看Y发生的概率之比。提升度反映了关联规则中的X与Y的相关性,提升度>1且越高表明正相关性越高,提升度<1且越低表明负相关性越高,提升度=1表明没有相关性,即相互独立。
Lift(X→Y) = P(Y|X) / P(Y)
2. arules函数会返回rules|support|confidence|lift。最后直接通过DataFrame的方法提取符合条件的组合就行。
import itertools
import pandas as pd
def createC1(dataSet): # 'C1' for Candidate-itemset of 1 item.“C1”表示1个项目的候选项集
# Flatten the dataSet, leave unique item 展平数据集,保留唯一项
C1 = set(itertools.chain(*dataSet))
# Transform to a list of frozenset 转换为冻结集列表
return [frozenset([i]) for i in C1]
# 计算集合的支持度
def scanD(dataSet, Ck, min_support): # 'Ck' for Candidate-set of k items. k项候选集的“Ck”
support = {}
# Calculate the support of all itemsets 计算所有项集的支持
for i in dataSet:
for j in Ck:
if j.issubset(i):
support[j] = support.get(j, 0) + 1
n = len(dataSet)
# Return litemset with support
return {k: v/n for k, v in support.items() if v/n >= min_support}
def aprioriGen(Lk): # 'Lk' for Large-itemset of k items. “Lk”表示k个项目的大项目集
# Generate candidate k+1 itemset from litemset 从litemset生成候选k+1项集
lenLk = len(Lk)
k = len(Lk[0])
if lenLk > 1 and k > 0:
return set([
Lk[i].union(Lk[j])
for i in range(lenLk - 1)
for j in range(i + 1, lenLk)
if len(Lk[i] | Lk[j]) == k +1
]) # Use set() to drop duplicates
def apriori(dataSet, min_support=0.5):
'''
Return all large itemsets
'''
C1 = createC1(dataSet)
L1 = scanD(dataSet, C1, min_support)
L = [L1, ] # Large-itemsets
k = 2
while len(L[k-2]) > 1:
Ck = aprioriGen(list(L[k-2].keys()))
Lk = scanD(dataSet, Ck, min_support)
if len(Lk) > 0:
L.append(Lk)
k += 1
else:
break
# Flatten the freqSets 展平频率集
d = {}
for Lk in L:
d.update(Lk)
return d
def rulesGen(iterable):
# Generate nonvoid proper subset of litemset. 生成litemset的非空真子集
subSet = []
for i in range(1, len(iterable)):
subSet.extend(itertools.combinations(iterable, i))
return [(frozenset(lhs), frozenset(iterable.difference(lhs)))
for lhs in subSet] # Left hand rule and right hand rule 左手定则和右手定则
def arules(dataSet, min_support=0.5):
'''
Return a pandas.DataFrame of 'rules|support|confidence|lift'
'''
# Generate a dict of 'large-itemset: support' pairs
L = apriori(dataSet, min_support)
# Generate candidate rules
rules = []
for Lk in L.keys():
if len(Lk) > 1:
rules.extend(rulesGen(Lk))
# Calculate support、confidence、lift
scl = [] # 'scl' for 'Support, Confidence and Lift'
for rule in rules:
lhs = rule[0]; rhs = rule[1]
support = L[lhs | rhs]
confidence = support / L[lhs]
lift = confidence / L[rhs]
scl.append({'LHS':lhs, 'RHS':rhs, 'support':support, 'confidence':confidence, 'lift':lift})
return pd.DataFrame(scl)
if __name__ == '__main__':
transactions = pd.read_csv("./Transactions.csv")
baskets = transactions['Model'].groupby(transactions['OrderNumber']).apply(list)
# 为了满足arules函数的变量,将其转化为嵌套的列表。
dataSet = baskets.tolist()
rules = arules(dataSet, min_support=0.02)
conf = rules[(rules.confidence > 0.5) & (rules.lift > 1)]
# print(conf.sort_values(by = 'support', ascending=True).head())
else:
print ('apriori imported!')
[/code]
* * *
# 王者荣耀数据分析实战
1. 如果知道ban/pick的同学,任何一款imba类的游戏都有自己的英雄搭配。随着比赛战队的不同和英雄属性的调整,英雄的搭配也就不同了。如果我们考虑不同战队的ban或者以选代ban,那数据就太少了。因为要排除版本更替带来的影响,我们选取了2018年冬冠EDG.M的战绩分析。
2. 首先我们要先去找数据,如果你会爬虫,可以直接爬。 [ 数据地址 ](https://datamore.qq.com/project/wzmatch/dist/index.html#/team/menu/complex?team_id=26) 。也可以用开发者模式(如果你有兴趣)。 ![](https://www.icode9.com/i/ll/?i=2020021117023164.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MTI1OTA4,size_16,color_FFFFFF,t_70)
3. 经过一些数据清洗,这些我就不介绍了,爬下来的数据一般都很乱,不会写代码还要手动处理。可以看到有很多无用信息。 ![](https://www.icode9.com/i/ll/?i=20200211170615273.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MTI1OTA4,size_16,color_FFFFFF,t_70)
4. 最后搞成只有英雄就行。 ![](https://www.icode9.com/i/ll/?i=20200211170737702.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MTI1OTA4,size_16,color_FFFFFF,t_70)
5. 下面就简单了,直接调用我上面给的函数
[code] import pandas as pd
import numpy as np
import sys
sys.path.append(r'../apriori')
# python 原有apriori.py 文件故需要少些最后一个字母
import aprior
csv = pd.read_csv("edg1.csv")
content_list = csv['op_pick']
with open('op_pick1.csv','a') as f:
for content in content_list:
f.write(content)
f.write('\n')
dataset = pd.read_csv('op_pick1.csv')
data = np.array(dataset).reshape(-1, 5)
print(aprior.apriori(data,min_support = 0.09))
我取最后两个组合,对此王者官网确定,确定(154,花木兰),(199,公孙离),(162,鸟人),(134,达摩)
# 这次的数据较少,只体现了edg在2018冬季冠军杯最喜欢的两队组合是(花木兰,公孙离)和(达摩,娜可露露)。也就是当时初晨(打野)和阿澈(下单)的组合较为稳定。
如果大家有兴趣可以自己试一试。
参考:
Python机器学习算法 — 关联规则(Apriori、FP-growth) : https://www.cnblogs.com/lsqin/p/9342926.html
百度百科: https://baike.baidu.com/item/%E5%85%B3%E8%81%94%E8%A7%84%E5%88%99/6319603?fr=aladdin
标签:数据分析,王者,min,rules,support,荣耀,Lk,dataSet,csv 来源: https://www.cnblogs.com/gc2770/p/14950275.html