淘宝用户行为分析项目:Python

一、分析背景

  网购已经成为人们生活不可或缺的一部分,本次项目基于淘宝app平台数据,通过相关指标对用户行为进行分析,从而探索用户相关行为模式。

       本文使用的数据集包含了2014.11.18到2014.12.18之间,淘宝App移动端一个月内的用户行为数据。该数据有12256906条记录,共6列数据。

 数据链接:数据集-阿里云天池

  • user_id:用户身份

  • item_id:商品id

  • behavior_type:用户行为类型(包括点击、收藏、加入购物车、支付四种行为,分别用数字1、2、3、4表示)

  • user_geohash:地理位置

  • item_category:品类id(商品所属的分类)

  • time:用户行为发生的时间

二、分析框架

淘宝用户行为分析项目:Python_第1张图片

三、分析及可视化

1、导入相关库

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib as  mpl
import matplotlib.pyplot as  plt
import seaborn as sns
from datetime import datetime
import warnings

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False

warnings.filterwarnings('ignore')

2、数据预处理

2.1 数据预览

df = pd.read_csv("tianchi_mobile_recommend_train_user.csv",dtype=str)
df.shape
df.info()
df.sample(10)

淘宝用户行为分析项目:Python_第2张图片

 2.2 计算缺失率

df.isnull().sum()/len(df['user_id'])

淘宝用户行为分析项目:Python_第3张图片

  2.3 删除地理位置这一列

del df['user_geohash']
df.head()

淘宝用户行为分析项目:Python_第4张图片

 2.4 处理时间time列,将该列拆分为date日期列,和hour小时列

df['date'] = df['time'].str[0:10]
df['hour'] = df['time'].str[11:]
df.head()

淘宝用户行为分析项目:Python_第5张图片

 2.5 将time、date列都变为标准日期格式,将hour列变为int格式

df['date'] = pd.to_datetime(df['date'])
df["time"] = pd.to_datetime(df["time"])
df["hour"] = df["hour"].astype(int)
df.info()

淘宝用户行为分析项目:Python_第6张图片

 2.6 将数据按照time列,升序排列并生成新的索引

df = df.sort_values(by='time',ascending=True).reset_index(drop=True)
df.head()

淘宝用户行为分析项目:Python_第7张图片

 2.7 查看数据的分布

df.describe(include='all')

淘宝用户行为分析项目:Python_第8张图片

 2.8 对时间数据做一个概览

df["date"].unique()

淘宝用户行为分析项目:Python_第9张图片

3、用户行为分析

3.1 计算PV和UV

total_pv = df["user_id"].count()
total_pv
total_uv = df["user_id"].nunique()
total_uv

淘宝用户行为分析项目:Python_第10张图片

      从图中可以看到,该网站页面的总浏览量为12256906次,该页面的独立访客数共有10000个。

3.2 日期维度下的PV和UV

pv_daily = df.groupby('date')['user_id'].count().reset_index()
uv_daily = df.groupby('date')['user_id'].nunique().reset_index()
pv_uv_daily = pv_daily.merge(uv_daily,how='left',on='date')
pv_uv_daily.columns = ['date',"pv","uv"]
pv_uv_daily.head()
pv_daily.set_index('date',inplace=True)
uv_daily.set_index('date',inplace=True)

plt.figure(figsize=(16,10))
plt.subplot(211)
plt.plot(pv_daily['user_id'],c="r")
plt.title("每天页面的总访问量(PV)")
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.subplot(212)
plt.plot(uv_daily['user_id'],c="g")
plt.title("每天页面的独立访客数(UV)")
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.tight_layout()
plt.savefig("PV和UV的变化趋势",dpi=300)

淘宝用户行为分析项目:Python_第11张图片

淘宝用户行为分析项目:Python_第12张图片

       从图中可以看出,pv和uv数据呈现高度的正相关。双12前后,pv和uv都在350000-400000之间波动,双12的时候,页面访问量急剧上升,证明这次活动的效果很好。

3.3 时间维度下的PV和UV

pv_hour = df.groupby('hour')['user_id'].count()
uv_hour = df.groupby('hour')['user_id'].nunique()
pv_uv_hour = pd.concat([pv_hour,uv_hour],axis=1)
pv_uv_hour.columns=["pv_hour","uv_hour"]
pv_uv_hour.head()

