計(jì)算與推斷思維 六、可視化

六、可視化

原文:Visualization

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

自豪地采用谷歌翻譯

表格是一種組織和可視化數(shù)據(jù)的強(qiáng)大方式。然而,無論數(shù)據(jù)如何組織,數(shù)字的大型表格可能難以解釋。 有時(shí)解釋圖片比數(shù)字容易得多。

在本章中,我們將開發(fā)一些數(shù)據(jù)分析的基本圖形方法。 我們的數(shù)據(jù)源是互聯(lián)網(wǎng)電影數(shù)據(jù)庫(IMDB),這是一個(gè)在線數(shù)據(jù)庫,包含電影,電視節(jié)目,和視頻游戲等信息。Box Office Mojo 網(wǎng)站提供了許多 IMDB 數(shù)據(jù)摘要,我們已經(jīng)采用了其中一些。 我們也使用了 The Numbers 的數(shù)據(jù)摘要,這個(gè)網(wǎng)站的口號(hào)是“數(shù)據(jù)和電影業(yè)務(wù)的相遇之處”。

散點(diǎn)圖和線形圖

actors表包含好萊塢的男性和女性演員的數(shù)據(jù)。 其中的列是:

內(nèi)容
Actor 演員名稱
Total Gross 演員所有電影的國內(nèi)票房總收入(百萬美元)
Number of Movies 演員所演的電影數(shù)量
Average per Movie 總收入除以電影數(shù)量
#1 Movie 演員所演的票房最高的電影
Gross 演員的 #1 電影的國內(nèi)票房總收入(百萬美元)

在總票房的計(jì)算中,數(shù)據(jù)的制表人沒有包括一些電影,其中演員是客串角色或陳述角色,沒有太多的登場時(shí)間。

這個(gè)表格有 50 行,對(duì)應(yīng)著 50 個(gè)最頂級(jí)的演員。 這個(gè)表已經(jīng)按照Total Gross排序了,所以很容易看出,Harrison Ford是最棒的演員。 總的來說,他的電影的國內(nèi)票房收入比其他演員的電影多。

actors = Table.read_table('actors.csv')
actors
Actor Total Gross Number of Movies Average per Movie #1 Movie Gross
Harrison Ford 4871.7 41 118.8 Star Wars: The Force Awakens 936.7
Samuel L. Jackson 4772.8 69 69.2 The Avengers 623.4
Morgan Freeman 4468.3 61 73.3 The Dark Knight 534.9
Tom Hanks 4340.8 44 98.7 Toy Story 3 415
Robert Downey, Jr. 3947.3 53 74.5 The Avengers 623.4
Eddie Murphy 3810.4 38 100.3 Shrek 2 441.2
Tom Cruise 3587.2 36 99.6 War of the Worlds 234.3
Johnny Depp 3368.6 45 74.9 Dead Man's Chest 423.3
Michael Caine 3351.5 58 57.8 The Dark Knight 534.9
Scarlett Johansson 3341.2 37 90.3 The Avengers 623.4

(已省略 40 行)

術(shù)語。變量是我們稱之為“特征”的東西的正式名稱,比如'number of movies'。 術(shù)語“變量”強(qiáng)調(diào)了,對(duì)于不同的個(gè)體,這個(gè)特征可以有不同的值 - 演員所演電影的數(shù)量因人而異。

擁有數(shù)值的變量(如'number of movies''average gross receipts per movie')的變量稱為定量或數(shù)值變量。

散點(diǎn)圖

散點(diǎn)圖展示兩個(gè)數(shù)值變量之間的關(guān)系。 在前面的章節(jié)中,我們看到了一個(gè)散點(diǎn)圖的例子,我們看了兩個(gè)經(jīng)典小說的時(shí)間段和角色數(shù)量。

Tablescatter方法繪制一個(gè)散點(diǎn)圖,由表格的每一行組成。它的第一個(gè)參數(shù)是要在橫軸上繪制的列標(biāo)簽,第二個(gè)參數(shù)是縱軸上的列標(biāo)簽。

actors.scatter('Number of Movies', 'Total Gross')
image

散點(diǎn)圖包含 50 個(gè)點(diǎn),表中的每個(gè)演員為一個(gè)。 一般來說,你可以看到它向上傾斜。 一個(gè)演員的電影越多,所有這些電影的總收入就越多。

在形式上,我們說圖表顯示了變量之間的關(guān)聯(lián),并且關(guān)聯(lián)是正的:一個(gè)變量的高值往往與另一個(gè)變量的高值相關(guān)聯(lián),而低值也是一樣,通常情況下。

當(dāng)然有一些變化。 一些演員有很多電影,但總收入中等。 其他人電影數(shù)量中等,但收入很高。正相關(guān)只是一個(gè)大體趨勢(shì)的敘述。

在課程后面,我們將學(xué)習(xí)如何量化關(guān)聯(lián)。目前,我們只是定性地思考。

現(xiàn)在我們已經(jīng)探索了電影的數(shù)量與總收入的關(guān)系,讓我們把注意力轉(zhuǎn)向它與每部電影的平均收入的關(guān)系。

actors.scatter('Number of Movies', 'Average per Movie')
image

這是一個(gè)截然不同的情況,并表現(xiàn)出負(fù)相關(guān)。 一般來說,演員的電影數(shù)量越多,每部電影的平均收入就越少。

另外,有一個(gè)點(diǎn)是非常高的,在繪圖的左邊。 它對(duì)應(yīng)于一個(gè)電影數(shù)量很少,每部電影平均值很高的演員。 這個(gè)點(diǎn)是異常的。 它位于數(shù)據(jù)的一般范圍之外。 事實(shí)上,這與繪圖中的其他所有點(diǎn)相差甚遠(yuǎn)。

我們將通過查看繪圖的左右兩端的點(diǎn),來進(jìn)一步檢查負(fù)相關(guān)。

對(duì)于右端,我們通過查看沒有異常值的部分來放大圖的主體。

