今天我們來看看對於數據挖掘之強關聯規則Appriori算法的使用,通過數據分析出購買人群的喜好以及預測商品之間的關聯規則。一篇技術文章,希望可以幫助到大家。
一、 設計目的
本課程設計是採用java、Python等語言在大數據實驗平臺下設計實現系統。本課程設計為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析解決實際問題的能力。提高學生適應實際,實踐編程的能力。
1) 進一步鞏固和複習數據倉庫與數據挖掘以及數據可視化的基礎知識;
2) 培養學生面向對象程序編程、模塊化程序設計的方法和能力;
3) 瞭解大數據平臺下各種軟件,熟悉Python編程;
4) 提高學生程序調試技巧、軟件設計能力和代碼規範化等素質;
提高學生分析問題、解決問題以及實際運用能力。
二、 任務概述
京東2015年自營銷售數據共包括3個文件,訂單明細,商品分類表,商品庫表。分析數據實現捆綁銷售的功能。
功能要求:
(1)數據存儲可選擇Hive,mysql等;
(2)對數據進行預處理;統計各分類商品的銷售情況;
(3)採用合適的關聯規則挖掘方法對數據進行分析;
(4)計算提升度,對強關聯規則進行相關性分析,實現捆綁銷售的功能;
(5)進行javaweb編程,利用數據可視化方法將數據處理的結果在web頁面上顯示;
三、 模塊劃分
本次的數據挖掘過程可以主要分為3個步驟:數據預處理、數據挖掘、數據可視化。
圖3-1 流程
1. 數據預處理存儲模塊對已有的數據進行存儲,軟件的開發是離不開數據庫的,本次京東交易數據關聯規則挖掘數據挖掘系統,我們使用到了Python中的pandas工具對數據進行了多表的數據處理,以及使用mysql數據庫完成對數據預處理的存儲。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。
2. 數據挖掘模塊,我們使用Apriori算法對預處理後的數據進行分析。Apriori算法使用頻繁項集的先驗知識,使用一種稱作逐層搜索的迭代方法,k項集用於探索(k+1)項集。首先,通過掃描事務(交易)記錄,找出所有的頻繁1項集,該集合記做L1,然後利用L1找頻繁2項集的集合L2,L2找L3,如此下去,直到不能再找到任何頻繁k項集。最後再在所有的頻繁集中找出強規則,即產生用戶感興趣的關聯規則。其中,Apriori算法具有這樣一條性質:任一頻繁項集的所有非空子集也必須是頻繁的。因為假如P(I)< 最小支持度閾值,當有元素A添加到I中時,結果項集(A∩I)不可能比I出現次數更多。因此A∩I也不是頻繁的。
1)連接步
若有兩個k-1項集,每個項集按照“屬性-值”(一般按值)的字母順序進行排序。如果兩個k-1項集的前k-2個項相同,而最後一個項不同,則證明它們是可連接的,即這個k-1項集可以聯姻,即可連接生成k項集。使如有兩個3項集:{a, b, c}{a, b, d},這兩個3項集就是可連接的,它們可以連接生成4項集{a, b, c, d}。又如兩個3項集{a, b, c}{a, d, e},這兩個3項集顯示是不能連接生成3項集的。
2)剪枝步
若一個項集的子集不是頻繁項集,則該項集肯定也不是頻繁項集。這個很好理解,舉一個例子,若存在3項集{a, b, c},如果它的2項子集{a, b}的支持度即同時出現的次數達不到閾值,則{a, b, c}同時出現的次數顯然也是達不到閾值的。因此,若存在一個項集的子集不是頻繁項集,那麼該項集就應該被無情的捨棄。
3. 數據可視化模塊,我們使用R語言對數據挖掘後的數據進行可視化的分析,使用了Java web編程,以及Excel表格繪圖工具進行對數據的分析。可視化(Visualization)是利用計算機圖形學和圖像處理技術,將數據轉換成圖形或圖像在屏幕上顯示出來,再進行交互處理的理論、方法和技術。
四、 系統設計
1. 對數據進行預處理,統計各分類商品的銷售情況:對數據進行檢驗,看數據是否有缺失值、錯誤值等等,如果有錯誤值,要修正。有缺失,視情況插補。
數據沒有問題時,才能進一步分析。我們使用Python中的pandas工具對三CSV京東文件進行處理合併,並使用mysql對數據進行數據存儲。
2. 採用合適的關聯規則挖掘方法對數據進行分析:根據商品購買情況、消費者的購買行為,最終做出商品之間的關聯規則,多件購買和單件購買的關聯規則,以及多次購買和單次購買的關聯規則。這些生成的規則,揭示了客戶購買行為的規律。這些規律可以對終端店鋪銷售人員起到指導作用,為公司的業務決策提供數據支持與依據。使用R語言中的Apriori算法,我們可以輕鬆的實現對數據的挖掘。
3. 項目實現頻繁項集和關聯規則的生成,並通過餘弦度量、lift、置信度等對規則進行評估和篩選
4. Apriori算法流程:
1. 掃描數據庫,生成候選1項集和頻繁1項集。
2. 從2項集開始循環,由頻繁k-1項集生成頻繁頻繁k項集。
2.1 頻繁k-1項集生成2項子集,這裡的2項指的生成的子集中有兩個k-1項集。使如有3個2項頻繁集{a, b}{b, c}{c, f},則它所有的2項子集為{{a, b}{b, c}}{{a, b}{e, f}}{{b, c}{c, f}}
2.2 對由2.1生成的2項子集中的兩個項集根據上面所述的連接步進行連接,生成k項集。
2.3 對k項集中的每個項集根據如上所述的剪枝步進行計算,捨棄掉子集不是頻繁項集即不在頻繁k-1項集中的項集。
2.4 掃描數據庫,計算2.3步中過濾後的k項集的支持度,捨棄掉支持度小於閾值的項集,生成頻繁k項集。
3. 噹噹前生成的頻繁k項集中只有一個項集時循環結束
5. 計算提升度,對強關聯規則進行相關性分析,實現捆綁銷售的功能: Lift(提升度):反映了關聯規則中的A與B的相關性,提升度>1且越高表明正相關性越高,提升度<1且越低表明負相關性越高,提升度=1表明沒有相關性。
6. 進行Java web編程,使用Excel、R語言進行可視化。利用數據可視化方法將數據處理的結果在web頁面上: 數據可視化(data visualization)是利用計算機圖形學和圖像處理技術將數據轉換成圖形或圖像在屏幕上顯示出來,並進行交互處理的理論、方法和技術。數據可視化是可視化技術在非空間數據領域的應用,改變了傳統的通過關係數據表來觀察和分析數據信息的方式,使人們能夠以更直觀的方式看到數據及其結構關係.例如:柱形圖、折線圖、餅圖均以大量的數據構成數據圖像,同時將數據的各個屬性值以多維數據的形式表示,可以從不同的維度觀察數據,從而對數據進行更深入的觀察和分析。
7. 數據庫表為:
表4-6-2 dd
數據庫dd表中存儲了預處理後的訂單數據,其中包括不同的訂單和分組名稱。
五、 數據預處理
1.多表連接預處理
1.1csv讀取表格數據
圖 1多表預處理
1.2pandas讀取表格數據
圖 2 讀取表格
1.3 pandas寫入表格數據
2.預處理商品總價
圖 4 商品總價
3.商品存儲預處理
圖 5存儲預處理
4.數據預處理完成
六、 數據分析
1) 下載程輯包
2) 載入程序包
3) 讀入源數據並創建稀疏矩陣
4)提取關聯規則
圖 6 置信度設置
5)列出關聯規則
圖 7 強關聯規則
6)對每筆訂單進行分類統計,根據統計結果用R的Apriori算法強關聯規則分析(設置支持度=0.01,置信度=0.7),得到10條符合條件的結果,並且根據支持度和置信度,算出提升度。
圖 8 70%置信度關聯規則
七、程序運行結果可視化
圖 9 商品總價
圖 10 支持度
圖 11 購買次數
圖 13提升度可視化
圖 14 關聯規則可視化
圖 15 關聯規則圖結構
八、 課程設計心得
通過這次課設,我們熟悉了數據分析流程,在細節上有了更為深刻的理解。對於算法的細節、原理、指標都有了更好的認識,這是獨自學習時不能體會到的。同時,也進一步加強了團隊協作的能力,理解其他的成員的分析思路,加強了溝通的技巧。同時,也改善了平時獨立寫代碼時的不規範的書寫方式,規範了命名規則、縮進方式等。數據挖掘課程豐富了我的知識面,讓我看到了信息技術的巨大生命力和前景。
數據挖掘涉及多學科技術的集成,包括數據庫和數據倉庫技術、統計學、機器學習、數據可視化、信息檢索等技術。通過數據挖掘,可以從數據庫提取有趣的知識、規律或高層信息,並可以從不同角度觀察或瀏覽它們,發現的知識可以用於做決策、過程控制、信息管理、查詢處理。
利用數據挖掘技術可以幫助獲得決策所需的多種知識。同時加深了對於數據可視化的認識:大量的數據集構成數據圖像,並將數據的各個屬性值以多維數據的形式表示,可從不同的維度觀察數據,即主要藉助於圖形化手段,清晰有效地傳達與溝通信息。
本次課程設計也運用到R語言,因為優秀的數據挖掘工具一方面需要豐富數據挖掘功能,另一方面也需要優化的算法和用戶體驗,R語言集成了多種改進後的數據挖掘算法和工具包嗎,且具有開源的特點,交互方式提供可視化界面。因此我們也熟練掌握了R語言的運用及操作。
附錄:
1.預處理訂單名稱.py
#coding=utf-8
import pymysql
import csv
import codecs
def get_conn():
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='jd', charset='utf8')
return conn
def query_all(cur, sql, args):
cur.execute(sql, args)
return cur.fetchall()
def read_mysql_to_csv(filename):
with codecs.open(filename=filename, mode='w', encoding='utf-8') as f:
write = csv.writer(f, dialect='excel')
conn = get_conn()
cur = conn.cursor()
sql="select ddid,fzmc from ddidy "
results = query_all(cur=cur, sql=sql, args=None)
for result in results:
print(result)
write.writerow(result)
if __name__ == '__main__':
read_mysql_to_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/訂單分類.csv')
2. 預處理多表連接處理.py
# -*- coding: utf-8 -*-
import codecs
import csv as csv
import numpy as np
import pandas as pd
# -------------
# csv讀取表格數據
# -------------
csv_file_object = csv.reader(codecs.open('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/goods.csv', 'rb'))
data = []
for row in str csv_file_object:
data.append(row)
data = np.array(data)
print(data[0::, 0])
# -------------
# pandas讀取表格數據
# -------------
df = pd.read_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/goods.csv')
print df.head()
print ('----------------')
print (df[['spid','spzt','flid','pf']]
print ('------------------------------------------------------------------'
dd = pd.read_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/cat.csv')
print dd.head()
print '----------------'
print dd[['flid','fzmc','fzid','flbm','scpbj']]
print '------------------------------------------------------------------'
data = pd.merge(df,dd,on=['flid'], how='left') # pandas csv表左連接
data = data[['fzmc','spid','flid']]
print data
print '------------------------------------------------------------------'
# -------------
# pandas寫入表格數據
# -------------
data.to_csv(r'C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/gc綜合.csv', encoding='utf-8')
# -------------
# csv讀取表格數據
# -------------
csv_file_object = csv.reader(codecs.open('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/gc綜合.csv', 'rb'))
data = []
for row in csv_file_object:
data.append(row)
data = np.array(data)
print data[0::, 0])
# -------------
# pandas讀取表格數據
# -------------
do = pd.read_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/order.csv')
printdo.head()
print '----------------'
print do[['mxid','ddid','spid','gmsl','spxsdj','zzxsdj','spjg']]
print '------------------------------------------------------------------'
dz = pd.read_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/gc綜合.csv'
print dz.head()
print '----------------'
print dz[['fzmc','spid','flid']]
print '------------------------------------------------------------------'
data = pd.merge(do,dz,on=['spid'], how='left') # pandas csv表左連接
data = data[['ddid','fzmc','spid','spjg']]
print data
print '------------------------------------------------------------------'
data.to_csv(r'C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/最終綜合表.csv', encoding='utf-8')
# -*- coding: utf-8 -*-
import codecs
import csv as csv
import numpy as np
import pandas as pd
# -------------
# csv讀取表格數據
# -------------
csv_file_object = csv.reader(codecs.open('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/goods.csv, 'rb'))
header = csv_file_object.next()
print header
print type(header)
data = []
for row in csv_file_object:
data.append(row)
data = np.array(data)
print data[0::, 0]
# -------------
# pandas讀取表格數據
# -------------
df = pd.read_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/goods.csv')
print df.head()
print '----------------'
print df[['spid','spzt','flid','pf']] # 選取其中的四列
print '------------------------------------------------------------------'
dd = pd.read_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/cat.csv')
print dd.head()
print '----------------'
print dd[['flid','fzmc','fzid','flbm','scpbj']]
print '------------------------------------------------------------------'
data = pd.merge(df,dd,on=['flid'], how='left') # pandas csv表左連接
data = data[['fzmc','spid','flid']]
print data
print '------------------------------------------------------------------'
# -------------
# pandas寫入表格數據
# -------------
data.to_csv(r'C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/gc綜合.csv', encoding='utf-8')
# -------------
# csv讀取表格數據
# -------------
csv_file_object = csv.reader(codecs.open('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/gc綜合.csv', 'rb'))
header = csv_file_object.next()
print header
print type(header)
data = []
for row in csv_file_object:
data.append(row)
data = np.array(data)
print data[0::, 0]
# -------------
# pandas讀取表格數據
# -------------
do = pd.read_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/JDdata/order.csv)
print do.head()
print '----------------'
print do[['mxid','ddid','spid','gmsl','spxsdj','zzxsdj','spjg']]
print '------------------------------------------------------------------'
dz = pd.read_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/gc綜合.csv')
print dz.head()
print '----------------'
print dz[['fzmc','spid','flid']]
print '------------------------------------------------------------------'
data = pd.merge(do,dz,on=['spid'], how='left') # pandas csv表左連接
data = data[['ddid','fzmc','spid','spjg']]
print data
print '------------------------------------------------------------------'
data.to_csv(r'C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/最終綜合表.csv', encoding='utf-8')
3.預處理數據存儲.py
#-*- coding: utf-8 -*-
import csv
import pymysql
with open(r'C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/最終綜合表.csv') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
readCSV = csv.reader(csvfile, delimiter=',')
for row in readCSV:
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
passwd='root',
db='jd',
charset='utf8')
cursor = db.cursor()
sql = "insert into ddid(ddid,fzmc) values('%s','%s')" % (row[1],row[2])
try:
cursor.execute(sql)
print("1")
db.commit()
except:
db.rollback()
db.close()
4.預處理商品總價.py
#coding=utf-8
import pymysql
import csv
import codecs
def get_conn():
conn = pymysql.connect(host='localhost',
port=3306, user='root',
passwd='root', db='jd',
charset='utf8')
return conn
def query_all(cur, sql, args):
cur.execute(sql, args)
return cur.fetchall()
def read_mysql_to_csv(filename):
with codecs.open(filename=filename, mode='w', encoding='utf-8') as f:
write = csv.writer(f, dialect='excel')
conn = get_conn()
cur = conn.cursor()
sql="select fzmc,SUM(spjg) from dd group by fzmc "
results = query_all(cur=cur, sql=sql, args=None)
for result in results:
print(result)
write.writerow(result)
if __name__ == '__main__':
read_mysql_to_csv('C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/各商品總價.csv')
5.R語言代碼
library(arules)
dingdan
dingdan.apriori
inspect(dingdan.apriori)
write(dingdan.apriori, file = "C:/Users/Renyu/Desktop/Y04第9組數據挖掘實驗報告/置信度彙總.csv",sep = ",", col.names = NA)
dingdan.eclat
plot(dingdan.apriori, method = "grouped")
plot(dingdan.apriori)
subrules2
plot(subrules2, method = "graph")
inspect(dingdan.eclat)
感謝堅持關注的朋友
世界很大,幸好有你
歡迎在評論區留下你的問題或困惑,我將每天與你分享我的觀點和心得。
聚焦最新科技諮訊,探尋未來智能領域,我是女陶。