詳解如何利用Python進(jìn)行客戶分群分析
每個電子商務(wù)數(shù)據(jù)分析師必須掌握的一項(xiàng)數(shù)據(jù)聚類技能
如果你是一名在電子商務(wù)公司工作的數(shù)據(jù)分析師,從客戶數(shù)據(jù)中挖掘潛在價(jià)值,來提高客戶留存率很可能就是你的工作任務(wù)之一。
然而,客戶數(shù)據(jù)是巨大的,每個客戶的行為都不一樣。2020年3月收購的客戶A與2020年5月收購的客戶B表現(xiàn)出不同的行為。因此,有必要將客戶分為不同的群組,然后調(diào)查每個群組在一段時(shí)間內(nèi)的行為。這就是所謂的同期群分析。
同期群分析是了解一個特殊客戶群體在一段時(shí)間內(nèi)的行為的數(shù)據(jù)分析技術(shù)。
在這篇文章中,不會詳細(xì)介紹同期群分析的理論。這篇文章更多的是告訴你如何將客戶分成不同的群組,并在一段時(shí)間內(nèi)觀察每個群組的留存率。
導(dǎo)入數(shù)據(jù)和python庫
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns df = pd.read_csv('sales_2018-01-01_2019-12-31.csv') df
分離新老客戶
first_time = df.loc[df['customer_type'] == 'First-time',] final = df.loc[df['customer_id'].isin(first_time['customer_id'].values)]
在這里,不能簡單地選擇df.loc[df['customer_type']],因?yàn)樵谶@個數(shù)據(jù)中,在customer_type列下,F(xiàn)irst_time指的是新客戶,而Returning指的是老客戶。因此,如果我在2019年12月31日第一次購買,數(shù)據(jù)會顯示我在2019年12月31日是新客戶,但在我第二次、第三次…時(shí)是返回客戶。同期群分析著眼于新客戶和他們的后續(xù)購買行為。因此,如果我們簡單地使用df.loc[df['customer_type']=='First-time',],我們就會忽略新客戶的后續(xù)購買,這不是分析同期群行為的正確方法。
因此,這里所需要做的是,首先創(chuàng)建一個所有第一次的客戶列表,并將其存儲為first_time。然后從原始客戶數(shù)據(jù)框df中只選擇那些ID在first_time客戶組內(nèi)的客戶。通過這樣做,我們可以確保我們獲得的數(shù)據(jù)只有第一次的客戶和他們后來的購買行為。
現(xiàn)在,我們刪除customer_type列,因?yàn)樗呀?jīng)沒有必要了。同時(shí),將日期列轉(zhuǎn)換成正確的日期時(shí)間格式
final = final.drop(columns = ['customer_type']) final['day']= pd.to_datetime(final['day'], dayfirst=True)
按客戶ID排序,然后是日期
final = final.drop(columns = ['customer_type']) final['day']= pd.to_datetime(final['day'], dayfirst=True)
定義一些函數(shù)
def purchase_rate(customer_id): purchase_rate = [1] counter = 1 for i in range(1,len(customer_id)): if customer_id[i] != customer_id[i-1]: purchase_rate.append(1) counter = 1 else: counter += 1 purchase_rate.append(counter) return purchase_rate def join_date(date, purchase_rate): join_date = list(range(len(date))) for i in range(len(purchase_rate)): if purchase_rate[i] == 1: join_date[i] = date[i] else: join_date[i] = join_date[i-1] return join_date def age_by_month(purchase_rate, month, year, join_month, join_year): age_by_month = list(range(len(year))) for i in range(len(purchase_rate)): if purchase_rate[i] == 1: age_by_month[i] = 0 else: if year[i] == join_year[i]: age_by_month[i] = month[i] - join_month[i] else: age_by_month[i] = month[i] - join_month[i] + 12*(year[i]-join_year[i]) return age_by_month
- purchase_rate函數(shù)將決定這是否是每個客戶的第二次、第三次、第四次購買。
- join_date函數(shù)允許確定客戶加入的日期。
- age_by_month函數(shù)提供了從客戶當(dāng)前購買到第一次購買的多少個月。
現(xiàn)在輸入已經(jīng)準(zhǔn)備好了,接下來創(chuàng)建群組。
創(chuàng)建群組
final['month'] =pd.to_datetime(final['day']).dt.month final['Purchase Rate'] = purchase_rate(final['customer_id']) final['Join Date'] = join_date(final['day'], final['Purchase Rate']) final['Join Date'] = pd.to_datetime(final['Join Date'], dayfirst=True) final['cohort'] = pd.to_datetime(final['Join Date']).dt.strftime('%Y-%m') final['year'] = pd.to_datetime(final['day']).dt.year final['Join Date Month'] = pd.to_datetime(final['Join Date']).dt.month final['Join Date Year'] = pd.to_datetime(final['Join Date']).dt.year
final['Age by month'] = age_by_month(final['Purchase Rate'], final['month'], final['year'], final['Join Date Month'], final['Join Date Year'])
cohorts = final.groupby(['cohort','Age by month']).nunique() cohorts = cohorts.customer_id.to_frame().reset_index() # convert series to frame cohorts = pd.pivot_table(cohorts, values = 'customer_id',index = 'cohort', columns= 'Age by month') cohorts.replace(np.nan, '',regex=True)
**如何解釋這個表格:**以群組2018-01為例。在2018年1月,有462名新客戶。在這462人中,121名客戶在2018年2月回來購買,125名在2018年3月購買,以此類推。
轉(zhuǎn)換為群組百分比
for i in range(len(cohorts)-1): cohorts[i+1] = cohorts[i+1]/cohorts[0] cohorts[0] = cohorts[0]/cohorts[0]
可視化
cohorts_t = cohorts.transpose() cohorts_t[cohorts_t.columns].plot(figsize=(10,5)) sns.set(style='whitegrid') plt.figure(figsize=(20, 15)) plt.title('Cohorts: User Retention') sns.set(font_scale = 0.5) # font size sns.heatmap(cohorts, mask=cohorts.isnull(), cmap="Blues", annot=True, fmt='.01%') plt.show()
到此這篇關(guān)于詳解如何利用Python進(jìn)行客戶分群分析的文章就介紹到這了,更多相關(guān)Python客戶分群分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas之ReIndex重新索引的實(shí)現(xiàn)
這篇文章主要介紹了Pandas之ReIndex重新索引的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06python 非線性規(guī)劃方式(scipy.optimize.minimize)
今天小編就為大家分享一篇python 非線性規(guī)劃方式(scipy.optimize.minimize),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02用python生成與調(diào)用cntk模型代碼演示方法
今天小編就為大家分享一篇用python生成與調(diào)用cntk模型代碼演示方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python實(shí)現(xiàn)動態(tài)條形圖的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python中的pynimate模塊實(shí)現(xiàn)動態(tài)條形圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03PyQt4 treewidget 選擇改變顏色,并設(shè)置可編輯的方法
今天小編就為大家分享一篇PyQt4 treewidget 選擇改變顏色,并設(shè)置可編輯的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06