数据分析项目整理之用户消费行为分析
目錄
數(shù)據(jù)預(yù)處理-清洗字段
按用戶個體消費(fèi)數(shù)據(jù)分析
用戶消費(fèi)金額和消費(fèi)次數(shù)的描述統(tǒng)計
用戶消費(fèi)金額和消費(fèi)次數(shù)的散點圖
用戶消費(fèi)金額的分布圖(二八法則)
用戶消費(fèi)次數(shù)的分布圖
用戶累計消費(fèi)金額的占比
按月數(shù)據(jù)分析
每月消費(fèi)總金額
每月的消費(fèi)次數(shù)(訂單數(shù))
每月的產(chǎn)品購買量
每月的消費(fèi)人數(shù)(去重)?
用戶消費(fèi)行為分析
用戶第一次消費(fèi)(首購)?
用戶最后一次消費(fèi)
新老客的消費(fèi)比
用戶分層?
用戶質(zhì)量
用戶生命周期
用戶購買周期
用戶復(fù)購率和回購率
本案例分析了來自CDNow網(wǎng)站的一份用戶購買CD明細(xì),進(jìn)一步分析用戶的消費(fèi)行為,提高決策質(zhì)量。數(shù)據(jù)來源CDNow網(wǎng)站的用戶購買明細(xì)。一共有用戶ID,購買日期,購買數(shù)量,購買金額四個字段。
數(shù)據(jù)預(yù)處理-清洗字段
- 加載包和數(shù)據(jù),文件是txt,用read_table方法打開,因為原始數(shù)據(jù)不包含表頭,所以需要賦予。字符串是空格分割,用\s+表示匹配任意空白符。
- 一般csv的數(shù)據(jù)分隔是以逗號的形式,但是這份來源于網(wǎng)上的數(shù)據(jù)比價特殊,它是通過多個空格來進(jìn)行分隔。
- 消費(fèi)行業(yè)或者是電商行業(yè)一般是通過訂單數(shù),訂單額,購買日期,用戶ID這四個字段來分析的。基本上這四個字段就可以進(jìn)行很豐富的分析。
- 觀察數(shù)據(jù),判斷數(shù)據(jù)是否正常識別。值得注意的是一個用戶可能在一天內(nèi)購買多次,用戶ID為2的用戶在1月12日買了兩次,這個細(xì)節(jié)不要遺漏。
- 查看數(shù)據(jù)類型、數(shù)據(jù)是否存在空值;原數(shù)據(jù)沒有空值,很干凈的數(shù)據(jù)。接下來我們要將時間的數(shù)據(jù)類型轉(zhuǎn)化。
- 當(dāng)利用pandas進(jìn)行數(shù)據(jù)處理的時候,經(jīng)常會遇見數(shù)據(jù)類型的問題,當(dāng)拿到數(shù)據(jù)的時候,首先要確定拿到的是正確的數(shù)據(jù)類型,如果數(shù)據(jù)類型不正確需要進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)化,再進(jìn)行數(shù)據(jù)處理。
- 用戶平均每筆訂單購買2.4個商品,標(biāo)準(zhǔn)差在2.3,稍稍具有波動性。中位數(shù)在2個商品,75分位數(shù)在3個商品,說明絕大部分訂單的購買量都不多。最大值在99個,數(shù)字比較高。購買金額的情況差不多,大部分訂單都集中在小額。
- 一般而言,消費(fèi)類的數(shù)據(jù)分布,都是長尾形態(tài)。大部分用戶都是小額,然而小部分用戶貢獻(xiàn)了收入的大頭,俗稱二八。
- 接下來我們要將時間的數(shù)據(jù)類型轉(zhuǎn)換。
- pd.to_datetime可以將特定的字符串或者數(shù)字轉(zhuǎn)換成時間格式,其中的format參數(shù)用于匹配。例如19970101,%Y匹配前四位數(shù)字1997,如果y小寫只匹配兩位數(shù)字97,%m匹配01,%d匹配01。
- 另外,小時是%h,分鐘是%M,注意和月的大小寫不一致,秒是%s。若是1997-01-01這形式,則是%Y-%m-%d,以此類推。
- astype也可以將時間格式進(jìn)行轉(zhuǎn)換,比如[M]轉(zhuǎn)化成月份。我們將月份作為消費(fèi)行為的主要事件窗口,選擇哪種時間窗口取決于消費(fèi)頻率。
- 上圖是轉(zhuǎn)化后的格式。月份依舊顯示日,只是變?yōu)樵鲁醯男问健?/li>
- pandas中有專門的時間序列方法tseries,它可以用來進(jìn)行時間偏移,也是處理時間類型的好方法。時間格式也能作為索引,在金融、財務(wù)等領(lǐng)域使用較多。
到目前為止,我們已經(jīng)把數(shù)據(jù)類型處理成我們想要的類型了。我們通過四個字段及衍生字段就可以進(jìn)行后續(xù)的分析了。
按用戶個體消費(fèi)數(shù)據(jù)分析
接下來我們用之前清洗好的字段進(jìn)行數(shù)據(jù)分析。我么可以按個體來看這個人的消費(fèi)能力如何,這里劃分了五個方向如下:
用戶消費(fèi)金額和消費(fèi)次數(shù)的描述統(tǒng)計
- 從用戶角度看,每位用戶平均購買7張CD,最多的用戶購買了1033張。用戶的平均消費(fèi)金額(客單價)100元,標(biāo)準(zhǔn)差是240,結(jié)合分位數(shù)和最大值看,平均值才和75分位接近,肯定存在小部分的高額消費(fèi)用戶。
- 如果大家能夠接觸到消費(fèi)、金融和錢相關(guān)的數(shù)據(jù),基本上都符合二八法則,小部分的用戶占了消費(fèi)的大頭。
用戶消費(fèi)金額和消費(fèi)次數(shù)的散點圖
- 繪制用戶的散點圖,用戶比較健康而且規(guī)律性很強(qiáng)。因為這是CD網(wǎng)站的銷售數(shù)據(jù),商品比較單一,金額和商品量的關(guān)系也因此呈線性,沒幾個離群點。
用戶消費(fèi)金額的分布圖(二八法則)
- 從上圖直方圖可知,大部分用戶的消費(fèi)能力確實不高,絕大部分呈現(xiàn)集中在很低的消費(fèi)檔次。高消費(fèi)用戶在圖上幾乎看不到,這也確實符合消費(fèi)行為的行業(yè)規(guī)律。
- 雖然有極致干擾了我們的數(shù)據(jù),但是大部分的用戶還是集中在比較低的而消費(fèi)檔次。
用戶消費(fèi)次數(shù)的分布圖
- 到目前為止關(guān)于用戶的消費(fèi)行為有一個大概的了解
用戶累計消費(fèi)金額的占比
- 按用戶消費(fèi)金額進(jìn)行升序排序,由圖可知50%的用戶僅貢獻(xiàn)了15%的銷售額度。而排名前5000的用戶就貢獻(xiàn)了60%的消費(fèi)額。也就是說我們只要維護(hù)了這5000個用戶就可以把業(yè)績KPI完成60%,如果能把5000個用戶運(yùn)營的更好就可以占比70%—80%之間。
按月數(shù)據(jù)分析
之前的維度是用戶個體,接下來我們按月來分析消費(fèi)趨勢,了解數(shù)據(jù)的波動形式。
每月消費(fèi)總金額
- 用groupby創(chuàng)建一個新的對象。這里要觀察消費(fèi)總金額,需要將order_amount求和。
- 按月統(tǒng)計每個月的CD消費(fèi)總金額。從圖中可以看到,前幾個月的銷量非常高漲。數(shù)據(jù)比較異常。而后期的銷量則很平穩(wěn)。
- 繪制每筆訂單的散點圖。從圖中觀察,訂單消費(fèi)金額和訂單商品量呈規(guī)律性,每個商品十元左右。訂單的極值較少,超出1000的就幾個。顯然不是異常波動的罪魁禍?zhǔn)住?/li>
每月的消費(fèi)次數(shù)(訂單數(shù))
- 前三個月的消費(fèi)訂單數(shù)在10000筆左右,后續(xù)月份的消費(fèi)人數(shù)則在2500人左右。
每月的產(chǎn)品購買量
- 每月的產(chǎn)品購買量一樣呈現(xiàn)早期購買量多,后期平穩(wěn)下降的趨勢。為什么會呈現(xiàn)這個原因呢?我們假設(shè)是用戶身上出了問題,早期時間段的用戶中有異常值,第二假設(shè)是各類促銷營銷,但這里只有消費(fèi)數(shù)據(jù),所以無法判斷。
每月的消費(fèi)人數(shù)(去重)
- 每月的消費(fèi)人數(shù)小于每月的消費(fèi)次數(shù),但是區(qū)別不大。前三個月每月的消費(fèi)人數(shù)在8000—10000之間,后續(xù)月份,平均消費(fèi)人數(shù)在2000不到。一樣是前期消費(fèi)人數(shù)多,后期平穩(wěn)下降的趨勢。
上面消費(fèi)趨勢的分析可以通過數(shù)據(jù)透視表分析 :
- 數(shù)據(jù)透視表是更簡單的方法,可以用里面的數(shù)據(jù)進(jìn)行作圖,而且更加的快捷。
用戶消費(fèi)行為分析
用戶第一次消費(fèi)(首購)?
在很多行業(yè)里面首購是一個很重要的維度,它和渠道息息相關(guān),尤其是針對客單價比較高客戶留存率比價低的行業(yè),第一次客戶從哪里來可以拓展出很多運(yùn)營方式。
- 求月份的最小值,即用戶消費(fèi)行為中的第一次消費(fèi)時間。所有用戶的第一次消費(fèi)都集中在前三個月。
用戶最后一次消費(fèi)
- 觀察用戶的最后一次消費(fèi)時間。用戶最后一次消費(fèi)比第一次消費(fèi)分布廣,大部分最后一次消費(fèi)集中在前三個月,說明很多客戶購買一次就不再進(jìn)行購買。隨著時間的增長,最后一次購買數(shù)也在遞增,消費(fèi)呈現(xiàn)流失上升的情況,用戶忠誠度在慢慢下降。
新老客的消費(fèi)比
- user_id為1的用戶第一次消費(fèi)時間和最后一次消費(fèi)時間為1997-01-01,說明他只消費(fèi)了一次。
- 有一半的用戶只消費(fèi)了一次。?
用戶分層?
- 用戶每個月的消費(fèi)次數(shù),對于生命周期的劃分只需要知道用戶本月是否消費(fèi),消費(fèi)次數(shù)在這里并不重要,需要將模型進(jìn)行簡化。
- 使用數(shù)據(jù)透視表,需要明確獲得什么結(jié)果。有些用戶在某月沒有進(jìn)行過消費(fèi),會用NaA表示,這里用filna填充。
- 對于尾部數(shù)據(jù),user_id2W+的數(shù)據(jù)是有問題的,因為從實際的業(yè)務(wù)場景上說,他們一月和二月都沒有注冊三月份才是他們第一次消費(fèi)。透視會把他們一月和二月的數(shù)據(jù)補(bǔ)上為0,這里面需要進(jìn)行判斷將第一次消費(fèi)作為生命周期的起始,不能從一月份開始就粗略的計算
- 主要分為兩部分的判斷,以本月是否消費(fèi)為界。本月沒有消費(fèi),還要額外判斷他是不是新客,因為部分用戶是3月份才消費(fèi)成為新客,那么在1、2月份他連新客都不是,用unreg表示。如果是老客,則為unactive。
- 本月若沒有消費(fèi),需要判斷是不是第一次消費(fèi),上一個時間窗口有沒有消費(fèi)。可以多調(diào)試幾次理順里面的邏輯關(guān)系,對用戶進(jìn)行分層。
- 這里用戶生命周期的狀態(tài)變化是用數(shù)據(jù)透視表一次性做的,但在實際業(yè)務(wù)場景中我們可能用SQL把它作為中間表來處理。我們有了明細(xì)表,會通過明細(xì)表來計算出狀態(tài)表;也就是它的數(shù)據(jù)上個月是什么樣的情況得出來,比如上個月是新用戶或者回流用戶,我們直接用上個月的狀態(tài)left join本月的狀態(tài)。直接用SQL進(jìn)行對比。
- 可以用pandas將每個月的狀態(tài)計算出來,不是逐行而是月份計算,先算出一月份哪些用戶是新購買的,然后判斷二月份是否購買,兩者left join。
- 由上表可知,每月用戶的消費(fèi)狀態(tài)變化。活躍用戶、持續(xù)消費(fèi)的用戶對應(yīng)的是消費(fèi)運(yùn)營質(zhì)量。回流用戶,之前不消費(fèi)本月才消費(fèi)對應(yīng)的是喚回運(yùn)營。不活躍的用戶對應(yīng)的是流失。
- 用戶回流占比在5%~8%,有下降趨勢。所謂回流占比,就是回流用戶在總用戶中的占比。另外一種指標(biāo)叫回流率,指上個月多少不活躍/消費(fèi)用戶在本月活躍/消費(fèi)。因為不活躍的用戶總量近似不變,所以這里的回流率也近似回流占比。
- 活躍用戶的下降趨勢更明顯,占比在3%~5%間。這里用戶活躍可以看作連續(xù)消費(fèi)用戶,質(zhì)量在一定程度上高于回流用戶。
- 結(jié)合回流用戶和活躍用戶看,在后期的消費(fèi)用戶中,60%是回流用戶,40%是活躍用戶/連續(xù)消費(fèi)用戶,整體質(zhì)量還好,但是針對這兩個分層依舊有改進(jìn)的空間,可以繼續(xù)細(xì)化數(shù)據(jù)。
這里可以針對業(yè)務(wù)模型下個定義:流失用戶增加,回流用戶正在減少。
用戶質(zhì)量
因為消費(fèi)行為有明顯的二八傾向,我們需要知道高質(zhì)量用戶為消費(fèi)貢獻(xiàn)了多少份額。
- 新建一個對象,按用戶的消費(fèi)金額生序。使用cumsum,它是累加函數(shù)。逐行計算累計的金額,最后的2500315便是總消費(fèi)額。
- 轉(zhuǎn)換成百分比。
- 繪制趨勢圖,橫坐標(biāo)是按貢獻(xiàn)金額大小排序而成,縱坐標(biāo)則是用戶累計貢獻(xiàn)。可以很清楚的看到,前20000個用戶貢獻(xiàn)了40%的消費(fèi)。后面4000位用戶貢獻(xiàn)了60%,確實呈現(xiàn)28傾向。
- 統(tǒng)計一下銷量,前兩萬個用戶貢獻(xiàn)了45%的銷量,高消費(fèi)用戶貢獻(xiàn)了55%的銷量。
用戶生命周期
- 統(tǒng)計出用戶第一次消費(fèi)和最后一次消費(fèi)的時間,相減,得出每一位用戶的生命周期。因為數(shù)據(jù)中的用戶都是前三個月第一次消費(fèi),所以這里的生命周期代表的是1月~3月用戶的生命周期。因為用戶會持續(xù)消費(fèi),所以理論上,隨著后續(xù)的消費(fèi),用戶的平均生命周期會增長。
- 求一下平均,所有用戶的平均生命周期是134天,比預(yù)想的高,但是平均數(shù)不靠譜,看一下分布。
- 因為這里的數(shù)據(jù)類型是timedelta時間,它無法直接作出直方圖,所以先換算成數(shù)值。換算的方式直接除timedelta函數(shù)即可,這里的np.timedelta64(1, 'D'),D表示天,1表示1天,作為單位使用的。因為max-min已經(jīng)表示為天了,兩者相除就是周期的天數(shù)。
- 大部分用戶只消費(fèi)了一次,所有生命周期的大頭都集中在了0天。不妨將只消費(fèi)了一次的新客排除,來計算所有消費(fèi)過兩次以上的老客的生命周期。
- 轉(zhuǎn)換成DataFrame。
- 篩選出lifetime>0,即排除了僅消費(fèi)了一次的那些人。做直方圖。
- 這是雙峰趨勢圖。部分質(zhì)量差的用戶,雖然消費(fèi)了兩次,但是仍舊無法持續(xù),在用戶首次消費(fèi)30天內(nèi)應(yīng)該盡量引導(dǎo)。少部分用戶集中在50天~300天,屬于普通型的生命周期,高質(zhì)量用戶的生命周期,集中在400天以后,屬于忠誠用戶。
- 消費(fèi)兩次以上的用戶生命周期是276天,遠(yuǎn)高于總體。從策略看,用戶首次消費(fèi)后應(yīng)該花費(fèi)更多的引導(dǎo)其進(jìn)行多次消費(fèi),提供生命周期,這會帶來2.5倍的增量。
用戶購買周期
- 計算留存率,留存率是消費(fèi)分析領(lǐng)域的經(jīng)典應(yīng)用。它指用戶在第一次消費(fèi)后,有多少比率進(jìn)行第二次消費(fèi)。
- 這里將order_date和order_date_min相減。獲得一個新的列,為用戶每一次消費(fèi)距第一次消費(fèi)的時間差值。
- 日期轉(zhuǎn)換成時間。
- 將時間差值分桶。我這里分成0~3天內(nèi),3~7天內(nèi),7~15天等,代表用戶當(dāng)前消費(fèi)時間距第一次消費(fèi)屬于哪個時間段呢。這里date_diff=0并沒有被劃分入0~3天,因為計算的是留存率,如果用戶僅消費(fèi)了一次,留存率應(yīng)該是0。另外一方面,如果用戶第一天內(nèi)消費(fèi)了多次,但是往后沒有消費(fèi),也算作留存率0。
- 用pivot_table數(shù)據(jù)透視,獲得的結(jié)果是用戶在第一次消費(fèi)之后,在后續(xù)各時間段內(nèi)的消費(fèi)總額。
- 計算一下用戶在后續(xù)各時間段的平均消費(fèi)額,這里只統(tǒng)計有消費(fèi)的平均值。雖然后面時間段的金額高,但是它的時間范圍也寬廣。從平均效果看,用戶第一次消費(fèi)后的0~3天內(nèi),更可能消費(fèi)更多。
- 但消費(fèi)更多是一個相對的概念,我們還要看整體中有多少用戶在0~3天消費(fèi)。
- 依舊將數(shù)據(jù)轉(zhuǎn)換成是否,1代表在該時間段內(nèi)有后續(xù)消費(fèi),0代表沒有。
- 只有2.5%的用戶在第一次消費(fèi)的次日至3天內(nèi)有過消費(fèi),3%的用戶在3~7天內(nèi)有過消費(fèi)。數(shù)字并不好看,CD購買確實不是高頻消費(fèi)行為。時間范圍放寬后數(shù)字好看了不少,有20%的用戶在第一次消費(fèi)后的三個月到半年之間有過購買,27%的用戶在半年后至1年內(nèi)有過購買。從運(yùn)營角度看,CD機(jī)營銷在教育新用戶的同時,應(yīng)該注重用戶忠誠度的培養(yǎng),放長線掉大魚,在一定時間內(nèi)召回用戶購買。
- 怎么算放長線掉大魚呢?我們計算出用戶的平均購買周期。
- 我們將用戶分組,groupby分組后的數(shù)據(jù),也是能用for進(jìn)行循環(huán)和迭代的。第一個循環(huán)對象user,是分組的對象,即user_id;第二個循環(huán)對象group,是分組聚合后的結(jié)果。為了舉例我用了print,它依次輸出了user_id=1,user_id=2時的用戶消費(fèi)數(shù)據(jù),是一組切割后的DataFrame。
- 定義一個計算間隔的函數(shù)diff,輸入的是group,通過上面的演示,大家也應(yīng)該知道分組后的數(shù)據(jù)依舊是DataFrame。我們將用戶上下兩次消費(fèi)時間相減將能求出消費(fèi)間隔了。shift函數(shù)是一個偏移函數(shù),和excel上的offset差不多。
- x.shift()是往上偏移一個位置,x.shift(-1)是往下偏移一個位置,加參數(shù)axis=1則是左右偏移。當(dāng)我想將求用戶下一次距本次消費(fèi)的時間間隔,用shift(-1)減當(dāng)前值即可。案例用的diff函數(shù)便借助shift方法,巧妙的求出了每位用戶的兩次消費(fèi)間隔,若為NaN,則沒有下一次。
- 用mean函數(shù)即可求出用戶的平均消費(fèi)間隔時間是68天。想要召回用戶,在60天左右的消費(fèi)間隔是比較好的。
- 看一下直方圖,典型的長尾分布,大部分用戶的消費(fèi)間隔確實比較短。不妨將時間召回點設(shè)為消費(fèi)后立即贈送優(yōu)惠券,消費(fèi)后10天詢問用戶CD怎么樣,消費(fèi)后30天提醒優(yōu)惠券到期,消費(fèi)后60天短信推送。這便是數(shù)據(jù)的應(yīng)用了。
用戶復(fù)購率和回購率
首先將用戶消費(fèi)數(shù)據(jù)進(jìn)行數(shù)據(jù)透視。
- 使用數(shù)據(jù)透視表,需要明確獲得什么結(jié)果。有些用戶在某月沒有進(jìn)行過消費(fèi),會用NaN表示,這里用fillna填充。
首先求復(fù)購率,復(fù)購率的定義是在某時間窗口內(nèi)消費(fèi)兩次及以上的用戶在總消費(fèi)用戶中占比。這里的時間窗口是月,如果一個用戶在同一天下了兩筆訂單,這里也將他算作復(fù)購用戶。
- 將數(shù)據(jù)轉(zhuǎn)換一下,消費(fèi)兩次及以上記為1,消費(fèi)一次記為0,沒有消費(fèi)記為NaN。
- 用sum和count相除即可計算出復(fù)購率。因為這兩個函數(shù)都會忽略NaN,而NaN是沒有消費(fèi)的用戶,count不論0還是1都會統(tǒng)計,所以是總的消費(fèi)用戶數(shù),而sum求和計算了兩次以上的消費(fèi)用戶。這里用了比較巧妙的替代法計算復(fù)購率,SQL中也可以用。
- 圖上可以看出復(fù)購率在早期,因為大量新用戶加入的關(guān)系,新客的復(fù)購率并不高,譬如1月新客們的復(fù)購率只有6%左右。而在后期,這時的用戶都是大浪淘沙剩下的老客,復(fù)購率比較穩(wěn)定,在20%左右。單看新客和老客,復(fù)購率有三倍左右的差距。
接下來計算回購率。回購率是某一個時間窗口內(nèi)消費(fèi)的用戶,在下一個時間窗口仍舊消費(fèi)的占比。如果1月消費(fèi)用戶1000,他們中有300個2月依然消費(fèi),回購率是30%。
- 將消費(fèi)金額進(jìn)行數(shù)據(jù)透視,這里作為練習(xí),使用了平均值。
- 再次用applymap+lambda轉(zhuǎn)換數(shù)據(jù),只要有過購買,記為1,反之為0。
- 新建一個判斷函數(shù)。data是輸入的數(shù)據(jù),即用戶在18個月內(nèi)是否消費(fèi)的記錄,status是空列表,后續(xù)用來保存用戶是否回購的字段。
- 因為有18個月,所以每個月都要進(jìn)行一次判斷,需要用到循環(huán)。if的主要邏輯是,如果用戶本月進(jìn)行過消費(fèi),且下月消費(fèi)過,記為1,沒有消費(fèi)過是0。本月若沒有進(jìn)行過消費(fèi),為NaN,后續(xù)的統(tǒng)計中進(jìn)行排除。
- 用apply函數(shù)應(yīng)用在所有行上,獲得想要的結(jié)果。
- 最后的計算和復(fù)購率大同小異,用count和sum求出。從圖中可以看出,用戶的回購率高于復(fù)購,約在30%左右,波動性也較強(qiáng)。新用戶的回購率在15%左右,和老客差異不大。
將回購率和復(fù)購率綜合分析,可以得出,新客的整體質(zhì)量低于老客,老客的忠誠度(回購率)表現(xiàn)較好,消費(fèi)頻次稍次,這是CDNow網(wǎng)站的用戶消費(fèi)特征。
注:本文以學(xué)習(xí)為主,具體思路參考秦路七周七。
總結(jié)
以上是生活随笔為你收集整理的数据分析项目整理之用户消费行为分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高等数学(第七版)同济大学 总习题二 个
- 下一篇: 到外企应聘如何准备英文简历(Tips f