Sparkify 流失用户分析

Sparkify是一个国外的音乐平台,本文将介绍预测Sparkify流失用户的过程。我们使用的数据是Sparkify的用户使用log,其中包含用户听的歌曲,时长,艺术家,访问页面,注册时间,地区等等数据,完整的数据集有12G,但因本文是使用单节点Spark来进行数据分析和建模的实验,为了加快速度仅使用其中一部分128M的数据。

问题描述与解决思路

我们知道一个老顾客贡献的利润是新顾客数倍,老用户对平台来说十分重要。所以本项目的就是预测哪些用户会流失,会注销账号。如果能在用户离开前能精确识别这些用户,平台就可以通过打折或其他激励手段留住这些用户。
本项目的大概解决思路是首先通过可视化分析探索各个特征与用户是否流失的关系,从而挑选出一些特征值,使用机器学习的方法对模型进行训练,最后得到一个能够准确通过用户过往操作预测出用户是否要注销的模型。

本项目的流程为:

  • 清洗数据
  • 探索性分析
  • 特征值选定
  • 建模
  • 总结

1 加载和清洗数据

首先,我们查看数据集有哪些列:

  • artist: string
  • auth: string
  • firstName: string
  • gender: string
  • itemInSession: long
  • lastName: string
  • length: double
  • level: string
  • location: string
  • method: string
  • page: string
  • registration: long
  • sessionId: long
  • song: string
  • status: long
  • ts: long
  • userAgent: string
  • userId: string

Page列有以下种类

+--------------------+
|                page|
+--------------------+
|              Cancel|
|    Submit Downgrade|
|         Thumbs Down|
|                Home|
|           Downgrade|
|         Roll Advert|
|              Logout|
|       Save Settings|
|Cancellation Confirmation|
|               About|
| Submit Registration|
|            Settings|
|               Login|
|            Register|
|     Add to Playlist|
|          Add Friend|
|            NextSong|
|           Thumbs Up|
|                Help|
|             Upgrade|
+--------------------+

查看各列的缺失值的比例

-RECORD 0-----------------------------artist        | 0.20381151832460734  auth          | 0.0                  firstName     | 0.029130890052356022 gender        | 0.029130890052356022 itemInSession | 0.0                  lastName      | 0.029130890052356022 length        | 0.20381151832460734  level         | 0.0                  location      | 0.029130890052356022 method        | 0.0                  page          | 0.0                  registration  | 0.029130890052356022 sessionId     | 0.0                  song          | 0.20381151832460734  status        | 0.0                  ts            | 0.0                  userAgent     | 0.029130890052356022 userId        | 0.0

可以发现firstName,gender,userId等缺失比例相同,我猜测缺失的是同一批数据,于是对firstname为空的数据进行查看,果然它们的userId也为空。

+------+----------+---------+------+-------------+--------+------+-----+--------+------+-----+------------+---------+----+------+-------------+---------+------+
|artist|      auth|firstName|gender|itemInSession|lastName|length|level|location|method| page|registration|sessionId|song|status|           ts|userAgent|userId|
+------+----------+---------+------+-------------+--------+------+-----+--------+------+-----+------------+---------+----+------+-------------+---------+------+
|  null|Logged Out|     null|  null|          100|    null|  null| free|    null|   GET| Home|        null|        8|null|   200|1538355745000|     null|      |
|  null|Logged Out|     null|  null|          101|    null|  null| free|    null|   GET| Help|        null|        8|null|   200|1538355807000|     null|      |
|  null|Logged Out|     null|  null|          102|    null|  null| free|    null|   GET| Home|        null|        8|null|   200|1538355841000|     null|      |
|  null|Logged Out|     null|  null|          103|    null|  null| free|    null|   PUT|Login|        null|        8|null|   307|1538355842000|     null|      |
|  null|Logged Out|     null|  null|            2|    null|  null| free|    null|   GET| Home|        null|      240|null|   200|1538356678000|     null|      |
|  null|Logged Out|     null|  null|            3|    null|  null| free|    null|   PUT|Login|        null|      240|null|   307|1538356679000|     null|      |
|  null|Logged Out|     null|  null|            0|    null|  null| free|    null|   PUT|Login|        null|      100|null|   307|1538358102000|     null|      |
|  null|Logged Out|     null|  null|            0|    null|  null| free|    null|   PUT|Login|        null|      241|null|   307|1538360117000|     null|      |
|  null|Logged Out|     null|  null|           14|    null|  null| free|    null|   GET| Home|        null|      187|null|   200|1538361527000|     null|      |
|  null|Logged Out|     null|  null|           15|    null|  null| free|    null|   PUT|Login|        null|      187|null|   307|1538361528000|     null|      |
+------+----------+---------+------+-------------+--------+------+-----+--------+------+-----+------------+---------+----+------+-------------+---------+------+

