本篇文章以模仿為主,利用pandas進行數據處理,分析用戶消費行為。數據來源CDNow網站的用戶購買明細。一共有用戶ID,購買日期,購買數量,購買金額四個字段。
分析步驟
第一部分:數據類型的處理—字段的清洗
缺失值的處理、數據類型的轉化
第二部分:按月數據分析
每月的消費總金額、每月的消費次數、每月的產品購買量、每月的消費人數
第三部分:用戶個體消費數據分析
用戶消費金額和消費次數的描述統(tǒng)計、用戶消費金額和消費次數的散點圖、用戶消費金額的分布圖(二八法則)、用戶消費次數的分布圖
、用戶累計消費金額的占比
第四部分:用戶消費行為分析
用戶第一次消費時間、用戶最后一次消費時間、新老客消費比、用戶分層、用戶購買周期、用戶生命周期。
第一部分:數據類型的處理—字段的清洗
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
%matplotlib inline
plt.style.use('ggplot')
加載包和數據,文件是txt,用read_table方法打開,因為原始數據不包含表頭,所以需要賦予。字符串是空格分割,用\s+表示匹配任意空白符。
一般csv的數據分隔是以逗號的形式,但是這份來源于網上的數據比價特殊,它是通過多個空格來進行分隔
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:購買產品數
order_amount:購買金額
消費行業(yè)或者是電商行業(yè)一般是通過訂單數,訂單額,購買日期,用戶ID這四個字段來分析的?;旧线@四個字段就可以進行很豐富的分析。

觀察數據,判斷數據是否正常識別。值得注意的是一個用戶可能在一天內購買多次,用戶ID為2的用戶在1月12日買了兩次,這個細節(jié)不要遺漏。

查看數據類型、數據是否存在空值;原數據沒有空值,很干凈的數據。接下來我們要將時間的數據類型轉化。
當利用pandas進行數據處理的時候,經常會遇見數據類型的問題,當拿到數據的時候,首先要確定拿到的是正確的數據類型,如果數據類型不正確需要進行數據類型的轉化,再進行數據處理。附:常見pandas數據類型轉化

用戶平均每筆訂單購買2.4個商品,標準差在2.3,稍稍具有波動性。中位數在2個商品,75分位數在3個商品,說明絕大部分訂單的購買量都不多。最大值在99個,數字比較高。購買金額的情況差不多,大部分訂單都集中在小額。
一般而言,消費類的數據分布,都是長尾形態(tài)。大部分用戶都是小額,然而小部分用戶貢獻了收入的大頭,俗稱二八。
數據類型的轉化
df['order_dt'] = pd.to_datetime(df.order_dt,format = '%Y%m%d') #Y四位數的日期部分,y表示兩位數的日期部分
df['month'] = df.order_dt.values.astype('datetime64[M]')?
到目前為止,我們已經把數據類型處理成我們想要的類型了。我們通過四個字段及衍生字段就可以進行后續(xù)的分析了。
第二部分:按月數據分析
接下來我們用之前清洗好的字段進行數據分析。從用戶方向、訂單方向、消費趨勢等進行分析。
1、消費趨勢的分析
每月的消費總金額
每月的消費次數
每月的產品購買量
每月的消費人數
目的:了解這批數據的波動形式。
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消費總金額。從圖中可以看到,前幾個月的銷量非常高漲。數據比較異常。而后期的銷量則很平穩(wěn)。

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

每月的產品購買量一樣呈現早期購買量多,后期平穩(wěn)下降的趨勢。為什么會呈現這個原因呢?我們假設是用戶身上出了問題,早期時間段的用戶中有異常值,第二假設是各類促銷營銷,但這里只有消費數據,所以無法判斷。
04-每月的消費人數(去重)
方法一:df.groupby('month').user_id.apply(lambdax:len(x.drop_duplicates())).plot()
方法二:df.groupby('month').user_id.nunique().plot()

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

數據透視表是更簡單的方法,有了這個之后大家用里面的數據進行作圖也是OK的,而且更加的快捷,所以pandas到后面的話解決一個問題會想到兩到三個方法。具體看那個方便,那個簡單。
第三部分:用戶個體消費數據分析
之前我們維度都是月,來看的是趨勢。有時候我們也需要看個體來看這個人的消費能力如何,這里劃分了五個方向如下:
用戶消費金額和消費次數的描述統(tǒng)計
用戶消費金額和消費次數的散點圖
用戶消費金額的分布圖(二八法則)
用戶消費次數的分布圖
用戶累計消費金額的占比(百分之多少的用戶占了百分之多少的消費額)

從用戶角度看,每位用戶平均購買7張CD,最多的用戶購買了1033張。用戶的平均消費金額(客單價)100元,標準差是240,結合分位數和最大值看,平均值才和75分位接近,肯定存在小部分的高額消費用戶。
如果大家能夠接觸到消費、金融和錢相關的數據,基本上都符合二八法則,小部分的用戶占了消費的大頭

繪制用戶的散點圖,用戶比較健康而且規(guī)律性很強。因為這是CD網站的銷售數據,商品比較單一,金額和商品量的關系也因此呈線性,沒幾個離群點。

從上圖直方圖可知,大部分用戶的消費能力確實不高,絕大部分呈現集中在很低的消費檔次。高消費用戶在圖上幾乎看不到,這也確實符合消費行為的行業(yè)規(guī)律。
雖然有極致干擾了我們的數據,但是大部分的用戶還是集中在比較低的而消費檔次。

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




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

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