fig = plt.figure(figsize=(20,10))
ax1 = fig.add_subplot(111)

ax1.plot(pv_uv_hour["pv_hour"],c="steelblue",label="每个小时的页面总访问量")
plt.ylabel("页面访问量")
plt.legend(loc = 2)

ax2 = ax1.twinx()
ax2.plot(pv_uv_hour["uv_hour"],c="red",label="每个小时的页面独立访客数")
plt.ylabel("页面独立访客数")
plt.xticks(range(0,24),pv_uv_hour.index)
plt.legend(loc = 6, bbox_to_anchor=(0, 0.9))
plt.tight_layout()
plt.savefig("每个小时的PV和UV的变化趋势",dpi=300)

淘宝用户行为分析项目:Python_第13张图片

淘宝用户行为分析项目:Python_第14张图片

       从图中可以看出,晚上22:00-凌晨5:00,页面的访问用户数量和访问量逐渐降低,该时间段很多人都是处在休息之中。而从早上6:00-10:00用户数量逐渐呈现上升趋势,10:00-18:00有一个比较平稳的状态,这个时间段是正常的上班时间。但是18:00以后,一直到晚上22:00,用户剧烈激增,一直达到一天中访问用户数的最大值。运营人员可以参考用户的活跃时间段,采取一些促销活动。

 3.4 计算点击、收藏、添加购物车、支付用户数量

type_1 = df[df['behavior_type']=="1"]["user_id"].count()
type_2 = df[df['behavior_type']=="2"]["user_id"].count()
type_3 = df[df['behavior_type']=="3"]["user_id"].count()
type_4 = df[df['behavior_type']=="4"]["user_id"].count()
print("点击用户:",type_1)
print("收藏用户:",type_2)
print("添加购物车用户:",type_3)
print("支付用户:",type_4)

淘宝用户行为分析项目:Python_第15张图片

       从图中可以看到,用户进行页面点击–>收藏和加如购物车–>支付,逐渐呈现下降趋势。关于这方面的分析,将在下面的漏斗图中继续更为深入的说明。

 3.5 日期维度下,点击、收藏、添加购物车、支付用户的情况

pv_date_type = pd.pivot_table(df, index='date',columns='behavior_type',\
               values='user_id',aggfunc='count')
pv_date_type.columns=['点击','收藏','加入购物车','支付']
pv_date_type.head()

fig = plt.figure(figsize=(20,10))
ax1 = fig.add_subplot(111)
ax1.plot(pv_date_type['收藏'],label='收藏',linestyle = '--')
ax1.plot(pv_date_type['加入购物车'],label= '加入购物车',linestyle = '-.')
ax1.plot(pv_date_type['支付'],label= '支付')
plt.ylim(0,30000)
plt.legend(loc=2)

ax2 = ax1.twinx()
ax2.plot(pv_date_type['点击'],label='点击',color='r',linestyle = ':')

plt.legend(loc = 'upper right')

淘宝用户行为分析项目:Python_第16张图片

淘宝用户行为分析项目:Python_第17张图片

    从图中可以看出,点击、收藏、加入购物车和支付在双12前后波动剧烈,也证明证明这次活动的效果很好。

  3.6 星期维度下,点击、收藏、添加购物车、支付用户的情况

pv_time_week_type = pd.pivot_table(df,index='time_week',columns='behavior_type',\
                              values='user_id',aggfunc='count')
pv_time_week_type.columns=['点击','收藏','加入购物车','支付']
pv_time_week_type.head()



fig = plt.figure(figsize=(20,10))
ax1 = fig.add_subplot(111)
ax1.plot(pv_time_week_type['收藏'],label='收藏',linestyle = '--')
ax1.plot(pv_time_week_type['加入购物车'],label= '加入购物车',linestyle = '-.')
ax1.plot(pv_time_week_type['支付'],label= '支付')
plt.ylim(0,60000)
plt.legend(loc=2)

ax2 = ax1.twinx()
ax2.plot(pv_time_week_type['点击'],label='点击',color='r',linestyle = ':')

