banner

如何打造数据科学作品集:用数据讲故事

作者: afenxi来源: afenxi时间:2017-06-15 16:32:310

摘要:怎样打造你的数据科学作品集?

这是「如何打造数据科学作品集」系列教程的第一篇。如果觉得不错,可以订阅我们第一时间获取最新更新。这个系列的文章都很长,建议先收藏再找时间详细阅读。如果你觉得译文读起来不舒服,可以点此阅读原文,并给我们提些改建建议。

如何打造数据科学作品集:用数据讲故事-数据分析网

数据科学公司在招聘时越来越看重个人作品集,原因在于作品集是衡量实际能力最好的方式之一。好消息是,你完全掌控着自己的作品集。如果付出一些努力,你就可以打造一套令用人单位印象深刻的高质量作品集。

想要打造高质量作品集,第一步需要搞清楚应该在作品中展现什么能力。公司希望数据科学家具备的能力(也就是他们希望作品集能够展示的能力)包括:

沟通能力 与他人协作能力 技术能力 数据推断能力 主观能动性

一个好的作品集一般由多个项目构成,每一个项目展示以上 1-2 个能力点。本文是教你怎样打造一个全面的数据科学作品系列的第一篇。我们将介绍怎样打造作品集中的第一个项目,怎样使用数据讲述一个有效的故事。本篇结束时,你将拥有一个展示沟通能力和数据推断能力的数据科学项目。

用数据讲故事

数据科学的本质是沟通。你通过数据得到了一些洞察,然后采用有效的方式将其传播给他人,并向其推销你的解决方案。可见使用数据来讲述一个有效的故事,是数据科学家最重要的技能之一。一个有效的故事可以使你的洞察更有说服力,同时能帮助他人理解你的观点。

数据科学中的故事需要围绕着你发现了什么,怎么发现的,意味着什么进行讲述。举个例子,你发现公司利润去年下降了25%。仅仅阐述这个事实是不够的,你必须说明为什么利润会下降,可以通过什么方式来解决。

用数据讲故事的要点如下:

搞清楚并且设置故事的上下文 从多个角度进行探索 有说服力的形象化展示 使用多种数据源 叙述的一致性

这里最有效的工具是 Jupyter notebook。如果你对此不是很熟悉,请参考这个教程。Jupyter notebook 允许你交互式的探索数据,支持将结果分享到多个网站,包括 Github 。通过分享,他人可以很好的与你协作,并扩充你的成果。

我们会在文中使用 Jupyter notebook 以及一些 Python 数据科学库,如 Pandas 和 matplotlib。

选择项目主题

创建项目的第一步是决定主题。你需要选择感兴趣且有动力去研究的题目。我们都知道为了做项目而做,还是真的感兴趣去做,这之间有巨大区别。因此这一步值得多花点功夫,确保能够找到真正感兴趣的东西。

寻找题目的一个好办法是浏览不同的数据集,看看有什么有趣的东西。这里推荐一些好的站点:

Data.gov – 包含政府信息。 /r/datasets – 一个reddit的子集拥有非常多的有趣数据集。 Awesome datasets – Github上的一些数据集。 rs.io – 一个很棒的Blog,发布了很多有趣的数据。

一般现实中,你拿到的经常不是一个完美的单个数据集。通常需要聚合不同的数据源,或者做大量的数据清理工作。当选题对你来说真的非常有意思,多花点时间去处理数据是非常值得的,同时在这个过程中你也可以炫耀一下技能。

本文我们使用纽约市公立学校的数据,你可以在这里得到它们。

选定题目

能够从一而终的完成项目是非常重要的。因此,限制项目的范围非常关键,这可以让我们清楚地知道我们可以完成它。

本文中,我们着眼于美国高中生的SAT 成绩以及其他统计数据来做数据分析。SAT(Scholastic Aptitude Test) 是美国高中生申请大学前参加的一项考试。大学在作出是否入取决定时会参考考试成绩。这个考试分为三个部分,每部分 800 分,总分 2400 (虽然总分曾改来改去很多次,但在这个数据集里仍是2400)。各高中经常以 SAT 的平均成绩进行排名,SAT 成绩高代表着这个学区的高品质。

