第一篇數(shù)據(jù)分析項目實戰(zhàn):用戶消費行為分析

本篇文章以模仿為主,利用pandas進行數(shù)據(jù)處理,分析用戶消費行為翻斟。數(shù)據(jù)來源CDNow網(wǎng)站的用戶購買明細。一共有用戶ID汪茧,購買日期傻昙,購買數(shù)量荆萤,購買金額四個字段斯棒。

分析步驟

第一部分:數(shù)據(jù)類型的處理—字段的清洗

缺失值的處理玉吁、數(shù)據(jù)類型的轉(zhuǎn)化

第二部分:按月數(shù)據(jù)分析

每月的消費總金額、每月的消費次數(shù)言津、每月的產(chǎn)品購買量攻人、每月的消費人數(shù)

第三部分:用戶個體消費數(shù)據(jù)分析

用戶消費金額和消費次數(shù)的描述統(tǒng)計、用戶消費金額和消費次數(shù)的散點圖纺念、用戶消費金額的分布圖(二八法則)、用戶消費次數(shù)的分布圖

想括、用戶累計消費金額的占比

第四部分:用戶消費行為分析

用戶第一次消費時間陷谱、用戶最后一次消費時間、新老客消費比瑟蜈、用戶分層烟逊、用戶購買周期、用戶生命周期铺根。

第一部分:數(shù)據(jù)類型的處理—字段的清洗

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from datetime import datetime

%matplotlib inline

plt.style.use('ggplot')

加載包和數(shù)據(jù)宪躯,文件是txt,用read_table方法打開位迂,因為原始數(shù)據(jù)不包含表頭访雪,所以需要賦予。字符串是空格分割掂林,用\s+表示匹配任意空白符臣缀。

一般csv的數(shù)據(jù)分隔是以逗號的形式,但是這份來源于網(wǎng)上的數(shù)據(jù)比價特殊泻帮,它是通過多個空格來進行分隔

columns = ['user_id','order_dt','order_products','order_amount']

df = pd.read_table("CDNOW_master.txt",names = columns,sep = '\s+')

列字段的含義:

user_id:用戶ID

order_dt:購買日期

order_products:購買產(chǎn)品數(shù)

order_amount:購買金額

消費行業(yè)或者是電商行業(yè)一般是通過訂單數(shù)精置,訂單額,購買日期锣杂,用戶ID這四個字段來分析的脂倦》基本上這四個字段就可以進行很豐富的分析。

觀察數(shù)據(jù)赖阻,判斷數(shù)據(jù)是否正常識別蝶押。值得注意的是一個用戶可能在一天內(nèi)購買多次,用戶ID為2的用戶在1月12日買了兩次政供,這個細節(jié)不要遺漏播聪。

查看數(shù)據(jù)類型、數(shù)據(jù)是否存在空值布隔;原數(shù)據(jù)沒有空值离陶,很干凈的數(shù)據(jù)。接下來我們要將時間的數(shù)據(jù)類型轉(zhuǎn)化衅檀。

當(dāng)利用pandas進行數(shù)據(jù)處理的時候招刨,經(jīng)常會遇見數(shù)據(jù)類型的問題,當(dāng)拿到數(shù)據(jù)的時候哀军,首先要確定拿到的是正確的數(shù)據(jù)類型沉眶,如果數(shù)據(jù)類型不正確需要進行數(shù)據(jù)類型的轉(zhuǎn)化,再進行數(shù)據(jù)處理杉适。附:常見pandas數(shù)據(jù)類型轉(zhuǎn)化


用戶平均每筆訂單購買2.4個商品谎倔,標(biāo)準差在2.3,稍稍具有波動性猿推。中位數(shù)在2個商品片习,75分位數(shù)在3個商品,說明絕大部分訂單的購買量都不多蹬叭。最大值在99個藕咏,數(shù)字比較高。購買金額的情況差不多秽五,大部分訂單都集中在小額孽查。

