# R語言&資料分析 #### 2019-06-16 # 資料科學三大知識體系:該從哪邊開始呢? ![](https://i.imgur.com/1UYpFBJ.png) 引用 : R語言和商業分析 - 洞悉商業世界中的資料科學 https://hahow.in/courses/5b0c13932ea496001e2387b9/main 「程式撰寫」與「統計知識」是一名資料科學家的必備技能,但常被忽略的「商業分析能力」反而是讓你脫穎而出的關鍵。 # 資料分析用什麼工具 ![](https://i.imgur.com/XGm5oCq.png) # R 語言學習 ### 學什麼? 1. 基本使用知識 2. 資料讀取 3. R 怎麼整理資料 4. R整理好的資料統計與繪圖 # R 開發環境建置 1. 安裝 RStudio ![](https://i.imgur.com/TfEtbpF.png) 3. RStudio server ![](https://i.imgur.com/J3yhzly.png) # RStudio 圖形介面 開發環境的視窗四個區塊 1. 程式編碼區 2. 命令列區 3. 檔案系統區 4. 其他資訊區 ![](https://i.imgur.com/1w5i0H3.png) ![](https://i.imgur.com/enhITqO.png) # 命令列執行指令 * R 是一種 script language * 提示符號 ` >` ![](https://i.imgur.com/8cUrfOe.png) ![](https://i.imgur.com/WQ5X9co.png) # 基本操作 ``` > getwd() #顯示目前的工作資料夾 > setwd() #設定工作資料夾 > dir() #顯示工作資料夾的路徑、內容 > help() #瀏覽線上說明文件 > source() # 執行檔案 > rm() # 移除物件 > q() #關閉R ``` ![](https://i.imgur.com/KLkEoBB.png) # 操作符號 (operators) * 邏輯判斷:`>、<、==、!=、%in%、&、|、!` * 條件指令:`if、else、ifelse、switch` * 迴圈指令:`for、while、repeat、break、next` # 使用R內建的資料集 * R有數量龐大的套件都有內建資料集,容易學習和練習。 data() 這個 function 就可以列出某個 package 中有那些內建dataset * 如果不加參數,直接下data(),則會列出以下這些R的datasets套件裡內建的資料集: `> data()` * 也可以查看所有可用套件中的資料集 `> data(package = .packages(all.available = TRUE))` #### airquality 這筆資料為 1973 年紐約5~9月的空氣品質測量資料。 **資料內容** ``` Ozone: 每小時平均臭氧 Solar.R: 的太陽輻射 Wind:平均風速(英里/小時) Temp:每日最高溫度(華氏) ``` ![](https://i.imgur.com/wjPVgd0.png) # 認識R複雜的資料結構與型態 :(物件、向量、屬性) * R 的所有設計都是為了分析資料而生,資料的最小單位是「向量」 * “logical”,邏輯資料 用於布林(Boolean)運算, 如: TRUE (T) 或 FALSE (F) 呈現, 1 (T) 與 0 (F) * “numeric”, 數值資料 以雙精確浮點數儲存,儲存每個整數佔 4 Bytes,如: 0, 1, -2, 100 * “integer", 整數資料 以的長整數儲存,每個整數佔 8 Bytes,如: -1.0, 3.333, pi * “character”, 字串資料 `‘a’, “abc”, “交通大學” ` ### 向量 (vector) * `> x <- c()` # 用來指定做 賦值 * vector 函數可以用來建立特定類型與長度的向量 ``` > vector("numeric", 3) > vector("logical", 3) > vector("character", 3) > vector("list", 3) ``` ## 資料結構 ### **1.向量 (vector)** ### **2.陣列 (Array)** ![](https://i.imgur.com/d5aQiMU.png) ### **3.矩陣 (matrix)** ![](https://i.imgur.com/uapcYh5.png) * 事實上二維的陣列就是矩陣,不管使用 matrix 或是 array 來產生,結果都是一樣的: ``` > x.matrix <- matrix(1:6, nrow = 2, ncol = 3) > x.array <- array(1:6, dim = c(2, 3)) > identical(x.matrix, x.array) > cbind(c(1,2,3),c(4,5,6)) [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > rbind(c(1,2,3),c(4,5,6)) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 ``` ### **4.列表物件( List)** 原子物件向量,具備有同質性 ![](https://i.imgur.com/mVniJPv.png) ![](https://i.imgur.com/FHx99ZD.png) ### **5.因子 (factor)** 是一個向量物件,用途是儲存 level 屬性,level資料可分為「無順序」與「有順序」 ![](https://i.imgur.com/DU118tz.png) ![](https://i.imgur.com/Mr26Rr4.png) ### **從 List 到 data.frame** 1. List提供了處理異質資料的工具 ,因此非常的泛用 2. 但是對於結構化的資料,List不夠方便... 3. data.frame是R 為了解決結構化資料所提出的解決方案 ### **6.資料框架 (data frame):** 是個二維度 的List,提供了類似矩陣的功能,以內建 iris 資料作呈現: ![](https://i.imgur.com/tntXRBy.png) ![](https://i.imgur.com/T0lQwq1.png) ## 所有的R 物件都有屬性 (Attribute) 1. 屬性包含列位名 (row name) 2. 欄位名 (column name) 3. 維度 (dimension) 4. 型態(class) 5. 層次(level) # 實務經驗 * R 物件可以是任何型態的向量 ,R 物件的向量就是處理相異型態的工具 * 整數向量: ![](https://i.imgur.com/XtwdoJm.png) * **list向量最實用的特性,在於它可以裝不同型態的值。** ![](https://i.imgur.com/tjdaELK.png) * `[ ] ` 擷取物件內的向量 ![](https://i.imgur.com/lapIF0D.png) * `**[ [ ] ]** `擷取物件內向量內的元素 ![](https://i.imgur.com/HZ56lN3.png) * `$ ` 取出對應名稱的元素 ![](https://i.imgur.com/wJQmSyh.png) * x 資料結,如下: ![](https://i.imgur.com/6EVzzQZ.png) ### [記憶體問題] * R 是一個以記憶體為主的分析工具 * R 假設你的記憶體是足夠的 * R 跑得很慢 CPU 不夠快(計算量太大) 記憶體不夠大(資料太大) * 估計記憶體的使用量? 向量就是陣列,加上一些其它的metadata(型態、 attributes、...) 邏輯向量、整數向量和數值向量的空間大約 為: · · 長度 × 單位空間 `object.size( )` ### [資料讀取技巧] 套件中的資料 預設的資料集(dataset),可以提供練習 #### 結構化資料 (structured data) 以 CSV (Comma Separated Values) 為例,以逗號區隔的 每一列都有同樣多的資料欄 ▪ ``` > read.csv() # 用來讀csv > read.table() # 簡單閱讀各種檔案 ``` 處理編碼問題的相關函數 `iconv(), encoding, fileEncoding()` **以read.table 為例:** ``` > read.table(file, header = TRUE, sep = ", “, quote = "\"", dec = ".", fill = TRUE,) file = 資料名稱 header = 資料開頭是否有變數名稱,預設值=TRUE sep = 資料分隔符號,如果是sep=" ",表示分隔為空白鍵 quote = 資料中的字串符號,quote=" "代表關閉此功能 dec = 資料是否含小數點 fill = 每一列資料長度是否不同,預設值=TRUE ``` ### [處理遺漏值] * 在R裡有兩種特別的記號,分別為:NA和NaN。 * NA代表的是缺失值,而 NaN 大多來自於數學運算中沒有定義的行為,無限大就是`Inf`。 而我們可以使用 is.na() 的函式,確認資料中是否有遺漏值的存在。 * 如何處理漏值? 在處理遺漏值時,大多數的人都會「直接移除資料」或是用「平均值來填補遺漏值」,但這樣的做法並不推薦:前者會讓資料減少,後者不會產生任何資訊。 * 直接移除有遺漏值的資料 用「平均數」、「第一四分位數」…來填補遺漏值 用K-Nearest Neighbours填補遺漏值 用MICE填補遺漏值 **在資料預處理時,「遺漏值處理」是很重要的步驟,最好還是選擇「填補遺漏值」的方式,才不會造成資訊損失** #### **移除有遺漏值** ![](https://i.imgur.com/52iv6iR.png) #### **用「平均數」、「第一四分位數」來填補** ![](https://i.imgur.com/MJs76nH.png) ### [R內建的資料集] * 每一個函式都有對應的套件(package)。 * 如果我們想使用那些「沒有內建在R裡面」的函式呢? `> install.packages(“套件名稱“, repos=“套件網址”)` * 要使用套件裡面的函式,要將套件匯入到R裡 `> require ("套件名稱")` # 我們為什麼要把資料畫成圖表嗎? * 「資料視覺化」可以在不簡化資訊情況下,降低複雜資料的理解門檻;也可以說,幫助我們以較簡單的方式,去理解高維度(複雜)的資料。 * 資料分析前,我們需要瀏覽資料(explore data),以理解資料的狀態;資料分析後,我們需要把分析結果呈現出來,使人容易理解。 * 你會發現,針對以上這兩種情況,「資料視覺化」便佔了很重要的地位,對吧?因此,學好視覺化的技巧,絕對是有其必要性。 * 在R裡面,主要有三個強大的繪圖系統(Plotting System),可以幫助我們輕易達成「資料視覺化」的目的 ![](https://i.imgur.com/2XkY86i.png) # 資料視覺化 : 繪圖系統介紹 1. **Base Plotting System** * **基本圖形類型** ![](https://i.imgur.com/g6CjHac.png) **hist()** ``` # 5-9 月的溫度 hist(x=airquality$Temp, main="Histogram of Temperture in May", # 圖片的名稱 xlab="(May ~ Sep)range of Months", # X軸的名稱 ylab="Frequency(Days)", # Y軸的名稱 col="skyblue"), xlim=c(40:120)) ``` **boxplot()** ``` boxplot(formula = Temp ~ Month, # Y ~ X (代表X和Y軸要放的數值) data = airquality, # 資料 xlab = "Month", # X軸名稱 ylab = "Temp(F)", # Y軸名稱 col ="pink") # 顏色 ``` **plot()** ``` x <- airquality$Day[airquality$Month==5] y <- airquality$Temp[airquality$Month==5] plot(x=airquality$Day, # X軸的值 y=airquality$Temp, # Y軸的值 main="Month to Temperature", # 圖片名稱 xlab="Month(1-12)", # X軸名稱 ylab="Temperature(degrees F)") points(x=airquality$Day[airquality$Month==5], y=airquality$Temp[airquality$Month==5], pch=16, # red點的圖形 col="red") points(x=airquality$Day[airquality$Month==6], y=airquality$Temp[airquality$Month==6], pch=16, # blue點的圖形 col="blue") points(x=airquality$Day[airquality$Month==7], y=airquality$Temp[airquality$Month==7], pch=16, # green點的圖形 col="green") points(x=airquality$Day[airquality$Month==8], y=airquality$Temp[airquality$Month==8], pch=16, # black點的圖形 col="black") points(x=airquality$Day[airquality$Month==9], y=airquality$Temp[airquality$Month==9], pch=16, # orange點的圖形 col="orange") # 在右上角做出標示 legend("topright", # 表示在右上角 pch = 16, # pch代表點的圖案 col = c("red", "blue", "green","black", "orange"), # col代表顏色 legend = c("May", "Jun", "Jul", "Aug", "Sep") # 顏色所對應的名稱 ) ``` **lines()** ``` # 5 月的溫度 plot(x, # X軸的值 y, # Y軸的值 main="Month to Temperature", # 圖片名稱 xlab="Month(May)", # X軸名稱 ylab="Temperature(degrees F)") lines(x,y,col="red") ``` ### **基本繪圖功能介紹** ``` pch: the plotting symbol (default is open circle) lty: the line type (default is solid line), can be dashed, dotted, etc. lwd: the line width, specified as an integer multiple col: the plotting color, specified as a number, string, or hex code; the colors() function gives you a vector of colors by name xlab: character string for the x-axis label ylab: character string for the y-axis label ``` * **重要的圖形參數** ### pch & lty 的呈現 ![](https://i.imgur.com/M0LdYKd.png) ![](https://i.imgur.com/VoWZu82.png) * **回歸線(Regression Line)** 你會發現,用plot()建立出一個散布圖(畫布)後,我們又運用一些函式,在畫布上面增添想要的資訊 ``` points()=畫上點 legend()=作上標記 abline()=畫上線 ``` * 具有類似功能的函式不只這些,以下列出常用函數: ![Uploading file..._4lqt8akzg]() * **多圖繪製(Multiple Base Plots)** ``` bg: the background color mar: the margin size oma: the outer margin size (default is 0 for all sides) mfrow: number of plots per row, column (plots are filled row-wise) mfcol: number of plots per row, column (plots are filled column-wise) ``` ![](https://i.imgur.com/2QRQeOD.png) ![](https://i.imgur.com/RlrUGHT.png) 2. **lattice** * Lattice函式的方式,和Base Plotting System不太一樣,是直接一筆在圖上繪製所有的資訊。 * R裡面有一個公式(formula)的概念,在建模或畫圖時,用來表達x和y的值,以及條件變數: 在左邊的,是y的值;在~右邊的,是x的值 f和g代表條件變數(condition variables),可以省略(omit) data的部分,則放置我們要繪圖的資料集 ![](https://i.imgur.com/AW41e4Q.png) ``` histogram() bwplot() densityplot() cloud() xyplot() ``` 3. **ggplot2** * R裡面最受歡迎的第三方繪圖套件,包含許多屬性。 1. Aesthetic attributes (美學表現):包括「顏色、形狀、點」 2. Geometric objects (幾何屬性):包括「點、線、盒狀圖、直條圖」等… 3. Facets:做多個子圖的方法 4. Stats:將資料做統計轉換。 5. Scales:修改點線的顏色、形狀、xy軸的範圍等 qplot() ``` 散布圖(scatter plot), 直方圖(histogram), 機率密度圖(density plot), 合鬚圖(boxplot) ``` ggplot() ``` 直方圖(histogram), 散布圖(scatter plot), 複合式圖表(complex) 圓餅圖(pie chart) ``` # 儲存圖片 ![](https://i.imgur.com/ICJRSCU.png) ``` png() jpeg() bmp() ggsave() ``` # R 的調色盤 * colorRamps 套件內建的色盤有10種 * colorspace 套件內建的色盤有6種 * wesanderson 套件內建的色盤有13種 * 如果覺得色盤都很醜可以自己配。 colors 是一個可以手動指定顏色的功能函數,共有657種顏色。 原則挑了看順眼的顏色上並調整飽和度可以讓資料視覺呈現更專業。