python數(shù)據(jù)分析項(xiàng)目——臺(tái)北101門票銷售情況(二)

用戶分層

緊接著上一篇文章星瘾,現(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)備:


3.png
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è)月的購買情況:


4.png
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')
用戶分層數(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')
各層用戶比例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()
5.png

通過簡單的描述能夠看到厂画,平均的生命周期只有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')
二次消費(fèi)以上用戶生命周期hist.png

6.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')
各時(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')
重復(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ù)的處理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阵面,一起剝皮案震驚了整個(gè)濱河市样刷,隨后出現(xiàn)的幾起案子置鼻,更是在濱河造成了極大的恐慌蜓竹,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘶是,死亡現(xiàn)場(chǎng)離奇詭異聂喇,居然都是意外死亡蔚携,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門誊辉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堕澄,“玉大人霉咨,你說我怎么就攤上這事【矗” “怎么了棺滞?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵继准,是天一觀的道長。 經(jīng)常有香客問我室谚,道長,這世上最難降的妖魔是什么猪瞬? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任陈瘦,我火速辦了婚禮潮售,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鞍泉。我一直安慰自己肮帐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布游沿。 她就那樣靜靜地躺著诀黍,像睡著了一般仗处。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吃环,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天洋幻,我揣著相機(jī)與錄音,去河邊找鬼好唯。 笑死燥翅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靶端。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼脏榆,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼台谍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤介衔,失蹤者是張志新(化名)和其女友劉穎骂因,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乘盼,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绸栅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年粹胯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辰企。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竹观,死狀恐怖潜索,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情速址,我是刑警寧澤由驹,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站并炮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逃魄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一邪锌、第九天 我趴在偏房一處隱蔽的房頂上張望觅丰。 院中可真熱鬧妨退,春花似錦、人聲如沸冠句。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽基茵。三九已至壳影,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間根灯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工烙肺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桃笙,地道東北人沙绝。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像星著,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虚循,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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