---
title: 【R 語言與統計資料分析】Ch2:用 R 語言進行敘述統計及圖表繪製
image: https://ppt.cc/fX1j6x@.png
---
# 【R 語言與統計資料分析】Ch2:用 R 語言進行敘述統計及圖表繪製
在統計學的研究中,可以分為「敘述統計」以及「推論統計」兩種大類別。其中,敘述統計會是將蒐集到的原始資料,透過整理、分類、計算與繪圖,以簡明扼要的方式呈現資料的特徵。比如說,使用平均數、中位數表達資料的集中趨勢,透過標準差描述資料的離散程度等等。
| 比較項目 | 敘述統計 (Descriptive Statistics) | 推論統計 (Inferential Statistics) |
| :--- | :--- | :--- |
| **主要目的** | 整理、簡化並描述已知資料的特徵。 | 利用樣本數據推論、預測未知的母體特徵。 |
| **研究對象** | 僅限於手邊現有的這組數據。 | 從樣本 (Sample) 擴展到母體 (Population)。 |
| **常見工具** | 平均數、中位數、標準差、次數分配表、圖表。 | 假設檢定 ($p$ 值)、置信區間、相關與迴歸分析。 |
| **結果呈現** | 確定性的事實陳述(如:平均分數為 80)。 | 帶有不確定性的機率陳述(如:有 95% 的信心...)。 |
| **核心功能** | **「描述現在看到的」** | **「預測還沒看到的」** |
# 2.1 什麼是資料
什麼是資料? 我們可以這樣去思考,資料就是人類針對某種現象所做成的紀錄,可以是質性的描述,也可以是量化的數字,而在統計學裡,我們希望能將觀測到的現象,透過某種量測過的數字記錄下來,並且試圖找出一些規則。
<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%2F028b9123-7d38-4cfe-b765-262de9146512%2FUntitled.png?table=block&id=20928503-7550-430f-9bb6-4ee652269bd6&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=1420&userId=&cache=v2" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">資料的性質。統計學:方法與應用,林惠玲, 陳正倉。</span>
</div>
## 2.1.1 資料的蒐集
#### 初級資料的蒐集
1. **調查** Survey:
- 普查:針對母體中每個元素進行資料之蒐集
- 抽樣:從母體中抽取一部份的元素進行資料蒐集
2. **實驗** Experiment:
對影響母體特性的某些因素或其他因素加以控制的資料蒐集方法
3. **觀察** Observation:
研究人員或其工作人員在做研究時利用觀看、查察記錄,而不與研究對象有任何接觸晤談的資料搜集方法
#### 次級資料的蒐集
次級資料的來源分類
蒐集次級資料時,通常會從「內部」和「外部」兩個方向著手:
1. 內部來源 Internal Sources:
指組織或企業內部現有的紀錄,成本最低且最容易取得。如公司的銷售紀錄、財務報表、行銷網站數據等等。
2. 外部來源 External Sources:
指從組織外部取得的資料,來源非常廣泛。
- 政府機構: 內政部人口統計、財政部經濟指標、政府開放資料平台(Open Data)。
- 學術機構: 碩博士論文、期刊研究報告、學術數據庫。
- 大眾媒體: 報紙新聞、商業雜誌(如《天下》、《商周》)、專業電視評論。
- 產業與研究機構: 工商協會報告、市場調查公司(如 Nielsen、資策會 MIC)的產業趨勢報告。
- 網際網路: 社群媒體討論(論壇、FB、IG)、搜尋趨勢(Google Trends)。
## 2.1.2 資料的屬性
1. 量性資料 quantitative data:**可以**用數量表示的資料
如:身高、體重
- 離散資料:人數、產品數
- 連續資料:溫度、時間、長度
2. 質性資料 qualitative data:**無法**用數量表示的資料
如:性別、教育程度
## 2.1.3 資料蒐集的時間
1. **橫斷面資料** cross-sectional data:於同一時間點蒐集的資料。
如:全校期末考成績、民意調查
2. **時間序列資料** time-series data:橫跨不同時間段蒐集之資料。
如:股價資料、地震資料
3. **panel data**:稱為縱橫資料或面板數據或可以稱為「長期追蹤資料」。
針對同一群樣本持續地蒐集橫斷面資料。
如:華人家庭動態資料庫
## 2.1.4 資料的衡量尺度
在做資料分析時,我們首先要瞭解資料是如何被「測」,或是說如何被「記錄」下來的,那這些記錄所代表的格式,就是所謂的衡量(測量)尺度。
1. **名目**尺度 nominal scale:衡量類別資料
如:性別
2. **順序**尺度 ordinal scale:資料有順序、強弱等級區分
如:名次、教育程度
3. **區間**尺度 interval scale:可以測量,但**無絕對的 0**
如:溫度、滿意度(常以interval處理)
4. **比例**尺度 ratio scale:可衡量有固定**原點(0)**的量
如:長度、年齡、數量
- 更多資訊可點此查詢:[維基百科](https://zh.m.wikipedia.org/zh-tw/%E6%B8%AC%E9%87%8F%E5%B0%BA%E5%BA%A6)
# 2.2 R語言的資料型態
先前,我們曾提到 R 語言是專門進行統計與資料分析的軟體,故 R 會將蒐集到的資料「換」成 R 看得懂的,而這個語言就跟我們剛剛所提到的資料尺度有緊密的關係,此而我們當然也要了解如何透過這樣的語言跟電腦溝通。
## 2.2.1 資料的類型
#### 浮點數與整數
1. **numeric:處理所有帶有小數點或不帶小數點的實數**
2. **integer:專門用來儲存整數**
```R
# assign numbers
a <- 9487
b <- 3.14
c <- 5L
pi
print(a)
#identify structure
str(a)
str(b)
str(c)
#structure transform
a <- as.integer(a) #型態間的轉換
is.integer(a) #型態間的判定
str(a)
```
::: success
💡 **特殊的數值**
在 numeric 型態中,有幾個特殊的保留字需要注意:
- `Inf` / `-Inf`: 代表無窮大。例如 1 / 0 會得到 `Inf`。
- `NaN` (Not a Number): 代表「非數字」。例如 0 / 0 會得到 NaN。
- `NA` (Not Available): 代表資料缺失(Missing Value),在數據分析中非常常見。
:::
#### 布林值
簡而言之,就是 `TRUE` 跟 `FALSE` 兩種資料。我們會去判別資料是不是符合我們的「邏輯」,若正確,R 就會回傳 `TRUE` ,若否則回回傳 `FALSE` 。
```r
#TRUE
2 == (1+1) #等於
2 != 5 #不等於
2 > 1
#False
2 == 3
2 < 1
```
::: success
💡 **布林變數與數值的變換**
在 `R` 中,我們遵循一個簡單的數學邏輯來處理布林與數值的轉換:
- `TRUE` 轉換為 1
- `FALSE` 轉換為 0
反之,當數值轉為布林時:
- 0 轉換為 `FALSE`
- 所有非 0 的數字(包含負數)都會轉換為 `TRUE`
```R
# 布林轉數值
as.numeric(TRUE) # 結果: 1
as.numeric(FALSE) # 結果: 0
# 數值轉布林
as.logical(1) # 結果: TRUE
as.logical(0) # 結果: FALSE
as.logical(-5) # 結果: TRUE (非0即為真)
```
:::
#### 字串
字串 (string) 是程式中描述「文字」的形式,通常都會用 `""` 來去做標示。
```R
name <- "Tom"
print(name)
str(name)
```
剛剛有說到數字的類別是 `numeric` 但數字也是一種字,我們也可以將其轉為「字串」來處理。
```R
c <- "5"
d <- 87
str(d)
d <- as.character(d)
str(d)
```
#### 類別變數 factors
先前我們曾提到類別變數的處理,R 語言中也針對此種資料做出設計,我們需要透過`factor()`函數進行處理。
```R
gender <- c("boy", "girl", "boy", "boy", "girl") # 建立一個character vector
gender <- factor(gender) # 轉換成factor型態
#或者
gender <- as.factor(gender)
gender
```
這也可以做一些進階的處理:
```R
## factor() with duplicated labels allowing to "merge levels"
x <- c("Man", "Male", "Man", "Lady", "Female")
## Map from 4 different values to only two levels:
xf <- factor(x, levels = c("Male", "Man" , "Lady", "Female"),
labels = c("Male", "Male", "Female", "Female"))
xf
```
## 2.2.2 資料的結構
在了解資料的型態後,我們接下來要學習如何「儲存」這些資料。
#### 向量 vector
我們可以簡單將其想成一串資料被記錄起來即可,但要注意所有元素必須是相同類型。我們可以透過 `c()` 函數,將輸入的資料連接成向量,此處的`c`為 concatenate(連接) 的意思。
```R
#Combine Values into a Vector or List
scores <- c(87,77,38,49)
print(scores)
names <- c("Tom","Bob","Elizabeth")
print(names)
#建立一串數字
c(1:10)
```
::: success
💡 **資料的 INDEX** :
在了解資料的樣貌後,我們可以快速的查找資料的位置,這有助於我們做迴圈或是其他資料處理。
Example:
```R
names[3]
#return "Elizabeth"
#what will happen when we run codes below
names[2:3]
names[4]
```
:::
#### 矩陣 matrix
不要懷疑! 就是你在高中學的矩陣,用矩陣做資料運算是一種最快速的方法,同時與向量一樣,內部的資料類型必須統一。
```R
a <- matrix(c(1:6), nrow=3, ncol=2) #建立一個3x2的矩陣,依照column分別填入1~6的值
a
```
<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%2Fad418afc-33cb-4b28-9504-a5c135c94804%2FUntitled.png?table=block&id=e5d44d47-786b-40b8-bbab-991e17d3904c&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=260&userId=&cache=v2" width="150">
<br>
<span style="color: gray; font-size: 0.8em;">R 中的矩陣表示</span>
</div>
- 和矩陣相關的運算函數:
- `t(x)` : transpose
- `x %*% y` : 矩陣相乘,x 乘 y
- `diag(x)` : output diagonal matrix from x
- `det(x)` : determinant
- `solve(x)` : inverse matrix
- `eigen(x)` : 計算特徵值和特徵向量
- `x[a,b]` : 擷取矩陣資料
#### 陣列 ARRAY
在 R 中,Array 是一個多維度且同質的資料結構。
同質 (Homogeneous): 這代表 Array 裡的每一個格子,都必須裝同樣型態的資料(通常是數值 numeric)。你不能在一個 Array 裡同時放數字跟文字。
多維度 (Multidimensional): * 一個維度時,它叫 Vector (向量)。
兩個維度時,它叫 Matrix (矩陣)。
三個維度(含)以上時,我們通稱為 Array。
想像結構: 如果 Vector 是一排抽屜,Matrix 就是一整面抽屜牆,而 Array 則是好幾面抽屜牆疊在一起,形成一個立體的「抽屜櫃」。
```R
# 建立一個 3x4x2 的三維陣列
# 代表有 3 列 (rows), 4 行 (columns), 2 層 (layers)
my_array <- array(1:24, dim = c(3, 4, 2))
print(my_array)
```
維度順序說明: 在 dim = c(3, 4, 2) 中:
- 第一個數字代表 Row(列)
- 第二個數字代表 Column(行)
- 第三個數字代表 Layer(層/切片)
由於 Array 有多個維度,取值時必須指定各個維度的座標:
- 取特定元素: my_array[1, 2, 1] (第 1 列、第 2 行、第 1 層的數字)。
- 取整張切片: my_array[, , 1] (取得第 1 層的所有資料,結果會是一個 Matrix)。
- 取特定列: my_array[1, , ] (取得所有層中第 1 列的資料)。
4. 為維度命名 (Dimnames)
Array 的每一層、每一行、每一列都可以命名,這在處理複雜數據時非常有幫助:
```R
row_names <- c("R1", "R2", "R3")
col_names <- c("C1", "C2", "C3", "C4")
layer_names <- c("Dept_A", "Dept_B")
named_array <- array(1:24, dim = c(3, 4, 2),
dimnames = list(row_names, col_names, layer_names))
print(named_array )
```
<div style="text-align: center;">
<img src="https://www.researchgate.net/publication/357820593/figure/fig2/AS:1134626982625284@1647527561324/A-3D-tensor-of-a-Red-Green-Blue-RGB-image-of-a-dimension-of-4-A-4-A-3.png" width="250">
<br>
<span style="color: gray; font-size: 0.8em;">影像處理: 一張 RGB 彩色照片就是一個 3D Array(高度 x 寬度 x 3個顏色通道)。</span>
</div>
#### 資料框 dataframe
在 `python` 中,我們要使用 `pandas` 套件才能使用的資料型態,在 R 中就有內建。
要想像一個 dataframe 也不是太難,腦袋想著以前的段考成績單就好了!
> **橫的放人(或標的)、直的放各種資料指標**
<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%2F322591c8-0a0a-4ee2-8ebc-401abe36d6e9%2FUntitled.png?table=block&id=9c4320b8-5d27-4d41-abc4-7b998c449c12&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=860&userId=&cache=v2" width="250">
<br>
<span style="color: gray; font-size: 0.8em;">R 中的矩陣表示</span>
</div>
Dataframe 就像是有著標題的矩陣形式,但更加靈活,允許不同的資料型態共同存在,惟每一直欄 (Column) 內的資料型態需要是同質的。
::: success
💡 **內建資料集**
在 `R` 中,有許多的資料集 (Data set) 就是用 dataframe 的方式儲存。
透過在 R 的 Console 輸入`data()`,會開啟一個新視窗,列出目前已載入套件中所有可用的資料集。
:::
#### 列表 List
列表 (List) 是最靈活的一種結構,它可以容許資料型態的異質性,一個 List 裡可以同時包含數值、向量、矩陣、資料框,甚至可以包含另一個 List。也因此,List 內每個元素的度或維度也都不需要一致。
```R
# 建立一個包含多種型態的 List
my_list <- list(
id = 101, # Numeric
name = "John", # Character
scores = c(85, 90, 78), # Vector
matrix_data = matrix(1:4, 2), # Matrix
df = iris # DataFrame
)
```
讓我們一起練習使用`my_list[1]`、`my_list[[1]]`、 `my_list$name` 來取值,看看輸出的內容有什麼不同。
# 2.3 資料分析的第一堂課
當我們想要對一個資料集進行分析時,第一個步驟就是瞭解資料的樣態。此時,敘述性統計就是一個非常重要的方法,透過一些關鍵指標,能夠讓我們瞭解這些資料不同的特性。
## 2.3.1 開始進行資料分析
在分析資料前,我們當然得知道我們在分析什麼內容。這時候,就得提到兩個關鍵的名詞「**Metadata**(詮釋資料)與 「**Data Dictionary**(資料字典)」。
#### Metadata
Metadata 旨在描述資源的語義、屬性與環境的結構化資訊,旨在協助使用者理解、尋找、管理與呈現資料。內容涵蓋描述性(書名、作者)、結構性(如:書與章節關係)及管理性(檔案格式、存取權限)等等。
| 欄位名稱 | 內容說明 |
| :--- | :--- |
| **資料集標題** | 2024年台北市信義區咖啡店消費行為調查 |
| **資料來源** | 某某餐飲連鎖集團 POS 系統 |
| **資料建立者** | 行銷部數據分析組 (contact@coffee.com) |
| **時間範圍** | 2024-01-01 至 2024-12-31 |
| **地理範圍** | 台北市信義區(包含信義店、忠孝店) |
| **檔案格式** | CSV (UTF-8 編碼) |
| **資料量** | 50,000 筆紀錄 |
| **授權條款** | 內部使用,未經授權禁止外流 |
#### Data Dictionary
Data Dictionary 定義資料庫中所有資料元素的組成、定義和屬性的文檔或表格。涵蓋內容包括欄位名稱(Data Item)、資料類型(Data Type,如:數字、字串)、限制規則(Constraints)、資料結構(Data Structure)。
簡單來說,就是我們如何「記載」Metadata 所提到的內容。
| 欄位代碼 | 欄位名稱 | 資料型態 | 值域 / 單位 | 備註說明 |
| :--- | :--- | :--- | :--- | :--- |
| `trans_id` | 交易序號 | Integer | 10001 - 99999 | 唯一識別碼,不可重複 |
| `cust_gender` | 顧客性別 | Factor | M, F, O | M=男, F=女, O=其他 |
| `item_name` | 商品名稱 | Character | 拿鐵, 美式, 摩卡... | 販售之單品名稱 |
| `amount` | 消費金額 | Numeric | > 0 (TWD) | 單位:新台幣,已扣除折扣 |
| `is_member` | 會員身分 | Logical | TRUE, FALSE | 是否為 O-Card 註冊會員 |
| `visit_date` | 交易日期 | Date | YYYY-MM-DD | 顧客進店消費之日期 |
## 2.3.2 如何分析資料集
當我們了解一個資料集的 Metadata 並且要進行要開始進行分析時,以下三個步驟能讓我們快速搞清楚所有情況。
:::info
在此,我們以內建的 `iris` 資料集為例,資料集中記載不同類型鳶尾花的資料,資料說明如下:
- `Sepal.Length`: 花萼長度
- `Sepal.Width`: 花萼寬度
- `Petal.Length`: 花瓣長度
- `Petal.Width`: 花瓣寬度
- `Species`: 屬於哪一種鳶尾花
:::
1. **以管窺天,透過** `head()` **來認識全部資料**
當我們要進行資料分析時,所面對的資料筆數很可能是成千上萬筆。我們自然不希望一次匯出所有的資料,不只等待的時間長,在視覺呈現上也很雜亂。
因此,我們便可以透過擷取資料中的前幾筆,來窺探資料是如何被記錄,以及從中可能會發生的各種問題。
```R
head(iris) # 預設擷取資料前6筆
head(iris,10) # 擷取資料前10筆
tail(iris) # 預設擷取資料最後6筆
```
2. **知己知彼,透過** `str()` **了解每個欄位的內容**
`str()` 是 structure 的縮寫,可以讓我們快速瞭解資料的型態與結構,避免在後續運算時發生型態錯誤。
執行 `str()` 後,R 會在控制台呈現一個層次分明的摘要:
- 物件類別 (Object Class): 告訴你這是 Data Frame, List, Matrix 還是 Vector。
- 維度與長度 (Dimensions): 例如資料框有多少列(obs.)與多少欄(variables)。
- 欄位清單 (Field List): 列出每個欄位的名稱。
- 資料型態 (Data Type): 顯示每個欄位是 num (數值), int (整數), Factor (因子) 還是 chr (字串)。
- 樣例數據 (Preview): 顯示前幾個實際數值,讓你感覺一下資料長什麼樣子。
以 `str(iris)` 為例,輸出結果如下:
```
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
```
`str(iris)` 告訴我們資料的數量(**總筆數**、變數量)以及每一個變數的**資料型態**和內容。
3. **以小見大,透過** `summary()` **快速產出敘述統計**
在 R 語言中,`summary()` 是一個極具代表性的「泛型函數」(Generic Function)。它的聰明之處在於會根據你丟給它的資料型態,自動切換最適合的統計摘要方式。
如果說 str() 是讓你看清資料的「骨架」,那麼 `summary()` 就是讓你看清資料的「內涵(分佈)」。
以分析 dataframe 為例,`summary()` 處理資料時主要分為兩大邏輯
- 針對數值 (Numeric/Integer): 提供最小值 (Min.)、第一四分位數 (1st Qu.)、中位數 (Median)、平均值 (Mean)、第三四分位數 (3rd Qu.)、最大值 (Max.)。
- 針對類別 (Factor/Logical): 提供「次數統計」,列出每個類別出現了多少次。
<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%2F06fcb9e7-82ee-4283-8765-9c9ef361f79b%2FUntitled.png?table=block&id=8edcd152-d9b6-42dc-b595-b58a86ad56e0&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=1150&userId=&cache=v2" width="350">
<br>
<span style="color: gray; font-size: 0.8em;">iris 資料集的摘要</span>
</div>
# 2.4 數據洞察:敘述統計與繪圖應用
## 2.4.1 分析數值資料
#### 平均數 Average
平均數是最直觀的中央趨勢指標,代表所有數值的總和除以次數。使用平均數分析時,要注意「**極端值(Outliers)**」的是否會嚴重影響到分析結果。
$$\bar{x} = \mathop{\arg\min}\sum_{i=1}^n(x_i-c)^2= \frac{\sum_{i=1}^n x_i}{n}$$
我們以 `iris` 中的 `Sepal.Length` 為例
```R
#平均數
mean(iris$Sepal.Length)
```
#### 變異數 (Variance) 與標準差 (Standard Deviation)
變異數用以描述數據的離散程度,衡量各數據點與平均數的差距,而變異數開根號即為標準差。
$$s=\sqrt{\frac{\sum_{i=1}^n (x_i-\bar{x})^2}{n-1}}$$
```R
#變異數
var(iris$Sepal.Length)
#標準差
sd(iris$Sepal.Length)
```
#### 直方圖 Histogram
在敘述統計中,直方圖 (Histogram) 是觀察「連續型變數」分佈狀況最核心的工具。它將數據切分成一個個連續的區間(稱為 Bins),並統計每個區間內數據出現的頻率。
直方圖能讓我們一眼看出數據的集中趨勢、離散程度以及是否存在偏態。
```R
# 畫出 Sepal.Length 的直方圖
hist(iris$Sepal.Length,
main = "Sepal Width of Iris data",
xlab = "Width (cm)")
```
<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%2F2eca80d7-2702-4351-a388-fffdc43ff974%2FUntitled.png?table=block&id=aa5b4d46-bd67-47c5-8e42-d9786039a5db&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=670&userId=&cache=v2" width="300">
<br>
<span style="color: gray; font-size: 0.8em;">透過直方圖,我們可以一窺「量性」資料的離散狀況。</span>
</div>
#### 四分位數與盒狀圖
我們先前已認識到,可以使用 `summary()` 快速求得四分位數以及平均值。讓我們快速認識一下四分位數的相關知識。
- **全距 (range)**: 資料的最大值與最小值。
```R
#找尋最大最小值
max(iris$Sepal.Width)
min(iris$Sepal.Width)
range(iris$Sepal.Width) #同時找出最大與最小值(全距)
```
- **分位數 (Quantile)**: 用來表示一個數值在數據集合中相對於其他數值的相對位置,如常用的四分位數可將資料分成四個區間,而百分位數 (Percentile) 就是將資料分成 100 個區間。
若以 `iris$Sepal.Width` 為例,我們可以找到該資料的**四分位數(PR25,PR50,PR75)**
<div style="text-align: center;">
<img src="https://www.liveism.com/images/c9232_3.svg" width="400"> <br>
<span style="color: gray; font-size: 0.8em;">四分位數</span>
</div>
```R
#百分位數
quantile(iris$Sepal.Width) #預設取得四分位數與最大最小值
quantile(iris$Sepal.Width,0.25) #可指定對應百分位數
quantile(iris$Sepal.Width, probs = c(0.25, 0.5, 0.75)) # 也可一次輸出多個對應值
```
- **四分位距 interquartile range, IQR**:
四分位距 = 第三四分位數 - 第一四分位數 = PR75 - PR25。
```R
IQR(iris$Sepal.Width)
```
#### 盒狀圖 Box plot
一個標準的盒狀圖由五個核心數值組成(Five-number summary):
- 下鬚邊界 (Minimum): 除去離群值後的最小值(通常是 $Q1 - 1.5 \times IQR$)。
- 下四分位數 (Q1 / PR25): 箱子的底邊,代表 25% 的數據低於此點。
- 中位數 (Median / PR50): 箱子中間的那條線,代表數據的中心。
- 上四分位數 (Q3 / PR75): 箱子的頂邊,代表 75% 的數據低於此點。
- 上鬚邊界 (Maximum): 除去離群值後的最大值(通常是 $Q3 + 1.5 \times IQR$)。
:::success
💡 **離群值 (Outliers)**
在鬚邊界之外的點(通常畫成小圓圈)。這些點遠離大多數數據,可能是輸入錯誤,也可能是值得研究的特殊案例。
:::
```R
# 繪製盒狀圖
boxplot(iris$Sepal.Width,
ylab = "Sepal width (cm)",
main = "Anderson's Iris Data")
```
<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%2F8d20bf08-d8d9-4158-898c-f2ae60c32918%2FUntitled.png?table=block&id=2bd9f119-2c66-4a46-8e2d-87550c0f5e51&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=580&userId=&cache=v2" width="300"></div>
```R
#也可以分組比較
boxplot(iris$Sepal.Width ~ iris$Species,
ylab = "Sepal width (cm)",
main = "Anderson's Iris Data")
```
<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%2Fb31dc97d-3d10-43cd-89eb-43ec0ff05070%2FUntitled.png?table=block&id=a1def7a7-4351-4cf1-bc76-b244a8d37711&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=480&userId=&cache=v2" width="300"></div>
## 2.4.2 分析類別資料
處理類別資料時,因為沒有數值大小關係,所以我們會在意個類別資料量的多寡。
我們也要注意,此時畫出來的數目不能超過樣本數,或是說 100%。
我們可以使用 `table()` 快速計算出類別的數量:
```R
table(iris$Species) #記數表
```
```
OUTPUT:
setosa versicolor virginica
50 50 50
```
#### 圓餅圖 pie chart
```R
x <- table(iris$Species)
piepercent<- paste(round(100*x/sum(x), 2), "%")
pie(table(iris$Species), labels = piepercent,col =c('brown','pink','gray'),main="species")
legend("bottomleft",names(table(iris$Species)),fill =c('brown','pink','gray' ))
```
<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%2Fec179968-735a-4e0b-80d0-112ab6b3fe5f%2FUntitled.png?table=block&id=5bb48520-2f25-4f3b-b929-27b3abcd591a&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=580&userId=&cache=v2" width="300"></div>
#### 長條圖 bar plot
除了圓餅圖之外,不連續的資料也適合用長條圖來表示
```R
barplot(table(iris$Species),
main = "species" ,
col = c('brown', 'pink', 'gray'))
```
<div style="text-align: center;">
<img src="https://i.ibb.co/wq7nJvh/image.png" width="300"></div>
## 2.4.3 分析趨勢資料 - 折線圖 Line plot
當我們要觀察趨勢,尤其是時間序列資料,我們會使用**折線圖**來表示。
```R
v <- c(7,12,28,3,41)
t <- c(14,7,6,19,3)
plot(v,type = "o",col = "red", xlab = "Month", ylab = "Rain fall",
main = "Rain fall chart")
lines(t, type = "o", col = "blue")
```
<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%2F84872320-9622-4ec5-b596-11d0beb85cfe%2FUntitled.png?table=block&id=d6a98408-1d2f-436e-88b2-4affed87a51b&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=770&userId=&cache=v2" width="300"></div>
## 2.4.4 資料間的關係 - 散佈圖 Scatter Plot
在探討資料之間的相關性 (Correlation) 時,散佈圖 (Scatter Plot) 是最直觀且強大的工具。它能幫助我們觀察兩個連續型變數(例如:身高與體重、花萼長度與花瓣長度)之間是否存在某種規律。
透過觀察點的分布趨勢,我們可以辨識出以下三種關係:
- 正相關 (Positive Correlation): 當 X 軸數值增加,Y 軸也隨之增加。點群呈現「由左下往右上」的趨勢。
- 負相關 (Negative Correlation): 當 X 軸數值增加,Y 軸反而減少。點群呈現「由左上往右下」的趨勢。
- 無相關 (No Correlation): 點群雜亂無章,看不到明顯的線性趨勢。
```R
plot(x = iris$Petal.Length,
y = iris$Petal.Width, pch=21, bg=c("red","green3","blue")[unclass(iris$Species)],
main="Edgar Anderson's Iris Data")
```
<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%2Fd51e98e0-b99e-4b13-9e43-7f95c3bc2028%2FUntitled.png?table=block&id=d3cc0a8a-c5cb-43ca-8ef3-9d4624a02ba2&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=860&userId=&cache=v2" width="300"></div>
:::success
💡 倆倆對應的**矩陣散佈圖(Scatter Plot Matrix)**:
「一鍵」看穿資料集中所有數值欄位之間的兩兩關係
```R
pairs(iris[1:4], main = "Edgar Anderson's Iris Data", pch = 21,
bg = c("red", "green3", "blue")[unclass(iris$Species)])
```
<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%2F2cc84b3b-28b5-4e01-9792-6707716b5847%2FUntitled.png?table=block&id=fccc77c6-77f3-4b3e-bf50-4fe93f50343b&spaceId=d0d863fa-b4b0-4191-a35e-38993e9bc763&width=770&userId=&cache=v2" width="400"></div>
:::
資料視覺化的世界無邊無窮,未來將會在適當時機介紹更多相關工具與繪圖方法。
# 參考資料
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語言. 台北:五南圖書出版股份有限公司