




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
11.1數(shù)據(jù)說明與存儲(chǔ)主講:李強(qiáng)任務(wù)描述業(yè)務(wù)數(shù)據(jù)表有用戶基本信息表、賬單信息表、訂單信息表、用戶狀態(tài)信息變更表以及用戶收視行為信息表,本小節(jié)將對(duì)簡單介紹這5張業(yè)務(wù)數(shù)據(jù)表,然后存儲(chǔ)數(shù)據(jù)至Hive中。任務(wù)分析廣電業(yè)務(wù)數(shù)據(jù)表的數(shù)據(jù)說明與存儲(chǔ)操作步驟如下。(1)了解5張業(yè)務(wù)數(shù)據(jù)表的表結(jié)構(gòu),為下一步存儲(chǔ)提供便利。(2)將5張業(yè)務(wù)數(shù)據(jù)表存儲(chǔ)至Hive數(shù)據(jù)庫中,為后續(xù)數(shù)據(jù)探索與處理提供數(shù)據(jù)輸入源。任務(wù)實(shí)施用戶基本信息(mediamatch_usermsg)表結(jié)構(gòu)如表11-1所示,部分?jǐn)?shù)據(jù)如圖11-1所示。表11-1用戶基本信息表結(jié)構(gòu)字段描述terminal_no客戶地址編號(hào)phone_no客戶編號(hào)sm_name品牌名稱run_name狀態(tài)名稱sm_code品牌編號(hào)owner_name客戶等級(jí)名稱owner_code客戶等級(jí)run_time狀態(tài)變更時(shí)間addressoj完整地址estate_name街道或小區(qū)地址force寬帶是否生效open_time開戶時(shí)間任務(wù)實(shí)施圖11-1用戶基本信息表部分記錄任務(wù)實(shí)施用戶狀態(tài)變更信息數(shù)據(jù)(mediamatch_userevent)表結(jié)構(gòu)如表11-2所示,部分?jǐn)?shù)據(jù)如圖11-2所示。表11-2用戶狀態(tài)變更信息數(shù)據(jù)表結(jié)構(gòu)字段描述run_name狀態(tài)名稱run_time更改狀態(tài)時(shí)間owner_code客戶等級(jí)編號(hào)owner_name客戶等級(jí)名稱sm_name品牌名稱open_time開戶時(shí)間phone_no客戶編號(hào)圖11-2用戶狀態(tài)信息變更表部分記錄任務(wù)實(shí)施賬單信息數(shù)據(jù)(mmconsume_billevents)表結(jié)構(gòu)如表11-3所示,部分?jǐn)?shù)據(jù)如圖11-3所示。表11-3賬單信息數(shù)據(jù)表結(jié)構(gòu)圖11-3賬單信息表部分記錄字段描述fee_code費(fèi)用類型phone_no客戶編號(hào)owner_code客戶等級(jí)owner_name客戶等級(jí)編號(hào)sm_name品牌名year_month賬單時(shí)間terminal_no用戶地址編號(hào)favour_fee優(yōu)惠金額(+代表優(yōu)惠,-代表額外費(fèi)用)should_pay應(yīng)收金額,單位:元任務(wù)實(shí)施訂單信息數(shù)據(jù)(order_index)表結(jié)構(gòu)如表11-4所示,部分?jǐn)?shù)據(jù)如圖11-4所示。表11-4訂單信息數(shù)據(jù)表結(jié)構(gòu)圖11-4訂單信息表部分記錄字段描述phone_no用戶編號(hào)owner_name客戶等級(jí)名稱optdate產(chǎn)品訂購狀態(tài)更新時(shí)間Prodname訂購產(chǎn)品名稱sm_name用戶品牌名稱offerid訂購套餐編號(hào)offername訂購套餐名稱business_name訂購業(yè)務(wù)狀態(tài)owner_code客戶等級(jí)prodprcid訂購產(chǎn)品名稱(帶價(jià)格)的編號(hào)prodprcname訂購產(chǎn)品名稱(帶價(jià)格)effdate產(chǎn)品生效時(shí)間expdate產(chǎn)品失效時(shí)間orderdate產(chǎn)品訂購時(shí)間cost訂購產(chǎn)品價(jià)格mode_time產(chǎn)品標(biāo)識(shí),輔助標(biāo)識(shí)電視主、附銷售品prodstatus訂購產(chǎn)品狀態(tài)run_name狀態(tài)名orderno訂單編號(hào)任務(wù)實(shí)施戶收視行為數(shù)據(jù)(media_index)表結(jié)構(gòu)如表11-5所示,部分?jǐn)?shù)據(jù)如圖11-5所示。表11-5用戶收視行為數(shù)據(jù)表結(jié)構(gòu)圖11-5用戶收視行為表部分記錄字段名描述terminal_no用戶地址編號(hào)phone_no用戶編號(hào)duration觀看時(shí)長,單位:毫秒station_name直播頻道名稱origin_time觀看行為開始時(shí)間end_time觀看行為結(jié)束時(shí)間owner_code客戶等級(jí)owner_name客戶等級(jí)名稱vod_cat_tagsvod節(jié)目包相關(guān)信息(nestedobject)按不同的節(jié)目包目錄組織resolution點(diǎn)播節(jié)目的清晰度audio_lang點(diǎn)播節(jié)目的語言類別region節(jié)目地區(qū)信息res_name設(shè)備名稱res_type媒體節(jié)目類型0是直播,1是點(diǎn)播或回看vod_titlevod節(jié)目名稱category_name節(jié)目所屬分類program_title直播節(jié)目名稱sm_name用戶品牌名稱任務(wù)實(shí)施參考項(xiàng)目1,將5張業(yè)務(wù)數(shù)據(jù)表文件上傳至Linux系統(tǒng)目錄/opt下,使用sed命令刪除數(shù)據(jù)表中的首行字段名,如代碼11-1所示。在Linux系統(tǒng)目錄/opt下創(chuàng)建名為“csv2hive.hql”的文件,用于創(chuàng)建Hive數(shù)據(jù)表與導(dǎo)入相關(guān)數(shù)據(jù),文件內(nèi)容如表11-6所示。啟動(dòng)Hadoop集群、Hive的MetaStore服務(wù),在Shell頁面執(zhí)行命令“hive-f/opt/csv2hive.hql”,即可完成5張數(shù)據(jù)表的創(chuàng)建與數(shù)據(jù)導(dǎo)入。代碼11-1刪除首行字段名sed-i'1d'/opt/mediamatch_userevent.csvsed-i'1d'/opt/mediamatch_usermsg.csvsed-i'1d'/opt/media_index.csvsed-i'1d'/opt/mmconsume_billevents.csvsed-i'1d'/opt/order_index.csv表11-6csv2hive.hql文件內(nèi)容createdatabaseuser_profile;useuser_profile;createtablemediamatch_usermsg(terminal_nostring,phone_nostring,sm_namestring,run_namestring,sm_codestring,owner_namestring,owner_codestring,run_timestring,addressojstring,open_timestring,forcestring)rowformatdelimitedfieldsterminatedby'\;';loaddatalocalinpath'/opt/mediamatch_usermsg.csv'overwriteintotablemediamatch_usermsg;......省略謝謝11.2數(shù)據(jù)探索與預(yù)處理主講:李強(qiáng)任務(wù)描述業(yè)務(wù)數(shù)據(jù)表有用戶基本信息表、賬單信息表、訂單信息表、用戶狀態(tài)信息變更表以及用戶收視行為信息表,本小節(jié)將對(duì)這5張業(yè)務(wù)數(shù)據(jù)表進(jìn)行總體的分析概述、數(shù)據(jù)探索與數(shù)據(jù)預(yù)處理。任務(wù)分析廣電業(yè)務(wù)數(shù)據(jù)表的數(shù)據(jù)探索與預(yù)處理操作步驟如下。(1)數(shù)據(jù)總體概述。(2)異常數(shù)據(jù)探索。(3)主要業(yè)務(wù)數(shù)據(jù)探索。(4)標(biāo)簽閾值探索。(5)數(shù)據(jù)預(yù)處理。11.2.1數(shù)據(jù)總體概述1.統(tǒng)計(jì)用戶數(shù)與記錄數(shù)啟動(dòng)Spark集群,執(zhí)行命令“spark-shell”打開SparkShell,讀取Hive中的數(shù)據(jù),如代碼
11-2所示。代碼11-2讀取數(shù)據(jù)valhiveContext=neworg.apache.spark.sql.hive.HiveContext(sc)valusermsgData=hiveContext.sql("select*fromuser_profile.mediamatch_usermsg")valusereventData=hiveContext.sql("select*fromuser_profile.mediamatch_userevent")valbilleventsData=hiveContext.sql("select*fromuser_profile.mmconsume_billevents")valorderData=hiveContext.sql("select*fromuser_profile.order_index")valmediaData=hiveContext.sql("select*fromuser_profile.media_index")為了初步了解每個(gè)表的數(shù)據(jù)量及用戶數(shù)量,現(xiàn)統(tǒng)計(jì)每個(gè)表的記錄數(shù)及用戶數(shù),如代碼11-3所示。代碼11-3統(tǒng)計(jì)記錄數(shù)、用戶數(shù)usermsgData.countusereventData.countbilleventsData.countorderData.countmediaData.countusermsgData.select("phone_no").distinct().count2.統(tǒng)計(jì)觀看時(shí)長為了掌握用戶收視行為記錄中的觀看時(shí)長的取值范圍,統(tǒng)計(jì)用戶收視記錄觀看時(shí)長的均值、最值和標(biāo)準(zhǔn)差,如代碼11-4所示。觀看時(shí)長情況如圖11-7所示。代碼11-4統(tǒng)計(jì)用戶收視記錄觀看時(shí)長的均值、最值和標(biāo)準(zhǔn)差mediaData.select(avg(col("duration")/1000).alias("avg_duration"),min(col("duration")/1000).alias("min_duration"),max(col("duration")/1000).alias("max_duration"),stddev(col("duration")/1000).alias("std_duration")).show圖11-6表的記錄數(shù)和用戶數(shù)圖11-7觀看時(shí)長的均值、最值和標(biāo)準(zhǔn)差2.統(tǒng)計(jì)觀看時(shí)長統(tǒng)計(jì)每個(gè)用戶平均每月的收視時(shí)長,進(jìn)而掌握每個(gè)用戶對(duì)電視的依賴程度,如代碼11-5所示。代碼11-5統(tǒng)計(jì)每個(gè)用戶月均收視時(shí)長valperUserDuraton=mediaData.groupBy("phone_no").agg((sum("duration")/(3*1000*60*60)).alias("duration_avg"))perUserDuraton.orderBy(col("duration_avg").desc).show(5)圖11-8每個(gè)用戶每個(gè)月的觀看時(shí)長11.2.2異常數(shù)據(jù)探索1.查看用戶信息表是否存在重復(fù)記錄的用戶通過groupBy進(jìn)行分組,count統(tǒng)計(jì)重復(fù)數(shù)據(jù),filter查看記錄數(shù)大于1的用戶,如代碼11-6所示。用戶記錄數(shù)如圖11-9所示。圖11-9用戶的記錄數(shù)代碼11-6探索用戶基本信息表中重復(fù)記錄的用戶usermsgData.groupBy("phone_no").count().filter("count>1").countusermsgData.groupBy("phone_no").count().orderBy(col("count").desc).show(3)2.查看特殊線路的用戶根據(jù)客戶業(yè)務(wù)人員提供的信息,owner_code的值為02、09或10的記錄是特殊路線的用戶,接下來對(duì)這5個(gè)表是否存在特殊線路的用戶及數(shù)量進(jìn)行探索分析,如代碼11-7所示。用戶線路類別如圖11-10所示。代碼11-7統(tǒng)計(jì)各表owner_code類型數(shù)valusermsgCode=usermsgData.groupBy("owner_code").count()valusereventCode=usereventData.groupBy("owner_code").count()valbilleventsCode=billeventsData.groupBy("owner_code").count()valorderCode=orderData.groupBy("owner_code").count()valmediaCode=mediaData.groupBy("owner_code").count()usermsgCode.show(20)圖11-10用戶的線路類別3.查看政企用戶該企業(yè)的客戶主要來自于家庭用戶,所以政企用戶不納入分析范圍。政企用戶的標(biāo)識(shí)是owner_name的值為“EA級(jí)”“EB級(jí)”“EC級(jí)”“ED級(jí)”或“EE級(jí)”,探索這些表是否有存在政企用戶以及存在的數(shù)量,如代碼11-8所示。代碼11-8統(tǒng)計(jì)用戶基本信息中owner_name的分組信息valusermsgOwnerName=usermsgData.groupBy("owner_name").count()valusereventOwnerName=usereventData.groupBy("owner_name").count()valbilleventsOwnerName=billeventsData.groupBy("owner_name").count()valorderOwnerName=orderData.groupBy("owner_name").count()valmediaOwnerName=mediaData.groupBy("owner_name").count()usermsgOwnerName.show(20)usereventOwnerName.show(20)billeventsOwnerName.show(20)mediaOwnerName.show(20)3.查看政企用戶用戶基本信息表owner_name的分組信息如圖11-11所示。用戶狀態(tài)信息變更表owner_name的分組信息如圖11-12所示。圖11-11用戶基本信息表owner_name的分組信息圖11-12用戶狀態(tài)信息變更表owner_name的分組信息3.查看政企用戶賬單信息表owner_name的分組信息如圖11-13所示。用戶收視行為信息表owner_name的分組信息如圖11-14所示。圖11-13賬單信息表owner_name的分組信息圖11-14用戶收視行為信息表表owner_name的分組信息11.2.3主要業(yè)務(wù)數(shù)據(jù)探索1.統(tǒng)計(jì)基本信息表的類型對(duì)應(yīng)的用戶數(shù)及其占比統(tǒng)計(jì)用戶基本信息表中sm_name的所有類型及其每種類型的用戶數(shù),如代碼11-9所示。品牌類型對(duì)應(yīng)的用戶數(shù)及占比如圖11-15所示。代碼11-9統(tǒng)計(jì)用戶基本信息表的sm_name各類型的數(shù)量valnums=usermsgData.countusermsgData.groupBy("sm_name").count().withColumn("percent",col("count")/nums).show圖11-15sm_name類型的數(shù)量與占比2.用戶狀態(tài)名稱過濾對(duì)用戶狀態(tài)名稱利用groupBy、count進(jìn)行分組統(tǒng)計(jì),如代碼11-10所示。用戶狀態(tài)各類別記錄數(shù)如圖11-16所示。狀態(tài)名稱包含空值一共有8種類型,其中只保留正常、欠費(fèi)暫停、主動(dòng)暫停和主動(dòng)銷戶的用戶,其余的狀態(tài)名稱不需要分析處理。代碼11-10統(tǒng)計(jì)用戶基本信息表中用戶狀態(tài)各類別的記錄數(shù)usermsgData.groupBy("run_name").count().show()圖11-16用戶狀態(tài)記錄數(shù)3.用戶收視行為無效數(shù)據(jù)用戶收視行為信息表記錄了用戶的每次收視時(shí)長,對(duì)于時(shí)長過短以及過長的數(shù)據(jù)記錄都是無效的,過短是因?yàn)橛脩羟袚Q頻道時(shí)產(chǎn)生的記錄,過長可能是因?yàn)橛脩魶]有關(guān)閉機(jī)頂盒造成的記錄,但過短與過長的范圍需要進(jìn)行統(tǒng)計(jì)分析得到。(1)在用戶收視行為信息表中,duration字段記錄了用戶的每次收視時(shí)長,把觀看長以每小時(shí)為一區(qū)間來劃分,統(tǒng)計(jì)各區(qū)間的記錄數(shù),如代碼11-11所示。觀看時(shí)長的記錄數(shù)及占比如圖11-17所示。代碼11-11統(tǒng)計(jì)收視時(shí)長以每小時(shí)為區(qū)間的記錄數(shù)valtotal=mediaData.count.toDoublevalmediaHours=mediaData.withColumn("hours",floor(col("duration")/(1000*60*60)))valhoursNum=mediaHours.groupBy("hours").count().withColumn("percent",col("count")/total)hoursNum.show圖11-17觀看時(shí)長的記錄數(shù)與占比3.用戶收視行為無效數(shù)據(jù)由圖11-17所示結(jié)果,可知由于觀看時(shí)長小于1小時(shí)的記錄數(shù)占了絕大部分,因此把這部分記錄再按每1分鐘為一個(gè)時(shí)間間隔來劃分,分析落在每個(gè)區(qū)間的記錄數(shù)分布情況,如代碼
11-12所示。觀看時(shí)長小于一小時(shí)的各區(qū)間記錄數(shù)及占比如圖11-18所示代碼11-12統(tǒng)計(jì)收視行為中觀看時(shí)長小于1小時(shí)的各區(qū)間記錄數(shù)valoneHour=mediaHours.where("hours=0")valmediaMinutes=oneHour.withColumn("minutes",floor(col("duration")/(1000*60)))valminutesNum=mediaMinutes.groupBy("minutes").count().withColumn("percent",col("count")/total)minutesNum.orderBy(col("minutes").asc).show(10)圖11-18小于一小時(shí)的各區(qū)間記錄數(shù)及占比3.用戶收視行為無效數(shù)據(jù)(2)由圖11-18可知,觀看時(shí)長小于1分鐘的記錄數(shù)約占總記錄數(shù)的18%。為了進(jìn)一步了解觀看時(shí)長小于1分鐘的秒級(jí)分布情況,再把這部分?jǐn)?shù)據(jù)按每秒的區(qū)間間隔來劃分,如代碼11-13所示。觀看時(shí)長小于1分鐘的各區(qū)間記錄數(shù)及占比如圖11-19所示。代碼11-13統(tǒng)計(jì)用戶收視行為中小于1分鐘各區(qū)間的記錄數(shù)//篩選觀看時(shí)長小于1分鐘的記錄valoneMinute=mediaMinutes.where("minutes=0")//新增字段seconds:將觀看時(shí)長轉(zhuǎn)為以每秒為間隔的數(shù)并向下取整valmediaSeconds=oneMinute.withColumn("seconds",floor(col("duration")/1000))//統(tǒng)計(jì)各seconds值的記錄數(shù)valsecondsNum=mediaSeconds.groupBy("seconds").count().withColumn("percent",col("count")/total)//按字段seconds升序排序并顯示前10條結(jié)果secondsNum.orderBy(col("seconds").asc).show(10)圖11-19小于1分鐘各區(qū)間的記錄數(shù)3.用戶收視行為無效數(shù)據(jù)(3)在用戶收視行為信息表中,還有一部分?jǐn)?shù)據(jù)是res_type=0時(shí),origin_time和end_time的秒時(shí)間單位為00的記錄,這些記錄是機(jī)頂盒子自動(dòng)返回的數(shù)據(jù),并不是用戶真實(shí)的觀看記錄,因此,這一部分?jǐn)?shù)據(jù)在后續(xù)預(yù)處理時(shí)也是要?jiǎng)h除的,如代碼11-14所示。無效收視紀(jì)錄數(shù)量如圖11-20所示,無效的收視記錄如圖11-21所示。代碼11-14查詢收視記錄中的無效數(shù)據(jù)valinvalidData=mediaData.filter("res_type=0").filter(col("origin_time").endsWith("00")andcol("end_time").endsWith("00"))invalidData.countinvalidData.show(2,false)圖11-21無效的收視紀(jì)錄圖11-20無效收視紀(jì)錄的數(shù)量11.2.4標(biāo)簽閾值探索1.電視用戶賬單分析本小節(jié)將通過對(duì)賬單信息數(shù)據(jù)中的電視用戶的賬單信息進(jìn)行分析,得到一個(gè)電視用戶的消費(fèi)水平標(biāo)簽劃分規(guī)則。(1)對(duì)電視用戶的賬單數(shù)據(jù)進(jìn)行探索分析,統(tǒng)計(jì)每個(gè)用戶的月均消費(fèi)金額,然后對(duì)所有用戶的月均消費(fèi)金額作基本的統(tǒng)計(jì)分析,如代碼11-15所示。電視用戶月均消費(fèi)情況如圖11-22所示。代碼11-15統(tǒng)計(jì)電視用戶月均消費(fèi)情況valtvBilleventsData=billeventsData.filter("sm_namelike'%電視%'andsm_name!='模擬有線電視'")valavgTVBillData=tvBilleventsData.groupBy("phone_no").agg((sum(col("should_pay")-col("favour_fee"))/7).alias("avg_fee"))//統(tǒng)計(jì)消費(fèi)金額的最大值,最小值,平均值和標(biāo)準(zhǔn)差avgTVBillData.select(max("avg_fee"),min("avg_fee"),avg("avg_fee"),stddev("avg_fee")).show圖11-22電視用戶月均消費(fèi)情況1.電視用戶賬單分析(2)將每月消費(fèi)金額按10的間隔劃分,通過range_fee分組,如代碼11-16所示。電視用戶按10劃分的月均消費(fèi)情況如圖11-23所示。(3)從如圖11-23所示的結(jié)果可以發(fā)現(xiàn),電視用戶月均消費(fèi)金額大致呈正態(tài)分布,主要集中在0至50的區(qū)間范圍內(nèi),其中占比最大的是大于等于20而小于30的消費(fèi)區(qū)間,這是因?yàn)榇蟛糠蛛娨曈脩裘吭露贾焕U納26.5元基本電視費(fèi)用。篩選電視用戶月均消費(fèi)大于等于-10且小于等于90元的用戶數(shù)據(jù),統(tǒng)計(jì)其平均值和標(biāo)準(zhǔn)差,如代碼11-17所示。代碼11-16金額劃分后電視用戶月均消費(fèi)情況valrangeTVBillData=avgTVBillData.withColumn("range_fee",floor(col("avg_fee")/10)*10)valrangeTVCount=rangeTVBillData.groupBy("range_fee").count()rangeTVCount.orderBy(col("range_fee").asc).show(30)代碼11-17過濾后的電視用戶月均消費(fèi)金額及標(biāo)準(zhǔn)差avgTVBillData.filter("avg_fee>=-10andavg_fee<=90").select(avg("avg_fee"),stddev("avg_fee")).show圖11-23按10劃分的月均消費(fèi)情況1.電視用戶賬單分析過濾后電視用戶月均消費(fèi)情況如圖11-24所示。從代碼11-17的統(tǒng)計(jì)結(jié)果發(fā)現(xiàn),月均消費(fèi)金額在-10到90之間的電視用戶月均消費(fèi)金額的平均值約為26.3,標(biāo)準(zhǔn)差約為16.2。根據(jù)業(yè)務(wù)特點(diǎn),結(jié)合月均消費(fèi)金額的平均值和標(biāo)準(zhǔn)差,標(biāo)簽值以月度消費(fèi)26.3為基礎(chǔ),以標(biāo)準(zhǔn)差的向上取整至十位數(shù),即20作為浮動(dòng)閾值,制定4個(gè)電視消費(fèi)水平子標(biāo)簽內(nèi)容如表11-7所示。代碼11-17過濾后的電視用戶月均消費(fèi)金額及標(biāo)準(zhǔn)差avgTVBillData.filter("avg_fee>=-10andavg_fee<=90").select(avg("avg_fee"),stddev("avg_fee")).show表11-7電視消費(fèi)水平標(biāo)簽圖11-24過濾后的月均消費(fèi)金額及標(biāo)準(zhǔn)差父級(jí)標(biāo)簽子標(biāo)簽標(biāo)簽規(guī)則備注電視消費(fèi)水平電視超低消費(fèi)X<26.3X為電視用戶月均消費(fèi)金額,單位:元電視低消費(fèi)26.3≤X<26.3+20電視中等消費(fèi)26.3+20≤X<26.3+40電視高消費(fèi)26.3+40≤X2.寬帶用戶的賬單分析本小節(jié)將通過對(duì)賬單信息數(shù)據(jù)中的寬帶用戶的賬單信息進(jìn)行分析,得到一個(gè)寬帶用戶的消費(fèi)水平標(biāo)簽劃分規(guī)則。(1)對(duì)寬帶用戶的賬單數(shù)據(jù)進(jìn)行探索分析,統(tǒng)計(jì)每個(gè)用戶的月均消費(fèi)金額,然后對(duì)所有用戶的月均消費(fèi)金額作基本的統(tǒng)計(jì)分析,如代碼11-18所示。代碼11-18統(tǒng)計(jì)寬帶用戶月均消費(fèi)情況valnetBilleventsData=billeventsData.filter("sm_namelike'%珠江寬頻%'")valavgNetBillData=netBilleventsData.groupBy("phone_no").agg((sum(col("should_pay")-col("favour_fee"))/7).alias("avg_fee"))importmons.math3.stat.descriptive.rank.Percentileval_50_P=newPercentile(50.0)val_50_udf=udf{(arr:scala.collection.mutable.WrappedArray[Double])=>_50_P.evaluate(arr.sorted.toArray)}avgNetBillData.select(max("avg_fee"),min("avg_fee"),avg("avg_fee"),stddev("avg_fee"),_50_udf(collect_list("avg_fee")).alias("median")).show2.寬帶用戶的賬單分析本小節(jié)將通過對(duì)賬單信息數(shù)據(jù)中的寬帶用戶的賬單信息進(jìn)行分析,得到一個(gè)寬帶用戶的消費(fèi)水平標(biāo)簽劃分規(guī)則。(1)對(duì)寬帶用戶的賬單數(shù)據(jù)進(jìn)行探索分析,統(tǒng)計(jì)每個(gè)用戶的月均消費(fèi)金額,然后對(duì)所有用戶的月均消費(fèi)金額作基本的統(tǒng)計(jì)分析,如代碼11-18所示。代碼11-18統(tǒng)計(jì)寬帶用戶月均消費(fèi)情況valnetBilleventsData=billeventsData.filter("sm_namelike'%珠江寬頻%'")valavgNetBillData=netBilleventsData.groupBy("phone_no").agg((sum(col("should_pay")-col("favour_fee"))/7).alias("avg_fee"))importmons.math3.stat.descriptive.rank.Percentileval_50_P=newPercentile(50.0)val_50_udf=udf{(arr:scala.collection.mutable.WrappedArray[Double])=>_50_P.evaluate(arr.sorted.toArray)}avgNetBillData.select(max("avg_fee"),min("avg_fee"),avg("avg_fee"),stddev("avg_fee"),_50_udf(collect_list("avg_fee")).alias("median")).show2.寬帶用戶的賬單分析寬帶用戶月均消費(fèi)情況如圖11-25所示。(2)將每月消費(fèi)金額按10的間隔劃分,通過range_fee分組,如代碼11-19所示。代碼11-19分隔電視用戶月均消費(fèi)情況valrangeNetBillData=avgNetBillData.withColumn("range_fee",floor(col("avg_fee")/10)*10)valrangeNetCount=rangeNetBillData.groupBy("range_fee").count()rangeNetCount.orderBy(col("range_fee").asc).show圖11-25寬帶用戶月均消費(fèi)情況圖11-26分隔后的電視用戶月均消費(fèi)情況寬帶用戶按10劃分后月均消費(fèi)情況如圖11-26所示。2.寬帶用戶的賬單分析(3)寬帶用戶的消費(fèi)金額集中在0元至90元之間,其中消費(fèi)金額在10至20區(qū)間內(nèi)的用戶最多,為了使寬帶消費(fèi)金額的均值和標(biāo)準(zhǔn)差更加穩(wěn)定,過濾消費(fèi)金額小于0或大于90的記錄,再求其均值和標(biāo)準(zhǔn)差和中位數(shù),如代碼11-20所示。過濾后的寬帶用戶月均消費(fèi)情況如圖11-27所示。代碼11-20過濾后寬帶用戶月均消費(fèi)金額的統(tǒng)計(jì)avgNetBillData.filter("avg_fee>=0andavg_fee<90").select(avg("avg_fee"),stddev("avg_fee"),_50_udf(collect_list("avg_fee")).alias("median")).show圖11-27過濾后的寬帶用戶月均消費(fèi)金額2.寬帶用戶的賬單分析從代碼11-20的統(tǒng)計(jì)結(jié)果,可以發(fā)現(xiàn)過濾部分記錄后寬帶用戶月均消費(fèi)金額的均值約為29,標(biāo)準(zhǔn)差約為19,中位數(shù)約為21。根據(jù)統(tǒng)計(jì)結(jié)果,選擇29元作為寬帶用戶的基礎(chǔ)消費(fèi),19元作浮動(dòng)閥值,制定寬帶消費(fèi)水平的子標(biāo)簽及規(guī)則如表11-8所示。表11-8寬帶消費(fèi)水平標(biāo)簽父級(jí)標(biāo)簽子標(biāo)簽標(biāo)簽規(guī)則備注寬帶消費(fèi)水平寬帶低消費(fèi)Y<29Y為寬帶用戶月均消費(fèi)金額,單位:元寬帶中消費(fèi)29≤Y<29+19寬帶高消費(fèi)29+19≤Y3.電視入網(wǎng)程度標(biāo)簽闕值探索本小節(jié)將通過對(duì)用戶基本信息表中的電視用戶的開戶時(shí)間信息進(jìn)行分析,得到一個(gè)電視用戶的入網(wǎng)程度標(biāo)簽劃分規(guī)則。(1)把用戶基本信息表的open_time字段的值與當(dāng)前時(shí)間作差并把差值轉(zhuǎn)為以年為單位,然后統(tǒng)計(jì)所有用戶中入網(wǎng)時(shí)長的最值、均值、30%分位數(shù)和中位數(shù),具體代碼如代碼11-21所示。代碼11-21統(tǒng)計(jì)分析電視用戶入網(wǎng)時(shí)長valtvUsermsgData=usermsgData.filter("sm_namelike'%電視%'andsm_name!='模擬有線電視'")//過濾open_time為空值的記錄valtvFilteredUsermsgData=tvUsermsgData.filter("open_time!='NULL'")//把用戶開戶時(shí)間與當(dāng)前時(shí)間作差并向下取整(單位為年)valyearTVUserData=tvFilteredUsermsgData.groupBy("phone_no").agg(max(floor(datediff(current_date(),col("open_time"))/365)).alias("years"))val_30_P=newPercentile(30.0)val_30_udf=udf{(arr:scala.collection.mutable.WrappedArray[Double])=>_30_P.evaluate(arr.sorted.toArray)}val_50_P=newPercentile(50.0)......省略3.電視入網(wǎng)程度標(biāo)簽闕值探索電視入網(wǎng)時(shí)長情況如圖11-28所示。(2)通過years分組統(tǒng)計(jì)每個(gè)入網(wǎng)戶時(shí)長值的用戶數(shù),如代碼11-22所示。代碼11-22統(tǒng)計(jì)電視每個(gè)入網(wǎng)戶時(shí)長值valyearTVUserCount=yearTVUserData.groupBy("years").countyearTVUserCount.orderBy(col("years").asc).show(30)圖11-28電視入網(wǎng)時(shí)長3.電視入網(wǎng)程度標(biāo)簽闕值探索電視入網(wǎng)時(shí)長用戶合計(jì)數(shù)情況如圖11-29所示。(3)根據(jù)代碼11-21和代碼11-22的統(tǒng)計(jì)結(jié)果可以發(fā)現(xiàn),電視用戶入網(wǎng)時(shí)長的平均值約為11.7,標(biāo)準(zhǔn)差約為1.16,30%分位數(shù)約為12,中位數(shù)約為12。根據(jù)統(tǒng)計(jì)結(jié)果及結(jié)合實(shí)際的業(yè)務(wù)場景,選擇以30%分位數(shù)11年為電視用戶的入網(wǎng)時(shí)長的中位數(shù),以標(biāo)準(zhǔn)差取整為2年浮動(dòng)值,制定三個(gè)電視入網(wǎng)程度子標(biāo)簽如表11-9所示。圖11-29入網(wǎng)時(shí)長的合計(jì)數(shù)表11-9電視入網(wǎng)程度標(biāo)簽父級(jí)標(biāo)簽子標(biāo)簽標(biāo)簽規(guī)則備注電視入網(wǎng)程度新用戶Y<9Y為用戶入網(wǎng)時(shí)長,單位:年中等用戶9≤Y<13老用戶13≤Y4.寬帶入網(wǎng)程度標(biāo)簽闕值探索在對(duì)寬帶用戶的入網(wǎng)時(shí)長統(tǒng)計(jì)分析中,主要統(tǒng)計(jì)分析寬帶用戶中入網(wǎng)時(shí)長的最值、均值、標(biāo)準(zhǔn)差、中位數(shù)及其分布情況,如代碼11-23所示。代碼11-23統(tǒng)計(jì)分析寬帶用戶入網(wǎng)時(shí)長//篩選寬帶用戶valnetUsermsgData=usermsgData.filter("sm_name='珠江寬頻'")//過濾open_time為空值的記錄valnetFilteredUsermsgData=netUsermsgData.filter("open_time!='NULL'")//把用戶開戶時(shí)間與當(dāng)前時(shí)間作差并向下取整(單位為年)valyearNetUserData=netFilteredUsermsgData.groupBy("phone_no").agg(max(floor(datediff(current_date(),col("open_time"))/365)).alias("years"))//統(tǒng)計(jì)入網(wǎng)時(shí)長的最大值,最小值,均值,標(biāo)準(zhǔn)差,中位數(shù)yearNetUserData.select(max("years"),min("years"),avg("years"),stddev("years"),_50_udf(collect_list(col("years").cast("double"))).alias("median")).show4.寬帶入網(wǎng)程度標(biāo)簽闕值探索寬帶入網(wǎng)時(shí)長情況如圖11-30所示。以years字段分組,統(tǒng)計(jì)每個(gè)寬帶入網(wǎng)戶時(shí)長值的用戶數(shù),如代碼11-24所示。寬帶入網(wǎng)時(shí)長用戶合計(jì)數(shù)情況如圖11-31所示。代碼11-24統(tǒng)計(jì)每個(gè)寬帶入網(wǎng)時(shí)長的用戶數(shù)valyearNetUserCount=yearNetUserData.groupBy("years").countyearNetUserCount.orderBy(col("years").asc).show()圖11-30寬帶入網(wǎng)時(shí)長圖11-31每個(gè)寬帶入網(wǎng)時(shí)長的用戶數(shù)4.寬帶入網(wǎng)程度標(biāo)簽闕值探索通過代碼11-23和代碼11-24的統(tǒng)計(jì)結(jié)果可以發(fā)現(xiàn),寬帶用戶中入網(wǎng)時(shí)長的均值約為11,標(biāo)準(zhǔn)差約為3,中位數(shù)為12。從中可以發(fā)現(xiàn)主要集中在11~14年之間,其中入網(wǎng)時(shí)長為13年的用戶最多。根據(jù)統(tǒng)計(jì)結(jié)果以及結(jié)合實(shí)際的業(yè)務(wù)場景,選擇以11年作為入網(wǎng)時(shí)長的中間值,以標(biāo)準(zhǔn)差3年作為浮動(dòng)值,制定三個(gè)寬帶入網(wǎng)程度子標(biāo)簽如表11-10所示。表11-10寬帶入網(wǎng)程度標(biāo)簽父級(jí)標(biāo)簽子標(biāo)簽標(biāo)簽規(guī)則備注寬帶入網(wǎng)程度新用戶Y<8Y為用戶入網(wǎng)時(shí)長,單位:年中等用戶8≤Y<14老用戶14≤Y11.2.5數(shù)據(jù)預(yù)處理參考項(xiàng)目10,在IDEA中創(chuàng)建一個(gè)名為“zjsm”的Maven工程,并在工程里添加好Scala插件、導(dǎo)入Spark安裝包中的jars文件夾,配置好Spark開發(fā)環(huán)境。通過封裝函數(shù)實(shí)現(xiàn)數(shù)據(jù)預(yù)處理過程如下。(1)通過前幾節(jié),得到數(shù)據(jù)清洗的規(guī)則如表11-11所示。表11-11業(yè)務(wù)數(shù)據(jù)表預(yù)處理規(guī)則表名稱數(shù)據(jù)預(yù)處理規(guī)則賬單表訂單表用戶信息表用戶收視信息行為信息表1.?dāng)?shù)據(jù)去重;2.刪除owner_name=EA級(jí),EB級(jí),EC級(jí),ED級(jí),EE級(jí);3.刪除owner_code=02,09,10;4.保留sm_name=“珠江寬頻”“數(shù)字電視”“互動(dòng)電視”“甜果電視;用戶狀態(tài)信息變更表訂單表用戶信息表1.保留run_name=“正?!薄爸鲃?dòng)暫停”“欠費(fèi)暫?!薄爸鲃?dòng)銷戶”;用戶信息表1.每個(gè)用戶只保留run_time時(shí)間為最大的記錄;用戶收視信息行為信息表1.收視時(shí)長duration≥20秒且duration≤5小時(shí);2.刪除用戶收視行為信息表中res_type=0時(shí)origin_time和end_time中秒單位為00的數(shù)據(jù);用戶狀態(tài)信息變更表1.?dāng)?shù)據(jù)去重;2.刪除owner_name=EA級(jí),EB級(jí),EC級(jí),ED級(jí),EE級(jí);3.刪除owner_code=02,09,10;11.2.5數(shù)據(jù)預(yù)處理從表11-11可以發(fā)現(xiàn)這5個(gè)表的數(shù)據(jù)預(yù)處理規(guī)則都有共同的地方,此外用戶信息表與用戶收視行為信息表還有其他的處理規(guī)則。根據(jù)此特點(diǎn),可以封裝成一個(gè)函數(shù)來實(shí)現(xiàn)數(shù)據(jù)處理過程,以達(dá)到代碼復(fù)用的目的,此函數(shù)需要考慮以下參數(shù)的問題。①需要傳入一個(gè)HiveContext實(shí)例,因?yàn)樾枰贖ive中進(jìn)行讀取和寫入的操作;②需要指定從Hive讀取數(shù)據(jù)的表名稱;③由于不同的表的處理邏輯不一樣,所以需要一個(gè)標(biāo)記參數(shù)區(qū)分輸入的表;④數(shù)據(jù)預(yù)處理完畢后需要指定數(shù)據(jù)存儲(chǔ)在Hive的表名稱。根據(jù)以上的業(yè)務(wù)邏輯及參數(shù)封裝,得到關(guān)于數(shù)據(jù)預(yù)處理功能的代碼,如代碼11-25所示。代碼11-25數(shù)據(jù)預(yù)處理/***數(shù)據(jù)預(yù)處理*/objectDataProcess{defmain(args:Array[String]):Unit={if(args.length!=10){printUsage()System.exit(1)}valconf=newSparkConf().setAppName("DataProcess")valsc=newSparkContext(conf)valsqlContext=newHiveContext(sc)//media_index數(shù)據(jù)預(yù)處理valoriginMediaIndexTable=args(0)valprocessMediaIndexTable=args(1)11.2.5數(shù)據(jù)預(yù)處理(2)參考項(xiàng)目3,將打包成datapro.jar,然后將jar包上傳至liunx的opt目錄下,執(zhí)行命令“cd/opt”進(jìn)入jar包所在目錄,運(yùn)行spark-submit測試代碼,命令如代碼11-26所示。代碼11-26運(yùn)行預(yù)處理任務(wù)spark-submit--masterspark://master:7077--total-executor-cores2\--executor-cores1\--nameDataProcess\--classdatapro.DataProcess\/opt/datapro.jar\user_profile.media_indexuser_profile.media_index_process\user_profile.mediamatch_usereventuser_profile.mediamatch_userevent_process\user_profile.mediamatch_usermsguser_profile.mediamatch_usermsg_process\user_profile.mmconsume_billeventsuser_profile.mmconsume_billevent_process\user_profile.order_indexuser_profile.order_index_process11.2.5數(shù)據(jù)預(yù)處理(3)確認(rèn)預(yù)處理任務(wù)運(yùn)行成功后,在Linux終端執(zhí)行命令“spark-shell”啟動(dòng)spark,查看用戶基本信息表mediamatch_usermsg_process在Hive中存儲(chǔ)情況,如代碼11-27所示。代碼11-27用戶基本信息表數(shù)據(jù)預(yù)處理驗(yàn)證valhiveContext=neworg.apache.spark.sql.hive.HiveContext(sc)valoriginUsermsg=hiveContext.sql("select*fromuser_profile.mediamatch_usermsg")valprocessedUsermsg=hiveContext.sql("select*fromuser_profile.mediamatch_usermsg_process")originUsermsg.countprocessedUsermsg.countprocessedUsermsg.select("phone_no").distinct.countprocessedUsermsg.select("sm_name").distinct.showprocessedUsermsg.select("run_name").distinct.showprocessedUsermsg.select("owner_name").distinct.showprocessedUsermsg.select("owner_code").distinct.show11.2.5數(shù)據(jù)預(yù)處理預(yù)處理后的驗(yàn)證結(jié)果如圖11-32、圖11-33、圖11-34、圖11-35和圖11-36所示。圖11-32處理后表的記錄數(shù)圖11-33電視的品牌圖11-35去除政企用戶圖11-34用戶的狀態(tài)變更11.2.5數(shù)據(jù)預(yù)處理根據(jù)代碼11-27的統(tǒng)計(jì)結(jié)果顯示,可以發(fā)現(xiàn)根據(jù)用戶基本信息表數(shù)據(jù)預(yù)處理規(guī)則過濾后其記錄數(shù)減少了一大半,其記錄數(shù)和用戶數(shù)也符合設(shè)置的規(guī)則(每個(gè)用戶有且只有一條記錄),并且其它字段的過濾如owner_name、owner_code、sm_name、run_name等也達(dá)到了預(yù)期的效果?;谟脩艋拘畔⒈淼臄?shù)據(jù)預(yù)處理的驗(yàn)證效果,說明數(shù)據(jù)預(yù)處理代碼是正確的。圖11-36去除owner_code=02、09、10后的結(jié)果謝謝數(shù)據(jù)說明與存儲(chǔ)主講:李強(qiáng)任務(wù)描述用戶畫像是根據(jù)用戶社會(huì)屬性、生活習(xí)慣和消費(fèi)行為等信息而抽象出的一個(gè)標(biāo)簽化的用戶模型。構(gòu)建用戶畫像的核心工作即是給用戶貼“標(biāo)簽”,而標(biāo)簽是通過對(duì)用戶信息分析而來的高度精煉的特征標(biāo)識(shí)。用戶畫像中的一個(gè)標(biāo)簽為用戶是否值得挽留,該標(biāo)簽的計(jì)算規(guī)則比較復(fù)雜,并非通過統(tǒng)計(jì)用戶的數(shù)據(jù)獲得,而是需要建立模型并根據(jù)指定的特征進(jìn)行預(yù)測。常用于分類、預(yù)測是與否(0/1)事件的模型是SVM模型,SVM(SupportVectorMac)又稱為支持向量機(jī),是一種較好的二分類模型。本小節(jié)將對(duì)廣電大數(shù)據(jù)用戶數(shù)據(jù)建立SVM模型,并進(jìn)行模型評(píng)估和預(yù)測,然后基于前幾節(jié)的探索分析與模型預(yù)測結(jié)果構(gòu)建廣電用戶畫像。任務(wù)分析本小節(jié)的構(gòu)建SVM預(yù)測模型與用戶畫像的實(shí)現(xiàn)流程如下。(1)構(gòu)建特征列和標(biāo)簽列數(shù)據(jù)。(2)構(gòu)建SVM模型,評(píng)價(jià)模型效果,然后預(yù)測用戶是否挽留。(3)構(gòu)建用戶畫像。11.3.1構(gòu)建特征列和標(biāo)簽列數(shù)據(jù)構(gòu)建特征列和標(biāo)簽列數(shù)據(jù)在預(yù)處理后的數(shù)據(jù)中沒有算法模型可識(shí)別出來的特征列和標(biāo)簽列,所以為了后續(xù)模型的構(gòu)建,此小節(jié)需要對(duì)預(yù)處理后的數(shù)據(jù)進(jìn)行構(gòu)建特征列和標(biāo)簽列。(1)根據(jù)用戶月均消費(fèi)金額,每個(gè)用戶的入網(wǎng)時(shí)長,每個(gè)用戶平均每天看多久電視構(gòu)建特征列,具體實(shí)現(xiàn)如代碼11-28、代碼11-29、代碼11-30和代碼11-31所示。代碼11-28統(tǒng)計(jì)每個(gè)用戶的月均消費(fèi)金額valbillevents=hiveContext.sql("selectphone_no,sum(should_pay)/3asconsumefromuser_profile.mmconsume_billevent_processwheresm_namenotlike'%珠江寬頻%'groupbyphone_no")代碼11-29統(tǒng)計(jì)每個(gè)用戶的入網(wǎng)時(shí)長valuserevents=hiveContext.sql("selectphone_no,max(months_between(current_date(),run_time)/12)join_timefromuser_profile.mediamatch_userevent_processgroupbyphone_no")代碼11-30統(tǒng)計(jì)每個(gè)用戶平均每次看多少小時(shí)電視valmedia_index=hiveContext.sql("selectphone_no,(sum(media.duration)/(1000*60*60))/count(1)ascount_durationfromuser_profile.media_index_processmediagroupbyphone_no")代碼11-31通過join將表連接valbillevents_userevents_media=billevents.join(userevents,Seq("phone_no")).join(media_index,Seq("phone_no"))billevents_userevents_media.show(5)構(gòu)建特征列和標(biāo)簽列數(shù)據(jù)特征列如圖11-37所示。圖11-37特征列構(gòu)建特征列和標(biāo)簽列數(shù)據(jù)(2)根據(jù)mediamatch_usermsg選出run_name字段為主動(dòng)暫?;蛑鲃?dòng)銷戶的用戶并貼上類別0,0代表用戶為不挽留用戶;根據(jù)mediamatch_usermsg選出run_name字段為正常并且是活躍的用戶貼上類別1,1代表用戶為挽留用戶,具體實(shí)現(xiàn)如下。選取一個(gè)月的數(shù)據(jù),匯總得到總觀看時(shí)長大于18936000的用戶,如代碼11-32所示。代碼11-32觀看時(shí)長大于18936000的用戶valmsg=hiveContext.sql("selectdistinctphone_no,0ascol1fromuser_profile.mediamatch_usermsg_process")valmediaIndex=hiveContext.sql("selectphone_no,sum(duration)astotal_one_month_secondsfromuser_profile.media_index_processwhereorigin_time>=add_months('2018-08-0100:00:00',-1)groupbyphone_nohavingtotal_one_month_seconds>18936000").select("phone_no","total_one_month_seconds")將order_index字段過濾掉run_name等于“正?!钡臄?shù)據(jù);offername過濾掉包含以下關(guān)鍵字“廢”“贈(zèng)送”“免費(fèi)體驗(yàn)”“提速”“提價(jià)”“轉(zhuǎn)網(wǎng)優(yōu)惠”“測試”“虛擬”“空包”的數(shù)據(jù),如代碼11-33所示。代碼11-33過濾關(guān)鍵字valorderIndexTV=hiveContext.sql("select*fromuser_profile.order_index_processwhererun_name='正常'andoffername!='廢'andoffername!='贈(zèng)送'andoffername!='免費(fèi)體驗(yàn)'andoffername!='提速'andoffername!='提價(jià)'andoffername!='轉(zhuǎn)網(wǎng)優(yōu)惠'andoffername!='虛擬'andoffername!='空包'andoffernamenotlike'%寬帶%'").select("phone_no").distinct()構(gòu)建特征列和標(biāo)簽列數(shù)據(jù)通過join連接表獲得活躍用戶,如代碼11-34所示。代碼11-34連接表valmedia_order=mediaIndex.join(orderIndexTV,Seq("phone_no"),"inner").selectExpr("phone_no","1ascol2").distinct()valmsg_media_order=msg.join(media_order,Seq("phone_no"),"left_outer").na.fill(0).selectExpr("phone_no","col2ascol1")篩選掉包含“珠江寬頻”的數(shù)據(jù),通過join將表連接并給活躍用戶貼上標(biāo)簽1,不活躍用戶貼上標(biāo)簽0,如代碼11-35所示。代碼11-35貼標(biāo)簽valbillevents=hiveContext.sql("selectphone_no,sum(should_pay)/3consumefromuser_profile.mmconsume_billevent_processwheresm_namenotlike'%珠江寬頻%'groupbyphone_no")valuserevents=hiveContext.sql("selectphone_no,max(months_between(current_date(),run_time)/12)join_timefromuser_profile.mediamatch_userevent_processgroupbyphone_no")valmedia_index=hiveContext.sql("selectphone_no,(sum(media.duration)/(1000*60*60))/count(1)ascount_durationfromuser_profile.media_index_processmediagroupbyphone_no")valbillevents_userevents_media=billevents.join(userevents,Seq("phone_no")).join(media_index,Seq("phone_no"))......省略構(gòu)建特征列和標(biāo)簽列數(shù)據(jù)構(gòu)建好的數(shù)據(jù)如圖11-38所示。通過得到了一份DataFrame的數(shù)據(jù)unionData,數(shù)據(jù)中包含了5個(gè)字段,分別為用戶ID、電視消費(fèi)水平、電視入網(wǎng)時(shí)長、電視依賴度、類別。后續(xù)可利用這份數(shù)據(jù)來進(jìn)行SVM建模。圖11-38構(gòu)建的數(shù)據(jù)集11.3.2SVM預(yù)測用戶是否挽留SVM預(yù)測用戶是否挽留基于11.3.1小節(jié)處理后含有特征列和標(biāo)簽列的數(shù)據(jù)集,在構(gòu)建模型之前,還需將特征列數(shù)據(jù)轉(zhuǎn)化成RDD[LabelPoint]類型,消除量綱影響,對(duì)數(shù)據(jù)做標(biāo)準(zhǔn)化處理,然后對(duì)數(shù)據(jù)集劃分,再來構(gòu)建SVM模型,對(duì)模型效果進(jìn)行評(píng)價(jià),最后使用構(gòu)建好的模型預(yù)測用戶是否挽留。(1)對(duì)特征列數(shù)據(jù)做標(biāo)準(zhǔn)化處理,為了后面對(duì)模型進(jìn)行評(píng)估,根據(jù)二八原則將標(biāo)準(zhǔn)化數(shù)據(jù)劃分成訓(xùn)練集和驗(yàn)證集,用訓(xùn)練集來建立模型,驗(yàn)證集用來評(píng)價(jià)模型,具體實(shí)現(xiàn)如代碼11-36所示。模型建立如圖11-39所示。代碼11-36建立SVM模型importorg.apache.spark.mllib.regression.LabeledPointimportorg.apache.spark.mllib.linalg.Vectorsimportorg.apache.spark.mllib.feature.StandardScalervaltraindata=unionData.select("consume","join_time","count_duration").rdd.zip(unionData.select("label").rdd).map(x=>LabeledPoint(x._2.get(0).toString.toDouble,Vectors.dense(x._1.toSeq.toArray.map(_.toString.toDouble))))......省略圖11-39SVM模型的建立SVM預(yù)測用戶是否挽留(2)使用驗(yàn)證集來驗(yàn)證模型的效果,計(jì)算模型的準(zhǔn)確率、AUROC值和AUPRC值,具體實(shí)現(xiàn)如代碼11-37所示。代碼11-37模型評(píng)價(jià)importorg.apache.spark.mllib.evaluation.BinaryClassificationMetricsimportorg.apache.spark.sql.types.{DoubleType,StringType,StructField,StructType}importorg.apache.spark.sql.RowvalpredictAndLabel=validate_data.map(row=>{valpredict=model.predict(row.features)......省略圖11-40模型的評(píng)估模型效果如圖11-40所示。從代碼11-37的計(jì)算結(jié)果可知,模型的準(zhǔn)確率大概是0.46875,ROC曲線下的面積(AUROC值)大概是0.7258,PR曲線下的面積(AUPRC)大概是0.9914。一般情況下,ROC曲線下的面積的取值范圍在0.5到1之間,面積值越大說明分類效果越好。SVM預(yù)測用戶是否挽留(3)將billevents_userevents_media數(shù)據(jù)(測試數(shù)據(jù))做一步轉(zhuǎn)換,轉(zhuǎn)換成RDD[(String,Vector)]類型,并取出RDD中的Vector數(shù)據(jù)作為predict的輸入?yún)?shù),具體實(shí)現(xiàn)如代碼11-38所示。模型預(yù)測結(jié)果如圖11-41所示。代碼11-38模型預(yù)測valtest_data=billevents_userevents_media.select("phone_no").rdd.zip(billevents_userevents_media.select("consume","join_time","count_duration").rdd).map(x=>(x._1.get(0).toString,Vectors.dense(x._2.toSeq.toArray.map(_.toString.toDouble))))valpredictData=test_data.map(row=>{valpredict=model.predict(row._2)Row(row._1,row._2(0),row._2(1),row._2(2),predict)})......省略圖11-41模型預(yù)測的結(jié)果11.3.3構(gòu)建用戶畫像1.消費(fèi)內(nèi)容選擇phone_no、fee_code字段并去重;根據(jù)fee_code字段來貼標(biāo)簽,標(biāo)簽規(guī)則如下。(1)fee_code=0J或0B或OY則標(biāo)簽為直播;(2)fee_code=0X則標(biāo)簽為應(yīng)用;(3)fee_code=0T則標(biāo)簽為付費(fèi)頻道;(4)fee_code=0W或0L或0Z或0K則標(biāo)簽為寬帶;(5)fee_code=0D則標(biāo)簽為點(diǎn)播fee_code=0H則標(biāo)簽為回看;(6)fee_code=0U則標(biāo)簽為有線電視收視費(fèi)。代碼11-39消費(fèi)內(nèi)容標(biāo)簽實(shí)現(xiàn)代碼hiveContext.sql("selectdistinctphone_no,casewhenfee_code='0J'orfee_code='0B'orfee_code='0Y'then'直播'whenfee_code='0X'then'應(yīng)用'whenfee_code='0T'then'付費(fèi)頻道'whenfee_code='0W'orfee_code='0L'orfee_code='0Z'orfee_code='0K'then'寬帶'whenfee_code='0D'then'點(diǎn)播'whenfee_code='0H'then'回看'whenfee_code='0U'then'有線電視收視費(fèi)'endaslabel,'消費(fèi)內(nèi)容'asparent_labelfromuser_profile.mmconsume_billevent_process").show(5)圖11-42消費(fèi)內(nèi)容用戶畫像2.電視消費(fèi)水平根據(jù)sm_name字段不包含珠江寬頻篩選出電視的數(shù)據(jù);計(jì)算個(gè)月數(shù)據(jù)中should_pay-favour_fee的月平均值X,標(biāo)簽規(guī)則如下。(1)如果-26.3<X<26.3則貼上電視超低消費(fèi)標(biāo)簽;(2)如果26.3≤X<26.3+20則貼上電視低消費(fèi);(3)如果26.3+20≤X<26.3+40則貼上電視中等消費(fèi);(4)如果X≥26.3+40則貼上電視高消費(fèi)標(biāo)簽。代碼11-40電視消費(fèi)水平標(biāo)簽實(shí)現(xiàn)代碼hiveContext.sql("selectt2.phone_no,casewhenfee_per_month>-26.3andfee_per_month<26.3then'電視超低消費(fèi)'whenfee_per_month>=26.3andfee_per_month<46.3then'電視低消費(fèi)'whenfee_per_month>=46.3andfee_per_month<66.3then'電視中等消費(fèi)'when66.3<=fee_per_monththen'電視高消費(fèi)'endaslabel,'電視消費(fèi)水平'asparent_labelfrom(selectt1.phone_no,sum(real_pay)/3asfee_per_monthfrom(selectphone_no,nvl(should_pay,0)-nvl(favour_fee,0)asreal_payfromuser_profile.mmconsume_billevent_processwheresm_namelike'%電視%')t1groupbyt1.phone_no)t2").show(5)圖11-43電視消費(fèi)水平用戶畫像3.寬帶消費(fèi)水平根據(jù)sm_name包含珠江寬頻篩選寬帶的數(shù)據(jù),計(jì)算3個(gè)月數(shù)據(jù)should_pay-favour_fee的月平均值Y,標(biāo)簽規(guī)則如下。(1)如果Y≤29則貼上寬帶低消費(fèi)標(biāo)簽;(2)如果29<Y≤48則貼上寬帶中消費(fèi);(3)如果Y>48則貼上寬帶高消費(fèi)。實(shí)現(xiàn)代碼如代碼11-41所示。寬帶消費(fèi)水平用戶畫像如圖11-44所示。代碼11-41寬帶消費(fèi)水平標(biāo)簽實(shí)現(xiàn)代碼hiveContext.sql("selectt2.phone_no,casewhenfee_per_month<=29then'寬帶低消費(fèi)'whenfee_per_month>29andfee_per_month<=48then'寬帶中消費(fèi)'whenfee_per_month>48then'寬帶高消費(fèi)'endaslabel,'寬帶消費(fèi)水平'asparent_labelfrom(selectt1.phone_no,sum(real_pay)/3asfee_per_monthfrom(selectphone_no,nvl(should_pay,0)-nvl(favour_fee,0)asreal_payfromuser_profile.mmconsume_billevent_processwheresm_name='珠江寬頻')t1groupbyt1.phone_no)t2").show(5)圖11-44寬帶消費(fèi)水平用戶畫像4.寬帶產(chǎn)品帶寬根據(jù)sm_name='珠江寬頻'來篩選寬帶的用戶;根據(jù)字段phone_no進(jìn)行分組,取optdate最大且effdate≤當(dāng)前時(shí)間≤expdate的數(shù)據(jù);根據(jù)prodname字段確定標(biāo)簽,prodname字段的值即為標(biāo)簽名稱,如代碼11-42所示。寬帶產(chǎn)品帶寬用戶畫像如圖11-45所示。代碼11-42寬帶產(chǎn)品帶寬標(biāo)簽實(shí)現(xiàn)代碼hiveContext.sql("selectb.phone_no,casewhenprodname=prodnamethenprodnameendaslabel,'帶產(chǎn)品帶寬'asparent_labelfrom(selecta.phone_no,a.optdate,dname,a.sm_name,row_number()over(partitionbya.phone_noorderbya.optdatedesc)rankfrom(selectphone_no,prodname,expdate,optdate,sm_namefromuser_profile.order_index_processwhereeffdate<from_unixtime(unix_timestamp(),'yyyy-MM-ddHH:mm:ss')andfrom_unixtime(unix_timestamp(),'yyyy-MM-ddHH:mm:ss')<expdate)a)bwhereb.rank=1andb.sm_name='珠江寬頻'").show(5)圖11-45寬帶產(chǎn)品帶寬用戶畫像5.銷售品名稱過濾cost小于等于0的數(shù)據(jù),且offername不包含空包的記錄;根據(jù)sm_name區(qū)分電視和寬帶,sm_name='珠江寬頻'的為寬帶,sm_name不包含珠江寬頻的為電視,標(biāo)簽規(guī)則如下。(1)電視主銷售品:找出mode_time='Y',offertype=0,prodstatus='YY'且effdate
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑圍墻地基施工方案
- 戶外步道綠化施工方案
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)方借款協(xié)議
- 二零二五年度拖欠工資解除勞動(dòng)合同實(shí)務(wù)案例范文
- 二零二五年度環(huán)保產(chǎn)業(yè)合作項(xiàng)目終止協(xié)議范本
- 非全日制合同制員工2025年度工作績效評(píng)估及獎(jiǎng)勵(lì)合同
- 二零二五年度辣椒種植基地節(jié)水灌溉技術(shù)合同
- 二零二五年度工業(yè)氣體產(chǎn)業(yè)園區(qū)共建合作協(xié)議
- 二零二五年度醫(yī)院聘用護(hù)士勞動(dòng)合同(護(hù)理心理健康)
- 幼兒園保育員聘用合同書(二零二五年度)-幼兒成長記錄合作
- 水利工程施工質(zhì)量與安全管理知識(shí)講稿ppt版(共243)
- 小升初簡歷模板課件
- 高活性干酵母生產(chǎn)工藝流程
- 福建省終止工傷保險(xiǎn)關(guān)系三方協(xié)議書
- 電子技術(shù)的基本認(rèn)識(shí)
- 商場組織架構(gòu)方案
- 青島版五四制四年級(jí)上冊(cè)課件- 運(yùn)用加法運(yùn)算律簡便計(jì)算
- 集中注意力 課件- 高中心理健康
- 一年級(jí)上冊(cè)期末班語文質(zhì)量分析(劉玉華)
- 劍橋英語一級(jí)詞匯表
- 馬鞍山博望區(qū)新城區(qū)控制性詳細(xì)規(guī)劃的知識(shí)
評(píng)論
0/150
提交評(píng)論