利用Python進行商品的親和性分析
本文轉載自微信公眾號「菜J學Python」,作者J哥、小屁孩i 。轉載本文請聯系菜J學Python公眾號。
大家好,我是J哥。
如今這個社會是一個數字社會,在各大領域里面最為顯著的應該是數據吧。就目前而言,大數據已經越來越流行了,我們不管在什么領域上都能接觸到數據的,并且現在很多企業已經累計了大量的數據。很多人開始朝向大數據開發以及大數據分析這兩個方向發展了。
那么也許你會問,哪這兩個方向更加值得轉行呢?很多人也在這兩個方向糾結,在這里我想告訴你們的是,沒有什么是最優選擇,你感興趣的才是最好的選擇。這邊,我選擇的是大數據分析!現在讓我們進入數據分析的一個環節——數據挖掘。
01數據挖掘簡介
數據挖掘旨在讓計算機根據已有數據做出決策。決策可以是預測明年的銷量,人口的數目,攔截垃圾郵件,檢測網站的語言。到目前為止,數據挖掘已經有很多的應用,即使這樣很多新的應用領域也在不斷出現。
數據挖掘涉及到算法,最優策略,統計學,工程學和計算機科學相關領域的知識。除此之外我們還會用到語言學,神經科學,城市規劃等其他領域的概念或知識。想要充分發揮數據挖掘的威力,算法肯定是必備的。(在這里推薦讀者去刷一刷LeetCode)
一般來說數據挖掘有這三個基本步驟:1、創建數據集。數據集能直接反應一些真實事件;2、選擇算法。選擇一個合適的算法才能更好的對數據進行處理;3、優化算法。每種數據挖掘算法都有參數,它們或是算法自身包含的,或是使用者添加的,這些參數會影響算法的具體決策。
02親和性分析案例
現在讓我們用一個例子說明。不知道你逛超市的時候,是否發現超市里面基本上都是按照商品的種類來分區域的,然而有些東西是存在例外的,一件商品的旁邊擺放著不一樣種類的商品。不知道你是否有發現這個現象,有沒有對此感到不解。這邊我想跟你說的是,這種擺放也是有道理的,這個道理是商品之間的親和性!
前置知識:
- (1)defaultdict(int):初始化為 0
- (2)defaultdict(float):初始化為 0.0
- (3)defaultdict(str):初始化為 ''
這里的defaultdict(function_factory)構建的是一個類似dictionary的對象其中keys的值,自行確定賦值,但是values的類型,是function_factory的類實例而且具有默認值。比如default(int)則創建一個類似dictionary對象里面任何的values都是int的實例,而且就算是一個不存在的key, d[key] 也有一個默認值,這個默認值是int()的默認值0。
03代碼實現
現在進行代碼部分:
- import numpy as np
- from collections import defaultdict
- dataset_filename = "affinity_dataset.txt"
- features = ["bread","milk","cheese","apple","banana"] #猜一下這個是干嘛用的
- X = np.loadtxt(dataset_filename)
- print(X[:5]) #打印前五行的購物信息
統計一下購買蘋果和香蕉的人數:
- 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))
- num_banana_purchases = 0
- for sample in X:
- if sample[4] == 1:
- num_banana_purchases += 1
- print("{0} people bought banana".format(num_banana_purchases))
現在為了計算規則的置信度還有支持度,我們可以用字典的形式來存放計算結果:
- valid_rules = defaultdict(int)
- invalid_rules = defaultdict(int)
- num_occurances = defaultdict(int)
- for sample in X:
- for premise in range(4):
- if sample[premise] ==0 :
- continue
- num_occurances[premise] +=1 #當顧客有購買物品時key對應的時value變為1
- for conclusion in range(4):
- if premise == conclusion: #訪問同一個key 的時候是沒有意義的直接跳過
- 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
- features = ["bread","milk","cheese","apple","banana"]
- print_rule(premise,conclusion,support,confidence,features)
- from operator import itemgetter
- sorted_support = sorted(support.items(),key=itemgetter(1),reverse=True)
排序完成后,就可以輸出支持度最高的前5條規則:
- for index in range(5):
- print("Rule #{0}".format(index+1))
- premise,conclusion = sorted_support[index][0]
- print_rule(premise,conclusion,support,confidence,features)
以上就是我們這次所學的數據挖掘之商品親和性分析了。