從經濟數據中學習資料分析

Pecu Tsai
Feb 4, 2021

程式範例採用 Google Colaboratory 執行,請搭配程式碼閱讀

接續著在SEP教室學習長大所提,從人生的意義來思考未來,再帶著K5~K10的孩子們透過經濟數據來看看這個世界。

就像我們想大致上快速認識某人,會先從一些能描述這個人的數值資料著手,例如:目前幾歲、月收入有多少、每週工作時間、每週學習時間。那如果想要快速瀏覽一個國家,就可以從經濟數據中去挑出幾個指標,來觀察這個國家,在某段時期的狀況。

為降低孩子們進入資料分析的門檻,直接使用Python Plotly module內建的蓋普曼德基金會(Gapminder Foundation)資料集,作為分析之資料來源。接著,透過互動式問答,逐步帶出Python DataFrame的使用語法。

Pecu: 請問這個資料表中,使用了哪些欄位來描述一個國家?

import plotly.express as px
df = px.data.gapminder()
df.head()

我們印出前五筆資料後,看到的欄位有country(國家名稱)、continent(洲名)、year(年份)、lifeExp(國人平均壽命)、pop(國家人口數)、gdpPercap(以美元計價的人均GDP)。

除了人均GDP比較不直觀,我們特地提出來說明,其餘的欄位都能一目了然。從wiki查到的資訊如下:

人均GDP是國內生產總值除以年中人口數。 這裡的數字沒有考慮到生活費用在不同的國家的差異,而且因為滙率變化每年其結果可以差別很大。 這種滙率波動可能會改變一個國家的每年排名,即使他們往往很少或根本沒有改變其人民的生活水平。 因此,這些數字應謹慎使用,否則有可能會在應用時發生錯誤。

原文網址:https://zh.wikipedia.org/zh-tw/%E5%90%84%E5%9B%BD%E4%BA%BA%E5%9D%87%E5%9B%BD%E5%86%85%E7%94%9F%E4%BA%A7%E6%80%BB%E5%80%BC%E5%88%97%E8%A1%A8_(%E5%9B%BD%E9%99%85%E6%B1%87%E7%8E%87)

Pecu: 假設我們先以人均GDP來代表某個國家的富裕程度,請問這個資料集中,最有錢的國家是哪一個?

rich = df.loc[(df['gdpPercap']==max(df['gdpPercap']))]
rich

Pecu: df這個變數是從px這個模組中取得內建資料px.data.gapminder(),使用==判斷式,過濾出df[‘gdpPercap’]的最大值max(df[‘gdpPercap’]),結果出現了Kuwait(科威特)在1957年時人均GDP達113523.1329美元,是當時最有錢的國家。

孩子們開始好奇,那是甚麼樣的時代,科威特是甚麼國家?為什麼都沒聽過?為什麼不是美國最有錢?

Pecu: 這時我們先暫停一下,科威特在1957年是最有錢的國家,大家相信嗎?如果懷疑的話,我們來Google一下,為什麼這個國家在那個時候有錢,而現在你們看到這個結果,卻覺得很奇怪?

孩子們開始回應,發現了1990年的波斯灣戰爭,伊拉克軍隊入侵科威特,推翻科威特政府,並宣布科威特的「回歸」以及大伊拉克的「統一」。或許是經歷了這場戰爭後,造成科威特不再是最有錢的國家。

欠錢不還,更翻臉併吞債主國!30年前伊拉克揮兵入侵科威特,成自取滅亡的開端

原文網址:https://www.storm.mg/article/2907052?page=1

更多的科威特故事,就留待之後我們再繼續探討。但孩子們已經慢慢察覺到,透過寫程式的過程,來橫向連結更多不同的學科學習技巧,讓學習變得更有趣,讓腦袋更靈活。

Pecu: 為了要比較不同年份不同國家的人均GDP,我們先來瀏覽一下,這份資料所收錄的區間是哪幾年?

df['year']

Pecu: 我們看到從1952年到2007年,總共有1704筆資料,那這些資料中最近年的最有錢國家又是哪一個?

lastdata = df.loc[(df['year']==max(df['year']))]
lastdata

孩子們依樣畫葫蘆地,使用==判斷式,搭配df.loc取得特定的橫列資料,過濾出df[‘year’]的最大值max(df[‘year’]),即為最近年份的資料,再將2007年的所有資料置於lastdata變數中。接著,要舉一反三地,繼續使用max來找出lastdata中最有錢的國家。

rich = lastdata.loc[lastdata['gdpPercap']==max(lastdata['gdpPercap'])]
rich

孩子們學著如何用口語化的表達,轉成Python程式語言,很自然地說出,將year換成gdpPercap,將df換成lastdata,就可以得到最有錢的國家是挪威。

Pecu: 那我們這樣子一步步列下抽取特定資料的語法,還是看不到全貌,我們來嘗試看看,把這些條件放在Plotly視覺化套件中,一起比比看不同國家,在2007年的人均GDP、平均壽命、人口數是如何。

fig = px.scatter(df.query("year==2007"), x="gdpPercap", y="lifeExp",size="pop", color="continent",hover_name="country", log_x=True, size_max=60)fig.show()

從px這個plotly模組中,使用XY散佈圖scatter,將資料範圍鎖定在2007年,橫軸x是人均GDP,縱軸y是平均壽命,圓圈大小size是人口數,不同顏色color代表不同的洲名。當滑鼠滑過特定點,hover_name指定顯示出相對應的國家名country,因為人均GDP的金額範圍尺度跨越太大,有從幾百美金到幾十萬美金,這時候橫軸x的對數尺度log_x,就要設定為True。

當圖表數據源的數據差異較大時,較小的數據點可能與橫坐標軸重合,或者不能清晰的顯示變化趨勢,如圖所示。若數據都大於零,則可以使用對數刻度來解決此問題。

原文網址:https://kknews.cc/news/em953yz.html

最後透過fig.show()畫出來。

Pecu: 我們看到平均壽命和人均GDP呈現一個正相關的走勢,人均GDP低以及平均壽命短的,集中在非洲。人均GDP高以及平均壽命長的,集中在美國和歐洲,而亞洲介於非洲與歐美之間。除了這些,你們還看到甚麼呢?為什麼會產生這樣的結果呢?和國家施行的政策有關係嗎?歐美奉行的是甚麼主義?非洲呢?亞洲呢?

請大家回家後,再好好地從網路上收集資料,下堂課,我們再一起解讀這張圖背後所隱含的故事。

--

--