一般而言,消費類的數(shù)據(jù)分布坦喘,都是長尾形態(tài)盲再。大部分用戶都是小額,然而小部分用戶貢獻了收入的大頭瓣铣,俗稱二八洲胖。

數(shù)據(jù)類型的轉(zhuǎn)化

df['order_dt'] = pd.to_datetime(df.order_dt,format = '%Y%m%d') #Y四位數(shù)的日期部分,y表示兩位數(shù)的日期部分

df['month'] = df.order_dt.values.astype('datetime64[M]')?

到目前為止坯沪,我們已經(jīng)把數(shù)據(jù)類型處理成我們想要的類型了绿映。我們通過四個字段及衍生字段就可以進行后續(xù)的分析了。

第二部分:按月數(shù)據(jù)分析

接下來我們用之前清洗好的字段進行數(shù)據(jù)分析。從用戶方向叉弦、訂單方向丐一、消費趨勢等進行分析。

1淹冰、消費趨勢的分析

每月的消費總金額

每月的消費次數(shù)

每月的產(chǎn)品購買量

每月的消費人數(shù)

目的:了解這批數(shù)據(jù)的波動形式库车。

01-每月消費總金額

grouped_month = df.groupby('month')

order_month_amount = grouped_month.order_amount.sum()

order_month_amount.head()

用groupby創(chuàng)建一個新的對象。這里要觀察消費總金額樱拴,需要將order_amount求和


按月統(tǒng)計每個月的CD消費總金額柠衍。從圖中可以看到,前幾個月的銷量非常高漲晶乔。數(shù)據(jù)比較異常珍坊。而后期的銷量則很平穩(wěn)。


前三個月的消費訂單數(shù)在10000筆左右正罢,后續(xù)月份的消費人數(shù)則在2500人左右阵漏。


每月的產(chǎn)品購買量一樣呈現(xiàn)早期購買量多,后期平穩(wěn)下降的趨勢翻具。為什么會呈現(xiàn)這個原因呢履怯?我們假設(shè)是用戶身上出了問題,早期時間段的用戶中有異常值裆泳,第二假設(shè)是各類促銷營銷叹洲,但這里只有消費數(shù)據(jù),所以無法判斷工禾。

04-每月的消費人數(shù)(去重)

方法一:df.groupby('month').user_id.apply(lambdax:len(x.drop_duplicates())).plot()

方法二:df.groupby('month').user_id.nunique().plot()


每月的消費人數(shù)小于每月的消費次數(shù)运提,但是區(qū)別不大。前三個月每月的消費人數(shù)在8000—10000之間帜篇,后續(xù)月份糙捺,平均消費人數(shù)在2000不到诫咱。一樣是前期消費人數(shù)多笙隙,后期平穩(wěn)下降的趨勢。


數(shù)據(jù)透視表是更簡單的方法坎缭,有了這個之后大家用里面的數(shù)據(jù)進行作圖也是OK的竟痰,而且更加的快捷,所以pandas到后面的話解決一個問題會想到兩到三個方法掏呼。具體看那個方便坏快,那個簡單。

第三部分:用戶個體消費數(shù)據(jù)分析

之前我們維度都是月憎夷,來看的是趨勢莽鸿。有時候我們也需要看個體來看這個人的消費能力如何,這里劃分了五個方向如下:

用戶消費金額和消費次數(shù)的描述統(tǒng)計

用戶消費金額和消費次數(shù)的散點圖

用戶消費金額的分布圖(二八法則)

用戶消費次數(shù)的分布圖

用戶累計消費金額的占比(百分之多少的用戶占了百分之多少的消費額)


從用戶角度看,每位用戶平均購買7張CD祥得,最多的用戶購買了1033張兔沃。用戶的平均消費金額(客單價)100元,標(biāo)準差是240级及,結(jié)合分位數(shù)和最大值看乒疏,平均值才和75分位接近,肯定存在小部分的高額消費用戶饮焦。

