一、数据来源
本文的数据主要包含两部分,一部分是用户行为数据,另一部分是用户信息数据,数据文件可从如下地址获取:
提取码:bfdw
二、分析思路
三、分析过程
3.1 定义高潜用户
本文定义高潜用户具有如下特征:必须有购买行为
对一个商品购买和其他交互行为(浏览、点击和收藏等)时间差大于1天
3.2 读取数据
本文使用Jupyter Notebook来对数据进行处理和分析,首先导入后续分析需要的第三方库及一些常用设置:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置风格
sns.set(style='white', font_scale=1.2)
%matplotlib inline
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams['axes.titlesize'] = 20
plt.rcParams['axes.unicode_minus']=False
import warnings
warnings.filterwarnings("ignore")
该数据集包含5000多万条行为数据,直接用pandas的readcsv(filename)读取会导致程序崩溃,这里采用get_chunk的方法来分块读取文件。
# 每个csv中大概有100多万条数据,我们采取数据分块读取
def read_actionData(filepath,size=10000):
'''filepath:文件路径size:数据行数'''
# 使用迭代器的方式读取数据
df = pd.read_csv(filepath, header=0,iterator=True)
# 保存数据块的列表,保存单个csv的数据
chunks = []
loop = True
while loop:
try:
chunk = df.get_chunk(size)[["user_id","sku_id","type","time","cate"]]
chunks.append(chunk)
except StopIteration:
loop = False
print("Iteration is stopped")
df_ac = pd.concat(chunks,ignore_index=True)
return df_ac
# 将多个数据表合并在一起
import os
fileDir = r"D:\数据源"
df_ac = []
df_ac.append(read_actionData(filepath=os.path.join(fileDir,"Data_Action_201602.csv")))
df_ac.append(read_actionData(filepath=os.path.join(fileDir,"Data_Action_201603.csv")))
df_ac.append(read_actionData(filepath=os.path.join(fileDir,"Data_Action_201604.csv")))
df_ac=pd.concat(df_ac,ignore_index=True)
读取完毕后,可以看到该数据集中包含50601736条行为数据,五个字段:
3.3 获得高潜用户
本文中以品类4(cate=4)为例来进行分析,得到品类4的高潜用户。
3.3.1 获得购买品类4的用户最后一次购买时间
1)type这个字段中4表示购买行为,首先得到有过购买行为的所有数据,购买行为的数据有48252条
df_ac_type = df_ac[df_ac["type"]==4]
df_ac_type.shape
# 返回结果(48252,5)
2)进一步筛选购买了品类4的数据,有9326条
df_ac_cate = df_ac_type[df_ac_type["cate"]==4]
df_ac_cate.shape
# 返回结果(9326,5)
3)获得购买品类4的用户最后一次的购买时间,有7466位不同的用户
def last_time(user):
return user["time"].max()
df_usr_buy_time = df_ac_cate.groupby(by="user_id").apply(last_time)
df_usr_buy_time
3.3.2 获得购买品类4的用户第一次交互时间
1)获取品类4的所有数据,有11088350条
df_ac_allcate = df_ac[df_ac["cate"] == 4]
df_ac_allcate.shape
# 返回结果(11088350,5)
2)获得购买品类4的用户行为数据,有3959454条
df_all_buy_ac = pd.merge(df_usr_buy_time.to_frame(),df_ac_allcate,on="user_id")
df_all_buy_ac.shape
# 返回结果(3959454,6)
3)获得购买品类4的用户第一次交互时间
def first_time(user):
return user["time"].min()
df_usr_ac_firsttime = df_all_buy_ac.groupby("user_id").apply(first_time)
df_usr_ac_firsttime
3.3.3 得到购买品类4的高潜用户
计算购买品类4的用户最后一次购买时间与第一次交互时间的天数,天数大于1的用户即为高潜用户,得到高潜用户数据5949条。
df = pd.merge(df_usr_buy_time.to_frame(),df_usr_ac_firsttime.to_frame(),on="user_id")
df.columns = ["buy_time","ac_time"]
df["days"] = (df["buy_time"].astype("datetime64")-df["ac_time"].astype("datetime64")).dt.days
high_dive = df[df["days"]>1]
high_dive
3.4 高潜用户分析
3.4.1 获得高潜客户的客户信息
将上面得到的高潜客户行为数据与高潜客户的信息数据表进行连接。
user_table = pd.read_csv(os.path.join(fileDir,"user_table.csv"))
user_table_high = pd.merge(user_table,high_dive,on="user_id")
user_table_high
3.4.2 高潜客户等级分布
user_lv_count = user_table_high.groupby("user_lv_cd")[["user_id"]].count()
user_lv_count.columns = ["count"]
user_lv_count
pie_labels = user_lv_count.index.to_list()
f, ax = plt.subplots(figsize=(6,6))
plt.pie(user_lv_count,labels=pie_labels,autopct="%.1f%%",startangle=90,textprops={'fontsize': 12})
plt.title('高潜客户等级占比')
品类4的高潜客户中级别为5的客户接近60%,级别为4的客户占30%左右。
3.4.3 高潜客户的年龄段分布
user_age_count = user_table_high.groupby("age")[["user_id"]].count()
user_age_count.columns = ["count"]
user_age_count.reset_index(inplace=True)
user_age_count
# 绘制柱形图
fig = plt.figure(figsize=(10,6))
sns.barplot(x="age",y="count",data=user_age_count,orient='v',color="dodgerblue")
plt.title('高潜客户年龄分布')
该数据中年龄数据为脱敏数据,此处仅作为分析思路。
3.4.4 购买数量分布
首先查看购买数量的最小值和最大值,这里直接用describe方法查看:
user_table_high[["buy_num"]].describe()
设置不同的购买次数区间,计算不同购买次数的用户数和占比,得到90%的用户购买次数在4次以下。
buy_num_groups = pd.cut(user_table_high["buy_num"],bins=[0,1,2,3,4,5,10,20,30,40,50])
buy_num_groups_count = user_table_high.groupby(buy_num_groups)[["user_id"]].count()
buy_num_groups_count["rate"] =["%.3f%%" %(100*value) for value in buy_num_groups_count["user_id"]/buy_num_groups_count["user_id"].sum()]
buy_num_groups_count
3.4.5 高潜用户周一到周日购买该商品数量对比
1)获得高潜客户购买该商品的记录
df_buy_high = df_ac_cate[df_ac_cate["user_id"].isin(high_dive.index.tolist())]
2)计算购买时间在一周中的哪一天
df_buy_high["time"] = df_buy_high["time"].astype("datetime64")
df_buy_high["weekday"] = df_buy_high["time"].apply(lambda x:x.weekday()+1)
df_buy_high
3)计算每个用户周一到周日的购买数量
df_buy_high_count = df_buy_high.groupby("weekday")[["user_id"]].count()
df_buy_high_count.columns = ["count"]
df_buy_high_count.reset_index(inplace=True)
df_buy_high_count
# 绘制柱形图
fig = plt.figure(figsize=(10,6))
sns.barplot(x="weekday",y="count",data=df_buy_high_count,orient='v',color="dodgerblue")
plt.title('高潜客户周一到周日的购买数量')
3.4.6 高潜用户各环节转化
本数据中用户行为包含浏览、加购、删购、收藏和购买等,将加购、删购和收藏进行合并,得到加购或收藏的次数,绘制从浏览-加购或收藏-购买的漏斗转化情况。
action_data = user_table_high[["browse_num","addcart_num","delcart_num","favor_num","buy_num"]].sum()
action_data
funnel_data = pd.DataFrame()
funnel_data["action"] = ["browse","addcart or favor","buy"]
funnel_data["count"] = [action_data["browse_num"], action_data["addcart_num"]-action_data["delcart_num"]+action_data["favor_num"],action_data["buy_num"]]
# funnel_data["rate"] = funnel_data["count"]/funnel_data["count"][0]
funnel_data["rate"] = ["%1.4f" %value for value in funnel_data["count"]/funnel_data["count"][0]]
funnel_data
from pyecharts import options as opts
from pyecharts.charts import Funnel
x_data = funnel_data["action"].tolist()
print(x_data)
y_data = funnel_data["rate"].tolist()
print(y_data)
data = [[x_data[i], float(y_data[i])*100] for i in range(len(x_data))]
print(data)
f = Funnel(init_opts=opts.InitOpts(width="800px", height="600px"))
f.add(series_name="高潜用户行为数",
data_pair=data,
label_opts=opts.LabelOpts(is_show=True,formatter="{b}:{c}%", position="outside")
)
f.set_global_opts(title_opts=opts.TitleOpts(title="高潜用户漏斗图",pos_left="center"),
legend_opts=opts.LegendOpts(pos_left="left",pos_top="middle",orient="vertical"))
f.render_notebook()