plt.legend(loc = 'upper right')
plt.savefig("不同星期不同用户行为的PV变化趋势",dpi=300)

淘宝用户行为分析项目:Python_第18张图片淘宝用户行为分析项目:Python_第19张图片

       从上图可以看出,整周时间内,支付行为主要在周五完成,周六、日相对比较平淡。其他行为也有相同模式,特别是点击行为,从周一极速增长到周四后极速下降,呈现比较剧烈的波动。

 3.7 时间维度下,点击、收藏、添加购物车、支付用户的情况

pv_hour_type = pd.pivot_table(df,index='hour',columns='behavior_type',\
                              values='user_id',aggfunc='count')
pv_hour_type.columns=['点击','收藏','加入购物车','支付']
pv_hour_type.head()


plt.figure(figsize=(16,10))

sns.lineplot(data = pv_hour_type[['收藏', '加入购物车', '支付']])
plt.legend(loc="best")
pv_hour_type["点击"].plot(c="r",linewidth=2,label="点击",secondary_y=True)
plt.legend(loc = 1)

plt.tight_layout()
plt.savefig("不同小时不同用户行为的PV变化趋势",dpi=300)

淘宝用户行为分析项目:Python_第20张图片

      从上图可以看出,四种行为呈现高度的正相关,均是晚上22:00-凌晨5:00,逐渐降低,从早上6:00-10:00用户数量逐渐呈现上升趋势,10:00-18:00有一个比较平稳的状态,从18:00以后,一直到晚上22:00,用户剧烈激增,一直达到一天中访问用户数的最大值。

   3.8 支付次数前10的用户行为细分

df['user_id1'] = df['user_id']
buy_first = pd.pivot_table(df, index = 'user_id', columns = 'behavior_type',\
            values = 'user_id1', aggfunc='count')
buy_first.columns = ['点击','收藏','加入购物车','支付']
buy_first_10 = buy_first.sort_values(by='支付',ascending = False)[0:10]
buy_first_10

plt.figure(figsize=(16,10))

plt.subplot(311)
plt.plot(buy_first_10["点击"],c='steelblue')
plt.title("点击数的变化趋势")

plt.subplot(312)
plt.plot(buy_first_10["收藏"],c='g')
plt.title("收藏数的变化趋势")

plt.subplot(313)
plt.plot(buy_first_10["加入购物车"],c='r')
plt.title("加入购物车的变化趋势")

plt.tight_layout()
plt.savefig("支付数前10的用户,在点击、收藏、加入购物车的变化趋势",dpi=300)

淘宝用户行为分析项目:Python_第21张图片

 淘宝用户行为分析项目:Python_第22张图片

    从上图可以看出,购买次数最多的用户,点击、收藏、加入购车的次数不一定是最多的。

4、用户消费行为分析

4.1 每日消费用户人均消费次数

total_custome = df[df['behavior_type'] == "4"].groupby(["date","user_id"])["behavior_type"].count().reset_index().rename(columns={"behavior_type":"total"})
total_custome.head()

total_custome2 = total_custome.groupby("date")["total"].sum()/total_custome.groupby("date")["total"].count()
total_custome2.head(10)


x = len(total_custome2.index)
y = total_custome2.index.astype(str)

plt.figure(figsize=(20,7))


plt.plot(total_custome2.values)
plt.xticks(range(0,31,5),[y[i] for i in range(0,x,5)])

plt.title('每天的人均消费次数')
plt.tight_layout()
plt.savefig("每天的人均消费次数",dpi=300)

淘宝用户行为分析项目:Python_第23张图片

淘宝用户行为分析项目:Python_第24张图片

 4.2 每日活跃用户消费次数

df["operation"] = 1
aa = df.groupby(["date","user_id",'behavior_type'])["operation"].count().\
      reset_index().rename(columns={"operation":"total"})
aa.head(10)

#每天消费总次数/每天消费人数 nunique()
aa1 = aa.groupby("date").apply(lambda x: x[x["behavior_type"]=="4"]["total"].sum()/x["user_id"].nunique())
aa1.head(10)

x = len(aa1.index)
y = aa1.index.astype(str)

plt.figure(figsize=(20,7))