如果大家能夠接觸到消費怕吴、金融和錢相關(guān)的數(shù)據(jù),基本上都符合二八法則县踢,小部分的用戶占了消費的大頭


繪制用戶的散點圖转绷,用戶比較健康而且規(guī)律性很強。因為這是CD網(wǎng)站的銷售數(shù)據(jù)殿雪,商品比較單一暇咆,金額和商品量的關(guān)系也因此呈線性,沒幾個離群點丙曙。


從上圖直方圖可知爸业,大部分用戶的消費能力確實不高,絕大部分呈現(xiàn)集中在很低的消費檔次亏镰。高消費用戶在圖上幾乎看不到扯旷,這也確實符合消費行為的行業(yè)規(guī)律。

雖然有極致干擾了我們的數(shù)據(jù)索抓,但是大部分的用戶還是集中在比較低的而消費檔次钧忽。


到目前為止關(guān)于用戶的消費行為有一個大概的了解


按用戶消費金額進行升序排序,由圖可知50%的用戶僅貢獻了15%的銷售額度逼肯。而排名前5000的用戶就貢獻了60%的消費額耸黑。也就是說我們只要維護了這5000個用戶就可以把業(yè)績KPI完成60%,如果能把5000個用戶運營的更好就可以占比70%—80%之間篮幢。

第四部分:用戶消費行為分析


求月份的最小值大刊,即用戶消費行為中的第一次消費時間。所有用戶的第一次消費都集中在前三個月.




觀察用戶的最后一次消費時間三椿。用戶最后一次消費比第一次消費分布廣缺菌,大部分最后一次消費集中在前三個月,說明很多客戶購買一次就不再進行購買搜锰。隨著時間的增長伴郁,最后一次購買數(shù)也在遞增,消費呈現(xiàn)流失上升的情況蛋叼,用戶忠誠度在慢慢下降焊傅。


user_id為1的用戶第一次消費時間和最后一次消費時間為19970101剂陡,說明他只消費了一次


有一半的用戶只消費了一次


order_products求的是消費產(chǎn)品數(shù),把它替換成消費次數(shù)也是可以狐胎,但是因為我們這里消費次數(shù)是比較固定的鹏倘,所以使用消費產(chǎn)品數(shù)的維度。


R表示客戶最近一次交易時間的間隔顽爹,客戶在最近一段時間內(nèi)交易的金額纤泵。F表示客戶在最近一段時間內(nèi)交易的次數(shù),F值越大,表示客戶交易越頻繁镜粤,反之則表示客戶交易不夠活躍捏题。M表示客戶在最近一段時間內(nèi)交易的金額。M值越大肉渴,表示客戶價值越高公荧,反之則表示客戶價值越低。


用戶分層同规,這里使用平均數(shù)


M不同層次客戶的消費累計金額循狰,重要保持客戶的累計消費金額最高


不同層次用戶的消費人數(shù),之前重要保持客戶的累計消費金額最高券勺,這里重要保持客戶的消費人數(shù)排名第二绪钥,但離一般挽留用戶差距比較大,一般挽留用戶有14074人关炼,重要保持客戶4554人


從RFM分層可知程腹,大部分用戶為重要保持客戶,但是這是由于極致的影響儒拂,所以RFM的劃分應(yīng)該盡量以業(yè)務(wù)為準寸潦。盡量用小部分的用戶覆蓋大部分的額度,不要為了數(shù)據(jù)好看劃分等級社痛。

RFM是人工使用象限法把數(shù)據(jù)劃分為幾個立方體见转,立方體對應(yīng)相應(yīng)的標(biāo)簽,我們可以把標(biāo)簽運用到業(yè)務(wù)層面上蒜哀。比如重要保持客戶貢獻金額最多159203.62斩箫,我們?nèi)绾闻c業(yè)務(wù)方配合把數(shù)據(jù)提高或者維護;而重要發(fā)展客戶和重要挽留客戶他們有一段時間沒有消費了凡怎,我們?nèi)绾伟阉麄兝貋?/p>


