本篇文章以模仿為主,利用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)站的用戶消費特征脯厨。