机器学习多场景实战(一)+https://developer.aliyun.com/article/1544800?spm=a2c6h.13148508.setting.25.22454f0eHFZZj3
月均活跃用户分析
我们用数据中的购买记录来定义活跃
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') 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;
结果解读🐣
精细化运营:和精细化运营相对的是粗放式运营,也就是在流量红利还在的时候,采用固定几种运营方式,大家看到的东西都是一样的,根据大众最终的实验效果去反馈运营策略。
精细化运营与粗放式运营有着本质的区别。在流量红利充沛的时期,粗放式运营可能通过大规模、统一的推广方式就能获得显著成效。然而,随着市场环境的变化和竞争的加剧,这种方法的效果逐渐减弱。此时,精细化运营应运而生,它强调的是根据每个用户的特性和需求来制定个性化的运营策略。
要实现精细化运营,关键在于深入理解和把握用户的个性与需求。这里就引出了“用户标签”或“用户画像”的概念。用户标签是对每个用户与企业商业目的紧密相关的特质的提炼,这些特质可能包括用户的年龄、性别、职业、兴趣、消费习惯等。通过这些标签,企业可以更加精准地了解用户,进而制定出更符合用户需求的运营策略。
每一个用户与企业的商业目的相关较强的特质提取出来,就是用户标签,也叫用户画像,
用户标签是精细化运营的抓手,发现兴趣,投其所好。