no_outlier = actors.where('Number of Movies', are.above(10))
no_outlier.scatter('Number of Movies', 'Average per Movie')
image

負(fù)相關(guān)仍然清晰可見。 讓我們找出一些演員,對(duì)應(yīng)位于繪圖右側(cè)的點(diǎn),這里電影數(shù)量較多:

actors.where('Number of Movies', are.above(60))
Actor Total Gross Number of Movies Average per Movie #1 Movie Gross
Samuel L. Jackson 4772.8 69 69.2 The Avengers 623.4
Morgan Freeman 4468.3 61 73.3 The Dark Knight 534.9
Robert DeNiro 3081.3 79 39 Meet the Fockers 279.3
Liam Neeson 2942.7 63 46.7 The Phantom Menace 474.5

偉大的演員羅伯特·德尼羅(Robert DeNiro)擁有最高的電影數(shù)量和最低的每部電影的平均收入。 其他優(yōu)秀的演員在不遠(yuǎn)處的點(diǎn),但德尼羅在極遠(yuǎn)處。

為了理解負(fù)相關(guān),請(qǐng)注意,演員所演的電影越多,在風(fēng)格,流派和票房方片,這些電影變化就越大。 例如,一個(gè)演員可能會(huì)出現(xiàn)在一些高收入的動(dòng)作電影或喜劇中(如 Meet Fockers),也可能是優(yōu)秀但不會(huì)吸引大量人群的小眾電影。 因此,演員的每部電影的平均收入值可能相對(duì)較低。

為了從不同的角度來看待這個(gè)觀點(diǎn),現(xiàn)在讓我們來看看這個(gè)異常點(diǎn)。

actors.where('Number of Movies', are.below(10))
Actor Total Gross Number of Movies Average per Movie #1 Movie Gross
Anthony Daniels 3162.9 7 451.8 Star Wars: The Force Awakens 936.7

作為一名演員,安東尼·丹尼爾斯(Anthony Daniels)可能沒有羅伯特·德尼羅(Robert DeNiro)的身材。 但是他的 7 部電影的平均收入?yún)s高達(dá)每部電影近 4.52 億美元。

這些電影是什么? 你可能知道《星球大戰(zhàn):C-3PO》中的 Droid C-3PO,那是金屬機(jī)甲里面的安東尼·丹尼爾斯。 他扮演 C-3PO。

image

丹尼爾斯先生的全部電影(除了客串)都是由高收入的“星球大戰(zhàn)”系列電影組成的。 這就解釋了他的高平均收入和低電影數(shù)量。

類型和制作預(yù)算等變量,會(huì)影響電影數(shù)量與每部電影的平均收入之間的關(guān)聯(lián)。 這個(gè)例子提醒人們,研究兩個(gè)變量之間的關(guān)聯(lián),往往也涉及到了解其他相關(guān)的變量。

線形圖

線形圖是最常見的可視化圖形之一,通常用于研究時(shí)序型的趨勢(shì)和模式。

movies_by_year表包含了 1980 年到 2015 年間,美國電影公司制作的電影的數(shù)據(jù)。這些列是:

內(nèi)容
Year 年份
Total Gross 所有發(fā)行電影的國內(nèi)總票房收入(以百萬美元為單位)
Number of Movies 發(fā)行的電影數(shù)量
#1 Movie 收入最高的電影
movies_by_year = Table.read_table('movies_by_year.csv')
movies_by_year
Year Total Gross Number of Movies #1 Movie
2015 11128.5 702 Star Wars: The Force Awakens
2014 10360.8 702 American Sniper
2013 10923.6 688 Catching Fire
2012 10837.4 667 The Avengers
2011 10174.3 602 Harry Potter / Deathly Hallows (P2)
2010 10565.6 536 Toy Story 3
2009 10595.5 521 Avatar
2008 9630.7 608 The Dark Knight
2007 9663.8 631 Spider-Man 3
2006 9209.5 608 Dead Man's Chest

(省略了 26 行)

Tableplot方法產(chǎn)生線形圖。 它的兩個(gè)參數(shù)與散點(diǎn)圖相同:首先是橫軸上的列,然后是縱軸上的列。 這是 1980 年到 2015 年間每年發(fā)行的電影數(shù)量的線形圖。

movies_by_year.plot('Year', 'Number of Movies')
image

雖然每年的數(shù)字都有明顯的變化,但圖形急劇上升,然后呈現(xiàn)平緩的上升趨勢(shì)。 20 世紀(jì) 80 年代早期的劇增,部分是由于在上世紀(jì) 70 年代,電影制作人推動(dòng)電影業(yè)的幾年后,電影制片廠重新回到電影制作的前沿。

我們的重點(diǎn)將放在最近幾年。 根據(jù)電影的主題,對(duì)應(yīng) 2000 年到 2015 年的行,分配給名稱century_21

century_21 = movies_by_year.where('Year', are.above(1999))
century_21.plot('Year', 'Number of Movies')
image

2008 年的全球金融危機(jī)有明顯的效果 - 2009 年發(fā)行的電影數(shù)量急劇下降。

但是,美元數(shù)量并沒有太大的變化。

century_21.plot('Year', 'Total Gross')
image

盡管發(fā)生了金融危機(jī),電影發(fā)行的數(shù)量也少得多,但 2009 年的國內(nèi)總收入仍高于 2008 年。

造成這種矛盾的一個(gè)原因是,人們?cè)诮?jīng)濟(jì)衰退時(shí)往往會(huì)去看電影。 “經(jīng)濟(jì)低迷時(shí)期,美國人涌向電影”,“紐約時(shí)報(bào)”于 2009 年 2 月說。文章引用南加州大學(xué)的馬丁·卡普蘭(Martin Kaplan)的話說:“人們想要忘記自己的煩惱,想和別人在一起。” 當(dāng)節(jié)假日和昂貴的款待難以負(fù)擔(dān),電影提供了受歡迎的娛樂和寬慰。

