最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

用戶旅游數(shù)據(jù)分析(源碼自用)

2023-03-27 14:55 作者:無真凡塵  | 我要投稿

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] ?# 用來正常顯示中文標簽

# 1.初識數(shù)據(jù)
df = pd.read_csv('kelu.csv')
# 平均分92,結(jié)合1/2分位數(shù),大多數(shù)用戶評分在100,16~19年票價都是110

# 2.分析數(shù)據(jù)
# a1.每天銷量分析
df['time'] = pd.to_datetime(df['time'], format='%Y/%m/%d')
df.groupby('time')['rating'].count().plot(figsize=(12, 4))

整體來看每日銷量呈現(xiàn)上升趨勢,但是在18年5月份前后(2,3,4)出現(xiàn)一次較大的波動,銷量急劇下滑,猜測外部因素導致
16年9月~17年1月,銷量非常低,每天平均2-3張門票,猜測營業(yè)前期,知名度小

# a2.每月銷量分析
df['month'] = df['time'].values.astype('datetime64[M]') ?# 保留月份精度的日期
df.groupby('month').count()['rating'].plot(figsize=(12, 4))
plt.xlabel('月份')
plt.ylabel('銷售數(shù)量')
plt.title('16~19每月銷量分析')



月份整體銷量依然呈現(xiàn)上升趨勢,但是在18年2,3,4月份銷量下滑明顯,可能有外部原因


a3.每個用戶的購買量和消費金額分析
merge用法,相當于sql當中join
suffixes:如果兩個表中有多個相同列,用suffixes給的值進行區(qū)分(默認值xy)

# 按照游客分組,統(tǒng)計每個游客的購買次數(shù)
grouped_count_author = df.groupby('author')['frequency'].count().reset_index()
# 按照游客分組,統(tǒng)計每個游客的消費金額
grouped_sum_amount = df.groupby('author')['amount'].sum().reset_index()
user_purchase_retention = pd.merge(left=grouped_count_author,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? right=grouped_sum_amount,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? on='author',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? how='inner')
user_purchase_retention.plot.scatter(x='frequency', y='amount', figsize=(12, 4))
plt.title('用戶的購買次數(shù)和消費金額關(guān)系圖')
plt.xlabel('購物次數(shù)')
plt.ylabel('消費次數(shù)')
# 結(jié)論:斜率就是門票價格110,用戶的消費金額和消費次數(shù)呈現(xiàn)線性關(guān)系


# b1.用戶購買門票數(shù)量分析
df.groupby('author')['frequency'].count().plot.hist(bins=50)
plt.xlim(1, 17)
plt.xlabel('購買數(shù)量')
plt.ylabel('人數(shù)')
plt.title('用戶購買門票數(shù)量直方圖')
# 絕大多數(shù)用戶購買過1張門票,用戶在7000人次左右,少數(shù)人購買過2~4張門票


# b2.用戶購買門票2次及以上情況分析
df_frequency_2 = df.groupby('author').count().reset_index()
df_frequency_2[df_frequency_2['frequency'] >= 2].groupby('author')['frequency'].sum().plot.hist(bins=50)
plt.xlabel('購買數(shù)量')
plt.ylabel('人數(shù)')
plt.title('購買門票在2次及以上的用戶數(shù)量')
# 消費兩次的用戶在整體上占比較大,大于2次的用戶占小部分,用戶購買次數(shù)最多為8次


# b3.查看購買2次及以上的具體人數(shù)
df_frequency_2[df_frequency_2['frequency'] >= 2].groupby('frequency')['author'].count()
# 除去購買一次的顧客,可以看出購買2次有402人,購買3次的99人,以此類推得知大多數(shù)數(shù)據(jù)傾向于購買2~5


# b4.購買次數(shù)在1~5次之間的用戶占比分析
# 對用戶author進行分組 ?取出消費頻率 ?進行邏輯判斷(1-5) ?數(shù)據(jù)可視化(pie)
df_frequency_gte_1 = df.groupby('author')['frequency'].count().reset_index()
# 購買次數(shù)>=1
df_frequency_gte_1 = df_frequency_gte_1[df_frequency_gte_1['frequency'] >= 1]
# 購買次數(shù)<=5
values = df_frequency_gte_1[df_frequency_gte_1['frequency'] <= 5].groupby('frequency')['frequency'].count()
# 繪制餅圖
labels = ['1次', '2次', '3次', '4次', '5次']
plt.pie(values, labels=labels, autopct='%1.1f%%')
plt.title('購買次數(shù)在1~5次之間的用戶占比')
plt.legend()
plt.show()


