用Spark分析Amazon的8000萬(wàn)商品評(píng)價(jià)(內(nèi)含數(shù)據(jù)集、代碼、論文)
盡管數(shù)據(jù)科學(xué)家經(jīng)常通過(guò)分布式云計(jì)算來(lái)處理數(shù)據(jù),但是即使在一般的筆記本電腦上,只要給出足夠的內(nèi)存,Spark也可以工作正常(在這篇文章中,我使用2016年MacBook Pro / 16GB內(nèi)存,分配給Spark 8GB內(nèi)存)。
此外,通過(guò)Maxcompute及其配套產(chǎn)品,低廉的大數(shù)據(jù)分析僅需幾步。
亞馬遜的商品評(píng)論和評(píng)分是一個(gè)非常重要的業(yè)務(wù)。 亞馬遜上的客戶(hù)經(jīng)?;谶@些評(píng)論做出購(gòu)買(mǎi)決定,并且單個(gè)不良評(píng)論可以導(dǎo)致潛在購(gòu)買(mǎi)者重新考慮。 幾年前,我寫(xiě)了一篇非常受歡迎的博客文章,題為“120萬(wàn)亞馬遜評(píng)論統(tǒng)計(jì)分析“。
當(dāng)時(shí),我只限于1200萬(wàn)評(píng)論,因?yàn)閲L試處理更多的數(shù)據(jù)會(huì)導(dǎo)致內(nèi)存不足,以至于我的R語(yǔ)言代碼需要運(yùn)行幾個(gè)小時(shí)。
Apache Spark是一個(gè)高效的開(kāi)源大數(shù)據(jù)計(jì)算框架,在過(guò)去幾年中已經(jīng)非常流行(對(duì)于使用Spark和Python的好教程,我推薦免費(fèi)的eDX課程)。盡管數(shù)據(jù)科學(xué)家經(jīng)常通過(guò)分布式云計(jì)算來(lái)處理數(shù)據(jù),但是即使在一般的筆記本電腦上,只要給出足夠的內(nèi)存,Spark也可以工作正常(在這篇文章中,我使用2016年MacBook Pro / 16GB內(nèi)存,分配給Spark 8GB內(nèi)存)。
我寫(xiě)了一個(gè)簡(jiǎn)單的Python腳本,用來(lái)合并Julian McAuley、Rahul Pandey和Jure Leskovecucehua在2015年發(fā)布“Inferring Networks of Substitutable and Complementary Products”論文時(shí)準(zhǔn)備的亞馬遜產(chǎn)品評(píng)論數(shù)據(jù)集中每個(gè)類(lèi)別的評(píng)級(jí)數(shù)據(jù) 。成果是一個(gè)4.53 GB的CSV,肯定不能在Microsoft Excel中打開(kāi)。選取和整合的數(shù)據(jù)集包括:留下評(píng)論的用戶(hù)的用戶(hù)名,指明是哪一個(gè)接收評(píng)論亞馬遜產(chǎn)品的id,從1到5的用戶(hù)給出的評(píng)級(jí),以及評(píng)論寫(xiě)入的時(shí)間(精確到天)。 我們還可以從數(shù)據(jù)子集的名稱(chēng)推斷已評(píng)價(jià)產(chǎn)品的類(lèi)別。
然后,使用面對(duì)R語(yǔ)言的新的升級(jí)包,我可以使用一個(gè)spark_connect()命令輕松啟動(dòng)本地Spark集群,并使用單個(gè)spark_read_csv()命令很快將整個(gè)CSV加載到集群中。
在數(shù)據(jù)集中總共有8074萬(wàn)條記錄,即8.074e + 07條。如果使用傳統(tǒng)工具(如dplyr或甚至Python pandas)高級(jí)查詢(xún),這樣的數(shù)據(jù)集將需要相當(dāng)長(zhǎng)的時(shí)間來(lái)執(zhí)行。
使用sparklyr,操作實(shí)際很大的數(shù)據(jù)就像對(duì)只有少數(shù)記錄的數(shù)據(jù)集執(zhí)行分析一樣簡(jiǎn)單(并且比上面提到的eDX類(lèi)中教授的Python方法簡(jiǎn)單一個(gè)數(shù)量級(jí))。
試探性分析
(您可以查看用于Spark處理數(shù)據(jù)的R代碼,并在此R Notebook中生成可視化數(shù)據(jù))有20,368,412個(gè)有效id的用戶(hù)在此數(shù)據(jù)集中提供評(píng)論。 其中51.9%的用戶(hù)只寫(xiě)了一篇評(píng)論。
相應(yīng)地,此數(shù)據(jù)集中有8,210,439個(gè)單獨(dú)的產(chǎn)品,其中43.3%只有一個(gè)評(píng)論。
刪除幾個(gè)重復(fù)的評(píng)分后,我為每個(gè)評(píng)分添加了幾個(gè)函數(shù),這可能有助于說(shuō)明審核行為隨時(shí)間的變化:一個(gè)能表示給定該評(píng)論的作者的#評(píng)論排名值(作者的***次評(píng)論,第二次評(píng)論等),一個(gè)指示給定接到該評(píng)論的產(chǎn)品已經(jīng)接收到的#評(píng)論(產(chǎn)品的***評(píng)論,產(chǎn)品的第二評(píng)論等)的評(píng)級(jí)值以及進(jìn)行評(píng)論的月份和年份。
前兩個(gè)添加的函數(shù)需要非常大的處理能力,這突出Spark的性能事實(shí)上,Spark使用默認(rèn)情況下所有的CPU核心,而典型的R / Python方法是單線(xiàn)程的!)
這些更改被緩存到Spark DataFrame df_t中。 如果我想確定哪個(gè)亞馬遜產(chǎn)品類(lèi)別獲得***平均評(píng)論評(píng)分,我可以按類(lèi)別整合數(shù)據(jù),計(jì)算每個(gè)類(lèi)別的平均評(píng)分,然后排序。多虧Spark的強(qiáng)大功能,這個(gè)數(shù)百萬(wàn)記錄的數(shù)據(jù)處理需要幾秒鐘。
也可以使用ggplot2以圖表形式顯示:
數(shù)字音樂(lè)/ CD產(chǎn)品平均獲得***評(píng)價(jià),而視頻游戲和手機(jī)得到***平均評(píng)價(jià),評(píng)分范圍為0.77。 這確實(shí)說(shuō)明了一些直觀(guān)的聯(lián)系; 購(gòu)買(mǎi)數(shù)字音樂(lè)和CD這類(lèi)產(chǎn)品時(shí),你知道你會(huì)得到什么,沒(méi)有產(chǎn)生隨機(jī)缺陷機(jī)會(huì),而手機(jī)和配件根據(jù)背后的第三方賣(mài)家的會(huì)有不同的質(zhì)量(電子游戲尤其容易由于微小的不合理而產(chǎn)生評(píng)論的“爆炸”)。
我們可以將每個(gè)條細(xì)分分成從1-5的每個(gè)評(píng)級(jí)的百分比,更利于該可視化。 也可以將餅圖圖表劃分成不同類(lèi)別,但像這樣碼成條形圖再縮放到100%能看起來(lái)更清爽。
新的圖表確實(shí)有助于支持上述理論; 頂部的類(lèi)別的4/5星評(píng)級(jí)的百分比顯著高于底部類(lèi)別,并且1/2/3***評(píng)分的比例低得多,底部類(lèi)別與之相反。那么這些故障如何隨時(shí)間而改變? 還有其他因素在發(fā)揮嗎?
隨時(shí)間變化的評(píng)級(jí)
也許出現(xiàn)在二十世紀(jì)二十年代社會(huì)媒體中的二元評(píng)級(jí)“喜歡/不喜歡”已經(jīng)轉(zhuǎn)化為五***評(píng)論系統(tǒng)的行為。 以下是從2000年1月至2014年7月每月撰寫(xiě)的評(píng)論的評(píng)分細(xì)目:
投票行為在一段時(shí)間內(nèi)非常輕微地振蕩,沒(méi)有清晰的尖峰或拐點(diǎn),這與該理論沖突。
平均值分布
我們應(yīng)該看看亞馬遜的產(chǎn)品分?jǐn)?shù)的全球平均值(即客戶(hù)在購(gòu)買(mǎi)產(chǎn)品時(shí)看到的),以及給出分級(jí)的用戶(hù)。在我們期望中兩者分布匹配,所以任何偏差都會(huì)很有趣。關(guān)注至少評(píng)級(jí)5的產(chǎn)品時(shí),有4.16平均總評(píng)級(jí):
當(dāng)查看反應(yīng)用戶(hù)給出的總體評(píng)分類(lèi)似的圖表時(shí)(5個(gè)評(píng)級(jí)***),平均評(píng)級(jí)略高于4.20。
這兩種分配的主要區(qū)別是亞馬遜客戶(hù)只有5星評(píng)價(jià)的比例明顯更高。歸納和總結(jié)兩個(gè)圖表可以清楚突出了差異。
特別的評(píng)論
幾個(gè)帖子前,我討論了Reddit帖子的***個(gè)評(píng)論為何比以后的評(píng)論有更大的影響。 在做出越來(lái)越多的評(píng)論后,用戶(hù)評(píng)分行為是否會(huì)改變? 同一件產(chǎn)品的***次評(píng)價(jià),與典型的評(píng)級(jí)行為是否不同?這里是某個(gè)用戶(hù)給出的幾個(gè)亞馬遜評(píng)論的評(píng)分細(xì)目:
***個(gè)用戶(hù)評(píng)論的評(píng)分比之后的評(píng)價(jià)稍高。其他情況下,評(píng)級(jí)行為大部分是相同的,雖然用戶(hù)給4星而不是5星評(píng)價(jià)的比例增加,由于這樣更舒適。相比之下,這里是某亞馬遜產(chǎn)品收到的幾個(gè)評(píng)論的評(píng)分細(xì)目:
***個(gè)產(chǎn)品評(píng)論是5星評(píng)價(jià)的可能略高于隨后的評(píng)論。 然而,在第10次審查之后,評(píng)級(jí)分布沒(méi)有變化,這意味著特殊評(píng)級(jí)行為獨(dú)立于該閾值之后的當(dāng)前評(píng)分。
總結(jié)
的確,這篇博文中使用數(shù)據(jù)多于分析它。 在未來(lái)技術(shù)發(fā)布中,可能更有趣的是特定條件下的行為,例如根據(jù)該產(chǎn)品/該用戶(hù)以前的評(píng)價(jià),預(yù)測(cè)評(píng)論的評(píng)級(jí)。 然而,這篇文章表明,雖然“大數(shù)據(jù)”可能現(xiàn)在仍是一個(gè)令人費(fèi)解的流行語(yǔ),但即使你不必為一家財(cái)富500強(qiáng)公司工作,也能夠理解它。 即使數(shù)據(jù)集由5個(gè)簡(jiǎn)單的函數(shù)組成,您也可以歸納大量的結(jié)論。
而這篇文章甚至不需要查看亞馬遜的產(chǎn)品評(píng)論的文本或與產(chǎn)品相關(guān)的元數(shù)據(jù)! 只要有想法,就能完成。
您可以在R Notebook中查看所有用于可視化Amazon數(shù)據(jù)的R和ggplot2代碼。您還可以在此GitHub存儲(chǔ)庫(kù)中查看用于此帖子的鏡像/數(shù)據(jù)。