2009 年的高票房收入的另一個(gè)原因是,電影《阿凡達(dá)》及其 3D 版本。 阿凡達(dá)不僅是 2009 年的第一部電影,它也是有史以來第二高的總票房電影,我們將在后面看到。

century_21.where('Year', are.equal_to(2009))
Year Total Gross Number of Movies #1 Movie
2009 10595.5 521 Avatar

類別分許

可視化類別分布

許多數(shù)據(jù)不以數(shù)字的形式出現(xiàn)。 數(shù)據(jù)可以是音樂片段,或地圖上的地方。 他們也可以是類別,你可以在里面放置個(gè)體。 以下是一些類別變量的例子。

  • 個(gè)體是冰淇淋紙盒,變量就是紙盒里的味道。
  • 個(gè)體是職業(yè)籃球運(yùn)動(dòng)員,變量是球員的隊(duì)伍。
  • 個(gè)體是年,而變量是今年最高票房電影的流派。
  • 個(gè)體是調(diào)查對(duì)象,變量是他們從“完全不滿意”,“有點(diǎn)滿意”和“非常滿意”中選擇的回答。

icecream表包含 30 盒冰激凌的數(shù)據(jù)。

icecream = Table().with_columns(
    'Flavor', make_array('Chocolate', 'Strawberry', 'Vanilla'),
    'Number of Cartons', make_array(16, 5, 9)
)
icecream
Flavor Number of Cartons
Chocolate 16
Strawberry 5
Vanilla 9

分類變量“口味”的值是巧克力,草莓和香草。 表格顯示了每種口味的紙盒數(shù)量。 我們稱之為分布表。 分布顯示了所有變量的值,以及每個(gè)變量的頻率。

條形圖

條形圖是可視化類別分布的熟悉方式。 它為每個(gè)類別顯示一個(gè)條形。 條形的間隔相等,寬度相同。 每個(gè)條形的長度與相應(yīng)類別的頻率成正比。

我們使用橫條繪制條形圖,因?yàn)檫@樣更容易標(biāo)注條形圖。 所以Table的方法稱為barh。 它有兩個(gè)參數(shù):第一個(gè)是類別的列標(biāo)簽,第二個(gè)是頻率的列標(biāo)簽。

icecream.barh('Flavor', 'Number of Cartons')
image

如果表格只包含一列類別和一列頻率(如冰淇淋),則方法調(diào)用甚至更簡單。 你可以指定包含類別的列,barh將使用另一列中的值作為頻率。

icecream.barh('Flavor')
image

類別分布的特征

除了純粹的視覺差異之外,條形圖和我們?cè)谇懊嬲鹿?jié)中看到的兩個(gè)圖表之間還有一個(gè)重要的區(qū)別。 它們是散點(diǎn)圖和線圖,兩者都顯示兩個(gè)數(shù)值變量 - 兩個(gè)軸上的變量都是數(shù)值型的。 相比之下,條形圖的一個(gè)軸上是類別,在另一個(gè)軸上具有數(shù)值型頻率。

這對(duì)圖表有影響。首先,每個(gè)條形的寬度和相鄰條形之間的間隔完全取決于生成圖的人,或者用于生成該圖的程序。 Python 為我們做了這些選擇。 如果你要手動(dòng)繪制條形圖,則可以做出完全不同的選擇,并且仍然會(huì)是完全正確的條形圖,前提是你使用相同寬度繪制了所有條形,并使所有間隔保持相同。

最重要的是,條形可以以任何順序繪制。 “巧克力”,“香草”和“草莓”這些類別沒有普遍的等級(jí)順序,不像數(shù)字5, 710

這意味著我們可以繪制一個(gè)易于解釋的條形圖,方法是按降序重新排列條形圖。 為了實(shí)現(xiàn)它,我們首先按照Number of Cartons的降序,重新排列icecream的行,然后繪制條形圖。

icecream.sort('Number of Cartons', descending=True).barh('Flavor')
image

這個(gè)條形圖包含的信息和以前的完全一樣,但是它更容易閱讀。 雖然在只讀三個(gè)條形的情況下,這并不是一個(gè)巨大的收益,但是當(dāng)分類數(shù)量很大時(shí),這可能是相當(dāng)重要的。

組合分類數(shù)據(jù)

為了構(gòu)造icecream表,有人不得不查看 30 個(gè)冰淇淋盒子,并計(jì)算每種口味的數(shù)量。 但是,如果我們的數(shù)據(jù)還沒有包含頻率,我們必須在繪制條形圖之前計(jì)算頻率。 這是一個(gè)例子,其中它是必要的。

top表由美國歷史上最暢銷的電影組成。 第一列包含電影的標(biāo)題;《星球大戰(zhàn):原力覺醒》(Star Wars: The Force Awakens)排名第一,美國票房總額超過 9 億美元。 第二列包含制作電影的工作室的名稱。 第三列包含國內(nèi)票房收入(美元),第四列包含按 2016 年價(jià)格計(jì)算的,票面總收入。 第五列包含電影的發(fā)行年份。

列表中有 200 部電影。 根據(jù)未調(diào)整的總收入,這是前十名。

top = Table.read_table('top_movies.csv')
top
Title Studio Gross Gross (Adjusted) Year
Star Wars: The Force Awakens Buena Vista (Disney) 906723418 906723400 2015
Avatar Fox 760507625 846120800 2009
Titanic Paramount 658672302 1178627900 1997
Jurassic World Universal 652270625 687728000 2015
Marvel's The Avengers Buena Vista (Disney) 623357910 668866600 2012
The Dark Knight Warner Bros. 534858444 647761600 2008
Star Wars: Episode I - The Phantom Menace Fox 474544677 785715000 1999
Star Wars Fox 460998007 1549640500 1977
Avengers: Age of Ultron Buena Vista (Disney) 459005868 465684200 2015
The Dark Knight Rises Warner Bros. 448139099 500961700 2012

