關聯分析 - 商品交叉銷售分析


一. 項目需求

  • 根據用戶購買的商品,對購買數據做關聯分析
  • 獲得用戶的商品頻繁模式,比如哪些商品經常被一起購買
  • 根據用戶的頻繁模式,可以做相應的打包銷售或產品組合銷售

二. 項目數據

  • 數據特征:交易ID(order_id)和商品名稱(product_name)
  • 數據格式:事務性數據
  • 唯一性:每次交易只有一個唯一ID,但是有一個訂單ID對應多個商品名稱的情況

三.  分析方法

  • 關聯模式的挖掘,兩種方式:
  1. 基於自定義開發的Apriori關聯算法庫,Aprioiri算法主要有兩部分組成:發現頻繁項集和找出關聯規則
  2.  引入R語言的關聯算法包,實現關聯結果的挖掘
  • 關聯結果展示:通過pyecharts實現

四. 具體過程

4.1 導入所需要的庫

具體庫

  • pandas:用於數據讀取和數據轉換
  • apriori:自定義庫,關聯算法庫
  • pyecharts:數據可視化庫

代碼如下

import pandas as pd
from CorrelationAnalysis import apriori
from pyecharts.charts import Graph
from pyecharts import options as opts  # 配置方法庫

4.2 數據預處理

基本思路

  • 原數據是事務性的數據記錄,需要轉換為關聯算法所需的記錄
  • 關聯的記錄格式:每個訂單ID對應的商品合並為一條記錄
  • 提取方法:列表推導式
  • 記錄數據類型:列表

代碼如下

# 讀取csv文件
data = pd.read_csv('order_table.csv')
# 數據轉換
order_ids = pd.unique(data['order_id']) 
order_records = [data[data['order_id'] == each_id]['product_name'].tolist() for each_id in order_ids]
View Code

4.3 關聯分析

基本思路

  • 定義最小支持度和最小置信度的閾值
  • 計算滿足最小支持度和最小置信度的規則
  1. 最小支持度查找頻繁項集
  2. 最小置信度查找滿足條件的規則
  • 關聯結果報表評估(按照提升度排序)

代碼如下

# 通過調用自定義的apriori做關聯分析
minS = 0.01  # 定義最小支持度閾值
minC = 0.05  # 定義最小置信度閾值
L, supportData = apriori.apriori(order_records, minSupport=minS)  # 計算得到滿足最小支持度的規則
rules = apriori.generateRules(order_records, L,  supportData, minConf=minC)  # 計算得到滿足最小置信度的規則
# 關聯結果報表評估
model_summary = 'data record: {0} \nassociation rules count: {1}'  # 展示數據集記錄數和滿足閾值定義的規則數量
print(model_summary.format(len(order_records), len(rules)))  # 用str.format做格式化輸出
print('-'*60)
# 創建頻繁項集和關聯規則的數據框
rules_all = pd.DataFrame(rules, columns=['item1', 'item2', 'instance', 'support', 'confidence', 'lift'])
rules_sort = rules_all.sort_values(['lift'], ascending=False)  # 按照提升度排序,降序
pd.set_option('display.max_columns', None)  # 顯示所有的列
print(rules_sort.head(10))
View Code

執行結果

data record: 2240 
association rules count: 582
------------------------------------------------------------
                       item1                                      item2  \
347                (berries)                       (whipped/sour cream)   
346     (whipped/sour cream)                                  (berries)   
496              (pip fruit)         (tropical fruit, other vegetables)   
495         (tropical fruit)              (pip fruit, other vegetables)   
514                 (yogurt)  (fruit/vegetable juice, other vegetables)   
579                   (curd)                       (yogurt, whole milk)   
550        (root vegetables)                   (yogurt, tropical fruit)   
549                 (yogurt)          (root vegetables, tropical fruit)   
515  (fruit/vegetable juice)                 (yogurt, other vegetables)   
548         (tropical fruit)                  (root vegetables, yogurt)   

     instance  support  confidence    lift  
347        27   0.0121      0.3253  4.1168  
346        27   0.0121      0.1525  4.1168  
496        23   0.0103      0.1474  4.0772  
495        23   0.0103      0.1000  3.9298  
514        26   0.0116      0.0836  3.6719  
579        29   0.0129      0.2042  3.6307  
550        24   0.0107      0.0980  3.5972  
549        24   0.0107      0.0772  3.5278  
515        26   0.0116      0.1566  3.3735  
548        24   0.0107      0.1043  3.2464  
View Code

 4.4 關聯分析結果展示

基本思路

  • 圖形:關系圖(用來展示多個對象之間相互關系的方式)
  • 方法:使用Echarts展示圖形
  • 具體:
  1. 選擇有效規則
  2. 匯總每個item出現的次數
  3. 取出規則最多的TOP N items
  4. 畫圖(服務器端渲染)
  • 關系圖構成:關系圖的主體元素包括3個部分,源節點,邊和目標節點

代碼如下

# 結果展示
# 選擇有效數據
rules_sort_filt = rules_sort[rules_sort['lift'] > 1]  # 只選取有效規則
display_data = rules_sort_filt.iloc[:, :3]  # 取出前項,后項和實例數
# 統計item出現的次數
item1 = display_data[['item1', 'instance']].rename(index=str, columns={'item1': 'item'})
item2 = display_data[['item2', 'instance']].rename(index=str, columns={'item2': 'item'})
item_concat = pd.concat((item1, item2), axis=0)
item_count = item_concat.groupby(['item'])['instance'].sum()
# 取出規則最多的TOP N items
control_num = 10
top_n_rules = item_count.sort_values(ascending=False).iloc[:control_num]
top_n_items = top_n_rules.index
top_rules_list = [all((item1 in top_n_items, item2 in top_n_items))
                  for item1, item2 in zip(display_data['item1'], display_data['item2'])]
top_display_data = display_data[top_rules_list]
# 畫圖
node_data = top_n_rules/100  # 等比例縮小100倍
nodes = [{"name": ('').join(i[0]), "symbolSize": i[1], "value": j}
         for i, j in zip(node_data.to_dict().items(), item_count)]
# 創建邊數據以及邊權重數據
edges = [{"source": ('').join(i), "target": ('').join(j), "value": k} for i, j, k in top_display_data.values]
# 創建關系圖
graph = Graph(init_opts=opts.InitOpts(width="750px", height="750px"))
graph.add('', nodes, edges, repulsion=8000, layout='circular', is_rotate_label=True)
graph.set_global_opts(title_opts=opts.TitleOpts(title="商品關聯結果圖"))
print(graph.render())  # 服務器端渲染畫圖
View Code

 

關系圖

 結果分析

  • 結果圖顯示了每個item之間的關聯關系
  • 標記點越大的item產生的關聯規則越多
  • 移動到節點上,可以看到每個節點產生的關聯規則的總次數和與該節點關聯的其他節點
  • 移動到邊上,可以看到該邊對應的源節點和目標節點,以及該邊產生的次數

 

 

參考資料

《Python數據分析與數據化運營》


免責聲明!

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



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