# b5.購買次數(shù)在2~5次之間的用戶占比分析
df_frequency_gte_2 = df.groupby('author')['frequency'].count().reset_index()
# 購買次數(shù)>=1
df_frequency_gte_2 = df_frequency_gte_2[df_frequency_gte_2['frequency'] >= 2]
# 購買次數(shù)<=5
values = df_frequency_gte_2[df_frequency_gte_2['frequency'] <= 5].groupby('frequency')['frequency'].count()
# 繪制餅圖
labels = ['2次', '3次', '4次', '5次']
plt.pie(values, labels=labels, autopct='%1.1f%%')
plt.title('購買次數(shù)在2~5次之間的用戶占比')
plt.legend()


# 在購物次數(shù)在2~5次的用戶中,其中消費2次的占比70%,消費3次占比17%,4次占比8.5%,5次占比4.3%。消費2,3次用戶依然很重要,消費次數(shù)在4,5比重較少,需要針對性的對2,3次的用戶進行引導,消費次數(shù)1次的用戶,可以嘗試轉(zhuǎn)化到消費2,3


# c1.復購率分析
pivot_count = df.pivot_table(index='author',
? ? ? ? ? ? ? ? ? ? ? ? ? ? columns='month',
? ? ? ? ? ? ? ? ? ? ? ? ? ? values='frequency',
? ? ? ? ? ? ? ? ? ? ? ? ? ? aggfunc='count').fillna(0)

三種情況:
消費次數(shù)>1,為復購用戶,用1表示
消費次數(shù)=1,為非復購用戶,用0表示
消費次數(shù)=0,未消費用戶,用nan表示

pivot_count = pivot_count.applymap(lambda x: 1 if x > 1 else np.NaN if x == 0 else 0)

(pivot_count.sum()/pivot_count.count()).plot()
plt.xlabel('時間(月)')
plt.ylabel('百分比(%)')
plt.title('16~19年每月復購率')
# 16年9月復購率最高達到7.5%,然后開始下降,趨于平穩(wěn)在1.2%


# c2.復購用戶人數(shù)
pivot_count.sum().plot()
plt.xlabel('時間/月')
plt.ylabel('復購人數(shù)')
plt.title('16~19年每月的復購人數(shù)折線圖')
# 整體來看,復購人數(shù)呈現(xiàn)上升趨勢,但是在18年2,3,4,10和19年2月份,復購人數(shù)下降較為明顯,出現(xiàn)異常信號,需要和業(yè)務部門具體分析情況


# c3.回購率分析
pivot_purchase = df.pivot_table(index='author',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?columns='month',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?values='frequency',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?aggfunc='count').fillna(0)


def purchase_return(data): ? # data:代表的是每一名游客的所有月份消費記錄
? ?status = [] ?# 存儲每一個月回購狀態(tài)
? ?for i in range(30): ? # 遍歷每一個月
? ? ? ?# 本月消費了
? ? ? ?if data[i] == 1:
? ? ? ? ? ?if data[i + 1] == 1: ? # 1:回購用戶
? ? ? ? ? ? ? ?status.append(1)
? ? ? ? ? ?else:
? ? ? ? ? ? ? ?status.append(0) ? # 0:非回購用戶(當前月消費了,下個月未消費)
? ? ? ?else: ?# 本月未消費
? ? ? ? ? ?status.append(np.NaN) ? # nan:當前月未消費
? ?status.append(np.NaN) ?# 填充最后一列數(shù)據(jù)
? ?return pd.Series(status, pivot_purchase.columns)


pivot_purchase_return = pivot_purchase.apply(purchase_return, axis=1)
# (pivot_purchase_return.sum()/pivot_purchase_return.count()).plot()
plt.title('16~19年每月的回購率')
plt.xlabel('月份')
plt.ylabel('回購率%')
# 回購率最高在18年6月份,達到4%;整體來看回購率呈現(xiàn)微弱的上升趨勢,出現(xiàn)了幾次較大下滑,分別是17-6,17-1,18-8,19-1


# c4.回購人數(shù)分析
pivot_purchase_return.sum().plot()
plt.title('16~19年每月的回購人數(shù)')
plt.xlabel('人數(shù)')
plt.ylabel('回購率%')
# 整體呈現(xiàn)上升趨勢,回購人數(shù)最多時在18-11,人數(shù)為17人;其中有幾次回購人數(shù)下降較為明顯,主要在分別是17-6,18-1,18-8,19-1