(省略了 190 行)

迪斯尼的子公司布埃納維斯塔(Buena Vista)就像福克斯(Fox)和華納兄弟(Warner Brothers)一樣,經(jīng)常出現(xiàn)在前十名中 如果我們從 200 行中看,哪個(gè)工作室最常出現(xiàn)?

為了解決這個(gè)問題,首先要注意的是,我們需要的只是一個(gè)擁有電影和工作室的表格;其他信息是不必要的。

movies_and_studios = top.select('Title', 'Studio')

Tablegroup方法組允許我們,通過將每個(gè)工作室當(dāng)做一個(gè)類別,并將每一行分配給一個(gè)類別,來計(jì)算每個(gè)工作室出現(xiàn)在表中的頻率。 group方法將包含類別的列標(biāo)簽作為其參數(shù),并返回每個(gè)類別中行數(shù)量的表格。 數(shù)量列始終稱為count,但如果你希望的話,則可以使用relabeled更改該列。

movies_and_studios.group('Studio')
Studio count
AVCO 1
Buena Vista (Disney) 29
Columbia 10
Disney 11
Dreamworks 3
Fox 26
IFC 1
Lionsgate 3
MGM 7
MPC 1

(省略了 14 行)

因此,group創(chuàng)建一個(gè)分布表,顯示電影在類別(工作室)之間如何分布。

現(xiàn)在我們可以使用這個(gè)表格,以及我們上面獲得的圖形技能來繪制條形圖,顯示前 200 個(gè)最高收入的電影中,哪個(gè)工作室是最常見的。

studio_distribution = movies_and_studios.group('Studio')
studio_distribution.sort('count', descending=True).barh('Studio')
image

華納兄弟(Warner Brothers)和布埃納維斯塔(Buena Vista)是前 200 電影中最常見的工作室。 華納兄弟制作了哈利波特電影,布埃納維斯塔制作了星球大戰(zhàn)。

由于總收入以未經(jīng)調(diào)整的美元來衡量,所以最近幾年的頂級(jí)電影比過去幾十年更頻繁,這并不令人驚訝。 以絕對(duì)數(shù)量來看,現(xiàn)在的電影票價(jià)比以前更高,因此總收入也更高。 這是通過條形圖證明的,這些條形圖顯示了 200 部電影的發(fā)行年份。

movies_and_years = top.select('Title', 'Year')
movies_and_years.group('Year').sort('count', descending=True).barh('Year')
image

所有最長的條形都對(duì)應(yīng) 2000 年以后的年份。這與我們的觀察一致,即最近幾年應(yīng)該是最頻繁的。

面向數(shù)值變量

這張圖有一些未解決的地方。 雖然它確實(shí)回答了這個(gè)問題,200 部最受歡迎的電影中,最常見的發(fā)行年份,但并沒有按時(shí)間順序列出所有年份。 它將年作為一個(gè)分類變量。

但是,年份是固定的時(shí)序單位,確實(shí)擁有順序。 他們也有相對(duì)于彼此的固定的數(shù)值距離。 讓我們看看當(dāng)我們?cè)噲D考慮它的時(shí)候會(huì)發(fā)生什么。

默認(rèn)情況下,barh將類別(年)從最低到最高排序。 所以我們將運(yùn)行這個(gè)代碼,但不按count進(jìn)行排序。

movies_and_years.group('Year').barh('Year')
image

現(xiàn)在年份是升序了。 但是這個(gè)條形圖還是有點(diǎn)問題。 1921 年和 1937 年的條形與 1937 年和 1939 年的條形相距甚遠(yuǎn)。條形圖并沒有顯示出,200 部電影中沒有一部是在 1922 年到 1936 年間發(fā)布的。基于這種可視化,這種不一致和遺漏,使早期年份的分布難以理解。

條形圖用做類別變量的可視化。 當(dāng)變量是數(shù)值,并且我們創(chuàng)建可視化時(shí),必須考慮其值之間的數(shù)值關(guān)系。 這是下一節(jié)的主題。

數(shù)值分布

可視化數(shù)值分布

數(shù)據(jù)科學(xué)家研究的許多變量是定量的或數(shù)值的。它們的值是你可以做算術(shù)的數(shù)字。我們所看到的例子包括一本書的章節(jié)數(shù)量,電影的收入以及美國人的年齡。

類別變量的值可以按照數(shù)字編碼,但是這不會(huì)使變量成為定量的。在我們研究的,按年齡組分類的人口普查數(shù)據(jù)的例子中,分類變量SEX中,'Male'的數(shù)字代碼為1'Female'的數(shù)字代碼為2,以及分組12的合計(jì)為012是數(shù)字,在這種情況下,從2中減1或取0,12的平均值,或?qū)@三個(gè)值執(zhí)行其他算術(shù)是沒有意義的。 SEX是一個(gè)類別變量,即使這些值已經(jīng)賦予一個(gè)數(shù)字代碼。

對(duì)于我們的主要示例,我們將返回到我們?cè)诳梢暬诸悢?shù)據(jù)時(shí),所研究的數(shù)據(jù)集。這是一個(gè)表格,它由美國歷史上最暢銷的電影中的數(shù)據(jù)組成。為了方便起見,這里再次描述表格。

第一列包含電影的標(biāo)題。第二列包含制作電影的工作室的名稱。第三個(gè)包含國內(nèi)票房總值(美元),第四個(gè)包含按 2016 年價(jià)格計(jì)算的票面收入總額。第五個(gè)包含電影的發(fā)行年份。

列表中有 200 部電影。根據(jù)Gross列中未調(diào)整的總收入,這是前十名。