用戶每個月的消費次數(shù)校焦,對于生命周期的劃分只需要知道用戶本月是否消費赊抖,消費次數(shù)在這里并不重要统倒,需要將模型進行簡化

使用數(shù)據(jù)透視表,需要明確獲得什么結(jié)果氛雪。有些用戶在某月沒有進行過消費房匆,會用NaA表示,這里用filna填充。


對于尾部數(shù)據(jù)浴鸿,user_id2W+的數(shù)據(jù)是有問題的井氢,因為從實際的業(yè)務(wù)場景上說,他們一月和二月都沒有注冊三月份才是他們第一次消費岳链。透視會把他們一月和二月的數(shù)據(jù)補上為0花竞,這里面需要進行判斷將第一次消費作為生命周期的起始,不能從一月份開始就粗略的計算


主要分為兩部分的判斷掸哑,以本月是否消費為界约急。本月沒有消費,還要額外判斷他是不是新客苗分,因為部分用戶是3月份才消費成為新客厌蔽,那么在1、2月份他連新客都不是摔癣,用unreg表示奴饮。如果是老客,則為unactive

本月若沒有消費择浊,需要判斷是不是第一次消費戴卜,上一個時間窗口有沒有消費∽裂遥可以多調(diào)試幾次理順里面的邏輯關(guān)系叉瘩,對用戶進行分層。

《業(yè)內(nèi)主流寫法》

這里用戶生命周期的狀態(tài)變化是用數(shù)據(jù)透視表一次性做的粘捎,但在實際業(yè)務(wù)場景中我們可能用SQL把它作為中間表來處理薇缅。我們有了明細表,會通過明細表來計算出狀態(tài)表攒磨;也就是它的數(shù)據(jù)上個月是什么樣的情況得出來泳桦,比如上個月是新用戶或者回流用戶,我們直接用上個月的狀態(tài)left join本月的狀態(tài)娩缰。直接用SQL進行對比

可以用pandas將每個月的狀態(tài)計算出來灸撰,不是逐行而是月份計算,先算出一月份哪些用戶是新購買的拼坎,然后判斷二月份是否購買浮毯,兩者left join



由上表可知,每月用戶的消費狀態(tài)變化泰鸡≌叮活躍用戶、持續(xù)消費的用戶對應(yīng)的是消費運營質(zhì)量盛龄∈渭#回流用戶芳誓,之前不消費本月才消費對應(yīng)的是喚回運營。不活躍的用戶對應(yīng)的是流失

這里可以針對業(yè)務(wù)模型下個定義:流失用戶增加啊鸭,回流用戶正在減少


user_id 1為空值锹淌,表示該客戶只購買過一個訂單。user_id為2 的用戶第二筆訂單與第二筆訂單在同一天購買


訂單周期呈指數(shù)分布赠制,用戶的平均購買周期是68天赂摆,絕大部分用戶的購買周期都低于100天。


數(shù)據(jù)偏移比較大钟些,中位數(shù)是0天也就是超過50%的用戶他的生命周期是0天只購買了一次库正,但是平均生命周期有134天,最大值是544天


用戶的生命周期受只購買一次的用戶影響比較厲害(可以排除)厘唾,用戶均消費134天褥符,中位數(shù)僅0天

篩選出lifetime>0,既排除了僅消費了一次那些人,有不少用戶生命周期靠攏在0天抚垃,部分質(zhì)量差的用戶雖然消費了兩次喷楣,但是任然無法持續(xù),在用戶首次消費30天內(nèi)應(yīng)該盡量引導(dǎo)鹤树。少部分用戶集中在50—300天铣焊,屬于普通型的生命周期。高質(zhì)量用戶的生命周期罕伯,集中在400天以后曲伊,這屬于忠誠用戶。