# c5.每個月分層用戶占比情況


def active_status(data): ? # data:整行數(shù)據(jù),共18列
? ?status = [] ?# 負責存儲18個月的狀態(tài):unreg|new|unactive|return
? ?for i in range(31):
? ? ? ?# 本月沒有消費==0
? ? ? ?if data[i] == 0:
? ? ? ? ? ?if len(status) == 0: ?# 前面沒有任何記錄(97年1月份)
? ? ? ? ? ? ? ?status.append('unreg')
? ? ? ? ? ?else: ?# 開始判斷上一個狀態(tài)
? ? ? ? ? ? ? ?if status[i-1] == 'unreg': ?# 一直未消費過
? ? ? ? ? ? ? ? ? ?status.append('unreg')
? ? ? ? ? ? ? ?else: ?# new/active/unactive/return
? ? ? ? ? ? ? ? ? ?status.append('unactive') ?# 不管上個月是否消費過,本月都是不活躍的
? ? ? ?# 本月有消費==1
? ? ? ?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: ?# new/active/return=1
? ? ? ? ? ? ? ? ? ?status.append('active')
? ?return pd.Series(status, pivot_purchase.columns) ? # 值status,列名df_purchase中的列名


pivot_purchase_status = pivot_purchase.apply(active_status, axis=1)
pivot_status_count = pivot_purchase_status.replace('unreg', np.NaN).apply(pd.value_counts)
pivot_status_count.T.plot.area()
# 可以看出,紅色(不活躍用戶)占據(jù)網(wǎng)站用戶的主體;橙色(新用戶)從17-1~19-1,呈現(xiàn)上升趨勢;但是在18-4左右,新用戶的量突然急劇下降,異常信號;以后新用戶又開始逐漸上漲,回復穩(wěn)定狀態(tài);綠色(回流用戶),一直維持穩(wěn)定狀態(tài),但是在18年2~4月份,出現(xiàn)異常下降情況,異常信號;


# c6.每月不同用戶的占比
return_rate = pivot_status_count.apply(lambda x: x/x.sum())
return_rate.T.plot()
# 在17-1過后,網(wǎng)站用戶主體由不活躍用戶組成,新用戶占比開始逐漸下降,并且趨于穩(wěn)定,穩(wěn)定在10%左右;活躍用戶和回流用戶,一直很穩(wěn)定,并且占比較?。?6-9月前后,新用戶和不活躍用戶,發(fā)生較大變化,猜測由活動或節(jié)假日造成...

# c7.每月活躍用戶的占比
return_rate.T['active'].plot(figsize=(12, 6))
plt.xlabel('時間(月)')
plt.ylabel('百分比')
plt.title('每月活躍用戶的占比分析')
# 在17-1月份活躍用戶占比較高,在0.5%,但是在1~2月份,急劇下降,猜測可能是春節(jié)或氣溫的原因;結(jié)合歷年1~2月份銷量來看,都會出現(xiàn)一定比例的下降,驗證了猜測;在18年2月和5月出現(xiàn)異常,門票銷量下降,猜測降水或臺風影響(對于公司內(nèi)部情況未知,只猜測外部因素)

# c8.每月回流用戶的占比分析
return_rate.T['return'].plot(figsize=(12, 6))
plt.xlabel('時間(月)')
plt.ylabel('百分比')
plt.title('每月回流用戶的占比分析')

整體來看,回流用戶比例上升趨勢,但是波動較大;在17年1月和6月,18年4月,19年2月,回流用戶比例都出現(xiàn)了較大幅度下降,表現(xiàn)為異常信號;回流用戶平均值在0.73%左右,在17年9月份以后,僅有兩個異常點在平均值以下;在17年9月份之前,所有數(shù)據(jù)都顯示出回流用戶比例低于平均值,猜測景點開放不久很多游客尚未發(fā)現(xiàn)本景點,或者本景點在該平臺剛上線不久
不論是回流用戶還是活躍用戶,在以上幾個月份中都表現(xiàn)出下降趨勢;


# d1.用戶的生命周期
time_min = df.groupby('author')['time'].min()
time_max = df.groupby('author')['time'].max()
life_time = (time_max-time_min).reset_index()
# print(life_time.describe())
# 通過原樣本8757條和count=7722得知,存在一個用戶多次消費的情況;平均生命周期天數(shù)23天,通過25%,50%,75%分位數(shù)得知,絕大多數(shù)用戶生命周期為0天;最大生命周期為864天


