移至主內容

R語言用於基礎敘述統計的示範

Submitted by 肥貓 on

最近因為支援會議所需,被委託處理與會者的資料。雖然都是敘述統計,但是現有的商業軟體難以滿足兼顧效率與經濟的需求。

  1. Excel製作次數分配表(Frequency)的步驟很繁瑣,我看過有人用樞紐分析表做,但看了眼花撩亂。

  2. 即使製成表之後,Excel用滑鼠點放製作圓餅圖、直條圖的方式也非常繁瑣,實在難以勝任同時要處理數十張圖的任務。

  3. 這類工作校內的SPSS,可以透過製作次數分配表完成。但是如果你在校外,SPSS授權費昂貴不說,他也只能一張一張圖一次跑給你(問題是有時候我們希望能跑出幾張圖一組),而且你必須手動加資料標籤(例如百分比之類的)。如果能花錢消災我們也姑且認了,問題是上資料標籤一樣也很麻煩。

  4. 其他GUI介面的統計軟體如JASP,雖然在中統層級可以做到至少80%SPSS能做到的事情,而且報表品質絲毫不輸給SPSS。不過他還是沒辦法幫圖表上標籤,算是一大殘念。不知道是真的沒有,還是我沒找到。若有人找到請告訴我,肥貓可以請你吃飯、飲料之類的報答。

既然這樣,就只好用非GUI的統計軟體,例如RPython,依照肥貓各種苛刻要求來處理。因為學過蕭老師的多變量,要操作R本身不困難,困難的是要找到可用的套件或語法。雖然Rggplot系列同樣可以製作長條圖和圓餅圖,但是他就是無法(自動)上資料標籤,這件事讓我有點頭大。所以只好令循他徑。所幸sjPlot能立刻做出有資料標籤的長條圖,雖然預設模式有點醜但至少堪用。所以先介紹長條圖的製作。

至於圓餅圖,雖然我有想到做法,可是他會繁瑣得多(詳下),建議除非你要大量生成圓餅圖,否則趕時間的話用table函數把次數分配表拿到,用write.csv函數匯出成csv之後,直接抓回去Excel/Calc做比較乾脆。所以我最後再來介紹。

以下步驟是假定你對R操作有一定了解,介紹會儘量簡短。關於基本操作請自行爬文,或參閱相關工具書。

  • 長條圖製作

sjPlot,全名為sjPlot - Data Visualization for Statistics in Social Science。是在美國小有名氣,專門為社會科學研究者設計的套件,算是殺手級的應用。中山大學政治所的劉正山老師在其《民意調查資料分析的R實戰手冊》也大量使用這個套件做教學演示。

Group3N <- read.csv("請視個人需求更改路徑") #叫系統讀入你要的資料

attach(Group3N) #要用這個叫系統載入資料,載入後後續操作會方便很多

  • Method1 (may invaild on Linux-Ubuntu)

library(sjPlot)

library(ggplot2)

library(dplyr)

library(ggstatsplot) #這個套件在我的Ubuntu上載入失敗,但我來不及排除故障,先放棄了。有興趣的可以自己嘗試。

#我其實忘記到底是在哪篇文看到可以用這個做了,既然爬過的文太多,那就謝天吧(大誤)。

  • 第二個方法則是用sjPlot

library(sjPlot)

library(gridExtra) #另外要載入這3個套件,以下會說明理由

library(grid)

library(ggplot2)

p1=plot_frq((變數名稱), vjust = "middle")

#vjust是要把資料標籤放在圖的什麼位置,目前發現這個設定是比較適合的。

  • 要領:

  1. 把長條圖存成p1p2p3…的物件,後續會比較好處理

  2. 系統會直接取你的變數名稱作為該圖的標題。所以你在命名變數時,最好不要用V1V2這種名稱。

  3. 但是選題目時一個字一個字打很累,建議輸入關鍵字後,用鍵盤Tab紐叫出下拉式選單,這樣選比較快,也比較不會出錯。