top = Table.read_table('top_movies.csv')
# Make the numbers in the Gross and Gross (Adjusted) columns look nicer:
top.set_format([2, 3], NumberFormatter)
Title Studio Gross Gross (Adjusted) Year
Star Wars: The Force Awakens Buena Vista (Disney) 906,723,418 906,723,400 2015
Avatar Fox 760,507,625 846,120,800 2009
Titanic Paramount 658,672,302 1,178,627,900 1997
Jurassic World Universal 652,270,625 687,728,000 2015
Marvel's The Avengers Buena Vista (Disney) 623,357,910 668,866,600 2012
The Dark Knight Warner Bros. 534,858,444 647,761,600 2008
Star Wars: Episode I - The Phantom Menace Fox 474,544,677 785,715,000 1999
Star Wars Fox 460,998,007 1,549,640,500 1977
Avengers: Age of Ultron Buena Vista (Disney) 459,005,868 465,684,200 2015
The Dark Knight Rises Warner Bros. 448,139,099 500,961,700 2012

(省略了 190 行)

可視化調(diào)整后收入的分布

在本節(jié)中,我們將繪制Gross (Adjusted)列中數(shù)值變量的分布圖。 為了簡單起見,我們創(chuàng)建一個(gè)包含我們所需信息的小表。 而且由于三位數(shù)字比九位數(shù)字更容易處理,我們以百萬美元衡量調(diào)整后的總收入。 注意如何使用舍入僅保留兩位小數(shù)。

millions = top.select(0).with_column('Adjusted Gross', 
                                     np.round(top.column(3)/1e6, 2))
millions
Title Adjusted Gross
Star Wars: The Force Awakens 906.72
Avatar 846.12
Titanic 1178.63
Jurassic World 687.73
Marvel's The Avengers 668.87
The Dark Knight 647.76
Star Wars: Episode I - The Phantom Menace 785.72
Star Wars 1549.64
Avengers: Age of Ultron 465.68
The Dark Knight Rises 500.96

直方圖

數(shù)值數(shù)據(jù)集的直方圖看起來非常像條形圖,雖然它有一些重要的差異,我們將在本節(jié)中討論。 首先,我們只畫出調(diào)整后收入的直方圖。

hist方法生成列中值的直方圖。 可選的單位參數(shù)用于兩個(gè)軸上的標(biāo)簽。 直方圖顯示調(diào)整后的總額分布,以百萬美元為單位。

millions.hist('Adjusted Gross', unit="Million Dollars")
image

橫軸

這些金額已被分組為連續(xù)的間隔,稱為桶。盡管在這個(gè)數(shù)據(jù)集中,沒有電影正好在兩個(gè)桶之間的邊緣上,但是hist必須考慮數(shù)值可能在邊緣的情況。所以hist有一個(gè)端點(diǎn)約定:bin包含左端點(diǎn)的數(shù)據(jù),但不包含右端點(diǎn)的數(shù)據(jù)。

我們使用符號(hào)[a, b)表示從a開始并在b結(jié)束但不包括b的桶。

有時(shí),必須在第一個(gè)或最后一個(gè)箱中進(jìn)行調(diào)整,以確保包含變量的最小值和最大值。在前面研究的人口普查數(shù)據(jù)中,你看到了一個(gè)這樣的調(diào)整的例子,其中“100”歲的年齡實(shí)際上意味著“100 歲以上”。

我們可以看到,有 10 個(gè)桶(有些桶很低,難以看到),而且它們的寬度都是一樣的。我們也可以看到,沒有一部電影的收入不到三億美元,那是因?yàn)槲覀冎豢紤]有史以來最暢銷的電影。

準(zhǔn)確看到桶的末端在哪里,有點(diǎn)困難。例如,精確地確定值 500 位于橫軸上的位置并不容易。所以很難判斷一個(gè)條形的結(jié)束位置和下一個(gè)條形的開始位置。

可選參數(shù)bins可以與hist一起使用來指定桶的端點(diǎn)。它必須由一系列數(shù)字組成,這些數(shù)字以第一個(gè)桶的左端開始,以最后一個(gè)桶的右端結(jié)束。我們首先將桶中的數(shù)字設(shè)置為300,400,500等等,以2000結(jié)尾。

millions.hist('Adjusted Gross', bins=np.arange(300,2001,100), unit="Million Dollars")
image

這個(gè)圖的橫軸比較容易閱讀。 標(biāo)簽200,400,600等以對(duì)應(yīng)的值為中心。 最高的條形是對(duì)應(yīng)三億到四億美元之間的電影。

少數(shù)電影投入了 8 億美元甚至更多。 這導(dǎo)致這個(gè)數(shù)字“向右傾斜”,或者更不正式地說,“右側(cè)長尾”。 大量人口的收入或租金等變量的分布也經(jīng)常具有這種形式。

桶的數(shù)量

可以使用bin方法從一個(gè)表格中計(jì)算出桶中的值的數(shù)量,該方法接受列標(biāo)簽或索引,以及可選的序列或桶的數(shù)量。 結(jié)果是直方圖的表格形式。 第一列列出了桶的左端點(diǎn)(但請(qǐng)參閱下面關(guān)于最終值的注釋)。 第二列包含Adjusted Gross列中所有值在相應(yīng)桶中的數(shù)量。 也就是說,它計(jì)數(shù)所有Adjusted Gross的所有值,它們大于或等于bin中的值,但小于下一個(gè)bin中的值。

bin_counts = millions.bin('Adjusted Gross', bins=np.arange(300,2001,100))
bin_counts.show()
bin Adjusted Gross count
300 81
400 52
500 28
600 16
700 7
800 5
900 3
1000 1
1100 3
1200 2
1300 0
1400 0
1500 1
1600 0
1700 1
1800 0
1900 0
2000 0

注意最后一行的bin值 2000。 這不是任何條形的左端點(diǎn) - 這是最后一個(gè)條形的右端點(diǎn)。 按照端點(diǎn)約定,那里的數(shù)據(jù)不包括在內(nèi)。 因此,相應(yīng)的計(jì)數(shù)記錄為 0,并且即使已經(jīng)有超過二十億美元的電影也被記錄為 0。 當(dāng)binhist使用bin參數(shù)調(diào)用時(shí),圖只考慮在指定bin中的值。

