最近因為支援會議所需,被委託處理與會者的資料。雖然都是敘述統計,但是現有的商業軟體難以滿足兼顧效率與經濟的需求。
-
Excel製作次數分配表(Frequency)的步驟很繁瑣,我看過有人用樞紐分析表做,但看了眼花撩亂。
-
即使製成表之後,Excel用滑鼠點放製作圓餅圖、直條圖的方式也非常繁瑣,實在難以勝任同時要處理數十張圖的任務。
-
這類工作校內的SPSS,可以透過製作次數分配表完成。但是如果你在校外,SPSS授權費昂貴不說,他也只能一張一張圖一次跑給你(問題是有時候我們希望能跑出幾張圖一組),而且你必須手動加資料標籤(例如百分比之類的)。如果能花錢消災我們也姑且認了,問題是上資料標籤一樣也很麻煩。
-
其他GUI介面的統計軟體如JASP,雖然在中統層級可以做到至少80%SPSS能做到的事情,而且報表品質絲毫不輸給SPSS。不過他還是沒辦法幫圖表上標籤,算是一大殘念。不知道是真的沒有,還是我沒找到。若有人找到請告訴我,肥貓可以請你吃飯、飲料之類的報答。
既然這樣,就只好用非GUI的統計軟體,例如R或Python,依照肥貓各種苛刻要求來處理。因為學過蕭老師的多變量,要操作R本身不困難,困難的是要找到可用的套件或語法。雖然R的ggplot系列同樣可以製作長條圖和圓餅圖,但是他就是無法(自動)上資料標籤,這件事讓我有點頭大。所以只好令循他徑。所幸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是要把資料標籤放在圖的什麼位置,目前發現這個設定是比較適合的。
-
要領:
-
把長條圖存成p1、p2、p3…的物件,後續會比較好處理
-
系統會直接取你的變數名稱作為該圖的標題。所以你在命名變數時,最好不要用V1、V2這種名稱。
-
但是選題目時一個字一個字打很累,建議輸入關鍵字後,用鍵盤Tab紐叫出下拉式選單,這樣選比較快,也比較不會出錯。
grid.arrange(p1,p2,p3,p4,p5, nrow=2, top="你的標題")
-
要領
-
雖然par函數本身就有把多張圖放在同一個版面上的功能,但是這裡不是用ggplot,所以他抓不到。必須改用前面要求載入的套件來做合併。
-
nrow的意思是你要把這些圖塞幾行。
-
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函數去找。
做出來結果大概是這樣:
-
要領
-
因為圓餅圖的製作比較複雜,如果你沒有要製作很多張,其實你用table函數叫出次數分配表之後,(用write.csv函數)存成csv之後直接拉回Excel或Calc做成圓餅圖還比較快。不過用程式來跑唯一的好處,就是變數設好之後就近乎全自動化。
-
這些程式碼看起來很複雜,但只要知道有哪些物件,自己套就可以了。請務必選用Notepad++等專門設計給程式設計師使用的筆記本來看語法,用作業系統內建很陽春的文字編輯器會很傷眼。
-
如果以後程序確立了,基本上所有報表都可以直接貼程式碼去做,連滑鼠都不用點。基本上Google這些科技巨頭就是用類似這種方式在處理資料。