關卡 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

PartA.類別欄位vs.類別欄位的資料視覺化。

關卡 5

考慮兩個類別型欄位的視覺化。我們關心這筆資料中學生性別(sex)與公私立(schtyp)學校的關聯。先使用table()函數來建立交叉表(crosstable),請同學輸入以下指令,將交叉表指向tab1這個變數:tab1<-table(hsb$sex,hsb$schtyp)

tab1 <- table(hsb$sex, hsb$schtyp)

關卡 6

接下來,請同學輸入barplot(tab1,legend=TRUE)這個長條圖繪製函數,針對tab1這筆數據畫出堆疊長條圖(stackdbarplot)

barplot(tab1, legend=TRUE)

關卡 7

堆疊長條圖中有兩個顏色:淺灰、深灰分別代表男性(male)與女性(female),

關卡 8

請問從這張圖中可以發現,哪種學校的數量比較多?A.公立學校(public);B.私立學校(private)

A

關卡 9

請問從這張圖中可以發現,私立學校的男生多還是女生多?A.男生(male);B.女生(female)

B

關卡 10

同學在作答時可能會發現,直接從堆疊長條圖上觀察不同顏色的區塊的大小其實不是太容易,如果我們的目的是要比較不同顏色的區塊大小,應該採用分組長條圖(groupedbarplot)。請同學輸入: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

PartB.類別欄位vs.類別欄位vs.單一數值的資料視覺化。

關卡 14

在畫長條圖時,不一定只使用次數作圖,也有可以是某變數的數值結果,譬如:平均數(mean)、中位數(median)以及標準差(sd)。

關卡 15

我們可以使用R的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

PartC.類別欄位vs.單一數值的資料視覺化。

關卡 24

關於類別欄位對單一數值的視覺化,一般而言有兩種做法:長條圖(barplot)、點標圖(dorplot)。先計算各種族學生(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

PartD.類別欄位vs.數值欄位的資料視覺化。

關卡 31

與點標圖不同當每一種類別對應一個數值時,應使用箱形圖(boxplot)進行視覺化,譬如各種族學生的閱讀成績之分布,請同學輸入以下指令:plot(math~race,data=hsb)

plot(math ~ race, data=hsb)

關卡 32

請問同學,圖中的顯示哪一種種族的學生有最好的數學成績?A.AfricanAmerican;B.Asian;C.Hispanic;D.White?

B

關卡 33

傳統上,繪製箱形圖會使用boxplot函數,現今的R版本已經支援高階繪圖函數plot透過formula的控制來繪製箱型圖(請注意波浪符號~左邊放數值型態的欄位,右邊放類別型態的欄位,並用加號+連結),關於箱型圖詳細的控制參數請使用?boxplot閱讀說名文件。請同學打開boxplot的說明文件:

?boxplot

關卡 34

請問下列哪一個統計指標「不會」出現在boxplot的結果中?請參考說明文件中,Value段落關於stats的說明作答。A:thelowerhingeB:themedianC:themeanD:theupperhinge

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

PartE.數值欄位vs.數值欄位的資料視覺化。

關卡 40

繪製兩個數值型欄位最簡單的圖形就是散佈圖(scatterplot),在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,重新繪製學生數學與閱讀成績的散佈圖。請注意波浪符號~左邊的參數表示反應變數(responsevariable);右邊的參數表示解釋變數(dependentvariable)。

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=“HSBscore”)

plot(~read+math+science+socst,data=hsb, main="HSB score")

關卡 46

PartF.數值欄位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

以上這張圖,除了原本的readv.s.math的相關性之外,還多了以下的資訊:

關卡 53

一個是cex.science觀察發現圓點隨著左下到右上逐漸放大,顯示科學成績與閱讀、數學成績程正相關。

關卡 54

一個是pch.public觀察發現,實心的圓點散佈的程度叫空心圓點來得緊密,顯示私立學校的學生成績變異較大。

關卡 55

這樣的圖,如果沒有圖例legend是不及格的。雖然我們可以看出剛剛的資訊,可是若要對回原本的資料,(空心和實心表示公立與私立、顏色表示性別…等等)製作這張圖的圖例,其實需要複雜的程式碼才能辦到。

關卡 56

這門課,最主要是希望同學能夠吸收圖形的解讀方式,以及了解R的基本繪圖指令的設計。尤其是formula的部份,是我們在R中描述數據間關係的一種語法,未來在許多進階演算法中也都會用到。至於R眾多的低階繪圖指令(pchcexlegend等等),要不要熟悉則是見仁見智。熟悉的同學,可以雕圖,雕出令人驚豔的視覺化效果。反而我們比較希望同學可以理解下一堂課所介紹的ggplot2套件,用一套一致、簡單的邏輯來快速畫出有一定質感的圖。