R note

可以使用 RStudio Desktop (本機)或是 RStudio Cloud (雲端) 來編輯 R

載入任何插件使用 install.packages(),然後再用 library() 載入才能使用。

tidyverse 套件集合

它包含了許多套件,可以用於讀取資料(readr清理轉換資料(dplyr, tidyr、以及建立視覺化圖表(ggplot2

install.packages(“tidyverse”) 

library(tidyverse)

使用 library() 函數載入 tidyverse 函式庫 。在控制台窗格中輸入 library(tidyverse) ,然後點選執行 。

c(x, y, z) 建立向量

創建數字向量numbers <- c(1, 5, 10, 15) 這個指令會創建一個包含四個數字的向量。

創建字元向量fruits <- c("apple", "banana", "orange") 這個指令會創建一個包含三個字元(文字)的向量。

組合不同類型的資料: 當你用 c() 函數組合不同資料類型的項目時,R 會自動進行強制轉換 (coercion),將所有項目轉換成最「通用」的類型。

例如,如果你組合數字和字元,所有數字都會被轉換成字元
mixed_vector <- c(1, "two", 3)
# 執行這個指令後,mixed_vector 的內容會變成 c("1", "two", "3"),所有元素都變成了字元。

要使用 c() 函數建立整數向量 ,必須在每個數字後面直接放置字母 L。
c(1L, 5L, 15L)

也可以透過冒號來建立連號

z <- c(4:10)
z = 4 5 6 7 8 9 10

matrix() 使用 nrow = 2 以指定行數,指定列數 ncol = 2

matrix(c(3:8), nrow = 2)

     [,1] [,2] [,3]

[1,]    3    5    7

[2,]    4    6    8

使用 typeof() 函數確定向量的類型 。

typeof(c(“a” , “b”))

[1] “character”

使用 is 函數檢查向量是否為特定類型

x <- c(2L, 5L, 11L)

is.integer(x)

[1] TRUE

向量的長度(即它包含的元素數量),使用  length() 函數

x <- c(33.5, 57.75, 120.05)

length(x)

[1] 3

使用 names() 函數為向量的每個元素分配不同的名稱。

x <- c(1, 3, 5)

names(x) <- c(“a”, “b”, “c”)

x

a b c 

1 3 5 

使用 list() 建立列表,與向量不同,列表可以包含不同資料類型的元素

list(“a”, 1L, 1.5, TRUE)

列表可以包含其他列表

list(list(list(1 , 3, 5)))

[[1]] # 第一個清單(是空的)

[[1]][[1]] # 第二個清單(是空的)

[[1]][[1]][[1]]    # 第三個清單

[1] 1

[[1]][[1]][[2]]

[1] 3

[[1]][[1]][[3]]

[1] 5

str()  了解清單包含哪些類型的元素

str(list(“a”, 1L, 1.5, TRUE))

# 分別為字元 ( chr )、整數 ( int ) 、數字 ( num ) 和邏輯值 ( logi )

ymd() 函數可以輕鬆處理常見的 “年-月-日” 格式,無論分隔符是橫線、斜線還是其他符號,即使是非標準的格式也能夠處理。

# 他是一個 lubridate 套件中的函數。

today() ,會顯示目前日期為年(4 位數字)、月(2 位數字)和日(2 位數字)的格式

now() 函數可以取得目前日期時間。

ymd_hms(“2021-01-20 20:11:59”)

# [1] “2021-01-20 20:11:59 UTC”

# R 預設以標準 yyyy-mm-dd 格式建立日期

data.frame() 函數,可以建立一個欄位資料表

>a = data.frame(x = c(1, 2, 3,4,5,6) , y = c(12,11,10,9,8,7))

  x  y

1 1 12

2 2 11

3 3 10

4 4  9

5 5  8

6 6  7

使用[ ]可以取相對位置的數字

> a[1,8]

NULL

> a[1,2]

[1] 12

file.create()  函數可以一次建立一個(或多個)空白檔案

# 如果執行該函數時檔案建立成功,R 將傳回 TRUE 值 。否則,R 將傳回 FALSE 值 

file.create(“new_csv_file.csv”)

# code output:

# [1] TRUE

使用 file.copy(複製的檔案,目標資料夾) 函數複製檔案 

file.copy(“new_text_file.txt”, “destination_folder”)

使用 unlink() 刪除 R 文件

unlink(“new_.file.csv”)

if-else跟python差不多,差在要大括號而已

x <- -7

if (x > 0) {

  print(“x is a positive number”)

} else {

  print (“x is either a negative number or zero”)

}

Pipe (管道):管道操作符 (%>%|> ) 的作用是將前一個函數的輸出,直接作為下一個函數的第一個參數。這能讓程式碼看起來更像是一個連續的流程,避免多層次的巢狀函數,使程式碼更具可讀性。

使用 read_csv()  讀取 .csv 文件

readr_example() # 可以列出產出範例文件

read_csv(readr_example(“mtcars.csv”)) # 讀出範例csv檔案

# read函式還支援很多種檔案類型  .xls、.xlsx

# 使用時要先載入 library(readxl)

here:解決檔案路徑問題

here 套件的主要用途是簡化檔案路徑管理。當你在專案中移動腳本或與他人協作時,相對路徑可能會失效。here 能自動偵測專案的根目錄,並建立一個不受腳本位置影響的路徑。

install.packages(“here”)

library(“here)

用法範例:

  • 讀取檔案: read_csv(here(“data”, “raw_data.csv”))。無論你的腳本在哪個子資料夾,它都能正確找到 data 資料夾下的 raw_data.csv。


skimr:快速瀏覽資料摘要

skimr 的主要用途是提供快速且全面的資料集摘要,它能為每一欄位生成簡潔的統計報告,包括遺漏值、數據類型、分佈長條圖等,讓你在資料分析初期快速掌握資料的全貌。

install.packages(“skimr”)

library(“skimr”)

skim_without_charts(“ “)  # 可獲得資料集的許多詳細資訊

glimpse(“ “) # 可以快速取的數據摘要(幾欄幾列,欄位名稱)

用法範例:

  • 生成摘要: skim(your_dataset)。執行後,你會得到一個易於閱讀的表格,其中包含了所有變數的關鍵統計數據,如中位數、平均值、遺漏比例等。


janitor:快速清理資料

janitor 專門用於自動化常見的資料清理任務,這能幫助你節省大量時間。它能處理不規則的欄位名稱、刪除空值和空行等,讓你的資料變得整潔、易於分析。

install.packages(“janitor”)

library(“janitor”)

用法範例:

  • 清理欄位名稱: clean_names(your_dataset)。這個函數會將欄位名稱轉換為小寫、移除空格和特殊符號,例如將 Customer ID 變成 customer_id。

  • 移除空行/空欄位: remove_empty(your_dataset)。這會自動刪除全是遺漏值的行或欄。


dplyr:資料轉換與操作

dplyr 是 tidyverse 的核心套件之一,用於資料轉換和操作。它的語法非常直觀,並使用管道符號 %>%(或新版的 |>)將多個操作串聯起來,讓程式碼更易於閱讀。

install.packages(“dplyr”)

library(“dplyr”)

install.packages(“palmerpenguins”)  企鵝數據集

library(“palmerpenguin”)

rename( a = b) 將a改名為b

rename_with(a,toupper) 將a欄位改成大寫

clean_names() 將自動確保列名的唯一性和一致性

用法範例:

  • 篩選資料: filter(your_dataset, age > 30)。這個指令會篩選出年齡大於 30 的資料。

  • 選取欄位: select(your_dataset, name, age)。這個指令會選取 name 和 age 這兩個欄位。

  • 分組彙總: group_by(your_dataset, product) %>% summarize(total_sales = sum(sales))。這會按產品分組並計算總銷售額。

資料庫 %>% group_by(欄位1,欄位2) %>% drop_na() %>% summarize( (新欄位1 = 欄位條件), 新欄位2 = mean(附加條件的欄位))

# 將欄位1與欄位2還有新欄位1和新欄位2一起組成一個新表格,drop_na()用來刪除缺失值

summarize() 函數

用途是把一大堆的資料,整理成一個簡潔、有意義的摘要。

計算平均值 (Mean)
想像你有一份學生的成績單,裡面有數學、英文、國文等等科目的分數。你可以用 summarize() 輕鬆地算出每一個科目的平均分數。
summarize(student_data, avg_math = mean(math_score))

計算中位數 (Median)
summarize(student_data, median_score = median(total_score))

計算總和 (Sum)

summarize(sales_data, total_sales = sum(revenue))

計算次數 n()
# 先按城市分組,再計算每組的訂單數
store_data %>%
 group_by(city) %>%
  summarize(order_count = n())

quartet %>% group_by(set) %>% summarize(mean(x), sd(x), mean(y), sd(y), cor(x, y)).

# 四重奏資料表 %>% group_by(set) %>% 彙整(平均值(x)、標準差(x)、平均值(y)、標準差(y)、相關係數(x, y))。

資料庫 %>% filter( 欄位 == “指定名稱”)
# 可以過濾指定的資料

separate(資料表  , 欄位 ,  into = c(“新欄位1”,”新欄位2”,sep = ‘ ‘)

# 使用separate可以將資料表中的某個欄位透過符號分隔成多欄

unit(資料表  , 欄位 ,  into = c(“新欄位1”,”新欄位2”,sep = ‘ ‘)

# 使用unit可以將資料表中的指定欄位透過分隔符號合併

mutate( )可以新增一個條件轉換後的欄

view(penguins)

penguins %>%

mutate( 新欄位1 = 欄位1 /1000 ㄝ, 新欄位2 = 欄位2 /1000)

pivot_longer()  可以增加行數和減少列數來延長資料框中的資料。

pivot_wider()  可以將資料轉換為列數更多、行數更少

SimDesign 偏差指數插件

install.packages(“SimDesign”)

library(“SimDesign”)

bias(c(50,60,55,40),c(48,47,60,40))  # 會顯示出偏差指數 2.5

# 指數越大代表偏差越大

sample() 函數允許從資料集中隨機抽取元素樣本

單純隨機抽樣: 假設你有一份學生名單,想隨機抽出三位來回答問題。

students <- c(“小明”, “小華”, “小美”, “小胖”, “小文”)

sample(students, size = 3)

抽樣且不重複 (不放回抽樣): 這是 sample() 的預設行為。它抽出的元素不會被放回去,所以不會重複。

抽樣且重複 (放回抽樣): 如果你想要抽出的元素可以重複,這時候就要設定 replace = TRUE。這在模擬一些隨機事件時非常有用,例如投擲骰子。
R
dice <- 1:6

sample(dice, size = 10, replace = TRUE)

根據機率來抽樣

如果你想要讓某些元素被抽到的機率比較高,你可以使用 prob 參數來設定每一個元素的抽樣權重。

  • 根據權重抽樣: 假設你有四種不同顏色的球,但紅色球的數量最多,所以被抽到的機率最高。

balls <- c(“藍色”, “黃色”, “綠色”, “紅色”)

# 設定紅色球的機率是其他球的兩倍

sample(balls, size = 5, replace = TRUE, prob = c(0.1, 0.1, 0.1, 0.7))

隨機排序 (亂序排列)

my_list <- 1:10 

sample(my_list) # 結果就是1到10的亂序排列

SMOTE 在 R 語言裡的應用

SMOTE (Synthetic Minority Over-sampling Technique) 是一種在資料科學和機器學習中,用於解決資料不平衡(imbalanced data)問題的常用技術。它的核心目的,是透過增加少數類別的樣本,來平衡資料集中各類別的數量。

核心思想是:

  • 它會找出少數類別的每個樣本。
  • 然後,它會尋找這些樣本的「鄰居」。
  • 接著,它會在這些樣本和它們的鄰居之間,隨機地創造出一些新的、但又很相似的資料點。

# 在 R 語言中,SMOTE 通常在 smotefamily、DMwR 或 themis 這幾個套件中實現。

使用方法通常也很簡單,你只需要指定:

  • 你的資料集。
  • 你的目標變數(也就是你要預測的類別)。
  • 你想要讓少數類別增加到多少比例。

install.packages(“smotefamily”)
install.packages(“dplyr”)
library(smotefamily)
library(dplyr)

情境:預測客戶流失

假設你是一家訂閱服務公司的資料分析師,你的任務是預測哪些客戶可能會取消訂閱(即「流失」)。你的資料集中包含 1000 名客戶,但其中只有 100 人流失(流失率僅 10%)。這是一個典型的不平衡資料集。

直接用這個資料集訓練的模型,會因為「未流失」的樣本太多,而傾向於預測所有客戶都不會流失,這樣雖然準確率看似很高,但對於找出真正會流失的客戶卻沒有任何幫助。

SMOTE 在這個時候就派上用場了。它能增加流失客戶的樣本數,讓模型能更有效地學習流失客戶的特徵。

步驟一:創建不平衡資料集

# 創建一個包含 900 個未流失客戶和 100 個已流失客戶的資料集
customer_data <- tibble(
    age = rnorm(1000, mean = 40, sd = 10),
    service_usage = rnorm(1000, mean = 5, sd = 2),
    customer_churn = factor(
        c(rep(0, 900), rep(1, 100)) # 900 個未流失,100 個已流失
    )
)

# 查看原始資料集的類別分佈
count(customer_data, customer_churn)

# 結果將顯示:
# customer_churn n
# 0 900
# 1 100

步驟二:執行 SMOTE 來平衡資料

# data:原始資料集
# target:目標變數
# K:生成新樣本時考慮的近鄰數量
# dup_size:每個少數樣本要複製的次數

smote_output <- SMOTE(
data = customer_data,
target = customer_data$customer_churn,
K = 5,
dup_size = 5
)

# 取得 SMOTE 處理後的平衡資料集
balanced_data <- smote_output$data

步驟三:查看平衡後的結果

# 查看平衡後的資料集類別分佈

count(balanced_data, customer_churn)

# customer_churn n

# 0                            900

# 1                            600 (100 * 5) + 100 的樣本數

思考:SMOTE 只是複製了既有的結果,為什麼這能提高預測準確度?

因為SMOTE 做的不是簡單的「複製」,而是「合成」新的資料。

他會從要平衡的資料區塊,找出許多特徵,創造出全新資料(包含多個特徵)藉此「合成」出更多「泛化」的資料,來讓資料進行預測。

$ 符號:

這個 $ 符號,在 R 語言裡扮演著一個很關鍵的角色,它就像是「索引」或「定位器」。

當你看到 $ 時,你就可以把它想像成是:「從一個較大的東西(通常是資料框架)裡面,取出其中一個特定的『欄位』。」

ggplot2 建立各種可視圖形插件

準備數據流程

install.packages(“ggplot2”) 

install.packages(“palmerpenguins”)  # 企鵝數據庫

library(ggplot2)

library(palmerpenguins)

data(penguins)

View(penguins)

畫出三種企鵝體重和鰭狀肢長度之間的關係圖,兩種一樣效果的不同寫法:

ggplot(data = penguins) + 

geom_point(mapping = aes(x = flipper_length_mm, y = body_mass_g))

ggplot(data = penguins, mapping = aes(x = flipper_length_mm, y = body_mass_g)) +  geom_point()

# ggplot(data = penguins): 可以使用 ggplot() 函數開始對資料庫繪圖

# + :新增一個「+」符號來為繪圖新增圖層,可以在一個圖層上再疊加一個。

# geom_point() :geom_point() 函數使用點來建立散佈圖

# geom 函數可以選擇不同樣式,geom_bar 長條圖,geom_line 線性圖,geom_smooth 平滑線性圖

# (mapping = aes(x = flipper_length_mm, y = body_mass_g)) :
aes() 函數的 x 和 y 參數指定要將哪些變數對應到座標系的 x 軸和 y 軸,mapping用來映射視圖的美學設定。

ggplot(data, aes(x=distance, y= dep_delay, color=carrier, size=air_time, shape = carrier)) + geom_point()

# Color = 顏色 , Size = 元素大小,Shape = 元素形狀

ggplot(data = penguins, aes(x = flipper_length_mm, y = body_mass_g)) +

  geom_point() +

  geom_smooth(method=”gam”, formula = y ~s(x))

# 再圖層上添加一個平滑線來輔助試圖

formula 模型公式,用來定義 y 和 x 之間的關係,

線性趨勢線: geom_smooth(method = “lm”, formula = y ~ x)

  • 這條線會是一條簡單的直線,用來代表資料的線性趨勢。

非線性趨勢線(多項式): geom_smooth(method = “lm”, formula = y ~ poly(x, 2))

  • 這條線會是一條彎曲的曲線,用來代表二次方的關係。

非線性趨勢線: geom_smooth(method = “gam”, formula = y ~ s(x))

  • 這條線會比多項式更靈活,它會根據資料點的分布來動態調整曲線的形狀,s(x) 是一個「平滑函數 (smooth function)」。

facet_wrap() 視圖分割

ggplot(data = penguins, aes(x = flipper_length_mm, y = body_mass_g)) +

  geom_point() +

  geom_smooth(method=”gam”, formula = y ~s(x)) +

  facet_wrap(~year)

# 搭配facet_wrap(~year) 可以根據year欄位來做視圖分割

labs() 用來建立視圖註釋

labs(title = 標題 , subtitle = 子標題 ,  caption = 下方註釋)

annotate() 在圖中建立文字敘述

annotatr(“text” , x = 220 , y = 3500 , label = “文字敘述” , color = 顏色 , fontface = “bold”粗體字 , size = 4 , angle = 25)

filter() 篩選指定的欄位條件

data %>%

    filter(variable1 == “DS”) %>%  

    ggplot(aes(x = weight, y = variable2, colour = variable1)) +  

    geom_point(alpha = 0.3,  position = position_jitter()) + stat_smooth(method = “lm”)

ggsave() 儲存視圖 

在最後加上 ggsave(你要的名稱.png) 可以根據你要的檔案類型儲存視圖。

R Markdown 允許你儲存和執行程式碼,並產生可共享的報告

install.packages(“rmarkdown”)

file -> New R Markdown -> 輸入資訊建立報告(標題、作者、時間)

使用 # 可以縮小字體大小

使用 * 可以建立項目符號

[點這裡]{網址放這裡),可以建立網址連接

# 使用Knit按鈕可以馬上修改檔案內容

“`{r }   這邊放程式碼   “`   ,快速鍵 Ctrl + Alt + I (Windows)或 Cmd + Option + I (Mac),用作rmd的程式碼分隔符號

發佈留言