一旦數(shù)值已經(jīng)分入桶中,所得數(shù)量可以用來使用bin_column命名參數(shù)來生成直方圖,以指定哪個(gè)列包含桶的下界。

bin_counts.hist('Adjusted Gross count', bin_column='bin', unit='Million Dollars')
image

縱軸:密度刻度

一旦我們已經(jīng)照顧到細(xì)節(jié),如桶的末端,直方圖的橫軸易于閱讀。 縱軸的特征需要更多關(guān)注。 我們會(huì)一一講解。

我們先來看看如何計(jì)算垂直軸上的數(shù)字。 如果計(jì)算看起來有些奇怪,請(qǐng)耐心等待 - 本節(jié)的其余部分將解釋原因。

計(jì)算。每個(gè)條形的高度是桶中的元素的百分比,除以桶的寬度。

譯者注:存在很多種直方圖,比如頻數(shù)直方圖、頻率質(zhì)量直方圖和頻率密度直方圖。它們的縱軸數(shù)值不相同,但是圖形形狀是一樣的。這里是最后一種,頻率密度直方圖。

counts = bin_counts.relabeled('Adjusted Gross count', 'Count')
percents = counts.with_column(
    'Percent', (counts.column('Count')/200)*100
    )
heights = percents.with_column(
    'Height', percents.column('Percent')/100
    )
heights
bin Count Percent Height
300 81 40.5 0.405
400 52 26 0.26
500 28 14 0.14
600 16 8 0.08
700 7 3.5 0.035
800 5 2.5 0.025
900 3 1.5 0.015
1000 1 0.5 0.005
1100 3 1.5 0.015
1200 2 1 0.01

(省略了 8 行)

在上面直方圖的縱軸上查看數(shù)字,檢查列高度是否正確。

如果我們只查看表格的第一行,計(jì)算就會(huì)變得清晰。

請(qǐng)記住,數(shù)據(jù)集中有 200 部電影。這個(gè)[300,400)的桶包含 81 部電影。這是所有電影的 40.5%:[圖片上傳失敗...(image-82e123-1511010602425)]。

[300, 400)桶的寬度是400-300 = 100。所以 [圖片上傳失敗...(image-acb1a7-1511010602425)]。

用于計(jì)算高度的代碼使用了總共??有 200 個(gè)電影,以及每個(gè)箱的寬度是 100 的事實(shí)。

單位。條形的高度是 40.5% 除以 1 億美元,因此高度是 0.405% 每百萬美元。

這種繪制直方圖的方法創(chuàng)建了一個(gè)垂直軸,它是在密度刻度上的。條形的高度不是桶中條目的百分比;它是桶中的條目除以桶的寬度。這就是為什么高度衡量擁擠度或密度。

讓我們看看為什么這很重要。

不等的桶

直方圖相比條形圖的一個(gè)優(yōu)點(diǎn)是,直方圖可以包含不等寬度的桶。 以下將Millions中的值分為三個(gè)不均勻的類別。

uneven = make_array(300, 400, 600, 1500)
millions.hist('Adjusted Gross', bins=uneven, unit="Million Dollars")
image

這里是三個(gè)桶中的數(shù)量。

millions.bin('Adjusted Gross', bins=uneven)
bin Adjusted Gross count
300 81
400 80
600 37
1500 0

雖然范圍[300,400)[400,600)具有幾乎相同的計(jì)數(shù),但前者的高度是后者的兩倍,因?yàn)樗挥幸话氲膶挾取?[300,400)中的值的密度是[400,600)中的密度的兩倍。

直方圖幫助我們可視化數(shù)軸上數(shù)據(jù)最集中的地方,特別是當(dāng)桶不均勻的時(shí)候。

僅僅繪制數(shù)量的問題

可以使用hist方法的normed=False選項(xiàng)直接在圖表中顯示數(shù)量。 生成的圖表與直方圖具有相同的形狀,但這些桶的寬度均相等,盡管縱軸上的數(shù)字不同。

millions.hist('Adjusted Gross', bins=np.arange(300,2001,100), normed=False)
image

雖然數(shù)量刻度可能比密度刻度更自然,但當(dāng)桶寬度不同時(shí),圖表高度的有誤導(dǎo)性。 下面看起來(由于計(jì)數(shù))高收入電影相當(dāng)普遍,事實(shí)上我們已經(jīng)看到它們相對(duì)較少。

millions.hist('Adjusted Gross', bins=uneven, normed=False)
image

即使使用的方法被稱為hist,上面的圖不是一個(gè)直方圖。 誤導(dǎo)性地夸大了至少 6 億美元的電影比例。 每個(gè)桶的高度只是按照桶中的電影數(shù)量繪制,而不考慮桶寬度的差異。

如果最后兩個(gè)桶組合起來,情況就變得更加荒謬了。

very_uneven = make_array(300, 400, 1500)
millions.hist('Adjusted Gross', bins=very_uneven, normed=False)
image

在這個(gè)基于數(shù)量的圖像中,電影分布完全失去了形狀。

直方圖:通用原則和計(jì)算

上圖顯示,眼睛將面積視為“較大”的東西,而不是高度。當(dāng)桶的寬度不同時(shí),這種觀察變得尤為重要。

這就是直方圖具有兩個(gè)定義屬性的原因:

  • 桶按比例繪制并且是連續(xù)的(盡管有些可能是空的),因?yàn)闄M軸上的值是數(shù)值型的。
  • 每個(gè)條形的面積與桶中的條目數(shù)成比例。

屬性(2)是繪制直方圖的關(guān)鍵,通常實(shí)現(xiàn)如下:

條形的面積 = 桶中條目的百分比

高度的計(jì)算僅僅使用了一個(gè)事實(shí),條形是長方形的。

條形的面積 = 條形的高度 * 桶的寬度

因此,

