机器学习多场景实战

机器学习已不再局限于理论探讨,而是广泛渗透到我们生活的方方面面,成为解决复杂问题、优化决策过程的强有力工具。从智能推荐系统个性化推送你可能喜爱的电影和商品,到金融风控领域精准识别欺诈交易;每一个应用场景都是机器学习技术多维度、深层次实战的精彩演绎,我们通过一些小案例对业务进行了解~

什么是数据指标💥
  • 数据指标概念:可将某个事件量化,且可形成数字,来衡量目标。

  • 数据指标的作用:当我们确定下来一套指标,就可以用指标来衡量业务,判断业务好坏

常用的业务指标💥

活跃用户指标💥 

一个产品是否成功,如果只看一个指标,那么这个指标一定是活跃用户数

  • 日活(DAU):一天内日均活跃设备数

  • 月活(MAU):一个月内的活跃设备数

  • 周活跃数(WAU):一周内活跃设备数

  • 活跃度(DAU/MAU):体现用户的总体粘度,衡量期间内每日活跃用户的交叉重合情况

新增用户指标💥

主要是衡量营销推广渠道效果的最基础指标

  • 日新增注册用户量:统计一天内,即指安装应用后,注册APP的用户数。

  • 周新增注册用户量:统计一周内,即指安装应用后,注册APP的用户数。

  • 月新增注册用户量:统计一月内,即指安装应用后,注册APP的用户数。

  • 注册转化率:从点击广告/下载应用到注册用户的转化。

  • DNU占比:新增用户占活跃用户的比例,可以用来衡量产品健康度

    • 新用户占比活跃用户过高,那说明该APP的活跃是靠推广得来

留存指标💥

是验证APP对用户吸引力的重要指标。通常可以利用用户留存率与竞品进行对比,衡量APP对用户的吸引力

  • 次日留存率:某一统计时段新增用户在第二天再次启动应用的比例

  • 7日留存率:某一统计时段新增用户数在第7天再次启动该应用的比例,14日和30日留存率以此类推

行为指标💥

  • PV(访问次数,Page View):一定时间内某个页面的浏览次数,用户每打开一个网页可以看作一个PV。

  • UV(访问人数,Unique Visitor):一定时间内访问某个页面的人数。

  • 转化率:计算方法与具体业务场景有关

    • 淘宝店铺,转化率=购买产品的人数/所有到达店铺的人数

    • 在广告业务中,广告转化率=点击广告进入推广网站的人数/看到广告的人数。

  • 转发率:转发率=转发某功能的用户数/看到该功能的用户数

产品数据指标💥

  • GMV (Gross Merchandise Volume):指成交总额,也就是零售业说的“流水”

  • 人均付费=总收入/总用户数

    • 人均付费在游戏行业叫ARPU(Average Revenue Per User)

    • 电商行业叫客单价

  • 付费用户人均付费(ARPPU,Average Revenue Per Paying User)=总收入/付费人数,这个指标用于统计付费用户的平均收入

  • 付费率=付费人数/总用户数。付费率能反映产品的变现能力和用户质量

  • 复购率是指重复购买频率,用于反映用户的付费频率。

推广付费指标💥

  • CPM(Cost Per Mille) :展现成本,或者叫千人展现成本

  • CPC(Cost Per Click) 点击成本,即每产生一次点击所花费的成本

  • 按投放的实际效果付费(CPA,Cost Per Action)包括:

    • CPD(Cost Per Download):按App的下载数付费;

    • CPI(Cost Per Install):按安装App的数量付费,也就是下载后有多少人安装了App;

    • CPS(Cost Per Sales):按完成购买的用户数或者销售额来付费。

💫根据目前的业务重点,找到北极星指标,在实际业务中,北极星指标一旦确定,可以像天空中的北极星一样,指引着全公司向着同一个方向努力。

Python指标计算案例

