]
---
layout: true
background-image: url(data:image/png;base64,#https://www.agec.ntu.edu.tw/uploads/asset/data/675f864c74ccc38a768f8254/%E6%9C%AA%E4%BE%86%E5%B1%95%E6%9C%9B%E5%9C%96%E7%89%87.png)
background-position: 98% 2%
background-size: 5%
---
## TA
### 徐麗茵
- 學經歷
- 流行病學與預防醫學研究所 生統組博士班
- 資料科學博士學位學程
- 聯絡方式
- leyin2030@gmail.com
- 課程負責項目
- 批改正課作業
- 批改期中期末試題
---
## TA
### 王俊欽(Leo)
- 學經歷
- 農業經濟學系研究所博士班
- 統計碩士學位學程
- 聯絡方式
- d14627001@ntu.edu.tw
- 課程負責項目
- 實習課授課
- 批改實習課作業與考試
---
## 實習課評分
實習課成績占學期總成績 20 %
- 出席(5%)
- <span style="line-height: 2;">每次實習課點名,請假寄信至 d14627001@ntu.edu.tw <span>
- <span style="line-height: 2;font-weight: 700">前兩次請假、未到不扣分,第三次開始扣 1 % 總成績 <span>
- 實習作業 2 次(5%,共計 100 分)
- <span style="line-height: 2;">繳交內容:程式碼、報告or結果<span>
- <span style="line-height: 2;">繳交方式:NTU COOL 線上繳交<span>
- <span style="line-height: 2;font-weight: 700">作業遲交 24 小時扣 10 分,超過 24 小時不予補交<span>
---
## 實習課評分
實習課成績占學期總成績 20 %
- 上機考試(10%)
- <span style="line-height: 2;">考試日期:10/12、12/7 兩天<span>
- <span style="line-height: 2;">考試時間:14:20 - 16:00<span>
- <span style="line-height: 2;">考試地點:博雅 408、409電腦教室<span>
- <span style="line-height: 2;">考試方式:Open Book,可以攜帶隨身碟,禁止使用網路與電子產品<span>
- 更多細節如:繳交方式,電腦使用方法待考試前會再與大家說明。
---
## 實習課評分
- **填寫期末教學評鑑,期末分數總分加 ?? 分**
- office hour 時間
- <span style="line-height: 2;">每週一 16:20 - 18:20,地點:待訂<span>
- <span style="line-height: 2;">如有問題要詢問,請先將問題寄給助教<span>
.center[** 歡迎找厲害的同學討論或積極與助教約 office hour,但千萬不要抄襲拜託**]
.center[** 有任何問題請盡早寄信給助教 **]
---
## 實習課學期目標
- 熟練 R 語言程式操作
- 學習更多資料預處理技巧
- 學習資料視覺化
- 計量分析的實際操作
- <span style="line-height: 2;">簡單迴歸(OLS、Fixed Effect)<span>
- <span style="line-height: 2;">雙重差分(DID)<span>
- <span style="line-height: 2;">工具變數(IV)<span>
---
class: center, middle, inverse
### 快速複習一下上學期都學了什麼
#### 過了一個暑假應該已經找不到 Rstudio 了吧...
---
## DATA TYPE
`str()`、`class()`、`typeof()` 等指令可以用來辨別資料型態或結構。
.panelset[
.panel[.panel-name[String]
字串(String)需使用單引號 ' 或雙引號 " 作區分
``` r
str("abc")
```
```
## chr "abc"
```
``` r
class("1")
```
```
## [1] "character"
```
``` r
typeof("Time flies when you're having fun.")
```
```
## [1] "character"
```
]
.panel[.panel-name[Nuneric]
``` r
class(123.123)
```
```
## [1] "numeric"
```
``` r
typeof(123L)
```
```
## [1] "integer"
```
]
.panel[.panel-name[Logic]
``` r
class(TRUE)
```
```
## [1] "logical"
```
``` r
typeof(FALSE)
```
```
## [1] "logical"
```
]
.panel[.panel-name[Boolean]
.left-column[
<br/><br/>
不管是直接輸入或是指令中的 arguments,都可以用 `T` 或 `F`取代
<br/><br/><br/><br/>
此外,TRUE 或 FALSE 也分別代表 1 或 0
]
.right-column[
``` r
T
```
```
## [1] TRUE
```
``` r
F
```
```
## [1] FALSE
```
``` r
T + T
```
```
## [1] 2
```
]
]
]
---
## DATA STRUCTURE
Vector 屬於一維資料,且資料內容必須為相同 **Data Type**。
.panelset[
.panel[.panel-name[Vector]
.left-column[
<br/>
記得使用 `c()` 建立向量!
<br/><br/>
如果字串與數值同時出現,向量將以字串為主
]
.right-column[
``` r
num <- c(1, 2, 3, 4, 5)
```
``` r
str <- c("1", 2, 3, 4, 5)
class(str)
```
```
## [1] "character"
```
]
]
.panel[.panel-name[Index]
索引值(index),為資料所在位置,使用 `[所在位置]` 來尋找。
``` r
num[3]
```
```
## [1] 3
```
``` r
num[2:4]
```
```
## [1] 2 3 4
```
``` r
str[-1]
```
```
## [1] "2" "3" "4" "5"
```
]
.panel[.panel-name[Named Vector]
已命名的向量可以用 `[名稱]` 來選取特定值。
``` r
vec <- c(a = 1, b = 2, c = 3, d = 4, e = 5); print(vec)
```
```
## a b c d e
## 1 2 3 4 5
```
``` r
vec[c("a", "c", "e")]
```
```
## a c e
## 1 3 5
```
]
.panel[.panel-name[Boolean Index]
用布林值作為索引時,布林值與向量長度必須相同。
``` r
vec[c(T, F, T, F, T)]
```
```
## a c e
## 1 3 5
```
Recall ! 當布林值長度與向量長度不一致時 ... 循環補齊(recycling)
``` r
vec[c(T, F)]
```
```
## a c e
## 1 3 5
```
]
]
---
## DATA STRUCTURE
矩陣(matrix)本質與向量一樣,資料須為相同 **Data Type**,但屬於二維資料。
.panelset[
.panel[.panel-name[Matrix]
.pull-left[
``` r
m <- matrix(c(9, 6, 3, 7, 4, 1), nrow = 2, ncol = 3)
```
矩陣有兩個維度,分別顯示列(row)與行(column)
``` r
dim(m)
```
]
.pull-right[
```
## [,1] [,2] [,3]
## [1,] 9 3 4
## [2,] 6 7 1
```
<br/><br/>
```
## [1] 2 3
```
]
]
.panel[.panel-name[Index]
二維資料使用 `[列, 行]` 作為索引值尋找資料。
``` r
m[1, 3]
```
```
## [1] 4
```
當索引位置為空值時,預設為全部,如 `[1, 空值]`,則選取整個第 `1` 列。
``` r
m[1, ]
```
```
## [1] 9 3 4
```
]
]
---
## DATA FRAME
Data frame 是剛接觸資料分析時最常會遇到的資料結構,與矩陣皆為二維資料,但 Data frame 內可以存在**不同 Data Type**。
.panelset[
.panel[.panel-name[Look like]
<img src="data:image/png;base64,#./df.png" width="65%" style="display: block; margin: auto;" />
]
.panel[.panel-name[In Practice]
``` r
library(ggplot2)
```
``` r
df <- mpg %>% select(1:5) %>% head(); df
```
```
## # A tibble: 6 × 5
## manufacturer model displ year cyl
## <chr> <chr> <dbl> <int> <int>
## 1 audi a4 1.8 1999 4
## 2 audi a4 1.8 1999 4
## 3 audi a4 2 2008 4
## 4 audi a4 2 2008 4
## 5 audi a4 2.8 1999 6
## 6 audi a4 2.8 1999 6
```
]
.panel[.panel-name[Index]
Data frame 索引值用法大致與矩陣相同,可以用數字或 `變數名稱` 作為索引值。
.pull-left[
``` r
df[, 2]
```
<br/>
``` r
df[2, "manufacturer"]
```
]
.pull-right[
```
## # A tibble: 6 × 1
## model
## <chr>
## 1 a4
## 2 a4
## 3 a4
## 4 a4
## 5 a4
## 6 a4
```
<br/>
```
## # A tibble: 1 × 1
## manufacturer
## <chr>
## 1 audi
```
]
]
.panel[.panel-name['$' sign]
Data frame 可以用 $ 符號作為"行"的索引方式。
- 以 `$` 符號選擇 Data frame 其中一行。
- 使用 `$` 符號後直接接上變數名稱,`不需加上 ""`,類似 dplyr 的便利性。
- 輸出格式為向量(Vector)。
``` r
df$year
```
```
## [1] 1999 1999 2008 2008 1999 1999
```
]
.panel[.panel-name[Note!]
**處理二維資料時,必須注意資料結構的呈現!(回傳的資料結構不一定是你想要的)**
``` r
df[c(1, 3, 5), "model"]
```
```
## # A tibble: 3 × 1
## model
## <chr>
## 1 a4
## 2 a4
## 3 a4
```
``` r
df[c(1, 3, 5), c("model", "cyl")]
```
```
## # A tibble: 3 × 2
## model cyl
## <chr> <int>
## 1 a4 4
## 2 a4 4
## 3 a4 6
```
]
]
---
## CRUD
資料分析時的四個基礎步驟
.panelset[
.panel[.panel-name[Create]
- 直接呼叫已存在資料如:iris、mpg
- 從外部環境導入資料(實務上肯定是),副檔名通常為:.csv、.xlsx、.json
- 設定好你的工作路徑 `setwd()`,預設為當前 R file 儲存的位置
- 檔案路徑中的反斜線 `\` 須改為正斜線 `/` 或是 `\\`(Windows 系統)。
- `.` 可以取代當前工作路徑(working directory)
- 如果資料與當前 R file 儲存在相同位置(同個資料夾中),可以直接打上檔名即可
``` r
read.csv("CASchools.csv")
```
]
.panel[.panel-name[Read]
讀取資料可以透過指令、索引值與邏輯運算子進行簡單操作
``` r
head(df, n = 3)
```
```
## # A tibble: 3 × 5
## manufacturer model displ year cyl
## <chr> <chr> <dbl> <int> <int>
## 1 audi a4 1.8 1999 4
## 2 audi a4 1.8 1999 4
## 3 audi a4 2 2008 4
```
``` r
df[df$year == 1999 & df$cyl == 4,] # 二維資料記得補上 ","
```
```
## # A tibble: 2 × 5
## manufacturer model displ year cyl
## <chr> <chr> <dbl> <int> <int>
## 1 audi a4 1.8 1999 4
## 2 audi a4 1.8 1999 4
```
]
.panel[.panel-name[Update]
使用 `append()`、`$`、`索引值` 簡單新增或修改資料
``` r
new_model <- c(df$model, "a5")
new_model <- append(df$model, "a5")
```
```
## [1] "a4" "a4" "a4" "a4" "a4" "a4" "a5"
```
``` r
new_model[2] <- "a2"
```
```
## [1] "a4" "a2" "a4" "a4" "a4" "a4" "a5"
```
``` r
df$county <- "Germany"
```
```
## # A tibble: 1 × 6
## manufacturer model displ year cyl county
## <chr> <chr> <dbl> <int> <int> <chr>
## 1 audi a4 1.8 1999 4 Germany
```
]
.panel[.panel-name[Delete]
使用 `!`、`索引值` 簡單刪除資料
``` r
new_model1 <- new_model[-2]
```
```
## [1] "a4" "a4" "a4" "a4" "a4" "a5"
```
``` r
df1 <- df[df$year != 2008,]
```
```
## # A tibble: 4 × 6
## manufacturer model displ year cyl county
## <chr> <chr> <dbl> <int> <int> <chr>
## 1 audi a4 1.8 1999 4 Germany
## 2 audi a4 1.8 1999 4 Germany
## 3 audi a4 2.8 1999 6 Germany
## 4 audi a4 2.8 1999 6 Germany
```
]
]
---
## dplyr
dplyr 是使用 R 進行資料分析時的入門學習套件之一,同時結合獨特的 pipe operator(%>%),對於程式閱讀上來說更直觀、且學習時更容易上手。
**使用 dplyr package 中的 commands 時,直接輸入欄位變數名稱,無須加上引號!**
.panelset[
.panel[.panel-name[Select]
`select()` 可以選擇指定欄位,且支援連續選取 `:`。
``` r
df1 <- df %>% select(manufacturer:year); head(df1, n = 3)
```
```
## # A tibble: 3 × 4
## manufacturer model displ year
## <chr> <chr> <dbl> <int>
## 1 audi a4 1.8 1999
## 2 audi a4 1.8 1999
## 3 audi a4 2 2008
```
]
.panel[.panel-name[Filter]
`filter()` 可以選擇指定列位,搭配邏輯運算子一起使用。
``` r
df2 <- df %>% filter(year == 1999 & displ > 2)
```
```
## # A tibble: 2 × 6
## manufacturer model displ year cyl county
## <chr> <chr> <dbl> <int> <int> <chr>
## 1 audi a4 2.8 1999 6 Germany
## 2 audi a4 2.8 1999 6 Germany
```
]
.panel[.panel-name[Mutate]
`mutate()` 可以建立新變數,搭配其他指令以達到建立新變數的要求。
``` r
df %>% mutate(county = "Germany")
```
```
## # A tibble: 6 × 6
## manufacturer model displ year cyl county
## <chr> <chr> <dbl> <int> <int> <chr>
## 1 audi a4 1.8 1999 4 Germany
## 2 audi a4 1.8 1999 4 Germany
## 3 audi a4 2 2008 4 Germany
## 4 audi a4 2 2008 4 Germany
## 5 audi a4 2.8 1999 6 Germany
## 6 audi a4 2.8 1999 6 Germany
```
]
.panel[.panel-name[Summarize]
`summarize()` 可以進行簡易的敘述性統計。
``` r
df %>% group_by(year) %>% summarize(count = n(), displ_m = mean(displ))
```
```
## # A tibble: 2 × 3
## year count displ_m
## <int> <int> <dbl>
## 1 1999 4 2.3
## 2 2008 2 2
```
]
]
---
class: center, middle, inverse
### 謝謝
#### 下周見