applymap針對DataFrame里的所有數(shù)據(jù)追他。用lambda進行判斷雕擂,因為這里設(shè)計了多個結(jié)果直秆,所以要兩個if else


用sum和count相除即可計算出復(fù)購率闹炉。因為這兩個函數(shù)都會忽略NAN脊框,而NAN是沒有消費的用戶,count不論是0還是1都會統(tǒng)計单雾,所以是總的消費用戶數(shù)赚哗,而sum求何計算了兩次以上的消費用戶。這里用了比較巧妙的替代法計算復(fù)購率硅堆,SQL中也可以用屿储。

圖上可以看出復(fù)購率在早期,因為大量新用戶加入的關(guān)系渐逃,新客的復(fù)購率并不高够掠,譬如1月新客們的復(fù)購率只有6%左右。而在后期朴乖,這時的用戶都是大浪淘沙剩下的老客戶祖屏,復(fù)購率比較穩(wěn)定,在20%左右.

單看新客和老客买羞,復(fù)購率有三倍左右的差距

接下來計算回購率袁勺。回購率是某一個時間窗口內(nèi)消費的用戶畜普,在下一個時間窗口人就消費的占比期丰。我1月消費用戶1000,他們中有300個2月依然消費吃挑,回購率是30%





0代表當(dāng)月消費過次月沒有消費過钝荡,1代表當(dāng)月消費過次月依然消費

新建一個判斷函數(shù)。data是輸入數(shù)據(jù)舶衬,既用戶在18個月內(nèi)是否消費的記錄埠通,status是空列表,后續(xù)用來保存用戶是否回購的字段逛犹。因為有18個月端辱,所以每個月都要進行一次判斷,需要用到循環(huán)虽画。if的主要邏輯是舞蔽,如果用戶本月進行過消費,且下月消費過码撰,記為1渗柿,沒有消費過是0.本月若沒有進行過消費,為NAN脖岛,后續(xù)的統(tǒng)計中進行排除朵栖。apply函數(shù)應(yīng)用在所有行上,獲得想要的結(jié)果柴梆。

最后計算和復(fù)購率大同小異混槐,用count和sum求出,從圖中可以看出轩性,用戶的回購率高于復(fù)購,約在30%左右声登,和老客戶差異不大。從回購率和復(fù)購率綜合分析可以得出揣苏,新客的整體質(zhì)量低于老客悯嗓,老客的忠誠度(回購率)表現(xiàn)較好,消費頻次稍次卸察,這是CDNow網(wǎng)站的用戶消費特征脯厨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坑质,隨后出現(xiàn)的幾起案子合武,更是在濱河造成了極大的恐慌临梗,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稼跳,死亡現(xiàn)場離奇詭異盟庞,居然都是意外死亡,警方通過查閱死者的電腦和手機汤善,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門什猖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人红淡,你說我怎么就攤上這事不狮。” “怎么了在旱?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵摇零,是天一觀的道長。 經(jīng)常有香客問我桶蝎,道長遂黍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任俊嗽,我火速辦了婚禮雾家,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绍豁。我一直安慰自己芯咧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布竹揍。 她就那樣靜靜地躺著敬飒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芬位。 梳的紋絲不亂的頭發(fā)上无拗,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音昧碉,去河邊找鬼英染。 笑死,一個胖子當(dāng)著我的面吹牛被饿,可吹牛的內(nèi)容都是我干的四康。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼狭握,長吁一口氣:“原來是場噩夢啊……” “哼闪金!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哎垦,失蹤者是張志新(化名)和其女友劉穎囱嫩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漏设,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡墨闲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了愿题。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损俭。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛙奖,死狀恐怖潘酗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雁仲,我是刑警寧澤仔夺,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站攒砖,受9級特大地震影響缸兔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吹艇,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一惰蜜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧受神,春花似錦抛猖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撑碴,卻和暖如春撑教,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背醉拓。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工伟姐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亿卤。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓玫镐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怠噪。 傳聞我的和親對象是個殘疾皇子恐似,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359