有人提出 SAT 对美国的某些种族人群不公平,因此对纽约市的数据进行分析可以帮组我们进一步搞清楚 SAT 考试的公平性。

从这里获得SAT数据及各高中数据。这将是项目的基础,但是我们还需要更多的信息来确保有说服力的分析。

补充数据

一旦找到了好题目,接下来去多找一些有助于这个题目或者能使你更进一步深入研究的数据集。最好提前准备,以便在开始建立项目前拥有尽可能多的数据。通常过少的数据意味着过早的放弃项目。

在这个项目里,某个网站上就有多个相关数据集,包括了生源统计信息以及测试分数等。

这里是所有将使用数据集的链接:

按学校排列的 SAT 成绩 – 纽约市每所高中的 SAT 成绩。 学校招生情况 – 纽约市每所学校的招生数据。 数学考试成绩 – 纽约市每所学校的数学测试成绩。 班级大小 – 纽约市每所学校班级规模数据。 AP 考试成绩 – AP(Advanced Placement)考试成绩,通过 AP 考试可以获得大学学分。 毕业数据 – 毕业学生比例,以及其他信息。 生源信息 – 每所学校的生源统计信息。 学校调查 – 每所学校的父母,老师,学生的调查报告。 学区地图 – 包含学区的地理分布信息,此数据帮助我们绘图。

所有的这些数据集是相互关联的,我们可以在分析前先组合他们。

获取背景信息

在深入分析数据之前,调查一些背景信息非常有用。本例中,我们已知一些非常有用的信息:

纽约市有五个区,各自是独立的区域。 所有学校分布在各个学区里,每个区包含数十个学校。 数据集里的学校并非都是高中,因此我们需要做一些数据清理工作。 每所有学校都有一个DBN (District Borough Number)唯一编号。 通过聚合每个区的数据,我们可以绘制出各个区域之间的差异。 理解数据

为了能够真正理解这些数据的上下文,你要花点时间去探索数据。上面每个链接都有一些关于数据及相关列的描述。我们手里有高中生的 SAT 成绩,以及生源信息等其他数据集。

我们可以执行代码来读取数据。使用 Jupyter notebook 来探索这些数据,下面的代码将:

遍历每个下载的数据文件 把文件数据读入到Pandas DataFrame 将 DataFrame 统一放入一个Python字典

import pandas import numpy as np files = ["ap_2010.csv", "class_size.csv", "demographics.csv", "graduation.csv", "hs_directory.csv", "math_test_results.csv", "sat_results.csv"] data = ".format(row["DBN"], row["school_name"])).add_to(marker_cluster) schools_map.save(schools.html) schools_map 如何打造数据科学作品集:用数据讲故事-数据分析网

这幅地图很有帮助,但很难看出哪个地区的学校最多。因此,我们制作一副热力图:

schools_heatmap = folium.Map(location=[full[lat].mean(), full[lon].mean()], zoom_start=10) schools_heatmap.add_children(plugins.HeatMap([[row["lat"], row["lon"]] for name, row in full.iterrows()])) schools_heatmap.save("heatmap.html") schools_heatmap 如何打造数据科学作品集:用数据讲故事-数据分析网 学区地图绘制

热力图对于绘制梯度差异很方便,但是我们希望使用更加结构化的方式,来绘制城市中不同学校 SAT 成绩的区别。学区是一个很好的可视化选择,因为每个学期的管理各异。纽约市有数十个学期,每个学区就是一个小的地理范围。

我们可以根据学期计算 SAT 成绩,然后将其绘制到地图上。在下面的代码中,我们将:

根据学区对 full 进行分组 计算每个学区的行均值 删除 school_dist 字段中的前导 0 ,方便与地理区域数据进行匹配

