①數(shù)據(jù)分析項(xiàng)目實(shí)戰(zhàn):用戶消費(fèi)行為分析

正所謂“紙上得來(lái)終覺淺恤煞,絕知此事要躬行”案站,通過(guò)對(duì)Python進(jìn)行數(shù)據(jù)分析的學(xué)習(xí)掌握茅姜,現(xiàn)在需要通過(guò)實(shí)操總結(jié)來(lái)檢驗(yàn)自己的學(xué)習(xí)成果桩匪。
本篇文章主要是利用Python進(jìn)行數(shù)據(jù)處理,分析用戶消費(fèi)行為历筝。數(shù)據(jù)來(lái)源CD網(wǎng)站的消費(fèi)記錄酗昼,有用戶ID、購(gòu)買日期梳猪、購(gòu)買數(shù)量麻削、購(gòu)買金額四個(gè)字段科目。(模仿操作)
【分析步驟】


CD網(wǎng)站銷售數(shù)據(jù).png
# 導(dǎo)入常用的庫(kù):
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
%matplotlib inline    #‘%’內(nèi)置的命令春弥,jupyter專有的定義呛哟,比如在pycharm不常用到,inline意思是我做好圖之后可以在html頁(yè)面的單元格進(jìn)行顯示
plt.style.use('ggplot')  #更改設(shè)計(jì)風(fēng)格匿沛,使用自帶的形式進(jìn)行美化扫责,這是一個(gè)r語(yǔ)言的風(fēng)格
  • 加載第三方包和數(shù)據(jù),因數(shù)據(jù)文件是txt逃呼,所以用read_table方法打開鳖孤,因?yàn)樵紨?shù)據(jù)不包含表頭,所以需要賦予抡笼。字符串是空格分割苏揣,用\s+表示匹配任意空白符。
  • 一般csv的數(shù)據(jù)分隔是以逗號(hào)的形式推姻,但是這份網(wǎng)上的數(shù)據(jù)比較特殊平匈,它是通過(guò)多個(gè)空格來(lái)進(jìn)行分隔。


  • 電子商務(wù)行業(yè)一般是以用戶ID、訂單價(jià)吐葱、訂單數(shù)街望、訂單日期來(lái)進(jìn)行分析的,基于以上這四個(gè)字段可以根據(jù)需要進(jìn)行分析弟跑。
df.head()  #展示前5行數(shù)據(jù)
  • 如圖所示,數(shù)據(jù)正常展示防症,由此判斷數(shù)據(jù)導(dǎo)入無(wú)誤孟辑。再則由此可以看出用戶id為2的用戶在12日當(dāng)天消費(fèi)了兩次,這點(diǎn)需要注意蔫敲。
df.info()  #查看數(shù)據(jù)類型
  • 從圖中可以看出order_dt的數(shù)據(jù)類型需要轉(zhuǎn)換為日期形式
  • 查看其他數(shù)據(jù)類型饲嗽,沒(méi)有發(fā)現(xiàn)有空值,數(shù)據(jù)很干凈
  • 一般在進(jìn)行數(shù)據(jù)處理前奈嘿,都應(yīng)先對(duì)數(shù)據(jù)類型進(jìn)行查看及轉(zhuǎn)換
df.describe()   #對(duì)數(shù)據(jù)進(jìn)行描述統(tǒng)計(jì)
  • 從圖中可以看出貌虾,用戶平均每筆訂單購(gòu)買2.4個(gè)商品,標(biāo)準(zhǔn)差在2.3個(gè)裙犹,具有一定波動(dòng)性尽狠。中位數(shù)是2個(gè),75分位數(shù)是3個(gè)叶圃,說(shuō)明訂單量大部分都不多袄膏。而極值是99個(gè),這差別有點(diǎn)大掺冠,相對(duì)比購(gòu)買金額沉馆,說(shuō)明訂單大部分集中在小額。
    -一般情況德崭,消費(fèi)類型的數(shù)據(jù)分布斥黑,大部分呈現(xiàn)的是長(zhǎng)尾形態(tài);絕大多數(shù)用戶是選擇小額消費(fèi)客群眉厨,但用戶貢獻(xiàn)率集中在少數(shù)分群里锌奴,符合二八法則。
# 數(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]')
  • 把數(shù)據(jù)類型轉(zhuǎn)化為時(shí)間序列
    第一部分小結(jié):

