關卡 1
這個課程是讓同學理解,如何透過資料視覺化的方式,找出不同欄位之間的關係與特徵。
關卡 2
我們拿事先準備好的hsb
資料集作為範例,此份資料集在RVisualization-01-One-Variable-Visualization 課程中曾使用過,記載了高中學生的基礎資料與各個科目的考試成績的資料。 本資料包含11個欄位、200筆記錄(200位學生), 第一欄(id)代表該名學生的編號; 第二欄(sex)代表學生性別;第三欄(race)代表學生的種族; 第四欄(ses)代表學生家庭社經等級; 第五欄(schtyp)代表是學校是公立或私立; 第六欄(prog)代表學校的類型; 第七欄至第十一欄則是各科考試成績。 請同學輸入View(hsb)先看看數據。
View(hsb)
關卡 3
在上一課中,hsb$math
是有混入-99的。 為了更真實的模擬現實社會,科學界在處理數據時,常常用-99或99等不自然的值來表示遺失的資料。 而這一課中,我們使用完整的hsb
資料給同學練習。
關卡 4
Part A:類別欄位 vs.類別欄位的資料視覺化。
關卡 5
考慮兩個類別型欄位的視覺化。 我們關心這筆資料中學生性別(sex)與公私立(schtyp)學校的關聯。 先使用table()
函數來建立交叉表 (cross table),請同學輸入以下指令,將交叉表指向tab1
這個變數:tab1 <- table(hsb$sex, hsb$schtyp)
。
tab1 <- table(hsb$sex, hsb$schtyp)
關卡 6
接下來,請同學輸入長條圖繪製函數barplot(tab1, legend=TRUE)
, 針對tab1
這筆數據畫出堆疊長條圖(stackd bar plot)。
barplot(tab1, legend=TRUE)
關卡 7
堆疊長條圖中有兩個顏色:淺灰、深灰分別代表男性(male)與女性(female)。
關卡 8
請觀察一下這張圖,哪種學校的數量比較多呢? A. 公立學校(public); B. 私立學校(private)
A
關卡 9
請觀察一下這張圖,私立學校的男生多還是女生多呢? A. 男生(male); B. 女生(female)
B
關卡 10
同學在作答時可能會發現,直接從堆疊長條圖上不是很容易觀察出不同顏色的區塊大小, 要達到我們的目的,應該採用分組長條圖 (grouped bar plot)。 請同學輸入:barplot(tab1, legend=TRUE, beside = TRUE, args.legend=list(x=3, y=90))
畫出分組長條圖:
barplot(tab1, legend=TRUE, beside = TRUE, args.legend=list(x=3, y=90))
關卡 11
透過觀察分組長條圖,我們可以更輕易的發現,私立學校 (private) 的女生人數多於男生 (female > male)。
關卡 12
在畫長條圖時,新增之圖例可能會蓋住原本的圖片,我們可以透過args.legend
參數來調整圖例位置。
關卡 13
Part B:類別欄位 vs. 類別欄位 vs. 單一數值的資料視覺化。
關卡 14
在畫長條圖時,不一定只使用次數作圖,也有可以是某變數的數值結果,如平均數 (mean
)、中位數 (median
) 以及標準差 (sd
)等等。
關卡 15
我們可以使用dplyr
套件中的group_by
與summarise
,計算特定組別下的統計指標。 譬如在給定學校公立或私立 (schtyp)、性別為男生或女生 (sex) 之下,學生的平均數學成績 (math)。 這部分的操作在 RDataEngineer-05-Data-Manipulation 課程中有詳盡的介紹。
關卡 16
請大家先安裝dplyr
套件。
check_then_install("dplyr", "0.4.3")
關卡 17
接著請大家載入dplyr套件。
library(dplyr)
關卡 18
請同學利用以下範例計算組內平均數學成績 dat2 <- summarise(group_by(hsb, sex, schtyp), math.avg=mean(math))
。
dat2 <- summarise(group_by(hsb, sex, schtyp), math.avg=mean(math))
關卡 19
接著,利用R 預設的xtabs
函數,將變數dat2
轉換成交叉tab2
表。 請同學利用以下範例,計算組內的數學成績平均值 tab2 <- xtabs(formula = math.avg ~ sex + schtyp , data = dat2)
。
tab2 <- xtabs(formula = math.avg ~ sex + schtyp , data = dat2)
關卡 20
在xtabs
的函數中,有一個特別的參數formula
。 我們可以使用?xtabs
,透過說明文件來理解formula
的意涵。 formula
是R 語言中一個特別的物件,常被用來模組化欄位與欄位之間的模型關係。 在本例中,波浪符號~
的左邊欄位代表應填入交叉表內的值 (數值型態), 而波浪符號右邊的欄位則是交叉表的類型 (類別型態),波浪符號右邊的欄位則以加號+
作為連結。 有關於其他formula
物件的使用方式可參考線性模型函數的說明文件?lm
。
關卡 21
現在請同學針對交叉表tab2
輸入指令:barplot(tab2, beside = TRUE, ylim = c(50, 58), xpd = FALSE)
繪製分組長條圖。
barplot(tab2, beside = TRUE, ylim = c(50, 58), xpd = FALSE)
關卡 22
為了放大視覺上的差異,我們透過ylim
和xpd
兩個參數,讓長條圖的起始值不是0,而是50。 參數ylim
能控制圖形的最低與最高值;參數xpd
則表示長條圖是否能超出圖形繪製區域。 如果xpd=TRUE
則長條圖會跨越x軸,超過圖形繪製範圍。
關卡 23
Part C:類別欄位 vs. 單一數值的資料視覺化。
關卡 24
關於類別欄位對單一數值的視覺化,一般而言有兩種做法:長條圖 (bar plot)和點標圖 (dor plot)。 先來計算各種族學生 (race) 的閱讀成績中位數 (read.med=median(read)
)。 請同學輸入以下指令:dat3 <- summarise(group_by(hsb, race), read.med=median(read)
建立dat3
。
dat3 <- summarise(group_by(hsb, race), read.med=median(read))
關卡 25
請同學輸入以下指令來繪製長條圖:barplot(dat3$read.med, names.arg=dat3$race, horiz = TRUE)
。
barplot(dat3$read.med, names.arg=dat3$race, horiz=TRUE)
關卡 26
在函數barplot
中的參數names.arg
可以控制每一塊長條的別名。horiz
可以讓長條圖以水平的方式呈現。
關卡 27
請同學輸入以下指令來繪製點標圖:dotchart(dat3$read.med, labels = dat3$race)
。
dotchart(dat3$read.med, labels = dat3$race)
關卡 28
在函數dotchart
中的參數labels
可以控制每一塊長條的別名。
關卡 29
本範例中,使用相同的資料dat3
繪製兩種圖形,但這兩種圖形的使用時機可能不完全相同。 長條圖強調的是各類別下的數值之大小(離零或是起始值有多遠), 而點標圖強調的則是各類別下數值的位置,譬如政黨傾向偏左還是偏右(越大不一定越好)。
關卡 30
Part D:類別欄位 vs. 數值欄位的資料視覺化。
關卡 31
與點標圖不同,當每一種類別對應的數值只有一個時,應使用箱形圖 (box plot) 進行視覺化。 譬如各種族學生的閱讀成績之分布,請同學輸入以下指令:plot(math ~ race, data=hsb)
。
plot(math ~ race, data=hsb)
關卡 32
請問同學,圖中顯示哪一種種族的學生有最好的數學成績? A. African American;B. Asian;C. Hispanic;D. White ?
B
關卡 33
傳統上,繪製箱形圖會使用boxplot
函數,現今的R版本已經可以支援高階繪圖函數plot
,透過formula
的控制來繪製箱型圖。 (請注意波浪符號~
左邊放數值型態的欄位,右邊放類別型態的欄位,並用加號+
做連結), 關於箱型圖詳細的控制參數,請使用?boxplot
閱讀說明文件。 請同學打開boxplot
的說明文件:
?boxplot
關卡 34
請問下列哪一個統計指標「不會」出現在boxplot的結果中? 請參考說明文件中,Value段落關於stats
的說明作答。 A: the lower hinge B: the median C: the mean D: the upper hinge
C
關卡 35
練習在boxplot
中控制formula
以加入更多類別的行欄位進行比較。 請同學輸入以下指令:boxplot(math ~ schtyp, data=hsb, col=c("darkblue", "gold"))
。
boxplot(math ~ schtyp, data=hsb, col=c("darkblue", "gold"))
關卡 36
在boxplot
上加入圖例legend
。 請同學輸入以下指令:legend("topleft", c("private", "public"), fill=c("darkblue", "gold"))
legend("topleft", c("private", "public"), fill=c("darkblue", "gold"))
關卡 37
請問同學,依照圖中的結果,學生數學成績比較好的是公立學校還是私立學校呢? A. 公立 (public.Hispanic); B. 私立 (private.Hispanic) C. 沒有明顯差距
C
關卡 38
由於兩組數據的boxplot結果高度重疊,所以判斷公立學校與私立學校的學生在數學表現上沒有明顯差距。
關卡 39
Part E:數值欄位 vs. 數值欄位的資料視覺化。
關卡 40
要繪製兩個數值型欄位,最簡單的圖形就是散佈圖 (scatter plot),在R 語言中使用繪圖函數plot(x, y)
進行繪製。 其中第一個參數x
表示x軸的變數、第二參數則表示y軸的變數。
關卡 41
請輸入:plot(x=hsb$math, y=hsb$read)
繪製hsb
資料集中,數學 (x=hsb$math
) 跟閱讀 (y=hsb$read
) 成績的散佈圖。
plot(x=hsb$math, y=hsb$read)
關卡 42
由散佈圖可以發現,學生的數學與閱讀成績呈現正相關,即數學成績越高,閱讀成績越高,反之亦然。
關卡 43
繪圖函數plot
也可以使用formula
進行繪圖。 請同學在plot
函數中的第一個參數使用read ~ math
,第二個參數使用data=hsb
,重新繪製學生數學與閱讀成績的散佈圖。 請注意波浪符號~
左邊的參數代表反應變數 (response variable);而右邊的參數代表解釋變數 (independent variable)。
plot(read ~ math, data=hsb)
關卡 44
值得一提的是,也在plot
中改用~ read + math
也可以達到完全一樣的效果, 請同學在plot
函數中的第一個參數使用~ read + math
,第二個參數使用data=hsb
,重新繪製學生數學與閱讀成績的散佈圖。
plot(~ read + math, data=hsb)
關卡 45
當欄位數大於二時,可以透過plot
函數中的formula
功能,對欄位間的兩兩比較進行視覺化。 請同學輸入以下範例以了解的使用方式:plot(~read+math+science+socst,data=hsb, main=“HSB score”)。
plot(~read+math+science+socst,data=hsb, main="HSB score")
關卡 46
Part F:數值欄位 vs. 數值欄位 vs. 類別欄位的資料視覺化。
關卡 47
當欲進行資料探索的欄位大於兩個維度時,可以對散佈圖做進一步的加工,譬如改變點的顏色(col
)、形狀(pch
)或大小(cex
),上述參數可以使用向量型態進行設定。 定義以下變數:
關卡 48
請同學定義變數 col.sex <- ifelse(hsb$sex=="male", "#e34a3355", "#2c7fb855")
。
col.sex <- ifelse(hsb$sex=="male", "#e34a3355", "#2c7fb855")
關卡 49
請同學定義變數 pch.schtyp <- ifelse(hsb$schtyp=="public", 1, 19)
。
pch.schtyp <- ifelse(hsb$schtyp=="public", 1, 19)
關卡 50
請同學定義變數 cex.science <- (hsb$science-25)/(50)*5
。
cex.science <- (hsb$science-25)/(50)*5
關卡 51
透過上述三個新增變數,我們可以對數學與閱讀成績的散佈圖作進一步的加工,請同學輸入以下範例:plot(~read+math, data=hsb, col=col.sex, pch=pch.schtyp, cex=cex.science)
。
plot(~read+math, data=hsb, col=col.sex, pch=pch.schtyp, cex=cex.science)
關卡 52
以上這張圖,除了原本的read v.s. math的相關性之外,還多了以下的資訊:
關卡 53
一個是 cex.science,觀察發現圓點隨著左下到右上逐漸放大,顯示科學成績與閱讀、數學成績程正相關。
關卡 54
一個是 pch.public,觀察發現實心的圓點散佈的程度叫空心圓點來得緊密,顯示私立學校的學生成績變異較大。
關卡 55
這樣的圖,如果沒有legend
圖例的話是不及格的。 雖然我們可以理解剛剛的資訊,但若要對回原本的資料,如:空心和實心表示公立與私立、顏色表示性別等等,還是需要legend
圖例的輔助才行。 製作這張圖的圖例,其實需要複雜的程式碼才能辦到。
關卡 56
這門課,最主要是希望同學能夠吸收圖形的解讀方式,以及了解R的基本繪圖指令的設計。 尤其是formula的部份,是我們在R中描述數據間關係的一種語法,未來在許多進階演算法中也都會用到。 至於是否需要進一步瞭解R 眾多的低階繪圖指令(pch
、cex
、legend
等等)則是見仁見智。 熟悉的同學,可以將圖整理成令人驚豔的視覺化效果。 反而我們比較希望同學可以理解下一堂課所介紹的ggplot2套件,用一套一致、簡單的邏輯來快速畫出有一定質感的圖。