數據挖掘入門系列教程(一)之親和性分析


數據挖掘入門系列教程(一)之親和性分析

教程系列簡介

系列地址:https://www.cnblogs.com/xiaohuiduan/category/1661541.html

該教程為入門教程,為博主學習數據挖掘的學習路徑步驟。教程為入門教程,從最簡單的開始。使用的編程語言為Python3.8.1,使用JupyterNotebook作為開發環境(使不使用JupyterNotebook都沒有關系)。

在學習本教程之前,你需要:

  • 有一點python編程基礎
  • 會用百度 or 谷歌
  • 數學知識還是要一點的(但是要多少呢?我也不知道,我也是剛開始學)

什么是數據挖掘, 相信點擊進入這篇博客的人都應該知道了吧。通俗的說就是挖掘數據所蘊含的含義,尋找數據之間的關系。

下面將以最簡單的親和性分析來開始吧。

親和性分析

相信大家都聽說過一個例子:

在美國的零售業有着這樣一個傳奇故事,沃爾瑪百貨將他們的紙尿褲和啤酒並排擺在一起銷售,結果紙尿褲和啤酒的銷量雙雙增長!

什么是親和性分析呢?親和性分析根據樣本個體之間的關系,確定它們關系的親疏。舉一個簡單的應用:顧客去超市買了一個蘋果,那么他會不會很大的可能性去買香蕉呢?

首先,我們得有一個數據集:

這個是一個很簡單的商品交易數據集,簡單到它只有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]))

結果如下圖所示:


項目地址:github

參考書籍:Python數據挖掘入門與實踐


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM