可以使用 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的程式碼分隔符號