-
Notifications
You must be signed in to change notification settings - Fork 0
/
AS02_Homework_know-your-data_ref.Rmd
207 lines (170 loc) · 9.13 KB
/
AS02_Homework_know-your-data_ref.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
---
title: "AS02_Homework_Know-Your-Data_ref"
author: "曾子軒 Teaching Assistant"
date: "2021/03/17"
output:
html_document:
number_sections: no
theme: united
highlight: tango
toc: yes
toc_depth: 4
toc_float:
collapsed: no
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, results = 'hold', comment = '#>', error = TRUE)
```
## 作業目的:
這份作業希望能夠讓你熟悉讀取不同檔案型態的資料,並利用 `dplyr` 裡面幾個動詞,讓你可以認識自己要分析的資料!
### data importing & basic data manipulation (01)
資料介紹:這份資料改編自[內政部不動產交易實價登錄查詢](https://lvr.land.moi.gov.tw/),內容是 110 年 1 月自 3 月為止,台北市大安區羅斯福路上的不動產交易。
(1) import a excel file:請讀取存在 `data 資料夾 -> AS02 資料夾 -> 實價登錄_羅斯福路.xlsx` 這個檔案裡面的 `實價登錄` 分頁,取名為 `df_house`,並將前 3 列印出。這個 excel 檔案裡面有兩個分頁,不要讀錯囉。
```{r message=FALSE,warning=FALSE}
### your code
library(tidyverse)
library(readxl)
df_house <- read_excel("data/AS02/實價登錄_羅斯福路.xlsx", sheet = "實價登錄")
df_house %>% head(3)
### result
#> # A tibble: 3 × 6
#> 地段位置或門牌 總價_萬元 總面積_坪 型態 屋齡 電梯
#> <chr> <dbl> <dbl> <chr> <dbl> <chr>
#> 1 羅斯福路三段57號四樓 3956 34.6 住宅大樓(11層含… 5 有
#> 2 羅斯福路三段333巷2號四樓 1250 20.6 公寓(5樓含以下無… NA 無
#> 3 羅斯福路三段227號二樓之2 3800 54.4 住宅大樓(11層含… 33 有
```
(2) find missing values:請利用程式找出 `df_house` 裡面哪些欄位有 missing value,並以文字敘述各個欄位 missing value 的狀況。舉例:A 欄位有 2 個 missing values、B 欄位有 3 個 missing values。
```{r message=FALSE,warning=FALSE}
### your code
sum(is.na(df_house$地段位置或門牌))
sum(is.na(df_house$總價_萬元))
sum(is.na(df_house$總面積_坪))
sum(is.na(df_house$型態))
sum(is.na(df_house$屋齡))
sum(is.na(df_house$電梯))
### result
# 要有程式碼呈現 NA 數目
# 接著文字敘述 e.g. 完美,都沒有 missing values
```
(3) calculate means:請計算這包資料中的平均屋齡,不過會遇到 missing values,請你想想怎麼做比較好,決定後解釋你怎麼選擇。
```{r message=FALSE,warning=FALSE}
### your code
mean(df_house$屋齡, na.rm = T)
### result
# 要有程式碼呈現平均屋齡
# 接著文字解釋
```
(4) deal with missing values:遇到 missing values,是要踢掉那筆資料嗎?還是可以用某些值填上?請針對`電梯`欄位,解釋先以文字敘述你會怎麼選擇怎麼處理、理由為何,接著用程式碼實作,並將結果存到 `df_house_clean`,再將最後 3 列印出。舉例:我覺得可能有電梯也可能沒有電梯,所以我決定隨機決定電梯的有無。(然後用程式碼實作隨機分派的過程)
```{r message=FALSE,warning=FALSE}
### your code
df_house_clean <- df_house %>%
mutate(`電梯` = if_else(is.na(`電梯`), "有", `電梯`))
df_house_clean %>% tail(3)
### result
# * 你的電梯欄位長相可能跟我不一樣
#> # A tibble: 3 × 6
#> 地段位置或門牌 總價_萬元 總面積_坪 型態 屋齡 電梯
#> <chr> <dbl> <dbl> <chr> <dbl> <chr>
#> 1 羅斯福路三段269巷72號二樓 3450 43.1 華廈(10層含以下… NA 有
#> 2 羅斯福路三段99號十樓之3 2208 18.5 住宅大樓(11層含… 22 有
#> 3 羅斯福路四段119巷30號六樓 3110 50.8 華廈(10層含以下… 34 有
```
(5) calculate number:請幫我增加 `price_ping` 欄位,計算房屋的「每坪單價」,把結果存在 `df_house_price`,並將前 3 列印出。
* 提示:每坪單價 = 總價/面積
```{r message=FALSE,warning=FALSE}
### your code
df_house_price <- df_house_clean %>%
mutate(price_ping = `總價_萬元`/`總面積_坪`)
df_house_price %>% head(3)
### result
#> # A tibble: 3 × 7
#> 地段位置或門牌 總價_萬元 總面積_坪 型態 屋齡 電梯 price_ping
#> <chr> <dbl> <dbl> <chr> <dbl> <chr> <dbl>
#> 1 羅斯福路三段57號四樓 3956 34.6 住宅大… 5 有 115.
#> 2 羅斯福路三段333巷2號四樓 1250 20.6 公寓(5… NA 無 60.7
#> 3 羅斯福路三段227號二樓之2 3800 54.4 住宅大… 33 有 69.9
```
(6) keep columns needed and filtering:請先幫我篩選出總價超過 2000 萬元的房屋,接著篩選出平均每坪價格小於 80 萬元的房屋,最後幫我留下 `地段位置或門牌`, `電梯`, `price_ping` 3 個欄位,並將結果印出。
```{r message=FALSE,warning=FALSE}
### your code
df_house_price %>% filter(總價_萬元 > 2000) %>%
filter(price_ping < 80) %>%
select(`地段位置或門牌`, `電梯`, `price_ping`)
### result
#> # A tibble: 4 × 3
#> 地段位置或門牌 電梯 price_ping
#> <chr> <chr> <dbl>
#> 1 羅斯福路三段227號二樓之2 有 69.9
#> 2 羅斯福路二段67號地下室 有 29.2
#> 3 羅斯福路三段277之6號 有 75.8
#> 4 羅斯福路四段119巷30號六樓 有 61.2
```
### data importing & basic data manipulation (02)
資料介紹:這份資料改編自[內政部社會經濟資料服務平台](https://segis.moi.gov.tw/STAT/Web/Platform/QueryInterface/STAT_QueryInterface.aspx?Type=1#),簡稱為 SEGIS,內容是 110 年 9 月台灣各縣市的人口統計,其中包含戶數(h_cnt)、人口數(p_cnt)、男性人口數(m_cnt)、女性人口數(f_cnt)。
(1) import a csv file:請讀取存在 `data 資料夾 -> AS01 資料夾 -> 行政區人口統計_縣市_202109.csv` 的這個檔案,取名為 `df_pop`,並將前 3 列印出。這份資料中,
```{r message=FALSE,warning=FALSE}
### your code
df_pop <- read_csv("data/AS02/行政區人口統計_縣市_202109.csv")
df_pop %>% head(3)
### result
#> # A tibble: 3 × 6
#> county_id county h_cnt p_cnt m_cnt f_cnt
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 65000 新北市 1620493 4017632 1961812 2055820
#> 2 63000 臺北市 1057327 2544720 1211361 1333359
#> 3 68000 桃園市 860144 2272812 1125649 1147163
```
(2) add columns:請利用 `df_pop` 增加新欄位`city`,若為六都則為"六都",六都以外為 "非六都",將結果存在 `df_pop2` 裡面後,印出前 10 列。
* 提示:`if_else()`
```{r message=FALSE,warning=FALSE}
### your code
df_pop2 <- df_pop %>%
mutate(city = if_else(county %in% c("新北市", "臺北市", "桃園市", "臺中市", "高雄市", "臺南市"), "六都", "非六都"))
df_pop2 %>% head(10)
### result
#> # A tibble: 10 × 7
#> county_id county h_cnt p_cnt m_cnt f_cnt city
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 65000 新北市 1620493 4017632 1961812 2055820 六都
#> 2 63000 臺北市 1057327 2544720 1211361 1333359 六都
#> 3 68000 桃園市 860144 2272812 1125649 1147163 六都
#> 4 66000 臺中市 1014864 2816393 1382499 1433894 六都
#> 5 67000 臺南市 709627 1866073 929345 936728 六都
#> 6 64000 高雄市 1128474 2751317 1356111 1395206 六都
#> 7 10002 宜蘭縣 174071 451422 227385 224037 非六都
#> 8 10004 新竹縣 209962 574512 293279 281233 非六都
#> 9 10005 苗栗縣 195208 539361 278012 261349 非六都
#> 10 10007 彰化縣 398859 1257992 639195 618797 非六都
```
(3) counting: 請幫我計算 `df_pop2` 中,六都與非六都中有多少筆資料,並將結果依照資料數量由多到少排列
```{r message=FALSE,warning=FALSE}
### your code
df_pop2 %>% count(city, sort = T)
### result
#> # A tibble: 2 × 2
#> city n
#> <chr> <int>
#> 1 非六都 16
#> 2 六都 6
```
(4) keep columns needed and filtering:請先幫我篩選出「屬於六都且戶數大於 100 萬」或者「不屬於六都且人口數小於 30 萬」的縣市,最後幫我留下 `county`, `city`, `h_cnt`, `p_cnt` 4 個欄位,並將結果印出。
```{r message=FALSE,warning=FALSE}
### your code
df_pop2 %>%
filter((city == "六都" & h_cnt >= 1000000) | (city != "六都" & p_cnt < 300000)) %>%
select(county, city, h_cnt, p_cnt)
### result
#> # A tibble: 9 × 4
#> county city h_cnt p_cnt
#> <chr> <chr> <dbl> <dbl>
#> 1 新北市 六都 1620493 4017632
#> 2 臺北市 六都 1057327 2544720
#> 3 臺中市 六都 1014864 2816393
#> 4 高雄市 六都 1128474 2751317
#> 5 臺東縣 非六都 84102 213818
#> 6 澎湖縣 非六都 42245 106036
#> 7 嘉義市 非六都 101811 265002
#> 8 金門縣 非六都 42415 140856
#> 9 連江縣 非六都 3489 13429
```