關卡 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_bysummarise,計算特定組別下的統計指標。 譬如在給定學校公立或私立 (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

為了放大視覺上的差異,我們透過ylimxpd兩個參數,讓長條圖的起始值不是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 眾多的低階繪圖指令(pchcexlegend等等)則是見仁見智。 熟悉的同學,可以將圖整理成令人驚豔的視覺化效果。 反而我們比較希望同學可以理解下一堂課所介紹的ggplot2套件,用一套一致、簡單的邏輯來快速畫出有一定質感的圖。