羅左欣 BE STRONG TO BE USEFUL

20160917 [學習筆記] 分析資料與繪製地圖,進行空間資料視覺化


參考資料

  1. R 的 ggmap 套件:繪製地圖與資料分佈圖,空間資料視覺化
  2. 聚類算法:DBScan算法
  3. Rail occurrence data from January 2004 to present
  4. 加拿大行政區劃
  5. 經緯度

前言

  • 最近實驗室需要進行專題的展示,而我本身也在準備近期要分享的演講簡報,於是便試著將這一陣子的工作作個簡單的筆記和紀錄。

  • 我負責的工作是:將爬蟲抓下來且經過 DBSCAN 演算法 分類後的資料,繪製在地圖上並進行資料視覺化。詳細的作法預計會在下一篇說明,現在先找個範例練習。

(一) 先別管資料,單純顯示地圖

1. 顯示基本地圖

我先參考 R 的 ggmap 套件:繪製地圖與資料分佈圖,空間資料視覺化 的內容,將相關的套件安裝好後並加以載入︰

> install.packages("ggmap")
> install.packages("mapproj")
> library(ggmap)
> library(mapproj)

之後,先試著用 ggmap() 抓一個地點來看看: * 在這裡使用 “加拿大(Canada)” 作為示範。

# 使用 get_map() 設定要抓的地點,以及地圖放大的比例。
# location:要抓的地點
# zoom:調整地圖縮放的參數,需要視需求調整
# 在地圖上顯示的文字語言
> map <- get_map(location = 'Canada', zoom = 4, language = "zh-TW")

# 將地圖顯示出來
> ggmap(map)

[顯示結果]

  • 看起來沒有很清楚,不過至少可以確定地圖上顯示的是北美洲地區。

2. 再精確一點的地區

整個北美洲太大了,我想要針對指定的地區(城市)進行顯示,在這裡以”溫哥華(Vancouver)”為例。 但是如果直接在location參數上輸入Vancouver(溫哥華),地圖會偏掉。 這時候可以改用經緯度座標來指定:

  • 隨意找一個溫哥華內部的地點來定位。
  • [範例] 經度:49.27894861、緯度:-123.11536789
# lon:設定座標,緯度(longitude)、lat:經度(latitude)
> map <- get_map(location = c(lon = -123.11536789, lat = 49.27894861), zoom = 12, language = "zh-TW")
> 
> ggmap(map)

[顯示結果]

  • 嗯,這張看起來清楚多了!

3. 地圖的類型、明暗程度的調整

  • 地圖的類型可以用:maptype 參數調整
  • 明暗程度可以用:darken 參數調整

詳細的操作在這裡就不多加詳述,可以看看參考資料。

(二) 尋找 OpenData,進行檢視和分類

1. 使用開放資料 Open Data

讓我們先下載原始資料檔和說明檔:

2. 檢視資料,取得我們要用的資訊

先看一下欄位名稱:

詳細的欄位資訊都在說明檔裡,我們在這裡只需要 OCC_TYPEACC_INC_TYPEPROVINCE(省份) 這三個欄位的資料。 首先要檢查工作目錄的位置是否正確,如果不正確則需要調整:

> getwd()
[1] "/home/shouzo"
> 
> setwd("/home/shouzo/r_test")	# 切換工作目錄
> getwd()
[1] "/home/shouzo/r_test"
> 
> 
> dir()		# 確認目錄裡的檔案
[1] "dd-20150217.csv" "Rail_Eng.csv"   
> 

我們試著讀取 Rail_Eng.csv 的檔案內容,你可以看到這個檔案裡的資料有一萬多筆。

> read.csv("Rail_Eng.csv")

# 中間省略...

450                                   N/A 2016-09-15T09:18:21
451                                   N/A 2016-09-15T09:18:21
452                                   N/A 2016-09-15T09:18:21
453                                   N/A 2016-09-15T09:18:21
454       FLASHING LIGHT SIGNALS AND BELL 2016-09-15T09:18:21
 [ reached getOption("max.print") -- omitted 17653 rows ]

因為我們只需要 OCC_TYPEACC_INC_TYPEPROVINCE 這三個欄位的資料,所以要稍微加以細分:

> # 將整個檔案裡的資料檔存入變數 "Ori_Data"
> Ori_Data <- read.csv("Rail_Eng.csv")
>
> # 取得並存放 "OCC_TYPE" 欄位的資料
> OCC_TYPE <- Ori_Data$OCC_TYPE
> 
> # 取得並存放 "ACC_INC_TYPE" 欄位的資料
> ACC_INC_TYPE <- Ori_Data$ACC_INC_TYPE
>
> # 取得並存放 "PROVINCE" 欄位的資料
> PROVINCE <- Ori_Data$PROVINCE

