劉守唯 孫力群
摘要:校園消費行為每天產(chǎn)生大量交易數(shù)據(jù),這些原始數(shù)據(jù)蘊含隱藏著在學(xué)生生活管理、后勤服務(wù)和保障、關(guān)聯(lián)活動預(yù)警、商戶類型布局預(yù)測、商戶活動評估和過程考核中的管理價值。大數(shù)據(jù)技術(shù)為我們提供了在豐富有效的手段去挖掘這些原始數(shù)據(jù)寶藏,開展充分有效的數(shù)據(jù)分析和利用。該項目是由該校大數(shù)據(jù)競賽團隊設(shè)計開發(fā)的校園消費行為大數(shù)據(jù)分析系統(tǒng),對接該校智慧校園建設(shè)項目,通過hadoop,hive,scikit-learn、flask、echarts等大數(shù)據(jù)分析、開發(fā)和可視化技術(shù)開發(fā)大數(shù)據(jù)分析系統(tǒng)。該文闡述了采用的技術(shù)平臺和項目架構(gòu),并重點介紹了數(shù)據(jù)分析階段的設(shè)計思路和理念。
關(guān)鍵詞:校園消費;大數(shù)據(jù);數(shù)據(jù)分析;機器學(xué)習(xí);hive;hadoop
中圖分類號:TP311 ? ? ?文獻標識碼:A
文章編號:1009-3044(2020)31-0051-02
1背景
傳統(tǒng)校園卡系統(tǒng)具有身份識別和電子錢包等功能,實現(xiàn)了校內(nèi)統(tǒng)一身份認證和消費統(tǒng)一管理,校園卡使用數(shù)據(jù)完全記錄了使用者在校內(nèi)的消費情況和行為軌跡,通過對校園卡數(shù)據(jù)的挖掘分析[1],對高校數(shù)據(jù)決策具有十分重要的意義。隨著支付寶、微信等第三方支付的推廣應(yīng)用,已逐漸占據(jù)校園消費主導(dǎo)地位。學(xué)生在校園的各類學(xué)習(xí)和生活消費行為,只要是經(jīng)過業(yè)務(wù)系統(tǒng)的,都完整記錄了消費明細數(shù)據(jù)。當前的高校信息化建設(shè)已經(jīng)進入了一個以“智慧校園”建設(shè)為主題的新時期[2]。這些數(shù)據(jù)價值的挖掘與分析,往往只做了簡單的統(tǒng)計報告。數(shù)據(jù)內(nèi)在的、隱性的價值、各類數(shù)據(jù)之間的關(guān)系分析沒有揭示出來,每天生成的海量數(shù)據(jù)沒有進行高度價值化的挖掘分析,數(shù)據(jù)反映的問題只能靠管理人員的經(jīng)驗和直覺才能發(fā)現(xiàn),并且已有較大的滯后性。我們開發(fā)目標就是針對這些痛點和難點,采用通用化的產(chǎn)品級平臺+配置式定制開發(fā)+增值式數(shù)據(jù)服務(wù)的開發(fā)模式。我校使用的第三方支付為禧寶公司使用的支付寶系統(tǒng)。通過開發(fā)模擬客戶端程序,定時采集每天發(fā)生的業(yè)務(wù)數(shù)據(jù),增量保存至HDFS文件系統(tǒng)中,供進一步清洗、分析。
校園消費行為大數(shù)據(jù)分析系統(tǒng)產(chǎn)品技術(shù)架構(gòu)采用分層模塊化的大數(shù)據(jù)生態(tài)圈組件。基礎(chǔ)計算平臺采用高可用性Apache Hadoop。結(jié)構(gòu)層次如圖1所示。校園大數(shù)據(jù)分析平臺采用多層架構(gòu), 將大數(shù)據(jù)處理、數(shù)據(jù)交換與共享、基于關(guān)系型和統(tǒng)計型大數(shù)據(jù)存儲、權(quán)限管理、大數(shù)據(jù)分析挖掘進行有效整合, 貫通校園大數(shù)據(jù)管理和應(yīng)用的各個環(huán)節(jié), 從而適應(yīng)于多維異構(gòu)環(huán)境下校園大數(shù)據(jù)處理要求, 實現(xiàn)海量數(shù)據(jù)的高效管理[2]。
2通用分析功能設(shè)計
2.1 數(shù)據(jù)及其分析結(jié)構(gòu)
數(shù)據(jù)采集程序通過Python采集和清洗后的數(shù)據(jù)需要導(dǎo)入到hive表進行分析處理,在基礎(chǔ)統(tǒng)計部分,我們主要使用hql語言進行分析,根據(jù)不同分型類型,編寫分析腳本,當一定周期的數(shù)據(jù)收集清洗完畢,會觸發(fā)調(diào)用腳本執(zhí)行分析任務(wù)。
實現(xiàn)流程:將采集、清洗后的數(shù)據(jù)利用Sqoop將數(shù)據(jù)導(dǎo)入Hive(Hdfs),編寫HQL語句對數(shù)據(jù)進行分析運算,利用Sqoop將最終數(shù)據(jù)從Hive(Hdfs)中導(dǎo)入Mysql中。表1為待分析數(shù)據(jù)集的數(shù)據(jù)結(jié)構(gòu)
業(yè)務(wù)流水數(shù)據(jù)可利用會員編號關(guān)聯(lián)從學(xué)校業(yè)務(wù)系統(tǒng)導(dǎo)入的學(xué)生信息記錄,主要包括學(xué)號、姓名、性別、籍貫、專業(yè)、屆別、班級。用于進行學(xué)籍數(shù)據(jù)相關(guān)的消費特征分析。以下說明這幾個分析條件要素。
分析類型。如銷售額,周平均銷售額,日平均銷售額,每單平均銷售額。價格區(qū)段、單數(shù)、日平均單數(shù)等。
商戶范圍。分析統(tǒng)計時選擇涉及的商戶范圍,選定商戶范圍內(nèi)的消費記錄作為分析基礎(chǔ)。范圍粒度為食堂、門店和窗口三級,覆蓋了各管理層級的關(guān)切數(shù)據(jù)域。
時間范圍。時間范圍的選擇從年、學(xué)期、月、教學(xué)周到自定義起始日期,覆蓋了各類邏輯時段區(qū)間。為用戶提供方便的同時,也為分析算法的靈活和響應(yīng)性設(shè)計提出了挑戰(zhàn)。
分析單元。用餐時段,分早、中、晚3個時段。時間單位,分每年,每學(xué)期,每月,每周,每天。商戶單位,分按每個食堂,按每個商戶,按每個窗口。以上均包括“不限”含義。通過綜合分析,我們發(fā)現(xiàn)大量分析統(tǒng)計需求的語義是基于分析單元,可為餐段、時間單位、商戶單元,例如:分析2020學(xué)年第一學(xué)期(時間范圍)第一食堂(商戶范圍)每天(時間單元)中餐(餐段單元)每個門店(商戶單元)的平均銷售額(分析類型)。通過以上選項組合,可以覆蓋常用的分析單元。
2.2分析過程示例
2.2.1利用hive導(dǎo)入數(shù)據(jù)
1)創(chuàng)建表
Create table all_table(code string, jye string, time string, winname string,type string)row format delimited fields terminated by ‘,
2)導(dǎo)入數(shù)據(jù)
Load data inpath ‘/output/data/part-r-00000 into table all_table;
2.2.2編寫HQL數(shù)據(jù)分析腳本
HQL腳本主體就是SQL風(fēng)格的語句,完成指定分析任務(wù),本文以計算某一時間段每人平均銷售額為例。(交易時間字段格式:2020-12-1 18:56)
取出類型為消費的數(shù)據(jù),并將食堂窗口尾號去掉
insert overwrite table xf
select code ,abs(jye),time,regexp_replace(winname,'[0-9]+','') from all_table where type ='消費';
計算這一時間段每人的銷售額
select count(distinct code) from xf
where
split( split(time,' ')[0],'-')[0]>=起始年 and split( split(time,' ')[0],'-')[0]<=截止年
split( split(time,' ')[0],'-')[1]>=起始月 and split( split(time,' ')[0],'-')[1]<=截止月
split( split(time,' ')[0],'-')[2]>=起始日 and split( split(time,' ')[0],'-')[2]<=截止日;
計算每單平均銷售額
Select sum(money)/count(*) from xf;
計算日平均單數(shù)
Select count(*)/count(distinct split( split(time,' ')[0],'-')[2]) from xf;
2.2.3利用Sqoop將分析后數(shù)據(jù)導(dǎo)出到Mysql
bin/sqoop export \
--connect jdbc:mysql://localhost:3306/test --username root ?--password 123456 \
--table result --num-mappers 1 --export-dir /user/hive/warehouse/demo.db/staff/ \
--input-fields-terminated-by '\t' //hive文件分隔符
3機器學(xué)習(xí)分析可視化應(yīng)用
機器學(xué)習(xí),一言以蔽之就是人類定義一定的計算機算法,讓計算機根據(jù)輸入的樣本和一些人類的干預(yù)來總結(jié)和歸納其特征和特點,并用這些特征和特點和一定的學(xué)習(xí)目標形成映射關(guān)系,進而自動化地做出相應(yīng)反應(yīng)的過程[3]。這個反應(yīng)可能是做出相應(yīng)的標記或判斷,也可能是輸出一段內(nèi)容——圖片、程序代碼、文本、聲音,而機器自己學(xué)到的內(nèi)容我們可以描述為一個函數(shù)、一段程序、一組策略等相對復(fù)雜的關(guān)系描述。
本系統(tǒng)采用機器學(xué)習(xí)算法,根據(jù)歷史數(shù)據(jù),選擇適用模型預(yù)測商戶的未來銷售業(yè)績、學(xué)生的消費喜好等分析需求。機器學(xué)習(xí)庫使用scikit-learn,開發(fā)業(yè)務(wù)預(yù)測模塊,嵌入flask的數(shù)據(jù)可視化網(wǎng)站,將預(yù)測結(jié)果以echarts圖表方式呈現(xiàn)[4]。例如在基于歷史數(shù)據(jù)的銷售預(yù)測中,可使用線性回歸算法構(gòu)建預(yù)測模塊。以下為核心代碼段。
3.1在flask項目中定義機器學(xué)習(xí)線性回歸預(yù)測模塊[5]consumePredction.py
def predConsume(month, consume):
consumePred_X = np.array(month).reshape(len(month),1)
consumeRred_Y = np.array(consume)
regr = linear_model.LinearRegression()
regr.fit(consumePred_X, consumeRred_Y)
consumePred_x_pred = np.array([49,50,51,52,53]).reshape(5,1)
consumePred_y_pred = regr.predict(consumePred_x_pred)
return consumePred_y_pred
3.2 flask項目中使用SQLAlchemy定義數(shù)據(jù)對象映射[6],記錄各月的銷量
class MonthConsume(db.Model):
__tablename__ = "Months"
id = db.Column(db.Integer, primary_key=True)
month = db.Column(db.String(3))
value = db.Column(db.Integer)
3.3各層組件協(xié)作,使用ORM對象提取訓(xùn)練集,調(diào)用線性回歸模型完成銷量預(yù)測,將預(yù)測數(shù)據(jù)json化處理后推送給客戶端可高視化應(yīng)用
@app.route('/findAll')
def findAll():
MonthConsumes = MonthConsume.query.all()
Months = [rec.month for rec in MonthConsumes ]
MonthNumber = [rec.value for rec in MonthConsumes]
cosumePreNum = MonthPredction.predConsume(Months,MonthNumber)
return jsonify({"Month":[1,2,3,4,5],"MonthNumber":cosumePreNum.tolist()})
4系統(tǒng)研發(fā)小結(jié)
校園消費大數(shù)據(jù)系統(tǒng)的分析開發(fā)我們較多得使用了hive分析工具,能應(yīng)對大部分的大數(shù)據(jù)查詢分析。同時在需要使用機器學(xué)習(xí)模型進行預(yù)測和分類的場景下,我們結(jié)合scikit-learn,把機器學(xué)習(xí)任務(wù)封裝成flask后臺的計算模塊。將計算結(jié)果以網(wǎng)站圖表的方式友好呈現(xiàn)給用戶。由于客戶查詢分析的隨機性,如果每次查詢分析都從第三主支付平臺接口提取原始業(yè)務(wù)記錄,或即使保存至本地,時間開銷都會很大。因此,下一階段,將研究按時間、空間分層的方式緩存基本分析單元。使系統(tǒng)對客戶響應(yīng)更加友好。
參考文獻:
[1] 范媛,蔡敏.大數(shù)據(jù)背景下學(xué)生消費水平分析模型的建立[J].電腦知識與技術(shù),2020,16(8):5-7,20.
[2] 王亞楠.大數(shù)據(jù)背景下數(shù)據(jù)挖掘技術(shù)在高校中的應(yīng)用——以校園卡系統(tǒng)為例[J].華中師范大學(xué)學(xué)報(自然科學(xué)版),2017,51(S1):9-12.
[3]DatapiTHU.輕松看懂機器學(xué)習(xí)![EB/OL].(2018-08-20)[2020-08-08].https://blog.csdn.net/eNohtZvQiJxo00aTz3y8/article/details/81880441.
[4] 宋文文,孫力群.大數(shù)據(jù)可視化數(shù)據(jù)加載模式比較分析[J].電腦知識與技術(shù),2019,15(36):11-12.
[5] Jaques Grobler.Linear Regression Example.[EB/OL].[2020-08-08].https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html.
[6] Michael Bayer.sqlalchemy官方教程[EB/OL].[2020-08-08].https://www.sqlalchemy.org/library.html#tutorials.
【通聯(lián)編輯:謝媛媛】