移至主內容
首頁
SLAT Blogs

主導覽

  • 首頁
使用者帳號選單
  • 登入

導航連結

  1. 首頁
  2. 部落格
  3. 肥貓的異想世界

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

By 肥貓, 8 五月, 2021

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

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

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

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

  4. 其他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是要把資料標籤放在圖的什麼位置,目前發現這個設定是比較適合的。

  • 要領:

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

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

  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之後直接拉回Excel或Calc做成圓餅圖還比較快。不過用程式來跑唯一的好處,就是變數設好之後就近乎全自動化。

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

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

  • 肥貓的異想世界

部落格列表

管理日誌
LibreOffice 正體中文文件
肥貓的異想世界
軟體自由運動部落格
馬哥的大小事
My Libre World
社會派宅爸

最新文章

test title
Interview with Sandy Corzeta, Admin of Indonesia's Fediverse Instance 'misskey.id'
簡單處理在Ubuntu終端機啟動Miniconda的問題
在LibreOffice Calc利用Vlookup做精準搜尋
現在就加入 LibreOffice 團隊當全職開發者,處理 RTL/CTL/CJK 等事宜!
[JS 筆記] 可選串連、條件三元、falsy、some與includes
用QGIS + OpenStreetMap + Python 處理線形地理資料
申請墨西哥簽證的經驗談
0805 ITTS 田野筆記:與印尼開源社群的初次接觸
Setting up Mailman3 on Debian 11 (Bullseye)
試解決Zotero安裝後無法使用LibreOffice Integration引用文獻的問題
2023年5月的 LibreOffice 之月的獲獎者!
Powered by Drupal