條形的高度 = 條形的面積 / 桶的寬度
           = 桶中條目的百分比 / 桶的寬度

高度的單位是“百分比每橫軸單位”。

當(dāng)使用這種方法繪制時(shí),直方圖被稱為在密度刻度上繪制。 在這個(gè)刻度上:

  • 每個(gè)條形的面積等于相應(yīng)桶中的數(shù)據(jù)值的百分比。
  • 直方圖中所有條形的總面積為 100%。 從比例的角度來講,我們說直方圖中所有條形的面積“總計(jì)為 1”。

平頂和細(xì)節(jié)水平

即使密度刻度使用面積正確表示了百分比,但是通過將值分組到桶中,丟失了一些細(xì)節(jié)。

再看一下下圖中的[300,400)的桶。 值為“0.405% 每百萬美元”的桶的平頂,隱藏了電影在這個(gè)桶分布有些不均勻的事實(shí)。

millions.hist('Adjusted Gross', bins=uneven, unit="Million Dollars")
image

為了看到它,讓我們將[300, 400)劃分為更窄的 10 個(gè)桶。每個(gè)桶的寬度都是一千萬美元。

some_tiny_bins = make_array(300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 600, 1500)
millions.hist('Adjusted Gross', bins=some_tiny_bins, unit='Million Dollars')
image

直方圖 Q&A

讓我們?cè)佼嬕槐橹狈綀D,這次只有四個(gè)桶,檢查我們對(duì)概念的理解。

uneven_again = make_array(300, 350, 400, 450, 1500)
millions.hist('Adjusted Gross', bins=uneven_again, unit='Million Dollars')

millions.bin('Adjusted Gross', bins=uneven_again)
image
bin Adjusted Gross count
300 32
350 49
400 25
450 92
1500 0

再次查看直方圖,并將[400,450)的桶與[450,1500)桶進(jìn)行比較。

問:哪個(gè)桶里面有更多的電影?

答:[450,1500)的桶。它有 92 部電影,而[400,450)桶中有 25 部電影。

問:那么為什么[450,1500)的桶比[400,450)桶短得多呢?

答:因?yàn)楦叨却硗袄锩繂挝豢臻g的密度,而不是桶里的電影數(shù)量。 [450,1500)的桶中的電影確實(shí)比[400,450)的桶多,但它也是一個(gè)大桶。 所以它不那么擁擠。 其中的電影密度要低得多。

條形圖和直方圖的區(qū)別

  • 條形圖為每個(gè)類別展示一個(gè)數(shù)量。 它們通常用于顯示類別變量的分布。 直方圖顯示定量變量的分布。
  • 條形圖中的所有條形都具有相同的寬度,相鄰的條形之間有相等的間距。 直方圖的條形可以具有不同的寬度,并且是連續(xù)的。
  • 條形圖中條形的長度(或高度,如果垂直繪制)與每個(gè)類別的值成正比。 直方圖中條形的高度是密度的度量;直方圖中的條形的面積與桶中的條目數(shù)量成正比。

重疊的圖表

在這一章中,我們學(xué)習(xí)了如何通過繪制圖表來顯示數(shù)據(jù)。 這種可視化的常見用法是比較兩個(gè)數(shù)據(jù)集。 在本節(jié)中,我們將看到如何疊加繪圖,即將它們繪制在單個(gè)圖形中,擁有同一對(duì)坐標(biāo)軸

為了使重疊有意義,重疊的圖必須表示相同的變量并以相同的單位進(jìn)行測(cè)量。

為了繪制重疊圖,可以用相同的方法調(diào)用scatterplotbarh方法。 對(duì)于scatterplot,一列必須作為所有疊加圖的公共橫軸。 對(duì)于barh,一列必須作為一組類別的公共軸。 一般的調(diào)用看起來像這樣:

name_of_table.method(column_label_of_common_axis, array_of_labels_of_variables_to_plot)

更常見的是,我們首先僅僅選取圖表所需的列。之后通過指定共同軸上的變量來調(diào)用方法。

name_of_table.method(column_label_of_common_axis)

散點(diǎn)圖

高爾頓(Franics Galton,1822 ~ 1911 年)是一位英國博學(xué)家,他是分析數(shù)值變量之間關(guān)系的先驅(qū)。 他對(duì)有爭議的優(yōu)生學(xué)領(lǐng)域特別感興趣,實(shí)際上,他創(chuàng)造了這個(gè)術(shù)語 - 這涉及到如何將物理特征從一代傳到下一代。

高爾頓精心收集了大量的數(shù)據(jù),其中一些我們將在本課程中分析。 這是高爾頓的,有關(guān)父母及其子女身高的數(shù)據(jù)的子集。 具體來說,數(shù)據(jù)由 179 名男性組成,他們?cè)诩彝ブ械谝粋€(gè)出生。數(shù)據(jù)是他們自己的高度和父母的高度。所有的高度都是以英寸來測(cè)量的。

heights = Table.read_table('galton_subset.csv')
heights
father mother son
78.5 67 73.2
75.5 66.5 73.5
75 64 71
75 64 70.5
75 58.5 72
74 68 76.5
74 62 74
73 67 71
73 67 68
73 66.5 71

(省略了 169 行)

scatter方法使我們能夠可視化,兒子的身高如何與父母的身高有關(guān)。 在圖中,兒子的身高將形成公共的橫軸。

heights.scatter('son')
image

注意我們僅僅指定了公共的橫軸上的變量(兒子的身高)。 Python 繪制了兩個(gè)散點(diǎn)圖:這個(gè)變量和另外兩個(gè)之間的關(guān)系,每個(gè)關(guān)系一個(gè)。

金色和藍(lán)色的散點(diǎn)圖向上傾斜,并顯示出兒子的高度和父母的高度之間的正相關(guān)。 藍(lán)色(父親)的繪圖一般比金色高,因?yàn)楦赣H一般比母親高。

線形圖

