机器学习已不再局限于理论探讨,而是广泛渗透到我们生活的方方面面,成为解决复杂问题、优化决策过程的强有力工具。从智能推荐系统个性化推送你可能喜爱的电影和商品,到金融风控领域精准识别欺诈交易;每一个应用场景都是机器学习技术多维度、深层次实战的精彩演绎,我们通过一些小案例对业务进行了解~
什么是数据指标💥
-
数据指标概念:可将某个事件量化,且可形成数字,来衡量目标。
-
数据指标的作用:当我们确定下来一套指标,就可以用指标来衡量业务,判断业务好坏
常用的业务指标💥
活跃用户指标💥
一个产品是否成功,如果只看一个指标,那么这个指标一定是活跃用户数
-
日活(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;
结果解读🐣
精细化运营:和精细化运营相对的是粗放式运营,也就是在流量红利还在的时候,采用固定几种运营方式,大家看到的东西都是一样的,根据大众最终的实验效果去反馈运营策略。
用户标签:每一个用户与企业的商业目的相关较强的特质提取出来,就是用户标签,也叫用户画像
每一个用户与企业的商业目的相关较强的特质提取出来,就是用户标签,也叫用户画像,
用户标签是精细化运营的抓手,发现兴趣,投其所好。