關卡 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套件,用一套一致、簡單的邏輯來快速畫出有一定質感的圖。