<ipython-input-26-02fbe5db5420>:1: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
df_grand = df.loc[df.event_time.dt.year == 2020].groupby('brand')['price','user_id'].agg({'price':'sum','user_id':pd.Series.nunique}).reset_index()
<matplotlib.axes._subplots.AxesSubplot at 0x1928877a520>
data = df.loc[df.event_time.dt.year ==2020].groupby('user_id')['event_time'].min().value_counts().reset_index()
data = data.groupby(data['index'].dt.month)['event_time'].sum().reset_index().rename(columns ={'index':'月份','event_time':'新增人数'})
data
月份
新增人数
0
1
1431
1
2
1390
2
3
1393
3
4
3776
4
5
13046
5
6
8427
6
7
21540
7
8
22496
8
9
8552
9
10
5771
10
11
2959
sns.barplot(data = data,x ='月份',y ='新增人数')
<matplotlib.axes._subplots.AxesSubplot at 0x1928a1c9fa0>
<matplotlib.axes._subplots.AxesSubplot at 0x192f7eba6a0>
data = df.loc[df.event_time.dt.year ==2020].groupby('user_id')['event_time'].max().value_counts().reset_index()
data = data.groupby(data['index'].dt.month)['event_time'].sum().reset_index().rename(columns ={'index':'月份','event_time':'最后一次购买人数'})
data
月份
最后一次购买人数
0
1
168
1
2
241
2
3
302
3
4
1747
4
5
8300
5
6
6043
6
7
17485
7
8
25120
8
9
13075
9
10
10594
10
11
7706
sns.barplot(data = data,x ='月份',y ='最后一次购买人数')
<matplotlib.axes._subplots.AxesSubplot at 0x1928bd589d0>
初次购买和最后一次购买的人数基本相同,说明2020年中,大部分用户的只购买了一次电子产品
统计新老用户的比例
data = df.groupby('user_id')['event_time'].agg(['min','max'])
data.head()
min
max
user_id
1.515916e+18
2020-07-09 06:35:18+00:00
2020-07-09 06:35:18+00:00
1.515916e+18
2020-09-22 15:11:15+00:00
2020-10-28 05:53:47+00:00
1.515916e+18
2020-10-23 03:51:26+00:00
2020-11-16 15:49:50+00:00
1.515916e+18
2020-06-10 21:37:30+00:00
2020-10-06 05:59:30+00:00
1.515916e+18
2020-05-16 16:09:13+00:00
2020-07-14 13:04:12+00:00
data = data.reset_index()
data['is_new']=(data['min']== data['max'])
data.head()
user_id
min
max
is_new
0
1.515916e+18
2020-07-09 06:35:18+00:00
2020-07-09 06:35:18+00:00
True
1
1.515916e+18
2020-09-22 15:11:15+00:00
2020-10-28 05:53:47+00:00
False
2
1.515916e+18
2020-10-23 03:51:26+00:00
2020-11-16 15:49:50+00:00
False
3
1.515916e+18
2020-06-10 21:37:30+00:00
2020-10-06 05:59:30+00:00
False
4
1.515916e+18
2020-05-16 16:09:13+00:00
2020-07-14 13:04:12+00:00
False
data = data.is_new.value_counts().rename(index={False:'多次购买',True:'一次用户'}).to_frame().reset_index().rename(columns={'index':'用户类型','is_new':'用户数量'})
data
用户类型
用户数量
0
多次购买
48071
1
一次用户
42729
sns.barplot(data=data,x ='用户类型',y ='用户数量')
<matplotlib.axes._subplots.AxesSubplot at 0x1928650d280>
从用户类型可以看出,有一半的用户都只购买了一次,复购率很低,需要进一步提高新用户的转换率
用户分层
最近一次消费 (Recency)
消费频率 (Frequency)
消费金额 (Monetary)
data = df.pivot_table(index='user_id',values =['price','order_id','event_time'],aggfunc={'price':'sum','order_id':'count','event_time':'max'}).reset_index().rename(columns={'event_time':'最后购买日期','order_id':'购买次数','price':'消费总金额'})
data.head()
user_id
最后购买日期
购买次数
消费总金额
0
1.515916e+18
2020-07-09 06:35:18+00:00
1
416.64
1
1.515916e+18
2020-10-28 05:53:47+00:00
2
56.43
2
1.515916e+18
2020-11-16 15:49:50+00:00
12
5984.92
3
1.515916e+18
2020-10-06 05:59:30+00:00
7
3785.72
4
1.515916e+18
2020-07-14 13:04:12+00:00
2
182.83
data['最后一次购买间隔']=-(data['最后购买日期']-data['最后购买日期'].max())/np.timedelta64(1,'D')
data
user_id
最后购买日期
购买次数
消费总金额
最后一次购买间隔
0
1.515916e+18
2020-07-09 06:35:18+00:00
1
416.64
135.149444
1
1.515916e+18
2020-10-28 05:53:47+00:00
2
56.43
24.178275
2
1.515916e+18
2020-11-16 15:49:50+00:00
12
5984.92
4.764352
3
1.515916e+18
2020-10-06 05:59:30+00:00
7
3785.72
46.174306
4
1.515916e+18
2020-07-14 13:04:12+00:00
2
182.83
129.879375
...
...
...
...
...
...
90795
1.515916e+18
2020-11-21 09:13:23+00:00
1
208.31
0.039664
90796
1.515916e+18
2020-11-21 09:18:31+00:00
1
3472.20
0.036100
90797
1.515916e+18
2020-11-21 10:10:01+00:00
2
277.74
0.000336
90798
1.515916e+18
2020-11-21 10:04:42+00:00
1
925.67
0.004028
90799
1.515916e+18
2020-11-21 10:10:13+00:00
1
418.96
0.000197
90800 rows × 5 columns
通过RFM方法判断顾客种类
defrfm_func(x):
level = x.apply(lambda x:'1'if x >=0else'0')
label = level['最后一次购买间隔']+level['购买次数']+level['消费总金额']
d={'111':'重要价值客户','011':'重要保持客户','101':'重要发展客户','001':'重要挽留客户','110':'一般价值客户','010':'一般保持客户','100':'一般发展客户','000':'一般挽留客户'}
result = d[label]return result
data['label']= data[['最后一次购买间隔','购买次数','消费总金额']].apply(lambda x:x - x.mean()).apply(rfm_func,axis =1)
data.head()