# 一
%matplotlib notebook
# 导入库函数
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib import animation
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('data_ncov_(1.19-2.26).xlsx')
city=['浙江省', '广东', '河南', '湖南', '安徽', '江西', '重庆市', '江苏', '四川省','上海市']
# 时间序列转换
df['date'] = df['date'].astype('str') # 先将字段转化为字符串
df['date'] = pd.to_datetime(df['date']) # 再进行时间序列转换
t_d=df['date'].iloc[0:39]
fig,ax=plt.subplots(figsize=(10,6))
colors = ["r", "b", "y", "c", "g", "m", "pink", "purple", "gray", "orange"]
def update(k):
t = str(t_d[k])
t_m =t[0:10]
data_new = df[df['date'] == t_d[k]]
citys_data_new = data_new[(data_new['省市']=='浙江省')|(data_new['省市']=='广东')|
(data_new['省市']=='河南')|(data_new['省市']=='湖南')|
(data_new['省市']=='安徽')|(data_new['省市']=='江西')|
(data_new['省市']=='重庆市')|(data_new['省市']=='江苏')|
(data_new['省市']=='四川省')|(data_new['省市']=='上海市')]
ax.cla()
x = ['安徽','广东','河南','湖南','江苏','江西','上海市','四川省','浙江省','重庆市']
y1 = citys_data_new['确诊']
ax.set_ylim(0,1500)
ax.bar(x,y1,width=0.5,color=colors,)
for x,y in zip(x,y1):
plt.text(x,y,'%d'% y,ha='center',va = 'bottom')
ax.set_title(f'10个城市1月19日-2月26日的疫情确诊人数数据:{t_m}')
return ax
def init():
t = str(t_d[0])
t_m =t[0:10]
data_0119 = df[df['date'] == '2020-01-19']
citys_data = data_0119[(data_0119['省市']=='浙江省')|(data_0119['省市']=='广东')|
(data_0119['省市']=='河南')|(data_0119['省市']=='湖南')|
(data_0119['省市']=='安徽')|(data_0119['省市']=='江西')|
(data_0119['省市']=='重庆市')|(data_0119['省市']=='江苏')|
(data_0119['省市']=='四川省')|(data_0119['省市']=='上海市')]
x = ['安徽','广东','河南','湖南','江苏','江西','上海市','四川省','浙江省','重庆市']
y1 = citys_data['确诊']
ax.set_ylim(0,1500)
ax.bar(x,y1,width=0.5,color=colors)
for x,y in zip(x,y1):
plt.text(x,y,'%d'% y,ha='center',va = 'bottom')
ax.set_title(f'10个城市1月19日-2月26日的疫情确诊人数数据:{t_m}')
return ax
ani = animation.FuncAnimation(fig=fig,func=update,frames=39,init_func=init,interval=500,repeat=True)
绘制全国地图
# 读取数据
import pandas as pd
import warnings
import matplotlib.pyplot as plt
import geopandas as gpd
warnings.filterwarnings('ignore')
# 设置不弹出警告
df = pd.read_excel('COVID-19_China_0410.xlsx')
plt.rcParams['font.sans-serif'] = ['Fangsong']
plt.rcParams['axes.unicode_minus'] = False
china_spatial = gpd.GeoDataFrame.from_file('chinadata.json')
# 查看数据基本情况
#china_spatial.info()
# 输出数据 省份 现存确诊
#china_spatial
import matplotlib.pyplot as plt
# 设置图表大小
plt.figure(figsize=(15,10))
# 设置图表标题
plt.title('全国地图')
# 绘制空间数据
china_spatial.plot(ax=plt.subplot(1,1,1))
# 设置网格线
plt.grid(True)
图片
2022-04-10 全国确诊病例疫情地图# 匹配数据 data_china0410 = pd.merge(china_spatial, df, left_on = 'name', right_on = '省份', how = 'left') # 缺失值替换为0 data_china0410_new = data_china0410.fillna(0, inplace=False) data_china0410_new
import mapclassify
# 设置图表大小及标题
plt.figure(figsize=(20,20))
plt.title('2022-04-10 全国确诊病例', fontsize = 20)
# 绘制疫情地图
data_china0410_new.plot(ax=plt.subplot(1,1,1), alpha=1,edgecolor='k', linewidth = 0.5,
legend=True, scheme = 'FisherJenks', column='现存确诊', cmap = 'Reds')
# 设置网格线
plt.grid(True,alpha=0.5)
# 添加省市信息
lst = data_china0410_new[['name','centerlng','centerlat','现存确诊']].to_dict(orient = 'record')
print(lst[:5]) # 查看输出结果
for i in lst:
plt.text(i['centerlng'], i['centerlat'], i['name'] +':' + str(i['现存确诊']))
图片
可视化大屏电商用户行为数据可视化分析
import pandas as pd
import numpy as np
import pyecharts.options as opts
from pyecharts.charts import Line, Grid, Bar, Pie, Funnel, Page, Tab
# 数据加载
data_df = pd.read_csv('projct_dataset.csv')
# 数据预览
data_df.head()
# 检查重复值
data_df.duplicated().sum()
# 删除重复值
data_df.drop_duplicates(inplace=True)
# 删除无用列
data_df.drop(columns=['user_geohash'], inplace=True)
# 检查缺失值
data_df.isnull().sum()
# 预览清洗后的数据集
data_df.head()
# 添加行为类型描述列
behavior_type_dict = {1: '点击',
2: '收藏',
3: '加入购物车',
4: '支付'}
data_df['behavior_desc'] = data_df['behavior_type'].map(behavior_type_dict)
data_df.head()
# 处理时间列
data_df[['date', 'hour']] = data_df['time'].str.split(' ', expand=True)
data_df.head()
# 更改数据类型
data_df['date'] = pd.to_datetime(data_df['date'])
data_df['hour'] = data_df['hour'].astype('int')
data_df['date'].min()
data_df['date'].max()
# 按时间排序
data_df = data_df.sort_values(by=['date','hour'])
data_df.head(20)
# 保存清洗处理的数据集
data_df.to_csv('cln_proj_dataset.csv', index=False, encoding='utf-8')
子图制作
(1)流量指标
- PV (Page View):访问量,即页面浏览量或点击量,用户每次刷新即被计算一次。
- UV (Unique Visitor):独立访客,一台终端为一个访客,是指通过互联网访问、浏览这个网页的自然人。
- 日PV
- 日UV
- 小时PV
- 小时UV
# 加载处理的数据集
data_df = pd.read_csv('cln_proj_dataset.csv')
data_df['date'] = pd.to_datetime(data_df['date'])
data_df.head()
# 日流量指标
# 日 PV
daily_pv = data_df[data_df['behavior_desc'] == '点击'].groupby('date').count()['user_id'].reset_index().rename(columns = {'user_id': 'pv'})
daily_pv.head()
# 日 UV
daily_uv = data_df[data_df['behavior_desc'] == '点击'].groupby('date').nunique()['user_id'].reset_index().rename(columns={'user_id': 'uv'})
daily_uv.head()
# 可视化日
daily_pv_line = (
Line(init_opts=opts.InitOpts(width='600px',height='300px'))
.add_xaxis(xaxis_data=daily_pv['date'].tolist())
.add_yaxis(
series_name='日PV',
y_axis = daily_pv['pv'].tolist(),
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False)
)
.extend_axis(
yaxis=opts.AxisOpts(
name="日UV",
type_= "value",
min_=0,
max_= 80000
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户日流量指标'),
tooltip_opts=opts.TooltipOpts(
trigger='axis',
axis_pointer_type='line'),
xaxis_opts=opts.AxisOpts(
type_= 'time',
name= '日期'
),
yaxis_opts = opts.AxisOpts(
type_='value',
name='日PV'
)
)
)
daily_uv_line = (
Line()
.add_xaxis(xaxis_data=daily_uv['date'].tolist())
.add_yaxis(
series_name="日UV",
y_axis=daily_uv['uv'].tolist(),
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False),
yaxis_index=1
)
)
daily_pv_line.overlap(daily_uv_line)
daily_pv_line.render_notebook() 用户流量指标可视化 # 小时流量指标
# 小时PV
hourly_pv = data_df[data_df['behavior_desc'] == '点击'].groupby('hour').count()['user_id'].reset_index().rename(columns={'user_id': 'pv'})
hourly_pv.head()
# 小时UV
hourly_uv = data_df[data_df['behavior_desc'] == '点击'].groupby('hour').nunique()['user_id'].reset_index().rename(columns={'user_id': 'uv'})
hourly_uv.head()
# 可视化小时
hourly_pv_line = (
Line(init_opts=opts.InitOpts(width='600px',height='300px'))
.add_xaxis(xaxis_data=hourly_pv['hour'].tolist())
.add_yaxis(
series_name='小时PV',
y_axis = daily_pv['pv'].tolist(),
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False)
)
.extend_axis(
yaxis=opts.AxisOpts(
name="小时UV",
type_= "value",
min_=0,
max_= 10000
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户小时流指标'),
tooltip_opts=opts.TooltipOpts(
trigger='axis',
axis_pointer_type='line'),
yaxis_opts = opts.AxisOpts(
type_='value',
name='小时PV'
)
)
)
hourly_uv_line = (
Line()
.add_xaxis(xaxis_data=hourly_uv['hour'].tolist())
.add_yaxis(
series_name="小时UV",
y_axis=hourly_uv['uv'].tolist(),
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False),
yaxis_index=1
)
)
hourly_pv_line.overlap(hourly_uv_line)
hourly_pv_line.render_notebook() 用户购买次数分布 # 用户购买次数分布
user_buy_time = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id').size()
buy_hist,bins = np.histogram(user_buy_time.values, bins=10, range=[0, 100])
buy_hist
bins
buy_time_category = [str(int(a)) + '-' + str(int(b)) for a, b in zip(bins[:-1], bins[1:])]
buy_time_category
buy_hist_bar = (
Bar(init_opts=opts.InitOpts(width='400px',height='300px'))
.add_xaxis(buy_time_category)
.add_yaxis(
series_name="",
y_axis=buy_hist.tolist(),
category_gap=0.2
)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户购买次数分布')
)
)
buy_hist_bar.render_notebook() 热门商品和类别分析 # 点击量排名前10的商品种类
top_item_categories = data_df.groupby('item_category')['user_id'].count().sort_values(ascending=False).head(10)
top_item_categories.name = 'Count'
top_item_cat_df = top_item_categories.to_frame().reset_index()
top_item_cat_df
top_cat_pie = (
Pie(init_opts=opts.InitOpts(width='500px'))
.add("",top_item_cat_df.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="Top10 商品类别"),
legend_opts=opts.LegendOpts(is_show=False)
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{d}%"))
)
top_cat_pie.render_notebook() # 点击量排名前10的商品
top_items = data_df.groupby('item_id')['user_id'].count().sort_values(ascending=False).head(10)
top_items.name = 'Count'
top_item_df = top_items.to_frame().reset_index()
top_item_df
top_item_pie = (
Pie(init_opts=opts.InitOpts(width='500px'))
.add("",top_item_df.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="Top10 商品"),
legend_opts=opts.LegendOpts(is_show=False)
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{d}%"))
)
top_item_pie.render_notebook() 用户行为漏斗分析 behavior_count = data_df.groupby('behavior_desc').size()
behavior_count
pv = behavior_count['点击']
favor = behavior_count['收藏']
cart = behavior_count['加入购物车']
buy = behavior_count['支付']
# 点击转化率计算
print('点击 —— 收藏转化率:{:.2%}'.format(favor / pv))
print('点击 —— 购物车转化率:{:.2%}'.format(cart / pv))
print('点击 —— 支付转化率:{:.2%}'.format(buy / pv))
# 收藏+购物车转化率
print('收藏 —— 支付转化率:{:.2%}'.format(buy / (favor + cart)))
# 漏斗图
behavior_category = ['点击','收藏/加入购物车','支付']
rates = [1*100,(favor + cart)/ pv * 100, buy / pv * 100]
format_rates = [round(r,2) for r in rates]
funnel = (
Funnel(init_opts=opts.InitOpts(width='400px'))
.add(
series_name='用户行为',
data_pair=[i for i in zip(behavior_category, format_rates)],
tooltip_opts=opts.TooltipOpts(
trigger='item',
formatter='{b}:{c}%',
is_show=True
),
label_opts=opts.LabelOpts(
is_show=True,
position='outside'
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户行为漏斗分析'),
legend_opts=opts.LegendOpts(is_show=False)
)
)
funnel.render_notebook() 用户价值分类
-
用户RFM模型分析:
- R (Recency) 最近一次消费时间:表示用户最近一次消费距离现在的时间。消费时间越近的客户价值越大。1年前消费过的用户肯定没有1周前消费过的用户价值大。
- F (Frequency) 消费频率:指用户在统计周期内购买商品的次数,经常购买的用户也就是熟客,价值肯定比偶尔来一次的客户价值大。
- M (Monetary) 消费金额:指用户在统计周期内消费的总金额,体现了消费者为企业创利的多少,自然是消费越多的用户价值越大。
# 构造R值
last_time = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id').max()['date']
recency = (data_df['date'].max() - last_time).dt.days.copy()
median_recency = recency.median()
recency[recency <= median_recency] = 1
recency[recency > median_recency] = 0
recency.name = 'R'
recency.head(20) # 构建F值
frequency = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id')['item_id'].size()
median_freq = frequency.median()
frequency[frequency <= median_freq] = 0
frequency[frequency > median_freq] = 1
frequency.name = 'F'
frequency.head(20) rfm = pd.merge(recency, frequency, on='user_id', how='inner')
rfm = rfm[['R','F']].astype('str')
rfm['RF'] = rfm['R'] + rfm['F']
rfm.head() user_tag_dict = {
'11': '重要价值客户',
'10': '重要发展客户',
'01': '重要保持客户',
'00': '重要挽留客户'
}
rfm['user_tag'] = rfm['RF'].map(user_tag_dict)
rfm.head() # 统计分层客户数量
user_tag_count = rfm.groupby('user_tag').size()
user_tag_count user_tag_count.index
# 可视化统计分层客户数量
user_tag_pie = (
Pie(init_opts=opts.InitOpts(width='400px'))
.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False)
)
.add(
series_name='购买次数占比',
data_pair=[list(z) for z in zip(user_tag_count.index.tolist(), user_tag_count.values.tolist())],
radius=['30%', '70%'],
label_opts=opts.LabelOpts(
is_show=True,
position='outside'),
)
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger='item',
formatter='{b}: {d}%')
)
)
user_tag_pie.render_notebook() # 可视化大屏制作
page_behaviour = (
Page(layout= Page.DraggablePageLayout)
.add(daily_pv_line)
.add(hourly_pv_line)
.add(buy_hist_bar)
.add(top_cat_pie)
.add(top_item_pie)
.add(funnel)
.add(user_tag_pie)
)
page_behaviour.render('page_behaviour.html')
效果图
(1)流量指标
- PV (Page View):访问量,即页面浏览量或点击量,用户每次刷新即被计算一次。
- UV (Unique Visitor):独立访客,一台终端为一个访客,是指通过互联网访问、浏览这个网页的自然人。
- 日PV
- 日UV
- 小时PV
- 小时UV
# 加载处理的数据集
data_df = pd.read_csv('cln_proj_dataset.csv')
data_df['date'] = pd.to_datetime(data_df['date'])
data_df.head()
# 日流量指标
# 日 PV
daily_pv = data_df[data_df['behavior_desc'] == '点击'].groupby('date').count()['user_id'].reset_index().rename(columns = {'user_id': 'pv'})
daily_pv.head()
# 日 UV
daily_uv = data_df[data_df['behavior_desc'] == '点击'].groupby('date').nunique()['user_id'].reset_index().rename(columns={'user_id': 'uv'})
daily_uv.head()
# 可视化日
daily_pv_line = (
Line(init_opts=opts.InitOpts(width='600px',height='300px'))
.add_xaxis(xaxis_data=daily_pv['date'].tolist())
.add_yaxis(
series_name='日PV',
y_axis = daily_pv['pv'].tolist(),
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False)
)
.extend_axis(
yaxis=opts.AxisOpts(
name="日UV",
type_= "value",
min_=0,
max_= 80000
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户日流量指标'),
tooltip_opts=opts.TooltipOpts(
trigger='axis',
axis_pointer_type='line'),
xaxis_opts=opts.AxisOpts(
type_= 'time',
name= '日期'
),
yaxis_opts = opts.AxisOpts(
type_='value',
name='日PV'
)
)
)
daily_uv_line = (
Line()
.add_xaxis(xaxis_data=daily_uv['date'].tolist())
.add_yaxis(
series_name="日UV",
y_axis=daily_uv['uv'].tolist(),
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False),
yaxis_index=1
)
)
daily_pv_line.overlap(daily_uv_line)
daily_pv_line.render_notebook() 用户流量指标可视化 # 小时流量指标
# 小时PV
hourly_pv = data_df[data_df['behavior_desc'] == '点击'].groupby('hour').count()['user_id'].reset_index().rename(columns={'user_id': 'pv'})
hourly_pv.head()
# 小时UV
hourly_uv = data_df[data_df['behavior_desc'] == '点击'].groupby('hour').nunique()['user_id'].reset_index().rename(columns={'user_id': 'uv'})
hourly_uv.head()
# 可视化小时
hourly_pv_line = (
Line(init_opts=opts.InitOpts(width='600px',height='300px'))
.add_xaxis(xaxis_data=hourly_pv['hour'].tolist())
.add_yaxis(
series_name='小时PV',
y_axis = daily_pv['pv'].tolist(),
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False)
)
.extend_axis(
yaxis=opts.AxisOpts(
name="小时UV",
type_= "value",
min_=0,
max_= 10000
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户小时流指标'),
tooltip_opts=opts.TooltipOpts(
trigger='axis',
axis_pointer_type='line'),
yaxis_opts = opts.AxisOpts(
type_='value',
name='小时PV'
)
)
)
hourly_uv_line = (
Line()
.add_xaxis(xaxis_data=hourly_uv['hour'].tolist())
.add_yaxis(
series_name="小时UV",
y_axis=hourly_uv['uv'].tolist(),
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False),
yaxis_index=1
)
)
hourly_pv_line.overlap(hourly_uv_line)
hourly_pv_line.render_notebook() 用户购买次数分布 # 用户购买次数分布
user_buy_time = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id').size()
buy_hist,bins = np.histogram(user_buy_time.values, bins=10, range=[0, 100])
buy_hist
bins
buy_time_category = [str(int(a)) + '-' + str(int(b)) for a, b in zip(bins[:-1], bins[1:])]
buy_time_category
buy_hist_bar = (
Bar(init_opts=opts.InitOpts(width='400px',height='300px'))
.add_xaxis(buy_time_category)
.add_yaxis(
series_name="",
y_axis=buy_hist.tolist(),
category_gap=0.2
)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户购买次数分布')
)
)
buy_hist_bar.render_notebook() 热门商品和类别分析 # 点击量排名前10的商品种类
top_item_categories = data_df.groupby('item_category')['user_id'].count().sort_values(ascending=False).head(10)
top_item_categories.name = 'Count'
top_item_cat_df = top_item_categories.to_frame().reset_index()
top_item_cat_df
top_cat_pie = (
Pie(init_opts=opts.InitOpts(width='500px'))
.add("",top_item_cat_df.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="Top10 商品类别"),
legend_opts=opts.LegendOpts(is_show=False)
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{d}%"))
)
top_cat_pie.render_notebook() # 点击量排名前10的商品
top_items = data_df.groupby('item_id')['user_id'].count().sort_values(ascending=False).head(10)
top_items.name = 'Count'
top_item_df = top_items.to_frame().reset_index()
top_item_df
top_item_pie = (
Pie(init_opts=opts.InitOpts(width='500px'))
.add("",top_item_df.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="Top10 商品"),
legend_opts=opts.LegendOpts(is_show=False)
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{d}%"))
)
top_item_pie.render_notebook() 用户行为漏斗分析 behavior_count = data_df.groupby('behavior_desc').size()
behavior_count
pv = behavior_count['点击']
favor = behavior_count['收藏']
cart = behavior_count['加入购物车']
buy = behavior_count['支付']
# 点击转化率计算
print('点击 —— 收藏转化率:{:.2%}'.format(favor / pv))
print('点击 —— 购物车转化率:{:.2%}'.format(cart / pv))
print('点击 —— 支付转化率:{:.2%}'.format(buy / pv))
# 收藏+购物车转化率
print('收藏 —— 支付转化率:{:.2%}'.format(buy / (favor + cart)))
# 漏斗图
behavior_category = ['点击','收藏/加入购物车','支付']
rates = [1*100,(favor + cart)/ pv * 100, buy / pv * 100]
format_rates = [round(r,2) for r in rates]
funnel = (
Funnel(init_opts=opts.InitOpts(width='400px'))
.add(
series_name='用户行为',
data_pair=[i for i in zip(behavior_category, format_rates)],
tooltip_opts=opts.TooltipOpts(
trigger='item',
formatter='{b}:{c}%',
is_show=True
),
label_opts=opts.LabelOpts(
is_show=True,
position='outside'
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户行为漏斗分析'),
legend_opts=opts.LegendOpts(is_show=False)
)
)
funnel.render_notebook() 用户价值分类
-
用户RFM模型分析:
- R (Recency) 最近一次消费时间:表示用户最近一次消费距离现在的时间。消费时间越近的客户价值越大。1年前消费过的用户肯定没有1周前消费过的用户价值大。
- F (Frequency) 消费频率:指用户在统计周期内购买商品的次数,经常购买的用户也就是熟客,价值肯定比偶尔来一次的客户价值大。
- M (Monetary) 消费金额:指用户在统计周期内消费的总金额,体现了消费者为企业创利的多少,自然是消费越多的用户价值越大。
# 构造R值
last_time = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id').max()['date']
recency = (data_df['date'].max() - last_time).dt.days.copy()
median_recency = recency.median()
recency[recency <= median_recency] = 1
recency[recency > median_recency] = 0
recency.name = 'R'
recency.head(20) # 构建F值
frequency = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id')['item_id'].size()
median_freq = frequency.median()
frequency[frequency <= median_freq] = 0
frequency[frequency > median_freq] = 1
frequency.name = 'F'
frequency.head(20) rfm = pd.merge(recency, frequency, on='user_id', how='inner')
rfm = rfm[['R','F']].astype('str')
rfm['RF'] = rfm['R'] + rfm['F']
rfm.head() user_tag_dict = {
'11': '重要价值客户',
'10': '重要发展客户',
'01': '重要保持客户',
'00': '重要挽留客户'
}
rfm['user_tag'] = rfm['RF'].map(user_tag_dict)
rfm.head() # 统计分层客户数量
user_tag_count = rfm.groupby('user_tag').size()
user_tag_count user_tag_count.index
# 可视化统计分层客户数量
user_tag_pie = (
Pie(init_opts=opts.InitOpts(width='400px'))
.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False)
)
.add(
series_name='购买次数占比',
data_pair=[list(z) for z in zip(user_tag_count.index.tolist(), user_tag_count.values.tolist())],
radius=['30%', '70%'],
label_opts=opts.LabelOpts(
is_show=True,
position='outside'),
)
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger='item',
formatter='{b}: {d}%')
)
)
user_tag_pie.render_notebook() # 可视化大屏制作
page_behaviour = (
Page(layout= Page.DraggablePageLayout)
.add(daily_pv_line)
.add(hourly_pv_line)
.add(buy_hist_bar)
.add(top_cat_pie)
.add(top_item_pie)
.add(funnel)
.add(user_tag_pie)
)
page_behaviour.render('page_behaviour.html')
效果图
- 日PV
- 日UV
- 小时PV
- 小时UV
# 加载处理的数据集 data_df = pd.read_csv('cln_proj_dataset.csv') data_df['date'] = pd.to_datetime(data_df['date']) data_df.head() # 日流量指标 # 日 PV daily_pv = data_df[data_df['behavior_desc'] == '点击'].groupby('date').count()['user_id'].reset_index().rename(columns = {'user_id': 'pv'}) daily_pv.head() # 日 UV daily_uv = data_df[data_df['behavior_desc'] == '点击'].groupby('date').nunique()['user_id'].reset_index().rename(columns={'user_id': 'uv'}) daily_uv.head() # 可视化日 daily_pv_line = ( Line(init_opts=opts.InitOpts(width='600px',height='300px')) .add_xaxis(xaxis_data=daily_pv['date'].tolist()) .add_yaxis( series_name='日PV', y_axis = daily_pv['pv'].tolist(), is_symbol_show=True, label_opts=opts.LabelOpts(is_show=False) ) .extend_axis( yaxis=opts.AxisOpts( name="日UV", type_= "value", min_=0, max_= 80000 ) ) .set_global_opts( title_opts=opts.TitleOpts(title='用户日流量指标'), tooltip_opts=opts.TooltipOpts( trigger='axis', axis_pointer_type='line'), xaxis_opts=opts.AxisOpts( type_= 'time', name= '日期' ), yaxis_opts = opts.AxisOpts( type_='value', name='日PV' ) ) ) daily_uv_line = ( Line() .add_xaxis(xaxis_data=daily_uv['date'].tolist()) .add_yaxis( series_name="日UV", y_axis=daily_uv['uv'].tolist(), is_symbol_show=True, label_opts=opts.LabelOpts(is_show=False), yaxis_index=1 ) ) daily_pv_line.overlap(daily_uv_line) daily_pv_line.render_notebook()用户流量指标可视化
# 小时流量指标 # 小时PV hourly_pv = data_df[data_df['behavior_desc'] == '点击'].groupby('hour').count()['user_id'].reset_index().rename(columns={'user_id': 'pv'}) hourly_pv.head() # 小时UV hourly_uv = data_df[data_df['behavior_desc'] == '点击'].groupby('hour').nunique()['user_id'].reset_index().rename(columns={'user_id': 'uv'}) hourly_uv.head() # 可视化小时 hourly_pv_line = ( Line(init_opts=opts.InitOpts(width='600px',height='300px')) .add_xaxis(xaxis_data=hourly_pv['hour'].tolist()) .add_yaxis( series_name='小时PV', y_axis = daily_pv['pv'].tolist(), is_symbol_show=True, label_opts=opts.LabelOpts(is_show=False) ) .extend_axis( yaxis=opts.AxisOpts( name="小时UV", type_= "value", min_=0, max_= 10000 ) ) .set_global_opts( title_opts=opts.TitleOpts(title='用户小时流指标'), tooltip_opts=opts.TooltipOpts( trigger='axis', axis_pointer_type='line'), yaxis_opts = opts.AxisOpts( type_='value', name='小时PV' ) ) ) hourly_uv_line = ( Line() .add_xaxis(xaxis_data=hourly_uv['hour'].tolist()) .add_yaxis( series_name="小时UV", y_axis=hourly_uv['uv'].tolist(), is_symbol_show=True, label_opts=opts.LabelOpts(is_show=False), yaxis_index=1 ) ) hourly_pv_line.overlap(hourly_uv_line) hourly_pv_line.render_notebook()用户购买次数分布
# 用户购买次数分布 user_buy_time = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id').size() buy_hist,bins = np.histogram(user_buy_time.values, bins=10, range=[0, 100]) buy_hist bins buy_time_category = [str(int(a)) + '-' + str(int(b)) for a, b in zip(bins[:-1], bins[1:])] buy_time_category buy_hist_bar = ( Bar(init_opts=opts.InitOpts(width='400px',height='300px')) .add_xaxis(buy_time_category) .add_yaxis( series_name="", y_axis=buy_hist.tolist(), category_gap=0.2 ) .set_global_opts( title_opts=opts.TitleOpts(title='用户购买次数分布') ) ) buy_hist_bar.render_notebook()热门商品和类别分析
# 点击量排名前10的商品种类 top_item_categories = data_df.groupby('item_category')['user_id'].count().sort_values(ascending=False).head(10) top_item_categories.name = 'Count' top_item_cat_df = top_item_categories.to_frame().reset_index() top_item_cat_df top_cat_pie = ( Pie(init_opts=opts.InitOpts(width='500px')) .add("",top_item_cat_df.values.tolist()) .set_global_opts( title_opts=opts.TitleOpts(title="Top10 商品类别"), legend_opts=opts.LegendOpts(is_show=False) ) .set_series_opts(label_opts=opts.LabelOpts(formatter="{d}%")) ) top_cat_pie.render_notebook()# 点击量排名前10的商品 top_items = data_df.groupby('item_id')['user_id'].count().sort_values(ascending=False).head(10) top_items.name = 'Count' top_item_df = top_items.to_frame().reset_index() top_item_df top_item_pie = ( Pie(init_opts=opts.InitOpts(width='500px')) .add("",top_item_df.values.tolist()) .set_global_opts( title_opts=opts.TitleOpts(title="Top10 商品"), legend_opts=opts.LegendOpts(is_show=False) ) .set_series_opts(label_opts=opts.LabelOpts(formatter="{d}%")) ) top_item_pie.render_notebook()用户行为漏斗分析
behavior_count = data_df.groupby('behavior_desc').size() behavior_count pv = behavior_count['点击'] favor = behavior_count['收藏'] cart = behavior_count['加入购物车'] buy = behavior_count['支付'] # 点击转化率计算 print('点击 —— 收藏转化率:{:.2%}'.format(favor / pv)) print('点击 —— 购物车转化率:{:.2%}'.format(cart / pv)) print('点击 —— 支付转化率:{:.2%}'.format(buy / pv)) # 收藏+购物车转化率 print('收藏 —— 支付转化率:{:.2%}'.format(buy / (favor + cart))) # 漏斗图 behavior_category = ['点击','收藏/加入购物车','支付'] rates = [1*100,(favor + cart)/ pv * 100, buy / pv * 100] format_rates = [round(r,2) for r in rates] funnel = ( Funnel(init_opts=opts.InitOpts(width='400px')) .add( series_name='用户行为', data_pair=[i for i in zip(behavior_category, format_rates)], tooltip_opts=opts.TooltipOpts( trigger='item', formatter='{b}:{c}%', is_show=True ), label_opts=opts.LabelOpts( is_show=True, position='outside' ) ) .set_global_opts( title_opts=opts.TitleOpts(title='用户行为漏斗分析'), legend_opts=opts.LegendOpts(is_show=False) ) ) funnel.render_notebook()用户价值分类
-
用户RFM模型分析:
- R (Recency) 最近一次消费时间:表示用户最近一次消费距离现在的时间。消费时间越近的客户价值越大。1年前消费过的用户肯定没有1周前消费过的用户价值大。
- F (Frequency) 消费频率:指用户在统计周期内购买商品的次数,经常购买的用户也就是熟客,价值肯定比偶尔来一次的客户价值大。
- M (Monetary) 消费金额:指用户在统计周期内消费的总金额,体现了消费者为企业创利的多少,自然是消费越多的用户价值越大。
# 构造R值 last_time = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id').max()['date'] recency = (data_df['date'].max() - last_time).dt.days.copy() median_recency = recency.median() recency[recency <= median_recency] = 1 recency[recency > median_recency] = 0 recency.name = 'R' recency.head(20)# 构建F值 frequency = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id')['item_id'].size() median_freq = frequency.median() frequency[frequency <= median_freq] = 0 frequency[frequency > median_freq] = 1 frequency.name = 'F' frequency.head(20)rfm = pd.merge(recency, frequency, on='user_id', how='inner') rfm = rfm[['R','F']].astype('str') rfm['RF'] = rfm['R'] + rfm['F'] rfm.head()user_tag_dict = { '11': '重要价值客户', '10': '重要发展客户', '01': '重要保持客户', '00': '重要挽留客户' } rfm['user_tag'] = rfm['RF'].map(user_tag_dict) rfm.head()# 统计分层客户数量 user_tag_count = rfm.groupby('user_tag').size() user_tag_countuser_tag_count.index
# 可视化统计分层客户数量 user_tag_pie = ( Pie(init_opts=opts.InitOpts(width='400px')) .set_global_opts( legend_opts=opts.LegendOpts(is_show=False) ) .add( series_name='购买次数占比', data_pair=[list(z) for z in zip(user_tag_count.index.tolist(), user_tag_count.values.tolist())], radius=['30%', '70%'], label_opts=opts.LabelOpts( is_show=True, position='outside'), ) .set_series_opts( tooltip_opts=opts.TooltipOpts( trigger='item', formatter='{b}: {d}%') ) ) user_tag_pie.render_notebook()# 可视化大屏制作 page_behaviour = ( Page(layout= Page.DraggablePageLayout) .add(daily_pv_line) .add(hourly_pv_line) .add(buy_hist_bar) .add(top_cat_pie) .add(top_item_pie) .add(funnel) .add(user_tag_pie) ) page_behaviour.render('page_behaviour.html')



