分析使用者行為和可視化展現
利用使用者在這個商品子集上的行為資料,往往還需要利用更豐富的使用者行為資料。
文章目錄
- 分析使用者行為和可視化展現
- 一、資料源說明
- 二、檢視資料
-
- 1.引入庫
- 2.讀取資料,并檢視資料類型和資料結構
- 3.看表頭
- 4.統計缺失值
- 三、處理資料
-
- 1.删除重複值
- 2.将time轉換為datetime格式
- 3.提取出日期和時間
- 資料分析——可視化
-
- 1.統計每日PV和UV資料
- 2.分析每天的pv與uv的趨勢
- 3. 新增訪客分析
- 4.不同時期使用者行為分析
- 四、資料拆分為不同時段的分析
-
- 1.把dates列轉換為datetime類型
- 2.選取活動資料自己和日常資料子集
- 3.活動期間不同時段的使用者行為分析
- 4.日常期間不同時段的使用者行為分析
- 5.轉化漏鬥分析
一、資料源說明
資料來源:
天池:https://tianchi.aliyun.com/competition/entrance/231522/introduction
該機構通過大資料技術幫助商家實作店鋪、商品詳情、微淘、工作台的千人千面,提升會員營運、流量營運和精準營銷的效率;
20000使用者的完整行為資料以及百萬級的商品資訊。競賽資料包含兩個部分。
第一部分是使用者在商品全集上的移動端行為資料(D),表名為tianchi_fresh_comp_train_user_2w,包含如下字段:
第二個部分是商品子集(P),表名為tianchi_fresh_comp_train_item_2w,包含如下字段:
訓練資料包含了抽樣出來的一定量使用者在一個月時間(11.18~12.18)之内的移動端行為資料(D),評分資料是這些使用者在這個一個月之後的一天(12.19)對商品子集(P)的購買資料。使用訓練資料建立推薦模型,并輸出使用者在接下來一天對商品子集購買行為的預測結果。
二、檢視資料
1.引入庫
代碼如下:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
2.讀取資料,并檢視資料類型和資料結構
代碼如下(示例):
user = pd.read_csv(r'tianchi_fresh_comp_train_user.csv')
user.info()
1.源資料的資料類型為:DataFrame
2.表格的次元:15463110 行 * 6列,RangeIndex:0 to 15463109
3.表格的列名和列字段類型dtype
4.表格所占空間:707.8M+
Pandas中的info()函數與describe()函數
https://blog.csdn.net/qq_40305043/article/details/104862499
https://blog.csdn.net/Dreamer_rx/article/details/100804378
具體怎麼更改類型,可以看我寫的這篇文章:
df資料類型轉化和說明(astype,apply,object)
3.看表頭
使用者行為 behavior_type, “1” 表示浏覽,“2” 表示收藏,“3” 表示加入購物車,“4” 表示購買
4.統計缺失值
user_geohash地理資料不分析 ,這列的缺失值不做處理
三、處理資料
1.删除重複值
keep:first/last/False, 預設值 ‘first’;
first: 保留第一次出現的重複行,删除後面的重複行。
last: 删除重複項,除了最後一次出現。
False: 删除所有重複項。
inplace:布爾值,預設為False,是否直接在原資料上删除重複項或删除重複項後傳回副本。(inplace=True表示直接在原來的DataFrame上删除重複項,而預設值False表示生成一個副本。)
drop_duplicates去重詳解
2.将time轉換為datetime格式
3.提取出日期和時間
user['dates'] = user.time.dt.date
user['month'] = user.dates.values.astype('datetime64[M]')
user['hours'] = user.time.dt.hour
資料分析——可視化
1.統計每日PV和UV資料
pv_day=user[user.behavior_type=="1"].groupby("dates")["behavior_type"].count()
uv_day=user[user.behavior_type=="1"].drop_duplicates(["user_id","dates"]).groupby("dates")["user_id"].count()
print(pv_day)
print(uv_day)
2.分析每天的pv與uv的趨勢
# 加載庫
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.charts import Grid
import numpy as np
# 做出每天的pv與uv趨勢圖
attr=list(pv_day.index)
pv=(
Line(init_opts=opts.InitOpts(width="1000px",height="500px"))
.add_xaxis(xaxis_data=attr)
.add_yaxis(
"pv",
np.around(pv_day.values/10000,decimals=2),
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
series_name="uv",
yaxis_index=1,
y_axis=np.around(uv_day.values/10000,decimals=2),
label_opts=opts.LabelOpts(is_show=False),
)
.extend_axis(
yaxis=opts.AxisOpts(
name="uv",
type_="value",
min_=0,
max_=1.6,
interval=0.4,
axislabel_opts=opts.LabelOpts(formatter="{value} 萬人"),
)
)
.set_global_opts(
tooltip_opts=opts.TooltipOpts(
is_show=True,trigger="axis",axis_pointer_type="cross"
),
xaxis_opts=opts.AxisOpts(
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),
),
yaxis_opts=opts.AxisOpts(
name="pv",
type_="value",
min_=0,
max_=100,
interval=20,
axislabel_opts=opts.LabelOpts(formatter="{value} 萬次"),
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
title_opts=opts.TitleOpts(title="pv與uv趨勢圖"),
)
)
pv.render_notebook()
3. 新增訪客分析
from copy import deepcopy
import datetime
user_pv = user[user.behavior_type == '1']
s = set()
days = []
nums = []
add_pv = []
for date in user_pv['dates'].unique():
num1 = len(s)
s1 = deepcopy(s)
ids = user_pv[user_pv.dates == date]['user_id'].values.tolist()
for i in ids:
s.add(i)
add_users = s - s1
add_users_pvs = user[(user.user_id.isin(add_users)) & (user.behavior_type == '1')].groupby('dates', as_index=False)['behavior_type'].count()
add_users_pv = int(add_users_pvs[add_users_pvs.dates == date]['behavior_type'].values)
num2 = len(s)
add_pv.append(add_users_pv)
days.append(date)
nums.append(num2-num1)
df_new_uv = pd.DataFrame({'日期': days, '新增訪客數': nums, '新增訪客的浏覽量': add_pv})
df_new_uv =df_new_uv.sort_values(by="日期" )
df_new_uv.head()
attr = df_new_uv.日期
v = df_new_uv.新增訪客數
w = df_new_uv.新增訪客的浏覽量
li=(
Line(init_opts=opts.InitOpts(width="1000px",height="500px"))
.add_xaxis(xaxis_data=attr)
.add_yaxis(
"新增pv",
w,
label_opts=opts.LabelOpts(is_show=False)
)
.extend_axis(
yaxis=opts.AxisOpts(
name="新增uv",
type_="value",
min_=0,
max_=14000,
interval=2000,
axislabel_opts=opts.LabelOpts(formatter="{value}"),
)
)
.set_global_opts(
tooltip_opts=opts.TooltipOpts(
is_show=True, trigger="axis", axis_pointer_type="cross"
),
xaxis_opts=opts.AxisOpts(
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
),
yaxis_opts=opts.AxisOpts(
name="新增pv",
type_="value",
min_=0,
max_=600000,
interval=100000,
axislabel_opts=opts.LabelOpts(formatter="{value}"),
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
title_opts=opts.TitleOpts(title="日新增pv與uv的趨勢"),
)
)
il=(
Line()
.add_xaxis(xaxis_data=attr)
.add_yaxis("新增uv",v,yaxis_index='1',label_opts=opts.LabelOpts(is_show=False),)
)
c=li.overlap(il)
c.render_notebook()
4.不同時期使用者行為分析
shopping_cart= user[user.behavior_type == '3'].groupby('dates')['behavior_type'].count()
collect=user[user.behavior_type=='2'].groupby('dates')['behavior_type'].count()
buy=user[user.behavior_type=='4'].groupby('dates')['behavior_type'].count()
attr_a=list(shopping_cart.index)
v_1=shopping_cart.values.tolist()
v_2=collect.values.tolist()
v_3=buy.values.tolist()
b=(
Line()
.add_xaxis(xaxis_data=attr_a)
.add_yaxis(
"加購人數",
v_1,
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
"收藏人數",
v_2,
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
"購買人數",
v_3,
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(title_opts=opts.TitleOpts(title="不同時期使用者行為資料"))
)
b.render_notebook()
四、資料拆分為不同時段的分析
把資料拆分為活動資料和日常資料做不同時段的分析
由于資料裡面包含雙十二大促的資料,是以整理分析使用者的不同時段行為可能會導緻分析結果與實際差異較大,是以拆分開來做不同的對比分析
1.把dates列轉換為datetime類型
2.選取活動資料自己和日常資料子集
active=user[user["dates"].isin(["2014/12/11","2014/12/12","2014/12/13"])]
daily=user[~user["dates"].isin(["2014/12/11","2014/12/12","2014/12/13"])]
3.活動期間不同時段的使用者行為分析
from pyecharts.charts import Bar
# 活動資料
cart_h= active[active.behavior_type == '3'].groupby('hours')['behavior_type'].count()
collect_h=active[active.behavior_type=='2'].groupby('hours')['behavior_type'].count()
buy_h=active[active.behavior_type=='4'].groupby('hours')['behavior_type'].count()
uv_h=active[active.behavior_type== '1'].groupby('hours')['user_id'].count()
attr_h=list(cart_h.index)
h1=np.around(cart_h.values/3,decimals=0).tolist()
h2=np.around(collect_h.values/3,decimals=0).tolist()
h3=np.around(buy_h.values/3,decimals=0).tolist()
h4=np.around(uv_h.values/3,decimals=0).tolist()
h=(
Line(init_opts=opts.InitOpts(width="1000px",height="500px"))
.add_xaxis(xaxis_data=attr_h)
.add_yaxis(
"加購人數",
h1,
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
"收藏人數",
h2,
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
"購買人數",
h3,
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=15)),
title_opts=opts.TitleOpts(title="日均各時段活動使用者行為",pos_top="48%"),
legend_opts=opts.LegendOpts(pos_top="48%"),
)
)
bar=(
Bar()
.add_xaxis(xaxis_data=attr_h)
.add_yaxis(
"浏覽人數",
h4,
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="活動pv對比資料"),
)
)
ggrid = (
Grid()
.add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
.add(h, grid_opts=opts.GridOpts(pos_top="60%"))
)
ggrid.render_notebook()
這是三天活動的日均資料,可以發現活動期間是商家在起主導作用大促集中在零點,是以使用者的購買高峰也出現在0點,
點選浏覽的高峰集中在晚上的21點到22點之間,是以商家可以在20點前改好促銷頁面吸引顧客參加0點的活動
4.日常期間不同時段的使用者行為分析
# 日常資料
cart_d= daily[daily.behavior_type == '3'].groupby('hours')['behavior_type'].count()
collect_d=daily[daily.behavior_type=='2'].groupby('hours')['behavior_type'].count()
buy_d=daily[daily.behavior_type=='4'].groupby('hours')['behavior_type'].count()
uv_d=daily[daily.behavior_type== '1'].groupby('hours')['user_id'].count()
attr_d=list(cart_d.index)
d1=np.around(cart_d.values/28,decimals=0).tolist()
d2=np.around(collect_d.values/28,decimals=0).tolist()
d3=np.around(buy_d.values/28,decimals=0).tolist()
d4=np.around(uv_d.values/3,decimals=0).tolist()
d=(
Line(init_opts=opts.InitOpts(width="1000px",height="500px"))
.add_xaxis(xaxis_data=attr_d)
.add_yaxis(
"加購人數",
d1,
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
"收藏人數",
d2,
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
"購買人數",
d3,
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=15)),
title_opts=opts.TitleOpts(title="日均各時段活動使用者行為",pos_top="48%"),
legend_opts=opts.LegendOpts(pos_top="48%"),
)
)
y=(
Bar()
.add_xaxis(xaxis_data=attr_d)
.add_yaxis(
"浏覽人數",
d4,
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="日常pv對比資料"),
)
)
ggrid = (
Grid()
.add(y, grid_opts=opts.GridOpts(pos_bottom="60%"))
.add(d, grid_opts=opts.GridOpts(pos_top="60%"))
)
ggrid.render_notebook()
與大促不同的是日常期間購買人數從上午10點到晚上23點變化都不會太大高峰出現在晚上21點,pv、加購、收藏的高峰出現在晚上21點到22點之間,說明大家都喜歡在晚上這個時間段浏覽商品,日常時可以集中在這個時段進行促銷活動,浏覽高峰也是集中在晚上21點到22點之間。
日常時的購買率最高的出現在上午10點到下午15點間,還有晚上的21點,和活動期間的購買率不同,但是明顯晚上21點已經在分析中出現比較多的峰值,是以可以考慮這個時段做做吸引使用者購買的措施。
5.轉化漏鬥分析
活動期間的轉化漏鬥:
——活動期間日均從點選到加入購物車的轉化率隻有4.97%,購買的隻有2.11%,說明點選浏覽量不少但是吸引不了顧客購買,雖然是大的活動,但是轉化率還是很低的,
可以從提高加購率和收藏率着手,進而吸引顧客購買
日常期間的轉化漏鬥:
日常期間總的點選量中,有4.45%加入購物車,有3.3%收藏,而到最後隻有1.42%購買,整體來看,購買的轉化率最低,有很大的增長空間;
——就顔色來看,紅色部分的變化最大,即“點選-加入購物車“這一環節的轉化率最低,按照“點選-加入購物車-收藏-購買”這一使用者行為路徑,我們可通過優化“點選-加入購物車”這一環節進而提升購買的轉化率,可以通過鼓勵使用者收藏加購後可以領券來刺激使用者加購收藏進而刺激使用者的購買欲望。
其實還可以做使用者地理分布的分析,使用者對商品的偏好分析,有時間下次再做。