第一部分的數(shù)據(jù)清理已經(jīng)完成缨叫,可以開始后續(xù)的分析了

第二部分按月進(jìn)行數(shù)據(jù)分析

我將從四個(gè)方面來(lái)展示數(shù)據(jù)波動(dòng)情況,進(jìn)而分析用戶的消費(fèi)趨勢(shì)

  • 每月消費(fèi)總金額
  • 每月消費(fèi)次數(shù)
  • 每月產(chǎn)品的購(gòu)買量
  • 每月消費(fèi)的人數(shù)
#1.每月消費(fèi)總金額
grouped_month = df.groupby('month')
order_month_amount = grouped_month.order_amount.sum()
order_month_amount.head()
  • 通過(guò)groupby對(duì)數(shù)據(jù)進(jìn)行分組荔燎,由此對(duì)order_amount進(jìn)行求和


  • 如圖所示耻姥,消費(fèi)金額在前三個(gè)月達(dá)到最高峰,此后的消費(fèi)金額較為穩(wěn)定有咨,但有輕微下降趨勢(shì)琐簇。
# 2.每月消費(fèi)次數(shù)
grouped_month.user_id.count().plot()  #plot是折線圖,用于展示數(shù)據(jù)趨勢(shì)
  • 前三個(gè)月的消費(fèi)訂單數(shù)達(dá)到10000筆左右,后續(xù)幾個(gè)月的平均消費(fèi)是2500筆婉商。
# 3.每月的產(chǎn)品購(gòu)買量
grouped_month.order_products.sum().plot()
  • 如圖所示似忧,前三個(gè)月產(chǎn)品購(gòu)買量達(dá)到峰值,后續(xù)產(chǎn)品構(gòu)面量較為穩(wěn)定丈秩。
  • 為什么出現(xiàn)這種情況盯捌?我們可以假設(shè)這是因?yàn)闋I(yíng)銷活動(dòng),另外數(shù)據(jù)中可能存在異常蘑秽,因只是消費(fèi)數(shù)據(jù)饺著,無(wú)法判斷。
# 4.每月的消費(fèi)人數(shù)
df.groupby('month').user_id.apply(lambda x: len(x.drop_duplicates())).plot() 
#這里需要注意到因?yàn)橐粋€(gè)人在一個(gè)月內(nèi)可能存在多筆消費(fèi)肠牲,所以使用匿名函數(shù)lambda進(jìn)行去重
  • 每月消費(fèi)人數(shù)低于每月消費(fèi)次數(shù)幼衰,但差異不大;前三個(gè)月每月消費(fèi)人數(shù)在8000-10000之間,后續(xù)月份缀雳,平均消費(fèi)人數(shù)在2000人左右渡嚣。
    另:以上的消費(fèi)趨勢(shì)分析也可以用數(shù)據(jù)透視表來(lái)分析
df.pivot_table(index = 'month',
              values = ['order_products', 'order_amount', 'user_id'],
              aggfunc = {'order_products': 'sum',
                        'order_amount': 'sum',
                        'user_id': 'count'}).head()
  • 數(shù)據(jù)透視表是更加直觀快捷的方法,通過(guò)這個(gè)進(jìn)行作圖會(huì)更加便捷一些肥印。在以后的實(shí)際工作中识椰,我們應(yīng)根據(jù)實(shí)際需要選擇合適的方法來(lái)進(jìn)行數(shù)據(jù)分析,這樣有利于提高我們的效率竖独。
    第二部分小結(jié):

通過(guò)聚合函數(shù)groupby了解分析了用戶的消費(fèi)趨勢(shì)

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

前面是以時(shí)間(月)的維度來(lái)分析用戶消費(fèi)趨勢(shì)裤唠,這一節(jié)以個(gè)體消費(fèi)特點(diǎn)來(lái)分析用戶消費(fèi)行為,為此劃分了五個(gè)方面來(lái)分析:

  • 用戶消費(fèi)金額莹痢、消費(fèi)次數(shù)的描述統(tǒng)計(jì)
  • 用戶消費(fèi)金額和消費(fèi)次數(shù)的散點(diǎn)圖
  • 用戶消費(fèi)金額的分布圖
  • 用戶消費(fèi)次數(shù)的分布圖
  • 用戶累計(jì)消費(fèi)金額占比(百分之多少的用戶占了百分之多少的消費(fèi)金額)