plt.plot(aa1.values)
plt.xticks(range(0,31,5),[y[i] for i in range(0,x,5)])

plt.title('每天的活跃用户消费次数')
plt.tight_layout()
plt.savefig('每天的活跃用户消费次数',dpi=300)

淘宝用户行为分析项目:Python_第25张图片

淘宝用户行为分析项目:Python_第26张图片

 4.3 付费率分析

rate = aa.groupby('date').apply(lambda x:x[x['behavior_type']=='4']['user_id'].nunique()/x['user_id'].nunique())
rate.head()


x=len(rate.index)
y=rate.index.astype(str)

plt.figure(figsize=(20,7))
plt.plot(rate.values)

plt.xticks(range(0,31,5),[y[i] for i in range(0,31,5)])

plt.title('付费率分析')
plt.tight_layout()
plt.savefig('付费率分析',dpi=300)

淘宝用户行为分析项目:Python_第27张图片

淘宝用户行为分析项目:Python_第28张图片

 4.4 复购率分析

re_buy = df[df['behavior_type']=='4'].groupby('user_id')['date'].nunique()
re_buy.head()

re_buy[re_buy>1].count()/re_buy.count()

淘宝用户行为分析项目:Python_第29张图片

4.5 转化率分析

df_count = df.groupby("behavior_type").size().reset_index().\
           rename(columns={"behavior_type":"环节",0:"人数"})
           
type_dict = {
    "1":"点击",
    "2":"收藏",
    "3":"加入购物车",
    "4":"支付"
}
df_count["环节"] = df_count["环节"].map(type_dict)

a = df_count.iloc[0]["人数"]
b = df_count.iloc[1]["人数"]
c = df_count.iloc[2]["人数"]
d = df_count.iloc[3]["人数"]
funnel = pd.DataFrame({"环节":["点击","收藏及加入购物车","支付"],"人数":[a,b+c,d]})

funnel["总体转化率"] = [i/funnel["人数"][0] for i in funnel["人数"]]
funnel["单一转化率"] = np.array([1.0,2.0,3.0])
for i in range(0,len(funnel["人数"])):
    if i == 0:
        funnel["单一转化率"][i] = 1.0
    else:
        funnel["单一转化率"][i] = funnel["人数"][i] / funnel["人数"][i-1]
# 绘图如下
import plotly.express as px
import plotly.graph_objs as go

trace = go.Funnel(
    y = ["点击", "收藏及加入购物车", "购买"],
    x = [funnel["人数"][0], funnel["人数"][1], funnel["人数"][2]],
    textinfo = "value+percent initial",
    marker=dict(color=["deepskyblue", "lightsalmon", "tan"]),
    connector = {"line": {"color": "royalblue", "dash": "solid", "width": 3}})
    
data =[trace]

fig = go.Figure(data)

fig.show()

淘宝用户行为分析项目:Python_第30张图片

淘宝用户行为分析项目:Python_第31张图片

淘宝用户行为分析项目:Python_第32张图片

       从上图可以看出,由于收藏和加入购车都是有购买意向的一种用户行为,且不分先后顺序,因此我们将其合并看作一个阶段。从上面的漏斗图和funnel表可以看出,从浏览到具有购买意向(收藏和加入购物车),只有5%的转化率,但是到了真正到购买的转化率只有1%,再看“单一转化率”,从具有购买意向到真正购买的转化率达到了20%。说明从浏览到进行收藏和加入购物车的阶段,是指标提升的重要环节。

5、RFM分析

recent_buy = df[df['behavior_type']=='4'].groupby('user_id')['date'].max().\
             apply(lambda x:(datetime.strptime('2014-12-20','%Y-%m-%d')-x).days).reset_index().\
             rename(columns={"date":"recent"})

buy_freq = df[df['behavior_type']=='4'].groupby('user_id')['date'].count().reset_index().\
          rename(columns={"date":"freq"})

rfm = pd.merge(recent_buy,buy_freq,how='inner',on='user_id')