district_data = full.groupby("school_dist").agg(np.mean) district_data.reset_index(inplace=True) district_data["school_dist"] = district_data["school_dist"].apply(lambda x: str(int(x)))

现在我们可以绘制每个学区的平均 SAT 成绩了。为此,我们读取 GeoJSON 格式的数据,获取每个学区的形状,然后通过 school_dist 列将 SAT 成绩与学区形状关联在一起,最后绘制出想要的图形:

def show_district_map(col): geo_path = schools/districts.geojson districts = folium.Map(location=[full[lat].mean(), full[lon].mean()], zoom_start=10) districts.geo_json( geo_path=geo_path, data=district_data, columns=[school_dist, col], key_on=feature.properties.school_dist, fill_color=YlGn, fill_opacity=0.7, line_opacity=0.2, ) districts.save("districts.html") return districts show_district_map("sat_score") 如何打造数据科学作品集:用数据讲故事-数据分析网 入学率与 SAT 成绩

绘制完每个学员的位置,并按学区绘制出 SAT 成绩之后,我们就设定了分析的上下文。阅读我们分析报告的人将能更好地理解数据集背后的上下文。接来下,我们进行此前提到的分析。第一个是学校的学生数量与 SAT 成绩之间的关系。

可以使用散点图,来比较学校的入学率和 SAT 成绩。

%matplotlib inline full.plot.scatter(x=total_enrollment, y=sat_score) 如何打造数据科学作品集:用数据讲故事-数据分析网

我们发现,左下方有大量的数据点聚集,表示低入学率低 SAT 成绩。除此之外,SAT 成绩和总入学率之间似乎只有一点正相关。将相关性绘制出来可以发现意想不到的规律。

我们可以获取低入学率、低 SAT 成绩的学校名称,进行进一步的探索。

full[(full["total_enrollment"] < 1000) & (full["sat_score"] < 1000)]["School Name"] 如何打造数据科学作品集:用数据讲故事-数据分析网

谷歌搜索结果显示,这些学校中大多数是针对正在学习英语的学生,因此入学率也低。这一结果告诉我们,并不是说总入学率与 SAT 成绩相关,而是学校中的学生是否以英语为第二外语。

英语学生与 SAT 成绩

既然我们知道了一个学习中英语学生的比例与较低的 SAT 成绩相关,可以进一步作探索。ell_percent 列是每个学校中英语学生的比例。我们绘制一副散点图来分析二者之间的关系。

full.plot.scatter(x=ell_percent, y=sat_score) 如何打造数据科学作品集:用数据讲故事-数据分析网

看上去有一些学校的英语学生比例很高,同时平均 SAT 成绩却很低。我们可以从学区层面对此进行调查,弄清每个学区中英语学生的比例,然后检查是否与根据学区绘制的 SAT 成绩图相匹配。

show_district_map("ell_percent") 如何打造数据科学作品集:用数据讲故事-数据分析网

从中可以看出,英语学生比例低的学区,SAT 成绩一般比较高,反之亦然。

调查分数与 SAT 成绩

我们可以合理地假设,学生、家长和老师调查的结果与 SAT 成绩与较大的相关性。成绩预期高的学校一般 SAT 成绩也高。为了验证该假设,我们结合 SAT 成绩和各种调查结果进行绘图:

full.corr()["sat_score"][["rr_s", "rr_t", "rr_p", "N_s", "N_t", "N_p", "saf_tot_11", "com_tot_11", "aca_tot_11", "eng_tot_11"]].plot.bar() 如何打造数据科学作品集:用数据讲故事-数据分析网

令人意外的是,相关性最高的两个因素是 N_p 和 N_s,即参与调查的家长和学生的数量。二者与总入学率之间均呈强相关性,因此可能会受到 ell_learners 的影响。相关性强的其他指标是 saf_t_11 。这是学生、家长和老师对学校安全性的评价。一所学校越安全,学生更容易安心在其中学习。但是沟通、成绩预期等其他因素与 SAT 成绩之间没有任何相关性。这或许说明纽约市在调查时的问题设计不妥,或者是调查因子就不正确(如果他们的目标是提高 SAT 成绩的话)。