将userId为空的数据删除,并再次查看缺失值情况,发现firstName列的空值也消失了。

-RECORD 0----------------------------artist        | 0.17992191376000344 auth          | 0.0                 firstName     | 0.0                 gender        | 0.0                 itemInSession | 0.0                 lastName      | 0.0                 length        | 0.17992191376000344 level         | 0.0                 location      | 0.0                 method        | 0.0                 page          | 0.0                 registration  | 0.0                 sessionId     | 0.0                 song          | 0.17992191376000344 status        | 0.0                 ts            | 0.0                 userAgent     | 0.0                 userId        | 0.0

另外我们发现ts,registration数据类型是timestamp,我们需要将其转换成DateType

2 探索性数据分析

定义客户流失

我们使用 Cancellation Confirmation 事件来定义客户流失,即当用户访问了提交确认注销,我们就认定该用户已经流失。该事件在付费或免费客户身上都有发生。

提出假设

  • 流失用户与用户性别,付费情况,注册时长,地区,设备,平均每天Session数,平均ItemInSession的关系
  • 流失用户与访问特定页面数量时间的关系

1 查看流失用户与性别的关系

  • 未流失用户与流失用户均为男性多于女性。

2 查看付费用户与免费用户中流失用户数量的差别

  • 付费用户与免费用户流失比例相差不大

3 查看注销与否和注册时长的关系

  • 我们发现流失用户的注册天数集中在100天以内。

4 查看itemInSession与是否注销的关系

  • 由于数据的量比较小,分布差别不大

5 查看地区与注销与否的关系

+-----+-----+-----+
|churn|state|count|
+-----+-----+-----+
|    0|   CA|39158|
|    0|   PA|23708|
|    0|   TX|22200|
|    0|   NH|18637|
|    0|   FL|11427|
+-----+-----+-----+
only showing top 5 rows+-----+-----+-----+
|churn|state|count|
+-----+-----+-----+
|    1|   CA| 7613|
|    1|   CO| 4317|
|    1|   MS| 3839|
|    1|   WA| 3526|
|    1|   OH| 3173|
+-----+-----+-----+
only showing top 5 rows
  • 由于使用的数据集一共存在225个用户,地区就有39个,所以该特征参考意义不大。

6 查看使用设备与用户是否注销的关系

↓流失用户的设备使用情况

+------------+-----+
|      new_ua|count|
+------------+-----+
|   [Windows]|24737|
|[Macintosh;]|17355|
|      [X11;]| 1762|
|   [iPhone;]| 1010|
+------------+-----+

↓未流失用户的设备使用情况

+-------------+------+
|       new_ua| count|
+-------------+------+
|    [Windows]|108450|
| [Macintosh;]| 85394|
|      [iPad;]| 11381|
|[compatible;]| 10684|
|    [iPhone;]| 10182|
|       [X11;]|  7199|
+-------------+------+

7 查看流失用户与访问次数的关系

平均每天的访问次数

每个月的平均访问天数

8 查看用户流失与各页面访问次数的关系

3 特征工程

