1 亲和性分析

相信大家都听说过一个例子:

在美国的零售业有着这样一个传奇故事,沃尔玛百货将他们的纸尿裤和啤酒并排摆在一起销售,结果纸尿裤和啤酒的销量双双增长!

什么是亲和性分析呢?亲和性分析根据样本个体之间的关系,确定它们关系的亲疏。举一个简单的应用:顾客去超市买了一个苹果,那么他会不会很大的可能性去买香蕉呢?

首先,我们得有一个数据集:

这个是一个很简单的商品交易数据集,简单到它只有100条数据,尽管数据比较少,but我们用来学习一下还是可以的。


数据集的含义:

如果看一行的话,每一行如(0,1,0,0,1)可以代表每一条交易包含的商品,0代表没有购买,1代表购买。每一列代表一种商品。

那么我们需要找出他的什么数据含义规则呢?“如果一个顾客购买了商品A,则他很可能购买商品B”。找到这种规则很简单,找出交易数据中同时购买A商品和B商品的记录,然后与总的交易数量相比较即可。

规则有优劣,这里有两种衡量标准,支持度和置信度。(如果商品交易数据)

  • 支持度:支持度指的是数据集中规则应验的次数。(商品交易中同时买A商品和B商品的交易数量【支持度也可以为次数/交易总量】)

  • 置信度:置信度代表的是规则的准确性如何。(以例子来说,就是如果既买A商品又买B商品的数量除以买A商品的数量)

代码实现

使用的库如下:

  • numpy
  • collections

数据集在这里: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]))

结果如下图所示: https://img2018.cnblogs.com/blog/1439869/202003/1439869-20200305120434142-1183199496.png


版权声明: 本文为智客工坊「段小辉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

results matching ""

    No results matching ""