# d2.用戶生命周期直方圖
life_time['life_time'] = life_time['time']/np.timedelta64(1, 'D')
# life_time['life_time'].plot.hist(bins=100, figsize=(12, 6))
plt.xlabel('天數(shù)')
plt.ylabel('人數(shù)')
plt.title('所有用戶的生命周期直方圖')
# 生命周期為0的用戶(僅在一天內(nèi)有過消費,之后在沒消費過),存在7130個用戶;由于總用戶數(shù)為7722,其余592人屬于優(yōu)質(zhì)的忠誠客戶


# d3.生命周期大于0天的客戶,直方圖
life_time[life_time['life_time'] > 0]['life_time'].plot.hist(bins=100, figsize=(12, 6))
plt.xlabel('天數(shù)')
plt.ylabel('人數(shù)')
plt.title('生命周期在0天以上的用戶的分布直方圖')
print(life_time[life_time['life_time'] > 0][life_time].mean())
# 去掉生命周期為0的客戶,可知用戶平均生命周期為300天,生命周期在100天的用戶量達到了最大值17人,生命周期在100~350天來看,用戶量呈現(xiàn)緩慢下降的趨勢;350~800天左右來看,用戶量下降速度明顯,存在一定用戶流失,而忠誠用戶越來越少


# d4.各時間段的用戶留存率
留存率:1~90天,有多少留存用戶。求出用戶的留存天數(shù),比如留存天數(shù)==89,屬于1~90天內(nèi)的留存用戶
留存天數(shù)計算方式:用戶每一次的消費時間分別減去用戶第一次消費時間

user_purchase_retention = pd.merge(left=df, right=time_min.reset_index(), how='inner', on='author', suffixes=('', '_min'))
# 計算留存天數(shù)
user_purchase_retention['time_diff'] = user_purchase_retention['time']-user_purchase_retention['time_min']
# 將time_diff轉(zhuǎn)成數(shù)值
user_purchase_retention['time_diff'] = user_purchase_retention['time_diff'].apply(lambda x: x/np.timedelta64(1, 'D'))
# 生成時間跨度(3個月,即90天),判斷屬于那個區(qū)間
bins = [i*90 for i in range(11)]
user_purchase_retention['time_diff_bin'] = pd.cut(user_purchase_retention['time_diff'], bins)
# 統(tǒng)計每個游客,在不同的時間段內(nèi)消費頻率和值(便于稍后判斷該用戶在某個區(qū)間內(nèi)是不是留存用戶)
pivot_retention = user_purchase_retention.groupby(['author', 'time_diff_bin'])['frequency'].sum().unstack()
# 判斷是否是留存用戶(1:留存,0:未留存)
pivot_retention_trans = pivot_retention.fillna(0).applymap(lambda x: 1 if x > 0 else 0)
(pivot_retention_trans.sum()/pivot_retention_trans.count()).plot.bar()
plt.xlabel('時間跨度(天)')
plt.ylabel('留存率')
plt.title('各時間段內(nèi)的用戶留存率')

# 如圖,每個周期是3個月,第一個周期的留存率在2.2%,前三個周期的遞減速度在0.3%左右。在第四五個周期的時候趨于平穩(wěn),穩(wěn)定在留存率1.5%左右;從第五個周期開始,留存率明顯下降,下降到幾乎0%,在第四五周期(1年)的時候,需要采取方法將用戶留住進行再次消費,如果再跨度為1年的時候,不召回用戶,則就會面臨大量用戶流失的風險






用戶旅游數(shù)據(jù)分析(源碼自用)的評論 (共 條)

分享到微博請遵守國家法律
斗六市| 湖州市| 阿坝县| 如东县| 克什克腾旗| 千阳县| 闻喜县| 疏附县| 绿春县| 竹溪县| 诸暨市| 宝兴县| 太和县| 和平区| 美姑县| 罗源县| 城市| 来宾市| 辉南县| 山阳县| 商城县| 安国市| 丹寨县| 凌源市| 贵定县| 巫山县| 仙游县| 平和县| 灌阳县| 乌苏市| 泾阳县| 临桂县| 昭苏县| 苏州市| 柳河县| 平远县| 邢台县| 陇西县| 和平县| 河源市| 漯河市|