种族和 SAT 成绩

还有一个分析角度,就是种族和 SAT 成绩。二者之间有很大的相关性,可视化后将有助于理解背后的原因:

full.corr()["sat_score"][["white_per", "asian_per", "black_per", "hispanic_per"]].plot.bar() 如何打造数据科学作品集:用数据讲故事-数据分析网

结果显示,白人和亚洲学生的比例越高,SAT 成绩就越高,而黑人和拉美裔学生比例越高,SAT 成绩就越低。对于拉美裔学生来说,原因可能是近来移民的数量较大,其中多为英语学生。我们可以按地区绘制拉美裔的比例,来验证相关性。

show_district_map("hispanic_per") 如何打造数据科学作品集:用数据讲故事-数据分析网

拉美裔比例似乎和英语学生比例之间有一定相关性,但是要确定的话则需要做深入的分析和研究。

性别差别与 SAT 成绩

最后一个分析角度是性别与SAT 成绩。我们注意到女性比例更高的学校有更高的 SAT 成绩。我们可以用一个柱状图来呈现:

full.corr()["sat_score"][["male_per", "female_per"]].plot.bar() 如何打造数据科学作品集:用数据讲故事-数据分析网

为了挖掘更多信息,我们以 female_per 和 sat_score 列为轴绘制散点图:

full.plot.scatter(x=female_per, y=sat_score) 如何打造数据科学作品集:用数据讲故事-数据分析网

在图中,我们发现了一些拥有高比例女性和高 SAT 分数的学校。可以这样获取这些学校的名字:

full[(full["female_per"] > 65) & (full["sat_score"] > 1400)]["School Name"] 如何打造数据科学作品集:用数据讲故事-数据分析网

谷歌搜索显示,这些学校属于表演艺术的精英学校。所以可以同时解释这些学校有较高的女性占比以及较高的 SAT 分数。

AP 成绩

目前为止,我们已经考虑了生源方面的分析角度。另一个方向是研究学生参加 AP 考试与SAT 成绩的关系。二者之间应该是相关的,学习成绩好的学生,SAT 成绩也应更高。

full["ap_avg"] = full["AP Test Takers "] / full["total_enrollment"] full.plot.scatter(x=ap_avg, y=sat_score) 如何打造数据科学作品集:用数据讲故事-数据分析网

看起来二者之间确实是正相关。右上方的学校很有趣,他们的 SAT 成绩很高,学生参加 AP 考试的比例也很高。

full[(full["ap_avg"] > .3) & (full["sat_score"] > 1700)]["School Name"] 如何打造数据科学作品集:用数据讲故事-数据分析网

谷歌搜索显示,它们大多数属于需要考试才能入学的名牌学校。所以这些学校有高的 AP 考试比例也是理所当然的。

故事总结

数据科学的世界里,故事绝不会完全结束。把你的分析分享给其他人,别人可以就任何感兴趣的方向进一步扩充和塑造你的分析。比如本文中就有很多你可以继续进行挖掘的方向。

入门用数据来讲故事最好的方式,就是尝试扩充或者复制其他人的分析。如果你决定这么做,非常欢迎你扩展本文的分析,来看看你还会有什么发现。如果你这么做了,请在下面留言。

下一步

如果你已经学到这里了,代表你已经理解如何用数据讲故事和怎样打造你的数据科学作品集。一旦你完成了你的数据科学项目,请将它传到 Github,这样别人就可以与你协作了。

作者:Vik Paruchuri

译者:Nick Tang

校对:EarlGrey

出品:PythonTG 翻译组/编程派

banner
看过还想看
可能还想看
热点推荐

永洪科技
致力于打造全球领先的数据技术厂商

申请试用
Copyright © 2012-2024开发者:北京永洪商智科技有限公司版本:V10.2
京ICP备12050607号-1京公网安备110110802011451号 隐私政策应用权限