作为一个低产的创作者,今天偶尔在回看不同内容的数据时,惊奇的发现这篇文章竟然有5.2W的阅读量,同时有着2500多的收藏量。 前言:这篇文章最早发布于2019年11月16日,当时的我正在考虑产品经理转行做数据分析,因为当时的我对完整业务的商业模式充满好奇,专门做数据让我更接近去了解整个商业模式。 当时的公司没有机会提供这样一个岗位,加上我在做产品经理的期间,没有一个非常系统的数据分析报告,让我的求职变得有些坎坷,纵然产品工作中有很多用到数据驱动迭代的案例,但他们过于碎片,碎片在面试中是没有竞争力的,面试官更希望听到一个完成的项目。因此我决定做一个完整的数据报告,主要是为了学习,其次希望加在简历里,让他对我的求职有一些帮助。 恰巧在做产品经理期间,当时公司的业务是以海外公寓长租为主。因此结合当时我对房屋租赁业务有浅薄的理解,加上当时airbnb在中国的营销非常激烈。我就对airbnb产生兴趣,并通过网络获取到了一份airbnb对外公开的一个竞赛数据集。 因此我选择拿它来进行一个完整的数据报告的输出。 特别声明:此篇文章所采用的数据源来自一份airbnb公开的竞赛数据集,数据集并且时间较早(airbnb才刚进入中国市场),因此数据不具备驱动业务的指导能力,把它主要当作一个学习的参考资料,或者模版也好,它不具备商业价值。 这是一个非常标准的模版,你的数据报告最好也具备以下5个部分:分析背景或目的、分析维度说明、数据分析验证、结论汇总、业务建议。 如果是职场上的小的专题专题分析,则需要具备关键的两个部分:数据分析验证+结论建议 一、分析背景与目的1.1、分析背景Airbnb成立于2008年,短短9年时间成为了短租民宿行业的巨头,并且仍在不断的冲击着传统酒店行业,抢占着这一市场。 airbnb目前的市场背景:
1.2、提出分析问题探索airbnb产品的业务存在哪些可以改进的地方? 在实际工作中很少有探索业务改进的项目机会,基本是先发现问题,然后查找原因;如果完成既定工作,则会有一些时间用来探索业务中的数据特征,从而探索发现业务机会 获客:一款产品的发展中必然伴随着不断的迭代。例如在常见的AARRR模型中,第一个A(即获客)至关重要,因此提高新用户获取的数量和质量是不断监测并优化的一个工作,哪些渠道的效果更好,企业就要及时调整和增加此渠道的投入,哪些渠道的效果很差,就要及时查找原因并给出解决。 当时报告中忽略了【获客成本】这一关键指标,获客成本也是非常核心的一个指标,实际工作中,基本上成本和质量成正比(例如在线教育行业,较高成本获取的客户,一般转化率明显高于低成本或客) 转化:转化即商业收益,因此转化漏斗分析也是数据分析中的关键环节,因此需要了解整个产品的业务转化情况,针对哪些流失率较高的漏斗环节进行改进? 针对分析的目的,提出以下三个方向目的:
二、分析维度根据以上设定的三个问题,提出来三个分析维度: 将着重从airbnb的用户画像、推广渠道分析、转化漏斗分析三个方面进行分析,去探索和分析airbnb在产品和业务上有哪些可以改进的地方,并给出实际性的建议,以提升和改进airbnb的渠道推广策略和产品设计。 用户画像分析:用户性别的分布特征、用户年龄的分布特征、用户地区的分布分布、中国地区去国外预定的地区占比。 推广渠道分析:每月新增用户、不同用户端的注册量、不同推广渠道的注册量、不同营销内容的注册量、不同推广渠道的转化率、不同营销内容的转化率 转化漏斗分析:注册用户占比、活跃用户(非僵尸用户)占比、下单用户占比、实际支付用户占比、复购用户占比 三、数据表理解与预处理3.1、数据集描述 Airbnb顾客预订数据下载(学习tips:下载后导入本地数据库操作,作为数据分析,你需要对数据库有一些最基本的了解): 数据集介绍:此数据集是kaggle上的一个竞赛项目,官方目的主要是用来制作目的地信息的预测模型。此数据聚集包含两张数据表,其中train_user表中为用户数据,sessions表中为行为数据。 数据集量:
3.1、列名称理解 原数据表的字段是英文的(学习tips:几乎所有的企业数据库中的数据表也是这样的,由英文字段组成),所以在分析前,你需要理解每个列名称的含义。 数据表名称:train_users
数据表名称:sessions
学习tips:以上两种表通过id = user_id进行关联,在实际的应用,关系型数据就决定了你在数据分析前,你要对多张表进行关联重建,不过目前多数公司有专门的数仓同学来管理这些明细数据,分析师则更专注于数据的应用 3.2、数据预处理 dataframe的来源是对日志的etl的处理,这并不意味着表格数据可以直接用来统计分析,数据分析之前需要对数据进行简单的加工处理,数据预处理是一个必不可少的步骤。 重复值处理
按照业务理解,用户表中的id应当是唯一非重复的,所以只需要排查train_users中是否存在重复值。执行SQL后得出:count_id = 0。说明train_users数据表中不存在重复值。 缺失值处理 数据缺失数量较多,以下为存在缺失值的列及处理办法:
缺失原因推测及处理:date_first_booking(首次预定时间)数据如果缺失,在业务上可以理解为此用户为“未预定用户”,也就是没有下单的用户。性别、年龄由于客户端中这部分信息选填,空值为用户未填写。其他四个数据是由于前端统计时数据没有统计到。 处理:多数空值不需要处理;如果使用到字段如果出现空缺,可以简单的在where条件排除掉空数据,再进行分析。 异常值处理
附录3-1:数据清洗中使用的SQL #检查数据中是否包含重复值SELECT id, COUNT(id) AS count_id FROM data.train_users GROUP BY id HAVING count_id > 1; #通过以下SQL对每一列进行查询,通过替换where之后的条件,查询每一列包含的空值数量。 SELECT date_first_booking, COUNT(date_first_booking) FROM data.train_users WHERE date_first_booking = '0000-00-00 00:00:00'; #通过查看数据的极值(极大值、极小值)是否符合实际情况,来判断数据中是否存在异常值。 SELECT min(age),max(age) FROM data.train_users; #异常值处理:对于年龄不在7~75区间的数据删除(设置为0-空值) SET sql_safe_updates = 1; UPDATE data.train_users SET age = 0 WHERE id NOT IN ( SELECT id FROM ( SELECT id FROM data.train_users WHERE age <= 75 AND age >= 7 ) a ); 四、用户画像分析4.1、用户的性别分布特征 女性用户数量=63041、男性用户数量=54440,其中女性用户多于男性用户。 4.2、用户的年龄分布; 不同年龄层用户分布 airbnb的用户主要为“青年群体”(26岁~30岁),其次为36~45岁,然后为21~25岁。 4.3、用户不同地区(根据语言)的分布 不同地区(语言)用户量分布 非英语国家_不同地区(语言)用户量分布
4.4、中国用户去国外预定的地区占比 中国用户目的地国家分布
4.5、本章使用的SQL语句 #用户中女性用户的数量。SELECT COUNT(id) AS '男性用户数量' FROM data.train_users WHERE gender = 'MALE'; #用户中男性用户的数量。 SELECT COUNT(id) AS '女性用户数量' FROM data.train_users WHERE gender = 'FEMALE'; #用户不同年龄的数量。 SELECT age, COUNT(id) FROM data.train_users GROUP BY age HAVING age <> 0 ORDER BY age; #用户不同语言的分布(通过手机系统语言数据); SELECT language, COUNT(language) AS lg_num FROM data.train_users GROUP BY language ORDER BY lg_num; #中国用户去国外预定的地区 SELECT language, country_destination, COUNT(country_destination) AS cd_num FROM data.train_users GROUP BY language, country_destination HAVING language = 'zh' ORDER BY cd_num DESC; 五、流量渠道分析5.1、每月新增用户 不同月份注册用户量
5.2、不同用户端的注册量
5.3、推广渠道分析 不同渠道供应商的注册用户量: 不同渠道注册用户转化率 除direct直接下载之外,google是其主要的下载来源,注册用户量多,但是转化率低。需要针对这一渠道做进一步分拆解:从以下拆解图来看,无论是渠道获客的方式,还是渠道投放的内容(用户注册时首次访问页面)来看,谷歌的获客转化率普遍都比较低。 谷歌不同渠道方式转化率 谷歌不同渠道内容转化率 email-marketing、naver虽然注册用户量少,但是转化率高,如果尽可能的扩大规模这两个渠道的获客规模。 特别提示:实际在选择渠道时,不同渠道的ROI(收入/获客成本)也是需要考虑的核心指标,ROI越高则说明此渠道价值越大。 5.5、分析过程使用的SQL #查询每个月(date_account_created)新增注册用户的数量SELECT date_format(date_account_created, '%Y-%M') AS year_moth, COUNT(id) FROM data.train_users GROUP BY date_format(date_account_created, '%Y-%M') ORDER BY year_moth; #查询不同设备来源(first_device_type)注册的数量 SELECT first_device_type, COUNT(id) AS fdt_num FROM data.train_users GROUP BY first_device_type ORDER BY fdt_num DESC; #不同推广方式+渠道的注册数量 SELECT affiliate_channel, affiliate_provider, COUNT(id) AS ac_num FROM data.train_users GROUP BY affiliate_channel, affiliate_provider ORDER BY ac_num DESC; #不同推广方式+渠道的转化率 SELECT affiliate_channel, affiliate_provider, SUM(CASE WHEN date_first_booking <> '0000-00-00 00:00:00' THEN 1 ELSE 0 END) / COUNT(id) AS ac_ratio FROM data.train_users GROUP BY affiliate_channel, affiliate_provider ORDER BY ac_ratio DESC; #不同营销广告内容的注册数量 SELECT first_affiliate_tracked, COUNT(id) AS fat_num FROM data.train_users GROUP BY first_affiliate_tracked ORDER BY fat_num DESC; #不同营销广告内容的转化率 SELECT first_affiliate_tracked, SUM(CASE WHEN date_first_booking <> '0000-00-00 00:00:00' THEN 1 ELSE 0 END) / COUNT(id) AS fat_ratio FROM data.train_users GROUP BY first_affiliate_tracked ORDER BY fat_ratio DESC; 六、转化漏斗分析转化漏斗 从可视化图表中可以看出:
6.4、漏斗分析过程SQL #用户总数量:对sessions表中的user_id进行group by,再统计数量,得出sessions表中所有的用户数量。SELECT COUNT(*) AS ‘用户总数量’ FROM ( SELECT user_id FROM data.sessions GROUP BY user_id ) new_sessions; #活跃用户的定义:按照用户的操作总次数,如果用户操作产品大于等于10次,就可以说明用户为偏活跃的用户,另一方面说明此用户不是僵尸用户。 SELECT COUNT(*) AS ‘活跃用户总数量’ FROM ( SELECT user_id FROM data.sessions GROUP BY user_id HAVING COUNT(user_id) >= 10 ) active; #注册用户:通过sessions表中的用户与注册用户表进行内关联,统计出sessions表中已注册用户数量 SELECT COUNT(*) AS ‘注册用户总数量’ FROM ( SELECT user_id FROM data.sessions GROUP BY user_id ) new_sessions INNER JOIN data.train_users tu ON new_sessions.user_id = tu.id; #下单用户:用户行为中“reservations”为预定(下单)操作,通过统计进行了“reservations”的用户(group by去重),得出下单用户的数量 SELECT COUNT(*) AS ‘下单用户总数量’ FROM ( SELECT user_id FROM data.sessions WHERE action_detail = 'reservations' GROUP BY user_id ) booking; #实际支付用户:用户行为中“payment_instruments”为支付操作,通过统计进行了“payment_instruments”的用户(group by去重),得出实际支付用户的数量 SELECT COUNT(*) AS ‘实际支付用户总数量’ FROM ( SELECT user_id FROM data.sessions WHERE action_detail = 'payment_instruments' GROUP BY user_id ) payed; #复购用户:通过统计进行了“payment_instruments”操作次数大于1次的用户(group by去重),得出实际复购用户的数量 SELECT COUNT(*) AS ‘复购支付用户总数量’ FROM ( SELECT user_id FROM data.sessions WHERE action_detail = 'reservations' GROUP BY user_id HAVING COUNT(user_id) >= 2 ) re_booking; 七、分析结论及建议7.1、用户画像总结 结论:
建议: 根据年龄分布特征,建议SEO或者付费广告投放时,投放广告的流量结构要尽可能的接近airbnb的用户人群,例如青年女性群体。 7.2、流量渠道总结 结论:
建议:
7.3、转化漏斗总结
声明:文章采用的是kaggle上一份早期的参赛数据集,以上仅作为学习使用,务必不要当作业务指导或者研报使用,我在评论区也看到有小伙伴说了,以上数据和airbnb官方对外的数据差异很大,所以如果转载,这一点一定要声明清楚。 |