# 1.用戶消費(fèi)金額和消費(fèi)次數(shù)的描述統(tǒng)計(jì)
grouped_user = df.groupby('user_id')
grouped_user.sum().describe()
  • 從圖中可以看出种蘸,每位用戶平均購(gòu)買了7張CD,但最大值是1033張竞膳,中位數(shù)卻只有3張航瞭;而從用戶消費(fèi)上看,用戶平均消費(fèi)金額是106元坦辟,標(biāo)準(zhǔn)差是240元刊侯,根據(jù)分位數(shù)和最大值來(lái)看,平均值是和75分位數(shù)相近锉走,由此說(shuō)明有小部分用戶購(gòu)買了大量CD滨彻。
  • 由此可以看出消費(fèi)類型的數(shù)據(jù),符合二八法則的特點(diǎn)挪蹭。
# 2.用戶消費(fèi)金額和消費(fèi)次數(shù)的散點(diǎn)圖
grouped_user.sum().query('order_amount < 4000').plot.scatter(x = 'order_amount', y = 'order_products')
# 注:query后面只支持string形式的值
  • 跟前面一樣先用groupby創(chuàng)建一個(gè)對(duì)象來(lái)繪制散點(diǎn)圖亭饵,因數(shù)據(jù)極值關(guān)系對(duì)‘order_amount’進(jìn)行過(guò)濾,使圖更加美觀梁厉。
  • 如圖所示辜羊,用戶消費(fèi)比較有規(guī)律,消費(fèi)金額和商品量也呈線性分布,離群點(diǎn)較少八秃。
# 3.用戶消費(fèi)金額的分布圖(二八法則)
grouped_user.sum().order_amount.plot.hist(bins = 20)
# bins = 20是指直方圖中的個(gè)數(shù)碱妆,是將order_amount的值分成20份
  • 從圖中可以看出,大部分用戶消費(fèi)能力并不高昔驱,絕大部分是集中在小金額的消費(fèi)疹尾,而高消費(fèi)用戶非常少,也符合二八法則的特點(diǎn)舍悯。
# 4.用戶消費(fèi)次數(shù)的分布圖
grouped_user.sum().query('order_products < 100').order_products.hist(bins = 20)
  • 因小部分異常值會(huì)干擾判斷航棱,所以使用切比雪夫定理過(guò)濾掉異常值,計(jì)算95%的數(shù)據(jù)分布情況
# 5.用戶累計(jì)消費(fèi)金額的占比
user_cumsum = grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum() / x.sum())
user_cumsum.reset_index().order_amount.plot()
# 注:sort_values是對(duì)值進(jìn)行排序萌衬,升序,cumsum是滾動(dòng)累加求和
  • 按用戶消費(fèi)金額進(jìn)行升序排列它抱,由圖可知50%的用戶僅貢獻(xiàn)了15%的消費(fèi)額度秕豫。而排名前5000的用戶就貢獻(xiàn)了60%的消費(fèi)額史汗。由此我們可以得出維護(hù)好這5000名用戶就可以完成業(yè)績(jī)指標(biāo)的60%淀散。
    第三部分小結(jié):

用戶個(gè)體消費(fèi)情況基本上符合行業(yè)規(guī)律,符合二八法則的特點(diǎn)冻璃;而在處理數(shù)據(jù)過(guò)程中侮穿,需要注意異常值對(duì)判斷的干擾歌径,應(yīng)該對(duì)異常值進(jìn)行過(guò)濾,由此也能提升圖形美觀亲茅。

第四部分:用戶消費(fèi)行為分析

  • 用戶第一次消費(fèi)(首購(gòu))
  • 用戶最后一次消費(fèi)
  • 新老客消費(fèi)比
    • 多少用戶僅消費(fèi)了一次回铛?
    • 每月新客占比?
  • 用戶分層
    • RFM
    • 新克锣、老茵肃、活躍、回流袭祟、流失
  • 用戶購(gòu)買周期(按訂單)
    • 用戶消費(fèi)周期描述
    • 用戶消費(fèi)周期分布
  • 用戶生命周期(按第一次&最后一次消費(fèi))
    • 用戶生命周期描述
    • 用戶生命周期分布
