Python 淘宝用户行为分析

2020-07-08  本文已影响0人  雷全龙

一、项目介绍

利用淘宝平台提供的数据集,通过业务指标对淘宝用户行为进行分析,从而探索淘宝用户的行为模式,具体指标包括:日PV和日UV分析,复购行为分析,漏斗流失分析和用户价值RFM分析。

二、理解数据

属性值说明:

三、数据准备

'''
数据清洗:有无缺失、特征筛选、变量类型转换
'''
import pandas as pd

data = pd.read_csv('old_user.csv')
data.pop('user_geohash')
data['date'] = data['time'].map(lambda x: x.split(' ')[0])
data['hour'] = data['time'].map(lambda x: x.split(' ')[1])
data.pop('time')
print(data.info())
data['date'] = pd.to_datetime(data['date'])
data['hour'] = data['hour'].astype('int32')
data.isnull().sum()
data.to_csv('new_user.csv', index=False)

四、用户行为分析

# 读取数据
data = pd.read_csv('new_user.csv')
data.head(10)
# 总浏览量(PV)、访问用户数(UV)
print('总的浏览量是',data['user_id'].shape[0])
print('访问用户数是',len(data['user_id'].unique()))
print('每个UV平均访问深度',data['user_id'].shape[0]/len(data['user_id'].unique()))
print('每个UV每日平均访问深度',data['user_id'].shape[0]/len(data['user_id'].unique())/len(data['date'].unique()))
# 日浏览总量
pv_daily = data.groupby(['date'])['user_id'].count().reset_index(name='pv')
# 日访问人数
uv_daily = data.groupby(['date'])['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
x_major_locator = plt.MultipleLocator(4)
fig,ax = plt.subplots(2,1,figsize=(10,8))
ax[0].plot(pv_daily['date'], pv_daily['pv'])
ax[0].set_xlabel('date')
ax[0].set_ylabel('pv')
ax[0].xaxis.set_major_locator(x_major_locator)
ax[1].plot(uv_daily['date'], uv_daily['uv'])
ax[1].set_xlabel('date')
ax[1].set_ylabel('uv')
ax[1].xaxis.set_major_locator(x_major_locator)
图1.png

结果表明:

# 每个时刻的pv
pv_hour = data.groupby(['hour'])['user_id'].count().reset_index(name='pv')
# 每个时刻的uv
uv_hour = data.groupby(['hour'])['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
fig,ax = plt.subplots(2,1,figsize=(10,8))
x_major_locator = plt.MultipleLocator(1)
ax[0].plot(pv_hour['hour'], pv_hour['pv'])
ax[0].set_xlabel('hour')
ax[0].set_ylabel('pv')
ax[0].xaxis.set_major_locator(x_major_locator)
ax[1].plot(uv_hour['hour'], uv_hour['uv'])
ax[1].set_xlabel('hour')
ax[1].set_ylabel('uv')
ax[1].xaxis.set_major_locator(x_major_locator)
图2.png

结果表明:

五、漏斗流失分析

# 漏斗模型分析,统计各阶段的转化人数
# 点击——>收藏——>加入购物车——>支付
user = data.groupby('behavior_type')['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
print(f'整个过程流失率:{round((user.uv[0]-user.uv[3])*100/user.uv[0],2)}%')
图3.png

结果表明:

六、复购情况分析

# 用户复购分析(同一天内的购买不算复购)
d1 = data[data['behavior_type'] == 4]
total = len(d1['user_id'].unique())
d2 = d1.groupby('user_id')['date'].unique().map(lambda x: len(x)).reset_index(name='count')
part = len(d2[d2['count'] > 1])
print(f'复购率为:{round(part/total,4)*100}%')

# 复购次数分布
d3 = d2[d2['count'] > 1]
sns.distplot(d3['count'])

# 复购间隔分布(本次购买与下次购买间隔)
distance = list()
for i in d3['user_id']:
    d4 = d1.groupby(by=['user_id'])['date'].get_group(i)
    d4 = pd.DataFrame(d4.values,columns=['date']).sort_values(by = 'date')
    d4['date'] = pd.to_datetime(d4['date'])
    for j in range(len(d4)-1):
        flag = (d4.iloc[j+1,0] - d4.iloc[j,0]).days
        if flag:
            distance.append(flag)
sns.distplot(distance)
图4.png
图5.png

结果表明:

七、用户价值RFM分析

用户分类规则

用户分类 recency frequency
重要价值客户
重要保持客户
重要发展客户
流失客户

分值规则

打分 recency frequency
4 5天以内 20次以上
3 10-15天 10-20次
2 5-10天 5-10次
1 15天以上 5次以下
# 用户类别划分,RFM模型
# money 在一段时期内的采购总金额(数据缺失)
from datetime import datetime
datenow=datetime(2014,12,19)
d5 = d1.copy()
d5['date'] = pd.to_datetime(d5['date'])
d5['date'] = d5['date'].map(lambda x: (datenow-x).days)
d5.rename(columns={'date':'recency'},inplace=True)
d6 = d5.groupby('user_id')['recency'].min().reset_index()
d6['frequency'] = d2['count']

def rscore(x):
    if x < 5:
        score = 4
    elif 5 <= x < 10:
        score = 2
    elif 10 <= x < 15:
        score = 3
    else:
        score = 1
    return score
d6['rscore'] = d6['recency'].map(rscore)
def fscore(x):
    if x > 20:
        score = 4
    elif 5 <= x < 10:
        score = 2
    elif 10 <= x < 20:
        score = 3
    else:
        score = 1
    return score
d6['fscore'] = d6['frequency'].map(fscore)
def rfm(x,y):
    if x > 2 and y > 2:
        label = '重要价值客户'
    elif x <= 2 and y >= 2:
        label = '重要保持客户'
    elif x >= 2 and y <= 2:
        label = '重要发展客户'
    else:
        label = '流失客户'
    return label
d6['level'] = d6[['rscore','fscore']].apply(lambda x: rfm(*x), axis=1)
print(d6['level'].value_counts())
图6.png

学习的脚步永无止境!

上一篇 下一篇

猜你喜欢

热点阅读