上回已经计算出了所有规则的支持度和置信度,并存为字典,那么,这次来进行排序
数据挖掘 | 亲和性分析(一)
数据挖掘 | 亲和性分析(二)
既然统计出所有规则的支持度和置信度,那么我们就想知道到底哪一条规则是支持度或置信度最高的,以便商家分析出顾客的习惯。首先我们要给支持度和置信度字典进行排序
这里需要用到operator模块的itemgetter函数
# 对支持度字典进行排序
from operator import itemgette
# support.items()函数以列表返回可遍历的(键,值)元组,key=itemgetter(1)表示按值排序,reverse=True表示降序
sorted_support = sorted(support.items(), key=itemgetter(1), reverse=True)
在查看排序后的结果之前,先看看支持度字典未排序前的输出是怎样的
defaultdict(<class 'int'>, {(1, 2): 8, (1, 4): 20, (2, 1): 8, (2, 4): 29, (4, 1): 20, (4, 2): 29, (2, 3): 19, (3, 2): 19, (3, 4): 24, (4, 3): 24, (1, 3): 15, (3, 1): 15, (0, 1): 23, (0, 2): 4, (0, 3): 11, (0, 4): 21, (1, 0): 23, (2, 0): 4, (3, 0): 11, (4, 0): 21})
排序前转换为元组数组,输出如下
dict_items([((1, 2), 8), ((1, 4), 20), ((2, 1), 8), ((2, 4), 29), ((4, 1), 20), ((4, 2), 29), ((2, 3), 19), ((3, 2), 19), ((3, 4), 24), ((4, 3), 24), ((1, 3), 15), ((3, 1), 15), ((0, 1), 23), ((0, 2), 4), ((0, 3), 11), ((0, 4), 21), ((1, 0), 23), ((2, 0), 4), ((3, 0), 11), ((4, 0), 21)])
按键值降序排序
[((2, 4), 29), ((4, 2), 29), ((3, 4), 24), ((4, 3), 24), ((0, 1), 23), ((1, 0), 23), ((0, 4), 21), ((4, 0), 21), ((1, 4), 20), ((4, 1), 20), ((2, 3), 19), ((3, 2), 19), ((1, 3), 15), ((3, 1), 15), ((0, 3), 11), ((3, 0), 11), ((1, 2), 8), ((2, 1), 8), ((0, 2), 4), ((2, 0), 4)]
最终我们得到了经过降序排序的支持度字典啦,同样的,置信度也是相同的处理方法,这里就不再讲述
得到两个经过排序后的支持度和置信度字典后,我们就可以输出支持度和置信度排名前三的规则啦
# 输出支持度排名
for index in range(3):
print("规则排名#{0}".format(index + 1))
premise, conclusion = sorted_support[index][0]
print_rule(premise, conclusion, support, confidence, features)
输出结果:
规则排名#1
规则:如果顾客购买了奶酪,他们还会买香蕉
支持度:29
置信度:0.806
规则排名#2
规则:如果顾客购买了香蕉,他们还会买奶酪
支持度:29
置信度:0.475
规则排名#3
规则:如果顾客购买了苹果,他们还会买香蕉
支持度:24
置信度:0.615
输出置信度排名前三的规则
# 输出置信度排名
for index in range(3):
print("规则排名#{0}".format(index + 1))
premise, conclusion = sorted_confidence[index][0]
print_rule(premise, conclusion, support, confidence, features)
输出结果:
规则排名#1
规则:如果顾客购买了奶酪,他们还会买香蕉
支持度:29
置信度:0.806
规则排名#2
规则:如果顾客购买了苹果,他们还会买香蕉
支持度:24
置信度:0.615
规则排名#3
规则:如果顾客购买了面包,他们还会买牛奶
支持度:23
置信度:0.53
从结果中可以看到,顾客买了奶酪后,通常还会买香蕉,不管是支持度还是置信度都是最高的
完整代码:
#coding: utf-8
import numpy as np
# 定义数据集文件名
dataset_filename = "affinity_dataset.txt"
# 加载数据集
X = np.loadtxt(dataset_filename)
n_samples, n_features = X.shape
features = ["面包", "牛奶", "奶酪", "苹果", "香蕉"]
# 创建字典,存储规则有效数据及无效数据
from collections import defaultdict
valid_rules = defaultdict(int)
invalid_rules = defaultdict(int)
num_occurences = defaultdict(int) # 条件相同的规则数量
# 元组元素表示为(1,2),表示购买了牛奶和奶酪
for sample in X:
for premise in range(n_features):
if sample[premise] == 0: continue # 前提:购买了某一种商品
num_occurences[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_occurences[premise]
def print_rule(premise, conclusion, support,confidence, features):
premise_name = features[premise]
conclusion_name = features[conclusion]
rule = (premise, conclusion)
print("规则:如果顾客购买了{0},他们还会买{1}".format(premise_name, conclusion_name))
print("支持度:{0}".format(support[rule]))
print("置信度:{0:.3f}".format(confidence[rule]))
# 对支持度字典进行排序
from operator import itemgetter
# support.items()函数以列表返回可遍历的(键,值)元组,key=itemgetter(1)表示按值排序,reverse=True表示降序
sorted_support = sorted(support.items(), key=itemgetter(1), reverse=True)
# 对置信度字典进行排序
sorted_confidence = sorted(confidence.items(), key=itemgetter(1), reverse=True)
# 输出支持度排名
for index in range(3):
print("规则排名#{0}".format(index + 1))
premise, conclusion = sorted_support[index][0]
print_rule(premise, conclusion, support, confidence, features)
# 输出置信度排名
for index in range(3):
print("规则排名#{0}".format(index + 1))
premise, conclusion = sorted_confidence[index][0]
print_rule(premise, conclusion, support, confidence, features)
那么,亲和性分析的简单示例就到此为止了,这只是一个很简单的例子,具体的使用还得根据实际情况进行运用