「Python 数据分析系列」1. 数据科学基本介绍
写在前面:
大家好,我是强哥,一个热爱分享的技术狂。目前已有 12 年大数据与 AI 相关项目经验, 10 年推荐系统研究及实践经验。平时喜欢读书、暴走和写作。
业余时间专注于输出大数据、AI 等相关文章,目前已经输出了 40 万字的推荐系统系列精品文章,今年 6 月底会出版「构建企业级推荐系统:算法、工程实现与案例分析」一书。如果这些文章能够帮助你快速入门,实现职场升职加薪,我将不胜欢喜。
想要获得更多免费学习资料或内推信息,一定要看到文章最后喔。
内推信息
如果你正在看相关的招聘信息,请加我微信:liuq4360,我这里有很多内推资源等着你,欢迎投递简历。
免费学习资料
如果你想获得更多免费的学习资料,请关注同名公众号【数据与智能】,输入“资料”即可!
学习交流群
如果你想找到组织,和大家一起学习成长,交流经验,也可以加入我们的学习成长群。群里有老司机带你飞,另有小哥哥、小姐姐等你来勾搭!加小姐姐微信:epsila,她会带你入群。
第 1 章 数据科学基本介绍
“数据!数据!!数据!!!”他不耐烦地咆哮着,“巧妇难为无米之炊!”
——阿瑟 • 柯南 • 道尔
1.1 数据的崛起
生活中,数据无处不在。网站会记录每个用户的每次点击。智能手机会记录你每时每刻的位置和速度。“量化自我的人”戴着智能计步器记录自己的心率、运动习惯、饮食习惯和睡眠模式。智能汽车记录驾驶习惯,智能家居记录生活习惯,智能购物设备记录购买习惯。互联网本就是一幅巨大的知识图谱,其中包括(除此之外)有无数交叉引用的百科全书,如电影、音乐、体育赛事、弹球机、表情包、鸡尾酒等特定领域的数据库,以及很多政府部门发布的不计其数的统计数据(其中一些还挺真实的) 充斥在你的头脑中。
在这些数据中隐藏着无数问题的答案,有些问题甚至无人提及。我们将在本书中学习如何找到这些答案。
1.2 什么是数据科学
有一个笑话说,数据科学家是计算机科学家中的统计学家,也是统计学家中的计算机科学家。(哈哈,好像并不好笑。)事实上,一些数据科学家从实际的角度看就是统计学家,而其他数据科学家则与软件工程师没什么区别。有些数据科学家是机器学习专家,有些数据科学家则在机器学习方面知之甚少。有些数据科学家是博士,出版过令人印象深刻的学术作品,而有些数据科学家却从未阅读过学术论文(这有点尴尬)。所以说,无论如何定义数据科学,你都会发现有些数据科学从业者与那些定义完全不相称。
尽管如此,这并不能阻止我们尝试定义数据科学家。我们会说数据科学家是从凌乱的数据中提取有用信息的人。今天,世界各地有无数人在此领域耕耘。
例如,交友网站 OkCupid 要求其会员回答成百上千个问题,以便为他们找到最合适的交友对象。但它也会分析这些听起来无害的问题,比如你可以从某人回答的问题中得出他/她有多可能在第一次约会时和你上床。
Facebook 要求你填写家乡位置和居住位置的信息,表面上是为了让你的朋友更容易找到你并与你联系,但它也会分析这些位置,以研究全球移民模式以及各个橄榄球队的粉丝群的分布情况。
大型零售商 Target 会跟踪你线上和线下的购买习惯和互动习惯。它使用这些数据预测哪些顾客怀孕了,以便更好地向她们推销母婴商品。
2012 年,奥巴马的竞选团队雇用了数十名数据科学家,他们通过数据挖掘和实验的方式来识别需要额外关注的选民,选择最佳的针对特定捐助者的筹款呼吁和方案,并将投票努力集中在最有可能有用的地方。 在 2016 年,特朗普的竞选活动测试了令人震惊的各种在线广告,并分析了这些数据,以找出哪些是有效的,哪些是无效的。
现在,如果你开始觉得上面的例子枯燥,那么让我们看一些更有意义的善举:一些数据科学家偶尔会利用他们的技能提高政府的工作效率,帮助无家可归者,并改善公共健康等。当然,如果你能想出提高广告点击率的好方法,这同样会对你的职业生涯有帮助。
1.3 激励假设:DataSciencester
恭喜!你刚刚被聘请来领导 DataSciencester 的数据科学工作。DataSciencester 是数据科学家的社交网络。
注意
在写本书第 1 版时,我认为“数据科学家的社交网络”是一个有趣而愚蠢的提议。在那之后,人们实际上已经为数据科学家创建了社交网络,并且从风险投资公司那里筹集的资金远远超过我从写书中得到的收益。或许这是一个关于愚蠢的数据科学假设和出版图书的宝贵教训。虽然是为数据科学家服务,但 DataSciencester 从未真正实践数据科学工作。(公正地说,DataSciencester 从未真正构建自己的产品。)这是你的工作!在本书中,我们将通过解决在工作中遇到的实际问题来学习数据科学的概念。我们有时会研究用户直接提供的数据,有时会研究用户与网站交互生成的数据,有时甚至会研究我们自己设计的实验所产生的数据。由于 DataSciencester 具有强大的原创精神,因此我们将从头开始构建自己的工具。完成这些工作后,你会对数据科学的基础知识有一个非常深刻的理解。你能将这项技能应用于更有前景的公司,或者着手解决任何有趣的问题。欢迎加入 DataSciencester,祝你好运!(星期五可以穿牛仔裤上班,卫生间在大厅的右边。)
1.3.1 寻找关键联系人这是你在 DataSciencester 工作的第一天,网络部副总有一堆关于用户的问题没有解决。以前他都没有能讨教的人,现在你来了,他很高兴。具体来说,他希望你确定谁是数据科学家中的“关键联系人”。为此,他为你提供了整个 DataSciencester 用户网络的数据。(在实际工作中,人们通常不会向你提供所需的数据。第 9 章专门讨论了获取数据的方法。)这是些什么样的数据呢?它是一个用户信息列表,每一行都由包含用户 ID(即 id,一串数字)和用户名称(即 name)的字典(dict)组成:
users = [
{ "id": 0, "name": "Hero" },{ "id": 1, "name": "Dunn" },
{ "id": 2, "name": "Sue" },
{ "id": 3, "name": "Chi" },
{ "id": 4, "name": "Thor" },
{ "id": 5, "name": "Clive" },
{ "id": 6, "name": "Hicks" },
{ "id": 7, "name": "Devin" },
{ "id": 8, "name": "Kate" },
{ "id": 9, "name": "Klein" }
]
他还为你提供了“朋友关系”的数据,这是由一对对 ID 组成的列表:
例如,元组 (0, 1) 表示 id 为 0 的数据科学家 Hero 和 id 为 1 的数据科学家 Dunn 是朋友。用户关系网络见图 1-1。
图 1-1:DataSciencester 网络
将朋友关系表示为元组(pairs)的列表并不是最简单的表示方法。如果要找到用户 1 的所有朋友,你必须迭代每个元组对以寻找哪个包含 1。如果你有很多元组对,则会需要很长时间。相反,让我们创建一个 dict,其中键(key)是用户 id,对应的值(value)是朋友 id 的列表。(dict 的查询效率非常高。)
注意
目前不要过于关注代码的细节。第 2 章会涉足一些 Python 的速成课程,但现在只需试着大致了解我们正在做什么即可。
我们仍需要查看每一对元组来创建 dict,但只需执行一次,之后我们将可以方便地查找:
现在 dict 中有了朋友关系的列表,我们可以轻松地根据图中内容来提问,例如:“每个用户平均拥有多少个朋友?”首先通过对所有用户的朋友列表长度求和,来找到连接总数:
然后将其除以用户数:
这样,如果我们找到拥有最多朋友的用户,就找到了拥有最多联系人的用户。
由于用户不多,因此我们也能很容易地按照用户朋友数量从多到少将他们排序:
我们刚刚所做事情的一种解读是,识别人际关系网络中心节点的一种方法。事实上,我们刚刚计算的是度中心性(degree centrality),这是一种网络度量(见图 1-2)。
图 1-2:利用度计算 DataSciencester 的网络大小度中心性很容易计算,但它并不总能给出理想或期望的结果。例如,在 DataSciencester 网络中,Thor(id 为 4)只有 2 个朋友,而 Dunn(id 为 1)有 3 个。然而,在网络关系图上,直觉上认为 Thor 应该更具中心性。在第 22 章中,我们将更详细地研究网络,并探讨更复杂的中心性概念,这些概念可能与我们的直觉一致,也可能不一致。
1.3.2 你可能知道的数据科学家当你正在填写新员工入职表时,人力部副总走到你桌旁。他希望鼓励会员之间建立更多联系,因此要求你设计一个“你可能知道的数据科学家”的提示函数。你的第一直觉是用户可能知道他们朋友的朋友。因此你写了一些代码,依次迭代计算每个用户的朋友信息,并收集其朋友的朋友的信息:
当我们对 user[0](Hero)调用这个函数时,它的结果如下所示:
这个列表中用户 0 出现了两次,因为 Hero 确实是他的两个朋友的朋友。虽然用户 1 和用户 2 已经是 Hero 的朋友,但这个列表中还是包括了用户 1 和用户 2。因为 Chi 可通过两个不同的朋友联系到,所以 3 也出现了两次:
有趣的是,人们能通过多种方式成为朋友的朋友。受此启发,或许我们可以换一种数(count)共同朋友的方式来试着解决这个问题。我们应该排除已成为朋友的用户:
这个结果正确地说明 Chi(id 为 3)与 Hero(id 为 0)有两个共同的朋友,但与 Clive(id 为 5)只有一个共同的朋友。作为一名数据科学家,你知道你可能也喜欢结交拥有共同兴趣的用户。(这是展示数据科学的“专业技能”的一个很好的例子。)在问了一圈人之后,你开始处理数据,设计出如下列表,其中每个元素都是成对的数据 (user_id, interest):
例如,Hero(id 为 0)与 Klein(id 为 9)没有任何共同的朋友,但他们对 Java 和大数据都感兴趣。构建一个函数来查找具有特定兴趣的用户很容易:
这非常有效,但上面的算法每次搜索都需要遍历整个兴趣列表。如果用户很多或用户的兴趣很多(或者我们只是想多进行一些搜索),则最好建立一个从兴趣到用户的索引:
另一个从用户到兴趣的索引:
现在很容易找到与给定用户拥有最多共同兴趣的用户。 1.迭代用户的兴趣。 2.对于每个兴趣,迭代寻找具有该兴趣的其他用户。 3.记录每个用户在每次迭代中出现的次数。代码如下所示:
然后,结合共同的朋友和共同的兴趣,我们可以建立一个更全面的“你可能知道的数据科学家”的特征。第 23 章将继续探讨这类应用。
1.3.3 工资和工作年限你准备去吃午饭时,公共关系部副总问你,是否可以提供一些有关数据科学家收入的有趣信息。工资数据相当敏感,因此他设法为你提供了一个匿名数据集,其中包含每个用户的工资(salary,以美元为单位)和作为数据科学家的工作年限(tenure,以年为单位):
第一步自然是绘制数据的散点图(第 3 章将介绍如何实现),你可以在图 1-3 中看到结果。
图 1-3:基于工作年限的工资图显然,经验丰富的人往往收入更高。怎么才能把这变成一个有趣的事实呢?第一个想法是查看每个任期的平均工资:
事实证明这并不是特别有说服力,因为任意两个用户的工作年限都不同,这意味着我们只是报告了用户的个人工资状况:
可能把工作年限分组以后会更有意义:
然后可以将每个组对应的工资合并在一起:
最后计算每组的平均工资:
这个结果看起来更有趣:
现在你可以说:“拥有 5 年以上工作经验的数据科学家比新人收入高 65% !”但是,我们是以非常随意的方式分组的。我们原本希望说明的是多一年工作经验对平均工资的影响。除了发现一个更有趣的现象外,这使我们能够对不知道的工资做出预测。第 14 章将探讨这个想法。1.3.4 付费账户当你回到办公桌前,收益部副总正在等你。他希望更好地了解哪些用户会为账户付款,哪些用户不会。(他知道用户的名字,但这不是特别有用。)你注意到多年经验与付费账户之间似乎存在某种对应关系:
工作经验很少和工作经验丰富的用户倾向于付费,而有一些工作经验的用户则不会。因此,如果你想创建一个模型——即使这些数据不足以建立模型——你可能会尝试将工作经验很少和工作经验丰富的用户预测为“付费”,而将有一些经验的用户预测为“不付费”:
当然,我们会持续关注这个人工经验模型。随着更多数据(和更多数学知识)的引入,我们可以建立一个模型,根据用户的工作年限预测他付费的可能性。第 16 章将研究这类问题。
1.3.5 感兴趣的主题
当你正准备结束第一天的工作时,内容策略部副总来向你要数据,他想了解用户最感兴趣的主题,以便可以相应地规划他的博客日历。你已拥有来自朋友推荐项目的原始数据:
找到最受欢迎的兴趣的一种简单(并不是特别令人兴奋)的方法是计算兴趣词汇的个数: 1.小写每个兴趣(因为不同的用户可能不会小写他们的兴趣); 2.将其分成单词; 3.数结果。代码如下所示:
这样可以轻松列出多次出现的单词:
它给出了你期望的结果(除非你期望“scikit-learn”被分成两个单词,那样就不会得到预期的结果了):
第 21 章将介绍从数据中提取主题的更复杂的方法。
1.3.6 展望第一天非常成功!你一定很累,赶紧在有人继续问问题之前回家吧。晚上好好休息,明天要参加新员工入职培训。(是的,在入职培训前,你已工作了一整天。明天去人力资源部报到吧。)
版权声明: 本文为 InfoQ 作者【数据与智能】的原创文章。
原文链接:【http://xie.infoq.cn/article/38f0657d32c0c02249094281e】。文章转载请联系作者。
评论