国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

打造數據科學作品集:用數據講故事

yankeys / 628人閱讀

摘要:作者譯者校對出品翻譯組編程派這是如何打造數據科學作品集系列教程的第一篇。我們將介紹怎樣打造作品集中的第一個項目,怎樣使用數據講述一個有效的故事。班級大小紐約市每所學校班級規模數據。

作者:Vik Paruchuri
譯者:Nick Tang
校對:EarlGrey
出品:PythonTG 翻譯組/編程派

這是「如何打造數據科學作品集」系列教程的第一篇。如果覺得不錯,可以訂閱我們第一時間獲取最新更新。這個系列的文章都很長,建議先收藏再找時間詳細閱讀。如果你覺得譯文讀起來不舒服,可以點此閱讀原文,并給我們提些改建建議。

數據科學公司在招聘時越來越看重個人作品集,原因在于作品集是衡量實際能力最好的方式之一。好消息是,你完全掌控著自己的作品集。如果付出一些努力,你就可以打造一套令用人單位印象深刻的高質量作品集。

想要打造高質量作品集,第一步需要搞清楚應該在作品中展現什么能力。公司希望數據科學家具備的能力(也就是他們希望作品集能夠展示的能力)包括:

溝通能力

與他人協作能力

技術能力

數據推斷能力

主觀能動性

一個好的作品集一般由多個項目構成,每一個項目展示以上 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 = {}
for f in files:
    d = pandas.read_csv("schools/{0}".format(f))
    data[f.replace(".csv", "")] = d

數據讀入后,我們可以在 DataFrames 上使用 head 方法打印前 5 行數據:

