統計基本觀念建立與認識R的基本操作

高雄市政府主計處

講者
單位

劉正山 教授

國立中山大學政治學研究所

日期

2023.05.29

1 講座流程

  • 上半場(14:00~15:30):基本觀念與操作

  • 下半場(15:40~16:40):觀念應用與案例操作

  • Q&A問與答(16:40~17:00)

開始之前請準備好

2 關於劉正山老師

3 基本觀念與操作

統計是什麼?

  • 統計(statistics)是個收集、分析和解釋數據的學問,分為描述性統計和推論性統計,也是今日新興的「資料科學」的基礎。

  • 描述統計用於認識資料(樣本)的特性。

  • 推論統計用於推斷資料背後群體(母體)的特性,而且可以用於探討概念之間的潛在關係。

    圖 3.1: 母體與樣本之間的關係(圖片來源:《民意調查資料分析的R實戰手冊》p.21 )

你看得懂民調嗎?

  • 民調為什麼本來就不會準?(它是「一個」民調)

  • 賽馬式民調在吵什麼?(你把民調數字當真相)

談談推論統計上的一個神奇定理:中央極限定理

我們一起點開這張圖(連結:https://bit.ly/3osMKcD),跟著老師一起操作。

圖 3.2: 中央極限定理(圖片來源:《民意調查資料分析的R實戰手冊》p.23)

從統計的角度來看懂民調的秘密

圖 3.3: 機率與面積:68-95-99法則(圖片來源:https://pansci.asia/archives/362484)

圖 3.4: 常態分布中的平均數(表示資料的中間傾向)與標準差(表示資料的離散程度)(圖片來源:https://pansci.asia/archives/362484)

normal distribution

圖 3.5: 經驗資料經過「標準化」之後的常態分佈(圖片來源:https://pansci.asia/archives/362484)

圖片來源:https://haosquare.com/confidence-interval/

圖 3.6: 從許多樣本的信賴區間,找找看母體的真相在那裡(圖片來源:https://haosquare.com/confidence-interval/)

圖 3.7: 民調不能當賽馬看。真相不是那個數字,而是存在區間之間。(圖片來源:https://ishort.ink/thrv)
  • 民調本來就不一定會準,但有一定前提可以相信。
  • 賽馬式民調忽略了真相在區間裡,而不是在單點的預測上。

小結

  • 統計是讓你變得宏觀、變聰明的知識。
  • 擁抱統計能讓你探索世界的真相,不會人云亦云。

4 觀念應用與案例操作

為什麼R值得去認識一下?

RStudio跟R是什麼關係?

圖 4.1: 引擎(R)與車體(RStudio)合體後由你駕馭,但要注意維修工廠不同(圖片來源:https://ishort.ink/JcjM)

啟動你的第一個R專案

  • 請跟著老師一起做。
  • 請在老師的指示下,把你所看到的語法,按下語法框右側的剪貼板符號(自動複制),貼到你自己的專案語法檔中來執行。
  • 魔術按鍵組合: Ctrl + Enter

中央極限定理的動手實驗

假設在2023年全台灣成年合格選民有1900萬人,經普查發現支持「電價緩漲」的比例為56%。今天我們進行一次民意調查,全台灣隨機抽出1,068位合格選民電訪,問他們支持「電價緩漲」比例為何?

pop <- rep(0:1, c(1900000-0.56*1900000,0.56*1900000))

#創造出一個虛擬母體
mean(sample(pop,1068)) #從中抽樣
[1] 0.57397

如果你在R上反覆執行上兩行的指令,你會發現每次抽樣得到數值(支持比例)都會不一樣,但你也會發現它們之間的差異不會大到那裡去。也就是說抽樣平均數呈現某種程度的分配(在本例中為常態)。現在我們抽樣3000次(且不重複抽樣),並看看這些平均數的分配情形。

result <- replicate(3000, mean(sample(pop,1068, replace=TRUE)))
mean(result)
[1] 0.5599959
hist(result)

用R來做描述統計

本次專案資料來源

  • 微笑小熊調查小棧:smilepoll.tw 相聚時光烤不烤

  • 調查時間:2017/11/06~2017/12/05

  • 受訪人數:650人

變數的讀入、製圖與製表

RStudio可以毫無障礙地讀入Excel, SPSS, SAS等軟體的資料檔。但Excel必需要透過另外購買外掛才能做得到。

# 使用foreign這個套件,讀入csv資料格式的檔案
library(foreign)
bbq <- read.csv("BBQ.csv")

# 使用readxl套件,讀入Excel資料檔
library(readxl)
bbq <- read_excel("BBQ.xlsx") 

這次的練習,我們使用R資料的格式(BBQ.rda)來操作。

語法
# 讀入R資料檔
load("BBQ.rda")

# 用library()載入必需的套件工具(沒有的話就來先安裝它!)
library(sjPlot) #劉老師推薦的製圖工具箱(使用plot_frq及plot_grid指令)
library(sjmisc) #sjPlot套件家族中的資料處理工具箱(使用frq指令)
library(dplyr) #強大的資料處理工具箱(使用glimpse與filter指令)


# 顯示資料檔中所有的變數名稱
names(bbq)
 [1] "V1"   "V2"   "V3"   "V4"   "V5"   "V6"   "V7"   "V8"   "V9"   "V10" 
[11] "V11"  "V12"  "V13"  "V14"  "V15"  "V16"  "V17"  "V18"  "V19"  "V20" 
[21] "V21"  "V22"  "V23"  "V24"  "V25"  "V26"  "V27"  "V28"  "V29"  "V30" 
[31] "V31"  "V32"  "V33"  "V34"  "V35"  "V36"  "V37"  "V38"  "V39"  "V40" 
[41] "V41"  "V42"  "V43"  "V44"  "V45"  "V46"  "V47"  "V48"  "V49"  "V50" 
[51] "V51"  "V52"  "V53"  "V54"  "V55"  "V56"  "V57"  "V58"  "V44r" "V18r"
[61] "V20r" "V21r" "V23r" "V27r" "V45r" "V48r" "V2r"  "V3r"  "V24r" "V49r"
[71] "V50r" "V37r" "age" 
語法
# 若你是Mac的使用者,請將下一行的井字拿掉並執行該行,才能讓之後圖片中的中文字正常顯示出來。
# set_theme(theme.font="PingFang TC")

讀入資料後,你可以點開右上角的物件名稱(bbq),檢視整筆資料檔,也可以用很簡短的指令,更有效率的檢視這筆資料的「長相」。

# 顯示這筆資料的結構
glimpse(bbq)

接下來,進行變數的描述與觀察,並進一步進行資料的清理。

# 挑選變數進行統計描述與製圖
# (V44r)說到烤肉,請問您明年會不會想全家人一起烤肉? (0~10) 0:5=0[不會]; 6:10=1[會]
frq(bbq$V44r) #製表 
說回到烤肉,請問您明年會不會想全家人一起烤肉? (x) <categorical> 
# total N=588 valid N=588 mean=0.52 sd=0.50

Value | Label |   N | Raw % | Valid % | Cum. %
----------------------------------------------
    0 |  不會 | 282 | 47.96 |   47.96 |  47.96
    1 |    會 | 306 | 52.04 |   52.04 | 100.00
 <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
plot_frq(bbq$V44r) #製圖 

以下請你自己來試試看能不能快速為變數來製表製圖。複製任何一道題目到你的語法檔內,執行上述frq()plot_frq()兩個指令,只要把變數名稱換為該題的變數名稱即可。

語法
#(V18r)如果大家都烤肉,您會覺得「不好玩」嗎?
#  跟別人做類似的活動,不好玩  1
#  跟別人做類似的活動也很ok啊 0

# (V20r)您覺得戶外的烤肉對您的健康有多大影響?
#  影響很大 1
#  影響不大 0
#  完全沒影響 0

# (V21r)對您來說,烤肉費用的支出是不是一種負擔?
#  是,的確是種負擔 1
#  還好 0
#  不會 0

# (V23r)準備烤肉食材對您來說會不會很麻煩?
#  會麻煩 1
#  不會麻煩 0

# (V27r)您在不在意您烤肉時造成的污染?
#  會在意,覺得多少影響了環境 1
#  還好 0
#  不會在意 0

# (V45r) 平時用社群媒體(Line, Facebook等)與家人聯繫感情。您覺得夠不夠?
#  很夠了。科技讓我與家人緊緊連在一起,年節不見面也不要緊。 0
#  還算夠。有了科技,家人不必一定要聚在一起。 0
#  不夠!見面較能聯絡感情,所以仍然要經常找時間團聚。 1
#  絕對不夠!我不太相信用社群媒體可以聯繫感情,一定要見到面才行。 1

#  (V48r) 大家圍著烤肉比其他活動要較為容易聯絡感情。
#  同意。 1
#  不會/不見得。 0

用R來做推論統計

探索式分析(相關分析):描述與推想

一般的數據資料,以變數為名存放在不同的欄位中。這些變數的型態有三類:類別型(categorical/nominal)、順序型(ordinal)與連續型(numerical/continuous)。上述示範的是類別型變數的處理與描述,而以下要處理的是連續型變數「出生年」。我們先來看看受訪者的年齡分佈。順序型變數在某些場合被為類別型變數,在某些場合被視為連續型變數,因此在處理上有兩派說法,比較複雜,不納入本講的範圍。

# (V54)出生年
# 轉換為年紀並創造一個新變數
bbq$age <- 2017-bbq$V54
summary(bbq$age)  #發現錯誤!

# 使用{dplyr}套件中的filter()工具來排除不合理觀察值
bbq <- filter(bbq, age>1) #留下年齡大於1的觀察值
save(bbq, file="BBQ.rda") #將更新後的資料存檔   
plot_frq(bbq$age, type = "histogram", show.mean = T, normal.curve = T) #製圖

summary(bbq$age)

我們進一步使用兩個變數製圖的方式,用肉眼來看看兩個變數之間的潛在關係。

# 年齡與烤肉意願有沒有相關? 這裡用的是「水管」( |> )來走整個製圖流程。
bbq |> 
    group_by(V44r) |>
    plot_frq(age, type = "histogram",  
             show.mean = T, normal.curve = T, xlim=c(10, 90)) |> 
    plot_grid()

兩者間好似有關,尤其是出社會後的青壯世代好像比較有意願(明年烤肉)。

有同學看了這張圖後舉手表示,他覺得「認為見面團聚取代使用手機比較重要」(v45r)的人,跟「覺得自己時間充裕」(v37r)有關係。因為上班族總是比較忙,覺得時間不夠用,所以可能會選擇用手機與家人連線就好,不一定需要見面團聚。你覺得他是對的嗎?

  • 虛無假設(H0 兩者無關): 自覺時間充裕 與 想見面團聚 之間 沒有明顯關係。

  • 替代假設(H1 兩者有關):自覺時間充裕的人 應該會比較想 見面團聚。

我們可以來用R檢視一下相關性。

load("BBQ.rda")

library(sjPlot)

#製圖
plot_grpfrq(var.cnt=bbq$V45r,var.grp = bbq$V37r, legend.title = "個人可支配時間") 

#製表與顯示統計檢定結果
tab_xtab(bbq$V37r, bbq$V45r, 
         show.row.prc = TRUE, # 顯示列百分比
         show.col.prc = TRUE  # 顯示欄百分比
         )
最後,我們來談談節慶與團聚。
請問您覺得一天之內自己可以自由支配的時間(用來做自己想做的事)大約有多少?
平時用社群媒體(Line,
Facebook等)與家人聯繫感情。您覺得夠不夠?
Total
不常見面不要緊 見面是必要的
足夠 155
38.8 %
72.8 %
244
61.2 %
65.9 %
399
100 %
68.4 %
不夠 58
31.5 %
27.2 %
126
68.5 %
34.1 %
184
100 %
31.6 %
Total 213
36.5 %
100 %
370
63.5 %
100 %
583
100 %
100 %
χ2=2.607 · df=1 · φ=0.071 · p=0.106

以上統計分析結果發現:這個自由發想、探索式隨意推想並未得到統計上的支持。

驗證式分析:解釋與預測

於是劉老師正式問大家:「明年中秋你們家會不會烤肉?」你要提出更正式的、有理由的假設。全班的同學七嘴八舌一番後提出了七個假設,劉老師收齊後,一起納入模型中進行較嚴格的檢驗。

  • 假設一:對烤肉的新鮮感不再(V18r)便會降低明年烤肉的意願V44r

  • 假設二:覺得烤肉影響健康(V20r)便會降低明年烤肉的意願

  • 假設三:覺得烤肉花費造成負擔(V21r)便會降低明年烤肉的意願

  • 假設四:覺得烤肉麻煩(V23r)便會降低明年烤肉的意願

  • 假設五:覺得烤肉影響環境(V27r)便會降低明年烤肉的意願

  • 假設六:覺得不必要見面(V45r)就能聯絡感情會降低明年烤肉的意願

  • 假設七:認為烤肉不是聯絡感情的首選(V48r)便會降低明年烤肉的意願

你覺得做出這樣的模型檢驗,需要的語法複不複雜?(其實很短,就一行。)

語法
load("BBQ.rda") 
mod.1 <- glm(V44r ~ V18r+V20r+V21r+V23r+V27r+V45r+V48r, 
             data=bbq, 
             family=binomial)
summary(mod.1) 

Call:
glm(formula = V44r ~ V18r + V20r + V21r + V23r + V27r + V45r + 
    V48r, family = binomial, data = bbq)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.22638    0.27366  -0.827  0.40810    
V18r1       -0.82946    0.26991  -3.073  0.00212 ** 
V20r1       -0.23105    0.21476  -1.076  0.28199    
V21r1       -0.25776    0.21286  -1.211  0.22592    
V23r1       -0.68031    0.24455  -2.782  0.00540 ** 
V27r1       -0.02185    0.21487  -0.102  0.91899    
V45r1        0.59284    0.19972   2.968  0.00299 ** 
V48r1        1.73865    0.19512   8.911  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 807.30  on 582  degrees of freedom
Residual deviance: 653.72  on 575  degrees of freedom
  (5 observations deleted due to missingness)
AIC: 669.72

Number of Fisher Scoring iterations: 4
  • 發現:假設一、四、六、七得到這筆資料的支持,意味著…。
  • 你若是行銷烤肉相關產品的部門主管,你會怎麼看待這個模型?

那麼,若回頭考慮上述的年齡(age)這個變數呢?我們創造模型二,加入這個變數來檢驗新的假設。

  • 假設八:年紀較大(出社會者)會比較傾向明年(團聚)烤肉。

我們更新一下上一個模型,就能直接做出模型二。

語法
mod.2 <- update(mod.1, .~.+age)
summary(mod.2)

Call:
glm(formula = V44r ~ V18r + V20r + V21r + V23r + V27r + V45r + 
    V48r + age, family = binomial, data = bbq)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.306733   0.384714  -0.797  0.42528    
V18r1       -0.842413   0.273404  -3.081  0.00206 ** 
V20r1       -0.231235   0.214792  -1.077  0.28168    
V21r1       -0.248322   0.215176  -1.154  0.24848    
V23r1       -0.684564   0.244983  -2.794  0.00520 ** 
V27r1       -0.024962   0.215196  -0.116  0.90765    
V45r1        0.592500   0.199786   2.966  0.00302 ** 
V48r1        1.730717   0.196798   8.794  < 2e-16 ***
age          0.002559   0.008600   0.298  0.76605    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 807.30  on 582  degrees of freedom
Residual deviance: 653.63  on 574  degrees of freedom
  (5 observations deleted due to missingness)
AIC: 671.63

Number of Fisher Scoring iterations: 4

進一步,我們將依變數從「明年烤肉」這個具體行動,置換為比較模糊概念的「見面團聚」(V45r),再次檢驗年紀是否明顯會影響見面團聚意願(模型三)。之前已經不顯著的相關性,在更嚴格的模型檢驗中顯然不會被看好。

語法
mod.3 <- glm(V45r ~ age, data=bbq, family=binomial) 
summary(mod.3)

Call:
glm(formula = V45r ~ age, family = binomial, data = bbq)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.418611   0.275955   1.517    0.129
age         0.003879   0.007629   0.508    0.611

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 765.40  on 582  degrees of freedom
Residual deviance: 765.14  on 581  degrees of freedom
  (5 observations deleted due to missingness)
AIC: 769.14

Number of Fisher Scoring iterations: 4

解讀:模型二中的假設八並未得到統計證據的支持。模型三的檢驗,結果是一樣的:年紀對見面團聚意願的影響「不明顯」(學術語言是「統計上無顯著的影響」)。因此假設二、三、五、八中的自變數-依變數關係,都叫作「虛假關聯」。看似或以為兩兩之間有關係的概念,在更嚴格的模型檢驗下,那個關聯就不明顯了。因此,我們要小心過度推論自己眼前所見以為相關的現象。

5 結語及Q&A

使用不同軟體「跑統計」已不算新鮮事。很多時候用Excel就能做了。R出現後,統計分析領域結合了R之後,邁向了更跨域、更普遍的境界。今日連高中生都能做到透過資料揭密、發現真相的工作,也因此出現了「資料科學」這個新興領域以及「資料記者」這種新的職業。本講帶著各位已從頭走過一遍描述統計與推論統計。巡禮一遍。資料科學的世界是不是很有趣?

帶回家的幾個重點

  1. 學統計,會讓人變聰明、變謙虛,如果不是,那就是學偏了。
  2. 描述統計讓你掌握手上的數據,但你只能在這個樣本中描述,不能隨意推論;只有進入了推論統計(相關性的探討)能讓你去探究更多關於群體/母體的可能真相。
  3. 今日的巡禮只是個走馬看花,初步認識一下工具以及從事大數據工作者他們的思維及工作模式。
  4. 你若有興趣再次摸索,請以這次講義為路徑圖,復習如何取得工具、啟動專案,開啟語法檔及執行語法整個流程。

R與Excel/SPSS的不同

  • 最重要的差異:

  • 第二重要的差異:

    • 語法檔可保留下來供檢誤與再製(所以沒有黑箱)。

    • 可以用時開啟多個專案及多個資料檔進行分析。

    • R=free(既免費,也自由)。對照組:買SPSS (點我窺見價格)。想維持使用Excel並擴充到具有R或SPSS功能的方案….還是得用$解決

    圖 5.1: SPSS模組功能與價格
  • 第三重要的差異:

    • 拼裝車(有褒意也有貶意)。

    • 並非全中文環境(這並不算新鮮事)。

    • 對一般人來說挺大的學習曲線(事實是幾乎每個統計軟體都需要相當程度的投入)。

    • 有師傅帶著入門最好,但自學環境與材料在今日已相當充足。

    • 長期使用要懂得保養(定期更新):引擎(R)、車體(RStudio)與配件(外掛/套件)

延伸閱讀

民意調查資料分析的R實戰手冊(2018)

愛上統計學使用R語言(2021)

資料科學家的實用統計學(2021)

精通資料分析(2022)

R語言邁向Big Data之路(2020)

Text Mining with R(2017)

圖 5.2: 進階參考資料