# 1.用戶第一次消費(fèi)(首購(gòu))
grouped_user.min().order_dt.value_counts().plot()
  • 根據(jù)月份最小值可以求出用戶第一次消費(fèi)時(shí)間验残。從圖中可以看出,用戶第一次購(gòu)買商品的分布巾乳,主要集中在前三個(gè)月您没,其中2月11日-2月25日有一次劇烈波動(dòng)。
# 2.用戶最后一次消費(fèi)
grouped_user.max().order_dt.value_counts().plot()
  • 圖中顯示的是用戶最后一次消費(fèi)時(shí)間胆绊。用戶最后一次購(gòu)買的分布比第一次分布廣氨鹏,大部分最后一次購(gòu)買,集中在前三個(gè)月辑舷,說(shuō)明有很多用戶購(gòu)買了一次后就不再進(jìn)行購(gòu)買了喻犁,而隨著時(shí)間的遞增,最后一次購(gòu)買數(shù)也在遞增,消費(fèi)呈現(xiàn)流失上升的狀況肢础。
# 3.新老客消費(fèi)比
user_life = grouped_user.order_dt.agg(['min','max'])
user_life.head()
  • 由此可以看出用戶第一次消費(fèi)和最后一次消費(fèi)時(shí)間还栓,例如用戶user_id為1的用戶消費(fèi)時(shí)間相同,說(shuō)明用戶只消費(fèi)了一次传轰。
# 用戶購(gòu)買周期
(user_life['min'] == user_life['max']).value_counts()
  • 通過(guò)邏輯判斷得出剩盒,有一半的用戶只消費(fèi)了一次。
# 4.用戶分層
rfm = df.pivot_table(index = 'user_id',
                    values = ['order_products', 'order_amount', 'order_dt'],
                    aggfunc = {'order_dt':'max',
                               'order_amount': 'sum',
                               'order_products': 'sum'})
rfm.head()
  • 注:order_products表示的是消費(fèi)的產(chǎn)品數(shù)慨蛙,因?yàn)閿?shù)據(jù)中用戶消費(fèi)次數(shù)比較固定辽聊,所以由消費(fèi)產(chǎn)品數(shù)替換消費(fèi)次數(shù)。
# 4.1rfm距今天數(shù)
rfm['R'] = -(rfm.order_dt - rfm.order_dt.max()) / np.timedelta64(1, 'D')
rfm.rename(columns = {'order_products': 'F', 'order_amount': 'M'}, inplace = True)
rfm.head()
  • R表示客戶最近一次交易時(shí)間的間隔期贫,客戶在最近一段時(shí)間內(nèi)交易的金額跟匆。F表示客戶在最近一段時(shí)間內(nèi)交易的次數(shù),F值越大,表示客戶交易越頻繁通砍,反之則表示客戶交易不夠活躍玛臂。M表示客戶在最近一段時(shí)間內(nèi)交易的金額。M值越大封孙,表示客戶價(jià)值越高迹冤,反之則表示客戶價(jià)值越低。
# 4.2用戶分層:RFM模型
def rfm_func(x):
    level = x.apply(lambda x:'1' if x >= 0 else '0')
    label = level.R + level.F + level.M
    d = {
        '111': '重要價(jià)值客戶',
        '011': '重要保持客戶',
        '101': '重要發(fā)展客戶',
        '001': '重要挽留客戶',
        '110': '一般價(jià)值客戶',
        '010': '一般保持客戶',
        '100': '一般發(fā)展客戶',
        '000': '一般挽留客戶',
    }
    result = d[label]
    return result

rfm['label'] = rfm[['R', 'F', 'M']].apply(lambda x: x-x.mean()).apply(rfm_func,axis=1)
rfm.head()
  • 這里運(yùn)用RFM模型來(lái)對(duì)用戶分層虎忌,分析用戶特點(diǎn)泡徙,這里使用的是平均數(shù)。
# 4.3用戶分層:求和
rfm.groupby('label').sum()
  • 從圖中可以看出膜蠢,M的不同層次客戶的消費(fèi)累計(jì)金額堪藐,重要保持客戶的累計(jì)消費(fèi)金額最高
# 4.4用戶分層:計(jì)數(shù)
rfm.groupby('label').count()
  • 如圖所示,不同層次用戶的消費(fèi)人數(shù)狡蝶,之前重要保持客戶的累計(jì)消費(fèi)金額最高庶橱,但消費(fèi)人數(shù)最多的卻是一般挽留客戶有14074人。
