資料呈現與繪圖

曾意儒 Yi-Ju Tseng
2017/08/07

資料分析步驟

  • 資料匯入
  • 資料清洗處理並轉換為Tidy data
  • 資料分析
  • 資料呈現與視覺化

資料呈現

  • Table 1

Table 1

library(readr)
# 讀入疾病統計檔資料,請將檔案放在專案路徑下
DiagSumS <- read_csv("DiagSumS.csv")
#第一次使用前先安裝
#install.packages("tableone")
library(tableone)
CreateTableOne(data=DiagSumS,
      strata = "性別",
      vars = c("年齡","來源別","住院天數"))
                      Stratified by 性別
                       F             M             p      test
  n                     1672            31                    
  年齡 (mean (sd))     53.15 (11.86) 42.48 (10.55) <0.001     
  來源別 = O (%)        1423 (85.1)     24 (77.4)   0.351     
  住院天數 (mean (sd))  5.41 (7.80)   5.00 (5.07)   0.773     

Table 1

CreateTableOne(data=DiagSumS,
      strata = "性別",
      vars = c("年齡","來源別","住院天數"))
                      Stratified by 性別
                       F             M             p      test
  n                     1672            31                    
  年齡 (mean (sd))     53.15 (11.86) 42.48 (10.55) <0.001     
  來源別 = O (%)        1423 (85.1)     24 (77.4)   0.351     
  住院天數 (mean (sd))  5.41 (7.80)   5.00 (5.07)   0.773     

Table 1 to Excel?

t1<-CreateTableOne(data=DiagSumS,
          strata = "性別",
          vars = c("年齡","來源別","住院天數"))
print(t1, quote = TRUE, noSpaces = TRUE)
                        "Stratified by 性別"
 ""                      "F"             "M"             "p"      "test"
  "n"                    "1672"          "31"            ""       ""    
  "年齡 (mean (sd))"     "53.15 (11.86)" "42.48 (10.55)" "<0.001" ""    
  "來源別 = O (%)"       "1423 (85.1)"   "24 (77.4)"     "0.351"  ""    
  "住院天數 (mean (sd))" "5.41 (7.80)"   "5.00 (5.07)"   "0.773"  ""    

資料視覺化大綱

  • 資料視覺化的目的
  • ggplot2
  • ggplot2+地圖
  • 台灣面量圖
  • Heatmap
  • Treemap

資料視覺化的目的

  • 探索圖 (Exploratory graphs)
    • 了解資料的特性
    • 尋找資料的模式(patterns)
    • 建議資料分析與建模的策略
  • 結果圖 (Final graphs)
    • 結果呈現與溝通

探索圖特性

  • 很快就可以做一張圖
  • 主要目的是了解資料的樣子
  • 不用做圖形格式調整美化

結果圖特性

  • 比較,呈現差異
    • 比較什麼?誰跟誰比較?
  • 呈現因果關係(causality),機制(mechanism),結果解釋(explanation),系統化的結構(systematic structure)
    • 因果模型?為什麼你想要做這樣的比較
  • 呈現多變數(Multivariate)資料
    • 多變數(Multivariate):超過兩個變數就叫多變數
    • 所有真實事件都是多變數的

結果圖特性

  • 將證據整合呈現
    • 在同一個畫面呈現文字、數字、圖表
    • 盡量用圖形呈現資料
  • 將圖表做適當的標記與說明,包括xy軸名稱、單位、資料來源等
    • 資料圖表必須可以呈現你想說的故事
  • 內容才是最重要的
    • 資料不好,分析不好,圖表再美也沒有用

常用的畫圖套件

  • 基本功能(Base):可自學
  • lattice:可自學
  • ggplot2

ggplot2簡介

“In brief, the grammar tells us that a statistical graphic is a mapping from data to aesthetic attributes (colour, shape, size) of geometric objects (points, lines, bars). The plot may also contain statistical transformations of the data and is drawn on a specific coordinate system”

-from ggplot2 book

ggplot2簡介

ggplot2簡介

  • 做圖的文法包括兩個最主要元素

    • Aesthetic attributes:包括顏色、形狀、點的大小與線的粗細等
    • Geometric objects:包括點、線、盒狀圖、直條圖等
  • 其他元素

    • Facets:提供在同一張圖內做多個子圖的方法,只要使用Faceting功能設定子圖分類的依據參數即可
    • Stats:將資料做統計轉換
    • Scales:修改點線的顏色、形狀、xy軸的範圍等

ggplot()

使用ggplot2作圖有以下步驟:

  • 準備好資料
  • 設定Aesthetic attributes
    • 使用aes(x, y, ...)指定
  • 指定Geometric objects
    • geom_point()
    • geom_line()
    • geom_polygon()
    • geom_errorbar()

ggplot()

library(ggplot2) 
##先安裝 install.packages("ggplot2")
  • ggplot(data,…)

ggplot() 設定重要元素

  • Aesthetic attributes
    • aes(x = Species, y = Sepal.Length)
  • Geometric objects
    • geom_point()
ggplot(iris, 
       aes(x = Species, y = Sepal.Length)) + 
    geom_point()

plot of chunk unnamed-chunk-6

ggplot() geom_boxpolt()

geom_boxplot()改畫盒狀圖

ggplot(iris, 
       aes(x = Species, 
           y = Sepal.Length)) + 
    geom_boxplot()

plot of chunk unnamed-chunk-7

ggplot() Faceting

