---
title: 【R 語言與統計資料分析】Ch1:R 語言與統計學介紹
image: https://ppt.cc/fnT4xx@.png
---
# 【R 語言與統計資料分析】Ch1:R 語言與統計學介紹
在這個「數據即石油」的時代,我們每天都在產生資訊:從社群媒體的按讚數、電商平台的消費紀錄,到穿戴裝置記錄的心跳頻率。然而,原始數據本身並無意義,真正強大的是「**解讀數據的能力**」。我們希望透過此一系列課程,讓各位能有正確判讀資料的能力,並且能透過 R 語言做出更深層的統計分析與資料推論。
而在 AI 時代,統計與資料分析的概念更是不可或缺,ChatGPT 以及其他大型 AI 模型的成功更是來自大量的資料蒐集與整理。 AI 判斷一張照片是貓,並非它「認識」貓,而是透過統計機率計算出照片特徵符合「貓」定義的機率最高。統計學提供的機率模型,基本可以說是 AI 處理不確定性的唯一手段。此外,許多高階 AI 演算法其實是統計模型的延伸。例如「線性迴歸」演化成預測房價的 AI,「邏輯迴歸」則演化成神經網路中判斷是非的基礎單元。
# 1.1 什麼是統計學?
從宏觀的角度切入,統計學是一種認識世界的方式。你可以想像一夏在生活中,每天都有很多「**事件 (event)**」在發生,若我們將這些事件紀錄下來,並想從中找出一些脈絡來回答問題或是進行預測,統計學自然而然就會被發展出來。
此外,由於資源有限、慾望無窮,做任何決策都有「**成本**」;而當然,蒐集與分析資料也要成本,我們會希望透過找尋或建立一個更優質的方法來認識這個世界,這就是統計學。我們來看看統計學可以幫助我們解決甚麼問題。
## 1.1.1 認識群眾偏好
在商業上,廠商會想知道顧客的喜好,藉此能調整自身的促銷策略或是產品開發策略等,那如何探索消費者內心喜好呢?
在政治上,各政黨、各候選人皆會想知道自己在各地選區的得票率,來決定要如何分配選舉資源與策略,故民意調查就是為了回答這個問題的方法
- **直接問他**﹔行銷(問卷)研究、深度訪談
- **觀察行為**﹔購買行為分析、行銷資料科學
這些看似直觀的看法至少都需要一些基礎的統計觀念後才能更有信心去做決策。(藉由**科學**方法,而**不是感覺**)
<div style="text-align: center;">
<img src="https://ask.qcloudimg.com/http-save/yehe-1283928/t1it560ipv.jpeg" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">產品定位知覺圖</span>
</div>
<div style="text-align: center;">
<img src="https://imgcdn.cna.com.tw/www/WebPhotos/1024/20201103/2000x2000_0381013807442.jpg" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">選舉民調走勢分析</span>
</div>
## 1.1.2 相關性與因果推論
**因果推論**是統計學上一直想解決的問題,在發生 A 事件後,是否會改變 B 事件的結果 ?
比如說﹔
- 比較不同品牌肥料對作物收成的影響?
- 把班級人數變少,對學習成效有提升嗎?
- 組織中薪水差異程度與組織績效的關係?
而我們也可以退一步來看**相關性**的問題,比如﹔
- 性別跟智商的關係
- 生活習慣與疾病的關係(抽菸&肺癌)
- 投資組合的建構 (Markowitz portfolio theory, CAPM)
<div style="text-align: center;">
<img src="https://oceanic-phosphorus-8b7.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F03262b68-0153-4ddb-bda3-99fd1ca2aabf%2FUntitled.png?table=block&id=6188f05e-a8b2-4e77-a035-343413aff706&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=770&userId=&cache=v2" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">人均年巧克力消費量與該國的諾貝爾獎人口比例的關係圖。<br>
若我們只在乎相關性,可能會出現一些啼笑皆非的答案。</span>
</div>
## 1.1.3 預測未來
在事件還沒發生前,我們會希望透過一些「**資訊**」來預測未來,若能有效地預測,我們就能做出最佳的決策來減少我們的成本與風險。
舉例而言,當一位新顧客進來想要消費(或是進入網路平台),我們應該先推薦他什麼產品?他大概會買多少 ?
又如股票市場,若能成功預測股票走勢,則可以優先賺取**超額報酬**,此即財務上所稱的 **$\alpha$**。
<div style="text-align: center;">
<img src="https://attach.mobile01.com/attach/202306/mobile01-003b4172788b51f7f177f05f9f4961a3.jpg" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">不論是基本面分析或是技術分析都會牽涉到統計範疇</span>
</div>
## 1.1.4 樣本與母體的關係
<div style="text-align: center;">
<img src="https://oceanic-phosphorus-8b7.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb6ade406-0e33-4172-839b-c61968186417%2FUntitled.png?table=block&id=d7d57382-690b-4c94-9a35-5e224d8f606f&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=660&userId=&cache=v2" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">樣本與母體間的關係</span>
</div>
> 廣義的統計學是指蒐集、整理、表現、分析及解釋資料,並藉科學的方法,在不確定情況下,由樣本資料所獲得的結果,來推論母體的性質與事實,從而做出適切決策的一門科學。
- **母體 (population)**﹔研究對象全體所構成之集合。
- **樣本 (sample)**﹔從母體中選取一些代表性的子集合。
若我們對於全台高中男生的身高分佈感興趣,最好的方法當然就是全部抓來做身高檢查,但是由於時間、人力、物力成本的關係,我們常常無法做到所謂「普查」;因此,我們只得進行「抽查」,也就是所謂的抽樣。在理想的情況下,透過一定數量樣本數所進行的隨機抽樣,便可以以此來推論數以百萬量計的母體樣貌。**統計分析**就是藉由**分析樣本來推論母體**的樣態,也就是「**以小見大**」、「**見微知著**」。
# 1.2 R 語言的第一堂課
[R語言](https://zh.wikipedia.org/zh-tw/R%E8%AF%AD%E8%A8%80)是一種自由軟體程式語言與操作環境,主要用於統計分析、繪圖以及資料探勘。R由紐西蘭奧克蘭大學的統計學家羅斯·伊哈卡和羅伯特·傑特曼開發,現在由R核心小組負責開發,同時也有其他使用者編寫了諸多外掛的軟體套件。R以S語言為基礎,其詞法範疇語意來自Scheme。R的後台程式大多由C語言、FORTRAN語言和R自己寫成。
本課程將帶領你走進 R 語言 的世界。R 不僅僅是一門程式語言,它更是一套專為統計分析、資料視覺化與科學研究而生的強大工具。
比起傳統的 Excel 處理,R 語言能讓你更精準、自動化地處理大規模數據。它最迷人的地方在於其視覺化能力——只需幾行程式碼,就能將混亂的數字轉化為直觀、具備說服力的專業圖表。
R 語言是 AI 發展的重要基石之一。雖然現今許多大型語言模型(如 ChatGPT)使用的是 Python,但在 AI 的核心環節,如機器學習(Machine Learning)與數據建模中,R 語言依然在學術界與研究機構中佔有不可取代的地位。
數據預處理(Data Cleaning、Data Preprocessing): AI 的訓練效果取決於數據的品質。而在分析資料之前,我們就可以先透過 R 事先清洗、整理數據,這是開發任何 AI 模型前最關鍵的一步。
## 1.2.1 R 語言下載
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/H1msEwNtWg.png" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">R 語言官方網站</span>
</div>
進入 R 語言官方網站(https://www.r-project.org/),點選左側 CRAN 選擇對應載點即可下載。
<div style="text-align: center;">
<img src="https://oceanic-phosphorus-8b7.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb13ec5e2-e998-4b41-94de-2329b31a2d1d%2FScreen_Shot_2022-02-14_at_9.06.40_PM.png?table=block&id=7674dbe5-76d1-40ca-887e-6a87c5ed21c9&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=1420&userId=&cache=v2" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">R 語言下載</span>
</div>
## 1.2.2 R Studio 下載
RStudio 是一個專為 R 語言設計的開源整合開發環境(IDE)。它將編寫代碼、查看結果、管理套件和繪圖等功能整合在同一個介面中,是目前數據科學家與統計學家最常用的工具之一。
此外,若要使用 R Studio 來進行 R 專案,請一定要記得先下載 R 的主程式。
以下是 RStudio 的四大核心特色:
1. 直覺的四宮格介面
RStudio 的介面通常分為四個主要區塊,讓你不需要在多個視窗間切換:
左上(編輯器): 撰寫與儲存 R 腳本(Script)。
左下(控制台): 直接輸入指令並立即執行顯示結果。
右上(環境/歷史): 查看目前已載入的資料集、變數與執行過的指令。
右下(多功能區): 瀏覽檔案、顯示繪製的圖表、管理套件及查看幫助文件。
2. 強大的專案管理
套件管理: 內建工具可輕鬆安裝與更新 R 的擴充套件(Packages)。
專案(Projects): 幫助你將特定任務的所有檔案(代碼、數據、圖表)整理在同一個資料夾中,切換工作時非常方便。
請到 [https://www.rstudio.com/products/rstudio/download/](https://www.rstudio.com/products/rstudio/download/) ,請下載對應版本之 RStudio Desktop 即可。
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/SyuU7AHKbx.png" width="500">
<br>
<span style="color: gray; font-size: 0.8em;">R Studio 介面</span>
</div>
## 1.2.3 程式下載影片資源
#### Mac 版本 R 與 RStudio 的安裝影片
{%youtube st7MP-SmZdU %}
(影片取自 香港大學教育學系 **林金錫**博士 YouTube)
#### Windows 版本 R 與 RStudio 的安裝影片
{%youtube m3S1h8VJ5og %}
(影片取自 國立臺中教育大學教育資訊與測驗統計研究所 **李政軒**教授 YouTube)
# 1.3 R 語言基礎語法介紹
`R` 語言中,所謂運算皆是對所謂「物件(Object)」,這些物件記錄了我們的資料,並且以**向量** (vector)、**矩陣** (matrix)、**陣列** (array)、**列表** (Lists)、**資料框架** (data frames) 等形式儲存。我們可以對這些物件作運算與資料分析,當然也可以自行宣告這些物件是長什麼樣子。
比如:`a <- 10` 、`b = c(10,20,34)` 、 `x = 30` 、 `average = mean(b)` 等等。
::: success
💡 **寫註解才不會忘記**
寫程式請記得寫「註解」,在 `R` 中「#」為註解之開頭,該行在 # 號後面的文字皆不會被程式給執行。
```
# 在井字號後面的內容都不會被執行
```
:::
在 `R` 中,我們可以非常輕易地進行數學運算,基本上運算的內容與語法與高中學的數學相差無幾,我們將在此先進行概括的介紹。
## 1.3.1 算術運算符 (Arithmetic Operators)
在高階程式語言,如 `R` 或 `Python` 中,基本的數學運算會非常直觀,請參考以下表格:
| 運算符 | 說明 | 範例 | 結果 |
| :--- | :--- | :--- | :--- |
| `+` | 加法 | `5 + 2` | `7` |
| `-` | 減法 | `5 - 2` | `3` |
| `*` | 乘法 | `5 * 2` | `10` |
| `/` | 除法 | `5 / 2` | `2.5` |
| `^` 或 `**` | 指數(次方) | `2 ^ 3` | `8` |
| `%%` | 取餘數 (Modulo) | `5 %% 2` | `1` |
| `%/%` | 整除 (Integer Division) | `5 %/% 2` | `2` |
## 1.3.2 賦值運算
在撰寫程式語言時,我們不太可能單純是在進行數字運算,我們需要將數值賦予某些代號,再透過這些代號進行運算,如此才能讓程式語言更具架構化,也讓程式語言的複雜性可以進一步提升。我們可以透過以下**賦值運算符 (Assignment Operators)** 去連結數值以及變數。
| 運算符 | 說明 | 範例 |
| :--- | :--- | :--- |
| `<-` | 標準賦值(最推薦) | `x <- 10` |
| `=` | 賦值(多用於函數參數) | `y = 20` |
| `->` | 右向賦值(較少見) | `30 -> z` |
在命名變數時,請優先設定「有意義」的名字,這樣在觀看程式碼時,會像是在看故事書,就不需要再去對照`a`、`X`、`abc` 等等變數是代表什麼樣的含義。此外,在變數命名時也要避開所謂「**保留字**」,保留字為具有特殊功能或意義的字彙,因此我們無法將它們用作變數名稱。
有些字雖然不是「保留字」,但它們是 R 的內建函數(例如 `c`, `t`, `df`, `sum`)。雖然你可以把它們當作變數名稱,但這會覆蓋掉原本的功能,這通常被視為不好的撰寫習慣。
| 保留字 (Reserved Word) | 說明與用途 (Description) |
| :--- | :--- |
| `if`, `else` | 條件判斷式 |
| `for`, `while`, `repeat` | 迴圈控制結構 |
| `in` | 用於 `for` 迴圈中指定範圍 |
| `next`, `break` | 跳過本次迭代或強制中斷迴圈 |
| `function` | 用於定義新的函數 |
| `TRUE`, `FALSE` | 邏輯值(真、假) |
| `NULL` | 代表空對象或不存在的值 |
| `Inf` | 代表無限大 (Infinity) |
| `NaN` | 代表非數字 (Not-a-Number) |
| `NA` | 代表缺失值 (Not Available) |
| `...` | 代表可變長度的參數 (Ellipsis) |
讓我們來給個範例,若我們想要使用 R 計算身體質量指數 BMI,要如何計算呢?
公式如下:
$$ \text{BMI} = \frac{\text{Weight (kg)}}{\text{Height (m)}^2} $$
> 假設小明的身高為 175 公分,體重為 78 公斤。
```r
# 輸入身高體重
height <- 175 #單位為公分
weight <- 78 #單位為公斤
BMI <- weight/(height/100)^2
```
此處可以注意,變數名稱一定要完全一致,大小寫也要一致。
## 1.3.3 比較運算符與邏輯運算符
我們在此先稍微介紹比較運算符與邏輯運算符,詳細內容會於談論到「流程控制」之章節再行延伸。
| 比較運算符 | 說明 | 範例 | 結果 |
| :--- | :--- | :--- | :--- |
| `<` | 小於 | `3 < 1` | `FALSE` |
| `>` | 大於 | `3 > 1` | `TRUE` |
| `<=` | 小於或等於 | `5 <= 5` | `TRUE` |
| `>=` | 大於或等於 | `2 >= 5` | `FALSE` |
| `==` | 等於 | `5 == 5` | `TRUE` |
| `!=` | 不等於 | `5 != 2` | `TRUE` |
| 邏輯運算符 | 說明 | 範例 | 備註 |
| :--- | :--- | :--- | :--- |
| `&` | 邏輯與 (AND) | `c(T, T) & c(T, F)` | 逐個元素比較,回傳向量 |
| `&&` | 短路邏輯與 | `TRUE && FALSE` | 僅比較第一個元素 |
| `\|` | 邏輯或 (OR) | `c(T, F) \| c(F, F)` | 逐個元素比較,回傳向量 |
| `\|\|` | 短路邏輯或 | `TRUE \|\| FALSE` | 僅比較第一個元素 |
| `!` | 邏輯非 (NOT) | `!(5 > 2)` | 反轉邏輯結果 |
## 1.3.4 函數的使用
在 R 中,有許多內建的函數,如:平均、最大值、標準差、線性迴歸等等,我們可以用這些內建的函式來對我們的資料(物件)進行分析。
讓我們先從輸入「一串資料開始」!
:::info
✏️ **Example: 使用** `c()` **輸入資料並進行分析**
小明參加三對三籃球比賽,對手五人(含替補)的身高分別為 170、182、190、173、175 公分,小明想要分析對手的身高資料,如平均身高、中位數以及標準差等等,請幫忙匯入資料到 R 中並進行計算。
:::
```r
# 定義變數
height <- c(170,182,190,173,175) # c(·) 為建立向量之函式
```
(我們當然也可以用 `=` 去指派內容。)
在此,我們使用內建的統計函數進行分析:
```r
#平均數
mean(height)
#算出來答案是178
#中位數
median(height)
#算出來答案是175
#標準差
sd(height)
#算出來答案是8.031189
```
## 1.3.5 下載與使用套件
R 有許多內建的函式,但是內建函數往往無法滿足所有人的需求,也因此很多會自行寫函數,或整理過後,成為一個套件,也可以放到網路上提供所有人下載。在套件裡會有許多函數,其中有些許部分函數可能與系統預設之函數相同,因此若要執行套件中的函數,必須先執行套件,讓你的環境知道你有這個套件可以使用。
我們會使用 `install.packages()` 安裝所需的套件。
```r
#安裝套件
install.packages("PackageName", dependencies = TRUE)
```
當下載好後,透過`library()` 來呼叫這個套件
```r
library(PackageName)
```
再來我們就可以使用套件中的內容囉!
::: success
💡 **解說文件**
R 內建有許多函式,不同的套件內也有不同的函式,當我們不了解函數算出的是什麼東西時,可以透過下列程式碼在 RStudio 中作查詢。在此,我們以 `mean()` 為例。
```r
#這些指令都可以找到 mean() 的說明文件
help(mean)
?mean
help.search("mean")
apropos("mean")
```
R 中也有許多內建的資料集,如有名的 `iris` 資料集,我們一樣可以透過`help(iris)` 或 `?iris` 來查看該資料集的說明文件(包含來源、欄位定義)。
:::
# 參考資料
1. 陳旭昇(2024),資料分析的統計學基礎:使用R語言,東華書局
2. 林建甫 Jeff Lin(2020),[R 資料科學與統計](https://bookdown.org/jefflinmd38/r4biost)
3. Gareth James, Daniela Witten, Trevor Hastie, Robert Tibshirani. (2017). An Introduction to Statistical Learning: With Applications in R. New York: Springer.
4. 陳基國(2024). 基礎統計與R語言. 台北:五南圖書出版股份有限公司