数据挖掘入门系列教程(一)之亲和性分析


百度 or 谷歌
  • 数学知识还是要一点的(但是要多少呢?我也不知道,我也是刚开始学)
  • 什么是数据挖掘, 相信点击进入这篇博客的人都应该知道了吧。通俗的说就是挖掘数据所蕴含的含义,寻找数据之间的关系。

    下面将以最简单的亲和性分析来开始吧。

    data

    首先我们需要加载数据集,数据的文件名为affinity_dataset.txt

    import numpy as np
    data_filename = "affinity_dataset.txt"
    datas = np.loadtxt(data_filename)
    # 列的属性
    features = ["面包", "牛奶", "黄油", "苹果", "香蕉蕉"]
    

    数据集我们已经加载完毕,为了得到商品A和商品B的数据,在python中也就是(商品A,商品B)元组,我们需要进行遍历,然后将数据保存下来。

    现在让我们来计算置信度。我们使用valid_rules字典来保存商品A和商品B同时存在的记录,使用invalid_rules来保存当商品A存在时,但是商品B不存在的记录。

    valid_rules = defaultdict(int)
    invalid_rules = defaultdict(int)

    我们使用defaultdict来创建字典而不是使用常用的方式是因为:


    这样的好处是即使在没有这个key的时候,它也会返回默认的值0。

    我们定义一个方法,目的是为了统计A,B之间的关系。

    # A 和 B之间的联系,返回购买A商品的数量
    def connect(indexA, indexB):
        buy_A_num = 0
        for sample in datas:
            if sample[indexA] == 0:
                continue
            buy_A_num += 1
            
            if(sample[indexB] == 1):
                valid_rules[(indexA, indexB)] += 1
            else:
                invalid_rules[(indexA, indexB)] += 1
        return buy_A_num
             

    方法,我们就可以获得需要的数据,现在我们可以计算置信度了。

    
    def get_confidence():
        confidence = defaultdict(float)
        for premise, feature in valid_rules.keys():
            rule = (premise, feature)
            confidence[rule] = valid_rules[rule] / (valid_rules[rule]+invalid_rules[rule])
            print("购买{0}后同时{1}的置信度为:{2:0.3f}".format(features[rule[0]],features[rule[1]],confidence[rule]))
        return confidence

    当然支持度怎么算,这个就太简单了,就是valid_rules里面的value除以数据总量即可,就不展示了。

    运行代码,使用for循环将所有的关系都找出来,然后计算置信度:

    if __name__ == "__main__":
        for i in range(len(features)):
            for j in range(len(features)):
                if(i == j):
                    continue
                connect(i,j)
        confidence = get_confidence()

    最后结果如下所示:


    同样我们可以对置信度进行排序,字典的items()函数返回包含字典所有元素的列表。itemgetter(1)表示以字典各元素的值(这里为置信度)作为排序依据,reverse=True表示降序排列。

    from operator import itemgetter
        sort_dict = sorted(confidence.items(),key=itemgetter(1),reverse=True)
        for index in range(5):
            rule = sort_dict[index][0]
            print("购买{0}后同时{1}的置信度为:{2:0.3f}".format(features[rule[0]],features[rule[1]],confidence[rule]))

    结果如下图所示:


    项目地址:github

    参考书籍:Python数据挖掘入门与实践