# 4.5用戶分層:RFM模型
rfm.loc[rfm.label == '重要價(jià)值客戶','color'] = 'g'
rfm.loc[~(rfm.label == '重要價(jià)值客戶'), 'color'] = 'r'
rfm.plot.scatter('F', 'R', c = rfm.color)
# pandas中增加顏色需要新增一列
  • 從RFM分層可知贪惹,大部分用戶為重要保持客戶苏章,但是這是由于極值的影響,所以RFM的劃分標(biāo)準(zhǔn)應(yīng)該以業(yè)務(wù)為準(zhǔn)奏瞬。盡量用小部分的用戶覆蓋大部分的額度枫绅,不要為了數(shù)據(jù)好看劃分等級(jí)。
  • RFM模型是衡量客戶價(jià)值的立方體模型硼端。充分結(jié)合數(shù)據(jù)與業(yè)務(wù)的關(guān)系并淋,是數(shù)據(jù)分析師應(yīng)該做到的,例如從以上數(shù)據(jù)看出珍昨,重要保持客戶貢獻(xiàn)金額最多县耽,應(yīng)如何與業(yè)務(wù)部分合作維護(hù)好這部分客戶句喷;再則重要發(fā)展客戶和重要挽留客戶靜默消費(fèi)了,如何喚醒這部分客戶使我們需要分析的兔毙。
# 4.6用戶分層:用戶生命周期
pivoted_counts = df.pivot_table(index = 'user_id',
                               columns = 'month',
                               values = 'order_dt',
                               aggfunc = 'count').fillna(0)
pivoted_counts.head()
  • 用戶每月的消費(fèi)次數(shù)對(duì)于生命周期的劃分并無(wú)關(guān)系唾琼,而需把模型進(jìn)行優(yōu)化,知道用戶本月是否有消費(fèi)就可以了澎剥。
  • 使用數(shù)據(jù)透視表可以非常直觀的看出用戶在某月是否有消費(fèi)過(guò)锡溯,其中沒(méi)有消費(fèi)過(guò)的以Nan表示,用fillna填充為0
# 4.7用戶生命周期
df_purchase = pivoted_counts.applymap(lambda x: 1 if x > 0 else 0)
df_purchase.tail()
  • 從user_id2W+的數(shù)據(jù)來(lái)看哑姚,數(shù)據(jù)存在問(wèn)題祭饭。因?yàn)閺膶?shí)際業(yè)務(wù)出發(fā),這部分的用戶一二月份是沒(méi)有注冊(cè)的叙量,是從三月份才進(jìn)行第一次消費(fèi)倡蝙。而數(shù)據(jù)透視表將一二月份的數(shù)據(jù)補(bǔ)充為0,這里需要注意是從第一次消費(fèi)作為生命周期的計(jì)算绞佩。
# 4.8用戶分層:用戶生命周期狀態(tài)變化
def active_status(data):
    status = []  #創(chuàng)建一個(gè)空的列表
    for i in range(18):
        
        #若本月沒(méi)有消費(fèi)
        if data[i] == 0:
            if len(status) > 0:
                if status[i-1] == 'unreg':
                    status.append('unreg')
                else:
                    status.append('unactive')
            else:
                status.append('unreg')
                
        #若本月消費(fèi)
        else:
            if len(status) == 0:
                status.append('new')
            else:
                if status[i - 1] == 'unactive':
                    status.append('return')
                elif status[i-1] == 'unreg':
                    status.append('new')
                else:
                    status.append('active')
    return status
purchase_stats = df_purchase.apply(active_status, axis = 1)
purchase_stats.head(5)
purchase_stats.tail(5)

這里要分兩種情況分析:
若本月沒(méi)有消費(fèi)

  • 若之前是未注冊(cè)悠咱,則依舊為未注冊(cè)
  • 若之前有消費(fèi),則為流失/不活躍
  • 其他情況征炼,為未注冊(cè)

若本月有消費(fèi)

  • 若是第一次消費(fèi),則為新用戶
  • 如果之前有過(guò)消費(fèi)躬贡,則上個(gè)月為不活躍谆奥,則為回流
  • 如果上個(gè)月為未注冊(cè),則為新用戶
  • 除此之外拂玻,為活躍