数据中包含了某电商网站从2009年12月到2011年12月两年间的销售流水, 每条记录代表了一条交易记录, 包含如下字段

Invoice: 发票号码

StockCode: 商品编码

Description: 商品简介

InvoiceDate: 发票日期

Price: 商品单价

Customer ID: 用户ID

Country: 用户所在国家

计算的指标

  • 月销售金额(月GMV)

  • 月销售额环比

  • 月销量

  • 新用户占比: 新老用户

  • 激活率

  • 月留存率

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


data_1 = pd.read_excel('online_retail_II.xlsx',sheet_name='Year 2009-2010')
data_2 = pd.read_excel('online_retail_II.xlsx',sheet_name='Year 2010-2011')
数据清洗
retail_data['购买时间'].describe()

retail_data_clean = retail_data[(retail_data['商品单价']>0) & (retail_data['购买数量']>0)
计算月销量指标

商品编号相当于 SKU,SKU=Stock Keeping Unit(库存量单位)

retail_data_clean = retail_data_clean.query("(商品编号!='B') and (商品编号!='TEST001') and (商品编号!='TEST002') ")


retail_data_clean['购买年月'] = pd.to_datetime(retail_data_clean['购买时间']).dt.to_period('M')

retail_data_clean['金额'] = retail_data_clean['商品单价'] * retail_data_clean['购买数量']

gmv_m = retail_data_clean.groupby(['购买年月'])['金额'].sum().reset_index()

gmv_m.columns = ['购买年月', '月GMV']
计算月销售额环比
gmv_m['金额'].pct_change()
  • 该函数计算当前单元格和上一个单元格差异的百分比
月均活跃用户分析

我们用数据中的购买记录来定义活跃  

mau = retail_data_clean.groupby('购买年月')['用户ID'].nunique().reset_index()
月客单价(活跃用户平均消费金额)

客单价 = 月GMV/月活跃用户数

final['客单价'] = final['金额']/final['用户数']
新用户占比

根据用户最近一次购买和第一次购买时间的差异,如果相同,则认为是新用户,否则老用户

retail_data_clean.groupby(['购买年月','用户类型'])['金额'].sum().reset_index()
分组统计后得到新老用户购买金额
激活率计算
  • 用户激活的概念:用户激活不等同于用户注册了账号/登录了APP,不同类型产品的用户激活定义各有差别

  • 总体来说,用户激活是指用户一定时间内在产品中完成一定次数的关键行为

# 统计每月激活用户数量
activation_count = retail[retail['首次购买年月'] == retail['注册年月']].groupby('注册年月')['用户ID'].count()
# 统计每月注册的用户数
regist_count = retail.groupby('注册年月')['用户ID'].count()


#按渠道统计每月不同渠道的激活用户数
activation_count = retail[retail['首次购买年月'] == retail['注册年月']].groupby(['注册年月','渠道'])['用户ID'].count()
#按渠道统计每月注册用户数
regist_count = retail.groupby(['注册年月','渠道'])['用户ID'].count()
#计算不同渠道激活率

月留存率 = 当月与上月都有购买的用户数/上月购买的用户数

应用Pandas合并数据集

- 组合数据的一种方法是使用“连接”(concatenation)
  - 连接是指把某行或某列追加到数据中
  - 数据被分成了多份可以使用连接把数据拼接起来
  - 把计算的结果追加到现有数据集,可以使用连接
  
import pandas as pd
df1 = pd.read_csv('concat1.csv')
df2 = pd.read_csv('concat2.csv')

# 可以使用concat函数将上面3个DataFrame连接起来,需将3个DataFrame放到同一个列表中
pd.concat([df1,df2])
    A    B    C    D
0   a0   b0   c0   d0
1   a1   b1   c1   d1
2   a2   b2   c2   d2
3   a3   b3   c3   d3
0   a4   b4   c4   d4
1   a5   b5   c5   d5
2   a6   b6   c6   d6
3   a7   b7   c7   d7


pd.concat([df1,df2],axis=1)
  A   B   C   D   A   B   C   D    
0  a0  b0  c0  d0  a4  b4  c4  d4 
1  a1  b1  c1  d1  a5  b5  c5  d5
2  a2  b2  c2  d2  a6  b6  c6  d6
3  a3  b3  c3  d3  a7  b7  c7  d7

df1.append(df2)
  A   B   C   D
0  a0  b0  c0  d0
1  a1  b1  c1  d1
2  a2  b2  c2  d2
3  a3  b3  c3  d3
0  a4  b4  c4  d4
1  a5  b5  c5  d5
2  a6  b6  c6  d6
3  a7  b7  c7  d7


genres.merge(tracks_subset, on='Id', how='left')
how参数指定连接方式
- how = ’left‘ 对应SQL中的 **left outer**  保留左侧表中的所有key
- how = ’right‘ 对应SQL中的 **right outer**  保留右侧表中的所有key
- how = 'outer' 对应SQL中的 **full outer**   保留左右两侧侧表中的所有key
- how = 'inner' 对应SQL中的 **inner**  只保留左右两侧都有的key

stocks_2016.join(stocks_2017, lsuffix='_2016', rsuffix='_2017', how='outer')
  • 关于axis:↓这个方向就是0维度,→这个方向就是1维度 !

业务背景:缺失关键指标

疫情期间,一家印度外卖餐厅想通过数据分析,数据挖掘提升销量,但是在历史数据中缺少了很重要的一个维度,用餐人数

订单表 菜单表

根据历史订单数据,推断出每个订单的用餐人数

订单表:

  • Order_Number 订单编号

  • Order_Date 订单日期

  • Item_Name 商品名称

  • Quantity 商品数量

  • Product_Price 商品价格

  • Total_products 订单商品数量

  • restaurant_no 连锁店编号

菜单表:

  • 商品名称

  • 商品价格

基本思路🔘

  • 1份主食对应1人 (1:1)

  • 1份主菜对应1人 (1:1)

  • 1份饮料对应1人(1:1)

  • 2份小食对应1人 (2:1)

  • 酱料,佐料不做计算(n:0)

drop table if exists food_type;
create table food_type as
SELECT
	item_name,
	price,
	restaurant_id,
	food_category,
CASE
		WHEN food_category IN ( '鸡肉类', '羊肉类', '虾类', '咖喱菜', '鱼肉类', '主菜', '芝士菜' ) THEN
		'主菜' 
		WHEN food_category IN ( '饼', '米饭' ) THEN
		'主食' 
		WHEN food_category IN ( '饮料', '酒', '酸奶' ) THEN
		'饮料' 
		WHEN food_category IN ( '酱', '腌菜' ) THEN
		'佐料' ELSE '小食' 
	END AS food_type 
FROM
	food_category_table;

目前一行记录是一笔订单的一种产品的售卖情况,如果一笔订单有若干样产品会分成若干行,我们希望把一笔订单的详情,从多行统一到一行中,同时用我们事先定义的系数计算。

select a.`Order_Number`,a.`Order_Date`,a.restaurant_id,round(sum(a.Quantity*b.price),2) as total_amount, # 计算订单总金额
sum(case when food_type='主食' then a.Quantity*1 else 0 end) as staple_food_count, # 聚合操作,分别统计出每个菜名类别对应的人数
sum(case when food_type='主菜' then a.Quantity*1 else 0 end) as main_course_count,
sum(case when food_type='饮料' then a.Quantity*1 else 0 end) as drink_count,
sum(case when food_type='小食' then a.Quantity*0.5 else 0 end) as snack_count
from restaurant_orders a join food_type b 
on a.`Item_Name`=b.item_name and a.Restaurant_Id=b.restaurant_id # 把a表和b表合并
group by a.`Order_Number`,a.`Order_Date`,a.Restaurant_Id; # 合并后分组

比较主食,主菜,饮料,小食中的最大者:

select c.*,GREATEST(c.staple_food_count,c.main_course_count,c.drink_count,c.snack_count) as max_count from 
(select a.`Order_Number`,a.`Order_Date`,a.restaurant_id,round(sum(a.Quantity*b.price),2) as total_amount,
sum(case when food_type='主食' then a.Quantity*1 else 0 end) as staple_food_count,
sum(case when food_type='主菜' then a.Quantity*1 else 0 end) as main_course_count,
sum(case when food_type='饮料' then a.Quantity*1 else 0 end) as drink_count,
sum(case when food_type='小食' then a.Quantity*0.5 else 0 end) as snack_count
from restaurant_orders a join food_type b 
on a.`Item_Name`=b.item_name and a.Restaurant_Id=b.restaurant_id
group by a.`Order_Number`,a.`Order_Date`,a.Restaurant_Id) c;

增加向下取整的逻辑,并且确保最小就餐人数为1

floor 向下取整
select c.*,
GREATEST(floor(GREATEST(c.staple_food_count,c.main_course_count,c.drink_count,c.snack_count)),1) as customer_count from 
(select a.`Order_Number`,a.`Order_Date`,a.restaurant_id,round(sum(a.Quantity*b.price),2) as total_amount,
sum(case when food_type='主食' then a.Quantity*1 else 0 end) as staple_food_count,
sum(case when food_type='主菜' then a.Quantity*1 else 0 end) as main_course_count,
sum(case when food_type='饮料' then a.Quantity*1 else 0 end) as drink_count,
sum(case when food_type='小食' then a.Quantity*0.5 else 0 end) as snack_count
from restaurant_orders a join food_type b 
on a.`Item_Name`=b.item_name and a.Restaurant_Id=b.restaurant_id
group by a.`Order_Number`,a.`Order_Date`,a.Restaurant_Id) c;

结果解读🐣

精细化运营:和精细化运营相对的是粗放式运营,也就是在流量红利还在的时候,采用固定几种运营方式,大家看到的东西都是一样的,根据大众最终的实验效果去反馈运营策略。

用户标签:每一个用户与企业的商业目的相关较强的特质提取出来,就是用户标签,也叫用户画像

​​​​​​​每一个用户与企业的商业目的相关较强的特质提取出来,就是用户标签,也叫用户画像,

用户标签是精细化运营的抓手,发现兴趣,投其所好。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 18:32:02       8 阅读
  2. 【Python教程】压缩PDF文件大小

    2024-06-08 18:32:02       9 阅读
  3. 通过文章id递归查询所有评论(xml)

    2024-06-08 18:32:02       10 阅读

热门阅读

  1. MySQL 运算符以及优先级

    2024-06-08 18:32:02       8 阅读
  2. MATLAB 函数 function

    2024-06-08 18:32:02       6 阅读
  3. 源码编译OpenCV 启用cuda 加速

    2024-06-08 18:32:02       9 阅读
  4. 【Qt】Qt中的几种Timer

    2024-06-08 18:32:02       7 阅读
  5. 8*8LED点阵点亮一个点

    2024-06-08 18:32:02       6 阅读
  6. 系统安全及应用

    2024-06-08 18:32:02       6 阅读
  7. qt c++类继承QWidget和不继承有什么区别

    2024-06-08 18:32:02       6 阅读
  8. 常用sql

    2024-06-08 18:32:02       6 阅读
  9. QTGUI编程入门:解锁图形用户界面设计的奥秘

    2024-06-08 18:32:02       8 阅读
  10. AopProxyUtils.ultimateTargetBean(bean);

    2024-06-08 18:32:02       7 阅读
  11. loading组件封装原理

    2024-06-08 18:32:02       9 阅读
  12. CTF简单介绍

    2024-06-08 18:32:02       10 阅读
  13. Chrome 扩展 background 与content_script 之间通信

    2024-06-08 18:32:02       8 阅读