Python_数据分析_关联规则和王者荣耀数据分析实战关联规则王者荣耀数据分析实战

如果同学不喜欢看理论,可以直接看后面王者数据分析的部分。

关联规则

  1. 如果不知道尿布和啤酒问题,建议 百度百科 ,先有个大致的了解

  2. 我们找百度百科上面的例子来讲一下

    1. tid是交易单号,后面每一纵列中1代表购买,0代表没买。

      1. Python_数据分析_关联规则和王者荣耀数据分析实战关联规则王者荣耀数据分析实战

        1. 我们只需要明白

    2. 支持度==概率(只有这个支持度足够大,说明我们选出的集合买的人多,对于商家的价值也就越大)

    3. 置信度==条件概率(这是算关联程度的)

  3. 关联规则挖掘过程主要包含两个阶段:第一阶段必须先从资料集合中找出所有的高频项目组(Frequent Itemsets),第二阶段再由这些高频项目组中产生关联规则(Association Rules),这里我们说说apriori算法。

    1. Apriori算法分为两部分

    2. 我们要算出符合支持度>0.4的集合

    3. 一开始我们的集合1列有 Python_数据分析_关联规则和王者荣耀数据分析实战关联规则王者荣耀数据分析实战 个成员,我们可以看到羽毛球小于支持度0.4,所以跟他有关的我们的直接舍去

    4. 集合2列 Python_数据分析_关联规则和王者荣耀数据分析实战关联规则王者荣耀数据分析实战 个我们同样得出支持度。

    5. Python_数据分析_关联规则和王者荣耀数据分析实战关联规则王者荣耀数据分析实战

    6. 我们要算出里面符合置信度的。这里只有2项

    7. 网球拍=>网球,置信度3/5

    8. 网球=>网球拍,置信度3/4

    9. 也就数说网球拍=>网球,网球=>网球拍,这两个规则都满足要求

    10. 这里我们提一下: 转自

    11. Apriori原理:如果某个项集是频繁的,那么它的所有子集也是频繁的。该定理的逆反定理为:如果某一个项集是非频繁的,那么它的所有超集(包含该集合的集合)也是非频繁的。Apriori原理的出现,可以在得知某些项集是非频繁之后,不需要计算该集合的超集,有效地避免项集数目的指数增长,从而在合理时间内计算出频繁项集。

    12. 在图中,已知阴影项集{2,3}是非频繁的。利用这个知识,我们就知道项集{0,2,3},{1,2,3}以及{0,1,2,3}也是非频繁的。也就是说,一旦计算出了{2,3}的支持度,知道它是非频繁的后,就可以紧接着排除{0,2,3}、{1,2,3}和{0,1,2,3}。

    13. Python_数据分析_关联规则和王者荣耀数据分析实战关联规则王者荣耀数据分析实战

      1. 代码如下

    14. 如果我们计算组合直接调用 apriori(dataSet, min_support=0.5),修改dateset和min_support就行。

    15. 当然如果我们需要置信度和支持度和提升度,就需要arules(dataSet, min_support=0.5)

    16. 先说下什么叫 提升度

提升度表示含有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

 

上一篇:Kibana:Elasticsearch的窗口工具学习分享(Mac亲测有效)


下一篇:从github上往AndroidStudio中clone项目时遇到的问题