# 每月不同活躍用戶的計(jì)算
purchase_stats_ct = purchase_stats.replace('unreg',np.NaN).apply(lambda x: pd.value_counts(x))
purchase_stats_ct
#purchase_stats_ct.fillna(0).T.head()
purchase_stats_ct.fillna(0).T.plot.area()

由上表可知酸些,每月的用戶消費(fèi)狀態(tài)變化(圖表還不太美觀)

  • 活躍用戶,持續(xù)消費(fèi)用戶檐蚜,對(duì)應(yīng)的是消費(fèi)運(yùn)營(yíng)質(zhì)量
  • 回流用戶魄懂,之前不消費(fèi)本月才消費(fèi),對(duì)應(yīng)的使喚回運(yùn)營(yíng)
  • 不活躍用戶闯第,對(duì)應(yīng)的是流失

由此我們可以得出一個(gè)結(jié)論:流失的用戶增加市栗,回流用戶正在減少

# 5.用戶購(gòu)買周期(按訂單)
order_diff = grouped_user.apply(lambda x:x.order_dt - x.order_dt.shift())  
order_diff.head(10)
# 這里運(yùn)用匿名函數(shù)lambda,對(duì)分組后的用戶根據(jù)訂單購(gòu)買時(shí)間進(jìn)行錯(cuò)位相減
order_diff.describe()
  • 從圖中可以看出咳短,user_id 1為0填帽,表示該客戶只購(gòu)買過(guò)一次;user_id 2的第一筆訂單和第二筆訂單是在同一天完成的
# 5.1用戶消費(fèi)周期分布
(order_diff / np.timedelta64(1, 'D')).hist(bins = 20)
  • 訂單周期呈現(xiàn)指數(shù)分布,用戶的平均購(gòu)買周期是68天,絕大部分用戶的購(gòu)買周期都低于100天
# 6.用戶生命周期(第一筆訂單時(shí)間和最后一筆訂單時(shí)間)
(user_life['max'] - user_life['min']).describe()
  • 從圖中可以看出咙好,數(shù)據(jù)偏差很大篡腌,中位數(shù)為0天,說(shuō)明超過(guò)50%的用戶只購(gòu)買了一次勾效,這一次主要集中在數(shù)據(jù)前三個(gè)月嘹悼,但平均數(shù)是134天叛甫,最大值是544天。
# 6.1用戶生命周期分布圖
((user_life['max'] - user_life['min'])/ np.timedelta64(1, 'D')).hist(bins = 40)
  • 用戶的生命周期受只購(gòu)買一次的用戶影響比較厲害(可以排除)杨伙,用戶均消費(fèi)134天其监,中位數(shù)僅0天。
# 6.2用戶生命周期分布圖(過(guò)濾掉0天)
u_l = (user_life['max'] - user_life['min'])/np.timedelta64(1,'D')
u_l[u_l > 0].hist(bins = 40)
  • 過(guò)濾掉lifetime > 0,即排除了僅消費(fèi)一次的客戶和一些生命周期在0天的兩次消費(fèi)的用戶缀台。
  • 如圖所示棠赛,少部分用戶集中在50-300天,屬于普通型生命周期膛腐;高質(zhì)量用戶體現(xiàn)在生命周期400天以后的用戶睛约,這部分用戶屬于忠誠(chéng)用戶。

7.復(fù)購(gòu)率和回購(gòu)率分析

  • 復(fù)購(gòu)率:自然月內(nèi)哲身,購(gòu)買多次的用戶占比

  • 回購(gòu)率:曾經(jīng)購(gòu)買過(guò)的用戶在某一時(shí)間內(nèi)的再次購(gòu)買占比

pivoted_counts.head()
  • 用戶每個(gè)月的消費(fèi)次數(shù)
# 7.1復(fù)購(gòu)率
purchase_r = pivoted_counts.applymap(lambda x: 1 if x > 1 else np.NaN if x == 0 else 0)
purchase_r.head()
  • 這里使用applymap是針對(duì)DataFrame里的所有數(shù)據(jù)辩涝。然后用lambda函數(shù)進(jìn)行判斷,因?yàn)樾枰碧欤栽O(shè)置了兩個(gè)if…else怔揩。