剛剛我們分別對 OCC_TYPEACC_INC_TYPEPROVINCE 進行資料的存放和處理,現在我們來看看裡面有哪些內容。

  • 查看 OCC_TYPE
> # 查看 OCC_TYPE 裡面有哪些資料類型
> levels(OCC_TYPE)
[1] "ACCIDENT" "INCIDENT"
> 
  • 查看 ACC_INC_TYPE
> # 查看 ACC_INC_TYPE 裡面有哪些資料類型
> levels(ACC_INC_TYPE)
 [1] ""                                      
 [2] "COLLISION INVOLVING TRACK UNIT"        
 [3] "CREW MEMBER INCAPACITATED"             
 [4] "CROSSING"                              
 [5] "DERAILMENT INVOLVING TRACK UNIT"       
 [6] "DG LEAKER"                             
 [7] "EMPLOYEE"                              
 [8] "FIRE"                                  
 [9] "MAIN-TRACK SWITCH IN ABNORMAL POSITION"
[10] "MAIN-TRACK TRAIN COLLISION"            
[11] "MAIN-TRACK TRAIN DERAILMENT"           
[12] "MOVEMENT EXCEEDS LIMITS OF AUTHORITY"  
[13] "NON-MAIN-TRACK TRAIN COLLISION"        
[14] "NON-MAIN-TRACK TRAIN DERAILMENT"       
[15] "PASSENGER"                             
[16] "R/S COLL. WITH ABANDONED VEHICLE"      
[17] "R/S COLL. WITH OBJECT"                 
[18] "R/S DAMAGE WITHOUT DERAIL./COLL."      
[19] "RUNAWAY ROLLING STOCK"                 
[20] "SIGNAL LESS RESTRICTIVE THAN REQUIRED" 
[21] "TRESPASSER"                            
[22] "UNPROTECTED OVERLAP OF AUTHORITIES"    
> 
  • 查看 PROVINCE
> # 查看 PROVINCE 裡面有哪些資料類型
> levels(PROVINCE)
 [1] ""     "ALBERTA"     "BRITISH COLUMBIA"     
 [4] "MANITOBA"     "NEW BRUNSWICK"     "NEWFOUNDLAND"         
 [7] "NORTHWEST TERRITORIES"     "NOVA SCOTIA"     "ONTARIO"
[10] "QU\xc9BEC"     "SASKATCHEWAN"
> 

3. 先想一下︰我們用這些資料要做什麼?

這份是源自於加拿大的 OpenData 資料,而我現在想要用這些資料去 觀察 各省份地鐵事故分佈的情形,可以怎麼做?

這個問題可以從幾個觀點來看(由簡單到複雜):

  1. 哪一個地區比較常發生事故?
  2. 哪一個地區比較常發生”何種類型”的事故?
  3. …其他的之後可以再想想

這一次先探討上方的第1點,我個人的想法如下: 『 根據事故發生的次數,以 “點狀圖” 的方式去凸顯發生頻率。』

  • 點越大,就代表事故發生的次數越多。

就像是這張圖:

(三) 將分類後的資料放在地圖上,進行視覺化

我們從 PROVINCE 這個欄位中知道資料分別來自 9 個省份 (扣除兩項無法辨別的資料);讓我們先個別幫這些地區定義座標,這樣在之後便可以精準的定位:

  1. ALBERTA
    • 座標:(56.245426, -115.134777)
  2. BRITISH COLUMBIA
    • 座標:(54.156673, -124.801499)
  3. MANITOBA
    • 座標:(55.829413, -97.121341)
  4. NEW BRUNSWICK
    • 座標:(46.717936, -66.294149)
  5. NEWFOUNDLAND
    • 座標:(54.501215, -61.985263)
  6. NORTHWEST TERRITORIES
    • 座標:(64.585305, -121.295028)
  7. NOVA SCOTIA
    • 座標:(45.108690, -63.650974)
  8. ONTARIO
    • 座標:(51.222450, -85.156691)
  9. SASKATCHEWAN
    • 座標:(54.829432, -105.995397)

接著,讓我們看看這些地區在資料中出現的次數:

> summary(PROVINCE)
                                    ALBERTA      BRITISH COLUMBIA 
                    1                  3758                  3082 
             MANITOBA         NEW BRUNSWICK          NEWFOUNDLAND 
                 1711                   324                    69 
NORTHWEST TERRITORIES           NOVA SCOTIA               ONTARIO 
                   19                   152                  4819 
            QU\xc9BEC          SASKATCHEWAN 
                 2399                  1773 
> 

Comments