复联四首映,不知道你是高价购票、熬夜观看党,还是屏蔽同好、拒绝剧透党?电影热映,是否能够知道有多少人跟我一样买了票,跟我一样等着看灭霸挨打?
是的,我们可以通过例如Lookalike算法,在一个数据集中找到跟我有同类爱好的人群,而在此之前,我们需要先做好数据准备。
这篇文章的目的是手把手教会此前没有任何编程基础的同学做数据准备。所谓数据准备,是指通过一系列操作,如分组、求和、替换、拆分、合并等,使数据符合建模时的需求。
在这里我们仅会涉及与数据准备有关的 Python 语句,而不需要从 「Python 如何运行程序」、「类型和运算」等基础开始学习。好比我们要出国扫货,我们只需了解「多少钱」,「打折吗」,「全买了」等和购物相关的句子,而不需要知道及物动词和不及物动词的区别、现在完成时中动词的形式这些。当然,了解基础知识可以帮助我们更好地使用这个工具,但这并非本文的聚焦点。
我们会以 TDU 的经典实训题lookalike 展开,使用的编程语言是 Python 3.6。
问题背景
根据给定的种子人群, 寻找相似人群
这个问题可以进行形象化的表述:
假设我们有一个包含腾云大学所有学生信息的数据库,抽取出其中一条数据,我们可以看到:
{‘姓名’: ‘李狗嗨’, ‘年龄’: ‘20’, ‘身高’:‘180’,‘喜欢的运动’: ‘飞盘’,‘喜欢的电影’:‘超凡蜘蛛侠’,‘喜欢的剧集’:‘我的天才女友’,‘喜欢的歌手’:‘SNH48’,‘喜欢的学科’:‘统计学’}
(上述数据库中的数据仅为举例,非真实数据。我们的lookalike实训数据集中所有值都已经脱敏化处理。)
我们得知李狗嗨、王快活等100位同学买了《复仇者联盟4》的票。我们要根据这100位同学的特征,在数据库里找出其余有可能购买复联4电影票的人。
图:数据库 + 种子人群→相似人群
这就是lookalike问题。
一、
了解我们要处理的对象和我们的目的
我们要处理全量数据集在文件夹中的结构如下,可以看出是按天抽取的三个特征维度,分别为app,dev,aoi。
图:全量人群数据集
打开表格,我们可以看到:
1)app维度下,第一列为TDID,即每台移动设备的唯一标识,第二列为设备安装的app集合
2)dev维度下,第一列为TDID,第二列为设备型号
3)aoi维度下,第一列为TDID,第二列为设备到访的地点集合
我们的目的是形成一张聚合表,描述全量设备在这几天内在三个维度上的情况,如安装(过)哪些app、设备型号、到访过哪些地点等。也就是说,我们既要按天聚合(纵向),又要按维度聚合(横向)。最终成果大致如下。
图:最终成果前5行示意
二、
了解 Python 的句法
在上手处理之前,我们先来了解一下Python的句法。概括起来我们只会遇到两种形式的句法:
1)操作名称.(你要处理的对象,各种参数设定)
图:第一种句法
2)你要处理的对象.操作名称(各种参数设定)
图:载入 aoi 数据集
图:第二种句法
操作名称又叫函数,基本一目了然,比如看头是head,看尾是tail,切开是split, 合并是merge,朗朗上口。
现在我们已经有了aoi这个处理对象,我们可以用它来熟悉一下简单的函数。
图:对aoi数据集进行统计分析
另外,我们可以在一行中连续使用多个函数,顺序为从左到右,比如在下图中我们先使用了stack进行堆积然后用了reset_index来取消tdid索引。
如果想要深入了解一个函数的参数设定,官方文档是个很好的去处。
(https://pandas.pydata.org/pandas-docs/stable/reference/frame.html)
三、
数据清洗 - 谋定而后动
在这个环节我们的原则是谋定而后定:先想清楚我们需要什么,然后再思考具体的代码实现。
01
对aoi数据集的处理
我们已经导入aoi数据集,但由于其aoi列中的值为集合形式,不利于我们查看数据集的情况,因此我们进行了一些操作(在本节中会介绍)生成了aoi_stack数据集,如下。
图:aoi 数据集前5行
图:aoi_stack 数据集前5行
我们进行了基本的描述统计(见下图)。我们知道 aoi 相关数据集的情况是:
1)共有38184台设备,34种地点
2)设备出现地点种类总数至多为25种
3)设备出现总天数最多为14天,最少为1天(不考虑NAN的行)
那么我们需要生成哪些信息呢?
1)首先我们肯定能想到要统计设备到访地点的次数,类似于{‘学校’: 0,‘小区’: 1,‘购物中心’:2}这种形式。
2)然后我们还可以统计设备到访地点种类,如果上边的花括号是真实情况,那么种类就是2—— 小区是1种,购物中心也是1种,去学校的次数为0所以不计入去过的种类。
3)或许你还有其他想法,比如统计设备去所有地点的次数,设备出现的天数等等。但不管构建什么变量,在动手前都需考虑其对模型的解释性,以及该变量与其他变量的关系(如增加地点总次数可能会与地点种类形成多重共线性等)。如果当下不能作出准确判断,后续可以使用统计学中的检验方法审视选择的变量与模型,这都是后话了。
形成了思路后,我们要用代码实现它。
1)设备到访地点的次数
a. 拆分。在aoi数据集中,一个格子里有多个值,我们需要将其拆开。
图:split 函数
b. 堆积。stack可以把按行分布的值变成按列分布。
图:stack 函数
c. 独热编码。独热编码将一列中的不同类展开为列,值为0或1。类似于虚拟变量。
图:get_dummies函数
d.求和。groupby加sum函数可以帮助我们对同一设备按列求和,这样我们就获得了某设备到过某地点的次数。
图:groupby 函数
2)设备到访地点的种类
a. 去重。drop_duplicates函数可以帮助我们去除相同的行。
b. 统计。value_counts函数可以统计该值出现的次数。
经过这两步操作我们获得了设备到访地点的多样性数据。
图:去重和统计
得到了我们所需的所有变量后,再进行两表的合并即可,使用join,merge,concat函数均可。在这里我们使用join。
图:得到aoi相关变量的合并表
02
对device数据集的处理
预览数据之后可知,手机品牌主要分布在苹果、小米、华为、oppo、vivo和三星中。因此我们希望得到这样的一张表:
那么该怎么做呢?可以使用apply函数。
apply括号中的语句是我们自己构建的函数。以上图第三行为例,括号中的内容表示如果该值中包含'iPhone' in x or 'iPad' in x or 'iPod’字样,则返回1,否则为0。这行语句对dev数据集dev列中每一个值逐一进行操作,返回新的一列。
03
对app数据集的处理
图:app 数据集前5行
app数据集中的app列表示设备上安装的app,但有时会存在同一设备不同天内app不同的情况,比如第一天app为268,275,298,第二天app为268,275,456。为此我们需要确定数据处理逻辑,在这里我们将所需的数据定为安装(过)的app,因此在上述情形下,这台设备对应的app值应为268,275,298,456。
具体的操作与aoi数据集基本一致,不再赘述。
图:得到 app 相关变量的合并表
最后,需要将三个处理好的数据集并到一处,同样,我们可以用 join 函数。
图:得到最终成果
好了,到这里数据准备的过程就结束了。是不是很简单?
当然在实际操作中问题是不可避免的,但幸运的是大多数问题都已经被遇到过并得到了很好的解决,你可以在:
stackoverflow(https://stackoverflow.com/)中找到答案。
学习资源推荐:10分钟入门 python pandas
https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html
封面来源于网络,如有侵权,请联系删除。
作者:TalkingData 谢洛克
本文转自:TalkingData数据学堂
推荐阅读:
强推!10大顶级大数据可视化工具硬核评测
如果看了这些还不懂线性代数,你就来锤我(上)
如果看了这些还不懂线性代数,你就来捶我和广坤(下)