for k,v in data.items():
    print("
" + k + "
")
    print(v.head())

可以發現數據集中的一些明顯特征:

大多數數據集包含 DBN 列。

一些字段對繪圖有用,特別是 Location 1,其中包含了坐標信息。

一些數據集似乎包含一個學校的多條信息(重復的 DBN ),這意味著我們必須做一些預處理。

統一數據

為了更容易的處理數據,我們需要將所有的單個數據集集中到一個數據集里。這樣可以讓我們更快的比較數據集之間的列。為了做到這一點,第一步我們需要找到一個統一的公共列。從上面的輸出結果來看,你會發現 DBN 出現在大多數的數據集里,看起來可以用作公共列。

如果我們谷歌一下 DBN New York City Schools,會找到這個頁面,解釋了 DBN 是每一個學校的唯一編號。當我們探索數據集,特別是政府數據集時,為了搞清楚每一個列的意思,做一些調查工作是必不可少的。

現在有個問題,class_sizehs_directory 數據集沒有發現 DBN 字段。hs_directory 數據集只有 dbn 字段,我們可以通過重命名這個列或者把它拷貝到一個DBN 的新列來解決。而對 class_size 數據集,我們需要采用其他辦法來處理。

DBN 列看起來像這樣:

data["demographics"]["DBN"].head()
0    01M015
1    01M015
2    01M015
3    01M015
4    01M015
Name: DBN, dtype: object

我們再看一眼 class_size 的前 5 行數據:

data["class_size"].head()

如上圖所見,看起來 DBN 實際上是由CSDBOROUGHSCHOOL CODE 組合而成。DBN 全稱為 District Borough Numbercsd 字段表示 District,BOROUGH 字段表示 borough,再與 SCHOOL CODE 字段一起最終組成DBN

想洞察數據之間的這種關系并沒有什么系統化的方法,只能經過探索和嘗試來找到答案。

現在我們知道怎樣構建 DBN 了,可以把它添加到 class_sizehs_directory 數據集里:

data["class_size"]["DBN"] = data["class_size"].apply(lambda x: "{0:02d}{1}".format(x["CSD"], x["SCHOOL CODE"]), axis=1)
data["hs_directory"]["DBN"] = data["hs_directory"]["dbn"]
添加調查數據

最有趣的數據集之一,應該是學生、父母、老師的問卷調查數據,囊括了對每個學校的安全程度、學術水平等等反饋數據。在組合數據集之前,讓我們添加這些調查數據。現實工作中,分析數據的途中你經常會碰到你想要加入的有趣數據。使用Jupyter notebook 這樣靈活的工具,可以讓你快速添加額外代碼,并且重新運行你的分析。

我們將要添加調查數據到我們的 data 字典里,然后再組合所有的數據集。調查數據包含兩個文件,一個針對所有學習,一個是針對 75 區的學校。我們需要寫一些代碼來組合。在下面的代碼中,我們將

使用 windows-1252 編碼讀入所有學校的數據。

使用 windows-1252 編碼讀入 75 區學校的數據。

添加一個 flag 來數據來自哪個區。

使用 DataFrames 的 concat 方法來合并以上數據。

survey1 = pandas.read_csv("schools/survey_all.txt", delimiter="	", encoding="windows-1252")
survey2 = pandas.read_csv("schools/survey_d75.txt", delimiter="	", encoding="windows-1252")
survey1["d75"] = False
survey2["d75"] = True
survey = pandas.concat([survey1, survey2], axis=0)

一旦我們完成調查數據的合并,還有一個復雜的事情要處理。為了方便進行比較和找出列直接關聯,我們需要減少數據集中的列數。不幸的是,調查數據里包含太多對我們沒有用的列:

survey.head()

我們可以通過查看與調查數據一起下載下來的數據字典文件,來找出我們需要的重要字段去簡化列:

這樣我們就可以刪除 survey 中多余的列:

survey["DBN"] = survey["dbn"]
survey_fields = ["DBN", "rr_s", "rr_t", "rr_p", "N_s", "N_t", "N_p", "saf_p_11", "com_p_11", "eng_p_11", "aca_p_11", "saf_t_11", "com_t_11", "eng_t_10", "aca_t_11", "saf_s_11", "com_s_11", "eng_s_11", "aca_s_11", "saf_tot_11", "com_tot_11", "eng_tot_11", "aca_tot_11",]
survey = survey.loc[:,survey_fields]
data["survey"] = survey
survey.shape
(1702, 23)

確保你能夠理解每個數據集包含什么,相關列是什么,可以為日后分析節省很多的時間和精力。

壓縮數據集

再次看一下數據集,我們馬上發現一個新的問題:

data["class_size"].head()

class_size 中對應一個高中存在多行數據(及重復的 DBNSCHOOL NAME )。然而 sat_results 里每個高中只有一條數據:

data["sat_results"].head()

為了能夠聯合數據集,我們需要找到一種方式來保證一個高中對應一行數據。如果不這樣做,我們將無法比較 SAT 成績與班級大小。首先我們需要更好地理解數據,然后做一些聚合。在 class_size 數據集里,GRADEPROGRAM TYPE 字段對于一個學校存在多個值。通過限制一個字段只有一個值,我們可以過濾掉大部分的重復行。在下面的代碼中,我們將:

僅僅保留 class_sizeGRADE 字段是 09-12 的值。

僅僅保留 class_sizePROGRAM TYPEGEN ED 的值。

DBN 進行group,計算每個列的平均值,得到每所學校平均的 class_size 值。

重置索引,將 DBN 作為列重新加回。

class_size = data["class_size"]
class_size = class_size[class_size["GRADE "] == "09-12"]
class_size = class_size[class_size["PROGRAM TYPE"] == "GEN ED"]
class_size = class_size.groupby("DBN").agg(np.mean)
class_size.reset_index(inplace=True)
data["class_size"] = class_size
壓縮其他數據集

同樣,我們需要壓縮 demographics 數據集。這個數據集收集了同一個學校多年的數據,因此存在重復數據。我們將僅僅挑選出 schoolyear 字段里為最近年份的,來去除重復的數據:

demographics = data["demographics"]
demographics = demographics[demographics["schoolyear"] == 20112012]
data["demographics"] = demographics

還需要壓縮 math_test_results 數據集。這個數據集按 GradeYear 進行分割。我們可以只保留某一年中某個年級的數據:

data["math_test_results"] = data["math_test_results"][data["math_test_results"]["Year"] == 2011]
data["math_test_results"] = data["math_test_results"][data["math_test_results"]["Grade"] == "8"]

最后,壓縮 graduation 數據集:

data["graduation"] = data["graduation"][data["graduation"]["Cohort"] == "2006"]
data["graduation"] = data["graduation"][data["graduation"]["Demographic"] == "Total Cohort"]

在真正開始項目工作之前,數據的清理和探索是至關重要。擁有一個良好的、一致的數據集會大大加快后續分析工作。

計算變量值

計算變量值對加快分析過程有兩個好處,讓日后進行比較更快,能夠比較原本不能比較的字段。目前我們要做的第一件事情是從 SAT Math Avg. ScoreSAT Critical Reading Avg. Scoreand SAT Writing Avg. Score 列來計算 SAT 總分。下面的代碼:

把每個 SAT 成績中的列從字符串轉為數字。

合計所有列到 sat_score 列,代表 SAT 總分。

cols = ["SAT Math Avg. Score", "SAT Critical Reading Avg. Score", "SAT Writing Avg. Score"]
for c in cols:
    data["sat_results"][c] = pandas.to_numeric(data["sat_results"][c], errors="coerce")

data["sat_results"]["sat_score"] = data["sat_results"][cols[0]] + data["sat_results"][cols[1]] + data["sat_results"][cols[2]]

接下里,我們來解析每個學校的坐標位置,這個可以讓我們繪制每所學校的位置。下面的代碼:

Location 1 列解析出經緯度。

轉換經緯度為數字。

data["hs_directory"]["lat"] = data["hs_directory"]["Location 1"].apply(lambda x: x.split("
")[-1].replace("(", "").replace(")", "").split(", ")[0])
data["hs_directory"]["lon"] = data["hs_directory"]["Location 1"].apply(lambda x: x.split("
")[-1].replace("(", "").replace(")", "").split(", ")[1])

for c in ["lat", "lon"]:
    data["hs_directory"][c] = pandas.to_numeric(data["hs_directory"][c], errors="coerce")

現在,我們可以重新打印每一個數據集來看看:

for k,v in data.items():
    print(k)
    print(v.head())

合并數據集

現在我們完成了所有的準備工作,可以使用 DBN 列來將數據集合并在一起了。合并后我們將獲得一個有著數百個列的數據集。合并時注意一些數據集存在缺失部分高中的數據。為了不丟失這部分數據,我們需要使用 outer join 來合并數據集。在現實世界里,數據缺失是很常見的。有能力推理和處理缺失數據是作品集中重要的展示部分。

你可以從這里了解不同類型的 join 。

下面的代碼中,我們將:

遍歷 data 字典里的每一項。

打印非唯一 DBN 的數量。

決定 join 的策略,inner 還是 outer

DBN 來 join 所有的數據集,存于 DataFrame full

flat_data_names = [k for k,v in data.items()]
flat_data = [data[k] for k in flat_data_names]
full = flat_data[0]
for i, f in enumerate(flat_data[1:]):
    name = flat_data_names[i+1]
    print(name)
    print(len(f["DBN"]) - len(f["DBN"].unique()))
    join_type = "inner"
    if name in ["sat_results", "ap_2010", "graduation"]:
        join_type = "outer"
    if name not in ["math_test_results"]:
        full = full.merge(f, on="DBN", how=join_type)

full.shape
sat_results
0
demographics
0
graduation
0
hs_directory
0
ap_2010
1
survey
0
class_size
0
(396, 174)
添加值

現在我們有了 DataFrame full, 幾乎包含所有我們需要信息的。但是,仍然有部分字段的數據是缺失的。例如我們想將 AP 考試的結果與 SAT 成績關聯到一起的話,我們需要將列轉化為數字,然后填入所有缺失的數值:

cols = ["AP Test Takers ", "Total Exams Taken", "Number of Exams with scores 3 4 or 5"]

for col in cols:
    full[col] = pandas.to_numeric(full[col], errors="coerce")

full[cols] = full[cols].fillna(value=0)

接著,我們計算 school_dist 列,得到學校的區號。之后我們將使用這個數據按區去匹配學區,繪制學校的的統計數據。

full["school_dist"] = full["DBN"].apply(lambda x: x[:2])

最后我們用所有列的平均值,來填寫 full 中其他的缺失值:

full = full.fillna(full.mean())
計算關聯性

計算列之間的關聯性,是探索數據集和檢查列相關度的好方法。這個方法可以告訴你哪個列與你感興趣的列有緊密關系。我們可以使用 Pandas DataFrames 提供的 corr 方法來計算得分。得分越接近 0,表示越沒有相關性。越接近 1,則正相關性越強,越接近 -1,則負相關性越強:

full.corr()["sat_score"]

從上面的數據我們洞察到一些需要進一步研究的東西:

總錄取人數與 sat_score 有很強的相關性。這有點令我們驚訝,在我們的認知中,越小的學校,應該越注重于學生教育,分數應該更高才對。

女性百分比(female_per)與 SAT 成績成正比,男性比例(male_per) 則相反。

調查反饋數據與 SAT 成績沒有什么相關性。

SAT 成績中有顯著的種族不平等性(white_per, asian_per, black_per, hispanic_per)。

ell_percent 與 SAT 成績有強烈的負相關性。

以上每一項都是一個潛在的探索方向,都可以使用數據來敘述一個故事。

設定上下文

在我們深入數據之前,要為自己以及讀者設定一個上下文。使用可探索的圖表或者地圖是一個好的方式。在本例中,我們按學校位置繪制出地圖,這可以幫組我們理解即將探索的問題。

下面的代碼:

設立地圖中心為紐約市

為每所學校添加一個標記

顯示地圖

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.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_pN_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_persat_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,這樣別人就可以與你協作了。

本文首發于編程派公眾號及網站。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38186.html

相關文章

  • 打造數據科學品集:搭建一個數據科學博客

    摘要:讀完本文,你將學會如何使用靜態網站生成器,搭建一個屬于自己的博客,用來展示數據科學作品。靜態網站基本上,一個靜態網站就是一個全是文件的文件夾。建立靜態網站的一種方法是手寫,然后上傳所有的文件到服務器。 這是「打造數據科學作品集」系列文章的第二篇。如果你喜歡該系列,而且想知道下一篇文章什么時候發布,你可以訂閱我們。讀完本文,你將學會如何使用 Pelican 靜態網站生成器,搭建一個屬于...

    iamyoung001 評論0 收藏0
  • 【歷史上的今天】9 月 8 日:阿里開放平臺計劃;英特爾發布首款雙核酷睿處理器;我國研制全數字高清晰

    摘要:資料來源維基百科年月日淘寶網發布開放平臺淘園計劃年月日,淘寶網發布淘園計劃,推出淘寶大戰略。年月日,英特爾在京隆重舉 整理 | 王啟隆 透過「歷史上的今天」,...

    魏憲會 評論0 收藏0
  • 成為靠譜的數據科學家——從提出正確的問題開始

    摘要:我認為提出正確的問題和定義問題陳述是許多數據科學初學者包括我面臨的一項挑戰。在本文中,我將與你分享作為數據科學家,該如何提出正確問題并定義問題陳述。我們的任務是幫助他們將問題構建成數據科學問題,從他們的角度看問題。 showImg(https://segmentfault.com/img/bVbnjxm?w=900&h=600);作者 | Admond Lee翻譯 | MikaCDA ...

    dendoink 評論0 收藏0
  • 程序員這條路,選擇深耕技術,還是全面學習比較好?

    摘要:前言在開發技術和應用市場完全成熟的今天,有人希望深耕技術打造出自己的一片天地,也有人想廣泛學習在程序員市場中游刃有余。而這本書上千的引用論文,給我指明了一條系統學習理論的明路。 ...

    kun_jian 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<