--- 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語言. 台北:五南圖書出版股份有限公司