print(‘复购率为 %.3f%%’ %(re_buy_rate * 100) )
复制代码
OUTPUT
复购率为 13.419%
复制代码
复购率较低,应加强老用户召回机制,提升购物体验,也可能因数据量较少,统计周期之内的数据 无法解释完整的购物周期,从而得出结论有误。
3. 用户行为在时间纬度的分布
- 日消费次数、日活跃人数、日消费人数、日消费人数占比、消费用户日人均消费次数
日活跃人数(有一次操作即视为活跃)
daily_active_user = behavior.groupby(‘date’)[‘user_id’].nunique()
日消费人数
daily_buy_user = behavior[behavior[‘type’] == ‘pay’].groupby(‘date’)[‘user_id’].nunique()
日消费人数占比
proportion_of_buyer = daily_buy_user / daily_active_user
日消费总次数
daily_buy_count = behavior[behavior[‘type’] == ‘pay’].groupby(‘date’)[‘type’].count()
消费用户日人均消费次数
consumption_per_buyer = daily_buy_count / daily_buy_user
复制代码
SQL
日消费总次数
SELECT date, COUNT(type) pay_daily FROM behavior_sql
WHERE type = ‘pay’
GROUP BY date;
日活跃人数
SELECT date, COUNT(DISTINCT user_id) uv_daily FROM behavior_sql
GROUP BY date;
日消费人数
SELECT date, COUNT(DISTINCT user_id) user_pay_daily FROM behavior_sql
WHERE type = ‘pay’
GROUP BY date;
日消费人数占比
SELECT
(SELECT date, COUNT(DISTINCT user_id) user_pay_daily FROM behavior_sql
WHERE type = ‘pay’
GROUP BY date) /
(SELECT date, COUNT(DISTINCT user_id) uv_daily FROM behavior_sql
GROUP BY date)
日人均消费次数
SELECT
(SELECT date, COUNT(type) pay_daily FROM behavior_sql
WHERE type = ‘pay’
GROUP BY date) /
(SELECT date, COUNT(DISTINCT user_id) uv_daily FROM behavior_sql
GROUP BY date)
复制代码
日消费人数占比可视化
柱状图数据
pob_bar = (pd.merge(daily_active_user,daily_buy_user,on=‘date’).reset_index()
.rename(columns={‘user_id_x’:‘日活跃人数’,‘user_id_y’:‘日消费人数’})
.set_index(‘date’).stack().reset_index().rename(columns={‘level_1’:‘Variable’,0: ‘Value’}))
线图数据
pob_line = proportion_of_buyer.reset_index().rename(columns={‘user_id’:‘Rate’})
fig1 = plt.figure(figsize=[16,6])
ax1 = fig1.add_subplot(111)
ax2 = ax1.twinx()
sns.barplot(x=‘date’, y=‘Value’, hue=‘Variable’, data=pob_bar, ax=ax1, alpha=0.8, palette=‘husl’)
ax1.legend().set_title(‘’)
ax1.legend().remove()
sns.pointplot(pob_line[‘date’], pob_line[‘Rate’], ax=ax2,markers=‘D’, linestyles=‘–’,color=‘teal’)
x=list(range(0,16))
for a,b in zip(x,pob_line[‘Rate’]):
plt.text(a+0.1, b + 0.001, ‘%.2f%%’ % (b*100), ha=‘center’, va= ‘bottom’,fontsize=12)
fig1.legend(loc=‘upper center’,ncol=2)
plt.title(‘日消费人数占比’)
复制代码
日活跃人数与日消费人数无明显波动,日消费人数占比均在20%以上。
消费用户日人均消费次数可视化
柱状图数据
cpb_bar = (daily_buy_count.reset_index().rename(columns={‘type’:‘Num’}))
线图数据
cpb_line = (consumption_per_buyer.reset_index().rename(columns={0:‘Frequency’}))
fig2 = plt.figure(figsize=[16,6])
ax3 = fig2.add_subplot(111)
ax4 = ax3.twinx()
sns.barplot(x=‘date’, y=‘Num’, data=cpb_bar, ax=ax3, alpha=0.8, palette=‘pastel’)
sns.pointplot(cpb_line[‘date’], cpb_line[‘Frequency’], ax=ax4, markers=‘D’, linestyles=‘–’,color=‘teal’)
x=list(range(0,16))
for a,b in zip(x,cpb_line[‘Frequency’]):
plt.text(a+0.1, b + 0.001, ‘%.2f’ % b, ha=‘center’, va= ‘bottom’,fontsize=12)
plt.title(‘消费用户日人均消费次数’)
复制代码
日消费人数在25000以上,日人均消费次数大于1次。
dau3_df = behavior.groupby([‘date’,‘user_id’])[‘type’].count().reset_index()
dau3_df = dau3_df[dau3_df[‘type’] >= 3]
复制代码
每日高活跃用户数(每日操作数大于3次)
dau3_num = dau3_df.groupby(‘date’)[‘user_id’].nunique()
复制代码
SQL
SELECT date, COUNT(DISTINCT user_id)
FROM
(SELECT date, user_id, COUNT(type)
FROM behavior_sql
GROUP BY date, user_id
HAVING COUNT(type) >= 3) dau3
GROUP BY date;
复制代码
fig, ax = plt.subplots(figsize=[16,6])
sns.pointplot(dau3_num.index, dau3_num.values, markers=‘D’, linestyles=‘–’,color=‘teal’)
x=list(range(0,16))
for a,b in zip(x,dau3_num.values):
plt.text(a+0.1, b + 300 , ‘%i’ % b, ha=‘center’, va= ‘bottom’,fontsize=14)
plt.title(‘每日高活跃用户数’)
复制代码
每日高活跃用户数在大部分4万以上,2018-04-04之前数量比较平稳,之后数量一直攀升,8号9号达到最高,随后下降,推测数据波动应为营销活动产生的。
高活跃用户累计活跃天数分布
dau3_cumsum = dau3_df.groupby(‘user_id’)[‘date’].count()
复制代码
SQL
SELECT user_id, COUNT(date)
FROM
(SELECT date, user_id, COUNT(type)
FROM behavior_sql
GROUP BY date, user_id
HAVING COUNT(type) >= 3) dau3
GROUP BY user_id;
复制代码
fig, ax = plt.subplots(figsize=[16,6])
ax.set_yscale(“log”)
sns.countplot(dau3_cumsum.values,palette=‘Set1’)
for p in ax.patches:
ax.annotate(‘{:.2f}%’.format(100*p.get_height()/len(dau3_cumsum.values)), (p.get_x() + 0.2, p.get_height() + 100))
plt.title(‘高活跃用户累计活跃天数分布’)
复制代码