相關(guān)精彩專題鏈接: 數(shù)據(jù)成就更好的你
本案例數(shù)據(jù)下載: https://pan.baidu.com/s/1HZ8mygqr-cJSVUyIQuX1bA 提取碼: kkvv
整體概述
本案例的數(shù)據(jù)為小程序運(yùn)營數(shù)據(jù),以行業(yè)常見指標(biāo)對用戶行為進(jìn)行分析严嗜,包括UV压彭、PV忆畅、新增用戶分析如失、漏斗流失分析、留存分析、用戶價(jià)值分析、復(fù)購分析等內(nèi)容。其分析框架如下圖:
一笋庄、數(shù)據(jù)提取
import pandas as pd
import numpy as np
from sqlalchemy import create_engine
import datetime
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#數(shù)據(jù)存儲在mysql數(shù)據(jù)庫中
conn=create_engine("mysql+pymysql://用戶名:密碼@127.0.0.1:3306/數(shù)據(jù)庫名稱?charset=utf8")
data=pd.read_sql("behavior",conn)
本數(shù)據(jù)集約76萬條數(shù)據(jù)
二籍嘹、數(shù)據(jù)處理
#1.觀察數(shù)據(jù),查看數(shù)據(jù)內(nèi)容包含什么
data.head()
#2.數(shù)據(jù)去重處理
data.drop_duplicates(inplace=True)
#3.時(shí)間戳time數(shù)據(jù)處理辱士。轉(zhuǎn)化為訪問網(wǎng)站的具體時(shí)間泪掀、月份、日期颂碘、每天幾點(diǎn)訪問
data["time1"]=data["time"].apply(lambda x:datetime.datetime.fromtimestamp(x))
data["month"]=data["time"].apply(lambda x:int(datetime.datetime.fromtimestamp(x).strftime("%Y%m")))
data["date"]=data["time"].apply(lambda x:datetime.datetime.fromtimestamp(x).strftime("%Y%m%d"))
data["hour"]=data["time1"].apply(lambda x:x.hour)
#4.銷售金額計(jì)算
data["money"]=data["price"]*data["amount"]
#5.缺失值處理:觀察有沒有缺失值异赫,有缺失值則對缺失值處理。本數(shù)據(jù)集沒有缺失值
data.isnull().sum()
#6.觀察數(shù)據(jù)有沒有異常值头岔∷總共757565條記錄,和時(shí)間相關(guān)的數(shù)據(jù)都正常峡竣,其他字段也無異常值
data.describe()
三靠抑、用戶行為分析:pv/uv
1、pv/uv 按天分析适掰,觀察其訪問走勢
all_puv=pd.pivot_table(data,index=["date"],values="user_id",aggfunc="count")
uv=data[["user_id","date"]].drop_duplicates()["date"].value_counts()
all_puv=all_puv.join(uv)
all_puv.columns=["pv","uv"]
all_puv["avg_pv"]=all_puv["pv"]/all_puv["uv"]
all_puv
2颂碧、pv/uv 按天分析,觀察每個(gè)行為操作的點(diǎn)擊量
pv=pd.pivot_table(data,index=["date"],columns=["behavior"],values="user_id",aggfunc="count")
pv["all"]=pv.sum(axis=1)
plt.figure(figsize=(12,5))
plt.plot(pv.index,pv["all"])
plt.plot(pv.index,pv["pv"],color="r")
plt.plot(pv.index,pv["cart"],color="b")
plt.plot(pv.index,pv["buy"],color="c")
plt.plot(pv.index,pv["fav"],color="y")
plt.xlabel("日期",fontsize=12)
plt.ylabel("pv",fontsize=12)
plt.title("用戶行為pv分析",fontsize=16)
plt.legend( ["all","pv","cart","buy","fav"],loc = 'upper left',fontsize=12)
plt.show()
3.觀察用戶每天的訪問高峰區(qū)。本數(shù)據(jù)集中类浪,訪問高峰期為晚上19點(diǎn)至23點(diǎn)
hour_pv=data["hour"].value_counts().reset_index().rename(columns={'index':'hour', 'hour':'pv'})
plt.figure(figsize=(12,3))
plt.bar(hour_pv["hour"],hour_pv["pv"])
plt.xlabel("小時(shí)",fontsize=12)
plt.ylabel("訪問量pv",fontsize=12)
plt.title("用戶按小時(shí)統(tǒng)計(jì)的訪問量",fontsize=16)
plt.show()
四载城、獲客分析
獲客分析:觀察每日新增用戶情況。新用戶的定義:第一次訪問網(wǎng)站
new_visitor=data[["user_id","date"]].groupby("user_id").min()["date"].value_counts().reset_index()
new_visitor.columns=["date","new_visitor"]
plt.figure(figsize=(8,3))
x,y=new_visitor["date"],new_visitor["new_visitor"]
plt.bar(x, y, width=0.6)
for a, b in zip(x, y):
plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=10)
plt.xlabel("日期",fontsize=12)
plt.ylabel("新用戶數(shù)",fontsize=12)
plt.title("每日新增用戶數(shù)",fontsize=16)
plt.show()
五戚宦、用戶留存分析
留存定義為 1月1日个曙,新增用戶200人;
次日留存:第2天,1月2日受楼,這200人里面有100人活躍垦搬,則次日留存率為:100 / 200 = 50%
2日留存:第3天,1月3日艳汽,這200名新增用戶里面有80人活躍猴贰, 第3日新增留存率為:80/200 = 40%; 以此類推
#建立n日留存率計(jì)算函數(shù),data傳入的為用戶id和登錄日期, start_date為起始時(shí)間(格式為:%Y%m%d)河狐,n為n日留存,不傳入start_date和n時(shí)米绕,則計(jì)算所有留存
def cal_retention(data,start_date="20100101",n=0):
if n>0:
new_user=data[["user_id","date"]].groupby("user_id").min().reset_index()
date2=datetime.datetime.strptime(start_date,"%Y%m%d")+datetime.timedelta(n)
end_date=datetime.datetime.strftime(date2,"%Y%m%d")
start_user=set(new_user[new_user.date==start_date].user_id)
end_user=set(data[data.date==end_date].user_id)
user=start_user&end_user
return [start_date,end_date,len(start_user),len(user),round(len(user)/len(start_user),4)]
else:
new_user=data[["user_id","date"]].groupby("user_id").min().reset_index()
date_sourse=new_user.date.unique()
date_sourse.sort()
result1=[]
flag=0
for start_date in date_sourse:
start_user=set(new_user[new_user.date==start_date].user_id)
for end_date in date_sourse[flag:]:
end_user=set(data[data.date==end_date].user_id)
user=start_user&end_user
result1.append([start_date,end_date,len(start_user),len(user),round(len(user)/len(start_user),4)])
flag=flag+1
return pd.DataFrame(result1,columns=["開始日期","留存日期","新用戶數(shù)","留存人數(shù)","留存率"])
#調(diào)用cal_retention函數(shù)計(jì)算留存瑟捣。
#例:計(jì)算11約28日的3日留存,其返回結(jié)果為:['20191128', '20191201', 7610, 5980, 0.7858]栅干,此數(shù)據(jù)的含義為:28號的新用戶數(shù)為7610迈套,第3日的留存用戶為5980,留存率為78.58%
cal_retention(data[["user_id","date"]],"20191128",3)
#調(diào)用cal_retention函數(shù)計(jì)算留存,只傳入數(shù)據(jù)集
retention=cal_retention(data[["user_id","date"]])
#留存人數(shù)展示
pd.pivot_table(retention,index=["開始日期"],columns=["留存日期"],values="留存人數(shù)",aggfunc="sum",fill_value=0)
#留存率展示
pd.pivot_table(retention,index=["開始日期"],columns=["留存日期"],values="留存率",aggfunc="sum",fill_value=0)
六碱鳞、復(fù)購分析
指在單位時(shí)間段內(nèi)桑李,重復(fù)購買率=再次購買人數(shù)/總購買人數(shù)。
例如在一個(gè)月內(nèi)窿给,有100個(gè)客戶成交贵白,其中有20個(gè)是回頭客,則重復(fù)購買率為20%崩泡。
此處的回頭客定義為:按天去重禁荒,即一個(gè)客戶一天產(chǎn)生多筆交易付款,則算一次購買角撞,除非在統(tǒng)計(jì)周期內(nèi)另外一天也有購買的客戶才算是回頭客呛伴。
data_buy=data[data.behavior=="buy"][["user_id","date"]].drop_duplicates()["user_id"].value_counts().reset_index()
data_buy.columns=["user_id","num"] #user_id表示用戶id,num表示購買次數(shù)
#復(fù)購率計(jì)算
rebuy_rate=round(len(data_buy[data_buy.num>=2])/len(data_buy),4)
print("復(fù)購率為:",round(rebuy_rate*100,2),"%") #輸出結(jié)果為:42.06 %
#購買的總?cè)藬?shù)
buy_user=len(data_buy)
#購買次數(shù)的人數(shù)分布
buy_freq=data_buy.num.value_counts().reset_index()
buy_freq.columns=[["購買次數(shù)","人數(shù)"]]
buy_freq["人數(shù)占比"]=round(buy_freq["人數(shù)"]/buy_user,4)
從以下數(shù)據(jù)可以看出,一共有6110個(gè)用戶有購買行為靴寂,購買1次的人數(shù)最多磷蜀,為3540,占了57.94%百炬。本數(shù)據(jù)集的復(fù)購率為42.06 %,商家需從商品質(zhì)量污它、價(jià)格剖踊、促銷活動(dòng)、物流等多方面尋找問題點(diǎn)衫贬,需求高復(fù)購率的突破
七德澈、RFM模型分析
RFM模型分析前提條件:
a. 最近有過交易行為的客戶,再次發(fā)生交易的可能性高高于最近沒有交易行為的客戶固惯;
b.交易頻率較高的客戶比交易頻率較低的客戶梆造,更有可能再次發(fā)生交易行為;
c.過去所有交易金額較多的客戶葬毫,比交易金額較少的客戶镇辉,更有消費(fèi)積極性。
#取數(shù)規(guī)則:最近一次消費(fèi)的時(shí)間取最大贴捡,消費(fèi)頻次根據(jù)計(jì)數(shù)統(tǒng)計(jì)忽肛,消費(fèi)金額求平均值統(tǒng)計(jì)
RFM_date=data[data.behavior=="buy"][["user_id","date"]].groupby("user_id").max()
RFM_F=data[data.behavior=="buy"][["user_id","behavior"]].groupby("user_id").count()
RFM_M=data[data.behavior=="buy"][["user_id","money"]].groupby("user_id").mean()
RFM=RFM_date.join(RFM_F).join(RFM_M)
#用戶價(jià)值分層(RFM模型):模型計(jì)算的日期為 2019-12-05
end_date=datetime.datetime.strptime("20191205","%Y%m%d")
#時(shí)間間隔天數(shù)計(jì)算
RFM["days"]=RFM["date"].apply(lambda x:(end_date-datetime.datetime.strptime(x,"%Y%m%d")).days)
RFM=RFM[["days","behavior","money"]]
RFM.columns=["間隔天數(shù)","消費(fèi)頻次","消費(fèi)金額"]
模型打分,這里采用5分制烂斋,規(guī)則如下:
根據(jù)打分規(guī)則對數(shù)據(jù)進(jìn)行處理
RFM["R_S"]=RFM["間隔天數(shù)"].apply(recency)
RFM["F_S"]=RFM["消費(fèi)頻次"].apply(frequency)
RFM["M_S"]=RFM["消費(fèi)金額"].apply(monetary)
RFM["RFM"]=RFM.apply(lambda x: int(x.R_S*100+x.F_S*10+x.M_S),axis=1)
RFM.head()
每一個(gè)RFM代碼都對應(yīng)著一小組客戶屹逛,開展市場營銷活動(dòng)的時(shí)候可以從中挑選出若干組進(jìn)行础废。例如 :RFM代碼為443的用戶,其消費(fèi)時(shí)間間隔比較短罕模,消費(fèi)頻次和購買力都很高评腺,可做為重點(diǎn)客戶重點(diǎn)維護(hù)。計(jì)算結(jié)果如下:
八淑掌、漏斗分析---轉(zhuǎn)化路徑
轉(zhuǎn)化路徑定義:pv點(diǎn)擊 ---cart放入購物車 ---buy購買
#導(dǎo)入繪制漏斗圖的工具包
from pyecharts.charts import Funnel
from pyecharts import options as opts
#轉(zhuǎn)化分析歇僧,轉(zhuǎn)化路徑為:pv點(diǎn)擊 ---cart放入購物車 ---buy購買
data_behavior=data[data.behavior!="fav"]["behavior"].value_counts().reset_index().rename(columns={"index":"環(huán)節(jié)","behavior":"人數(shù)"})
#單一環(huán)節(jié)的轉(zhuǎn)化率
temp1 = np.array(data_behavior['人數(shù)'][1:])
temp2 = np.array(data_behavior['人數(shù)'][0:-1])
single_convs = temp1 / temp2
single_convs = list(single_convs)
single_convs.insert(0,1)
data_behavior['單一環(huán)節(jié)轉(zhuǎn)化率'] = single_convs
#總體轉(zhuǎn)化率
flag=data_behavior['人數(shù)'][0]
data_behavior['總體轉(zhuǎn)化率'] = data_behavior['人數(shù)']/flag
#總體轉(zhuǎn)化漏斗
attrs=[a+": "+str(round(b,2))+"%" for a,b in zip(data_behavior['環(huán)節(jié)'],data_behavior['總體轉(zhuǎn)化率']* 100)]
attr_value=[round(a,2) for a in data_behavior['總體轉(zhuǎn)化率']* 100]
funnel = Funnel()
funnel.add("商品", [list(z) for z in zip(attrs, attr_value)],label_opts=opts.LabelOpts(position="inside"))
funnel.set_global_opts(title_opts=opts.TitleOpts(title="總體轉(zhuǎn)化漏斗分析"))
funnel.render_notebook()
九、商品銷售分析
1.商品top分析----銷售次數(shù)最多的商品锋拖,取前10
#商品top分析----銷售次數(shù)最多的商品诈悍,取前10
buy_top=data[data.behavior=="buy"]["goods_id"].value_counts().head(10)
from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar()
bar.add_xaxis(buy_top.index.tolist())
bar.add_yaxis("銷售排名前10",buy_top.values.tolist(),color="green")
bar.set_global_opts(title_opts=opts.TitleOpts(title="銷售排名前10"))
#bar.render()
bar.render_notebook()
2.商品top分析----瀏覽次數(shù)最多的商品,取前10
#商品top分析----瀏覽次數(shù)最多的商品兽埃,取前10
pv_top=data[data.behavior=="pv"]["goods_id"].value_counts().head(10)
from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar()
bar.add_xaxis(pv_top.index.tolist())
bar.add_yaxis("瀏覽排名前10",pv_top.values.tolist(),color="green")
bar.set_global_opts(title_opts=opts.TitleOpts(title="瀏覽排名前10"))
#bar.render()
bar.render_notebook()
3.商品top分析----收藏次數(shù)最多的商品侥钳,取前10
#商品top分析----收藏次數(shù)最多的商品,取前10
fav_top=data[data.behavior=="fav"]["goods_id"].value_counts().head(10)
from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar()
bar.add_xaxis(buy_top.index.tolist())
bar.add_yaxis("銷售排名前10",buy_top.values.tolist(),color="green")
bar.set_global_opts(title_opts=opts.TitleOpts(title="銷售排名前10"))
#bar.render()
bar.render_notebook()
4.城市購買力排名
#城市購買力排名
city_top=data[data.behavior=="buy"][["addr","money"]].groupby("addr").sum().sort_values("money",ascending=False)
from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar()
bar.add_xaxis(city_top.index.tolist())
bar.add_yaxis("城市購買力",[round(a,2) for a in city_top.money])
#bar.render()
bar.render_notebook()
5.不同性別的消費(fèi)貢獻(xiàn)情況
#不同性別的消費(fèi)貢獻(xiàn)情況 sex中:0代表女性柄错,1代表男性
sex_top=data[data.behavior=="buy"][["sex","money"]].groupby("sex").sum()
from pyecharts.charts import Pie
from pyecharts import options as opts
base_pie = Pie()
base_pie.add("", [list(z) for z in zip(['女','男'], [round(a,2) for a in city_top.money])])
base_pie.set_global_opts(title_opts=opts.TitleOpts(title="不同性別的購買力"))
base_pie.set_series_opts(label_opts=opts.LabelOpts(formatter="舷夺: {c} (cfunu72%)")) #自定義顯示格式(b:name, c:value, d:百分比)
base_pie.render_notebook()
6.商品類目銷售情況分析
cat_top=data[data.behavior=="buy"]["cat"].value_counts().head(10)
from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar()
bar.add_xaxis(cat_top.index.tolist())
bar.add_yaxis("商品類目銷售排行前10",cat_top.values.tolist())
bar.render_notebook()