如何七周成為數(shù)據(jù)分析師23:用Python分析用戶消費(fèi)行為
本文是《如何七周成為數(shù)據(jù)分析師》的第二十三篇教程,如果想要了解寫作初衷,可以先行閱讀七周指南。溫馨提示:如果您已經(jīng)熟悉Python,大可不必再看這篇文章,或只挑選部分。
今天用Python分析用戶消費(fèi)行為,內(nèi)容會(huì)更接地氣,難度會(huì)稍稍上升一點(diǎn)。它也是七周成為數(shù)據(jù)分析師的最后一篇教程了。這里會(huì)串聯(lián)以前的幾個(gè)知識(shí)點(diǎn)。
數(shù)據(jù)來(lái)源CDNow網(wǎng)站的用戶購(gòu)買明細(xì)。一共有用戶ID,購(gòu)買日期,購(gòu)買數(shù)量,購(gòu)買金額四個(gè)字段。我們通過(guò)案例數(shù)據(jù)完成一份基礎(chǔ)的數(shù)據(jù)分析報(bào)告
加載包和數(shù)據(jù),文件是txt,用read_table方法打開(kāi),因?yàn)樵紨?shù)據(jù)不包含表頭,所以需要賦予。字符串是空格分割,用\s+表示匹配任意空白符。
觀察數(shù)據(jù),order_dt表示時(shí)間,但現(xiàn)在它只是年月日組合的一串?dāng)?shù)字,沒(méi)有時(shí)間含義。購(gòu)買金額是小數(shù)。值得注意的是,一個(gè)用戶在一天內(nèi)可能購(gòu)買多次,用戶ID為2的用戶就在1月12日買了兩次,這個(gè)細(xì)節(jié)不要遺漏。
用戶平均每筆訂單購(gòu)買2.4個(gè)商品,標(biāo)準(zhǔn)差在2.3,稍稍具有波動(dòng)性。中位數(shù)在2個(gè)商品,75分位數(shù)在3個(gè)商品,說(shuō)明絕大部分訂單的購(gòu)買量都不多。最大值在99個(gè),數(shù)字比較高。購(gòu)買金額的情況差不多,大部分訂單都集中在小額。
一般而言,消費(fèi)類的數(shù)據(jù)分布,都是長(zhǎng)尾形態(tài)。大部分用戶都是小額,然而小部分用戶貢獻(xiàn)了收入的大頭,俗稱二八。
沒(méi)有空值,很干凈的數(shù)據(jù)。接下來(lái)我們要將時(shí)間的數(shù)據(jù)類型轉(zhuǎn)換。
pd.to_datetime可以將特定的字符串或者數(shù)字轉(zhuǎn)換成時(shí)間格式,其中的format參數(shù)用于匹配。例如19970101,%Y匹配前四位數(shù)字1997,如果y小寫只匹配兩位數(shù)字97,%m匹配01,%d匹配01。
另外,小時(shí)是%h,分鐘是%M,注意和月的大小寫不一致,秒是%s。若是1997-01-01這形式,則是%Y-%m-%d,以此類推。
astype也可以將時(shí)間格式進(jìn)行轉(zhuǎn)換,比如[M]轉(zhuǎn)化成月份。我們將月份作為消費(fèi)行為的主要事件窗口,選擇哪種時(shí)間窗口取決于消費(fèi)頻率。
上圖是轉(zhuǎn)化后的格式。月份依舊顯示日,只是變?yōu)樵鲁醯男问健?/p>
pandas中有專門的時(shí)間序列方法tseries,它可以用來(lái)進(jìn)行時(shí)間偏移,也是處理時(shí)間類型的好方法。時(shí)間格式也能作為索引,在金融、財(cái)務(wù)等領(lǐng)域使用較多,這里不再多敘述了。
上面的消費(fèi)行為數(shù)據(jù)粒度是每筆訂單,我們轉(zhuǎn)換成每位用戶看一下。
用groupby創(chuàng)建一個(gè)新對(duì)象。
從用戶角度看,每位用戶平均購(gòu)買7張CD,最多的用戶購(gòu)買了1033張,屬于狂熱用戶了。用戶的平均消費(fèi)金額(客單價(jià))100元,標(biāo)準(zhǔn)差是240,結(jié)合分位數(shù)和最大值看,平均值才和75分位接近,肯定存在小部分的高額消費(fèi)用戶。
接下來(lái)按月的維度分析。
按月統(tǒng)計(jì)每個(gè)月的CD銷量。從圖中可以看到,前幾個(gè)月的銷量非常高漲。數(shù)據(jù)比較異常。而后期的銷量則很平穩(wěn)。
金額一樣呈現(xiàn)早期銷售額多,后期平穩(wěn)下降的趨勢(shì)。為什么會(huì)呈現(xiàn)這個(gè)原因呢?我們假設(shè)是用戶身上出了問(wèn)題,早期時(shí)間段的用戶中有異常值,第二假設(shè)是各類促銷營(yíng)銷,但這里只有消費(fèi)數(shù)據(jù),所以無(wú)法判斷。
繪制每筆訂單的散點(diǎn)圖。從圖中觀察,訂單消費(fèi)金額和訂單商品量呈規(guī)律性,每個(gè)商品十元左右。訂單的極值較少,超出1000的就幾個(gè)。顯然不是異常波動(dòng)的罪魁禍?zhǔn)住?/p>
繪制用戶的散點(diǎn)圖,用戶也比較健康,而且規(guī)律性比訂單更強(qiáng)。因?yàn)檫@是CD網(wǎng)站的銷售數(shù)據(jù),商品比較單一,金額和商品量的關(guān)系也因此呈線性,沒(méi)幾個(gè)離群點(diǎn)。
消費(fèi)能力特別強(qiáng)的用戶有,但是數(shù)量不多。為了更好的觀察,用直方圖。
plt.subplot用于繪制子圖,子圖用數(shù)字參數(shù)表示。121表示分成1*2個(gè)圖片區(qū)域,占用第一個(gè),即第一行第一列,122表示占用第二個(gè)。figure是尺寸函數(shù),為了容納兩張子圖,寬設(shè)置的大一點(diǎn)即可。
從直方圖看,大部分用戶的消費(fèi)能力確實(shí)不高,高消費(fèi)用戶在圖上幾乎看不到。這也確實(shí)符合消費(fèi)行為的行業(yè)規(guī)律。
觀察完用戶消費(fèi)的金額和購(gòu)買量,接下來(lái)看消費(fèi)的時(shí)間節(jié)點(diǎn)。
用groupby函數(shù)將用戶分組,并且求月份的最小值,最小值即用戶消費(fèi)行為中的第一次消費(fèi)時(shí)間。ok,結(jié)果出來(lái)了,所有用戶的第一次消費(fèi)都集中在前三個(gè)月。我們可以這樣認(rèn)為,案例中的訂單數(shù)據(jù),只是選擇了某個(gè)時(shí)間段消費(fèi)的用戶在18個(gè)月內(nèi)的消費(fèi)行為。
觀察用戶的最后一次消費(fèi)時(shí)間。絕大部分?jǐn)?shù)據(jù)依然集中在前三個(gè)月。后續(xù)的時(shí)間段內(nèi),依然有用戶在消費(fèi),但是緩慢減少。
異常趨勢(shì)的原因獲得了解釋,現(xiàn)在針對(duì)消費(fèi)數(shù)據(jù)進(jìn)一步細(xì)分。我們要明確,這只是部分用戶的訂單數(shù)據(jù),所以有一定局限性。在這里,我們統(tǒng)一將數(shù)據(jù)上消費(fèi)的用戶定義為新客。
接下來(lái)分析消費(fèi)中的復(fù)購(gòu)率和回購(gòu)率。首先將用戶消費(fèi)數(shù)據(jù)進(jìn)行數(shù)據(jù)透視。
在pandas中,數(shù)據(jù)透視有專門的函數(shù)pivot_table,功能非常強(qiáng)大。pivot_table參數(shù)中,index是設(shè)置數(shù)據(jù)透視后的索引,column是設(shè)置數(shù)據(jù)透視后的列,簡(jiǎn)而言之,index是你想要的行,column是想要的列。案例中,我希望統(tǒng)計(jì)每個(gè)用戶在每月的訂單量,所以u(píng)ser_id是index,month是column。
values是將哪個(gè)值進(jìn)行計(jì)算,aggfunc是用哪種方法。于是這里用values=order_dt和aggfunc=count,統(tǒng)計(jì)里order_dt出現(xiàn)的次數(shù),即多少筆訂單。
使用數(shù)據(jù)透視表,需要明確獲得什么結(jié)果。有些用戶在某月沒(méi)有進(jìn)行過(guò)消費(fèi),會(huì)用NaN表示,這里用fillna填充。
生成的數(shù)據(jù)透視,月份是1997-01-01 00:00:00表示,比較丑。將其優(yōu)化成標(biāo)準(zhǔn)格式。
首先求復(fù)購(gòu)率,復(fù)購(gòu)率的定義是在某時(shí)間窗口內(nèi)消費(fèi)兩次及以上的用戶在總消費(fèi)用戶中占比。這里的時(shí)間窗口是月,如果一個(gè)用戶在同一天下了兩筆訂單,這里也將他算作復(fù)購(gòu)用戶。
將數(shù)據(jù)轉(zhuǎn)換一下,消費(fèi)兩次及以上記為1,消費(fèi)一次記為0,沒(méi)有消費(fèi)記為NaN。
applymap針對(duì)DataFrame里的所有數(shù)據(jù)。用lambda進(jìn)行判斷,因?yàn)檫@里涉及了多個(gè)結(jié)果,所以要兩個(gè)if else,記住,lambda沒(méi)有elif的用法。
用sum和count相除即可計(jì)算出復(fù)購(gòu)率。因?yàn)檫@兩個(gè)函數(shù)都會(huì)忽略NaN,而NaN是沒(méi)有消費(fèi)的用戶,count不論0還是1都會(huì)統(tǒng)計(jì),所以是總的消費(fèi)用戶數(shù),而sum求和計(jì)算了兩次以上的消費(fèi)用戶。這里用了比較巧妙的替代法計(jì)算復(fù)購(gòu)率,SQL中也可以用。
圖上可以看出復(fù)購(gòu)率在早期,因?yàn)榇罅啃掠脩艏尤氲年P(guān)系,新客的復(fù)購(gòu)率并不高,譬如1月新客們的復(fù)購(gòu)率只有6%左右。而在后期,這時(shí)的用戶都是大浪淘沙剩下的老客,復(fù)購(gòu)率比較穩(wěn)定,在20%左右。
單看新客和老客,復(fù)購(gòu)率有三倍左右的差距。
接下來(lái)計(jì)算回購(gòu)率?;刭?gòu)率是某一個(gè)時(shí)間窗口內(nèi)消費(fèi)的用戶,在下一個(gè)時(shí)間窗口仍舊消費(fèi)的占比。我1月消費(fèi)用戶1000,他們中有300個(gè)2月依然消費(fèi),回購(gòu)率是30%。
回購(gòu)率的計(jì)算比較難,因?yàn)樗O(shè)計(jì)了橫向跨時(shí)間窗口的對(duì)比。
將消費(fèi)金額進(jìn)行數(shù)據(jù)透視,這里作為練習(xí),使用了平均值。
再次用applymap+lambda轉(zhuǎn)換數(shù)據(jù),只要有過(guò)購(gòu)買,記為1,反之為0。
新建一個(gè)判斷函數(shù)。data是輸入的數(shù)據(jù),即用戶在18個(gè)月內(nèi)是否消費(fèi)的記錄,status是空列表,后續(xù)用來(lái)保存用戶是否回購(gòu)的字段。
因?yàn)橛?8個(gè)月,所以每個(gè)月都要進(jìn)行一次判斷,需要用到循環(huán)。if的主要邏輯是,如果用戶本月進(jìn)行過(guò)消費(fèi),且下月消費(fèi)過(guò),記為1,沒(méi)有消費(fèi)過(guò)是0。本月若沒(méi)有進(jìn)行過(guò)消費(fèi),為NaN,后續(xù)的統(tǒng)計(jì)中進(jìn)行排除。
用apply函數(shù)應(yīng)用在所有行上,獲得想要的結(jié)果。
最后的計(jì)算和復(fù)購(gòu)率大同小異,用count和sum求出。從圖中可以看出,用戶的回購(gòu)率高于復(fù)購(gòu),約在30%左右,波動(dòng)性也較強(qiáng)。新用戶的回購(gòu)率在15%左右,和老客差異不大。
將回購(gòu)率和復(fù)購(gòu)率綜合分析,可以得出,新客的整體質(zhì)量低于老客,老客的忠誠(chéng)度(回購(gòu)率)表現(xiàn)較好,消費(fèi)頻次稍次,這是CDNow網(wǎng)站的用戶消費(fèi)特征。
接下來(lái)進(jìn)行用戶分層,我們按照用戶的消費(fèi)行為,簡(jiǎn)單劃分成幾個(gè)維度:新用戶、活躍用戶、不活躍用戶、回流用戶。
新用戶的定義是第一次消費(fèi)。活躍用戶即老客,在某一個(gè)時(shí)間窗口內(nèi)有過(guò)消費(fèi)。不活躍用戶則是時(shí)間窗口內(nèi)沒(méi)有消費(fèi)過(guò)的老客?;亓饔脩羰窃谏弦粋€(gè)窗口中沒(méi)有消費(fèi),而在當(dāng)前時(shí)間窗口內(nèi)有過(guò)消費(fèi)。以上的時(shí)間窗口都是按月統(tǒng)計(jì)。
比如某用戶在1月第一次消費(fèi),那么他在1月的分層就是新用戶;他在2月消費(fèi)國(guó),則是活躍用戶;3月沒(méi)有消費(fèi),此時(shí)是不活躍用戶;4月再次消費(fèi),此時(shí)是回流用戶,5月還是消費(fèi),是活躍用戶。
分層會(huì)涉及到比較復(fù)雜的邏輯判斷。
函數(shù)寫得比較復(fù)雜,主要分為兩部分的判斷,以本月是否消費(fèi)為界。本月沒(méi)有消費(fèi),還要額外判斷他是不是新客,因?yàn)椴糠钟脩羰?月份才消費(fèi)成為新客,那么在1、2月份他應(yīng)該連新客都不是,用unreg表示。如果是老客,則為unactive。
本月若有消費(fèi),需要判斷是不是第一次消費(fèi),上一個(gè)時(shí)間窗口有沒(méi)有消費(fèi)。大家可以多調(diào)試幾次理順里面的邏輯關(guān)系,對(duì)用戶進(jìn)行分層,邏輯確實(shí)不會(huì)簡(jiǎn)單,而且這里只是簡(jiǎn)化版本的。
從結(jié)果看,用戶每個(gè)月的分層狀態(tài)以及變化已經(jīng)被我們計(jì)算出來(lái)。我是根據(jù)透視出的寬表計(jì)算,其實(shí)還有一種另外一種寫法,只提取時(shí)間窗口內(nèi)的數(shù)據(jù)和上個(gè)窗口對(duì)比判斷,封裝成函數(shù)做循環(huán),它適合ETL的增量更新。
unreg狀態(tài)排除掉,它是「未來(lái)」才作為新客,這么能計(jì)數(shù)呢。換算成不同分層每月的統(tǒng)計(jì)量。
生成面積圖,比較丑。因?yàn)樗皇悄硶r(shí)間段消費(fèi)過(guò)的用戶的后續(xù)行為,藍(lán)色和灰色區(qū)域都可以不看。只看紫色回流和紅色活躍這兩個(gè)分層,用戶數(shù)比較穩(wěn)定。這兩個(gè)分層相加,就是消費(fèi)用戶占比(后期沒(méi)新客)。
用戶回流占比在5%~8%,有下降趨勢(shì)。所謂回流占比,就是回流用戶在總用戶中的占比。另外一種指標(biāo)叫回流率,指上個(gè)月多少不活躍/消費(fèi)用戶在本月活躍/消費(fèi)。因?yàn)椴换钴S的用戶總量近似不變,所以這里的回流率也近似回流占比。
活躍用戶的下降趨勢(shì)更明顯,占比在3%~5%間。這里用戶活躍可以看作連續(xù)消費(fèi)用戶,質(zhì)量在一定程度上高于回流用戶。
結(jié)合回流用戶和活躍用戶看,在后期的消費(fèi)用戶中,60%是回流用戶,40%是活躍用戶/連續(xù)消費(fèi)用戶,整體質(zhì)量還好,但是針對(duì)這兩個(gè)分層依舊有改進(jìn)的空間,可以繼續(xù)細(xì)化數(shù)據(jù)。
接下來(lái)分析用戶質(zhì)量,因?yàn)橄M(fèi)行為有明顯的二八傾向,我們需要知道高質(zhì)量用戶為消費(fèi)貢獻(xiàn)了多少份額。
新建一個(gè)對(duì)象,按用戶的消費(fèi)金額生序。使用cumsum,它是累加函數(shù)。逐行計(jì)算累計(jì)的金額,最后的2500315便是總消費(fèi)額。
轉(zhuǎn)換成百分比。
繪制趨勢(shì)圖,橫坐標(biāo)是按貢獻(xiàn)金額大小排序而成,縱坐標(biāo)則是用戶累計(jì)貢獻(xiàn)??梢院芮宄目吹剑?0000個(gè)用戶貢獻(xiàn)了40%的消費(fèi)。后面4000位用戶貢獻(xiàn)了60%,確實(shí)呈現(xiàn)28傾向。
統(tǒng)計(jì)一下銷量,前兩萬(wàn)個(gè)用戶貢獻(xiàn)了45%的銷量,高消費(fèi)用戶貢獻(xiàn)了55%的銷量。在消費(fèi)領(lǐng)域中,狠抓高質(zhì)量用戶是萬(wàn)古不變的道理。
接下來(lái)計(jì)算用戶生命周期,這里定義第一次消費(fèi)至最后一次消費(fèi)為整個(gè)用戶生命。
統(tǒng)計(jì)出用戶第一次消費(fèi)和最后一次消費(fèi)的時(shí)間,相減,得出每一位用戶的生命周期。因?yàn)閿?shù)據(jù)中的用戶都是前三個(gè)月第一次消費(fèi),所以這里的生命周期代表的是1月~3月用戶的生命周期。因?yàn)橛脩魰?huì)持續(xù)消費(fèi),所以理論上,隨著后續(xù)的消費(fèi),用戶的平均生命周期會(huì)增長(zhǎng)。
求一下平均,所有用戶的平均生命周期是134天,比預(yù)想的高,但是平均數(shù)不靠譜,還是看一下分布吧,大家有興趣可以用describe,更詳細(xì)。
因?yàn)檫@里的數(shù)據(jù)類型是timedelta時(shí)間,它無(wú)法直接作出直方圖,所以先換算成數(shù)值。換算的方式直接除timedelta函數(shù)即可,這里的np.timedelta64(1, ‘D’),D表示天,1表示1天,作為單位使用的。因?yàn)閙ax-min已經(jīng)表示為天了,兩者相除就是周期的天數(shù)。
看到了沒(méi)有,大部分用戶只消費(fèi)了一次,所有生命周期的大頭都集中在了0天。但這不是我們想要的答案,不妨將只消費(fèi)了一次的新客排除,來(lái)計(jì)算所有消費(fèi)過(guò)兩次以上的老客的生命周期。
轉(zhuǎn)換成DataFrame。
篩選出lifetime>0,即排除了僅消費(fèi)了一次的那些人。做直方圖。
這個(gè)圖比上面的靠譜多了,雖然仍舊有不少用戶生命周期靠攏在0天。這是雙峰趨勢(shì)圖。部分質(zhì)量差的用戶,雖然消費(fèi)了兩次,但是仍舊無(wú)法持續(xù),在用戶首次消費(fèi)30天內(nèi)應(yīng)該盡量引導(dǎo)。少部分用戶集中在50天~300天,屬于普通型的生命周期,高質(zhì)量用戶的生命周期,集中在400天以后,這已經(jīng)屬于忠誠(chéng)用戶了,大家有興趣可以跑一下400天+的用戶占老客比多少,占總量多少。
消費(fèi)兩次以上的用戶生命周期是276天,遠(yuǎn)高于總體。從策略看,用戶首次消費(fèi)后應(yīng)該花費(fèi)更多的引導(dǎo)其進(jìn)行多次消費(fèi),提供生命周期,這會(huì)帶來(lái)2.5倍的增量。
再來(lái)計(jì)算留存率,留存率也是消費(fèi)分析領(lǐng)域的經(jīng)典應(yīng)用。它指用戶在第一次消費(fèi)后,有多少比率進(jìn)行第二次消費(fèi)。和回流率的區(qū)別是留存傾向于計(jì)算第一次消費(fèi),并且有多個(gè)時(shí)間窗口。
這里用到merge函數(shù),它和SQL中的join差不多,用來(lái)將兩個(gè)DataFrame進(jìn)行合并。我們選擇了inner 的方式,對(duì)標(biāo)inner join。即只合并能對(duì)應(yīng)得上的數(shù)據(jù)。這里以on=user_id為對(duì)應(yīng)標(biāo)準(zhǔn)。這里merge的目的是將用戶消費(fèi)行為和第一次消費(fèi)時(shí)間對(duì)應(yīng)上,形成一個(gè)新的DataFrame。suffxes參數(shù)是如果合并的內(nèi)容中有重名column,加上后綴。除了merge,還有join,concat,用戶接近,查看文檔即可。
這里將order_date和order_date_min相減。獲得一個(gè)新的列,為用戶每一次消費(fèi)距第一次消費(fèi)的時(shí)間差值。
日期轉(zhuǎn)換成時(shí)間。
將時(shí)間差值分桶。我這里分成0~3天內(nèi),3~7天內(nèi),7~15天等,代表用戶當(dāng)前消費(fèi)時(shí)間距第一次消費(fèi)屬于哪個(gè)時(shí)間段呢。這里date_diff=0并沒(méi)有被劃分入0~3天,因?yàn)橛?jì)算的是留存率,如果用戶僅消費(fèi)了一次,留存率應(yīng)該是0。另外一方面,如果用戶第一天內(nèi)消費(fèi)了多次,但是往后沒(méi)有消費(fèi),也算作留存率0。
用pivot_table數(shù)據(jù)透視,獲得的結(jié)果是用戶在第一次消費(fèi)之后,在后續(xù)各時(shí)間段內(nèi)的消費(fèi)總額。
計(jì)算一下用戶在后續(xù)各時(shí)間段的平均消費(fèi)額,這里只統(tǒng)計(jì)有消費(fèi)的平均值。雖然后面時(shí)間段的金額高,但是它的時(shí)間范圍也寬廣。從平均效果看,用戶第一次消費(fèi)后的0~3天內(nèi),更可能消費(fèi)更多。
但消費(fèi)更多是一個(gè)相對(duì)的概念,我們還要看整體中有多少用戶在0~3天消費(fèi)。
依舊將數(shù)據(jù)轉(zhuǎn)換成是否,1代表在該時(shí)間段內(nèi)有后續(xù)消費(fèi),0代表沒(méi)有。
只有2.5%的用戶在第一次消費(fèi)的次日至3天內(nèi)有過(guò)消費(fèi),3%的用戶在3~7天內(nèi)有過(guò)消費(fèi)。數(shù)字并不好看,CD購(gòu)買確實(shí)不是高頻消費(fèi)行為。時(shí)間范圍放寬后數(shù)字好看了不少,有20%的用戶在第一次消費(fèi)后的三個(gè)月到半年之間有過(guò)購(gòu)買,27%的用戶在半年后至1年內(nèi)有過(guò)購(gòu)買。從運(yùn)營(yíng)角度看,CD機(jī)營(yíng)銷在教育新用戶的同時(shí),應(yīng)該注重用戶忠誠(chéng)度的培養(yǎng),放長(zhǎng)線掉大魚,在一定時(shí)間內(nèi)召回用戶購(gòu)買。
怎么算放長(zhǎng)線掉大魚呢?我們計(jì)算出用戶的平均購(gòu)買周期。
我們將用戶分組,groupby分組后的數(shù)據(jù),也是能用for進(jìn)行循環(huán)和迭代的。第一個(gè)循環(huán)對(duì)象user,是分組的對(duì)象,即user_id;第二個(gè)循環(huán)對(duì)象group,是分組聚合后的結(jié)果。為了舉例我用了print,它依次輸出了user_id=1,user_id=2時(shí)的用戶消費(fèi)數(shù)據(jù),是一組切割后的DataFrame。
大家應(yīng)該了解分組循環(huán)的用法,但是網(wǎng)不建議大家用for循環(huán),它的效率非常慢。要計(jì)算用戶的消費(fèi)間隔,確實(shí)需要用戶分組,但是用apply效率更快。
定義一個(gè)計(jì)算間隔的函數(shù)diff,輸入的是group,通過(guò)上面的演示,大家也應(yīng)該知道分組后的數(shù)據(jù)依舊是DataFrame。我們將用戶上下兩次消費(fèi)時(shí)間相減將能求出消費(fèi)間隔了。shift函數(shù)是一個(gè)偏移函數(shù),和excel上的offset差不多。
x.shift()是往上偏移一個(gè)位置,x.shift(-1)是往下偏移一個(gè)位置,加參數(shù)axis=1則是左右偏移。當(dāng)我想將求用戶下一次距本次消費(fèi)的時(shí)間間隔,用shift(-1)減當(dāng)前值即可。案例用的diff函數(shù)便借助shift方法,巧妙的求出了每位用戶的兩次消費(fèi)間隔,若為NaN,則沒(méi)有下一次。
然后就簡(jiǎn)單了,用mean函數(shù)即可求出用戶的平均消費(fèi)間隔時(shí)間是68天。想要召回用戶,在60天左右的消費(fèi)間隔是比較好的。
看一下直方圖,典型的長(zhǎng)尾分布,大部分用戶的消費(fèi)間隔確實(shí)比較短。不妨將時(shí)間召回點(diǎn)設(shè)為消費(fèi)后立即贈(zèng)送優(yōu)惠券,消費(fèi)后10天詢問(wèn)用戶CD怎么樣,消費(fèi)后30天提醒優(yōu)惠券到期,消費(fèi)后60天短信推送。這便是數(shù)據(jù)的應(yīng)用了。
假若大家有興趣,不妨多做幾個(gè)分析假設(shè),看能不能用Python挖掘出更有意思的數(shù)據(jù),1月、2月、3月的新用戶在留存率有沒(méi)有差異?不同生命周期的用戶,他們的消費(fèi)累加圖是什么樣的?消費(fèi)留存,劃分其他時(shí)間段怎么樣?
你若想要追求更好的Python技術(shù),可以把上述的分析過(guò)程都封裝成函數(shù)。當(dāng)下次想要再次分析的時(shí)候,怎么樣只用幾個(gè)函數(shù)就搞定,而不是繼續(xù)重復(fù)碼代碼。
這里的數(shù)據(jù)只是用戶ID,消費(fèi)時(shí)間,購(gòu)買量和消費(fèi)金額。如果換成用戶ID,瀏覽時(shí)間,瀏覽量,能不能直接套用?瀏覽變成評(píng)論、點(diǎn)贊又行不行?消費(fèi)行為變成用戶其他行為呢?我可以明確地告訴你,大部分代碼只要替換部分就能直接用了。把所有的結(jié)果分析出來(lái)需要花費(fèi)多少時(shí)間呢?
Python的優(yōu)勢(shì)就在于快速和靈活,遠(yuǎn)比Excel和SQL快。這次是CD網(wǎng)站的消費(fèi)行為,下次換成電商,換成O2O,一樣可以在幾分鐘內(nèi)計(jì)算出用戶生命周期,用戶購(gòu)買頻次,留存率復(fù)購(gòu)率回購(gòu)率等等。這對(duì)你的效率提升有多大幫助?
經(jīng)過(guò)一系列的講解,你是否掌握了Python的數(shù)據(jù)分析姿勢(shì)?這里的很多技巧,都和我以前的文章相關(guān),有excel的函數(shù)影子,有數(shù)據(jù)可視化的用法,有分析思路,有描述統(tǒng)計(jì)的知識(shí),有各種業(yè)務(wù)指標(biāo),有接近SQL的數(shù)據(jù)規(guī)整,雖然是Python進(jìn)行數(shù)據(jù)分析,也是整個(gè)數(shù)據(jù)分析的總結(jié)。
所以,所有的課程都結(jié)束啦。在網(wǎng)絡(luò)上,大概也找不出幾篇像本文一樣,將各方面結(jié)合地很好的內(nèi)容了。更希望你時(shí)常復(fù)習(xí),學(xué)無(wú)止境。
謝謝大家,七周成為數(shù)據(jù)分析師,告一段落。后續(xù)還有一篇匯總。
相關(guān)閱讀
互聯(lián)網(wǎng)數(shù)據(jù)分析能力的養(yǎng)成,需一份七周的提綱
如何七周成為數(shù)據(jù)分析師01:常見(jiàn)的Excel函數(shù)全部涵蓋在這里了
如何七周成為數(shù)據(jù)分析師02:Excel技巧大揭秘
如何七周成為數(shù)據(jù)分析師03:手把手教你Excel實(shí)戰(zhàn)
如何七周成為數(shù)據(jù)分析師:Excel技巧之甘特圖繪制(項(xiàng)目管理)
如何七周成為數(shù)據(jù)分析師:Excel技巧之打造多級(jí)菜單
如何七周成為數(shù)據(jù)分析師04:數(shù)據(jù)可視化之經(jīng)典圖表合集
如何七周成為數(shù)據(jù)分析師05:數(shù)據(jù)可視化之打造升職加薪的報(bào)表
如何七周成為數(shù)據(jù)分析師06:數(shù)據(jù)可視化之手把手打造BI
如何七周成為數(shù)據(jù)分析師07:快速掌握麥肯錫的分析思維
如何七周成為數(shù)據(jù)分析師08:如何建立數(shù)據(jù)分析的思維框架?
如何七周成為數(shù)據(jù)分析師09:寫給新人的數(shù)據(jù)庫(kù)指南
如何七周成為數(shù)據(jù)分析師10:SQL,從入門到熟練
如何七周成為數(shù)據(jù)分析師11:SQL,從熟練到掌握
如何七周成為數(shù)據(jù)分析師12:解鎖數(shù)據(jù)分析的正確姿勢(shì)(上)
如何七周成為數(shù)據(jù)分析師13:解鎖數(shù)據(jù)分析的正確姿勢(shì)(下)
如何七周成為數(shù)據(jù)分析師14:概率論的入門指南
如何七周成為數(shù)據(jù)分析師15:讀了本文,你就懂了概率分布
如何七周成為數(shù)據(jù)分析師16:數(shù)據(jù)分析必須懂的假設(shè)檢驗(yàn)
如何七周成為數(shù)據(jù)分析師17:最全的運(yùn)營(yíng)數(shù)據(jù)指標(biāo)解讀
如何七周成為數(shù)據(jù)分析師18:Python的新手教程
如何七周成為數(shù)據(jù)分析師19:Python的數(shù)據(jù)結(jié)構(gòu)
如何七周成為數(shù)據(jù)分析師20:了解和掌握Python的函數(shù)
如何七周成為數(shù)據(jù)分析師21:Python分析之numpy和pandas入門
如何七周成為數(shù)據(jù)分析師22:用pandas進(jìn)行數(shù)據(jù)分析實(shí)戰(zhàn)
#專欄作家#
秦路,微信公眾號(hào)ID:tracykanc,人人都是產(chǎn)品經(jīng)理專欄作家。
本文由 @秦路?原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
pivoted_status返回的數(shù)據(jù)維series,不是dataframe,代碼都一樣,這是怎么回事呀
圖掛了咋辦
看不到圖片啊
我正在學(xué)
希望你出更多關(guān)于分析數(shù)的文章,看你的文章受益很大。謝謝