# R語言&資料分析
#### 2019-06-16
# 資料科學三大知識體系:該從哪邊開始呢?

引用 : R語言和商業分析 - 洞悉商業世界中的資料科學
https://hahow.in/courses/5b0c13932ea496001e2387b9/main
「程式撰寫」與「統計知識」是一名資料科學家的必備技能,但常被忽略的「商業分析能力」反而是讓你脫穎而出的關鍵。
# 資料分析用什麼工具

# R 語言學習
### 學什麼?
1. 基本使用知識
2. 資料讀取
3. R 怎麼整理資料
4. R整理好的資料統計與繪圖
# R 開發環境建置
1. 安裝 RStudio

3. RStudio server

# RStudio 圖形介面
開發環境的視窗四個區塊
1. 程式編碼區
2. 命令列區
3. 檔案系統區
4. 其他資訊區


# 命令列執行指令
* R 是一種 script language
* 提示符號 ` >`


# 基本操作
```
> getwd() #顯示目前的工作資料夾
> setwd() #設定工作資料夾
> dir() #顯示工作資料夾的路徑、內容
> help() #瀏覽線上說明文件
> source() # 執行檔案
> rm() # 移除物件
> q() #關閉R
```

# 操作符號 (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:每日最高溫度(華氏)
```

# 認識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)**

### **3.矩陣 (matrix)**

* 事實上二維的陣列就是矩陣,不管使用 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)**
原子物件向量,具備有同質性


### **5.因子 (factor)**
是一個向量物件,用途是儲存 level 屬性,level資料可分為「無順序」與「有順序」


### **從 List 到 data.frame**
1. List提供了處理異質資料的工具 ,因此非常的泛用
2. 但是對於結構化的資料,List不夠方便...
3. data.frame是R 為了解決結構化資料所提出的解決方案
### **6.資料框架 (data frame):**
是個二維度 的List,提供了類似矩陣的功能,以內建 iris 資料作呈現:


## 所有的R 物件都有屬性 (Attribute)
1. 屬性包含列位名 (row name)
2. 欄位名 (column name)
3. 維度 (dimension)
4. 型態(class)
5. 層次(level)
# 實務經驗
* R 物件可以是任何型態的向量 ,R 物件的向量就是處理相異型態的工具
* 整數向量:

* **list向量最實用的特性,在於它可以裝不同型態的值。**

* `[ ] ` 擷取物件內的向量

* `**[ [ ] ]** `擷取物件內向量內的元素

* `$ ` 取出對應名稱的元素

* x 資料結,如下:

### [記憶體問題]
* 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填補遺漏值
**在資料預處理時,「遺漏值處理」是很重要的步驟,最好還是選擇「填補遺漏值」的方式,才不會造成資訊損失**
#### **移除有遺漏值**

#### **用「平均數」、「第一四分位數」來填補**

### [R內建的資料集]
* 每一個函式都有對應的套件(package)。
* 如果我們想使用那些「沒有內建在R裡面」的函式呢?
`> install.packages(“套件名稱“, repos=“套件網址”)`
* 要使用套件裡面的函式,要將套件匯入到R裡
`> require ("套件名稱")`
# 我們為什麼要把資料畫成圖表嗎?
* 「資料視覺化」可以在不簡化資訊情況下,降低複雜資料的理解門檻;也可以說,幫助我們以較簡單的方式,去理解高維度(複雜)的資料。
* 資料分析前,我們需要瀏覽資料(explore data),以理解資料的狀態;資料分析後,我們需要把分析結果呈現出來,使人容易理解。
* 你會發現,針對以上這兩種情況,「資料視覺化」便佔了很重要的地位,對吧?因此,學好視覺化的技巧,絕對是有其必要性。
* 在R裡面,主要有三個強大的繪圖系統(Plotting System),可以幫助我們輕易達成「資料視覺化」的目的

# 資料視覺化 : 繪圖系統介紹
1. **Base Plotting System**
* **基本圖形類型**

**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 的呈現


* **回歸線(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)
```


2. **lattice**
* Lattice函式的方式,和Base Plotting System不太一樣,是直接一筆在圖上繪製所有的資訊。
* R裡面有一個公式(formula)的概念,在建模或畫圖時,用來表達x和y的值,以及條件變數:
在左邊的,是y的值;在~右邊的,是x的值
f和g代表條件變數(condition variables),可以省略(omit)
data的部分,則放置我們要繪圖的資料集

```
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)
```
# 儲存圖片

```
png()
jpeg()
bmp()
ggsave()
```
# R 的調色盤
* colorRamps 套件內建的色盤有10種
* colorspace 套件內建的色盤有6種
* wesanderson 套件內建的色盤有13種
* 如果覺得色盤都很醜可以自己配。
colors 是一個可以手動指定顏色的功能函數,共有657種顏色。
原則挑了看順眼的顏色上並調整飽和度可以讓資料視覺呈現更專業。