我們的下一個(gè)例子涉及更近的兒童數(shù)據(jù)。 我們將返回到人口普查數(shù)據(jù)表us_pop,再次在下面創(chuàng)建用于參考。 由此,我們將提取 0 至 18 歲年齡段的所有兒童的數(shù)量。

# Read the full Census table
census_url = 'http://www2.census.gov/programs-surveys/popest/datasets/2010-2015/national/asrh/nc-est2015-agesex-res.csv'
full_census_table = Table.read_table(census_url)

# Select columns from the full table and relabel some of them
partial_census_table = full_census_table.select(['SEX', 'AGE', 'POPESTIMATE2010', 'POPESTIMATE2014'])
us_pop = partial_census_table.relabeled('POPESTIMATE2010', '2010').relabeled('POPESTIMATE2014', '2014')

# Access the rows corresponding to all children, ages 0-18
children = us_pop.where('SEX', are.equal_to(0)).where('AGE', are.below(19)).drop('SEX')
children.show()
AGE 2010 2014
0 3951330 3949775
1 3957888 3949776
2 4090862 3959664
3 4111920 4007079
4 4077551 4005716
5 4064653 4006900
6 4073013 4135930
7 4043046 4155326
8 4025604 4120903
9 4125415 4108349
10 4187062 4116942
11 4115511 4087402
12 4113279 4070682
13 4119666 4171030
14 4145614 4233839
15 4231002 4164796
16 4313252 4168559
17 4376367 4186513
18 4491005 4227920

現(xiàn)在我們可以繪制兩個(gè)疊加的線形圖,顯示 2010 年和 2014 年的不同年齡的兒童人數(shù)。方法調(diào)用類似于前面例子中的scatter調(diào)用。

children.plot('AGE')
image

在這個(gè)刻度上,重要的是要記住我們只有0,1,2歲等等的數(shù)據(jù)。 兩個(gè)圖形的點(diǎn)相互“交織”。

這些圖表在一些地方相互交叉:例如,2010 年的 4 歲人數(shù)比 2014 年多,2014 年的 14 歲人數(shù)比 2010 年多。

當(dāng)然,2014 年的 14 歲兒童大部分都是 2010 年的 10 歲兒童。為了看到這一點(diǎn),請(qǐng)查看 14 歲的金色圖表和 10 歲的藍(lán)色圖表。事實(shí)上,你會(huì)注意到,整個(gè)金色圖表(2014 年)看起來像藍(lán)色圖表(2010 年)向右滑了 4 年。 由于 2010 年至 2014 年間進(jìn)入該國的兒童的凈效應(yīng),這個(gè)下滑幅度還是有所上升, 幸運(yùn)的是,在這些年代,沒有太多的生命損失。

條形圖

對(duì)于本節(jié)的最后一個(gè)例子,我們看看加利福尼亞州以及整個(gè)美國的成人和兒童的種族分布情況。

凱撒家庭基金會(huì)根據(jù)人口普查數(shù)據(jù),編制了美國人口種族分布情況。基金會(huì)的網(wǎng)站提供了 2014 年整個(gè)美國人口以及當(dāng)年 18 歲以下的美國兒童的數(shù)據(jù)匯總。

這里是一個(gè)表格,采用了美國和加利福尼亞州的數(shù)據(jù)。 這些列代表美國和加利福尼亞州的每個(gè)人,美國和加州的兒童。 表格的主體包含不同類別的比例。 每一列顯示了,該列對(duì)應(yīng)的人群的種族分布。 所以在每一列中,條目總計(jì)為 1。

usa_ca = Table.read_table('usa_ca_2014.csv')
usa_ca
Ethnicity USA All CA All USA Children CA Children
Black 0.12 0.05 0.14 0.05
Hispanic 0.18 0.38 0.24 0.5
White 0.62 0.39 0.52 0.29
Other 0.08 0.18 0.1 0.16

我們自然想要比較這些分布。 直接比較列是有意義的,因?yàn)樗袟l目都是比例,因此在相同刻度上。

barh方法允許我們通過在相同軸域上繪制多個(gè)條形圖,將比較可視化。這個(gè)調(diào)用類似于scatterplot:我們必須指定類別的公共軸。

譯者注:軸域(Axes)是橫軸和縱軸圍城的區(qū)域。

usa_ca.barh('Ethnicity')
image

雖然繪制疊加的條形圖非常簡單,但是我們可以在這個(gè)圖表上找到太多的信息,以便能夠理清種群之間的相似性和差異性。 似乎很清楚的是,美國所有人和美國兒童的種族分布比任何其他列都更相似,但是一次比較一對(duì)要容易得多。

首先比較美國和加利福尼亞的整個(gè)人口。

usa_ca.select('Ethnicity', 'USA All', 'CA All').barh('Ethnicity')
image

這兩個(gè)分布是完全不同的。 加利福尼亞州的拉美裔和其他類別比例較高,黑人和白人比例相應(yīng)較低。 這種差異主要是由于,加利福尼亞州的地理位置和移民模式,無論是歷史上還是近幾十年來。 例如,加利福尼亞的“其他”類別包括相當(dāng)一部分亞洲人和太平洋島民。

從圖中可以看出,2014 年加州近 40% 的人口是拉美裔。 與該州兒童人口的比較表明,未來幾年拉美裔人口的比例可能會(huì)更高。 在加州兒童中,50% 屬于拉美裔。

usa_ca.select('Ethnicity', 'CA All', 'CA Children').barh('Ethnicity')
image

更復(fù)雜的數(shù)據(jù)集自然會(huì)產(chǎn)生各種有趣的可視化效果,包括不同種類的重疊圖形。 為了分析這些數(shù)據(jù),獲得更多的數(shù)據(jù)操作技能的有幫助的,這樣我們就可以將數(shù)據(jù)轉(zhuǎn)化為一種形式,使我們能夠使用本節(jié)中的方法。 在下一章中,我們將介紹其中的一些技巧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容