结合经验和以上的探索性分析,我决定使用以下特征值

  • 注册天数
  • 每天访问次数
  • 每月访问天数
  • 注册天数
  • 付费与否
  • 页面访问次数
    • 升级页面
    • 降级页面
    • 广告页面
    • 点赞
    • 加好友
    • 添加到播放列表
    • 下一首歌

4 建模

选定模型

本项目将数据集的90%作为训练集,剩余10%作为测试集。我分别使用了逻辑回归模型,随机森林模型和集成方法进行了初步的训练。

评估指标

因为流失用户数据比例很小(20%左右),如果使用Accuracy(准确率)作为指标,我们根本不需要建模,直接预测所有用户都是未流失用户,这样即可达到80%的准确率,但这显然是有问题的。所以我们采用F1-score作为评估指标。

模型选定结果

从下面的结果我们发现随机森林的训练时间最短且效果最好。于是我打算对随机森林模型的超参数进行进一步的调整。

逻辑回归模型
Run Time is 2.79
The F1-Score is 0.6858974358974359
随机森林
Run Time is 1.2
The F1-Score is 0.7835714285714286
集成方法
Run Time is 5.0
The F1-Score is 0.6392857142857143

超参数调整

我们选用多组参数,进行3折交叉验证,选择表现好的参数。
maxDepth可能取值有5,10
numTrees可能取值有20,50
经过测试我们选定maxDepth为10,numTrees为50的随机森林模型进行预测,准确度为81.25%,F1- score为0.7836。

结果评估

我们查看了各个特征值的权重,发现首要特征为用户平均每天访问次数,其次为注册天数。的确如果我们如果对一个音乐网站失去兴趣了,不再去访问了才会去注销账号。
最终准确率81.25%,0.7836的F1-score不算很高,因为我们使用的是完整数据集的很小一部分,模型可能欠拟合。另外由于用户太少,地区等一些特征值没有办法被使用。

5 总结

过程总结
  • 我们对数据集进行了清洗,删除了没有用户ID,用户名的数据
  • 对数据进行了初步分析和可视化,探索了用户流失与各个特征值的关系
  • 选定了特征值,并使用了三个模型进行初步训练和测试。
  • 选定随机森林为最终模型,对超参数进行调整,得到最终模型。
反思与改进
  • 本次由于数据集太小会导致测试集上的预测准确率很难提升,有机会应该在IBM或者AWS平台上使用完整数据集进行预测。
  • 本次项目是根据截至当前的用户行为数据来预测用户是否注销,但是实际上工作中肯定预测的是未来一段时间用户是否注销。定义用户流失的方法有待改进
  • 本次使用的特征以外,细想一下还有很多特征值得尝试,譬如喜欢的音乐家数量,听歌数量,所在地变更情况等等

6 参考文献

随机森林介绍、关键参数分析
机器学习算法集锦:从贝叶斯到深度学习及各自优缺点

