Python数据挖掘入门与实践–亲和性分析

说明

这段时间时间找了好多关于数据挖掘方向的数据,不过这些书籍大都偏向理论,看起来也比较枯燥乏味,碰巧今天找到了这本《Python数据挖掘入门与实践》,入门级别,刚好适合我这种爱代码不爱理论的人,从今天开始正式学习数据挖掘。
博客中展示的大部分代码都是按照书中的内容编写出来,有些地方会按照自己的思路有一小部分的改动

亲和性分析定义

亲和性分析根据样本个体(物体)之间的相似度,确定他它们关系的亲疏

亲和性分析之商品推荐

这部分内容是通过超市的商品服务的数据集,使得通过商品推荐例子希望得到如下规则:
如果一个人购买了商品X,那么他很有可能购买商品Y

1、在Numpy中加载数据集
import numpy as np
dataset_filename="affinity_dataset.txt"
X=np.loadtxt(dataset_filename)

加载完成后我们可以用如下代码查看

print(X[:5])

运行结果如下,图中1表示顾客购买了该商品,0表示未购买该商品

Python数据分析与挖掘实战第二版 python数据分析与挖掘案例_数据挖掘

n_samples,n_features=X.shape     # 记录数据范围
features=["bread","milk","cheese","apples","bananas"] 
#features 表示的是每列数据表示的商品
2、实现简单的排序规则

首先我们需要了解两个基本概念
支持度:指数据集中规则应验的次数。
置信度:衡量规则的准确率。
规则的优劣有多种衡量方法,常用的是支持度和置信度
如下的代码是展示如何求“如果顾客购买了苹果,他们也会国脉香蕉” 的支持度和可信度
数据中第三列表示是否购买苹果

num_apple_purchases=0
for sample in X:
    if sample[3]==1:
        num_apple_purchases+=1
print("{0} people bought Apples".format(num_apple_purchases))

运行结果显示26人购买苹果

接下来的代码展示计算所有规则的置信度
from collections import defaultdict
valid_rules=defaultdict(int)
invalid_rules=defaultdict(int)
num_occurances=defaultdict(int)
# 计算过程使用循环结构对样本的每个特征值进行处理
for sample in X:
    for premise in range(n_features):
        if sample[premise]==0:    #判断是否满足条件
            continue
        num_occurances[premise]+=1
        for conclusion in range(n_features):  #如果对应的规则应验,键为条件,规则的的元组加一
        #反之违反规则加一
            if premise==conclusion:
                continue
            if sample[conclusion]==1:
                valid_rules[(premise,conclusion)]+=1
            else:
                invalid_rules[(premise,conclusion)]+=1
support=valid_rules
confidence=defaultdict(float)
#计算每个规则对应的置信度
for premise,conclusion in valid_rules.keys():
    rule=(premise,conclusion)
    confidence[rule]=valid_rules[rule]/num_occurances[premise]

这样我们便得到了每个规则所对应的置信度和支持度
打印每个规则所对应的置信度和支持度

def print_rule(premise,conclusion,support,confidence,features):
    premise_name=features[premise]
    conclusion_name=features[conclusion]
    print("Rule: If a person buys {0} they will also buy{1}".format(premise_name,conclusion_name))
    print(" - Support: {0}".format(support[(premise,conclusion)]))
    print(" - Confidence: {0:.3f}".format(confidence[(premise,conclusion)]))

现在显示如果一个顾客购买苹果,那么他很有可能购买香蕉的置信度和支持度

premise=1
conclusion=3
print_rule(premise,conclusion,support,confidence,features)

结果如下

Python数据分析与挖掘实战第二版 python数据分析与挖掘案例_Python_02

3、找出最佳的排序规则

为了找到支持度最高的规则,首先对支持度字典进行排序

from operator import itemgetter
sorted_support=sorted(support.items(),key=itemgetter(1),reverse=True)
#按照支持度降序排序

输出支持度最高的前五条规则

for index in range(5):
    print("Rule #{0}".format(index+1))
    premise,conclusion=sorted_support[index][0]
    print_rule(premise,conclusion,support,confidence,features)

结果如下

Python数据分析与挖掘实战第二版 python数据分析与挖掘案例_Python_03


同理,查找置信度最高的前五条规则

sorted_confidence=sorted(confidence.items(),key=itemgetter(1),reverse=True)
for index in range(5):
    print("Rule #{0}".format(index+1))
    premise,conclusion=sorted_confidence[index][0]
    print_rule(premise,conclusion,support,confidence,features)

Python数据分析与挖掘实战第二版 python数据分析与挖掘案例_数据集_04

如果我是超市的老板的话,那么我肯定会按照以上规则对商品进行排序

写在最后

由于不经常用python语言,导致有时对代码的理解比较困难,也没有见过python那么多的奇技淫巧,呜呼哀哉,好好学习吧