直向分類~橫向分類

ggplot(iris, 
       aes(x = Sepal.Width, 
           y = Sepal.Length)) + 
    geom_point()+facet_grid(Species~.)

plot of chunk unnamed-chunk-8

ggplot() Faceting

直向分類~橫向分類

ggplot(iris, 
       aes(x = Sepal.Width, 
           y = Sepal.Length)) + 
    geom_point()+facet_grid(.~Species)

plot of chunk unnamed-chunk-9

ggplot() geom_smooth()

替xy散佈圖加上趨勢線

ggplot(iris, 
       aes(x = Sepal.Width, 
           y = Sepal.Length)) + 
    geom_point()+facet_grid(Species~.)+
    geom_smooth()

plot of chunk unnamed-chunk-10

ggplot() geom_smooth()

替xy散佈圖加上趨勢線,使用linear regresion

ggplot(iris, 
       aes(x = Sepal.Width, 
           y = Sepal.Length)) + 
    geom_point()+facet_grid(Species~.)+
    geom_smooth(method='lm')

plot of chunk unnamed-chunk-11

ggplot() geom_line()

改用geom_line()畫線

ggplot(iris, 
       aes(x = Sepal.Width, 
           y = Sepal.Length)) + 
    geom_line()+facet_grid(Species~.)

plot of chunk unnamed-chunk-12

ggplot() 顏色分組

改用顏色分組,使用aes(color='group name')

ggplot(iris, 
       aes(x = Sepal.Width, 
           y = Sepal.Length,
           color=Species)) + 
    geom_line()

plot of chunk unnamed-chunk-13

ggplot() 綜合練習

  • 讀入內建iris資料
  • ggplot()畫xy散佈圖
    • x軸:Sepal.Length
    • y軸:Sepal.Width
    • 子圖:Species,每個Species畫在新的欄位
  • ggplot()做盒狀圖
    • x軸:Species
    • y軸:Sepal.Width

ggplot() 注意事項

  • 提供資料時,把資料修改為想要在圖片顯示的文字
  • 如果是離散性的資料,但卻又是數值時(像是1,2,3)可以用factor()轉換

ggplot() 資料標示+參數設定

  • 標籤 xlab(), ylab(), labs(x=,y=), ggtitle()
  • 每一個geom_*()都有參數可設定
  • 圖形樣式設定 theme(),可使用內建樣式
    • theme_gray(): 灰背景,預設樣式
    • theme_bw(): 黑白樣式
  • 使用其他樣式套件

ggplot2 參考資料

ggplot2+地圖

  • Choropleth map面量圖
  • ggmap()
  • Density Map
  • 參考資料

ggmap package

  • 把google map載入並作圖的套件
  • 基於ggplot2套件開發
  • 第一次使用前需要安裝
##第一次使用前先安裝
install.packages("ggmap") 
  • get_map()函式取得google map圖層
    • location 地點,可以是地名,也可以是經緯度座標
    • zoom 放大倍率
    • language 地圖語言
  • ggmap()函式將取得的圖層畫出來

get_map() + ggmap()

library(ggmap)
twmap <- get_map(location = 'Taiwan', 
                 zoom = 7,
                 language = "zh-TW")
ggmap(twmap)

plot of chunk unnamed-chunk-15

ggmap + open data 資料載入

  • 只要資料有經緯度等資訊,就可以使用ggmap package與各式資料結合呈現
  • 台北市水質資料
library(jsonlite)
library(RCurl)
WaterData<-fromJSON(getURL("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=190796c8-7c56-42e0-8068-39242b8ec927"))
WaterDataFrame<-WaterData$result$results
WaterDataFrame$longitude<-as.numeric(WaterDataFrame$longitude)
WaterDataFrame$latitude<-as.numeric(WaterDataFrame$latitude)
WaterDataFrame$qua_cntu<-as.numeric(WaterDataFrame$qua_cntu)
WaterDataClean<-WaterDataFrame[WaterDataFrame$qua_cntu>=0,]
head(WaterDataClean)
  _id update_date update_time       qua_id  code_name longitude latitude
1   1  2017-08-05  22:15:00   CS00         雙溪淨水場  121.5609 25.11574
2   2  2017-08-05  22:15:00   CS01           衛理女中  121.5440 25.10325
4   4  2017-08-05  22:15:00   CS03         華興加壓站  121.5348 25.10356
5   5  2017-08-05  22:15:00   CX00         長興淨水場  121.5404 25.01633
6   6  2017-08-05  22:15:00   CX02           市政大樓  121.5566 25.04250
7   7  2017-08-05  22:15:00   CX03             市議會  121.5536 25.04001
  qua_cntu qua_cl qua_ph
1     0.02   0.59    7.5
2     0.08   0.37    7.5
4     0.11   0.31    7.3
5     0.02   0.53    7.4
6     0.04   0.59    7.3
7     0.04   0.52    7.5

ggmap + open data 繪圖

library(ggmap)
TaipeiMap <- get_map(
    location = c(121.43,24.93,121.62,25.19), 
    zoom = 11, maptype = 'roadmap')
TaipeiMapO <- ggmap(TaipeiMap)+ 
    geom_point(data=WaterDataClean, 
               aes(x=longitude, y=latitude,
                   color=qua_cntu,size=3.5))+ 
    scale_color_continuous(
        low = "yellow",high = "red")+ 
    guides(size=FALSE)
TaipeiMapO

ggmap + open data