# Python大數據分析(ㄧ)
###### Aaron Ho
###### tags: `python` `bigdata`
## 第一堂課:大數據分析實務-資料視覺化
###### 2021-10-13
### 何謂大數據(Big data)
指過去傳統一般數據相關的應用程式無法處理的巨大或複雜資料。
### 資料流程
![](https://i.imgur.com/tRVgjXa.png)
##### 資料收集
透過各種管道或來源收集各式各樣結構化或非結構化的資料,例如:App使用者操作記錄、後端使用者消費記錄、協力廠商提供的資料、舊系統的資料等等。
##### 資料儲存
將收集到的資料透過資料清洗(ETL)手段整理成結構化或可使用的資料後儲存到資料庫當中。
##### 資料倉儲
各種不同時間點或是已經整理好的資料庫,搭配設計好的協定用來管理、合併這些資料。
##### 資料探勘
透過複雜的專門的技術,例如:決策樹、回歸分析、類神經網路、群集分析等等,利用資料倉儲內的資料,來找出模式、分析或預測等等。
##### 資料視覺化
當資料量過多時,為了更即時的吸收資訊以便快速的做出決策,需要把資訊視覺化來呈現。
### 資料視覺化
#### 何謂資料視覺化
資料視覺化是指將資料以視覺的形式來呈現,如圖表或地圖,以説明人們透過眼睛快速了解這些資料的意義。
傳統只透過觀察數字、統計資料,來轉換而獲得清晰的結論並不是一件簡單的事情,但是人的大腦對視覺資訊的處理優先于對文字的處理,所以使用圖表、圖形和設計項目把資料進行視覺化,可以讓人類更容易的解釋資料模式、趨勢、統計規律和資料相關性。
好的資料視覺化四個要素:簡單、充實、高效、美觀。
例如:
![](https://i.imgur.com/sX34B0l.gif)
皮尤研究中心所製作的「未來的美國(Next America)」對美國的人口統計資料進行了全面的檢視,並將其整合成一個龐大且美觀的互動式資料視覺化專案。
該專案展示美國日益成長的多樣性、人口老化現象等等,由歷史背景所造成的趨勢來做分析,進而對未來數十年美國可能發生的人口變化進行預測。
其中一個資料視覺化的亮點就是以動畫展示了年齡和性別人口細分金字塔。在幾秒鐘內,就可以看見從 1950 年代以來人口統計的變化,出生率的降低以及醫療進步降低死亡率,讓年齡的分布從一個金字塔慢慢的變成接近一個矩形的形狀。
> **出處**
>
> Next America: http://www.pewresearch.org/next-america
#### 為什麼需要資料視覺化
資料視覺化可協助您將所有細微資料轉化為易於理解、視覺美觀且實用的商務資訊。
例如:
| 姓名 | 分數 |
| ------ | ---- |
| Aaron | 98 |
| Andy | 76 |
| Apple | 54 |
| Abner | 63 |
| Amber | 84 |
| Amanda | 33 |
如果想知道最高分是誰,需要花點時間一筆一筆資料看過之後才能知道,但卻很可能因為記憶的問題而誤判。
但如果轉為如下的圖表:
![](https://i.imgur.com/qbI4GlT.png)
就可以一眼就看出來分數最高的是誰,這個簡單的圖表就可以展現出資料視覺化的作用。
#### 圖表種類
##### 比較
用於強調資料大小,將同類型的個體擺放在相同衡量的維度單位上, 能夠清楚看出其對應的大小關係。
##### 分佈/占比
用於強調資料分佈,圖表以次數分配表呈現,要將數據以各組組界為分界。用於強調資料占比,將整體資料切成多個項目,並用%表示,全部疊加起來就是100%的比例
##### 時間推移
用於表達資料的時間序列的關係, 此處指的是時間排序的順序 ,單位隨時間使用情境也會有差異,像是以 年/季/月/日 或是更小的單位。
##### 指標
用於表達資料對數值設定高低標數值,並且可針對高低標數值設定化格式化條件,讓使用者可以透過顏色、指標,快速看出目前數值狀態是否異常。
##### 關聯/流程
用圖解展示事件之間的各種關聯或事件的執行流程,幫助使用者找出造成問題的所有潛在因素。
##### 地圖
通常用世界地圖或是地區圖來表達,能夠清楚看出區域與區域之間的差異性,更可以利用街道圖顯示街道的標示,幫助使用者標示資料的地理位置。
##### 其他
不是所有的資料按照上面的圖表類型就能表達清楚,所以以下視覺化元件也是一種選擇,例如:各種分類按鈕元件、數值與文字可以一起呈現的表格元件、影片播放元件、樞紐分析數值元件...等,只要能夠幫助閱讀者更容易理解資訊,都是好的視覺化元件。
#### 資料視覺化的方式
##### 透過程式語言開發
直接使用程式語言來將資料視覺化,好處是對資料的來源或是操作上都會更加彈性、且採購成本極低,缺點就是門檻較高,且需要有程式設計背景,熱門的資料視覺化語言有Python、JavaScript、R等等。
##### Grafana
Grafana 是一套開源的視覺化和分析工具,並支援多種資料來源,管理者不會因為受限於不同的資料來源而必須使用不同的監控工具。透過 Grafana 將採集資料做查詢後視覺化的展現,並可即時通知示警。
##### Microsoft PowerBI
微軟繼Excel之後推出的BI產品,可以和Excel無縫連接使用,創建個性化的資料看板;其市佔率已經超越原本第一的Tableau。
##### Tableau
幾乎是資料分析師人人會提的工具,內置常用的分析圖表,和一些資料分析模型,可以快速的探索式資料分析,製作資料分析報告。
因為是商業智慧,解決的問題更偏向商業分析,用 Tableau可以快速地做出動態交互圖,並且圖表和配色也非常拿得出手。
### 現實中的資料視覺化範例
#### COVID-19大數據儀表板
- [國家高速網路中心COVID-19全球疫情地圖](https://covid-19.nchc.org.tw/index.php)
- [疾病管制署](https://nidss.cdc.gov.tw/nndss/GlobalMap?id=19CoV)
> 透過程式語言自行開發的資料視覺化
- [防疫科技資訊平台](https://covid.stpi.narl.org.tw/)
> 使用開源的Grafana資料視覺化工具
- [衛生福利部最新疫情資訊](https://covid19.mohw.gov.tw/ch/cp-4707-52357-205.html)
- [世界衛生組織COVID-19儀表板](https://covid19.who.int/)
> 使用Microsoft PowerBI資料視覺化工具
- [各國制定哪些政策因應此全球大流行疫情](https://public.tableau.com/profile/visualitics#!/vizhome/Covid-19GovermentMeasuresWorldwide/CovidGovernmentMeasuresWorldwide)]
> 使用Tableau視覺化工具
### 資料視覺化使用Python
#### 目標
從美國John Hopkins 大學的公開新冠肺炎每日資訊來取得新冠肺炎資料,並載入Pandas DataFrame後座資料處理並以Matplotlib將資料視覺化輸出。
#### COVID-19資料來源
所有資料來自於約翰霍普金斯大學(JHU)。
約翰霍普金斯大學蒐集的新冠病毒相關資料來自:世界衛生組織、歐洲疾病預防及控制中心和當地保健機構。
##### 位址:
https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_daily_reports
#### 程式規格
1. 從遠端載入資料到DataFrame。
2. 去除不需要的欄位資料。
3. 修改欄位名稱。
4. 合併相同國家的資料。
5. 取出前20名國家資料。
6. 建立視覺化圖表。
#### 開發環境
##### Colab簡介
Colaboratory (簡稱為「Colab」) 可讓你在瀏覽器上撰寫及執行 Python,只要有Gmail帳號就可以直接使用,且具備下列優點:
- 不必進行任何設定,預設已經安裝好Python資料分析的各種模組。
- 免費使用GPU來加速。
- 輕鬆共用,支援協同開發。
> Colab首頁:https://colab.research.google.com/
##### Colabd技巧說明
1. **常用快速鍵**
| 快速鍵 | 說明 |
| ---------------- | ---- |
| Cmd/Ctrl + Enter | 執行目前單元的程式碼 |
| Alt + Enter | 在目前單元下方新增一個單元 |
| Shift + Enter | 執行目前單元並將焦點切換到下一個單元 |
| Cmd/Ctrl + Shift + Enter | 僅執行被選取的程式碼 |
2. **暫存的Notebook**
常常colab 測試一些臨時的程式碼時會建立一堆雜亂、沒有標題的 Notebook,可以使用一個特殊的 scratch notebook,對著該 notebook 所做的任何更改都不會保存到你的主目錄中。
位址:https://colab.research.google.com/notebooks/empty.ipynb
3. **單元效能偵測**
Colab提供了內建功能來幫忙計算執行程式碼所需要的時間。在執行了一個單元(cell)之後,將滑鼠游標停在執行單元Icon上,就可以獲得程式碼的估算執行時間。
4. ###### **跳轉到定義**
與 IDE 類似,可以透過按Ctrl(MacOS為CMD)鍵,然後單擊一個類別或函式名稱來跳轉到定義。
5. **使用交互式 shell**
Colab 中沒有內建終端機視窗(Windows下的命令提示字元),但是可以使用 bash 命令以交互方式使用 shell 命令,只需執行:
```
!bash
```
現在,你可以在給定的輸入框中執行任何 shell 命令。
> 要退出 shell,只需在輸入框中鍵入 exit。
6. **目前的記憶體和磁碟使用情況**
Colab 提供了 RAM 和磁盤使用情況資訊。如果將滑鼠游標停在指示器上,將彈出一個視窗,其中包含目前記憶體和磁碟使用情況和總容量。
<img src="imgs/Screen Shot 2021-10-12 at 14.42.36.png" alt="Screen Shot 2021-10-12 at 14.42.36" style="zoom:50%;" />
> 更多參考:https://colab.research.google.com/notebooks/basic_features_overview.ipynb#scrollTo=JyG45Qk3qQLS
#### 程式碼解說
##### 引入需要的模組
```
import pandas as pd
import matplotlib.pyplot as plt
```
這裡會用到兩個Python在資料分析很重要的兩個模組,import指令是為了引入模組:
| 名稱 | 說明 |
| ---------- | ---------------------------------- |
| pandas | Python內資料處理和分析模組。 |
| matplotlib | Python內用來將資料視覺化。 |
##### 下載新冠肺炎資料並載入DataFrame
```
path = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/01-13-2021.csv'
df = pd.read_csv(path)
print(df.head())
```
- path裡面存放資料位址字串,字串兩邊需要有單引號或雙引號包圍。
- 透過pd.read_csv()方法可以直接連線到該為止並下載內容後存到df變數中,變數為記憶體一段空間。
##### 過濾掉不需要的欄位
```
df.drop(['FIPS', 'Admin2','Last_Update','Province_State', 'Combined_Key'], axis=1, inplace=True)
```
呼叫DataFrame的drop()方法可以丟棄下載的CSV資料的指定的欄位資料。
##### 修改欄位名稱
```
df.rename(columns={'Country_Region': "Country"}, inplace=True)
print(df.head())
```
把欄位名稱Country_Region修改為Country。
##### 合併相同國家的資料
```
world = df.groupby("Country")['Confirmed','Active','Recovered','Deaths'].sum().reset_index()
```
將Country欄位值相同的資料,把它們的Confirmed、Active、Recovered和Deaths這幾個欄位的數字作加總,並生成一個新的表格資料。
##### 取出前20名確診人數國家
```
top_20 = world.sort_values(by=['Confirmed'], ascending=False).head(20)
print(top_20.head(20))
```
將新生成的表格資料取出前20筆,這20筆會是一個新的表格資料。
##### 建立確診人數長條圖
```
plt.figure(figsize=(15,10))
plots = plt.barh(top_20['Country'], top_20['Confirmed'],
height=0.5,
left=None,
align='center',
color=['lightsteelblue',
'cornflowerblue',
'royalblue',
'midnightblue',
'navy',
'darkblue',
'mediumblue'])
```
1. 初始化matplotlib。
2. 建立長條圖,並設定長條圖的屬性:要使用的資料(國家和確診人數)、Bar高度、對齊方式、Bar的顏色。
##### 幫長條圖每個bar加上確診數字
```
for rect in plots:
width = rect.get_width()
plt.text(width, rect.get_y() + rect.get_height() / 2.0, '%d' % int(width), ha='left', va='center')
```
1. for-in迴圈會一個一個取出每一條Bar在圖表上的位置和大小,plt.text()方法透過大小的值在最後面加上確診數字。
2. 水平靠左對齊、垂直置中對齊。
##### 建立復原人數長條圖
```
plt.barh(top_20['Country'], top_20['Recovered'],
height = 0.5,
left = None,
align = 'center',
color = ['bisque', 'darkorange', 'burlywood', 'antiquewhite', 'tan', 'navajowhite', 'wheat'])
```
1. 建立長條圖,並設定長條圖的屬性:要使用的資料(國家和復原人數)、Bar高度、對齊方式、Bar的顏色。
2. 這條Bar比較短且會覆蓋在上一個Bar上面。
###### Matplotlib支援的顏色名稱
![](https://i.imgur.com/iJCIZyv.png)
![](https://i.imgur.com/yf2Crme.png)
![](https://i.imgur.com/ty3HPxn.png)
##### 設定X軸的標籤
```
plt.xlabel('Confirmed')
```
1. xlabel()方法設定圖表上X軸的標籤文字。
##### 設定圖表的大標題文字
```
plt.title('CODID-19 Top 20 confirmed country')
```
1. title()方法設定圖表大標題。
##### 反轉Y軸的顯示順序為由大到小
```
plt.gca().invert_yaxis()
```
1. 將y軸的Bar顯示順序反轉。
##### 顯示圖表
```
plt.show()
```
1. 將準備工作已經完成的圖表顯示到畫面上呈現。
#### 完整程式碼
```
import pandas as pd
import matplotlib.pyplot as plt
# 下載新冠肺炎資料並載入DataFrame
path = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/01-13-2021.csv'
df = pd.read_csv(path)
print(df.head())
# 過濾掉不需要的欄位
df.drop(['FIPS', 'Admin2','Last_Update','Province_State', 'Combined_Key'], axis=1, inplace=True)
# 修改欄位名稱
df.rename(columns={'Country_Region': "Country"}, inplace=True)
print(df.head())
# 合併相同國家的資料
world = df.groupby("Country")['Confirmed','Active','Recovered','Deaths'].sum().reset_index()
# 取出前20名確診人數國家
top_20 = world.sort_values(by=['Confirmed'], ascending=False).head(20)
print(top_20.head(20))
# 建立確診人數長條圖
plt.figure(figsize=(15,10))
plots = plt.barh(top_20['Country'], top_20['Confirmed'],
height=0.5,
left=None,
align='center',
color=['lightsteelblue',
'cornflowerblue',
'royalblue',
'midnightblue',
'navy',
'darkblue',
'mediumblue'])
# 幫長條圖每個bar加上確診數字
for rect in plots:
width = rect.get_width()
plt.text(width, rect.get_y() + rect.get_height() / 2.0, '%d' % int(width), ha='left', va='center')
# 建立復原人數長條圖
plt.barh(top_20['Country'], top_20['Recovered'],
height=0.5,
left=None,
align='center',
color=['bisque', 'darkorange', 'burlywood', 'antiquewhite', 'tan', 'navajowhite', 'wheat'])
# 設定X軸的標籤
plt.xlabel('Confirmed')
# 設定圖表的大標題
plt.title('CODID-19 Top 20 confirmed country')
# 反轉Y軸的顯示順序為由大到小
plt.gca().invert_yaxis()
# 顯示圖表
plt.show()
```
執行結果:
![](https://i.imgur.com/7tOD6Um.png)