觀察用戶的最后一次消費時間。用戶最后一次消費比第一次消費分布廣,大部分最后一次消費集中在前三個月,說明很多客戶購買一次就不再進行購買。隨著時間的增長,最后一次購買數也在遞增,消費呈現流失上升的情況,用戶忠誠度在慢慢下降。

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

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

order_products求的是消費產品數,把它替換成消費次數也是可以,但是因為我們這里消費次數是比較固定的,所以使用消費產品數的維度。

R表示客戶最近一次交易時間的間隔,客戶在最近一段時間內交易的金額。F表示客戶在最近一段時間內交易的次數,F值越大,表示客戶交易越頻繁,反之則表示客戶交易不夠活躍。M表示客戶在最近一段時間內交易的金額。M值越大,表示客戶價值越高,反之則表示客戶價值越低。

用戶分層,這里使用平均數

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

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

從RFM分層可知,大部分用戶為重要保持客戶,但是這是由于極致的影響,所以RFM的劃分應該盡量以業(yè)務為準。盡量用小部分的用戶覆蓋大部分的額度,不要為了數據好看劃分等級。
RFM是人工使用象限法把數據劃分為幾個立方體,立方體對應相應的標簽,我們可以把標簽運用到業(yè)務層面上。比如重要保持客戶貢獻金額最多159203.62,我們如何與業(yè)務方配合把數據提高或者維護;而重要發(fā)展客戶和重要挽留客戶他們有一段時間沒有消費了,我們如何把他們拉回來

用戶每個月的消費次數,對于生命周期的劃分只需要知道用戶本月是否消費,消費次數在這里并不重要,需要將模型進行簡化
使用數據透視表,需要明確獲得什么結果。有些用戶在某月沒有進行過消費,會用NaA表示,這里用filna填充。

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

主要分為兩部分的判斷,以本月是否消費為界。本月沒有消費,還要額外判斷他是不是新客,因為部分用戶是3月份才消費成為新客,那么在1、2月份他連新客都不是,用unreg表示。如果是老客,則為unactive
本月若沒有消費,需要判斷是不是第一次消費,上一個時間窗口有沒有消費??梢远嗾{試幾次理順里面的邏輯關系,對用戶進行分層。
《業(yè)內主流寫法》
這里用戶生命周期的狀態(tài)變化是用數據透視表一次性做的,但在實際業(yè)務場景中我們可能用SQL把它作為中間表來處理。我們有了明細表,會通過明細表來計算出狀態(tài)表;也就是它的數據上個月是什么樣的情況得出來,比如上個月是新用戶或者回流用戶,我們直接用上個月的狀態(tài)left join本月的狀態(tài)。直接用SQL進行對比
可以用pandas將每個月的狀態(tài)計算出來,不是逐行而是月份計算,先算出一月份哪些用戶是新購買的,然后判斷二月份是否購買,兩者left join




由上表可知,每月用戶的消費狀態(tài)變化?;钴S用戶、持續(xù)消費的用戶對應的是消費運營質量。回流用戶,之前不消費本月才消費對應的是喚回運營。不活躍的用戶對應的是流失
這里可以針對業(yè)務模型下個定義:流失用戶增加,回流用戶正在減少


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

訂單周期呈指數分布,用戶的平均購買周期是68天,絕大部分用戶的購買周期都低于100天。


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

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

篩選出lifetime>0,既排除了僅消費了一次那些人,有不少用戶生命周期靠攏在0天,部分質量差的用戶雖然消費了兩次,但是任然無法持續(xù),在用戶首次消費30天內應該盡量引導。少部分用戶集中在50—300天,屬于普通型的生命周期。高質量用戶的生命周期,集中在400天以后,這屬于忠誠用戶。

applymap針對DataFrame里的所有數據。用lambda進行判斷,因為這里設計了多個結果,所以要兩個if else

用sum和count相除即可計算出復購率。因為這兩個函數都會忽略NAN,而NAN是沒有消費的用戶,count不論是0還是1都會統(tǒng)計,所以是總的消費用戶數,而sum求何計算了兩次以上的消費用戶。這里用了比較巧妙的替代法計算復購率,SQL中也可以用。
圖上可以看出復購率在早期,因為大量新用戶加入的關系,新客的復購率并不高,譬如1月新客們的復購率只有6%左右。而在后期,這時的用戶都是大浪淘沙剩下的老客戶,復購率比較穩(wěn)定,在20%左右.
單看新客和老客,復購率有三倍左右的差距
接下來計算回購率。回購率是某一個時間窗口內消費的用戶,在下一個時間窗口人就消費的占比。我1月消費用戶1000,他們中有300個2月依然消費,回購率是30%




0代表當月消費過次月沒有消費過,1代表當月消費過次月依然消費
新建一個判斷函數。data是輸入數據,既用戶在18個月內是否消費的記錄,status是空列表,后續(xù)用來保存用戶是否回購的字段。因為有18個月,所以每個月都要進行一次判斷,需要用到循環(huán)。if的主要邏輯是,如果用戶本月進行過消費,且下月消費過,記為1,沒有消費過是0.本月若沒有進行過消費,為NAN,后續(xù)的統(tǒng)計中進行排除。apply函數應用在所有行上,獲得想要的結果。
最后計算和復購率大同小異,用count和sum求出,從圖中可以看出,用戶的回購率高于復購,約在30%左右,和老客戶差異不大。從回購率和復購率綜合分析可以得出,新客的整體質量低于老客,老客的忠誠度(回購率)表現較好,消費頻次稍次,這是CDNow網站的用戶消費特征。