用戶分層
緊接著上一篇文章星瘾,現(xiàn)在我們來分析下不同用戶(游客)的分層:
user_status = df.pivot_table(index='author', columns='month', values='frequency', aggfunc='count')
user_status = user_status.fillna(0)
user_status = user_status.applymap(lambda x: 1 if x > 0 else 0)
建立一個(gè)數(shù)據(jù)透視表,并先將所有的NAN值改成0惧辈,購買過2次及以上的游客統(tǒng)統(tǒng)記為1琳状,為接下來的用戶分層做準(zhǔn)備:
def active_status(x):
status = []
for i in range(len(user_status.columns)):
# 本月沒有消費(fèi)
if x[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 pd.Series(status)
上面的代碼就是對(duì)用戶的簡單分層:'unreg'是個(gè)前期標(biāo)注盒齿,表示非客戶;‘unactive'表示非活躍用戶县昂,上月有消費(fèi)倒彰,而本月沒有消費(fèi);'new'表示新客戶莱睁,之前沒有消費(fèi)芒澜,本月有消費(fèi)创淡;'active'表示活躍用戶痴晦,連續(xù)兩月有消費(fèi);'return'表示回流用戶琳彩,本來的非活躍用戶誊酌,本月有消費(fèi)。
pivot_user_status = user_status.apply(active_status, axis=1)
pivot_user_status.columns = user_status.columns
# 把浮點(diǎn)轉(zhuǎn)成整數(shù)
def convert_int(x):
if isinstance(x, float) and x >= 0:
return int(x)
# 將前期標(biāo)注的'unreg'替換成NAN露乏,不計(jì)入后續(xù)計(jì)算中碧浊,T表示index和columns的互換
pivot_user_status = pivot_user_status.replace('unreg', np.NAN).apply(pd.value_counts).T
pivot_user_status_count = pivot_user_status.fillna(0).applymap(convert_int)
上述的變換后,最后得到4種用戶每個(gè)月的購買情況:
plt.style.use('seaborn-pastel')
pivot_user_status_count.plot.area()
plt.title('用戶分層數(shù)量', fontsize=15)
plt.xlabel('月份', fontsize=12)
plt.ylabel('人數(shù)', fontsize=12)
plt.savefig('用戶分層數(shù)量area.png')
從圖中可以看到活躍和回流用戶幾乎沒有瘟仿,新用戶在2018年5月之后開始趨于穩(wěn)定箱锐,而這個(gè)時(shí)間點(diǎn)也是上篇文章中分析到的銷量明顯下降的日期;不活躍用戶隨著時(shí)間的積累劳较,曲線符合預(yù)期驹止,無異常。
而數(shù)據(jù)分析中观蜗,數(shù)量的指標(biāo)遠(yuǎn)不如比率的指標(biāo)臊恋,所以我們?cè)賹?種用戶的數(shù)量改成比率,這樣才能更直觀地看出問題和端倪:
rate = pivot_user_status_count.apply(lambda x: x/x.sum()).applymap(lambda x: float('%.3f' % x))
plt.style.use('fast')
titles = rate.columns.values
labels = (i for i in rate.columns.values)
plt.figure(figsize=(20,10))
plt.subplots_adjust(hspace=0.5)
for x in range(4):
plt.subplot(f'22{x}')
rate.loc[:,next(labels)].plot()
plt.xlabel('月份', fontsize=10)
plt.ylabel(f'{titles[x]}比例', fontsize=10)
plt.title(f'{titles[x]}用戶比例', fontsize=12)
plt.savefig('各層用戶比例plot.png')
可以看到門票的銷售情況嫂便,在2018年5月之后捞镰,逐步上升,不管是新用戶毙替,還是回流岸售,還是活躍。
用戶生命周期
time_max = df.groupby('author').time.max()
time_min = df.groupby('author').time.min()
lfc = (time_max - time_min).reset_index()
通過簡單的描述能夠看到厂画,平均的生命周期只有23天凸丸,由于上篇文章中分析到的,92%的用戶是一次消費(fèi)用戶袱院,所以平均生命周期很短屎慢,因此下面我們?nèi)コ淮蜗M(fèi),分析下二次及以上消費(fèi)的生命周期:
lfc['lifetime'] = lfc.time/np.timedelta64(1,'D')
plt.figure(figsize=(10,5))
sns.distplot(lfc[lfc['lifetime'] > 0].lifetime, kde=False, rug=False, bins=50, color=sns.xkcd_rgb['brick red'])
plt.title('二次消費(fèi)以上用戶生命周期', fontsize=15, pad=10)
plt.xlabel('天數(shù)', fontsize=12, labelpad=5)
plt.ylabel('人數(shù)', fontsize=12, labelpad=5)
plt.savefig('二次消費(fèi)以上用戶生命周期hist.png')
結(jié)合密度圖和均值忽洛,能看到二次及以上消費(fèi)的生命周期拉長到了300天腻惠,整體趨勢(shì)隨著時(shí)間的流逝而下降。
留存率
user_retention = pd.merge(left=df, right=time_min.reset_index(), how='inner', on='author', suffixes=('', '_min')).drop(columns=['year','rating','amount'])
user_retention['timediff'] = user_retention.time - user_retention.time_min
user_retention['timediff'] = user_retention.timediff.apply(lambda x: x/np.timedelta64(1,'D'))
bins = []
for i in range(0, 1000, 100):
bins.append(i)
user_retention['timediff_bin'] = pd.cut(user_retention['timediff'], bins=bins)
user_r_tran = user_retention.groupby(['author', 'timediff_bin']).frequency.sum().unstack()
user_r_tran = user_r_tran.fillna(0).applymap(lambda x: 1 if x > 0 else 0)
vals = [float('%.2f'%i) for i in ((user_r_tran.sum()/user_r_tran.count()).values)]
plt.figure(figsize=(10,5))
sns.barplot(user_r_tran.columns.values, vals, palette='PuRd_r')
plt.title('各時(shí)間段的用戶留存率', fontsize=12, color=sns.xkcd_rgb['reddish'], pad=10)
plt.xlabel('時(shí)間跨度(天)', fontsize=10, color=sns.xkcd_rgb['reddish'])
plt.ylabel('留存比率', fontsize=10, color=sns.xkcd_rgb['reddish'])
plt.xticks(rotation=90)
for px, py in zip(range(9), vals):
plt.text(px-0.2,py+0.004,f'{py}')
plt.savefig('各時(shí)間段的用戶留存率bar.png')
留存率的計(jì)算方式就是以100天為一階段欲虚,購買的用戶/總用戶集灌,我們可以看到時(shí)間跨度越大,留存率越低复哆;臺(tái)北101門票更多的還是依靠新用戶的消費(fèi)欣喧。針對(duì)用戶留存問題,不建議過多關(guān)注益涧。
def diff(x):
return abs(x.timediff - x.timediff.shift(-1))
lastdiff = user_retention.groupby('author').apply(diff)
plt.figure(figsize=(10,5))
sns.distplot(lastdiff.dropna(), kde=False, color=sns.xkcd_rgb['pure blue'])
plt.title('重復(fù)購買的周期', fontsize=12, color=sns.xkcd_rgb['reddish'], pad=10)
plt.xlabel('天數(shù)', fontsize=10, color=sns.xkcd_rgb['reddish'], labelpad=6)
plt.ylabel('人數(shù)', fontsize=10, color=sns.xkcd_rgb['reddish'], labelpad=6)
plt.savefig('重復(fù)購買的周期distplot.png')
針對(duì)二次及以上消費(fèi)的用戶購買周期分析可以發(fā)現(xiàn)闲询,這是個(gè)典型的頭長尾短的圖形嘹裂,也就意味著該類型的產(chǎn)品摔握,是適合一次性消費(fèi)的購物習(xí)慣,和我們上面的留存率泊愧,用戶分層的分析相符合盛正。
總結(jié):
本次的數(shù)據(jù)分析項(xiàng)目主要的目的之一是針對(duì)零售、電商痰滋、移動(dòng)互聯(lián)網(wǎng)中經(jīng)常出現(xiàn)的一些指標(biāo)的分析:復(fù)購率敲街、留存率严望、用戶分層、用戶生命周期峻黍、購買周期拨匆。鍛煉針對(duì)時(shí)間類型數(shù)據(jù)的處理。