r_bins = [0,5,10,15,20,50]
f_bins = [1,30,60,90,120,900]
rfm['r_score'] = pd.cut(rfm['recent'],bins=r_bins,labels=[5.0,4.0,3.0,2.0,1.0],right = False)
rfm['f_score'] = pd.cut(rfm['freq'],bins=f_bins,labels=[1.0,2.0,3.0,4.0,5.0],right = False)
rfm['r_score']=rfm['r_score'].astype(float)
rfm['f_score']=rfm['f_score'].astype(float)

avg_r =rfm['r_score'].mean()
avg_f =rfm['f_score'].mean()

def func1(x):
    if x > avg_r:
        return '高'
    else:
        return '低'

def func2(x):
    if x > avg_f:
        return '高'
    else:
        return '低'

rfm["r"] =rfm['r_score'].apply(func1)
rfm["f"] =rfm['f_score'].apply(func2)

rfm['rfm'] = rfm["r"] + '-' + rfm["f"] 


def trans_labels(x):
    if x == "高-高":
        return"重要价值客户"
    elif x == "低-高":
        return"重要唤回客户"
    elif x == "高-低":
        return"重要深耕客户"
    else:
        return"重要挽回客户"

rfm["标签"] = rfm['rfm'].apply(trans_labels)

rfm["标签"].value_counts()

rfm.loc[rfm["标签"] =='重要价值客户','color']='g'
rfm.loc[~(rfm["标签"] =='重要价值客户'),'color']='r'
rfm.plot.scatter('freq','recent',c= rfm.color)

淘宝用户行为分析项目:Python_第33张图片

 淘宝用户行为分析项目:Python_第34张图片

 淘宝用户行为分析项目:Python_第35张图片

 淘宝用户行为分析项目:Python_第36张图片

淘宝用户行为分析项目:Python_第37张图片

       从图中可以看出,重要价值客户主要集中在近5天,消费频率20-100次的区间,这与最近的双12活动也相关。

六、用户活跃分析

pivoted_counts = df.pivot_table(index= 'user_id',
                               columns= 'date',
                               values= 'user_id1',
                               aggfunc= 'count').fillna(0)
# 大于一次的全部设为1
df_purchase = pivoted_counts.applymap(lambda x:1 if x>0 else 0)
df_purchase.head()


def active_status(data):
    status = []
    for i in range(31):
        if data[i] == 0:
            if len(status)>0:
                if status[i-1] == "unreg":
                 # 未注册客户
                    status.append("unreg")
                else:
                 # 不活跃用户
                    status.append("unactive")
            else:
                status.append("unreg")
            
        # 若本月消费了
        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)  

purchase_stats = df_purchase.apply(active_status,axis =1)
purchase_stats.columns = df_purchase.columns
purchase_stats.head()



purchase_stats_ct = purchase_stats.replace('unreg',np.NaN).apply(lambda x:pd.value_counts(x))

purchase_stats_ct.fillna(0).T.plot.area()

淘宝用户行为分析项目:Python_第38张图片

淘宝用户行为分析项目:Python_第39张图片

淘宝用户行为分析项目:Python_第40张图片

        从上图可以看出,活跃客户和回归客户在12月12日前后均有明显波动,这与淘宝的双12活动有关。其他时间里,活跃客户、新客户、回归客户和非活跃客户均保持比较稳定的状态。

七、分析总结

  • 业务流程方面

      需要引导用户进行收藏和加入购物车,比如发放优惠券,满减活动,送礼品等给用户优惠的方式,通过大量销售,提升购买转化率。并且对于点击量高的商品,要重点分析,优化商品的推荐机制,让用户做到点击即想购买。

  • 在时间维度上

       在用户的休闲时间段,比如通勤时间7-10点,午饭时间12-13点,以及晚上6-10点之间做促销活动以及一些相关的营销,在星期的选择上,应将重心放在周一至周五,特别是周四和周五的活动,这样能够大大增加用户购买的转化率。

  • 用户群体

       对于重要价值的用户,需要给其提供VIP服务,比如VIP可以得到优惠券;对于重要挽留的客户,要发短信和邮件,或者APP客户端推送等,让客户重新回来消费,此外可以通过一些节日优惠等再次召回客户。对于重要发展和重要保持用户,可以再重点提升消费频次,通过优惠券等活动刺激消费。

你可能感兴趣的:(数据分析,python)