构建你的数据科学作品集:用数据讲故事(下)
数据科学公司们在决定雇佣一个人时越来越看重其作品集。其中一个原因就是作品集是分析一个人真实技能的最好方式。-- Vik Paruchuri
本文导航? 用数据讲故事02%? 为你的数据科学工程选择一个主题03%? 选择主题05%? 补充数据07%? 获取背景信息11%? 理解数据11%? 统一数据30%? 加入问卷36%? 精简数据集42%? 精简其它数据集49%? 计算变量51%? 合并数据集69%? 添加值71%? 计算关联73%? 设置上下文79%? 区域级别映射81%? 挖掘注册学生数与SAT分数84%? 挖掘英语学习者和 SAT 成绩87%? 关联问卷分数和 SAT 分数89%? 挖掘种族和 SAT 分数90%? SAT 分数上的性别差异92%? AP 成绩95%? 包装故事97%? 下一步98%编译自 | http://www.dataquest.io/blog/, how=join_type)
full.shape
survey
0
ap_2010
1
sat_results
0
class_size
0
demographics
0
graduation
0
hs_directory
0
Out[75]:
(374, 174)
添加值
现在我们有了我们的 full 数据框架,我们几乎拥有分析需要的所有数据。虽然这里有一些缺少的部分。我们可能将AP[26] 考试结果与 SAT 成绩相关联,但是我们首先需要将这些列转化为数字,然后填充缺失的数据。
In [76]:
cols = ["AP Test Takers ", "Total Exams Taken", "Number of Exams with scores 3 4 or 5"]
for col in cols:
full[col] = full[col].convert_objects(convert_numeric=True)
full[cols] = full[cols].fillna(value=http://www.gunmi.cn/v/0)
然后我们将需要计算表示学校所在学区的 school_dist列。这将是我们匹配学区并且使用我们之前下载的区域地图画出地区级别的地图。
In [77]:
full["school_dist"] = full["DBN"].apply(lambda x: x[:2])
最终,我们将需要用该列的平均值填充缺失的数据到 full 中。那么我们就可以计算关联了:
In [79]:
full = full.fillna(full.mean())
计算关联
一个挖掘数据并查看哪些列与你所关心的问题有联系的好方法来就是计算关联。这将告诉你哪列与你所关心的列更加有关联。你可以通过 Pandas DataFrames 的 corr[27] 方法来完成。越接近 0 则关联越小。越接近 1 则正相关越强,越接近 -1 则负关联越强:
In [80]:
full.corr()["sat_score"]
Out[80]:
Year NaN
Number Tested 8.127817e-02
rr_s 8.484298e-02
rr_t -6.604290e-02
rr_p 3.432778e-02
N_s 1.399443e-01
N_t 9.654314e-03
N_p 1.397405e-01
saf_p_11 1.050653e-01
com_p_11 2.107343e-02
eng_p_11 5.094925e-02
aca_p_11 5.822715e-02
saf_t_11 1.206710e-01
com_t_11 3.875666e-02
eng_t_10 NaN
aca_t_11 5.250357e-02
saf_s_11 1.054050e-01
com_s_11 4.576521e-02
eng_s_11 6.303699e-02
aca_s_11 8.015700e-02
saf_tot_11 1.266955e-01
com_tot_11 4.340710e-02
eng_tot_11 5.028588e-02
aca_tot_11 7.229584e-02
AP Test Takers 5.687940e-01
Total Exams Taken 5.585421e-01
Number of Exams with scores 3 4 or 5 5.619043e-01
SAT Critical Reading Avg. Score 9.868201e-01
SAT Math Avg. Score 9.726430e-01
SAT Writing Avg. Score 9.877708e-01
...
SIZE OF SMALLEST CLASS 2.440690e-01
SIZE OF LARGEST CLASS 3.052551e-01
SCHOOLWIDE PUPIL-TEACHER RATIO NaN
schoolyear NaN
frl_percent -7.018217e-01
total_enrollment 3.668201e-01
ell_num -1.535745e-01
ell_percent -3.981643e-01
sped_num 3.486852e-02
sped_percent -4.413665e-01
asian_num 4.748801e-01
asian_per 5.686267e-01
black_num 2.788331e-02
black_per -2.827907e-01
hispanic_num 2.568811e-02
hispanic_per -3.926373e-01
white_num 4.490835e-01
white_per 6.100860e-01
male_num 3.245320e-01
male_per -1.101484e-01
female_num 3.876979e-01
female_per 1.101928e-01
Total Cohort 3.244785e-01
grade_span_max -2.495359e-17
expgrade_span_max NaN
zip -6.312962e-02
total_students 4.066081e-01
number_programs 1.166234e-01
lat -1.198662e-01
lon -1.315241e-01
Name: sat_score, dtype: float64
这给了我们一些我们需要探索的内在规律:
? total_enrollment 与 sat_score 强相关,这是令人惊讶的,因为你曾经认为越小的学校越专注于学生就会取得更高的成绩。? 女生所占学校的比例(female_per) 与 SAT 成绩呈正相关,而男生所占学生比例(male_per)成负相关。? 没有问卷与 SAT 成绩成正相关。? SAT 成绩有明显的种族不平等(white_per、asian_per、black_per、hispanic_per)。? ell_percent 与 SAT 成绩明显负相关。每一个条目都是一个挖掘和讲述数据故事的潜在角度。
设置上下文
在我们开始数据挖掘之前,我们将希望设置上下文,不仅为了我们自己,也是为了其它阅读我们分析的人。一个好的方法就是建立挖掘图表或者地图。因此,我们将在地图标出所有学校的位置,这将有助于读者理解我们所探索的问题。
在下面的代码中,我们将会:
? 建立纽约市为中心的地图。? 为城市里的每所高中添加一个标记。? 显示地图。In [82]:
import folium
from folium import plugins
schools_map = folium.Map(location=[full["lat"].mean(), full["lon"].mean()], zoom_start=10)
marker_cluster = folium.MarkerCluster().add_to(schools_map)
for name, row in full.iterrows():
folium.Marker([row["lat"], row["lon"]], popup="{0}: {1}".format(row["DBN"], row["school_name"])).add_to(marker_cluster)
schools_map.create_map("schools.html")
schools_map
Out[82]:
这个地图十分有用,但是不容易查看纽约哪里学校最多。因此,我们将用热力图来代替它:
In [84]:
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
Out[84]:
区域级别映射
热力图能够很好的标出梯度,但是我们将需要更结构化的画出不同城市之间的 SAT 分数差距。学区是一个图形化这个信息的很好的方式,就像每个区域都有自己的管理者。纽约市有数十个学区,并且每个区域都是一个小的地理区域。
我们可以通过学区来计算 SAT 分数,然后将它们画在地图上。在下面的代码中,我们将会:
? 通过学区对 full 进行分组。? 计算每个学区的每列的平均值。? 去掉 school_dist 字段头部的 0,然后我们就可以匹配地理数据了。In [ ]:
district_data = http://www.gunmi.cn/v/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[28] 中的数据,转化为每个区域的形状,然后通过 school_dist 列对每个区域图形和 SAT 成绩进行匹配。最终我们将创建一个图形:
In [85]:
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=http://www.gunmi.cn/v/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")
Out[85]:
挖掘注册学生数与SAT分数
现在我们已经依地区画出学校位置和 SAT 成绩确定了上下文,浏览我们分析的人将会对数据的上下文有更好的理解。现在我们已经完成了基础工作,我们可以开始从我们上面寻找关联时所提到的角度分析了。第一个分析角度是学校注册学生人数与 SAT 成绩。
我们可以通过所有学校的注册学生与 SAT 成绩的散点图来分析。
In [87]:
%matplotlib inline
full.plot.scatter(x="total_enrollment", y="sat_score")
Out[87]:
<matplotlib.axes._subplots.AxesSubplot at 0x10fe79978>
如你所见,底下角注册人数较低的部分有个较低 SAT 成绩的聚集。这个集群以外,SAT 成绩与全部注册人数只有轻微正相关。这个画出的关联显示了意想不到的图形.
我们可以通过获取低注册人数且低SAT成绩的学校的名字进行进一步的分析。
In [88]:
full[(full["total_enrollment"] < 1000) & (full["sat_score"] < 1000)]["School Name"]
Out[88]:
34 INTERNATIONAL SCHOOL FOR LIBERAL ARTS
143 NaN
148 KINGSBRIDGE INTERNATIONAL HIGH SCHOOL
203 MULTICULTURAL HIGH SCHOOL
294 INTERNATIONAL COMMUNITY HIGH SCHOOL
304 BRONX INTERNATIONAL HIGH SCHOOL
314 NaN
317 HIGH SCHOOL OF WORLD CULTURES
320 BROOKLYN INTERNATIONAL HIGH SCHOOL
329 INTERNATIONAL HIGH SCHOOL AT PROSPECT
331 IT TAKES A VILLAGE ACADEMY
351 PAN AMERICAN INTERNATIONAL HIGH SCHOO
Name: School Name, dtype: object
在 Google 上进行了一些搜索确定了这些学校大多数是为了正在学习英语而开设的,所以有这么低注册人数(规模)。这个挖掘向我们展示了并不是所有的注册人数都与 SAT 成绩有关联 - 而是与是否将英语作为第二语言学习的学生有关。
挖掘英语学习者和 SAT 成绩
现在我们知道英语学习者所占学校学生比例与低的 SAT 成绩有关联,我们可以探索其中的规律。ell_percent 列表示一个学校英语学习者所占的比例。我们可以制作关于这个关联的散点图。
In [89]:
full.plot.scatter(x="ell_percent", y="sat_score")
Out[89]:
<matplotlib.axes._subplots.AxesSubplot at 0x10fe824e0>
看起来这里有一组学校有着高的 ell_percentage 值并且有着低的 SAT 成绩。我们可以在学区层面调查这个关系,通过找出每个学区英语学习者所占的比例,并且查看是否与我们的学区层面的 SAT 地图所匹配:
In [90]:
show_district_map("ell_percent")
Out[90]:
我们可通过两个区域层面地图来查看,一个低 ELL(English-language)学习者比例的地区更倾向有高 SAT 成绩,反之亦然。
关联问卷分数和 SAT 分数
学生、家长和老师的问卷结果如果与 SAT 分数有很大的关联的假设是合理的。就例如具有高学术期望的学校倾向于有着更高的 SAT 分数是合理的。为了测这个理论,让我们画出 SAT 分数和多种问卷指标:
In [91]:
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()
Out[91]:
<matplotlib.axes._subplots.AxesSubplot at 0x114652400>
惊人的是,关联最大的两个因子是 N_p 和 N_s,它们分别是家长和学生回应的问卷。都与注册人数有着强关联,所以很可能偏离了 ell_learner。此外指标关联最强的就是 saf_t_11,这是学生、家长和老师对学校安全程度的感知。这说明了,越安全的学校,更能让学生在环境里安心学习。然而其它因子,像互动、交流和学术水平都与 SAT 分数无关,这也许表明了纽约在问卷中问了不理想的问题或者想错了因子(如果他们的目的是提高 SAT 分数的话)。
挖掘种族和 SAT 分数
其中一个角度就是调查种族和 SAT 分数的联系。这是一个大相关微分,将其画出来帮助我们理解到底发生了什么:
In [92]:
full.corr()["sat_score"][["white_per", "asian_per", "black_per", "hispanic_per"]].plot.bar()
Out[92]:
<matplotlib.axes._subplots.AxesSubplot at 0x108166ba8>
看起来更高比例的白种和亚洲学生与更高的 SAT 分数有关联,而更高比例的黑人和西班牙裔与更低的 SAT 分数有关联。对于西班牙学生,这可能因为近年的移民还是英语学习者的事实。我们可以标出学区层面的西班牙裔的比例并观察联系。
In [93]:
show_district_map("hispanic_per")
Out[93]:
看起来这里与英语学习者比例有关联,但是有必要对这种和其它种族在 SAT 分数上的差异进行挖掘。
SAT 分数上的性别差异
挖掘性别与 SAT 分数之间的关系是最后一个角度。我们注意更高的女生比例的学校倾向于与更高的 SAT 分数有关联。我们可以可视化为一个条形图:
In [94]:
full.corr()["sat_score"][["male_per", "female_per"]].plot.bar()
Out[94]:
<matplotlib.axes._subplots.AxesSubplot at 0x10774d0f0>
为了挖掘更多的关联性,我们可以制作一个 female_per 和 sat_score 的散点图:
In [95]:
full.plot.scatter(x="female_per", y="sat_score")
Out[95]:
<matplotlib.axes._subplots.AxesSubplot at 0x104715160>
看起来这里有一个高女生比例、高 SAT 成绩的簇(右上角)(LCTT 译注:此处散点图并未有如此迹象,可能数据图有误)。我们可以获取簇中学校的名字:
In [96]:
full[(full["female_per"] > 65) & (full["sat_score"] > 1400)]["School Name"]
Out[96]:
3 PROFESSIONAL PERFORMING ARTS HIGH SCH
92 ELEANOR ROOSEVELT HIGH SCHOOL
100 TALENT UNLIMITED HIGH SCHOOL
111 FIORELLO H. LAGUARDIA HIGH SCHOOL OF
229 TOWNSEND HARRIS HIGH SCHOOL
250 FRANK SINATRA SCHOOL OF THE ARTS HIGH SCHOOL
265 BARD HIGH SCHOOL EARLY COLLEGE
Name: School Name, dtype: object
使用 Google 进行搜索可以知道这些是专注于表演艺术的精英学校。这些学校有着更高比例的女生和更高的 SAT 分数。这可能解释了更高的女生比例和 SAT 分数的关联,并且相反的更高的男生比例与更低的 SAT 分数。
AP 成绩
至今,我们关注的是人口统计角度。还有一个角度是我们通过数据来看参加高阶测试(AP)的学生和 SAT 分数。因为高学术成绩获得者倾向于有着高的 SAT 分数说明了它们是有关联的。
In [98]:
full["ap_avg"] = full["AP Test Takers "] / full["total_enrollment"]
full.plot.scatter(x="ap_avg", y="sat_score")
Out[98]:
<matplotlib.axes._subplots.AxesSubplot at 0x11463a908>
看起来它们之间确实有着很强的关联。有趣的是右上角高 SAT 分数的学校有着高的 AP 测试通过比例:
In [99]:
full[(full["ap_avg"] > .3) & (full["sat_score"] > 1700)]["School Name"]
Out[99]:
92 ELEANOR ROOSEVELT HIGH SCHOOL
98 STUYVESANT HIGH SCHOOL
157 BRONX HIGH SCHOOL OF SCIENCE
161 HIGH SCHOOL OF AMERICAN STUDIES AT LE
176 BROOKLYN TECHNICAL HIGH SCHOOL
229 TOWNSEND HARRIS HIGH SCHOOL
243 QUEENS HIGH SCHOOL FOR THE SCIENCES A
260 STATEN ISLAND TECHNICAL HIGH SCHOOL
Name: School Name, dtype: object
通过 google 搜索解释了那些大多是高选择性的学校,你需要经过测试才能进入。这就说明了为什么这些学校会有高的 AP 通过人数。
包装故事
在数据科学中,故事不可能真正完结。通过向其他人发布分析,你可以让他们拓展并且运用你的分析到他们所感兴趣的方向。比如在本文中,这里有一些角度我们没有完成,并且可以探索更加深入。
一个开始讲述故事的最好方式就是尝试拓展或者复制别人已经完成的分析。如果你觉得采取这个方式,欢迎你拓展这篇文章的分析,并看看你能发现什么。如果你确实这么做了,请在下面评论,那么我就可以看到了。
下一步
如果你做的足够多,你看起来已经对用数据讲故事和构建你的第一个数据科学作品集有了很好的理解。一旦你完成了你的数据科学工程,发表在 Github 上是一个好的想法,这样别人就能够与你一起合作。
如果你喜欢这篇文章,你可能希望阅读我们‘Build a Data Science Portfolio’系列文章的其它部分:
? 如何搭建一个数据科学博客[30]? 建立一个机器学习工程[31]? 构建一个将帮助你找到工作的数据科学作品集的关键[32]? 17 个你能找到其它数据科学工程数据集的地方[33]? 怎样在 GitHub 上展示你的数据科学作品集[34]via: http://www.dataquest.io/blog/ src="http://img5.shadafang.com/img.php?http://mmbiz.qpic.cn/mmbiz_jpg/W9DqKgFsc6ibOCQvsMUrpL7lWYU6mVNSYugwN5Mo5X1gw6ibqmx1QpfKYknFKV8GK1ib8nY47QHhcgwzyeslFkNuQ/0?wx_fmt=jpeg" />
Yoo-4x共计翻译:2 篇贡献时间:97 天
推荐文章
< 左右滑动查看相关文章 >
点击图片、输入文章 ID 或识别二维码直达
原文链接请访问“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。- 阿里自研分布式强一致关系型数据库——X-DB
- 邬贺铨:卖设备不如做服务,做服务不如做互联网
- 12月15日台州房产交易数据.
- 紧急提醒!深圳人年底最需要关注这9件事!件件都与你的钱袋子有
- 皮蓬:詹姆斯荣誉虽不及乔丹 但数据已超越篮球之神
- 最权威的2017全球挖机产销数据!日本竟然生产了全球40%的挖机…
- 最嫩滑的豆腐吃法 ,绝对挑逗你的食欲
- 五连红,近期18中14,2017-12-15周五竞彩大数据分析
- 超级数据暴赚后,投资心态回归理智!
- 【梦工厂招聘1138】渤海证券股份有限公司期待你的加入!