音乐平台Sparkify流失用户预测相关推荐

  1. 音乐服务流失用户预测

    项目简介 项目数据集是一个音乐服务的用户日志,包含了用户信息,歌曲信息,用户活动,时间戳等.大小128M.需要通过数据集中信息,预测出可能流失的用户,以便后续对相应用户采取挽留措施 项目思路 为了预测 ...

  2. 什么样的音乐平台能够激发用户付费,Spotify告诉你答案

    从瑞典起家的新兴企业,如今成长为业内巨头,它的成长速度让对手猝不及防,甚至还开了纳斯达克直接上市的先河,作为全球最大的音乐流媒体平台Spotify,它是如何打造出属于自己的超级产品? 其实,在Spot ...

  3. 产品设计从何入手?拥有1.7亿活跃用户的音乐平台Spotify的7个策略

    最好的 个性化用户体验 是什么样的呢?答案肯定是每位用户的体验都是完全个性化的.本文介绍了Spotify如何 以客户为中心 设计产品,实现一亿七千万用户的产品个性化体验案例.Spotify的策略核心是 ...

  4. 不吹牛会死!国内音乐平台进入“大逃杀”

    日前,一篇<看看海洋与腾讯音乐将如何"血洗"独立音乐应用>的文章引起了广泛关注.文中海洋声称长期独家签约的音乐及版权代理公司达40多家,占市场份额超过15%,一时间名不 ...

  5. 小众播客,音乐平台的新战场?

    上个月苹果公司CEO库克在一档音频播客类节目中和硅谷一位记者兼播客主持人聊了30多分钟,关于隐私.对特斯拉的客套恭维,以及自己未来不会再在苹果公司干十年等话题.这档播客节目叫Sway,出自<纽约 ...

  6. 用户都跑了,你却还分不清流失用户和流失率

    PMCAFF(www.pmcaff.com):互联网产品社区,是百度,腾讯,阿里等产品经理的学习交流平台.定期出品深度产品观察,互联产品研究首选. 外包大师(www.waibaodashi.com): ...

  7. 10年运营老兵,教你召回流失用户

    运营干货,5000余字,教你低成本召回流失用户 < 背景 > 电商平台A成立近10年,算不上行业TOP,但在细分领域发展不错. 2018年不景气,App日活从年初50万一路下跌,到现在运营 ...

  8. 银行流失用户分析及预测模型

    自学的一个银行流失客户预警的小项目 0.引言-银行流失用户分析 银行客户流失是指银行的客户终止在该行的所有业务,并销号.但在实际运营中,对于具体业务部门,银行客户流失可以定位为特定的业务终止行为. 商 ...

  9. 2人同步听歌软件_打包走!全网无损音乐任意下,支持4大主流音乐平台同步歌单!...

    一起探索未知应用的神秘与强大 测试 | 编辑 | 制图 | 排版 | ©王仔/船长 防止资源失效,记得星标公众号咔咔科技✨ 此文用时2小时,速读仅需3分钟 前言 自从手机干掉了MP3,人们掌上听歌变得 ...

最新文章

  1. 成功解决连接SQL输出出现中文乱码问题(10001, 'oracle¿ìËÙÈëÃÅ', 'Íõº£ÁÁ', 'Ë®Àû³ö°æÉç',
  2. hibernate一对一外键单向关联
  3. 九种跨域方式实现原理
  4. python socket能做什么_[python]初探socket
  5. Tomcat 启动报错The APR based Apache Tomcat Native l...
  6. TBXML常用API
  7. 整个电脑键盘被锁住了_蜗居共享经济,如何彻底榨干你家里的电子设备|鼠标|共享经济|键盘|电脑桌|显示器|升降支架...
  8. python pandas series_Python数据分析-pandas之Series
  9. 计算理论是研究用计算机解决,可计算性理论
  10. 背景图片自适应大小(css3)
  11. 熊猫烧香病毒是计算机病毒,“熊猫烧香”计算机病毒大案告破
  12. 【项目需求】房屋租赁管理系统的分析与设计
  13. 简单的E_mail发送
  14. 荣耀笔记本linux版硬盘分区,荣耀MagicBook硬盘分区详细教程
  15. mysql创建book表_【mysql】表的创建以及基本操作
  16. P3P求解相机姿态原理介绍
  17. php把图片处理成圆形透明的图片,做圆形透明头像【微信头像】
  18. 声纹识别demo_语音识别、声纹识别的区别及测试
  19. 【POJ3349】snowflakes
  20. [设计模式]设计模式SOLID原则

热门文章

  1. 2021考研数学真题大串讲
  2. 中秋闲鱼卖货,月入过万的新玩法?
  3. yolov7各个模型的网络结构图(最详细)
  4. HDU 4417 Super Mario(线段树)
  5. SPL 提速天体聚类任务 2000 倍
  6. 5. 删除计算机科学系所有学生的选课记录。
  7. 前端 vue中使用 省市区三级联动
  8. JQ插件:Knob旋钮按钮
  9. macOS Mojave升级后开机卡在进度条的解决方法
  10. ffmpeg实现rtmp推流(linux环境)