---
# System prepended metadata

title: 【R 語言與統計資料分析】Ch2：用 R 語言進行敘述統計及圖表繪製
tags: [R 語言與統計資料分析]

---

---
title: 【R 語言與統計資料分析】Ch2：用 R 語言進行敘述統計及圖表繪製
image: https://ppt.cc/fnT4xx@.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語言. 台北：五南圖書出版股份有限公司