grid.arrange(p1,p2,p3,p4,p5, nrow=2, top="你的標題")

  • 要領

  1. 雖然par函數本身就有把多張圖放在同一個版面上的功能,但是這裡不是用ggplot,所以他抓不到。必須改用前面要求載入的套件來做合併

  2. nrow的意思是你要把這些圖塞幾行。

  3. top是自己要手動打大標題。或許你可以製造另一個表格是專門讓R去抓你要的大標題,這樣可能比較省事,但我還沒試過。

這樣製作出來的長條圖雖然有點醜,但大多數情況尚稱堪用。如果要做更精細的資料視覺化,那就要更多爬文或看書了。

  • 圓餅圖

因為sjPlot似乎沒有圓餅圖,但是多數套件的繪圖功能的圓餅圖,沒辦法設資料標籤,可能我沒找到吧。只好土法煉鋼去爬文,用硬碰硬的方式把語法改出來。

#這個途徑是製造兩組資料集,一個是table(表格,但我們在R習慣直接用原文,下同),一個是frame。透過程式去交互參照兩種資料庫變成的。比較複雜,但是我還沒想到更好的做法。

example <- read.csv("檔案路徑", header=TRUE)

#先讀入我們的檔案, 因為是初試啼聲,所以命名為example

table_age_freq=table(example$你的年齡約...)

#其實你看到變數名稱大概就知道我要做人口統計

#先做出次數分配表

age_freq2=as.data.frame(table_age_freq)

#把這個次數分配表轉換成frame,以便做下一步運用

age_freq2$prop=prop.table(age_freq2$Freq)

#叫系統依人數計算出比例。age_freq2$prop,的意思是叫系統在那個frame的最後生出一個叫作prop的欄位(即proportion的縮寫)。

age_freq2$prop2=round(prop.table(age_freq2$Freq),2)

#計算出比例後,取到小數點第二位。怕麻煩也可以直接做這個步驟。

age_freq2$prop3=round(prop.table(age_freq2$Freq)*100,2)

#算出小數點第二位之後*100,這樣才是我們真的要的%數。怕麻煩也可以直接做這個步驟。

製造圓餅圖

pie.labels <- paste(rownames(table_age_freq), ", ", age_freq2[,5], "%", sep = "")

#這裡的工作,是叫系統去抓裡面的欄位。然後貼上變成「幾歲、幾%的形式」。至於[,5]則是取決你實際製作資料時,那個數值在你資料的第幾欄(column)。(列(row)則是[5,]

pie.labels <- paste(rownames(table_age_freq), ", ", age_freq2[,2], "", ", ", age_freq2[,5], "%", sep = "")

#這裡的工作,是叫系統去抓裡面的欄位。然後貼上變成「幾歲、幾人、幾%的形式」。

pie(table_age_freq, labels = pie.labels, main= "你的年齡約...") # 畫出圓餅圖,以及圖上的標題。標題手動打。

pie(table_age_freq, labels = pie.labels, main= colnames(example[55]))

#畫出圓餅圖,以及圖上的標題。這裡的標題叫系統去抓。example[55]表示在example資料集的第55欄。若找不到第幾欄,則可用colnames函數去找。

做出來結果大概是這樣:

  • 要領

  1. 因為圓餅圖的製作比較複雜,如果你沒有要製作很多張,其實你用table函數叫出次數分配表之後,(用write.csv函數)存成csv之後直接拉回ExcelCalc做成圓餅圖還比較快。不過用程式來跑唯一的好處,就是變數設好之後就近乎全自動化。

  2. 這些程式碼看起來很複雜,但只要知道有哪些物件,自己套就可以了。請務必選用Notepad++等專門設計給程式設計師使用的筆記本來看語法,用作業系統內建很陽春的文字編輯器會很傷眼。

  3. 如果以後程序確立了,基本上所有報表都可以直接貼程式碼去做,連滑鼠都不用點。基本上Google這些科技巨頭就是用類似這種方式在處理資料。