# 7.2復(fù)購(gòu)率折線圖
(purchase_r.sum() / purchase_r.count()).plot(figsize = (10, 4))
  • 用sum和count相除即可求出復(fù)購(gòu)率。因?yàn)閮蓚€(gè)函數(shù)都會(huì)忽略掉NaN脯丝,而NaN代表的是沒(méi)有消費(fèi)的用戶商膊,count函數(shù)不論是0還是1都會(huì)統(tǒng)計(jì),所以表示總的消費(fèi)用戶數(shù)宠进,而sum求和是計(jì)算消費(fèi)兩次以上的用戶晕拆。
  • 從圖中可以看出,前三個(gè)月因?yàn)橛写罅啃掠脩粲咳氩牡牛@批用戶購(gòu)買了一次实幕,所以導(dǎo)致復(fù)購(gòu)率降低,例如1月份的復(fù)購(gòu)率只有6%左右堤器;但到了后期昆庇,忠誠(chéng)客戶體現(xiàn)出來(lái)了,復(fù)購(gòu)率較為穩(wěn)定闸溃,保持在20%左右整吆。
df_purchase.head()
# 7.3回購(gòu)率
def purchase_back(data):
    status = []  #創(chuàng)建一個(gè)空列表,用來(lái)保存用戶回購(gòu)的字段
    for i in range(17):
        if data[i] == 1:   #用戶本月消費(fèi)過(guò)下月也消費(fèi)過(guò)記為1
            if data[i+1] == 1:
                status.append(1)
            if data[i+1] == 0:    #用戶下月沒(méi)有消費(fèi)過(guò)記為0
                status.append(0)
        else:
            status.append(np.NaN)  #用戶本月沒(méi)消費(fèi)圈暗,記為NaN
    status.append(np.NaN)
    return status
purchase_b = df_purchase.apply(purchase_back, axis = 1)
purchase_b.head(5)
(purchase_b.sum() / purchase_b.count()).plot(figsize = (10, 4))
  • 注:0表示當(dāng)月消費(fèi)過(guò)次月沒(méi)有消費(fèi)掂为,1表示當(dāng)月消費(fèi)過(guò)次月依舊有消費(fèi)
  • 回購(gòu)率也是由count和sum計(jì)算求出的;如圖所示员串,用戶回購(gòu)率為30%左右勇哗,由此可以得出:新客整體質(zhì)量不如老客,老客的忠誠(chéng)度(回購(gòu)率)表現(xiàn)較好寸齐,消費(fèi)頻次少差欲诺。
    第四部分小結(jié):

通過(guò)用戶消費(fèi)行為的分析抄谐,可以看出各類知識(shí)點(diǎn)的運(yùn)用需要結(jié)合實(shí)際業(yè)務(wù)情況,對(duì)數(shù)據(jù)進(jìn)行過(guò)濾

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扰法,一起剝皮案震驚了整個(gè)濱河市蛹含,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遭京,死亡現(xiàn)場(chǎng)離奇詭異痰娱,居然都是意外死亡滩字,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蓬推,你說(shuō)我怎么就攤上這事≡杼冢” “怎么了沸伏?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)动分。 經(jīng)常有香客問(wèn)我毅糟,道長(zhǎng),這世上最難降的妖魔是什么澜公? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任留特,我火速辦了婚禮,結(jié)果婚禮上玛瘸,老公的妹妹穿的比我還像新娘。我一直安慰自己苟蹈,他們只是感情好糊渊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慧脱,像睡著了一般渺绒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菱鸥,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天宗兼,我揣著相機(jī)與錄音,去河邊找鬼氮采。 笑死殷绍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹊漠。 我是一名探鬼主播主到,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茶行,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了登钥?” 一聲冷哼從身側(cè)響起畔师,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牧牢,沒(méi)想到半個(gè)月后看锉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塔鳍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年伯铣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片献幔。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懂傀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜡感,到底是詐尸還是另有隱情蹬蚁,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布郑兴,位于F島的核電站犀斋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏情连。R本人自食惡果不足惜叽粹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望却舀。 院中可真熱鬧虫几,春花似錦、人聲如沸挽拔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)螃诅。三九已至啡氢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間术裸,已是汗流浹背倘是。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袭艺,地道東北人搀崭。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猾编,于是被迫代替她去往敵國(guó)和親门坷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宣鄙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容