diff --git a/404.html b/404.html index 24e5571..69b22e7 100644 --- a/404.html +++ b/404.html @@ -23,7 +23,7 @@ - + @@ -709,6 +709,12 @@
library(lubridate)
-raw <- read_csv("data/vaccinations.csv")
-
-fullvaccinated <- raw %>% select(country = location, date,
- people_fully_vaccinated_per_hundred) %>%
- drop_na(people_fully_vaccinated_per_hundred) %>%
- mutate(m = floor_date(date, unit = "month")) %>%
- group_by(country, m) %>%
- arrange(date) %>%
- slice(1) %>%
- ungroup() %>%
- select(-date)
-
-vperc_by_month <- fullvaccinated %>%
- spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
- gather(month, perc, -country) %>%
- arrange(country, month) %>%
- group_by(country) %>%
- arrange(month) %>%
- mutate(perc = zoo::na.locf(perc, na.rm = F)) %>%
- ungroup() %>%
- arrange(country, month) %>%
- replace_na(list(perc=0))
library(lubridate)
+raw <- read_csv("data/vaccinations.csv")
+
+fullvaccinated <- raw %>% select(country = location, date,
+ people_fully_vaccinated_per_hundred) %>%
+ drop_na(people_fully_vaccinated_per_hundred) %>%
+ mutate(m = floor_date(date, unit = "month")) %>%
+ group_by(country, m) %>%
+ arrange(date) %>%
+ slice(1) %>%
+ ungroup() %>%
+ select(-date)
+
+vperc_by_month <- fullvaccinated %>%
+ spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
+ gather(month, perc, -country) %>%
+ arrange(country, month) %>%
+ group_by(country) %>%
+ arrange(month) %>%
+ mutate(perc = zoo::na.locf(perc, na.rm = F)) %>%
+ ungroup() %>%
+ arrange(country, month) %>%
+ replace_na(list(perc=0))
watched <- c("United Arab Emirates", "Japan", "Singapore",
- "South Korea", "Taiwan", "Malaysia",
- "Hong Kong", "New Zealand", "Thailand",
- "Netherlands", "United States", "Israel",
- "United Kingdom", "Indonesia", "Thailand", "Philippines")
-
-vperc_by_month %>%
- spread(month, perc) %>%
- filter(country %in% watched) %>%
- mutate(country = reorder(country, -`2022-05-01`)) %>%
- gather(month, perc, -country) %>%
- ggplot() + aes(month, country, fill=perc) +
- geom_tile() + theme_minimal() +
- theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
watched <- c("United Arab Emirates", "Japan", "Singapore",
+ "South Korea", "Taiwan", "Malaysia",
+ "Hong Kong", "New Zealand", "Thailand",
+ "Netherlands", "United States", "Israel",
+ "United Kingdom", "Indonesia", "Thailand", "Philippines")
+
+vperc_by_month %>%
+ spread(month, perc) %>%
+ filter(country %in% watched) %>%
+ mutate(country = reorder(country, -`2022-05-01`)) %>%
+ gather(month, perc, -country) %>%
+ ggplot() + aes(month, country, fill=perc) +
+ geom_tile() + theme_minimal() +
+ theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Sort by the time when the vaccine coverage rate exceeds 20% for all countries on the Y-axis.
https://clauswilke.com/dataviz/visualizing-amounts.html
-vperc_by_month %>%
- filter(country %in% watched) %>%
- mutate(month = lubridate::as_date(month)) %>%
- group_by(country) %>%
- mutate(month1 = min((month[perc > 20]))) %>%
- ungroup() %>%
- spread(month, perc) %>%
- mutate(country = reorder(country, -as.numeric(month1))) %>%
- select(-month1) %>%
- gather(month, perc, -country) %>%
- ggplot() + aes(month, country, fill=perc) +
- geom_tile() + theme_minimal() +
- theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
vperc_by_month %>%
+ filter(country %in% watched) %>%
+ mutate(month = lubridate::as_date(month)) %>%
+ group_by(country) %>%
+ mutate(month1 = min((month[perc > 20]))) %>%
+ ungroup() %>%
+ spread(month, perc) %>%
+ mutate(country = reorder(country, -as.numeric(month1))) %>%
+ select(-month1) %>%
+ gather(month, perc, -country) %>%
+ ggplot() + aes(month, country, fill=perc) +
+ geom_tile() + theme_minimal() +
+ theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
https://www.nytimes.com/2021/11/17/upshot/global-survey-optimism.html https://changingchildhood.unicef.org/about
-plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>%
- select(country = WP5, age = WP22140, bw = WP22092) %>%
- mutate(country = ordered(country,
- levels=c(1, 3, 4, 10, 11, 12,
- 13, 14, 17, 29, 31,
- 33, 35, 36, 60, 61,
- 77, 79, 81, 87, 165),
- labels=c("USA", "Morocco", "Lebanon",
- "Indonesia", "Bangladesh",
- "UK", "France", "Germany",
- "Spain", "Japan", "India",
- "Brazil", "Nigeria", "Kenya",
- "Ethiopia", "Mali", "Ukraine",
- "Cameroon", "Zimbabwe",
- "Argentina", "Peru"))) %>%
- count(country, age, bw) %>%
- group_by(country, age) %>%
- mutate(perc = n/sum(n)) %>%
- ungroup() %>%
- filter(bw == 1) %>%
- select(country, age, perc) %>%
- spread(age, perc) %>%
- rename(`15-24y` = `1`, `40+y` = `2`)
-
-plot.opt %>% head(10) %>% knitr::kable()
plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>%
+ select(country = WP5, age = WP22140, bw = WP22092) %>%
+ mutate(country = ordered(country,
+ levels=c(1, 3, 4, 10, 11, 12,
+ 13, 14, 17, 29, 31,
+ 33, 35, 36, 60, 61,
+ 77, 79, 81, 87, 165),
+ labels=c("USA", "Morocco", "Lebanon",
+ "Indonesia", "Bangladesh",
+ "UK", "France", "Germany",
+ "Spain", "Japan", "India",
+ "Brazil", "Nigeria", "Kenya",
+ "Ethiopia", "Mali", "Ukraine",
+ "Cameroon", "Zimbabwe",
+ "Argentina", "Peru"))) %>%
+ count(country, age, bw) %>%
+ group_by(country, age) %>%
+ mutate(perc = n/sum(n)) %>%
+ ungroup() %>%
+ filter(bw == 1) %>%
+ select(country, age, perc) %>%
+ spread(age, perc) %>%
+ rename(`15-24y` = `1`, `40+y` = `2`)
+
+plot.opt %>% head(10) %>% knitr::kable()
plot.opt %>%
- ggplot() + aes(`40+y`, `15-24y`, label = country) +
- geom_point(color = "skyblue", size = 2) +
- xlim(0, 1) + ylim(0,1) +
- geom_text(hjust = -0.1, vjust = -0.5) +
- geom_abline(intercept = 0, slop = 1,
- color="lightgrey", alpha=0.5, linetype="dashed") +
- theme_minimal() +
- theme(aspect.ratio=1)
plot.opt %>%
+ ggplot() + aes(`40+y`, `15-24y`, label = country) +
+ geom_point(color = "skyblue", size = 2) +
+ xlim(0, 1) + ylim(0,1) +
+ geom_text(hjust = -0.1, vjust = -0.5) +
+ geom_abline(intercept = 0, slop = 1,
+ color="lightgrey", alpha=0.5, linetype="dashed") +
+ theme_minimal() +
+ theme(aspect.ratio=1)
library(stringr)
-
-selected_df <- select(df, id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`)
-
-selected_df <- mutate(selected_df, year = date %/% 10000)
-selected_df <- mutate(selected_df, month = date %/% 100 %% 100)
-selected_df <- mutate(selected_df, area = str_sub(location, 4, 6))
-selected_df <- mutate(selected_df, county = str_sub(location, 1, 3))
library(stringr)
+
+selected_df <- select(df, id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`)
+
+selected_df <- mutate(selected_df, year = date %/% 10000)
+selected_df <- mutate(selected_df, month = date %/% 100 %% 100)
+selected_df <- mutate(selected_df, area = str_sub(location, 4, 6))
+selected_df <- mutate(selected_df, county = str_sub(location, 1, 3))
# readr::guess_encoding("data/tp_theft.csv")
-filtered_df <- selected_df %>%
- # count(year) %>% View
- filter(county == "臺北市") %>%
- filter(year >= 104) %>%
- # count(time) %>% View
- # count(location) %>%
- filter(!area %in% c("中和市", "板橋市"))
# readr::guess_encoding("data/tp_theft.csv")
+filtered_df <- selected_df %>%
+ # count(year) %>% View
+ filter(county == "臺北市") %>%
+ filter(year >= 104) %>%
+ # count(time) %>% View
+ # count(location) %>%
+ filter(!area %in% c("中和市", "板橋市"))
# count() then pivot_wider()
-df.wide <- filtered_df %>%
- count(time, area) %>%
- pivot_wider(names_from = area, values_from = n, values_fill = 0)
-??pivot_wider
# count() then pivot_wider()
+df.wide <- filtered_df %>%
+ count(time, area) %>%
+ pivot_wider(names_from = area, values_from = n, values_fill = 0)
+??pivot_wider
# Specify fonts for Chinese
-# par(family=('STKaiti'))
-par(family=('Heiti TC Light')) # for mac
-
-# Specify colors
-colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
- '#E79460', '#E98B2A', '#9B6E23', '#F7C242',
- '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
-
-# mosaicplot()
-mosaicplot(df.wide, color=colors, border=0, off = 3,
- main="Theft rate of Taipei city (region by hour)")
# Specify fonts for Chinese
+# par(family=('STKaiti'))
+par(family=('Heiti TC Light')) # for mac
+
+# Specify colors
+colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
+ '#E79460', '#E98B2A', '#9B6E23', '#F7C242',
+ '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
+
+# mosaicplot()
+mosaicplot(df.wide, color=colors, border=0, off = 3,
+ main="Theft rate of Taipei city (region by hour)")
library(readr)
-# options(stringsAsFactors = F)
-df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
-
-selected_df <- df %>%
- select(id = 編號,
- cat = 案類,
- date = `發生日期`,
- time = `發生時段`,
- location = `發生地點`) %>%
- mutate(year = date %/% 10000) %>%
- mutate(month = date %/% 100 %% 100) %>%
- mutate(area = stringr::str_sub(location, 4, 6)) %>%
- mutate(county = stringr::str_sub(location, 1, 3))
-
-selected_df %>% count(year)
library(readr)
+# options(stringsAsFactors = F)
+df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
+
+selected_df <- df %>%
+ select(id = 編號,
+ cat = 案類,
+ date = `發生日期`,
+ time = `發生時段`,
+ location = `發生地點`) %>%
+ mutate(year = date %/% 10000) %>%
+ mutate(month = date %/% 100 %% 100) %>%
+ mutate(area = stringr::str_sub(location, 4, 6)) %>%
+ mutate(county = stringr::str_sub(location, 1, 3))
+
+selected_df %>% count(year)
## # A tibble: 9 × 2
## year n
## <dbl> <int>
@@ -943,7 +949,7 @@ 6.2.6 Clean versionselected_df %>% count(time) %>% head(10)
## # A tibble: 10 × 2
## time n
## <chr> <int>
@@ -957,7 +963,7 @@ 6.2.6 Clean versionselected_df %>% arrange(time) %>% head(10)
+
## # A tibble: 10 × 9
## id cat date time location year month area county
## <dbl> <chr> <dbl> <chr> <chr> <dbl> <dbl> <chr> <chr>
@@ -971,32 +977,32 @@ 6.2.6 Clean versionfiltered_df <- selected_df %>%
- # count(year) %>% View
- filter(year >= 104) %>%
- filter(!time %in% c("03~05", "05~07", "09~11", "11~13", "15~17", "17~19", "18~21", "21~23", "23~01"))
- # count(time) %>% View
- # count(location) %>%
- # filter(!area %in% c("中和市", "板橋市"))
-
-df.wide <- filtered_df %>%
- count(time, area) %>%
- pivot_wider(names_from = area, values_from = n, values_fill = 0) %>%
- as.data.frame()
-
-row.names(df.wide) <- df.wide$time
-df.wide$time <- NULL
-
-par(family=('Heiti TC Light')) # for mac
-
-# Specify colors
-colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
- '#E79460', '#E98B2A', '#9B6E23', '#F7C242',
- '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
-
-# mosaicplot()
-mosaicplot(df.wide, color=colors, border=0, off = 3,
- main="Theft rate of Taipei city (region by hour)")
+filtered_df <- selected_df %>%
+ # count(year) %>% View
+ filter(year >= 104) %>%
+ filter(!time %in% c("03~05", "05~07", "09~11", "11~13", "15~17", "17~19", "18~21", "21~23", "23~01"))
+ # count(time) %>% View
+ # count(location) %>%
+ # filter(!area %in% c("中和市", "板橋市"))
+
+df.wide <- filtered_df %>%
+ count(time, area) %>%
+ pivot_wider(names_from = area, values_from = n, values_fill = 0) %>%
+ as.data.frame()
+
+row.names(df.wide) <- df.wide$time
+df.wide$time <- NULL
+
+par(family=('Heiti TC Light')) # for mac
+
+# Specify colors
+colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
+ '#E79460', '#E98B2A', '#9B6E23', '#F7C242',
+ '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
+
+# mosaicplot()
+mosaicplot(df.wide, color=colors, border=0, off = 3,
+ main="Theft rate of Taipei city (region by hour)")
![](R21-tptheft_dplyr_files/figure-html/unnamed-chunk-11-1.png)
@@ -1012,15 +1018,15 @@ 6.3.1 Visual Strategies
6.3.2 Code by base R
-library(readxl)
-# readxl::read_excel() to import the xls file
-df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T)
-
-# select iso3, and matleave columns by index
-matleave <- df[ , c(3, 6:24)]
-
-# str() to inspect the data structure of
-str(matleave)
+library(readxl)
+# readxl::read_excel() to import the xls file
+df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T)
+
+# select iso3, and matleave columns by index
+matleave <- df[ , c(3, 6:24)]
+
+# str() to inspect the data structure of
+str(matleave)
## tibble [197 × 20] (S3: tbl_df/tbl/data.frame)
## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ...
## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ...
@@ -1042,22 +1048,22 @@ 6.3.2 Code by base R# select all NA cells and assign 0 to them
-matleave[is.na(matleave)] <- 0
-
-# filter rows by condition
-m5 <- matleave[matleave$'matleave_13' == 5, ]
-
-# filter rows by condition
-m55<- m5[m5$'matleave_95' == 5,]
-
-# plot
-par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2))
-for (i in c(1:nrow(m55))){
- barplot(unlist(m55[i,-1]),
- border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5))
- title(m55[i,1], line = -4, cex.main=3)
-}
+# select all NA cells and assign 0 to them
+matleave[is.na(matleave)] <- 0
+
+# filter rows by condition
+m5 <- matleave[matleave$'matleave_13' == 5, ]
+
+# filter rows by condition
+m55<- m5[m5$'matleave_95' == 5,]
+
+# plot
+par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2))
+for (i in c(1:nrow(m55))){
+ barplot(unlist(m55[i,-1]),
+ border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5))
+ title(m55[i,1], line = -4, cex.main=3)
+}
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-1-1.png)
@@ -1065,7 +1071,7 @@ 6.3.3 Code by dplyrlibrary(tidyverse)
+
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
@@ -1076,23 +1082,23 @@ 6.3.3 Code by dplyroptions(scipen = 999)
-
-library(readxl)
-matleave <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>%
- select(iso3, 6:24)
-
-matleave %>%
- filter(matleave_13 == 5, matleave_95 == 5) %>%
- pivot_longer(names_to = "year", values_to = "degree", cols = 2:20) %>%
- replace_na(list(degree = 0)) %>%
- mutate(year = year(as.POSIXct(strptime(year, "matleave_%y")))) %>%
- ggplot() +
- aes(year, degree) +
- geom_col(color = "royalblue", fill = "royalblue") +
- ylim(0, 5) +
- facet_wrap(~ iso3) +
- theme_void()
+options(scipen = 999)
+
+library(readxl)
+matleave <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>%
+ select(iso3, 6:24)
+
+matleave %>%
+ filter(matleave_13 == 5, matleave_95 == 5) %>%
+ pivot_longer(names_to = "year", values_to = "degree", cols = 2:20) %>%
+ replace_na(list(degree = 0)) %>%
+ mutate(year = year(as.POSIXct(strptime(year, "matleave_%y")))) %>%
+ ggplot() +
+ aes(year, degree) +
+ geom_col(color = "royalblue", fill = "royalblue") +
+ ylim(0, 5) +
+ facet_wrap(~ iso3) +
+ theme_void()
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-2-1.png)
下圖為原始資料的截圖,matleave_95
代表1995年的資料,每個變數的數據1至5分別代表產假時給付薪水的月數區間共有五個區間。區間大小通常需要查看編碼簿來獲取定義。
![](images/paste-63576241.png)
@@ -1104,46 +1110,46 @@ 6.3.4 Generating eachlibrary(tidyverse)
-options(scipen = 999)
-
-library(readxl)
-matleave <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>%
- select(iso3, 6:24)
-
-generating_plot <- function(df){
- df %>%
- pivot_longer(names_to = "year", values_to = "degree", cols = 2:20) %>%
- replace_na(list(degree = 0)) %>%
- mutate(year = year(as.POSIXct(strptime(year, "matleave_%y")))) %>%
- ggplot() +
- aes(year, degree) +
- geom_col(color = "royalblue", fill = "royalblue") +
- ylim(0, 5) +
- facet_wrap(~ iso3) +
- theme_void() +
- theme(strip.text = element_text(size = 14, face = "bold", vjust=0.5),
- strip.placement = "inside"
- )
-}
-
-matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% generating_plot()
+library(tidyverse)
+options(scipen = 999)
+
+library(readxl)
+matleave <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>%
+ select(iso3, 6:24)
+
+generating_plot <- function(df){
+ df %>%
+ pivot_longer(names_to = "year", values_to = "degree", cols = 2:20) %>%
+ replace_na(list(degree = 0)) %>%
+ mutate(year = year(as.POSIXct(strptime(year, "matleave_%y")))) %>%
+ ggplot() +
+ aes(year, degree) +
+ geom_col(color = "royalblue", fill = "royalblue") +
+ ylim(0, 5) +
+ facet_wrap(~ iso3) +
+ theme_void() +
+ theme(strip.text = element_text(size = 14, face = "bold", vjust=0.5),
+ strip.placement = "inside"
+ )
+}
+
+matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% generating_plot()
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-1.png)
-
+
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-2.png)
-
+
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-3.png)
-
+
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-4.png)
-
+
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-5.png)
-
+
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-6.png)
-
+
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-7.png)
-
+
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-8.png)
-
+
![](R22_paid_maternity_dplyr_files/figure-html/unnamed-chunk-3-9.png)
@@ -1151,29 +1157,29 @@ 6.3.5 Gathering subplots by cowpl
這段程式碼的作用是將多個 ggplot2 圖形物件組合成一個網格,然後將這個網格圖形儲存為一個圖像文件。首先,這段程式碼定義了多個變數,如 plot_row1
、plot_row2
、plot_row3
等,每個變數都是一個網格圖形。這些變數通過 plot_grid()
函數來創建,這個函數可以將多個 ggplot2 圖形物件組合成一個網格。在 plot_grid()
函數中,可以設置 labels
參數來為每個子圖添加標籤。
然後,這些變數通過 plot_grid()
函數再次組合,形成一個更大的網格圖形。這裡使用 ncol = 1
參數將多個網格排列成一列。最後,使用 ggsave()
函數將這個網格圖形儲存為一個圖像文件。在這個例子中,圖像文件的名稱是 “test.png”,大小為 10 英寸 x 30 英寸,分辨率為 300 DPI。
總的來說,這段程式碼的作用是將多個 ggplot2 圖形物件組合成一個網格,並將這個網格圖形儲存為一個圖像文件。這樣做可以方便地進行圖像導出和共享,並且可以將多個圖形合併在一起進行比較和分析。
-library(cowplot)
-
-plot55 <- matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% generating_plot()
-plot05 <- matleave %>% filter(matleave_13 == 5, matleave_95 != 5) %>% generating_plot()
-plot44 <- matleave %>% filter(matleave_13 == 4, matleave_95 == 4) %>% generating_plot()
-plot04 <- matleave %>% filter(matleave_13 == 4, matleave_95 != 4) %>% generating_plot()
-plot33 <- matleave %>% filter(matleave_13 == 3, matleave_95 == 3) %>% generating_plot()
-plot03 <- matleave %>% filter(matleave_13 == 3, matleave_95 != 3) %>% generating_plot()
-plot22 <- matleave %>% filter(matleave_13 == 2, matleave_95 == 2) %>% generating_plot()
-plot02 <- matleave %>% filter(matleave_13 == 2, matleave_95 != 2) %>% generating_plot()
-plot11 <- matleave %>% filter(matleave_13 == 1) %>% generating_plot()
-
-
-plot_row1 <- plot_grid(plot55, plot05, labels = c('STAY 5', 'INCREASE TO 5'))
-plot_row2 <- plot_grid(plot44, plot04, labels = c('STAY 4', 'INCREASE TO 4'))
-plot_row3 <- plot_grid(plot33, plot03, labels = c('STAY 3', 'INCREASE TO 3'))
-plot_row4 <- plot_grid(plot22, plot02, labels = c('STAY 2', 'INCREASE TO 2'))
-
-final_plot <- plot_grid(
- plot_row1, plot_row2, plot_row3, plot_row4, plot11,
- ncol = 1
-)
-ggsave("test.png", final_plot, width=10, height=30, dpi=300)
+library(cowplot)
+
+plot55 <- matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% generating_plot()
+plot05 <- matleave %>% filter(matleave_13 == 5, matleave_95 != 5) %>% generating_plot()
+plot44 <- matleave %>% filter(matleave_13 == 4, matleave_95 == 4) %>% generating_plot()
+plot04 <- matleave %>% filter(matleave_13 == 4, matleave_95 != 4) %>% generating_plot()
+plot33 <- matleave %>% filter(matleave_13 == 3, matleave_95 == 3) %>% generating_plot()
+plot03 <- matleave %>% filter(matleave_13 == 3, matleave_95 != 3) %>% generating_plot()
+plot22 <- matleave %>% filter(matleave_13 == 2, matleave_95 == 2) %>% generating_plot()
+plot02 <- matleave %>% filter(matleave_13 == 2, matleave_95 != 2) %>% generating_plot()
+plot11 <- matleave %>% filter(matleave_13 == 1) %>% generating_plot()
+
+
+plot_row1 <- plot_grid(plot55, plot05, labels = c('STAY 5', 'INCREASE TO 5'))
+plot_row2 <- plot_grid(plot44, plot04, labels = c('STAY 4', 'INCREASE TO 4'))
+plot_row3 <- plot_grid(plot33, plot03, labels = c('STAY 3', 'INCREASE TO 3'))
+plot_row4 <- plot_grid(plot22, plot02, labels = c('STAY 2', 'INCREASE TO 2'))
+
+final_plot <- plot_grid(
+ plot_row1, plot_row2, plot_row3, plot_row4, plot11,
+ ncol = 1
+)
+ggsave("test.png", final_plot, width=10, height=30, dpi=300)
diff --git a/basic.html b/basic.html
index 22be156..3c3bf2a 100644
--- a/basic.html
+++ b/basic.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
url <- "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json"
-ubike.df <- fromJSON(content(GET(url),"text", encoding = "utf-8"))
-head(ubike.df) %>% select(1:6)
## sno sna tot sbi sarea mday
-## 1 500101001 YouBike2.0_捷運科技大樓站 28 9 大安區 2024-02-25 20:06:18
-## 2 500101002 YouBike2.0_復興南路二段273號前 21 7 大安區 2024-02-25 19:49:18
-## 3 500101003 YouBike2.0_國北教大實小東側門 16 10 大安區 2024-02-25 20:06:18
-## 4 500101004 YouBike2.0_和平公園東側 11 9 大安區 2024-02-25 20:06:18
-## 5 500101005 YouBike2.0_辛亥復興路口西北側 16 11 大安區 2024-02-25 20:02:04
-## 6 500101006 YouBike2.0_復興南路二段280號前 11 10 大安區 2024-02-25 20:06:14
+## 1 500101001 YouBike2.0_捷運科技大樓站 28 1 大安區 2024-03-31 23:09:14
+## 2 500101002 YouBike2.0_復興南路二段273號前 21 1 大安區 2024-03-31 23:02:18
+## 3 500101003 YouBike2.0_國北教大實小東側門 16 14 大安區 2024-03-31 22:26:18
+## 4 500101004 YouBike2.0_和平公園東側 11 11 大安區 2024-03-31 23:01:14
+## 5 500101005 YouBike2.0_辛亥復興路口西北側 16 11 大安區 2024-03-31 22:50:25
+## 6 500101006 YouBike2.0_復興南路二段280號前 11 8 大安區 2024-03-31 22:46:18
+
+## sno sna tot sbi
+## 1 500101001 YouBike2.0_捷運科技大樓站 28 1
+## 2 500101002 YouBike2.0_復興南路二段273號前 21 1
+## 3 500101003 YouBike2.0_國北教大實小東側門 16 14
+## 4 500101004 YouBike2.0_和平公園東側 11 11
+## 5 500101005 YouBike2.0_辛亥復興路口西北側 16 11
+## 6 500101006 YouBike2.0_復興南路二段280號前 11 8
+## 7 500101007 YouBike2.0_復興南路二段340巷口 11 6
+## 8 500101008 YouBike2.0_新生南路三段52號前 17 5
+## 9 500101009 YouBike2.0_新生南路三段66號前 16 0
+## 10 500101010 YouBike2.0_新生南路三段82號前 20 10
+## 11 500101012 YouBike2.0_辛亥路一段30號前 8 0
+## 12 500101013 YouBike2.0_和平復興路口西北側 9 4
+## 13 500101014 YouBike2.0_羅斯福路三段311號前 11 2
+## 14 500101015 YouBike2.0_大安運動中心停車場 14 12
+## 15 500101016 YouBike2.0_羅斯福路三段245號前 8 2
+## 16 500101018 YouBike2.0_溫州公園 5 2
+## 17 500101019 YouBike2.0_和平臥龍街口 15 15
+## 18 500101020 YouBike2.0_溫州停車場 5 0
+## 19 500101021 YouBike2.0_銘傳國小側門 7 1
+## 20 500101022 YouBike2.0_捷運公館站(2號出口) 99 0
+## 21 500101023 YouBike2.0_第二學生活動中心 25 1
+## 22 500101024 YouBike2.0_臺灣科技大學正門 30 9
+## 23 500101025 YouBike2.0_臺灣科技大學側門 99 24
+## 24 500101026 YouBike2.0_公館公園 15 14
+## 25 500101027 YouBike2.0_臺灣科技大學後門 39 12
+## 26 500101028 YouBike2.0_臺大醫學院附設癌醫中心 20 8
+## 27 500101029 YouBike2.0_臺大環研大樓 15 9
+## 28 500101030 YouBike2.0_臺大永齡生醫工程館 34 3
+## 29 500101031 YouBike2.0_臺大男七舍前 20 19
+## 30 500101032 YouBike2.0_臺大男一舍前 61 60
+## 31 500101033 YouBike2.0_臺大男六舍前 46 39
+## 32 500101034 YouBike2.0_臺大動物醫院前 18 6
+## 33 500101035 YouBike2.0_臺大土木研究大樓前 24 8
+## 34 500101036 YouBike2.0_臺大萬才館前 20 8
+## 35 500101037 YouBike2.0_臺大國青大樓宿舍前 20 19
+## 36 500101038 YouBike2.0_臺大社科院圖書館前 27 0
+## 37 500101039 YouBike2.0_臺大法人語言訓練中心前 28 11
+## 38 500101040 YouBike2.0_臺大綜合體育館停車場前 25 7
+## 39 500101041 YouBike2.0_辛亥新生路口東南側 41 24
+## 40 500101042 YouBike2.0_基隆長興路口東側 15 15
+## 41 500101091 YouBike2.0_國北教大側門南側 25 20
+## 42 500101092 YouBike2.0_和平實小東北側 13 11
+## 43 500101093 YouBike2.0_大安區健康服務中心 15 4
+## 44 500101094 YouBike2.0_辛亥泰順街口 20 12
+## 45 500101095 YouBike2.0_芳和國中 37 32
+## 46 500101097 YouBike2.0_臥龍樂業街口 41 36
+## 47 500101098 YouBike2.0_臥龍公園 14 13
+## 48 500101099 YouBike2.0_嘉興公園 44 33
+## 49 500101100 YouBike2.0_捷運麟光站(2號出口) 50 12
+## 50 500101101 YouBike2.0_捷運六張犁站 64 12
+## 51 500101102 YouBike2.0_喬治工商 24 14
+## 52 500101103 YouBike2.0_法治公園 15 7
+## 53 500101104 YouBike2.0_捷運臺電大樓站(2號出口) 18 3
+## 54 500101105 YouBike2.0_和平金山路口 45 17
+## 55 500101107 YouBike2.0_和平龍泉街口 34 34
+## 56 500101108 YouBike2.0_和平泰順街口 9 9
+## 57 500101109 YouBike2.0_臺灣師範大學(圖書館) 40 29
+## 58 500101110 YouBike2.0_捷運古亭站(6號出口) 60 5
+## 59 500101111 YouBike2.0_捷運古亭站(5號出口) 14 1
+## 60 500101113 YouBike2.0_臺北市立圖書館(總館) 51 50
+## 61 500101114 YouBike2.0_新生和平路口東北側 51 7
+## 62 500101115 YouBike2.0_建國和平路口西北側 50 45
+## 63 500101116 YouBike2.0_金華公園 46 40
+## 64 500101117 YouBike2.0_捷運東門站(3號出口) 15 3
+## 65 500101118 YouBike2.0_金甌女中 12 1
+## 66 500101119 YouBike2.0_金杭公園 20 11
+## 67 500101120 YouBike2.0_愛國金山路口 43 6
+## 68 500101122 YouBike2.0_敦化南路二段293巷口南側 14 7
+## 69 500101123 YouBike2.0_敦化基隆路口 38 7
+## 70 500101124 YouBike2.0_安和路二段181巷口 17 8
+## 71 500101125 YouBike2.0_臨江街夜市(通化街101巷口) 30 25
+## 72 500101126 YouBike2.0_臨江街夜市(基隆路) 29 6
+## 73 500101127 YouBike2.0_台北科技大學億光大樓 46 0
+## 74 500101128 YouBike2.0_新生南路一段119巷口 33 24
+## 75 500101129 YouBike2.0_幸安國小(仁愛路) 16 8
+## 76 500101130 YouBike2.0_民榮公園 15 14
+## 77 500101131 YouBike2.0_復興南路1段340巷口 50 10
+## 78 500101132 YouBike2.0_建國濟南路口 54 27
+## 79 500101133 YouBike2.0_捷運忠孝復興站(2號出口) 43 24
+## 80 500101134 YouBike2.0_捷運大安站(4號出口) 13 11
+## 81 500101135 YouBike2.0_捷運大安站(2號出口) 22 22
+## 82 500101136 YouBike2.0_信義大安路口(信維大樓) 12 4
+## 83 500101137 YouBike2.0_龍門廣場 70 6
+## 84 500101138 YouBike2.0_仁愛安和路口 33 1
+## 85 500101139 YouBike2.0_信義敦化路口 52 31
+## 86 500101140 YouBike2.0_仁愛國中 25 1
+## 87 500101141 YouBike2.0_捷運信義安和站(2號出口) 24 5
+## 88 500101142 YouBike2.0_八德市場 30 27
+## 89 500101143 YouBike2.0_昌隆公園 16 14
+## 90 500101144 YouBike2.0_捷運大安森林公園站(2號出口) 69 42
+## 91 500101145 YouBike2.0_信義延吉街口 15 1
+## 92 500101146 YouBike2.0_光信公園(光復南路456巷) 15 15
+## 93 500101147 YouBike2.0_僑安地下停車場(2號出口)東南側 20 0
+## 94 500101148 YouBike2.0_建國南路一段279巷口 32 10
+## 95 500101149 YouBike2.0_捷運忠孝新生站(6號出口) 15 2
+## 96 500101150 YouBike2.0_捷運忠孝新生站(4號出口) 34 6
+## 97 500101151 YouBike2.0_大安高工 23 18
+## 98 500101152 YouBike2.0_捷運忠孝新生站(3號出口) 23 6
+## 99 500101153 YouBike2.0_瑠公公園 20 0
+## 100 500101154 YouBike2.0_敦化市民路口 23 7
+## 101 500101155 YouBike2.0_捷運大安森林公園站(5號出口) 15 3
+## 102 500101156 YouBike2.0_信義建國路口 52 24
+## 103 500101157 YouBike2.0_東豐公園 19 14
+## 104 500101158 YouBike2.0_德安公園(四維路66巷) 14 3
+## 105 500101159 YouBike2.0_捷運忠孝復興站(5號出口) 41 0
+## 106 500101160 YouBike2.0_捷運忠孝敦化站(2號出口) 17 0
+## 107 500101161 YouBike2.0_捷運忠孝敦化站(7號出口) 18 0
+## 108 500101163 YouBike2.0_瑞安街208巷 15 11
+## 109 500101165 YouBike2.0_樂利路21巷口 17 13
+## 110 500101166 YouBike2.0_捷運科技大樓站(台北教育大學) 54 18
+## 111 500101167 YouBike2.0_捷運國父紀念館站(2號出口) 45 1
+## 112 500101168 YouBike2.0_仁愛醫院 36 8
+## 113 500101169 YouBike2.0_捷運信義安和站(4號出口) 30 6
+## 114 500101170 YouBike2.0_成功國宅 36 23
+## 115 500101171 YouBike2.0_仁愛延吉街口 33 3
+## 116 500101172 YouBike2.0_捷運信義安和站(1號出口) 33 10
+## 117 500101173 YouBike2.0_敦化南路二段103巷口 24 20
+## 118 500101174 YouBike2.0_復興南路二段128巷口 37 4
+## 119 500101175 YouBike2.0_和平東建國南路口 17 2
+## 120 500101176 YouBike2.0_芳蘭山莊 16 5
+## 121 500101177 YouBike2.0_復興南路一段126巷口 15 14
+## 122 500101179 YouBike2.0_捷運東門站(5號出口) 28 0
+## 123 500101180 YouBike2.0_仁愛路四段48巷口 11 0
+## 124 500101181 YouBike2.0_捷運公館站(3號出口) 90 1
+## 125 500101182 YouBike2.0_臺北科技大學(電機工程系) 16 11
+## 126 500101183 YouBike2.0_忠孝東路三段217巷口 34 0
+## 127 500101184 YouBike2.0_新生南路三段94巷口 15 0
+## 128 500101185 YouBike2.0_辛亥新生路口西北側 12 7
+## 129 500101186 YouBike2.0_捷運大安站(6號出口) 19 8
+## 130 500101187 YouBike2.0_臥龍街195巷口 14 5
+## 131 500101188 YouBike2.0_辛亥路三段157巷口 19 19
+## 132 500101189 YouBike2.0_臥龍基隆路口 16 6
+## 133 500101190 YouBike2.0_敦親公園 26 23
+## 134 500101191 YouBike2.0_大安運動中心 33 2
+## 135 500101192 YouBike2.0_和平敦化路口 36 15
+## 136 500101193 YouBike2.0_基隆長興路口 43 31
+## 137 500101194 YouBike2.0_仁愛路四段122巷口 16 8
+## 138 500101196 YouBike2.0_市民敦化路口 15 1
+## 139 500101197 YouBike2.0_忠孝東路四段49巷口 15 0
+## 140 500101198 YouBike2.0_市民復興路口(東南側) 16 0
+## 141 500101199 YouBike2.0_和平新生路口西南側 13 8
+## 142 500101200 YouBike2.0_全安公園 16 13
+## 143 500101201 YouBike2.0_信義路三段134巷口 19 10
+## 144 500101202 YouBike2.0_仁愛敦南圓環(東南側) 16 7
+## 145 500101203 YouBike2.0_臺北遠企購物中心 33 4
+## 146 500101204 YouBike2.0_外交部外交及國際事務學院 17 12
+## 147 500101205 YouBike2.0_四維路170巷口 22 17
+## 148 500101206 YouBike2.0_捷運大安站(3號出口) 46 31
+## 149 500101207 YouBike2.0_捷運臺電大樓站(2號出口)_1 35 1
+## 150 500101208 YouBike2.0_信義路四段199巷 15 7
+## 151 500101209 YouBike2.0_臺大資訊大樓 40 1
+## 152 500101210 YouBike2.0_敦化南路二段81巷 40 10
+## 153 500101211 YouBike2.0_原臺北刑務所官舍 23 23
+## 154 500101212 YouBike2.0_捷運國父紀念館站(1號出口) 25 0
+## 155 500101213 YouBike2.0_懷生國中 15 9
+## 156 500101214 YouBike2.0_仁愛敦南圓環(西北側) 20 6
+## 157 500101215 YouBike2.0_立人國小 17 16
+## 158 500101216 YouBike2.0_和平東路二段18巷口 24 24
+## 159 500101217 YouBike2.0_捷運大安站(5號出口) 26 14
+## 160 500101218 YouBike2.0_臨江公園 23 18
+## 161 500101219 YouBike2.0_羅斯福路四段113巷19弄口 14 7
+## 162 500101221 YouBike2.0_忠孝東路四段248巷口 15 1
+## 163 500101222 YouBike2.0_仁愛延吉路口(西北側) 18 5
+## 164 500101223 YouBike2.0_樂利路101巷口 13 12
+## 165 500101224 YouBike2.0_羅斯福浦城街口 15 8
+## 166 500101225 YouBike2.0_敦化南路一段295巷口 18 15
+## 167 500101226 YouBike2.0_通安區民活動中心 19 16
+## 168 500101227 YouBike2.0_復興忠孝東路口(東南側) 28 13
+## 169 500101228 YouBike2.0_仁愛大安路口(東北側) 21 4
+## 170 500101229 YouBike2.0_臺灣師範大學(浦城街) 15 12
+## 171 500101230 YouBike2.0_安和路二段69巷口 20 10
+## 172 500101231 YouBike2.0_大安國小 25 16
+## 173 500101232 YouBike2.0_捷運古亭站(3號出口) 15 3
+## 174 500101233 YouBike2.0_捷運忠孝復興站(3號出口) 37 4
+## 175 500101234 YouBike2.0_和平東路二段90巷 20 6
+## 176 500101235 YouBike2.0_光復南路420巷口 16 0
+## 177 500101236 YouBike2.0_富陽臥龍街口 18 8
+## 178 500101237 YouBike2.0_仁愛復興路口 25 3
+## 179 500101238 YouBike2.0_仁愛敦南圓環(東側) 16 9
+## 180 500101239 YouBike2.0_古風公園 15 3
+## 181 500103001 YouBike2.0_延平國宅 30 28
+## 182 500103002 YouBike2.0_臺北市立圖書館大同分館 20 11
+## 183 500103003 YouBike2.0_合昌宮 15 9
+## 184 500103004 YouBike2.0_民族延平路口 36 19
+## 185 500103005 YouBike2.0_重慶酒泉街口 44 15
+## 186 500103006 YouBike2.0_樹德公園 14 5
+## 187 500103007 YouBike2.0_陳天來故居 18 18
+## 188 500103008 YouBike2.0_臺北孔廟 37 25
+## 189 500103009 YouBike2.0_捷運圓山站(1號出口) 44 0
+## 190 500103010 YouBike2.0_酒泉延平路口 41 23
+## 191 500103011 YouBike2.0_重慶國中 49 6
+## 192 500103012 YouBike2.0_重慶北路三段383巷口 25 25
+## 193 500103013 YouBike2.0_台北數位產業園區 24 13
+## 194 500103019 YouBike2.0_民權延平路口(西北側) 20 20
+## 195 500103020 YouBike2.0_民權迪化街口 47 25
+## 196 500103021 YouBike2.0_大稻埕公園 35 22
+## 197 500103022 YouBike2.0_大龍老人住宅 14 12
+## 198 500103023 YouBike2.0_大龍峒社會住宅 20 13
+## 199 500103024 YouBike2.0_捷運大橋頭站(2號出口) 57 4
+## 200 500103025 YouBike2.0_捷運大橋頭站(1A出口) 18 10
+## 201 500103026 YouBike2.0_捷運民權西路站(2號出口) 25 0
+## 202 500103027 YouBike2.0_捷運雙連站(2號出口) 41 3
+## 203 500103028 YouBike2.0_捷運北門站(3號出口) 62 22
+## 204 500103029 YouBike2.0_朝陽公園 10 5
+## 205 500103030 YouBike2.0_永樂市場 38 24
+## 206 500103031 YouBike2.0_大龍公園 18 13
+## 207 500103032 YouBike2.0_重慶涼州街口 13 7
+## 208 500103033 YouBike2.0_圓山線形公園 14 8
+## 209 500103034 YouBike2.0_圓環站 31 15
+## 210 500103035 YouBike2.0_重慶民族路口 26 16
+## 211 500103036 YouBike2.0_承德路三段8巷口 21 4
+## 212 500103037 YouBike2.0_太原廣場 31 15
+## 213 500103038 YouBike2.0_國順公園 20 17
+## 214 500103039 YouBike2.0_聯合醫院中興院區 40 19
+## 215 500103040 YouBike2.0_蔣渭水紀念公園 36 21
+## 216 500103041 YouBike2.0_迪化休閒運動公園 15 2
+## 217 500103042 YouBike2.0_大同運動中心 16 15
+## 218 500103043 YouBike2.0_重慶保安街口(家樂福重慶店) 20 12
+## 219 500103044 YouBike2.0_大稻埕碼頭 52 16
+## 220 500103045 YouBike2.0_歸綏戲曲公園 20 17
+## 221 500103046 YouBike2.0_民權國中(民權西路) 17 2
+## 222 500103047 YouBike2.0_承德民權路口 17 10
+## 223 500103048 YouBike2.0_南京太原路口 18 4
+## 224 500103049 YouBike2.0_承德民生西路口 11 3
+## 225 500103050 YouBike2.0_太原五原路口 32 16
+## 226 500103051 YouBike2.0_臺北轉運站(華陰街) 20 0
+## 227 500103052 YouBike2.0_捷運民權西路站(3號出口) 50 0
+## 228 500103053 YouBike2.0_捷運中山站(5號出口) 15 2
+## 229 500103054 YouBike2.0_重慶長安路口 15 12
+## 230 500103055 YouBike2.0_承德昌吉街口 18 17
+## 231 500103056 YouBike2.0_大同16號廣場 14 6
+## 232 500103057 YouBike2.0_捷運圓山站(2號出口) 37 0
+## 233 500103058 YouBike2.0_樹德公園_1 40 20
+## 234 500103059 YouBike2.0_承德鄭州路口(市民高架下) 38 5
+## 235 500103060 YouBike2.0_成淵高中 14 3
+## 236 500103061 YouBike2.0_雙蓮國小 20 20
+## 237 500103062 YouBike2.0_寧夏涼州街口 15 3
+## 238 500103063 YouBike2.0_延平涼州街口 14 9
+## 239 500103064 YouBike2.0_大同行政中心 16 11
+## 240 500103065 YouBike2.0_大龍市場 15 14
+## 241 500103068 YouBike2.0_哈密街23巷19弄口 23 3
+## 242 500104001 YouBike2.0_劍潭抽水站 17 7
+## 243 500104002 YouBike2.0_通河東街大南路口 15 9
+## 244 500104003 YouBike2.0_福港街停車場 22 14
+## 245 500104004 YouBike2.0_百齡國小 50 39
+## 246 500104005 YouBike2.0_雨聲街165巷口 15 7
+## 247 500104006 YouBike2.0_天和公園 13 6
+## 248 500104007 YouBike2.0_中山天母路口 29 16
+## 249 500104008 YouBike2.0_天母運動公園 50 32
+## 250 500104009 YouBike2.0_臺北市立大學(天母校區) 48 8
+## 251 500104010 YouBike2.0_忠誠路二段53巷 18 7
+## 252 500104012 YouBike2.0_天母棒球場 26 21
+## 253 500104013 YouBike2.0_天母北天玉街口 15 11
+## 254 500104014 YouBike2.0_蘭興公園 48 19
+## 255 500104015 YouBike2.0_明勝公園 14 10
+## 256 500104016 YouBike2.0_劍潭海外青年活動中心 23 0
+## 257 500104018 YouBike2.0_忠誠路一段173巷口 11 2
+## 258 500104019 YouBike2.0_雨農國小 14 10
+## 259 500104020 YouBike2.0_忠誠公園 14 5
+## 260 500104021 YouBike2.0_芝山抽水站 46 26
+## 261 500104022 YouBike2.0_至誠路一段305巷口 21 7
+## 262 500104023 YouBike2.0_華齡公園 32 28
+## 263 500104024 YouBike2.0_前港公園(福德宮) 18 12
+## 264 500104025 YouBike2.0_華齡街185巷口 12 7
+## 265 500104026 YouBike2.0_前港公園(前港街) 19 13
+## 266 500104027 YouBike2.0_百齡高中 15 8
+## 267 500104028 YouBike2.0_捷運芝山站(2號出口) 21 9
+## 268 500104029 YouBike2.0_臺灣戲曲中心 25 7
+## 269 500104030 YouBike2.0_捷運劍潭站(2號出口) 49 14
+## 270 500104031 YouBike2.0_劍潭基河路口 66 1
+## 271 500104032 YouBike2.0_志成公園 23 13
+## 272 500104033 YouBike2.0_福林國小 14 11
+## 273 500104034 YouBike2.0_中山中正路口 19 10
+## 274 500104035 YouBike2.0_士林運動中心 30 10
+## 275 500104036 YouBike2.0_陽明高中 36 32
+## 276 500104037 YouBike2.0_兒童新樂園 23 12
+## 277 500104038 YouBike2.0_臺北市立天文館 46 25
+## 278 500104039 YouBike2.0_華聲公園 27 0
+## 279 500104040 YouBike2.0_福林公園 17 10
+## 280 500104041 YouBike2.0_捷運士林站(2號出口) 30 6
+## 281 500104042 YouBike2.0_銘傳大學 26 11
+## 282 500104043 YouBike2.0_士林高商 26 4
+## 283 500104044 YouBike2.0_蘭雅公園 38 9
+## 284 500104045 YouBike2.0_聯合醫院陽明院區 25 14
+## 285 500104046 YouBike2.0_捷運芝山站(1號出口) 36 0
+## 286 500104047 YouBike2.0_至誠公園 15 10
+## 287 500104048 YouBike2.0_原住民文化主題公園 21 14
+## 288 500104049 YouBike2.0_通河東街2段10巷口 15 12
+## 289 500104050 YouBike2.0_梅林新村 15 4
+## 290 500104051 YouBike2.0_延平北中正路口 30 22
+## 291 500104052 YouBike2.0_重慶北路四段190巷口 13 10
+## 292 500104053 YouBike2.0_重慶北葫東街口 15 11
+## 293 500104054 YouBike2.0_葫蘆國小 30 21
+## 294 500104055 YouBike2.0_士林3號廣場 30 13
+## 295 500104056 YouBike2.0_社正公園 15 1
+## 296 500104057 YouBike2.0_社子國小 15 10
+## 297 500104058 YouBike2.0_社中街384巷口 18 7
+## 298 500104059 YouBike2.0_忠誠路一段138號 15 12
+## 299 500104060 YouBike2.0_社子公園 32 15
+## 300 500104061 YouBike2.0_國立故宮博物院 17 3
+## 301 500104062 YouBike2.0_泰北高中 16 10
+## 302 500104063 YouBike2.0_後港公園 15 6
+## 303 500104064 YouBike2.0_重慶北路四段117號 18 10
+## 304 500104065 YouBike2.0_社子島島頭公園 15 8
+## 305 500104066 YouBike2.0_延平北路八段133巷口 15 8
+## 306 500104067 YouBike2.0_坤天亭 14 8
+## 307 500104068 YouBike2.0_社子島濕地解說小築 15 9
+## 308 500104069 YouBike2.0_福安國中 25 14
+## 309 500104070 YouBike2.0_福安消防分隊 15 8
+## 310 500104071 YouBike2.0_聖山綠地 15 9
+## 311 500104072 YouBike2.0_芝山國小 38 25
+## 312 500104073 YouBike2.0_士林新天地 29 8
+## 313 500104074 YouBike2.0_蘭雅國小 37 33
+## 314 500104075 YouBike2.0_中正基河路口 37 17
+## 315 500104076 YouBike2.0_福林公園(中正路) 45 14
+## 316 500104077 YouBike2.0_至善臨溪路口 48 19
+## 317 500104078 YouBike2.0_市立圖書館葫蘆堵分館 13 9
+## 318 500104079 YouBike2.0_東山路110巷口 16 6
+## 319 500104080 YouBike2.0_永平社會住宅 15 6
+## 320 500104081 YouBike2.0_雨農橋 16 9
+## 321 500104082 YouBike2.0_通河街76巷/承德路四段10巷口 14 5
+## 322 500104083 YouBike2.0_芝山聖佑宮 15 5
+## 323 500104084 YouBike2.0_至誠雨聲街口 9 0
+## 324 500104085 YouBike2.0_捷運線型公園(後街) 13 12
+## 325 500104086 YouBike2.0_天母公園 12 9
+## 326 500104087 YouBike2.0_基河文林路口 16 6
+## 327 500104088 YouBike2.0_文林福華路口 19 6
+## 328 500104089 YouBike2.0_劍潭海外青年活動中心_1 39 13
+## 329 500104090 YouBike2.0_社子國小_1 36 25
+## 330 500104091 YouBike2.0_捷運劍潭站(1號出口) 70 3
+## 331 500104092 YouBike2.0_德行東山路口 12 8
+## 332 500104094 YouBike2.0_重慶北通河西街口 12 3
+## 333 500104095 YouBike2.0_葫蘆國小(延平北路五段285巷) 15 11
+## 334 500104096 YouBike2.0_社子市場 15 10
+## 335 500104097 YouBike2.0_士林區農會社子分部 8 6
+## 336 500104098 YouBike2.0_承德劍潭路口 19 4
+## 337 500104099 YouBike2.0_文林路101巷口 17 9
+## 338 500104100 YouBike2.0_延平北路五段257巷15弄口 11 8
+## 339 500104101 YouBike2.0_延平北路五段257巷4弄口 15 9
+## 340 500104102 YouBike2.0_啟明學校 16 8
+## 341 500104103 YouBike2.0_中山福國路口 14 6
+## 342 500104104 YouBike2.0_德行公園 14 9
+## 343 500104105 YouBike2.0_承德後港街口 11 3
+## 344 500104106 YouBike2.0_中山北路五段698巷口 15 12
+## 345 500104107 YouBike2.0_捷運士林站(1號出口) 38 24
+## 346 500104108 YouBike2.0_捷運芝山站(2號出口)_1 62 4
+## 347 500104109 YouBike2.0_銘傳大學(中山北路五段280巷口) 23 1
+## 348 500104110 YouBike2.0_海光公園南側 12 5
+## 349 500104111 YouBike2.0_士商路40巷口 15 10
+## 350 500104112 YouBike2.0_劍潭郵局 16 7
+## 351 500104113 YouBike2.0_士東路91巷口 16 8
+## 352 500104114 YouBike2.0_美崙公園 13 8
+## 353 500104115 YouBike2.0_臺北市立大學(忠誠路二段207巷) 17 6
+## 354 500104116 YouBike2.0_天母東路8巷/忠誠路二段154巷口 14 2
+## 355 500104117 YouBike2.0_美崙公園(東北側) 15 7
+## 356 500104118 YouBike2.0_福安河濱公園 14 6
+## 357 500104119 YouBike2.0_忠誠忠義街口(北側) 13 8
+## 358 500104120 YouBike2.0_忠誠忠義街口(南側) 14 4
+## 359 500104121 YouBike2.0_士林國小 15 7
+## 360 500104124 YouBike2.0_天和一號公園 15 10
+## 361 500104125 YouBike2.0_忠誠路二段178巷口 15 5
+## 362 500104126 YouBike2.0_克強磺溪街口 14 4
+## 363 500104128 YouBike2.0_蘭雅公園(西側) 15 11
+## 364 500104129 YouBike2.0_福林路100巷77弄口 18 5
+## 365 500105001 YouBike2.0_台北花木批發市場 40 21
+## 366 500105002 YouBike2.0_捷運萬隆站(4號出口) 22 0
+## 367 500105003 YouBike2.0_捷運萬隆站(1號出口) 34 0
+## 368 500105004 YouBike2.0_萬和二號公園 35 17
+## 369 500105005 YouBike2.0_捷運萬隆站(2號出口) 12 0
+## 370 500105006 YouBike2.0_景仁公園 16 8
+## 371 500105007 YouBike2.0_捷運景美站(2號出口) 63 2
+## 372 500105008 YouBike2.0_羅斯福景隆街口 25 7
+## 373 500105009 YouBike2.0_景福街/羅斯福路6段142巷口 28 11
+## 374 500105010 YouBike2.0_興旺公園 30 22
+## 375 500105011 YouBike2.0_興福國中 25 15
+## 376 500105012 YouBike2.0_興隆路2段203巷 32 14
+## 377 500105013 YouBike2.0_景美運動公園 11 3
+## 378 500105014 YouBike2.0_景美醫院 18 6
+## 379 500105015 YouBike2.0_師範大學公館校區 14 10
+## 380 500105016 YouBike2.0_景華街128巷口 29 21
+## 381 500105017 YouBike2.0_仙跡岩登山口(景興路) 22 4
+## 382 500105018 YouBike2.0_國立政治大學 35 18
+## 383 500105019 YouBike2.0_捷運動物園站 57 1
+## 384 500105020 YouBike2.0_捷運木柵站 31 19
+## 385 500105021 YouBike2.0_捷運萬芳社區站 49 17
+## 386 500105022 YouBike2.0_文山運動中心 30 16
+## 387 500105023 YouBike2.0_捷運辛亥站 42 0
+## 388 500105024 YouBike2.0_興豐公園 25 8
+## 389 500105025 YouBike2.0_木柵光輝路口 33 31
+## 390 500105026 YouBike2.0_考試院 26 10
+## 391 500105027 YouBike2.0_和興路26巷口 22 7
+## 392 500105028 YouBike2.0_世新大學 30 5
+## 393 500105029 YouBike2.0_一壽橋 28 18
+## 394 500105030 YouBike2.0_臺北市立景美女中 25 12
+## 395 500105031 YouBike2.0_永安藝文館-表演36房 29 17
+## 396 500105032 YouBike2.0_忠順區民活動中心 31 14
+## 397 500105033 YouBike2.0_景文中學 36 19
+## 398 500105034 YouBike2.0_老泉街籃球場 14 9
+## 399 500105035 YouBike2.0_文山行政中心 27 0
+## 400 500105036 YouBike2.0_木柵公園 38 5
+## 401 500105037 YouBike2.0_興隆公共住宅D2區 19 12
+## 402 500105038 YouBike2.0_木新路3段95巷口 16 9
+## 403 500105039 YouBike2.0_樟腳里公園 15 15
+## 404 500105040 YouBike2.0_實踐國中 13 6
+## 405 500105041 YouBike2.0_指南路3段2巷 13 13
+## 406 500105042 YouBike2.0_萊茵公園 14 8
+## 407 500105043 YouBike2.0_木柵社會住宅 12 3
+## 408 500105044 YouBike2.0_秀明路一段185巷口 20 4
+## 409 500105045 YouBike2.0_秀明路一段129巷口 22 12
+## 410 500105046 YouBike2.0_恆光橋(老泉街) 13 2
+## 411 500105047 YouBike2.0_萬有3號公園 14 6
+## 412 500105048 YouBike2.0_捷運萬芳醫院站(興隆路三段115巷) 20 5
+## 413 500105049 YouBike2.0_興得閱覽室 24 13
+## 414 500105050 YouBike2.0_辛亥生態公園 18 0
+## 415 500105051 YouBike2.0_博嘉運動公園 12 0
+## 416 500105052 YouBike2.0_國立政治大學(萬壽路) 54 40
+## 417 500105053 YouBike2.0_仙岩公園 11 9
+## 418 500105054 YouBike2.0_政大一街口 14 3
+## 419 500105055 YouBike2.0_文山第二行政中心 38 12
+## 420 500105056 YouBike2.0_移民署訓練中心 13 9
+## 421 500105057 YouBike2.0_海巡署(南側) 10 2
+## 422 500105058 YouBike2.0_明道國小東南側 18 3
+## 423 500105059 YouBike2.0_木南公園 12 7
+## 424 500105060 YouBike2.0_實踐國中(木新路三段310巷口) 17 8
+## 425 500105061 YouBike2.0_師範大學公館校區_1 34 8
+## 426 500105062 YouBike2.0_捷運動物園站(2號出口) 39 0
+## 427 500105063 YouBike2.0_政大水岸電梯 10 9
+## 428 500105064 YouBike2.0_敦南山林 14 2
+## 429 500105066 YouBike2.0_景美污水抽水站 15 1
+## 430 500105067 YouBike2.0_萬和三號公園(北側) 13 6
+## 431 500105068 YouBike2.0_景興國中 10 4
+## 432 500105069 YouBike2.0_景仁公園_1 30 17
+## 433 500105070 YouBike2.0_師大公館校區學二舍 40 15
+## 434 500105071 YouBike2.0_景行公園 15 0
+## 435 500105072 YouBike2.0_萬興國小 16 6
+## 436 500105073 YouBike2.0_辛亥路四段77巷口 14 9
+## 437 500105074 YouBike2.0_景興路42巷口 12 4
+## 438 500105075 YouBike2.0_木柵路三段48巷 15 7
+## 439 500105076 YouBike2.0_木柵路二段109巷 15 11
+## 440 500105077 YouBike2.0_試院公園 15 7
+## 441 500105079 YouBike2.0_樟樹公園 15 11
+## 442 500105080 YouBike2.0_萬美萬安街口 16 2
+## 443 500105081 YouBike2.0_興隆路二段203巷(敦南) 27 22
+## 444 500105082 YouBike2.0_新光秀明路口 15 4
+## 445 500105083 YouBike2.0_光輝路134巷口 15 8
+## 446 500105084 YouBike2.0_光輝公園 15 15
+## 447 500105085 YouBike2.0_木新公園 12 6
+## 448 500105086 YouBike2.0_興隆路二段275巷1弄口 16 6
+## 449 500105087 YouBike2.0_中國科技大學 21 3
+## 450 500105088 YouBike2.0_樟新街8巷 17 4
+## 451 500105089 YouBike2.0_仙岩路22巷口 28 20
+## 452 500105090 YouBike2.0_木柵萬芳路口 18 8
+## 453 500105091 YouBike2.0_福興路78巷 14 11
+## 454 500105093 YouBike2.0_興泰公園 12 7
+## 455 500105094 YouBike2.0_興岩社會福利綜合大樓 18 6
+## 456 500105095 YouBike2.0_興隆路二段22巷9弄口 13 6
+## 457 500106001 YouBike2.0_臺北自來水事業處 20 1
+## 458 500106002 YouBike2.0_汀州思源街口東南側 20 2
+## 459 500106003 YouBike2.0_捷運公館站(1號出口) 12 1
+## 460 500106004 YouBike2.0_捷運公館站(4號出口) 12 2
+## 461 500106005 YouBike2.0_捷運古亭站(9號出口) 20 13
+## 462 500106006 YouBike2.0_捷運古亭站(2號出口) 55 0
+## 463 500106007 YouBike2.0_捷運臺電大樓站(1號出口) 34 0
+## 464 500106008 YouBike2.0_客家文化主題公園 15 15
+## 465 500106009 YouBike2.0_河堤國小 39 26
+## 466 500106010 YouBike2.0_紀州庵 25 17
+## 467 500106011 YouBike2.0_捷運臺電大樓站(5號出口) 14 8
+## 468 500106012 YouBike2.0_捷運臺電大樓站(4號出口) 13 10
+## 469 500106013 YouBike2.0_羅斯福三段金門街口 15 13
+## 470 500106014 YouBike2.0_牯嶺公園 58 28
+## 471 500106015 YouBike2.0_捷運古亭站(8號出口) 15 0
+## 472 500106016 YouBike2.0_捷運古亭站(7號出口) 12 2
+## 473 500106017 YouBike2.0_南昌公園 55 20
+## 474 500106018 YouBike2.0_和平重慶路口 46 31
+## 475 500106019 YouBike2.0_孫立人將軍官邸 23 9
+## 476 500106020 YouBike2.0_羅斯福路二段6巷口 14 7
+## 477 500106021 YouBike2.0_金華杭州南路口 21 13
+## 478 500106022 YouBike2.0_捷運中正紀念堂站(3號出口) 18 5
+## 479 500106023 YouBike2.0_捷運中正紀念堂站(4號出口) 21 8
+## 480 500106025 YouBike2.0_螢橋國小 41 29
+## 481 500106026 YouBike2.0_古亭智慧圖書館 14 8
+## 482 500106027 YouBike2.0_永昌公園 15 5
+## 483 500106028 YouBike2.0_中華路二段409巷口 15 9
+## 484 500106029 YouBike2.0_南機場夜市(中華路二段) 41 27
+## 485 500106030 YouBike2.0_南海和平路口西南側 19 2
+## 486 500106031 YouBike2.0_莒光和平路口 20 11
+## 487 500106037 YouBike2.0_水源路11-1號旁 19 13
+## 488 500106038 YouBike2.0_南門國中 29 12
+## 489 500106039 YouBike2.0_捷運小南門站(2號出口) 18 9
+## 490 500106040 YouBike2.0_介壽公園 23 14
+## 491 500106041 YouBike2.0_中華貴陽街口 20 4
+## 492 500106042 YouBike2.0_華山文創園區 39 30
+## 493 500106043 YouBike2.0_捷運善導寺站(1號出口) 46 14
+## 494 500106044 YouBike2.0_濟南紹興路口 39 18
+## 495 500106046 YouBike2.0_林森仁愛路口 13 4
+## 496 500106047 YouBike2.0_中正運動中心 39 13
+## 497 500106048 YouBike2.0_信義杭州路口 59 17
+## 498 500106049 YouBike2.0_捷運善導寺站(3號出口) 20 0
+## 499 500106050 YouBike2.0_捷運小南門站(1號出口) 46 27
+## 500 500106051 YouBike2.0_延平南路133巷口 17 7
+## 501 500106052 YouBike2.0_捷運西門站(2號出口) 36 9
+## 502 500106053 YouBike2.0_寶慶博愛路口 47 6
+## 503 500106054 YouBike2.0_法務部 27 6
+## 504 500106055 YouBike2.0_臺北市立大學(博愛校區) 59 29
+## 505 500106056 YouBike2.0_國家圖書館 36 11
+## 506 500106057 YouBike2.0_市民金山路口 50 15
+## 507 500106058 YouBike2.0_聯合醫院和平院區 32 24
+## 508 500106059 YouBike2.0_中山堂 43 4
+## 509 500106060 YouBike2.0_中華漢口街口 19 9
+## 510 500106061 YouBike2.0_中華路一段21巷口 22 4
+## 511 500106062 YouBike2.0_捷運臺大醫院站(4號出口) 60 22
+## 512 500106063 YouBike2.0_寶藏巖觀音亭 23 9
+## 513 500106064 YouBike2.0_師大水源路口 21 10
+## 514 500106065 YouBike2.0_中山徐州路口 26 15
+## 515 500106066 YouBike2.0_信義連雲街口 39 2
+## 516 500106067 YouBike2.0_臺北轉運站 68 35
+## 517 500106068 YouBike2.0_莒光大埔街口 32 19
+## 518 500106069 YouBike2.0_捷運忠孝新生站(2號出口) 32 0
+## 519 500106070 YouBike2.0_光華商場 39 6
+## 520 500106071 YouBike2.0_中山青島路口 40 0
+## 521 500106072 YouBike2.0_捷運中正紀念堂站(5號出口) 29 12
+## 522 500106073 YouBike2.0_北平東杭州北路口 20 0
+## 523 500106074 YouBike2.0_王貫英先生紀念圖書館 15 15
+## 524 500106075 YouBike2.0_金山信義路口 25 2
+## 525 500106077 YouBike2.0_林森徐州路口 16 16
+## 526 500106078 YouBike2.0_徐州杭州路口 19 11
+## 527 500106079 YouBike2.0_捷運中正紀念堂站(6號出口) 17 9
+## 528 500106080 YouBike2.0_捷運臺北車站(M2出口) 20 0
+## 529 500106083 YouBike2.0_臺北市國父史蹟館(逸仙公園) 31 0
+## 530 500106084 YouBike2.0_捷運西門站(5號出口) 30 2
+## 531 500106085 YouBike2.0_弘道國中 18 9
+## 532 500106086 YouBike2.0_臺北市第一女子高級中學 17 2
+## 533 500106087 YouBike2.0_台北市替代役中心 15 4
+## 534 500106088 YouBike2.0_紹興徐州路口 18 17
+## 535 500106089 YouBike2.0_羅斯福寧波東街口 26 1
+## 536 500106090 YouBike2.0_自來水園區 40 0
+## 537 500106091 YouBike2.0_仁愛林森路口 31 3
+## 538 500106092 YouBike2.0_捷運西門站(3號出口) 36 3
+## 539 500106093 YouBike2.0_仁愛金山路口 9 5
+## 540 500106094 YouBike2.0_杭州南路一段101巷口 14 8
+## 541 500106095 YouBike2.0_仁愛杭州路口 16 8
+## 542 500106096 YouBike2.0_龍興里活動中心 21 17
+## 543 500106097 YouBike2.0_植物園 29 25
+## 544 500106098 YouBike2.0_郵政博物館 24 9
+## 545 500106099 YouBike2.0_林森北平路口 20 8
+## 546 500106100 YouBike2.0_北平紹興路口 15 3
+## 547 500106101 YouBike2.0_天津北平路口 15 4
+## 548 500106102 YouBike2.0_捷運忠孝新生站(1號出口) 19 1
+## 549 500106103 YouBike2.0_捷運忠孝新生站(5號出口) 13 2
+## 550 500106104 YouBike2.0_捷運臺大醫院站(1號出口) 19 6
+## 551 500106105 YouBike2.0_臺大醫院兒童醫院 22 3
+## 552 500106106 YouBike2.0_林森濟南路口(東北側) 15 4
+## 553 500106107 YouBike2.0_仁愛紹興街口(南側) 17 4
+## 554 500106108 YouBike2.0_中華南海路口 15 8
+## 555 500106109 YouBike2.0_立法院台北會館 15 10
+## 556 500106110 YouBike2.0_捷運善導寺站(3號出口)(忠孝東路側) 17 0
+## 557 500106111 YouBike2.0_國家音樂廳 22 2
+## 558 500106112 YouBike2.0_忠孝西重慶南路口 33 5
+## 559 500106113 YouBike2.0_濟南路二段8巷口 14 6
+## 560 500106114 YouBike2.0_仁愛金山路口(東南側) 14 8
+## 561 500106115 YouBike2.0_臺灣文學基地 15 2
+## 562 500106116 YouBike2.0_重慶南詔安街口 15 12
+## 563 500106117 YouBike2.0_文光公園 17 9
+## 564 500106118 YouBike2.0_捷運中正紀念堂站(2號出口) 12 3
+## 565 500106119 YouBike2.0_螢圃里小公園 19 11
+## 566 500106120 YouBike2.0_螢橋公園 15 14
+## 567 500106121 YouBike2.0_泉州寧波西街口 30 22
+## 568 500106122 YouBike2.0_和平西路二段98巷口 16 7
+## 569 500106123 YouBike2.0_仁愛新生路口(西南側) 18 17
+## 570 500106124 YouBike2.0_幸安市場 15 6
+## 571 500106125 YouBike2.0_龍口市場 14 9
+## 572 500107001 YouBike2.0_通北街65巷口 16 12
+## 573 500107002 YouBike2.0_圓山風景區 15 2
+## 574 500107003 YouBike2.0_樂群二堤頂大道口 20 6
+## 575 500107004 YouBike2.0_劍潭社區 13 7
+## 576 500107005 YouBike2.0_培英公園 40 14
+## 577 500107006 YouBike2.0_樂群二明水路口 20 4
+## 578 500107007 YouBike2.0_北安大直街口 31 6
+## 579 500107008 YouBike2.0_捷運劍南路站(2號出口) 86 38
+## 580 500107009 YouBike2.0_樂群二敬業三路口 20 14
+## 581 500107010 YouBike2.0_樂群二敬業四路口 36 27
+## 582 500107011 YouBike2.0_捷運大直站(3號出口) 34 30
+## 583 500107012 YouBike2.0_復興市民路口 52 9
+## 584 500107013 YouBike2.0_南京遼寧街口 42 1
+## 585 500107014 YouBike2.0_伊通長安路口 21 17
+## 586 500107015 YouBike2.0_新生長安路口 30 3
+## 587 500107016 YouBike2.0_市民林森路口 39 33
+## 588 500107017 YouBike2.0_南京新生路口 34 8
+## 589 500107018 YouBike2.0_一江公園 37 1
+## 590 500107019 YouBike2.0_松江公園 37 10
+## 591 500107020 YouBike2.0_新生長春路口 32 5
+## 592 500107021 YouBike2.0_第二果菜批發市場 40 19
+## 593 500107022 YouBike2.0_民生建國路口 33 0
+## 594 500107023 YouBike2.0_興安華城 62 55
+## 595 500107024 YouBike2.0_捷運中山國中站 62 0
+## 596 500107025 YouBike2.0_龍江錦州街口 16 10
+## 597 500107026 YouBike2.0_建國長春路口 16 9
+## 598 500107027 YouBike2.0_南京建國路口 42 2
+## 599 500107028 YouBike2.0_捷運松江南京站(7號出口) 75 0
+## 600 500107029 YouBike2.0_朱崙商場 37 27
+## 601 500107030 YouBike2.0_中吉公園 15 5
+## 602 500107031 YouBike2.0_華山公園 19 13
+## 603 500107032 YouBike2.0_建國北路一段17巷 45 13
+## 604 500107033 YouBike2.0_江寧公園 15 13
+## 605 500107034 YouBike2.0_民權龍江路口 32 24
+## 606 500107035 YouBike2.0_捷運中山國小站(2號出口) 59 5
+## 607 500107036 YouBike2.0_捷運行天宮站(3號出口) 42 7
+## 608 500107037 YouBike2.0_林森農安街口 17 9
+## 609 500107038 YouBike2.0_捷運中山國小站(4號出口) 20 6
+## 610 500107039 YouBike2.0_農安雙城街口 15 2
+## 611 500107040 YouBike2.0_新生德惠街口 15 15
+## 612 500107041 YouBike2.0_民族林森路口 37 21
+## 613 500107042 YouBike2.0_臺北市立美術館 24 17
+## 614 500107043 YouBike2.0_中山民族路口 16 5
+## 615 500107044 YouBike2.0_新生高架停車場(林森北路107巷口) 14 13
+## 616 500107045 YouBike2.0_南京林森路口(東南側) 10 10
+## 617 500107046 YouBike2.0_仁德公園 18 18
+## 618 500107047 YouBike2.0_中原公園 15 11
+## 619 500107048 YouBike2.0_下埤公園 24 13
+## 620 500107049 YouBike2.0_五常國中 16 15
+## 621 500107050 YouBike2.0_榮星花園 46 38
+## 622 500107051 YouBike2.0_民權建國路口 50 23
+## 623 500107052 YouBike2.0_松江路431巷口 15 6
+## 624 500107053 YouBike2.0_新喜公園 13 11
+## 625 500107054 YouBike2.0_吉林路407巷口 15 8
+## 626 500107055 YouBike2.0_民族松江路口 17 9
+## 627 500107056 YouBike2.0_林安泰古厝 36 3
+## 628 500107057 YouBike2.0_中山公民會館 20 10
+## 629 500107058 YouBike2.0_渭水八德路口 23 5
+## 630 500107059 YouBike2.0_捷運中山站(2號出口) 33 1
+## 631 500107060 YouBike2.0_撫順公園 30 1
+## 632 500107061 YouBike2.0_新生公園 29 25
+## 633 500107062 YouBike2.0_捷運行天宮站(1號出口) 46 6
+## 634 500107063 YouBike2.0_林森長春路口 28 1
+## 635 500107064 YouBike2.0_建國農安街口 50 29
+## 636 500107065 YouBike2.0_松江路77巷口 10 4
+## 637 500107066 YouBike2.0_建國長安路口 20 5
+## 638 500107067 YouBike2.0_市民新生路口 15 4
+## 639 500107068 YouBike2.0_民權吉林路口 15 9
+## 640 500107069 YouBike2.0_中山農安街口 17 11
+## 641 500107070 YouBike2.0_捷運行政大樓 14 4
+## 642 500107071 YouBike2.0_中吉公園(松江路188巷) 22 2
+## 643 500107072 YouBike2.0_吉林路123巷口 13 11
+## 644 500107074 YouBike2.0_中原民生路口 15 6
+## 645 500107075 YouBike2.0_國立臺北大學(臺北校區) 38 7
+## 646 500107076 YouBike2.0_錦州吉林路口 30 19
+## 647 500107077 YouBike2.0_中山北路二段59巷口 12 10
+## 648 500107078 YouBike2.0_永盛公園(民生東路一段23巷) 24 23
+## 649 500107079 YouBike2.0_新生錦州街口 20 8
+## 650 500107080 YouBike2.0_濱江街199巷口 15 7
+## 651 500107081 YouBike2.0_大佳社區公園 15 5
+## 652 500107082 YouBike2.0_濱江果菜市場 22 19
+## 653 500107083 YouBike2.0_興安合江路口 19 4
+## 654 500107084 YouBike2.0_復興北路514巷口東側 12 9
+## 655 500107085 YouBike2.0_台泥大樓 18 1
+## 656 500107086 YouBike2.0_植福樂群路口 10 2
+## 657 500107087 YouBike2.0_新興公園 26 6
+## 658 500107088 YouBike2.0_南京伊通街口 11 2
+## 659 500107089 YouBike2.0_南京龍江路口 15 4
+## 660 500107090 YouBike2.0_撫順街41巷(崇德宮前) 19 6
+## 661 500107091 YouBike2.0_臺北市立圖書館大直分館 20 9
+## 662 500107092 YouBike2.0_捷運大直站(1號出口) 27 5
+## 663 500107093 YouBike2.0_捷運松江南京站(4號出口) 32 0
+## 664 500107095 YouBike2.0_中429公園 15 6
+## 665 500107096 YouBike2.0_長春路137巷口 16 5
+## 666 500107097 YouBike2.0_松江民生路口 17 1
+## 667 500107098 YouBike2.0_松江路132巷口 14 2
+## 668 500107099 YouBike2.0_長春吉林路口 10 3
+## 669 500107100 YouBike2.0_長春一江街口 11 1
+## 670 500107101 YouBike2.0_捷運松江南京站(8號出口) 20 0
+## 671 500107102 YouBike2.0_南京一江街口 10 0
+## 672 500107103 YouBike2.0_松江長春路口 16 0
+## 673 500107104 YouBike2.0_經國七海文化園區 15 7
+## 674 500107105 YouBike2.0_民族玉門街口 20 3
+## 675 500107106 YouBike2.0_新生農安街口 15 13
+## 676 500107107 YouBike2.0_稻江高級護理家事職業學校 14 10
+## 677 500107108 YouBike2.0_捷運大直站(3號出口)_1 18 11
+## 678 500107109 YouBike2.0_樂群二明水路口_1 34 16
+## 679 500107110 YouBike2.0_民權吉林路口(南側) 16 11
+## 680 500107111 YouBike2.0_長春龍江路口 24 7
+## 681 500107112 YouBike2.0_民權新生路口 26 1
+## 682 500107113 YouBike2.0_建國長春路口(北側) 30 19
+## 683 500107114 YouBike2.0_中山行政中心 30 19
+## 684 500107115 YouBike2.0_臺北市立美術館_1 30 27
+## 685 500107116 YouBike2.0_劍潭社區_1 42 24
+## 686 500107117 YouBike2.0_濱江國小游泳池 16 5
+## 687 500107118 YouBike2.0_林森公園 32 15
+## 688 500107119 YouBike2.0_中428公園 15 5
+## 689 500107120 YouBike2.0_復華公園 20 4
+## 690 500107121 YouBike2.0_新生民族路口(西南側) 15 13
+## 691 500107122 YouBike2.0_捷運南京復興站(1號出口) 21 1
+## 692 500107123 YouBike2.0_八德市場(北側) 26 9
+## 693 500107124 YouBike2.0_龍江朱崙街口 14 1
+## 694 500107125 YouBike2.0_大直街94巷 15 9
+## 695 500107126 YouBike2.0_捷運南京復興站(8號出口) 25 3
+## 696 500107127 YouBike2.0_民權建國路口(南側) 15 5
+## 697 500107128 YouBike2.0_林森德惠街口 16 6
+## 698 500107129 YouBike2.0_新生濱江街口(東南側) 21 9
+## 699 500107130 YouBike2.0_新生北路一段62巷口 20 9
+## 700 500107131 YouBike2.0_新生長春路口(東北側) 19 1
+## 701 500107132 YouBike2.0_捷運劍南路站(1號出口) 21 8
+## 702 500107133 YouBike2.0_敬業三樂群三路口(西北側) 16 1
+## 703 500107134 YouBike2.0_長春路258巷2弄口 15 15
+## 704 500107135 YouBike2.0_長寧大廈社區(南側) 15 13
+## 705 500107136 YouBike2.0_建國五常街口 20 12
+## 706 500107137 YouBike2.0_中山北路二段62巷口 12 4
+## 707 500107138 YouBike2.0_市民安東街口 20 11
+## 708 500107139 YouBike2.0_市民大道二段5巷口 15 3
+## 709 500107140 YouBike2.0_捷運中山站(3號出口) 21 0
+## 710 500107141 YouBike2.0_建國北路高架橋下停車場G區 18 4
+## 711 500107142 YouBike2.0_朱崙公園 20 8
+## 712 500107143 YouBike2.0_朱崙復興北路口 12 4
+## 713 500107144 YouBike2.0_捷運行天宮站(4號出口) 30 20
+## 714 500107145 YouBike2.0_建國北路三段86巷口 15 11
+## 715 500107146 YouBike2.0_正守公園 15 13
+## 716 500107147 YouBike2.0_四平松江路口 18 1
+## 717 500107148 YouBike2.0_金泰公園 16 4
+## 718 500107149 YouBike2.0_北安通北街口 17 13
+## 719 500107150 YouBike2.0_民權東復興北路口(西北側) 20 4
+## 720 500107151 YouBike2.0_臺北市立大同高中 22 1
+## 721 500107153 YouBike2.0_北安明水路口(自強隧道) 12 5
+## 722 500108001 YouBike2.0_文湖街21巷118弄口 28 15
+## 723 500108002 YouBike2.0_北勢湖環保公園 15 5
+## 724 500108003 YouBike2.0_洲子一號公園 43 4
+## 725 500108004 YouBike2.0_西康公園 16 10
+## 726 500108005 YouBike2.0_文湖國小 43 18
+## 727 500108006 YouBike2.0_文湖街81巷10號西側 14 9
+## 728 500108007 YouBike2.0_德明財經科技大學 27 17
+## 729 500108008 YouBike2.0_麗山國小 18 10
+## 730 500108009 YouBike2.0_麗山高中 33 7
+## 731 500108010 YouBike2.0_港華五號公園 16 13
+## 732 500108011 YouBike2.0_大湖國小 25 6
+## 733 500108012 YouBike2.0_安湖三號公園 12 3
+## 734 500108013 YouBike2.0_東湖路113巷95弄 10 7
+## 735 500108014 YouBike2.0_瑞光計程車服務站 20 10
+## 736 500108015 YouBike2.0_文德三號公園(江南街71巷16弄) 15 10
+## 737 500108016 YouBike2.0_捷運大湖公園站(2號出口) 28 5
+## 738 500108018 YouBike2.0_康寧星雲街口 12 8
+## 739 500108019 YouBike2.0_星雲街47號 15 5
+## 740 500108020 YouBike2.0_捷運西湖站(1號出口) 23 0
+## 741 500108021 YouBike2.0_捷運西湖站(2號出口) 19 9
+## 742 500108022 YouBike2.0_洲子二號公園 60 18
+## 743 500108023 YouBike2.0_港都公園 15 4
+## 744 500108024 YouBike2.0_環山路二段26巷口 22 9
+## 745 500108025 YouBike2.0_成功金龍路口 29 13
+## 746 500108026 YouBike2.0_碧山公園 31 9
+## 747 500108027 YouBike2.0_金瑞公園 30 16
+## 748 500108028 YouBike2.0_捷運文德站(2號出口) 49 1
+## 749 500108029 YouBike2.0_陽光公園 16 6
+## 750 500108030 YouBike2.0_文德二號公園(南側) 13 10
+## 751 500108031 YouBike2.0_文德二號公園(北側) 15 0
+## 752 500108032 YouBike2.0_瑞陽公園 12 7
+## 753 500108033 YouBike2.0_湖光國宅 37 12
+## 754 500108034 YouBike2.0_潭美街213號 12 8
+## 755 500108035 YouBike2.0_南京東路六段180號 21 11
+## 756 500108036 YouBike2.0_潭美國小(南京舊宗路口) 16 7
+## 757 500108037 YouBike2.0_新明路343號 10 6
+## 758 500108038 YouBike2.0_週美里活動廣場 17 15
+## 759 500108039 YouBike2.0_內湖行政中心 25 19
+## 760 500108040 YouBike2.0_樂康公園 20 14
+## 761 500108041 YouBike2.0_安康路32巷24弄 21 6
+## 762 500108043 YouBike2.0_明美公園 30 9
+## 763 500108044 YouBike2.0_南京東路六段368巷 47 16
+## 764 500108045 YouBike2.0_新明成功路口 30 12
+## 765 500108046 YouBike2.0_民權瑞光路口 32 7
+## 766 500108047 YouBike2.0_瑞光公共住宅(瑞光路) 18 6
+## 767 500108048 YouBike2.0_民權東路六段15巷 28 6
+## 768 500108049 YouBike2.0_扶輪親恩公園 30 14
+## 769 500108050 YouBike2.0_新湖三民善街口 15 2
+## 770 500108051 YouBike2.0_內湖119號綠地 24 14
+## 771 500108052 YouBike2.0_行善公園 20 1
+## 772 500108054 YouBike2.0_三軍總醫院 34 13
+## 773 500108055 YouBike2.0_福華商場 25 14
+## 774 500108056 YouBike2.0_臺北市網球中心 34 10
+## 775 500108057 YouBike2.0_捷運葫洲站(1號出口) 37 27
+## 776 500108058 YouBike2.0_麗湖國小 27 14
+## 777 500108059 YouBike2.0_金湖路347巷125弄口 15 6
+## 778 500108060 YouBike2.0_碧湖公園 25 1
+## 779 500108061 YouBike2.0_碧湖公園(內湖路二段103巷) 19 9
+## 780 500108062 YouBike2.0_貿七社區 17 13
+## 781 500108063 YouBike2.0_內湖區農會 12 6
+## 782 500108064 YouBike2.0_捷運內湖站(2號出口) 10 1
+## 783 500108065 YouBike2.0_康寧金湖路口 14 5
+## 784 500108066 YouBike2.0_康寧路一段156巷20弄口 17 6
+## 785 500108067 YouBike2.0_安康公園 19 11
+## 786 500108068 YouBike2.0_安泰街83巷 34 13
+## 787 500108069 YouBike2.0_內溝溪生態展示館 16 5
+## 788 500108070 YouBike2.0_捷運港墘站(2號出口) 47 3
+## 789 500108071 YouBike2.0_東湖國中 42 11
+## 790 500108072 YouBike2.0_石潭公園(安康路) 20 6
+## 791 500108073 YouBike2.0_內湖垃圾焚化廠 20 7
+## 792 500108074 YouBike2.0_康寧公園(北側) 20 9
+## 793 500108075 YouBike2.0_康寧路三段54巷口 15 5
+## 794 500108076 YouBike2.0_行善路25巷口 21 15
+## 795 500108077 YouBike2.0_新明路460巷口 15 3
+## 796 500108078 YouBike2.0_下灣公園 30 13
+## 797 500108079 YouBike2.0_民權東路六段245巷口 12 5
+## 798 500108081 YouBike2.0_東湖國小 29 17
+## 799 500108082 YouBike2.0_捷運內湖站(1號出口) 28 9
+## 800 500108083 YouBike2.0_瑞光港墘路口 30 21
+## 801 500108084 YouBike2.0_瑞湖陽光街口 34 7
+## 802 500108085 YouBike2.0_金龍公園 15 5
+## 803 500108086 YouBike2.0_星雲街138巷1弄口 15 6
+## 804 500108087 YouBike2.0_東湖一號公園 10 6
+## 805 500108088 YouBike2.0_東湖二號公園 15 11
+## 806 500108089 YouBike2.0_康湖二號公園(康寧醫院) 16 11
+## 807 500108090 YouBike2.0_堤頂大道新湖一路口 13 4
+## 808 500108091 YouBike2.0_下灣公園(成功路) 16 5
+## 809 500108092 YouBike2.0_舊宗行善路口 9 0
+## 810 500108093 YouBike2.0_新湖二路250巷口 20 3
+## 811 500108094 YouBike2.0_成功路四段41巷口 12 6
+## 812 500108095 YouBike2.0_金湖星雲街口 30 11
+## 813 500108096 YouBike2.0_國防醫學院 15 7
+## 814 500108097 YouBike2.0_民權東路六段190巷117弄口 15 9
+## 815 500108098 YouBike2.0_內湖運動中心 21 10
+## 816 500108099 YouBike2.0_九華公園 16 9
+## 817 500108100 YouBike2.0_內湖路二段179巷口 16 9
+## 818 500108102 YouBike2.0_行善行愛路口 12 2
+## 819 500108103 YouBike2.0_民善新湖二路口(家樂福內湖店) 23 0
+## 820 500108104 YouBike2.0_統振大樓 25 11
+## 821 500108105 YouBike2.0_陽光街161巷口 16 9
+## 822 500108106 YouBike2.0_潭美公園(南京東路六段368巷) 18 13
+## 823 500108107 YouBike2.0_西康二號公園 21 11
+## 824 500108108 YouBike2.0_三民國中(民權東路六段47巷) 13 3
+## 825 500108109 YouBike2.0_瑞光路76巷口 12 2
+## 826 500108110 YouBike2.0_捷運東湖站 35 11
+## 827 500108111 YouBike2.0_新湖國小 12 4
+## 828 500108112 YouBike2.0_碧山內湖路口 16 16
+## 829 500108115 YouBike2.0_民權東路六段413巷 16 4
+## 830 500108116 YouBike2.0_宏匯瑞光廣場(瑞光路) 16 9
+## 831 500108117 YouBike2.0_宏匯瑞光廣場(港墘路) 20 11
+## 832 500108118 YouBike2.0_康樂街151巷 14 8
+## 833 500108119 YouBike2.0_內湖路一段360巷 15 8
+## 834 500108120 YouBike2.0_成功路三段83號前 11 10
+## 835 500108121 YouBike2.0_內湖路一段47巷 16 5
+## 836 500108122 YouBike2.0_陽光舊宗路口 20 4
+## 837 500108123 YouBike2.0_安湖公園 8 6
+## 838 500108124 YouBike2.0_湖興公園 16 3
+## 839 500108126 YouBike2.0_安泰街(康樂橋下) 15 7
+## 840 500108127 YouBike2.0_康樂綠地 15 9
+## 841 500108128 YouBike2.0_捷運港墘站(1號出口) 23 8
+## 842 500108129 YouBike2.0_明美公園(行善路333巷) 16 12
+## 843 500108130 YouBike2.0_行善路383巷 17 8
+## 844 500108131 YouBike2.0_舊宗新湖三路口 18 8
+## 845 500108132 YouBike2.0_內湖運動公園 17 9
+## 846 500108133 YouBike2.0_內湖路三段326巷口 15 5
+## 847 500108134 YouBike2.0_成功公園 11 8
+## 848 500108135 YouBike2.0_康寧路三段189巷93弄口 14 6
+## 849 500108136 YouBike2.0_中國醫藥大學附設醫院臺北分院 13 2
+## 850 500108137 YouBike2.0_康樂抽水站 15 9
+## 851 500108138 YouBike2.0_環山路三段16巷口 13 5
+## 852 500108139 YouBike2.0_文德一號綠地 15 5
+## 853 500108140 YouBike2.0_臺北花市 30 2
+## 854 500108141 YouBike2.0_行善社會住宅 23 2
+## 855 500108142 YouBike2.0_康寧路三段99巷17弄口 15 8
+## 856 500108143 YouBike2.0_堤頂大道二段407巷口 15 6
+## 857 500108144 YouBike2.0_海德堡科技大樓 12 9
+## 858 500108145 YouBike2.0_致伸科技大樓 17 10
+## 859 500108146 YouBike2.0_內湖路一段288巷口 20 7
+## 860 500108147 YouBike2.0_大都會客運內湖站 15 12
+## 861 500108148 YouBike2.0_瑞湖公園 15 6
+## 862 500108150 YouBike2.0_台灣世曦大樓 16 3
+## 863 500108151 YouBike2.0_遠雄時代總部 14 2
+## 864 500108152 YouBike2.0_瑞光路358巷口 14 6
+## 865 500108153 YouBike2.0_大港墘公園(洲子街) 18 7
+## 866 500108154 YouBike2.0_世紀經貿 16 13
+## 867 500108156 YouBike2.0_民權東路六段56巷口 15 6
+## 868 500108157 YouBike2.0_新湖三行忠路72巷口 15 4
+## 869 500108158 YouBike2.0_新湖三新湖二146巷口 15 2
+## 870 500108159 YouBike2.0_舊宗新湖二路口 17 2
+## 871 500108160 YouBike2.0_新光基湖大樓 19 9
+## 872 500108161 YouBike2.0_內湖路一段120巷15弄 19 8
+## 873 500108162 YouBike2.0_北勢湖環保公園(堤頂大道側) 14 3
+## 874 500108164 YouBike2.0_達爾文大樓 15 6
+## 875 500108165 YouBike2.0_東湖四號公園 15 6
+## 876 500108166 YouBike2.0_加瑪科技中心 13 2
+## 877 500108167 YouBike2.0_福壽公園 14 9
+## 878 500108168 YouBike2.0_捷運西湖站(1號出口)內湖路側 13 1
+## 879 500108169 YouBike2.0_威剛科技總部 25 9
+## 880 500108170 YouBike2.0_太陽科技廣場 15 3
+## 881 500108171 YouBike2.0_瑞光路316巷 20 3
+## 882 500108172 YouBike2.0_文德路220巷口 15 8
+## 883 500108173 YouBike2.0_長壽抽水站 15 4
+## 884 500108174 YouBike2.0_捷運葫洲站(2號出口) 18 7
+## 885 500108175 YouBike2.0_五分埤 16 2
+## 886 500108176 YouBike2.0_環山路三段1巷(麗山高中) 18 9
+## 887 500108177 YouBike2.0_潭美公園(南京東路六段482號) 29 3
+## 888 500109001 YouBike2.0_承德路七段304巷口 20 15
+## 889 500109002 YouBike2.0_洲美運動公園 20 7
+## 890 500109003 YouBike2.0_榮華二明德路口 30 15
+## 891 500109004 YouBike2.0_捷運明德站(1號出口) 23 8
+## 892 500109005 YouBike2.0_文林建民路口 25 18
+## 893 500109006 YouBike2.0_永欣綠地 37 14
+## 894 500109007 YouBike2.0_關渡宮 40 31
+## 895 500109008 YouBike2.0_關渡自然公園 25 6
+## 896 500109009 YouBike2.0_關渡醫院 14 5
+## 897 500109010 YouBike2.0_捷運忠義站(1號出口) 30 15
+## 898 500109011 YouBike2.0_捷運關渡站(1號出口) 54 31
+## 899 500109012 YouBike2.0_捷運關渡站(2號出口) 14 1
+## 900 500109013 YouBike2.0_中央北路四段540巷口 27 12
+## 901 500109014 YouBike2.0_大度立德路口 18 13
+## 902 500109015 YouBike2.0_捷運復興崗站(1號出口) 45 12
+## 903 500109016 YouBike2.0_捷運復興崗站旅客服務中心 15 6
+## 904 500109017 YouBike2.0_豐年公園 20 9
+## 905 500109018 YouBike2.0_稻香重三路口 15 2
+## 906 500109019 YouBike2.0_國防大學政治作戰學院 45 23
+## 907 500109020 YouBike2.0_秀山區民活動中心 36 15
+## 908 500109022 YouBike2.0_大業大同街口 42 17
+## 909 500109023 YouBike2.0_捷運新北投站 42 26
+## 910 500109024 YouBike2.0_捷運北投站 30 6
+## 911 500109025 YouBike2.0_捷運奇岩站(三合街) 40 6
+## 912 500109026 YouBike2.0_八仙里辦公處 16 5
+## 913 500109027 YouBike2.0_清江國小 58 41
+## 914 500109028 YouBike2.0_大業路300巷口 20 6
+## 915 500109029 YouBike2.0_立農公園 21 16
+## 916 500109030 YouBike2.0_北投奇岩長青樂活大樓 15 1
+## 917 500109031 YouBike2.0_捷運唭哩岸站(2號出口) 54 29
+## 918 500109032 YouBike2.0_北投運動中心 60 10
+## 919 500109033 YouBike2.0_陽明大學 53 16
+## 920 500109034 YouBike2.0_捷運石牌站(2號出口) 62 40
+## 921 500109035 YouBike2.0_台北護理大學 42 9
+## 922 500109036 YouBike2.0_捷運石牌站(1號出口) 33 18
+## 923 500109037 YouBike2.0_振興醫院 36 11
+## 924 500109039 YouBike2.0_石牌國小 26 8
+## 925 500109040 YouBike2.0_振興公園 13 8
+## 926 500109041 YouBike2.0_立農國小 19 11
+## 927 500109042 YouBike2.0_承德路七段280巷口 17 10
+## 928 500109043 YouBike2.0_致遠一路二段11巷 22 13
+## 929 500109044 YouBike2.0_榮富公園 13 3
+## 930 500109045 YouBike2.0_中正高中 31 6
+## 931 500109046 YouBike2.0_立功立德路口 41 23
+## 932 500109047 YouBike2.0_中央北路四段30巷口 16 4
+## 933 500109048 YouBike2.0_陽明交大圖書館 37 13
+## 934 500109049 YouBike2.0_捷運新北投站(2號出口) 11 3
+## 935 500109050 YouBike2.0_復興公園 14 5
+## 936 500109051 YouBike2.0_承德石牌路口 17 3
+## 937 500109052 YouBike2.0_承德路七段188巷口 16 10
+## 938 500109053 YouBike2.0_捷運明德站(3號出口) 48 3
+## 939 500109054 YouBike2.0_大豐公園 39 22
+## 940 500109055 YouBike2.0_洲美公園 30 23
+## 941 500109056 YouBike2.0_中和街455巷11弄 13 4
+## 942 500109057 YouBike2.0_洲美蜆仔港公園 20 5
+## 943 500109058 YouBike2.0_文化三杏林一路口 17 11
+## 944 500109059 YouBike2.0_珠海復興一路口 15 10
+## 945 500109060 YouBike2.0_裕民二路33巷 15 8
+## 946 500109061 YouBike2.0_新奇岩社會住宅 12 8
+## 947 500109062 YouBike2.0_泉源公園 15 10
+## 948 500109063 YouBike2.0_奇岩4號綠地 12 8
+## 949 500109064 YouBike2.0_臺北健康護理大學(教研大樓) 15 5
+## 950 500109065 YouBike2.0_奇岩一號公園 24 0
+## 951 500109066 YouBike2.0_福星公園 18 2
+## 952 500109067 YouBike2.0_中庸公園 12 10
+## 953 500109068 YouBike2.0_豐年公園_1 33 17
+## 954 500109070 YouBike2.0_光明溫泉路口 20 12
+## 955 500109071 YouBike2.0_和信治癌中心醫院 18 8
+## 956 500109072 YouBike2.0_致遠新村 15 5
+## 957 500109073 YouBike2.0_北投公園露天溫泉 15 8
+## 958 500109074 YouBike2.0_中和街493巷9弄口 16 4
+## 959 500109075 YouBike2.0_捷運北投站(1號出口) 58 14
+## 960 500109076 YouBike2.0_石牌立農街口 29 3
+## 961 500109077 YouBike2.0_捷運唭哩岸站(1號出口) 20 13
+## 962 500109078 YouBike2.0_大興光明路2巷口 14 7
+## 963 500109079 YouBike2.0_捷運忠義站(2號出口) 20 11
+## 964 500109080 YouBike2.0_福國承德路口 15 10
+## 965 500109081 YouBike2.0_捷運北投站(1號出口)(北投路側) 31 0
+## 966 500109082 YouBike2.0_華固創富中心 15 5
+## 967 500109084 YouBike2.0_崇仰公園(公舘路255巷) 20 10
+## 968 500109085 YouBike2.0_北投文化公園(北側) 15 4
+## 969 500109086 YouBike2.0_中和綠地 13 4
+## 970 500109087 YouBike2.0_大業路65巷口 15 12
+## 971 500109088 YouBike2.0_公舘承德路口 17 9
+## 972 500109089 YouBike2.0_文林北明德路口(東北側) 15 5
+## 973 500109091 YouBike2.0_永興路一段32巷口 12 6
+## 974 500109093 YouBike2.0_關渡國中 24 16
+## 975 500109094 YouBike2.0_立功街55巷口 14 7
+## 976 500109095 YouBike2.0_承德路七段401巷(洲美橋下) 15 9
+## 977 500109096 YouBike2.0_大業路(農禪寺) 16 11
+## 978 500110002 YouBike2.0_捷運松山站(4號出口) 19 2
+## 979 500110003 YouBike2.0_塔悠八德路口 34 24
+## 980 500110004 YouBike2.0_鵬程公園 24 19
+## 981 500110005 YouBike2.0_中崙高中 50 13
+## 982 500110006 YouBike2.0_捷運南京三民站(2號出口) 19 0
+## 983 500110007 YouBike2.0_捷運南京三民站(1號出口) 39 1
+## 984 500110008 YouBike2.0_光復北路11巷口 23 3
+## 985 500110009 YouBike2.0_捷運南京三民站(4號出口) 13 2
+## 986 500110010 YouBike2.0_西松高中 14 7
+## 987 500110011 YouBike2.0_民權復興路口 36 5
+## 988 500110012 YouBike2.0_民福三號綠地 15 12
+## 989 500110013 YouBike2.0_民有一號公園 41 22
+## 990 500110014 YouBike2.0_民生敦化路口 66 52
+## 991 500110015 YouBike2.0_松基公園 20 1
+## 992 500110016 YouBike2.0_三民路166巷口 12 11
+## 993 500110017 YouBike2.0_民生活動中心 43 25
+## 994 500110018 YouBike2.0_捷運小巨蛋站(2號出口) 26 1
+## 995 500110019 YouBike2.0_臺北市藝文推廣處 45 16
+## 996 500110020 YouBike2.0_民生國小(敦化北路199巷) 20 18
+## 997 500110021 YouBike2.0_敦北公園 48 4
+## 998 500110022 YouBike2.0_民權運動公園 44 26
+## 999 500110023 YouBike2.0_新東公園 36 11
+## 1000 500110024 YouBike2.0_民生光復路口 33 25
+## 1001 500110025 YouBike2.0_三民公園 27 19
+## 1002 500110026 YouBike2.0_八德路三段74巷口 17 3
+## 1003 500110027 YouBike2.0_八德路三段8巷口 15 0
+## 1004 500110028 YouBike2.0_三軍總醫院(松山分院) 44 0
+## 1005 500110029 YouBike2.0_平安新城 16 11
+## 1006 500110030 YouBike2.0_健康社會住宅 20 7
+## 1007 500110031 YouBike2.0_民權光復路口(東北側) 24 8
+## 1008 500110032 YouBike2.0_市民東興路口 30 15
+## 1009 500110033 YouBike2.0_光復南路22巷口 29 24
+## 1010 500110034 YouBike2.0_光復南路58巷 12 9
+## 1011 500110035 YouBike2.0_松山新城 14 8
+## 1012 500110036 YouBike2.0_內政部營建署 33 19
+## 1013 500110037 YouBike2.0_南京光復路口 31 1
+## 1014 500110038 YouBike2.0_民生立體停車場 24 18
+## 1015 500110039 YouBike2.0_健康新城 44 28
+## 1016 500110040 YouBike2.0_健安新城 30 12
+## 1017 500110041 YouBike2.0_復盛公園 37 20
+## 1018 500110042 YouBike2.0_中崙福成宮 31 2
+## 1019 500110043 YouBike2.0_捷運南京復興站(7號出口) 15 8
+## 1020 500110044 YouBike2.0_捷運南京復興站(5號出口) 52 16
+## 1021 500110045 YouBike2.0_塔悠疏散門 32 12
+## 1022 500110046 YouBike2.0_臺北田徑場 47 26
+## 1023 500110047 YouBike2.0_捷運小巨蛋站(5號出口) 22 3
+## 1024 500110048 YouBike2.0_敦化長春路口 34 24
+## 1025 500110049 YouBike2.0_饒河疏散門(基四號疏散門) 19 2
+## 1026 500110050 YouBike2.0_捷運松山站(2號出口) 14 7
+## 1027 500110051 YouBike2.0_民權東路三段106巷口 22 7
+## 1028 500110052 YouBike2.0_南京東路五段59巷口 11 8
+## 1029 500110053 YouBike2.0_三民公園(塔悠路) 20 9
+## 1030 500110054 YouBike2.0_寶清公園 13 12
+## 1031 500110055 YouBike2.0_西松公園 11 7
+## 1032 500110056 YouBike2.0_長壽公園 15 11
+## 1033 500110057 YouBike2.0_復源公園 14 14
+## 1034 500110058 YouBike2.0_南京東路四段179巷口 13 6
+## 1035 500110059 YouBike2.0_臺北田徑場(北寧路側) 38 13
+## 1036 500110060 YouBike2.0_西松高中(健康路325巷) 31 10
+## 1037 500110061 YouBike2.0_南京東興路口 30 3
+## 1038 500110062 YouBike2.0_捷運松山站(3號出口) 52 5
+## 1039 500110063 YouBike2.0_介壽國中 12 12
+## 1040 500110064 YouBike2.0_敦化南京路口(東北側) 14 0
+## 1041 500110065 YouBike2.0_敦化八德路口 20 13
+## 1042 500110066 YouBike2.0_新東街51巷口 30 9
+## 1043 500110067 YouBike2.0_八德立體停車場 34 10
+## 1044 500110068 YouBike2.0_長春慶城街口 16 7
+## 1045 500110069 YouBike2.0_八德路四段652巷口 20 16
+## 1046 500110070 YouBike2.0_捷運松山站(1號出口) 15 5
+## 1047 500110071 YouBike2.0_捷運小巨蛋站(3號出口) 28 6
+## 1048 500110072 YouBike2.0_捷運小巨蛋站(5號出口)_1 20 0
+## 1049 500110073 YouBike2.0_敦化北路155巷口 30 1
+## 1050 500110074 YouBike2.0_民生復興路口 17 10
+## 1051 500110076 YouBike2.0_市民延吉街口 30 12
+## 1052 500110077 YouBike2.0_龍城市場 15 14
+## 1053 500110078 YouBike2.0_捷運南京三民站(3號出口) 28 0
+## 1054 500110079 YouBike2.0_塔悠基隆路口(麥帥一橋下) 20 5
+## 1055 500110080 YouBike2.0_五常街370巷 11 3
+## 1056 500110081 YouBike2.0_延壽街119巷口 15 14
+## 1057 500110082 YouBike2.0_市民東寧路口 15 4
+## 1058 500110083 YouBike2.0_民福簡易綠地 15 10
+## 1059 500110084 YouBike2.0_三民國小(撫遠街) 20 16
+## 1060 500110085 YouBike2.0_民生郵局 14 13
+## 1061 500110086 YouBike2.0_民權敦化路口(西北側) 24 7
+## 1062 500111001 YouBike2.0_南港公園(東新街) 20 7
+## 1063 500111002 YouBike2.0_南港公園(福德街) 56 48
+## 1064 500111003 YouBike2.0_捷運昆陽站(1號出口) 65 8
+## 1065 500111004 YouBike2.0_忠孝東路六段225巷口 35 30
+## 1066 500111005 YouBike2.0_捷運後山埤站(1號出口) 53 13
+## 1067 500111006 YouBike2.0_合樂公園 15 3
+## 1068 500111007 YouBike2.0_合心廣場 43 30
+## 1069 500111008 YouBike2.0_成德國中 44 9
+## 1070 500111009 YouBike2.0_玉成公園 36 13
+## 1071 500111010 YouBike2.0_研究院舊莊街口 30 11
+## 1072 500111011 YouBike2.0_中研院綜合體育館東側 30 20
+## 1073 500111012 YouBike2.0_國家生技園區 30 6
+## 1074 500111013 YouBike2.0_捷運南港展覽館站(5號出口) 73 3
+## 1075 500111014 YouBike2.0_中研公園 40 27
+## 1076 500111015 YouBike2.0_福山公園 25 25
+## 1077 500111016 YouBike2.0_舊莊區民活動中心 25 11
+## 1078 500111017 YouBike2.0_凌雲市場 25 13
+## 1079 500111018 YouBike2.0_市民大道八段532號 15 6
+## 1080 500111019 YouBike2.0_捷運南港軟體園區(2號出口) 37 20
+## 1081 500111020 YouBike2.0_南港國小 41 12
+## 1082 500111021 YouBike2.0_興中立體停車場(興中路) 26 18
+## 1083 500111022 YouBike2.0_臺北市立圖書館南港分館 40 25
+## 1084 500111023 YouBike2.0_東陽公園 30 23
+## 1085 500111024 YouBike2.0_向陽南港路口 27 9
+## 1086 500111025 YouBike2.0_南港車站(忠孝東路七段415巷) 11 9
+## 1087 500111026 YouBike2.0_捷運南港站(2號出口) 14 5
+## 1088 500111027 YouBike2.0_捷運南港站(1號出口) 20 11
+## 1089 500111028 YouBike2.0_東新國小 22 13
+## 1090 500111029 YouBike2.0_中華科技大學 20 5
+## 1091 500111030 YouBike2.0_六福公園 19 18
+## 1092 500111031 YouBike2.0_南港加壓站 24 7
+## 1093 500111032 YouBike2.0_臺北流行音樂中心(南港路) 21 11
+## 1094 500111033 YouBike2.0_興南公園 26 19
+## 1095 500111034 YouBike2.0_臺北流行音樂中心(市民大道) 21 2
+## 1096 500111035 YouBike2.0_南港車站(市民大道) 30 5
+## 1097 500111036 YouBike2.0_忠孝東路七段527巷口 15 9
+## 1098 500111037 YouBike2.0_南港軟體園區(新民街) 19 11
+## 1099 500111038 YouBike2.0_世貿公園 35 8
+## 1100 500111039 YouBike2.0_凌雲五村(研究院路三段8巷) 26 25
+## 1101 500111040 YouBike2.0_新新公園(昆陽街60巷) 20 16
+## 1102 500111041 YouBike2.0_南港高中(昆陽街) 14 10
+## 1103 500111042 YouBike2.0_南港路三段290巷口 20 11
+## 1104 500111043 YouBike2.0_南港路三段220巷口 25 9
+## 1105 500111044 YouBike2.0_南港東新街口 28 11
+## 1106 500111045 YouBike2.0_八德中坡路口 40 24
+## 1107 500111046 YouBike2.0_捷運後山埤站(3號出口) 12 0
+## 1108 500111047 YouBike2.0_玉成公園運動中心 15 7
+## 1109 500111048 YouBike2.0_百福公園 18 14
+## 1110 500111049 YouBike2.0_南湖大橋(經貿二路255巷) 20 11
+## 1111 500111050 YouBike2.0_園區重陽路口 13 11
+## 1112 500111051 YouBike2.0_南港車站B棟(市民大道) 16 7
+## 1113 500111052 YouBike2.0_胡適公園 20 10
+## 1114 500111053 YouBike2.0_南港抽水站 13 9
+## 1115 500111054 YouBike2.0_經貿公園 20 16
+## 1116 500111055 YouBike2.0_育成高中 20 7
+## 1117 500111056 YouBike2.0_捷運南港展覽館站(7號出口) 20 7
+## 1118 500111057 YouBike2.0_力行橋(南港) 18 5
+## 1119 500111058 YouBike2.0_舊莊國小(舊莊街一段) 15 3
+## 1120 500111059 YouBike2.0_向陽公園 17 6
+## 1121 500111060 YouBike2.0_小彎社會住宅 51 28
+## 1122 500111061 YouBike2.0_捷運南港展覽館站(6號出口) 25 8
+## 1123 500111062 YouBike2.0_捷運南港展覽館站(4號出口) 22 12
+## 1124 500111063 YouBike2.0_成德綠地 17 10
+## 1125 500111064 YouBike2.0_南港公園(東新街170巷) 16 6
+## 1126 500111065 YouBike2.0_中坡市民路口(東北側) 19 12
+## 1127 500111066 YouBike2.0_昆陽公園 14 8
+## 1128 500111067 YouBike2.0_南港路二段178巷口 18 12
+## 1129 500111068 YouBike2.0_南港車站(忠孝東路) 24 20
+## 1130 500111069 YouBike2.0_南港車站(興華路) 48 14
+## 1131 500111070 YouBike2.0_玉成公園(成福路178巷口) 18 8
+## 1132 500111071 YouBike2.0_玉東公園(東新街) 14 11
+## 1133 500111072 YouBike2.0_南港出租國宅社區 25 14
+## 1134 500111073 YouBike2.0_成福路197巷口 15 8
+## 1135 500111074 YouBike2.0_南港疏散門(基三號疏散門) 15 11
+## 1136 500111075 YouBike2.0_成德立體停車場 14 7
+## 1137 500111076 YouBike2.0_南港展覽館2館 18 8
+## 1138 500111077 YouBike2.0_舊莊派出所 15 10
+## 1139 500111078 YouBike2.0_南港路三段80巷 15 10
+## 1140 500111079 YouBike2.0_捷運昆陽站(4號出口) 28 2
+## 1141 500111080 YouBike2.0_忠孝東路六段278巷口 14 4
+## 1142 500111081 YouBike2.0_中研院人文社會科學館 20 0
+## 1143 500111082 YouBike2.0_南港路三段130巷口 12 12
+## 1144 500111083 YouBike2.0_南港路三段190巷口 16 14
+## 1145 500111084 YouBike2.0_忠孝東路六段212巷口 15 15
+## 1146 500111085 YouBike2.0_新富公園 13 0
+## 1147 500111086 YouBike2.0_東新街63巷口 15 10
+## 1148 500111087 YouBike2.0_中興公園 15 10
+## 1149 500111088 YouBike2.0_向陽市民大道路口(西北側) 13 4
+## 1150 500111089 YouBike2.0_向陽南港路口(西北側) 16 3
+## 1151 500111090 YouBike2.0_研究院路一段151巷口 14 5
+## 1152 500111113 YouBike2.0_內湖機廠(港東街) 15 11
+## 1153 500112001 YouBike2.0_黎忠區民活動中心 16 11
+## 1154 500112002 YouBike2.0_基隆路二段159巷口 14 14
+## 1155 500112003 YouBike2.0_嘉興街175巷口 16 12
+## 1156 500112004 YouBike2.0_和平東路三段631巷口 15 5
+## 1157 500112005 YouBike2.0_和平東路三段530巷口 15 4
+## 1158 500112006 YouBike2.0_景勤二號公園 41 15
+## 1159 500112007 YouBike2.0_臺北醫學大學 64 7
+## 1160 500112008 YouBike2.0_三興公園 47 29
+## 1161 500112009 YouBike2.0_松德站 48 35
+## 1162 500112010 YouBike2.0_捷運象山站(2號出口) 31 0
+## 1163 500112011 YouBike2.0_象山公園 48 0
+## 1164 500112012 YouBike2.0_松仁路253巷3弄 25 19
+## 1165 500112013 YouBike2.0_興雅國中 18 7
+## 1166 500112014 YouBike2.0_捷運象山站(1號出口) 24 1
+## 1167 500112015 YouBike2.0_松德路200巷 41 21
+## 1168 500112016 YouBike2.0_中全公園 34 15
+## 1169 500112017 YouBike2.0_台北市災害應變中心 53 32
+## 1170 500112018 YouBike2.0_信義運動中心 35 9
+## 1171 500112019 YouBike2.0_捷運台北101/世貿站(3號出口) 15 0
+## 1172 500112020 YouBike2.0_景新公園 17 8
+## 1173 500112021 YouBike2.0_光復信義路口東南側 16 13
+## 1174 500112022 YouBike2.0_三張犁 56 15
+## 1175 500112023 YouBike2.0_仁愛路四段496巷口 34 8
+## 1176 500112024 YouBike2.0_松山工農 34 10
+## 1177 500112025 YouBike2.0_松友公園 31 20
+## 1178 500112026 YouBike2.0_林口公園 51 28
+## 1179 500112027 YouBike2.0_松山家商 25 4
+## 1180 500112028 YouBike2.0_永春陂濕地公園 23 22
+## 1181 500112029 YouBike2.0_臺北市政府 63 19
+## 1182 500112030 YouBike2.0_松智松壽路口 39 20
+## 1183 500112031 YouBike2.0_市府松壽路口 28 14
+## 1184 500112032 YouBike2.0_市府松高路口 54 12
+## 1185 500112033 YouBike2.0_市民廣場 44 2
+## 1186 500112035 YouBike2.0_信義廣場(台北101) 96 27
+## 1187 500112036 YouBike2.0_捷運台北101/世貿站(5號出口) 15 0
+## 1188 500112037 YouBike2.0_春光公園 41 15
+## 1189 500112038 YouBike2.0_松仁路121巷口 31 9
+## 1190 500112039 YouBike2.0_福德國小 36 20
+## 1191 500112040 YouBike2.0_福德公園 35 31
+## 1192 500112042 YouBike2.0_松高路(信義新天地A4館) 17 0
+## 1193 500112043 YouBike2.0_興雅松仁路口 65 8
+## 1194 500112044 YouBike2.0_福祥公園 19 16
+## 1195 500112045 YouBike2.0_吳興公車總站 56 44
+## 1196 500112046 YouBike2.0_泰和公園 40 15
+## 1197 500112047 YouBike2.0_興雅國小(基隆路一段37巷) 27 19
+## 1198 500112048 YouBike2.0_雅祥公園(松信路50巷口) 12 8
+## 1199 500112049 YouBike2.0_松山車站 70 19
+## 1200 500112050 YouBike2.0_五常公園 37 29
+## 1201 500112051 YouBike2.0_永吉松信路口 35 21
+## 1202 500112052 YouBike2.0_三興國小 22 8
+## 1203 500112053 YouBike2.0_市民松信路口 20 19
+## 1204 500112054 YouBike2.0_松山高中 42 0
+## 1205 500112055 YouBike2.0_基隆光復路口 31 6
+## 1206 500112056 YouBike2.0_基隆忠孝路口西南側 14 0
+## 1207 500112057 YouBike2.0_泰和里民活動中心 18 2
+## 1208 500112058 YouBike2.0_捷運後山埤站(2號出口) 22 1
+## 1209 500112059 YouBike2.0_虎林永吉路口 15 6
+## 1210 500112060 YouBike2.0_永吉公園 18 7
+## 1211 500112061 YouBike2.0_永吉路321巷口 15 5
+## 1212 500112062 YouBike2.0_松山永吉路口 20 11
+## 1213 500112063 YouBike2.0_松山路292巷口 17 11
+## 1214 500112064 YouBike2.0_捷運象山站(3號出口) 51 13
+## 1215 500112065 YouBike2.0_松德公園 40 12
+## 1216 500112066 YouBike2.0_世貿三館 54 11
+## 1217 500112067 YouBike2.0_松德虎林街口 30 20
+## 1218 500112068 YouBike2.0_富台公園 32 10
+## 1219 500112069 YouBike2.0_基隆路一段101巷口 32 20
+## 1220 500112070 YouBike2.0_捷運永春站(2號出口) 30 0
+## 1221 500112071 YouBike2.0_吳興街260巷 32 10
+## 1222 500112072 YouBike2.0_松山家商(林口街) 47 22
+## 1223 500112073 YouBike2.0_仁愛逸仙路口 38 6
+## 1224 500112074 YouBike2.0_安強公園 20 16
+## 1225 500112075 YouBike2.0_信義基隆路口 26 1
+## 1226 500112076 YouBike2.0_捷運台北101/世貿站(2號出口) 52 2
+## 1227 500112078 YouBike2.0_吳興街284巷36弄口 25 13
+## 1228 500112079 YouBike2.0_協和祐德高級中學 20 5
+## 1229 500112080 YouBike2.0_福德國小公車站 10 10
+## 1230 500112081 YouBike2.0_松仁路95巷口 60 22
+## 1231 500112082 YouBike2.0_臺北南山廣場_1 68 14
+## 1232 500112083 YouBike2.0_景聯廣場 13 0
+## 1233 500112084 YouBike2.0_景平公園 13 8
+## 1234 500112085 YouBike2.0_捷運市政府站(3號出口) 92 2
+## 1235 500112086 YouBike2.0_五分埔公園 18 7
+## 1236 500112087 YouBike2.0_松仁路305號 14 11
+## 1237 500112088 YouBike2.0_吳興街394巷口 12 7
+## 1238 500112089 YouBike2.0_忠孝東路五段215巷口 24 14
+## 1239 500112090 YouBike2.0_松勤莊敬路口 15 0
+## 1240 500112091 YouBike2.0_松仁松平路口 10 4
+## 1241 500112092 YouBike2.0_信義松德路口 18 16
+## 1242 500112093 YouBike2.0_捷運市政府站(4號出口) 14 0
+## 1243 500112094 YouBike2.0_吳興街284巷(廣安宮) 15 12
+## 1244 500112095 YouBike2.0_景勤二號公園(西南側) 22 18
+## 1245 500112096 YouBike2.0_克勤新村 18 10
+## 1246 500112097 YouBike2.0_和平東路三段291號 15 14
+## 1247 500112098 YouBike2.0_永吉路468巷口 13 9
+## 1248 500112099 YouBike2.0_廣慈博愛園區(西側) 23 14
+## 1249 500112100 YouBike2.0_和平東路三段341巷口 16 12
+## 1250 500112101 YouBike2.0_革新公園 14 2
+## 1251 500112102 YouBike2.0_黎雙公園 17 11
+## 1252 500112103 YouBike2.0_臺北文化體育園區辦公大樓 33 1
+## 1253 500112104 YouBike2.0_捷運國父紀念館站(5號出口) 23 0
+## 1254 500112105 YouBike2.0_光復南菸廠路口 25 1
+## 1255 500112106 YouBike2.0_中坡北永吉路口 15 7
+## 1256 500112107 YouBike2.0_松仁路281巷66弄 20 14
+## 1257 500112108 YouBike2.0_基隆市民路口 26 16
+## 1258 500113001 YouBike2.0_德昌寶興街口(西北角) 14 2
+## 1259 500113002 YouBike2.0_寶興長泰街口(西南角) 17 4
+## 1260 500113003 YouBike2.0_萬大路486巷口 10 4
+## 1261 500113004 YouBike2.0_國興中華路口 14 5
+## 1262 500113005 YouBike2.0_古亭國中 25 16
+## 1263 500113006 YouBike2.0_國興水源路口 14 4
+## 1264 500113007 YouBike2.0_青年公園高爾夫球場 16 7
+## 1265 500113008 YouBike2.0_國興青年路口 43 26
+## 1266 500113009 YouBike2.0_青年公園棒球場 28 9
+## 1267 500113010 YouBike2.0_青年公園籃球場 16 9
+## 1268 500113012 YouBike2.0_復華花園新城 38 24
+## 1269 500113013 YouBike2.0_新和國小 20 11
+## 1270 500113014 YouBike2.0_莒光郵局 16 3
+## 1271 500113015 YouBike2.0_莒光立體停車場 10 4
+## 1272 500113016 YouBike2.0_艋舺大道146巷口 14 4
+## 1273 500113017 YouBike2.0_東園國小 33 18
+## 1274 500113018 YouBike2.0_華中疏散門 12 1
+## 1275 500113019 YouBike2.0_錦德公園 29 15
+## 1276 500113020 YouBike2.0_忠德公園 19 10
+## 1277 500113022 YouBike2.0_華江高中 50 36
+## 1278 500113023 YouBike2.0_西園艋舺路口 50 17
+## 1279 500113025 YouBike2.0_雙園國中 24 12
+## 1280 500113026 YouBike2.0_長順區民活動中心 26 15
+## 1281 500113027 YouBike2.0_華江國小 23 13
+## 1282 500113028 YouBike2.0_華江八號公園 20 15
+## 1283 500113029 YouBike2.0_環河南雙園街口 15 6
+## 1284 500113030 YouBike2.0_大理高中 35 20
+## 1285 500113031 YouBike2.0_糖廍文化園區 14 9
+## 1286 500113032 YouBike2.0_兩棵樹公園 19 9
+## 1287 500113033 YouBike2.0_萬華青年公宅 23 11
+## 1288 500113034 YouBike2.0_開封西寧路口 41 22
+## 1289 500113035 YouBike2.0_峨眉停車場 47 9
+## 1290 500113036 YouBike2.0_長沙公園 30 5
+## 1291 500113037 YouBike2.0_貓公園(中興橋頭) 15 0
+## 1292 500113038 YouBike2.0_西本願寺廣場 87 1
+## 1293 500113039 YouBike2.0_中華桂林路口 34 7
+## 1294 500113040 YouBike2.0_捷運龍山寺站(1號出口) 30 2
+## 1295 500113041 YouBike2.0_龍山國小 30 11
+## 1296 500113042 YouBike2.0_華西公園 39 24
+## 1297 500113043 YouBike2.0_老松國小 50 31
+## 1298 500113044 YouBike2.0_萬華火車站 53 15
+## 1299 500113045 YouBike2.0_萬華火車站(D2廣場) 17 2
+## 1300 500113046 YouBike2.0_捷運龍山寺站(3號出口) 23 0
+## 1301 500113047 YouBike2.0_臺北市電影主題公園(峨眉街) 15 2
+## 1302 500113048 YouBike2.0_臺北市電影主題公園(康定路) 15 5
+## 1303 500113049 YouBike2.0_中華峨眉街口 24 12
+## 1304 500113050 YouBike2.0_萬華266號綠地 15 8
+## 1305 500113051 YouBike2.0_萬大國小(萬大路344巷口) 18 1
+## 1306 500113052 YouBike2.0_德昌街10巷口 10 6
+## 1307 500113053 YouBike2.0_環河南和平西路口 20 15
+## 1308 500113054 YouBike2.0_長順街60巷口 15 7
+## 1309 500113055 YouBike2.0_西園公園 14 6
+## 1310 500113056 YouBike2.0_華江污水廠 20 20
+## 1311 500113057 YouBike2.0_柳鄉公園 15 15
+## 1312 500113058 YouBike2.0_綠堤社區公園 22 14
+## 1313 500113059 YouBike2.0_長順艋舺大道口 26 20
+## 1314 500113060 YouBike2.0_富民路145巷口 20 6
+## 1315 500113061 YouBike2.0_環南綜合市場 14 4
+## 1316 500113062 YouBike2.0_龍山國中 15 8
+## 1317 500113063 YouBike2.0_洛陽停車場 22 16
+## 1318 500113064 YouBike2.0_桂林昆明街口 20 16
+## 1319 500113065 YouBike2.0_萬華國中_1 36 7
+## 1320 500113066 YouBike2.0_青年公園3號出口 38 15
+## 1321 500113068 YouBike2.0_捷運龍山寺站(1號出口)_1 49 31
+## 1322 500113069 YouBike2.0_莒光社會住宅 30 21
+## 1323 500113070 YouBike2.0_艋舺西藏路口 20 5
+## 1324 500113071 YouBike2.0_萬大路493巷 10 10
+## 1325 500113072 YouBike2.0_雙園國中地下停車場 12 8
+## 1326 500113073 YouBike2.0_青年路152巷口 16 9
+## 1327 500113074 YouBike2.0_和平西路二段190巷口 15 11
+## 1328 500113075 YouBike2.0_萬大路424巷口 15 5
+## 1329 500113077 YouBike2.0_長泰街52巷口 15 5
+## 1330 500113078 YouBike2.0_水源青年路口 24 7
+## 1331 500113079 YouBike2.0_青年公園4號出口 24 7
+## 1332 500113080 YouBike2.0_祥安水岸景觀大廈 15 4
+## 1333 500113081 YouBike2.0_大理高中(西藏路) 19 11
+## 1334 500113085 YouBike2.0_艋舺雙園街口 14 13
+## 1335 500113086 YouBike2.0_德昌街125巷口 15 5
+## 1336 500119005 YouBike2.0_臺大水源舍區A棟 37 20
+## 1337 500119006 YouBike2.0_臺大卓越研究大樓 32 22
+## 1338 500119007 YouBike2.0_臺大水源修齊會館 18 0
+## 1339 500119008 YouBike2.0_臺大檔案展示館 10 6
+## 1340 500119009 YouBike2.0_臺大水源舍區B棟 30 27
+## 1341 500119043 YouBike2.0_臺大男八舍東側 42 40
+## 1342 500119044 YouBike2.0_臺大禮賢樓東南側 23 13
+## 1343 500119045 YouBike2.0_臺大農業陳列館北側 45 15
+## 1344 500119046 YouBike2.0_臺大管理學院二館北側 40 1
+## 1345 500119047 YouBike2.0_臺大土木系館 30 0
+## 1346 500119048 YouBike2.0_臺大大一女舍北側 53 0
+## 1347 500119049 YouBike2.0_臺大女九舍西南側 62 6
+## 1348 500119050 YouBike2.0_臺大小福樓東側 31 0
+## 1349 500119051 YouBike2.0_臺大立體機車停車場 27 6
+## 1350 500119052 YouBike2.0_臺大工綜館南側 26 3
+## 1351 500119053 YouBike2.0_臺大天文數學館南側 19 7
+## 1352 500119054 YouBike2.0_臺大心理系館南側 30 3
+## 1353 500119055 YouBike2.0_臺大樂學館東側 28 2
+## 1354 500119056 YouBike2.0_臺大農化新館西側 10 5
+## 1355 500119057 YouBike2.0_臺大五號館西側 20 1
+## 1356 500119058 YouBike2.0_臺大舊體育館西側 33 2
+## 1357 500119059 YouBike2.0_臺大共同教室北側 20 0
+## 1358 500119060 YouBike2.0_臺大共同教室東南側 12 0
+## 1359 500119061 YouBike2.0_臺大鹿鳴堂東側 27 5
+## 1360 500119062 YouBike2.0_臺大公館停車場西北側 12 3
+## 1361 500119063 YouBike2.0_臺大第二行政大樓南側 27 15
+## 1362 500119064 YouBike2.0_臺大明達館機車停車場 28 11
+## 1363 500119065 YouBike2.0_臺大二號館 10 0
+## 1364 500119066 YouBike2.0_臺大凝態館南側 20 4
+## 1365 500119067 YouBike2.0_臺大社科院西側 42 3
+## 1366 500119068 YouBike2.0_臺大社會系館南側 39 16
+## 1367 500119069 YouBike2.0_臺大思亮館東南側 10 3
+## 1368 500119070 YouBike2.0_臺大椰林小舖 48 1
+## 1369 500119071 YouBike2.0_臺大計資中心南側 34 6
+## 1370 500119072 YouBike2.0_臺大原分所北側 12 6
+## 1371 500119074 YouBike2.0_臺大生命科學館西北側 30 14
+## 1372 500119075 YouBike2.0_臺大第一活動中心西南側 40 11
+## 1373 500119076 YouBike2.0_臺大博理館西側 22 2
+## 1374 500119077 YouBike2.0_臺大博雅館西側 56 11
+## 1375 500119078 YouBike2.0_臺大森林館北側 10 4
+## 1376 500119079 YouBike2.0_臺大一號館 19 1
+## 1377 500119080 YouBike2.0_臺大小小福西南側 10 1
+## 1378 500119081 YouBike2.0_臺大教研館北側 11 2
+## 1379 500119082 YouBike2.0_臺大四號館東北側 10 2
+## 1380 500119083 YouBike2.0_臺大新生教室南側 18 4
+## 1381 500119084 YouBike2.0_臺大鄭江樓北側 10 0
+## 1382 500119085 YouBike2.0_臺大電機二館東南側 14 6
+## 1383 500119086 YouBike2.0_臺大圖資系館北側 25 1
+## 1384 500119087 YouBike2.0_臺大總圖書館西南側 30 2
+## 1385 500119088 YouBike2.0_臺大黑森林西側 20 20
+## 1386 500119089 YouBike2.0_臺大獸醫館南側 24 2
+## 1387 500119090 YouBike2.0_臺大新體育館東南側 40 4
+## 1388 500119091 YouBike2.0_臺大明達館北側(員工宿舍) 18 2
+## sarea mday lat lng
+## 1 大安區 2024-03-31 23:09:14 25.02605 121.5436
+## 2 大安區 2024-03-31 23:02:18 25.02565 121.5436
+## 3 大安區 2024-03-31 22:26:18 25.02429 121.5412
+## 4 大安區 2024-03-31 23:01:14 25.02351 121.5428
+## 5 大安區 2024-03-31 22:50:25 25.02153 121.5430
+## 6 大安區 2024-03-31 22:46:18 25.02429 121.5433
+## 7 大安區 2024-03-31 22:29:18 25.02253 121.5433
+## 8 大安區 2024-03-31 22:32:18 25.02112 121.5341
+## 9 大安區 2024-03-31 23:09:14 25.01976 121.5338
+## 10 大安區 2024-03-31 23:08:18 25.01894 121.5336
+## 11 大安區 2024-03-31 21:53:13 25.01986 121.5298
+## 12 大安區 2024-03-31 23:07:17 25.02543 121.5433
+## 13 大安區 2024-03-31 23:08:19 25.01717 121.5320
+## 14 大安區 2024-03-31 22:56:19 25.02035 121.5464
+## 15 大安區 2024-03-31 23:08:18 25.01927 121.5299
+## 16 大安區 2024-03-31 23:03:14 25.01895 121.5316
+## 17 大安區 2024-03-31 22:40:21 25.02446 121.5467
+## 18 大安區 2024-01-14 04:17:15 25.02093 121.5331
+## 19 大安區 2024-03-31 23:09:18 25.01385 121.5355
+## 20 大安區 2024-03-31 23:01:35 25.01491 121.5344
+## 21 大安區 2024-03-31 22:38:17 25.01244 121.5366
+## 22 大安區 2024-03-31 23:04:18 25.01451 121.5414
+## 23 大安區 2024-03-31 22:58:18 25.01295 121.5397
+## 24 大安區 2024-03-31 22:45:14 25.01137 121.5406
+## 25 大安區 2024-03-31 23:07:18 25.01182 121.5417
+## 26 大安區 2024-03-31 22:49:18 25.01426 121.5438
+## 27 大安區 2024-03-31 22:44:17 25.01234 121.5450
+## 28 大安區 2024-03-31 23:05:19 25.01360 121.5466
+## 29 大安區 2024-03-31 23:08:19 25.01537 121.5470
+## 30 大安區 2024-03-31 23:08:14 25.01637 121.5453
+## 31 大安區 2024-03-31 23:07:17 25.01664 121.5452
+## 32 大安區 2024-03-31 22:10:31 25.01576 121.5429
+## 33 大安區 2024-03-31 22:34:17 25.01787 121.5476
+## 34 大安區 2024-03-31 22:59:17 25.02032 121.5450
+## 35 大安區 2024-03-31 22:57:19 25.02076 121.5443
+## 36 大安區 2024-03-31 22:46:14 25.02101 121.5428
+## 37 大安區 2024-03-31 22:31:08 25.02104 121.5408
+## 38 大安區 2024-03-31 21:45:18 25.02220 121.5363
+## 39 大安區 2024-03-31 23:03:17 25.02218 121.5347
+## 40 大安區 2024-03-31 22:49:14 25.01727 121.5447
+## 41 大安區 2024-03-31 22:54:18 25.02286 121.5466
+## 42 大安區 2024-03-31 21:45:19 25.02164 121.5470
+## 43 大安區 2024-03-31 22:21:21 25.02147 121.5441
+## 44 大安區 2024-03-31 22:52:18 25.02193 121.5316
+## 45 大安區 2024-03-31 23:08:19 25.01890 121.5501
+## 46 大安區 2024-03-31 22:32:14 25.01856 121.5556
+## 47 大安區 2024-03-31 22:21:21 25.01623 121.5504
+## 48 大安區 2024-03-31 23:04:18 25.02100 121.5521
+## 49 大安區 2024-03-31 22:57:19 25.01810 121.5593
+## 50 大安區 2024-03-31 23:07:18 25.02397 121.5527
+## 51 大安區 2024-03-31 23:04:18 25.02705 121.5555
+## 52 大安區 2024-03-31 23:09:17 25.02694 121.5533
+## 53 大安區 2024-03-31 22:59:18 25.02021 121.5294
+## 54 大安區 2024-03-31 23:08:18 25.02669 121.5253
+## 55 大安區 2024-03-31 23:08:14 25.02638 121.5297
+## 56 大安區 2024-03-31 23:09:14 25.02621 121.5317
+## 57 大安區 2024-03-31 23:09:17 25.02660 121.5297
+## 58 大安區 2024-03-31 23:03:18 25.02760 121.5222
+## 59 大安區 2024-03-31 23:07:14 25.02715 121.5229
+## 60 大安區 2024-03-31 23:01:14 25.02895 121.5379
+## 61 大安區 2024-03-31 23:04:18 25.02657 121.5352
+## 62 大安區 2024-03-31 23:09:18 25.02606 121.5374
+## 63 大安區 2024-03-31 23:01:19 25.02984 121.5311
+## 64 大安區 2024-03-31 22:56:19 25.03383 121.5281
+## 65 大安區 2024-03-31 23:05:19 25.03519 121.5245
+## 66 大安區 2024-03-31 22:37:18 25.03325 121.5244
+## 67 大安區 2024-03-31 23:09:17 25.03164 121.5266
+## 68 大安區 2024-03-31 21:25:19 25.02370 121.5490
+## 69 大安區 2024-03-31 23:04:18 25.02215 121.5484
+## 70 大安區 2024-03-31 22:43:17 25.02721 121.5499
+## 71 大安區 2024-03-31 23:09:17 25.02952 121.5541
+## 72 大安區 2024-03-31 23:03:17 25.02931 121.5572
+## 73 大安區 2024-03-02 02:25:18 25.04177 121.5383
+## 74 大安區 2024-03-31 23:03:18 25.04003 121.5330
+## 75 大安區 2024-03-31 23:09:18 25.03753 121.5352
+## 76 大安區 2024-03-31 22:53:18 25.03534 121.5354
+## 77 大安區 2024-03-31 23:09:17 25.03701 121.5435
+## 78 大安區 2024-03-31 23:08:18 25.03935 121.5383
+## 79 大安區 2024-03-31 23:03:17 25.04035 121.5436
+## 80 大安區 2024-03-31 23:05:18 25.03320 121.5439
+## 81 大安區 2024-03-31 21:39:14 25.03358 121.5414
+## 82 大安區 2024-03-31 22:59:18 25.03317 121.5464
+## 83 大安區 2024-03-31 23:08:19 25.04092 121.5482
+## 84 大安區 2024-03-31 23:01:14 25.03754 121.5529
+## 85 大安區 2024-03-31 23:08:19 25.03333 121.5498
+## 86 大安區 2024-03-31 22:29:19 25.03706 121.5517
+## 87 大安區 2024-03-31 23:09:17 25.03304 121.5517
+## 88 大安區 2024-03-31 22:46:18 25.04463 121.5366
+## 89 大安區 2024-03-31 23:04:18 25.04448 121.5395
+## 90 大安區 2024-03-31 23:04:18 25.03332 121.5344
+## 91 大安區 2024-03-31 23:07:18 25.03318 121.5572
+## 92 大安區 2024-03-31 22:43:13 25.03513 121.5561
+## 93 大安區 2024-03-31 22:42:14 25.03910 121.5569
+## 94 大安區 2024-03-31 22:40:26 25.03635 121.5383
+## 95 大安區 2024-03-31 22:53:18 25.04091 121.5329
+## 96 大安區 2024-03-31 23:09:17 25.04239 121.5332
+## 97 大安區 2024-03-31 23:07:18 25.03126 121.5434
+## 98 大安區 2024-03-31 22:56:19 25.04189 121.5338
+## 99 大安區 2024-03-30 08:59:14 25.04201 121.5461
+## 100 大安區 2024-03-31 23:05:19 25.04405 121.5486
+## 101 大安區 2024-03-31 23:09:17 25.03336 121.5364
+## 102 大安區 2024-03-31 22:50:25 25.03280 121.5375
+## 103 大安區 2024-03-31 22:38:17 25.03569 121.5451
+## 104 大安區 2024-03-31 22:19:19 25.03473 121.5477
+## 105 大安區 2024-01-14 04:19:10 25.04262 121.5444
+## 106 大安區 2024-03-31 22:23:14 25.04153 121.5524
+## 107 大安區 2024-03-31 22:53:14 25.04159 121.5494
+## 108 大安區 2024-03-31 23:09:17 25.02979 121.5405
+## 109 大安區 2024-03-31 23:01:20 25.02770 121.5513
+## 110 大安區 2024-03-31 23:05:18 25.02469 121.5446
+## 111 大安區 2024-03-31 23:04:18 25.04122 121.5575
+## 112 大安區 2024-03-31 22:56:19 25.03756 121.5459
+## 113 大安區 2024-03-31 23:08:19 25.03305 121.5538
+## 114 大安區 2024-03-31 23:04:18 25.02681 121.5467
+## 115 大安區 2024-03-31 22:49:18 25.03748 121.5556
+## 116 大安區 2024-03-31 23:08:18 25.03331 121.5526
+## 117 大安區 2024-03-31 22:56:19 25.02870 121.5490
+## 118 大安區 2024-03-31 23:08:18 25.02861 121.5434
+## 119 大安區 2024-03-31 22:51:18 25.02575 121.5377
+## 120 大安區 2024-03-31 22:37:18 25.01223 121.5479
+## 121 大安區 2024-03-31 23:04:18 25.04311 121.5431
+## 122 大安區 2024-03-31 23:09:18 25.03363 121.5296
+## 123 大安區 2024-03-31 23:09:14 25.03609 121.5471
+## 124 大安區 2024-03-31 22:58:18 25.01551 121.5337
+## 125 大安區 2024-03-31 22:58:18 25.04196 121.5365
+## 126 大安區 2024-01-14 04:19:10 25.04176 121.5403
+## 127 大安區 2024-03-31 23:09:18 25.01744 121.5333
+## 128 大安區 2024-03-31 22:53:18 25.02267 121.5341
+## 129 大安區 2024-03-31 23:03:18 25.03479 121.5438
+## 130 大安區 2024-03-31 22:28:19 25.01783 121.5522
+## 131 大安區 2024-03-31 21:58:14 25.01727 121.5490
+## 132 大安區 2024-03-31 22:52:18 25.02039 121.5485
+## 133 大安區 2024-03-31 23:07:17 25.02347 121.5411
+## 134 大安區 2024-03-31 23:05:18 25.02054 121.5456
+## 135 大安區 2024-03-31 23:03:18 25.02444 121.5491
+## 136 大安區 2024-03-31 22:51:18 25.01705 121.5443
+## 137 大安區 2024-03-31 21:03:18 25.03762 121.5501
+## 138 大安區 2024-03-31 23:09:18 25.04464 121.5494
+## 139 大安區 2024-03-31 22:47:13 25.04172 121.5454
+## 140 大安區 2024-03-31 23:08:18 25.04472 121.5440
+## 141 大安區 2024-03-31 23:08:18 25.02598 121.5345
+## 142 大安區 2024-03-31 22:45:19 25.02535 121.5510
+## 143 大安區 2024-03-31 23:07:18 25.03333 121.5397
+## 144 大安區 2024-03-31 22:23:19 25.03715 121.5494
+## 145 大安區 2024-03-31 23:05:18 25.02709 121.5490
+## 146 大安區 2024-03-31 23:05:18 25.03710 121.5484
+## 147 大安區 2024-03-31 22:52:18 25.02821 121.5486
+## 148 大安區 2024-03-31 23:06:17 25.03328 121.5425
+## 149 大安區 2024-03-31 22:29:18 25.02055 121.5285
+## 150 大安區 2024-03-31 22:56:19 25.03459 121.5516
+## 151 大安區 2024-03-31 22:40:26 25.02101 121.5415
+## 152 大安區 2024-03-31 22:33:18 25.03002 121.5489
+## 153 大安區 2024-03-31 22:21:16 25.03054 121.5247
+## 154 大安區 2024-03-31 23:09:17 25.04205 121.5566
+## 155 大安區 2024-03-31 22:46:18 25.04010 121.5412
+## 156 大安區 2024-03-31 23:01:20 25.03827 121.5480
+## 157 大安區 2024-03-31 22:57:19 25.02974 121.5515
+## 158 大安區 2024-03-31 23:09:17 25.02268 121.5361
+## 159 大安區 2024-03-31 23:06:17 25.03303 121.5437
+## 160 大安區 2024-03-31 23:09:18 25.02832 121.5559
+## 161 大安區 2024-03-31 22:46:18 25.01027 121.5400
+## 162 大安區 2024-03-31 23:03:14 25.04132 121.5539
+## 163 大安區 2024-03-31 22:47:18 25.03795 121.5547
+## 164 大安區 2024-03-31 22:56:19 25.02528 121.5522
+## 165 大安區 2024-03-31 23:03:18 25.02208 121.5268
+## 166 大安區 2024-03-31 23:02:18 25.03551 121.5495
+## 167 大安區 2024-03-31 23:05:19 25.02942 121.5529
+## 168 大安區 2024-03-31 23:06:18 25.04061 121.5439
+## 169 大安區 2024-03-31 22:59:17 25.03813 121.5463
+## 170 大安區 2024-03-31 23:08:19 25.02476 121.5280
+## 171 大安區 2024-03-31 23:02:17 25.03056 121.5525
+## 172 大安區 2024-03-31 22:47:18 25.02014 121.5508
+## 173 大安區 2024-03-31 22:40:25 25.02572 121.5236
+## 174 大安區 2024-03-31 23:07:18 25.04152 121.5441
+## 175 大安區 2024-03-31 22:32:18 25.02468 121.5396
+## 176 大安區 2024-03-31 23:03:14 25.03601 121.5574
+## 177 大安區 2024-03-31 23:07:17 25.01870 121.5569
+## 178 大安區 2024-03-31 23:05:18 25.03817 121.5440
+## 179 大安區 2024-03-31 22:14:18 25.03804 121.5504
+## 180 大安區 2024-03-31 22:15:19 25.02187 121.5291
+## 181 大同區 2024-03-31 23:03:17 25.07894 121.5112
+## 182 大同區 2024-03-31 22:51:17 25.07410 121.5135
+## 183 大同區 2024-03-31 22:52:18 25.07717 121.5093
+## 184 大同區 2024-03-31 22:26:18 25.06864 121.5107
+## 185 大同區 2024-03-31 23:07:17 25.07158 121.5137
+## 186 大同區 2024-03-31 23:08:19 25.06647 121.5165
+## 187 大同區 2024-03-31 22:32:14 25.05601 121.5089
+## 188 大同區 2024-03-31 22:21:20 25.07378 121.5158
+## 189 大同區 2024-03-31 23:08:14 25.07133 121.5202
+## 190 大同區 2024-03-31 23:07:18 25.07220 121.5106
+## 191 大同區 2024-03-31 23:01:20 25.07567 121.5186
+## 192 大同區 2024-03-31 22:59:13 25.07598 121.5141
+## 193 大同區 2024-03-31 22:16:19 25.07447 121.5200
+## 194 大同區 2024-03-31 22:42:14 25.06326 121.5110
+## 195 大同區 2024-03-31 22:58:18 25.06327 121.5094
+## 196 大同區 2024-03-31 22:52:18 25.05915 121.5103
+## 197 大同區 2024-03-31 22:16:18 25.06853 121.5173
+## 198 大同區 2024-03-31 22:37:18 25.07080 121.5183
+## 199 大同區 2024-03-31 23:04:18 25.06314 121.5131
+## 200 大同區 2024-03-31 23:09:18 25.06325 121.5116
+## 201 大同區 2024-03-31 22:27:14 25.06174 121.5197
+## 202 大同區 2024-03-31 23:04:18 25.05826 121.5206
+## 203 大同區 2024-03-31 23:07:18 25.04991 121.5104
+## 204 大同區 2024-03-31 23:06:18 25.05592 121.5137
+## 205 大同區 2024-03-31 23:08:18 25.05454 121.5105
+## 206 大同區 2024-03-31 22:24:19 25.07049 121.5160
+## 207 大同區 2024-03-31 23:09:18 25.06054 121.5134
+## 208 大同區 2024-03-31 22:57:19 25.06867 121.5199
+## 209 大同區 2024-03-31 23:08:18 25.05369 121.5142
+## 210 大同區 2024-03-31 23:06:18 25.06853 121.5136
+## 211 大同區 2024-03-31 22:21:21 25.06407 121.5182
+## 212 大同區 2024-03-31 22:48:18 25.04925 121.5147
+## 213 大同區 2024-03-31 23:09:17 25.06594 121.5108
+## 214 大同區 2024-03-31 22:58:18 25.05205 121.5082
+## 215 大同區 2024-03-31 23:04:18 25.06011 121.5173
+## 216 大同區 2024-03-31 22:19:19 25.07491 121.5115
+## 217 大同區 2024-03-31 22:16:19 25.06496 121.5161
+## 218 大同區 2024-03-31 23:08:19 25.05918 121.5137
+## 219 大同區 2024-03-31 22:44:18 25.05662 121.5078
+## 220 大同區 2024-03-31 22:54:18 25.05805 121.5135
+## 221 大同區 2024-03-31 22:56:19 25.06322 121.5144
+## 222 大同區 2024-03-31 23:07:18 25.06247 121.5184
+## 223 大同區 2024-03-31 23:06:18 25.05366 121.5164
+## 224 大同區 2024-03-31 22:45:19 25.05756 121.5183
+## 225 大同區 2024-03-31 23:03:17 25.05646 121.5170
+## 226 大同區 2024-03-31 23:09:14 25.04937 121.5191
+## 227 大同區 2024-03-31 22:49:14 25.06129 121.5202
+## 228 大同區 2024-03-31 23:08:18 25.05296 121.5194
+## 229 大同區 2024-03-31 23:07:18 25.05150 121.5140
+## 230 大同區 2024-03-31 23:09:18 25.06587 121.5185
+## 231 大同區 2024-03-31 22:40:26 25.05658 121.5083
+## 232 大同區 2024-03-31 22:12:14 25.07182 121.5193
+## 233 大同區 2024-03-31 22:43:17 25.06669 121.5161
+## 234 大同區 2024-03-31 23:08:19 25.04879 121.5163
+## 235 大同區 2024-03-31 22:40:25 25.06036 121.5200
+## 236 大同區 2024-03-31 22:37:14 25.06157 121.5168
+## 237 大同區 2024-03-31 23:09:18 25.06095 121.5143
+## 238 大同區 2024-03-31 23:05:18 25.06092 121.5113
+## 239 大同區 2024-03-31 23:08:19 25.06603 121.5148
+## 240 大同區 2024-03-31 22:18:18 25.07473 121.5145
+## 241 大同區 2024-03-31 21:01:57 25.07563 121.5182
+## 242 士林區 2024-03-31 22:52:18 25.08128 121.5178
+## 243 士林區 2024-03-31 20:13:18 25.08914 121.5154
+## 244 士林區 2024-03-31 22:52:14 25.08695 121.5190
+## 245 士林區 2024-03-31 23:09:17 25.08521 121.5192
+## 246 士林區 2024-03-31 22:52:18 25.10277 121.5336
+## 247 士林區 2024-03-31 22:44:18 25.12001 121.5334
+## 248 士林區 2024-03-31 22:51:18 25.11856 121.5296
+## 249 士林區 2024-03-31 22:26:18 25.11633 121.5341
+## 250 士林區 2024-03-31 22:56:19 25.11356 121.5372
+## 251 士林區 2024-03-31 22:54:18 25.11127 121.5324
+## 252 士林區 2024-03-31 22:41:17 25.11341 121.5319
+## 253 士林區 2024-03-31 22:23:19 25.12011 121.5265
+## 254 士林區 2024-03-31 22:57:19 25.11184 121.5259
+## 255 士林區 2024-03-31 22:28:19 25.08009 121.5190
+## 256 士林區 2024-03-31 22:44:14 25.07994 121.5243
+## 257 士林區 2024-03-31 23:08:18 25.10813 121.5304
+## 258 士林區 2024-03-31 22:33:17 25.10540 121.5295
+## 259 士林區 2024-03-31 22:56:18 25.10399 121.5259
+## 260 士林區 2024-03-31 23:02:17 25.10155 121.5283
+## 261 士林區 2024-03-31 21:21:17 25.10186 121.5308
+## 262 士林區 2024-03-31 22:56:19 25.08302 121.5207
+## 263 士林區 2024-03-31 22:42:18 25.08671 121.5210
+## 264 士林區 2024-03-31 22:50:25 25.08828 121.5199
+## 265 士林區 2024-03-31 23:01:20 25.08480 121.5212
+## 266 士林區 2024-03-31 22:59:17 25.08736 121.5227
+## 267 士林區 2024-03-31 22:47:17 25.10364 121.5222
+## 268 士林區 2024-03-31 21:56:14 25.10208 121.5198
+## 269 士林區 2024-03-31 22:57:19 25.08388 121.5254
+## 270 士林區 2024-03-31 23:03:18 25.08403 121.5249
+## 271 士林區 2024-03-31 20:45:18 25.09667 121.5321
+## 272 士林區 2024-03-31 22:29:19 25.09896 121.5302
+## 273 士林區 2024-03-31 22:59:18 25.09651 121.5275
+## 274 士林區 2024-03-31 22:56:19 25.08911 121.5215
+## 275 士林區 2024-03-31 23:09:18 25.09164 121.5171
+## 276 士林區 2024-03-31 23:03:17 25.09631 121.5145
+## 277 士林區 2024-03-31 22:16:18 25.09598 121.5178
+## 278 士林區 2024-01-14 04:18:09 25.09619 121.5223
+## 279 士林區 2024-03-31 22:48:18 25.09419 121.5283
+## 280 士林區 2024-03-31 23:07:17 25.09343 121.5264
+## 281 士林區 2024-03-31 22:58:18 25.08771 121.5268
+## 282 士林區 2024-03-31 22:56:19 25.09435 121.5170
+## 283 士林區 2024-03-31 22:51:17 25.10991 121.5304
+## 284 士林區 2024-03-31 20:57:26 25.10455 121.5319
+## 285 士林區 2024-03-31 23:09:18 25.10225 121.5229
+## 286 士林區 2024-03-31 22:40:26 25.10143 121.5358
+## 287 士林區 2024-03-31 21:23:18 25.10113 121.5516
+## 288 士林區 2024-03-31 23:04:18 25.09106 121.5150
+## 289 士林區 2024-03-31 22:28:19 25.09755 121.5404
+## 290 士林區 2024-03-31 23:01:19 25.08678 121.5095
+## 291 士林區 2024-03-31 23:01:20 25.08505 121.5117
+## 292 士林區 2024-03-31 21:21:39 25.08393 121.5117
+## 293 士林區 2024-03-31 20:01:50 25.08254 121.5075
+## 294 士林區 2024-03-31 22:32:18 25.10459 121.5242
+## 295 士林區 2024-03-31 23:06:17 25.08824 121.5105
+## 296 士林區 2024-03-31 21:08:18 25.09058 121.5014
+## 297 士林區 2024-03-31 22:29:18 25.09346 121.5038
+## 298 士林區 2024-03-31 22:46:18 25.10641 121.5294
+## 299 士林區 2024-03-31 23:03:18 25.09020 121.5062
+## 300 士林區 2024-03-31 15:16:19 25.09833 121.5479
+## 301 士林區 2024-03-31 21:15:18 25.09763 121.5340
+## 302 士林區 2024-03-31 22:04:19 25.09312 121.5142
+## 303 士林區 2024-03-31 22:59:18 25.08279 121.5122
+## 304 士林區 2024-03-31 19:03:17 25.10893 121.4664
+## 305 士林區 2024-03-31 22:16:18 25.10304 121.4830
+## 306 士林區 2024-03-31 14:18:19 25.10640 121.4836
+## 307 士林區 2024-03-31 21:56:19 25.11314 121.4897
+## 308 士林區 2024-03-31 21:56:18 25.10261 121.4882
+## 309 士林區 2024-03-31 19:43:17 25.09669 121.4971
+## 310 士林區 2024-03-31 23:07:18 25.10696 121.5323
+## 311 士林區 2024-03-31 23:04:18 25.11044 121.5359
+## 312 士林區 2024-03-31 23:01:20 25.08899 121.5175
+## 313 士林區 2024-03-31 22:59:18 25.10775 121.5231
+## 314 士林區 2024-03-31 22:21:21 25.09330 121.5196
+## 315 士林區 2024-03-31 22:09:19 25.09609 121.5301
+## 316 士林區 2024-03-31 22:13:19 25.09709 121.5423
+## 317 士林區 2024-03-31 22:46:18 25.08217 121.5107
+## 318 士林區 2024-03-31 22:36:18 25.11306 121.5395
+## 319 士林區 2024-03-31 21:14:17 25.08887 121.5031
+## 320 士林區 2024-03-31 22:47:18 25.10012 121.5325
+## 321 士林區 2024-03-31 23:01:35 25.08019 121.5202
+## 322 士林區 2024-03-31 19:28:18 25.10455 121.5302
+## 323 士林區 2024-03-31 23:01:14 25.10199 121.5293
+## 324 士林區 2024-03-31 23:09:17 25.09812 121.5245
+## 325 士林區 2024-03-31 17:43:15 25.12408 121.5300
+## 326 士林區 2024-03-31 22:56:19 25.08637 121.5247
+## 327 士林區 2024-03-31 22:51:18 25.10094 121.5224
+## 328 士林區 2024-03-31 22:42:18 25.07960 121.5237
+## 329 士林區 2024-03-31 18:21:19 25.09029 121.5019
+## 330 士林區 2024-03-31 23:08:19 25.08577 121.5253
+## 331 士林區 2024-03-31 22:11:19 25.11070 121.5400
+## 332 士林區 2024-03-31 20:22:18 25.08756 121.5118
+## 333 士林區 2024-03-31 22:57:19 25.08406 121.5067
+## 334 士林區 2024-03-31 22:53:18 25.08810 121.5087
+## 335 士林區 2024-03-31 21:49:18 25.08912 121.5049
+## 336 士林區 2024-03-31 22:41:17 25.08410 121.5234
+## 337 士林區 2024-03-31 22:59:18 25.08761 121.5261
+## 338 士林區 2024-03-31 22:59:18 25.08408 121.5096
+## 339 士林區 2024-03-31 22:38:17 25.08471 121.5089
+## 340 士林區 2024-03-31 22:12:19 25.11742 121.5347
+## 341 士林區 2024-03-31 22:47:18 25.10203 121.5256
+## 342 士林區 2024-03-31 22:45:19 25.10585 121.5238
+## 343 士林區 2024-03-31 22:56:19 25.08238 121.5231
+## 344 士林區 2024-03-31 23:08:19 25.09765 121.5276
+## 345 士林區 2024-03-31 23:03:17 25.09561 121.5255
+## 346 士林區 2024-03-31 23:02:18 25.10336 121.5226
+## 347 士林區 2024-03-31 15:19:18 25.08762 121.5271
+## 348 士林區 2024-03-31 20:43:19 25.08036 121.5084
+## 349 士林區 2024-03-31 23:04:18 25.09013 121.5205
+## 350 士林區 2024-03-31 23:04:18 25.08182 121.5243
+## 351 士林區 2024-03-31 22:56:19 25.11247 121.5291
+## 352 士林區 2024-03-31 23:05:14 25.09677 121.5193
+## 353 士林區 2024-03-31 22:50:25 25.11642 121.5374
+## 354 士林區 2024-03-31 23:01:20 25.11579 121.5311
+## 355 士林區 2024-03-31 22:57:19 25.09886 121.5183
+## 356 士林區 2024-03-31 19:52:18 25.09646 121.4936
+## 357 士林區 2024-03-31 20:37:18 25.10566 121.5292
+## 358 士林區 2024-03-31 23:04:18 25.10519 121.5287
+## 359 士林區 2024-03-31 22:53:18 25.09204 121.5247
+## 360 士林區 2024-03-31 22:56:18 25.11836 121.5347
+## 361 士林區 2024-03-31 22:23:18 25.11633 121.5329
+## 362 士林區 2024-03-31 22:27:19 25.10893 121.5232
+## 363 士林區 2024-03-31 22:53:18 25.10985 121.5286
+## 364 士林區 2024-03-31 20:42:18 25.09441 121.5328
+## 365 文山區 2024-03-31 23:08:19 25.00402 121.5407
+## 366 文山區 2024-03-31 22:56:14 25.00270 121.5386
+## 367 文山區 2024-03-31 22:47:13 25.00115 121.5392
+## 368 文山區 2024-03-31 23:09:18 25.00154 121.5364
+## 369 文山區 2024-03-31 22:23:14 25.00144 121.5398
+## 370 文山區 2024-03-31 22:54:18 24.99621 121.5404
+## 371 文山區 2024-03-31 23:04:18 24.99366 121.5412
+## 372 文山區 2024-03-31 22:57:19 24.99898 121.5403
+## 373 文山區 2024-03-31 22:10:30 24.99812 121.5366
+## 374 文山區 2024-03-31 22:56:14 25.00587 121.5501
+## 375 文山區 2024-03-31 23:08:18 25.00465 121.5492
+## 376 文山區 2024-03-31 23:06:17 25.00346 121.5471
+## 377 文山區 2024-03-31 22:59:18 25.00219 121.5445
+## 378 文山區 2024-03-31 23:08:19 24.99136 121.5401
+## 379 文山區 2024-03-31 23:04:18 25.00792 121.5373
+## 380 文山區 2024-03-31 23:07:17 24.99543 121.5473
+## 381 文山區 2024-03-31 22:56:19 24.99118 121.5436
+## 382 文山區 2024-03-31 22:52:18 24.98737 121.5773
+## 383 文山區 2024-03-31 22:37:14 24.99873 121.5798
+## 384 文山區 2024-03-31 22:57:18 24.99798 121.5746
+## 385 文山區 2024-03-31 22:59:17 24.99886 121.5677
+## 386 文山區 2024-03-31 22:53:18 24.99676 121.5596
+## 387 文山區 2024-03-31 21:17:24 25.00467 121.5568
+## 388 文山區 2024-03-31 23:01:19 24.99982 121.5476
+## 389 文山區 2024-03-31 23:08:19 24.98816 121.5553
+## 390 文山區 2024-03-31 23:03:18 24.98747 121.5498
+## 391 文山區 2024-03-31 22:26:18 24.98573 121.5453
+## 392 文山區 2024-03-31 22:43:17 24.98859 121.5434
+## 393 文山區 2024-03-31 23:07:18 24.97837 121.5555
+## 394 文山區 2024-03-31 22:08:21 24.98058 121.5562
+## 395 文山區 2024-03-31 21:59:17 24.98414 121.5691
+## 396 文山區 2024-03-31 22:47:18 24.98471 121.5633
+## 397 文山區 2024-03-31 21:51:17 24.98574 121.5674
+## 398 文山區 2024-03-31 16:50:26 24.97619 121.5583
+## 399 文山區 2024-03-31 22:26:13 24.98959 121.5696
+## 400 文山區 2024-03-31 22:52:18 24.98718 121.5606
+## 401 文山區 2024-03-31 23:09:18 24.98814 121.5636
+## 402 文山區 2024-03-31 23:09:18 24.98088 121.5631
+## 403 文山區 2024-03-31 22:39:14 24.98181 121.5657
+## 404 文山區 2024-03-31 22:42:18 24.98301 121.5540
+## 405 文山區 2024-03-31 22:28:14 24.98537 121.5796
+## 406 文山區 2024-03-31 21:03:18 24.98642 121.5651
+## 407 文山區 2024-03-31 22:57:19 24.98935 121.5665
+## 408 文山區 2024-03-31 19:09:18 24.99151 121.5684
+## 409 文山區 2024-03-31 21:05:19 24.99111 121.5670
+## 410 文山區 2024-03-31 21:38:18 24.97989 121.5675
+## 411 文山區 2024-03-31 22:54:18 24.99889 121.5433
+## 412 文山區 2024-03-31 22:03:20 24.99939 121.5585
+## 413 文山區 2024-03-31 23:01:19 24.99579 121.5550
+## 414 文山區 2024-03-31 23:03:14 25.00348 121.5564
+## 415 文山區 2024-03-31 21:01:14 25.00079 121.5753
+## 416 文山區 2024-03-31 22:12:19 24.98841 121.5765
+## 417 文山區 2024-03-31 22:56:19 24.99797 121.5498
+## 418 文山區 2024-03-31 22:39:18 24.98543 121.5801
+## 419 文山區 2024-03-31 23:01:35 25.00115 121.5514
+## 420 文山區 2024-03-31 22:41:18 24.99271 121.5587
+## 421 文山區 2024-03-31 22:06:19 24.99472 121.5595
+## 422 文山區 2024-03-31 13:14:19 24.98695 121.5646
+## 423 文山區 2024-03-31 22:42:18 24.98662 121.5707
+## 424 文山區 2024-03-31 22:02:18 24.98339 121.5564
+## 425 文山區 2024-03-31 23:06:17 25.00753 121.5372
+## 426 文山區 2024-01-14 04:19:10 24.99766 121.5787
+## 427 文山區 2024-03-31 16:48:18 24.98200 121.5717
+## 428 文山區 2024-03-31 22:02:18 25.00264 121.5768
+## 429 文山區 2024-03-31 23:06:18 25.01076 121.5364
+## 430 文山區 2024-03-31 22:09:19 25.00345 121.5364
+## 431 文山區 2024-03-31 23:05:18 24.99609 121.5428
+## 432 文山區 2024-03-31 22:59:17 24.99660 121.5403
+## 433 文山區 2024-03-31 23:09:18 25.00825 121.5342
+## 434 文山區 2024-03-31 22:45:14 24.99279 121.5426
+## 435 文山區 2024-03-31 22:35:18 24.98939 121.5768
+## 436 文山區 2024-03-31 22:05:21 25.00743 121.5588
+## 437 文山區 2024-03-31 23:07:17 24.99696 121.5445
+## 438 文山區 2024-03-31 22:11:19 24.98768 121.5657
+## 439 文山區 2024-03-31 22:21:20 24.98944 121.5619
+## 440 文山區 2024-03-31 22:32:18 24.98808 121.5472
+## 441 文山區 2024-03-31 22:40:26 24.98250 121.5595
+## 442 文山區 2024-03-31 22:07:20 25.00223 121.5704
+## 443 文山區 2024-03-31 22:47:17 25.00198 121.5486
+## 444 文山區 2024-03-31 22:56:19 24.99197 121.5737
+## 445 文山區 2024-03-31 22:50:25 24.98532 121.5583
+## 446 文山區 2024-03-31 21:58:14 24.98655 121.5552
+## 447 文山區 2024-03-31 22:31:09 24.98217 121.5578
+## 448 文山區 2024-03-31 22:47:18 25.00268 121.5528
+## 449 文山區 2024-03-31 23:02:18 24.99925 121.5555
+## 450 文山區 2024-03-31 21:31:08 24.97932 121.5541
+## 451 文山區 2024-03-31 22:59:17 24.99892 121.5489
+## 452 文山區 2024-03-31 22:21:21 24.99509 121.5720
+## 453 文山區 2024-03-31 22:50:25 25.00437 121.5505
+## 454 文山區 2024-03-31 16:45:19 25.00492 121.5558
+## 455 文山區 2024-03-31 22:57:18 25.00061 121.5494
+## 456 文山區 2024-03-31 21:16:18 24.99746 121.5454
+## 457 中正區 2024-03-31 17:43:19 25.01374 121.5307
+## 458 中正區 2024-03-31 23:07:17 25.01470 121.5319
+## 459 中正區 2024-03-31 23:08:19 25.01453 121.5344
+## 460 中正區 2024-03-31 23:09:18 25.01507 121.5338
+## 461 中正區 2024-03-31 22:53:18 25.02694 121.5222
+## 462 中正區 2024-03-31 23:04:14 25.02550 121.5235
+## 463 中正區 2024-03-31 23:08:19 25.01970 121.5290
+## 464 中正區 2024-03-31 22:53:14 25.02069 121.5246
+## 465 中正區 2024-03-31 22:57:41 25.02277 121.5229
+## 466 中正區 2024-03-31 23:07:17 25.02092 121.5205
+## 467 中正區 2024-03-31 23:04:18 25.02075 121.5277
+## 468 中正區 2024-03-31 23:08:18 25.02102 121.5275
+## 469 中正區 2024-03-31 23:08:18 25.02345 121.5250
+## 470 中正區 2024-03-31 22:54:18 25.02338 121.5189
+## 471 中正區 2024-03-31 22:36:13 25.02701 121.5216
+## 472 中正區 2024-03-31 23:02:18 25.02805 121.5216
+## 473 中正區 2024-03-31 23:01:35 25.02698 121.5208
+## 474 中正區 2024-03-31 23:04:18 25.02723 121.5166
+## 475 中正區 2024-03-31 23:05:19 25.02933 121.5185
+## 476 中正區 2024-03-31 21:44:18 25.02923 121.5206
+## 477 中正區 2024-03-31 23:09:17 25.03100 121.5221
+## 478 中正區 2024-03-31 23:08:18 25.03239 121.5187
+## 479 中正區 2024-03-31 23:05:19 25.03376 121.5177
+## 480 中正區 2024-03-31 22:58:18 25.02609 121.5139
+## 481 中正區 2024-03-31 22:34:18 25.02543 121.5105
+## 482 中正區 2024-03-31 22:43:17 25.02643 121.5094
+## 483 中正區 2024-03-31 23:09:18 25.02598 121.5081
+## 484 中正區 2024-03-31 23:02:17 25.02886 121.5052
+## 485 中正區 2024-03-31 22:50:25 25.03024 121.5090
+## 486 中正區 2024-03-31 22:01:43 25.03132 121.5075
+## 487 中正區 2024-03-31 22:48:18 25.01602 121.5256
+## 488 中正區 2024-03-31 22:46:18 25.03543 121.5083
+## 489 中正區 2024-03-31 23:02:17 25.03567 121.5101
+## 490 中正區 2024-03-31 23:01:20 25.03907 121.5138
+## 491 中正區 2024-03-31 23:09:18 25.03938 121.5077
+## 492 中正區 2024-03-31 23:02:18 25.04367 121.5285
+## 493 中正區 2024-03-31 23:07:18 25.04527 121.5222
+## 494 中正區 2024-03-31 23:02:18 25.04193 121.5246
+## 495 中正區 2024-03-31 22:57:41 25.03915 121.5216
+## 496 中正區 2024-03-31 22:42:18 25.03786 121.5199
+## 497 中正區 2024-03-31 23:08:18 25.03570 121.5241
+## 498 中正區 2024-03-31 22:59:13 25.04428 121.5234
+## 499 中正區 2024-03-31 23:03:17 25.03648 121.5095
+## 500 中正區 2024-03-31 22:57:19 25.03792 121.5085
+## 501 中正區 2024-03-31 22:54:18 25.04160 121.5084
+## 502 中正區 2024-03-31 22:44:18 25.04129 121.5112
+## 503 中正區 2024-03-31 22:56:19 25.03705 121.5125
+## 504 中正區 2024-03-31 23:03:17 25.03545 121.5133
+## 505 中正區 2024-03-31 20:45:18 25.03763 121.5171
+## 506 中正區 2024-03-31 23:02:17 25.04590 121.5307
+## 507 中正區 2024-03-31 22:45:19 25.03516 121.5064
+## 508 中正區 2024-03-31 23:09:18 25.04412 121.5102
+## 509 中正區 2024-03-31 23:07:18 25.04533 121.5094
+## 510 中正區 2024-03-31 23:04:18 25.04677 121.5099
+## 511 中正區 2024-03-31 23:01:19 25.04297 121.5164
+## 512 中正區 2024-03-31 23:02:17 25.01027 121.5331
+## 513 中正區 2024-03-31 23:06:18 25.02030 121.5230
+## 514 中正區 2024-03-31 22:58:18 25.04178 121.5191
+## 515 中正區 2024-03-31 22:33:17 25.03377 121.5304
+## 516 中正區 2024-03-31 22:56:19 25.04842 121.5199
+## 517 中正區 2024-03-31 22:12:18 25.03132 121.5052
+## 518 中正區 2024-03-31 23:09:14 25.04235 121.5322
+## 519 中正區 2024-03-31 22:56:19 25.04478 121.5327
+## 520 中正區 2024-03-31 21:06:14 25.04503 121.5197
+## 521 中正區 2024-03-31 22:50:25 25.03526 121.5168
+## 522 中正區 2024-03-31 22:32:14 25.04553 121.5274
+## 523 中正區 2024-03-31 21:42:13 25.02266 121.5236
+## 524 中正區 2024-03-31 22:56:18 25.03443 121.5272
+## 525 中正區 2024-03-31 22:41:14 25.04094 121.5221
+## 526 中正區 2024-03-31 22:56:19 25.04023 121.5256
+## 527 中正區 2024-03-31 21:13:18 25.03615 121.5166
+## 528 中正區 2024-03-31 23:07:14 25.04821 121.5190
+## 529 中正區 2024-03-31 23:09:18 25.04779 121.5204
+## 530 中正區 2024-03-31 22:38:17 25.04244 121.5086
+## 531 中正區 2024-03-31 22:33:18 25.03828 121.5152
+## 532 中正區 2024-03-31 22:40:26 25.03850 121.5129
+## 533 中正區 2024-03-31 22:38:17 25.01808 121.5275
+## 534 中正區 2024-03-31 23:07:14 25.04051 121.5240
+## 535 中正區 2024-03-31 23:09:17 25.03145 121.5194
+## 536 中正區 2024-03-31 23:09:14 25.01328 121.5300
+## 537 中正區 2024-03-31 22:54:18 25.03895 121.5223
+## 538 中正區 2024-03-31 23:08:19 25.04178 121.5087
+## 539 中正區 2024-03-31 22:59:18 25.03840 121.5280
+## 540 中正區 2024-03-31 22:09:19 25.03746 121.5280
+## 541 中正區 2024-03-31 22:52:18 25.03846 121.5250
+## 542 中正區 2024-03-31 23:02:18 25.02815 121.5111
+## 543 中正區 2024-03-31 22:45:19 25.02990 121.5103
+## 544 中正區 2024-03-31 22:56:19 25.03158 121.5146
+## 545 中正區 2024-03-31 23:05:18 25.04659 121.5238
+## 546 中正區 2024-03-31 22:56:18 25.04597 121.5258
+## 547 中正區 2024-03-31 22:13:19 25.04692 121.5221
+## 548 中正區 2024-03-31 23:08:14 25.04272 121.5321
+## 549 中正區 2024-03-31 23:03:18 25.04113 121.5327
+## 550 中正區 2024-03-31 23:06:17 25.04074 121.5159
+## 551 中正區 2024-03-31 23:08:14 25.04461 121.5188
+## 552 中正區 2024-03-31 23:04:18 25.04250 121.5227
+## 553 中正區 2024-03-31 23:07:17 25.03837 121.5234
+## 554 中正區 2024-03-31 22:42:18 25.02703 121.5069
+## 555 中正區 2024-03-31 22:24:19 25.03371 121.5107
+## 556 中正區 2024-03-31 22:56:14 25.04467 121.5236
+## 557 中正區 2024-03-31 22:58:18 25.03788 121.5190
+## 558 中正區 2024-03-31 22:44:18 25.04724 121.5127
+## 559 中正區 2024-03-31 22:40:25 25.04127 121.5270
+## 560 中正區 2024-03-31 23:01:20 25.03811 121.5285
+## 561 中正區 2024-03-31 22:45:19 25.04148 121.5287
+## 562 中正區 2024-03-31 23:05:19 25.02507 121.5165
+## 563 中正區 2024-03-31 22:44:18 25.03898 121.5306
+## 564 中正區 2024-03-31 23:04:18 25.03212 121.5186
+## 565 中正區 2024-03-31 22:26:18 25.02484 121.5197
+## 566 中正區 2024-03-31 22:52:18 25.02682 121.5174
+## 567 中正區 2024-03-31 22:14:19 25.02965 121.5142
+## 568 中正區 2024-03-31 22:09:19 25.02890 121.5097
+## 569 中正區 2024-03-31 23:06:18 25.03796 121.5326
+## 570 中正區 2024-03-31 23:01:20 25.04032 121.5314
+## 571 中正區 2024-03-31 23:01:20 25.02750 121.5101
+## 572 中山區 2024-03-31 21:52:18 25.08251 121.5400
+## 573 中山區 2024-03-31 22:38:17 25.07805 121.5295
+## 574 中山區 2024-03-31 22:03:20 25.08030 121.5625
+## 575 中山區 2024-03-31 21:11:18 25.08524 121.5375
+## 576 中山區 2024-03-31 23:09:18 25.08258 121.5446
+## 577 中山區 2024-03-31 22:54:18 25.08009 121.5523
+## 578 中山區 2024-03-31 23:01:20 25.08474 121.5497
+## 579 中山區 2024-03-31 22:45:19 25.08401 121.5554
+## 580 中山區 2024-03-31 22:12:19 25.07985 121.5561
+## 581 中山區 2024-03-31 23:06:17 25.07976 121.5581
+## 582 中山區 2024-03-31 23:04:18 25.07923 121.5473
+## 583 中山區 2024-03-31 23:08:19 25.04585 121.5438
+## 584 中山區 2024-03-31 23:08:19 25.05176 121.5422
+## 585 中山區 2024-03-31 23:02:17 25.04833 121.5347
+## 586 中山區 2024-03-31 23:03:18 25.04861 121.5293
+## 587 中山區 2024-03-31 23:06:18 25.04796 121.5244
+## 588 中山區 2024-03-31 23:09:18 25.05194 121.5277
+## 589 中山區 2024-03-31 22:57:36 25.05316 121.5315
+## 590 中山區 2024-03-31 22:45:19 25.05025 121.5327
+## 591 中山區 2024-03-31 22:45:19 25.05639 121.5275
+## 592 中山區 2024-03-31 22:52:18 25.06642 121.5374
+## 593 中山區 2024-03-31 22:49:14 25.05778 121.5369
+## 594 中山區 2024-03-31 23:08:18 25.05606 121.5417
+## 595 中山區 2024-03-31 23:09:14 25.06106 121.5441
+## 596 中山區 2024-03-31 23:09:18 25.06045 121.5408
+## 597 中山區 2024-03-31 21:59:18 25.05469 121.5369
+## 598 中山區 2024-03-31 23:07:18 25.05214 121.5368
+## 599 中山區 2024-03-31 22:56:14 25.05246 121.5332
+## 600 中山區 2024-03-31 23:04:18 25.04762 121.5404
+## 601 中山區 2024-03-31 22:28:19 25.05604 121.5317
+## 602 中山區 2024-03-31 23:02:18 25.04710 121.5277
+## 603 中山區 2024-03-31 22:31:09 25.04699 121.5374
+## 604 中山區 2024-03-31 23:08:18 25.06140 121.5393
+## 605 中山區 2024-03-31 23:09:18 25.06225 121.5411
+## 606 中山區 2024-03-31 23:08:19 25.06246 121.5271
+## 607 中山區 2024-03-31 23:07:18 25.05992 121.5333
+## 608 中山區 2024-03-31 22:59:18 25.06531 121.5256
+## 609 中山區 2024-03-31 23:05:18 25.06283 121.5270
+## 610 中山區 2024-03-31 23:08:19 25.06491 121.5245
+## 611 中山區 2024-03-31 22:52:14 25.06652 121.5276
+## 612 中山區 2024-03-31 22:53:18 25.06847 121.5256
+## 613 中山區 2024-03-31 22:38:17 25.06987 121.5229
+## 614 中山區 2024-03-31 22:14:19 25.06816 121.5226
+## 615 中山區 2024-03-31 23:01:20 25.04983 121.5285
+## 616 中山區 2024-03-31 23:03:14 25.05201 121.5256
+## 617 中山區 2024-03-31 20:58:14 25.05337 121.5289
+## 618 中山區 2024-03-31 22:46:14 25.05583 121.5282
+## 619 中山區 2024-03-31 22:48:18 25.06682 121.5421
+## 620 中山區 2024-03-31 22:19:14 25.06505 121.5437
+## 621 中山區 2024-03-31 22:54:14 25.06424 121.5404
+## 622 中山區 2024-03-31 22:56:19 25.06251 121.5376
+## 623 中山區 2024-03-31 23:05:19 25.06585 121.5334
+## 624 中山區 2024-03-31 22:58:18 25.06533 121.5318
+## 625 中山區 2024-03-31 22:48:18 25.06595 121.5304
+## 626 中山區 2024-03-31 23:06:17 25.06833 121.5328
+## 627 中山區 2024-03-31 22:31:09 25.07154 121.5306
+## 628 中山區 2024-03-31 22:48:18 25.06185 121.5226
+## 629 中山區 2024-03-31 22:49:18 25.04573 121.5351
+## 630 中山區 2024-03-31 22:46:14 25.05228 121.5218
+## 631 中山區 2024-03-31 22:39:18 25.06416 121.5220
+## 632 中山區 2024-03-31 22:21:21 25.06839 121.5303
+## 633 中山區 2024-03-31 22:32:17 25.05867 121.5331
+## 634 中山區 2024-03-31 22:59:17 25.05497 121.5254
+## 635 中山區 2024-03-31 23:08:18 25.06503 121.5368
+## 636 中山區 2024-03-31 23:03:18 25.04985 121.5331
+## 637 中山區 2024-03-31 22:09:19 25.04836 121.5367
+## 638 中山區 2024-03-31 22:32:18 25.04611 121.5319
+## 639 中山區 2024-03-31 23:04:18 25.06269 121.5306
+## 640 中山區 2024-03-31 22:57:19 25.06510 121.5224
+## 641 中山區 2024-03-31 22:12:19 25.05575 121.5217
+## 642 中山區 2024-03-31 22:40:21 25.05680 121.5319
+## 643 中山區 2024-03-31 23:04:18 25.05731 121.5302
+## 644 中山區 2024-03-31 23:07:18 25.05808 121.5289
+## 645 中山區 2024-03-31 23:06:18 25.05794 121.5424
+## 646 中山區 2024-03-31 23:09:17 25.06028 121.5299
+## 647 中山區 2024-03-31 23:04:18 25.05606 121.5229
+## 648 中山區 2024-03-31 23:01:14 25.05873 121.5249
+## 649 中山區 2024-03-31 22:36:18 25.05955 121.5274
+## 650 中山區 2024-03-31 22:44:18 25.07340 121.5399
+## 651 中山區 2024-03-31 17:29:14 25.07275 121.5373
+## 652 中山區 2024-03-31 22:40:25 25.06807 121.5367
+## 653 中山區 2024-03-31 23:08:18 25.05619 121.5395
+## 654 中山區 2024-03-31 23:06:18 25.06597 121.5412
+## 655 中山區 2024-03-31 23:09:17 25.06142 121.5230
+## 656 中山區 2024-03-31 22:15:19 25.08303 121.5604
+## 657 中山區 2024-03-31 22:42:18 25.06157 121.5244
+## 658 中山區 2024-03-31 22:59:18 25.05189 121.5352
+## 659 中山區 2024-03-31 22:51:18 25.05205 121.5401
+## 660 中山區 2024-03-31 22:49:18 25.06389 121.5192
+## 661 中山區 2024-03-31 22:27:19 25.08152 121.5465
+## 662 中山區 2024-03-31 23:07:18 25.08010 121.5471
+## 663 中山區 2024-03-31 23:09:18 25.05120 121.5331
+## 664 中山區 2024-03-31 22:09:19 25.07864 121.5556
+## 665 中山區 2024-03-31 22:54:18 25.05791 121.5311
+## 666 中山區 2024-03-31 22:45:19 25.05765 121.5330
+## 667 中山區 2024-03-31 23:06:18 25.05277 121.5301
+## 668 中山區 2024-03-31 22:59:18 25.05481 121.5303
+## 669 中山區 2024-03-31 23:08:14 25.05488 121.5314
+## 670 中山區 2024-03-31 22:49:14 25.05215 121.5328
+## 671 中山區 2024-03-31 23:08:18 25.05215 121.5317
+## 672 中山區 2024-03-31 22:15:14 25.05499 121.5329
+## 673 中山區 2024-03-31 23:08:18 25.07802 121.5351
+## 674 中山區 2024-03-31 21:28:17 25.06873 121.5200
+## 675 中山區 2024-03-31 23:06:13 25.06493 121.5278
+## 676 中山區 2024-03-31 23:06:18 25.06532 121.5285
+## 677 中山區 2024-03-31 22:56:19 25.07934 121.5467
+## 678 中山區 2024-03-31 22:33:17 25.07983 121.5524
+## 679 中山區 2024-03-31 23:08:18 25.06245 121.5304
+## 680 中山區 2024-03-31 23:09:18 25.05473 121.5403
+## 681 中山區 2024-03-31 22:28:18 25.06305 121.5278
+## 682 中山區 2024-03-31 22:58:18 25.05476 121.5369
+## 683 中山區 2024-03-31 23:09:18 25.06432 121.5335
+## 684 中山區 2024-03-31 22:48:17 25.07063 121.5233
+## 685 中山區 2024-03-31 22:54:18 25.08476 121.5379
+## 686 中山區 2024-03-31 22:35:19 25.07818 121.5618
+## 687 中山區 2024-03-31 23:06:17 25.05223 121.5258
+## 688 中山區 2024-03-31 22:39:18 25.07825 121.5534
+## 689 中山區 2024-03-31 23:04:18 25.05339 121.5401
+## 690 中山區 2024-03-31 23:09:18 25.06819 121.5277
+## 691 中山區 2024-03-31 23:03:14 25.05253 121.5426
+## 692 中山區 2024-03-31 23:09:18 25.04478 121.5366
+## 693 中山區 2024-03-31 22:50:20 25.05004 121.5404
+## 694 中山區 2024-03-31 22:51:17 25.08431 121.5476
+## 695 中山區 2024-03-31 23:01:20 25.05196 121.5433
+## 696 中山區 2024-03-31 22:43:17 25.06228 121.5370
+## 697 中山區 2024-03-31 23:03:18 25.06688 121.5257
+## 698 中山區 2024-03-31 22:13:19 25.07059 121.5281
+## 699 中山區 2024-03-31 21:56:19 25.04699 121.5307
+## 700 中山區 2024-03-31 23:06:17 25.05532 121.5277
+## 701 中山區 2024-03-31 23:09:18 25.08519 121.5550
+## 702 中山區 2024-03-31 22:46:18 25.08272 121.5562
+## 703 中山區 2024-03-31 23:07:14 25.05427 121.5390
+## 704 中山區 2024-03-31 23:07:18 25.05418 121.5433
+## 705 中山區 2024-03-31 23:09:14 25.06419 121.5373
+## 706 中山區 2024-03-31 23:06:17 25.05676 121.5227
+## 707 中山區 2024-03-31 23:02:17 25.04480 121.5421
+## 708 中山區 2024-03-31 21:46:18 25.04812 121.5217
+## 709 中山區 2024-03-31 23:05:14 25.05236 121.5221
+## 710 中山區 2024-03-31 22:56:19 25.05959 121.5368
+## 711 中山區 2024-03-31 22:16:19 25.04919 121.5420
+## 712 中山區 2024-03-31 22:34:18 25.04992 121.5438
+## 713 中山區 2024-03-31 23:08:19 25.06037 121.5328
+## 714 中山區 2024-03-31 21:32:18 25.06617 121.5353
+## 715 中山區 2024-03-31 23:07:17 25.04808 121.5290
+## 716 中山區 2024-03-31 22:53:14 25.05366 121.5328
+## 717 中山區 2024-03-31 22:01:20 25.07702 121.5664
+## 718 中山區 2024-03-31 23:04:18 25.07965 121.5415
+## 719 中山區 2024-03-31 23:04:18 25.06246 121.5432
+## 720 中山區 2024-03-31 22:56:19 25.05484 121.5352
+## 721 中山區 2024-03-31 21:16:18 25.08578 121.5523
+## 722 內湖區 2024-03-31 23:03:17 25.09122 121.5596
+## 723 內湖區 2024-03-31 22:18:18 25.08378 121.5621
+## 724 內湖區 2024-03-31 23:05:18 25.07977 121.5645
+## 725 內湖區 2024-03-31 21:31:08 25.08284 121.5645
+## 726 內湖區 2024-03-31 23:01:20 25.08637 121.5609
+## 727 內湖區 2024-03-31 23:07:17 25.08707 121.5641
+## 728 內湖區 2024-03-31 23:01:20 25.08637 121.5657
+## 729 內湖區 2024-03-31 22:12:19 25.08260 121.5716
+## 730 內湖區 2024-03-31 21:59:18 25.08398 121.5773
+## 731 內湖區 2024-03-31 21:33:18 25.08522 121.5746
+## 732 內湖區 2024-03-31 22:59:18 25.08803 121.5996
+## 733 內湖區 2024-03-31 23:04:18 25.07021 121.6159
+## 734 內湖區 2024-03-31 22:37:18 25.07177 121.6149
+## 735 內湖區 2024-03-31 23:03:17 25.07450 121.5739
+## 736 內湖區 2024-03-31 22:57:19 25.07524 121.5772
+## 737 內湖區 2024-03-31 22:54:18 25.08395 121.6018
+## 738 內湖區 2024-03-31 21:59:18 25.07958 121.5934
+## 739 內湖區 2024-03-31 22:10:31 25.07864 121.5918
+## 740 內湖區 2024-03-31 23:05:14 25.08301 121.5664
+## 741 內湖區 2024-03-31 23:01:35 25.08205 121.5672
+## 742 內湖區 2024-03-31 23:09:17 25.07932 121.5687
+## 743 內湖區 2024-03-31 22:48:17 25.08296 121.5752
+## 744 內湖區 2024-03-31 22:12:18 25.08598 121.5720
+## 745 內湖區 2024-03-31 22:45:19 25.08436 121.5948
+## 746 內湖區 2024-03-31 23:04:18 25.08780 121.5923
+## 747 內湖區 2024-03-31 23:08:19 25.08785 121.5879
+## 748 內湖區 2024-03-31 23:04:18 25.07842 121.5846
+## 749 內湖區 2024-03-31 21:12:17 25.07695 121.5876
+## 750 內湖區 2024-03-31 22:44:18 25.07504 121.5837
+## 751 內湖區 2024-03-31 23:08:14 25.07758 121.5838
+## 752 內湖區 2024-03-31 23:02:18 25.07777 121.5796
+## 753 內湖區 2024-03-31 22:31:09 25.07538 121.5808
+## 754 內湖區 2024-03-31 22:10:31 25.05575 121.5849
+## 755 內湖區 2024-03-31 21:38:18 25.05590 121.5799
+## 756 內湖區 2024-03-31 22:33:18 25.05768 121.5816
+## 757 內湖區 2024-03-31 22:59:17 25.05653 121.5834
+## 758 內湖區 2024-03-31 22:53:18 25.05390 121.5808
+## 759 內湖區 2024-03-31 21:49:18 25.06915 121.5890
+## 760 內湖區 2024-03-31 17:21:18 25.07007 121.6205
+## 761 內湖區 2024-03-31 23:04:18 25.06181 121.5945
+## 762 內湖區 2024-03-31 21:26:17 25.06256 121.5861
+## 763 內湖區 2024-03-31 22:39:18 25.05827 121.5871
+## 764 內湖區 2024-03-31 22:28:19 25.06058 121.5911
+## 765 內湖區 2024-03-31 22:31:09 25.06835 121.5832
+## 766 內湖區 2024-03-31 22:53:18 25.07335 121.5795
+## 767 內湖區 2024-03-31 21:17:29 25.06853 121.5781
+## 768 內湖區 2024-03-31 22:46:18 25.06709 121.5800
+## 769 內湖區 2024-03-31 22:53:18 25.06286 121.5750
+## 770 內湖區 2024-03-31 23:05:18 25.05594 121.5786
+## 771 內湖區 2024-03-31 22:31:09 25.05301 121.5759
+## 772 內湖區 2024-03-31 23:07:18 25.07151 121.5899
+## 773 內湖區 2024-03-31 23:01:20 25.06877 121.5927
+## 774 內湖區 2024-03-31 22:56:19 25.06740 121.5975
+## 775 內湖區 2024-03-31 22:45:19 25.07249 121.6080
+## 776 內湖區 2024-03-31 22:47:17 25.07332 121.6022
+## 777 內湖區 2024-03-31 21:59:18 25.07330 121.5983
+## 778 內湖區 2024-03-31 22:38:17 25.07988 121.5829
+## 779 內湖區 2024-03-31 22:36:18 25.08317 121.5811
+## 780 內湖區 2024-03-31 22:43:17 25.08357 121.5853
+## 781 內湖區 2024-03-31 22:40:26 25.08165 121.5889
+## 782 內湖區 2024-03-31 23:08:18 25.08350 121.5945
+## 783 內湖區 2024-03-31 21:29:17 25.07896 121.5992
+## 784 內湖區 2024-03-31 22:31:09 25.07792 121.5935
+## 785 內湖區 2024-03-31 22:46:18 25.06657 121.6136
+## 786 內湖區 2024-03-31 22:56:19 25.07669 121.6171
+## 787 內湖區 2024-03-31 20:41:18 25.08722 121.6231
+## 788 內湖區 2024-03-31 23:09:18 25.07967 121.5758
+## 789 內湖區 2024-03-31 22:36:18 25.07334 121.6196
+## 790 內湖區 2024-03-31 20:56:19 25.06261 121.5933
+## 791 內湖區 2024-03-31 22:10:31 25.06209 121.6035
+## 792 內湖區 2024-03-31 23:01:20 25.06927 121.6102
+## 793 內湖區 2024-03-31 22:07:20 25.07160 121.6094
+## 794 內湖區 2024-03-31 23:08:19 25.05707 121.5766
+## 795 內湖區 2024-03-31 20:03:18 25.05503 121.5782
+## 796 內湖區 2024-03-31 22:27:19 25.06516 121.5956
+## 797 內湖區 2024-03-31 22:40:25 25.06708 121.6006
+## 798 內湖區 2024-03-31 22:49:18 25.06854 121.6153
+## 799 內湖區 2024-03-31 23:02:17 25.08373 121.5941
+## 800 內湖區 2024-03-31 22:01:20 25.07611 121.5749
+## 801 內湖區 2024-03-31 23:09:18 25.07296 121.5760
+## 802 內湖區 2024-03-31 22:57:18 25.08554 121.5908
+## 803 內湖區 2024-03-31 22:26:18 25.07943 121.5954
+## 804 內湖區 2024-03-31 22:04:21 25.07567 121.6118
+## 805 內湖區 2024-03-31 22:48:18 25.07415 121.6107
+## 806 內湖區 2024-03-31 22:05:21 25.07514 121.6086
+## 807 內湖區 2024-03-31 15:54:18 25.05892 121.5735
+## 808 內湖區 2024-03-31 22:25:19 25.06682 121.5907
+## 809 內湖區 2024-03-31 22:59:13 25.05876 121.5806
+## 810 內湖區 2024-03-31 15:39:18 25.06455 121.5826
+## 811 內湖區 2024-03-31 23:01:20 25.08105 121.5921
+## 812 內湖區 2024-03-31 19:50:25 25.08151 121.5976
+## 813 內湖區 2024-03-31 22:26:18 25.06851 121.5956
+## 814 內湖區 2024-03-31 21:57:02 25.06434 121.5940
+## 815 內湖區 2024-03-31 22:07:19 25.07848 121.5749
+## 816 內湖區 2024-03-31 22:43:17 25.08844 121.5612
+## 817 內湖區 2024-03-31 20:26:17 25.08454 121.5840
+## 818 內湖區 2024-03-31 20:17:30 25.06060 121.5829
+## 819 內湖區 2024-03-31 23:09:14 25.06017 121.5755
+## 820 內湖區 2024-03-31 20:44:18 25.06007 121.6014
+## 821 內湖區 2024-03-31 22:57:14 25.07433 121.5858
+## 822 內湖區 2024-03-31 22:44:17 25.05928 121.5862
+## 823 內湖區 2024-03-31 21:08:18 25.08503 121.5637
+## 824 內湖區 2024-03-31 20:01:49 25.06935 121.5869
+## 825 內湖區 2024-03-31 21:09:18 25.07168 121.5812
+## 826 內湖區 2024-03-31 23:03:17 25.06664 121.6135
+## 827 內湖區 2024-03-31 21:25:19 25.06874 121.5892
+## 828 內湖區 2024-03-31 23:04:14 25.08627 121.5914
+## 829 內湖區 2024-03-31 13:46:18 25.07038 121.6035
+## 830 內湖區 2024-03-31 23:01:20 25.07676 121.5743
+## 831 內湖區 2024-03-31 22:05:20 25.07777 121.5756
+## 832 內湖區 2024-03-31 22:48:17 25.07192 121.6196
+## 833 內湖區 2024-03-31 22:46:18 25.08120 121.5707
+## 834 內湖區 2024-03-31 23:05:19 25.07823 121.5898
+## 835 內湖區 2024-03-31 22:57:41 25.08781 121.5587
+## 836 內湖區 2024-03-31 19:34:18 25.07243 121.5742
+## 837 內湖區 2024-03-31 22:17:32 25.07392 121.6154
+## 838 內湖區 2024-03-31 21:08:18 25.06671 121.5891
+## 839 內湖區 2024-03-31 17:07:18 25.07849 121.6167
+## 840 內湖區 2024-03-31 22:37:18 25.07539 121.6203
+## 841 內湖區 2024-03-31 22:57:41 25.08004 121.5757
+## 842 內湖區 2024-03-31 22:40:25 25.06058 121.5866
+## 843 內湖區 2024-03-31 21:21:18 25.06365 121.5861
+## 844 內湖區 2024-03-31 22:16:19 25.06321 121.5768
+## 845 內湖區 2024-03-31 16:53:18 25.06766 121.5746
+## 846 內湖區 2024-03-31 22:31:09 25.08968 121.5835
+## 847 內湖區 2024-03-31 19:35:19 25.08416 121.5966
+## 848 內湖區 2024-03-31 23:08:19 25.07350 121.6126
+## 849 內湖區 2024-03-31 22:58:18 25.08227 121.5909
+## 850 內湖區 2024-03-31 22:56:19 25.06643 121.6173
+## 851 內湖區 2024-03-31 23:09:17 25.08464 121.5794
+## 852 內湖區 2024-03-31 21:41:18 25.07860 121.5830
+## 853 內湖區 2024-03-31 23:04:18 25.06265 121.5743
+## 854 內湖區 2024-03-31 21:50:25 25.06126 121.5820
+## 855 內湖區 2024-03-31 20:21:19 25.07210 121.6099
+## 856 內湖區 2024-03-31 19:19:18 25.08019 121.5632
+## 857 內湖區 2024-03-31 18:50:29 25.08156 121.5623
+## 858 內湖區 2024-03-31 19:46:17 25.08067 121.5656
+## 859 內湖區 2024-03-31 22:48:17 25.08202 121.5686
+## 860 內湖區 2024-03-31 22:28:18 25.06749 121.5778
+## 861 內湖區 2024-03-31 22:38:17 25.06888 121.5771
+## 862 內湖區 2024-03-31 23:09:17 25.07345 121.5785
+## 863 內湖區 2024-03-31 22:43:17 25.07821 121.5710
+## 864 內湖區 2024-03-31 21:10:25 25.07733 121.5727
+## 865 內湖區 2024-03-31 23:02:17 25.07897 121.5737
+## 866 內湖區 2024-03-31 22:12:19 25.08049 121.5736
+## 867 內湖區 2024-03-31 22:09:19 25.06805 121.5849
+## 868 內湖區 2024-03-31 19:04:19 25.06605 121.5821
+## 869 內湖區 2024-03-31 21:32:18 25.06407 121.5779
+## 870 內湖區 2024-03-31 22:32:18 25.06151 121.5781
+## 871 內湖區 2024-03-31 22:37:18 25.08152 121.5649
+## 872 內湖區 2024-03-31 13:29:18 25.08203 121.5630
+## 873 內湖區 2024-03-31 18:49:18 25.08318 121.5615
+## 874 內湖區 2024-03-31 18:29:18 25.07941 121.5728
+## 875 內湖區 2024-03-31 22:36:17 25.07074 121.6180
+## 876 內湖區 2024-03-31 22:29:19 25.08035 121.5705
+## 877 內湖區 2024-03-31 23:07:18 25.07983 121.5962
+## 878 內湖區 2024-03-31 22:57:18 25.08227 121.5671
+## 879 內湖區 2024-03-31 20:12:18 25.06153 121.6003
+## 880 內湖區 2024-03-31 21:14:18 25.08514 121.5616
+## 881 內湖區 2024-03-31 18:56:19 25.07567 121.5734
+## 882 內湖區 2024-03-31 22:47:13 25.07862 121.5880
+## 883 內湖區 2024-03-30 14:06:19 25.06099 121.5966
+## 884 內湖區 2024-03-31 22:57:19 25.07264 121.6069
+## 885 內湖區 2024-03-31 17:12:20 25.07595 121.6226
+## 886 內湖區 2024-03-31 22:01:20 25.08438 121.5788
+## 887 內湖區 2024-03-31 15:43:18 25.06092 121.5890
+## 888 北投區 2024-03-31 22:49:17 25.11680 121.5048
+## 889 北投區 2024-03-31 22:21:21 25.10981 121.4989
+## 890 北投區 2024-03-31 23:07:18 25.11357 121.5225
+## 891 北投區 2024-03-31 22:10:31 25.10896 121.5194
+## 892 北投區 2024-03-31 22:49:18 25.10788 121.5146
+## 893 北投區 2024-03-31 21:24:18 25.12416 121.5261
+## 894 北投區 2024-03-31 21:17:29 25.11739 121.4629
+## 895 北投區 2024-03-31 21:57:02 25.11884 121.4691
+## 896 北投區 2024-03-31 22:31:18 25.12030 121.4665
+## 897 北投區 2024-03-31 20:37:18 25.13149 121.4737
+## 898 北投區 2024-03-31 22:03:19 25.12397 121.4671
+## 899 北投區 2024-03-31 22:18:18 25.12618 121.4674
+## 900 北投區 2024-03-31 22:21:21 25.12796 121.4678
+## 901 北投區 2024-03-31 19:46:17 25.12310 121.4709
+## 902 北投區 2024-03-31 22:46:18 25.13780 121.4863
+## 903 北投區 2024-03-31 21:35:19 25.13666 121.4816
+## 904 北投區 2024-03-31 22:19:19 25.13475 121.4961
+## 905 北投區 2024-03-31 21:02:18 25.13997 121.4897
+## 906 北投區 2024-03-31 23:06:17 25.13776 121.4934
+## 907 北投區 2024-03-31 21:44:18 25.14582 121.4930
+## 908 北投區 2024-03-31 22:23:19 25.13691 121.4999
+## 909 北投區 2024-03-31 23:06:18 25.13733 121.5034
+## 910 北投區 2024-03-31 22:39:17 25.13187 121.4990
+## 911 北投區 2024-03-31 23:09:18 25.12634 121.5010
+## 912 北投區 2024-03-31 21:27:18 25.12297 121.5016
+## 913 北投區 2024-03-31 22:59:17 25.12725 121.5068
+## 914 北投區 2024-03-31 21:21:39 25.12814 121.4978
+## 915 北投區 2024-03-31 22:56:19 25.11798 121.5034
+## 916 北投區 2024-03-31 22:04:21 25.12666 121.5037
+## 917 北投區 2024-03-31 22:53:18 25.12087 121.5052
+## 918 北投區 2024-03-31 23:07:17 25.11666 121.5096
+## 919 北投區 2024-03-31 22:19:19 25.11912 121.5122
+## 920 北投區 2024-03-31 22:56:19 25.11451 121.5157
+## 921 北投區 2024-03-31 22:56:19 25.11752 121.5166
+## 922 北投區 2024-03-31 22:58:18 25.11542 121.5147
+## 923 北投區 2024-03-31 23:02:17 25.11753 121.5219
+## 924 北投區 2024-03-31 23:09:18 25.11440 121.5131
+## 925 北投區 2024-03-31 23:02:17 25.11865 121.5235
+## 926 北投區 2024-03-31 20:42:18 25.11978 121.5042
+## 927 北投區 2024-03-31 22:25:19 25.11587 121.5058
+## 928 北投區 2024-03-31 23:04:18 25.11093 121.5138
+## 929 北投區 2024-03-31 22:45:19 25.11370 121.5244
+## 930 北投區 2024-03-31 20:32:17 25.10467 121.5165
+## 931 北投區 2024-03-31 23:04:18 25.12501 121.4716
+## 932 北投區 2024-03-31 19:53:18 25.13539 121.4780
+## 933 北投區 2024-03-31 22:01:20 25.12081 121.5135
+## 934 北投區 2024-03-31 23:09:17 25.13675 121.5022
+## 935 北投區 2024-03-31 22:33:18 25.13872 121.5021
+## 936 北投區 2024-03-31 22:57:41 25.11272 121.5092
+## 937 北投區 2024-03-31 22:10:31 25.11416 121.5077
+## 938 北投區 2024-03-31 23:06:17 25.11000 121.5184
+## 939 北投區 2024-03-31 23:06:17 25.13102 121.5041
+## 940 北投區 2024-03-31 20:58:17 25.10032 121.5060
+## 941 北投區 2024-03-31 22:14:14 25.14319 121.4962
+## 942 北投區 2024-03-31 21:10:25 25.10065 121.5111
+## 943 北投區 2024-03-31 22:49:18 25.14058 121.4992
+## 944 北投區 2024-03-31 20:37:18 25.14045 121.5045
+## 945 北投區 2024-03-31 23:09:17 25.11535 121.5174
+## 946 北投區 2024-03-31 22:56:19 25.12287 121.5037
+## 947 北投區 2024-03-31 16:15:15 25.14193 121.5083
+## 948 北投區 2024-03-31 22:52:18 25.12533 121.5057
+## 949 北投區 2024-03-31 22:38:17 25.11857 121.5185
+## 950 北投區 2024-03-31 16:15:15 25.12862 121.5033
+## 951 北投區 2024-03-31 20:50:25 25.10940 121.5125
+## 952 北投區 2024-03-31 22:13:19 25.13774 121.5014
+## 953 北投區 2024-03-31 22:57:18 25.13597 121.4970
+## 954 北投區 2024-03-31 22:50:25 25.13431 121.5023
+## 955 北投區 2024-03-31 23:09:17 25.12757 121.4721
+## 956 北投區 2024-03-31 21:03:18 25.14319 121.4909
+## 957 北投區 2024-03-31 21:31:18 25.13684 121.5079
+## 958 北投區 2024-03-31 22:56:19 25.14390 121.4945
+## 959 北投區 2024-03-31 23:09:17 25.13258 121.4986
+## 960 北投區 2024-03-31 21:21:18 25.11879 121.5192
+## 961 北投區 2024-03-31 22:36:17 25.12082 121.5073
+## 962 北投區 2024-03-31 22:18:19 25.13043 121.5002
+## 963 北投區 2024-03-31 23:07:18 25.13076 121.4735
+## 964 北投區 2024-03-31 20:42:18 25.10171 121.5126
+## 965 北投區 2024-03-31 23:04:14 25.13201 121.4982
+## 966 北投區 2024-03-31 18:45:19 25.10392 121.5124
+## 967 北投區 2024-03-31 20:54:17 25.12595 121.5110
+## 968 北投區 2024-03-31 23:02:17 25.13713 121.4971
+## 969 北投區 2024-03-31 22:52:18 25.14190 121.4989
+## 970 北投區 2024-03-31 22:31:09 25.12307 121.4991
+## 971 北投區 2024-03-31 22:28:18 25.11969 121.5017
+## 972 北投區 2024-03-31 22:52:18 25.10576 121.5173
+## 973 北投區 2024-03-31 21:40:26 25.13905 121.5001
+## 974 北投區 2024-03-31 21:17:28 25.11955 121.4673
+## 975 北投區 2024-03-31 21:21:18 25.12518 121.4692
+## 976 北投區 2024-03-31 21:57:02 25.11483 121.4993
+## 977 北投區 2024-03-31 16:15:15 25.12231 121.4996
+## 978 松山區 2024-03-31 23:08:19 25.04987 121.5778
+## 979 松山區 2024-03-31 22:56:19 25.05009 121.5720
+## 980 松山區 2024-03-31 22:53:18 25.05503 121.5688
+## 981 松山區 2024-03-31 22:51:18 25.04878 121.5609
+## 982 松山區 2024-03-31 22:39:14 25.05136 121.5628
+## 983 松山區 2024-03-31 23:09:17 25.05155 121.5636
+## 984 松山區 2024-03-31 23:09:17 25.04937 121.5580
+## 985 松山區 2024-03-31 23:09:18 25.05152 121.5646
+## 986 松山區 2024-03-31 22:09:19 25.05492 121.5670
+## 987 松山區 2024-03-31 23:03:17 25.06220 121.5456
+## 988 松山區 2024-03-31 22:47:18 25.06374 121.5477
+## 989 松山區 2024-03-31 22:58:18 25.06095 121.5473
+## 990 松山區 2024-03-31 23:06:17 25.05804 121.5490
+## 991 松山區 2024-03-31 23:01:20 25.05460 121.5449
+## 992 松山區 2024-03-31 22:35:18 25.06190 121.5633
+## 993 松山區 2024-03-31 23:04:18 25.05907 121.5631
+## 994 松山區 2024-03-31 23:01:20 25.05157 121.5512
+## 995 松山區 2024-03-31 22:48:18 25.04826 121.5524
+## 996 松山區 2024-03-31 23:01:20 25.05633 121.5529
+## 997 松山區 2024-03-31 23:09:18 25.06118 121.5510
+## 998 松山區 2024-03-31 22:51:18 25.06200 121.5602
+## 999 松山區 2024-03-31 23:06:17 25.05925 121.5689
+## 1000 松山區 2024-03-31 23:05:18 25.05834 121.5550
+## 1001 松山區 2024-03-31 22:59:17 25.06129 121.5667
+## 1002 松山區 2024-03-31 22:40:26 25.04459 121.5525
+## 1003 松山區 2024-03-31 23:01:14 25.04488 121.5499
+## 1004 松山區 2024-01-14 04:19:10 25.05419 121.5563
+## 1005 松山區 2024-03-31 22:53:18 25.05528 121.5590
+## 1006 松山區 2024-03-31 22:56:19 25.05433 121.5654
+## 1007 松山區 2024-03-31 22:47:18 25.06206 121.5547
+## 1008 松山區 2024-03-31 22:57:18 25.04840 121.5659
+## 1009 松山區 2024-03-31 22:57:41 25.04693 121.5577
+## 1010 松山區 2024-03-31 23:08:18 25.04566 121.5566
+## 1011 松山區 2024-03-31 23:09:18 25.05347 121.5544
+## 1012 松山區 2024-03-31 22:52:18 25.04769 121.5448
+## 1013 松山區 2024-03-31 23:07:18 25.05143 121.5572
+## 1014 松山區 2024-03-31 23:09:17 25.05846 121.5595
+## 1015 松山區 2024-03-31 23:06:17 25.05408 121.5610
+## 1016 松山區 2024-03-31 23:01:19 25.05606 121.5635
+## 1017 松山區 2024-03-31 23:01:20 25.04763 121.5611
+## 1018 松山區 2024-03-31 23:07:17 25.04524 121.5466
+## 1019 松山區 2024-03-31 23:07:17 25.05278 121.5448
+## 1020 松山區 2024-03-31 23:08:18 25.05168 121.5451
+## 1021 松山區 2024-03-31 22:54:18 25.06480 121.5679
+## 1022 松山區 2024-03-31 22:49:18 25.04951 121.5494
+## 1023 松山區 2024-03-31 23:02:17 25.05176 121.5535
+## 1024 松山區 2024-03-31 23:01:19 25.05360 121.5487
+## 1025 松山區 2024-03-31 23:05:19 25.05147 121.5768
+## 1026 松山區 2024-03-31 23:04:18 25.05013 121.5764
+## 1027 松山區 2024-03-31 23:01:20 25.06200 121.5447
+## 1028 松山區 2024-03-31 22:56:19 25.05163 121.5591
+## 1029 松山區 2024-03-31 21:24:17 25.06241 121.5683
+## 1030 松山區 2024-03-31 23:01:14 25.05198 121.5681
+## 1031 松山區 2024-03-31 23:06:18 25.05406 121.5641
+## 1032 松山區 2024-03-31 23:01:20 25.05378 121.5589
+## 1033 松山區 2024-03-31 22:57:36 25.04634 121.5542
+## 1034 松山區 2024-03-31 23:01:20 25.05173 121.5561
+## 1035 松山區 2024-03-31 23:01:20 25.04954 121.5526
+## 1036 松山區 2024-03-31 23:04:18 25.05567 121.5671
+## 1037 松山區 2024-03-31 23:01:19 25.05149 121.5653
+## 1038 松山區 2024-03-31 23:09:17 25.04962 121.5775
+## 1039 松山區 2024-03-31 22:51:14 25.05722 121.5571
+## 1040 松山區 2024-03-31 22:48:14 25.05226 121.5493
+## 1041 松山區 2024-03-31 22:56:18 25.04802 121.5486
+## 1042 松山區 2024-03-31 22:54:18 25.06150 121.5633
+## 1043 松山區 2024-03-31 23:08:18 25.04985 121.5719
+## 1044 松山區 2024-03-31 22:51:14 25.05452 121.5464
+## 1045 松山區 2024-03-31 22:38:17 25.04942 121.5750
+## 1046 松山區 2024-03-31 23:04:18 25.05014 121.5769
+## 1047 松山區 2024-03-31 23:03:18 25.05152 121.5524
+## 1048 松山區 2024-03-31 23:09:14 25.05181 121.5521
+## 1049 松山區 2024-03-31 22:07:20 25.05420 121.5491
+## 1050 松山區 2024-03-31 22:49:18 25.05764 121.5444
+## 1051 松山區 2024-03-31 23:03:18 25.04440 121.5540
+## 1052 松山區 2024-03-31 22:42:14 25.05454 121.5542
+## 1053 松山區 2024-03-31 22:52:14 25.05129 121.5643
+## 1054 松山區 2024-03-31 23:09:17 25.05139 121.5706
+## 1055 松山區 2024-03-31 23:09:18 25.06432 121.5454
+## 1056 松山區 2024-03-31 23:07:14 25.05708 121.5649
+## 1057 松山區 2024-03-31 23:04:18 25.04742 121.5631
+## 1058 松山區 2024-03-31 22:34:18 25.06589 121.5453
+## 1059 松山區 2024-03-31 22:41:18 25.06457 121.5646
+## 1060 松山區 2024-03-31 22:57:19 25.05936 121.5659
+## 1061 松山區 2024-03-31 22:45:19 25.06185 121.5500
+## 1062 南港區 2024-03-31 22:31:09 25.04591 121.5923
+## 1063 南港區 2024-03-31 22:53:18 25.04128 121.5909
+## 1064 南港區 2024-03-31 22:54:18 25.05014 121.5924
+## 1065 南港區 2024-03-31 22:48:18 25.04919 121.5883
+## 1066 南港區 2024-03-31 22:59:18 25.04437 121.5813
+## 1067 南港區 2024-03-31 22:43:17 25.04843 121.5815
+## 1068 南港區 2024-03-31 23:09:17 25.04608 121.5832
+## 1069 南港區 2024-03-31 23:08:18 25.04592 121.5882
+## 1070 南港區 2024-03-31 22:59:17 25.04281 121.5861
+## 1071 南港區 2024-03-31 23:02:18 25.04239 121.6168
+## 1072 南港區 2024-03-31 22:31:08 25.04054 121.6137
+## 1073 南港區 2024-03-31 21:07:17 25.04763 121.6115
+## 1074 南港區 2024-03-31 23:07:17 25.05469 121.6167
+## 1075 南港區 2024-03-31 23:05:19 25.04697 121.6137
+## 1076 南港區 2024-03-31 22:09:14 25.04499 121.6178
+## 1077 南港區 2024-03-31 22:53:18 25.04139 121.6191
+## 1078 南港區 2024-03-31 23:05:18 25.03564 121.6141
+## 1079 南港區 2024-03-31 22:13:19 25.05400 121.6133
+## 1080 南港區 2024-03-31 23:01:20 25.05933 121.6168
+## 1081 南港區 2024-03-31 21:49:18 25.05668 121.6114
+## 1082 南港區 2024-03-31 23:07:18 25.05629 121.6070
+## 1083 南港區 2024-03-31 23:09:18 25.05485 121.6087
+## 1084 南港區 2024-03-31 23:04:18 25.05716 121.5979
+## 1085 南港區 2024-03-31 22:51:17 25.05437 121.5942
+## 1086 南港區 2024-03-31 22:53:18 25.05252 121.6092
+## 1087 南港區 2024-03-31 23:01:19 25.05201 121.6074
+## 1088 南港區 2024-03-31 23:02:18 25.05192 121.6064
+## 1089 南港區 2024-03-31 22:47:17 25.05507 121.6028
+## 1090 南港區 2024-03-31 22:36:18 25.03392 121.6098
+## 1091 南港區 2024-03-31 23:08:18 25.04681 121.6170
+## 1092 南港區 2024-03-31 22:02:19 25.04805 121.6159
+## 1093 南港區 2024-03-31 23:05:18 25.05343 121.5995
+## 1094 南港區 2024-03-31 23:05:19 25.05766 121.6040
+## 1095 南港區 2024-03-31 23:07:18 25.05211 121.5984
+## 1096 南港區 2024-03-31 23:05:19 25.05326 121.6066
+## 1097 南港區 2024-03-31 22:56:19 25.05266 121.6128
+## 1098 南港區 2024-03-31 22:41:17 25.05627 121.6137
+## 1099 南港區 2024-03-31 22:56:19 25.05831 121.6142
+## 1100 南港區 2024-03-31 23:06:18 25.03595 121.6169
+## 1101 南港區 2024-03-31 21:50:25 25.05210 121.5905
+## 1102 南港區 2024-03-31 22:07:20 25.05285 121.5928
+## 1103 南港區 2024-03-31 23:03:18 25.05234 121.5815
+## 1104 南港區 2024-03-31 22:31:09 25.05289 121.5860
+## 1105 南港區 2024-03-31 21:57:02 25.05168 121.5828
+## 1106 南港區 2024-03-31 23:03:17 25.05064 121.5803
+## 1107 南港區 2024-03-31 22:21:16 25.04511 121.5836
+## 1108 南港區 2024-03-31 22:37:18 25.04193 121.5849
+## 1109 南港區 2024-03-31 22:57:41 25.03884 121.5879
+## 1110 南港區 2024-03-31 22:47:18 25.06148 121.6138
+## 1111 南港區 2024-03-31 22:50:25 25.05937 121.6107
+## 1112 南港區 2024-03-31 23:01:35 25.05293 121.6055
+## 1113 南港區 2024-03-31 19:27:18 25.04014 121.6177
+## 1114 南港區 2024-03-31 19:24:18 25.06164 121.6127
+## 1115 南港區 2024-03-31 22:17:32 25.06271 121.6160
+## 1116 南港區 2024-03-31 22:57:19 25.05853 121.6098
+## 1117 南港區 2024-03-31 23:01:20 25.05436 121.6181
+## 1118 南港區 2024-03-31 23:09:18 25.05172 121.6169
+## 1119 南港區 2024-03-31 23:05:18 25.03987 121.6201
+## 1120 南港區 2024-03-31 22:56:19 25.05705 121.5927
+## 1121 南港區 2024-03-31 23:01:20 25.05820 121.5937
+## 1122 南港區 2024-03-31 22:29:19 25.05465 121.6185
+## 1123 南港區 2024-03-31 21:40:26 25.05535 121.6184
+## 1124 南港區 2024-03-31 22:26:18 25.04675 121.5873
+## 1125 南港區 2024-03-31 22:21:21 25.04134 121.5932
+## 1126 南港區 2024-03-31 23:04:18 25.04969 121.5803
+## 1127 南港區 2024-03-31 22:31:09 25.04830 121.5943
+## 1128 南港區 2024-03-31 22:46:18 25.05368 121.5997
+## 1129 南港區 2024-03-31 23:08:19 25.05225 121.6077
+## 1130 南港區 2024-03-31 22:59:17 25.05343 121.6063
+## 1131 南港區 2024-03-31 23:09:17 25.04177 121.5874
+## 1132 南港區 2024-03-31 23:04:18 25.04998 121.5838
+## 1133 南港區 2024-03-31 22:11:19 25.03878 121.5930
+## 1134 南港區 2024-03-31 22:40:26 25.04066 121.5888
+## 1135 南港區 2024-03-31 22:57:19 25.05543 121.5892
+## 1136 南港區 2024-03-31 22:54:18 25.04557 121.5863
+## 1137 南港區 2024-03-31 22:31:09 25.05545 121.6165
+## 1138 南港區 2024-03-31 22:01:43 25.03827 121.6227
+## 1139 南港區 2024-03-31 21:51:18 25.05394 121.5912
+## 1140 南港區 2024-03-31 22:57:19 25.05066 121.5943
+## 1141 南港區 2024-03-31 23:09:17 25.04916 121.5891
+## 1142 南港區 2024-03-15 13:02:36 25.04126 121.6118
+## 1143 南港區 2024-03-31 22:21:16 25.05457 121.5878
+## 1144 南港區 2024-03-31 22:13:19 25.05381 121.5864
+## 1145 南港區 2024-03-31 22:03:14 25.04880 121.5874
+## 1146 南港區 2024-03-18 00:17:22 25.05296 121.6171
+## 1147 南港區 2024-03-31 22:59:18 25.04728 121.5861
+## 1148 南港區 2024-03-31 23:05:19 25.04487 121.6148
+## 1149 南港區 2024-03-31 23:04:18 25.05163 121.5953
+## 1150 南港區 2024-03-31 22:34:17 25.05486 121.5944
+## 1151 南港區 2024-03-31 22:09:19 25.04997 121.6162
+## 1152 南港區 2024-03-31 23:01:19 25.05800 121.6219
+## 1153 信義區 2024-03-31 23:01:20 25.02035 121.5577
+## 1154 信義區 2024-03-31 23:03:14 25.02561 121.5541
+## 1155 信義區 2024-03-31 23:09:18 25.02811 121.5567
+## 1156 信義區 2024-03-31 19:07:17 25.01320 121.5633
+## 1157 信義區 2024-03-31 22:45:19 25.01545 121.5613
+## 1158 信義區 2024-03-31 22:56:19 25.02698 121.5584
+## 1159 信義區 2024-03-31 23:05:19 25.02668 121.5618
+## 1160 信義區 2024-03-31 23:02:18 25.02868 121.5593
+## 1161 信義區 2024-03-31 22:44:18 25.03162 121.5740
+## 1162 信義區 2024-03-31 22:40:21 25.03222 121.5697
+## 1163 信義區 2024-03-31 23:07:14 25.02863 121.5698
+## 1164 信義區 2024-03-31 23:01:19 25.02678 121.5688
+## 1165 信義區 2024-03-31 22:19:19 25.03616 121.5698
+## 1166 信義區 2024-03-31 22:32:18 25.03295 121.5687
+## 1167 信義區 2024-03-31 22:46:18 25.03471 121.5730
+## 1168 信義區 2024-03-31 22:54:18 25.03820 121.5750
+## 1169 信義區 2024-03-31 23:08:19 25.02868 121.5667
+## 1170 信義區 2024-03-31 22:47:18 25.03189 121.5668
+## 1171 信義區 2024-03-31 22:47:13 25.03275 121.5634
+## 1172 信義區 2024-03-31 22:42:18 25.03003 121.5629
+## 1173 信義區 2024-03-31 23:09:18 25.03281 121.5576
+## 1174 信義區 2024-03-31 22:57:41 25.03452 121.5576
+## 1175 信義區 2024-03-31 23:08:19 25.03745 121.5602
+## 1176 信義區 2024-03-31 23:06:18 25.03961 121.5720
+## 1177 信義區 2024-03-31 23:07:18 25.03423 121.5764
+## 1178 信義區 2024-03-31 23:08:19 25.03894 121.5791
+## 1179 信義區 2024-03-31 20:32:17 25.03470 121.5802
+## 1180 信義區 2024-03-31 22:31:09 25.03301 121.5810
+## 1181 信義區 2024-03-31 23:05:18 25.03801 121.5654
+## 1182 信義區 2024-03-31 23:04:18 25.03607 121.5653
+## 1183 信義區 2024-03-31 22:47:17 25.03627 121.5638
+## 1184 信義區 2024-03-31 23:01:20 25.03899 121.5637
+## 1185 信義區 2024-03-31 23:07:18 25.03599 121.5622
+## 1186 信義區 2024-03-31 23:05:18 25.03306 121.5662
+## 1187 信義區 2024-03-31 23:07:14 25.03338 121.5633
+## 1188 信義區 2024-03-31 23:07:18 25.04270 121.5811
+## 1189 信義區 2024-03-31 23:04:18 25.03476 121.5687
+## 1190 信義區 2024-03-31 23:03:18 25.03846 121.5862
+## 1191 信義區 2024-03-31 23:07:17 25.03841 121.5836
+## 1192 信義區 2024-03-31 22:42:14 25.03918 121.5665
+## 1193 信義區 2024-03-31 23:09:18 25.04010 121.5682
+## 1194 信義區 2024-03-31 23:09:18 25.04626 121.5704
+## 1195 信義區 2024-03-31 23:09:17 25.02388 121.5698
+## 1196 信義區 2024-03-31 22:59:18 25.01930 121.5710
+## 1197 信義區 2024-03-31 22:44:18 25.04773 121.5690
+## 1198 信義區 2024-03-31 22:51:14 25.04732 121.5721
+## 1199 信義區 2024-03-31 23:08:19 25.04890 121.5784
+## 1200 信義區 2024-03-31 22:54:18 25.04797 121.5743
+## 1201 信義區 2024-03-31 23:03:17 25.04548 121.5721
+## 1202 信義區 2024-03-31 23:08:19 25.02969 121.5577
+## 1203 信義區 2024-03-31 22:56:19 25.04927 121.5721
+## 1204 信義區 2024-03-31 22:36:13 25.04330 121.5638
+## 1205 信義區 2024-03-31 23:01:20 25.03005 121.5576
+## 1206 信義區 2024-03-31 22:25:14 25.04108 121.5629
+## 1207 信義區 2024-03-31 22:51:17 25.02130 121.5703
+## 1208 信義區 2024-03-31 22:57:19 25.04395 121.5818
+## 1209 信義區 2024-03-31 22:59:17 25.04519 121.5771
+## 1210 信義區 2024-03-31 23:07:18 25.04345 121.5754
+## 1211 信義區 2024-03-31 23:07:17 25.04561 121.5755
+## 1212 信義區 2024-03-31 23:07:17 25.04623 121.5777
+## 1213 信義區 2024-03-31 22:57:14 25.04320 121.5779
+## 1214 信義區 2024-03-31 23:03:17 25.03295 121.5712
+## 1215 信義區 2024-03-31 23:01:20 25.03657 121.5735
+## 1216 信義區 2024-03-31 22:58:18 25.03511 121.5637
+## 1217 信義區 2024-03-31 23:07:17 25.03830 121.5762
+## 1218 信義區 2024-03-31 23:08:18 25.04185 121.5720
+## 1219 信義區 2024-03-31 23:07:17 25.04516 121.5670
+## 1220 信義區 2024-03-31 23:07:14 25.04050 121.5754
+## 1221 信義區 2024-03-31 23:07:17 25.02606 121.5631
+## 1222 信義區 2024-03-31 23:07:18 25.03593 121.5791
+## 1223 信義區 2024-03-31 23:07:14 25.03771 121.5612
+## 1224 信義區 2024-03-31 23:01:20 25.03693 121.5754
+## 1225 信義區 2024-03-31 23:08:19 25.03321 121.5587
+## 1226 信義區 2024-03-31 23:09:14 25.03270 121.5616
+## 1227 信義區 2024-03-31 22:59:13 25.02236 121.5627
+## 1228 信義區 2024-03-31 22:56:19 25.04260 121.5838
+## 1229 信義區 2024-03-31 22:56:14 25.03929 121.5875
+## 1230 信義區 2024-03-31 23:06:17 25.03656 121.5687
+## 1231 信義區 2024-03-31 23:08:19 25.03404 121.5660
+## 1232 信義區 2024-03-26 12:18:17 25.03214 121.5597
+## 1233 信義區 2024-03-31 23:09:17 25.02976 121.5642
+## 1234 信義區 2024-03-31 23:07:14 25.04084 121.5679
+## 1235 信義區 2024-03-31 22:37:18 25.04719 121.5806
+## 1236 信義區 2024-03-31 23:08:19 25.02306 121.5704
+## 1237 信義區 2024-03-31 23:04:18 25.02474 121.5674
+## 1238 信義區 2024-03-31 22:43:17 25.04090 121.5705
+## 1239 信義區 2024-03-31 22:49:14 25.03203 121.5615
+## 1240 信義區 2024-03-31 23:09:18 25.03047 121.5684
+## 1241 信義區 2024-03-31 23:06:17 25.03322 121.5743
+## 1242 信義區 2024-03-31 23:08:14 25.04146 121.5673
+## 1243 信義區 2024-03-31 22:37:18 25.02326 121.5633
+## 1244 信義區 2024-03-31 23:01:20 25.02605 121.5577
+## 1245 信義區 2024-03-31 22:40:25 25.02589 121.5607
+## 1246 信義區 2024-03-31 23:08:18 25.02186 121.5553
+## 1247 信義區 2024-03-31 23:05:18 25.04533 121.5791
+## 1248 信義區 2024-03-31 23:09:18 25.03866 121.5808
+## 1249 信義區 2024-03-31 22:47:17 25.02188 121.5589
+## 1250 信義區 2024-03-31 22:57:19 25.04367 121.5674
+## 1251 信義區 2024-03-31 23:09:17 25.02460 121.5603
+## 1252 信義區 2024-03-31 22:53:18 25.04144 121.5613
+## 1253 信義區 2024-03-31 22:01:14 25.04206 121.5579
+## 1254 信義區 2024-03-31 22:57:18 25.04482 121.5580
+## 1255 信義區 2024-03-31 22:36:17 25.04557 121.5806
+## 1256 信義區 2024-03-31 23:01:19 25.02261 121.5718
+## 1257 信義區 2024-03-31 21:42:17 25.04892 121.5691
+## 1258 萬華區 2024-03-31 23:08:14 25.02365 121.4953
+## 1259 萬華區 2024-03-31 23:04:18 25.02160 121.4960
+## 1260 萬華區 2024-03-31 22:48:18 25.01975 121.4973
+## 1261 萬華區 2024-03-31 22:53:14 25.02485 121.5090
+## 1262 萬華區 2024-03-31 23:07:18 25.02442 121.5107
+## 1263 萬華區 2024-03-31 22:58:18 25.02297 121.5084
+## 1264 萬華區 2024-03-31 22:15:19 25.02481 121.5075
+## 1265 萬華區 2024-03-31 22:46:18 25.02594 121.5065
+## 1266 萬華區 2024-03-31 22:38:17 25.02410 121.5029
+## 1267 萬華區 2024-03-31 22:43:17 25.02085 121.5054
+## 1268 萬華區 2024-03-31 22:54:18 25.02964 121.5026
+## 1269 萬華區 2024-03-31 22:56:18 25.02582 121.5025
+## 1270 萬華區 2024-03-31 22:47:18 25.03124 121.5012
+## 1271 萬華區 2024-03-31 22:31:18 25.03116 121.5034
+## 1272 萬華區 2024-03-31 22:35:19 25.03301 121.5016
+## 1273 萬華區 2024-03-31 22:17:32 25.02257 121.4981
+## 1274 萬華區 2024-03-31 23:03:14 25.01688 121.4953
+## 1275 萬華區 2024-03-31 23:03:18 25.02332 121.4926
+## 1276 萬華區 2024-03-31 23:06:17 25.02516 121.4960
+## 1277 萬華區 2024-03-31 22:57:41 25.02744 121.4962
+## 1278 萬華區 2024-03-31 23:05:19 25.03267 121.4976
+## 1279 萬華區 2024-03-31 23:01:20 25.02673 121.4918
+## 1280 萬華區 2024-03-31 21:25:19 25.03284 121.4891
+## 1281 萬華區 2024-03-31 22:46:18 25.03397 121.4903
+## 1282 萬華區 2024-03-31 23:07:17 25.03388 121.4929
+## 1283 萬華區 2024-03-31 22:10:31 25.03203 121.4913
+## 1284 萬華區 2024-03-31 23:06:18 25.03124 121.4908
+## 1285 萬華區 2024-03-31 22:56:19 25.03383 121.4946
+## 1286 萬華區 2024-03-31 23:01:20 25.03253 121.4955
+## 1287 萬華區 2024-03-31 22:43:17 25.02021 121.5038
+## 1288 萬華區 2024-03-31 22:40:26 25.04662 121.5072
+## 1289 萬華區 2024-03-31 23:09:17 25.04441 121.5054
+## 1290 萬華區 2024-03-31 21:37:18 25.04170 121.4999
+## 1291 萬華區 2024-03-31 22:46:14 25.04367 121.5022
+## 1292 萬華區 2024-03-31 23:09:17 25.04099 121.5077
+## 1293 萬華區 2024-03-31 23:07:17 25.03771 121.5066
+## 1294 萬華區 2024-03-31 23:06:18 25.03535 121.4994
+## 1295 萬華區 2024-03-31 22:46:18 25.03550 121.4954
+## 1296 萬華區 2024-03-31 23:02:17 25.03852 121.4988
+## 1297 萬華區 2024-03-31 22:46:18 25.03792 121.5018
+## 1298 萬華區 2024-03-31 22:43:17 25.03364 121.5032
+## 1299 萬華區 2024-03-31 23:09:17 25.03394 121.5012
+## 1300 萬華區 2024-03-31 22:31:04 25.03509 121.5020
+## 1301 萬華區 2024-03-31 22:53:18 25.04445 121.5031
+## 1302 萬華區 2024-03-31 23:06:18 25.04551 121.5032
+## 1303 萬華區 2024-03-31 23:04:18 25.04345 121.5084
+## 1304 萬華區 2024-03-31 22:56:19 25.04030 121.5020
+## 1305 萬華區 2024-03-31 23:09:17 25.02376 121.4999
+## 1306 萬華區 2024-03-31 22:32:18 25.02533 121.4996
+## 1307 萬華區 2024-03-31 22:24:19 25.03517 121.4905
+## 1308 萬華區 2024-03-31 21:19:18 25.03119 121.4886
+## 1309 萬華區 2024-03-31 22:16:19 25.02710 121.4977
+## 1310 萬華區 2024-03-31 22:08:14 25.03606 121.4916
+## 1311 萬華區 2024-03-31 22:36:13 25.03731 121.4953
+## 1312 萬華區 2024-03-31 22:50:25 25.03302 121.4931
+## 1313 萬華區 2024-03-31 22:01:20 25.03035 121.4923
+## 1314 萬華區 2024-03-31 22:19:19 25.01796 121.4999
+## 1315 萬華區 2024-03-31 22:47:17 25.02860 121.4891
+## 1316 萬華區 2024-03-31 22:57:19 25.03646 121.5049
+## 1317 萬華區 2024-03-31 23:02:18 25.04776 121.5061
+## 1318 萬華區 2024-03-31 22:46:18 25.03811 121.5036
+## 1319 萬華區 2024-03-31 23:07:18 25.02926 121.4994
+## 1320 萬華區 2024-03-31 22:59:17 25.02273 121.5027
+## 1321 萬華區 2024-03-31 22:58:18 25.03548 121.5003
+## 1322 萬華區 2024-03-31 22:57:19 25.03170 121.5003
+## 1323 萬華區 2024-03-31 22:27:19 25.02870 121.4916
+## 1324 萬華區 2024-03-31 21:37:14 25.01975 121.4992
+## 1325 萬華區 2024-03-31 22:41:17 25.02768 121.4913
+## 1326 萬華區 2024-03-31 23:08:19 25.01979 121.5009
+## 1327 萬華區 2024-03-31 22:43:17 25.03348 121.5045
+## 1328 萬華區 2024-03-31 23:01:20 25.02039 121.4927
+## 1329 萬華區 2024-03-31 21:38:17 25.02320 121.5003
+## 1330 萬華區 2024-03-31 22:51:17 25.02005 121.5043
+## 1331 萬華區 2024-03-31 22:37:18 25.02114 121.5027
+## 1332 萬華區 2024-03-31 21:17:28 25.01907 121.5022
+## 1333 萬華區 2024-03-31 22:26:18 25.03062 121.4902
+## 1334 萬華區 2024-03-31 22:41:17 25.03010 121.4932
+## 1335 萬華區 2024-03-31 23:09:18 25.02406 121.4964
+## 1336 臺大公館校區 2024-03-31 23:08:19 25.01493 121.5304
+## 1337 臺大公館校區 2024-03-31 23:08:18 25.01466 121.5292
+## 1338 臺大公館校區 2024-03-31 22:42:14 25.01411 121.5300
+## 1339 臺大公館校區 2024-03-31 19:21:18 25.01391 121.5289
+## 1340 臺大公館校區 2024-03-31 23:08:18 25.01525 121.5301
+## 1341 臺大公館校區 2024-03-31 23:03:14 25.01729 121.5453
+## 1342 臺大公館校區 2024-03-31 23:09:17 25.01408 121.5376
+## 1343 臺大公館校區 2024-03-31 22:41:18 25.01839 121.5340
+## 1344 臺大公館校區 2024-03-31 23:09:17 25.01355 121.5367
+## 1345 臺大公館校區 2024-03-31 21:56:14 25.01761 121.5384
+## 1346 臺大公館校區 2024-03-31 23:09:17 25.01547 121.5344
+## 1347 臺大公館校區 2024-03-31 23:05:19 25.01937 121.5390
+## 1348 臺大公館校區 2024-03-31 22:59:13 25.01846 121.5376
+## 1349 臺大公館校區 2024-03-31 22:53:18 25.01616 121.5425
+## 1350 臺大公館校區 2024-03-31 23:09:18 25.01857 121.5406
+## 1351 臺大公館校區 2024-03-31 22:51:18 25.02108 121.5378
+## 1352 臺大公館校區 2024-03-31 22:41:18 25.01941 121.5404
+## 1353 臺大公館校區 2024-03-31 22:42:18 25.01793 121.5358
+## 1354 臺大公館校區 2024-03-31 23:05:19 25.01627 121.5353
+## 1355 臺大公館校區 2024-03-31 22:56:14 25.01666 121.5372
+## 1356 臺大公館校區 2024-03-31 23:03:17 25.01980 121.5358
+## 1357 臺大公館校區 2024-01-14 04:17:15 25.01595 121.5379
+## 1358 臺大公館校區 2024-03-31 22:17:26 25.01566 121.5379
+## 1359 臺大公館校區 2024-03-31 23:09:18 25.01511 121.5379
+## 1360 臺大公館校區 2024-03-31 23:02:18 25.01345 121.5380
+## 1361 臺大公館校區 2024-03-31 23:09:18 25.01603 121.5363
+## 1362 臺大公館校區 2024-03-31 22:48:17 25.01754 121.5440
+## 1363 臺大公館校區 2024-03-31 22:29:14 25.01699 121.5357
+## 1364 臺大公館校區 2024-03-31 22:53:18 25.02157 121.5363
+## 1365 臺大公館校區 2024-03-31 23:09:17 25.02053 121.5414
+## 1366 臺大公館校區 2024-03-31 22:54:18 25.01987 121.5417
+## 1367 臺大公館校區 2024-03-31 21:05:19 25.02074 121.5391
+## 1368 臺大公館校區 2024-03-31 23:08:19 25.01561 121.5358
+## 1369 臺大公館校區 2024-03-31 21:18:18 25.02036 121.5399
+## 1370 臺大公館校區 2024-03-31 21:01:19 25.01881 121.5387
+## 1371 臺大公館校區 2024-03-31 23:09:18 25.01548 121.5383
+## 1372 臺大公館校區 2024-03-31 22:45:19 25.01761 121.5400
+## 1373 臺大公館校區 2024-03-31 22:54:18 25.01922 121.5419
+## 1374 臺大公館校區 2024-03-31 16:07:17 25.01890 121.5360
+## 1375 臺大公館校區 2024-03-31 23:05:18 25.01704 121.5389
+## 1376 臺大公館校區 2024-03-31 23:09:17 25.01698 121.5345
+## 1377 臺大公館校區 2024-03-31 21:46:17 25.01539 121.5369
+## 1378 臺大公館校區 2024-03-31 23:05:18 25.01337 121.5391
+## 1379 臺大公館校區 2024-03-31 17:59:18 25.01703 121.5378
+## 1380 臺大公館校區 2024-03-31 21:27:18 25.01960 121.5385
+## 1381 臺大公館校區 2024-03-31 22:57:36 25.01900 121.5430
+## 1382 臺大公館校區 2024-03-31 22:28:18 25.01857 121.5425
+## 1383 臺大公館校區 2024-03-31 22:53:18 25.01804 121.5393
+## 1384 臺大公館校區 2024-03-31 21:17:29 25.01690 121.5403
+## 1385 臺大公館校區 2024-03-31 23:06:13 25.01995 121.5435
+## 1386 臺大公館校區 2024-03-31 22:48:17 25.01791 121.5424
+## 1387 臺大公館校區 2024-03-31 21:56:19 25.02112 121.5359
+## 1388 臺大公館校區 2024-03-31 20:52:18 25.01816 121.5447
+## ar sareaen
+## 1 復興南路二段235號前 Daan Dist.
+## 2 復興南路二段273號西側 Daan Dist.
+## 3 和平東路二段96巷7號 Daan Dist.
+## 4 和平東路二段118巷33號 Daan Dist.
+## 5 復興南路二段368號 Daan Dist.
+## 6 復興南路二段280號 Daan Dist.
+## 7 復興南路二段342號 Daan Dist.
+## 8 新生南路三段52號 Daan Dist.
+## 9 新生南路三段66號東側 Daan Dist.
+## 10 新生南路三段82號 Daan Dist.
+## 11 辛亥路一段30號 Daan Dist.
+## 12 復興南路二段236號 Daan Dist.
+## 13 羅斯福路三段311號 Daan Dist.
+## 14 敦南街76巷28號 Daan Dist.
+## 15 羅斯福路三段245號 Daan Dist.
+## 16 羅斯福路三段283巷11號 Daan Dist.
+## 17 臥龍街1號 Daan Dist.
+## 18 新生南路三段54巷/溫州街口 Daan Dist.
+## 19 羅斯福路四段21號旁天橋下 Daan Dist.
+## 20 捷運公館站(2號出口)外側 Daan Dist.
+## 21 羅斯福路四段107號(西南側) Daan Dist.
+## 22 基隆路四段43號(臺灣科技大學正門旁小側門靠田徑場) Daan Dist.
+## 23 基隆路四段73巷與基隆路口 Daan Dist.
+## 24 羅斯福路四段113巷基隆路四段41巷口 Daan Dist.
+## 25 基隆路四段41巷68弄臺科帆船大樓旁 Daan Dist.
+## 26 基隆路三段155巷57號西側 Daan Dist.
+## 27 芳蘭路/基隆路三段155巷口 Daan Dist.
+## 28 芳蘭路51號西北側 Daan Dist.
+## 29 長興街/長興街80巷口西側 Daan Dist.
+## 30 長興街50號西北側 Daan Dist.
+## 31 大安區長興街31號 Daan Dist.
+## 32 基隆路三段155巷/基隆路四段口 Daan Dist.
+## 33 辛亥路三段188號 Daan Dist.
+## 34 臺大萬才館北側 Daan Dist.
+## 35 辛亥路三段30號西北側 Daan Dist.
+## 36 辛亥路與復興南路口西南側 Daan Dist.
+## 37 臺大法人語言訓練中心北側 Daan Dist.
+## 38 臺大綜合體育館北側 Daan Dist.
+## 39 辛亥新生路口東南側 Daan Dist.
+## 40 基隆長興路口東側 Daan Dist.
+## 41 敦南街51號 Daan Dist.
+## 42 敦南街73號 Daan Dist.
+## 43 辛亥路三段15號 Daan Dist.
+## 44 辛亥泰順街口東南側 Daan Dist.
+## 45 臥龍街170號(前) Daan Dist.
+## 46 臥龍街234-2號 Daan Dist.
+## 47 辛亥路三段223號西側 Daan Dist.
+## 48 樂業街101巷3號西北側 Daan Dist.
+## 49 和平東路三段420號東北側 Daan Dist.
+## 50 和平東路三段410號 Daan Dist.
+## 51 基隆路二段166號 Daan Dist.
+## 52 通化街189號西側 Daan Dist.
+## 53 辛亥路一段/羅斯福路三段口北側(辛亥路側) Daan Dist.
+## 54 和平東路一段/金山南路二段西南側 Daan Dist.
+## 55 和平東路一段/龍泉街口西南側 Daan Dist.
+## 56 和平東路一段/泰順街口東南側 Daan Dist.
+## 57 和平東路一段129號前 Daan Dist.
+## 58 羅斯福路二段41號前 Daan Dist.
+## 59 和平東路一段19號前 Daan Dist.
+## 60 建國南路二段/建國南路二段151巷(橋下空間) Daan Dist.
+## 61 新生南路二段與和平東路二段口東北側 Daan Dist.
+## 62 建國南路二段與和平東路二段口西北側 Daan Dist.
+## 63 金華街249號對面 Daan Dist.
+## 64 信義路二段128號前 Daan Dist.
+## 65 信義路二段與杭州南路二段東南側 Daan Dist.
+## 66 愛國東路21巷與杭州南路二段25巷口東南側 Daan Dist.
+## 67 愛國東路與杭州南路二段口西南側 Daan Dist.
+## 68 敦化南路二段293巷口南側 Daan Dist.
+## 69 敦化南路二段218號 Daan Dist.
+## 70 安和路二段185號 Daan Dist.
+## 71 通化街111號 Daan Dist.
+## 72 基隆路二段108號 Daan Dist.
+## 73 忠孝東路三段81號 Daan Dist.
+## 74 新生南路一段113號 Daan Dist.
+## 75 仁愛路三段22號 Daan Dist.
+## 76 建國南路一段304巷45號南側 Daan Dist.
+## 77 復興南路一段信義路三段147巷45弄口 Daan Dist.
+## 78 建國南路一段/濟南路三段口(東南側) Daan Dist.
+## 79 復興南路一段/仁愛路三段123巷13弄(西北側) Daan Dist.
+## 80 信義路4段6號(前) Daan Dist.
+## 81 信義路3段143號(前) Daan Dist.
+## 82 信義路四段74號(前) Daan Dist.
+## 83 敦化南路一段與敦化南路一段236巷口 Daan Dist.
+## 84 仁愛路四段258號前 Daan Dist.
+## 85 信義路四段155號前 Daan Dist.
+## 86 安和路一段75號(對面) Daan Dist.
+## 87 信義路四段188號前 Daan Dist.
+## 88 市民大道三段170號 Daan Dist.
+## 89 市民大道三段206號西側 Daan Dist.
+## 90 捷運大安森林公園站(2號出口)西側 Daan Dist.
+## 91 信義路四段353號 Daan Dist.
+## 92 延吉街249號 Daan Dist.
+## 93 光復南路290巷5號 Daan Dist.
+## 94 建國南路一段275號 Daan Dist.
+## 95 新生南路一段101號 Daan Dist.
+## 96 忠孝新生路口北側 Daan Dist.
+## 97 復興南路二段52號(前) Daan Dist.
+## 98 忠孝東路三段與10巷口 Daan Dist.
+## 99 忠孝東路四段49巷4弄/大安路口 Daan Dist.
+## 100 敦化南路1段158號(前) Daan Dist.
+## 101 捷運大安森林公園站(5號出口)東側 Daan Dist.
+## 102 建國南路二段與信義路三段口西南側 Daan Dist.
+## 103 東豐街24號(旁公園路側) Daan Dist.
+## 104 四維路66巷6號北側 Daan Dist.
+## 105 復興南路一段135巷3號(對面) Daan Dist.
+## 106 忠孝東路四段221號 Daan Dist.
+## 107 忠孝東路四段143號 Daan Dist.
+## 108 瑞安街208巷39號對面 Daan Dist.
+## 109 樂利路25號 Daan Dist.
+## 110 和平東路二段134號前 Daan Dist.
+## 111 忠孝東路四段/光復南路口(西南側) Daan Dist.
+## 112 仁愛路四段/大安路一段口(西南側) Daan Dist.
+## 113 信義路四段252號前 Daan Dist.
+## 114 和平東路三段1巷/四維路198巷口(西北側) Daan Dist.
+## 115 仁愛路四段376號前 Daan Dist.
+## 116 信義路四段225號前 Daan Dist.
+## 117 敦化南路二段99號前 Daan Dist.
+## 118 復興南路二段142之1號前 Daan Dist.
+## 119 和平東路/建國南路口(北側) Daan Dist.
+## 120 基隆路三段155巷148號 Daan Dist.
+## 121 復興南路一段126巷1號前 Daan Dist.
+## 122 信義路二段178號前 Daan Dist.
+## 123 仁愛路四段48巷/東豐街(北側) Daan Dist.
+## 124 捷運公館站(3號出口)西側 Daan Dist.
+## 125 忠孝東路三段100號對側 Daan Dist.
+## 126 忠孝東路三段229-1號前 Daan Dist.
+## 127 新生南路三段94號前 Daan Dist.
+## 128 辛亥路一段/新生南路三段(西北側) Daan Dist.
+## 129 復興南路一段303號前 Daan Dist.
+## 130 臥龍街/臥龍街195巷(南側) Daan Dist.
+## 131 辛亥路三段與辛亥路三段157巷口西北側 Daan Dist.
+## 132 臥龍街與基隆路二段口東北側 Daan Dist.
+## 133 和平東路二段96巷8之1號(前方) Daan Dist.
+## 134 辛亥路三段55號前方人行道(大安運動中心) Daan Dist.
+## 135 和平東路三段 / 敦化南路二段口(東側) Daan Dist.
+## 136 基隆路/長興街(東南側) Daan Dist.
+## 137 仁愛路四段118號前 Daan Dist.
+## 138 敦化南路一段111號前 Daan Dist.
+## 139 忠孝東路四段55號前 Daan Dist.
+## 140 市民大道四段/復興路一段口(東南側) Daan Dist.
+## 141 新生南路三段2號前 Daan Dist.
+## 142 安和路二段227巷16號對側 Daan Dist.
+## 143 信義路三段/信義路三段134巷口 Daan Dist.
+## 144 仁愛路四段110號前 Daan Dist.
+## 145 敦化南路二段201號前 Daan Dist.
+## 146 敦化南路一段280號 Daan Dist.
+## 147 敦化南路二段92號對側中央分隔島 Daan Dist.
+## 148 信義路三段184號前 Daan Dist.
+## 149 羅斯福路三段201號旁 Daan Dist.
+## 150 信義路四段199巷/安和路一段90巷口 Daan Dist.
+## 151 辛亥路二段(臺大外語學院外) Daan Dist.
+## 152 敦化南路二段與敦化南路二段81巷口西北側 Daan Dist.
+## 153 金華街78號對側 Daan Dist.
+## 154 光復南路200巷26號東側 Daan Dist.
+## 155 忠孝東路三段248巷30號 Daan Dist.
+## 156 仁愛路四段85號前 Daan Dist.
+## 157 安和路二段/敦化南路二段81巷(西南側) Daan Dist.
+## 158 辛亥路二段43號前 Daan Dist.
+## 159 復興南路二段/信義路四段(東南側) Daan Dist.
+## 160 通化街143巷33號對側 Daan Dist.
+## 161 羅斯福路四段119巷84號對側 Daan Dist.
+## 162 忠孝東路四段230號前 Daan Dist.
+## 163 仁愛路四段363號前 Daan Dist.
+## 164 樂利路97號前 Daan Dist.
+## 165 羅斯福路三段117號前 Daan Dist.
+## 166 敦化南路一段295巷1號 Daan Dist.
+## 167 通安街129號對面 Daan Dist.
+## 168 復興南路一段191號前 Daan Dist.
+## 169 仁愛路四段37號前 Daan Dist.
+## 170 浦城街1號對側 Daan Dist.
+## 171 安和路二段/安和路二段69巷 Daan Dist.
+## 172 臥龍街131巷11弄與樂業街108巷口 Daan Dist.
+## 173 羅斯福路二段81-1號前 Daan Dist.
+## 174 忠孝東路四段48號前 Daan Dist.
+## 175 和平東路二段90巷/和平東路二段76巷5弄 Daan Dist.
+## 176 光復南路438號 Daan Dist.
+## 177 富陽街129號前 Daan Dist.
+## 178 仁愛路四段1號前 Daan Dist.
+## 179 仁愛路四段121號 Daan Dist.
+## 180 龍泉街93巷7號對側 Daan Dist.
+## 181 延平北路五段1-1號(對面) Datong Dist
+## 182 重慶北路三段318號旁 Datong Dist
+## 183 環河北路二段371號旁 Datong Dist
+## 184 延平北路三段123號北側 Datong Dist
+## 185 重慶北路三段260號前 Datong Dist
+## 186 大龍街85巷12號對側 Datong Dist
+## 187 西寧北路112號前方 Datong Dist
+## 188 哈密街61號口對側人行道 Datong Dist
+## 189 酒泉街235號前 Datong Dist
+## 190 酒泉街235號前 Datong Dist
+## 191 敦煌路19號前 Datong Dist
+## 192 敦煌路與重慶北路三段383巷口 Datong Dist
+## 193 承德路三段287號前方 Datong Dist
+## 194 民權西路239號前方 Datong Dist
+## 195 民權西路與迪化街一段口(橋墩下) Datong Dist
+## 196 安西街1巷7號(對側) Datong Dist
+## 197 民族西路82號前方 Datong Dist
+## 198 承德路三段210號旁 Datong Dist
+## 199 捷運大橋頭站(2號出口)西側 Datong Dist
+## 200 民權西路237號旁 Datong Dist
+## 201 捷運民權西路站(2號出口)西側 Datong Dist
+## 202 萬全街22號對面 Datong Dist
+## 203 塔城街與鄭州路口西南側 Datong Dist
+## 204 重慶北路二段62-1號旁 Datong Dist
+## 205 南京西路233巷103號旁 Datong Dist
+## 206 大龍街217號對側 Datong Dist
+## 207 重慶北路二段180號旁 Datong Dist
+## 208 玉門街/民族西路(西北側) Datong Dist
+## 209 重慶北路一段128號前 Datong Dist
+## 210 重慶北路三段162號前 Datong Dist
+## 211 承德路三段14號前 Datong Dist
+## 212 鄭州路23號(旁) Datong Dist
+## 213 昌吉街117號前 Datong Dist
+## 214 長安西路299號(對面) Datong Dist
+## 215 錦西街/興城街口(西南側) Datong Dist
+## 216 延平北路四段200號(南側) Datong Dist
+## 217 大龍街51號(旁) Datong Dist
+## 218 重慶北路二段171號(旁) Datong Dist
+## 219 大稻埕疏散門(淡五號水門)外 Datong Dist
+## 220 重慶北路二段/歸綏街口(南側) Datong Dist
+## 221 民權西路/蘭州街(西側) Datong Dist
+## 222 承德路二段239號前 Datong Dist
+## 223 南京西路/太原路(東側) Datong Dist
+## 224 承德路二段137號前 Datong Dist
+## 225 太原路 / 五原路口(東南側) Datong Dist
+## 226 華陰街45號(對面) Datong Dist
+## 227 民權西路70巷37號對面 Datong Dist
+## 228 南京西路57號前 Datong Dist
+## 229 長安西路244號(重慶路側) Datong Dist
+## 230 承德路三段83號前 Datong Dist
+## 231 環河北路一段/民生西路口(東南側) Datong Dist
+## 232 承德路三段/庫倫街(東南側) Datong Dist
+## 233 大龍街/大龍街85巷(東北側) Datong Dist
+## 234 承德路一段/鄭州路口(市民高架下) Datong Dist
+## 235 錦西街與錦西街52巷口東北側 Datong Dist
+## 236 民權西路102巷4弄25號對側人行道 Datong Dist
+## 237 寧夏路141號對側 Datong Dist
+## 238 延平北路二段/涼州街口(行人天橋下) Datong Dist
+## 239 昌吉街63號旁 Datong Dist
+## 240 重慶北路三段335巷13號對面 Datong Dist
+## 241 敦煌路78號 Datong Dist
+## 242 通河東街325巷/通河東街口 Shilin Dist
+## 243 通河東街1段192號(旁) Shilin Dist
+## 244 華齡街175號(旁) Shilin Dist
+## 245 前港街104號(對面) Shilin Dist
+## 246 雨聲街/雨聲街165巷(西北側) Shilin Dist
+## 247 天母東路69巷30號(前方路側) Shilin Dist
+## 248 天母西路3-55號前人行道 Shilin Dist
+## 249 忠誠路二段/忠誠路二段207巷(東南側) Shilin Dist
+## 250 士東路276號至280號對面人行道 Shilin Dist
+## 251 忠誠路2段53巷7號(對面) Shilin Dist
+## 252 忠誠路二段122號(對面) Shilin Dist
+## 253 天母北路33號(前) Shilin Dist
+## 254 中山北路六段/士東路(西北側) Shilin Dist
+## 255 承德路4段6巷71號(對面) Shilin Dist
+## 256 中山北路4段/通河街口 Shilin Dist
+## 257 忠誠路一段177號(前) Shilin Dist
+## 258 忠義街6號對側 Shilin Dist
+## 259 忠誠路一段18號(對面) Shilin Dist
+## 260 至誠路二段47-49號(前) Shilin Dist
+## 261 至誠路一段303號(對面) Shilin Dist
+## 262 劍潭路76號(對面) Shilin Dist
+## 263 後港街134巷/後港街口 Shilin Dist
+## 264 華齡街188號(前) Shilin Dist
+## 265 前港街48號(對面) Shilin Dist
+## 266 承德路四段179巷/承德路4段口 Shilin Dist
+## 267 福華路151號(對面) Shilin Dist
+## 268 文林路751號(南側) Shilin Dist
+## 269 基河路18號(對面) Shilin Dist
+## 270 劍潭路基河路口(捷運站橋下空間) Shilin Dist
+## 271 中正路/雨農路口(西北側) Shilin Dist
+## 272 福志路50號(對面) Shilin Dist
+## 273 中山北路五段609號(前) Shilin Dist
+## 274 士商路1號(前) Shilin Dist
+## 275 中正路510號(前) Shilin Dist
+## 276 承德路五段55號(旁公車亭) Shilin Dist
+## 277 基河路363號(前) Shilin Dist
+## 278 華聲街17號(南側路側) Shilin Dist
+## 279 福林路/中山北路五段(東北側) Shilin Dist
+## 280 中山北路五段505巷44弄2號(對面) Shilin Dist
+## 281 中山北路五段250號(銘傳大學對側) Shilin Dist
+## 282 士商路150號(校門旁) Shilin Dist
+## 283 忠誠路二段/忠誠路二段40巷(西南側) Shilin Dist
+## 284 雨聲街105號(南側) Shilin Dist
+## 285 福華路114號(對面) Shilin Dist
+## 286 至誠路一段80號(對面) Shilin Dist
+## 287 至善路二段280號(對面) Shilin Dist
+## 288 通河東街2段5號(對面) Shilin Dist
+## 289 至善路一段/至善路一段138巷(北側) Shilin Dist
+## 290 中正路613號(對面) Shilin Dist
+## 291 重慶北路四段198號(前) Shilin Dist
+## 292 重慶北路四段177號(前) Shilin Dist
+## 293 環河北路三段/葫蘆街(東北側) Shilin Dist
+## 294 中山北路六段81號(旁) Shilin Dist
+## 295 社中街39號(對面) Shilin Dist
+## 296 社中街476號(對面) Shilin Dist
+## 297 通河西街二段194號(對面) Shilin Dist
+## 298 忠誠路一段138號(斜前方) Shilin Dist
+## 299 永平街20巷37弄/永平街20巷11弄(社子公園南側) Shilin Dist
+## 300 力行街8號(對面) Shilin Dist
+## 301 福林路240號(前) Shilin Dist
+## 302 通河東街二段26號(旁公園) Shilin Dist
+## 303 重慶北路四段117號(前) Shilin Dist
+## 304 延平北路九段323號(後方堤外) Shilin Dist
+## 305 延平北路八段133巷42號(對面) Shilin Dist
+## 306 延平北路八段96巷15號(前) Shilin Dist
+## 307 社子島濕地解說小築 Shilin Dist
+## 308 延平北路七段250號(前) Shilin Dist
+## 309 延平北路七段42之7號(對面) Shilin Dist
+## 310 忠義街94號(旁) Shilin Dist
+## 311 德行東路285號(德行東路283巷側人行道) Shilin Dist
+## 312 大南路325號前方 Shilin Dist
+## 313 礦溪街與中山北路六段195巷口 Shilin Dist
+## 314 中正路420號前 Shilin Dist
+## 315 中正路/志成街口(南側) Shilin Dist
+## 316 至善路一段/臨溪路(西南側) Shilin Dist
+## 317 延平北路五段136巷1號前 Shilin Dist
+## 318 東山路114號對側 Shilin Dist
+## 319 環河北路三段261巷2號 Shilin Dist
+## 320 福志路14巷42號(對面) Shilin Dist
+## 321 承德路四段10巷37號(旁) Shilin Dist
+## 322 雨聲街90號旁 Shilin Dist
+## 323 至誠路二段與雨聲街口東北側 Shilin Dist
+## 324 後街15號旁 Shilin Dist
+## 325 中山北路七段141巷30號對側 Shilin Dist
+## 326 基河路3-1號對側人行道 Shilin Dist
+## 327 文林路 / 福華路口(東側) Shilin Dist
+## 328 通河街 / 通河街2巷(南側) Shilin Dist
+## 329 延平北路六段/社中街(社子國小對面跨提便道橋下) Shilin Dist
+## 330 捷運劍潭站(1號出口)北側 Shilin Dist
+## 331 德行東路/東山路(西北側) Shilin Dist
+## 332 重慶北路四段276號(前) Shilin Dist
+## 333 環河北路三段/延平北路五段285巷 Shilin Dist
+## 334 延平北路六段67號旁 Shilin Dist
+## 335 社子街162號旁 Shilin Dist
+## 336 承德路四段與劍潭路口西側 Shilin Dist
+## 337 文林路100號前 Shilin Dist
+## 338 葫蘆街184號對側 Shilin Dist
+## 339 延平北路五段257巷17號前 Shilin Dist
+## 340 忠誠路二段200號(新光三越天母店)對側 Shilin Dist
+## 341 中山北路五段837號前 Shilin Dist
+## 342 德行西路33號對側 Shilin Dist
+## 343 承德路四段/後港街口 Shilin Dist
+## 344 中山北路五段692號前 Shilin Dist
+## 345 中正路236巷/中正路口 Shilin Dist
+## 346 福華路/福華路162巷(東南側) Shilin Dist
+## 347 中山北路五段280巷口 Shilin Dist
+## 348 葫蘆街79號對側公園 Shilin Dist
+## 349 士商路40巷2號旁 Shilin Dist
+## 350 基河路/承德路四段77巷口(捷運橋下) Shilin Dist
+## 351 士東路91巷3號旁 Shilin Dist
+## 352 美崙街118號斜對面人行道 Shilin Dist
+## 353 忠誠路二段207巷/士東路299巷口 Shilin Dist
+## 354 天母東路8巷57號對側 Shilin Dist
+## 355 文林路587巷115號對側 Shilin Dist
+## 356 延平北路七段145巷45號斜對面 Shilin Dist
+## 357 忠誠路一段125號前 Shilin Dist
+## 358 忠誠路一段109號前 Shilin Dist
+## 359 福德路與福德路48巷口 Shilin Dist
+## 360 天母東路69巷/天母東路 Shilin Dist
+## 361 忠誠路二段178巷13號對面 Shilin Dist
+## 362 克強路與磺溪街口西南側 Shilin Dist
+## 363 德行東路109巷75號東側 Shilin Dist
+## 364 福林路100巷/福林路100巷77弄 Shilin Dist
+## 365 萬盛街/興隆路一段(西北側) Wenshan Dist
+## 366 羅斯福路5段210號(前) Wenshan Dist
+## 367 羅斯福路五段250號(前) Wenshan Dist
+## 368 萬隆街255號(對面) Wenshan Dist
+## 369 興隆路一段70巷/羅斯福路5段211巷26弄口 Wenshan Dist
+## 370 羅斯福路六段142巷1號(旁) Wenshan Dist
+## 371 景文街1號(對面) Wenshan Dist
+## 372 羅斯福路六段/景隆街口(東南側) Wenshan Dist
+## 373 景福街/羅斯福路6段142巷口 Wenshan Dist
+## 374 福興路106巷28弄96號(對面) Wenshan Dist
+## 375 福興路95巷/福興路63巷4弄口 Wenshan Dist
+## 376 興隆路2段203巷108號(對面) Wenshan Dist
+## 377 景豐街79號(旁公園) Wenshan Dist
+## 378 羅斯福路六段280號(前) Wenshan Dist
+## 379 汀州路四段77號(旁) Wenshan Dist
+## 380 景華街124號(旁汽車格) Wenshan Dist
+## 381 景興街239號(前) Wenshan Dist
+## 382 指南路二段153號(對面) Wenshan Dist
+## 383 新光路二段30號(對面) Wenshan Dist
+## 384 木柵路四段82巷18號前(捷運橋樑下) Wenshan Dist
+## 385 萬芳路60號(西側廣場) Wenshan Dist
+## 386 興隆路三段/興隆路三段192巷8弄 Wenshan Dist
+## 387 辛亥路四段114號(旁人行道) Wenshan Dist
+## 388 興隆路二段123巷/興隆路二段(西北側) Wenshan Dist
+## 389 木柵路一段290號(旁) Wenshan Dist
+## 390 試院路(雙號)/木柵路一段(東北側) Wenshan Dist
+## 391 和興路44巷 / 和興路26巷口 Wenshan Dist
+## 392 木柵路一段17巷1號(西側) Wenshan Dist
+## 393 樟新街64號前方 Wenshan Dist
+## 394 木新路三段/一壽街(西北側) Wenshan Dist
+## 395 木新路二段156號前人行道(永安市場) Wenshan Dist
+## 396 忠順街二段22號前方人行道(忠順區民活動中心) Wenshan Dist
+## 397 保儀路/木柵路三段102巷口(西南側) Wenshan Dist
+## 398 老泉街26巷老泉街口(籃球場前) Wenshan Dist
+## 399 木柵路三段220號(前) Wenshan Dist
+## 400 興隆路四段50號(前) Wenshan Dist
+## 401 興隆路四段105巷49號(旁) Wenshan Dist
+## 402 木新路三段95巷30號(對面) Wenshan Dist
+## 403 木新路二段299巷15號(旁) Wenshan Dist
+## 404 忠順街一段2號(旁) Wenshan Dist
+## 405 指南路三段4號(旁) Wenshan Dist
+## 406 忠順街二段87巷25弄29號 Wenshan Dist
+## 407 久康街24巷46號對側 Wenshan Dist
+## 408 秀明路一段與秀明路一段185巷口 Wenshan Dist
+## 409 秀明路一段129巷與秀明路一段路口 Wenshan Dist
+## 410 老泉街/恆光街口 Wenshan Dist
+## 411 景隆街105號(對面) Wenshan Dist
+## 412 興隆路三段115巷2號 Wenshan Dist
+## 413 興隆路三段304巷145號 Wenshan Dist
+## 414 辛亥路四段199號 Wenshan Dist
+## 415 木柵路四段159巷16號 Wenshan Dist
+## 416 萬壽路16巷6號(前) Wenshan Dist
+## 417 仙岩路16巷37號旁 Wenshan Dist
+## 418 政大一街19號對側 Wenshan Dist
+## 419 興隆路二段160-1號前 Wenshan Dist
+## 420 興隆路三段306號 Wenshan Dist
+## 421 興隆路三段211號對側(公車亭後) Wenshan Dist
+## 422 興隆路四段109巷116號對側 Wenshan Dist
+## 423 木新路二段永安街22巷口 Wenshan Dist
+## 424 忠順街一段木新路三段310巷口 Wenshan Dist
+## 425 師大公館校區校門口(汀州路側) Wenshan Dist
+## 426 新光路二段28號前 Wenshan Dist
+## 427 政治大學水岸電梯旁 Wenshan Dist
+## 428 木柵路四段159巷16弄(社區出入口對側) Wenshan Dist
+## 429 汀州路四段10號北側人行道 Wenshan Dist
+## 430 溪洲街107巷(公園北側) Wenshan Dist
+## 431 三福街4巷與景興路46巷口 Wenshan Dist
+## 432 景仁街 / 羅斯福路六段142巷口(北側) Wenshan Dist
+## 433 臺灣師範大學學二舍西側人行道 Wenshan Dist
+## 434 景中街與景中街30巷口 Wenshan Dist
+## 435 秀明路二段114號公車亭旁 Wenshan Dist
+## 436 辛亥路四段77巷口 Wenshan Dist
+## 437 景興路42巷與景興路口西南側 Wenshan Dist
+## 438 木柵路三段48巷1弄口 Wenshan Dist
+## 439 木柵路二段109巷14號旁 Wenshan Dist
+## 440 木柵路一段59巷29號對側 Wenshan Dist
+## 441 忠順街一段26巷30弄1號對側 Wenshan Dist
+## 442 萬美街一段/萬安街口 Wenshan Dist
+## 443 興隆路二段203巷16號 Wenshan Dist
+## 444 新光路一段145號前 Wenshan Dist
+## 445 光輝路140號對側 Wenshan Dist
+## 446 光輝路7號後側 Wenshan Dist
+## 447 木新路三段278巷11號斜對面 Wenshan Dist
+## 448 興隆路二段275巷1弄2號前 Wenshan Dist
+## 449 興隆路三段56號 Wenshan Dist
+## 450 樟新街8巷9號對側 Wenshan Dist
+## 451 仙岩路26號旁 Wenshan Dist
+## 452 木柵路四段75號對側自行車道旁 Wenshan Dist
+## 453 福興路78巷/福興路78巷10弄 Wenshan Dist
+## 454 辛亥路四段166巷24號對側 Wenshan Dist
+## 455 興隆路二段88號前 Wenshan Dist
+## 456 興隆路二段22巷9弄與景興街23巷6弄口 Wenshan Dist
+## 457 思源街1號東側 Zhongzheng Dist
+## 458 汀州路三段思源街口東南側 Zhongzheng Dist
+## 459 羅斯福路四段68號 Zhongzheng Dist
+## 460 羅斯福路四段48號 Zhongzheng Dist
+## 461 羅斯福路二段100號(前方) Zhongzheng Dist
+## 462 羅斯福路二段168號前 Zhongzheng Dist
+## 463 辛亥路一段/羅斯福路三段南側 Zhongzheng Dist
+## 464 師大路/金門街11巷口對側人行道 Zhongzheng Dist
+## 465 汀洲路二段182巷內186號旁 Zhongzheng Dist
+## 466 水源路/同安街口(東側) Zhongzheng Dist
+## 467 羅斯福路三段126號前 Zhongzheng Dist
+## 468 師大路/羅斯福路三段西側 Zhongzheng Dist
+## 469 羅斯福路三段2號前 Zhongzheng Dist
+## 470 廈門街113巷/牯嶺街口(西側) Zhongzheng Dist
+## 471 和平西路一段13-1號前方 Zhongzheng Dist
+## 472 羅斯福路二段44號前方 Zhongzheng Dist
+## 473 和平西路一段與南昌路二段口西北側 Zhongzheng Dist
+## 474 和平西路一段/福州街口東側 Zhongzheng Dist
+## 475 南昌路一段136號前 Zhongzheng Dist
+## 476 羅斯福路二段/羅斯福路二段6巷口 Zhongzheng Dist
+## 477 金華街口/杭州南路二段西北側 Zhongzheng Dist
+## 478 金華街17號前方 Zhongzheng Dist
+## 479 羅斯福路一段5號前方 Zhongzheng Dist
+## 480 泉州街32號對面人行道 Zhongzheng Dist
+## 481 中華路二段443巷45號前 Zhongzheng Dist
+## 482 詔安街224號前 Zhongzheng Dist
+## 483 中華路二段403號前 Zhongzheng Dist
+## 484 中華路二段305巷至307巷 Zhongzheng Dist
+## 485 南海路與和平西路二段西南側 Zhongzheng Dist
+## 486 莒光路2號前 Zhongzheng Dist
+## 487 水源路11-1號(旁) Zhongzheng Dist
+## 488 廣州街8巷/廣州街口東南側 Zhongzheng Dist
+## 489 愛國西路30號之2前方 Zhongzheng Dist
+## 490 貴陽街懷寧街口(東北側) Zhongzheng Dist
+## 491 貴陽街一段243之1號(前) Zhongzheng Dist
+## 492 忠孝東路二段41號 Zhongzheng Dist
+## 493 忠孝東路一段7號 Zhongzheng Dist
+## 494 濟南紹興路口東南側 Zhongzheng Dist
+## 495 林森南路與仁愛路一段西北側 Zhongzheng Dist
+## 496 信義路一段1號前 Zhongzheng Dist
+## 497 信義路一段21號前 Zhongzheng Dist
+## 498 林森南路1號南側 Zhongzheng Dist
+## 499 愛國西路/延平南路(西北側) Zhongzheng Dist
+## 500 延平南路162號對側 Zhongzheng Dist
+## 501 中華路一段59號旁 Zhongzheng Dist
+## 502 博愛路162號 Zhongzheng Dist
+## 503 重慶南路一段130號旁 Zhongzheng Dist
+## 504 愛國西路1號(前) Zhongzheng Dist
+## 505 中山南路20號前 Zhongzheng Dist
+## 506 金山市民大道口南側 Zhongzheng Dist
+## 507 中華路二段33號旁 Zhongzheng Dist
+## 508 武昌街一段與延平南路口 Zhongzheng Dist
+## 509 中華路一段與漢口街一段路口 Zhongzheng Dist
+## 510 中華路一段11號(斜前方) Zhongzheng Dist
+## 511 常德街1號(公園路側) Zhongzheng Dist
+## 512 汀州路三段230巷23號 Zhongzheng Dist
+## 513 師大路/水源路口(東南側) Zhongzheng Dist
+## 514 中山南路/徐州路(東南側) Zhongzheng Dist
+## 515 信義路二段213號前 Zhongzheng Dist
+## 516 市民大道一段/中山北路一段(西北側) Zhongzheng Dist
+## 517 莒光路/大埔街口(東北側) Zhongzheng Dist
+## 518 忠孝東路二段132號(東側) Zhongzheng Dist
+## 519 新生北路一段/市民大道三段口(西側) Zhongzheng Dist
+## 520 中山南路/青島東路口(東北側) Zhongzheng Dist
+## 521 捷運中正紀念堂站(5號出口)西側 Zhongzheng Dist
+## 522 北平東路/杭州北路口(東北側) Zhongzheng Dist
+## 523 汀州路二段265號 Zhongzheng Dist
+## 524 金山南路一段148號前側 Zhongzheng Dist
+## 525 林森南路/徐州路口(西南側) Zhongzheng Dist
+## 526 徐州路/杭州南路一段口(西北側) Zhongzheng Dist
+## 527 捷運中正紀念堂站(6號出口)北側 Zhongzheng Dist
+## 528 市民大道一段168號旁 Zhongzheng Dist
+## 529 中山北路一段46號北側 Zhongzheng Dist
+## 530 捷運西門站(5號出口)南側 Zhongzheng Dist
+## 531 公園路21號西北側 Zhongzheng Dist
+## 532 重慶南路一段165號旁 Zhongzheng Dist
+## 533 汀州路三段8號前 Zhongzheng Dist
+## 534 紹興南街/徐州路(東南側) Zhongzheng Dist
+## 535 羅斯福路一段/寧波東街(東南側) Zhongzheng Dist
+## 536 中正區思源街16號對面人行道 Zhongzheng Dist
+## 537 仁愛路一段路口/林森南路(東北側) Zhongzheng Dist
+## 538 中華路一段/寶慶路(東南側) Zhongzheng Dist
+## 539 仁愛路二段31號前 Zhongzheng Dist
+## 540 金山南路一段72號前 Zhongzheng Dist
+## 541 仁愛路一段59號旁 Zhongzheng Dist
+## 542 三元街131號旁 Zhongzheng Dist
+## 543 和平西路二段100號前 Zhongzheng Dist
+## 544 重慶南路二段45號前方(郵政博物館前) Zhongzheng Dist
+## 545 林森北路與北平東路口西北側 Zhongzheng Dist
+## 546 北平東路30號對側人行道 Zhongzheng Dist
+## 547 天津街1號對側人行道 Zhongzheng Dist
+## 548 捷運忠孝新生站(1號出口)後方 Zhongzheng Dist
+## 549 新生南路一段56號前方 Zhongzheng Dist
+## 550 公園路/常德街口(西側) Zhongzheng Dist
+## 551 中山南路8號(青島西路側) Zhongzheng Dist
+## 552 林森南路/濟南路一段口(東北側) Zhongzheng Dist
+## 553 仁愛路一段/紹興南街口(南側) Zhongzheng Dist
+## 554 中華路二段343號前 Zhongzheng Dist
+## 555 博愛路217號旁 Zhongzheng Dist
+## 556 忠孝東路一段/林森南路口 Zhongzheng Dist
+## 557 信義路一段(國家音樂廳西北側) Zhongzheng Dist
+## 558 忠孝西路一段100號前 Zhongzheng Dist
+## 559 濟南路二段6-1號對側 Zhongzheng Dist
+## 560 仁愛路二段48-4號前 Zhongzheng Dist
+## 561 齊東街53巷10號 Zhongzheng Dist
+## 562 重慶南路三段/詔安街 Zhongzheng Dist
+## 563 仁愛路二段65巷4號對側 Zhongzheng Dist
+## 564 羅斯福路一段10號前 Zhongzheng Dist
+## 565 汀州路二段135號對側 Zhongzheng Dist
+## 566 和平西路一段110號旁 Zhongzheng Dist
+## 567 泉州街15號對側 Zhongzheng Dist
+## 568 三元街81號前 Zhongzheng Dist
+## 569 仁愛路二段110號 Zhongzheng Dist
+## 570 濟南路二段55號 Zhongzheng Dist
+## 571 汀州路一段232號對側 Zhongzheng Dist
+## 572 通北街/通北街65巷口(東北側) Zhongshan Dist
+## 573 北安路/北安路77巷口(西北側) Zhongshan Dist
+## 574 堤頂大道二段382號(旁) Zhongshan Dist
+## 575 通北街146巷2弄2號(對面公園) Zhongshan Dist
+## 576 崇實路/大直街62巷(東南側) Zhongshan Dist
+## 577 樂群二路/明水路口(東北側) Zhongshan Dist
+## 578 北安路676號前人行道 Zhongshan Dist
+## 579 敬業三路11號(植福路側對面) Zhongshan Dist
+## 580 敬業三路155號(前) Zhongshan Dist
+## 581 樂群二路186號 Zhongshan Dist
+## 582 北安路536號(旁) Zhongshan Dist
+## 583 復興南路一段36-9號前人行道 Zhongshan Dist
+## 584 南京東路三段189號(對面) Zhongshan Dist
+## 585 伊通街/長安東路二段(西南側路側) Zhongshan Dist
+## 586 新生北路一段/長安東路二段交叉口(北側) Zhongshan Dist
+## 587 市民大道二段/林森北路(東北側) Zhongshan Dist
+## 588 新生北路一段/南京東路一段口(橋墩下方) Zhongshan Dist
+## 589 一江街/松江路132巷口(西北側) Zhongshan Dist
+## 590 松江路/松江路84巷(西北側路側) Zhongshan Dist
+## 591 新生北路二段/新生北路二段68巷交叉口(新生橋下) Zhongshan Dist
+## 592 民族東路410巷2弄18號(東側) Zhongshan Dist
+## 593 民生東路三段 / 建國北路二段口 Zhongshan Dist
+## 594 興安街53-4號對側 Zhongshan Dist
+## 595 復興北路386號南側 Zhongshan Dist
+## 596 龍江路287號前方 Zhongshan Dist
+## 597 建國北路/長春路口(南側) Zhongshan Dist
+## 598 南京東路二段/建國北路二段(北側) Zhongshan Dist
+## 599 松江路119號前 Zhongshan Dist
+## 600 龍江路15號前 Zhongshan Dist
+## 601 松江路170巷20號對側 Zhongshan Dist
+## 602 市民大道與長安東路一段52巷口 Zhongshan Dist
+## 603 建國北路一段17巷/八德路二段137巷口 Zhongshan Dist
+## 604 合江街186號對側 Zhongshan Dist
+## 605 民權東路三段與龍江路口東南側 Zhongshan Dist
+## 606 捷運中山國小站(2號出口)後方 Zhongshan Dist
+## 607 松江路261號前 Zhongshan Dist
+## 608 林森北路582號(前) Zhongshan Dist
+## 609 民權東路一段/民權東路一段71巷口 Zhongshan Dist
+## 610 農安街12-1號前方 Zhongshan Dist
+## 611 新生北路三段76號對側 Zhongshan Dist
+## 612 民族東路17號前 Zhongshan Dist
+## 613 花博公園5號出入口旁 Zhongshan Dist
+## 614 中山北路三段54號前 Zhongshan Dist
+## 615 新生北路一段與林森北路107巷口(新生高架橋下) Zhongshan Dist
+## 616 南京東路一段86號前 Zhongshan Dist
+## 617 吉林路108巷與南京東路二段21巷口東南側 Zhongshan Dist
+## 618 新生北路二段45巷(中原公園西側) Zhongshan Dist
+## 619 民族東路512巷13弄4號 Zhongshan Dist
+## 620 復興北路488巷2弄5號對側 Zhongshan Dist
+## 621 五常街77號對側 Zhongshan Dist
+## 622 民權東路三段/建國北路三段口(東北側) Zhongshan Dist
+## 623 松江路433號前 Zhongshan Dist
+## 624 德惠街170巷22號對側 Zhongshan Dist
+## 625 吉林路401號前 Zhongshan Dist
+## 626 民族東路與松江路口西北側 Zhongshan Dist
+## 627 濱江街5號對側 Zhongshan Dist
+## 628 中山北路二段128巷口 Zhongshan Dist
+## 629 渭水路54號對側 Zhongshan Dist
+## 630 南京西路4號前 Zhongshan Dist
+## 631 中山北路三段2號對側 Zhongshan Dist
+## 632 民族東路/吉林路口(西北側) Zhongshan Dist
+## 633 松江路230號前 Zhongshan Dist
+## 634 長春路29號前 Zhongshan Dist
+## 635 建國北路/農安街口(建國橋下) Zhongshan Dist
+## 636 松江路77巷口 Zhongshan Dist
+## 637 建國北路一段與長安東路二段口北側 Zhongshan Dist
+## 638 新生北路一段36號前 Zhongshan Dist
+## 639 民權東路二段51號前 Zhongshan Dist
+## 640 中山北路三段25號前 Zhongshan Dist
+## 641 中山北路二段48巷7號前 Zhongshan Dist
+## 642 松江路188巷11號對側 Zhongshan Dist
+## 643 吉林路125號前 Zhongshan Dist
+## 644 民生東路二段33號旁 Zhongshan Dist
+## 645 民生東路三段67號前 Zhongshan Dist
+## 646 錦州街174號前 Zhongshan Dist
+## 647 中山北路二段59之3號前 Zhongshan Dist
+## 648 民生東路一段23巷/民生東路一段27巷口 Zhongshan Dist
+## 649 新生北路二段100號前 Zhongshan Dist
+## 650 濱江街199巷(八號疏散門前) Zhongshan Dist
+## 651 濱江街154巷對側 Zhongshan Dist
+## 652 民族東路336號前 Zhongshan Dist
+## 653 興安街60號對側 Zhongshan Dist
+## 654 復興北路514巷66號前側 Zhongshan Dist
+## 655 中山北路二段113-133號前 Zhongshan Dist
+## 656 植福路/樂群三路(西北側) Zhongshan Dist
+## 657 錦州街13巷/中山北路二段137巷口(東南側) Zhongshan Dist
+## 658 南京東路二段178-1號 Zhongshan Dist
+## 659 南京東路三段121號前 Zhongshan Dist
+## 660 撫順街41巷1-7號對側 Zhongshan Dist
+## 661 大直街28號對側 Zhongshan Dist
+## 662 北安路535之2號旁 Zhongshan Dist
+## 663 松江路95-1至109號前方 Zhongshan Dist
+## 664 敬業三路177巷南側 Zhongshan Dist
+## 665 民生東路二段134號前 Zhongshan Dist
+## 666 松江路208號前 Zhongshan Dist
+## 667 吉林路100號對側 Zhongshan Dist
+## 668 長春路120號前 Zhongshan Dist
+## 669 長春路135號前 Zhongshan Dist
+## 670 南京東路二段101號前 Zhongshan Dist
+## 671 南京東路二段85號前 Zhongshan Dist
+## 672 松江路158號前 Zhongshan Dist
+## 673 北安路301號前 Zhongshan Dist
+## 674 民族西路口與玉門街口東北側 Zhongshan Dist
+## 675 新生北路三段與農安街口(高架橋下) Zhongshan Dist
+## 676 農安街77巷與農安街77巷1弄口 Zhongshan Dist
+## 677 北安路458巷41弄52之1號前 Zhongshan Dist
+## 678 樂群二路 / 明水路口(東側) Zhongshan Dist
+## 679 民權東路二段46號前 Zhongshan Dist
+## 680 長春路與龍江路口西北側 Zhongshan Dist
+## 681 民權東路一段/新生北路三段(北側)(新生高架橋下) Zhongshan Dist
+## 682 建國北路/長春路口(北側) Zhongshan Dist
+## 683 松江路/農安街口 Zhongshan Dist
+## 684 中山北路三段(花博流行館前) Zhongshan Dist
+## 685 通北街143號前 Zhongshan Dist
+## 686 樂群二路266巷99號前 Zhongshan Dist
+## 687 林森北路/南京東路一段 Zhongshan Dist
+## 688 樂群二路30巷/樂群二路116巷61弄 Zhongshan Dist
+## 689 南京東路三段109巷/龍江路120巷 Zhongshan Dist
+## 690 新生北路三段/民族東路(西南側) Zhongshan Dist
+## 691 捷運南京復興站(1號出口)後方(遼寧街155巷) Zhongshan Dist
+## 692 建國南路一段/市民大道交叉口(北側) Zhongshan Dist
+## 693 龍江路/朱崙街口西北側 Zhongshan Dist
+## 694 大直街94巷口 Zhongshan Dist
+## 695 南京東路三段221號前 Zhongshan Dist
+## 696 民權東路三段/建國北路二段(南側高架橋下) Zhongshan Dist
+## 697 德惠街11號東側 Zhongshan Dist
+## 698 新生北路三段/濱江街口(東南側) Zhongshan Dist
+## 699 新生北路一段64號對側 Zhongshan Dist
+## 700 新生北路二段39-2號對側 Zhongshan Dist
+## 701 北安路807號 Zhongshan Dist
+## 702 敬業三路/樂群三路口 Zhongshan Dist
+## 703 長春路258巷6號北側 Zhongshan Dist
+## 704 遼寧街201巷13號前 Zhongshan Dist
+## 705 建國北路三段/五常街 Zhongshan Dist
+## 706 中山北路二段66號前 Zhongshan Dist
+## 707 市民大道三段179號前 Zhongshan Dist
+## 708 市民大道二段/市民大道二段5巷 Zhongshan Dist
+## 709 南京西路1號前 Zhongshan Dist
+## 710 建國北路高架橋下停車場G區 Zhongshan Dist
+## 711 龍江路45巷42號對側 Zhongshan Dist
+## 712 復興北路56號 Zhongshan Dist
+## 713 松江路316號旁 Zhongshan Dist
+## 714 建國北路三段/建國北路三段86巷 Zhongshan Dist
+## 715 長安東路一段56巷/長安東路一段 Zhongshan Dist
+## 716 松江路148號旁 Zhongshan Dist
+## 717 堤頂大道二段246巷3號旁 Zhongshan Dist
+## 718 北安路與通北街口東北側 Zhongshan Dist
+## 719 民權東路三段69號前 Zhongshan Dist
+## 720 長春路167號前 Zhongshan Dist
+## 721 北安路/明水路(公車站:自強隧道) Zhongshan Dist
+## 722 文湖街21巷118弄6-10號(前) Neihu Dist
+## 723 內湖路一段66-72號前方公園 Neihu Dist
+## 724 基湖路37號西側 Neihu Dist
+## 725 內湖路一段225巷口 Neihu Dist
+## 726 文湖街21巷口北側 Neihu Dist
+## 727 文湖街81巷10號西側 Neihu Dist
+## 728 環山路一段56號南側 Neihu Dist
+## 729 內湖路一段411巷19弄9號對側 Neihu Dist
+## 730 環山路二段141號北側 Neihu Dist
+## 731 環山路二段81號西北側 Neihu Dist
+## 732 大湖山莊街/大湖山莊街176巷(東南側) Neihu Dist
+## 733 東湖路113巷49弄3號北側 Neihu Dist
+## 734 東湖路113巷95弄13號西側 Neihu Dist
+## 735 港墘路221巷2號 Neihu Dist
+## 736 瑞光路271號東南側 Neihu Dist
+## 737 成功路五段5號東側 Neihu Dist
+## 738 康寧路一段116號 Neihu Dist
+## 739 星雲街47號南側 Neihu Dist
+## 740 環山路一段9巷9號對側 Neihu Dist
+## 741 內湖路一段291號(對面) Neihu Dist
+## 742 瑞光路500號(對面) Neihu Dist
+## 743 港華街57號(對面) Neihu Dist
+## 744 環山路二段/環山路二段26巷(西南側) Neihu Dist
+## 745 成功路四段188號 Neihu Dist
+## 746 內湖路三段60巷28號東側 Neihu Dist
+## 747 金龍路203-8號北側 Neihu Dist
+## 748 文德路212號旁 Neihu Dist
+## 749 陽光街與文德路220巷口西側 Neihu Dist
+## 750 陽光街與陽光街68巷102弄口 Neihu Dist
+## 751 文德路210巷12號對側 Neihu Dist
+## 752 文德路22巷6號(對面) Neihu Dist
+## 753 文德路22巷與文德路22巷74弄口 Neihu Dist
+## 754 潭美街213號南側 Neihu Dist
+## 755 南京東路六段180號北側 Neihu Dist
+## 756 行善路179號南側 Neihu Dist
+## 757 新明路341號北側 Neihu Dist
+## 758 潭美街139號對側 Neihu Dist
+## 759 民權東路六段99號(前) Neihu Dist
+## 760 康樂街61巷73弄22-1號南側 Neihu Dist
+## 761 安康路32巷24弄22號 Neihu Dist
+## 762 石潭路27號南側 Neihu Dist
+## 763 南京東路六段382號西南側 Neihu Dist
+## 764 新明路22號 Neihu Dist
+## 765 民權東路六段50號 Neihu Dist
+## 766 瑞光路160號 Neihu Dist
+## 767 民權東路六段15巷29號 Neihu Dist
+## 768 民權東路六段30號 Neihu Dist
+## 769 新湖三路36號 Neihu Dist
+## 770 南京東路六段125號南側 Neihu Dist
+## 771 潭美街27號西側 Neihu Dist
+## 772 成功路二段424號(對面) Neihu Dist
+## 773 民權東路六段/民權東路六段180巷(西南側) Neihu Dist
+## 774 民權東路六段208號(前) Neihu Dist
+## 775 康寧路三段39號(對面) Neihu Dist
+## 776 金湖路363巷11號(對面) Neihu Dist
+## 777 金湖路347巷125弄1號(對面) Neihu Dist
+## 778 內湖路二段/內湖路二段103巷口(東北側) Neihu Dist
+## 779 內湖路二段103巷76號(對面) Neihu Dist
+## 780 內湖路二段179巷48弄17號(旁) Neihu Dist
+## 781 內湖路二段334號(前) Neihu Dist
+## 782 成功路四段167巷6弄2號(旁) Neihu Dist
+## 783 康寧路一段273號(對面) Neihu Dist
+## 784 康寧路一段156巷/康寧路一段156巷20弄(西側) Neihu Dist
+## 785 五分街14巷31號(對面) Neihu Dist
+## 786 安泰街83巷3號(對面) Neihu Dist
+## 787 康樂街236-3號(前) Neihu Dist
+## 788 內湖路一段520號 Neihu Dist
+## 789 康樂街125巷4號(對面) Neihu Dist
+## 790 安康路28號西北側 Neihu Dist
+## 791 安康路290號西側 Neihu Dist
+## 792 康寧路三段60號南側 Neihu Dist
+## 793 康寧路三段54-5號西側 Neihu Dist
+## 794 行善路39號(前) Neihu Dist
+## 795 南京東路六段122號(斜前方) Neihu Dist
+## 796 民權東路六段206巷/民權東路六段190巷75弄(西北側) Neihu Dist
+## 797 民權東路六段247號(前) Neihu Dist
+## 798 東湖路與東湖路113巷口東側 Neihu Dist
+## 799 成功路四段182巷/成功路四段口(西側) Neihu Dist
+## 800 港墘路185號前 Neihu Dist
+## 801 瑞湖街101號對側 Neihu Dist
+## 802 金龍路112巷口(金龍公園側) Neihu Dist
+## 803 星雲街138巷18號 Neihu Dist
+## 804 康寧路三段189巷163弄13號東南側 Neihu Dist
+## 805 康寧路三段99巷39弄70號東南側 Neihu Dist
+## 806 成功路五段420巷17號東側 Neihu Dist
+## 807 堤頂大道一段215號前 Neihu Dist
+## 808 成功路二段189號北側 Neihu Dist
+## 809 行善路179號西側 Neihu Dist
+## 810 新湖二路/新湖二路250巷(西南側) Neihu Dist
+## 811 成功路四段41巷6號前側 Neihu Dist
+## 812 金湖路83號對側 Neihu Dist
+## 813 民權東路六段161號前側 Neihu Dist
+## 814 民權東路六段190巷117弄15號對側 Neihu Dist
+## 815 洲子街12號前 Neihu Dist
+## 816 文湖街21巷68弄25-6號北側 Neihu Dist
+## 817 內湖路二段179巷242號對側 Neihu Dist
+## 818 行善路243號(前) Neihu Dist
+## 819 民善街88號(旁) Neihu Dist
+## 820 安美街181號前 Neihu Dist
+## 821 陽光街161巷14號對側 Neihu Dist
+## 822 南京東路六段366號對側 Neihu Dist
+## 823 文湖街60巷/環山路一段24巷(北側) Neihu Dist
+## 824 民權東路六段47巷6號對側 Neihu Dist
+## 825 瑞光路102號前 Neihu Dist
+## 826 安康路315巷/五分街14巷(西側) Neihu Dist
+## 827 民權東路六段/成功路二段320巷31弄(東南側) Neihu Dist
+## 828 內湖路三段72巷15號西側 Neihu Dist
+## 829 民權東路六段409號前 Neihu Dist
+## 830 瑞光路353號前(瑞光路側人行道) Neihu Dist
+## 831 瑞光路355號前(港墘路側人行道) Neihu Dist
+## 832 康樂街151巷/康樂街 Neihu Dist
+## 833 內湖路一段358號 Neihu Dist
+## 834 成功路三段83號前 Neihu Dist
+## 835 內湖路一段47巷/內湖路一段47巷22弄 Neihu Dist
+## 836 陽光街/舊宗路二段 Neihu Dist
+## 837 東湖路113巷95弄/康寧路三段75巷 Neihu Dist
+## 838 成功路二段250巷23弄/成功路二段312巷 Neihu Dist
+## 839 安泰街(康樂橋下) Neihu Dist
+## 840 康樂街191巷/康樂街 Neihu Dist
+## 841 內湖路一段663號前 Neihu Dist
+## 842 行善路333巷92號前 Neihu Dist
+## 843 行善路383巷27號對側 Neihu Dist
+## 844 舊宗路一段/新湖三路(南側) Neihu Dist
+## 845 舊宗路二段/民權東路六段11巷 Neihu Dist
+## 846 內湖路三段326巷/內湖路三段 Neihu Dist
+## 847 成功路四段223巷/成功路四段223巷6弄 Neihu Dist
+## 848 康寧路三段189巷/康寧路三段189巷93弄 Neihu Dist
+## 849 內湖路二段368號對側 Neihu Dist
+## 850 東湖路160巷23號 Neihu Dist
+## 851 環山路三段/環山路三段16巷口(東南側) Neihu Dist
+## 852 內湖區文德路91號旁 Neihu Dist
+## 853 新湖三路28號前人行道 Neihu Dist
+## 854 行愛路與新湖一路口西南側 Neihu Dist
+## 855 康寧路三段99巷19號對側 Neihu Dist
+## 856 堤頂大道二段405號前 Neihu Dist
+## 857 堤頂大道二段473號前 Neihu Dist
+## 858 瑞光路669號旁 Neihu Dist
+## 859 內湖路一段290號前 Neihu Dist
+## 860 民權東路六段11巷25號對側 Neihu Dist
+## 861 民權東路六段15巷/民權東路六段19巷 Neihu Dist
+## 862 陽光街323號 Neihu Dist
+## 863 瑞光路423號 Neihu Dist
+## 864 瑞光路/瑞光路358巷 Neihu Dist
+## 865 洲子街/瑞光路393巷 Neihu Dist
+## 866 內湖路一段396號 Neihu Dist
+## 867 民權東路六段56巷7號對側 Neihu Dist
+## 868 新湖三路/行忠路72巷 Neihu Dist
+## 869 新湖三路122、124號對側 Neihu Dist
+## 870 舊宗路一段/新湖二路(南側) Neihu Dist
+## 871 基湖路12號 Neihu Dist
+## 872 內湖路一段120巷15弄8號對側 Neihu Dist
+## 873 堤頂大道二段501號前 Neihu Dist
+## 874 洲子街61號 Neihu Dist
+## 875 康樂街110巷21號對側 Neihu Dist
+## 876 內湖路一段360巷17-19號 Neihu Dist
+## 877 星雲街156號對側 Neihu Dist
+## 878 內湖區內湖路一段289號 Neihu Dist
+## 879 潭美街537號前 Neihu Dist
+## 880 內湖路一段91巷16號對側 Neihu Dist
+## 881 瑞光路316巷35號 Neihu Dist
+## 882 文德路與文德路220巷口西南側 Neihu Dist
+## 883 安美街38號前方 Neihu Dist
+## 884 康寧路三段16巷6號斜對面 Neihu Dist
+## 885 康樂街201巷25-35號對側 Neihu Dist
+## 886 環山路三段15號對面 Neihu Dist
+## 887 南京東路六段482號 Neihu Dist
+## 888 承德路七段306-308號(前) Beitou Dist
+## 889 洲美街271號(對面) Beitou Dist
+## 890 明德路212號(榮華二路側人行道) Beitou Dist
+## 891 西安街一段明德路口(東南側) Beitou Dist
+## 892 文林北路214-216號(前) Beitou Dist
+## 893 行義路10巷2號(旁) Beitou Dist
+## 894 知行路360號(旁) Beitou Dist
+## 895 關渡路68號(對面) Beitou Dist
+## 896 知行路235巷7號(對面) Beitou Dist
+## 897 中央北路四段262號(對面) Beitou Dist
+## 898 大度路三段270巷/立功街55巷(西南側) Beitou Dist
+## 899 捷運關渡站2號出口外人行道 Beitou Dist
+## 900 中央北路四段529號(對面) Beitou Dist
+## 901 大度路三段立德路口(西北側) Beitou Dist
+## 902 中央北路三段9-1號(對面) Beitou Dist
+## 903 中央北路三段185號(前方) Beitou Dist
+## 904 大業路529號(對面) Beitou Dist
+## 905 稻香重三路口(對面路側) Beitou Dist
+## 906 中央北路二段167號(對面) Beitou Dist
+## 907 秀山路50號(旁) Beitou Dist
+## 908 大業路671號(對面) Beitou Dist
+## 909 中和街10號(對面) Beitou Dist
+## 910 光明路2巷3號(對面) Beitou Dist
+## 911 三合街二段486號(旁) Beitou Dist
+## 912 北投路一段臨20號(旁) Beitou Dist
+## 913 公舘路198號(對面) Beitou Dist
+## 914 大業路302號(前) Beitou Dist
+## 915 承德路七段/吉利街(西北側) Beitou Dist
+## 916 三合街一段119號(前) Beitou Dist
+## 917 西安街二段345-349號(對面) Beitou Dist
+## 918 石牌路一段39巷100號(旁) Beitou Dist
+## 919 東華街二段136號(對面) Beitou Dist
+## 920 東華街一段526號(對面) Beitou Dist
+## 921 石牌路二段100號(前) Beitou Dist
+## 922 石牌路一段139號(對面) Beitou Dist
+## 923 明德路365號(前) Beitou Dist
+## 924 石牌路一段142號(對面) Beitou Dist
+## 925 天母西路109號(對面) Beitou Dist
+## 926 立農街一段201號(對面) Beitou Dist
+## 927 承德路七段260號(前) Beitou Dist
+## 928 自強街61巷8號(旁) Beitou Dist
+## 929 榮華三路2號(旁) Beitou Dist
+## 930 文林北路77號(前) Beitou Dist
+## 931 立德路15號(前) Beitou Dist
+## 932 中央北路四段32號(旁) Beitou Dist
+## 933 陽明交大圖書館後方機車停車場 Beitou Dist
+## 934 光明路225號(對面) Beitou Dist
+## 935 中和街61號對側 Beitou Dist
+## 936 承德路七段與石牌路一段口北側 Beitou Dist
+## 937 承德路七段192-198號前 Beitou Dist
+## 938 明德路95號 Beitou Dist
+## 939 大興街145號前 Beitou Dist
+## 940 福美路199號旁 Beitou Dist
+## 941 中和街455巷11弄6-8號(前) Beitou Dist
+## 942 洲美蜆仔港公園西南側(福美路側) Beitou Dist
+## 943 杏林一路3號(旁) Beitou Dist
+## 944 珠海路/復興一路口(東側) Beitou Dist
+## 945 裕民二路33巷/裕民六路(西北側) Beitou Dist
+## 946 磺港路269-271號(旁) Beitou Dist
+## 947 珠海路145號(對側公園) Beitou Dist
+## 948 三合街一段79巷16號(對面) Beitou Dist
+## 949 石牌路二段185號對側 Beitou Dist
+## 950 磺港路/清江路177巷(東側) Beitou Dist
+## 951 文林北路280號(對側公園) Beitou Dist
+## 952 珠海路1號旁 Beitou Dist
+## 953 大業路539號 Beitou Dist
+## 954 光明路148號對側人行道 Beitou Dist
+## 955 立德路125號 Beitou Dist
+## 956 秀山路26號(懷遠新村社區入口南側) Beitou Dist
+## 957 中山路6號西側(北投溪木道西側) Beitou Dist
+## 958 中和街493巷9弄2號對側 Beitou Dist
+## 959 光明路2巷/光明路交叉口 Beitou Dist
+## 960 石牌路二段/立農街二段口 Beitou Dist
+## 961 捷運唭哩岸站一(東華) 公車亭對側人行道 Beitou Dist
+## 962 大興街50號對側人行道 Beitou Dist
+## 963 捷運忠義站(2號出口)無障礙坡道旁 Beitou Dist
+## 964 承德路六段80號南側 Beitou Dist
+## 965 捷運北投站(1號出口)(北投路側) Beitou Dist
+## 966 承德路六段120號(北側地下室車道旁) Beitou Dist
+## 967 公舘路255巷43號東側道路對面 Beitou Dist
+## 968 文化三路2號西側公園 Beitou Dist
+## 969 中和街365號旁 Beitou Dist
+## 970 大業路/大業路65巷口 Beitou Dist
+## 971 承德路七段390號前 Beitou Dist
+## 972 文林北路112號 Beitou Dist
+## 973 永興路一段32巷/永興路一段 Beitou Dist
+## 974 知行路210巷16號前對側 Beitou Dist
+## 975 立功街76號對側 Beitou Dist
+## 976 承德路七段401巷200號斜對面 Beitou Dist
+## 977 大業路6號 Beitou Dist
+## 978 八德路四段742號 Songshan Dist
+## 979 塔悠路2號(旁) Songshan Dist
+## 980 健康路399號北側 Songshan Dist
+## 981 八德路四段91巷9號(對面) Songshan Dist
+## 982 南京東路五段156號(前) Songshan Dist
+## 983 捷運南京三民站(1號出口) Songshan Dist
+## 984 光復北路13號(旁) Songshan Dist
+## 985 南京東路五段229號(前) Songshan Dist
+## 986 健康路325巷5弄5號(前) Songshan Dist
+## 987 民權東路三段119號(前) Songshan Dist
+## 988 民族東路712號(對面) Songshan Dist
+## 989 敦化北路244巷43號(對面) Songshan Dist
+## 990 敦化北路216號(對面) Songshan Dist
+## 991 長春路432號(對面) Songshan Dist
+## 992 三民路166巷1號(對面) Songshan Dist
+## 993 民生東路五段163-1號(前) Songshan Dist
+## 994 南京東路四段6號(前) Songshan Dist
+## 995 八德路三段25號(前) Songshan Dist
+## 996 敦化北路199巷15號(旁) Songshan Dist
+## 997 敦化北路/富錦街77巷口(東南側) Songshan Dist
+## 998 民權東路四段/新中街口(西南側) Songshan Dist
+## 999 民生東路五段/塔悠路口(西南側) Songshan Dist
+## 1000 光復北路266號(前) Songshan Dist
+## 1001 撫遠街298號對側公園 Songshan Dist
+## 1002 八德路三段74巷95號南側 Songshan Dist
+## 1003 市民大道四段123號 Songshan Dist
+## 1004 光復北路/光復北路190巷口(東南側) Songshan Dist
+## 1005 延壽街356巷/延壽街330巷16弄(東北側) Songshan Dist
+## 1006 健康路305號(前) Songshan Dist
+## 1007 民權東路四段/光復北路(東北側) Songshan Dist
+## 1008 東興路33號南側 Songshan Dist
+## 1009 光復南路19號西側 Songshan Dist
+## 1010 光復南路58巷11號東側 Songshan Dist
+## 1011 健康路78號(對面) Songshan Dist
+## 1012 八德路二段342號(前) Songshan Dist
+## 1013 南京東路四段186號前 Songshan Dist
+## 1014 民生東路五段84號前 Songshan Dist
+## 1015 健康路179號前 Songshan Dist
+## 1016 三民路43巷1號前 Songshan Dist
+## 1017 八德路四段106巷/八德路四段106巷6弄口(東側) Songshan Dist
+## 1018 市民大道四段73號前 Songshan Dist
+## 1019 慶城街1號(東南側) Songshan Dist
+## 1020 南京東路三段262號 Songshan Dist
+## 1021 民權東路五段41之1號 Songshan Dist
+## 1022 敦化北路/八德路三段(東北側) Songshan Dist
+## 1023 南京東路四段75-1號前 Songshan Dist
+## 1024 敦化北路112號前 Songshan Dist
+## 1025 松河街182號對側 Songshan Dist
+## 1026 八德路四段685號前 Songshan Dist
+## 1027 民權東路三段102號前 Songshan Dist
+## 1028 南京東路五段57號(前) Songshan Dist
+## 1029 塔悠路/撫遠街261巷(西側) Songshan Dist
+## 1030 寶清街/寶清街30巷(北側) Songshan Dist
+## 1031 健康路/南京東路五段251巷50弄(西側) Songshan Dist
+## 1032 健康路174號(旁) Songshan Dist
+## 1033 八德路三段106巷62號(對面) Songshan Dist
+## 1034 南京東路四段163號(前) Songshan Dist
+## 1035 八德路三段25號前 Songshan Dist
+## 1036 健康路325巷 / 健康路325巷12弄口(東北側) Songshan Dist
+## 1037 南京東路五段 / 東興路口(北側) Songshan Dist
+## 1038 松山路/市民大道六段(西北側捷運3號出口) Songshan Dist
+## 1039 民生東路五段36巷/光復北路165巷 Songshan Dist
+## 1040 敦化北路/南京東路四段 Songshan Dist
+## 1041 敦化南路一段/八德路二段(西南側) Songshan Dist
+## 1042 三民路 / 新東街51巷口(東側) Songshan Dist
+## 1043 八德路/松信路(西南側) Songshan Dist
+## 1044 長春路431號前 Songshan Dist
+## 1045 八德路四段650號南側 Songshan Dist
+## 1046 八德路四段711號前 Songshan Dist
+## 1047 南京東路四段12號前 Songshan Dist
+## 1048 南京東路四段/健康路(西北側) Songshan Dist
+## 1049 敦化北路151號前分隔島 Songshan Dist
+## 1050 民生東路三段/復興北路(東南側) Songshan Dist
+## 1051 市民大道/延吉街(市民大道橋下空地) Songshan Dist
+## 1052 光復北路190巷35號對側 Songshan Dist
+## 1053 捷運南京三民站(3號出口) Songshan Dist
+## 1054 南京東路五段386號前 Songshan Dist
+## 1055 五常街370巷8號 Songshan Dist
+## 1056 延壽街119巷/延壽街 Songshan Dist
+## 1057 市民大道五段111號前 Songshan Dist
+## 1058 民族東路630號對側 Songshan Dist
+## 1059 撫遠街390巷27號對側 Songshan Dist
+## 1060 民生東路五段191號 Songshan Dist
+## 1061 民權東路三段211號前人行道 Songshan Dist
+## 1062 東新街170巷1號西南側 Nangang Dist
+## 1063 福德街383號北側 Nangang Dist
+## 1064 忠孝東路六段403號 Nangang Dist
+## 1065 忠孝東路六段219號 Nangang Dist
+## 1066 中坡北路7號東側 Nangang Dist
+## 1067 玉成街46號東側 Nangang Dist
+## 1068 忠孝東路六段17號東北側 Nangang Dist
+## 1069 東新街118巷15號南側 Nangang Dist
+## 1070 玉成街247號對側 Nangang Dist
+## 1071 舊莊街一段1號西側 Nangang Dist
+## 1072 研究院路二段128號(體育館) Nangang Dist
+## 1073 研究院路一段130巷99號(國家生技園區) Nangang Dist
+## 1074 研究院路一段1號(5號出口) Nangang Dist
+## 1075 研究院路二段12巷58弄9號西側 Nangang Dist
+## 1076 福山街44巷27號東南側 Nangang Dist
+## 1077 舊莊街一段91巷11號西南側 Nangang Dist
+## 1078 研究院路三段68巷9號北側 Nangang Dist
+## 1079 市民大道八段532號北側 Nangang Dist
+## 1080 經貿二路183號(2號出口) Nangang Dist
+## 1081 惠民街67號東南側 Nangang Dist
+## 1082 興中路44巷1號東側 Nangang Dist
+## 1083 南港路一段350號 Nangang Dist
+## 1084 重陽路125巷34號東側 Nangang Dist
+## 1085 向陽路49號北側 Nangang Dist
+## 1086 忠孝東路七段510號西北側 Nangang Dist
+## 1087 忠孝東路七段380號(2號出口) Nangang Dist
+## 1088 忠孝東路七段380號(1號出口) Nangang Dist
+## 1089 東明街68號北側 Nangang Dist
+## 1090 研究院路三段246號東側 Nangang Dist
+## 1091 研究院路二段35巷23弄25號北側 Nangang Dist
+## 1092 研究院路二段3巷1號西側 Nangang Dist
+## 1093 南港路二段200-1號南側 Nangang Dist
+## 1094 重陽路269號南側 Nangang Dist
+## 1095 市民大道八段99號 Nangang Dist
+## 1096 南港路一段313號(市民大道) Nangang Dist
+## 1097 忠孝東路七段552號 Nangang Dist
+## 1098 新民街15號北側 Nangang Dist
+## 1099 經貿二路188-1號 Nangang Dist
+## 1100 研究院路三段10巷1號東側 Nangang Dist
+## 1101 南港路三段47巷8號南側 Nangang Dist
+## 1102 昆陽街58號東側 Nangang Dist
+## 1103 南港路三段314巷20號 Nangang Dist
+## 1104 南港路三段133號 Nangang Dist
+## 1105 東新街4號東側 Nangang Dist
+## 1106 八德路四段873號 Nangang Dist
+## 1107 玉成街150號 Nangang Dist
+## 1108 中坡南路19號 Nangang Dist
+## 1109 福德街309巷7號南側 Nangang Dist
+## 1110 經貿二路255巷1號 Nangang Dist
+## 1111 重陽路458號西側 Nangang Dist
+## 1112 忠孝東路七段359號(市民大道) Nangang Dist
+## 1113 研究院路二段/研究院路二段132巷北側 Nangang Dist
+## 1114 重陽路505號 Nangang Dist
+## 1115 經園街58號北側 Nangang Dist
+## 1116 惠民街71號西側 Nangang Dist
+## 1117 富康街1巷16弄2號東側 Nangang Dist
+## 1118 研究院路一段101巷16弄2號南側 Nangang Dist
+## 1119 舊莊街一段/舊莊街一段145巷口 Nangang Dist
+## 1120 成功路一段76號對側 Nangang Dist
+## 1121 向陽路258巷/重陽路39巷口(西南側) Nangang Dist
+## 1122 南港路一段28號旁 Nangang Dist
+## 1123 南港路一段32號(4號出口) Nangang Dist
+## 1124 東新街65號東南側 Nangang Dist
+## 1125 東新街170巷63號對側 Nangang Dist
+## 1126 中坡北路/市民大道七段路口(東北側) Nangang Dist
+## 1127 昆陽街173號對側 Nangang Dist
+## 1128 南港路二段 / 南港路二段178巷口(北側) Nangang Dist
+## 1129 忠孝東路七段/興中路(西北側) Nangang Dist
+## 1130 興華路/市民大道八段路口西北側人行道 Nangang Dist
+## 1131 成福路178巷8號對側 Nangang Dist
+## 1132 東新街/市民大道七段(北側) Nangang Dist
+## 1133 福德街373巷80號前 Nangang Dist
+## 1134 成福路197巷/成福路 Nangang Dist
+## 1135 松河街398號對側 Nangang Dist
+## 1136 成福路/東新街80巷10弄 Nangang Dist
+## 1137 經貿二路/南港路一段(西北側) Nangang Dist
+## 1138 舊莊街一段/舊莊街一段215巷 Nangang Dist
+## 1139 南港路三段/南港路三段80巷 Nangang Dist
+## 1140 忠孝東路六段465號 Nangang Dist
+## 1141 忠孝東路/忠孝東路六段278巷 Nangang Dist
+## 1142 研究院路二段128號(人文社會科學館) Nangang Dist
+## 1143 松河街380號對側 Nangang Dist
+## 1144 松河街358號對側 Nangang Dist
+## 1145 忠孝東路六段226號前 Nangang Dist
+## 1146 富康街47巷2號對側 Nangang Dist
+## 1147 東新街/東新街63巷 Nangang Dist
+## 1148 研究院路二段70巷10弄/研究院路二段98巷 Nangang Dist
+## 1149 向陽路/市民大道七段 Nangang Dist
+## 1150 南港路二段312號 Nangang Dist
+## 1151 研究院路1段151巷18號前 Nangang Dist
+## 1152 經貿一路77號(港東街) Nangang Dist
+## 1153 和平東路三段391巷16號 Xinyi Dist
+## 1154 基隆路二段155號 Xinyi Dist
+## 1155 基隆路二段131-4號(前) Xinyi Dist
+## 1156 和平東路三段633號前 Xinyi Dist
+## 1157 和平東路三段530巷口東北側 Xinyi Dist
+## 1158 信安街50號(對面) Xinyi Dist
+## 1159 台北醫學大學(吳興街220巷59弄) Xinyi Dist
+## 1160 吳興街118巷35弄28號前方(三興公園) Xinyi Dist
+## 1161 松德路300號南側 Xinyi Dist
+## 1162 信義路五段128號東側 Xinyi Dist
+## 1163 松仁路153巷15號東側 Xinyi Dist
+## 1164 松仁路215巷6號 Xinyi Dist
+## 1165 松仁路101號東側 Xinyi Dist
+## 1166 信義路5段152號(1號出口) Xinyi Dist
+## 1167 松德路200巷53號北側 Xinyi Dist
+## 1168 虎林街164巷54號北側 Xinyi Dist
+## 1169 莊敬路391巷11弄2號(東北側) Xinyi Dist
+## 1170 松勤街100號(前) Xinyi Dist
+## 1171 信義路五段16號前 Xinyi Dist
+## 1172 莊敬路239巷12號(對面) Xinyi Dist
+## 1173 光復南路485號前方 Xinyi Dist
+## 1174 光復南路455號前方 Xinyi Dist
+## 1175 仁愛路四段與仁愛路四段496巷口西南側 Xinyi Dist
+## 1176 忠孝東路五段236巷15號(前) Xinyi Dist
+## 1177 信義路六段76巷2弄22號(對面) Xinyi Dist
+## 1178 林口街82號(對面) Xinyi Dist
+## 1179 松山路655號(前) Xinyi Dist
+## 1180 松山路721號(對面) Xinyi Dist
+## 1181 台北市政府東門(松智路) Xinyi Dist
+## 1182 松智路/松壽路(西北側) Xinyi Dist
+## 1183 市府路/松壽路(東北側) Xinyi Dist
+## 1184 市府路/松高路(東南側) Xinyi Dist
+## 1185 市府路/松壽路(西北側) Xinyi Dist
+## 1186 松智路/信義路(東北側) Xinyi Dist
+## 1187 市府路/信義路(西北側) Xinyi Dist
+## 1188 林口街230號(斜對面) Xinyi Dist
+## 1189 松仁路123號北側 Xinyi Dist
+## 1190 福德街251巷2號對側 Xinyi Dist
+## 1191 大道路與大道路145巷口 Xinyi Dist
+## 1192 松高路19號 Xinyi Dist
+## 1193 松仁路28號北側 Xinyi Dist
+## 1194 松隆路99號西南側 Xinyi Dist
+## 1195 松仁路277號南側 Xinyi Dist
+## 1196 吳興街600巷81號西側 Xinyi Dist
+## 1197 基隆路一段83巷9號西側 Xinyi Dist
+## 1198 松信路61號西側 Xinyi Dist
+## 1199 松山路11號南側 Xinyi Dist
+## 1200 松隆路161號對側 Xinyi Dist
+## 1201 松信路/永吉路西南側人行道 Xinyi Dist
+## 1202 基隆路二段99-1號(前) Xinyi Dist
+## 1203 市民大道六段/松信路口(西側) Xinyi Dist
+## 1204 忠孝東路四段599巷36號對側 Xinyi Dist
+## 1205 基隆路二段/光復南路(東北側) Xinyi Dist
+## 1206 忠孝東路四段550號 Xinyi Dist
+## 1207 松仁路308巷60號 Xinyi Dist
+## 1208 忠孝東路五段800號 Xinyi Dist
+## 1209 永吉路356號東側 Xinyi Dist
+## 1210 永吉路326巷66號西側 Xinyi Dist
+## 1211 永吉路323號西側 Xinyi Dist
+## 1212 松山路166號 Xinyi Dist
+## 1213 松山路279號 Xinyi Dist
+## 1214 信義路五段/信義路五段91巷口(西北側) Xinyi Dist
+## 1215 松德路168巷20號前 Xinyi Dist
+## 1216 市府路/松壽路口東南側 Xinyi Dist
+## 1217 松德路79號前 Xinyi Dist
+## 1218 松信路209號旁 Xinyi Dist
+## 1219 基隆路一段109-6號前 Xinyi Dist
+## 1220 虎林街132巷44號西側 Xinyi Dist
+## 1221 吳興街260巷/吳興街260巷21弄口(東南側) Xinyi Dist
+## 1222 林口街/福德街口(東南側) Xinyi Dist
+## 1223 仁愛路四段/逸仙路口(西北側) Xinyi Dist
+## 1224 虎林街222巷55號 Xinyi Dist
+## 1225 信義路四段393號前 Xinyi Dist
+## 1226 捷運台北101/世貿站(2號出口)(西側) Xinyi Dist
+## 1227 吳興街284巷36弄24號西側 Xinyi Dist
+## 1228 中坡南路51號對側 Xinyi Dist
+## 1229 福德街308號對側 Xinyi Dist
+## 1230 松仁路/松仁路95巷(東南側) Xinyi Dist
+## 1231 松智路/松廉路(東北側) Xinyi Dist
+## 1232 松勤街8號對側 Xinyi Dist
+## 1233 松平路50巷15號對側 Xinyi Dist
+## 1234 忠孝東路/松仁路(東南側) Xinyi Dist
+## 1235 中坡北路57號旁 Xinyi Dist
+## 1236 松仁路/吳興街583巷3弄 Xinyi Dist
+## 1237 吳興街394巷/吳興街 Xinyi Dist
+## 1238 忠孝東路五段/忠孝東路五段215巷 Xinyi Dist
+## 1239 松勤街/莊敬路 Xinyi Dist
+## 1240 松仁路/松平路 Xinyi Dist
+## 1241 信義路五段180號前 Xinyi Dist
+## 1242 忠孝東路五段71巷/忠孝東路五段31巷18弄 Xinyi Dist
+## 1243 吳興街284巷23號對側 Xinyi Dist
+## 1244 信安街67巷/信安街口東南側 Xinyi Dist
+## 1245 信安街67巷75號對側 Xinyi Dist
+## 1246 和平東路三段291號前 Xinyi Dist
+## 1247 永吉路478號前 Xinyi Dist
+## 1248 福德街84巷15號對側 Xinyi Dist
+## 1249 和平東路三段341巷63號對側 Xinyi Dist
+## 1250 松隆路36號對側 Xinyi Dist
+## 1251 信安街103巷/吳興街284巷22弄 Xinyi Dist
+## 1252 忠孝東路四段545號 Xinyi Dist
+## 1253 光復南路200號對側 Xinyi Dist
+## 1254 光復南路76號對側 Xinyi Dist
+## 1255 中坡北路35號前 Xinyi Dist
+## 1256 松仁路281巷66弄14號 Xinyi Dist
+## 1257 基隆路一段3號前方橋下空間 Xinyi Dist
+## 1258 寶興街186號(前) Wanhua Dist
+## 1259 寶興街/長泰街(西南側) Wanhua Dist
+## 1260 萬大路482號(旁) Wanhua Dist
+## 1261 國興路2號前 Wanhua Dist
+## 1262 中華路二段465號對側 Wanhua Dist
+## 1263 國興路1巷15號對側 Wanhua Dist
+## 1264 國興路42號對側 Wanhua Dist
+## 1265 國興路與青年路口西南側 Wanhua Dist
+## 1266 青年路66號對側 Wanhua Dist
+## 1267 青年公園籃球場南側 Wanhua Dist
+## 1268 西藏路123號前 Wanhua Dist
+## 1269 萬大路277巷37弄1號東側 Wanhua Dist
+## 1270 莒光路210號前 Wanhua Dist
+## 1271 莒光路137號前 Wanhua Dist
+## 1272 艋舺大道142號前 Wanhua Dist
+## 1273 東園街199號前方 Wanhua Dist
+## 1274 環河南路三段371號前 Wanhua Dist
+## 1275 德昌街243號前 Wanhua Dist
+## 1276 東園街66巷20弄27號前 Wanhua Dist
+## 1277 東園街35巷14號對側 Wanhua Dist
+## 1278 西園路二段與艋舺大道口西南側 Wanhua Dist
+## 1279 西園路二段320巷與興義街口 Wanhua Dist
+## 1280 長順街127號前 Wanhua Dist
+## 1281 環河南路二段250巷25弄2號對側 Wanhua Dist
+## 1282 環河南路二段216號旁 Wanhua Dist
+## 1283 環河南路二段282號前 Wanhua Dist
+## 1284 環河南路二段與西藏路口東側 Wanhua Dist
+## 1285 大理街177號對側 Wanhua Dist
+## 1286 艋舺大道與大理街160巷20弄口東側 Wanhua Dist
+## 1287 青年路188號前 Wanhua Dist
+## 1288 西寧南路12號(對面) Wanhua Dist
+## 1289 峨嵋街83號(旁) Wanhua Dist
+## 1290 環河南路一段280-1號(對面) Wanhua Dist
+## 1291 成都路108號(對面) Wanhua Dist
+## 1292 中華路一段164號(前) Wanhua Dist
+## 1293 中華路一段與桂林路口西北側 Wanhua Dist
+## 1294 和平西路三段/西園路一段(東北側) Wanhua Dist
+## 1295 和平西路三段235號(旁) Wanhua Dist
+## 1296 桂林路134號(對面) Wanhua Dist
+## 1297 康定路238號(對面) Wanhua Dist
+## 1298 艋舺大道83號(前) Wanhua Dist
+## 1299 康定路/康定路287巷(東南側) Wanhua Dist
+## 1300 和平西路三段/和平西路三段88巷(西南側) Wanhua Dist
+## 1301 峨嵋街100號(對面) Wanhua Dist
+## 1302 康定路18-2號(對面) Wanhua Dist
+## 1303 中華路一段130號(前) Wanhua Dist
+## 1304 康定路81號(對面) Wanhua Dist
+## 1305 萬大路346號(旁) Wanhua Dist
+## 1306 德昌街15號(對面) Wanhua Dist
+## 1307 環河南路一段/和平西路三段口(西南側) Wanhua Dist
+## 1308 長順街60巷38號對側 Wanhua Dist
+## 1309 東園街35巷/東園街67巷交叉口 Wanhua Dist
+## 1310 桂林路246巷66號南側 Wanhua Dist
+## 1311 環河南路二段100巷15號對側 Wanhua Dist
+## 1312 大理街170巷與環河南路二段159巷口 Wanhua Dist
+## 1313 長順街與雙園街106巷口 Wanhua Dist
+## 1314 富民路151號對側 Wanhua Dist
+## 1315 環河南路二段245號旁 Wanhua Dist
+## 1316 南寧路與廣州街口南側 Wanhua Dist
+## 1317 昆明街與洛陽街口西側 Wanhua Dist
+## 1318 桂林路與昆明街口西北側 Wanhua Dist
+## 1319 西藏路 / 莒光路299巷口(東南側) Wanhua Dist
+## 1320 青年路/青年路106巷(東側) Wanhua Dist
+## 1321 和平西路三段/和平西路三段109巷(西北側) Wanhua Dist
+## 1322 萬大路與興寧街66巷22弄口西北側 Wanhua Dist
+## 1323 艋舺大道與西藏路口西南側(華翠大橋下) Wanhua Dist
+## 1324 萬大路493巷44號旁 Wanhua Dist
+## 1325 西園路二段320巷55弄8-10號前 Wanhua Dist
+## 1326 青年路152巷59號對側 Wanhua Dist
+## 1327 和平西路二段190巷11號前 Wanhua Dist
+## 1328 環河南路三段/萬大路424巷 Wanhua Dist
+## 1329 長泰街45號對側 Wanhua Dist
+## 1330 水源路與青年路口北側 Wanhua Dist
+## 1331 青年路162號對側人行道 Wanhua Dist
+## 1332 水源路207之7號前 Wanhua Dist
+## 1333 環河南路二段與西藏路口 Wanhua Dist
+## 1334 艋舺大道404號前方 Wanhua Dist
+## 1335 德昌街142號對側 Wanhua Dist
+## 1336 汀洲路三段60巷2弄路側(A舍北側) NTU Dist
+## 1337 臺大水源舍區C南側 NTU Dist
+## 1338 思源街16號之1旁 NTU Dist
+## 1339 臺大檔案展示館東北側 NTU Dist
+## 1340 汀洲路三段60巷2弄路側(B舍北側) NTU Dist
+## 1341 臺大男八舍東側 NTU Dist
+## 1342 臺大仰萃樓東南側 NTU Dist
+## 1343 農業陳列館北側 NTU Dist
+## 1344 管理學院二號館北側 NTU Dist
+## 1345 臺大土木工程學系所南側 NTU Dist
+## 1346 臺大女一舍北側 NTU Dist
+## 1347 臺大女九舍西南側 NTU Dist
+## 1348 臺大小福樓東側 NTU Dist
+## 1349 基隆路三段/基隆路三段156巷口北側 NTU Dist
+## 1350 臺大工學院東南側 NTU Dist
+## 1351 臺大天文數學館西南側 NTU Dist
+## 1352 臺大心理學系南側 NTU Dist
+## 1353 臺大文學院西側 NTU Dist
+## 1354 臺大生化科技學系西側 NTU Dist
+## 1355 臺大生物系館西側 NTU Dist
+## 1356 臺大田徑場東側 NTU Dist
+## 1357 臺大共同教學館東北側 NTU Dist
+## 1358 臺大共同教學館東南側 NTU Dist
+## 1359 臺大鹿鳴廣場人行道側 NTU Dist
+## 1360 臺大公館停車場西北側 NTU Dist
+## 1361 臺大行政大樓西側 NTU Dist
+## 1362 臺大明達館西側 NTU Dist
+## 1363 臺大物理文物廳北側 NTU Dist
+## 1364 臺大物理系館南側 NTU Dist
+## 1365 臺大社科院西側 NTU Dist
+## 1366 臺大社會及社工館南側 NTU Dist
+## 1367 臺大思亮館東南側 NTU Dist
+## 1368 臺大椰林小舖旁 NTU Dist
+## 1369 臺大計算機網路資訊中心南側 NTU Dist
+## 1370 臺大原子與分子科學研究所東北側 NTU Dist
+## 1371 臺大動物博物館西側 NTU Dist
+## 1372 第一學生活動中心東南側 NTU Dist
+## 1373 臺大博理館西側 NTU Dist
+## 1374 臺大博雅館西側 NTU Dist
+## 1375 臺大森林系學系北側 NTU Dist
+## 1376 臺大植物魚類標本館一號館北側 NTU Dist
+## 1377 臺大進修教育大樓 NTU Dist
+## 1378 臺大雅頌廣場東南側 NTU Dist
+## 1379 臺大園藝暨景觀學系北側 NTU Dist
+## 1380 臺大新生教學館南側 NTU Dist
+## 1381 臺大新聞研究所南側 NTU Dist
+## 1382 臺大電機二館南側 NTU Dist
+## 1383 臺大圖書資訊館北側 NTU Dist
+## 1384 臺大圖書館西南側 NTU Dist
+## 1385 臺大霖澤館南側 NTU Dist
+## 1386 臺大獸醫系館南側 NTU Dist
+## 1387 臺大體育館東側 NTU Dist
+## 1388 明達館北側前空地 NTU Dist
+## snaen
+## 1 YouBike2.0_MRT Technology Bldg. Sta.
+## 2 YouBike2.0_No.273, Sec. 2, Fuxing S. Rd.
+## 3 YouBike2.0_NTUE Experiment Elementary School (East)
+## 4 YouBike2.0_Heping Park (East)
+## 5 YouBike2.0_Xinhai Fuxing Rd. Intersection (Northwest)
+## 6 YouBike2.0_No. 280, Sec. 2, Fuxing S. Rd.
+## 7 YouBike2.0_Ln. 340, Sec. 2, Fuxing S. Rd.
+## 8 YouBike2.0_No. 52, Sec. 3, Xinsheng S. Rd.
+## 9 YouBike2.0_No. 66, Sec. 3, Xinsheng S. Rd.
+## 10 YouBike2.0_No. 82, Sec. 3, Xinsheng S. Rd.
+## 11 YouBike2.0_No. 30, Sec. 1, Xinhai Rd.
+## 12 YouBike2.0_Heping Fuxing Rd. Intersection (Northwest)
+## 13 YouBike2.0_No. 311, Sec. 3, Roosevelt Rd.
+## 14 YouBike2.0_Taipei Da-an Sports Center Parking lot
+## 15 YouBike2.0_No. 245, Sec. 3, Roosevelt Rd.
+## 16 YouBike2.0_Wenzhou Park
+## 17 YouBike2.0_Heping Wolong St. Intersection
+## 18 YouBike2.0_Wenzhou Parking Lot
+## 19 YouBike2.0_Taipei Municipal MingChuan Elementary School(Side Gate)
+## 20 YouBike2.0_MRT Gongguan Sta. (Exit 2)
+## 21 YouBike2.0_2nd Student Activity Center
+## 22 YouBike2.0_NTUST(Main Gate)
+## 23 YouBike2.0_NTUST(Side Gate)
+## 24 YouBike2.0_Gongguan Park
+## 25 YouBike2.0_NTUST(Back Gate)
+## 26 YouBike2.0_NTU Cancer Center
+## 27 YouBike2.0_NTU Environment Research Building
+## 28 YouBike2.0_NTU Yonglin Biomedical Engineering Hall
+## 29 YouBike2.0_NTU 7th Men's Dorm
+## 30 YouBike2.0_NTU 1st Men's Dorm
+## 31 YouBike2.0_NTU 6th Men's Dorm
+## 32 YouBike2.0_NTU Veterinary Hospital
+## 33 YouBike2.0_NTU Civil Engineering Research Building
+## 34 YouBike2.0_NTU Wan Tsai Research Hall
+## 35 YouBike2.0_NTU Guo - Ching Building
+## 36 YouBike2.0_NTU College of social Sciences Building
+## 37 YouBike2.0_NTU Language Training & Testing Center
+## 38 YouBike2.0_NTU Sports Center Car Park
+## 39 YouBike2.0_Xinhai Xinsheng Rd. Intersection (Southeast)
+## 40 YouBike2.0_Keelung Changxing Rd. Intersection(East)
+## 41 YouBike2.0_NTUE Side Gate(South)
+## 42 YouBike2.0_Heping Experiment Elementary School (Northeast)
+## 43 YouBike2.0_Daan District Public Health Center
+## 44 YouBike2.0_Xinhai Taishun St. Intersection
+## 45 YouBike2.0_Fanghe Junior High School
+## 46 YouBike2.0_Wolong Leye St. Intersection
+## 47 YouBike2.0_Wolong Park
+## 48 YouBike2.0_Jiaxing Park
+## 49 YouBike2.0_MRT Linguang Sta. (Exit 2)
+## 50 YouBike2.0_MRT Liuzhangli Sta.
+## 51 YouBike2.0_George Vocational High School of Taipei
+## 52 YouBike2.0_Fazhi Park
+## 53 YouBike2.0_MRT Taipower Building Sta. (Exit 2)
+## 54 YouBike2.0_Sec. 1, Heping E. Rd & Sec. 2, Jinshan S. Rd Intersection
+## 55 YouBike2.0_Sec. 1, Heping E. Rd & Longquan St. Intersection
+## 56 YouBike2.0_Sec. 1, Heping E. Rd & Taishun St Intersection
+## 57 YouBike2.0_National Taiwan Normal University (library)
+## 58 YouBike2.0_MRT Guting Sta. (Exit 6)
+## 59 YouBike2.0_MRT Guting Sta. (Exit 5)
+## 60 YouBike2.0_Taipei Public library
+## 61 YouBike2.0_Sec. 2, Xinsheng S. Rd & Sec. 2, Heping E. Rd Intersection
+## 62 YouBike2.0_Sec. 2, Jianguo S. Rd & Sec. 2, Heping E. Rd Intersection
+## 63 YouBike2.0_Jinhua Park
+## 64 YouBike2.0_MRT Dongmen Sta. (Exit 3)
+## 65 YouBike2.0_Jin'ou Girls High School
+## 66 YouBike2.0_Jinhang Park
+## 67 YouBike2.0_Aiguo & Jinshan Rd. Intersection
+## 68 YouBike2.0_Ln. 293, Sec. 2, Dunhua S. Rd (South)
+## 69 YouBike2.0_Sec. 2, Dunhua S. Rd & Sec. 2, Keelung Rd Intersection
+## 70 YouBike2.0_Ln. 181, Sec. 2, Anhe Rd
+## 71 YouBike2.0_Linjiang St night market (Ln. 101, Tonghua St)
+## 72 YouBike2.0_Linjiang St night market (Keelung Rd)
+## 73 YouBike2.0_National Taipei University of Technology (Everlight Building)
+## 74 YouBike2.0_Ln. 119, Sec. 1, Xinsheng S. Rd Intersection
+## 75 YouBike2.0_Xing'an Elementary School (Ren'ai Rd)
+## 76 YouBike2.0_Minrong Park
+## 77 YouBike2.0_Ln. 340, Sec. 1, Fuxing S. Rd Intersection
+## 78 YouBike2.0_Sec. 1, Jianguo S. Rd & Sec. 3, Jinan Rd Intersection
+## 79 YouBike2.0_MRT Zhongxiao Fuxing Sta (Exit 2)
+## 80 YouBike2.0_MRT Da’an Sta (Exit 4)
+## 81 YouBike2.0_MRT Da’an Sta (Exit 2)
+## 82 YouBike2.0_Sec. 4, Xinyi Rd & Da’an Rd Intersection (Xinwei Building)
+## 83 YouBike2.0_Long Men Plaza
+## 84 YouBike2.0_Sec. 4, Ren'ai Rd & Sec. 1, Anhe Rd Intersection
+## 85 YouBike2.0_Sec. 4, Xinyi Rd & Sec. 1, Dunhua S. Rd Intersection
+## 86 YouBike2.0_Ren Ai Junior High School
+## 87 YouBike2.0_MRT Xinyi Anhe Sta (Exit 2)
+## 88 YouBike2.0_Bade Traditional Market
+## 89 YouBike2.0_Changlong Park
+## 90 YouBike2.0_MRT Daan Park Sta. (Exit 2)
+## 91 YouBike2.0_Sec. 4,Xinyi Rd & Yanji St Intersection
+## 92 YouBike2.0_Guangxin Park (Ln. 456, Guangfu S. Rd)
+## 93 YouBike2.0_Qiao An Dixia Parking (Exit 2) (Southeast)
+## 94 YouBike2.0_Ln. 279, Sec. 1, Jianguo S. Rd Intersection
+## 95 YouBike2.0_MRT Zhongxiao Xinsheng Sta. (Exit 6)
+## 96 YouBike2.0_MRT Zhongxiao Xinsheng Sta. (Exit 4)
+## 97 YouBike2.0_Daan Vocational High School
+## 98 YouBike2.0_MRT Zhongxiao Xinsheng Sta. (Exit 3)
+## 99 YouBike2.0_Liugong Park
+## 100 YouBike2.0_Dunhua S. Rd. & Civic Blvd. Intersection
+## 101 YouBike2.0_MRT Daan Park Sta. (Exit 5)
+## 102 YouBike2.0_Xinyi Rd. & Jianguo Rd. Intersection
+## 103 YouBike2.0_Dongfeng Park
+## 104 YouBike2.0_Dean Park
+## 105 YouBike2.0_MRT Zhongxiao Fuxing Sta (Exit 5)
+## 106 YouBike2.0_MRT Zhongxiao Dunhua Sta. (Exit 2)
+## 107 YouBike2.0_MRT Zhongxiao Dunhua Sta. (Exit 7)
+## 108 YouBike2.0_Ln. 208, Rui'an St.
+## 109 YouBike2.0_Ln. 21, Leli Rd. Intersection
+## 110 YouBike2.0_MRT Technology Building Station
+## 111 YouBike2.0_MRT S.Y.S Memorial Hall Stataion(Exit 2.)
+## 112 YouBike2.0_Taipei City Hospital Renai Branch
+## 113 YouBike2.0_MRT Xinyi Anhe Sta.(Exit.4)
+## 114 YouBike2.0_Chengong Public Housing
+## 115 YouBike2.0_Renai & Yanji Intersection
+## 116 YouBike2.0_MRT Xinyi Anhe Sta.(Exit.1)
+## 117 YouBike2.0_Ln. 103,Sec. 2,Dunhua S. Rd.
+## 118 YouBike2.0_Ln. 128, Sec. 2, Fuxing S. Rd.
+## 119 YouBike2.0_Heping E. Rd. & Jianguo S. Rd. Intersection
+## 120 YouBike2.0_Fanglan
+## 121 YouBike2.0_Ln. 126, Sec. 1, Fuxing S. Rd.
+## 122 YouBike2.0_MRT Dongmen Sta. (Exit 5)
+## 123 YouBike2.0_Ln. 48, Sec. 4, Ren'ai Rd.
+## 124 YouBike2.0_MRT Gongguan Sta.(Exit.3)
+## 125 YouBike2.0_NTUT(EE)
+## 126 YouBike2.0_Ln. 217, Sec. 3, Zhongxiao E. Rd.
+## 127 YouBike2.0_Ln. 94, Sec. 3, Xinsheng S. Rd. Intersection
+## 128 YouBike2.0_Xinhai Rd. & Xinsheng S. Rd. Intersection
+## 129 YouBike2.0_MRT Da’an Sta. (Exit 6)
+## 130 YouBike2.0_Ln. 195, Wolong St.
+## 131 YouBike2.0_Ln. 157, Sec. 3, Xinhai Rd.
+## 132 YouBike2.0_Wolong St. & Xinyi Rd. Intersection
+## 133 YouBike2.0_Dunchin Park
+## 134 YouBike2.0_Taipei Daan Sports Center
+## 135 YouBike2.0_Heping Rd. & Dunhua Rd. Intersection
+## 136 YouBike2.0_Keelung Rd. & Changxing St. Intersection
+## 137 YouBike2.0_Ln. 122, Sec. 4, Ren'ai Rd.
+## 138 YouBike2.0_Civic Blvd. & Dunhua Rd. Intersection
+## 139 YouBike2.0_Ln. 49, Sec. 4, Zhongxiao E. Rd.
+## 140 YouBike2.0_Civic Blvd. & Fuxing Rd. Intersection (Southeast)
+## 141 YouBike2.0_Heping Rd. & Xinsheng S. Rd. Intersection (Southwest)
+## 142 YouBike2.0_Quanan Park
+## 143 YouBike2.0_Ln. 134, Sec. 3, Xinyi Rd.
+## 144 YouBike2.0_Renai Dunnan Traffic Cir (Southeast)
+## 145 YouBike2.0_Chenggong Public House
+## 146 YouBike2.0_Institute of Diplomacy and International Affairs
+## 147 YouBike2.0_Ln. 170, Siwei Rd.
+## 148 YouBike2.0_MRT Da’an Sta. (Exit 3)
+## 149 YouBike2.0_MRT Taipower Building Sta. (Exit 2)_1
+## 150 YouBike2.0_Ln. 199, Sec. 4, Xinyi Rd.
+## 151 YouBike2.0_NTU Information Building
+## 152 YouBike2.0_Ln. 81, Sec. 2, Dunhua S. Rd.
+## 153 YouBike2.0_Former Taipei Prison Office
+## 154 YouBike2.0_MRT S.Y.S Memorial Hall Sta. (Exit 1)
+## 155 YouBike2.0_Huai Sheng Junior High School
+## 156 YouBike2.0_Renai Dunnan Traffic Cir (Northwest)
+## 157 YouBike2.0_Lih Jen International Private Elementary and Middle School
+## 158 YouBike2.0_Ln. 18, Sec. 2, Heping E. Rd.
+## 159 YouBike2.0_MRT Da’an Sta. (Exit 5)
+## 160 YouBike2.0_Linjiang Park
+## 161 YouBike2.0_Aly. 19, Ln. 113, Sec. 4, Roosevelt Rd.
+## 162 YouBike2.0_Ln. 248, Sec. 4, Zhongxiao E. Rd.
+## 163 YouBike2.0_Ren'ai Rd. & Yanji St. Intersection (Northwest)
+## 164 YouBike2.0_Ln. 101, Leli Rd.
+## 165 YouBike2.0_Roosevelt Rd. & Pucheng St. Intersection
+## 166 YouBike2.0_Ln. 295, Sec. 1, Dunhua S. Rd.
+## 167 YouBike2.0_Ln. 108, Tong'an St.
+## 168 YouBike2.0_Zhongxiao E. Rd. & Fuxing S. Rd. Intersection (Southeast)
+## 169 YouBike2.0_Ren'ai Rd. & Da'an Rd. Intersection (Northeast)
+## 170 YouBike2.0_National Taiwan Normal University (Pucheng St.)
+## 171 YouBike2.0_Ln. 69, Sec. 2, Anhe Rd.
+## 172 YouBike2.0_DaAn Elementary School
+## 173 YouBike2.0_MRT Guting Sta. (Exit 3)
+## 174 YouBike2.0_MRT Zhongxiao Fuxing Sta. (Exit 3)
+## 175 YouBike2.0_Ln. 90, Sec. 2, HePing E. Rd.
+## 176 YouBike2.0_Ln. 420, GuangFu S. Rd.
+## 177 YouBike2.0_FuYang St. & WoLong St. Intersection
+## 178 YouBike2.0_RenAi Rd. & FuXing Rd. Intersection
+## 179 YouBike2.0_RenAi DunNan Traffic Circle (East)
+## 180 YouBike2.0_GuFeng Park
+## 181 YouBike2.0_Yanping Public Housing
+## 182 YouBike2.0_Taipei Public Library DaTong Branch
+## 183 YouBike2.0_Hechang Temple
+## 184 YouBike2.0_Minzu Rd. & Yanping Rd. Intersection
+## 185 YouBike2.0_Chongqing Rd. & Jiuquan St. Intersection
+## 186 YouBike2.0_Shude Park
+## 187 YouBike2.0_Chen Tian-lai Residence
+## 188 YouBike2.0_Taipei Confucius Temple
+## 189 YouBike2.0_MRT Yuanshan Sta. (Exit 1)
+## 190 YouBike2.0_Jiuquan St. & Yanping Rd. Intersection
+## 191 YouBike2.0_Chongqing Junior High School
+## 192 YouBike2.0_Ln. 383, Sec. 3, Chongqing N Rd. Intersection
+## 193 YouBike2.0_DigiBlock Taipei
+## 194 YouBike2.0_Minquan Rd. & Yanping Rd. Intersection (Northwest)
+## 195 YouBike2.0_Minquan Rd. & Dihua St. Intersection
+## 196 YouBike2.0_Dadaocheng Park
+## 197 YouBike2.0_Dalong Old People Housing
+## 198 YouBike2.0_Dalongdong Social Housing
+## 199 YouBike2.0_MRT Daqiaotou Sta. (Exit 2)
+## 200 YouBike2.0_MRT Daqiaotou Sta. (Exit 1A)
+## 201 YouBike2.0_MRT Minquan W. Rd. Sta. (Exit 2)
+## 202 YouBike2.0_MRT Shuanglian Sta. (Exit 2)
+## 203 YouBike2.0_MRT Beimen. (Exit 3)
+## 204 YouBike2.0_Zhaoyang Park
+## 205 YouBike2.0_Yongle Market
+## 206 YouBike2.0_Dalong Park
+## 207 YouBike2.0_Chongcing Rd. & Liangjhou St. Intersection
+## 208 YouBike2.0_Linear Park - Yuanshan
+## 209 YouBike2.0_Yuanhuan
+## 210 YouBike2.0_Chongcing Rd. & Minzu Rd. Intersection
+## 211 YouBike2.0_Ln. 8, Sec. 3, Chengde Rd. Intersection
+## 212 YouBike2.0_Tai Yuan Guang Chang
+## 213 YouBike2.0_Guoshun Park
+## 214 YouBike2.0_Taipei City Hospital Zhongxing Branch
+## 215 YouBike2.0_Chiang Wei-shui Memorial Park
+## 216 YouBike2.0_Dihua Recreational Sports Park
+## 217 YouBike2.0_Taipei DaTong Sports Center
+## 218 YouBike2.0_Chongqing Rd. & Bao'an St. Intersection
+## 219 YouBike2.0_Dadaocheng Wharf
+## 220 YouBike2.0_Guisui Park
+## 221 YouBike2.0_Min-Quan Junior High School (Minquan W. Rd.)
+## 222 YouBike2.0_Chengde Rd. & Minquan Rd. Intersection
+## 223 YouBike2.0_Nanjing Rd. & Taiyuan Rd. Intersection
+## 224 YouBike2.0_Chengde Rd. & Minsheng W. Rd. Intersection
+## 225 YouBike2.0_Taiyuan Rd. & Wuyuan Rd. Intersection
+## 226 YouBike2.0_Taipei Bus Station (Huayin St.)
+## 227 YouBike2.0_MRT Minquan W. Rd. Sta. (Exit 3)
+## 228 YouBike2.0_MRT Zhongshan Sta. (Exit 5)
+## 229 YouBike2.0_Chongqing Rd. & Chang'an Rd. Intersection
+## 230 YouBike2.0_Chengde Rd. & Changji St. Intersection
+## 231 YouBike2.0_Datong Plaza No.16
+## 232 YouBike2.0_MRT Yuanshan Sta. (Exit 2)
+## 233 YouBike2.0_Shude Park
+## 234 YouBike2.0_Chengde Rd. & Zhengzhou Rd. Intersection
+## 235 YouBike2.0_ChengYuan High School
+## 236 YouBike2.0_ShuangLian Elementary School
+## 237 YouBike2.0_Ningxia Rd. & Liangzhou St. Intersection
+## 238 YouBike2.0_Yanping Rd. & Liangzhou St. Intersection
+## 239 YouBike2.0_Datong District Admin. Center
+## 240 YouBike2.0_Dalong Market
+## 241 YouBike2.0_Aly. 19, Ln. 23, Hami St.
+## 242 YouBike2.0_Jiantan Pumping Station
+## 243 YouBike2.0_Tonghe E. St. & Danan Rd. Intersection
+## 244 YouBike2.0_Fugang St. Parking Lot
+## 245 YouBike2.0_Bailing Elementary School
+## 246 YouBike2.0_Ln. 165, Yusheng St. Intersection
+## 247 YouBike2.0_Tianhe Park
+## 248 YouBike2.0_Zhongshan & Tianmu Rd. Intersection
+## 249 YouBike2.0_Tianmu Sports Park
+## 250 YouBike2.0_University of Taipei (Tianmu Campus)
+## 251 YouBike2.0_Ln. 53, Sec. 2, Zhongcheng Rd.
+## 252 YouBike2.0_Taipei Tianmu Baseball Stadium
+## 253 YouBike2.0_Tianmu N. Rd. & Tianyu St. Intersection
+## 254 YouBike2.0_Lanxing Park
+## 255 YouBike2.0_Mingsheng Park
+## 256 YouBike2.0_Chientan Youth Activity Center
+## 257 YouBike2.0_No. 173, Sec. 1, Zhongcheng Rd. Intersection
+## 258 YouBike2.0_Yunong Elementary School
+## 259 YouBike2.0_Zhongcheng Park
+## 260 YouBike2.0_Zhishan Pumping Plant
+## 261 YouBike2.0_Ln. 305, Sec. 1, Zhicheng Rd. Intersection
+## 262 YouBike2.0_Hualing Park
+## 263 YouBike2.0_Qiangang Park(Fude Temple)
+## 264 YouBike2.0_Ln. 185, Hualing St.
+## 265 YouBike2.0_Qiangang Park (Qiangang St)
+## 266 YouBike2.0_Bailing High School
+## 267 YouBike2.0_MRT Zhishan Station
+## 268 YouBike2.0_Taiwan Traditional Theatre Center
+## 269 YouBike2.0_MRT Jianta Station
+## 270 YouBike2.0_Jiantan Rd & Jihe Rd Intersection
+## 271 YouBike2.0_Zhicheng Park
+## 272 YouBike2.0_Fu-Lin Elementary School
+## 273 YouBike2.0_Sec. 5, Jhongshan N. Rd & Jhongjheng Rd Intersection
+## 274 YouBike2.0_Shihlin Sport Center
+## 275 YouBike2.0_Yangming High School
+## 276 YouBike2.0_Taipei Children's Amusement Park
+## 277 YouBike2.0_Taipei Astronomical Museum
+## 278 YouBike2.0_Huasheng Park
+## 279 YouBike2.0_Fulin Park
+## 280 YouBike2.0_MRT Shilin Station (Exit 2)
+## 281 YouBike2.0_Ming Chuan University Taipei Campus
+## 282 YouBike2.0_Shilin High School of Commerce
+## 283 YouBike2.0_Lanya Park
+## 284 YouBike2.0_Taipei City Hospital Yangming Branch
+## 285 YouBike2.0_MRT Zhishan Sta. (Exit 1)
+## 286 YouBike2.0_Zhicheng Park
+## 287 YouBike2.0_Indigenous People's Park
+## 288 YouBike2.0_Ln. 10, Sec. 2, Tonghe E. St. Intersection
+## 289 YouBike2.0_Meilin New Village
+## 290 YouBike2.0_Yanping N. Rd & Zhongzheng Rd Intersection
+## 291 YouBike2.0_Ln. 190, Sec. 4, Chongqing N. Rd Intersection
+## 292 YouBike2.0_Sec. 4, Chongqing N. Rd.& Hudong St Intersection
+## 293 YouBike2.0_Hulu Elementary School
+## 294 YouBike2.0_Shilin Plaza
+## 295 YouBike2.0_Shezheng Park
+## 296 YouBike2.0_Shezi Elementary School
+## 297 YouBike2.0_Ln. 384, Shezhong St Intersection
+## 298 YouBike2.0_No. 138, Sec. 1, Zhongcheng Rd
+## 299 YouBike2.0_Shezi Park
+## 300 YouBike2.0_National Palace Museum
+## 301 YouBike2.0_Taibei High School
+## 302 YouBike2.0_Hougang Park
+## 303 YouBike2.0_No. 117, Sec. 4, Chongqing N. Rd
+## 304 YouBike2.0_Daotou Park
+## 305 YouBike2.0_Ln. 133, Sec. 8, Yanping N. Rd Intersection
+## 306 YouBike2.0_Kuntian Temple
+## 307 YouBike2.0_Shezidao Wetlands Service Center
+## 308 YouBike2.0_Fu'an Junior High School
+## 309 YouBike2.0_Taipei City Fire Department of Fuan Station
+## 310 YouBike2.0_Shengshan Greens
+## 311 YouBike2.0_Zhishan Elementary School
+## 312 YouBike2.0_Shilin New Village
+## 313 YouBike2.0_Lanya Elementary School
+## 314 YouBike2.0_Jhongjheng Rd. & Jihe Rd. Intersection
+## 315 YouBike2.0_Fulin Park (Jhongjheng Rd.)
+## 316 YouBike2.0_Jhihshan Rd. & Linsi Rd. Intersection
+## 317 YouBike2.0_Taipei Public Library Huludu Branch
+## 318 YouBike2.0_Ln. 110, Dongshan Rd.
+## 319 YouBike2.0_Yongping Social Housing
+## 320 YouBike2.0_Yunong Bridge
+## 321 YouBike2.0_Ln. 76, Tonghe St. & Ln. 10, Sec. 4, Chengde Rd. Intersection
+## 322 YouBike2.0_Zhishan Shengyou Temple
+## 323 YouBike2.0_Zhicheng Rd. & Yusheng St. Intersection
+## 324 YouBike2.0_MRT Linear Park (Hou St.)
+## 325 YouBike2.0_Tianmu Park
+## 326 YouBike2.0_Jihe Rd. & Wenlin Rd. Intersection
+## 327 YouBike2.0_Wenlin Rd. & Fude Rd. Intersection
+## 328 YouBike2.0_Chientan Overseas Youth Activity Center_1
+## 329 YouBike2.0_SheZi Elementary School
+## 330 YouBike2.0_MRT Jianta Sta. (Exit 1)
+## 331 YouBike2.0_Dexing Rd. & Dongshan Rd. Intersection
+## 332 YouBike2.0_Chongqing N. Rd. & Tonghe W. St. Intersection
+## 333 YouBike2.0_Hulu Elementary School (Ln. 285, Sec. 5, Yanping N. Rd.)
+## 334 YouBike2.0_Shezi Market
+## 335 YouBike2.0_Shilin District Farmers' Association (Shezi St.)
+## 336 YouBike2.0_Chengde Rd. & Jiantan Rd. Intersection
+## 337 YouBike2.0_Ln. 101, Wenlin Rd.
+## 338 YouBike2.0_Aly. 15, Ln. 257, Sec. 5, Yanping N. Rd.
+## 339 YouBike2.0_Aly. 4, Ln. 257, Sec. 5, Yanping N. Rd.
+## 340 YouBike2.0_Taipei School For The Visually Impaired
+## 341 YouBike2.0_Zhongshan N. Rd. & Fuguo Rd. Intersection
+## 342 YouBike2.0_Dexing Park
+## 343 YouBike2.0_Chengde Rd & Hougang St. Intersection
+## 344 YouBike2.0_Ln. 698, Sec. 5, Zhongshan N. Rd.
+## 345 YouBike2.0_MRT Shilin Sta. (Exit 1)
+## 346 YouBike2.0_MRT Zhishan Sta. (Exit 2)_1
+## 347 YouBike2.0_MCU (Ln. 280, Sec. 5, Zhongshan N. Rd.)
+## 348 YouBike2.0_Haiguang Park (South)
+## 349 YouBike2.0_Ln. 40, Shishang Rd.
+## 350 YouBike2.0_Shihlin Jiantan Post Office
+## 351 YouBike2.0_Ln. 91, Shidong Rd.
+## 352 YouBike2.0_Meilun Park
+## 353 YouBike2.0_University of Taipei (Ln. 270, Sec. 2, Zhongcheng Rd.)
+## 354 YouBike2.0_Ln. 8, Tianmu E. Rd. & Ln. 154, Sec. 2, Zhongcheng Rd. Intersection
+## 355 YouBike2.0_Meilun Park (Northeast)
+## 356 YouBike2.0_Fuan Riverside Park
+## 357 YouBike2.0_Zhongcheng Rd. & Zhongyi St. Intersection (North)
+## 358 YouBike2.0_Zhongcheng Rd. & Zhongyi St. Intersection (South)
+## 359 YouBike2.0_Shilin Elementary School
+## 360 YouBike2.0_No.1 TianHe Park
+## 361 YouBike2.0_Ln. 178, Sec. 2, ZhongCheng Rd.
+## 362 YouBike2.0_KeGiang Rd. & HuangXi St. Intersection
+## 363 YouBike2.0_LanYa Park (West)
+## 364 YouBike2.0_Aly. 77, Ln. 100, FuLin Rd.
+## 365 YouBike2.0_Taipei Pot Plant Market
+## 366 YouBike2.0_MRT Wanlong Sta. (Exit 4)
+## 367 YouBike2.0_MRT Wanlong Sta. (Exit 1)
+## 368 YouBike2.0_Wanhe 2nd Park
+## 369 YouBike2.0_MRT Wanlong Sta. (Exit 2)
+## 370 YouBike2.0_Jingren Park
+## 371 YouBike2.0_MRT Jingmei Sta. (Exit 2)
+## 372 YouBike2.0_Roosevelt Jinglong St. Intersection
+## 373 YouBike2.0_Jingfu St & Ln. 142, Sec. 6, Roosevelt Rd Intersection
+## 374 YouBike2.0_Xingwang Park
+## 375 YouBike2.0_Xing Fu Junior High School
+## 376 YouBike2.0_Ln. 203, Sec. 2, Xinglong Rd
+## 377 YouBike2.0_Jingmei Sports Park
+## 378 YouBike2.0_Jing Mei Hospital
+## 379 YouBike2.0_National Taiwan Normal University Gongguan Campus
+## 380 YouBike2.0_Ln 128, Jinghua St.
+## 381 YouBike2.0_Xianjiyan Trailhead (Jingxing Rd.)
+## 382 YouBike2.0_National Chengchi University
+## 383 YouBike2.0_MRT Taipei Zoo Sta.
+## 384 YouBike2.0_MRT Muzha Sta.
+## 385 YouBike2.0_MRT Wanfang Community Sta.
+## 386 YouBike2.0_Wen Shan Sports Center
+## 387 YouBike2.0_MRT Xinhai Sta.
+## 388 YouBike2.0_Xingfeng Park
+## 389 YouBike2.0_Muzha Rd. & Guanghui Rd. Intersection
+## 390 YouBike2.0_Examination Yuan
+## 391 YouBike2.0_No. 26, Hexing St. Intersection
+## 392 YouBike2.0_Shih Hsin University
+## 393 YouBike2.0_Yishou Bridge
+## 394 YouBike2.0_Jingmei Girls High School
+## 395 YouBike2.0_Performing Arts School 36
+## 396 YouBike2.0_Zhongshun Community Center
+## 397 YouBike2.0_Jingwen Bilingual High School
+## 398 YouBike2.0_Laoquan St. Basketball Court
+## 399 YouBike2.0_Wenshan District Admin. Center
+## 400 YouBike2.0_Muzha Park
+## 401 YouBike2.0_Xinglong Public Housing (D2)
+## 402 YouBike2.0_Ln. 95, Sec. 3, Muxin Rd. Intersection
+## 403 YouBike2.0_Zhangjiaoli Park
+## 404 YouBike2.0_Shijian Junior High School
+## 405 YouBike2.0_Ln. 2, Sec. 3, Zhinan Rd.
+## 406 YouBike2.0_Laiyin Park
+## 407 YouBike2.0_Muzha Social Housing
+## 408 YouBike2.0_Ln. 185, Sec. 1, Xiuming Rd. Intersection
+## 409 YouBike2.0_Ln. 129, Sec. 1, Xiuming Rd. Intersection
+## 410 YouBike2.0_Hengguang Bridge (Laoquan St.)
+## 411 YouBike2.0_Wan You NO.3 Park
+## 412 YouBike2.0_MRT Wanfang Hospital Sta. (Ln. 115, Sec. 3, Xinglong Rd.)
+## 413 YouBike2.0_Xingde Reading Room
+## 414 YouBike2.0_Xinhai Ecological Park
+## 415 YouBike2.0_Bo Jia Sports Park
+## 416 YouBike2.0_National Chengchi University (Wanshou Rd.)
+## 417 YouBike2.0_Sian Yan Park
+## 418 YouBike2.0_Zhengda 1st St.
+## 419 YouBike2.0_Wenshan 2nd District Office
+## 420 YouBike2.0_National Immigration Agency Training Center
+## 421 YouBike2.0_Coast Guard Administration (South)
+## 422 YouBike2.0_Ming Dao Elementary School (Southeast)
+## 423 YouBike2.0_Mu Nan Park
+## 424 YouBike2.0_Shijian Junior High School (Ln. 310, Sec. 3, Muxin Rd.)
+## 425 YouBike2.0_National Taiwan Normal University Gongguan Campus_1
+## 426 YouBike2.0_MRT Taipei Zoo Sta. (Exit 2)
+## 427 YouBike2.0_Waterfront Elevator
+## 428 YouBike2.0_Dunnan Forest
+## 429 YouBike2.0_Jingmei Pumping Station
+## 430 YouBike2.0_Wan He NO.3 Park
+## 431 YouBike2.0_Jing Xing Junior High School
+## 432 YouBike2.0_Jingren Park_1
+## 433 YouBike2.0_NTNU Gongguan Campus (Student Dorm 2)
+## 434 YouBike2.0_Jing Sing Park
+## 435 YouBike2.0_WangXin Elementary School
+## 436 YouBike2.0_Ln. 77, Sec. 4, Xinhai Rd.
+## 437 YouBike2.0_Ln. 42, Jingxing Rd.
+## 438 YouBike2.0_Ln. 48, Sec. 3, Muzha Rd.
+## 439 YouBike2.0_Ln. 109, Sec. 2, Muzha Rd.
+## 440 YouBike2.0_Shih Yuan Park
+## 441 YouBike2.0_Jhang Shu Park
+## 442 YouBike2.0_Wanmei St. & Wan'an St. Intersection
+## 443 YouBike2.0_Ln. 203, Sec. 2, Xinglong Rd. (Dunnan)
+## 444 YouBike2.0_Xinguang Rd. & Xiuming Rd. Intersection
+## 445 YouBike2.0_Ln. 134, Guanghui Rd.
+## 446 YouBike2.0_Guang Huei Park
+## 447 YouBike2.0_Mu Sin Park
+## 448 YouBike2.0_Aly. 1, Ln. 275, Sec. 2, Xinglong Rd.
+## 449 YouBike2.0_China University of Technology
+## 450 YouBike2.0_Ln. 8, Zhangxin St.
+## 451 YouBike2.0_Ln. 22, Xianyan Rd.
+## 452 YouBike2.0_Muzha &Wanfang Rd. Intersection
+## 453 YouBike2.0_Ln. 78, Fuxing Rd.
+## 454 YouBike2.0_Sing Tai Park
+## 455 YouBike2.0_Taipei City Xing Yan Social Welfare Services Building
+## 456 YouBike2.0_Aly. 9, Ln. 22, Sec. 2, XingLong Rd.
+## 457 YouBike2.0_Taipei Water Department
+## 458 YouBike2.0_Tingzhou Rd. / Siyuan St. intersection (Southeast)
+## 459 YouBike2.0_MRT Gongguan Sta. (Exit 1)
+## 460 YouBike2.0_MRT Gongguan Sta. (Exit 4)
+## 461 YouBike2.0_MRT Guting Sta. (Exit 9)
+## 462 YouBike2.0_MRT Guting Sta. (Exit 2)
+## 463 YouBike2.0_MRT Taipower Building Sta. (Exit 1)
+## 464 YouBike2.0_Hakka Cultural Park
+## 465 YouBike2.0_Taipei Municipal Heti Elementary School
+## 466 YouBike2.0_Jizhouan Heritage Building
+## 467 YouBike2.0_MRT Taipower Building Sta. (Exit 5)
+## 468 YouBike2.0_MRT Taipower Building Sta. (Exit 4)
+## 469 YouBike2.0_Sec. 3, Roosevelt Rd & Jinmen St Intersection
+## 470 YouBike2.0_Guling Park
+## 471 YouBike2.0_MRT Guting Sta. (Exit 8)
+## 472 YouBike2.0_MRT Guting Sta. (Exit 7)
+## 473 YouBike2.0_Nanchang Park
+## 474 YouBike2.0_Heping & Chongqing Rd. Intersection
+## 475 YouBike2.0_Gen.Sun Li-Jen Residence
+## 476 YouBike2.0_Ln.6, Sec.2, Roosevelt Rd.
+## 477 YouBike2.0_Jinhua & Hangzhou S. Rd. Intersection
+## 478 YouBike2.0_MRT C.K.S. Memorial Hall Sta. (Exit 3)
+## 479 YouBike2.0_MRT C.K.S. Memorial Hall Sta. (Exit 4)
+## 480 YouBike2.0_Ying-Qiao Elementary School
+## 481 YouBike2.0_Guting Intelligent Library
+## 482 YouBike2.0_Yongchang Park
+## 483 YouBike2.0_Ln. 409, Sec. 2, Zhonghua Rd
+## 484 YouBike2.0_Nanjichang Night Market (Sec. 2, Zhonghua Rd)
+## 485 YouBike2.0_Nanhai Rd & Sec. 2, Heping W. Rd (Southwest)
+## 486 YouBike2.0_Juguang Rd & Sec. 2, Heping W. Rd Intersection
+## 487 YouBike2.0_No. 11-1, Shuiyuan Rd
+## 488 YouBike2.0_Nan Men Junior High School
+## 489 YouBike2.0_MRT Xiaonanmen Sta. (Exit 2)
+## 490 YouBike2.0_Jieshou Park
+## 491 YouBike2.0_Zhonghua Rd & Guiyang St Intersection
+## 492 YouBike2.0_Huashan 1914 Creative Park
+## 493 YouBike2.0_MRT Shandao Temple Sta (Exit 1)
+## 494 YouBike2.0_Jinan Rd & Shaoxing S. St Intersection
+## 495 YouBike2.0_Linsen S. Rd & Sec 1, Ren'ai Rd Intersection
+## 496 YouBike2.0_Zhongzheng Sports Center
+## 497 YouBike2.0_Sec 1, Xinyi Rd & Hangzhou S. Rd Intersection
+## 498 YouBike2.0_MRT Shandao Temple Sta (Exit 3)
+## 499 YouBike2.0_MRT Xiaonanmen Sta. (Exit 1)
+## 500 YouBike2.0_Ln. 133, Yanping S. Rd Intersection
+## 501 YouBike2.0_MRT Ximen Sta (Exit 2)
+## 502 YouBike2.0_Baoqing Rd & Bo'ai Rd Intersection
+## 503 YouBike2.0_Agency Against Corruption
+## 504 YouBike2.0_University of Taipei Boai Campus
+## 505 YouBike2.0_National Central Library
+## 506 YouBike2.0_Civic Blvd & Jinshan N. Rd Intersection
+## 507 YouBike2.0_Taipei City Hospital Heping Branch
+## 508 YouBike2.0_Zhongshan Hall
+## 509 YouBike2.0_Sec. 1, Zhonghua Rd & Hankou St Intersection
+## 510 YouBike2.0_Ln. 21, Sec. 1, Zhonghua Rd Intersection
+## 511 YouBike2.0_MRT NTU Hospital Sta. (Exit 4)
+## 512 YouBike2.0_Treasure Hill Guanyin Temple
+## 513 YouBike2.0_Shida Rd. & Shuiyuan Rd. Intersection
+## 514 YouBike2.0_Zhongshan Rd. & Xuzhou Rd. Intersection
+## 515 YouBike2.0_Xinyi Rd. & Lianyun St. Intersection
+## 516 YouBike2.0_Taipei Bus Station
+## 517 YouBike2.0_Jyuguang Rd. & Dapu St. Intersection
+## 518 YouBike2.0_MRT Zhongxiao Xinsheng Sta.(Exit.2)
+## 519 YouBike2.0_Guang Hua Computer Market
+## 520 YouBike2.0_Zhongshan & Qingdao Intersection
+## 521 YouBike2.0_MRT C.K.S Memorial Hall Sta.(Exit.5)
+## 522 YouBike2.0_Beiping E. Rd. & Hangzhou N. Rd. Intersection
+## 523 YouBike2.0_Taipei Public Library Wang Guan-Ying Branch
+## 524 YouBike2.0_Jinshan Rd. & Xinyi Rd. Intersection
+## 525 YouBike2.0_Linsen Rd. & Xuzhou Rd. Intersection
+## 526 YouBike2.0_Xuzhou Rd. Hangzhou Rd. Intersection
+## 527 YouBike2.0_MRT C.K.S Memorial Hall Sta.(Exit 6)
+## 528 YouBike2.0_MRT Taipei Main Sta.(Exit M2)
+## 529 YouBike2.0_Dr. Sun Yat-Sen Memorial House (Sun Yat-sen Park)
+## 530 YouBike2.0_MRT Ximen Sta. (Exit 5)
+## 531 YouBike2.0_Hondao Junior High School
+## 532 YouBike2.0_Taipei First Girls High School
+## 533 YouBike2.0_Substitute Military Service Center
+## 534 YouBike2.0_Shaoxing St. & Xuzhou Rd. Intersection
+## 535 YouBike2.0_Roosevelt Rd. & Ningbo E. St. Intersection
+## 536 YouBike2.0_Taipei Water Park
+## 537 YouBike2.0_Ren'ai Rd. & Linsen Rd. Intersection
+## 538 YouBike2.0_MRT Ximen Sta. (Exit 3)
+## 539 YouBike2.0_Ren'ai Rd. & Jinshan Rd. Intersection
+## 540 YouBike2.0_Ln. 101, Sec. 1, Hangzhou S. Rd.
+## 541 YouBike2.0_Ren'ai Rd. & Hangzhou Rd. Intersection
+## 542 YouBike2.0_Longxing Community Center
+## 543 YouBike2.0_Taipei Botanical Garden
+## 544 YouBike2.0_Postal Museum
+## 545 YouBike2.0_Linsen Rd & Beiping Rd. Intersection
+## 546 YouBike2.0_Beiping Rd. & Shaoxing St. Intersection
+## 547 YouBike2.0_Tianjin St. & Beiping Rd. Intersection
+## 548 YouBike2.0_MRT Zhongxiao Xinsheng Sta.(Exit.1)
+## 549 YouBike2.0_MRT Zhongxiao Xinsheng Sta.(Exit.5)
+## 550 YouBike2.0_MRT NTU Hospital Sta. (Exit. 1)
+## 551 YouBike2.0_National Taiwan University Children's Hospital
+## 552 YouBike2.0_Linsen Rd. & Jinan Rd. Intersection (Northeast)
+## 553 YouBike2.0_Ren'ai Rd. & Shaoxing St. Intersection (South)
+## 554 YouBike2.0_Zhonghua Rd. & Nanhai Rd. Intersection
+## 555 YouBike2.0_Taipei Association
+## 556 YouBike2.0_MRT Shandao Temple Sta. (Exit 3) (Zhongxiao E. Rd.)
+## 557 YouBike2.0_National Concert Hall
+## 558 YouBike2.0_Zhongxiao W. Rd. & Chongqing S. Rd. Intersection
+## 559 YouBike2.0_Ln. 8, Sec. 2, Jinan Rd.
+## 560 YouBike2.0_Ren'ai Rd. & Jinshan Rd. Intersection (Southeast)
+## 561 YouBike2.0_Taiwan Literature Base
+## 562 YouBike2.0_Chongqing S. Rd. & Zhao'an St. Intersection
+## 563 YouBike2.0_Wenguang Park
+## 564 YouBike2.0_MRT C.K.S Memorial Hall Sta.(Exit 2)
+## 565 YouBike2.0_Yingpulixiao Park
+## 566 YouBike2.0_Yingqiao Park
+## 567 YouBike2.0_Ningbo W. St. & Quanzhou St. Intersection
+## 568 YouBike2.0_Ln. 98, Sec. 2, Heping W. Rd.
+## 569 YouBike2.0_Ren'ai Rd. & Xinsheng Rd. Intersection (Southwest)
+## 570 YouBike2.0_Xingan Market
+## 571 YouBike2.0_LongKou Market
+## 572 YouBike2.0_Ln. 65, Tongbei St.
+## 573 YouBike2.0_Yuanshan Scenic Area
+## 574 YouBike2.0_Lequn 2nd & Tiding Blvd. Intersection
+## 575 YouBike2.0_Jiantan Community
+## 576 YouBike2.0_Peiying Park
+## 577 YouBike2.0_Lequn 2nd & Mingshui Rd. Intersection
+## 578 YouBike2.0_Bei'an & Dajhih St. Intersection
+## 579 YouBike2.0_MRT Jiannan Rd. Station (Exit 2)
+## 580 YouBike2.0_Lequn 2nd & Jingye 3rd Rd. Intersection
+## 581 YouBike2.0_Lequn 2nd & Jingye 4th Rd. Intersection
+## 582 YouBike2.0_Dazhi Station (Exit 3)
+## 583 YouBike2.0_Fuxing Rd. & Civic Blvd. Intersection
+## 584 YouBike2.0_Nanjing Rd. & Liaoning St. Intersection
+## 585 YouBike2.0_Yitong St. & Chang'an Rd. Intersection
+## 586 YouBike2.0_Xinsheng Rd. & Chang'an Rd. Intersection
+## 587 YouBike2.0_Civic Blvd. & Linsen Rd. Intersection
+## 588 YouBike2.0_Nanjing Rd. & Xinsheng Rd. Intersection
+## 589 YouBike2.0_Yijiang Park
+## 590 YouBike2.0_Songjiang Park
+## 591 YouBike2.0_Xinsheng Rd. & Changchun Rd. Intersection
+## 592 YouBike2.0_The Second Wholesale Fruit and Vegetable Market
+## 593 YouBike2.0_Minsheng Rd. & Jianguo Rd. Intersection
+## 594 YouBike2.0_Xing An Hua Cheng
+## 595 YouBike2.0_MRT Zhongshan Junior High School Sta.
+## 596 YouBike2.0_Long Jiang Rd. & Jinzhou St. Intersection
+## 597 YouBike2.0_Jianguo Rd. & Changchun Rd. Intersection
+## 598 YouBike2.0_Nanjing E Rd. & Jianguo Rd. Intersection
+## 599 YouBike2.0_MRT Songjiang Nanjing Sta. (Exit 7)
+## 600 YouBike2.0_Zhulun Market
+## 601 YouBike2.0_Zhongji Park
+## 602 YouBike2.0_Huashan Park
+## 603 YouBike2.0_Ln. 17, Sec. 1, Jianguo N. Rd.
+## 604 YouBike2.0_Jiangning Park
+## 605 YouBike2.0_Minquan E. Rd. & Long Jiang Rd. Intersection
+## 606 YouBike2.0_MRT Zhongshan Elementary School Sta. (Exit 2)
+## 607 YouBike2.0_MRT Xingtian Temple Sta. (Exit 3)
+## 608 YouBike2.0_Linsen Rd. & Nong'an St. Intersection
+## 609 YouBike2.0_MRT Zhongshan Elementary School Sta. (Exit 4)
+## 610 YouBike2.0_Nong'an St. & Shuangcheng St. Intersection
+## 611 YouBike2.0_Xinsheng Rd. & Dehui St. Intersection
+## 612 YouBike2.0_Minzu Rd. & Linsen Rd. Intersection
+## 613 YouBike2.0_Taipei Fine Arts Museum
+## 614 YouBike2.0_Zhongshan Rd. & Minzu Rd. Intersection
+## 615 YouBike2.0_Xinsheng Elevated Parking Lot (Ln. 107, Linsen N. Rd.)
+## 616 YouBike2.0_Nanjing E. Rd.
+## 617 YouBike2.0_Rende Park
+## 618 YouBike2.0_Zhongyuan Park
+## 619 YouBike2.0_Xiapi Park
+## 620 YouBike2.0_Wuchang Junior High School
+## 621 YouBike2.0_Rongxing Garden
+## 622 YouBike2.0_Minquan Rd. & Jianguo N. Rd. Intersection
+## 623 YouBike2.0_Ln. 431, Songshan Rd. Intersection
+## 624 YouBike2.0_Xinxi Park
+## 625 YouBike2.0_Ln. 407, Jilin Rd. Intersection
+## 626 YouBike2.0_Minzu Rd. & Songjiang Rd. Intersection
+## 627 YouBike2.0_Lin An Tai Historical House
+## 628 YouBike2.0_zhongshan Public Assembly Hall
+## 629 YouBike2.0_Weishuei Rd. & Bade Rd. Intersection
+## 630 YouBike2.0_MRT Zhongshan Sta. (Exit 2)
+## 631 YouBike2.0_Fushun Park
+## 632 YouBike2.0_Xinsheng Park
+## 633 YouBike2.0_MRT Xingtian Temple Sta. (Exit 1)
+## 634 YouBike2.0_Linsen & Changchun Intersection
+## 635 YouBike2.0_Jianguo & Nong'an Intersection
+## 636 YouBike2.0_Ln. 77, Songjiang Rd.
+## 637 YouBike2.0_Jianguo & Chang'an Intersection
+## 638 YouBike2.0_Civic & Xinsheng Intersection
+## 639 YouBike2.0_Minquan & Jilin Intersection
+## 640 YouBike2.0_Zhongshan Rd. & Nong'an St. Intersection
+## 641 YouBike2.0_MRT Administration Building
+## 642 YouBike2.0_Zhongji Park(Ln. 188, Songjiang Rd.)
+## 643 YouBike2.0_Ln. 123, Jilin Rd.
+## 644 YouBike2.0_Zhongyuan St. & Minsheng Rd. Intersection
+## 645 YouBike2.0_National Taipei University(Taipei Canpus)
+## 646 YouBike2.0_Jinzhou St. & Jilin Rd. Intersection
+## 647 YouBike2.0_Ln. 59, Sec. 2, Zhongshan N. Rd.
+## 648 YouBike2.0_Yongsheng Park(Ln. 23, Sec. 1, Minsheng E. Rd.)
+## 649 YouBike2.0_Xinsheng Rd. & Jinzhou St. Intersection
+## 650 YouBike2.0_Ln. 199, Binjiang St.
+## 651 YouBike2.0_Dajia Community Park
+## 652 YouBike2.0_Binjiang Fruit and Vegetable Wholesale Market
+## 653 YouBike2.0_Xing'an St. & Hejiang St. Intersection
+## 654 YouBike2.0_Fuxing Rd. & Longjiang Rd. Intersection
+## 655 YouBike2.0_TCC Building
+## 656 YouBike2.0_Zhifu Rd. & Lequn Rd. Intersection
+## 657 YouBike2.0_Xinxing Park
+## 658 YouBike2.0_Nanjing Rd. & Yitong St. Intersection
+## 659 YouBike2.0_Nanjing Rd. & Longjiang Rd. Intersection
+## 660 YouBike2.0_Ln. 41, Fushun St. (Chongde Temple)
+## 661 YouBike2.0_Taipei Public Library Dazhi Branch
+## 662 YouBike2.0_MRT Dazhi Sta. (Exit 1)
+## 663 YouBike2.0_MRT Songjiang Nanjing Sta. (Exit 4)
+## 664 YouBike2.0_hong 429 Park
+## 665 YouBike2.0_Ln. 137, Changchun Rd.
+## 666 YouBike2.0_Songjiang Rd. & Minsheng Rd. Intersection
+## 667 YouBike2.0_Ln. 132, Songjiang Rd.
+## 668 YouBike2.0_Changchun Rd. & Jilin Rd. Intersection
+## 669 YouBike2.0_Changchun Rd. & Yijiang St. Intersection
+## 670 YouBike2.0_MRT Songjiang Nanjing Sta. (Exit 8)
+## 671 YouBike2.0_Nanjing Rd. & Yijiang St. Intersection
+## 672 YouBike2.0_Songjiang Rd. & Changchun Rd. Intersection
+## 673 YouBike2.0_Ching-kuo Chi-Hai Culture Park
+## 674 YouBike2.0_Minzu Rd. & Yumen St. Intersection
+## 675 YouBike2.0_Xinsheng Rd. & Nong'an St. Intersection
+## 676 YouBike2.0_Daojiang Senior High School of Nursing and Home Economics
+## 677 YouBike2.0_MRT Dazhi Sta.(Exit 3)_1
+## 678 YouBike2.0_Lequn 2nd Rd. & Mingshui Rd. Intersection
+## 679 YouBike2.0_Minquan Rd. & Jilin Rd. Intersection
+## 680 YouBike2.0_Changchun Rd. & Longjiang Rd. Intersection
+## 681 YouBike2.0_Minquan Rd. & Xinsheng Rd. Intersection
+## 682 YouBike2.0_Jianguo Rd. & Changchun Rd. Intersection
+## 683 YouBike2.0_Zhongshan District Household Registration Office
+## 684 YouBike2.0_Taipei Fine Arts Museum_1
+## 685 YouBike2.0_Jiantan Community_1
+## 686 YouBike2.0_Binjiang Elementary School Swimming Pool
+## 687 YouBike2.0_Linsen Park
+## 688 YouBike2.0_Zhong 428 Park
+## 689 YouBike2.0_Fuhua Park
+## 690 YouBike2.0_Xinsheng Rd. & Minzu Rd. Intersection
+## 691 YouBike2.0_MRT Nanjing Fuxing Sta. (Exit.1)
+## 692 YouBike2.0_Bade Market (North)
+## 693 YouBike2.0_Longjiang Rd. & Zhulun St. Intersection
+## 694 YouBike2.0_Ln. 94, Dazhi St.
+## 695 YouBike2.0_MRT Nanjing Fuxing Sta. (Exit.8)
+## 696 YouBike2.0_Minquan Rd. & Jianguo Rd. Intersection (South)
+## 697 YouBike2.0_Linsen Rd. & Dehui St. Intersection
+## 698 YouBike2.0_Xinsheng Rd. & Binjiang St. Intersection (Southeast)
+## 699 YouBike2.0_Ln. 62, Sec. 1, Xinsheng N. Rd.
+## 700 YouBike2.0_Xinsheng Rd. & Changchun Rd. Intersection (Northeast)
+## 701 YouBike2.0_MRT Jiannan Rd. Sta. (Exit. 1)
+## 702 YouBike2.0_Jingye 3rd Rd. & Lequn 3rd Rd. Intersection (Northwest)
+## 703 YouBike2.0_Aly. 2, Ln. 258, Changchun Rd.
+## 704 YouBike2.0_Zhangning Dasha Community (South)
+## 705 YouBike2.0_Jianguo Rd. & Wuchang St. Intersection
+## 706 YouBike2.0_Ln. 62, Sec. 2, Zhongshan N. Rd.
+## 707 YouBike2.0_Civic Blvd. & Andong St. Intersection
+## 708 YouBike2.0_Ln. 5, Sec. 2, Civic Blvd.
+## 709 YouBike2.0_MRT Zhongshan Sta. (Exit 3)
+## 710 YouBike2.0_Jianguo N. Rd. Parking Lot (G)
+## 711 YouBike2.0_Zhulun Park
+## 712 YouBike2.0_Zhulun St. & Fuxing N. Rd. Intersection
+## 713 YouBike2.0_MRT Xingtian Temple Sta. (Exit 4)
+## 714 YouBike2.0_Ln. 86, Sec. 3, JianGuo N. Rd.
+## 715 YouBike2.0_ZhengShou Park
+## 716 YouBike2.0_SiPing St. & SongJiang Rd. Intersection
+## 717 YouBike2.0_JinTai Park
+## 718 YouBike2.0_BeiAn Rd. & TongBei St. Intersection
+## 719 YouBike2.0_MinQuan E. Rd. & FuXing N. Rd. Intersection (Northwest)
+## 720 YouBike2.0_Taipei Municipal Datong High School
+## 721 YouBike2.0_BeiAn Rd. & MingShui Rd. Intersection (ZiQiang Tunnel)
+## 722 YouBike2.0_Aly. 118, Ln. 21, Wunhu St.
+## 723 YouBike2.0_Beishi Lake Environmental Park
+## 724 YouBike2.0_Jhouzih No.1 Park
+## 725 YouBike2.0_Xikang Park
+## 726 YouBike2.0_Wenhu Elementary School
+## 727 YouBike2.0_No. 10, Ln. 81, Wenhu St
+## 728 YouBike2.0_Takming University of Science and Technology
+## 729 YouBike2.0_Lishan Elementary School
+## 730 YouBike2.0_Lishan Senior High School
+## 731 YouBike2.0_Ganghua 2nd Park
+## 732 YouBike2.0_Dahu Elementary School
+## 733 YouBike2.0_Anhu No.3 Park
+## 734 YouBike2.0_Aly. 95, Ln. 113, Donghu Rd
+## 735 YouBike2.0_Ruiguangjichengchefuwu Sta
+## 736 YouBike2.0_Wende No. 3 Park
+## 737 YouBike2.0_MRT Dahu Park Sta. (Exit 2)
+## 738 YouBike2.0_Kangning Rd & Xingyun St Intersection
+## 739 YouBike2.0_No. 47, Xingyun St
+## 740 YouBike2.0_MRT Xihu Sta. (Exit 1)
+## 741 YouBike2.0_MRT Xihu Sta. (Exit 2)
+## 742 YouBike2.0_Zhouzi No. 2 Park
+## 743 YouBike2.0_Gangdu Park
+## 744 YouBike2.0_Ln. 26, Sec. 2, Huanshan Rd Intersection
+## 745 YouBike2.0_Chenggong Rd & Jinlong Rd Intersection
+## 746 YouBike2.0_Bishan Park
+## 747 YouBike2.0_Jinrui Park
+## 748 YouBike2.0_MRT Wende Sta. (Exit 2)
+## 749 YouBike2.0_Yangguang Park
+## 750 YouBike2.0_Wende No.2 Park (South)
+## 751 YouBike2.0_Wende No.2 Park (North)
+## 752 YouBike2.0_Ruiyang Park
+## 753 YouBike2.0_Hu Guang Public House
+## 754 YouBike2.0_No. 213, Tanmei St.
+## 755 YouBike2.0_No. 180, Sec. 6, Nanjing E. Rd.
+## 756 YouBike2.0_Tanmei Elementary School (Nanjing Rd. & Jiuzong Rd. Intersection
+## 757 YouBike2.0_No. 343, Xinming Rd.
+## 758 YouBike2.0_Zhoumei Community Center
+## 759 YouBike2.0_Neihu District Office
+## 760 YouBike2.0_Lekang Park
+## 761 YouBike2.0_Aly. 24, Ln. 32, Ankang Rd.
+## 762 YouBike2.0_Mingmei Park
+## 763 YouBike2.0_Ln. 368, Sec. 6, Nanjing E. Rd.
+## 764 YouBike2.0_Xinming Rd. & Chenggong Rd. Intersection
+## 765 YouBike2.0_Minquan E. Rd. & Ruiguang Rd. Intersection
+## 766 YouBike2.0_Ruiguang Public Housing (Ruiguang Rd)
+## 767 YouBike2.0_Ln. 15, Sec. 6, Minquan E. Rd.
+## 768 YouBike2.0_Rotary Park
+## 769 YouBike2.0_Xinhu 3rd Rd & Minshan St Intersection
+## 770 YouBike2.0_No.119 Neihu Greens
+## 771 YouBike2.0_Xingshan Park
+## 772 YouBike2.0_Tri-Service General Hospital
+## 773 YouBike2.0_Fuhua Market
+## 774 YouBike2.0_Taipei Tennis Center
+## 775 YouBike2.0_MRT Huzhou Sta. (Exit 1)
+## 776 YouBike2.0_Lihu Elementary School
+## 777 YouBike2.0_Aly. 125, Ln. 347, Jinhu Rd. Intersection
+## 778 YouBike2.0_Bihu Park
+## 779 YouBike2.0_Bihu Park (Ln. 103, Sec. 2, Neihu Rd.)
+## 780 YouBike2.0_Maoqi Community
+## 781 YouBike2.0_Neihu District Farmers' Association
+## 782 YouBike2.0_MRT Neihu Sta. (Exit 2)
+## 783 YouBike2.0_Kangning Rd. & Jinhu Rd. Intersection
+## 784 YouBike2.0_Aly. 20, Ln. 156, Sec. 1, Kangning Rd. Intersection
+## 785 YouBike2.0_Ankang Park
+## 786 YouBike2.0_Ln. 83, Antai St.
+## 787 YouBike2.0_Neigousi Ecological Exhibition Hall
+## 788 YouBike2.0_MRT Gangqian Sta. (Exit 2)
+## 789 YouBike2.0_Dong Hu Junior High School
+## 790 YouBike2.0_Shitan Park (Ankang Rd.)
+## 791 YouBike2.0_Neihu Refuse Incineration Plant
+## 792 YouBike2.0_Kangning Park (North)
+## 793 YouBike2.0_Ln. 54, Sec. 3, Kangning Rd. Intersection
+## 794 YouBike2.0_Ln. 25, Xingshan Rd. Intersection
+## 795 YouBike2.0_Ln. 460, Xinming Rd. Intersection
+## 796 YouBike2.0_Xiawan Park
+## 797 YouBike2.0_Ln. 245, Sec. 6, Minquan E. Rd. Intersection
+## 798 YouBike2.0_Donghu Elementary School
+## 799 YouBike2.0_MRT Neihu Sta. (Exit.1)
+## 800 YouBike2.0_Rueiguang Rd. & Gangcian Rd. Intersection
+## 801 YouBike2.0_Rueihu St. & Yangguang St. Intersection
+## 802 YouBike2.0_Jinlong Park
+## 803 YouBike2.0_Aly. 1, Ln. 138, Xingyun St.
+## 804 YouBike2.0_Donghu No. 1 Park
+## 805 YouBike2.0_Donghu No. 2 Park
+## 806 YouBike2.0_Kanghu No. 2 Park(Kang-Ning General Hospital)
+## 807 YouBike2.0_Tiding Blvd. & Xinhu 1st Rd. Intersection
+## 808 YouBike2.0_Xiawan Park
+## 809 YouBike2.0_Jiuzong Rd. & Xingshan Rd. Intersection
+## 810 YouBike2.0_Ln. 250, Xinhu 2nd Rd.
+## 811 YouBike2.0_Ln. 41, Sec. 4, Chenggong Rd.
+## 812 YouBike2.0_Jinhu Rd. & Xingyun St. Intersection
+## 813 YouBike2.0_National Defense Medical Center
+## 814 YouBike2.0_Aly. 117, Ln. 190, Sec. 6, Minquan E. Rd.
+## 815 YouBike2.0_Taipei Neihu Sports Center
+## 816 YouBike2.0_Jiuhua Park
+## 817 YouBike2.0_Ln. 179, Sec. 2, Neihu Rd.
+## 818 YouBike2.0_Xingshan Rd. & Xing'ai Rd. Intersection
+## 819 YouBike2.0_Xinhu 2nd Rd. & Minshan St. Intersection (Carrefour)
+## 820 YouBike2.0_Welldone Building
+## 821 YouBike2.0_Ln. 161, Yangguang St. Intersection
+## 822 YouBike2.0_Tanmei Park (Ln. 368, Sec. 6, Nanjing E. Rd.)
+## 823 YouBike2.0_Xikang No. 2 Park
+## 824 YouBike2.0_Sanmin Junior High School (Ln. 47, Sec. 6, Minquan E. Rd.)
+## 825 YouBike2.0_Ln. 76, Ruiguang Rd.
+## 826 YouBike2.0_MRT Donghu Sta.
+## 827 YouBike2.0_XinHu Elementary School
+## 828 YouBike2.0_Bishan Rd. & Neihu Rd. Intersection
+## 829 YouBike2.0_Ln. 413, Sec. 6, Minquan E. Rd.
+## 830 YouBike2.0_Honhui Ruiguang Plaza (Ruiguang Rd.)
+## 831 YouBike2.0_Honhui Ruiguang Plaza (Gangqian Rd.)
+## 832 YouBike2.0_Ln. 151, Kangle St.
+## 833 YouBike2.0_Ln. 360, Sec. 1, Neihu Rd.
+## 834 YouBike2.0_No. 83, Sec. 3, Chenggong Rd.
+## 835 YouBike2.0_Ln. 47, Sec. 1, Neihu Rd.
+## 836 YouBike2.0_Yangguang St. & Jiuzong Rd. Intersection
+## 837 YouBike2.0_Anhu Park
+## 838 YouBike2.0_Huxing Park
+## 839 YouBike2.0_Antai St.(Kangle Bridge)
+## 840 YouBike2.0_Kangle Greens
+## 841 YouBike2.0_MRT Gangqian Sta. (Exit 1)
+## 842 YouBike2.0_Mingmei Park (Ln. 333, Xingshan Rd.)
+## 843 YouBike2.0_Ln. 383, Xingshan Rd.
+## 844 YouBike2.0_Jiuzong Rd. & Xinhu 3rd Rd. Intersection
+## 845 YouBike2.0_Neihu Sports Park
+## 846 YouBike2.0_Ln. 326, Sec. 3, Neihu Rd.
+## 847 YouBike2.0_Chengong Park
+## 848 YouBike2.0_Aly. 93, Ln. 189, Sec. 3, Kangning Rd.
+## 849 YouBike2.0_China Medical University Hospital (Taipei Branch)
+## 850 YouBike2.0_Kangle Pumping Station
+## 851 YouBike2.0_Ln. 16, Sec. 3, Huanshan Rd.
+## 852 YouBike2.0_Wende Green No.1
+## 853 YouBike2.0_Taipei Flowers Auction
+## 854 YouBike2.0_Xingshan Social Housing
+## 855 YouBike2.0_Aly. 17, Ln. 99, Sec. 3, Kangning Rd.
+## 856 YouBike2.0_Ln. 407, Sec. 2, Tiding Blvd.
+## 857 YouBike2.0_Heidelberg Science & Technology Building
+## 858 YouBike2.0_Primax Headquarters Building
+## 859 YouBike2.0_Ln. 288, Sec. 1, Neihu Rd.
+## 860 YouBike2.0_Mtc Bus (Neihu)
+## 861 YouBike2.0_Ruihu Park
+## 862 YouBike2.0_CECI Engineering Consultants, Inc.
+## 863 YouBike2.0_Farglory Group
+## 864 YouBike2.0_Ln. 358, Ruiguang Rd.
+## 865 YouBike2.0_Dagangqian Park (Zhouzi St.)
+## 866 YouBike2.0_Century Trade Building
+## 867 YouBike2.0_Ln. 56, Sec. 6, Minquan E. Rd.
+## 868 YouBike2.0_Xinhu 3rd Rd. & Ln. 146, Xinhu 2nd Rd. Intersection
+## 869 YouBike2.0_Xinhu 3rd Rd. & Ln. 146, Xinhu 2nd Rd. Intersection
+## 870 YouBike2.0_Jiuzong Rd. & Xinhu 2nd Rd. Intersection
+## 871 YouBike2.0_Shinkong Jihu Building
+## 872 YouBike2.0_Aly. 15, Ln. 120, Sec. 1, Neihu Rd.
+## 873 YouBike2.0_Beishihu Environmental Protection Park
+## 874 YouBike2.0_Darwin Building
+## 875 YouBike2.0_Donghu Park No.4
+## 876 YouBike2.0_Gamma Technology center
+## 877 YouBike2.0_Fushou Park
+## 878 YouBike2.0_MRT Xihu Sta. (Exit 1) (Neihu Rd.)
+## 879 YouBike2.0_ADATA Technology
+## 880 YouBike2.0_Sun Technology Plaza
+## 881 YouBike2.0_Ln. 316, Ruiguang Rd.
+## 882 YouBike2.0_Ln. 220, WenDe Rd.
+## 883 YouBike2.0_ChangShou Pumping Station
+## 884 YouBike2.0_MRT Huzhou Sta. (Exit 2)
+## 885 YouBike2.0_WuFenPi
+## 886 YouBike2.0_Ln. 1, Sec. 3, HuanShan Rd. (Lishan Senior High School)
+## 887 YouBike2.0_TanMei Park (No. 482, Sec. 6, NanJing E. Rd.)
+## 888 YouBike2.0_Ln. 304, Sec. 7, Chengde Rd.
+## 889 YouBike2.0_Zhoumei Sports Park
+## 890 YouBike2.0_Ronghua 2nd & Mingde Rd. Intersection
+## 891 YouBike2.0_MRT Mingde Station (Exit 1)
+## 892 YouBike2.0_Wenlin & Jianmin Intersection
+## 893 YouBike2.0_Yongxin Greens
+## 894 YouBike2.0_Guandu Temple
+## 895 YouBike2.0_Guandu Nature Park
+## 896 YouBike2.0_Taipei Guandu hospital
+## 897 YouBike2.0_MRT Zhongyi Sta. (Exit 1)
+## 898 YouBike2.0_MRT Guandu Sta. (Exit 1)
+## 899 YouBike2.0_MRT Guandu Sta. (Exit 2)
+## 900 YouBike2.0_Ln. 540, Sec. 4, Zhongyang N. Rd. Intersection
+## 901 YouBike2.0_Dadu & Lide Rd. Intersection
+## 902 YouBike2.0_MRT Fuxinggang Sta. (Exit 1)
+## 903 YouBike2.0_MRT Fuxinggang Sta Tourist Information Center
+## 904 YouBike2.0_Fengnian Park
+## 905 YouBike2.0_Daoxiang Chongshan Rd. Intersection
+## 906 YouBike2.0_Fu Hsing Kang College
+## 907 YouBike2.0_Xiushan Community Center
+## 908 YouBike2.0_Daye Datong St. Intersection
+## 909 YouBike2.0_MRT Xinbeitou Station
+## 910 YouBike2.0_MRT Beitou Station
+## 911 YouBike2.0_MRT Qiyan Station(Sanhe St.)
+## 912 YouBike2.0_Baxian Village Office
+## 913 YouBike2.0_Qingjiang Elementary School
+## 914 YouBike2.0_Ln. 300, Daye Rd. Intersction
+## 915 YouBike2.0_Linong Park
+## 916 YouBike2.0_Beitou Qiyan Elderly Service Center
+## 917 YouBike2.0_MRT Qilian Sta. (Exit 2)
+## 918 YouBike2.0_Beitou Sports Center
+## 919 YouBike2.0_National Yangming Jiaotong University
+## 920 YouBike2.0_MRT Shipai Sta. (Exit 2)
+## 921 YouBike2.0_National Taipei University of Nursing and Health Sciences
+## 922 YouBike2.0_MRT Shipai Sta. (Exit 1)
+## 923 YouBike2.0_Cheng Hsin General Hospital
+## 924 YouBike2.0_Shipai Elementary School
+## 925 YouBike2.0_Zhenxing Park
+## 926 YouBike2.0_Linong Elementary School
+## 927 YouBike2.0_No. 280, Sec. 7, Chengde Rd. Intersection
+## 928 YouBike2.0_Ln. 11, Sec. 2, Zhiyuan 1st Rd.
+## 929 YouBike2.0_Rongfu Park
+## 930 YouBike2.0_Zhongzheng Senior High School
+## 931 YouBike2.0_Ligong & Lide Rd. Intersection
+## 932 YouBike2.0_Ln.40, Sec.4, Zhongyang N. Rd.
+## 933 YouBike2.0_National Yang-Ming University Library
+## 934 YouBike2.0_MRT Xinbeitou Sta. (Exit 2)
+## 935 YouBike2.0_Fuxing Park
+## 936 YouBike2.0_Chengde Rd. & Shipai Rd. Intersection
+## 937 YouBike2.0_Ln. 188, Sec. 7, Chengde Rd. Intersection
+## 938 YouBike2.0_MRT Mingde Sta.(Exit.3)
+## 939 YouBike2.0_Dafeng Park
+## 940 YouBike2.0_Zhoumei Park
+## 941 YouBike2.0_Aly. 11, Ln. 455, Zhonghe St.
+## 942 YouBike2.0_Zhoumei Xianzaigang Park
+## 943 YouBike2.0_Wenhua 3rd Rd. & Xinglin 1st Rd. Intersection
+## 944 YouBike2.0_Zhuhai Rd. & Fuxing 1st Rd. Intersection
+## 945 YouBike2.0_Ln. 33, Yumin 2nd Rd.
+## 946 YouBike2.0_Xinqiyan Social Housing
+## 947 YouBike2.0_Quanyuan Park
+## 948 YouBike2.0_Qiyan No4 Green Space
+## 949 YouBike2.0_NTUNHS
+## 950 YouBike2.0_Qiyan No.1 Park
+## 951 YouBike2.0_Fuxing Park
+## 952 YouBike2.0_Zhongyong Park
+## 953 YouBike2.0_Fengnian Park_1
+## 954 YouBike2.0_Guangming Rd. & Wenquan Rd. Intersection
+## 955 YouBike2.0_Koo Foundation Sun Yat-Sen Cancer Center
+## 956 YouBike2.0_Zhiyuan New Village
+## 957 YouBike2.0_Beitou Public Hotspring
+## 958 YouBike2.0_Aly. 9, Ln. 493, Zhonghe St.
+## 959 YouBike2.0_MRT Beitou Sta. (Exit 1)
+## 960 YouBike2.0_Shipai Rd. & Linong St. Intersection
+## 961 YouBike2.0_MRT Qilian Sta. (Exit 1)
+## 962 YouBike2.0_No. 50, Daxing St. (Opposite)
+## 963 YouBike2.0_MRT Zhongyi Sta. (Exit. 2)
+## 964 YouBike2.0_Fuguo Rd. & Chengde Rd. Intersection
+## 965 YouBike2.0_MRT Beitou Sta. (Exit 1) ( Beitou Rd.)
+## 966 YouBike2.0_Innovation Fortune Center
+## 967 YouBike2.0_Chongyang Park (Ln. 255, Gongguan Rd.)
+## 968 YouBike2.0_Wenhua No.1 Park (North)
+## 969 YouBike2.0_Zhonghe Green
+## 970 YouBike2.0_Ln. 65, Daye Rd.
+## 971 YouBike2.0_Gongguan Rd. & Chengde Rd. Intersection
+## 972 YouBike2.0_Wenlin N. Rd. & Mingde Rd. Intersection (Northeast)
+## 973 YouBike2.0_Ln. 32, Sec. 1, Yongxing Rd.
+## 974 YouBike2.0_Guan Do Junior High School
+## 975 YouBike2.0_Ln. 55, LiGong St.
+## 976 YouBike2.0_Ln. 401, Sec. 7, ChengDe Rd. (ZhouMei Bridge)
+## 977 YouBike2.0_DaYe Rd. (Nung Chan Monastery)
+## 978 YouBike2.0_MRT Songshan Sta. (Exit 4)
+## 979 YouBike2.0_Tayou Rd. & Bade Rd. Intersection
+## 980 YouBike2.0_Pengcheng Park
+## 981 YouBike2.0_Zhonglun Senior High School
+## 982 YouBike2.0_MRT Nanjing Sanmin Sta. (Exit 2)
+## 983 YouBike2.0_MRT Nanjing Sanmin Sta. (Exit 1)
+## 984 YouBike2.0_Ln. 11, Guangfu N Rd.
+## 985 YouBike2.0_MRT Nanjing Sanmin Sta. (Exit 4)
+## 986 YouBike2.0_Xisong Senior High School
+## 987 YouBike2.0_Minquan Rd. & Fuxing Rd. Intersection
+## 988 YouBike2.0_Minfu No.3 Greens
+## 989 YouBike2.0_Minyou No.1 Park
+## 990 YouBike2.0_Minsheng Rd. & Dunhua Rd. Intersection
+## 991 YouBike2.0_Song-Ji Park
+## 992 YouBike2.0_Ln. 166, Sanmin Rd. Intersection
+## 993 YouBike2.0_Minsheng Activity Center
+## 994 YouBike2.0_MRT Taipei Arena Sta. (Exit.2)
+## 995 YouBike2.0_Taipei City Arts Promotion Office
+## 996 YouBike2.0_Minsheng Elementary School (Ln. 199, Dunhua N. Rd.)
+## 997 YouBike2.0_Dunbei Park
+## 998 YouBike2.0_Minquan Sports Park
+## 999 YouBike2.0_Xindong Park
+## 1000 YouBike2.0_Minsheng Rd. & Guangfu N. Rd. Intersection
+## 1001 YouBike2.0_Sanmin Park
+## 1002 YouBike2.0_Ln. 74, Sec. 3, Bade Rd. Intersection
+## 1003 YouBike2.0_Ln. 8, Sec. 3, Bade Rd. Intersection
+## 1004 YouBike2.0_Tri-Service General Hospital Songshan Branch
+## 1005 YouBike2.0_Pingan New Town
+## 1006 YouBike2.0_Jiankang Social Housing
+## 1007 YouBike2.0_Minquan Rd. & Guangfu Rd. Intersection (Northeast)
+## 1008 YouBike2.0_Civic Blvd. & Dongxing Rd. Intersection
+## 1009 YouBike2.0_Ln. 22, Guangfu S. Rd. Intersection
+## 1010 YouBike2.0_Ln. 58, Guangfu S. Rd.
+## 1011 YouBike2.0_Songshan New Village
+## 1012 YouBike2.0_Construction and Planning Agency
+## 1013 YouBike2.0_Nanjing Rd. & Guangfu Rd. Intersection
+## 1014 YouBike2.0_Minsheng Parking Lot
+## 1015 YouBike2.0_Jiankang New Village
+## 1016 YouBike2.0_Jianan Sincheng
+## 1017 YouBike2.0_Fusheng Park
+## 1018 YouBike2.0_Zhonglun Fucheng Temple
+## 1019 YouBike2.0_MRT Nanjing Fuxing Sta.(Exit.7)
+## 1020 YouBike2.0_MRT Nanjing Fuxing Sta.(Exit.5)
+## 1021 YouBike2.0_Tayou Evacuation Gate
+## 1022 YouBike2.0_Taipei Stadium
+## 1023 YouBike2.0_MRT Taipei Arena Sta. (Exit.5)
+## 1024 YouBike2.0_Dunhua Rd. & Changchun Rd. Intersection
+## 1025 YouBike2.0_Raohe Evacuation Gate
+## 1026 YouBike2.0_MRT Songshan Sta. (Exit 2)
+## 1027 YouBike2.0_Ln. 106, Sec. 3, Minquan E. Rd.
+## 1028 YouBike2.0_Ln. 59, Sec. 5, Nanjing E. Rd.
+## 1029 YouBike2.0_Sanmin Park (Tayou Rd.)
+## 1030 YouBike2.0_Baoqing Park
+## 1031 YouBike2.0_Xisong Park
+## 1032 YouBike2.0_Changshou Park
+## 1033 YouBike2.0_Fuyuan Park
+## 1034 YouBike2.0_Ln. 179, Sec. 4, Nanjing E. Rd.
+## 1035 YouBike2.0_Taipei Stadium (Beining Rd.)
+## 1036 YouBike2.0_Xisong Senior High School (Ln. 325, Jiankang Rd.)
+## 1037 YouBike2.0_Nanjing Rd. & Dongxing Rd. Intersection
+## 1038 YouBike2.0_MRT Songshan Sta. (Exit 3)
+## 1039 YouBike2.0_Jieshou Junior High School
+## 1040 YouBike2.0_Dunhua Rd. & Nanjing Rd. Intersection (Northeast)
+## 1041 YouBike2.0_Dunhua Rd. & Bade Rd. Intersection
+## 1042 YouBike2.0_Ln. 51, Xindong St.
+## 1043 YouBike2.0_Bade Parking
+## 1044 YouBike2.0_Changchun Rd. & Qingcheng St. Intersection
+## 1045 YouBike2.0_Ln. 652, Sec. 4, Bade Rd.
+## 1046 YouBike2.0_MRT Songshan Sta. (Exit 1)
+## 1047 YouBike2.0_MRT Taipei Arena Sta. (Exit.3)
+## 1048 YouBike2.0_MRT Taipei Arena Sta. (Exit.5)_1
+## 1049 YouBike2.0_Ln. 155, Dunhua N. Rd.
+## 1050 YouBike2.0_Minsheng Rd. & Fuxing Rd. Intersection
+## 1051 YouBike2.0_Civic Blvd. & Yanji St. Intersection
+## 1052 YouBike2.0_Longcheng Market
+## 1053 YouBike2.0_MRT Nanjing Sanmin Sta. (Exit 3)
+## 1054 YouBike2.0_Tayou Rd. & Keelung Rd. Intersection (First MacArthur Bridge)
+## 1055 YouBike2.0_Ln. 370, Wuchang St.
+## 1056 YouBike2.0_Ln. 119, Yanshou St.
+## 1057 YouBike2.0_Civic Blvd. & Dongning Rd. Intersection
+## 1058 YouBike2.0_Minfu Green
+## 1059 YouBike2.0_Sanmin Elementary School (Fuyuan St.)
+## 1060 YouBike2.0_Minsheng Post Office
+## 1061 YouBike2.0_MinQuan Rd. & DunHua Rd. Intersection (Northwest)
+## 1062 YouBike2.0_Nangang Park (Dongxin St)
+## 1063 YouBike2.0_Nangang Park (Fude St)
+## 1064 YouBike2.0_MRT Kunyang Sta. (Exit 1)
+## 1065 YouBike2.0_Ln. 225, Sec. 6, Zhongxiao E. Rd Intersection
+## 1066 YouBike2.0_MRT Houshanpi Sta (Exit 1)
+## 1067 YouBike2.0_Hele Park
+## 1068 YouBike2.0_Hexing Square
+## 1069 YouBike2.0_Chengde Junior High School
+## 1070 YouBike2.0_Yucheng Park
+## 1071 YouBike2.0_Academia Sinica (Jiuzhuang St. Intersection)
+## 1072 YouBike2.0_Academia Sinica Gymnasium (East)
+## 1073 YouBike2.0_National Biotechnology Research Park
+## 1074 YouBike2.0_MRT Nangang Exhibition Center Sta. (Exit 5)
+## 1075 YouBike2.0_Academia Park
+## 1076 YouBike2.0_Fushan Park
+## 1077 YouBike2.0_Jiuzhuang Recreation Center
+## 1078 YouBike2.0_Lingyun Market
+## 1079 YouBike2.0_No. 532, Sec. 8, Civic Blvd.
+## 1080 YouBike2.0_MRT Nangang Software Park Sta. (Exit 2)
+## 1081 YouBike2.0_Nangang Elementary School
+## 1082 YouBike2.0_Xing Zhong Parking Lot (Xingzhong Rd.)
+## 1083 YouBike2.0_Taipei Public Library Nangang Branch
+## 1084 YouBike2.0_Dongyang Park
+## 1085 YouBike2.0_Xiangyang Rd. & Nangang Rd. Intersection
+## 1086 YouBike2.0_Nangang Sta. (Ln. 415, Sec. 7, Zhongxiao E. Rd.)
+## 1087 YouBike2.0_MRT Nangang Sta. (Exit 2)
+## 1088 YouBike2.0_MRT Nangang Sta. (Exit 1)
+## 1089 YouBike2.0_Dongxin Elementary School
+## 1090 YouBike2.0_China University of Science and Technology
+## 1091 YouBike2.0_Liufu Park
+## 1092 YouBike2.0_Nangangjiaya Sta.
+## 1093 YouBike2.0_Taipei Pop Music Center
+## 1094 YouBike2.0_Xingnan Park
+## 1095 YouBike2.0_Taipei Pop Music Center (Civic Blvd)
+## 1096 YouBike2.0_Nangang Train Sta. (Civic Blvd)
+## 1097 YouBike2.0_Ln. 527, Sec. 7, Zhongxiao E Rd. Intersection
+## 1098 YouBike2.0_NKSP (Xinmin St)
+## 1099 YouBike2.0_World Trade Park
+## 1100 YouBike2.0_Lingyun Village 5 (Ln. 8, Sec. 3, Yanjiuyuan Rd.)
+## 1101 YouBike2.0_Xinxin Park (Ln. 60, Kunyang St.)
+## 1102 YouBike2.0_Nangang Senior High School (Kunyang St.)
+## 1103 YouBike2.0_Ln. 290, Sec. 3, Nangang Rd. Intersection
+## 1104 YouBike2.0_Ln. 220, Sec. 3, Nangang Rd. Intersection
+## 1105 YouBike2.0_Nangang Rd. & Dongxin St. Intersection
+## 1106 YouBike2.0_Bade Rd. & Zhongpo Rd. Intersection
+## 1107 YouBike2.0_MRT Houshanpi Sta. (Exit 3)
+## 1108 YouBike2.0_Yucheng Park Sports Center
+## 1109 YouBike2.0_Baifu Park
+## 1110 YouBike2.0_Nanhu Bridge (Ln. 255, Jingmao 2nd Rd.)
+## 1111 YouBike2.0_Park St. & Chongyang Rd. Intersection
+## 1112 YouBike2.0_Nangang Station Building B (Civic Blvd.)
+## 1113 YouBike2.0_Dr.Hu Shih Park
+## 1114 YouBike2.0_Nangang Pumping Station
+## 1115 YouBike2.0_Jingmao Park
+## 1116 YouBike2.0_Yu Cheng Senior High School
+## 1117 YouBike2.0_MRT Nangang Exhibition Center Sta. (Exit 7)
+## 1118 YouBike2.0_Lixing Bridge (Nangang)
+## 1119 YouBike2.0_JiuZhuang Elementary School(Sec. 1, Jiuzong Rd.)
+## 1120 YouBike2.0_Siangyang Greens
+## 1121 YouBike2.0_Xiaowan Social Housing
+## 1122 YouBike2.0_MRT Nangang Exhibition Center Sta. (Exit 6)
+## 1123 YouBike2.0_MRT Nangang Exhibition Center Sta. (Exit 4)
+## 1124 YouBike2.0_Chengde Greens
+## 1125 YouBike2.0_Nangang Park (Ln. 170, Dongxin St.)
+## 1126 YouBike2.0_Zhongpo Rd. & Civic Blvd. Intersection (Northeast)
+## 1127 YouBike2.0_Kunyang Park
+## 1128 YouBike2.0_Ln. 178, Sec. 2, Nangang Rd.
+## 1129 YouBike2.0_Nangang Train Sta. (Zhongxiao E. Rd.)
+## 1130 YouBike2.0_Nangang Train Sta. (Xinghua Rd.)
+## 1131 YouBike2.0_Yucheng Park (Ln. 178, Chengfu Rd.)
+## 1132 YouBike2.0_Yudong Park (Dongxin St.)
+## 1133 YouBike2.0_Nangang Community
+## 1134 YouBike2.0_Ln. 197, Chengfu Rd.
+## 1135 YouBike2.0_Nangang Evacuating Gate
+## 1136 YouBike2.0_Cheng De Liti Parking
+## 1137 YouBike2.0_Taipei Nangang Exhibition Center Hall 2
+## 1138 YouBike2.0_Jiuzhuang Police Station
+## 1139 YouBike2.0_Ln. 80, Sec. 3, Nangang Rd.
+## 1140 YouBike2.0_MRT Kunyang Sta. (Exit 4)
+## 1141 YouBike2.0_Ln. 278, Sec. 6, Zhongxiao E. Rd.
+## 1142 YouBike2.0_Humanities and Social Science Building
+## 1143 YouBike2.0_Ln. 130, Sec. 3, Nangang Rd.
+## 1144 YouBike2.0_Ln. 190, Sec. 3, Nangang Rd.
+## 1145 YouBike2.0_Ln. 212, Sec. 6, Zhongxiao E. Rd.
+## 1146 YouBike2.0_Xinfu Park
+## 1147 YouBike2.0_Ln. 63, Dongxin St.
+## 1148 YouBike2.0_Zhongxing Park
+## 1149 YouBike2.0_XiangYang Rd. & Civic Blvd. Intersection (Northwest)
+## 1150 YouBike2.0_XiangYang Rd. & NanGang Rd. Intersection (Northwest)
+## 1151 YouBike2.0_Ln. 151, Sec. 1, Academia Rd.
+## 1152 YouBike2.0_Taipei Metro Neihu Depot (Gangdong St.)
+## 1153 YouBike2.0_Lizhong Community Center
+## 1154 YouBike2.0_Ln. 159, Sec. 2, Keelung Rd. Intersection
+## 1155 YouBike2.0_Ln. 175, Jiaxing St Intersection.
+## 1156 YouBike2.0_Ln. 631, Sec. 3, Heping E. Rd Intersection
+## 1157 YouBike2.0_Ln. 530, Sec. 3, Heping E. Rd Intersection
+## 1158 YouBike2.0_Jingqin No. 2 Park
+## 1159 YouBike2.0_Taipei Medical University
+## 1160 YouBike2.0_Sanxing Park
+## 1161 YouBike2.0_Songde Sta.
+## 1162 YouBike2.0_MRT Xiangshan Sta. (Exit 2)
+## 1163 YouBike2.0_Xiangshan Park
+## 1164 YouBike2.0_Aly. 3, Ln. 253, Songren Rd
+## 1165 YouBike2.0_Xingya Junior High School
+## 1166 YouBike2.0_MRT Xiangshan Sta. (Exit 1)
+## 1167 YouBike2.0_Ln. 200, Songde Rd
+## 1168 YouBike2.0_Zhongquan Park
+## 1169 YouBike2.0_Taipei Emergency Operation Center
+## 1170 YouBike2.0_Taipei Xinyi Sports Center
+## 1171 YouBike2.0_MRT Taipei 101/World Trade Center Sta. (Exit 3)
+## 1172 YouBike2.0_Jingxin Park
+## 1173 YouBike2.0_Guangfu S. Rd & Sec. 4, Xinyi Rd Intersection (Southeast)
+## 1174 YouBike2.0_Sanzhangli
+## 1175 YouBike2.0_Ln. 496, Sec. 4, Ren'ai Rd Intersection
+## 1176 YouBike2.0_Songshan High School of Agriculture and Industry
+## 1177 YouBike2.0_Songyou Park
+## 1178 YouBike2.0_Linkou Park
+## 1179 YouBike2.0_Songshan High School of Commerce and Home Economics
+## 1180 YouBike2.0_Yong Chun Pi Wetland Park
+## 1181 YouBike2.0_Taipei City Hall
+## 1182 YouBike2.0_Songzhi Rd & Songshou Rd Intersection
+## 1183 YouBike2.0_Shifu Rd & Songshou Rd Intersection
+## 1184 YouBike2.0_Shifu Rd & Songgao Rd Intersection
+## 1185 YouBike2.0_City Hall Square
+## 1186 YouBike2.0_Xinyi Plaza (Taipei 101)
+## 1187 YouBike2.0_MRT Taipei 101/World Trade Center Sta. (Exit 5)
+## 1188 YouBike2.0_Chunguang Park
+## 1189 YouBike2.0_Ln. 121, Songren Rd Intersection
+## 1190 YouBike2.0_Fude Elementary School
+## 1191 YouBike2.0_Fude Park
+## 1192 YouBike2.0_Songgao Rd. (Xinyi Place A4)
+## 1193 YouBike2.0_Xingya Rd. & Songren Rd. Intersection
+## 1194 YouBike2.0_Fuxiang Park (Aly. 11, Ln. 127, Yongji Rd.)
+## 1195 YouBike2.0_Bus Wuxing Sta.
+## 1196 YouBike2.0_Taihe Park
+## 1197 YouBike2.0_Xingya Elementary School (Ln. 37, Sec. 1, Jilong Rd.)
+## 1198 YouBike2.0_Yaxiang Park (Ln. 50, Songxin Rd.)
+## 1199 YouBike2.0_Songshan Sta.
+## 1200 YouBike2.0_Wuchang Park
+## 1201 YouBike2.0_Yongji Rd. & Songxin Rd. Intersection
+## 1202 YouBike2.0_Sanxing Elementary School
+## 1203 YouBike2.0_Civic Blvd. & Songxin Rd. Intersection
+## 1204 YouBike2.0_Songshan Senior High School
+## 1205 YouBike2.0_Keelung Rd. & Guangfu Rd. Intersection
+## 1206 YouBike2.0_Keelung Rd. & Zhongxiao Rd. Intersection (Southwest)
+## 1207 YouBike2.0_Taihe Activity Center
+## 1208 YouBike2.0_MRT Houshanpi Sta. (Exit 2)
+## 1209 YouBike2.0_Hulin St. & Yongji Rd. Intersection
+## 1210 YouBike2.0_Yongji Park
+## 1211 YouBike2.0_Ln. 321, Yongji Rd. Intersection
+## 1212 YouBike2.0_Songshan Rd. & Yongji Rd. Intersection
+## 1213 YouBike2.0_Ln. 292, Songshan Rd. Intersection
+## 1214 YouBike2.0_MRT Xiangshan Sta.(Exit.3)
+## 1215 YouBike2.0_Songde Park
+## 1216 YouBike2.0_TWTC Exhibition Hall 3
+## 1217 YouBike2.0_Songde Rd. & Hulin St. Intersection
+## 1218 YouBike2.0_Futai Park
+## 1219 YouBike2.0_Ln. 101, Sec. 1,Keelung Rd. Intersection
+## 1220 YouBike2.0_MRT Yongchun Sta.(Exit.2)
+## 1221 YouBike2.0_Ln. 260, Wuxing St. Intersection
+## 1222 YouBike2.0_Songshan Vocational High School (Linkou St.)
+## 1223 YouBike2.0_Ren'ai Rd. & Yisian Rd. Intersection
+## 1224 YouBike2.0_Anciang Park
+## 1225 YouBike2.0_Xinyi & Keelung Intersection
+## 1226 YouBike2.0_MRT Taipei 101 / World Trade Center Sta.(Exit.2)
+## 1227 YouBike2.0_Aly. 36, Ln. 284, Wuxing St.
+## 1228 YouBike2.0_Xiehe Youde High School
+## 1229 YouBike2.0_Fude Elementary School Bus Station
+## 1230 YouBike2.0_Ln. 95, Songren Rd.
+## 1231 YouBike2.0_Nan Shan Plaza
+## 1232 YouBike2.0_Jinglian Plaza
+## 1233 YouBike2.0_Jingping Park
+## 1234 YouBike2.0_MRT Taipei City Hall Sta. (Exit 3)
+## 1235 YouBike2.0_Wufenpu Park
+## 1236 YouBike2.0_No. 305, Songren Rd.
+## 1237 YouBike2.0_Ln.394, Wuxing St.
+## 1238 YouBike2.0_Ln. 215, Sec. 5, Zhongxiao E. Rd.
+## 1239 YouBike2.0_Songqin St. & Zhuangjing Rd. Intersection
+## 1240 YouBike2.0_Songren Rd & Songping Rd. Intersection
+## 1241 YouBike2.0_Xinyi Rd. & Songde Rd. Intersection
+## 1242 YouBike2.0_MRT Taipei City Hall Sta. (Exit 4)
+## 1243 YouBike2.0_Ln. 284, Wuxing St. (Guangan Shrine)
+## 1244 YouBike2.0_Jingqin No.2 Park (Southwest)
+## 1245 YouBike2.0_Keqin New Village
+## 1246 YouBike2.0_No. 291, Sec. 3, Heping E. Rd.
+## 1247 YouBike2.0_Ln. 468, Yongji Rd.
+## 1248 YouBike2.0_Guangci Social Housing (Zone D)
+## 1249 YouBike2.0_Ln. 341, Sec. 3, Heping E. Rd.
+## 1250 YouBike2.0_Gexin Park
+## 1251 YouBike2.0_Lishuang Park
+## 1252 YouBike2.0_Taipei Cultural & Sports Park
+## 1253 YouBike2.0_MRT S.Y.S Memorial Hall Sta. (Exit 5)
+## 1254 YouBike2.0_Guangfu S. Rd. & Yanchang Rd. Intersection
+## 1255 YouBike2.0_Zhongpo N. Rd. & Yongji Rd. Intersection
+## 1256 YouBike2.0_Aly. 66, Ln. 281, SongRen Rd.
+## 1257 YouBike2.0_KeeLung Rd. & Civic Blvd. Intersection
+## 1258 YouBike2.0_Dechang St & Baoxing St Intersection (Northwest)
+## 1259 YouBike2.0_Baoxing St & Changtai St Intersection (Southwest)
+## 1260 YouBike2.0_Ln. 486, Wanda Rd
+## 1261 YouBike2.0_Guoxing Rd & Sec. 2, Zhonghua Rd Intersection
+## 1262 YouBike2.0_Guting Junior High School
+## 1263 YouBike2.0_Guoxing Rd & Shuiyuan Rd Intersection
+## 1264 YouBike2.0_Youth Park Golf Driving Range
+## 1265 YouBike2.0_Guoxing Rd & Qingnian Rd Intersection
+## 1266 YouBike2.0_Youth Park Baseball Field
+## 1267 YouBike2.0_Youth Park Basketball Courts
+## 1268 YouBike2.0_Fuhua Garden Metro
+## 1269 YouBike2.0_Xinhe Elementary School
+## 1270 YouBike2.0_Taipei Juguang Post Office
+## 1271 YouBike2.0_Juguang Car Park
+## 1272 YouBike2.0_Ln. 146, Bangka Blvd Intersection
+## 1273 YouBike2.0_Dongyuan Elementary School
+## 1274 YouBike2.0_Huazhong Evacuation Gate
+## 1275 YouBike2.0_Jinde Park
+## 1276 YouBike2.0_Zhongde Park
+## 1277 YouBike2.0_Hua Jiang Senior High School
+## 1278 YouBike2.0_Sec. 2, Xiyuan Rd & Bangka Blvd Intersection
+## 1279 YouBike2.0_Shuang Yuan Junior High School
+## 1280 YouBike2.0_Changshun Community Center
+## 1281 YouBike2.0_Hwa Chiang Elementary School
+## 1282 YouBike2.0_Huajiang No.8 Park
+## 1283 YouBike2.0_Sec. 2, Huanhe S. R & Shuangyuan St Intersection
+## 1284 YouBike2.0_Dali Senior High School
+## 1285 YouBike2.0_Tang bu Cultural Park
+## 1286 YouBike2.0_Liangkeshu Park
+## 1287 YouBike2.0_Wanhua Qingnian Public Housing
+## 1288 YouBike2.0_Kaifeng St. & Xining Rd. Intersection
+## 1289 YouBike2.0_Emei Parking Lots
+## 1290 YouBike2.0_Changsha Park
+## 1291 YouBike2.0_Cat Park (Zhongxing Bridgehead)
+## 1292 YouBike2.0_Nishi Honganji Relics Plaza
+## 1293 YouBike2.0_Zhonghua Rd. & Guilin Rd. Intersection
+## 1294 YouBike2.0_MRT Longshan Temple Sta. (Exit 1)
+## 1295 YouBike2.0_Longshan Elementary School
+## 1296 YouBike2.0_Huaxi Park
+## 1297 YouBike2.0_laosong Elementary School
+## 1298 YouBike2.0_Wanhua Train Sta.
+## 1299 YouBike2.0_Wanhua Train Sta. (D2 Plaza)
+## 1300 YouBike2.0_MRT Longshan Temple Sta. (Exit 3)
+## 1301 YouBike2.0_Taipei Cinema Park (Emei St.)
+## 1302 YouBike2.0_Taipei Cinema Park (Kangding Rd.)
+## 1303 YouBike2.0_Zhonghua Rd. & Emei St. Intersection
+## 1304 YouBike2.0_wanhua greehs NO.266
+## 1305 YouBike2.0_Wanda Elementary School (Ln. 344, Wanda Rd.)
+## 1306 YouBike2.0_Ln. 10, Dechang St.
+## 1307 YouBike2.0_Huanhe S. Rd. & Heping W. Rd. Intersection
+## 1308 YouBike2.0_Ln. 60, Changshun St.
+## 1309 YouBike2.0_Xiyuan Park
+## 1310 YouBike2.0_Huajiang Sewage Treatment Plant
+## 1311 YouBike2.0_Liuxiang Park
+## 1312 YouBike2.0_Luti Community Park
+## 1313 YouBike2.0_Changshun St. & Bangka Blvd. Intersection
+## 1314 YouBike2.0_Ln. 145, Fumin Rd.
+## 1315 YouBike2.0_Huanhe Market
+## 1316 YouBike2.0_LongShan Junior High School
+## 1317 YouBike2.0_Luoyang Parking
+## 1318 YouBike2.0_Guilin Rd. & Kunming St. Intersection
+## 1319 YouBike2.0_Wanhuaguomin Junior High School
+## 1320 YouBike2.0_Youth Park (Exit 3)
+## 1321 YouBike2.0_MRT Longshan Temple Sta. (Exit 1)_1
+## 1322 YouBike2.0_Juguang Social Housing
+## 1323 YouBike2.0_Bangka Blvd. & Xizang Rd. Intersection
+## 1324 YouBike2.0_Ln. 493, Wanda Rd.
+## 1325 YouBike2.0_Shuangyuan Car Park
+## 1326 YouBike2.0_Ln. 152, Qingnian Rd.
+## 1327 YouBike2.0_Ln. 190, Sec. 2, Heping W. Rd.
+## 1328 YouBike2.0_Ln. 424, Wanda Rd.
+## 1329 YouBike2.0_Ln. 52, ChangTai St.
+## 1330 YouBike2.0_ShuiYuan Rd. & QingNian Rd. Intersection
+## 1331 YouBike2.0_Youth Park (Exit 4)
+## 1332 YouBike2.0_XiangAn Public Housing
+## 1333 YouBike2.0_Dali High School (XiZang Rd.)
+## 1334 YouBike2.0_BangKa Blvd. & ShuangYuan St. Intersection
+## 1335 YouBike2.0_Ln. 125, DeChang St.
+## 1336 YouBike2.0_NTU ShuiYuan Dorms(A)
+## 1337 YouBike2.0_NTU Complex for Research Excellence
+## 1338 YouBike2.0_NTU ShuiYuan HsiuChi House
+## 1339 YouBike2.0_NTU Archives
+## 1340 YouBike2.0_NTU ShuiYuan Dorms(B)
+## 1341 YouBike2.0_NTU 8th Men's Dorm(East)
+## 1342 YouBike2.0_NTU Courtesy House(Southeast)
+## 1343 YouBike2.0_NTU Agricultural Exhibition Hall(North)
+## 1344 YouBike2.0_NTU Building 2, College of Management(North)
+## 1345 YouBike2.0_NTU Dept. of Civil Engineering
+## 1346 YouBike2.0_NTU Freshman Women's Dorm(North)
+## 1347 YouBike2.0_NTU 9th Women's Dorm(Southwest)
+## 1348 YouBike2.0_NTU Xiao Fu Commissary(East)
+## 1349 YouBike2.0_NTU Parking lot(Motorcycle)
+## 1350 YouBike2.0_NTU College of Engineering Building(South)
+## 1351 YouBike2.0_NTU Astronomy - Mathematics Building(South)
+## 1352 YouBike2.0_NTU Dept. of Psychology (South Hall)
+## 1353 YouBike2.0_NTU Lesyue Building(East)
+## 1354 YouBike2.0_NTU New Agricultural Chemistry Building(West)
+## 1355 YouBike2.0_NTU Building No.5(West)
+## 1356 YouBike2.0_NTU Gymnasium(West)
+## 1357 YouBike2.0_NTU Common Subjects Classroom Building(North)
+## 1358 YouBike2.0_NTU Common Subjects Classroom Building(Southeast)
+## 1359 YouBike2.0_NTU LuMing Hall(East)
+## 1360 YouBike2.0_NTU Gongguan Car Park (Northwest)
+## 1361 YouBike2.0_NTU 2nd Administration Building(South)
+## 1362 YouBike2.0_NTU Ming - Da Hall Parking
+## 1363 YouBike2.0_NTU Building No.2
+## 1364 YouBike2.0_NTU Center for Condensed Matter Sciences(South)
+## 1365 YouBike2.0_NTU College of social Sciences Building(West)
+## 1366 YouBike2.0_NTU Department of Sociology(South)
+## 1367 YouBike2.0_NTU Shih - Liang Hall(Southeast)
+## 1368 YouBike2.0_NTU Green Cabin
+## 1369 YouBike2.0_NTU Computer and Information Networking Center(South)
+## 1370 YouBike2.0_NTU Institute of Atomic and Molecular Sciences(North)
+## 1371 YouBike2.0_NTU Life Science Building(Northwest)
+## 1372 YouBike2.0_NTU 1st Student Activity Center(Southwest)
+## 1373 YouBike2.0_NTU Barry Lam Hall(West)
+## 1374 YouBike2.0_NTU Liberal Education Classroom Building(West)
+## 1375 YouBike2.0_NTU Forestry Building(North)
+## 1376 YouBike2.0_NTU Building No.1
+## 1377 YouBike2.0_NTU Xiao Xiao Fu Commissary(Southwest)
+## 1378 YouBike2.0_NTU Teaching and Research Building(North)
+## 1379 YouBike2.0_NTU Building No.4(Northeast)
+## 1380 YouBike2.0_NTU Freshman Classroom Building(South)
+## 1381 YouBike2.0_NTU Tseng Jiang Hall(North)
+## 1382 YouBike2.0_NTU E. E. Building No. 2(Southeast)
+## 1383 YouBike2.0_NTU Dept. of Library and Information Sciences(North)
+## 1384 YouBike2.0_NTU Main Library(Southwest)
+## 1385 YouBike2.0_NTU Black Forest(West)
+## 1386 YouBike2.0_NTU Dept. of Veterinary Medicine(South)
+## 1387 YouBike2.0_NTU Sports Center(Southeast)
+## 1388 YouBike2.0_NTU Ming - Da Hall (Staff Dormitory)
+## aren
+## 1 No.235, Sec. 2, Fuxing S. Rd.
+## 2 No.273, Sec. 2, Fuxing S. Rd. (West)
+## 3 No. 7, Ln. 96, Sec. 2, Heping E. Rd
+## 4 No. 33, Ln. 118, Sec. 2, Heping E. Rd
+## 5 No. 368, Sec. 2, Fuxing S. Rd.
+## 6 No. 280, Sec. 2, Fuxing S. Rd.
+## 7 No. 342, Sec. 2, Fuxing S. Rd.
+## 8 No. 52, Sec. 3, Xinsheng S. Rd.
+## 9 No. 66, Sec. 3, Xinsheng S. Rd. (East)
+## 10 No. 82, Sec. 3, Xinsheng S. Rd.
+## 11 No. 30, Sec. 1, Xinhai Rd.
+## 12 No. 236, Sec. 2, Fuxing S. Rd.
+## 13 No. 311, Sec. 3, Roosevelt Rd.
+## 14 No. 28, Ln. 76, Dunnan St.
+## 15 No. 245, Sec. 3, Roosevelt Rd.
+## 16 No. 11, Ln. 283, Sec. 3, Roosevelt Rd.
+## 17 No. 1, Wolong St.
+## 18 Ln. 54, Sec. 3, Xinsheng S. Rd. & Wenzhou St. Intersection
+## 19 No. 21, Sec. 4, Roosevelt Rd.
+## 20 MRT Gongguan Sta. (Exit 2)
+## 21 No. 107, Sec. 4, Roosevelt Rd.(Southwest)
+## 22 No. 43, Sec. 4, Keelung Rd.
+## 23 Ln. 73, Sec. 4, Keelung Rd. Intersection
+## 24 Ln. 113, Sec. 4, Roosevelt Rd. & Ln. 41, Sec. 4, Keelung Rd. Intersection
+## 25 Aly. 68, Ln. 41, Sec. 4, Keelung Rd.
+## 26 No. 57, Ln. 155, Sec. 3, Keelung Rd.(West)
+## 27 Fanglan Rd & Ln. 155, Sec. 3, Keelung Rd. Intersection
+## 28 No. 51, Fanglan Rd.(Northwest)
+## 29 Ln. 80, Changxing St. Intersection(West)
+## 30 No. 50, Changxing St.(Northwest)
+## 31 No. 31, Changxing St.
+## 32 Ln. 155, Sec. 3, Keelung Rd. Intersection
+## 33 No. 188, Sec. 3, Xinhai Rd.
+## 34 NTU Wan Tsai Research Hall
+## 35 No. 30, Sec. 3, Xinhai Rd.(Northwest)
+## 36 Xinhai Fuxing Rd. Intersection (Southwest)
+## 37 NTU Language Training & Testing Center(North)
+## 38 NTU Sports Center(North)
+## 39 Xinhai Xinsheng Rd. Intersection (Southeast)
+## 40 Keelung Changxing Rd. Intersection(East)
+## 41 No. 51, Dunnan St.
+## 42 No. 73, Dunnan St.
+## 43 No. 15, Sec. 1, Xinhai Rd.
+## 44 Xinhai Taishun St. Intersection (Southeast)
+## 45 No. 170, Wolong St.
+## 46 No. 234-2, Wolong St.
+## 47 No. 223, Sec. 3, Xinhai Rd. (West)
+## 48 No. 3, Ln. 101, Leye St. (Northwest)
+## 49 No. 420, Sec. 3, Heping E. Rd. (Northeast)
+## 50 No. 410, Sec. 3, Heping E. Rd.
+## 51 No. 166, Sec. 2, Keelung Rd.
+## 52 No. 189, Tonghua St. (West)
+## 53 Sec. 1, Xinhai Rd & Sec. 3, Roosevelt Rd (North)
+## 54 Sec. 1, Heping E. Rd & Sec. 2, Jinshan S. Rd Intersection (Southwest)
+## 55 Sec. 1, Heping E. Rd & Longquan St. Intersection (Southwest)
+## 56 Sec. 1, Heping E. Rd & Taishun St Intersection (Southeast)
+## 57 No. 129, Sec. 1, Heping E. Rd.
+## 58 No. 41, Sec. 2, Roosevelt Rd
+## 59 No. 19, Sec. 1, Heping E. Rd
+## 60 Sec. 2, Jianguo S. Rd & Ln. 151, Sec. 2, Jianguo S. Rd (Under Bridge)
+## 61 Sec. 2, Xinsheng S. Rd & Sec. 2, Heping E. Rd (Northeast)
+## 62 Sec. 2, Jianguo S. Rd & Sec. 2, Heping E. Rd. (Northwest)
+## 63 No. 249, Jinhua St. (Opposite)
+## 64 No. 128, Sec. 2, Xinyi Rd.
+## 65 Sec. 2, Xinyi Rd. & Sec. 2, Hangzhou S. Rd. (Southeast)
+## 66 Ln. 21, Aiguo E. Rd. & Ln. 25, Sec. 2, Hangzhou S. Rd. Intersection (Southeast)
+## 67 Aiguo E. Rd. & Sec. 2, Hangzhou S. Rd. Intersection (Southwest)
+## 68 Ln. 293, Sec. 2, Dunhua S. Rd. (South)
+## 69 No. 218, Sec. 2, Dunhua S. Rd
+## 70 No185, Sec. 2, Anhe Rd
+## 71 No. 101, Tonghua St.
+## 72 No. 108, Sec. 2, Keelung Rd.
+## 73 No. 81, Sec. 3, Zhongxiao E. Rd.
+## 74 No. 113, Ln. 119, Sec. 1, Xinsheng S. Rd.
+## 75 No. 22, Sec. 3, Ren'ai Rd.
+## 76 No. 45, Ln. 304, Sec. 1, Jianguo S. Rd. (South)
+## 77 Sec. 1, Fuxing S. Rd & Aly. 45, Ln. 147, Sec. 3, Xinyi Rd Intersection.
+## 78 Sec. 1, Jianguo S. Rd & Sec. 3, Jinan Rd Intersection. (Southeast)
+## 79 Sec. 1, Fuxing S. R & Aly. 13, Ln. 123, Sec. 3, Ren'ai Rd. (Northwest)
+## 80 No. 6, Sec. 4, Xinyi Rd.
+## 81 No. 143, Sec. 3, Xinyi Rd.
+## 82 No. 74, Sec. 4, Xinyi Rd.
+## 83 Sec. 1, Dunhua S. Rd & Ln. 236, Sec. 1, Dunhua S. Rd Intersection.
+## 84 No. 74, Sec. 4, Ren'ai Rd.
+## 85 No. 155, Sec. 4, Xinyi Rd
+## 86 No. 75, Sec. 1, Anhe Rd.
+## 87 No. 188, Sec. 4, Xinyi Rd
+## 88 No. 170, Sec. 3, Civic Blvd.
+## 89 No. 206, Sec. 3, Civic Blvd. (West)
+## 90 MRT Daan Park Sta. (Exit 2) (West)
+## 91 No. 353, Sec. 4, Xinyi Rd.
+## 92 No. 249, Yanji St.
+## 93 No. 5, Ln. 290, Guangfu S. Rd
+## 94 No. 275, Sec. 1, Jianguo S. Rd.
+## 95 No. 101, Sec. 1, Xinsheng S. Rd.
+## 96 Zhongxiao & Xinsheng S. Rd Intersection. (North)
+## 97 No. 52, Sec. 2, Fuxing S. Rd.
+## 98 Sec. 3, Zhongxiao E. Rd & Ln. 10, Sec. 3, Zhongxiao E. Rd Intersection
+## 99 Aly. 4, Ln. 49, Sec. 4, Zhongxiao E. Rd./Da'an Rd. Intersection
+## 100 No. 158, Sec. 1, Dunhua S. Rd.
+## 101 MRT Daan Park Sta. (Exit 5) (East)
+## 102 Sec. 2, Jianguo S Rd. & Sec. 3, Xinyi Rd. Intersection (Southwest)
+## 103 No. 24, Dongfeng St.
+## 104 No. 6, Ln. 66, Siwei Rd.
+## 105 No. 3, Ln. 135, Sec. 1, Fuxing S. Rd. (Opposite)
+## 106 No. 221, Sec. 4, Zhongxiao E. Rd.
+## 107 No. 143, Sec. 4, Zhongxiao E. Rd.
+## 108 No. 39, Ln. 208, Rui'an St. (Opposite)
+## 109 No. 25, Leli Rd.
+## 110 No. 134, Sec. 2, Heping E. Rd.
+## 111 Sec. 4, Jhongsiao E. Rd. & Guangfu S. Rd. Intersection (Southwest)
+## 112 Sec. 4, Ren'ai Rd. & Sec. 1, Da'an Rd. Intersection (Southwest)
+## 113 No. 252, Sec. 4, Sinyi Rd.
+## 114 Ln. 1, Sec. 3, Heping E. Rd. & Ln. 198, Sihwei Rd. Intersection (Northwest)
+## 115 No. 376, Sec. 4, Ren'ai Rd.
+## 116 No. 225, Sec. 4, Sinyi Rd.
+## 117 No. 99, Sec. 2, Dunhua S. Rd.
+## 118 No. 142-1, Sec. 2, Fusing S. Rd.
+## 119 Heping E. Rd. & Jianguo S. Rd. Intersection (North)
+## 120 No. 148, Ln. 155, Sec. 3, Keelung Rd.
+## 121 No. 1, Ln. 126, Sec. 1, Fuxing S. Rd.
+## 122 No. 178, Sec. 2, Xinyi Rd.
+## 123 Ln. 48, Sec. 4, Ren'ai Rd. & Dongfeng St. Intersection (North)
+## 124 MRT Gongguan Sta.(Exit.3)(West)
+## 125 No. 100, Sec. 3, Zhongxiao E. Rd. (Opposite)
+## 126 No. 229-1, Sec. 3, Zhongxiao E. Rd.
+## 127 No. 94, Sec. 3, Xinsheng S. Rd.
+## 128 Sec. 1, Xinhai Rd. & Sec. 3, Xinsheng S. Rd. Intersection (Northwest)
+## 129 No. 303, Sec. 1, Fuxing S. Rd.
+## 130 Wolong St. / Ln. 195, Wolong St. Intersection (South)
+## 131 Sec. 3, Xinhai Rd. & Ln. 157, Sec. 3, Xinhai Rd. Intersection (Northwest)
+## 132 Wolong St. & Sec. 2, Xinyi Rd. Intersection (Northeast)
+## 133 No. 8-1, Ln. 96, Sec. 2, Heping E. Rd.
+## 134 No. 55, Sec. 3, Xinhai Rd.
+## 135 Sec. 3, Heping E. Rd. & Sec. 2, Dunhua S. Rd. Intersection (East)
+## 136 Keelung Rd. & Changxing St. Intersection (Southeast)
+## 137 No. 188, Sec. 4, Ren'ai Rd.
+## 138 No. 111, Sec. 1, Dunhua S. Rd.
+## 139 No. 55, Sec. 4, Zhongxiao E. Rd.
+## 140 Sec. 4, Civic Blvd. & Sec. 1, Fuxing S. Rd. Intersection (Southeast)
+## 141 No. 2, Sec. 3, Xinsheng S. Rd.
+## 142 No. 16, Ln. 227, Sec. 2, Anhe Rd. (Opposite)
+## 143 Sec. 3, Xinyi Rd. & Ln. 134, Sec. 3, Xinyi Rd. Intersection
+## 144 No. 110, Sec. 4, Ren'ai Rd.
+## 145 No. 201, Sec. 2, Dunhua S. Rd.
+## 146 No. 280, Sec. 1, Dunhua S. Rd.
+## 147 No. 92, Sec. 2, Dunhua S. Rd. (Opposite)
+## 148 No. 184, Sec. 3, Xinyi Rd.
+## 149 No. 201, Sec. 3, Roosevelt Rd.
+## 150 Ln. 199, Sec. 4, Xinyi Rd. & Ln. 90, Sec. 1, Anhe Rd. Intersection
+## 151 Sec. 2, Xinhai Rd.(NTU Language Center)
+## 152 Sec. 2, Dunhua S. Rd. & Ln. 81, Sec. 2, Dunhua S. Rd. Intersection (Northwest)
+## 153 No. 78, Jinhua St. (Opposite)
+## 154 No. 26, Ln. 200, Guangfu S. Rd. (East)
+## 155 No. 30, Ln. 248, Sec. 3, Zhongxiao E. Rd.
+## 156 No. 85, Sec. 4, Ren'ai Rd
+## 157 Sec. 2, Anhe Rd. & Ln. 81, Sec. 2, Dunhua S. Rd. Intersection (Southwest)
+## 158 No. 43, Sec. 2, Xinhai Rd.
+## 159 Sec. 2, Fuxing S. Rd. & Sec. 4, Xinyi Rd. Intersection (Southeast)
+## 160 No. 33, Ln. 143, Tonghua St. (Opposite)
+## 161 No. 84, Ln. 119, Sec. 4, Roosevelt Rd. (Opposite)
+## 162 No. 230, Sec. 4, Zhongxiao E. Rd.
+## 163 No. 363, Sec. 4, Ren'ai Rd.
+## 164 No. 97, Leli Rd.
+## 165 No. 117, Sec. 3, Roosevelt Rd.
+## 166 No. 1, Ln. 295, Sec. 1, Dunhua S. Rd.
+## 167 No. 129, Tong'an St. (Opposite)
+## 168 No. 191, Sec. 1, Fuxing S. Rd.
+## 169 No. 37, Sec. 4, Ren'ai Rd.
+## 170 No. 1, Pucheng St. (Opposite)
+## 171 Sec. 2, Anhe Rd. & Ln. 69, Sec. 2, Anhe Rd. Intersection
+## 172 Aly. 11, Ln. 131, Wolong St. & Ln. 108, Leye St. Intersection
+## 173 No. 81-1, Sec. 2, Roosevelt Rd.
+## 174 No. 48, Sec. 4, ZhongXiao E. Rd.
+## 175 Ln. 90, Sec. 2, HePing E. Rd. & Aly. 5, Ln. 76, Sec. 2, HePing E. Rd. Intersection
+## 176 No. 438, GuangFu S. Rd.
+## 177 No. 129, FuYang St.
+## 178 No. 1, Sec. 4, RenAi Rd.
+## 179 No. 121, Sec. 4, RenAi Rd.
+## 180 No. 7, Ln. 93, LongQuan St. (Opposite)
+## 181 No. 1-1, Sec. 5, Yanping N. Rd. (Opposite)
+## 182 No. 318, Sec. 3, Chongqing N Rd.
+## 183 No. 371, Sec. 2, Huanhe N. Rd.
+## 184 No. 123, Sec. 3, Yanping N. Rd. (North)
+## 185 No. 260, Sec. 3, Chongqing N. Rd.
+## 186 No. 12, Ln. 85, Dalong St. (Opposite)
+## 187 No. 112, Xining N. Rd.
+## 188 No. 61, Hami St. Intersection (Opposite)
+## 189 No. 235, Jiuquan St.
+## 190 No. 235, Jiuquan St.
+## 191 No. 19, Dunhuang Rd.
+## 192 Dunhuang Rd. & Ln. 383, Sec. 3, Chongqing N Rd. Intersection
+## 193 No. 287, Sec. 3, Chengde Rd.
+## 194 No. 239, Minquan W. Rd.
+## 195 Minquan W. Rd. & Sec. 1, Dihua St. Intersection (Under Bridge)
+## 196 No. 7, Ln. 1, Anxi St. (Opposite)
+## 197 No. 82, Minzu W. Rd.
+## 198 No. 210, Sec. 3, Chengde Rd.
+## 199 MRT Daqiaotou Sta. (Exit 2) (West)
+## 200 No. 237, Minquan W Rd.
+## 201 MRT Minquan W. Rd. Sta. (West)
+## 202 No. 22, Wanquan St. (Opposite)
+## 203 Tacheng St. & Zhengzhou Rd. Intersection (Southwest)
+## 204 No. 62-1, Sec. 2, Chongqing N. Rd.
+## 205 No. 103, Ln. 233, Nanjing W. Rd.
+## 206 No. 217, Dalong St. (Opposite)
+## 207 No. 180, Sec. 2, Chongcing N. Rd.
+## 208 Minzu Rd. & Minzu W. Rd. Intersection (Northwest)
+## 209 No. 128, Sec. 1, Chongcing N. Rd.
+## 210 No. 162, Sec. 3, Chongcing N. Rd.
+## 211 No. 14, Sec. 3, Chengde Rd.
+## 212 No. 23, Zhengzhou Rd.
+## 213 No. 117, Changji St.
+## 214 No. 299, Chang'an W. Rd. (Opposite)
+## 215 Jinxi St. & Xingcheng St. Intersection (Southwest)
+## 216 No. 200, Sec. 4, Yanping N. (South)
+## 217 No. 51, Dalong St.
+## 218 No. 171, Sec. 2, Chongqing N. Rd.
+## 219 Dadaocheng Evacuation Gate
+## 220 Sec. 2, Chongqing N. Rd. & Guisui St. Intersection (South)
+## 221 Minquan W. Rd. & Lanzhou St. Intersection (West)
+## 222 No. 239, Sec. 2, Chengde Rd.
+## 223 Nanjing W. Rd. & Taiyuan Rd. Intersection (East)
+## 224 No. 137, Sec. 2, Chengde Rd.
+## 225 Taiyuan Rd. & Wuyuan Rd. Intersection (Southeast)
+## 226 No. 45, Huayin St. (Opposite)
+## 227 No. 37, Ln. 70, Minquan W. Rd. (Opposite)
+## 228 No. 57, Nanjing W. Rd.
+## 229 No. 244, Chang'an W. Rd. (Sec. 1, Chongqing N. Rd.)
+## 230 No. 83, Sec. 3, Chengde Rd.
+## 231 Sec. 1, Huanhe N. Rd. & Minsheng W. Rd. Intersection (Southeast)
+## 232 Sec. 3, Chengde Rd. & Kulun St. Intersection (Southeast)
+## 233 Dalong St. & Ln. 85, Dalong St. Intersection (Northeast)
+## 234 Sec. 1, Chengde Rd. & Zhengzhou Rd. (Under Elevated Bridge)
+## 235 Jinxi St. & Ln. 52, Jinxi St. Intersection (Northeast)
+## 236 No. 25, Aly. 4, Ln. 102, Minquan W. Rd. (Opposite)
+## 237 No. 141, Ningxia Rd. (Opposite)
+## 238 Sec. 2, Yanping N. Rd. & Liangzhou St. Intersection
+## 239 No. 63, Changji St.
+## 240 No. 13, Ln. 335, Sec. 3, Chongqing N. Rd. (Opposite)
+## 241 No. 78, Dunhuang Rd.
+## 242 Ln. 325, Tonghe St. Intersection
+## 243 No. 192, Sec.1, Tonghe E. St. (Side)
+## 244 No. 175, Hualing St. (Side)
+## 245 No. 104, Qiangang St. (Opposite)
+## 246 Ln. 165, Yusheng St. Intersection (Northwest)
+## 247 No.30, Ln.69, Tianmu E. Rd. (Front)
+## 248 No. 3-55, Tianmu W. Rd. (Front)
+## 249 Ln. 207, Sec.2, Zhongcheng Rd. (Southeast)
+## 250 No. 276-280, Shidong Rd. (Opposite)
+## 251 No.7, Ln. 53, Sec. 2, Zhongcheng Rd. (Opposite)
+## 252 No. 122, Sec. 2, Zhongcheng Rd. (Opposite)
+## 253 No. 33, Tianmu N. Rd.
+## 254 Sec. 6, Zhongshan N. Rd. & Shidong Rd. Intersection (Northwest)
+## 255 No. 71, Ln. 6, Sec.4, Chengde Rd. (Opposite)
+## 256 Sec. 4, Zhongshan N. Rd. & Tonghe St. Intersection
+## 257 No. 177, Sec. 1, Zhongcheng Rd.
+## 258 No. 127, Sec. 1, Zhongcheng Rd.
+## 259 No. 18, Sec. 1, Zhongcheng Rd.
+## 260 No. 47, Sec. 2, Zhicheng Rd.
+## 261 No. 303, Sec. 1, Zhicheng Rd.
+## 262 No. 76, Jiantan Rd. (Opposite)
+## 263 Ln. 134, Hougang/Hougang St. Intersection
+## 264 No. 188, Hualing St.
+## 265 No. 48, Qiangang St. (Opposite)
+## 266 Ln. 179, Sec. 4, Chengde Rd. Intersection
+## 267 No. 151, Fuhua Rd. (Opposite)
+## 268 No. 751, Wenlin Rd. (South)
+## 269 No.18, Jihe Rd. (Opposite)
+## 270 Jiantan Rd. & Jihe Rd. Intersection
+## 271 Jhongjheng Rd & Yunong Rd. Intersection (Northwest)
+## 272 No. 50, Fuzhi Rd. (Opposite)
+## 273 No. 609, Sec. 5, Jhongshan N. Rd.
+## 274 No. 1, Shishang Rd.
+## 275 No. 510, Zhongzheng Rd.
+## 276 No. 55, Sec. 5, Chengde Rd.
+## 277 No. 363, Jihe Rd.
+## 278 No. 17, Huasheng St. (South)
+## 279 Sec. 5, Zhongshan N. Rd. (Northwest)
+## 280 No. 2, Aly. 44, Ln. 505, Sec. 5, Zhongshan N. Rd. (Opposite)
+## 281 No. 250, Sec. 5, Zhongshan N. Rd.
+## 282 No. 150, Shishang Rd.
+## 283 Ln. 40, Sec. 2, Zhongcheng Rd. Intersection (Southwest)
+## 284 No. 105, Yusheng St. (South)
+## 285 No. 114, Fuhua Rd. (Opposite)
+## 286 No. 80, Sec. 1, Zhicheng Rd. (Opposite)
+## 287 No. 280, Sec. 2, Zhishan Rd. (Opposite)
+## 288 No. 5, Sec. 2, Tonghe E. St. (Opposite)
+## 289 Sec. 1, Zhishan Rd & Ln. 138, Sec. 1, Zhishan Rd (North)
+## 290 No. 403, Zhongzheng Rd
+## 291 No. 198, Sec. 4, Chongqing N. Rd
+## 292 No. 177, Sec. 4, Chongqing N. Rd.
+## 293 Sec. 3, Huanhe N. Rd & Hulu St. (Northeast)
+## 294 No. 81, Sec 6, Zhongshan N. Rd.
+## 295 No. 39, Shezhong St. (Opposite)
+## 296 No. 476, Shezhong St. (Opposite)
+## 297 No. 194, Sec. 2, Tonghe W. St. (Opposite)
+## 298 No. 138, Sec. 1, Zhongcheng Rd. (Diagonally across)
+## 299 Aly. 37, Ln. 20, Yongping St & Aly. 11, Ln. 20, Yongping St Intersection.
+## 300 No. 8, Lixing St. (Opposite)
+## 301 No. 240, Fulin Rd.
+## 302 No. 26, Sec. 2, Tonghe E. St. (Side)
+## 303 No. 117, Sec. 4, Chongqing N. Rd.
+## 304 No. 323, Sec. 9, Yanping N. Rd. (Back)
+## 305 No. 67, Ln. 133, Sec. 8, Yanping N. Rd Intersection. (Opposite)
+## 306 No. 15, Ln. 96, Sec. 8, Yanping N. Rd.
+## 307 Shezidao Wetlands Service Center
+## 308 No. 250, Sec. 7, Yanping N. Rd.
+## 309 No. 42-7, Sec. 7, Yanping N. Rd. (Opposite)
+## 310 No. 94, Zhongyi St.
+## 311 No. 285, Dexing E. Rd. (Ln. 283, Dexing E. Rd)
+## 312 No.325, Danan Rd.
+## 313 Huangsi St. & Ln. 195, Sec. 6, Jhongshan N. Rd. Intersection
+## 314 No. 420, Jhongjheng Rd.
+## 315 Jhongjheng Rd. & Jhihcheng St. Intersection (South)
+## 316 Sec. 1, Jhihshan Rd. & Linsi Rd. Intersection (Southwest)
+## 317 No. 1, Ln. 136, Sec. 5, Yanping N. Rd.
+## 318 No. 114, Dongshan Rd. (Opposite)
+## 319 No. 2, Ln. 261, Sec. 3, Huanhe N. Rd.
+## 320 No. 42, Ln. 14, Fuzhi Rd. (Opposite)
+## 321 No. 37, Ln. 10, Sec. 4, Chengde Rd.
+## 322 No. 90, Yusheng St.
+## 323 Sec. 2, Zhicheng Rd. & Yusheng St. Intersection (Northeast)
+## 324 No. 15, Hou St.
+## 325 No. 30, Ln. 141, Sec. 7, Zhongshan N. Rd. (Opposite)
+## 326 No. 3-1, Jihe Rd. (Opposite)
+## 327 Wenlin Rd. & Fude Rd. Intersection (East)
+## 328 Tonghe St. & Ln. 2, Tonghe St.
+## 329 Sec. 6, Yanping N. Rd./Shezhong St. Intersection (South)
+## 330 MRT Jianta Sta. (Exit 1) (North)
+## 331 Dexing E. Rd. & Dongshan Rd. Intersection (Northwest)
+## 332 No. 276, Sec. 4, Chongqing N. Rd.
+## 333 Sec. 3, Huanhe N. Rd. & Ln. 285, Sec. 5, Yanping N. Rd. Intersection
+## 334 No. 67, Sec. 6, Yanping N. Rd.
+## 335 No. 162, Shezi St.
+## 336 Sec. 4, Chengde Rd. & Jiantan Rd. Intersection (West)
+## 337 No. 100, Wenlin Rd.
+## 338 No. 184, Hulu St.
+## 339 No. 17, Ln. 257, Sec. 5, Yanping N. Rd.
+## 340 No. 200, Sec. 2, Zhongcheng Rd. (Opposite)
+## 341 No. 837, Sec. 5, Zhongshan N. Rd.
+## 342 No. 33, Dexing W. Rd. (Opposite)
+## 343 Sec. 4, Chengde Rd & Hougang St. Intersection
+## 344 No. 692, Sec. 5, Zhongshan N. Rd.
+## 345 Ln. 236, Zhongzheng Rd. & Zhongzheng Rd. Intersection
+## 346 Fuhua Rd. & Ln. 162, Fuhua Rd. Intersection (Southeast)
+## 347 Ln. 280, Sec. 5, Zhongshan N. Rd.
+## 348 No. 79, Hulu St. (Opposite)
+## 349 No. 2, Ln. 40, Shishang Rd.
+## 350 Jihe Rd. & Ln. 77, Sec. 4, Chengde Rd. Intersection (Under Bridge)
+## 351 No. 3, Ln. 91, Shidong Rd.
+## 352 No. 118, Meilun St. (Opposite)
+## 353 Ln. 270, Sec. 2, Zhongcheng Rd. & Ln. 299, Shidong Rd. Intersection
+## 354 No. 57, Ln. 8, Tianmu E. Rd. (Opposite)
+## 355 No. 115, Ln. 587, Wenlin Rd. (Opposite)
+## 356 No. 45, Ln. 145, Sec. 7, Yanping N. Rd. (Opposite)
+## 357 No. 125, Sec. 1, Zhongcheng Rd.
+## 358 No. 109, Sec. 1, Zhongcheng Rd.
+## 359 Fude Rd. & Ln. 48, Fude Rd. Intersection
+## 360 Ln. 69, TianMu E. Rd. & TianMu E. Rd. Intersection
+## 361 No. 13, Ln. 178, Sec. 2, ZhongCheng Rd. (Opposite)
+## 362 KeQiang Rd. & HuangXi St. Intersection (Southwest)
+## 363 No. 75, Ln. 109, DeXing E. Rd. (East)
+## 364 Ln. 100, FuLin Rd. & Aly. 77, Ln. 100, FuLin Rd. Intersection
+## 365 Wancheng St. & Sec. 1, Xinrong Rd. (Northwest)
+## 366 No. 210, Sec. 5, Roosevelt Rd.
+## 367 No. 250, Sec. 5, Roosevelt Rd.
+## 368 No. 255, Wanlong St.
+## 369 Ln. 70, Sec. 1, Xinrong Rd. & Aly. 26, Ln. 211, Sec. 5, Roosevelt Rd.
+## 370 No. 1, Ln. 142, Sec. 6, Roosevelt Rd.
+## 371 No. 1, Jingwen St. (Opposite)
+## 372 Sec. 6, Roosevelt Rd. & Jinglong St. Intersection (Southeast)
+## 373 Jingfu St & Ln. 142, Sec. 6, Roosevelt Rd Intersection.
+## 374 No. 96, Aly. 28, Ln. 106, Fuxing Rd. (Opposite)
+## 375 Ln. 95, Fuxing Rd & Aly. 28, Ln. 63, Fuxing Rd. (Opposite)
+## 376 No. 108, Ln. 203, Sec. 2, Xinglong Rd (Opposite)
+## 377 No. 79, Jingfeng St. (Side)
+## 378 No. 280, Sec. 6, Roosevelt Rd.
+## 379 No. 77, Sec. 4, Tingzhou Rd.
+## 380 No. 124, Jinghua St.
+## 381 No. 239, Jingxing Rd.
+## 382 No. 153, Sec. 2, Zhinan Rd. (Opposite)
+## 383 No. 30, Sec. 2, Xinguang Rd. (Opposite)
+## 384 No. 18, Ln. 82, Sec. 4, Muzha Rd. (Under The MRT Bridge)
+## 385 No. 60, Wanfang Rd. (West)
+## 386 Sec. 3, Xinglong Rd./Aly. 8, Ln. 192, Sec. 3, Xinglong Rd.
+## 387 No. 114, Sec. 4, Xinhai Rd.
+## 388 Ln. 123, Sec. 2, Xinglong Rd./Sec. 2, Xinglong Rd. (Northwest)
+## 389 No. 290, Sec. 1, Muzha Rd.
+## 390 Shiyuan Rd.(Double number)/ Sec. 1, Muzha Rd. (Northeast)
+## 391 No. 44, Hexing St./No. 26, Hexing St. Intersection
+## 392 No. 1, Ln. 17, Sec. 1, Muzha Rd. (West)
+## 393 No. 64, Zhangxin St.
+## 394 Sec. 3, Muxin Rd./Yishou St. (Northwest)
+## 395 No. 156, Sec. 2, Muxin Rd. (Yongan Market)
+## 396 No. 22, Sec. 2, Zhongshun St.
+## 397 Baoyi Rd./Ln. 102, Sec. 3, Muxin Rd. Intersection (Southwest)
+## 398 Ln. 26, Laoquan St. Intersection
+## 399 No. 220, Sec. 3, Muzha Rd.
+## 400 No. 50, Sec. 4, Xinglong Rd.
+## 401 No. 49, Ln. 105, Sec. 4, Xinglong Rd.
+## 402 No. 30, Ln. 95, Sec. 3, Muxin Rd. (Opposite)
+## 403 No. 15, Ln. 299, Sec. 2, Muxin Rd. (Opposite)
+## 404 No. 2, Sec. 1, Zhongshun St.
+## 405 No. 4, Sec. 3, Zhinan Rd.
+## 406 No. 29, Aly. 25, Ln. 87, Sec. 2, Zhongshun St.
+## 407 No. 46, Ln. 24, Jiukang St. (Opposite)
+## 408 Sec. 1, Xiuming Rd. & Ln. 185, Sec. 1, Xiuming Rd. Intersection
+## 409 Ln. 129, Sec. 1, Xiuming Rd. & Sec. 1, Xiuming Rd. Intersection
+## 410 Laoquan St. & Hengguang St. Intersection
+## 411 No. 105, Jinglong St. (Opposite)
+## 412 No. 2, Ln. 115, Sec. 3, Xinglong Rd.
+## 413 No. 145, Ln. 304, Sec. 3, Xinglong Rd.
+## 414 No. 199, Sec. 4, Xinhai Rd.
+## 415 No. 16, Ln. 159, Sec. 4, Muzha Rd.
+## 416 No.6, Ln. 16, Wanshou Rd.
+## 417 No. 37, Ln. 16, Xianyan Rd.
+## 418 No. 19, Zhengda 1st St. (Opposite)
+## 419 No. 160-1, Sec. 2, Xinglong Rd.
+## 420 No. 306, Sec. 3, Xinglong Rd.
+## 421 No. 211, Sec. 3, Xinglong Rd. (Opposite)
+## 422 No. 116, Ln. 109, Sec. 4, Muzha Rd.
+## 423 Sec. 2, Muxin Rd. & Ln. 22, Yong'an St. Intersection
+## 424 Sec. 1, Zhongshun St. & Ln. 310, Sec. 3, Muxin Rd. Intersection
+## 425 National Taiwan Normal University Gongguan Campus (Tingzhou Rd.)
+## 426 No. 28, Sec. 2, Xinguang Rd.
+## 427 NCCU College of Waterfront Elevator
+## 428 Aly. 16, Ln. 159, Sec. 4, Muzha Rd.
+## 429 No. 10, Sec. 4, Tingzhou Rd. (North)
+## 430 Ln. 107, Xizhou St.
+## 431 Ln. 4, Sanfu St. & Ln. 46, Jingxing Rd. Intersection
+## 432 Jingren St. & Ln. 142, Sec. 6, Roosevelt Rd. Intersection (North)
+## 433 NTNU Gongguan Campus (Student Dorm 2)
+## 434 Jingzhong St. & Ln. 30, Jingzhong St. Intersection
+## 435 No. 114, Sec. 2, Xiuming Rd.
+## 436 Ln. 77, Sec. 4, Xinhai Rd.
+## 437 Ln. 42, Jingxing Rd. & Jingxing Rd. Intersection (Southwest)
+## 438 Aly. 1, Ln. 48, Sec. 3, Muzha Rd.
+## 439 No. 14, Ln. 109, Sec. 2, Muzha Rd.
+## 440 No. 29, Ln. 59, Sec. 1, Muzha Rd. (Opposite)
+## 441 No. 1, Aly. 30, Ln. 26, Sec. 1, Zhongshun St. (Opposite)
+## 442 Sec. 1, Wanmei St. & Wan'an St. Intersection
+## 443 No. 16, Ln. 203, Sec. 2, Xinglong Rd.
+## 444 No. 145, Sec. 1, Xinguang Rd.
+## 445 No. 140, Guanghui Rd. (Opposite)
+## 446 No. 7, Guanghui Rd. (Opposite)
+## 447 No. 11, Ln. 278, Sec. 3, Muxin Rd. (Opposite)
+## 448 No. 2, Aly. 1, Ln. 275, Sec. 2, Xinglong Rd.
+## 449 No. 56, Sec. 3, Xinglong Rd.
+## 450 No. 9, Ln. 8, Zhangxin St. (Opposite)
+## 451 No. 26, Xianyan Rd.
+## 452 No.75,Sec.4,Muzha Rd.
+## 453 Ln. 78, Fuxing Rd. & Aly. 10, Ln. 78, Fuxing Rd.Intersection
+## 454 No. 24, Ln. 166, Sec. 4, XinHai Rd. (Opposite)
+## 455 No. 88, Sec. 2, XingLong Rd.
+## 456 Aly. 9, Ln. 22, Sec. 2, XingLong Rd. & Aly. 6, Ln. 23, JingXing Rd. Intersection
+## 457 No.1, Siyuan St. (East)
+## 458 Sec. 3, Tingzhou Rd./ Siyuan St. intersection (Southeast)
+## 459 No.68, Sec. 4, Roosevelt Rd.
+## 460 No.48, Sec. 4, Roosevelt Rd.
+## 461 No. 100, Sec. 2, Roosevelt Rd
+## 462 No. 168, Sec. 2, Roosevelt Rd
+## 463 Sec. 1, Xinhai Rd & Sec. 3, Roosevelt Rd (South)
+## 464 Shida Rd & Ln. 11, Jinmen St (Opposite)
+## 465 No. 186, Ln. 182, Sec. 2, Tingzhou Rd
+## 466 Shuiyuan Rd & Tong'an St Intersection (East)
+## 467 No. 126, Sec. 3, Roosevelt Rd
+## 468 Shida Rd & Sec. 3, Roosevelt Rd (West)
+## 469 No. 2, Sec. 3, Roosevelt Rd Intersection
+## 470 Ln. 113, Xiamen St & Guling St. Intersection (West)
+## 471 No. 13-1, Sec. 1, Heping W. Rd.
+## 472 No. 44, Sec. 2, Roosevelt Rd.
+## 473 Sec. 1, Heping W. Rd. & Sec. 2, Nanchang Rd. Intersection (Northwest)
+## 474 Sec. 1, Heping W. Rd. & Fuzhou St. Intersection (East)
+## 475 No. 136, Nanchang Rd.
+## 476 Ln. 6, Sec. 2, Roosevelt Rd. Intersection
+## 477 Jinhua St. & Sec. 2, Hangzhou S. Rd. Intersection (Northwest))
+## 478 No. 17, Jinhua St.
+## 479 No. 5, Sec. 1, Roosevelt Rd.
+## 480 No. 32, Quanzhou St. (Opposite)
+## 481 No. 45, Ln. 443, Sec. 2, Zhonghua Rd
+## 482 No. 224, Zhao'an St.
+## 483 No. 403, Sec. 2, Zhonghua Rd.
+## 484 Ln. 305-307, Sec. 2, Zhonghua Rd
+## 485 Nanhai Rd & Sec. 2, Heping W. Rd (Southwest)
+## 486 No. 2, Juguang Rd.
+## 487 No. 11-1, Shuiyuan Rd.
+## 488 Ln. 8, Guangzhou St/Guangzhou St Intersection. (Southeast)
+## 489 No. 30-2, Aiguo West Rd.
+## 490 Guiyang St & Huaining St Intersection (Northeast)
+## 491 No. 234-1, Sec. 1, Guiyang St.
+## 492 No. 41, Sec. 2, Zhongxiao E. Rd.
+## 493 No. 7, Sec. 1, Zhongxiao E. Rd.
+## 494 Jinan Rd & Shaoxing S. St Intersection. (Southeast)
+## 495 Linsen S. Rd & Section 1, Ren'ai Rd Intersection. (Northwest)
+## 496 No. 1, Sec 1, Xinyi Rd.
+## 497 No. 21, Sec 1, Xinyi Rd.
+## 498 No. 21, Linsen S. Rd. (South)
+## 499 Aiguo E. Rd. & Yanping S. Rd Intersection (Northwest)
+## 500 No.162, Yanping S. Rd. (Opposite)
+## 501 No. 59, Sec. 1, Zhonghua Rd.
+## 502 No. 162, Bo'ai Rd.
+## 503 No. 130, Sec. 1, Chongqing S. Rd.
+## 504 No. 1, Aiguo W. Rd.
+## 505 No. 20, Zhongshan S. Rd.
+## 506 Jinshan N. Rd & Civic Blvd Intersection. (South)
+## 507 No. 33, Sec. 2, Zhonghua Rd.
+## 508 Sec. 1, Wuchang St & Yanping South Rd Intersection.
+## 509 Sec. 1, Zhonghua Rd & Sec. 1, Hankou St Intersection
+## 510 No. 11, Sec. 1, Zhonghua Rd. (Front right)
+## 511 No. 1, Changde St. (Gongyuan Rd)
+## 512 No. 23, Ln. 230, Sec. 3, Tingzhou Rd.
+## 513 Shida Rd. & Shuiyuan Rd. Intersection (Southeast)
+## 514 Zhongshan S. Rd. & Xuzhou Rd. (Southeast)
+## 515 No. 213, Sec. 2, Sinyi Rd.
+## 516 Sec. 1, Civic Blvd. & Sec. 1, Jhongshan N. Rd. Intersection (Northwest)
+## 517 Jyuguang Rd. & Dapu St. Intersection (Northeast)
+## 518 No. 132, Sec. 2, Jhongsiao E. Rd. (East)
+## 519 Sec. 1, Sinsheng N. Rd. & Sec. 3, Civic Blvd. Intersection (West)
+## 520 Zhongshan S. Rd & Qingdao E. Rd. Intersection (Northeast)
+## 521 MRT C.K.S Memorial Hall Sta. (Exit.5) (West)
+## 522 Beiping E. Rd. & Hangzhou N. Rd. Intersection (Northeast)
+## 523 No. 265, Sec. 2, Tingzhou Rd.
+## 524 No. 148, Sec. 1, Jinshan S. Rd.
+## 525 Linsen S. Rd. & Xuzhou Rd. Intersection (Northwest)
+## 526 Xuzhou Rd. Sec. 1, Hangzhou S. Rd. Intersection (Northwest)
+## 527 MRT C.K.S Memorial Hall Sta.(Exit.6) (North)
+## 528 No. 168, Sec. 1, Civic Blvd.
+## 529 No. 46, Sec. 1, Zhongshan N. Rd. (North)
+## 530 MRT Ximen Sta. (Exit 5) (South)
+## 531 No. 21, Gongyuan Rd. (Northwest)
+## 532 No. 165, Sec. 1, Chongqing S. Rd.
+## 533 No. 8, Sec. 3, Tingzhou Rd.
+## 534 Shaoxing S. St. & Xuzhou Rd. Intersection (Southeast)
+## 535 Sec. 1, Roosevelt Rd. & Ningbo E. St. Intersection (Southeast)
+## 536 No. 16, Siyuan St. (Opposite)
+## 537 Sec. 1, Ren'ai Rd. & Linsen S. Rd. Intersection (Northeast)
+## 538 Sec. 1, Zhonghua Rd. & Baoqing Rd. Intersection (Southeast)
+## 539 No. 31, Sec. 2, Ren'ai Rd.
+## 540 No. 72, Sec. 1, Jinshan S. Rd.
+## 541 No. 59, Sec. 1, Ren'ai Rd.
+## 542 No. 131, Sanyuan St.
+## 543 No. 100, Sec. 2, Heping W. Rd.
+## 544 No. 45, Sec. 2, Chongqing S. Rd.
+## 545 Linsen N. Rd & Beiping E. Rd. Intersection (Northwest)
+## 546 No. 30, Beiping E. Rd. (Opposite)
+## 547 No. 1, Tianjin St. (Opposite)
+## 548 MRT Zhongxiao Xinsheng Sta.(Exit.1)
+## 549 No. 56, Sec. 1, Xinsheng S. Rd.
+## 550 Gongyuan Rd. & Changde St. Intersection (West)
+## 551 No. 8, Zhongshan S. Rd. (Qingdao W. Rd.)
+## 552 Linsen S. Rd. & Sec. 1, Jinan Rd. Intersection (Northeast)
+## 553 Sec. 1, Ren'ai Rd. & Shaoxing S. St. Intersection (South)
+## 554 No. 343, Sec. 2, Zhonghua Rd.
+## 555 No. 217, Bo'ai Rd.
+## 556 Sec. 1, Zhongxiao E. Rd. & Linsen S. Rd. Intersection
+## 557 Sec. 1, Xinyi Rd. (National Concert Hall Northwest)
+## 558 No. 100, Sec. 1, Zhongxiao W. Rd.
+## 559 No. 6-1, Ln. 8, Sec. 2, Jinan Rd. (Opposite)
+## 560 No. 48-4, Sec. 2, Ren'ai Rd.
+## 561 No. 10, Ln. 53, Qidong St.
+## 562 Sec. 3, Chongqing S. Rd. & Zhao'an St. Intersection
+## 563 No. 4, Ln. 65, Sec. 2, Ren'ai Rd. (Opposite)
+## 564 No. 10, Sec. 1, Roosevelt Rd.
+## 565 No. 135, Sec. 2, Tingzhou Rd. (Opposite)
+## 566 No. 110, Sec. 1, Heping W. Rd.
+## 567 No. 15, Quanzhou St. (Opposite)
+## 568 No. 81, Sanyuan St.
+## 569 No. 110, Sec. 2, Ren'ai Rd.
+## 570 No. 55, Sec. 2, Jinan Rd.
+## 571 No. 232, Sec. 1, Tingzhou Rd. (Opposite)
+## 572 Tongbei /Ln. 65, Tongbei St. Intersection
+## 573 Bei'an Rd./Ln. 77, Bei'an Rd. Intersection
+## 574 No. 382, Tiding Blvd.
+## 575 No. 2, Aly. 2, Ln. 146, Tongbei St. (Opposite)
+## 576 Chongshi/Ln. 62, Dajhih St. Intersection
+## 577 Lequn 2nd/Mingshui Rd. Intersection
+## 578 No. 676, Bei'an Rd.
+## 579 No. 11, Jingye 3rd Rd. (Opposite)
+## 580 No. 155, Jingye 3rd Rd.
+## 581 No. 186, Lecyun 2nd Rd.
+## 582 No. 536, Bei'an Rd.
+## 583 No. 36-9, Sec. 1, Fuxing S. Rd.
+## 584 No. 189, Sec. 3, Nanjing E. Rd. (Opposite)
+## 585 Yitong St. & Sec. 2, Chang'an E Rd. Intersection (Southwest)
+## 586 Sec.1, Xinsheng N. Rd. & Sec. 2, Chang'an E Rd. Intersection (North)
+## 587 Sec. 2, Civic Blvd. & Linsen N Rd. Intersection (NorthEast)
+## 588 Sec.1, Xinsheng N. Rd. & Sec. 1, Nanjing E. Rd. Intersection (Under Bridge)
+## 589 Yijiang St. & Ln. 132, Songjiang Rd. Intersection (Northwest)
+## 590 Songjiang Rd. & Ln. 84, Songjiang Rd. Intersection (Northwest)
+## 591 Sec. 2, Xinsheng N. Rd. & Ln. 68 Intersection (Under Bridge)
+## 592 No. 18, Aly. 2, Ln. 410, Minzu E Rd. (East)
+## 593 Sec. 3, Minsheng E Rd. & Sec. 2, Jianguo N Rd. Intersection
+## 594 No. 53-4, Xing'an St. (Opposite)
+## 595 No. 386, Fuxing N Rd. (South)
+## 596 No. 287, Long Jiang Rd.
+## 597 Jianguo N Rd. & Changchun Rd. Intersection (South)
+## 598 Sec. 2, Nanjing E Rd. & Sec. 2, Jianguo N Rd. Intersection (North)
+## 599 No. 119, Songjiang Rd.
+## 600 No. 15, Long Jiang Rd.
+## 601 No. 22, Ln. 170, Songjiang Rd, (Opposite)
+## 602 Civic Blvd. & Ln. 52, Sec. 1, Chang'an E Rd. Intersection
+## 603 Ln. 17, Sec. 1, Jianguo N. Rd. & Ln. 137, Sec. 2, Bade Rd. Intersection
+## 604 No. 186, Hejiang St. (Opposite)
+## 605 Sec. 3, Minquan E. Rd. & Long Jiang Rd. Intersection (Southeast)
+## 606 MRT Zhongshan Elementary School Sta. (Exit 2) (Back)
+## 607 No. 261, Songjiang Rd.
+## 608 No. 582, Linsen N. Rd.
+## 609 Sec. 1, Minquan E. Rd. & Ln. 71, Sec. 1, Minquan E. Rd. Intersection
+## 610 No. 12-1, Nong'an St.
+## 611 No. 76, Sec. 3, Xinsheng N. Rd. (Opposite)
+## 612 No. 17, Minzu E. Rd.
+## 613 Taipei EXPO Park Yuanshan Gate 5
+## 614 No. 54, Sec. 3, Zhongshan N. Rd.
+## 615 Sec. 1, Xinsheng N. Rd. & Ln. 107, Linsen N. Rd. (Under Xinsheng Elevated Bridge)
+## 616 No. 86, Sec. 1, Nanjing E. Rd.
+## 617 Ln. 108, Jilin Rd. & Ln.21 , Sec. 2, Nanjing E. Rd. Intersection (Southeast)
+## 618 Ln. 45, Sec. 2, Xinsheng N. Rd. (Zhongyuan Park West)
+## 619 No. 4, Aly. 13, Ln. 512, Minzu E. Rd.
+## 620 No. 5, Aly. 2, Ln. 488, Fuxing N. Rd. (Opposite)
+## 621 No. 77, Wuchang St. (Opposite)
+## 622 Sec. 3, Minquan E. Rd. & Sec. 3, Jianguo N. Rd. Intersection (Northeast)
+## 623 No. 433, Songjiang Rd.
+## 624 No. 22, Ln. 170, Dehuei St. (Opposite)
+## 625 No. 401, Jilin Rd
+## 626 Minzu E. Rd. & Songjiang Rd. Intersection (Northwest)
+## 627 No. 5, Binjiang St. (Opposite)
+## 628 Ln. 128, Sec. 2, Jhongshan N. Rd.
+## 629 No. 54, Weishuei Rd. (Opposite)
+## 630 No. 4, Nanjing W. Rd.
+## 631 No. 2, Sec. 3, Jhongshan N. Rd. (Opposite)
+## 632 Minzu E. Rd & Jilin Rd. Intersection (Northwest)
+## 633 No. 230, Songjiang Rd.
+## 634 No. 29, Changchun Rd.
+## 635 Jianguo N. Rd. & Nong'an St. Intersection
+## 636 Ln. 77, Songjiang Rd.
+## 637 Sec. 1, Jianguo N. Rd. & Sec. 2, Chang'an E. Rd. Intersection (North)
+## 638 No. 36, Sec. 1, Xinsheng N. Rd.
+## 639 No. 51, Sec. 2, Minquan E. Rd.
+## 640 No. 25, Sec. 3, Zhongshan N. Rd.
+## 641 No. 7, Ln. 48, Sec. 2, Zhongshan N. Rd
+## 642 No. 11, Ln. 188, Songjiang Rd. (Opposite)
+## 643 No. 125, Jilin Rd.
+## 644 No. 33, Sec. 2, Minsheng E. Rd.
+## 645 No. 67, Sec. 3, Minsheng E. Rd.
+## 646 No. 174, Jinzhou St.
+## 647 No. 59-3, Sec. 2, Zhongshan N. Rd.
+## 648 Ln. 23, Sec. 1, Minsheng E. Rd. & Ln. 27, Sec. 1, Minsheng E. Rd. Intersection
+## 649 No. 100, Sec. 2, Xinsheng N. Rd.
+## 650 Ln. 199, Binjiang St.
+## 651 Ln. 154, Binjiang St. (Opposite)
+## 652 No. 336, Minzu E. Rd.
+## 653 No. 60, Xing'an St. (Opposite)
+## 654 No. 66, Ln. 514, Fuxing N. Rd.
+## 655 No. 113-133, Sec. 2, Zhongshan N. Rd.
+## 656 Zhifu Rd. & Lequn 3rd Rd. Intersection (Northwest)
+## 657 Ln. 13, Jinzhou St. & Ln. 137, Sec. 2, Zhongshan N. Rd. Intersection (Southeast)
+## 658 No. 178-1, Sec. 2, Nanjing E. Rd.
+## 659 No. 121, Sec. 3, Nanjing E. Rd.
+## 660 No. 1-7, Ln. 41, Fushun St.
+## 661 No. 28, Dazhi St. (Opposite)
+## 662 No. 535-2, Bei'an Rd.
+## 663 No.109, Songjiang Rd.
+## 664 Ln. 177, Jingye 3rd Rd. (South)
+## 665 No. 134, Sec. 2, Minquan E. Rd.
+## 666 No. 208, Songjiang Rd.
+## 667 No. 100, Jilin Rd. (Opposite)
+## 668 No. 120, Changchun Rd.
+## 669 No. 135, Changchun Rd.
+## 670 No. 101, Sec. 2, Nanjing E. Rd.
+## 671 No. 85, Sec. 2, Nanjing E. Rd.
+## 672 No. 158, Songjiang Rd.
+## 673 No. 301, Bei'an Rd.
+## 674 Minzu W. Rd. & Yumen St. Intersection (Northeast)
+## 675 Sec. 3, Xinsheng N. Rd. & Nong'an St. Intersection
+## 676 Ln. 77, Nong'an St. & Aly. 1, Ln. 77, Nong'an St. Intersection
+## 677 No. 52-1, Aly. 41, Ln. 458, Bei'an Rd.
+## 678 Lequn 2nd Rd. & Mingshui Rd. Intersection (East)
+## 679 No. 46, Sec. 2, Minquan E. Rd.
+## 680 Changchun Rd. & Longjiang Rd. Intersection (Northwest)
+## 681 Sec. 1, Minquan E. Rd. & Sec. 3, Xinsheng N. Rd. Intersection (North)
+## 682 Jianguo N. Rd. & Changchun Rd. Intersection (North)
+## 683 Songjiang Rd. & Nong'an St. Intersection
+## 684 Sec. 3, Zhongshan N. Rd. (Pavilion of New Fashion)
+## 685 No. 143, Tongbei St.
+## 686 No. 99, Ln. 266, Lequn 2nd Rd.
+## 687 Linsen N. Rd. & Sec. 1, Nanjing E. Rd. Intersection
+## 688 Ln. 30, Lequn 2nd Rd. & Aly. 61, Ln. 116, Lequn 2nd Rd. Intersection
+## 689 Ln. 109, Sec. 3, Nanjing E. Rd. & Ln. 120, Longjiang Rd. Intersection
+## 690 Sec. 3, Xinsheng N. Rd. & Minzu E. Rd. Intersection (Southwest)
+## 691 MRT Nanjing Fuxing Sta.(Exit.1) (Ln. 155, Liaoning St.)
+## 692 Sec. 1, Jianguo S. Rd. & Civic Blvd. Intersection (North)
+## 693 Longjiang Rd. & Zhulun St. Intersection (Northwest)
+## 694 Ln. 94, Dazhi St.
+## 695 No. 221, Sec. 3, Nanjing E. Rd.
+## 696 Sec. 3, Minquan E. Rd. & Sec. 2, Jianguo N. Rd. (Under Elevated Bridge)
+## 697 No. 11, Dehui St. (East)
+## 698 Sec. 3, Xinsheng N. Rd. & Binjiang St. Intersection (Southeast)
+## 699 No. 64, Sec. 1, Xinsheng N. Rd. (Opposite)
+## 700 No. 39-2, Sec. 2, Xinsheng N. Rd. (Opposite)
+## 701 Ln. 807, Bei'an Rd.
+## 702 Jingye 3rd Rd. & Lequn 3rd Rd. Intersection
+## 703 No. 6, Ln. 258, Changchun Rd. (North)
+## 704 No. 13, Ln. 201, Liaoning St.
+## 705 Sec. 3, Jianguo N. Rd. & Wuchang St. Intersection
+## 706 No. 66, Sec. 2, Zhongshan N. Rd.
+## 707 No. 179, Sec. 3, Civic Blvd.
+## 708 Sec. 2, Civic Blvd. & Ln. 5, Sec. 2, Civic Blvd. Intersection
+## 709 No. 1, Nanjing W. Rd.
+## 710 Jianguo N. Rd. Parking Lot (G)
+## 711 No. 42, Ln. 45, Longjiang Rd.
+## 712 No. 56, Fuxing N. Rd.
+## 713 No. 316, Songjiang Rd.
+## 714 Sec. 3, Jianguo N. Rd. & Ln. 86, Sec. 3, Jianguo N. Rd. Intersection
+## 715 Ln. 56, Sec. 1, Chang'an E. Rd. & Sec. 1, Chang'an E. Rd. Intersection
+## 716 No. 148, Songjiang Rd.
+## 717 No. 3, Ln. 246, Sec. 2, Tiding Blvd.
+## 718 BeiAn Rd. & TongBei St. Intersection (Northeast)
+## 719 No. 69, Sec. 3, MinQuan E. Rd.
+## 720 No. 167, ChangChun Rd.
+## 721 BeiAn Rd. & MingShui Rd. Intersection (Bus Station:ZiQiang Tunnel)
+## 722 No. 6-10, Aly. 118, Ln. 21, Wunhu St.
+## 723 No. 66-72, Sec. 1, Neihu Rd.
+## 724 No. 37, Jihu Rd.
+## 725 No. 225, Sec 1, Neihu Rd.
+## 726 Ln. 21, Wunhu St.
+## 727 No. 10, Ln. 81, Wenhu St.(West)
+## 728 No. 56, Sec. 1, Huanshan Rd.(South)
+## 729 Ln. 411, Sec. 1, Neihu Rd.(East)
+## 730 No. 141, Sec. 2, Huanshan Rd.(North)
+## 731 No. 81, Sec. 2, Huanshan Rd.(Northwest)
+## 732 Dahu Shanzhuang St & Ln. 176, Dahu Shanzhuang St. (Southeast)
+## 733 No. 3, Aly. 49, Ln. 113, Donghu Rd. (North)
+## 734 No. 13, Aly. 95, Ln. 113, Donghu Rd. (West)
+## 735 No. 2, Ln. 221, Gangqian Rd.
+## 736 No. 271, Ruiguang Rd. (Southeast)
+## 737 No. 5, Sec. 5, Chenggong Rd. (East)
+## 738 No. 116, Sec. 1, Kangning Rd.
+## 739 No. 47, Xingyun St. (South)
+## 740 Ln. 9, Sec. 1, Huanshan Rd
+## 741 No. 291, Sec. 1, Neihu Rd. (Opposite)
+## 742 No. 500, Ruiguang Rd. (Opposite)
+## 743 No. 57, Ganghua St. (Opposite)
+## 744 Sec. 2, Huanshan Rd & Ln. 26, Sec. 2, Huanshan Rd (Southwest)
+## 745 No. 188, Sec. 4, Chenggong Rd.
+## 746 No. 28, Ln. 60, Sec. 3, Neihu Rd. (East)
+## 747 No. 203-8, Jinlong Rd. (North)
+## 748 No. 212, Wende Rd.
+## 749 Yangguang St & Ln. 220, Wende Rd Intersection
+## 750 Aly. 102, Ln. 68, Yangguang St & Yangguang St Intersection
+## 751 No. 12, Ln. 210, Wende Rd. (Opposite)
+## 752 No. 6, Ln. 22, Wende Rd. (Opposite)
+## 753 Ln. 22, Wende Rd & No. 1, Aly. 74, Ln. 22, Wende Rd Intersection
+## 754 No. 213, Tanmei St. (South)
+## 755 No. 180, Sec. 6, Nanjing E. Rd. (North)
+## 756 No. 179, Xingshan Rd. (South)
+## 757 No. 343, Xinming Rd. (North)
+## 758 No. 139, Tanmei St.
+## 759 No. 99, Sec. 6, Minquan E. Rd.
+## 760 No. 22-1, Aly. 73, Ln. 61, Kangle St. (South)
+## 761 No. 22, Aly. 24, Ln. 32, Ankang Rd.
+## 762 No. 27, Shitan Rd. (South)
+## 763 No. 382, Sec. 6, Nanjing E. Rd. (Southwest)
+## 764 No. 22, Xinming Rd.
+## 765 No. 50, Sec. 6, Minquan E. Rd.
+## 766 No. 160, Ruiguang Rd.
+## 767 No. 29, Ln. 15, Sec. 6, Minquan E. Rd.
+## 768 No. 30, Sec. 6, Minquan E. Rd.
+## 769 No. 36, Xinhu 3rd Rd.
+## 770 No. 125, Sec. 6, Nanjing E. Rd. (South)
+## 771 No. 27, Tanmei St. (West)
+## 772 No. 424, Sec. 2, Chenggong Rd. (Opposite)
+## 773 Sec. 6, Minquan E. Rd. / Ln. 180, Sec. 6, Minquan E. Rd. (Southwest)
+## 774 No. 208, Sec. 6, Minquan E. Rd.
+## 775 No. 39, Sec. 3, Kangning Rd. (Opposite)
+## 776 No. 11, Ln. 363, Jinhu Rd. (Opposite)
+## 777 No. 1, Aly. 125, Ln. 347, Jinhu Rd. (Opposite)
+## 778 Sec. 2, Neihu Rd. / Ln. 103, Sec. 2, Neihu Rd. (Northeast)
+## 779 No. 76, Ln. 103, Sec. 2, Neihu Rd. (Opposite)
+## 780 No. 17, Aly. 48, Ln. 179, Sec. 2, Neihu Rd.
+## 781 No. 334, Sec. 2, Neihu Rd.
+## 782 No. 2, Aly. 6, Ln. 167, Sec. 4, Chenggong Rd.
+## 783 No. 273, Sec. 1, Kangning Rd. (Opposite)
+## 784 Ln. 156, Sec. 1, Kangning Rd. / Aly. 20, Ln. 156, Sec. 1, Kangning Rd. (West)
+## 785 No. 31, Ln. 14, Wufen St. (Opposite)
+## 786 No. 3, Ln. 83, Antai St. (Opposite)
+## 787 No. 236-3, Kangle St.
+## 788 No. 520, Sec. 1, Neihu Rd.
+## 789 No. 4, Ln. 125, Kangle St. (Opposite)
+## 790 No. 28, Ankang Rd. (Northwest)
+## 791 No. 290, Ankang Rd. (West)
+## 792 No. 60, Sec. 3, Kangning Rd. (South)
+## 793 No. 54-5, Sec. 3, Kangning Rd. (West)
+## 794 No. 39, Xingshan Rd.
+## 795 No. 122, Sec. 6, Nanjing E. Rd. ((Front right))
+## 796 Ln. 206, Sec. 6, Minquan E. Rd. & Aly. 75, Ln. 190, Sec. 6, Minquan E. Rd. (Northwest)
+## 797 No. 247, Sec. 6, Minquan E. Rd.
+## 798 Donghu Rd.& Ln. 113, Donghu Rd. Intersection (East)
+## 799 Ln. 182, Sec. 4, Chenggong Rd. & Sec. 4, Chenggong Rd. Intersection (West)
+## 800 No. 185, Gangcian Rd.
+## 801 No. 101, Rueihu St. (Opposite)
+## 802 Ln. 112, Jinlong Rd.
+## 803 No. 12, Ln. 138, Xingyun St.
+## 804 No. 13, Aly. 163, Ln. 189, Sec. 3, Kangning Rd. (Southeast)
+## 805 No. 70, Aly. 39, Ln. 99, Sec. 3, Kangning Rd. (Southeast)
+## 806 No. 17, Ln. 420, Sec. 5, Chenggong Rd. (East)
+## 807 No. 215, Sec. 1, Tiding Blvd.
+## 808 No. 189, Sec. 2, Chenggong Rd. (North)
+## 809 No. 179, Xingshan Rd.
+## 810 Xinhu 2nd Rd. & Ln. 250, Xinhu 2nd Rd. Intersection (Southwest)
+## 811 No. 6, Ln. 41, Sec. 4, Chenggong Rd.
+## 812 No. 83, Jinhu Rd. (Opposite)
+## 813 No. 161, Sec. 6, Minquan E. Rd.
+## 814 No. 15, Aly. 117, Ln. 190, Sec. 6, Minquan E. Rd.
+## 815 No. 12, Zhouzi St.
+## 816 No. 25-6, Aly. 68, Ln. 21, Wenhu St. (North)
+## 817 No. 242, Ln. 179, Sec. 2, Neihu Rd. (Opposite)
+## 818 No. 243, Xingshan Rd.
+## 819 No. 88, Minshan St.
+## 820 No. 181, Anmei St.
+## 821 No. 14, Ln. 161, Yangguang St. (Opposite)
+## 822 No. 366, Sec. 6, Nanjing E. Rd. (Opposite)
+## 823 Ln. 60, Wenhu St. & Ln. 24, Sec. 1, Huanshan Rd. Intersection (North)
+## 824 No. 6, Ln. 47, Sec. 6, Minquan E. Rd. (Opposite)
+## 825 No. 102, Ruiguang Rd.
+## 826 Ln. 315, Ankang Rd. & Ln. 14, Wufen St. Intersection (West)
+## 827 Sec. 6, Minquan E. Rd. & Aly. 31, Ln. 320, Sec. 2, Chenggong Rd. Intersection (Southeast)
+## 828 No. 15, Ln. 72, Sec. 3, Neihu Rd. (West)
+## 829 No. 409, Sec. 6, Minquan E. Rd.
+## 830 No. 353, Ruiguang Rd. (Ruiguang Rd.)
+## 831 No. 353, Ruiguang Rd. (Gangqian Rd.)
+## 832 Ln. 151, Kangle St. & Kangle St. Intersection
+## 833 No. 358, Sec. 1, Neihu Rd.
+## 834 No. 83, Sec. 3, Chenggong Rd.
+## 835 Ln. 47, Sec. 1, Neihu Rd. & Aly. 22, Ln. 47, Sec. 1, Neihu Rd. Intersection
+## 836 Yangguang St. & Sec. 2, Jiuzong Rd. Intersection
+## 837 Aly. 95, Ln. 113, Donghu Rd. & Ln. 75, Sec. 3, Kangning Rd. Intersection
+## 838 Aly. 23, Ln. 250, Sec. 2, Chenggong Rd. & Ln. 312, Sec. 2, Chenggong Rd. Intersection
+## 839 Antai St.(Kangle Bridge)
+## 840 Ln. 191, Kangle St. & Kangle St. Intersection
+## 841 No. 663, Sec. 1, Neihu Rd.
+## 842 No. 92, Ln. 333, Xingshan Rd.
+## 843 No. 27, Ln. 383, Xingshan Rd. (Opposite)
+## 844 Sec. 1, Jiuzong Rd. & Xinhu 3rd Rd. Intersection (South)
+## 845 Sec. 2, Jiuzong Rd. & Ln. 11, Sec. 6, Minquan E. Rd. Intersection
+## 846 Ln. 326, Sec. 3, Neihu Rd. & Sec. 3, Neihu Rd. Intersection
+## 847 Ln. 223, Sec. 4, Chenggong Rd. & Aly. 6, Ln. 223, Sec. 4, Chenggong Rd. Intersection
+## 848 Ln. 189, Sec. 3, Kangning Rd. & Aly. 93, Ln. 189, Sec. 3, Kangning Rd. Intersection
+## 849 No. 368, Sec. 2, Neihu Rd. (Opposite)
+## 850 No. 23, Ln. 160, Donghu Rd.
+## 851 Sec. 3, Huanshan Rd. & Ln. 16, Sec. 3, Huanshan Rd. Intersection (Southeast)
+## 852 No. 91, Wende Rd.
+## 853 No. 28, Xinhu 3rd Rd.
+## 854 Xing'ai Rd. & Xinhu 1st Rd. Intersection (Southwest)
+## 855 No. 19, Ln. 99, Sec. 3, Kangning Rd. (Opposite)
+## 856 No. 405, Sec. 2, Tiding Blvd.
+## 857 No. 473, Sec. 2, Tiding Blvd.
+## 858 No. 669, Ruiguang Rd.
+## 859 No. 290, Sec. 1, Neihu Rd.
+## 860 No. 25, Ln. 11, Sec. 6, Minquan E. Rd. (Opposite)
+## 861 Aly. 15, Sec. 6, Minquan E. Rd. & Aly. 19, Sec. 6, Minquan E. Rd. Intersection
+## 862 No. 323, Yangguang St.
+## 863 No. 423, Yangguang St.
+## 864 Ruiguang Rd. & Ln. 358, Ruiguang Rd. Intersection
+## 865 Zhouzi St. & Ln. 393, Ruiguang Rd. Intersection
+## 866 No. 396, Sec. 1, Neihu Rd.
+## 867 No. 7, Ln. 56, Sec. 6, Minquan E. Rd. (Opposite)
+## 868 No. 122、124, Xinhu 3rd Rd. (Opposite)
+## 869 No. 122、124, Xinhu 3rd Rd. (Opposite)
+## 870 Sec. 1, Jiuzong Rd. & Xinhu 2nd Rd. Intersection (South)
+## 871 No. 12, Jihu Rd.
+## 872 No. 8, Aly. 15, Ln. 120, Sec. 1, Neihu Rd. (Opposite)
+## 873 No. 501, Sec. 2, Tiding Blvd.
+## 874 No. 61, Zhouzi St.
+## 875 No. 21, Ln. 110, Kangle St. (Opposite)
+## 876 No. 17-19, Ln. 360, Sec. 1, Neihu Rd.
+## 877 No. 156, Xingyun St.
+## 878 No. 289, Sec. 1, Neihu Rd.
+## 879 No. 537, Tanmei St.
+## 880 No. 16, Ln. 91, Sec. 1, Neihu Rd. (Opposite)
+## 881 No. 35, Ln. 316, Ruiguang Rd.
+## 882 WenDe Rd. & Ln. 220, WenDe Rd. Intersection (Southwest)
+## 883 No. 38, AnMei St.
+## 884 No. 6, Ln. 16, Sec. 3, KangNing Rd. (Opposite)
+## 885 No. 25-35, Ln. 201, KangLe St.
+## 886 No. 15, Sec. 3, HuanShan Rd. (Opposite)
+## 887 No. 482, Sec. 6, NanJing E. Rd.
+## 888 No. 306-308, Chengde Rd. (Front)
+## 889 No. 271, Zhoumei St. (Front)
+## 890 No. 212, Mingde Rd. (Ronghua 2nd Rd. Side)
+## 891 Sec.1, Xi'an St. & Mingde Rd. (Southeast)
+## 892 No. 214-216, Wenlin N. Rd. (Front)
+## 893 No, 2, Ln. 10, Xingyi Rd. (Side)
+## 894 No. 360, Zhixing Rd.
+## 895 No. 68, Guandu Rd. (Opposite)
+## 896 No. 7, Ln. 235, Zhixing Rd. (Opposite)
+## 897 No. 262, Sec. 4, Zhongyang N. Rd. (Opposite)
+## 898 Ln. 270, Sec. 3, Dadu Rd. & Ln. 55, Ligong St. (Southwest)
+## 899 Ln. 583, Sec. 4, Zhongyang N. Rd. Intersection
+## 900 No. 529, Sec. 4, Zhongyang N. Rd. (Opposite)
+## 901 Sec. 3, Dadu Rd. & Lide Rd. Intersection (Northwest)
+## 902 No. 9-1, Sec. 3, Zhongyang N. Rd. (Opposite)
+## 903 No. 185, Sec. 3, Zhongyang N. Rd.
+## 904 No. 259, Daye Rd. (Opposite)
+## 905 Daoxiang & Chongshan Rd. Intersection
+## 906 No. 167, Sec. 2, Zhongyang N. Rd. (Opposite)
+## 907 No. 50, Xiushan Rd.
+## 908 No. 671, Daye Rd. (Opposite)
+## 909 No. 10, Zhonghe St. (Opposite)
+## 910 No. 3, Ln. 2, Guangming Rd. (Opposite)
+## 911 No. 486, Sec. 2, Sanhe St.
+## 912 No. 20, Sec. 1, Beitou Rd.
+## 913 No. 198, Gongguan Rd. (Opposite)
+## 914 No. 302, Daye Rd.
+## 915 Sec. 7, Chengde Rd. & Jili St. (Northwest)
+## 916 No. 119, Sec. 1, Sanhe St.
+## 917 No. 345, Sec. 2, Xi'an St. (Opposite)
+## 918 No. 100, Ln. 39, Sec. 1, Shipai Rd.
+## 919 No. 136, Sec. 2, Donghua St. (Opposite)
+## 920 No. 526, Sec. 1, Donghua St. (Opposite)
+## 921 No. 100, Sec. 2, Shipai Rd.
+## 922 No. 319, Sec. 1, Shipai Rd. (Opposite)
+## 923 No. 365, Mingde Rd.
+## 924 No. 142, Sec. 1, Shipai Rd. (Opposite)
+## 925 No. 109, Tianmu W. Rd. (Opposite)
+## 926 No. 201, Sec. 1, Linong St. (Opposite)
+## 927 No. 260, Sec. 7, Chengde Rd.
+## 928 No. 8, Ln. 61, Ziqiang St.
+## 929 No. 2, Ronghua 3rd Rd.
+## 930 No. 77, Wenlin N. Rd.
+## 931 No.15, Lide Rd. (Front)
+## 932 No. 32, Sec.4, Zhongyang Rd. (Side)
+## 933 Parking lot at the back of the NYCU Library
+## 934 No. 225, Guangming Rd. (Opposite)
+## 935 No. 61, Zhonghe St.
+## 936 Sec. 7, Chengde Rd. & Sec. 1, Shipai Rd. Intersection (North)
+## 937 No. 192-198, Sec. 7, Chengde Rd.
+## 938 No. 95, Mingde Rd.
+## 939 No. 145, Dasing St.
+## 940 No. 199, Fumei Rd.
+## 941 No. 6-8, Aly. 11, Ln. 455, Zhonghe St.
+## 942 Zhoumei Xianzaigang Park(Southwest)
+## 943 No. 3, Xinglin 1st Rd.
+## 944 Zhuhai Rd. & Fuxing 1st Rd. Intersection (East)
+## 945 Ln. 33, Yumin 2nd Rd. & Yumin 6th Rd. Intersection (Northwest)
+## 946 No. 269-271, Huanggang Rd.
+## 947 No. 145, Zhuhai Rd. (Opposite)
+## 948 No. 16, Ln. 79, Sec. 1, Sanhe St. (Opposite)
+## 949 No. 185, Sec. 2, Shipai Rd. (Opposite)
+## 950 Huanggang Rd. & Ln. 177, Qingjiang Rd. Intersection (East)
+## 951 No. 280, Wenlin N. Rd. (Opposite)
+## 952 No. 1, Zhuhai Rd.
+## 953 No. 259, Daye Rd. (Opposite)
+## 954 No. 148, Guangming Rd. (Opposite)
+## 955 No. 125, Lide Rd.
+## 956 No. 26, Xiushan Rd.
+## 957 No. 6, Zhongshan Rd.
+## 958 No. 2, Aly. 9, Ln. 493, Zhonghe St. (Opposite)
+## 959 Ln. 2, Guangming Rd. & Guangming Rd. Intersection
+## 960 Sec. 2, Shipai Rd. & Sec. 2, Linong St. Intersection
+## 961 Qilian Station 1(Donghua). (Opposite)
+## 962 Daxing St. & Ln. 2, Guangming Rd. Intersection
+## 963 MRT Zhongyi Sta. (Exit. 2)
+## 964 No. 80, Sec. 6, Chengde Rd.
+## 965 MRT Beitou Sta. (Exit 1) ( Beitou Rd.)
+## 966 No. 120, Sec. 6, Chengde Rd.
+## 967 No. 43, Ln. 255, Gongguan Rd. (Opposite)
+## 968 No. 2, Wenhua 3rd Rd.
+## 969 No. 365, Zhonghe St.
+## 970 Daye Rd. & Ln. 65, Daye Rd. Intersection
+## 971 No. 390, Sec. 7, Chengde Rd.
+## 972 No. 112, Wenlin N. Rd.
+## 973 Ln. 32, Sec. 1, Yongxing Rd. & Sec. 1, Yongxing Rd. Intersection
+## 974 No. 16, Ln. 210, ZhiXing Rd. (Opposite)
+## 975 No. 76, LiGong St. (Opposite)
+## 976 No. 200, Ln. 401, Sec. 7, ChengDe Rd. (Opposite)
+## 977 No. 6, DaYe Rd.
+## 978 No. 742, Sec. 4, Bade Rd.
+## 979 No. 2, Tayou Rd.
+## 980 No. 399, Jiankang Rd. (North)
+## 981 No. 9, Ln. 91, Sec. 4, Bade Rd. (Opposite)
+## 982 No. 156, Sec. 5, Nanjing E. Rd.
+## 983 MRT Nanjing Sanmin Sta. (Exit 1)
+## 984 No. 13, Guangfu N Rd.
+## 985 No. 229, Sec. 5, Nanjing E. Rd.
+## 986 No. 5, Aly. 5, Ln. 325, Jiankang Rd.
+## 987 No. 119, Sec. 3, Minquan E. Rd.
+## 988 No. 712, Minzu E. Rd. (Opposite)
+## 989 No. 43, Ln. 244, Dunhua N. Rd. (Opposite)
+## 990 No. 216, Dunhua N. Rd. (Opposite)
+## 991 No. 432, Changchun Rd. (Opposite)
+## 992 No. 1, Ln. 166, Sanmin Rd. (Opposite)
+## 993 No.163-1, Sec. 5, Minsheng E. Rd.
+## 994 No.6, Sec. 4, Nanjing E. Rd.
+## 995 No. 25, Sec. 3, Bade Rd.
+## 996 No. 15, Ln. 199, Dunhua N. Rd.
+## 997 Dunhua N. Rd. & Ln. 77, Fujin St. (Southeast)
+## 998 Sec. 4, Minquan E Rd. & Xinzhong St. Intersection (Southwest)
+## 999 Sec. 5, Minsheng E Rd. & Tayou Rd. Intersection (Southwest)
+## 1000 No. 266, Guangfu N. Rd.
+## 1001 No. 339, Fuyuan St.
+## 1002 No. 95, Ln. 74, Sec. 3, Bade Rd. (South)
+## 1003 No. 123, Sec. 4, Civic Blvd.
+## 1004 Guangfu N. Rd. & Ln. 190, Guangfu N. Rd. Intersection (Southeast)
+## 1005 Ln. 356, Yanshou St. & Aly. 16, Ln. 330, Yanshou St. Intersection (Northeast)
+## 1006 No. 305, Jiankang Rd.
+## 1007 Sec. 4, Minquan E. Rd. & Guangfu N. Rd. Intersection (Northeast)
+## 1008 No. 33, Dongxing Rd. (South)
+## 1009 No. 19, Guangfu S. Rd. (West)
+## 1010 No.11, Ln. 58, Guangfu S. Rd. (East)
+## 1011 No. 78, Jiankang Rd. (Opposite)
+## 1012 No.342, Sec. 2, Bade Rd.
+## 1013 No. 186, Sec. 4, Nanjing E. Rd.
+## 1014 No. 84, Sec. 5, Minsheng E. Rd.
+## 1015 No. 179, Jiankang Rd.
+## 1016 No. 1, Ln. 43, Sanmin Rd.
+## 1017 Ln. 106, Sec. 4, Bade Rd. & Aly. 6, Ln. 106, Sec. 4, Bade Rd. Intersection (East)
+## 1018 No. 73, Sec. 4, Civic Blvd.
+## 1019 No. 1, Qingcheng St. (Southeast)
+## 1020 No. 262, Sec. 3, Nanjing E. Rd.
+## 1021 No. 41-1, Sec. 5, Minquan E. Rd.
+## 1022 Dunhua N. Rd. & Sec. 3, Bade Rd. Intersection (Northeast)
+## 1023 No. 75-1, Sec. 4, Nanjing E. Rd.
+## 1024 No. 112, Dunhua N. Rd.
+## 1025 No. 182, Songhe St. (Opposite)
+## 1026 No. 685, Sec. 4, Bade Rd.
+## 1027 No. 102, Sec. 3, Minquan E. Rd.
+## 1028 No. 57, Sec. 5, Nanjing E. Rd.
+## 1029 Tayou Rd. & Ln. 261, Fuyuan St. (West)
+## 1030 Baoqing St. & Ln. 30, Baoqing St. Intersection (North)
+## 1031 Jiankang Rd. & Aly. 50, Ln. 251, Sec. 5, Nanjing E. Rd. Intersection (West)
+## 1032 No. 174, Jiankang Rd.
+## 1033 No. 62, Ln. 106, Sec. 3, Bade Rd. (Opposite)
+## 1034 No. 163, Sec. 4, Nanjing E. Rd.
+## 1035 No. 25, Sec. 3, Bade Rd.
+## 1036 Ln. 325, Jiankang Rd. & Aly. 12, Ln. 325, Jiankang Rd. Intersection (Northeast)
+## 1037 Sec. 5, Nanjing E. Rd. & Dongxing Rd. Intersection (North)
+## 1038 Songshan Rd. & Sec. 6, Civic Blvd. Intersection
+## 1039 Ln. 36, Sec. 5, Minsheng E. Rd. & Ln. 165, Guangfu N. Rd. Intersection
+## 1040 Dunhua N. Rd. & Sec. 4, Nanjing E. Rd. Intersection
+## 1041 Sec. 1, Dunhua S. Rd. & Sec. 2, Bade Rd. Intersection (Southwest)
+## 1042 Sanmin Rd. & Ln. 51, Xindong St. Intersection (East)
+## 1043 Bade Rd. & Songxin Rd. Intersection (Southwest)
+## 1044 No. 431, Changchun Rd.
+## 1045 No. 650, Sec. 4, Bade Rd. (South)
+## 1046 No. 711, Sec. 4, Bade Rd.
+## 1047 No. 12, Sec. 4, Nanjing E. Rd.
+## 1048 Sec. 4, Nanjing E. Rd. & Jiankang Rd. Intersection (Northwest)
+## 1049 No. 151, Dunhua N. Rd.
+## 1050 Sec. 3, Minsheng E. Rd. & Fuxing N. Rd. Intersection (Southeast)
+## 1051 Civic Blvd. & Yanji St. Intersection (Under Bridge)
+## 1052 No. 35, Ln. 190, Guangfu N. Rd. (Opposite)
+## 1053 MRT Nanjing Sanmin Sta. (Exit 3)
+## 1054 No. 386, Sec. 5, Nanjing E. Rd.
+## 1055 No. 8, Ln. 370, Wuchang St.
+## 1056 Ln. 119, Yanshou St. & Yanshou St.
+## 1057 No. 111, Sec. 5, Civic Blvd.
+## 1058 No. 630, Minzu E. Rd. (Opposite)
+## 1059 No. 27, Ln. 390, Fuyuan St. (Opposite)
+## 1060 No. 191, Sec. 5, Minsheng E. Rd.
+## 1061 No. 211, Sec. 3, Minquan E. Rd.
+## 1062 No. 1, Ln. 170, Dongxin St. Southwest)
+## 1063 No. 383, Fude St. (North)
+## 1064 No. 403, Sec. 6, Zhongxiao E. Rd.
+## 1065 No. 219, Sec. 6, Zhongxiao E. Rd.
+## 1066 No. 7, Zhongpo N. Rd. (East)
+## 1067 No. 46, Yucheng St. (East)
+## 1068 No. 17, Sec. 6, Zhongxiao E. Rd. (Northeast)
+## 1069 No. 15, Ln. 118, Dongxin St. Southwest)
+## 1070 No. 247, Yucheng St. (Opposite)
+## 1071 No. 1, Sec. 1, Jiuzhuang St. (West)
+## 1072 No. 128, Sec. 2, Academia Rd. (Gymnasium)
+## 1073 No. 128, Sec. 2, Academia Rd. (NBRP)
+## 1074 No. 1, Sec. 1, Academia Rd. (Exit 5)
+## 1075 No. 9, Aly. 58, Ln. 12, Sec. 2, Academia Rd. (West)
+## 1076 No. 27, Ln. 44, Fushan St. (Southeast)
+## 1077 No. 11, Ln. 91, Sec. 1, Jiuzhuang St. Southwest)
+## 1078 No. 9, Ln. 68, Sec. 3, Academia Rd. (North)
+## 1079 No. 532, Sec. 8, Civic Blvd. (North)
+## 1080 No. 183, Jingmao 2nd Rd. (Exit 2)
+## 1081 No. 67, Huimin St. (Southeast)
+## 1082 No. 1, Ln. 44, Xingzhong Rd. (East)
+## 1083 No. 350, Sec. 1, Nangang Rd.
+## 1084 No. 34, Ln. 125, Chongyang Rd. (East)
+## 1085 No. 49, Xiangyang Rd. (North)
+## 1086 No. 510, Sec. 7, Zhongxiao E. Rd. (Northwest)
+## 1087 No. 380, Sec. 7, Zhongxiao E. Rd. (Exit 2)
+## 1088 No. 380, Sec. 7, Zhongxiao E. Rd. (Exit 1)
+## 1089 No. 68, Dongming St. (North)
+## 1090 No. 246, Sec. 3, Yanjiuyuan Rd. (East)
+## 1091 No. 25, Aly. 23, Ln. 35, Sec. 2, Academia Rd. (North)
+## 1092 No. 1, Ln. 3, Sec. 2, Academia Rd. (West)
+## 1093 No. 200-1, Sec. 2, Nangang Rd.(South)
+## 1094 No. 269, Chongyang Rd. (South)
+## 1095 No. 99, Sec. 8, Civic Blvd.
+## 1096 No. 313, Sec. 1, Nangang Rd.
+## 1097 No. 552, Sec. 7, Zhongxiao E Rd.
+## 1098 No. 15, Xinmin St. (North)
+## 1099 No. 188-1, Jingmao 2nd Rd.
+## 1100 No. 1, Ln. 10, Sec. 3, Yanjiuyuan Rd. (East)
+## 1101 No. 8, Ln. 47, Sec. 3, Nangang Rd. (South)
+## 1102 No. 58, Kunyang St. (East)
+## 1103 No.20, Ln. 314, Sec. 3, Nangang Rd.
+## 1104 No. 133, Sec. 3, Nangang Rd.
+## 1105 No. 4, Dongxin St. (East)
+## 1106 No. 873, Sec. 4, Bade Rd.
+## 1107 No. 150, Yucheng St.
+## 1108 -No. 19, Zhongpo S. Rd.
+## 1109 No. 7, Ln. 309, Fude St. (South)
+## 1110 No. 1, Ln. 255, Jingmao 2nd Rd.
+## 1111 No. 458, Chongyang Rd.(West)
+## 1112 No. 359, Sec. 7, Zhongxiao E. Rd.
+## 1113 No. 130, Sec. 2, Academia Rd. Intersection (East)
+## 1114 No. 505, Chongyang Rd.
+## 1115 No. 58, Jingyuan St. (North)
+## 1116 No. 71, Huimin St. (West)
+## 1117 No. 2, Aly. 16, Ln. 1, Fukang St. (East)
+## 1118 No. 2, Aly. 16, Ln. 101, Sec. 1, Academia Rd.
+## 1119 Sec. 1, Jiuzong Rd. & Ln. 145, Sec. 1, Jiuzong Rd. Intersection
+## 1120 No. 76, Sec. 1, Chenggong Rd. (Opposite)
+## 1121 Ln. 258, Xiangyang Rd. & Ln. 39, Chongyang Rd. Intersection (Southwest)
+## 1122 No. 28, Sec. 1, Nangang Rd.
+## 1123 No. 32, Sec. 1, Nangang Rd.
+## 1124 No. 65, Dongxin St. (Southeast)
+## 1125 No. 63, Ln. 170, Dongxin St. (Opposite)
+## 1126 Zhongpo N. Rd. & Sec. 7, Civic Blvd. Intersection (Northeast)
+## 1127 No. 173, Kunyang St.
+## 1128 Sec. 2, Nangang Rd. & Ln. 178, Sec. 2, Nangang Rd. Intersection (North)
+## 1129 Sec. 7, Zhongxiao E. Rd. & Ln. 415, Sec. 7, Zhongxiao E. Rd. Intersection
+## 1130 Xinghua Rd. & Sec. 8, Civic Blvd. Intersection (Northwest)
+## 1131 No. 8, Ln. 178, Chengfu Rd. (Opposite)
+## 1132 Dongxin St. & Sec. 7, Civic Blvd. Intersection (North)
+## 1133 No. 80, Ln. 373, Fude St.
+## 1134 Ln. 197, Chengfu Rd. & Chengfu Rd. Intersection
+## 1135 No. 398, Songhe St. (Opposite)
+## 1136 Chengfu Rd. & Aly. 10, Ln. 80, Dongxin St.
+## 1137 Jingmao 2nd Rd. & Sec. 1, Nangang Rd. Intersection (Northwest)
+## 1138 Sec. 1, Jiuzhuang St. & Ln. 215, Sec. 1, Jiuzhuang St. Intersection
+## 1139 Sec. 3, Nangang Rd. & Ln. 80, Sec. 3, Nangang Rd. Intersection
+## 1140 No. 465, Sec. 6, Zhongxiao E. Rd.
+## 1141 Zhongxiao E. Rd. & Ln. 278, Sec. 6, Zhongxiao E. Rd. Intersection
+## 1142 No. 128, Sec. 2, Academia Rd.
+## 1143 No. 380, Songhe St. (Opposite)
+## 1144 No. 358, Songhe St. (Opposite)
+## 1145 No. 226, Sec. 6, Zhongxiao E. Rd.
+## 1146 No. 2, Ln. 47, Fukang St. (Opposite)
+## 1147 Dongxin St. & Ln. 63, Dongxin St. Intersection
+## 1148 Aly. 10, Ln. 70, Sec. 2, Academia Rd. & Ln. 98, Sec. 2, Academia Rd. Intersection
+## 1149 XiangYang Rd. & Sec. 7, Civic Blvd. Intersection
+## 1150 No. 312, Sec. 2, NanGang Rd.
+## 1151 No. 18, Ln. 151, Sec. 1, Academia Rd.
+## 1152 No. 77, Jingmao 1st Rd. (Gangdong St.)
+## 1153 No. 16, Ln. 391, Sec. 3, Heping E. Rd.
+## 1154 No. 155, Sec. 2, Keelung Rd.
+## 1155 No. 131-4, Sec. 2, Keelung Rd.
+## 1156 No. 633, Sec. 3, Heping E. Rd.
+## 1157 Ln. 530, Sec. 3, Heping E. Rd Intersection (Northeast)
+## 1158 No. 50, Xin'an St. (Opposite)
+## 1159 Taipei Medical University (Aly. 59, Ln. 220, Wuxing St)
+## 1160 No. 28, Aly. 35, Ln. 118, Wuxing St. (Sanxing Park)
+## 1161 No. 300, Songde Rd. (South)
+## 1162 No. 128, Sec. 5, Xinyi Rd. (East)
+## 1163 No. 15, Ln. 153, Songren Rd. (East)
+## 1164 No. 6, Ln. 215, Songren Rd.
+## 1165 No. 101, Songren Rd. (East)
+## 1166 No. 152, Sec. 5, Xinyi Rd. (Exit 1)
+## 1167 No. 53, Ln. 200, Songde Rd. (North)
+## 1168 No. 54, Ln. 164, Hulin St. (North)
+## 1169 No. 2, Aly. 11, Ln. 391, Zhuangjing Rd. (Northeast)
+## 1170 No. 100, Songqin St.
+## 1171 No. 16, Sec. 5, Xinyi Rd.
+## 1172 No. 12, Ln. 239, Zhuangjing Rd. (Opposite)
+## 1173 No. 485, Guangfu S. Rd.
+## 1174 No. 455, Guangfu S. Rd.
+## 1175 Sec. 4, Ren'ai Rd & Ln. 496, Sec. 4, Ren'ai Rd Intersection.(Southwest)
+## 1176 No. 15, Ln. 236, Sec. 5, Zhongxiao E. Rd.
+## 1177 No. 22, Aly. 2, Ln. 76, Sec. 6, Xinyi Rd. (Opposite)
+## 1178 No. 82, Linkou St. (Opposite)
+## 1179 No. 655, Songshan Rd.
+## 1180 No. 721, Songshan Rd. (Opposite)
+## 1181 Taipei City Hall East Gate. (Songzhi Rd)
+## 1182 Songzhi Rd & Songshou Rd Intersection. (Northwest)
+## 1183 Shifu Rd & Songshou Rd Intersection. (Northeast)
+## 1184 Shifu Rd & Songgao Rd Intersection. (Southeast)
+## 1185 Shifu Rd & Songshou Rd Intersection. (Northwest)
+## 1186 Songzhi Rd & Xinyi Rd Intersection. (Northeast)
+## 1187 Shifu Rd & Xinyi Rd Intersection. (Northwest)
+## 1188 No. 230, Linkou St. (Opposite)
+## 1189 No. 123, Songren Rd. (North)
+## 1190 No. 2, Ln. 251, Fude St. (Opposite)
+## 1191 No. 135, Dadao Rd. (Opposite)
+## 1192 No. 19, Songgao Rd.
+## 1193 No. 28, Songren Rd. (North)
+## 1194 No. 99, Songlong Rd. (Southwest)
+## 1195 No. 277, Songren Rd. (South)
+## 1196 No. 81, Ln. 600, Wuxing St. (West)
+## 1197 No. 9, Ln. 83, Sec. 1, Jilong Rd. (West)
+## 1198 No. 61, Songxin Rd. (West)
+## 1199 No. 11, Songshan Rd. (South)
+## 1200 No. 161, Songlong Rd.
+## 1201 Songxin Rd./Yongji Rd. (Southwest)
+## 1202 No. 99-1, Sec. 2, Keelung Rd.
+## 1203 Sec. 6, Civic Blvd. & Songxin Rd. Intersection (West)
+## 1204 No. 36, Ln. 599, Sec. 4, Zhongxiao E. Rd. (Opposite)
+## 1205 Sec. 2, Keelung Rd. & Guangfu S. Rd. Intersection (Northeast)
+## 1206 No. 550, Sec. 4, Zhongxiao E. Rd.
+## 1207 No. 60, Ln. 308, Songren Rd.
+## 1208 No. 800, Sec. 5, Zhongxiao E. Rd.
+## 1209 No. 356, Yongji Rd. (East)
+## 1210 No. 66, Ln. 326, Yongji Rd. (West)
+## 1211 No. 323, Yongji Rd. (West)
+## 1212 No. 166, Songshan Rd
+## 1213 No. 279, Songshan Rd
+## 1214 Sec. 5, Sinyi Rd. & Ln. 91, Sec. 5, Sinyi Rd. Intersection (Northwest)
+## 1215 No. 20, Ln. 168, Songde Rd.
+## 1216 Shihfu Rd. & Songshou Rd. Intersection (Southeast)
+## 1217 No. 79, Songde Rd.
+## 1218 No. 209, Songsin Rd.
+## 1219 No. 109-6, Sec. 1, Keelung Rd.
+## 1220 No. 44, Ln. 132, Hulin St. (West)
+## 1221 Ln. 260, Wuxing St. & Aly. 21, Ln. 260, Wuxing St. Intersection (Southeast)
+## 1222 Linkou St., Xinyi Dist. & Fude St. Intersection (Southeast)
+## 1223 Sec. 4, Ren'ai Rd. & Yisian Rd. Intersection (Northwest)
+## 1224 No. 55, Ln. 222, Hulin St.
+## 1225 No. 393, Sec. 4, Sinyi Rd.
+## 1226 MRT Taipei 101 & World Trade Center Sta. (Exit.2) (West)
+## 1227 No. 24, Aly. 36, Ln. 284, Wuxing St. (West)
+## 1228 No. 51, Zhongpo S. Rd. (Opposite)
+## 1229 No. 308, Fude St. (Opposite)
+## 1230 Songren Rd. & Ln. 95, Songren Rd. Intersection (Southeast)
+## 1231 Songzhi Rd. & Songlian Rd. Intersection (Northeast)
+## 1232 No. 8, Songqin St. (Opposite)
+## 1233 No. 15, Ln. 50, Songping Rd. (Opposite)
+## 1234 Zhongxiao E. Rd. & Songren Rd. Intersection (Southeast)
+## 1235 No. 57, Zhongpo N. Rd.
+## 1236 Songren Rd. & Aly. 3, Ln. 583, Wuxing St. Intersection
+## 1237 Ln. 394, Wuxing St. & Wuxing St. Intersection
+## 1238 Sec. 5, Zhongxiao E. Rd. & Ln. 215, Sec. 5, Zhongxiao E. Rd. Intersection
+## 1239 Songqin St. & Zhuangjing Rd. Intersection
+## 1240 Songren Rd & Songping Rd. Intersection
+## 1241 No. 180, Sec. 5, Xinyi Rd.
+## 1242 Ln. 71, Sec. 5, Zhongxiao E. Rd. & Aly. 18, Ln. 31, Sec. 5, Zhongxiao E. Rd. Intersection
+## 1243 No. 23, Ln. 284, Wuxing St. (Opposite)
+## 1244 Ln. 67, Xin'an St. & Xin'an St. Intersection (Southeast)
+## 1245 No. 75, Ln. 67, Xin'an St. (Opposite)
+## 1246 No. 291, Sec. 3, Heping E. Rd.
+## 1247 No. 478, Yongji Rd.
+## 1248 No. 15, Ln. 84, Fude St. (Opposite)
+## 1249 No. 63, Ln. 341, Sec. 3, Heping E. Rd. (Opposite)
+## 1250 No. 36, Songlong Rd. (Opposite)
+## 1251 Ln. 103, Xin'an St. & Aly. 22, Ln. 284, Wuxing St. Intersection
+## 1252 No. 545, Sec. 4, Zhongxiao E. Rd.
+## 1253 No. 200, Guangfu S. Rd. (Opposite)
+## 1254 No. 76, Guangfu S. Rd. (Opposite)
+## 1255 No. 35, Zhongpo N. Rd.
+## 1256 No. 14, Aly. 66, Ln. 281, Songren Rd.
+## 1257 No. 3, Sec. 1, KeeLung Rd.
+## 1258 No. 186, Baoxing St.
+## 1259 Baoxing St & Changtai St Intersection. (Southwest)
+## 1260 No. 482, Wanda Rd.
+## 1261 No. 2, Guoxing Rd.
+## 1262 No. 465, Sec. 2, Zhonghua Rd. (Opposite)
+## 1263 No. 15, Ln 1, Guoxing Rd. (Opposite)
+## 1264 No. 42, Guoxing Rd. (Opposite)
+## 1265 Guoxing Rd & Qingnian Rd Intersection. (Southwest)
+## 1266 No. 66, Qingnian Rd (Opposite)
+## 1267 Youth Park Basketball Courts. (South)
+## 1268 No. 123, Xizang Rd.
+## 1269 No. 1, Aly. 37, Ln. 277, Wanda Rd. (East)
+## 1270 No. 210, Juguang Rd.
+## 1271 No. 137, Juguang Rd.
+## 1272 No. 142, Bangka Blvd.
+## 1273 No. 199, Dongyuan St.
+## 1274 No. 371, Sec. 3, Huanhe S. Rd.
+## 1275 No. 243, Dechang St.
+## 1276 No. 27, Aly 20, Ln 66, Dongyuan St.
+## 1277 No. 14, Ln 35, Dongyuan St. (Opposite)
+## 1278 Sec. 2, Xiyuan Rd & Bangka Blvd Intersection. (Southwest)
+## 1279 Sec. 2, Xiyuan Rd & Xingyi St Intersection
+## 1280 No. 127, Changshun St.
+## 1281 No. 2, Aly. 25, Ln. 250, Sec. 2, Huanhe S. R. (Opposite)
+## 1282 No. 2, Aly. 25, Ln. 250, Sec. 2, Huanhe S. R
+## 1283 No. 282, Sec. 2, Huanhe S. Rd.
+## 1284 Sec. 2, Huanhe S. Rd & Xizang Rd (East)
+## 1285 No. 177, Dali St. (Opposite)
+## 1286 Bangka Blvd & Aly. 20, Ln. 160, Dali St Intersection. (East)
+## 1287 No. 188, Qingnian Rd.
+## 1288 No. 12, Xining Rd. (Opposite)
+## 1289 No. 83, Emei St. (Side)
+## 1290 No. 280-1, Sec. 1, Huanhe S Rd. (Opposite)
+## 1291 No. 108, Chengdu Rd. (Opposite)
+## 1292 No. 164-1, Sec. 1, Zhonghua Rd.
+## 1293 Sec. 1, Zhonghua Rd. & Guilin Rd. (Northwest)
+## 1294 Sec. 3, Heping W Rd. & Sec. 1, Xiyuan Rd. (Northeast)
+## 1295 No. 235, Sec. 3, Heping W Rd. (Side)
+## 1296 No. 134, Guilin Rd. (Opposite)
+## 1297 No. 238, Kangding Rd. (Opposite)
+## 1298 No. 83, Bangka Blvd.
+## 1299 Kangding Rd. & Ln. 287, Kangding Rd. Intersection
+## 1300 Sec. 3, Heping W Rd. & Ln. 88, Sec. 3, Heping W Rd. Intersection (Southwest)
+## 1301 No. 100, Emei St. (Opposite)
+## 1302 No. 18-2, Kangding Rd.
+## 1303 No. 130, Sec. 1, Zhonghua Rd.
+## 1304 No. 81, Kangding Rd. (Opposite)
+## 1305 No. 346, Wanda Rd.
+## 1306 No. 15, Dechang St. (Opposite)
+## 1307 Sec. 1, Huanhe S. Rd. & Sec. 3, Heping W. Rd. Intersection (Southwest)
+## 1308 No. 38, Ln. 60, Changshun St. (Opposite)
+## 1309 Ln. 35, Dongyuan St. & Ln. 67, Dongyuan St. Intersection
+## 1310 No. 66, Ln. 246, Guilin Rd. (South)
+## 1311 No. 102, Sec. 2, Huanhe S. Rd. (Northwest)
+## 1312 Ln. 170, Dali St. & Ln.159, Sec. 2, Huanhe S. Rd. Intersection
+## 1313 Changshun St. & Ln. 106, Shuangyuan St. Intersection
+## 1314 No. 151, Fumin Rd. (Opposite)
+## 1315 No. 245, Sec. 2, Huanhe S. Rd.
+## 1316 Nanning Rd. & Guangzhou St. Intersection (South)
+## 1317 Kunming St. & Luoyang St. Intersection (West)
+## 1318 Guilin Rd. & Kunming St. Intersection (Northwest)
+## 1319 Xizang Rd. & Ln. 299, Juguang Rd. Intersection (Southeast)
+## 1320 Qingnian Rd. & Ln. 106, Qingnian Rd. Intersection (East)
+## 1321 Sec. 3, Heping W. Rd. & Ln. 109, Sec. 3, Heping W. Rd. Intersection (Northwest)
+## 1322 Wanda Rd. & Aly. 22, Ln. 66, Xingning St. Intersection (Northwest)
+## 1323 Bangka Blvd. & Xizang Rd. Intersection (Southwest) (Under Huacui Bridge)
+## 1324 No. 44, Ln. 493, Wanda Rd.
+## 1325 No. 10, Aly. 55, Ln. 320, Sec. 2, Xiyuan Rd.
+## 1326 No. 59, Ln. 152, Qingnian Rd. (Opposite)
+## 1327 No. 11, Ln. 190, Sec. 2, Heping W. Rd.
+## 1328 Sec. 3, Huanhe S. Rd. & Ln. 424, Wanda Rd. Intersection
+## 1329 No. 45, ChangTai St. (Opposite)
+## 1330 ShuiYuan Rd. & QingNian Rd. Intersection (North)
+## 1331 No. 162, QingNian Rd.
+## 1332 No. 207-7, Shuiyuan Rd.
+## 1333 Sec. 2, HuanHe S. Rd. & XiZang Rd. Intersection
+## 1334 No. 404, BangKa Blvd.
+## 1335 No. 142, DeChang St.
+## 1336 Aly. 2, Ln. 60, Sec. 3, Tingzhou Rd. Dorms A(North)
+## 1337 NTU Prince House Chang Hsing Dorms C(South)
+## 1338 No.16-1, Siyuan St.
+## 1339 NTU Archives(Northeast)
+## 1340 Aly. 2, Ln. 60, Sec. 3, Tingzhou Rd. Dorms B(North)
+## 1341 NTU 8th Men's Dorm(East)
+## 1342 NTU The Apex Building(Southeast)
+## 1343 NTU Agricultural Exhibition Hall(North)
+## 1344 NTU Building 2, College of Management(North)
+## 1345 NTU Dept. of Civil Engineering(South)
+## 1346 NTU Freshman Women's Dorm(North)
+## 1347 NTU 9th Women's Dorm(Southwest)
+## 1348 NTU Xiao Fu Commissary(East)
+## 1349 Ln. 156, Sec. 3, Keelung Rd. Intersection(North)
+## 1350 NTU College of Engineering Building(Southeast)
+## 1351 NTU Astronomy - Mathematics Building(Southwest)
+## 1352 NTU Dept. of Psychology (South Hall)
+## 1353 Liberal Arts Research Building(West)
+## 1354 NTU Department of Biochemical Science and Technology(West)
+## 1355 NTU Department of Bioenvironmental Systems Engineering(West)
+## 1356 NTU Sports Field(East)
+## 1357 NTU Common Subjects Classroom Building(Northeast)
+## 1358 NTU Common Subjects Classroom Building(Southeast)
+## 1359 NTU Lu Ming Square(Sidewalk)
+## 1360 NTU Gongguan Car Park (Northwest)
+## 1361 NTU Administration Building(West)
+## 1362 NTU Ming - Da Hall(West)
+## 1363 NTU Heritage Hall of Physics
+## 1364 NTU Dept. of Physics Library
+## 1365 NTU College of social Sciences Building(West)
+## 1366 NTU Dept. of Sociology / Dept. of Social Work(South)
+## 1367 NTU Shih - Liang Hall(Southeast)
+## 1368 NTU Green Cabin
+## 1369 NTU Computer and Information Networking Center(South)
+## 1370 NTU Institute of Atomic and Molecular Sciences(Northeast)
+## 1371 Museum of Zoology(West)
+## 1372 NTU 1st Student Activity Center(Southeast)
+## 1373 NTU Barry Lam Hall(West)
+## 1374 NTU Liberal Education Classroom Building(West)
+## 1375 NTU Forestry Building(North)
+## 1376 NTU Building No.1(North)
+## 1377 NTU Omnium Gatherum Building
+## 1378 NTU The Odeum Square(Southeast)
+## 1379 NTU Department of Horticulture(North)
+## 1380 NTU Freshman Classroom Building(South)
+## 1381 NTU Graduate Institute of Journalism(South)
+## 1382 NTU E. E. Building No. 2(Southeast)
+## 1383 NTU Dept. of Library and Information Sciences(North)
+## 1384 NTU Main Library(Southwest)
+## 1385 NTU Tsai Lecture Hall(South)
+## 1386 NTU Dept. of Veterinary Medicine(South)
+## 1387 NTU Sports Center(East)
+## 1388 NTU Ming - Da Hall (North)
+## bemp act srcUpdateTime updateTime infoTime
+## 1 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 2 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 3 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 4 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14
+## 5 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 6 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 7 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:18
+## 8 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18
+## 9 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 10 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 11 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:53:13
+## 12 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 13 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 14 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 15 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 16 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 17 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:21
+## 18 5 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:17:15
+## 19 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 20 99 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35
+## 21 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 22 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 23 75 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 24 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:14
+## 25 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 26 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 27 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:17
+## 28 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 29 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 30 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 31 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 32 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31
+## 33 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:17
+## 34 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 35 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 36 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:14
+## 37 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:08
+## 38 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:45:18
+## 39 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 40 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14
+## 41 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 42 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:45:19
+## 43 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 44 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 45 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 46 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:14
+## 47 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 48 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 49 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 50 51 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 51 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 52 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 53 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 54 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 55 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 56 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 57 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 58 55 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 59 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 60 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14
+## 61 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 62 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 63 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 64 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 65 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 66 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 67 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 68 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:25:19
+## 69 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 70 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 71 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 72 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 73 46 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-02 02:25:18
+## 74 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 75 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 76 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 77 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 78 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 79 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 80 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 81 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:39:14
+## 82 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 83 64 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 84 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14
+## 85 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 86 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:19
+## 87 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 88 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 89 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 90 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 91 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 92 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:13
+## 93 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14
+## 94 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 95 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 96 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 97 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 98 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 99 20 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-30 08:59:14
+## 100 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 101 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 102 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 103 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 104 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19
+## 105 41 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:19:10
+## 106 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:14
+## 107 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:14
+## 108 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 109 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 110 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 111 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 112 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 113 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 114 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 115 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 116 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 117 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 118 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 119 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18
+## 120 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 121 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 122 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 123 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 124 89 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 125 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 126 34 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:19:10
+## 127 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 128 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 129 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 130 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19
+## 131 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:58:14
+## 132 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 133 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 134 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 135 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 136 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18
+## 137 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:03:18
+## 138 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 139 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:13
+## 140 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 141 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 142 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 143 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 144 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:19
+## 145 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 146 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 147 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 148 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 149 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:18
+## 150 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 151 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 152 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:18
+## 153 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:16
+## 154 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 155 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 156 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 157 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 158 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 159 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 160 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 161 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 162 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 163 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 164 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 165 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 166 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 167 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 168 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 169 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 170 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 171 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 172 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 173 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25
+## 174 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 175 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18
+## 176 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 177 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 178 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 179 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:14:18
+## 180 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:15:19
+## 181 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 182 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17
+## 183 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 184 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 185 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 186 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 187 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:14
+## 188 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:20
+## 189 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 190 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 191 43 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 192 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13
+## 193 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19
+## 194 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14
+## 195 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 196 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 197 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:18
+## 198 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 199 53 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 200 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 201 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:14
+## 202 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 203 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 204 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 205 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 206 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:24:19
+## 207 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 208 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 209 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 210 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 211 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 212 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 213 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 214 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 215 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 216 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19
+## 217 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19
+## 218 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 219 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 220 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 221 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 222 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 223 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 224 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 225 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 226 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 227 50 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14
+## 228 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 229 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 230 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 231 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 232 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:14
+## 233 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 234 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 235 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25
+## 236 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:14
+## 237 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 238 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 239 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 240 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:18:18
+## 241 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:01:57
+## 242 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 243 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:13:18
+## 244 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:14
+## 245 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 246 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 247 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 248 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18
+## 249 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 250 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 251 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 252 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17
+## 253 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:19
+## 254 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 255 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19
+## 256 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:14
+## 257 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 258 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:17
+## 259 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18
+## 260 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 261 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:17
+## 262 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 263 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 264 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 265 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 266 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 267 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17
+## 268 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:14
+## 269 35 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 270 65 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 271 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:45:18
+## 272 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:19
+## 273 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 274 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 275 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 276 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 277 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:18
+## 278 27 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:18:09
+## 279 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 280 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 281 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 282 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 283 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17
+## 284 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:57:26
+## 285 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 286 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 287 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:23:18
+## 288 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 289 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19
+## 290 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 291 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 292 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:39
+## 293 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:01:50
+## 294 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18
+## 295 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 296 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:08:18
+## 297 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:18
+## 298 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 299 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 300 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:16:19
+## 301 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:15:18
+## 302 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:04:19
+## 303 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 304 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:03:17
+## 305 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:18
+## 306 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 14:18:19
+## 307 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:19
+## 308 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:18
+## 309 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:43:17
+## 310 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 311 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 312 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 313 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 314 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 315 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 316 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19
+## 317 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 318 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18
+## 319 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:14:17
+## 320 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 321 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35
+## 322 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:28:18
+## 323 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14
+## 324 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 325 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:43:15
+## 326 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 327 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18
+## 328 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 329 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:21:19
+## 330 67 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 331 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:11:19
+## 332 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:22:18
+## 333 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 334 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 335 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:49:18
+## 336 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17
+## 337 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 338 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 339 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 340 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19
+## 341 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 342 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 343 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 344 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 345 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 346 58 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 347 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:19:18
+## 348 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:43:19
+## 349 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 350 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 351 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 352 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:14
+## 353 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 354 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 355 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 356 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:52:18
+## 357 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:37:18
+## 358 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 359 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 360 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18
+## 361 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:18
+## 362 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:19
+## 363 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 364 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:42:18
+## 365 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 366 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14
+## 367 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:13
+## 368 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 369 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:14
+## 370 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 371 61 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 372 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 373 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:30
+## 374 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14
+## 375 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 376 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 377 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 378 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 379 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 380 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 381 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 382 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 383 56 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:14
+## 384 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18
+## 385 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 386 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 387 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:24
+## 388 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 389 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 390 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 391 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 392 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 393 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 394 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:08:21
+## 395 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:17
+## 396 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 397 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:51:17
+## 398 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:50:26
+## 399 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:13
+## 400 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 401 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 402 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 403 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:14
+## 404 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 405 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:14
+## 406 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:03:18
+## 407 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 408 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:09:18
+## 409 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:05:19
+## 410 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:38:18
+## 411 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 412 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:03:20
+## 413 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 414 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 415 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:01:14
+## 416 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19
+## 417 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 418 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:18
+## 419 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35
+## 420 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:18
+## 421 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:06:19
+## 422 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 13:14:19
+## 423 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 424 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:02:18
+## 425 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 426 39 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:19:10
+## 427 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:48:18
+## 428 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:02:18
+## 429 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 430 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 431 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 432 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 433 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 434 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:14
+## 435 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:35:18
+## 436 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:05:21
+## 437 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 438 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:11:19
+## 439 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:20
+## 440 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18
+## 441 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 442 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:20
+## 443 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17
+## 444 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 445 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 446 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:58:14
+## 447 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 448 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 449 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 450 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:31:08
+## 451 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 452 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 453 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 454 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:45:19
+## 455 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18
+## 456 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:16:18
+## 457 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:43:19
+## 458 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 459 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 460 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 461 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 462 55 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:14
+## 463 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 464 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:14
+## 465 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 466 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 467 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 468 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 469 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 470 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 471 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:13
+## 472 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 473 35 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35
+## 474 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 475 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 476 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:44:18
+## 477 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 478 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 479 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 480 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 481 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:18
+## 482 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 483 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 484 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 485 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 486 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:43
+## 487 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 488 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 489 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 490 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 491 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 492 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 493 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 494 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 495 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 496 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 497 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 498 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13
+## 499 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 500 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 501 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 502 41 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 503 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 504 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 505 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:45:18
+## 506 35 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 507 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 508 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 509 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 510 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 511 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 512 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 513 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 514 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 515 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:17
+## 516 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 517 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:18
+## 518 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 519 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 520 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:06:14
+## 521 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 522 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:14
+## 523 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:42:13
+## 524 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18
+## 525 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:14
+## 526 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 527 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:13:18
+## 528 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 529 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 530 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 531 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:18
+## 532 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 533 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 534 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 535 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 536 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 537 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 538 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 539 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 540 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 541 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 542 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 543 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 544 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 545 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 546 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18
+## 547 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19
+## 548 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 549 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 550 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 551 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 552 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 553 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 554 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 555 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:24:19
+## 556 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14
+## 557 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 558 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 559 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25
+## 560 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 561 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 562 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 563 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 564 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 565 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 566 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 567 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:14:19
+## 568 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 569 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 570 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 571 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 572 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:52:18
+## 573 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 574 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:03:20
+## 575 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:11:18
+## 576 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 577 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 578 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 579 48 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 580 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19
+## 581 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 582 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 583 43 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 584 41 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 585 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 586 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 587 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 588 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 589 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:36
+## 590 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 591 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 592 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 593 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14
+## 594 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 595 62 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 596 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 597 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:18
+## 598 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 599 75 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14
+## 600 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 601 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19
+## 602 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 603 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 604 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 605 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 606 54 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 607 35 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 608 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 609 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 610 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 611 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:14
+## 612 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 613 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 614 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:14:19
+## 615 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 616 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 617 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:58:14
+## 618 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:14
+## 619 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 620 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:14
+## 621 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:14
+## 622 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 623 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 624 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 625 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 626 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 627 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 628 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 629 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 630 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:14
+## 631 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:18
+## 632 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 633 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:17
+## 634 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 635 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 636 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 637 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 638 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18
+## 639 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 640 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 641 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19
+## 642 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:21
+## 643 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 644 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 645 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 646 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 647 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 648 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14
+## 649 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18
+## 650 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 651 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:29:14
+## 652 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25
+## 653 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 654 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 655 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 656 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:15:19
+## 657 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 658 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 659 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18
+## 660 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 661 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:19
+## 662 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 663 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 664 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 665 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 666 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 667 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 668 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 669 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 670 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14
+## 671 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 672 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:15:14
+## 673 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 674 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:28:17
+## 675 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:13
+## 676 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 677 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 678 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:17
+## 679 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 680 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 681 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:18
+## 682 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 683 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 684 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17
+## 685 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 686 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:35:19
+## 687 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 688 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:18
+## 689 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 690 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 691 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 692 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 693 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:20
+## 694 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17
+## 695 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 696 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 697 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 698 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19
+## 699 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:19
+## 700 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 701 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 702 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 703 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 704 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 705 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 706 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 707 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 708 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:46:18
+## 709 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:14
+## 710 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 711 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19
+## 712 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:18
+## 713 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 714 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:32:18
+## 715 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 716 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:14
+## 717 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20
+## 718 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 719 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 720 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 721 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:16:18
+## 722 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 723 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:18:18
+## 724 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 725 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:31:08
+## 726 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 727 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 728 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 729 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19
+## 730 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:18
+## 731 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:33:18
+## 732 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 733 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 734 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 735 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 736 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 737 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 738 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:18
+## 739 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31
+## 740 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:14
+## 741 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35
+## 742 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 743 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17
+## 744 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:18
+## 745 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 746 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 747 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 748 48 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 749 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:12:17
+## 750 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 751 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 752 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 753 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 754 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31
+## 755 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:38:18
+## 756 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:18
+## 757 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 758 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 759 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:49:18
+## 760 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:21:18
+## 761 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 762 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:26:17
+## 763 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:18
+## 764 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19
+## 765 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 766 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 767 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:29
+## 768 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 769 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 770 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 771 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 772 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 773 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 774 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 775 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 776 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17
+## 777 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:18
+## 778 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 779 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18
+## 780 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 781 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 782 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 783 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:29:17
+## 784 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 785 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 786 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 787 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:41:18
+## 788 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 789 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18
+## 790 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:56:19
+## 791 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31
+## 792 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 793 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:20
+## 794 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 795 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:03:18
+## 796 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:19
+## 797 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25
+## 798 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 799 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 800 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20
+## 801 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 802 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18
+## 803 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 804 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:04:21
+## 805 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 806 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:05:21
+## 807 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:54:18
+## 808 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:25:19
+## 809 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13
+## 810 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:39:18
+## 811 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 812 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:50:25
+## 813 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 814 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:57:02
+## 815 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:19
+## 816 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 817 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:26:17
+## 818 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:17:30
+## 819 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 820 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:44:18
+## 821 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:14
+## 822 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:17
+## 823 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:08:18
+## 824 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:01:49
+## 825 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:09:18
+## 826 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 827 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:25:19
+## 828 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:14
+## 829 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 13:46:18
+## 830 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 831 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:05:20
+## 832 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17
+## 833 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 834 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 835 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 836 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:34:18
+## 837 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:17:32
+## 838 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:08:18
+## 839 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:07:18
+## 840 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 841 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 842 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25
+## 843 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:18
+## 844 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19
+## 845 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:53:18
+## 846 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 847 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:35:19
+## 848 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 849 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 850 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 851 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 852 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:41:18
+## 853 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 854 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:50:25
+## 855 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:21:19
+## 856 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:19:18
+## 857 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:50:29
+## 858 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:46:17
+## 859 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17
+## 860 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:18
+## 861 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 862 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 863 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 864 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:10:25
+## 865 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 866 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19
+## 867 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 868 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:04:19
+## 869 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:32:18
+## 870 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18
+## 871 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 872 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 13:29:18
+## 873 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:49:18
+## 874 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:29:18
+## 875 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:17
+## 876 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:19
+## 877 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 878 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18
+## 879 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:12:18
+## 880 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:14:18
+## 881 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:56:19
+## 882 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:13
+## 883 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-30 14:06:19
+## 884 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 885 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:12:20
+## 886 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20
+## 887 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:43:18
+## 888 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:17
+## 889 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 890 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 891 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31
+## 892 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 893 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:24:18
+## 894 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:29
+## 895 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:57:02
+## 896 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:18
+## 897 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:37:18
+## 898 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:03:19
+## 899 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:18:18
+## 900 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 901 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:46:17
+## 902 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 903 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:35:19
+## 904 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19
+## 905 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:02:18
+## 906 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 907 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:44:18
+## 908 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:19
+## 909 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 910 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:17
+## 911 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 912 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:27:18
+## 913 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 914 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:39
+## 915 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 916 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:04:21
+## 917 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 918 50 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 919 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19
+## 920 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 921 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 922 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 923 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 924 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 925 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 926 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:42:18
+## 927 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:25:19
+## 928 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 929 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 930 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:32:17
+## 931 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 932 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:53:18
+## 933 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20
+## 934 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 935 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:18
+## 936 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 937 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31
+## 938 45 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 939 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 940 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:58:17
+## 941 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:14:14
+## 942 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:10:25
+## 943 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 944 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:37:18
+## 945 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 946 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 947 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:15:15
+## 948 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 949 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 950 24 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:15:15
+## 951 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:50:25
+## 952 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19
+## 953 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18
+## 954 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 955 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 956 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:03:18
+## 957 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:31:18
+## 958 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 959 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 960 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:18
+## 961 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:17
+## 962 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:18:19
+## 963 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 964 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:42:18
+## 965 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:14
+## 966 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:45:19
+## 967 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:54:17
+## 968 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 969 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 970 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 971 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:18
+## 972 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 973 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:40:26
+## 974 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:28
+## 975 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:18
+## 976 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:57:02
+## 977 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:15:15
+## 978 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 979 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 980 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 981 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18
+## 982 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:14
+## 983 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 984 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 985 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 986 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 987 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 988 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 989 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 990 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 991 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 992 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:35:18
+## 993 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 994 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 995 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 996 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 997 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 998 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18
+## 999 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 1000 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1001 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 1002 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 1003 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14
+## 1004 44 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:19:10
+## 1005 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1006 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1007 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 1008 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18
+## 1009 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 1010 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1011 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1012 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18
+## 1013 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1014 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1015 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 1016 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 1017 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1018 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1019 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1020 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1021 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1022 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 1023 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 1024 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 1025 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1026 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1027 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1028 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1029 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:24:17
+## 1030 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14
+## 1031 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 1032 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1033 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:36
+## 1034 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1035 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1036 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1037 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 1038 46 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1039 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:14
+## 1040 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:14
+## 1041 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18
+## 1042 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1043 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1044 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:14
+## 1045 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 1046 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1047 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 1048 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 1049 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:20
+## 1050 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18
+## 1051 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 1052 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14
+## 1053 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:14
+## 1054 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1055 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1056 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 1057 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1058 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:18
+## 1059 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:18
+## 1060 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 1061 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 1062 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 1063 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1064 57 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1065 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 1066 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 1067 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 1068 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1069 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1070 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 1071 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 1072 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:08
+## 1073 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:07:17
+## 1074 70 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1075 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1076 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:14
+## 1077 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1078 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1079 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19
+## 1080 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1081 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:49:18
+## 1082 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1083 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1084 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1085 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17
+## 1086 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1087 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 1088 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 1089 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17
+## 1090 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18
+## 1091 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1092 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:02:19
+## 1093 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1094 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1095 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1096 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1097 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1098 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17
+## 1099 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1100 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 1101 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:50:25
+## 1102 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:20
+## 1103 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 1104 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 1105 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:57:02
+## 1106 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 1107 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:16
+## 1108 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 1109 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 1110 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 1111 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 1112 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35
+## 1113 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:27:18
+## 1114 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:24:18
+## 1115 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:17:32
+## 1116 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 1117 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1118 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1119 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1120 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1121 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1122 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:19
+## 1123 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:40:26
+## 1124 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 1125 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21
+## 1126 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1127 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 1128 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 1129 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1130 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 1131 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1132 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1133 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:11:19
+## 1134 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 1135 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 1136 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1137 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 1138 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:43
+## 1139 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:51:18
+## 1140 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 1141 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1142 20 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-15 13:02:36
+## 1143 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:16
+## 1144 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19
+## 1145 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:03:14
+## 1146 13 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-18 00:17:22
+## 1147 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 1148 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1149 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1150 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:17
+## 1151 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19
+## 1152 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 1153 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1154 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 1155 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1156 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:07:17
+## 1157 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 1158 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1159 57 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1160 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 1161 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 1162 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:21
+## 1163 48 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 1164 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 1165 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19
+## 1166 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18
+## 1167 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 1168 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1169 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1170 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 1171 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:13
+## 1172 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 1173 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1174 41 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 1175 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1176 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 1177 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1178 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1179 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:32:17
+## 1180 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09
+## 1181 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1182 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1183 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17
+## 1184 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1185 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1186 69 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1187 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 1188 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1189 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1190 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 1191 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1192 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14
+## 1193 57 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1194 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1195 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1196 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18
+## 1197 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18
+## 1198 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:14
+## 1199 51 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1200 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1201 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 1202 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1203 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1204 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:13
+## 1205 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1206 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:25:14
+## 1207 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17
+## 1208 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 1209 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 1210 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1211 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1212 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1213 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:14
+## 1214 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 1215 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1216 43 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 1217 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1218 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1219 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1220 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 1221 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1222 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1223 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 1224 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1225 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1226 50 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14
+## 1227 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13
+## 1228 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1229 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14
+## 1230 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 1231 53 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1232 13 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-26 12:18:17
+## 1233 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1234 90 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14
+## 1235 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 1236 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1237 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1238 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 1239 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14
+## 1240 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1241 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 1242 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 1243 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 1244 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1245 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25
+## 1246 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1247 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1248 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1249 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17
+## 1250 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 1251 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1252 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1253 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:14
+## 1254 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18
+## 1255 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:17
+## 1256 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19
+## 1257 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:42:17
+## 1258 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14
+## 1259 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1260 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18
+## 1261 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:14
+## 1262 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1263 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 1264 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:15:19
+## 1265 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 1266 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17
+## 1267 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 1268 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1269 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18
+## 1270 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18
+## 1271 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:18
+## 1272 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:35:19
+## 1273 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:17:32
+## 1274 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 1275 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18
+## 1276 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17
+## 1277 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41
+## 1278 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1279 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1280 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:25:19
+## 1281 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 1282 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1283 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31
+## 1284 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 1285 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1286 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1287 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 1288 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26
+## 1289 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1290 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:37:18
+## 1291 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:14
+## 1292 86 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1293 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17
+## 1294 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 1295 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 1296 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17
+## 1297 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 1298 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 1299 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1300 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:04
+## 1301 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1302 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18
+## 1303 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18
+## 1304 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19
+## 1305 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1306 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18
+## 1307 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:24:19
+## 1308 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:19:18
+## 1309 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19
+## 1310 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:08:14
+## 1311 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:13
+## 1312 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25
+## 1313 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20
+## 1314 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19
+## 1315 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17
+## 1316 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 1317 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 1318 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18
+## 1319 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18
+## 1320 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17
+## 1321 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18
+## 1322 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19
+## 1323 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:19
+## 1324 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:37:14
+## 1325 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17
+## 1326 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1327 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17
+## 1328 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20
+## 1329 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:38:17
+## 1330 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17
+## 1331 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18
+## 1332 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:28
+## 1333 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18
+## 1334 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17
+## 1335 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1336 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1337 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1338 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14
+## 1339 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:21:18
+## 1340 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18
+## 1341 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14
+## 1342 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1343 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:18
+## 1344 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1345 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:14
+## 1346 53 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1347 56 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1348 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13
+## 1349 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1350 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1351 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18
+## 1352 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:18
+## 1353 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18
+## 1354 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19
+## 1355 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14
+## 1356 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17
+## 1357 20 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:17:15
+## 1358 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:17:26
+## 1359 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1360 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18
+## 1361 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1362 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17
+## 1363 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:14
+## 1364 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1365 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1366 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1367 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:05:19
+## 1368 47 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19
+## 1369 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:18:18
+## 1370 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:01:19
+## 1371 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18
+## 1372 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19
+## 1373 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18
+## 1374 45 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:07:17
+## 1375 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1376 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17
+## 1377 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:46:17
+## 1378 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18
+## 1379 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:59:18
+## 1380 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:27:18
+## 1381 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:36
+## 1382 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:18
+## 1383 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18
+## 1384 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:29
+## 1385 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:13
+## 1386 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17
+## 1387 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:19
+## 1388 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:52:18
+## infoDate
+## 1 2024-03-31
+## 2 2024-03-31
+## 3 2024-03-31
+## 4 2024-03-31
+## 5 2024-03-31
+## 6 2024-03-31
+## 7 2024-03-31
+## 8 2024-03-31
+## 9 2024-03-31
+## 10 2024-03-31
+## 11 2024-03-31
+## 12 2024-03-31
+## 13 2024-03-31
+## 14 2024-03-31
+## 15 2024-03-31
+## 16 2024-03-31
+## 17 2024-03-31
+## 18 2024-01-14
+## 19 2024-03-31
+## 20 2024-03-31
+## 21 2024-03-31
+## 22 2024-03-31
+## 23 2024-03-31
+## 24 2024-03-31
+## 25 2024-03-31
+## 26 2024-03-31
+## 27 2024-03-31
+## 28 2024-03-31
+## 29 2024-03-31
+## 30 2024-03-31
+## 31 2024-03-31
+## 32 2024-03-31
+## 33 2024-03-31
+## 34 2024-03-31
+## 35 2024-03-31
+## 36 2024-03-31
+## 37 2024-03-31
+## 38 2024-03-31
+## 39 2024-03-31
+## 40 2024-03-31
+## 41 2024-03-31
+## 42 2024-03-31
+## 43 2024-03-31
+## 44 2024-03-31
+## 45 2024-03-31
+## 46 2024-03-31
+## 47 2024-03-31
+## 48 2024-03-31
+## 49 2024-03-31
+## 50 2024-03-31
+## 51 2024-03-31
+## 52 2024-03-31
+## 53 2024-03-31
+## 54 2024-03-31
+## 55 2024-03-31
+## 56 2024-03-31
+## 57 2024-03-31
+## 58 2024-03-31
+## 59 2024-03-31
+## 60 2024-03-31
+## 61 2024-03-31
+## 62 2024-03-31
+## 63 2024-03-31
+## 64 2024-03-31
+## 65 2024-03-31
+## 66 2024-03-31
+## 67 2024-03-31
+## 68 2024-03-31
+## 69 2024-03-31
+## 70 2024-03-31
+## 71 2024-03-31
+## 72 2024-03-31
+## 73 2024-03-02
+## 74 2024-03-31
+## 75 2024-03-31
+## 76 2024-03-31
+## 77 2024-03-31
+## 78 2024-03-31
+## 79 2024-03-31
+## 80 2024-03-31
+## 81 2024-03-31
+## 82 2024-03-31
+## 83 2024-03-31
+## 84 2024-03-31
+## 85 2024-03-31
+## 86 2024-03-31
+## 87 2024-03-31
+## 88 2024-03-31
+## 89 2024-03-31
+## 90 2024-03-31
+## 91 2024-03-31
+## 92 2024-03-31
+## 93 2024-03-31
+## 94 2024-03-31
+## 95 2024-03-31
+## 96 2024-03-31
+## 97 2024-03-31
+## 98 2024-03-31
+## 99 2024-03-30
+## 100 2024-03-31
+## 101 2024-03-31
+## 102 2024-03-31
+## 103 2024-03-31
+## 104 2024-03-31
+## 105 2024-01-14
+## 106 2024-03-31
+## 107 2024-03-31
+## 108 2024-03-31
+## 109 2024-03-31
+## 110 2024-03-31
+## 111 2024-03-31
+## 112 2024-03-31
+## 113 2024-03-31
+## 114 2024-03-31
+## 115 2024-03-31
+## 116 2024-03-31
+## 117 2024-03-31
+## 118 2024-03-31
+## 119 2024-03-31
+## 120 2024-03-31
+## 121 2024-03-31
+## 122 2024-03-31
+## 123 2024-03-31
+## 124 2024-03-31
+## 125 2024-03-31
+## 126 2024-01-14
+## 127 2024-03-31
+## 128 2024-03-31
+## 129 2024-03-31
+## 130 2024-03-31
+## 131 2024-03-31
+## 132 2024-03-31
+## 133 2024-03-31
+## 134 2024-03-31
+## 135 2024-03-31
+## 136 2024-03-31
+## 137 2024-03-31
+## 138 2024-03-31
+## 139 2024-03-31
+## 140 2024-03-31
+## 141 2024-03-31
+## 142 2024-03-31
+## 143 2024-03-31
+## 144 2024-03-31
+## 145 2024-03-31
+## 146 2024-03-31
+## 147 2024-03-31
+## 148 2024-03-31
+## 149 2024-03-31
+## 150 2024-03-31
+## 151 2024-03-31
+## 152 2024-03-31
+## 153 2024-03-31
+## 154 2024-03-31
+## 155 2024-03-31
+## 156 2024-03-31
+## 157 2024-03-31
+## 158 2024-03-31
+## 159 2024-03-31
+## 160 2024-03-31
+## 161 2024-03-31
+## 162 2024-03-31
+## 163 2024-03-31
+## 164 2024-03-31
+## 165 2024-03-31
+## 166 2024-03-31
+## 167 2024-03-31
+## 168 2024-03-31
+## 169 2024-03-31
+## 170 2024-03-31
+## 171 2024-03-31
+## 172 2024-03-31
+## 173 2024-03-31
+## 174 2024-03-31
+## 175 2024-03-31
+## 176 2024-03-31
+## 177 2024-03-31
+## 178 2024-03-31
+## 179 2024-03-31
+## 180 2024-03-31
+## 181 2024-03-31
+## 182 2024-03-31
+## 183 2024-03-31
+## 184 2024-03-31
+## 185 2024-03-31
+## 186 2024-03-31
+## 187 2024-03-31
+## 188 2024-03-31
+## 189 2024-03-31
+## 190 2024-03-31
+## 191 2024-03-31
+## 192 2024-03-31
+## 193 2024-03-31
+## 194 2024-03-31
+## 195 2024-03-31
+## 196 2024-03-31
+## 197 2024-03-31
+## 198 2024-03-31
+## 199 2024-03-31
+## 200 2024-03-31
+## 201 2024-03-31
+## 202 2024-03-31
+## 203 2024-03-31
+## 204 2024-03-31
+## 205 2024-03-31
+## 206 2024-03-31
+## 207 2024-03-31
+## 208 2024-03-31
+## 209 2024-03-31
+## 210 2024-03-31
+## 211 2024-03-31
+## 212 2024-03-31
+## 213 2024-03-31
+## 214 2024-03-31
+## 215 2024-03-31
+## 216 2024-03-31
+## 217 2024-03-31
+## 218 2024-03-31
+## 219 2024-03-31
+## 220 2024-03-31
+## 221 2024-03-31
+## 222 2024-03-31
+## 223 2024-03-31
+## 224 2024-03-31
+## 225 2024-03-31
+## 226 2024-03-31
+## 227 2024-03-31
+## 228 2024-03-31
+## 229 2024-03-31
+## 230 2024-03-31
+## 231 2024-03-31
+## 232 2024-03-31
+## 233 2024-03-31
+## 234 2024-03-31
+## 235 2024-03-31
+## 236 2024-03-31
+## 237 2024-03-31
+## 238 2024-03-31
+## 239 2024-03-31
+## 240 2024-03-31
+## 241 2024-03-31
+## 242 2024-03-31
+## 243 2024-03-31
+## 244 2024-03-31
+## 245 2024-03-31
+## 246 2024-03-31
+## 247 2024-03-31
+## 248 2024-03-31
+## 249 2024-03-31
+## 250 2024-03-31
+## 251 2024-03-31
+## 252 2024-03-31
+## 253 2024-03-31
+## 254 2024-03-31
+## 255 2024-03-31
+## 256 2024-03-31
+## 257 2024-03-31
+## 258 2024-03-31
+## 259 2024-03-31
+## 260 2024-03-31
+## 261 2024-03-31
+## 262 2024-03-31
+## 263 2024-03-31
+## 264 2024-03-31
+## 265 2024-03-31
+## 266 2024-03-31
+## 267 2024-03-31
+## 268 2024-03-31
+## 269 2024-03-31
+## 270 2024-03-31
+## 271 2024-03-31
+## 272 2024-03-31
+## 273 2024-03-31
+## 274 2024-03-31
+## 275 2024-03-31
+## 276 2024-03-31
+## 277 2024-03-31
+## 278 2024-01-14
+## 279 2024-03-31
+## 280 2024-03-31
+## 281 2024-03-31
+## 282 2024-03-31
+## 283 2024-03-31
+## 284 2024-03-31
+## 285 2024-03-31
+## 286 2024-03-31
+## 287 2024-03-31
+## 288 2024-03-31
+## 289 2024-03-31
+## 290 2024-03-31
+## 291 2024-03-31
+## 292 2024-03-31
+## 293 2024-03-31
+## 294 2024-03-31
+## 295 2024-03-31
+## 296 2024-03-31
+## 297 2024-03-31
+## 298 2024-03-31
+## 299 2024-03-31
+## 300 2024-03-31
+## 301 2024-03-31
+## 302 2024-03-31
+## 303 2024-03-31
+## 304 2024-03-31
+## 305 2024-03-31
+## 306 2024-03-31
+## 307 2024-03-31
+## 308 2024-03-31
+## 309 2024-03-31
+## 310 2024-03-31
+## 311 2024-03-31
+## 312 2024-03-31
+## 313 2024-03-31
+## 314 2024-03-31
+## 315 2024-03-31
+## 316 2024-03-31
+## 317 2024-03-31
+## 318 2024-03-31
+## 319 2024-03-31
+## 320 2024-03-31
+## 321 2024-03-31
+## 322 2024-03-31
+## 323 2024-03-31
+## 324 2024-03-31
+## 325 2024-03-31
+## 326 2024-03-31
+## 327 2024-03-31
+## 328 2024-03-31
+## 329 2024-03-31
+## 330 2024-03-31
+## 331 2024-03-31
+## 332 2024-03-31
+## 333 2024-03-31
+## 334 2024-03-31
+## 335 2024-03-31
+## 336 2024-03-31
+## 337 2024-03-31
+## 338 2024-03-31
+## 339 2024-03-31
+## 340 2024-03-31
+## 341 2024-03-31
+## 342 2024-03-31
+## 343 2024-03-31
+## 344 2024-03-31
+## 345 2024-03-31
+## 346 2024-03-31
+## 347 2024-03-31
+## 348 2024-03-31
+## 349 2024-03-31
+## 350 2024-03-31
+## 351 2024-03-31
+## 352 2024-03-31
+## 353 2024-03-31
+## 354 2024-03-31
+## 355 2024-03-31
+## 356 2024-03-31
+## 357 2024-03-31
+## 358 2024-03-31
+## 359 2024-03-31
+## 360 2024-03-31
+## 361 2024-03-31
+## 362 2024-03-31
+## 363 2024-03-31
+## 364 2024-03-31
+## 365 2024-03-31
+## 366 2024-03-31
+## 367 2024-03-31
+## 368 2024-03-31
+## 369 2024-03-31
+## 370 2024-03-31
+## 371 2024-03-31
+## 372 2024-03-31
+## 373 2024-03-31
+## 374 2024-03-31
+## 375 2024-03-31
+## 376 2024-03-31
+## 377 2024-03-31
+## 378 2024-03-31
+## 379 2024-03-31
+## 380 2024-03-31
+## 381 2024-03-31
+## 382 2024-03-31
+## 383 2024-03-31
+## 384 2024-03-31
+## 385 2024-03-31
+## 386 2024-03-31
+## 387 2024-03-31
+## 388 2024-03-31
+## 389 2024-03-31
+## 390 2024-03-31
+## 391 2024-03-31
+## 392 2024-03-31
+## 393 2024-03-31
+## 394 2024-03-31
+## 395 2024-03-31
+## 396 2024-03-31
+## 397 2024-03-31
+## 398 2024-03-31
+## 399 2024-03-31
+## 400 2024-03-31
+## 401 2024-03-31
+## 402 2024-03-31
+## 403 2024-03-31
+## 404 2024-03-31
+## 405 2024-03-31
+## 406 2024-03-31
+## 407 2024-03-31
+## 408 2024-03-31
+## 409 2024-03-31
+## 410 2024-03-31
+## 411 2024-03-31
+## 412 2024-03-31
+## 413 2024-03-31
+## 414 2024-03-31
+## 415 2024-03-31
+## 416 2024-03-31
+## 417 2024-03-31
+## 418 2024-03-31
+## 419 2024-03-31
+## 420 2024-03-31
+## 421 2024-03-31
+## 422 2024-03-31
+## 423 2024-03-31
+## 424 2024-03-31
+## 425 2024-03-31
+## 426 2024-01-14
+## 427 2024-03-31
+## 428 2024-03-31
+## 429 2024-03-31
+## 430 2024-03-31
+## 431 2024-03-31
+## 432 2024-03-31
+## 433 2024-03-31
+## 434 2024-03-31
+## 435 2024-03-31
+## 436 2024-03-31
+## 437 2024-03-31
+## 438 2024-03-31
+## 439 2024-03-31
+## 440 2024-03-31
+## 441 2024-03-31
+## 442 2024-03-31
+## 443 2024-03-31
+## 444 2024-03-31
+## 445 2024-03-31
+## 446 2024-03-31
+## 447 2024-03-31
+## 448 2024-03-31
+## 449 2024-03-31
+## 450 2024-03-31
+## 451 2024-03-31
+## 452 2024-03-31
+## 453 2024-03-31
+## 454 2024-03-31
+## 455 2024-03-31
+## 456 2024-03-31
+## 457 2024-03-31
+## 458 2024-03-31
+## 459 2024-03-31
+## 460 2024-03-31
+## 461 2024-03-31
+## 462 2024-03-31
+## 463 2024-03-31
+## 464 2024-03-31
+## 465 2024-03-31
+## 466 2024-03-31
+## 467 2024-03-31
+## 468 2024-03-31
+## 469 2024-03-31
+## 470 2024-03-31
+## 471 2024-03-31
+## 472 2024-03-31
+## 473 2024-03-31
+## 474 2024-03-31
+## 475 2024-03-31
+## 476 2024-03-31
+## 477 2024-03-31
+## 478 2024-03-31
+## 479 2024-03-31
+## 480 2024-03-31
+## 481 2024-03-31
+## 482 2024-03-31
+## 483 2024-03-31
+## 484 2024-03-31
+## 485 2024-03-31
+## 486 2024-03-31
+## 487 2024-03-31
+## 488 2024-03-31
+## 489 2024-03-31
+## 490 2024-03-31
+## 491 2024-03-31
+## 492 2024-03-31
+## 493 2024-03-31
+## 494 2024-03-31
+## 495 2024-03-31
+## 496 2024-03-31
+## 497 2024-03-31
+## 498 2024-03-31
+## 499 2024-03-31
+## 500 2024-03-31
+## 501 2024-03-31
+## 502 2024-03-31
+## 503 2024-03-31
+## 504 2024-03-31
+## 505 2024-03-31
+## 506 2024-03-31
+## 507 2024-03-31
+## 508 2024-03-31
+## 509 2024-03-31
+## 510 2024-03-31
+## 511 2024-03-31
+## 512 2024-03-31
+## 513 2024-03-31
+## 514 2024-03-31
+## 515 2024-03-31
+## 516 2024-03-31
+## 517 2024-03-31
+## 518 2024-03-31
+## 519 2024-03-31
+## 520 2024-03-31
+## 521 2024-03-31
+## 522 2024-03-31
+## 523 2024-03-31
+## 524 2024-03-31
+## 525 2024-03-31
+## 526 2024-03-31
+## 527 2024-03-31
+## 528 2024-03-31
+## 529 2024-03-31
+## 530 2024-03-31
+## 531 2024-03-31
+## 532 2024-03-31
+## 533 2024-03-31
+## 534 2024-03-31
+## 535 2024-03-31
+## 536 2024-03-31
+## 537 2024-03-31
+## 538 2024-03-31
+## 539 2024-03-31
+## 540 2024-03-31
+## 541 2024-03-31
+## 542 2024-03-31
+## 543 2024-03-31
+## 544 2024-03-31
+## 545 2024-03-31
+## 546 2024-03-31
+## 547 2024-03-31
+## 548 2024-03-31
+## 549 2024-03-31
+## 550 2024-03-31
+## 551 2024-03-31
+## 552 2024-03-31
+## 553 2024-03-31
+## 554 2024-03-31
+## 555 2024-03-31
+## 556 2024-03-31
+## 557 2024-03-31
+## 558 2024-03-31
+## 559 2024-03-31
+## 560 2024-03-31
+## 561 2024-03-31
+## 562 2024-03-31
+## 563 2024-03-31
+## 564 2024-03-31
+## 565 2024-03-31
+## 566 2024-03-31
+## 567 2024-03-31
+## 568 2024-03-31
+## 569 2024-03-31
+## 570 2024-03-31
+## 571 2024-03-31
+## 572 2024-03-31
+## 573 2024-03-31
+## 574 2024-03-31
+## 575 2024-03-31
+## 576 2024-03-31
+## 577 2024-03-31
+## 578 2024-03-31
+## 579 2024-03-31
+## 580 2024-03-31
+## 581 2024-03-31
+## 582 2024-03-31
+## 583 2024-03-31
+## 584 2024-03-31
+## 585 2024-03-31
+## 586 2024-03-31
+## 587 2024-03-31
+## 588 2024-03-31
+## 589 2024-03-31
+## 590 2024-03-31
+## 591 2024-03-31
+## 592 2024-03-31
+## 593 2024-03-31
+## 594 2024-03-31
+## 595 2024-03-31
+## 596 2024-03-31
+## 597 2024-03-31
+## 598 2024-03-31
+## 599 2024-03-31
+## 600 2024-03-31
+## 601 2024-03-31
+## 602 2024-03-31
+## 603 2024-03-31
+## 604 2024-03-31
+## 605 2024-03-31
+## 606 2024-03-31
+## 607 2024-03-31
+## 608 2024-03-31
+## 609 2024-03-31
+## 610 2024-03-31
+## 611 2024-03-31
+## 612 2024-03-31
+## 613 2024-03-31
+## 614 2024-03-31
+## 615 2024-03-31
+## 616 2024-03-31
+## 617 2024-03-31
+## 618 2024-03-31
+## 619 2024-03-31
+## 620 2024-03-31
+## 621 2024-03-31
+## 622 2024-03-31
+## 623 2024-03-31
+## 624 2024-03-31
+## 625 2024-03-31
+## 626 2024-03-31
+## 627 2024-03-31
+## 628 2024-03-31
+## 629 2024-03-31
+## 630 2024-03-31
+## 631 2024-03-31
+## 632 2024-03-31
+## 633 2024-03-31
+## 634 2024-03-31
+## 635 2024-03-31
+## 636 2024-03-31
+## 637 2024-03-31
+## 638 2024-03-31
+## 639 2024-03-31
+## 640 2024-03-31
+## 641 2024-03-31
+## 642 2024-03-31
+## 643 2024-03-31
+## 644 2024-03-31
+## 645 2024-03-31
+## 646 2024-03-31
+## 647 2024-03-31
+## 648 2024-03-31
+## 649 2024-03-31
+## 650 2024-03-31
+## 651 2024-03-31
+## 652 2024-03-31
+## 653 2024-03-31
+## 654 2024-03-31
+## 655 2024-03-31
+## 656 2024-03-31
+## 657 2024-03-31
+## 658 2024-03-31
+## 659 2024-03-31
+## 660 2024-03-31
+## 661 2024-03-31
+## 662 2024-03-31
+## 663 2024-03-31
+## 664 2024-03-31
+## 665 2024-03-31
+## 666 2024-03-31
+## 667 2024-03-31
+## 668 2024-03-31
+## 669 2024-03-31
+## 670 2024-03-31
+## 671 2024-03-31
+## 672 2024-03-31
+## 673 2024-03-31
+## 674 2024-03-31
+## 675 2024-03-31
+## 676 2024-03-31
+## 677 2024-03-31
+## 678 2024-03-31
+## 679 2024-03-31
+## 680 2024-03-31
+## 681 2024-03-31
+## 682 2024-03-31
+## 683 2024-03-31
+## 684 2024-03-31
+## 685 2024-03-31
+## 686 2024-03-31
+## 687 2024-03-31
+## 688 2024-03-31
+## 689 2024-03-31
+## 690 2024-03-31
+## 691 2024-03-31
+## 692 2024-03-31
+## 693 2024-03-31
+## 694 2024-03-31
+## 695 2024-03-31
+## 696 2024-03-31
+## 697 2024-03-31
+## 698 2024-03-31
+## 699 2024-03-31
+## 700 2024-03-31
+## 701 2024-03-31
+## 702 2024-03-31
+## 703 2024-03-31
+## 704 2024-03-31
+## 705 2024-03-31
+## 706 2024-03-31
+## 707 2024-03-31
+## 708 2024-03-31
+## 709 2024-03-31
+## 710 2024-03-31
+## 711 2024-03-31
+## 712 2024-03-31
+## 713 2024-03-31
+## 714 2024-03-31
+## 715 2024-03-31
+## 716 2024-03-31
+## 717 2024-03-31
+## 718 2024-03-31
+## 719 2024-03-31
+## 720 2024-03-31
+## 721 2024-03-31
+## 722 2024-03-31
+## 723 2024-03-31
+## 724 2024-03-31
+## 725 2024-03-31
+## 726 2024-03-31
+## 727 2024-03-31
+## 728 2024-03-31
+## 729 2024-03-31
+## 730 2024-03-31
+## 731 2024-03-31
+## 732 2024-03-31
+## 733 2024-03-31
+## 734 2024-03-31
+## 735 2024-03-31
+## 736 2024-03-31
+## 737 2024-03-31
+## 738 2024-03-31
+## 739 2024-03-31
+## 740 2024-03-31
+## 741 2024-03-31
+## 742 2024-03-31
+## 743 2024-03-31
+## 744 2024-03-31
+## 745 2024-03-31
+## 746 2024-03-31
+## 747 2024-03-31
+## 748 2024-03-31
+## 749 2024-03-31
+## 750 2024-03-31
+## 751 2024-03-31
+## 752 2024-03-31
+## 753 2024-03-31
+## 754 2024-03-31
+## 755 2024-03-31
+## 756 2024-03-31
+## 757 2024-03-31
+## 758 2024-03-31
+## 759 2024-03-31
+## 760 2024-03-31
+## 761 2024-03-31
+## 762 2024-03-31
+## 763 2024-03-31
+## 764 2024-03-31
+## 765 2024-03-31
+## 766 2024-03-31
+## 767 2024-03-31
+## 768 2024-03-31
+## 769 2024-03-31
+## 770 2024-03-31
+## 771 2024-03-31
+## 772 2024-03-31
+## 773 2024-03-31
+## 774 2024-03-31
+## 775 2024-03-31
+## 776 2024-03-31
+## 777 2024-03-31
+## 778 2024-03-31
+## 779 2024-03-31
+## 780 2024-03-31
+## 781 2024-03-31
+## 782 2024-03-31
+## 783 2024-03-31
+## 784 2024-03-31
+## 785 2024-03-31
+## 786 2024-03-31
+## 787 2024-03-31
+## 788 2024-03-31
+## 789 2024-03-31
+## 790 2024-03-31
+## 791 2024-03-31
+## 792 2024-03-31
+## 793 2024-03-31
+## 794 2024-03-31
+## 795 2024-03-31
+## 796 2024-03-31
+## 797 2024-03-31
+## 798 2024-03-31
+## 799 2024-03-31
+## 800 2024-03-31
+## 801 2024-03-31
+## 802 2024-03-31
+## 803 2024-03-31
+## 804 2024-03-31
+## 805 2024-03-31
+## 806 2024-03-31
+## 807 2024-03-31
+## 808 2024-03-31
+## 809 2024-03-31
+## 810 2024-03-31
+## 811 2024-03-31
+## 812 2024-03-31
+## 813 2024-03-31
+## 814 2024-03-31
+## 815 2024-03-31
+## 816 2024-03-31
+## 817 2024-03-31
+## 818 2024-03-31
+## 819 2024-03-31
+## 820 2024-03-31
+## 821 2024-03-31
+## 822 2024-03-31
+## 823 2024-03-31
+## 824 2024-03-31
+## 825 2024-03-31
+## 826 2024-03-31
+## 827 2024-03-31
+## 828 2024-03-31
+## 829 2024-03-31
+## 830 2024-03-31
+## 831 2024-03-31
+## 832 2024-03-31
+## 833 2024-03-31
+## 834 2024-03-31
+## 835 2024-03-31
+## 836 2024-03-31
+## 837 2024-03-31
+## 838 2024-03-31
+## 839 2024-03-31
+## 840 2024-03-31
+## 841 2024-03-31
+## 842 2024-03-31
+## 843 2024-03-31
+## 844 2024-03-31
+## 845 2024-03-31
+## 846 2024-03-31
+## 847 2024-03-31
+## 848 2024-03-31
+## 849 2024-03-31
+## 850 2024-03-31
+## 851 2024-03-31
+## 852 2024-03-31
+## 853 2024-03-31
+## 854 2024-03-31
+## 855 2024-03-31
+## 856 2024-03-31
+## 857 2024-03-31
+## 858 2024-03-31
+## 859 2024-03-31
+## 860 2024-03-31
+## 861 2024-03-31
+## 862 2024-03-31
+## 863 2024-03-31
+## 864 2024-03-31
+## 865 2024-03-31
+## 866 2024-03-31
+## 867 2024-03-31
+## 868 2024-03-31
+## 869 2024-03-31
+## 870 2024-03-31
+## 871 2024-03-31
+## 872 2024-03-31
+## 873 2024-03-31
+## 874 2024-03-31
+## 875 2024-03-31
+## 876 2024-03-31
+## 877 2024-03-31
+## 878 2024-03-31
+## 879 2024-03-31
+## 880 2024-03-31
+## 881 2024-03-31
+## 882 2024-03-31
+## 883 2024-03-30
+## 884 2024-03-31
+## 885 2024-03-31
+## 886 2024-03-31
+## 887 2024-03-31
+## 888 2024-03-31
+## 889 2024-03-31
+## 890 2024-03-31
+## 891 2024-03-31
+## 892 2024-03-31
+## 893 2024-03-31
+## 894 2024-03-31
+## 895 2024-03-31
+## 896 2024-03-31
+## 897 2024-03-31
+## 898 2024-03-31
+## 899 2024-03-31
+## 900 2024-03-31
+## 901 2024-03-31
+## 902 2024-03-31
+## 903 2024-03-31
+## 904 2024-03-31
+## 905 2024-03-31
+## 906 2024-03-31
+## 907 2024-03-31
+## 908 2024-03-31
+## 909 2024-03-31
+## 910 2024-03-31
+## 911 2024-03-31
+## 912 2024-03-31
+## 913 2024-03-31
+## 914 2024-03-31
+## 915 2024-03-31
+## 916 2024-03-31
+## 917 2024-03-31
+## 918 2024-03-31
+## 919 2024-03-31
+## 920 2024-03-31
+## 921 2024-03-31
+## 922 2024-03-31
+## 923 2024-03-31
+## 924 2024-03-31
+## 925 2024-03-31
+## 926 2024-03-31
+## 927 2024-03-31
+## 928 2024-03-31
+## 929 2024-03-31
+## 930 2024-03-31
+## 931 2024-03-31
+## 932 2024-03-31
+## 933 2024-03-31
+## 934 2024-03-31
+## 935 2024-03-31
+## 936 2024-03-31
+## 937 2024-03-31
+## 938 2024-03-31
+## 939 2024-03-31
+## 940 2024-03-31
+## 941 2024-03-31
+## 942 2024-03-31
+## 943 2024-03-31
+## 944 2024-03-31
+## 945 2024-03-31
+## 946 2024-03-31
+## 947 2024-03-31
+## 948 2024-03-31
+## 949 2024-03-31
+## 950 2024-03-31
+## 951 2024-03-31
+## 952 2024-03-31
+## 953 2024-03-31
+## 954 2024-03-31
+## 955 2024-03-31
+## 956 2024-03-31
+## 957 2024-03-31
+## 958 2024-03-31
+## 959 2024-03-31
+## 960 2024-03-31
+## 961 2024-03-31
+## 962 2024-03-31
+## 963 2024-03-31
+## 964 2024-03-31
+## 965 2024-03-31
+## 966 2024-03-31
+## 967 2024-03-31
+## 968 2024-03-31
+## 969 2024-03-31
+## 970 2024-03-31
+## 971 2024-03-31
+## 972 2024-03-31
+## 973 2024-03-31
+## 974 2024-03-31
+## 975 2024-03-31
+## 976 2024-03-31
+## 977 2024-03-31
+## 978 2024-03-31
+## 979 2024-03-31
+## 980 2024-03-31
+## 981 2024-03-31
+## 982 2024-03-31
+## 983 2024-03-31
+## 984 2024-03-31
+## 985 2024-03-31
+## 986 2024-03-31
+## 987 2024-03-31
+## 988 2024-03-31
+## 989 2024-03-31
+## 990 2024-03-31
+## 991 2024-03-31
+## 992 2024-03-31
+## 993 2024-03-31
+## 994 2024-03-31
+## 995 2024-03-31
+## 996 2024-03-31
+## 997 2024-03-31
+## 998 2024-03-31
+## 999 2024-03-31
+## 1000 2024-03-31
+## 1001 2024-03-31
+## 1002 2024-03-31
+## 1003 2024-03-31
+## 1004 2024-01-14
+## 1005 2024-03-31
+## 1006 2024-03-31
+## 1007 2024-03-31
+## 1008 2024-03-31
+## 1009 2024-03-31
+## 1010 2024-03-31
+## 1011 2024-03-31
+## 1012 2024-03-31
+## 1013 2024-03-31
+## 1014 2024-03-31
+## 1015 2024-03-31
+## 1016 2024-03-31
+## 1017 2024-03-31
+## 1018 2024-03-31
+## 1019 2024-03-31
+## 1020 2024-03-31
+## 1021 2024-03-31
+## 1022 2024-03-31
+## 1023 2024-03-31
+## 1024 2024-03-31
+## 1025 2024-03-31
+## 1026 2024-03-31
+## 1027 2024-03-31
+## 1028 2024-03-31
+## 1029 2024-03-31
+## 1030 2024-03-31
+## 1031 2024-03-31
+## 1032 2024-03-31
+## 1033 2024-03-31
+## 1034 2024-03-31
+## 1035 2024-03-31
+## 1036 2024-03-31
+## 1037 2024-03-31
+## 1038 2024-03-31
+## 1039 2024-03-31
+## 1040 2024-03-31
+## 1041 2024-03-31
+## 1042 2024-03-31
+## 1043 2024-03-31
+## 1044 2024-03-31
+## 1045 2024-03-31
+## 1046 2024-03-31
+## 1047 2024-03-31
+## 1048 2024-03-31
+## 1049 2024-03-31
+## 1050 2024-03-31
+## 1051 2024-03-31
+## 1052 2024-03-31
+## 1053 2024-03-31
+## 1054 2024-03-31
+## 1055 2024-03-31
+## 1056 2024-03-31
+## 1057 2024-03-31
+## 1058 2024-03-31
+## 1059 2024-03-31
+## 1060 2024-03-31
+## 1061 2024-03-31
+## 1062 2024-03-31
+## 1063 2024-03-31
+## 1064 2024-03-31
+## 1065 2024-03-31
+## 1066 2024-03-31
+## 1067 2024-03-31
+## 1068 2024-03-31
+## 1069 2024-03-31
+## 1070 2024-03-31
+## 1071 2024-03-31
+## 1072 2024-03-31
+## 1073 2024-03-31
+## 1074 2024-03-31
+## 1075 2024-03-31
+## 1076 2024-03-31
+## 1077 2024-03-31
+## 1078 2024-03-31
+## 1079 2024-03-31
+## 1080 2024-03-31
+## 1081 2024-03-31
+## 1082 2024-03-31
+## 1083 2024-03-31
+## 1084 2024-03-31
+## 1085 2024-03-31
+## 1086 2024-03-31
+## 1087 2024-03-31
+## 1088 2024-03-31
+## 1089 2024-03-31
+## 1090 2024-03-31
+## 1091 2024-03-31
+## 1092 2024-03-31
+## 1093 2024-03-31
+## 1094 2024-03-31
+## 1095 2024-03-31
+## 1096 2024-03-31
+## 1097 2024-03-31
+## 1098 2024-03-31
+## 1099 2024-03-31
+## 1100 2024-03-31
+## 1101 2024-03-31
+## 1102 2024-03-31
+## 1103 2024-03-31
+## 1104 2024-03-31
+## 1105 2024-03-31
+## 1106 2024-03-31
+## 1107 2024-03-31
+## 1108 2024-03-31
+## 1109 2024-03-31
+## 1110 2024-03-31
+## 1111 2024-03-31
+## 1112 2024-03-31
+## 1113 2024-03-31
+## 1114 2024-03-31
+## 1115 2024-03-31
+## 1116 2024-03-31
+## 1117 2024-03-31
+## 1118 2024-03-31
+## 1119 2024-03-31
+## 1120 2024-03-31
+## 1121 2024-03-31
+## 1122 2024-03-31
+## 1123 2024-03-31
+## 1124 2024-03-31
+## 1125 2024-03-31
+## 1126 2024-03-31
+## 1127 2024-03-31
+## 1128 2024-03-31
+## 1129 2024-03-31
+## 1130 2024-03-31
+## 1131 2024-03-31
+## 1132 2024-03-31
+## 1133 2024-03-31
+## 1134 2024-03-31
+## 1135 2024-03-31
+## 1136 2024-03-31
+## 1137 2024-03-31
+## 1138 2024-03-31
+## 1139 2024-03-31
+## 1140 2024-03-31
+## 1141 2024-03-31
+## 1142 2024-03-15
+## 1143 2024-03-31
+## 1144 2024-03-31
+## 1145 2024-03-31
+## 1146 2024-03-18
+## 1147 2024-03-31
+## 1148 2024-03-31
+## 1149 2024-03-31
+## 1150 2024-03-31
+## 1151 2024-03-31
+## 1152 2024-03-31
+## 1153 2024-03-31
+## 1154 2024-03-31
+## 1155 2024-03-31
+## 1156 2024-03-31
+## 1157 2024-03-31
+## 1158 2024-03-31
+## 1159 2024-03-31
+## 1160 2024-03-31
+## 1161 2024-03-31
+## 1162 2024-03-31
+## 1163 2024-03-31
+## 1164 2024-03-31
+## 1165 2024-03-31
+## 1166 2024-03-31
+## 1167 2024-03-31
+## 1168 2024-03-31
+## 1169 2024-03-31
+## 1170 2024-03-31
+## 1171 2024-03-31
+## 1172 2024-03-31
+## 1173 2024-03-31
+## 1174 2024-03-31
+## 1175 2024-03-31
+## 1176 2024-03-31
+## 1177 2024-03-31
+## 1178 2024-03-31
+## 1179 2024-03-31
+## 1180 2024-03-31
+## 1181 2024-03-31
+## 1182 2024-03-31
+## 1183 2024-03-31
+## 1184 2024-03-31
+## 1185 2024-03-31
+## 1186 2024-03-31
+## 1187 2024-03-31
+## 1188 2024-03-31
+## 1189 2024-03-31
+## 1190 2024-03-31
+## 1191 2024-03-31
+## 1192 2024-03-31
+## 1193 2024-03-31
+## 1194 2024-03-31
+## 1195 2024-03-31
+## 1196 2024-03-31
+## 1197 2024-03-31
+## 1198 2024-03-31
+## 1199 2024-03-31
+## 1200 2024-03-31
+## 1201 2024-03-31
+## 1202 2024-03-31
+## 1203 2024-03-31
+## 1204 2024-03-31
+## 1205 2024-03-31
+## 1206 2024-03-31
+## 1207 2024-03-31
+## 1208 2024-03-31
+## 1209 2024-03-31
+## 1210 2024-03-31
+## 1211 2024-03-31
+## 1212 2024-03-31
+## 1213 2024-03-31
+## 1214 2024-03-31
+## 1215 2024-03-31
+## 1216 2024-03-31
+## 1217 2024-03-31
+## 1218 2024-03-31
+## 1219 2024-03-31
+## 1220 2024-03-31
+## 1221 2024-03-31
+## 1222 2024-03-31
+## 1223 2024-03-31
+## 1224 2024-03-31
+## 1225 2024-03-31
+## 1226 2024-03-31
+## 1227 2024-03-31
+## 1228 2024-03-31
+## 1229 2024-03-31
+## 1230 2024-03-31
+## 1231 2024-03-31
+## 1232 2024-03-26
+## 1233 2024-03-31
+## 1234 2024-03-31
+## 1235 2024-03-31
+## 1236 2024-03-31
+## 1237 2024-03-31
+## 1238 2024-03-31
+## 1239 2024-03-31
+## 1240 2024-03-31
+## 1241 2024-03-31
+## 1242 2024-03-31
+## 1243 2024-03-31
+## 1244 2024-03-31
+## 1245 2024-03-31
+## 1246 2024-03-31
+## 1247 2024-03-31
+## 1248 2024-03-31
+## 1249 2024-03-31
+## 1250 2024-03-31
+## 1251 2024-03-31
+## 1252 2024-03-31
+## 1253 2024-03-31
+## 1254 2024-03-31
+## 1255 2024-03-31
+## 1256 2024-03-31
+## 1257 2024-03-31
+## 1258 2024-03-31
+## 1259 2024-03-31
+## 1260 2024-03-31
+## 1261 2024-03-31
+## 1262 2024-03-31
+## 1263 2024-03-31
+## 1264 2024-03-31
+## 1265 2024-03-31
+## 1266 2024-03-31
+## 1267 2024-03-31
+## 1268 2024-03-31
+## 1269 2024-03-31
+## 1270 2024-03-31
+## 1271 2024-03-31
+## 1272 2024-03-31
+## 1273 2024-03-31
+## 1274 2024-03-31
+## 1275 2024-03-31
+## 1276 2024-03-31
+## 1277 2024-03-31
+## 1278 2024-03-31
+## 1279 2024-03-31
+## 1280 2024-03-31
+## 1281 2024-03-31
+## 1282 2024-03-31
+## 1283 2024-03-31
+## 1284 2024-03-31
+## 1285 2024-03-31
+## 1286 2024-03-31
+## 1287 2024-03-31
+## 1288 2024-03-31
+## 1289 2024-03-31
+## 1290 2024-03-31
+## 1291 2024-03-31
+## 1292 2024-03-31
+## 1293 2024-03-31
+## 1294 2024-03-31
+## 1295 2024-03-31
+## 1296 2024-03-31
+## 1297 2024-03-31
+## 1298 2024-03-31
+## 1299 2024-03-31
+## 1300 2024-03-31
+## 1301 2024-03-31
+## 1302 2024-03-31
+## 1303 2024-03-31
+## 1304 2024-03-31
+## 1305 2024-03-31
+## 1306 2024-03-31
+## 1307 2024-03-31
+## 1308 2024-03-31
+## 1309 2024-03-31
+## 1310 2024-03-31
+## 1311 2024-03-31
+## 1312 2024-03-31
+## 1313 2024-03-31
+## 1314 2024-03-31
+## 1315 2024-03-31
+## 1316 2024-03-31
+## 1317 2024-03-31
+## 1318 2024-03-31
+## 1319 2024-03-31
+## 1320 2024-03-31
+## 1321 2024-03-31
+## 1322 2024-03-31
+## 1323 2024-03-31
+## 1324 2024-03-31
+## 1325 2024-03-31
+## 1326 2024-03-31
+## 1327 2024-03-31
+## 1328 2024-03-31
+## 1329 2024-03-31
+## 1330 2024-03-31
+## 1331 2024-03-31
+## 1332 2024-03-31
+## 1333 2024-03-31
+## 1334 2024-03-31
+## 1335 2024-03-31
+## 1336 2024-03-31
+## 1337 2024-03-31
+## 1338 2024-03-31
+## 1339 2024-03-31
+## 1340 2024-03-31
+## 1341 2024-03-31
+## 1342 2024-03-31
+## 1343 2024-03-31
+## 1344 2024-03-31
+## 1345 2024-03-31
+## 1346 2024-03-31
+## 1347 2024-03-31
+## 1348 2024-03-31
+## 1349 2024-03-31
+## 1350 2024-03-31
+## 1351 2024-03-31
+## 1352 2024-03-31
+## 1353 2024-03-31
+## 1354 2024-03-31
+## 1355 2024-03-31
+## 1356 2024-03-31
+## 1357 2024-01-14
+## 1358 2024-03-31
+## 1359 2024-03-31
+## 1360 2024-03-31
+## 1361 2024-03-31
+## 1362 2024-03-31
+## 1363 2024-03-31
+## 1364 2024-03-31
+## 1365 2024-03-31
+## 1366 2024-03-31
+## 1367 2024-03-31
+## 1368 2024-03-31
+## 1369 2024-03-31
+## 1370 2024-03-31
+## 1371 2024-03-31
+## 1372 2024-03-31
+## 1373 2024-03-31
+## 1374 2024-03-31
+## 1375 2024-03-31
+## 1376 2024-03-31
+## 1377 2024-03-31
+## 1378 2024-03-31
+## 1379 2024-03-31
+## 1380 2024-03-31
+## 1381 2024-03-31
+## 1382 2024-03-31
+## 1383 2024-03-31
+## 1384 2024-03-31
+## 1385 2024-03-31
+## 1386 2024-03-31
+## 1387 2024-03-31
+## 1388 2024-03-31
該資料網址可到臺北市資料大平臺 (data.taipei)上查詢「住宅竊盜點位資訊」後,點選「API」後複製取得。
- +Sys.setlocale(category = "LC_ALL", locale = "UTF-8")
-Sys.setlocale(category = "LC_ALL", locale = "cht")
Sys.setlocale(category = "LC_ALL", locale = "UTF-8")
+Sys.setlocale(category = "LC_ALL", locale = "cht")
如果讀取到資料有中文的話,此時,你只需要指定locale為cht,然後重開該data.frame就可以解決該問題。
- +但你在寫程式剖析HTML時若使用了rvest這個套件,有可能在html_node()函式時會因為編碼而產生問題,此時你會需要把locale改為C。這個C指的是C語言的C。
- +這個範例涵括了在做問卷分析時常用的處理步驟。最核心的步驟是將文字陳述的類別資料轉換為便於後續運算的factor
或數值資料。如果類別數量過多的時候,在這個過程會順便進行重新分組。例如依照年齡組把填答者分為老年、中壯年、青少年、兒童四組。
## # A tibble: 1,216 × 6
## Q7 Q8 QAParty QASide QA3 QA4
## <chr> <chr> <chr> <chr> <chr> <chr>
@@ -813,37 +819,37 @@ 8.2 The Case: Misinformation Perc
8.3 Factorizing data
通常問卷會分為兩種類型的資料,一種是人口統計用的基本資料(如性別、年齡組、教育程度)、另一種是問卷本身要問的題項。以下是常見的問卷型態,包含把年齡從20歲開始每五年作為一組,70歲以上則歸類為一組,共會有十一組。而教育程度則常分為五至六組,但在問卷設計的時候,通常會需要增加「拒答」的選項。如果問卷中包含政黨意識形態,就必須要決定要以黨派作為類別變項,或者以意識形態做順序尺度。以下即為一個順序尺度的案例,從「非常接近泛綠」到「非常接近泛藍」共五個等第,但另增「拒答」選項。
-dt <- raw %>%
- mutate(QA3 = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39",
- "40-44", "45-49", "50-54", "55-59",
- "60-64", "65-69", "70及以上"))) %>%
- mutate(QA3_lv = ordered(QA3,
- levels=c("20-24", "25-29", "30-34", "35-39",
- "40-44", "45-49", "50-54", "55-59",
- "60-64", "65-69", "70及以上"),
- labels = c("青年", "青年", "壯年", "壯年",
- "壯年", "中年", "中年", "中年",
- "中年", "老年", "老年"))) %>%
- mutate(QA4 = ordered(QA4,
- levels=c("拒答", "國小及以下", "初中、國中",
- "高中、高職", "大專(專科與大學)",
- "研究所及以上"),
- labels=c("拒答", "國小以下", "國中",
- "高中職", "大專", "研究所以上"))) %>%
- mutate(QASide=ordered(QASide,
- exclude="拒答",
- levels=c("非常接近泛綠", "接近泛綠",
- "都不接近", "接近泛藍", "非常接近泛藍")))
+dt <- raw %>%
+ mutate(QA3 = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39",
+ "40-44", "45-49", "50-54", "55-59",
+ "60-64", "65-69", "70及以上"))) %>%
+ mutate(QA3_lv = ordered(QA3,
+ levels=c("20-24", "25-29", "30-34", "35-39",
+ "40-44", "45-49", "50-54", "55-59",
+ "60-64", "65-69", "70及以上"),
+ labels = c("青年", "青年", "壯年", "壯年",
+ "壯年", "中年", "中年", "中年",
+ "中年", "老年", "老年"))) %>%
+ mutate(QA4 = ordered(QA4,
+ levels=c("拒答", "國小及以下", "初中、國中",
+ "高中、高職", "大專(專科與大學)",
+ "研究所及以上"),
+ labels=c("拒答", "國小以下", "國中",
+ "高中職", "大專", "研究所以上"))) %>%
+ mutate(QASide=ordered(QASide,
+ exclude="拒答",
+ levels=c("非常接近泛綠", "接近泛綠",
+ "都不接近", "接近泛藍", "非常接近泛藍")))
8.3.1 factor-to-order
在一開始清理資料的時候,會建議先把類別變數(通常是文字型態)轉為factor
型態。常用的函式是用mutate()
搭配ordered()
來改變變數型態。ordered()
會照類別順序來標定該factor
所對應到的數字。可以用as.integer()
將factor
轉為整數後就可以看到各類別的順序。
mutate(QA3 = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39",
"40-44", "45-49", "50-54", "55-59",
"60-64", "65-69", "70及以上"))) %>%
-
+
## [1] 25-29 35-39 35-39 20-24 45-49 25-29 30-34 20-24 20-24 55-59
## 11 Levels: 20-24 < 25-29 < 30-34 < 35-39 < 40-44 < 45-49 < 50-54 < ... < 70及以上
-
+
## [1] 2 4 4 1 6 2 3 1 1 8
@@ -853,11 +859,11 @@ 8.3.2 Excludingdt$QASide[1:10]
+
## [1] 非常接近泛綠 接近泛藍 接近泛綠 接近泛綠 非常接近泛綠
## [6] 非常接近泛藍 接近泛綠 接近泛綠 接近泛藍 接近泛綠
## Levels: 非常接近泛綠 < 接近泛綠 < 都不接近 < 接近泛藍 < 非常接近泛藍
-
+
## [1] 1 4 2 2 1 5 2 2 4 2
@@ -870,12 +876,12 @@ 8.3.3 Grouping-updt$QA3[1:10]
+
## [1] 25-29 35-39 35-39 20-24 45-49 25-29 30-34 20-24 20-24 55-59
## 11 Levels: 20-24 < 25-29 < 30-34 < 35-39 < 40-44 < 45-49 < 50-54 < ... < 70及以上
-
+
## [1] 2 4 4 1 6 2 3 1 1 8
-
+
## [1] 青年 壯年 壯年 青年 中年 青年 壯年 青年 青年 中年
## Levels: 青年 < 壯年 < 中年 < 老年
dt2 <- dt %>%
- mutate(Q7 = ordered(Q7, levels=c("一點也不會", "不會", "會", "絕對會"))) %>%
- mutate(Q8 = ordered(Q8, levels=c("一點也不會", "不會", "會", "絕對會"))) %>%
- mutate(Q7_3rd = as.numeric(Q8)-as.numeric(Q7)) %>%
- mutate(Q7_3rd_lv = ifelse(Q7 %in% c("一點也不會", "不會") & Q8 %in% c("會", "絕對會"), "高", "低")) %>%
- mutate(Q7_3rd_lv = ordered(Q7_3rd_lv, levels=c("低", "高")))
dt2 <- dt %>%
+ mutate(Q7 = ordered(Q7, levels=c("一點也不會", "不會", "會", "絕對會"))) %>%
+ mutate(Q8 = ordered(Q8, levels=c("一點也不會", "不會", "會", "絕對會"))) %>%
+ mutate(Q7_3rd = as.numeric(Q8)-as.numeric(Q7)) %>%
+ mutate(Q7_3rd_lv = ifelse(Q7 %in% c("一點也不會", "不會") & Q8 %in% c("會", "絕對會"), "高", "低")) %>%
+ mutate(Q7_3rd_lv = ordered(Q7_3rd_lv, levels=c("低", "高")))
這時候一種策略是把這兩題視為順序尺度變數,然後把兩題的分數相減。相減後的分數從「-1, 0, 1, 2, 3」各有「12, 482, 600, 103, 19」,不難猜到會是一個較為集中的分佈,後續僅能當作順序尺度或連續變項來分析,不適合找一個閾值轉類別變項。
另一種策略是,分別先把Q7與Q8的「一點也不會」和「不會」群組為「不會」、再把「會」與「絕對會」群組為「會」,這樣Q7與Q8的交叉分析表會變成2X2的分析表,雖然群組數量比較少,但別忘記Q7的填答結果集中在會與不會、而Q8為一個較為偏右的分佈,集中在「會」和「絕對會」。Q8勢必會造成比例不均的分組。
- +## # A tibble: 5 × 2
## `as.integer(Q8) - as.integer(Q7)` n
## <int> <int>
@@ -905,7 +911,7 @@ 8.4 Order-to-factordt2 %>% count(Q7_3rd_lv)
+
## # A tibble: 2 × 2
## Q7_3rd_lv n
## <ord> <int>
@@ -926,20 +932,20 @@ 8.5 Cross-tabulating(xtb <- xtabs(~QA3_lv + Q7_3rd_lv, data=dt2))
+
## Q7_3rd_lv
## QA3_lv 低 高
## 青年 178 110
## 壯年 370 199
## 中年 157 134
## 老年 41 27
-
+
##
## Pearson's Chi-squared test
##
## data: xtb
## X-squared = 10.017, df = 3, p-value = 0.01842
-
+
## X^2 df P(> X^2)
## Likelihood Ratio 9.9301 3 0.01917
## Pearson 10.0173 3 0.01842
@@ -947,54 +953,54 @@ 8.5 Cross-tabulatingprint(round(chi2$observed, 2))
+
## Q7_3rd_lv
## QA3_lv 低 高
## 青年 178 110
## 壯年 370 199
## 中年 157 134
## 老年 41 27
-
+
## Q7_3rd_lv
## QA3_lv 低 高
## 青年 176.68 111.32
## 壯年 349.07 219.93
## 中年 178.52 112.48
## 老年 41.72 26.28
-
+
## Q7_3rd_lv
## QA3_lv 低 高
## 青年 0.10 -0.12
## 壯年 1.12 -1.41
## 中年 -1.61 2.03
## 老年 -0.11 0.14
-par(family="Heiti TC Light")
-gplots::balloonplot(t(xtb), xlab="第三人效果", ylab="年齡組", main="",
- dotsize=4/max(strwidth(40),strheight(40)),
- text.size=1.5,label.size=2,
- rowmar=1, colmar=1)
+par(family="Heiti TC Light")
+gplots::balloonplot(t(xtb), xlab="第三人效果", ylab="年齡組", main="",
+ dotsize=4/max(strwidth(40),strheight(40)),
+ text.size=1.5,label.size=2,
+ rowmar=1, colmar=1)
![](R24_categorical_data_files/figure-html/unnamed-chunk-11-1.png)
-
+
![](R24_categorical_data_files/figure-html/unnamed-chunk-11-2.png)
-xtb %>% as_tibble() %>%
- group_by(QA3_lv) %>%
- mutate(fill = if_else(n == max(n), "orangered", "skyblue")) %>%
- ungroup() %>%
- mutate(QA3_lv = ordered(QA3_lv,
- levels=c("青年", "壯年", "中年", "老年"))) %>%
- arrange(desc(QA3_lv)) %>%
- ggplot() + aes(y = QA3_lv, x=Q7_3rd_lv, color = fill, size = n) +
- scale_size_area(max_size=70, guide = "none") +
- geom_point(alpha=0.7) +
- scale_color_manual(values = c("orangered", "skyblue"), guide = "none") +
- geom_text(aes(
- label=n,
- vjust=1.3,
- size=10
- ), color="black",) + theme_minimal() +
- theme(text = element_text(family="Heiti TC Light"),
- title = element_text(family="Heiti TC Light"))
+xtb %>% as_tibble() %>%
+ group_by(QA3_lv) %>%
+ mutate(fill = if_else(n == max(n), "orangered", "skyblue")) %>%
+ ungroup() %>%
+ mutate(QA3_lv = ordered(QA3_lv,
+ levels=c("青年", "壯年", "中年", "老年"))) %>%
+ arrange(desc(QA3_lv)) %>%
+ ggplot() + aes(y = QA3_lv, x=Q7_3rd_lv, color = fill, size = n) +
+ scale_size_area(max_size=70, guide = "none") +
+ geom_point(alpha=0.7) +
+ scale_color_manual(values = c("orangered", "skyblue"), guide = "none") +
+ geom_text(aes(
+ label=n,
+ vjust=1.3,
+ size=10
+ ), color="black",) + theme_minimal() +
+ theme(text = element_text(family="Heiti TC Light"),
+ title = element_text(family="Heiti TC Light"))
![](R24_categorical_data_files/figure-html/unnamed-chunk-12-1.png)
diff --git a/coordinate.html b/coordinate.html
index 0bef9c5..08b1e92 100644
--- a/coordinate.html
+++ b/coordinate.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -793,40 +799,40 @@ 23.1.1 Parsing table from pdf至R4CSS/data可以下載到本範例所用的資料(是一個pdf檔案)https://github.com/p4css/R4CSS/raw/master/data/world_population_change.pdf。
我們可使用tabulizer
這個套件來萃取PDF文件中的表格,官方雖然提供cran可以直接安裝,但有可能會遇到R的版本不符要求而安裝不起來的情形。此時可用第二種方法,直接從github上安裝該套件。
程式碼使用 extract_tables()
函數從指定的PDF文件中提取表格數據,並將其存儲在 tables
變量中。在這個函數中,我們指定了要從第1頁中提取表格數據。
-# Method 1
-# install.packages("tabulizer")
-
-# Method 2
-# if (!require("remotes")) {
-# install.packages("remotes")
-# }
-# remotes::install_github(c("ropensci/tabulizerjars", "ropensci/tabulizer"))
-
-library(tidyverse)
-library(tabulizer)
-# Extract the table
-
-tables <- extract_tables('data/world_population_change.pdf', pages = 1)
-
-# Extract the first element of the variable
-raw <- as.data.frame(tables[[1]])
-
-population_by_year <- raw %>%
- select(1, 2) %>%
- slice(-c(1:4)) %>%
- rename(years_to_2020 = V1, population = V2)
- # select(years_to_2020 = v1, population = v2)
- # mutate(years_to_2020 = v1, population = v2)
+# Method 1
+# install.packages("tabulizer")
+
+# Method 2
+# if (!require("remotes")) {
+# install.packages("remotes")
+# }
+# remotes::install_github(c("ropensci/tabulizerjars", "ropensci/tabulizer"))
+
+library(tidyverse)
+library(tabulizer)
+# Extract the table
+
+tables <- extract_tables('data/world_population_change.pdf', pages = 1)
+
+# Extract the first element of the variable
+raw <- as.data.frame(tables[[1]])
+
+population_by_year <- raw %>%
+ select(1, 2) %>%
+ slice(-c(1:4)) %>%
+ rename(years_to_2020 = V1, population = V2)
+ # select(years_to_2020 = v1, population = v2)
+ # mutate(years_to_2020 = v1, population = v2)
23.1.2 X and Y with log-scale
通常情況下,當數據範圍很大,且存在極端值或者偏離值時,使用對數轉換可以更好地展示數據的分佈情況。在這種情況下,你可以使用 scale_x_log10()
或 scale_y_log10()
函數將 x 軸或 y 軸轉換為對數刻度。
例如,如果你有一個數據集,其中一個變量的數值範圍從1到100000,且大多數數據會集中在較小的值上,那麼使用線性刻度將導致數據在圖形中的分佈不平衡,而較大的值會集中在圖形的邊緣或者消失在圖形之外。在這種情況下,使用對數刻度可以更好地展示數據的分佈情況,並且可以更好地顯示較大值之間的差異。而上述資料便有這樣的特色,尤其是在Y軸方向,一開始人口增加量不多,後來指數成長,此時若使用線性尺度,會看不清楚一開始的人口增加量。
-
+
## years_to_2020 population
## 1 11,720 4
## 2 10,020 5
@@ -862,12 +868,12 @@ 23.1.2 X and Y with log-scale
-toplot <- population_by_year %>%
- mutate(years_to_2020 = map(years_to_2020, ~(str_remove(., ",")))) %>%
- mutate(years_to_2020 = as.numeric(years_to_2020),
- population = as.numeric(population))
-
-toplot %>% head
+toplot <- population_by_year %>%
+ mutate(years_to_2020 = map(years_to_2020, ~(str_remove(., ",")))) %>%
+ mutate(years_to_2020 = as.numeric(years_to_2020),
+ population = as.numeric(population))
+
+toplot %>% head
## years_to_2020 population
## 1 11720 4
## 2 10020 5
@@ -875,26 +881,26 @@ 23.1.2 X and Y with log-scale
-p1 <- toplot %>%
- ggplot() +
- aes(x=years_to_2020, y=population) +
- geom_point() +
- theme_bw()
-
-
-p2 <- toplot %>%
- ggplot() +
- aes(x=years_to_2020, y=population) +
- geom_point() +
- scale_x_log10() + scale_y_log10() +
- scale_x_reverse() +
- theme_bw()
-
-cowplot::plot_grid(
- p1, NULL, p2,
- labels = c("(a) Original Scale", "", "(b) Low-Scale"),
- nrow = 1, rel_widths = c(1, 0.1, 1)
-)
+p1 <- toplot %>%
+ ggplot() +
+ aes(x=years_to_2020, y=population) +
+ geom_point() +
+ theme_bw()
+
+
+p2 <- toplot %>%
+ ggplot() +
+ aes(x=years_to_2020, y=population) +
+ geom_point() +
+ scale_x_log10() + scale_y_log10() +
+ scale_x_reverse() +
+ theme_bw()
+
+cowplot::plot_grid(
+ p1, NULL, p2,
+ labels = c("(a) Original Scale", "", "(b) Low-Scale"),
+ nrow = 1, rel_widths = c(1, 0.1, 1)
+)
![](V02_Coordinate_System_files/figure-html/unnamed-chunk-3-1.png)
@@ -914,44 +920,44 @@ 23.2 Order as axis
23.3 Log-scale
以下我打算繪製出每個村里在15歲以上的人口數,來呈現台灣有些村里人口相當稀少,尤其是花蓮縣、澎湖縣、南投縣和宜蘭縣的幾個聚落。並標記出幾個人口數最高的里。如果我的目的是呈現村里人口數的統計分佈,我會用geom_density()
來繪圖(如下),但實際上沒辦法從這樣的密度函式圖來說故事,指出那些人口數過高或過低的村里。
-raw <- read_csv("data/opendata107Y020.csv", show_col_types = FALSE) %>%
- slice(-1) %>%
- type_convert()
-
-raw %>%
- ggplot() + aes(edu_age_15up_total) +
- geom_density()
+raw <- read_csv("data/opendata107Y020.csv", show_col_types = FALSE) %>%
+ slice(-1) %>%
+ type_convert()
+
+raw %>%
+ ggplot() + aes(edu_age_15up_total) +
+ geom_density()
![](V02_Coordinate_System_files/figure-html/unnamed-chunk-5-1.png)
因此,一個比較好的策略是,把各村里的人口數由小到大或由大到小排序好,編好Rank比序的代號,然後讓X軸做為比序,逐一在Y軸打出每一個村里的數據。
但這邊值得注意的是,如果沒有放大尾端(也就是村里人口數最少的那部分),實際上也很難繪圖。所以對Y軸取log,就可以看清楚Y軸的資料點。
-toplot <- raw %>%
- select(site_id, village, edu_age_15up_total) %>%
- arrange(desc(edu_age_15up_total)) %>%
- mutate(index = row_number()) %>%
- mutate(label = ifelse(index <= 5 | index > n()-5, paste0(site_id, village), ""))
-
-library(ggrepel)
-
-p2 <- toplot %>% ggplot() + aes(index, edu_age_15up_total) +
- geom_point(alpha=0.5, color="royalblue") +
- geom_text_repel(aes(label = label), point.padding = .4, color = "black",
- min.segment.length = 0, family = "Heiti TC Light") +
- theme(axis.text.x=element_blank()) +
- scale_y_log10(breaks = c(0, 1, 10, 100, 1000, 10000)) +
- theme_minimal()
-
-p1 <- toplot %>% ggplot() + aes(index, edu_age_15up_total) +
- geom_point(alpha=0.5, color="royalblue") +
- theme(axis.text.x=element_blank()) +
- theme_minimal()
-
-cowplot::plot_grid(
- p2, NULL, p1,
- labels = c("a", "", "b"), nrow = 1, rel_widths = c(1, 0.1, 1)
-)
+toplot <- raw %>%
+ select(site_id, village, edu_age_15up_total) %>%
+ arrange(desc(edu_age_15up_total)) %>%
+ mutate(index = row_number()) %>%
+ mutate(label = ifelse(index <= 5 | index > n()-5, paste0(site_id, village), ""))
+
+library(ggrepel)
+
+p2 <- toplot %>% ggplot() + aes(index, edu_age_15up_total) +
+ geom_point(alpha=0.5, color="royalblue") +
+ geom_text_repel(aes(label = label), point.padding = .4, color = "black",
+ min.segment.length = 0, family = "Heiti TC Light") +
+ theme(axis.text.x=element_blank()) +
+ scale_y_log10(breaks = c(0, 1, 10, 100, 1000, 10000)) +
+ theme_minimal()
+
+p1 <- toplot %>% ggplot() + aes(index, edu_age_15up_total) +
+ geom_point(alpha=0.5, color="royalblue") +
+ theme(axis.text.x=element_blank()) +
+ theme_minimal()
+
+cowplot::plot_grid(
+ p2, NULL, p1,
+ labels = c("a", "", "b"), nrow = 1, rel_widths = c(1, 0.1, 1)
+)
![](V02_Coordinate_System_files/figure-html/Fig3-5-6-log-scale-village-level-population-1.png)
-
+
23.4
@@ -964,53 +970,53 @@ 23.5 Square-root scaleFigure 3.8: Areas of Northeastern U.S. states. (a) Areas shown on a linear scale. (b) Areas shown on a square-root scale. Data source: Google.
前面是視覺化了各村里大於十五歲以上人口的人口數分佈,採用對數尺度(log-scale)可以觀察到比較小的村里。那有什麼是適合用平方根尺度(sqrt-scale)的呢?是土地嗎?密度嗎?還是人口數?是村里等級嗎?鄉鎮市區等級嗎?還是縣市等級?
-town <- read_csv("data/tw_population_opendata110N010.csv") %>%
- slice(-1, -(370:375)) %>%
- type_convert()
-
-town %>%
- arrange(desc(area)) %>%
- mutate(index = row_number()) %>%
- ggplot() + aes(index, area) %>%
- geom_col(fill="skyblue") +
- scale_y_sqrt() +
- theme_minimal()
+town <- read_csv("data/tw_population_opendata110N010.csv") %>%
+ slice(-1, -(370:375)) %>%
+ type_convert()
+
+town %>%
+ arrange(desc(area)) %>%
+ mutate(index = row_number()) %>%
+ ggplot() + aes(index, area) %>%
+ geom_col(fill="skyblue") +
+ scale_y_sqrt() +
+ theme_minimal()
Figure 23.1: (ref:population-area)
-county <- town %>%
- mutate(county = str_sub(site_id, 1, 3)) %>%
- group_by(county) %>%
- summarize(
- area = sum(area),
- people_total = sum(people_total)
- ) %>%
- ungroup()
-
-p1 <- county %>%
- arrange(desc(people_total)) %>%
- mutate(index = row_number()) %>%
- ggplot() + aes(index, people_total) %>%
- geom_col(fill="lightgrey") +
- # scale_y_sqrt() +
- theme_minimal()
-
-p2 <- county %>%
- arrange(desc(people_total)) %>%
- mutate(index = row_number()) %>%
- ggplot() + aes(index, people_total) %>%
- geom_col(fill="khaki") +
- scale_y_sqrt(breaks=c(0, 250000, 500000, 1000000, 2000000, 4000000)) +
- theme_minimal()
-
-cowplot::plot_grid(
- p1, p2,
- labels = c("a", "b"),
- nrow = 1
-)
+county <- town %>%
+ mutate(county = str_sub(site_id, 1, 3)) %>%
+ group_by(county) %>%
+ summarize(
+ area = sum(area),
+ people_total = sum(people_total)
+ ) %>%
+ ungroup()
+
+p1 <- county %>%
+ arrange(desc(people_total)) %>%
+ mutate(index = row_number()) %>%
+ ggplot() + aes(index, people_total) %>%
+ geom_col(fill="lightgrey") +
+ # scale_y_sqrt() +
+ theme_minimal()
+
+p2 <- county %>%
+ arrange(desc(people_total)) %>%
+ mutate(index = row_number()) %>%
+ ggplot() + aes(index, people_total) %>%
+ geom_col(fill="khaki") +
+ scale_y_sqrt(breaks=c(0, 250000, 500000, 1000000, 2000000, 4000000)) +
+ theme_minimal()
+
+cowplot::plot_grid(
+ p1, p2,
+ labels = c("a", "b"),
+ nrow = 1
+)
@@ -1032,12 +1038,12 @@
23.6.1 NYT: Net Worth by Age Grou
23.6.2 Read and sort data
Sorted by arrange()
function.
-p1 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
- select(year, Category, Net_Worth) %>%
- group_by(Category) %>%
- arrange(year) %>%
- ungroup()
-p1 %>% filter(year <= 1992) %>% knitr::kable()
+p1 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
+ select(year, Category, Net_Worth) %>%
+ group_by(Category) %>%
+ arrange(year) %>%
+ ungroup()
+p1 %>% filter(year <= 1992) %>% knitr::kable()
@@ -1109,24 +1115,24 @@ 23.6.2 Read and sort data
-library(gghighlight)
-p1 %>% ggplot() + aes(year, Net_Worth, color = Category) +
- geom_line() +
- geom_point() +
- gghighlight(Category %in% c("65-74", "35-44")) +
- theme_minimal() +
- scale_x_continuous(breaks = NULL) +
- theme(panel.background = element_rect(fill = "white",
- colour = "white",
- size = 0.5, linetype = "solid"))
+library(gghighlight)
+p1 %>% ggplot() + aes(year, Net_Worth, color = Category) +
+ geom_line() +
+ geom_point() +
+ gghighlight(Category %in% c("65-74", "35-44")) +
+ theme_minimal() +
+ scale_x_continuous(breaks = NULL) +
+ theme(panel.background = element_rect(fill = "white",
+ colour = "white",
+ size = 0.5, linetype = "solid"))
![](V02_Coordinate_System_files/figure-html/unnamed-chunk-8-1.png)
-p2 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
- select(year, Category, NW = Net_Worth) %>%
- group_by(Category) %>%
- arrange(year) %>%
- mutate(increase = (NW-first(NW))/first(NW)) %>%
- ungroup()
-p2 %>% filter(year <= 1992) %>% knitr::kable()
+p2 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
+ select(year, Category, NW = Net_Worth) %>%
+ group_by(Category) %>%
+ arrange(year) %>%
+ mutate(increase = (NW-first(NW))/first(NW)) %>%
+ ungroup()
+p2 %>% filter(year <= 1992) %>% knitr::kable()
@@ -1212,16 +1218,16 @@ 23.6.2 Read and sort data
美國35歲以下的年輕人的中位淨資產比起年長的美國人來說,一開始平均貧窮得多。從「Less than 35」這條線看來,現在的年輕世代比起2004年的年輕世代所擁有的淨資產低了40%。相比之下,65歲以上的美國人現在的淨資產,相較於2004年增加了9%。隨著時代變化,可想像會有一群人的淨資產越來越多,只是現在從這個圖表看來,年輕人所擁有的淨資產相較於過去是越來越低的,多半流入了成年人和老年人手中。
-p2 %>% ggplot() + aes(year, increase, color = Category) +
- geom_line() +
- geom_point() +
- gghighlight(Category %in% c("65-74", "Less than 35")) +
- theme_minimal() +
- scale_y_continuous(labels=scales::parse_format()) +
- scale_x_continuous(breaks = NULL) +
- theme(panel.background = element_rect(fill = "white",
- colour = "white",
- size = 0.5, linetype = "solid"))
+p2 %>% ggplot() + aes(year, increase, color = Category) +
+ geom_line() +
+ geom_point() +
+ gghighlight(Category %in% c("65-74", "Less than 35")) +
+ theme_minimal() +
+ scale_y_continuous(labels=scales::parse_format()) +
+ scale_x_continuous(breaks = NULL) +
+ theme(panel.background = element_rect(fill = "white",
+ colour = "white",
+ size = 0.5, linetype = "solid"))
![](V02_Coordinate_System_files/figure-html/unnamed-chunk-10-1.png)
@@ -1230,31 +1236,31 @@ 23.7 X/Y aspect ratio
23.7.1 UNICEF-Optimistic (WGOITH)
https://www.nytimes.com/2021/11/17/upshot/global-survey-optimism.html https://changingchildhood.unicef.org/about
-plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>%
- select(country = WP5, age = WP22140, bw = WP22092) %>%
- mutate(country = ordered(country,
- levels=c(1, 3, 4, 10, 11, 12,
- 13, 14, 17, 29, 31,
- 33, 35, 36, 60, 61,
- 77, 79, 81, 87, 165),
- labels=c("USA", "Morocco", "Lebanon",
- "Indonesia", "Bangladesh",
- "UK", "France", "Germany",
- "Spain", "Japan", "India",
- "Brazil", "Nigeria", "Kenya",
- "Ethiopia", "Mali", "Ukraine",
- "Cameroon", "Zimbabwe",
- "Argentina", "Peru"))) %>%
- count(country, age, bw) %>%
- group_by(country, age) %>%
- mutate(perc = n/sum(n)) %>%
- ungroup() %>%
- filter(bw == 1) %>%
- select(country, age, perc) %>%
- spread(age, perc) %>%
- rename(`15-24y` = `1`, `40+y` = `2`)
-
-plot.opt %>% head(10) %>% knitr::kable()
+plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>%
+ select(country = WP5, age = WP22140, bw = WP22092) %>%
+ mutate(country = ordered(country,
+ levels=c(1, 3, 4, 10, 11, 12,
+ 13, 14, 17, 29, 31,
+ 33, 35, 36, 60, 61,
+ 77, 79, 81, 87, 165),
+ labels=c("USA", "Morocco", "Lebanon",
+ "Indonesia", "Bangladesh",
+ "UK", "France", "Germany",
+ "Spain", "Japan", "India",
+ "Brazil", "Nigeria", "Kenya",
+ "Ethiopia", "Mali", "Ukraine",
+ "Cameroon", "Zimbabwe",
+ "Argentina", "Peru"))) %>%
+ count(country, age, bw) %>%
+ group_by(country, age) %>%
+ mutate(perc = n/sum(n)) %>%
+ ungroup() %>%
+ filter(bw == 1) %>%
+ select(country, age, perc) %>%
+ spread(age, perc) %>%
+ rename(`15-24y` = `1`, `40+y` = `2`)
+
+plot.opt %>% head(10) %>% knitr::kable()
@@ -1316,15 +1322,15 @@ 23.7.1 UNICEF-Optimistic (WGOITH)
-plot.opt %>%
- ggplot() + aes(`40+y`, `15-24y`, label = country) +
- geom_point(color = "skyblue", size = 2) +
- xlim(0, 1) + ylim(0,1) +
- geom_text(hjust = -0.1, vjust = -0.5) +
- geom_abline(intercept = 0, slop = 1,
- color="lightgrey", alpha=0.5, linetype="dashed") +
- theme_minimal() +
- theme(aspect.ratio=1)
+plot.opt %>%
+ ggplot() + aes(`40+y`, `15-24y`, label = country) +
+ geom_point(color = "skyblue", size = 2) +
+ xlim(0, 1) + ylim(0,1) +
+ geom_text(hjust = -0.1, vjust = -0.5) +
+ geom_abline(intercept = 0, slop = 1,
+ color="lightgrey", alpha=0.5, linetype="dashed") +
+ theme_minimal() +
+ theme(aspect.ratio=1)
![](V02_Coordinate_System_files/figure-html/unnamed-chunk-12-1.png)
diff --git a/crawler-overview.html b/crawler-overview.html
index 9ca7228..940fdac 100644
--- a/crawler-overview.html
+++ b/crawler-overview.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
diff --git a/crosstab.html b/crosstab.html
index ea66c78..723323a 100644
--- a/crosstab.html
+++ b/crosstab.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -813,12 +819,12 @@ 5.1.1 讀取檔案library(knitr)
-library(kableExtra)
-library(tidyverse)
-
-df <- read.csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
-head(df)
+library(knitr)
+library(kableExtra)
+library(tidyverse)
+
+df <- read.csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
+head(df)
## 編號 案類 發生日期 發生時段 發生地點
## 1 1 住宅竊盜 1030623 08~10 臺北市中正區廈門街91~120號
## 2 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧街1~30號
@@ -830,10 +836,10 @@ 5.1.1 讀取檔案
萬一遇到中文檔案會有讀檔編碼問題時,有可能該檔案是用big5來儲存的,可以在read_csv()
中設定locale
來指定讀取的編碼方法。如read_csv(url, locale = locale(encoding = "Big5"))
-library(readr)
-df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
-# df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv", locale = locale(encoding = "Big5"))
-head(df)
+library(readr)
+df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
+# df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv", locale = locale(encoding = "Big5"))
+head(df)
## # A tibble: 6 × 5
## 編號 案類 發生日期 發生時段 發生地點
## <dbl> <chr> <dbl> <chr> <chr>
@@ -863,12 +869,12 @@ 5.1.2 萃取所需新變項或用stringr::str_sub()
?substr
查詢其用法和意義。相當於getting sub string since x to y
。
-# Get substring of var "發生時段" and assign to a new time var
-df$time <- df$發生時段
-
-# Get substring of var "發生地點" and assign to a new region var
-df$region <- substr(df$發生地點, 4, 5)
-head(df)
+# Get substring of var "發生時段" and assign to a new time var
+df$time <- df$發生時段
+
+# Get substring of var "發生地點" and assign to a new region var
+df$region <- substr(df$發生地點, 4, 5)
+head(df)
## # A tibble: 6 × 7
## 編號 案類 發生日期 發生時段 發生地點 time region
## <dbl> <chr> <dbl> <chr> <chr> <chr> <chr>
@@ -884,21 +890,21 @@ 5.1.3 使用table()
清理完資料後,我們要回答的第一個數據問題通常是「那XXX的案例有幾個?」例如:大安區有多少竊盜案?10~12這個時段有多少案例。
table()
函式可以對Vector中的值進行計數(Counting)。table(df$time)
相當於去計數不同的時間區間出現多少起案例;table(df$region)
相當於去計數不同地區各出現多少起案例。
提示:可以用class(tb_1)
觀察用table()
計數後所產生的資料型態(table
)。
-
+
##
## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華
## 438 263 214 303 318 181 373 172 311 204 220 350
-
+
##
## 00~02 02~04 03~05 04~06 05~07 06~08 08~10 09~11 10~12 11~03 11~13 12~14 12~15
## 272 214 8 156 23 191 305 6 338 1 26 338 2
## 14~16 15~17 15~18 16~18 17~19 18~20 18~21 19~21 20~22 21~23 21~24 22~24 23~01
## 342 3 1 246 21 314 1 4 303 5 1 206 20
-
+
## [1] "table"
@@ -912,22 +918,22 @@ 5.1.4 依變數值篩選資料如果要表示不包含,就在df%time
加一個NOT,也就是!
。
依照各組時間的案例個數統計後,篩除資料未足100的時間區間如下,最後再用table(df$time)
計算一次,發現每個時段都兩三、百個案例,且涵蓋整日的時間。清理後沒有重疊的時間區間,做類別資料分析會比較準確。
-# filter out irrelevant timestamp
-df <- df[!df$time %in% c("03~05", "05~07", "09~11", "11~13", "11~03", "12~15", "15~17", "15~18", "17~19", "18~21", "19~21", "21~23", "21~24", "23~01"), ]
-
-table(df$time)
+# filter out irrelevant timestamp
+df <- df[!df$time %in% c("03~05", "05~07", "09~11", "11~13", "11~03", "12~15", "15~17", "15~18", "17~19", "18~21", "19~21", "21~23", "21~24", "23~01"), ]
+
+table(df$time)
##
## 00~02 02~04 04~06 06~08 08~10 10~12 12~14 14~16 16~18 18~20 20~22 22~24
## 272 214 156 191 305 338 338 342 246 314 303 206
-
+
5.1.5 做雙變數樞紐分析:table()
類別變項分析通常是要考驗兩個變項間的關係,從上述的計數中,我可以看見不同行政區或者不同時間的竊盜案數量,但我進一步想知道,那不同行政區的竊盜案常發生時間是否不同?這時後就要做時間和行政區的交叉分析。我們同樣可以用table()
和tapply()
來做兩個變項的交叉分析,寫法如下。
用table()
來交叉分析的結果如下,所得到的結果之變數型態仍是table
型態。
-
+
##
## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華
## 00~02 62 15 27 20 24 19 28 15 24 17 4 17
@@ -942,40 +948,40 @@ 5.1.5 做雙變數樞紐分析:
## 18~20 39 42 23 22 40 18 31 13 23 23 17 23
## 20~22 40 13 22 34 17 20 41 13 26 15 25 37
## 22~24 33 20 16 18 15 9 23 9 12 17 14 20
-
+
## [1] "table"
-
+
5.1.6 繪圖
通常這種類別資料交叉分析最常用的圖表型態之一便是Mosaic Plot(但事實上Mosaic Plot不見能夠被一眼就了解)。我們可以把交叉分析後的變項res_table
直接用MosaicPlot來繪圖。
-
+
![](R12_tptheft_base_files/figure-html/unnamed-chunk-9-1.png)
-
+
![](R12_tptheft_base_files/figure-html/unnamed-chunk-9-2.png)
5.1.6.1 解決圖表無法顯示中文
大部分的視覺化套件都無法順利顯示中文,除非特別指定所要用的中文字型。這方面網路上可以找到很多的說明,但非常討厭的是,幾乎每換一套視覺化工具,換一套語言,就有不同的中文字體指定方式。例如用base的plot()
來繪圖或用ggplot()
的中文字型指定方法便不同,且軸上面有中文、圖標有中文、或者圖內有中文都要分開指定,非常討人厭。
Mosaic Plot屬於base R的plot()
,其中文指定方法要指定在繪圖前的par()
函式中(par
為parameter的意思),指定方法為par(family=('Heiti TC Light'))
,Heiti TC Light為字體名稱,為OSX上在用的黑體細字,STKaiti則為標楷體。然後,par()
和mosaicplot()
兩個函式要「同時執行」,也就是請你直接用shift-cmd(ctrl)-Enter執行整個code-cell,或者將該兩個函式選起來一次執行。
-par(family=('STKaiti'))
-# par(family=('Heiti TC Light'))
-mosaicplot(res_table, main="mosaic plot", color=T)
+par(family=('STKaiti'))
+# par(family=('Heiti TC Light'))
+mosaicplot(res_table, main="mosaic plot", color=T)
![](R12_tptheft_base_files/figure-html/unnamed-chunk-10-1.png)
5.1.6.2 自訂顏色
目前顏色實在過醜,你可以自訂顏色指給mosaicplot()
。例如我底下便產製了12種顏色後,將其作為mosaicplot()
的參數
-# Set up color by yourself.
-colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
- '#E79460', '#E98B2A', '#9B6E23', '#F7C242',
- '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
-# par(family=('STKaiti'))
-par(family=('Heiti TC Light'))
-mosaicplot(res_table, color=colors, border=0, off = 3,
- main="Theft rate of Taipei city (region by hour)")
+# Set up color by yourself.
+colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
+ '#E79460', '#E98B2A', '#9B6E23', '#F7C242',
+ '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
+# par(family=('STKaiti'))
+par(family=('Heiti TC Light'))
+mosaicplot(res_table, color=colors, border=0, off = 3,
+ main="Theft rate of Taipei city (region by hour)")
![](R12_tptheft_base_files/figure-html/unnamed-chunk-11-1.png)
@@ -1018,7 +1024,7 @@ 5.3.1 tapply()
5.3.2 tapply()
two variables
用tapply()
來做兩個變數交叉分析的語法如下,必須要把兩個Vector包在一個list()
中。其他不變。兩個變項用tapply()
交叉分析後的結果,變數型態會變成matrix
。前者用table()
來交叉分析的仍是table
型態。
-
+
## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華
## 00~02 62 15 27 20 24 19 28 15 24 17 4 17
## 02~04 26 22 12 15 17 12 29 10 15 14 13 29
@@ -1032,7 +1038,7 @@ 5.3.2 tapply()
two v
## 18~20 39 42 23 22 40 18 31 13 23 23 17 23
## 20~22 40 13 22 34 17 20 41 13 26 15 25 37
## 22~24 33 20 16 18 15 9 23 9 12 17 14 20
-
+
5.3.3 dplyr::count()
two variables
@@ -1047,16 +1053,16 @@ 5.4.1 long-to-wide。這是為什麼tidyverse系列的套件逐漸變成R的顯學的原因之一。
-library(tidyr)
-# spreading the region into columns
-# (res_count_spread <- spread(res_count, region, n, fill = 0))
-res_count_spread <- pivot_wider(res_count, names_from = region, values_from = n, values_fill = 0)
-class(res_count_spread)
+library(tidyr)
+# spreading the region into columns
+# (res_count_spread <- spread(res_count, region, n, fill = 0))
+res_count_spread <- pivot_wider(res_count, names_from = region, values_from = n, values_fill = 0)
+class(res_count_spread)
## [1] "tbl_df" "tbl" "data.frame"
-# spreading the time into columns
-# res_count_spread <- spread(res_count, time, n, fill = 0)
-
-res_count_spread # %>% View
+# spreading the time into columns
+# res_count_spread <- spread(res_count, time, n, fill = 0)
+
+res_count_spread # %>% View
## # A tibble: 12 × 13
## time 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華
## <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
@@ -1072,13 +1078,13 @@ 5.4.1 long-to-wide# ??dplyr::count
+
5.4.2 Wide-to-long
寬表格亦可用tidyr的gather()
函式轉回長表格型態。但gather()
近期也已經被新的函式pivot_longer()
取代。原先的gather(res_count_spread, region, n, -time)
應取代為pivot_longer(res_count_spread, -time, names_to = "region", values_to = "n")
。
-
+
@@ -1088,10 +1094,10 @@ 5.5 Residuals analysis# par(family=('STKaiti'))
-par(family=('Heiti TC Light'))
-mosaicplot(res_table, color=T, shade = T, border=0, off = 3,
- main="Theft rate of Taipei city (region by hour)")
+# par(family=('STKaiti'))
+par(family=('Heiti TC Light'))
+mosaicplot(res_table, color=T, shade = T, border=0, off = 3,
+ main="Theft rate of Taipei city (region by hour)")
![](R12_tptheft_base_files/figure-html/unnamed-chunk-19-1.png)
diff --git a/dataframe.html b/dataframe.html
index 440c58b..26df62d 100644
--- a/dataframe.html
+++ b/dataframe.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -790,23 +796,23 @@ 4.1.1 產生新的Dataframe
4.1.1.1 建立資料並Assign給vector
用以下ChatGPT問句來產生測試資料「我現在正在準備R的教學範例, 請協助我產生台北市所有行政區的資料,包含行政區名、面積、人口數 分別指給town, area, population三個變數」。
-town = c("松山區", "信義區", "大安區", "中山區", "中正區", "大同區", "萬華區", "文山區", "南港區", "內湖區", "士林區", "北投區")
-
-area = c(9.2878, 11.2077, 11.3614, 13.6821, 7.6071, 5.6815, 8.8522, 31.5090, 21.8424, 31.5787, 62.3682, 56.8216) # 單位:平方公里
-
-population = c(206375, 225561, 309835, 203276, 159608, 132397, 194160, 275207, 122103, 287726, 288324, 255688) # 2023年的估計值
+town = c("松山區", "信義區", "大安區", "中山區", "中正區", "大同區", "萬華區", "文山區", "南港區", "內湖區", "士林區", "北投區")
+
+area = c(9.2878, 11.2077, 11.3614, 13.6821, 7.6071, 5.6815, 8.8522, 31.5090, 21.8424, 31.5787, 62.3682, 56.8216) # 單位:平方公里
+
+population = c(206375, 225561, 309835, 203276, 159608, 132397, 194160, 275207, 122103, 287726, 288324, 255688) # 2023年的估計值
4.1.1.2 合併等長vector為dataframe
-
+
## 'data.frame': 6 obs. of 4 variables:
## $ town : chr "中正" "大同" "中山" "松山" ...
## $ population: num 158228 126687 228075 204903 308383 ...
## $ area : num 7.61 5.68 13.68 9.29 11.36 ...
## $ density : num 20800 22298 16670 22062 27143 ...
-
+
## town population area density
## Length:6 Min. :126687 Min. : 5.681 Min. :16670
## Class :character 1st Qu.:165651 1st Qu.: 7.918 1st Qu.:20907
@@ -814,37 +820,37 @@ 4.1.1.2 合併等長vector為data
## Mean :202366 Mean : 9.412 Mean :21700
## 3rd Qu.:222282 3rd Qu.:10.843 3rd Qu.:22239
## Max. :308383 Max. :13.682 Max. :27143
-
+
4.1.1.3 存放台灣貿易各國進出口量
- 運用國際貿易署貿易統計系統 (trade.gov.tw)獲取臺灣進出口貿易資料。
-country <- c("CN", "US", "JP", "HK", "KR", "SG", "DE", "MY", "VN", "PH", "TH", "AU", "NL", "SA", "ID", "GB", "IN", "FR", "IT", "AE")
-
-import <- c(26.142, 12.008, 7.032, 13.646, 4.589, 5.768, 2.131, 2.802, 3.428, 3.019, 1.976, 1.118, 1.624, 0.449, 0.983, 1.302, 1.027, 0.553, 0.670, 0.455)
-
-export <- c(22.987, 12.204, 11.837, 7.739, 5.381, 4.610, 2.866, 2.784, 2.414, 2.092, 1.839, 1.788, 1.665, 1.409, 1.391, 1.075, 0.974, 0.899, 0.800, 0.728)
+country <- c("CN", "US", "JP", "HK", "KR", "SG", "DE", "MY", "VN", "PH", "TH", "AU", "NL", "SA", "ID", "GB", "IN", "FR", "IT", "AE")
+
+import <- c(26.142, 12.008, 7.032, 13.646, 4.589, 5.768, 2.131, 2.802, 3.428, 3.019, 1.976, 1.118, 1.624, 0.449, 0.983, 1.302, 1.027, 0.553, 0.670, 0.455)
+
+export <- c(22.987, 12.204, 11.837, 7.739, 5.381, 4.610, 2.866, 2.784, 2.414, 2.092, 1.839, 1.788, 1.665, 1.409, 1.391, 1.075, 0.974, 0.899, 0.800, 0.728)
4.1.1.4 合併vector為data.frame
當我們讀取或創建資料框架時,過去R預設會將字符串類型的變數轉換為因子(Factors),這對於統計分析而言是有益的,因為統計分析經常將文字型態的數據視為類別變數來處理。然而,隨著資料科學領域的快速發展,需要處理大量文字數據的情況日益增多,這時將文字資料預設為因子型態可能不再適合所有情境。因此,現在R的預設的處理方式已經改變,預設將文字型態的變數保持為字符型態(Character),而不是自動將其轉換為因子。這意味著,當我們使用read.csv
等函數讀取數據時,除非明確指定,否則讀入的字符串不會自動轉換為Factors型態。
如果你在進行統計分析時希望將文字型態的變數作為類別變數(即因子)處理,你需要手動設定stringsAsFactors
參數為TRUE
。這可以在讀取數據時(如使用read.csv
函數)或在數據處理過程中明確進行轉換。例如,當使用read.csv
讀取CSV文件時,若想將所有的字符串變數自動轉為因子型態,可以這樣做:df <- read.csv("your_file.csv", stringsAsFactors = TRUE)
。若已經讀取數據且數據框架中的文字型態變數仍為Character型態,而你希望將其轉換為Factors,可以使用factor
函數進行轉換:df$your_column <- factor(df$your_column)
。
-
+
## 'data.frame': 20 obs. of 3 variables:
## $ country: Factor w/ 20 levels "AE","AU","CN",..: 3 19 11 7 12 17 4 13 20 15 ...
## $ import : num 26.14 12.01 7.03 13.65 4.59 ...
## $ export : num 22.99 12.2 11.84 7.74 5.38 ...
-
+
## 'data.frame': 20 obs. of 3 variables:
## $ country: chr "CN" "US" "JP" "HK" ...
## $ import : num 26.14 12.01 7.03 13.65 4.59 ...
## $ export : num 22.99 12.2 11.84 7.74 5.38 ...
其他功能:建立一個新且空的data.frame
。
-
+
@@ -857,8 +863,8 @@ 4.1.2 觀察dataframe# View(df)
-head(df) # get first part of the data.frame
+
## country import export
## 1 CN 26.142 22.987
## 2 US 12.008 12.204
@@ -866,14 +872,14 @@ 4.1.2 觀察dataframeclass(df)
+
## [1] "data.frame"
-
+
## 'data.frame': 20 obs. of 3 variables:
## $ country: chr "CN" "US" "JP" "HK" ...
## $ import : num 26.14 12.01 7.03 13.65 4.59 ...
## $ export : num 22.99 12.2 11.84 7.74 5.38 ...
-
+
## country import export
## Length:20 Min. : 0.449 Min. : 0.728
## Class :character 1st Qu.: 1.016 1st Qu.: 1.312
@@ -881,18 +887,18 @@ 4.1.2 觀察dataframe# look up help
-help(summary)
-?summary
+
@@ -906,13 +912,13 @@ 4.1.3.1 取出一個變項df$發生時段
顯示該變數內容
length(df$發生時段)
顯示該變數的長度(相當於有幾個)
-
+
## [1] "country" "import" "export"
-
+
## [1] 22.987 12.204 11.837 7.739 5.381 4.610
-
+
## [1] 20
-
+
## country import export
## Length:20 Min. : 0.449 Min. : 0.728
## Class :character 1st Qu.: 1.016 1st Qu.: 1.312
@@ -927,7 +933,7 @@ 4.1.3.2 (mutate)透過運算產
這裡容易犯錯的是,要記得跟程式講說你要加總或四則運算的是哪個df的variable。
從下面的這個操作中,該data.frame會產生一個新的變數sub
,這就相當於Excel中的某一行減去某一行,然後把資料放在新的一行。
-
+
4.1.3.3 (filter)篩選資料、選取變數
@@ -937,7 +943,7 @@ 4.1.3.3 (filter)篩選資料、
下面的例子nrow(df)
為1894,有1894筆資料,所以自然df\(import與df\)export的長度都是1894。因此,比較這兩個變數的大小會得到一個長度為1894的boolean (logical) variable。因此把這個長度為1894、充滿TRUE和FALSE的logical vector丟進df的row之處,因為取自df,大小判斷式結果的長度自然和原本的df的列數相同。因此當這個TRUE/FALSE被丟在df的列之處,便會篩選出import
大於p.xport
的數值。
原本的df有五個variable,而上述的操作是篩選資料,所以被篩選的是列,因此行的數量、名稱都不會變。因此,我篩選完後,直接存取這個被篩選過的data.frame的country variable,自然是可以的。
-
+
## country import export sub
## 1 CN 26.142 22.987 3.155
## 2 US 12.008 12.204 -0.196
@@ -959,12 +965,12 @@ 4.1.3.3 (filter)篩選資料、
## 18 FR 0.553 0.899 -0.346
## 19 IT 0.670 0.800 -0.130
## 20 AE 0.455 0.728 -0.273
-
+
## [1] "country" "import" "export" "sub"
-
+
## [1] 20
-
+
## country import export sub
## 1 CN 26.142 22.987 3.155
## 4 HK 13.646 7.739 5.907
@@ -975,18 +981,18 @@ 4.1.3.3 (filter)篩選資料、
## 11 TH 1.976 1.839 0.137
## 16 GB 1.302 1.075 0.227
## 17 IN 1.027 0.974 0.053
-
+
## [1] "CN" "HK" "SG" "MY" "VN" "PH" "TH" "GB" "IN"
-
+
## [1] "CN" "HK" "SG" "MY" "VN" "PH" "TH" "GB" "IN"
-
+
## [1] "character"
-
+
## [1] "character"
-
+
## [1] "data.frame"
-
+
## [1] "numeric"
@@ -994,17 +1000,17 @@ 4.1.3.4 (arrange) 按某個變數
df.sorted <- df[order(df$import),]
會使得整個df照import
的大小排序重新做排列。因為order(df$import)
會把資料照指定順序排列後的位置傳回來,所以把他丟給df
的列的位置,便會使得df
的資料照指定的順序排列。 預設是由小到大,加上decreasing = T
這個參數後變成由大而小。
-# sort rows by df$import column
-df.sorted <- df[order(df$import),]
-# View(df.sorted)
-
-# sort rows in decreasing order
-df.sorted <- df[order(df$import, decreasing = T),]
-
-# add - to column in order() can sort in decreasing order
-df.sorted <- df[order(-df$import),]
-
-head(df.sorted)
+# sort rows by df$import column
+df.sorted <- df[order(df$import),]
+# View(df.sorted)
+
+# sort rows in decreasing order
+df.sorted <- df[order(df$import, decreasing = T),]
+
+# add - to column in order() can sort in decreasing order
+df.sorted <- df[order(-df$import),]
+
+head(df.sorted)
## country import export sub
## 1 CN 26.142 22.987 3.155
## 4 HK 13.646 7.739 5.907
@@ -1020,14 +1026,14 @@ 4.2 簡易繪圖# plot(df) # raise error, 1st column is a character vector
-plot(df[, 2:3])
+
![](R04_dataframe_files/figure-html/unnamed-chunk-13-1.png)
-plot(df[1:10, 2:3])
-text(import, export, labels=country, cex= 0.5, pos=3)
-lines(1:25, 1:25, col='red')
+plot(df[1:10, 2:3])
+text(import, export, labels=country, cex= 0.5, pos=3)
+lines(1:25, 1:25, col='red')
![](R04_dataframe_files/figure-html/unnamed-chunk-13-2.png)
-
+
## Help on topic 'plot' was found in the following packages:
##
## Package Library
@@ -1041,10 +1047,10 @@ 4.2 簡易繪圖4.3 延伸學習
4.3.1 使用dplyr
-library(dplyr)
-df <- data.frame(country, import, export, stringsAsFactors = F)
-df <- mutate(df, sub = import - export)
-filter(df, import > export)
+library(dplyr)
+df <- data.frame(country, import, export, stringsAsFactors = F)
+df <- mutate(df, sub = import - export)
+filter(df, import > export)
## country import export sub
## 1 CN 26.142 22.987 3.155
## 2 HK 13.646 7.739 5.907
@@ -1055,7 +1061,7 @@ 4.3.1 使用dplyrselect(df, c(1, 3))
+
## country export
## 1 CN 22.987
## 2 US 12.204
@@ -1077,23 +1083,23 @@ 4.3.1 使用dplyrmessage(df$country)
-print(df$country)
+
## [1] "CN" "US" "JP" "HK" "KR" "SG" "DE" "MY" "VN" "PH" "TH" "AU" "NL" "SA" "ID"
## [16] "GB" "IN" "FR" "IT" "AE"
4.3.2 比較tibble, data_frame, data.frame
警告: "data_frame()" was deprecated in tibble 1.1.0. Please use "tibble()" instead.
-
-## [1] "data.frame"
-
@@ -1107,22 +1113,22 @@ 4.4 Paid Maternity Leave4.4.1 Reading .xlsx by readxl package
在進行產假支薪調查數據的分析與視覺化時,我們從該調查網站上所下載的資料是一個Excel文件。由於R語言本身不直接支援讀取Excel格式的文件,我們必須依靠外部的套件來實現這一功能,如readxl
套件。它是專門設計來讀取.xls
和.xlsx
格式文件的強大工具。readxl
套件是tidyverse
套件集的一部分。tidyverse
是一組旨在數據科學和數據處理領域提供便利的R套件集合,包括了ggplot2
、dplyr
、tidyr
等多個流行的套件。如果你之前已經安裝了tidyverse
,那麼readxl
套件應該也已經安裝在你的系統上,無需進行重複安裝。
然而,即便readxl
已經安裝,它並不會隨著tidyverse
套件集的其他部分自動加載到R的執行環境中。這意味著,在你打算使用readxl
套件來讀取Excel文件之前,需要先手動執行library(readxl)
命令來加載它。
-
+
這段程式碼使用read_excel()
函式從data
資料夾中的WORLD-MACHE_Gender_6.8.15.xls
檔案中的Sheet1
工作表讀取資料。其中col_names=T
為該函式的參數,表示第一列為欄位名稱。讀取後的資料會被Assign給變數df
。
-
+
4.4.2 Previewing data by View()
, class()
, dim()
, str()
, summary()
and names()
-
+
## [1] "tbl_df" "tbl" "data.frame"
-
+
## [1] 197 156
-
+
## [1] "country" "iso2" "iso3"
## [4] "region" "wb_econ" "matleave_95"
## [7] "matleave_96" "matleave_97" "matleave_98"
@@ -1179,15 +1185,15 @@ 4.4.2 Previewing data by Vi
4.4.3 Select variables
由於所需要的資料為第三欄的變數iso3
(為國家代碼)和第六至24欄的matleave95
~matleave13
共29年的資料,所以需要在df[ , ]
中選出這幾欄。只要把所要取的欄以vector的型態放在df[row,col]
之col
的位置,便可以選出所要的欄。
-# Select the 3rd and 6th to 24th columns
-matleave <- df[ , c(3, 6:24)]
-
-# Use class(), dim(), and str() to inspect the data
-class(matleave)
+# Select the 3rd and 6th to 24th columns
+matleave <- df[ , c(3, 6:24)]
+
+# Use class(), dim(), and str() to inspect the data
+class(matleave)
## [1] "tbl_df" "tbl" "data.frame"
-
+
## [1] 197 20
-
+
## tibble [197 × 20] (S3: tbl_df/tbl/data.frame)
## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ...
## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ...
@@ -1218,8 +1224,8 @@ 4.4.4 Check & Replace NAs在某些情況下,你可能會想要以某個特定值來取代NA
值,以避免在繪圖或進行其他數據分析時產生錯誤。例如,你可以選擇以0來取代所有的NA
值,這可以通過v[is.na(v)] <- 0
來實現。這樣,所有原本為NA
的資料格都會被賦予0值。
此外,sum(is.na(v))
這個表達式可以用來檢測向量v
中還有多少NA
值。這個函數的運作機制是計算所有is.na(v)
為TRUE
的情況,即所有NA
值的總數。如果這個結果不是0,那麼就表示在向量或dataframe中還存在NA
值。這對於確保數據清理工作已經完成,並且數據集準備好進行分析是非常有用的。
-
+
## iso3 matleave_95 matleave_96 matleave_97 matleave_98 matleave_99
## [1,] FALSE FALSE FALSE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE FALSE FALSE FALSE
@@ -1304,14 +1310,14 @@ 4.4.4 Check & Replace NAs
-# Assign 0 to those NA data
-matleave[is.na(matleave)] <- 0
-
-# anyNA() to check if there are still NA cells.
-anyNA(matleave)
+# Assign 0 to those NA data
+matleave[is.na(matleave)] <- 0
+
+# anyNA() to check if there are still NA cells.
+anyNA(matleave)
## [1] FALSE
-
+
## [1] 0
@@ -1319,26 +1325,26 @@ 4.4.5 Filtering data
4.4.5.1 Filtered by the last year value
matleave[matleave$'matleave_13'==5, ]
中的第一個matleave
表示要篩選的資料集,中括號中的matleave$'matleave_13'==5
是篩選條件,表示將篩選matleave
資料集中的matleave_13
變數值等於5
的列;中括號中的逗號後方未有欄位名稱表示將保留所有欄位(變項),僅篩選出符合條件的列,並將篩選後所產生的dataframe指給變數m5
。
-# Use logical comparison to see if the last year equals to 5
-# Assign matching data to var m5
-m5 <- matleave[matleave$'matleave_13'==5, ]
-
-# nrow() to count matching data
-nrow(m5)
+# Use logical comparison to see if the last year equals to 5
+# Assign matching data to var m5
+m5 <- matleave[matleave$'matleave_13'==5, ]
+
+# nrow() to count matching data
+nrow(m5)
## [1] 34
-
+
4.4.5.2 Filtered data by the first year value
接下來我們再做一次篩選,從m5
中篩選出matleave_95
這個欄位為5
的資料,並指給m55
;同時也從m5
中篩選出matleave_95
這個欄位不為5
的資料,並指給m05
。m5
、m55
和m05
無特殊含義,只是變數名稱而已。
-
+
@@ -1351,32 +1357,32 @@ 4.4.6 Plotting
4.4.6.1 Plotting one row (one country)
-# barplot() the second row of m55
-# barplot(m55[2, ]) # raise error
-
-# barplot() the second row when neglecting the first column
-# barplot(m55[2, -1]) # raise error
-
-# Take a look at the data type of matleave[2, ]
-class(matleave[2, -1])
+# barplot() the second row of m55
+# barplot(m55[2, ]) # raise error
+
+# barplot() the second row when neglecting the first column
+# barplot(m55[2, -1]) # raise error
+
+# Take a look at the data type of matleave[2, ]
+class(matleave[2, -1])
## [1] "tbl_df" "tbl" "data.frame"
-
+
## [1] "numeric"
-# unlist() to convert a single row data.frame to a vector for barplot()
-barplot(unlist(m55[2, -1]))
+# unlist() to convert a single row data.frame to a vector for barplot()
+barplot(unlist(m55[2, -1]))
![](R11_paid_maternal_files/figure-html/unnamed-chunk-7-1.png)
Testing
-# View(matleave[1]) # select the 1st variable
-# View(matleave[ ,1]) # select the 1st column
-# View(matleave[1, ]) # select the 1st row
-
-class(m55[1]) # "tbl_df" "tbl" "data.frame"
+# View(matleave[1]) # select the 1st variable
+# View(matleave[ ,1]) # select the 1st column
+# View(matleave[1, ]) # select the 1st row
+
+class(m55[1]) # "tbl_df" "tbl" "data.frame"
## [1] "tbl_df" "tbl" "data.frame"
-
+
## [1] "tbl_df" "tbl" "data.frame"
-
+
## [1] "tbl_df" "tbl" "data.frame"
-
+
## [1] "character"
@@ -1390,44 +1396,44 @@ 4.4.6.2 More arguments (args)xaxt="n"
: 不顯示x軸的標籤。
yaxt="n"
: 不顯示y軸的標籤。
-
+
![](R11_paid_maternal_files/figure-html/unnamed-chunk-9-1.png)
-# use ?barplot to know more argument of the function.
-?barplot
-
-# Add arguments ylim, space, border, and axat/yaxt one by one to barplot()
-barplot(unlist(m55[2, -1]), ylim=c(0, 5))
+# use ?barplot to know more argument of the function.
+?barplot
+
+# Add arguments ylim, space, border, and axat/yaxt one by one to barplot()
+barplot(unlist(m55[2, -1]), ylim=c(0, 5))
![](R11_paid_maternal_files/figure-html/unnamed-chunk-9-2.png)
-
+
![](R11_paid_maternal_files/figure-html/unnamed-chunk-9-3.png)
-
+
![](R11_paid_maternal_files/figure-html/unnamed-chunk-9-4.png)
-
+
![](R11_paid_maternal_files/figure-html/unnamed-chunk-9-5.png)
4.4.6.3 Plotting multiple lines
我們已經成功繪製了一個國家的資料,接下來我們要繪出所有國家的資料。以m55
這個篩選後的資料為例,我分別要繪製出第1列至第6列的國家。底下可以看見每一行非常相似且一致的特徵,僅有matleave
內的索引由1被列出至6。對於這種重複的程式碼,最好的方法是用迴圈(for-loop)的方式將相同的程式碼,從1~6之間做六次。
-# plot the first row
-barplot(unlist(m55[1, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
-
-# plot the second to 6th rows
-barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+# plot the first row
+barplot(unlist(m55[1, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+
+# plot the second to 6th rows
+barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
![](R11_paid_maternal_files/figure-html/unnamed-chunk-10-1.png)
-barplot(unlist(m55[3, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
-barplot(unlist(m55[4, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
-barplot(unlist(m55[5, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
-barplot(unlist(m55[6, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+barplot(unlist(m55[3, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+barplot(unlist(m55[4, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+barplot(unlist(m55[5, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+barplot(unlist(m55[6, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
4.4.6.4 for-loop to plot multiple lines
這段R語言程式碼使用for-loop來重複執行一個指定的程式區塊,將m55
資料集的前六行資料分別繪製成長條圖。在這段程式碼中,變數i
控制了for-loop的迭代次數,它從1到6依次取值,然後依次執行所指定的程式區塊。
一般的for-loop的結構如下:for (variable in sequence) {# code block to be executed}
。其中,變數variable
是用來控制for-loop的迭代次數的,它會從序列sequence
中逐一取出元素,並將其賦值給變數variable
,然後執行大括號{...}
中所指定的程式區塊。
-# use for loop and use i as index to barplot multiple subgraphs
-for(i in 1:6){
- barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
-}
+# use for loop and use i as index to barplot multiple subgraphs
+for(i in 1:6){
+ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+}
![](R11_paid_maternal_files/figure-html/unnamed-chunk-11-1.png)
![](R11_paid_maternal_files/figure-html/unnamed-chunk-11-2.png)
@@ -1442,43 +1448,43 @@ 4.4.6.5 Subplots# use ?par to get more plotting parameters
-?par
-
-# use par() to set-up the layout of subgraphs
-# use the parameter main=c(0.2, 0.2, 0.2, 0.2) to thrink the padding of figures.
-par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2))
-for(i in 1:6){
- barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
-}
+# use ?par to get more plotting parameters
+?par
+
+# use par() to set-up the layout of subgraphs
+# use the parameter main=c(0.2, 0.2, 0.2, 0.2) to thrink the padding of figures.
+par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2))
+for(i in 1:6){
+ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+}
![](R11_paid_maternal_files/figure-html/unnamed-chunk-12-1.png)
接下來我們用相同的for-loop
來繪製10張子圖(十個國家)看看。會發現mfrow=c(3,2)
可以容納六張子圖,多餘六張子圖時,會繪製至下一張。
-# plot more rows to see what happens
-par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2))
-for(i in 1:10){
- barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
-}
+# plot more rows to see what happens
+par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2))
+for(i in 1:10){
+ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n")
+}
![](R11_paid_maternal_files/figure-html/pml-plot-test-1.png)
-
+
![](R11_paid_maternal_files/figure-html/pml-plot-test-2.png)
最後,我用nrow(m55)
來取得m55
這個data.frame
共有多少個國家,然後,我讓for-loop
從1:nrow(m55)
相當於繪製完所有m55
中的子圖。注意我已經修改了mfrow
為mfrow=c(4, 6)
。
-
+
## [1] 18
-# use par() to set-up plotting parameters.
-par(mfrow=c(4, 6), mai= c(0.2, 0.2, 0.2, 0.2))
-
-# use for-loop to plot all graph as subgraph
-for (i in 1:nrow(m55)){
- barplot(unlist(m55[i, -1]), border=NA, space=0, xaxt="n", yaxt="n", ylim = c(0,5))
-}
+# use par() to set-up plotting parameters.
+par(mfrow=c(4, 6), mai= c(0.2, 0.2, 0.2, 0.2))
+
+# use for-loop to plot all graph as subgraph
+for (i in 1:nrow(m55)){
+ barplot(unlist(m55[i, -1]), border=NA, space=0, xaxt="n", yaxt="n", ylim = c(0,5))
+}
![](R11_paid_maternal_files/figure-html/plot-m55-1.png)
在每個子圖上,我要加上每個國家的國別代碼iso3
,也就是m55
的第一行,我用同樣的i來掃過每一列,繪製完barplot()
後,便用title()
函式來繪製文字。結果如下。注意我的設定title(m55[i,1], line = -4, cex.main=3)
。line
為繪製文字的基線,而cex.main
是字型大小。
-par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2))
-for (i in 1:nrow(m55)){
- barplot(unlist(m55[i, -1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5))
- title(m55[i,1], line = -4, cex.main=3)
-}
+par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2))
+for (i in 1:nrow(m55)){
+ barplot(unlist(m55[i, -1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5))
+ title(m55[i,1], line = -4, cex.main=3)
+}
![](R11_paid_maternal_files/figure-html/plot-caption-1.png)
@@ -1489,46 +1495,46 @@ 4.4.7 Practice. Plotting more請繪製m04
的資料,也就是matleave_95!=4
但matleave_13==4
的資料。
請繪製m44
的資料,也就是matleave_95==4
但matleave_13==4
的資料。
-
+
4.4.8 Practice. Selecting and filtering by dplyr I
請嘗試問問ChatGPT,如果將以下程式碼改為dplyr的寫法,要怎麼寫。
-df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T)
-
-# select columns by index
-# matleave <- df[ , c(3, 6:24)]
-
-# select all NA cells and assign 0 to them
-# matleave[is.na(matleave)] <- 0
-
-# filter rows by condition
-# m5 <- matleave[matleave$'matleave_13' == 5, ]
-
-# filter rows by condition
-# m55<- m5[m5$'matleave_95' == 5,]
-
-# plot
-par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2))
-for (i in c(1:nrow(m55))){
- barplot(unlist(m55[i,-1]),
- border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5))
- title(m55[i,1], line = -4, cex.main=3)
-}
+df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T)
+
+# select columns by index
+# matleave <- df[ , c(3, 6:24)]
+
+# select all NA cells and assign 0 to them
+# matleave[is.na(matleave)] <- 0
+
+# filter rows by condition
+# m5 <- matleave[matleave$'matleave_13' == 5, ]
+
+# filter rows by condition
+# m55<- m5[m5$'matleave_95' == 5,]
+
+# plot
+par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2))
+for (i in c(1:nrow(m55))){
+ barplot(unlist(m55[i,-1]),
+ border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5))
+ title(m55[i,1], line = -4, cex.main=3)
+}
![](R11_paid_maternal_files/figure-html/unnamed-chunk-14-1.png)
4.4.9 (More) Clean version
-# readxl::read_excel() to import the xls file
-df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T)
-
-# select iso3, and matleave columns by index
-matleave <- df[ , c(3, 6:24)]
-
-# str() to inspect the data structure of
-str(matleave)
+# readxl::read_excel() to import the xls file
+df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T)
+
+# select iso3, and matleave columns by index
+matleave <- df[ , c(3, 6:24)]
+
+# str() to inspect the data structure of
+str(matleave)
## tibble [197 × 20] (S3: tbl_df/tbl/data.frame)
## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ...
## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ...
@@ -1550,30 +1556,30 @@ 4.4.9 (More) Clean version
-# select all NA cells and assign 0 to them
-matleave[is.na(matleave)] <- 0
-
-# filter rows by condition
-m5 <- matleave[matleave$'matleave_13' == 5, ]
-
-# filter rows by condition
-m55<- m5[m5$'matleave_95' == 5,]
-
-# plot
-par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2))
-for (i in c(1:nrow(m55))){
- barplot(unlist(m55[i,-1]),
- border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5))
- title(m55[i,1], line = -4, cex.main=3)
-}
+# select all NA cells and assign 0 to them
+matleave[is.na(matleave)] <- 0
+
+# filter rows by condition
+m5 <- matleave[matleave$'matleave_13' == 5, ]
+
+# filter rows by condition
+m55<- m5[m5$'matleave_95' == 5,]
+
+# plot
+par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2))
+for (i in c(1:nrow(m55))){
+ barplot(unlist(m55[i,-1]),
+ border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5))
+ title(m55[i,1], line = -4, cex.main=3)
+}
![](R11_paid_maternal_files/figure-html/unnamed-chunk-15-1.png)
4.4.10 (More) The fittest version to compute staySame
-
+
diff --git a/distribution-histogram-density.html b/distribution-histogram-density.html
index b8639af..9b3ea65 100644
--- a/distribution-histogram-density.html
+++ b/distribution-histogram-density.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -794,53 +800,53 @@ Chapter 25 DISTRIBUTION: Histogra
註:本節的設計概念不少是參考 Claus O. Wilke 所著的「Foundations of Data Visualization」一書的章節,同時也參考臺灣和資料新聞的案例進行了改編。
接下來我們將使用Histogram和Density Plot這兩種資料視覺化方法來探索台灣村里長的年齡和性別分布情況。我們所使用的資料來源包括內政部和中選會的投票資料,這些資料能夠提供具有代表性的統計樣本,幫助我們更好地了解村里長的整體特徵。在進行資料視覺化的過程中,我們將會運用R語言中的ggplot2套件,並根據不同的視覺化需求進行相應的設置和調整。 https://www.moi.gov.tw/LocalOfficial.aspx?n=577&TYP=KND0007。
-
+
25.1 Density plot
密度圖(Density Plot)是一種展示數據集分佈情況的圖表,它可以幫助我們更好地理解數據集中數值出現的概率。圖表的 X 軸代表數據集的數值範圍,Y 軸則代表每個數值的出現概率。與直方圖不同,密度圖的曲線是光滑的,因為它是通過連續的數值範圍估算出的概率密度函數。通過比較不同數據集的密度圖,我們可以更好地了解它們之間的差異。在ggplot2中,可以用geom_density()
函數來創建密度圖。
-p1 <- vilmaster %>%
- ggplot() + aes(年齡) +
- geom_density() + th
-
-p2 <- vilmaster %>%
- ggplot() + aes(年齡, fill=factor(性別)) +
- geom_density(alpha=0.5) + th +
- scale_fill_manual(
- limits=c('1', '2'), # original chart group
- values=c("gold", "skyblue"), # map to color
- name="性別", # legend title
- breaks=c(1, 2), # original legend group labels
- labels=c("Male","Female"), # map to new labels
- na.value = "lightgrey" # color for other groups
- )
-
-cowplot::plot_grid(
- p1, p2,
- labels = c("(a) Overall", "(b) Group by gender"),
- nrow = 1, rel_widths = c(1, 1)
-)
+p1 <- vilmaster %>%
+ ggplot() + aes(年齡) +
+ geom_density() + th
+
+p2 <- vilmaster %>%
+ ggplot() + aes(年齡, fill=factor(性別)) +
+ geom_density(alpha=0.5) + th +
+ scale_fill_manual(
+ limits=c('1', '2'), # original chart group
+ values=c("gold", "skyblue"), # map to color
+ name="性別", # legend title
+ breaks=c(1, 2), # original legend group labels
+ labels=c("Male","Female"), # map to new labels
+ na.value = "lightgrey" # color for other groups
+ )
+
+cowplot::plot_grid(
+ p1, p2,
+ labels = c("(a) Overall", "(b) Group by gender"),
+ nrow = 1, rel_widths = c(1, 1)
+)
![](V04_Distribution_files/figure-html/Fig.v1.geom_density-1.png)
25.1.1 Density with different bandwidth
參數bw
指的是bnadwidth,為繪製histogram時的bar所涵蓋的資料寬度。以step-plot來說,bw
越大,則梯距越寬;以density-plot來說,若bw越大則越是平滑。
-library(ggridges) # for geom_density_line()
-p.b05 <- vilmaster %>% ggplot() + aes(年齡) +
- geom_density_line(fill='gold', bw=0.5, kernel='gaussian') + th
-
-p.b1 <- vilmaster %>% ggplot() + aes(年齡) +
- geom_density_line(fill='gold', bw=1, kernel='gaussian') + th
-
-p.b5 <- vilmaster %>% ggplot() + aes(年齡) +
- geom_density_line(fill='gold', bw=5, kernel='gaussian') + th
-
-p.rect <- vilmaster %>% ggplot() + aes(年齡) +
- geom_density_line(fill='gold', bw=10, kernel='rectangular') + th
-
-cowplot::plot_grid( p.b05, p.b1, p.b5, p.rect,
- labels = c("(a) bw=.5", "(b) bw=1", "(c) bw=2", "(b) rect"),
- nrow = 2, rel_widths = c(1, 1)
-)
+library(ggridges) # for geom_density_line()
+p.b05 <- vilmaster %>% ggplot() + aes(年齡) +
+ geom_density_line(fill='gold', bw=0.5, kernel='gaussian') + th
+
+p.b1 <- vilmaster %>% ggplot() + aes(年齡) +
+ geom_density_line(fill='gold', bw=1, kernel='gaussian') + th
+
+p.b5 <- vilmaster %>% ggplot() + aes(年齡) +
+ geom_density_line(fill='gold', bw=5, kernel='gaussian') + th
+
+p.rect <- vilmaster %>% ggplot() + aes(年齡) +
+ geom_density_line(fill='gold', bw=10, kernel='rectangular') + th
+
+cowplot::plot_grid( p.b05, p.b1, p.b5, p.rect,
+ labels = c("(a) bw=.5", "(b) bw=1", "(c) bw=2", "(b) rect"),
+ nrow = 2, rel_widths = c(1, 1)
+)
![](V04_Distribution_files/figure-html/Fig.v1.geom_density_line-1.png)
@@ -849,77 +855,77 @@ 25.2 Histogram
25.2.1 Histogram with different number of bins
-p10 <- vilmaster %>%
- ggplot() + aes(年齡) +
- geom_histogram(bins=10, fill='royalblue') + th
-
-p20 <- vilmaster %>%
- ggplot() + aes(年齡) +
- geom_histogram(bins=20, fill='royalblue') + th
-
-p30 <- vilmaster %>%
- ggplot() + aes(年齡) +
- geom_histogram(bins=30, fill='royalblue') + th
-
-p40 <- vilmaster %>%
- ggplot() + aes(年齡) +
- geom_histogram(bins=40, fill='royalblue') + th
-
-cowplot::plot_grid(
- p10, p20, p30, p40,
- labels = c("(a) bins=10", "(b) bins=20", "(c) bins=30", "(b) bins=40"),
- nrow = 2, rel_widths = c(1, 1)
-)
+p10 <- vilmaster %>%
+ ggplot() + aes(年齡) +
+ geom_histogram(bins=10, fill='royalblue') + th
+
+p20 <- vilmaster %>%
+ ggplot() + aes(年齡) +
+ geom_histogram(bins=20, fill='royalblue') + th
+
+p30 <- vilmaster %>%
+ ggplot() + aes(年齡) +
+ geom_histogram(bins=30, fill='royalblue') + th
+
+p40 <- vilmaster %>%
+ ggplot() + aes(年齡) +
+ geom_histogram(bins=40, fill='royalblue') + th
+
+cowplot::plot_grid(
+ p10, p20, p30, p40,
+ labels = c("(a) bins=10", "(b) bins=20", "(c) bins=30", "(b) bins=40"),
+ nrow = 2, rel_widths = c(1, 1)
+)
![](V04_Distribution_files/figure-html/Fig.v1.geom_histogram-1.png)
25.2.2 Density vs histogram
Histogram通常用來顯示數據的分佈情況,它會把數據區間分成若干個等寬的區間,然後計算每個區間內數據的頻率,再將這些頻率表示在y軸上。因此,histogram顯示的是數據的頻率,而不是數據的密度。
Density plot則是用來顯示數據的概率密度函數,它會通過核密度估計(Kernel Density Estimation, KDE)方法,將數據點周圍的密度估計出來,然後將這些估計值表示在y軸上。因此,density plot顯示的是數據的密度,而不是數據的頻率。
-pd <- vilmaster %>%
- ggplot() + aes(年齡, fill=factor(性別)) +
- geom_density(alpha=0.5) + th +
- scale_fill_manual(
- values=c("1"='gold', '2'="skyblue"),
- labels=c('1'="Male",'2'="Female"),
- name='Sex'
- )
-
-ph <- vilmaster %>%
- ggplot() + aes(年齡, fill=factor(性別)) +
- geom_histogram(bins=20, position="dodge") + th +
- scale_fill_manual(values=c("1"='gold', '2'="skyblue ")) +
- theme(legend.position="none")
-
-cowplot::plot_grid(
- pd, ph,
- labels = c("(a) geom_density()", "(b) geom_histogram()"),
- nrow = 1, rel_widths = c(6, 4)
-)
+pd <- vilmaster %>%
+ ggplot() + aes(年齡, fill=factor(性別)) +
+ geom_density(alpha=0.5) + th +
+ scale_fill_manual(
+ values=c("1"='gold', '2'="skyblue"),
+ labels=c('1'="Male",'2'="Female"),
+ name='Sex'
+ )
+
+ph <- vilmaster %>%
+ ggplot() + aes(年齡, fill=factor(性別)) +
+ geom_histogram(bins=20, position="dodge") + th +
+ scale_fill_manual(values=c("1"='gold', '2'="skyblue ")) +
+ theme(legend.position="none")
+
+cowplot::plot_grid(
+ pd, ph,
+ labels = c("(a) geom_density()", "(b) geom_histogram()"),
+ nrow = 1, rel_widths = c(6, 4)
+)
![](V04_Distribution_files/figure-html/unnamed-chunk-3-1.png)
25.2.3 Positions of bar chart
-p.hist.dodge <- vilmaster %>%
- ggplot() + aes(年齡, fill=factor(性別)) +
- geom_histogram(bins=20, position="dodge") + th +
- scale_fill_manual(
- values=c("1"='gold', '2'="skyblue "),
- labels=c('1'="Male",'2'="Female"),
- name='Sex'
- )
-
-p.hist.stack <- vilmaster %>%
- ggplot() + aes(年齡, fill=factor(性別)) +
- geom_histogram(bins=20, position="stack") + th +
- scale_fill_manual(values=c("1"='gold', '2'="skyblue ")) +
- theme(legend.position="none")
-
-cowplot::plot_grid(
- p.hist.dodge, p.hist.stack,
- labels = c("(a) position:dodge", "(b) position:stack"),
- nrow = 1, rel_widths = c(6, 4)
-)
+p.hist.dodge <- vilmaster %>%
+ ggplot() + aes(年齡, fill=factor(性別)) +
+ geom_histogram(bins=20, position="dodge") + th +
+ scale_fill_manual(
+ values=c("1"='gold', '2'="skyblue "),
+ labels=c('1'="Male",'2'="Female"),
+ name='Sex'
+ )
+
+p.hist.stack <- vilmaster %>%
+ ggplot() + aes(年齡, fill=factor(性別)) +
+ geom_histogram(bins=20, position="stack") + th +
+ scale_fill_manual(values=c("1"='gold', '2'="skyblue ")) +
+ theme(legend.position="none")
+
+cowplot::plot_grid(
+ p.hist.dodge, p.hist.stack,
+ labels = c("(a) position:dodge", "(b) position:stack"),
+ nrow = 1, rel_widths = c(6, 4)
+)
![](V04_Distribution_files/figure-html/Fig.v1.hist.style-1.png)
@@ -930,15 +936,15 @@ 25.2.4 Display two groups histogr
scale_fill_manual()
用於手動設置填充顏色, values=c("1"='gold', '2'="skyblue")
表示性別為1時填充金色,性別為2時填充天藍色。 labels=c('1'="Male",'2'="Female")
表示將性別1標記為Male,性別2標記為Female。 name='Sex'
表示設置顏色圖例的標題為Sex
。
facet_wrap(.~性別, nrow=1)
表示將不同性別的數據分開顯示,每直行顯示一個性別。.~性別
表示將數據按性別分組。
-vilmaster %>%
- ggplot() + aes(年齡, fill=factor(性別)) +
- geom_histogram(bins=20, position="dodge") + th +
- scale_fill_manual(
- values=c("1"='gold', '2'="skyblue "),
- labels=c('1'="Male",'2'="Female"),
- name='Sex'
- ) +
- facet_wrap(.~性別, nrow=1)
+vilmaster %>%
+ ggplot() + aes(年齡, fill=factor(性別)) +
+ geom_histogram(bins=20, position="dodge") + th +
+ scale_fill_manual(
+ values=c("1"='gold', '2'="skyblue "),
+ labels=c('1'="Male",'2'="Female"),
+ name='Sex'
+ ) +
+ facet_wrap(.~性別, nrow=1)
![](V04_Distribution_files/figure-html/Fig.v1.hist.facet-1.png)
@@ -947,22 +953,22 @@ 25.3 Pyramid Plot
25.3.1 Modify geom_col() to pyramid plot
-vilmaster %>%
- group_by(性別) %>%
- mutate(age_group = cut(年齡, 0:20*5+.01)) %>%
- count(age_group) %>%
- ungroup() %>%
- ggplot() + aes(x=age_group,
- y=ifelse(性別=='1', -1, 1)*n,
- fill=factor(性別)) +
- geom_col() +
- scale_y_continuous(name = "Count", breaks = 250*(-6:2), labels = c("1500", "1250", "1000", "750", "500", "250", "0", "250", "500")) +
- coord_flip() +
- scale_fill_manual(
- values=c("1"='gold', '2'="skyblue "),
- labels=c('1'="Male",'2'="Female"),
- name='Sex'
- ) + th + labs(y="Count", x="Age Group")
+vilmaster %>%
+ group_by(性別) %>%
+ mutate(age_group = cut(年齡, 0:20*5+.01)) %>%
+ count(age_group) %>%
+ ungroup() %>%
+ ggplot() + aes(x=age_group,
+ y=ifelse(性別=='1', -1, 1)*n,
+ fill=factor(性別)) +
+ geom_col() +
+ scale_y_continuous(name = "Count", breaks = 250*(-6:2), labels = c("1500", "1250", "1000", "750", "500", "250", "0", "250", "500")) +
+ coord_flip() +
+ scale_fill_manual(
+ values=c("1"='gold', '2'="skyblue "),
+ labels=c('1'="Male",'2'="Female"),
+ name='Sex'
+ ) + th + labs(y="Count", x="Age Group")
![](V04_Distribution_files/figure-html/Fig.v1.hist.pyramid-1.png)
@@ -973,9 +979,9 @@ 25.4 Box plot: Muitiple Distrubut
25.4.1 TW-Salary (boxplot)
Inspired by Six Myths About Choosing a College Major - The New York Times (nytimes.com) and What’s Going On in This Graph? | Jan. 9, 2018 - The New York Times (nytimes.com)
![](https://lh5.googleusercontent.com/sl38jyzhqytJUX60SZypH6ZcmoOyGCDk0-6lk3oOS-YxyXJpRgioK_iF5Y8ZkjESzkuFXPbl6k5qovTuHaJhX-_KdH1sHGWl9nJFy3ixt5sryeEhXmiRfEhrjZjvZi50RtKKTm7UceUL)
-
+
@@ -1206,78 +1212,78 @@ 25.4.1 TW-Salary (boxplot)
-raw %>%
- slice(-(1:12)) %>%
- mutate(Category = reorder(Category, desc(Median))) %>%
- ggplot() + aes(y = Category,
- xlower=Q1, xmiddle=Median, xupper=Q3, xmin=0, xmax=150) +
- geom_boxplot(stat = "identity", color="white", fill="skyblue") +
- geom_point(aes(x = Mean)) +
- th +
- theme(panel.grid.minor = element_blank(),
- panel.grid.major = element_blank())
+raw %>%
+ slice(-(1:12)) %>%
+ mutate(Category = reorder(Category, desc(Median))) %>%
+ ggplot() + aes(y = Category,
+ xlower=Q1, xmiddle=Median, xupper=Q3, xmin=0, xmax=150) +
+ geom_boxplot(stat = "identity", color="white", fill="skyblue") +
+ geom_point(aes(x = Mean)) +
+ th +
+ theme(panel.grid.minor = element_blank(),
+ panel.grid.major = element_blank())
![](V04_Distribution_files/figure-html/plot-salary-dist-1.png)
25.4.2 TW-Income (boxplot)
本案例用BoxPlot來呈現某個行政區(鄉鎮市區)各村里的所得中位數、平均數、四分位數的分佈。如果在箱型圖中,平均數高於第三分位數,這代表數據集呈現右偏分佈。也就是說,數據中的大部分觀測值都分佈在第一、二分位數之間,但存在一些較大的極端值,使平均值被往右偏移。從這樣的分佈中可以察覺某些里因為有少數極端高收入住戶,而使得平均高於四分位數。
-library(gghighlight)
-toplot <- read_csv("data/tw_income_107.csv", ) %>%
- filter(!`村里` %in% c("合計", "其他", "福住里")) %>%
- filter(鄉鎮市區 %in% c("信義區")) %>%
- mutate(村里 = reorder(村里, desc(中位數)))
-
-toplot %>%
- mutate(group = if_else((平均數>第三分位數), "highlight", "none")) %>%
- ggplot() + aes(y = 村里,
- xlower=第一分位數, xmiddle=中位數, xupper=第三分位數,
- xmin= min(第一分位數), xmax=max(第三分位數), fill=group) +
- geom_boxplot(stat = "identity", color="white") +
- scale_fill_manual(values = c("highlight"="orangered", "none"="skyblue")) + guides(fill=FALSE) +
- geom_point(aes(x = 平均數)) +
- xlab("年所得(單位:千元)") +
- th +
- theme(panel.grid.minor = element_blank(),
- panel.grid.major = element_blank())
+library(gghighlight)
+toplot <- read_csv("data/tw_income_107.csv", ) %>%
+ filter(!`村里` %in% c("合計", "其他", "福住里")) %>%
+ filter(鄉鎮市區 %in% c("信義區")) %>%
+ mutate(村里 = reorder(村里, desc(中位數)))
+
+toplot %>%
+ mutate(group = if_else((平均數>第三分位數), "highlight", "none")) %>%
+ ggplot() + aes(y = 村里,
+ xlower=第一分位數, xmiddle=中位數, xupper=第三分位數,
+ xmin= min(第一分位數), xmax=max(第三分位數), fill=group) +
+ geom_boxplot(stat = "identity", color="white") +
+ scale_fill_manual(values = c("highlight"="orangered", "none"="skyblue")) + guides(fill=FALSE) +
+ geom_point(aes(x = 平均數)) +
+ xlab("年所得(單位:千元)") +
+ th +
+ theme(panel.grid.minor = element_blank(),
+ panel.grid.major = element_blank())
![](V04_Distribution_files/figure-html/plot-box-plot-1.png)
25.5 Likert plot
-raw <- read_rds("data/tfc_survey.rds")
-dt <- raw %>%
- mutate(QA3_lv = ordered(QA3,
- levels=c("20-24", "25-29", "30-34", "35-39",
- "40-44", "45-49", "50-54", "55-59",
- "60-64", "65-69", "70及以上"),
- labels = c("青年", "青年", "壯年", "壯年",
- "壯年", "中年", "中年", "中年",
- "中年", "老年", "老年"))) %>%
- mutate(Q7 = ordered(Q7, levels=c("一點也不會", "不會", "會", "絕對會"))) %>%
- mutate(Q8 = ordered(Q8, levels=c("一點也不會", "不會", "會", "絕對會")))
+raw <- read_rds("data/tfc_survey.rds")
+dt <- raw %>%
+ mutate(QA3_lv = ordered(QA3,
+ levels=c("20-24", "25-29", "30-34", "35-39",
+ "40-44", "45-49", "50-54", "55-59",
+ "60-64", "65-69", "70及以上"),
+ labels = c("青年", "青年", "壯年", "壯年",
+ "壯年", "中年", "中年", "中年",
+ "中年", "老年", "老年"))) %>%
+ mutate(Q7 = ordered(Q7, levels=c("一點也不會", "不會", "會", "絕對會"))) %>%
+ mutate(Q8 = ordered(Q8, levels=c("一點也不會", "不會", "會", "絕對會")))
25.5.1 Stacked or dodged bar
要比較不同年齡層在某個題項的填答結果時,最常見的是用Stacked或Dodged長條圖。Stacked是便於看到各組的總數大小但難以比較各組之間回應的比例,而Dodged是便於比較各組之間每個項目的比例,而不容易觀察總數大小。但這兩種呈現方法,以上面這個例子來說,從視覺化上均難以閱讀出來,哪個年齡層的填答比較靠近「會或絕對會」,又哪個年齡層比較靠近「絕對不會或不會」。
這時候我們可以用一種繪製方法來表達這類Likert問卷的結果,這種圖表稱為Likert Plot(Graph)。
-p1 <- dt %>%
- count(QA3_lv, Q7) %>%
- ggplot() +
- aes(QA3_lv, n, fill=Q7) +
- geom_col(position = position_stack(reverse = TRUE)) +
- coord_flip() + th
-
-p2 <- dt %>%
- count(QA3_lv, Q7) %>%
- ggplot() +
- aes(QA3_lv, n, fill=Q7) +
- geom_col(position="dodge") +
- th
-
-cowplot::plot_grid(
- p1, NULL, p2,
- labels = c("(a) Stacked", "", "(b) Dodged"),
- ncol = 1, rel_heights = c(1, 0.1, 1)
-)
+p1 <- dt %>%
+ count(QA3_lv, Q7) %>%
+ ggplot() +
+ aes(QA3_lv, n, fill=Q7) +
+ geom_col(position = position_stack(reverse = TRUE)) +
+ coord_flip() + th
+
+p2 <- dt %>%
+ count(QA3_lv, Q7) %>%
+ ggplot() +
+ aes(QA3_lv, n, fill=Q7) +
+ geom_col(position="dodge") +
+ th
+
+cowplot::plot_grid(
+ p1, NULL, p2,
+ labels = c("(a) Stacked", "", "(b) Dodged"),
+ ncol = 1, rel_heights = c(1, 0.1, 1)
+)
![](V04_Distribution_files/figure-html/unnamed-chunk-5-1.png)
@@ -1288,46 +1294,46 @@ 25.5.2 Likert GraphPlot Likert-type items with `gglikert()` • ggstats (larmarange.github.io))的說明,但也可以用geom_segment()
來自己刻。
用geom_segment()
時在aes()
多了幾個參數,為該資料在X軸的起始點與終點(x
, xend
)與Y軸的起始點與終點(y
, yend
)。要自己運算。
-color <- c("#9393C6", "#A8A8A8","#FFA166", "#FF6200")
-dt %>%
- count(QA3_lv, Q7) %>%
- mutate(y_acc = cumsum(n)) %>%
- group_by(QA3_lv) %>%
- mutate(y_end = y_acc - min(y_acc) - n[[2]]) %>%
- mutate(y_start = y_end - n) %>%
- ungroup() %>%
- ggplot() +
- aes(x = QA3_lv, xend = QA3_lv, y = y_start, yend = y_end, , color=Q7) +
- geom_segment(linewidth = 18) +
- coord_flip() + theme_bw() +
- scale_color_manual("",
- labels = c("一點也不會", "不會", "會", "絕對會"),
- values = color, guide = "legend") +
- th
+color <- c("#9393C6", "#A8A8A8","#FFA166", "#FF6200")
+dt %>%
+ count(QA3_lv, Q7) %>%
+ mutate(y_acc = cumsum(n)) %>%
+ group_by(QA3_lv) %>%
+ mutate(y_end = y_acc - min(y_acc) - n[[2]]) %>%
+ mutate(y_start = y_end - n) %>%
+ ungroup() %>%
+ ggplot() +
+ aes(x = QA3_lv, xend = QA3_lv, y = y_start, yend = y_end, , color=Q7) +
+ geom_segment(linewidth = 18) +
+ coord_flip() + theme_bw() +
+ scale_color_manual("",
+ labels = c("一點也不會", "不會", "會", "絕對會"),
+ values = color, guide = "legend") +
+ th
![](V04_Distribution_files/figure-html/unnamed-chunk-6-1.png)
正確用比例繪製的結果如下。Likert Graph和本節所提到的Pyramid Graph在數位敘事上的效果很類似,都是對應到一般的Stacked或Dodged長條圖不易做組間比較。Pyramid Graph適於做兩組間的數值左右對照,Likert Graph則有助於快速看出不同題項或不同組別間的填答差異。
-library(scales)
-
-dt %>%
- count(QA3_lv, Q7) %>%
- group_by(QA3_lv) %>%
- mutate(perc = n/sum(n)) %>%
- mutate(y_acc = cumsum(perc)) %>%
- mutate(y_end = y_acc - y_acc[[2]]) %>%
- # mutate(y_end = y_acc - perc[[1]] - perc[[2]]) %>%
- # mutate(y_end = y_acc - min(y_acc) - perc[[2]]) %>%
- mutate(y_start = y_end - perc) %>%
- ungroup() %>%
- ggplot() +
- aes(x = QA3_lv, xend = QA3_lv, y = y_start, yend = y_end, , color=Q7) +
- geom_segment(linewidth = 18) +
- scale_y_continuous(labels = percent_format()) +
- coord_flip() +
- scale_color_manual("",
- labels = c("一點也不會", "不會", "會", "絕對會"),
- values = color, guide = "legend") +
- ylab("Perc(%)") + xlab("Age group") +
- th
+library(scales)
+
+dt %>%
+ count(QA3_lv, Q7) %>%
+ group_by(QA3_lv) %>%
+ mutate(perc = n/sum(n)) %>%
+ mutate(y_acc = cumsum(perc)) %>%
+ mutate(y_end = y_acc - y_acc[[2]]) %>%
+ # mutate(y_end = y_acc - perc[[1]] - perc[[2]]) %>%
+ # mutate(y_end = y_acc - min(y_acc) - perc[[2]]) %>%
+ mutate(y_start = y_end - perc) %>%
+ ungroup() %>%
+ ggplot() +
+ aes(x = QA3_lv, xend = QA3_lv, y = y_start, yend = y_end, , color=Q7) +
+ geom_segment(linewidth = 18) +
+ scale_y_continuous(labels = percent_format()) +
+ coord_flip() +
+ scale_color_manual("",
+ labels = c("一點也不會", "不會", "會", "絕對會"),
+ values = color, guide = "legend") +
+ ylab("Perc(%)") + xlab("Age group") +
+ th
![](V04_Distribution_files/figure-html/unnamed-chunk-7-1.png)
diff --git a/geospatial.html b/geospatial.html
index 006e56b..5abaf31 100644
--- a/geospatial.html
+++ b/geospatial.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -796,21 +802,21 @@ Chapter 29 GEOSPATIAL社會經濟資料服務平台 (moi.gov.tw)下載。但也有一些套件內部就包含這些地理空間數據,例如下一節的例子rworldmap套件本身就有世界地圖。或者可以嘗試ggmap或rgooglemap等第三方服務(參考簡介:Map Visualization in R · Data Science and R)
29.1 World Map
-
-rawdata <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T)
-mapdata <- rawdata[,c(3, 6:24)]
+
+rawdata <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T)
+mapdata <- rawdata[,c(3, 6:24)]
29.1.1 Bind data to map data
這段程式碼是在將自己的數據mapdata
與rworldmap
世界地圖數據進行結合。
首先,使用 joinCountryData2Map()
函數,將自己的數據和世界地圖數據按照國家的 ISO3 代碼進行連接,生成一張新的地圖。其中, mapdata
是指世界地圖數據, joinCode
參數指定連接時使用的 ISO3 代碼(亦即你預先知道你自己的資料中有ISO3國家代碼)。 nameJoinColumn
參數則用於指定自己數據中與國家對應的欄位名稱為iso3
。
還有其他的joinCode
如「“ISO2”,“ISO3”,“FIPS”,“NAME”, “UN” = numeric codes」等可參見該套件的說明rworldmap package - RDocumentation。
-# join your data with the world map data
-myMap <- joinCountryData2Map(mapdata, joinCode = "ISO3", nameJoinColumn = "iso3")
+# join your data with the world map data
+myMap <- joinCountryData2Map(mapdata, joinCode = "ISO3", nameJoinColumn = "iso3")
## 196 codes from your data successfully matched countries in the map
## 1 codes from your data failed to match with a country code in the map
## 47 codes from the map weren't represented in your data
-
+
## [1] 2 2 5 2 2 5 NA NA 3 5 5 2 4 3 3 3 5 2 5 5 3 2 3 3 2
## [26] 2 3 4 3 4 3 3 3 3 3 3 3 5 NA 3 5 5 3 5 2 3 2 2 2 3
## [51] 5 2 5 2 NA 4 3 4 3 2 3 4 2 2 4 NA 2 2 2 5 2 5 2 2 4
@@ -825,22 +831,22 @@ 29.1.1 Bind data to map data
29.1.2 Drawing Map
mapCountryData()
函數用於將數據繪製在地圖上。其中, myMap
是已經連接過的世界地圖數據和自己的數據,包含了各國的地理空間信息和相關的數據資訊。 nameColumnToPlot
指定要顯示在地圖上的數據欄位為matleave_13
,也就是 2013 年的產假長度。 catMethod
參數是決定視覺化時的數據分類是類別或連續,categorical
表示將數據分成幾個等級來展示在地圖上。
-
+
![](V21_Geospatial_files/figure-html/unnamed-chunk-5-1.png)
29.1.3 Drawing map by specific colors
-# self-defined colors
-colors <- c("#FF8000", "#A9D0F5", "#58ACFA", "#0080FF", "#084B8A")
-mapCountryData(myMap
- , nameColumnToPlot="matleave_13"
- , catMethod = "categorical"
- , colourPalette = colors
- , addLegend="FALSE"
-)
+# self-defined colors
+colors <- c("#FF8000", "#A9D0F5", "#58ACFA", "#0080FF", "#084B8A")
+mapCountryData(myMap
+ , nameColumnToPlot="matleave_13"
+ , catMethod = "categorical"
+ , colourPalette = colors
+ , addLegend="FALSE"
+)
![](V21_Geospatial_files/figure-html/unnamed-chunk-6-1.png)
@@ -865,21 +871,21 @@ 29.2 Read Spatial Data from SEGIS
- geojson 則是一種基於 JSON 格式的地理圖資檔案格式,內容包含了地理空間範圍和屬性。geojson 的優點是格式簡單、容易理解和易於編輯,支援性也比較好。由於 geojson 使用的是文本格式,因此可以直接在許多文本編輯器中編輯和查看,也可以輕易地轉換成其他格式的地理圖資檔案。
這邊我們所要用的套件是sf
,sf
是一個在 R 環境下進行地理圖資處理和分析的套件,他不僅支援多種檔案格式,包括 shapefile、GeoJSON、KML 等,並且可以直接將這些檔案轉換為 R 中的空間資料框架,方便進行進一步的處理和分析。更方便的特色是在於,它可以用tidyverse的風格來寫作,方便對地理圖資和其他數據進行整合和分析,甚至在使用View()
的時候,把圖資當成一個變項。
-
+
29.2.1 The case: Population and Density of Taipei
這個資料下載自社會經濟資料服務平台 (moi.gov.tw)的
111年9月行政區人口統計_鄉鎮市區_臺北市,實際上內部的資料包含368個鄉鎮的依性別分人口數、家戶數等。
資料變項包含每個區的家戶數(H_CNT
)、總人口數(P_CNT
)、男性人口數(M_CNT
)、女性人口數(F_CNT
)。等一下要計算每平方公里的家戶數或人口數時,你會疑惑為何沒有面積資料。
-sf_tpe <-
- st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/",
- layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>%
- mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>%
- # mutate(across(where(is.double), ~if_else(is.na(.),as.double(0),.))) %>%
- # st_set_crs(3826) %>% st_transform(4326) %>%
- # filter(COUNTY == "臺北市")
- filter(str_detect(COUNTY, "臺北市"))
-
-sf_tpe %>% head()
+sf_tpe <-
+ st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/",
+ layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>%
+ mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>%
+ # mutate(across(where(is.double), ~if_else(is.na(.),as.double(0),.))) %>%
+ # st_set_crs(3826) %>% st_transform(4326) %>%
+ # filter(COUNTY == "臺北市")
+ filter(str_detect(COUNTY, "臺北市"))
+
+sf_tpe %>% head()
## Simple feature collection with 6 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
@@ -900,9 +906,9 @@ 29.2.1 The case: Population and D
## 5 MULTIPOLYGON (((302203.6 27...
## 6 MULTIPOLYGON (((302217.9 27...
試著畫畫看。你會發現它的座標系是一個我們看不懂的數字,而不是想像中的經緯度。
-
+
![](V22_twmap_sf_files/figure-html/unnamed-chunk-4-1.png)
@@ -936,22 +942,22 @@ 29.2.2 Projection 投影的概念
就下載的這個資料來說,他並沒有設定他的投影座標。
-
+
## [1] NA
-
+
## Coordinate Reference System: NA
我們會希望在讀取資料的時候,設定他的投影座標。例如以下的例子是設定為TWD96(3826)然後轉換為全球座標WGS84(4326)。
-sf_tpe <-
- st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/",
- layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>%
- mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>%
- st_set_crs(3826) %>%
- # st_transform(4326) %>%
- filter(str_detect(COUNTY, "臺北市"))
-
-st_crs(sf_tpe)$proj4string
+sf_tpe <-
+ st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/",
+ layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>%
+ mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>%
+ st_set_crs(3826) %>%
+ # st_transform(4326) %>%
+ filter(str_detect(COUNTY, "臺北市"))
+
+st_crs(sf_tpe)$proj4string
## [1] "+proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"
-
+
## Coordinate Reference System:
## User input: EPSG:3826
## wkt:
@@ -993,23 +999,23 @@ 29.2.2 Projection 投影的概念
## AREA["Taiwan, Republic of China - between 120°E and 122°E, onshore and offshore - Taiwan Island."],
## BBOX[20.41,119.99,26.72,122.06]],
## ID["EPSG",3826]]
-
+
![](V22_twmap_sf_files/figure-html/unnamed-chunk-7-1.png)
-sf_tpe %>%
- ggplot() + aes(fill = P_CNT) +
- geom_sf(color = NA) +
- scale_fill_gradient(low = "white", high = "purple")
+sf_tpe %>%
+ ggplot() + aes(fill = P_CNT) +
+ geom_sf(color = NA) +
+ scale_fill_gradient(low = "white", high = "purple")
![](V22_twmap_sf_files/figure-html/unnamed-chunk-8-1.png)
面積資料可以用st_area()
這個函式求得。st_area()
是 R 中一個與地理空間數據相關的函數,用於計算地理多邊形的面積。具體而言,st_area() 函數接受一個 Spatial* 或是 sf 的資料物件,可以計算其包含的每個多邊形的面積,並以相應的單位返回結果。其中 as.double(st_area(.))/1000000
的作用是將地理多邊形的面積從平方公尺轉換為平方公里。因為面積的單位是平方公尺,而人口密度的常用單位是人口數/平方公里,因此需要進行單位換算,將面積轉換為平方公里。
st_area()
函數的計算方式基於多邊形的投影,因此在使用該函數時需要注意地理空間數據的投影選擇和轉換。通常情況下,st_area()
函數可以自動識別多邊形的投影系統,並返回相應的面積值。如果需要在不同的投影系統間進行面積的轉換,則需要使用 st_transform()
函數進行投影變換。
需要注意的是,由於地球是一個球體,因此在計算面積時需要考慮到地球的曲率效應。st_area()
函數默認使用的是橢球面積計算公式(ellipsoidal area formula),可以更準確地計算地理多邊形的面積。如果需要更精確的面積計算結果,也可以使用球面面積計算公式(spherical area formula)或是進行局部的面積校正。
-sf_tpe %>%
- mutate(p_density = P_CNT/(as.double(st_area(.))/1000000)) %>%
- ggplot() + aes(fill = p_density) +
- geom_sf(color = NA) +
- scale_fill_gradient(low = "white", high = "purple")
+sf_tpe %>%
+ mutate(p_density = P_CNT/(as.double(st_area(.))/1000000)) %>%
+ ggplot() + aes(fill = p_density) +
+ geom_sf(color = NA) +
+ scale_fill_gradient(low = "white", high = "purple")
![](V22_twmap_sf_files/figure-html/unnamed-chunk-9-1.png)
@@ -1018,8 +1024,8 @@ 29.3 Town-level: Taipei income有時候我們所希望繪製的資料並非來自SEGIS這類有圖資的平台(例如下面所用的台北各區每人平均所得),那我們就會需要先取得另一份圖資資料(例如下例的鄉鎮市區界圖資),再透過一些索引(Index)來結合這兩方的資料。而下面這個例子,還為了要將鄉鎮市區名稱打在各區的中央,結合了另一份資料,一共結合了三方的資料。
29.3.1 Reading income data
-
+
## # A tibble: 6 × 2
## district income
## <chr> <dbl>
@@ -1033,13 +1039,13 @@ 29.3.1 Reading income data
29.3.2 Read Taipei zip code
等一下我打算把每區的名稱打在各區上,但是我沒有各區的名稱應該打在哪裡的經緯度,恰好Zip Code這份資料裡面有台北市各區的經緯度中心,因此先把它讀進來合併用。
-library(jsonlite)
-
-twzipcode_json <- fromJSON("data/twzipcode.json")[[1]]
-taipei_zipcode <- twzipcode_json %>%
- filter(city == "台北市")
-
-taipei_zipcode %>% head()
+library(jsonlite)
+
+twzipcode_json <- fromJSON("data/twzipcode.json")[[1]]
+taipei_zipcode <- twzipcode_json %>%
+ filter(city == "台北市")
+
+taipei_zipcode %>% head()
## zip_code district city lat lng
## 1 100 中正區 台北市 25.0324 121.520
## 2 103 大同區 台北市 25.0634 121.513
@@ -1047,18 +1053,18 @@ 29.3.2 Read Taipei zip code
-# install.packages("rmapshaper")
-st_read("data/shapefiles/TOWN_MOI_1100415.shp") %>%
- filter(COUNTYNAME == "臺北市") %>%
- # st_transform(3825) %>% #3857
- # rmapshaper::ms_simplify(keep=0.05) %>%
- left_join(taipei_income, by = c("TOWNNAME" = "district")) %>%
- left_join(taipei_zipcode, by= c("TOWNNAME" = "district")) %>%
- ggplot() + aes(fill = income) +
- geom_sf() +
- scale_fill_gradient2(low = "#FF8888", high = "#0000AA",
- midpoint = median(taipei_income$income)) +
- geom_text(aes(x = lng, y = lat, label = TOWNNAME), family = "Heiti TC Light", color = "black", size = 2.5)
+# install.packages("rmapshaper")
+st_read("data/shapefiles/TOWN_MOI_1100415.shp") %>%
+ filter(COUNTYNAME == "臺北市") %>%
+ # st_transform(3825) %>% #3857
+ # rmapshaper::ms_simplify(keep=0.05) %>%
+ left_join(taipei_income, by = c("TOWNNAME" = "district")) %>%
+ left_join(taipei_zipcode, by= c("TOWNNAME" = "district")) %>%
+ ggplot() + aes(fill = income) +
+ geom_sf() +
+ scale_fill_gradient2(low = "#FF8888", high = "#0000AA",
+ midpoint = median(taipei_income$income)) +
+ geom_text(aes(x = lng, y = lat, label = TOWNNAME), family = "Heiti TC Light", color = "black", size = 2.5)
## Reading layer `TOWN_MOI_1100415' from data source
## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/TOWN_MOI_1100415.shp'
## using driver `ESRI Shapefile'
@@ -1075,17 +1081,17 @@ 29.4 Voting map - County level本練習將以2016年總統選舉為例,比較朱立倫、宋楚瑜、蔡英文在不同縣市的得票率,並繪製為地圖。該地圖比較有趣的是,因為台灣的地圖實際上是由很多點連成的,在這麼大的規模如果把全部的點全部繪製上去,會繪製非常久,而讀者也不盡然能夠看清楚這個差別,所以可以降低點的數量。
29.4.1 Loading county-level president voting rate
-
+
29.4.2 sf to load county level shp
https://fidanalytics.co.uk/blog/simplifying-polygons-r
-
+
## Reading layer `COUNTY_MOI_1090820' from data source
## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp'
## using driver `ESRI Shapefile'
@@ -1094,13 +1100,13 @@ 29.4.2 sf to load county level sh
## Dimension: XY
## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528
## Geodetic CRS: TWD97
-
+
29.4.3 Simplfying map polygon
-county_ms_simp <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>%
- # rmapshaper::ms_simplify(county_sf, keep=0.001)
- st_simplify(dTolerance = 100)
+county_ms_simp <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>%
+ # rmapshaper::ms_simplify(county_sf, keep=0.001)
+ st_simplify(dTolerance = 100)
## Reading layer `COUNTY_MOI_1090820' from data source
## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp'
## using driver `ESRI Shapefile'
@@ -1109,14 +1115,14 @@ 29.4.3 Simplfying map polygon
-
+
![](V22_twmap_sf_files/figure-html/unnamed-chunk-15-1.png)
-# install.packages("rmapshaper")
-plot_chu <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>%
- # st_transform(3825) %>% #3857
- st_simplify(dTolerance = 10) %>%
- # rmapshaper::ms_simplify(keep=0.01) %>%
- right_join(president_vote, by=c("COUNTYNAME"="county"))
+# install.packages("rmapshaper")
+plot_chu <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>%
+ # st_transform(3825) %>% #3857
+ st_simplify(dTolerance = 10) %>%
+ # rmapshaper::ms_simplify(keep=0.01) %>%
+ right_join(president_vote, by=c("COUNTYNAME"="county"))
## Reading layer `COUNTY_MOI_1090820' from data source
## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp'
## using driver `ESRI Shapefile'
@@ -1125,10 +1131,10 @@ 29.4.3 Simplfying map polygon
-plot_chu %>%
- ggplot(aes(fill = chu_ratio)) +
- geom_sf(color="white", size=0.2) +
- scale_fill_gradient(low = "#FFFFFF", high = "#0000FF")
+plot_chu %>%
+ ggplot(aes(fill = chu_ratio)) +
+ geom_sf(color="white", size=0.2) +
+ scale_fill_gradient(low = "#FFFFFF", high = "#0000FF")
![](V22_twmap_sf_files/figure-html/unnamed-chunk-16-1.png)
@@ -1149,12 +1155,12 @@ 29.4.4 Practice. Drawing Taiwan c
29.5 Mapping data with grid
-
+
29.5.1 Loading Taiwan map
-TW.island <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>%
- st_transform(3826) %>%
- mutate(id = row_number())
+TW.island <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>%
+ st_transform(3826) %>%
+ mutate(id = row_number())
## Reading layer `COUNTY_MOI_1090820' from data source
## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp'
## using driver `ESRI Shapefile'
@@ -1166,61 +1172,160 @@ 29.5.1 Loading Taiwan map
29.5.2 Building grid
-# Defining grid size
-grid.extent <-
- matrix(c(-50000, 2920000, # (Xmin, Ymax)
- 610000, 2920000, # (Xmax, Ymax)
- 610000, 2420000, # (Xmax, Ymin)
- -50000, 2420000, # (Xmin, Ymin)
- -50000, 2920000), # (Xmin, Ymax)
- byrow = TRUE, ncol = 2) %>%
- list() %>% # convert to list for st_polygon()
- st_polygon() %>% # generate polygon
- st_sfc(crs = 3826) # convert format and crs
-# plot(grid.extent)
-
-
-# Generating grid
-Grid.sys <-
- st_make_grid(grid.extent,
- n = c(132, 100), # Resolution of grids
- crs = 3826, # crs: TWD97 121
- what = 'polygons') %>% # output format: polygon
- st_sf('geometry' = ., data.frame('ID' = 1:length(.))) # convert to sf with id
- # st_transform(3826) # assigning crs again ?
-plot(Grid.sys)
+# Defining grid size
+grid.extent <-
+ matrix(c(-50000, 2920000, # (Xmin, Ymax)
+ 610000, 2920000, # (Xmax, Ymax)
+ 610000, 2420000, # (Xmax, Ymin)
+ -50000, 2420000, # (Xmin, Ymin)
+ -50000, 2920000), # (Xmin, Ymax)
+ byrow = TRUE, ncol = 2) %>%
+ list() %>% # convert to list for st_polygon()
+ st_polygon() %>% # generate polygon
+ st_sfc(crs = 3826) # convert format and crs
+# plot(grid.extent)
+
+
+# Generating grid
+Grid.sys <-
+ st_make_grid(grid.extent,
+ n = c(132, 100), # Resolution of grids
+ crs = 3826, # crs: TWD97 121
+ what = 'polygons') %>% # output format: polygon
+ st_sf('geometry' = ., data.frame('ID' = 1:length(.))) # convert to sf with id
+ # st_transform(3826) # assigning crs again ?
+plot(Grid.sys)
![](V23_map_grid_files/figure-html/unnamed-chunk-4-1.png)
-
+
![](V23_map_grid_files/figure-html/unnamed-chunk-5-1.png)
29.5.3 loading data
-
+
29.5.4 Merging data
-tw_info <- TW.island %>%
- st_set_geometry(NULL) %>%
- left_join(president_vote, by=c("COUNTYNAME"="county"))
-# TW_info <- sf::st_intersects(Grid.TW, TW.island) # creat a data.frame of IDs in IBA for 1km grid
-grid_id <- sapply(st_intersects(Grid.TW, TW.island), function(z) if (length(z)==0) NA_integer_ else z[1])
-
-Grid.TW <- Grid.TW %>%
- mutate(grid_id = grid_id) %>%
- left_join(tw_info, by=c("grid_id"="id"))
-Grid.TW %>%
- ggplot(aes(fill = tsai_ratio)) + geom_sf(lwd = 0.1, color="black") +
- scale_fill_continuous(high="#2EFF71", low="blue") +
- theme_void()
+tw_info <- TW.island %>%
+ st_set_geometry(NULL) %>%
+ left_join(president_vote, by=c("COUNTYNAME"="county"))
+# TW_info <- sf::st_intersects(Grid.TW, TW.island) # creat a data.frame of IDs in IBA for 1km grid
+grid_id <- sapply(st_intersects(Grid.TW, TW.island), function(z) if (length(z)==0) NA_integer_ else z[1])
+
+Grid.TW <- Grid.TW %>%
+ mutate(grid_id = grid_id) %>%
+ left_join(tw_info, by=c("grid_id"="id"))
+Grid.TW %>%
+ ggplot(aes(fill = tsai_ratio)) + geom_sf(lwd = 0.1, color="black") +
+ scale_fill_continuous(high="#2EFF71", low="blue") +
+ theme_void()
![](V23_map_grid_files/figure-html/unnamed-chunk-9-1.png)
+
+
+
+29.6 Mapping Youbike Location
+這個練習的目標是讀取台北市Youbike2.0的站台資料,並繪製點位圖來標記站台滿車或缺車的情形。
+以下這段程式碼是用於從台北市政府提供的YouBike實時數據API取得資料,並將其轉換為R語言中的資料框架(data frame)格式,最後選擇資料框架的前六個變數來展示。步驟如下:
+
+載入httr
和jsonlite
套件:這兩個套件在R中常用於處理HTTP請求和JSON資料。httr
套件用於發送網路請求,而jsonlite
套件則用於解析JSON格式的資料。
+設定URL:將url
變數設為指向台北市政府提供的YouBike實時數據API的網址。
+使用GET
函數發送請求:透過httr
套件的GET
函數向設定的URL發送HTTP GET請求,以取得YouBike的實時數據。
+解析JSON資料:使用jsonlite
套件的fromJSON
函數,將從API獲取到的JSON格式資料解析成R的資料框架。content
函數用於獲取HTTP回傳的內容,並指定內容格式為”text”,編碼方式為”utf-8”,以確保中文等非ASCII字符能正確顯示。
+要注意的欄位名稱包含sna(站台名稱)、tot(總車格數)、sbi(現有車數)與lat-lng的經緯度資料。
+
+library(httr)
+library(jsonlite)
+url <- "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json"
+ubike.df <- fromJSON(content(GET(url),"text", encoding = "utf-8"))
+head(ubike.df) %>% select(1:6)
+## sno sna tot sbi sarea mday
+## 1 500101001 YouBike2.0_捷運科技大樓站 28 1 大安區 2024-03-31 23:09:14
+## 2 500101002 YouBike2.0_復興南路二段273號前 21 1 大安區 2024-03-31 23:02:18
+## 3 500101003 YouBike2.0_國北教大實小東側門 16 14 大安區 2024-03-31 22:26:18
+## 4 500101004 YouBike2.0_和平公園東側 11 11 大安區 2024-03-31 23:01:14
+## 5 500101005 YouBike2.0_辛亥復興路口西北側 16 11 大安區 2024-03-31 22:50:25
+## 6 500101006 YouBike2.0_復興南路二段280號前 11 8 大安區 2024-03-31 22:46:18
+
+29.6.1 Creating a new variable
+
+- 為每個站產生一個
sbi
除以tot
的新變數,來作為ubike站滿不滿的計量單位。
+- 這段程式碼是在前一步的基礎上進一步創建新的
Fullness
欄位。該欄位的值根據 ratio
欄位的數值判斷,若 ratio
大於等於 0.9,則將 Fullness
設置為 “Full”;若 ratio
小於 0.3,則設置為 “Empty”;否則設置為 “Available”。
+
+if_else
函數的用法如下:
+
+
+condition
:一個邏輯向量,用於指定條件判斷。
+true_value
:當 condition
為真時,返回的值。
+false_value
:當 condition
為假時,返回的值。
+
+if_else
函數與 R 原生的 ifelse
函數相似,但有一些重要區別。if_else
函數在處理缺失值時更加嚴格,要求 true_value
和 false_value
具有相同的長度和類型,這有助於避免一些潛在的錯誤。
+
+
+
+29.6.2 Mapping with sf
+library(ggplot2)
+library(sf)
+
+sf_tpe <-
+ st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/",
+ layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>%
+ mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>%
+ mutate(across(where(is.double), ~if_else(is.na(.),as.double(0),.))) %>%
+ st_set_crs(3826) %>% st_transform(4326) %>%
+ filter(COUNTY == "臺北市")
+
+sf_tpe %>% head()
+## Simple feature collection with 6 features and 9 fields
+## Geometry type: MULTIPOLYGON
+## Dimension: XY
+## Bounding box: xmin: 121.5041 ymin: 25.00776 xmax: 121.592 ymax: 25.09241
+## Geodetic CRS: WGS 84
+## TOWN_ID TOWN COUNTY_ID COUNTY H_CNT P_CNT M_CNT F_CNT INFO_TIME
+## 1 63000010 松山區 63000 臺北市 78977 187552 87625 99927 111Y09M
+## 2 63000020 信義區 63000 臺北市 87407 201951 95884 106067 111Y09M
+## 3 63000030 大安區 63000 臺北市 117243 280332 130596 149736 111Y09M
+## 4 63000040 中山區 63000 臺北市 98825 210156 97114 113042 111Y09M
+## 5 63000050 中正區 63000 臺北市 64491 146628 69663 76965 111Y09M
+## 6 63000060 大同區 63000 臺北市 51988 118065 57003 61062 111Y09M
+## geometry
+## 1 MULTIPOLYGON (((121.572 25....
+## 2 MULTIPOLYGON (((121.5727 25...
+## 3 MULTIPOLYGON (((121.541 25....
+## 4 MULTIPOLYGON (((121.5522 25...
+## 5 MULTIPOLYGON (((121.5174 25...
+## 6 MULTIPOLYGON (((121.5176 25...
+library(sf)
+library(ggplot2)
+library(dplyr)
+
+# 你已經有ubike.sf,這是一個sf物件
+ubike.sf <- st_as_sf(ubike.df, coords = c("lng", "lat"), crs = 4326)
+
+# 使用ggplot繪製地圖和位置點,並根據fullness的值上色
+ggplot() +
+ geom_sf(data = sf_tpe) + # 繪製sf_tpe區域
+ geom_sf(data = ubike.sf, aes(color = Fullness, size=tot), alpha=0.3) +
+ scale_color_manual(values = c("Full" = "black", "Empty" = "red", "Available" = "blue")) +
+ theme_void()
+![](V24_PointMap_files/figure-html/unnamed-chunk-5-1.png)
+
+
+29.6.3 Using ggmap (Deprecated)
+
+首先要設定google map的參數,先打開google map,縮放到你等一下希望看到的地圖底圖範圍後,複製新的網址列如https://www.google.com.tw/maps/@25.0353215,121.4916909,12.62z
。這個網址後面的參數包含著經緯度(25.0353215,121.4916909)和地圖的縮放程度(12.62z)。因此你可以把他貼到get_googlemap()
的函式中。除此之外,尚可以指定地圖種類,自行查詢help(maptype can be terrain, roadmap, satellite, hybrid, or toner-lite)。
+接下來要用geom_point()
這個ggplot2
的函式繪製點圖,一共包含四個參數,用data
指定資料集、用aes()
指定x、y軸、用colour
指定顏色、用size
指定圓圈的大小。這邊我用圓圈的大小來表示總車格數,所以是ubike.df$tot
,但如果是原始的tot
數值可能畫起來會太大,這時後就必須要自行反覆嘗試,看看要取log()
或者取sqrt()
或者除以某個數值,好讓畫出來的點為適合觀看的大小。最後我多加了一個參數alpha
讓圈圈半透明。
+
+
diff --git a/ggplot.html b/ggplot.html
index 1660b3c..8330326 100644
--- a/ggplot.html
+++ b/ggplot.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
@@ -799,32 +805,32 @@ 22.1 Essentials of ggplot
22.1.3 (3) geom_???()
指定要繪製的圖表類型。
例如折線圖為為geom_line()
、X/Y散佈圖為geom_point()
、長條圖我多會使用geom_col()
。ggplot繪圖種類除了可以參照前面的ggplot cheat sheet之外,可以詢問ChatGPT有哪些常見的類別,甚至可以請他舉例給你測試該繪圖方法。
-
+
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-4-1.png)
亦可同時繪製兩種類型的圖表於同一張圖上。例如以下同時繪製了geom_line()
與geom_plot()
。
-
+
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-5-1.png)
注意:ggplot是以變數為基礎的視覺化套件,也就是說,當準備好dataframe後,就可以在ggplot中指定要用哪些變數來繪圖。也因此,務必把dataframe整理為tidy型態,也就是長表格(long-form)的型態。整理完資料後,我會習慣地用names(plot)
或glimpse(plot)
來看一下該資料所有的變項,好可以在下一階段的繪圖做參考。
@@ -836,11 +842,11 @@ 22.2 NYT: Inequality22.2.1 (1) Loading data
仔細觀察一下資料,你會怎樣描述這個資料?
這個Dataframe包含三個變數(Category, year, Net_Worth),共66個觀測值。變數「Category」描述的是年齡範圍,包含六個類別(Level)。變數「year」代表年份,從1989年到2019年,以三年為一個週期觀察,共有11個Levels。變數「Net_Worth」則表示在該年齡範圍內的淨資產。從資料可以觀察到,在不同的時間點,不同年齡範圍的人群的財富狀況看似有明顯差異。例如,比較1989年和2019年,45-54歲的年齡組在這段期間內的淨值似乎較35-44歲組要高,這可能反映了隨著年齡增長,個人或家庭的財富累積增加的趨勢。
-NW <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
- select(Category, year, Net_Worth) %>%
- group_by(Category) %>%
- arrange(year) %>%
- ungroup()
+NW <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
+ select(Category, year, Net_Worth) %>%
+ group_by(Category) %>%
+ arrange(year) %>%
+ ungroup()
## Rows: 66 Columns: 37
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
@@ -849,7 +855,7 @@ 22.2.1 (1) Loading dataNW %>% head(12)
+
## # A tibble: 12 × 3
## Category year Net_Worth
## <chr> <dbl> <dbl>
@@ -882,32 +888,32 @@ 22.2.2 (2) Visualizing
22.2.2.1 (2.1) Plot without group
先將year
和Net_worth
分別繪製在X與Y軸上,並用geom_line()
繪製為折線圖。結果圖表中呈現鋸齒狀的折線,看似有問題,但其實是合理的。因為year
是一個離散變數,而我們希望每個年齡層一條線的話,那就要照年齡層來分組。也因此,每一年都有有每個年齡層的資料,當我們把「年」作為X軸時,自然同一年就會有數筆不同年齡層的資料,因此才會是鋸齒狀的。
-
+
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-7-1.png)
不同的圖表類型是可以疊加在同一張圖上的。我們也可以把geom_point()
另一種圖表型態加入,也是可以的,兩者的X與Y不相衝突。geom_line()
、geom_point()
、geom_text()
三者會經常伴隨出現。
-
+
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-8-1.png)
22.2.2.2 (2.2) Grouping
上圖是我們把多個年齡層的逐年資料畫在同一條折線上,所以會呈現鋸齒狀折現的狀況。但這些年齡層並非在同一條線上呀?因此,我們要根據Category
這個變數來做分組。
-NW %>%
- ggplot() +
- aes(x=year, y=Net_Worth, group=Category) +
- geom_line() +
- geom_point(stat="identity")
+NW %>%
+ ggplot() +
+ aes(x=year, y=Net_Worth, group=Category) +
+ geom_line() +
+ geom_point(stat="identity")
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-9-1.png)
如希望不同線條上不一樣的色彩,應指定color=Category
。
-
+
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-10-1.png)
- 用color、fill或group來做分組?
@@ -918,9 +924,9 @@ 22.2.2.2 (2.2) GroupingNW %>%
- ggplot() + aes(year, Net_Worth, color=Category, fill=Category) +
- geom_area(position="dodge", alpha=0.2)
+
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-11-1.png)
@@ -931,10 +937,10 @@ 22.3 Adjusting Chart22.3.1 Type of Points and Lines
下面的例子同時用了geom_line()
和geom_point()
,且分別設定了線寬(size=1
)、點的大小(size=2
),折線型態(linetype="dashed"
)、半透明程度(alpha
)。
ggplot2 line types : How to change line types of a graph in R software? - Easy Guides - Wiki - STHDA
-NW %>%
- ggplot() + aes(year, Net_Worth, color=Category) +
- geom_line(size=1, linetype = "dashed", alpha=0.5) +
- geom_point(size=2, color="dimgrey", alpha=0.5)
+NW %>%
+ ggplot() + aes(year, Net_Worth, color=Category) +
+ geom_line(size=1, linetype = "dashed", alpha=0.5) +
+ geom_point(size=2, color="dimgrey", alpha=0.5)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
@@ -945,87 +951,87 @@ 22.3.1 Type of Points and Lines
22.3.2 Line Types
See more from ggthemes https://github.com/BTJ01/ggthemes/tree/master/inst/examples
-library(ggthemes)
-rescale01 <- function(x) {
- (x - min(x)) / diff(range(x))
- }
-
-gather(economics, variable, value, -date) %>%
- group_by(variable) %>%
- mutate(value = rescale01(value)) %>%
- ggplot(aes(x = date, y = value, linetype = variable)) +
- geom_line() +
- scale_linetype_stata() + theme_minimal()
+library(ggthemes)
+rescale01 <- function(x) {
+ (x - min(x)) / diff(range(x))
+ }
+
+gather(economics, variable, value, -date) %>%
+ group_by(variable) %>%
+ mutate(value = rescale01(value)) %>%
+ ggplot(aes(x = date, y = value, linetype = variable)) +
+ geom_line() +
+ scale_linetype_stata() + theme_minimal()
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-13-1.png)
22.3.3 Title, Labels and Legends
Titles, labels, and legend 設定標題與X/Y軸標題(法一):以下設定了圖表的圖表標題、和X軸與Y軸的軸標題(xlab
與ylab
)。
-NW %>%
- ggplot() + aes(year, Net_Worth, color=Category) +
- geom_line() +
- theme_minimal() +
- xlab("Year") +
- ylab("Net Worth") +
- ggtitle("Net Worth by year grouped by age groups")
-![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-14-1.png)
-設定標題與X/Y軸標題(法二):這是一次設定圖表標題(title
)、次標題(suttitle
)、X軸與Y軸標題的方法。
-NW %>%
- ggplot() + aes(year, Net_Worth, color=Category) +
- geom_line() +
- theme_minimal() +
- labs(title = "Net Worth by year grouped by age groups",
- subtitle = "Source from: ...",
- x = "Year",
- y = "Net Worth")
-![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-15-1.png)
-調整X軸與Y軸標題位置的:必須要透過theme()
來設定axis.title.x = element_text(hjust=1)
。
NW %>%
ggplot() + aes(year, Net_Worth, color=Category) +
geom_line() +
theme_minimal() +
- labs(title = "Net Worth by year grouped by age groups",
- x = "Year",
- y = "Net Worth") +
- theme(axis.title.x = element_text(hjust=1),
- axis.title.y = element_text(hjust=1))
-![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-16-1.png)
-去除X/Y軸標題(不佳):直接將空字串Assign給title
、x
、與y
即可。
+ xlab("Year") +
+ ylab("Net Worth") +
+ ggtitle("Net Worth by year grouped by age groups")
+![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-14-1.png)
+設定標題與X/Y軸標題(法二):這是一次設定圖表標題(title
)、次標題(suttitle
)、X軸與Y軸標題的方法。
NW %>%
ggplot() + aes(year, Net_Worth, color=Category) +
- geom_line() +
+ geom_line() +
theme_minimal() +
- labs(title = "", x = "", y = "")
+ labs(title = "Net Worth by year grouped by age groups",
+ subtitle = "Source from: ...",
+ x = "Year",
+ y = "Net Worth")
+![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-15-1.png)
+調整X軸與Y軸標題位置的:必須要透過theme()
來設定axis.title.x = element_text(hjust=1)
。
+NW %>%
+ ggplot() + aes(year, Net_Worth, color=Category) +
+ geom_line() +
+ theme_minimal() +
+ labs(title = "Net Worth by year grouped by age groups",
+ x = "Year",
+ y = "Net Worth") +
+ theme(axis.title.x = element_text(hjust=1),
+ axis.title.y = element_text(hjust=1))
+![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-16-1.png)
+去除X/Y軸標題(不佳):直接將空字串Assign給title
、x
、與y
即可。
+NW %>%
+ ggplot() + aes(year, Net_Worth, color=Category) +
+ geom_line() +
+ theme_minimal() +
+ labs(title = "", x = "", y = "")
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-17-1.png)
去除X/Y軸標題(較佳):透過設定theme()
來調整。可發現透過這種設定方法,原本標題和X/Y軸標題的邊界空間就會被釋放出來。
-# No extra space for xlab, ylab and title
-NW %>%
- ggplot() + aes(year, Net_Worth, color=Category) +
- geom_line(show.legend = F) +
- theme_minimal() +
- theme(plot.title = element_blank(),
- axis.title.x = element_blank(),
- axis.title.y = element_blank())
+# No extra space for xlab, ylab and title
+NW %>%
+ ggplot() + aes(year, Net_Worth, color=Category) +
+ geom_line(show.legend = F) +
+ theme_minimal() +
+ theme(plot.title = element_blank(),
+ axis.title.x = element_blank(),
+ axis.title.y = element_blank())
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-18-1.png)
22.3.4 Font
調整字型會建議都從theme()
來做調整,所有圖面上看得到的字都有相對應的變數可以調整字型。例如以下的例子中,把標題的字型大小調整為14粗體、X與Y軸的字型則調整了向右對齊、10粗斜體、顏色為dimgrey。
-NW %>%
- ggplot() + aes(year, Net_Worth, color=Category) +
- geom_line() +
- theme_minimal() +
- labs(title = "Net Worth by year grouped by age groups",
- x = "Year",
- y = "Net Worth") +
- theme(plot.title = element_text(size=14, face="bold"),
- axis.title.x = element_text(hjust=1, size=10,
- color="dimgrey",
- face="bold.italic"),
- axis.title.y = element_text(hjust=1, size=10,
- color="dimgrey",
- face="bold.italic")
- )
+NW %>%
+ ggplot() + aes(year, Net_Worth, color=Category) +
+ geom_line() +
+ theme_minimal() +
+ labs(title = "Net Worth by year grouped by age groups",
+ x = "Year",
+ y = "Net Worth") +
+ theme(plot.title = element_text(size=14, face="bold"),
+ axis.title.x = element_text(hjust=1, size=10,
+ color="dimgrey",
+ face="bold.italic"),
+ axis.title.y = element_text(hjust=1, size=10,
+ color="dimgrey",
+ face="bold.italic")
+ )
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-19-1.png)
@@ -1035,48 +1041,48 @@ 22.3.5 Color ThemesModify components of a theme — theme • ggplot2 (tidyverse.org)
bbplot/bbc_style.R at master · bbc/bbplot (github.com)
-
+
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-20-1.png)
22.3.6 Set-up Default Theme
如果希望所有的圖表都有一致的顏色和排版的調性,可以在一開始編輯Rmd的時候就設計好一套theme()
並指給一個變數(例如以下的th
)。
-th <- theme(plot.title = element_text(size=14, face="bold"),
- axis.title.x = element_text(hjust=1, size=10,
- color="dimgrey",
- face="bold.italic"),
- axis.title.y = element_text(hjust=1, size=10,
- color="dimgrey",
- face="bold.italic")
- )
-
-NW %>%
- ggplot() + aes(year, Net_Worth, color=Category) +
- geom_line(linetype = "dashed", alpha=0.5) +
- geom_point(size=2, color="dimgrey", alpha=0.5) +
- theme_minimal() +
- labs(title = "Net Worth by year grouped by age groups",
- x = "Year",
- y = "Net Worth") + th
+th <- theme(plot.title = element_text(size=14, face="bold"),
+ axis.title.x = element_text(hjust=1, size=10,
+ color="dimgrey",
+ face="bold.italic"),
+ axis.title.y = element_text(hjust=1, size=10,
+ color="dimgrey",
+ face="bold.italic")
+ )
+
+NW %>%
+ ggplot() + aes(year, Net_Worth, color=Category) +
+ geom_line(linetype = "dashed", alpha=0.5) +
+ geom_point(size=2, color="dimgrey", alpha=0.5) +
+ theme_minimal() +
+ labs(title = "Net Worth by year grouped by age groups",
+ x = "Year",
+ y = "Net Worth") + th
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-21-1.png)
22.3.7 Show Chinese Text
Python和R這些程式語言的預設視覺化套件都沒辦法顯示中文,所以如果要顯示中文的話,就要指定圖表標題、X、Y軸標籤、圖說和各個部件的字型。因為我在Mac上繪圖,所以我將字型指定為Heiti TC Light。如果想知道自己的電腦上有什麼可以用,可以到電腦的字體簿上查找中文字體名稱,或者上網google「ggplot 中文字型選擇」。
![](images/paste-A259BC75.png)
-county <- read_csv("data/tw_population_opendata110N010.csv") %>%
- slice(-1, -(370:375)) %>%
- type_convert() %>%
- mutate(county = str_sub(site_id, 1, 3)) %>%
- group_by(county) %>%
- summarize(
- area = sum(area),
- people_total = sum(people_total)
- ) %>%
- ungroup()
+county <- read_csv("data/tw_population_opendata110N010.csv") %>%
+ slice(-1, -(370:375)) %>%
+ type_convert() %>%
+ mutate(county = str_sub(site_id, 1, 3)) %>%
+ group_by(county) %>%
+ summarize(
+ area = sum(area),
+ people_total = sum(people_total)
+ ) %>%
+ ungroup()
## Rows: 375 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
@@ -1094,47 +1100,47 @@ 22.3.7 Show Chinese Textcounty %>%
- arrange(desc(people_total)) %>%
- ggplot() + aes(county, people_total) %>%
- geom_col(fill="lightgrey", color="black") +
- theme_minimal() +
- theme(axis.text.x = element_text(family="Heiti TC Light"))
+county %>%
+ arrange(desc(people_total)) %>%
+ ggplot() + aes(county, people_total) %>%
+ geom_col(fill="lightgrey", color="black") +
+ theme_minimal() +
+ theme(axis.text.x = element_text(family="Heiti TC Light"))
![](V01_Learning_ggplot_files/figure-html/barplot-1.png)
舉例來說,中文字型可以是標楷體(BiauKai)、宋體(Songti TC)、黑體(Heiti TC Light)、蘋方(PingFang TC)、Noto(Noto Sans CJK TC)
-th <-
- theme(title = element_text(family="Heiti TC Light"),
- text = element_text(family="Heiti TC Light"),
- axis.text.y = element_text(family="PingFang TC"),
- axis.text.x = element_text(family="Heiti TC Light"),
- legend.text = element_text(family="Heiti TC Light"),
- plot.title = element_text(family="Heiti TC Light")
- )
-county %>%
- ggplot() + aes(county, people_total) %>%
- geom_col(fill="skyblue") +
- theme_minimal() + th +
- theme(axis.text.x = element_text(angle = 45))
+th <-
+ theme(title = element_text(family="Heiti TC Light"),
+ text = element_text(family="Heiti TC Light"),
+ axis.text.y = element_text(family="PingFang TC"),
+ axis.text.x = element_text(family="Heiti TC Light"),
+ legend.text = element_text(family="Heiti TC Light"),
+ plot.title = element_text(family="Heiti TC Light")
+ )
+county %>%
+ ggplot() + aes(county, people_total) %>%
+ geom_col(fill="skyblue") +
+ theme_minimal() + th +
+ theme(axis.text.x = element_text(angle = 45))
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-23-1.png)
22.3.8 X/Y axis
調整圖表方向
-county %>%
- ggplot() + aes(county, people_total) %>%
- geom_col(fill="skyblue") +
- coord_flip() +
- theme_minimal() + th +
- theme(axis.text.x = element_text(angle = 45))
+county %>%
+ ggplot() + aes(county, people_total) %>%
+ geom_col(fill="skyblue") +
+ coord_flip() +
+ theme_minimal() + th +
+ theme(axis.text.x = element_text(angle = 45))
![](V01_Learning_ggplot_files/figure-html/coord_flip()-1.png)
通常coord_flip()
後往往會希望這些bar會是由上而下排序好的,但用arrange(desc(people_total)
是無法解決問題的,因為Y軸原本會是照Y軸的刻度排列,而不是Y軸的數值。所以,要被排序的應該是Y軸的「文字」也就是那些縣市。因此,我們需要將該縣市轉為factor(1~n),並且讓這些縣市被安排的factor數值照people_total
排列,因此要用mutate(county = reorder(county, people_total))
。reorder()
是一個將文字轉factor的函式,但在此特別指定照people_total
的編排。
-county %>%
- # arrange(desc(people_total) %>%
- mutate(county = reorder(county, people_total)) %>%
- ggplot() + aes(county, people_total) %>%
- geom_col(fill="skyblue") +
- coord_flip() +
- theme_minimal() + th
+county %>%
+ # arrange(desc(people_total) %>%
+ mutate(county = reorder(county, people_total)) %>%
+ ggplot() + aes(county, people_total) %>%
+ geom_col(fill="skyblue") +
+ coord_flip() +
+ theme_minimal() + th
![](V01_Learning_ggplot_files/figure-html/coord_flip-with-reorder-1.png)
@@ -1144,42 +1150,42 @@ 22.4 Highlighting & Storytell
22.4.1 依群組指定顏色
scale_color_manual()
與scale_fill_manual()
-NW %>%
- ggplot() + aes(year, Net_Worth, color = Category) +
- geom_line() +
- scale_color_manual(
- limits=c("65-74", "35-44"), # original chart group
- values=c("gold", "skyblue"), # map to color
- name="Age group", # legend title
- breaks=c("65-74", "35-44"), # original legend group labels
- labels=c("elder(65-74)","younger(35-44)"), # map to new labels
- na.value = "lightgrey" # color for other groups
- ) +
- theme_minimal()
+NW %>%
+ ggplot() + aes(year, Net_Worth, color = Category) +
+ geom_line() +
+ scale_color_manual(
+ limits=c("65-74", "35-44"), # original chart group
+ values=c("gold", "skyblue"), # map to color
+ name="Age group", # legend title
+ breaks=c("65-74", "35-44"), # original legend group labels
+ labels=c("elder(65-74)","younger(35-44)"), # map to new labels
+ na.value = "lightgrey" # color for other groups
+ ) +
+ theme_minimal()
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-24-1.png)
22.4.2 使用gghighlight套件
-library(gghighlight)
-NW %>%
- ggplot() + aes(year, Net_Worth, color = Category) +
- geom_line() +
- gghighlight(Category %in% c("65-74", "35-44")) +
- theme_minimal() +
- scale_x_continuous(breaks = NULL) +
- theme(panel.background = element_rect(fill = "whitesmoke",
- colour = "whitesmoke",
- size = 0.5, linetype = "solid"))
+library(gghighlight)
+NW %>%
+ ggplot() + aes(year, Net_Worth, color = Category) +
+ geom_line() +
+ gghighlight(Category %in% c("65-74", "35-44")) +
+ theme_minimal() +
+ scale_x_continuous(breaks = NULL) +
+ theme(panel.background = element_rect(fill = "whitesmoke",
+ colour = "whitesmoke",
+ size = 0.5, linetype = "solid"))
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-25-1.png)
使用gghighlight
仍能自己使用scale_color_manual()
來指定顏色
-NW %>%
- ggplot() + aes(year, Net_Worth, color = Category) +
- geom_line() +
- gghighlight(Category %in% c("65-74", "35-44")) +
- scale_color_manual(
- limits=c("65-74", "35-44"), # original chart group
- values=c("gold", "skyblue")) + # map to color
- theme_minimal()
+NW %>%
+ ggplot() + aes(year, Net_Worth, color = Category) +
+ geom_line() +
+ gghighlight(Category %in% c("65-74", "35-44")) +
+ scale_color_manual(
+ limits=c("65-74", "35-44"), # original chart group
+ values=c("gold", "skyblue")) + # map to color
+ theme_minimal()
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...
## label_key: Category
@@ -1188,25 +1194,25 @@ 22.4.2 使用gghighlight套件
22.4.3 為視覺化建立群組
這個方法是在原本的資料並沒有可以作為color或fill的因子,所以自行創建一個要突顯的群組。
-county %>%
- mutate(group = if_else(county %in% c("新竹縣", "新竹市"), "highlight", "other")) %>%
- mutate(county = reorder(county, people_total)) %>%
- ggplot() + aes(county, people_total, fill=group) %>%
- geom_col() +
- scale_fill_manual(values=c("highlight"="Khaki", "other"="lightgrey")) +
- guides(fill="none") +
- coord_flip() +
- theme_minimal() + th
+county %>%
+ mutate(group = if_else(county %in% c("新竹縣", "新竹市"), "highlight", "other")) %>%
+ mutate(county = reorder(county, people_total)) %>%
+ ggplot() + aes(county, people_total, fill=group) %>%
+ geom_col() +
+ scale_fill_manual(values=c("highlight"="Khaki", "other"="lightgrey")) +
+ guides(fill="none") +
+ coord_flip() +
+ theme_minimal() + th
![](V01_Learning_ggplot_files/figure-html/income-by-town-1.png)
但事實上也可以用gghighlight
直接達成
-county %>%
- mutate(county = reorder(county, people_total)) %>%
- ggplot() + aes(county, people_total) %>%
- geom_col(fill="deeppink") +
- gghighlight(county %in% c("新竹縣", "新竹市")) +
- guides(fill="none") +
- coord_flip() +
- theme_minimal() + th
+county %>%
+ mutate(county = reorder(county, people_total)) %>%
+ ggplot() + aes(county, people_total) %>%
+ geom_col(fill="deeppink") +
+ gghighlight(county %in% c("新竹縣", "新竹市")) +
+ guides(fill="none") +
+ coord_flip() +
+ theme_minimal() + th
![](V01_Learning_ggplot_files/figure-html/unnamed-chunk-27-1.png)
diff --git a/html-parser.html b/html-parser.html
index 0ac257c..b1ef8e8 100644
--- a/html-parser.html
+++ b/html-parser.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
diff --git a/index.html b/index.html
index 2fb6a28..3a7a700 100644
--- a/index.html
+++ b/index.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -784,15 +790,15 @@
R for Data Journalism
-2024-03-24
+2024-03-31
About
這本書是寫給臺大新聞所「新聞資料分析與視覺化」課程使用。該課程並重三個面向的訓練:程式語言、視覺化、資料新聞。學生必須先能夠熟練地使用R語言來操作、讀取、清理、視覺化資料;然後以產製新聞為課程目標,了解資料要如何清理,以及選擇適合的視覺化的方法來強化新聞敘事,並避免視覺化方式引起讀者對新聞的理解謬誤。準此,本書分為幾個部分,包含PART I介紹程式語言基礎;PART II則以國際或國內新聞為個案,來介紹資料獲取(爬蟲)、清理、合併、篩選、轉換;PART III則著重如何用資料視覺化來強化敘事。
本書所沿用的資料分析與視覺化案例均為國內、國外的新聞案例如各國產假支薪等級、居住正義、空氣污染、人口議題、COVID-19、資源區域分佈不均、選舉與公投、運輸交通等相關議題的新聞。並大量採用紐約時報挑選作為數據理解與視覺化推廣的「What’s going on in this graph?」系列新聞,包含美國不同年代各年齡層的淨資產來做視覺化案例。在視覺化教材的設計上,本書大量參考紐時「What’s going on in this graph?」的分類與(Wilke 2019)所著「Fundamentals of Data Visualization」一書的內容安排,強調利用資料視覺化方法來呈現新聞數據中的數量、分佈、比例、趨勢等,並均換用國內或紐時的相關資料新聞案例做範例,以利中文讀者的理解。
學習路徑
-
-
+
+
References
diff --git a/index.md b/index.md
index 6215827..842bb68 100644
--- a/index.md
+++ b/index.md
@@ -1,7 +1,7 @@
---
title: "R for Data Journalism"
author: "HSIEH, JI-LUNG"
-date: "2024-03-24"
+date: "2024-03-31"
site: bookdown::bookdown_site
output: bookdown::gitbook
documentclass: book
@@ -22,6 +22,6 @@ description: "For my Class teaching how to make data news reports"
```{=html}
-
-
+
+
```
diff --git a/inequality-net-worth-by-age-group.html b/inequality-net-worth-by-age-group.html
index 141bdaa..7b3a6d6 100644
--- a/inequality-net-worth-by-age-group.html
+++ b/inequality-net-worth-by-age-group.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -791,12 +797,12 @@ Chapter 33 Inequality: Net Worth
淨資產(Net worth)是一個財務術語,指的是一個人或機構的總資產減去總負債後剩餘的價值。換言之,Net worth是一個人或機構在財務上的價值或實力。如果一個人或機構的總資產超過了總負債,那麼其net worth為正值,反之則為負值。在個人財務上,Net worth通常用來評估一個人的財務健康狀況。一個人的Net worth越高,通常代表其擁有更多的財富和投資,並能夠更好地應對突發事件和生活變數。因此,許多投資者和財務顧問都會建議人們注重提高自己的net worth。
Sorted by arrange()
function.
-p1 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
- select(year, Category, Net_Worth) %>%
- group_by(Category) %>%
- arrange(year) %>%
- ungroup()
-p1 %>% filter(year <= 1992) %>% knitr::kable()
+p1 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
+ select(year, Category, Net_Worth) %>%
+ group_by(Category) %>%
+ arrange(year) %>%
+ ungroup()
+p1 %>% filter(year <= 1992) %>% knitr::kable()
@@ -868,24 +874,24 @@ Chapter 33 Inequality: Net Worth
-library(gghighlight)
-p1 %>% ggplot() + aes(year, Net_Worth, color = Category) +
- geom_line(linetype="dotted") +
- geom_point() +
- gghighlight(Category %in% c("65-74", "35-44")) +
- theme_minimal() +
- scale_x_continuous(breaks = NULL) +
- theme(panel.background = element_rect(fill = "white",
- colour = "white",
- size = 0.5, linetype = "solid"))
+library(gghighlight)
+p1 %>% ggplot() + aes(year, Net_Worth, color = Category) +
+ geom_line(linetype="dotted") +
+ geom_point() +
+ gghighlight(Category %in% c("65-74", "35-44")) +
+ theme_minimal() +
+ scale_x_continuous(breaks = NULL) +
+ theme(panel.background = element_rect(fill = "white",
+ colour = "white",
+ size = 0.5, linetype = "solid"))
![](W3_NetWorth_by_Age_files/figure-html/unnamed-chunk-3-1.png)
-p2 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
- select(year, Category, NW = Net_Worth) %>%
- group_by(Category) %>%
- arrange(year) %>%
- mutate(increase = (NW-first(NW))/first(NW)) %>%
- ungroup()
-p2 %>% filter(year <= 1992) %>% knitr::kable()
+p2 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
+ select(year, Category, NW = Net_Worth) %>%
+ group_by(Category) %>%
+ arrange(year) %>%
+ mutate(increase = (NW-first(NW))/first(NW)) %>%
+ ungroup()
+p2 %>% filter(year <= 1992) %>% knitr::kable()
@@ -970,16 +976,16 @@ Chapter 33 Inequality: Net Worth
-p2 %>% ggplot() + aes(year, increase, color = Category) +
- geom_line(linetype="dotted") +
- geom_point() +
- gghighlight(Category %in% c("65-74", "35-44")) +
- theme_minimal() +
- scale_y_continuous(labels=scales::parse_format()) +
- scale_x_continuous(breaks = NULL) +
- theme(panel.background = element_rect(fill = "white",
- colour = "white",
- size = 0.5, linetype = "solid"))
+p2 %>% ggplot() + aes(year, increase, color = Category) +
+ geom_line(linetype="dotted") +
+ geom_point() +
+ gghighlight(Category %in% c("65-74", "35-44")) +
+ theme_minimal() +
+ scale_y_continuous(labels=scales::parse_format()) +
+ scale_x_continuous(breaks = NULL) +
+ theme(panel.background = element_rect(fill = "white",
+ colour = "white",
+ size = 0.5, linetype = "solid"))
![](W3_NetWorth_by_Age_files/figure-html/unnamed-chunk-5-1.png)
diff --git a/interactivity.html b/interactivity.html
index 6a3f3e3..2826441 100644
--- a/interactivity.html
+++ b/interactivity.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -790,45 +796,45 @@ 31.1 ggplotly
31.1.1 LINE CHART
Line plots with R (plotly.com)
-NW <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
- select(Category, year, Net_Worth) %>%
- group_by(Category) %>%
- arrange(year) %>%
- ungroup()
+NW <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>%
+ select(Category, year, Net_Worth) %>%
+ group_by(Category) %>%
+ arrange(year) %>%
+ ungroup()
如果希望滑鼠在移到折線上時就會有浮出的資訊(tips)顯示該資料點的屬性特徵,可以採用plotly()
這個套件。這個套件原本就是做線上互動圖表的,但他開發了R client讓R的使用者可以很輕易地把ggplot2的結果轉為互動圖表。但這所謂的互動也僅限於滑鼠移過去所浮出的資訊罷了,不過已經能夠達到吸引部分讀者目光、提供訊息的效果。
而plotly的設計非常簡單,就是把ggplot的結果指給一個變數後,然後用ggplotly(NW.plot)
將其轉為plotly即可。但要注意的是,並不是每一個圖都可以順利轉換。例如本節最後一個例子Treemap便無法成功轉換。
設定:原本plotly會帶一個操控列,可以在ggplotly()
指令後加入config()
便可將其隱藏。
-NW.plot <- NW %>%
- ggplot() +
- aes(year, Net_Worth, color=Category) +
- geom_line() +
- theme_minimal() +
- labs(title = "Net Worth by year grouped by age groups",
- x = "Year",
- y = "Net Worth") + th
-
-library(plotly)
-ggplotly(NW.plot) %>%
- config(displayModeBar = FALSE)
+NW.plot <- NW %>%
+ ggplot() +
+ aes(year, Net_Worth, color=Category) +
+ geom_line() +
+ theme_minimal() +
+ labs(title = "Net Worth by year grouped by age groups",
+ x = "Year",
+ y = "Net Worth") + th
+
+library(plotly)
+ggplotly(NW.plot) %>%
+ config(displayModeBar = FALSE)
可以在aes()
設定要帶入圖的變數時,新增一個text
變數,手動設定要呈現的動態呈現方塊。但要注意的是,要多加入一個group=1
才能夠作用(WHY?)。但前例浮出視窗的原始內容所顯示的是原本的變數名稱和值,往往不易觀察。比較好的方式是在下ggplot() + aes()
指令時,在aes()
中指定text
來作為後續浮出視窗內容。指定方法如下。要注意的是,該浮出視窗的語法是HTML,所以如果要改寫浮出視窗內容,要用paste0()
將變數和HTML的標籤給銜接起來。以下例子中的<b>
代表粗體的意思,<br>
則是換行符號。
-NW.plot <- NW %>%
- ggplot() +
- aes(year, Net_Worth,
- color=Category,
- text = paste0("<b>年(X): </b>", year, "<br>",
- "<b>淨資產(Y): </b>", Net_Worth,"<br>",
- "<b>年齡組: </b>", Category),
- group=1) +
- geom_line() +
- theme_minimal() +
- labs(title = "Net Worth by year grouped by age groups",
- x = "Year",
- y = "Net Worth") + th
-
-ggplotly(NW.plot, tooltip = "text") %>%
- config(displayModeBar = FALSE)
+NW.plot <- NW %>%
+ ggplot() +
+ aes(year, Net_Worth,
+ color=Category,
+ text = paste0("<b>年(X): </b>", year, "<br>",
+ "<b>淨資產(Y): </b>", Net_Worth,"<br>",
+ "<b>年齡組: </b>", Category),
+ group=1) +
+ geom_line() +
+ theme_minimal() +
+ labs(title = "Net Worth by year grouped by age groups",
+ x = "Year",
+ y = "Net Worth") + th
+
+ggplotly(NW.plot, tooltip = "text") %>%
+ config(displayModeBar = FALSE)
其他例子中使用ggplotly()
都是直接照前面的方法套用即可。唯獨在Treemap中無法用這樣的方法來做互動的視覺化。想想這也正常,畢竟Treemap是用非ggplot的第三方套件(library(treemapify)
)。
@@ -836,105 +842,105 @@ 31.1.1 LINE CHART
31.1.2 SCATTER
-bw <- read_csv("data/unicef-changing-childhood-data.csv") %>%
- select(country = WP5, age = WP22140, bw = WP22092) %>%
- mutate(country = ordered(country,
- levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17,
- 29, 31, 33, 35, 36, 60, 61, 77,
- 79, 81, 87, 165),
- labels=c("USA", "Morocco", "Lebanon",
- "Indonesia","Bangladesh", "UK",
- "France", "Germany", "Spain",
- "Japan", "India", "Brazil",
- "Nigeria", "Kenya", "Ethiopia",
- "Mali", "Ukraine", "Cameroon",
- "Zimbabwe","Argentina", "Peru"))) %>%
- count(country, age, bw) %>%
- group_by(country, age) %>%
- mutate(perc = n/sum(n)) %>%
- ungroup() %>%
- filter(bw == 1) %>%
- select(country, age, perc) %>%
- spread(age, perc) %>%
- rename(`15-24y` = `1`, `40+y` = `2`)
-bw.p <- bw %>%
- ggplot() + aes(`40+y`, `15-24y`, label = country) +
- geom_point(color = "skyblue", size = 2) +
- xlim(0.2, 0.85) + ylim(0.2, 0.85) +
- geom_text(hjust = -0.1, vjust = -0.5) +
- geom_abline(intercept = 0, slop = 1,
- color="lightgrey", alpha=0.5, linetype="dashed") +
- th +
- theme(aspect.ratio=1)
-
+bw <- read_csv("data/unicef-changing-childhood-data.csv") %>%
+ select(country = WP5, age = WP22140, bw = WP22092) %>%
+ mutate(country = ordered(country,
+ levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17,
+ 29, 31, 33, 35, 36, 60, 61, 77,
+ 79, 81, 87, 165),
+ labels=c("USA", "Morocco", "Lebanon",
+ "Indonesia","Bangladesh", "UK",
+ "France", "Germany", "Spain",
+ "Japan", "India", "Brazil",
+ "Nigeria", "Kenya", "Ethiopia",
+ "Mali", "Ukraine", "Cameroon",
+ "Zimbabwe","Argentina", "Peru"))) %>%
+ count(country, age, bw) %>%
+ group_by(country, age) %>%
+ mutate(perc = n/sum(n)) %>%
+ ungroup() %>%
+ filter(bw == 1) %>%
+ select(country, age, perc) %>%
+ spread(age, perc) %>%
+ rename(`15-24y` = `1`, `40+y` = `2`)
+bw.p <- bw %>%
+ ggplot() + aes(`40+y`, `15-24y`, label = country) +
+ geom_point(color = "skyblue", size = 2) +
+ xlim(0.2, 0.85) + ylim(0.2, 0.85) +
+ geom_text(hjust = -0.1, vjust = -0.5) +
+ geom_abline(intercept = 0, slop = 1,
+ color="lightgrey", alpha=0.5, linetype="dashed") +
+ th +
+ theme(aspect.ratio=1)
+
31.1.3 Barplot
Bar charts with R (plotly.com)
-county <- read_csv("data/tw_population_opendata110N010.csv") %>%
- slice(-1, -(370:375)) %>%
- type_convert() %>%
- mutate(county = str_sub(site_id, 1, 3)) %>%
- group_by(county) %>%
- summarize(
- area = sum(area),
- people_total = sum(people_total)
- ) %>%
- ungroup()
-
-population.p <- county %>%
- mutate(county = reorder(county, people_total)) %>%
- ggplot() + aes(county, people_total) %>%
- geom_col(fill="skyblue") +
- coord_flip() + th
-
+county <- read_csv("data/tw_population_opendata110N010.csv") %>%
+ slice(-1, -(370:375)) %>%
+ type_convert() %>%
+ mutate(county = str_sub(site_id, 1, 3)) %>%
+ group_by(county) %>%
+ summarize(
+ area = sum(area),
+ people_total = sum(people_total)
+ ) %>%
+ ungroup()
+
+population.p <- county %>%
+ mutate(county = reorder(county, people_total)) %>%
+ ggplot() + aes(county, people_total) %>%
+ geom_col(fill="skyblue") +
+ coord_flip() + th
+
31.1.4 Boxplot
Box plots with ggplot2 (plotly.com)
-aqi.toplot <- read_rds("https://github.com/p4css/R4CSS/raw/master/data/AQI_Chaozhou.rds") %>%
- arrange(日期)%>%
- filter(測項=="PM2.5") %>%
- gather("hour", "PM25", 4:28) %>%
- mutate(PM25 = as.numeric(PM25)) %>%
- drop_na() %>%
- mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>%
- filter(month %in% c(11, 12, 1, 2, 3))
-
-aqi.plot <- aqi.toplot %>%
- mutate(year = as.character(year)) %>%
- ggplot() + aes(x=year, y=PM25) +
- geom_boxplot(fill="skyblue", alpha=0.2) +
- ylim(0, 200) +
- coord_flip() +
- theme_minimal()
-
+aqi.toplot <- read_rds("https://github.com/p4css/R4CSS/raw/master/data/AQI_Chaozhou.rds") %>%
+ arrange(日期)%>%
+ filter(測項=="PM2.5") %>%
+ gather("hour", "PM25", 4:28) %>%
+ mutate(PM25 = as.numeric(PM25)) %>%
+ drop_na() %>%
+ mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>%
+ filter(month %in% c(11, 12, 1, 2, 3))
+
+aqi.plot <- aqi.toplot %>%
+ mutate(year = as.character(year)) %>%
+ ggplot() + aes(x=year, y=PM25) +
+ geom_boxplot(fill="skyblue", alpha=0.2) +
+ ylim(0, 200) +
+ coord_flip() +
+ theme_minimal()
+
31.1.5 Treemap (Global Carbon)
其他例子中使用ggplotly()
都是直接照前面的方法套用即可。唯獨在Treemap中無法用這樣的方法來做互動的視覺化。想想這也正常,畢竟Treemap是用非ggplot的第三方套件(library(treemapify)
)。
-totreemap <- read_csv("data/GCB2021v34_MtCO2_flat.csv") %>%
- drop_na(`Total`) %>%
- filter(!Country %in% c("Global", "International Transport")) %>%
- filter(Year==2020) %>%
- arrange(desc(`Total`)) %>%
- mutate(perc = Total/sum(Total)) %>%
- slice(1:20)
-library(treemapify)
-carbon.p <- totreemap %>%
- ggplot() + aes(area = perc, fill=`Per Capita`, label=Country) +
- geom_treemap() +
- geom_treemap_text(color="white",
- place="centre",
- grow=TRUE
- )
-
+totreemap <- read_csv("data/GCB2021v34_MtCO2_flat.csv") %>%
+ drop_na(`Total`) %>%
+ filter(!Country %in% c("Global", "International Transport")) %>%
+ filter(Year==2020) %>%
+ arrange(desc(`Total`)) %>%
+ mutate(perc = Total/sum(Total)) %>%
+ slice(1:20)
+library(treemapify)
+carbon.p <- totreemap %>%
+ ggplot() + aes(area = perc, fill=`Per Capita`, label=Country) +
+ geom_treemap() +
+ geom_treemap_text(color="white",
+ place="centre",
+ grow=TRUE
+ )
+
@@ -943,22 +949,22 @@ 31.2 產製圖表動畫https://gist.github.com/rafapereirabr/0d68f7ccfc3af1680c4c8353cf9ab345
R也有套工具可以產製圖表動畫,概念上就是沿著一條資料維度,把多張圖給疊在一起變成一個gif動畫。本例子即是把產假之薪的範例沿著時間軸做動畫。每個時間點都是當年各國產假支薪給付程度的地圖,但由於有19年的資料,所以可以把年代當成動畫的時間軸。
以下是清理資料的步驟,會彙整出國名、國家代碼(ISO3)、年、和給付等級四個變項。預期利用國名、國家代碼和給付等級就可以畫出每年的圖。然後將年作為動畫的時間軸,便可產生地圖動畫。
-pml <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>%
- select(country, iso3, contains("matleave"), -contains("wrr")) %>%
- gather("year", "degree", 3:21) %>%
- replace_na(list(degree=0)) %>%
- mutate(year2=as.POSIXct(strptime(year, "matleave_%y"))) %>%
- mutate(year3 = strftime(year2, "%Y")) %>%
- select(country, ISO3=iso3, year=year3, degree)
+pml <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>%
+ select(country, iso3, contains("matleave"), -contains("wrr")) %>%
+ gather("year", "degree", 3:21) %>%
+ replace_na(list(degree=0)) %>%
+ mutate(year2=as.POSIXct(strptime(year, "matleave_%y"))) %>%
+ mutate(year3 = strftime(year2, "%Y")) %>%
+ select(country, ISO3=iso3, year=year3, degree)
31.2.1 地圖下載與轉換投影方法
此為下載地圖並處理地圖成為可以用geom_polygom()
繪圖的多邊形資料點。
-library(rworldmap)
-wmap <- getMap(resolution="low")
-wmap <- spTransform(wmap, CRS("+proj=robin")) # reproject
-wmap <- fortify(wmap)
-wmap %>%
- filter(!duplicated(id)) %>% head(10)
+library(rworldmap)
+wmap <- getMap(resolution="low")
+wmap <- spTransform(wmap, CRS("+proj=robin")) # reproject
+wmap <- fortify(wmap)
+wmap %>%
+ filter(!duplicated(id)) %>% head(10)
## long lat order hole piece id
## 1 -6558139.1 1331765.9 1 FALSE 1 Aruba
## 2 6607120.5 3981587.8 1 FALSE 1 Afghanistan
@@ -981,16 +987,16 @@ 31.2.1 地圖下載與轉換投
## 8 United Arab Emirates.1
## 9 Argentina.1
## 10 Armenia.1
-pml_map <- wmap %>%
- left_join(pml, by=c("id"="country")) %>%
- filter(!is.na(ISO3)) %>%
- mutate(year = as.integer(year))
-
-# devtools::install_github("thomasp85/transformr")
-
-pml_map %>%
- select(id) %>%
- filter(!duplicated(.)) %>% head(10)
+pml_map <- wmap %>%
+ left_join(pml, by=c("id"="country")) %>%
+ filter(!is.na(ISO3)) %>%
+ mutate(year = as.integer(year))
+
+# devtools::install_github("thomasp85/transformr")
+
+pml_map %>%
+ select(id) %>%
+ filter(!duplicated(.)) %>% head(10)
## id
## 1 Afghanistan
## 2 Angola
@@ -1005,44 +1011,44 @@ 31.2.1 地圖下載與轉換投
31.2.2 靜態繪圖測試
-pml_map %>%
- filter(year==1995) %>%
- ggplot() +
- aes(x = long, y = lat,
- group=group, fill=factor(degree)) +
- geom_polygon(color="grey") +
- theme_void() +
- scale_fill_manual(values=c("1"="red",
- "2"="LightCyan",
- "3"="lightskyblue",
- "4"="DodgerBlue",
- "5"="MediumBlue")) +
- coord_cartesian(xlim = c(-11807982, 14807978))
+pml_map %>%
+ filter(year==1995) %>%
+ ggplot() +
+ aes(x = long, y = lat,
+ group=group, fill=factor(degree)) +
+ geom_polygon(color="grey") +
+ theme_void() +
+ scale_fill_manual(values=c("1"="red",
+ "2"="LightCyan",
+ "3"="lightskyblue",
+ "4"="DodgerBlue",
+ "5"="MediumBlue")) +
+ coord_cartesian(xlim = c(-11807982, 14807978))
![](V43_gganimate_files/figure-html/ani-plot-testing-1.png)
在採用gganimate繪圖時,僅需要多加一個動畫繪圖函式+ transition_time(year)
即可,其他繪圖部分並無修改。最後才用animate()
函式把這整個繪圖指令轉製為動畫,包含指定fps
(frame per second)和長寬等參數。
-library(gganimate)
-pml.ani <- pml_map %>%
- ggplot() +
- aes(x = long, y = lat,
- group=group, fill=factor(degree)) +
- geom_polygon(color="grey") +
- theme_void() +
- scale_fill_manual(values=c("1"="red",
- "2"="LightCyan",
- "3"="lightskyblue",
- "4"="DodgerBlue",
- "5"="MediumBlue")) +
- coord_cartesian(xlim = c(-11807982, 14807978)) +
- transition_time(year)
-# +
-# ease_aes("linear") +
-# enter_fade() +
-# exit_fade()
-
-animate(pml.ani, fps = 10, end_pause = 30, width = 750, height = 450, renderer = gifski_renderer())
+library(gganimate)
+pml.ani <- pml_map %>%
+ ggplot() +
+ aes(x = long, y = lat,
+ group=group, fill=factor(degree)) +
+ geom_polygon(color="grey") +
+ theme_void() +
+ scale_fill_manual(values=c("1"="red",
+ "2"="LightCyan",
+ "3"="lightskyblue",
+ "4"="DodgerBlue",
+ "5"="MediumBlue")) +
+ coord_cartesian(xlim = c(-11807982, 14807978)) +
+ transition_time(year)
+# +
+# ease_aes("linear") +
+# enter_fade() +
+# exit_fade()
+
+animate(pml.ani, fps = 10, end_pause = 30, width = 750, height = 450, renderer = gifski_renderer())
![](V43_gganimate_files/figure-html/ani-animating-1.gif)
-
-
+
+
![](jour5014/pml2.gif)
diff --git a/introduction.html b/introduction.html
index 55b7776..b0fe269 100644
--- a/introduction.html
+++ b/introduction.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
diff --git a/joindata.html b/joindata.html
index 97fa9c7..b7a78a5 100644
--- a/joindata.html
+++ b/joindata.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -787,12 +793,12 @@ Chapter 7 Data manipultaiton: Joi
7.1 讀取內政部人口統計資料
先使用slice(-1)
減去第一行中文欄位名稱。再來,目前縣市鄉鎮市區(site_id
)和村里(village
)分別是兩個變項,由於不同的鄉鎮市可能會有相同的村里名,所以把site_id
與village
粘接起來成為完整的村里名vname
。
這邊我多加了一行程式碼讓vname
可以排到前面一點的變項欄,可以用select()
達到這個目的,我之後的變項欄的還要寶劉,所以我多打一個everything()
就可以把剩下的變項欄都擺放在後面。因此這個重排變項欄的完整程式碼為select(vname, everything())
。
-
+
## # A tibble: 6 × 157
## vname statistic_yyy district_code site_id village single_age_15down_m
## <chr> <chr> <chr> <chr> <chr> <chr>
@@ -809,7 +815,7 @@ 7.1 讀取內政部人口統計
## # single_age_55_59_m <chr>, single_age_60_64_m <chr>,
## # single_age_65_69_m <chr>, single_age_70_74_m <chr>,
## # single_age_75_79_m <chr>, single_age_80_84_m <chr>, …
-
+
7.1.1 分析規劃
@@ -828,8 +834,8 @@ 7.1.2 清理資料
我要將後方的數值變項欄(single_age_15down_m
等)轉為單一變項key的值,再把其所對應到的資料值,也轉為單一變項value。請注意看上圖和程式碼後方結果圖的顏色區塊。南投縣中寮鄉中寮村(綠色)被複製且展開為多列。而原本多個年齡層和資料的變數項(紅色)變成一個變項欄的資料,分別對應到其原本對應的數值(藍色)。
-
+
相對於pivot_wider()
把變項展開成欄,pivot_longer()
函式可以收合被展開的變項,在此將要收合的變數名稱統一稱為key
,並將該變數所對應到的數值稱為value
。並且我用6:ncol(.)
來指定我要收合哪些變項欄。
ncol(.)
的「.
」代表從前面%>%
pipe進來的那個data.frame。
@@ -849,28 +855,28 @@ 7.1.2 清理資料
最後就剩零星的操作,包含轉換資料為數值型態、或者你也可以在這裡建立新的指標(例如年齡平均)。最後加上一個arrange(vname)
讓他按照村里的全名排序。
-tidy_data <- raw %>%
- pivot_longer(names_to = "key", values_to = "value", cols = 6:ncol(.)) %>%
- mutate(key = str_replace(key, "_age", "")) %>%
- mutate(key = str_replace(key, "100up", "100_110")) %>%
- mutate(key = str_replace(key, "15down", "0_15")) %>%
- separate(key, c("married", "ageLower", "ageUpper", "gender")) %>%
- mutate(ageLower = as.numeric(ageLower),
- # age = str(ageLower, ageUpper),
- ageUpper = as.numeric(ageUpper),
- value = as.numeric(value)) %>%
- select(-statistic_yyy) %>%
- arrange(vname)
+tidy_data <- raw %>%
+ pivot_longer(names_to = "key", values_to = "value", cols = 6:ncol(.)) %>%
+ mutate(key = str_replace(key, "_age", "")) %>%
+ mutate(key = str_replace(key, "100up", "100_110")) %>%
+ mutate(key = str_replace(key, "15down", "0_15")) %>%
+ separate(key, c("married", "ageLower", "ageUpper", "gender")) %>%
+ mutate(ageLower = as.numeric(ageLower),
+ # age = str(ageLower, ageUpper),
+ ageUpper = as.numeric(ageUpper),
+ value = as.numeric(value)) %>%
+ select(-statistic_yyy) %>%
+ arrange(vname)
7.1.3 進階:運用rowwise()
-raw %>%
- mutate_at(vars(6:157), as.numeric) %>%
- replace(is.na(.), 0) %>%
- rowwise() %>%
- mutate(married = sum(c_across(matches("widowed|divorced|married")), na.rm = T)) %>%
- mutate(lt65 = sum(c_across(matches("65|70|75|80|85|90|95|100")), na.rm = T)) %>%
- select(vname, married, lt65) %>% head
+raw %>%
+ mutate_at(vars(6:157), as.numeric) %>%
+ replace(is.na(.), 0) %>%
+ rowwise() %>%
+ mutate(married = sum(c_across(matches("widowed|divorced|married")), na.rm = T)) %>%
+ mutate(lt65 = sum(c_across(matches("65|70|75|80|85|90|95|100")), na.rm = T)) %>%
+ select(vname, married, lt65) %>% head
## # A tibble: 6 × 3
## # Rowwise:
## vname married lt65
@@ -892,64 +898,74 @@ 7.1.4.1 使用group_by()建立村
簡單地說,相當於按照不同的村里(district_code
)各別做value
的加總(該村里的總人口數)、篩選出年齡65歲以上的人口組別進行加總、篩選出不是單身者的人口組別進行加總。之後會加一個ungroup()
解開群組。
最後一行left_join(raw %>% select(vname, site_id), by = "vname")
是由於group_by()
後會讓其他變數消失(例如鄉鎮市區名site_id
),所以我希望將原本資料raw
中的site_id
給併回來。我可以抽取出raw
中的vname
和site_id
兩個變項,然後以vname
為key,用left_join()
將site_id
給併回來。
筆記:當group_by()
、summarize()
後不參與的變項會消失,但可以透過left_join()
的方式將原有的變項併回來。
-village_stat <- tidy_data %>%
- filter(ageLower >= 20) %>%
- group_by(vname) %>%
- summarise(legalPopulation = sum(value),
- elderSum = sum(value[ageLower >= 65]),
- marriedSum = sum(value[married %in% c("married", "divorced", "widowed")]),
- womenSum = sum(value[gender == "f"])) %>%
- ungroup() %>%
- left_join(raw %>% select(vname, site_id), by = "vname")
+village_stat <- tidy_data %>%
+ filter(ageLower >= 20) %>%
+ group_by(vname) %>%
+ summarise(legalPopulation = sum(value),
+ elderSum = sum(value[ageLower >= 65]),
+ marriedSum = sum(value[married %in% c("married", "divorced", "widowed")]),
+ womenSum = sum(value[gender == "f"])) %>%
+ ungroup() %>%
+ left_join(raw %>% select(vname, site_id), by = "vname")
測試
7.1.4.2 將村里指標匯總為鄉鎮市區指標
剛剛是根據村里(village)來建立指標,現在要根據鄉鎮市區來建立指標。走過前方的邏輯後,我們只需要把原本用來做group_by()
的村里變項vname
改為鄉鎮市區的變項site_id
,就可以完成這件事,其他都一樣,你發現沒?
不過這邊我要多做一件事。因為三民區和鳳山區兩個區非常的大(我猜),所以內政資料中的鄉鎮市區資料有分「三民一」、「三民二」、「鳳山一」、「鳳山二」。我們只要在彙整資料前,將site_id
的這四類值取代好,便可以在鄉鎮市區的指標中一併彙整。以下我一共彙整出四種資料,分別為該區人口數(legalPopulation
)、老年人口數(elderSum
)、曾婚人口數(marriedSum
)、女性人口數(womenSum
)。不難想像接下來可以計算出各鄉鎮市區的老年人口比例、曾婚比例、女性比例等。
-town_stat <- village_stat %>%
- # mutate(site_id = str_sub(vname, 1, 6)) %>%
- mutate(site_id = str_replace(site_id, "三民一|三民二", "三民區")) %>%
- mutate(site_id = str_replace(site_id, "鳳山一|鳳山二", "鳳山區")) %>%
- group_by(site_id) %>%
- summarize(legalPopulation = sum(legalPopulation),
- elderSum = sum(elderSum),
- marriedSum = sum(marriedSum),
- womenSum = sum(womenSum)
- )%>%
- ungroup()
+town_stat <- village_stat %>%
+ # mutate(site_id = str_sub(vname, 1, 6)) %>%
+ mutate(site_id = str_replace(site_id, "三民一|三民二", "三民區")) %>%
+ mutate(site_id = str_replace(site_id, "鳳山一|鳳山二", "鳳山區")) %>%
+ group_by(site_id) %>%
+ summarize(legalPopulation = sum(legalPopulation),
+ elderSum = sum(elderSum),
+ marriedSum = sum(marriedSum),
+ womenSum = sum(womenSum)
+ )%>%
+ ungroup()
7.1.5 視覺化測試(老年人口數 x 曾婚人口數)
-town_stat %>%
- mutate(marriedPerc = marriedSum / legalPopulation) %>%
- mutate(womenPerc = womenSum / legalPopulation) %>%
- mutate(elderPerc = elderSum / legalPopulation) %>%
- ggplot() +
- aes(marriedPerc, elderPerc) +
- geom_point(alpha = 0.3)
+th <-
+ theme(title = element_text(family="Heiti TC Light"),
+ text = element_text(family="Heiti TC Light"),
+ axis.text.y = element_text(family="PingFang TC"),
+ axis.text.x = element_text(family="Heiti TC Light"),
+ legend.text = element_text(family="Heiti TC Light"),
+ plot.title = element_text(family="Heiti TC Light")
+ )
+
+town_stat %>%
+ mutate(marriedPerc = marriedSum / legalPopulation) %>%
+ mutate(womenPerc = womenSum / legalPopulation) %>%
+ mutate(elderPerc = elderSum / legalPopulation) %>%
+ ggplot() +
+ aes(womenPerc, elderPerc) +
+ geom_point(alpha = 0.3) +
+ geom_text(aes(label=site_id, vjust=1.3, size=4), family = "Heiti TC Light") + th
![](R23_join_twdemo_ref_files/figure-html/unnamed-chunk-8-1.png)
-
+
7.2 讀取公投資料
首先,先讀取資料並重新命名每個變項。由於我們要連結公投資料和前面的內政部人口統計資料,所以要注意兩筆資料間是否有共通的key(資料庫稱為鍵值)。town_stat
的是以site_id
鄉鎮市區名為主鍵,所以公投資料這邊也產生一個同名的鄉鎮市區變項site_id
。
-ref10 <- read_csv("data/ref10.csv") %>%
- select(county = 縣市, town = 鄉鎮市區,
- agree = 同意票數, disagree = 不同意票數,
- legalVote = 有效票數, illegalVote = 無效票數,
- vote = 投票數, legalPopulation = 投票權人數) %>%
- mutate(site_id = str_c(county, town)) %>%
- drop_na(site_id)
-
-names(ref10)
+ref10 <- read_csv("data/ref10.csv") %>%
+ select(county = 縣市, town = 鄉鎮市區,
+ agree = 同意票數, disagree = 不同意票數,
+ legalVote = 有效票數, illegalVote = 無效票數,
+ vote = 投票數, legalPopulation = 投票權人數) %>%
+ mutate(site_id = str_c(county, town)) %>%
+ drop_na(site_id)
+
+names(ref10)
## [1] "county" "town" "agree" "disagree"
## [5] "legalVote" "illegalVote" "vote" "legalPopulation"
## [9] "site_id"
合併資料測試,注意,由於兩邊都有legalPopulation
,所以town_stat
中的legalPopulation
增生為legalPopulation.x
,而ref10
中的legalPopulation
則重新命名為legalPopulation.y
。
-
+
## # A tibble: 368 × 13
## site_id legalPopulation.x elderSum marriedSum womenSum county town agree
## <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl>
@@ -969,21 +985,21 @@ 7.2 讀取公投資料
7.2.1 合併公投資料並視覺化
由於人口統計資料中的鄉鎮市區若只有兩個字如「東區」中間有一全形空白「東 區」,但公投資料中並沒有這樣的空白,所以為了兩者要能夠正確合併,需要先做好取代。可以逐一取代,或者,直接取代掉該全形空白為空字串即可。
-town_stat %>%
- mutate(site_id = str_replace(site_id, " ", "")) %>%
- # mutate(site_id = str_replace(site_id, "東 區", "東區"),
- # site_id = str_replace(site_id, "西 區", "西區"),
- # site_id = str_replace(site_id, "南 區", "南區"),
- # site_id = str_replace(site_id, "北 區", "北區"),
- # site_id = str_replace(site_id, "中 區", "中區")) %>%
- left_join(ref10, by = "site_id") %>%
- mutate(agreeRate = agree / legalVote,
- marriedPerc = marriedSum / legalPopulation.x) %>%
- # select(site_id, agree, legalVote, marriedSum, legalPopulation.x) %>%
- ggplot() +
- aes(agreeRate, marriedPerc) +
- geom_point(alpha = 0.5, color = "royalblue") +
- theme_light()
+town_stat %>%
+ mutate(site_id = str_replace(site_id, " ", "")) %>%
+ # mutate(site_id = str_replace(site_id, "東 區", "東區"),
+ # site_id = str_replace(site_id, "西 區", "西區"),
+ # site_id = str_replace(site_id, "南 區", "南區"),
+ # site_id = str_replace(site_id, "北 區", "北區"),
+ # site_id = str_replace(site_id, "中 區", "中區")) %>%
+ left_join(ref10, by = "site_id") %>%
+ mutate(agreeRate = agree / legalVote,
+ marriedPerc = marriedSum / legalPopulation.x) %>%
+ # select(site_id, agree, legalVote, marriedSum, legalPopulation.x) %>%
+ ggplot() +
+ aes(agreeRate, marriedPerc) +
+ geom_point(alpha = 0.5, color = "royalblue") +
+ theme_light()
![](R23_join_twdemo_ref_files/figure-html/unnamed-chunk-11-1.png)
diff --git a/lebron.html b/lebron.html
index 804faaf..f04d2e9 100644
--- a/lebron.html
+++ b/lebron.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -805,106 +811,106 @@ 20.1 Get top250 players。
抽取出來的連結往往是相對於主要連結的後半段,因此,最後要將所取得的連結黏接在主頁連結的後方,如str_c(url.base, .)
。
-url.base <- "https://www.basketball-reference.com"
-url <- "https://www.basketball-reference.com/leaders/per_career.html"
-
-top_players <- read_html(url) %>%
- html_node("#nba") %>%
- html_table()
-
-top_players$plink <- read_html(url) %>%
- html_node("#nba") %>%
- html_nodes("tr td:nth-child(2) a") %>%
- html_attr("href") %>%
- str_c(url.base, .)
-
-top_players
+url.base <- "https://www.basketball-reference.com"
+url <- "https://www.basketball-reference.com/leaders/per_career.html"
+
+top_players <- read_html(url) %>%
+ html_node("#nba") %>%
+ html_table()
+
+top_players$plink <- read_html(url) %>%
+ html_node("#nba") %>%
+ html_nodes("tr td:nth-child(2) a") %>%
+ html_attr("href") %>%
+ str_c(url.base, .)
+
+top_players
20.2 Scraping live scores
https://www.basketball-reference.com/players/c/chambto01.html
20.2.1 Testing: Scrape one
-
+
20.2.2 Scrape life time scores of all top-250 players
![](images/paste-0BF71F44.png)
-# pinks <- long_players$plink
-plinks <- top_players$plink
-
-totals <- tibble()
-for(i in 1:length(plinks)){
- plink <- plinks[i]
- message(sprintf("[%s] ", i), plink)
-
- table <- read_html(plink) %>%
- html_node("#totals") %>%
- html_table()
-
- table$plink <- plink
- totals <- bind_rows(totals, table)
- Sys.sleep(sample(1:2, 1))
-}
+# pinks <- long_players$plink
+plinks <- top_players$plink
+
+totals <- tibble()
+for(i in 1:length(plinks)){
+ plink <- plinks[i]
+ message(sprintf("[%s] ", i), plink)
+
+ table <- read_html(plink) %>%
+ html_node("#totals") %>%
+ html_table()
+
+ table$plink <- plink
+ totals <- bind_rows(totals, table)
+ Sys.sleep(sample(1:2, 1))
+}
20.3 Cleaning data
-top250 <- totals %>%
- filter(str_detect(Season, "\\d{4}-\\d{2}")) %>%
- left_join(top_players, by="plink") %>%
- select(-(34:53)) %>%
- select(-31) %>%
- mutate(year = year(paste0(str_sub(Season, 1, 4), "-01-01"))) %>%
- mutate(PERyear = PTS/G) %>%
- group_by(plink) %>%
- arrange(Age) %>%
- mutate(cumPTS = cumsum(PTS)) %>%
- ungroup()
+top250 <- totals %>%
+ filter(str_detect(Season, "\\d{4}-\\d{2}")) %>%
+ left_join(top_players, by="plink") %>%
+ select(-(34:53)) %>%
+ select(-31) %>%
+ mutate(year = year(paste0(str_sub(Season, 1, 4), "-01-01"))) %>%
+ mutate(PERyear = PTS/G) %>%
+ group_by(plink) %>%
+ arrange(Age) %>%
+ mutate(cumPTS = cumsum(PTS)) %>%
+ ungroup()
20.4 Visualization
Load pre-save data
-
+
20.4.1 Line: Age x cumPTS
-library(gghighlight)
-
-selected_players <- c("Michael Jordan*", "LeBron James", "Kobe Bryant*",
- "Wilt Chamberlain*", "Kareem Abdul-Jabbar*", "Stephen Curry")
-
-top250 %>%
- ggplot() +
- aes(Age, cumPTS, group=Player) +
- geom_line() +
- gghighlight(Player %in% selected_players) +
- theme_bw() +
- theme(legend.position = "none")
+library(gghighlight)
+
+selected_players <- c("Michael Jordan*", "LeBron James", "Kobe Bryant*",
+ "Wilt Chamberlain*", "Kareem Abdul-Jabbar*", "Stephen Curry")
+
+top250 %>%
+ ggplot() +
+ aes(Age, cumPTS, group=Player) +
+ geom_line() +
+ gghighlight(Player %in% selected_players) +
+ theme_bw() +
+ theme(legend.position = "none")
![](R45_scrape_nba_players_files/figure-html/unnamed-chunk-8-1.png)
20.4.2 Line: year x cumPTS
-top250 %>%
- ggplot() +
- aes(year, cumPTS, group=Player) +
- geom_line() +
- gghighlight(Player %in% selected_players) +
- theme_bw() +
- theme(legend.position = "none")
+top250 %>%
+ ggplot() +
+ aes(year, cumPTS, group=Player) +
+ geom_line() +
+ gghighlight(Player %in% selected_players) +
+ theme_bw() +
+ theme(legend.position = "none")
![](R45_scrape_nba_players_files/figure-html/unnamed-chunk-9-1.png)
20.4.3 Line: Age x PER_by_year
-top250 %>%
- ggplot() +
- aes(Age, PERyear, group=Player) +
- geom_line() +
- gghighlight(Player %in% selected_players) +
- theme_bw() +
- theme(legend.position = "none")
+top250 %>%
+ ggplot() +
+ aes(Age, PERyear, group=Player) +
+ geom_line() +
+ gghighlight(Player %in% selected_players) +
+ theme_bw() +
+ theme(legend.position = "none")
![](R45_scrape_nba_players_files/figure-html/unnamed-chunk-10-1.png)
@@ -913,128 +919,128 @@ 20.4.4 Comparing LeBron James and
20.5 Scraping and cleaning
-# plink <- "https://www.basketball-reference.com/players/j/jamesle01.html"
-plink <- "https://www.basketball-reference.com/players/a/abdulka01.html"
-loglinks <- read_html(plink) %>%
- html_node("#totals") %>%
- html_nodes("tr th a") %>%
- html_attr("href") %>%
- paste0(url.base, .)
-
-
-logtable <- tibble()
-
-for(link in loglinks){
- table <- read_html(link) %>%
- html_node("#pgl_basic") %>%
- html_table()
- logtable <- bind_rows(logtable, table)
- message(nrow(logtable), link)
-}
-
-jabbar.log <- logtable %>%
- select(Rk, G, Date, FG, `3P`, FT, PTS) %>%
- mutate(Rk = as.numeric(Rk),
- FG = as.numeric(FG),
- `3P` = as.numeric(`3P`),
- FT = as.numeric(FT),
- PTS = as.numeric(PTS)) %>%
- filter(!is.na(PTS)) %>%
- replace(is.na(.), 0) %>%
- mutate(try = FG + `3P` + FT) %>%
- mutate(FGperc = FG/try,
- P3perc = `3P`/try,
- FTperc = FT/try) %>%
- mutate(gid = row_number())
+# plink <- "https://www.basketball-reference.com/players/j/jamesle01.html"
+plink <- "https://www.basketball-reference.com/players/a/abdulka01.html"
+loglinks <- read_html(plink) %>%
+ html_node("#totals") %>%
+ html_nodes("tr th a") %>%
+ html_attr("href") %>%
+ paste0(url.base, .)
+
+
+logtable <- tibble()
+
+for(link in loglinks){
+ table <- read_html(link) %>%
+ html_node("#pgl_basic") %>%
+ html_table()
+ logtable <- bind_rows(logtable, table)
+ message(nrow(logtable), link)
+}
+
+jabbar.log <- logtable %>%
+ select(Rk, G, Date, FG, `3P`, FT, PTS) %>%
+ mutate(Rk = as.numeric(Rk),
+ FG = as.numeric(FG),
+ `3P` = as.numeric(`3P`),
+ FT = as.numeric(FT),
+ PTS = as.numeric(PTS)) %>%
+ filter(!is.na(PTS)) %>%
+ replace(is.na(.), 0) %>%
+ mutate(try = FG + `3P` + FT) %>%
+ mutate(FGperc = FG/try,
+ P3perc = `3P`/try,
+ FTperc = FT/try) %>%
+ mutate(gid = row_number())
20.5.1 VIS LJames and jabbar
-james.log %>%
- pivot_longer(names_to = "type",
- cols = c("FGperc", "P3perc", "FTperc"),
- values_to = "perc") %>%
- ggplot() +
- aes(gid, perc, fill = type) +
- geom_area() +
- theme_bw()
+james.log %>%
+ pivot_longer(names_to = "type",
+ cols = c("FGperc", "P3perc", "FTperc"),
+ values_to = "perc") %>%
+ ggplot() +
+ aes(gid, perc, fill = type) +
+ geom_area() +
+ theme_bw()
![](R45_scrape_nba_players_files/figure-html/unnamed-chunk-12-1.png)
-jabbar.log %>%
- pivot_longer(names_to = "type",
- cols = c("FGperc", "P3perc", "FTperc"),
- values_to = "perc") %>%
- ggplot() +
- aes(gid, perc, fill = type) +
- geom_area() +
- theme_bw()
+jabbar.log %>%
+ pivot_longer(names_to = "type",
+ cols = c("FGperc", "P3perc", "FTperc"),
+ values_to = "perc") %>%
+ ggplot() +
+ aes(gid, perc, fill = type) +
+ geom_area() +
+ theme_bw()
![](R45_scrape_nba_players_files/figure-html/unnamed-chunk-12-2.png)
-top250 %>%
- group_by(Player) %>%
- summarize(FGsum = sum(FG),
- FTsum = sum(FT),
- P3sum = sum(`3P`)) %>%
- ungroup() %>%
- replace(is.na(.), 0) %>%
- mutate(trials = FGsum + FTsum + P3sum) %>%
- mutate(FGperc = FGsum/trials,
- FTperc = FTsum/trials,
- P3perc = P3sum/trials) %>%
- ggplot() +
- aes(FGperc, P3perc) +
- geom_point() +
- geom_text(aes(label = Player), hjust = -0.1) +
- gghighlight(Player %in% selected_players) +
- theme_bw() +
- theme(aspect.ratio = 2/3)
+top250 %>%
+ group_by(Player) %>%
+ summarize(FGsum = sum(FG),
+ FTsum = sum(FT),
+ P3sum = sum(`3P`)) %>%
+ ungroup() %>%
+ replace(is.na(.), 0) %>%
+ mutate(trials = FGsum + FTsum + P3sum) %>%
+ mutate(FGperc = FGsum/trials,
+ FTperc = FTsum/trials,
+ P3perc = P3sum/trials) %>%
+ ggplot() +
+ aes(FGperc, P3perc) +
+ geom_point() +
+ geom_text(aes(label = Player), hjust = -0.1) +
+ gghighlight(Player %in% selected_players) +
+ theme_bw() +
+ theme(aspect.ratio = 2/3)
![](R45_scrape_nba_players_files/figure-html/unnamed-chunk-13-1.png)
-
+
20.6 (More) Scraping all players
20.6.1 Testing
-url <- "https://www.basketball-reference.com/players/x/"
-
-table.path <- read_html(url) %>%
- html_node("#players")
-
-table <- table.path %>% html_table()
-
-table$pid <- table.path %>%
- html_nodes("tbody th") %>%
- html_attr("data-append-csv")
-
-table$plink <- table.path %>%
- html_nodes("tbody th a") %>%
- html_attr("href") %>%
- str_c("https://www.basketball-reference.com",.)
+url <- "https://www.basketball-reference.com/players/x/"
+
+table.path <- read_html(url) %>%
+ html_node("#players")
+
+table <- table.path %>% html_table()
+
+table$pid <- table.path %>%
+ html_nodes("tbody th") %>%
+ html_attr("data-append-csv")
+
+table$plink <- table.path %>%
+ html_nodes("tbody th a") %>%
+ html_attr("href") %>%
+ str_c("https://www.basketball-reference.com",.)
20.6.2 Scrape from a-z except x(no x)
-# letters[c(1:23, 25:26)]
-
-players <- tibble()
-for(letter in letters[c(1:23, 25:26)]){
-
- url <- str_c("https://www.basketball-reference.com/players/", letter, "/")
- print(url)
-
- table.path <- read_html(url) %>%
- html_node("#players")
-
- table <- table.path %>% html_table()
-
- table$pid <- table.path %>%
- html_nodes("tbody th") %>%
- html_attr("data-append-csv")
-
- table$plink <- table.path %>%
- html_nodes("tbody th a") %>%
- html_attr("href") %>%
- str_c("https://www.basketball-reference.com",.)
-
- players <- bind_rows(players, table)
-}
+# letters[c(1:23, 25:26)]
+
+players <- tibble()
+for(letter in letters[c(1:23, 25:26)]){
+
+ url <- str_c("https://www.basketball-reference.com/players/", letter, "/")
+ print(url)
+
+ table.path <- read_html(url) %>%
+ html_node("#players")
+
+ table <- table.path %>% html_table()
+
+ table$pid <- table.path %>%
+ html_nodes("tbody th") %>%
+ html_attr("data-append-csv")
+
+ table$plink <- table.path %>%
+ html_nodes("tbody th a") %>%
+ html_attr("href") %>%
+ str_c("https://www.basketball-reference.com",.)
+
+ players <- bind_rows(players, table)
+}
diff --git a/na.html b/na.html
index cb74770..d52cc43 100644
--- a/na.html
+++ b/na.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -795,8 +801,8 @@ 10.1 Cleaning Gov Annual Budget這個範例將清理中央政府111年度的歲出預算表。由於政府預算有款、科、目、節與機構,會呈現一個大部會到小布會的樹狀階層,因此非常適合用Treemap來做視覺化,預期視覺化的結果如下(視覺化的部分可參考章節26.3):
![](images/paste-38DB44D3.png)
在讀入資料後,由於資料具有階層性、從最大的科款、項、目,由於是給一般讀者所閱讀的資料,在原本的EXCEL表格中,比較大的階層可能會合併數個資料格來表示,這會使得較大的階層會有相當多的缺失值。此時,我們會需要依據其他列的值,來回填這些NA值,所用的函式為zoo::na.locf()
。
-
+
## # A tibble: 10 × 9
## ...1 ...2 ...3 ...4 ...5 ...6 ...7 ...8 ...9
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
@@ -818,14 +824,14 @@ 10.1.1 Basic Cleaning
-names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差")
-
-cleaned <- raw %>%
- slice(-(1:2)) %>%
- filter(!is.na(款) | !is.na(科)) %>%
- select(-目, -節) %>%
- separate(機構, c("oid", "org"), sep="\n")
-cleaned %>% head(10)
+names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差")
+
+cleaned <- raw %>%
+ slice(-(1:2)) %>%
+ filter(!is.na(款) | !is.na(科)) %>%
+ select(-目, -節) %>%
+ separate(機構, c("oid", "org"), sep="\n")
+cleaned %>% head(10)
## # A tibble: 10 × 8
## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
@@ -843,8 +849,8 @@ 10.1.1 Basic Cleaning
10.1.2 Processing NA
觀察一下現在的資料,發現,行政院、主計總處等均屬於行政支出,但行政支出卻自有一列。依照長表格的格式來說,應嘗試把「款」作為機構的變項。所以將款的數字取代為「行政支出」等支出類別的名稱。
-
+
## # A tibble: 10 × 8
## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
@@ -862,11 +868,11 @@ 10.1.2 Processing NA
zoo::na.locf()
:zoo::na.locf()
是 R 語言中 zoo
套件提供的函式,其作用是將缺失值(NA)用最後一個非缺失值(non-missing value)填充。具體而言,na.locf()
函式將會從第一個非缺失值開始向下填充,直到下一個非缺失值出現為止。這種方法稱為 “last observation carried forward”(LOCF),意思是最後觀測值向前填充。
-library(zoo)
-cleaned %>%
- mutate(款 = ifelse(!is.na(款), org, 款)) %>%
- mutate(款 = zoo::na.locf(款)) %>%
- head(10)
+library(zoo)
+cleaned %>%
+ mutate(款 = ifelse(!is.na(款), org, 款)) %>%
+ mutate(款 = zoo::na.locf(款)) %>%
+ head(10)
## # A tibble: 10 × 8
## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
@@ -884,29 +890,29 @@ 10.1.2 Processing NA
10.1.3 Complete Code
-library(zoo)
-# raw <- readxl::read_excel("data/111B歲出政事別預算總表.xls")
-raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F)
-
-names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差")
-# raw$款 <- na.locf(raw$款)
-
-cleaned <- raw %>%
- filter(!is.na(款) | !is.na(科)) %>%
- slice(-(1:2)) %>%
- select(-目, -節) %>%
- separate(機構, c("oid", "org"), sep="\n") %>%
- mutate(款 = ifelse(!is.na(款), org, 款)) %>%
- mutate(款 = zoo::na.locf(款)) %>%
- filter(!is.na(科)) %>%
- select(-科) %>% type_convert() %>%
- mutate(上年度預算 = as.numeric(上年度預算),
- 上年度決算 = as.integer(上年度決算),
- 預算差 = as.numeric(預算差)) %>%
- replace_na(list(上年度預算 = 0, 上年度決算 = 0)) %>%
- mutate(預算差 = 本年度預算 - 上年度預算)
-
-cleaned %>% head()
+library(zoo)
+# raw <- readxl::read_excel("data/111B歲出政事別預算總表.xls")
+raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F)
+
+names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差")
+# raw$款 <- na.locf(raw$款)
+
+cleaned <- raw %>%
+ filter(!is.na(款) | !is.na(科)) %>%
+ slice(-(1:2)) %>%
+ select(-目, -節) %>%
+ separate(機構, c("oid", "org"), sep="\n") %>%
+ mutate(款 = ifelse(!is.na(款), org, 款)) %>%
+ mutate(款 = zoo::na.locf(款)) %>%
+ filter(!is.na(科)) %>%
+ select(-科) %>% type_convert() %>%
+ mutate(上年度預算 = as.numeric(上年度預算),
+ 上年度決算 = as.integer(上年度決算),
+ 預算差 = as.numeric(預算差)) %>%
+ replace_na(list(上年度預算 = 0, 上年度決算 = 0)) %>%
+ mutate(預算差 = 本年度預算 - 上年度預算)
+
+cleaned %>% head()
## # A tibble: 6 × 7
## 款 oid org 本年度預算 上年度預算 上年度決算 預算差
## <chr> <dbl> <chr> <dbl> <dbl> <int> <dbl>
@@ -931,10 +937,10 @@ 10.2 Cleaning Covid Vaccinating d
10.2.1 觀察並評估資料概況
這是一份資料缺失相當多的資料。評估資料概況後可發現這個資料集每一列就是某一個國家某一天所上傳的紀錄。所以,一個國家會有很多列。乍聽之下不難處理,但事實上每個國家不會每天上傳、也不會固定某一天上傳、哪一週、哪一個月開始上傳也不一定,也有可能會漏掉一些月份或週次。所以,制定出一個時間單位(例如週、月)、然後延著時間軸將資料「對齊」,讓每個國家在每個時間單位都有資料。但每個國家疫情發展程度不一,所以也不可能有一個完美的對齊,所以通常會建議就所要觀察的國家進行對齊即可。至於想刪除的那些資料列,幾乎都可以當成是所謂的缺失值。
-
+
## [1] 99442 16
-
+
## # A tibble: 20 × 16
## location iso_code date total_vaccinations people_vaccinated
## <chr> <chr> <date> <dbl> <dbl>
@@ -971,18 +977,18 @@ 10.2.2 按月對齊資料接下來便是缺失值處理,如果這個欄位沒有數值的就直接用drop_na()
篩除即可。
這個範例希望把該資料視覺化為Y軸為年、X軸為時間的熱區圖。但整個疫情資料橫亙二年多,如果以週為彙整單位的話,那勢必X軸會有近百個資料點。所以打算以「月」為單位來彙整這些資料,因為且資料中也有不少國家缺數週的資料,所以以月為彙整單位是一個權衡後的選擇(仍可以嘗試用週作為彙整單位試試看)。所以,運用了lubridate::floor_date()
來將日期資料轉換為月,例如2022-03-12和2022-03-14都會被轉換為2022-03-01。
依照國家與時間群組彙整資料。接下來就依照各國的月份來做彙整(注意,此時會有不少資料同屬於某個月的資料)。彙整的方法是,經過對「日期」(不是對月)做排序後,僅留下第一筆資料,也就是僅留下最接近月份開頭的資料。經由這樣的操作,會使得各國在每個月剛好留下一筆資料,如下面程式的範例輸出。
-library(lubridate)
-fullvaccinated <- raw %>% select(country = location, date,
- people_fully_vaccinated_per_hundred) %>%
- drop_na(people_fully_vaccinated_per_hundred) %>%
- mutate(m = floor_date(date, unit = "month")) %>%
- group_by(country, m) %>%
- arrange(date) %>%
- slice(1) %>%
- ungroup() %>%
- select(-date)
-
-fullvaccinated %>% head(10)
+library(lubridate)
+fullvaccinated <- raw %>% select(country = location, date,
+ people_fully_vaccinated_per_hundred) %>%
+ drop_na(people_fully_vaccinated_per_hundred) %>%
+ mutate(m = floor_date(date, unit = "month")) %>%
+ group_by(country, m) %>%
+ arrange(date) %>%
+ slice(1) %>%
+ ungroup() %>%
+ select(-date)
+
+fullvaccinated %>% head(10)
## # A tibble: 10 × 3
## country people_fully_vaccinated_per_hundred m
## <chr> <dbl> <date>
@@ -1001,9 +1007,9 @@ 10.2.2 按月對齊資料10.2.3 處理遺漏資料的月份
接下來要處理的是資料紀錄的缺漏值。每個國家登錄資料的時間是很不一致的,某些國家會缺某些月份,或者某些國家是在某年某月以後才開始登記,或者最近沒在登記。但這個範例所要視覺化的資料是接種疫苗的比例,所以即使是現在沒在登記了,但接種比例應列計最後一次資料紀錄的接種比例。
首先我要讓每個國家都有所有月份,這裡應會有某個函式可以做到這件事,但我沒查到這個函式。不過我可以很技巧性地用pivot_wider()
(spread()
)和pivot_longer()
(gather()
)來完成這件事。spread()
在展開時對於缺少的資料項可以自動補NA
。所以我就只要把資料的月份展開後再gather()
回來後,就可以自動讓每個國家所擁有的月份資料一致。以下為spread()
後的結果,可以觀察到每一列是一個國家,每一欄是個月份,如果當月都沒資料紀錄,那該月的值就會是缺失值。可以看見缺失值是相當多的,也就是在那段時間都沒有資料紀錄。
-
+
## # A tibble: 10 × 19
## country `2020-12-01` `2021-01-01` `2021-02-01` `2021-03-01` `2021-04-01`
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
@@ -1023,10 +1029,10 @@ 10.2.3 處理遺漏資料的月
## # `2022-01-01` <dbl>, `2022-02-01` <dbl>, `2022-03-01` <dbl>,
## # `2022-04-01` <dbl>, `2022-05-01` <dbl>
在以下的範例輸出可以看到gather()
後的結果。注意,需要照國家和月份來排序後才便於觀察。
-fullvaccinated %>%
- spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
- gather(month, perc, -country) %>%
- arrange(country, month) %>% head(20)
+fullvaccinated %>%
+ spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
+ gather(month, perc, -country) %>%
+ arrange(country, month) %>% head(20)
## # A tibble: 20 × 3
## country month perc
## <chr> <chr> <dbl>
@@ -1052,15 +1058,15 @@ 10.2.3 處理遺漏資料的月
## 20 Africa 2021-01-01 NA
接下來是最技巧性的部分。就接種比例而言是個遞增數列,所以如果這個月有紀錄,但下個月沒紀錄(NA
),那下個月的資料應以這個月的資料來替代。此時可以用zoo
套件的na.locf()
來填NA
值,其填NA
值的規則是用最後一筆非NA
值的資料來替代NA
值。但要注意的是,因為資料紀錄可能到第六個月或第七個月才開始紀錄,但在前面的月份都沒資料紀錄,也就是說那些NA
值沒有更早的資料紀錄權充填充值。原本na.locf()
會把這些找不到參考對象的NA
值直接刪除,但我們可以在裡面加一個參數使其不會被刪除(na.locf(perc, na.rm = F)
)。
最後,就把這些沒被刪除也沒得參考的早期資料項,用replace_na()
填上0即可。
-fullvaccinated %>%
- spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
- gather(month, perc, -country) %>%
- arrange(country, month) %>%
- group_by(country) %>%
- arrange(month) %>%
- mutate(perc = zoo::na.locf(perc, na.rm = F)) %>%
- ungroup() %>%
- arrange(country, month) %>% head(10)
+fullvaccinated %>%
+ spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
+ gather(month, perc, -country) %>%
+ arrange(country, month) %>%
+ group_by(country) %>%
+ arrange(month) %>%
+ mutate(perc = zoo::na.locf(perc, na.rm = F)) %>%
+ ungroup() %>%
+ arrange(country, month) %>% head(10)
## # A tibble: 10 × 3
## country month perc
## <chr> <chr> <dbl>
@@ -1075,17 +1081,17 @@ 10.2.3 處理遺漏資料的月
## 9 Afghanistan 2021-08-01 1.08
## 10 Afghanistan 2021-09-01 1.08
最後,就把這些沒被刪除也沒得參考的早期資料項,用replace_na()
填上0即可。大功告成。
-fullvaccinated %>%
- spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
- gather(month, perc, -country) %>%
- arrange(country, month) %>%
- group_by(country) %>%
- arrange(month) %>%
- mutate(perc = zoo::na.locf(perc, na.rm = F)) %>%
- ungroup() %>%
- arrange(country, month) %>%
- replace_na(list(perc=0)) %>%
- arrange(country, month) %>% head(10)
+fullvaccinated %>%
+ spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
+ gather(month, perc, -country) %>%
+ arrange(country, month) %>%
+ group_by(country) %>%
+ arrange(month) %>%
+ mutate(perc = zoo::na.locf(perc, na.rm = F)) %>%
+ ungroup() %>%
+ arrange(country, month) %>%
+ replace_na(list(perc=0)) %>%
+ arrange(country, month) %>% head(10)
## # A tibble: 10 × 3
## country month perc
## <chr> <chr> <dbl>
@@ -1102,29 +1108,29 @@ 10.2.3 處理遺漏資料的月
10.2.4 完整程式碼
-library(lubridate)
-raw <- read_csv("data/vaccinations.csv")
-
-fullvaccinated <- raw %>% select(country = location, date,
- people_fully_vaccinated_per_hundred) %>%
- drop_na(people_fully_vaccinated_per_hundred) %>%
- mutate(m = floor_date(date, unit = "month")) %>%
- group_by(country, m) %>%
- arrange(date) %>%
- slice(1) %>%
- ungroup() %>%
- select(-date)
-
-vperc_by_month <- fullvaccinated %>%
- spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
- gather(month, perc, -country) %>%
- arrange(country, month) %>%
- group_by(country) %>%
- arrange(month) %>%
- mutate(perc = zoo::na.locf(perc, na.rm = F)) %>%
- ungroup() %>%
- arrange(country, month) %>%
- replace_na(list(perc=0))
+library(lubridate)
+raw <- read_csv("data/vaccinations.csv")
+
+fullvaccinated <- raw %>% select(country = location, date,
+ people_fully_vaccinated_per_hundred) %>%
+ drop_na(people_fully_vaccinated_per_hundred) %>%
+ mutate(m = floor_date(date, unit = "month")) %>%
+ group_by(country, m) %>%
+ arrange(date) %>%
+ slice(1) %>%
+ ungroup() %>%
+ select(-date)
+
+vperc_by_month <- fullvaccinated %>%
+ spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>%
+ gather(month, perc, -country) %>%
+ arrange(country, month) %>%
+ group_by(country) %>%
+ arrange(month) %>%
+ mutate(perc = zoo::na.locf(perc, na.rm = F)) %>%
+ ungroup() %>%
+ arrange(country, month) %>%
+ replace_na(list(perc=0))
如何將這份疫苗施打比例的資料做視覺化,請見視覺化的章節??
diff --git a/network-vis.html b/network-vis.html
index 0746db5..1e6560b 100644
--- a/network-vis.html
+++ b/network-vis.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -784,116 +790,116 @@
Chapter 30 NETWORK VIS
網絡視覺化其實已經有非常好的簡介和指南。但在此補充一些常用的網絡視覺化參數
-
+
30.1 Generating networks
30.1.1 Random network
-g <- barabasi.game(500, directed = T)
-message("\n(V, E, Reciprocity, nComponent)\n",
- length(V(g)), "\t",
- length(E(g)), "\t",
- sprintf("%.3f\t", reciprocity(g)),
- count_components(g, mode = "weak")
- )
-l <- layout.fruchterman.reingold(g)
-# l <- layout_with_kk(g)
-# l <- layout_in_circle(g)
-
-par(mar = c(0,0,0,0) + 0.1)
-plot(g,
- layout = l,
- vertex.color = rgb(1, 1, 0, 0.2),
- # vertex.color = factor(V(g)$blocked),
- vertex.size = 3,
- # vertex.size = sqrt(V(g)$degree)*3,
- vertex.frame.color= rgb(0, 0, 0, 0.5),
- # vertex.label = V(g)$display,
- # vertex.label = str_sub(V(g)$name, 1, 10),
- vertex.label.cex = 0.6,
- vertex.label.color = rgb(0, 0, 0, 0.7),
- vertex.label.family = 'Heiti TC Light',
- edge.curved = 0.1,
- edge.arrow.size = 0.1,
- # edge.width = sqrt(E(g)$weight),
- # edge.color = E(g)$year,
- # edge.color = E(g)$weight,
- edge.color = "#4169E1",
- # edge.color = E(g)$color,
- # edge.label = E(g)$weight,
- # edge.label = E(g)$year,
- edge.label.cex = 0.4,
- edge.label.color = rgb(1, 0, 0)
- )
+g <- barabasi.game(500, directed = T)
+message("\n(V, E, Reciprocity, nComponent)\n",
+ length(V(g)), "\t",
+ length(E(g)), "\t",
+ sprintf("%.3f\t", reciprocity(g)),
+ count_components(g, mode = "weak")
+ )
+l <- layout.fruchterman.reingold(g)
+# l <- layout_with_kk(g)
+# l <- layout_in_circle(g)
+
+par(mar = c(0,0,0,0) + 0.1)
+plot(g,
+ layout = l,
+ vertex.color = rgb(1, 1, 0, 0.2),
+ # vertex.color = factor(V(g)$blocked),
+ vertex.size = 3,
+ # vertex.size = sqrt(V(g)$degree)*3,
+ vertex.frame.color= rgb(0, 0, 0, 0.5),
+ # vertex.label = V(g)$display,
+ # vertex.label = str_sub(V(g)$name, 1, 10),
+ vertex.label.cex = 0.6,
+ vertex.label.color = rgb(0, 0, 0, 0.7),
+ vertex.label.family = 'Heiti TC Light',
+ edge.curved = 0.1,
+ edge.arrow.size = 0.1,
+ # edge.width = sqrt(E(g)$weight),
+ # edge.color = E(g)$year,
+ # edge.color = E(g)$weight,
+ edge.color = "#4169E1",
+ # edge.color = E(g)$color,
+ # edge.label = E(g)$weight,
+ # edge.label = E(g)$year,
+ edge.label.cex = 0.4,
+ edge.label.color = rgb(1, 0, 0)
+ )
![](V31_networkviz_files/figure-html/unnamed-chunk-4-1.png)
30.1.2 Random network
-rg <- sample_gnm(length(V(g)), length(E(g)), directed=T)
-message("\n(V, E, Reciprocity, nComponent)\n",
- length(V(rg)), "\t",
- length(E(rg)), "\t",
- sprintf("%.3f\t", reciprocity(rg)),
- count_components(rg, mode = "weak")
- )
-l <- layout.fruchterman.reingold(rg)
-
-par(mar = c(0,0,0,0) + 0.1)
-plot(rg,
- layout = l,
- vertex.color = rgb(1, 1, 0, 0.2),
- vertex.size = 3,
- vertex.frame.color= rgb(0, 0, 0, 0.5),
- vertex.label.cex = 0.6,
- vertex.label.color = rgb(0, 0, 0, 0.7),
- vertex.label.family = 'Heiti TC Light',
- edge.curved = 0.1,
- edge.arrow.size = 0.1,
- edge.color = "#4169E1",
- edge.label.cex = 0.4,
- edge.label.color = rgb(1, 0, 0)
- )
+rg <- sample_gnm(length(V(g)), length(E(g)), directed=T)
+message("\n(V, E, Reciprocity, nComponent)\n",
+ length(V(rg)), "\t",
+ length(E(rg)), "\t",
+ sprintf("%.3f\t", reciprocity(rg)),
+ count_components(rg, mode = "weak")
+ )
+l <- layout.fruchterman.reingold(rg)
+
+par(mar = c(0,0,0,0) + 0.1)
+plot(rg,
+ layout = l,
+ vertex.color = rgb(1, 1, 0, 0.2),
+ vertex.size = 3,
+ vertex.frame.color= rgb(0, 0, 0, 0.5),
+ vertex.label.cex = 0.6,
+ vertex.label.color = rgb(0, 0, 0, 0.7),
+ vertex.label.family = 'Heiti TC Light',
+ edge.curved = 0.1,
+ edge.arrow.size = 0.1,
+ edge.color = "#4169E1",
+ edge.label.cex = 0.4,
+ edge.label.color = rgb(1, 0, 0)
+ )
![](V31_networkviz_files/figure-html/unnamed-chunk-6-1.png)
30.2 Retrieve Top3 Components
-components <- igraph::clusters(rg, mode="weak")
-biggest_cluster_id <- which.max(components$csize)
-# which.max(components$csize)
-# components$csize
-# biggest_cluster_id
-top3_break <- sort(unique(components$csize), decreasing = T)[3]
-biggest_cluster_id <- which(components$csize >= top3_break)
-vert_ids <- V(rg)[components$membership %in% biggest_cluster_id]
-rg <- igraph::induced_subgraph(rg, vert_ids)
-
-
-
-message("\n(V, E, Reciprocity, nComponent)\n",
- length(V(rg)), "\t",
- length(E(rg)), "\t",
- sprintf("%.3f", reciprocity(rg))
- )
+components <- igraph::clusters(rg, mode="weak")
+biggest_cluster_id <- which.max(components$csize)
+# which.max(components$csize)
+# components$csize
+# biggest_cluster_id
+top3_break <- sort(unique(components$csize), decreasing = T)[3]
+biggest_cluster_id <- which(components$csize >= top3_break)
+vert_ids <- V(rg)[components$membership %in% biggest_cluster_id]
+rg <- igraph::induced_subgraph(rg, vert_ids)
+
+
+
+message("\n(V, E, Reciprocity, nComponent)\n",
+ length(V(rg)), "\t",
+ length(E(rg)), "\t",
+ sprintf("%.3f", reciprocity(rg))
+ )
30.2.1 Visualize again
-l <- layout.fruchterman.reingold(rg)
-
-par(mar = c(0,0,0,0) + 0.1)
-plot(rg,
- layout = l,
- vertex.color = rgb(1, 1, 0, 0.2),
- vertex.size = 3,
- vertex.frame.color= rgb(0, 0, 0, 0.5),
- vertex.label.cex = 0.6,
- vertex.label.color = rgb(0, 0, 0, 0.7),
- vertex.label.family = 'Heiti TC Light',
- edge.curved = 0.1,
- edge.arrow.size = 0.1,
- edge.color = "#4169E1",
- edge.label.cex = 0.4,
- edge.label.color = rgb(1, 0, 0)
- )
+l <- layout.fruchterman.reingold(rg)
+
+par(mar = c(0,0,0,0) + 0.1)
+plot(rg,
+ layout = l,
+ vertex.color = rgb(1, 1, 0, 0.2),
+ vertex.size = 3,
+ vertex.frame.color= rgb(0, 0, 0, 0.5),
+ vertex.label.cex = 0.6,
+ vertex.label.color = rgb(0, 0, 0, 0.7),
+ vertex.label.family = 'Heiti TC Light',
+ edge.curved = 0.1,
+ edge.arrow.size = 0.1,
+ edge.color = "#4169E1",
+ edge.label.cex = 0.4,
+ edge.label.color = rgb(1, 0, 0)
+ )
![](V31_networkviz_files/figure-html/unnamed-chunk-8-1.png)
@@ -901,64 +907,64 @@ 30.2.1 Visualize again30.3 Motif visualization and analysis
30.3.1 Motif type
-library(igraph)
-par(mfrow=c(4,4), mai= rep(0.2, 4))
-
-for(i in 0:15){
- g1 <- graph_from_isomorphism_class(3, i)
- plot(g1,
- vertex.color = "gold",
- vertex.size = 20,
- # vertex.size = (V(g)$nTweets)^(1/3)+1,
- vertex.frame.color= "black",
- vertex.label = NA,
- edge.color = "black",
- edge.arrow.size = 0.5)
- title(i, line=-3, adj=0.4 ,col.main="royalblue")
-}
+library(igraph)
+par(mfrow=c(4,4), mai= rep(0.2, 4))
+
+for(i in 0:15){
+ g1 <- graph_from_isomorphism_class(3, i)
+ plot(g1,
+ vertex.color = "gold",
+ vertex.size = 20,
+ # vertex.size = (V(g)$nTweets)^(1/3)+1,
+ vertex.frame.color= "black",
+ vertex.label = NA,
+ edge.color = "black",
+ edge.arrow.size = 0.5)
+ title(i, line=-3, adj=0.4 ,col.main="royalblue")
+}
![](V31_networkviz_files/figure-html/unnamed-chunk-9-1.png)
30.3.3 Generate motives
-barabas_motif <- function(e){
- g <- barabasi.game(e, directed = T)
- vec <- motifs(g, 3) %>% replace_na(0)
- for(i in 1:99){
- g <- barabasi.game(e, directed = T)
- tmp <- motifs(g, 3) %>% replace_na(0)
- vec <- vec + tmp
- }
- vec <- vec / 100
- writeLines(as.character(vec), sep = "\t")
-
-}
-
-random_net_motif <- function(v, e){
- g <- sample_gnm(v, e, directed=T)
- vec <- motifs(g, 3) %>% replace_na(0)
- for(i in 1:99){
- g <- sample_gnm(v, e, directed=T)
- tmp <- motifs(g, 3) %>% replace_na(0)
- vec <- vec + tmp
- }
- vec <- vec / 100
- writeLines(as.character(vec), sep = "\t")
-}
-
+barabas_motif <- function(e){
+ g <- barabasi.game(e, directed = T)
+ vec <- motifs(g, 3) %>% replace_na(0)
+ for(i in 1:99){
+ g <- barabasi.game(e, directed = T)
+ tmp <- motifs(g, 3) %>% replace_na(0)
+ vec <- vec + tmp
+ }
+ vec <- vec / 100
+ writeLines(as.character(vec), sep = "\t")
+
+}
+
+random_net_motif <- function(v, e){
+ g <- sample_gnm(v, e, directed=T)
+ vec <- motifs(g, 3) %>% replace_na(0)
+ for(i in 1:99){
+ g <- sample_gnm(v, e, directed=T)
+ tmp <- motifs(g, 3) %>% replace_na(0)
+ vec <- vec + tmp
+ }
+ vec <- vec / 100
+ writeLines(as.character(vec), sep = "\t")
+}
+
## 0 0 245.78 0 490.12 0.87 247.04 0.77 0 0.78 0 0.36 0.01 0 0 0
-
+
## 0 0 2517.01 0 459.54 0 0 0 0 0 0 0 0 0 0 0
diff --git a/optimism-survey-by-countries.html b/optimism-survey-by-countries.html
index fa3dab5..97c57c7 100644
--- a/optimism-survey-by-countries.html
+++ b/optimism-survey-by-countries.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
@@ -786,31 +792,31 @@ Chapter 34 Optimism Survey by Cou
這個練習為紐約時報的一則報導「Where Are Young People Most Optimistic? In Poorer Nations. - The New York Times (nytimes.com)」。該報導乃根據一項涵蓋 21 個國家的大型調查,這項調查比較了不同國家和年齡層(年輕人對成年人)對於下一代的生活是否會比現在更好的看法。該調查還比較了不同國家(富裕與貧窮)和年齡層(年輕人對成年人)對於當今兒童在基本方面的狀況,以及對於社會和環境問題的看法。此外,調查還比較了不同國家和年齡層對於現代科技對年輕人生活的影響看法,以及對於焦慮和壓力等方面的看法。
聯合國兒童基金會與 Gallup 共同進行了這項調查,該調查共有 21,000 名受訪者,分為兩個年齡組別——15 至 24 歲和 40 歲以上,並包括來自世界各地的代表性樣本。年輕組表示,當今兒童在教育、醫療保健和身體安全等基本方面都比他們的父母更好。在中位數國家中,有 57% 的年輕人表示,隨著每一代的到來,世界正在變得越來越美好,而這一比例在老年人中僅有 39%。然而,在富裕國家,56% 的年輕人和 64% 的老年人表示,當今兒童在經濟方面將比他們的父母更加困難——這種觀點與近年來許多人的經濟現實相符。
視覺化的重點是等比例之座標軸的運用
-plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>%
- select(country = WP5, age = WP22140, bw = WP22092) %>%
- mutate(country = ordered(country,
- levels=c(1, 3, 4, 10, 11, 12,
- 13, 14, 17, 29, 31,
- 33, 35, 36, 60, 61,
- 77, 79, 81, 87, 165),
- labels=c("USA", "Morocco", "Lebanon",
- "Indonesia", "Bangladesh",
- "UK", "France", "Germany",
- "Spain", "Japan", "India",
- "Brazil", "Nigeria", "Kenya",
- "Ethiopia", "Mali", "Ukraine",
- "Cameroon", "Zimbabwe",
- "Argentina", "Peru"))) %>%
- count(country, age, bw) %>%
- group_by(country, age) %>%
- mutate(perc = n/sum(n)) %>%
- ungroup() %>%
- filter(bw == 1) %>%
- select(country, age, perc) %>%
- spread(age, perc) %>%
- rename(`15-24y` = `1`, `40+y` = `2`)
-
-plot.opt %>% head(10) %>% knitr::kable()
+plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>%
+ select(country = WP5, age = WP22140, bw = WP22092) %>%
+ mutate(country = ordered(country,
+ levels=c(1, 3, 4, 10, 11, 12,
+ 13, 14, 17, 29, 31,
+ 33, 35, 36, 60, 61,
+ 77, 79, 81, 87, 165),
+ labels=c("USA", "Morocco", "Lebanon",
+ "Indonesia", "Bangladesh",
+ "UK", "France", "Germany",
+ "Spain", "Japan", "India",
+ "Brazil", "Nigeria", "Kenya",
+ "Ethiopia", "Mali", "Ukraine",
+ "Cameroon", "Zimbabwe",
+ "Argentina", "Peru"))) %>%
+ count(country, age, bw) %>%
+ group_by(country, age) %>%
+ mutate(perc = n/sum(n)) %>%
+ ungroup() %>%
+ filter(bw == 1) %>%
+ select(country, age, perc) %>%
+ spread(age, perc) %>%
+ rename(`15-24y` = `1`, `40+y` = `2`)
+
+plot.opt %>% head(10) %>% knitr::kable()
@@ -872,15 +878,15 @@ Chapter 34 Optimism Survey by Cou
-plot.opt %>%
- ggplot() + aes(`40+y`, `15-24y`, label = country) +
- geom_point(color = "skyblue", size = 2) +
- xlim(0, 1) + ylim(0,1) +
- geom_text(hjust = -0.1, vjust = -0.5) +
- geom_abline(intercept = 0, slop = 1,
- color="lightgrey", alpha=0.5, linetype="dashed") +
- theme_minimal() +
- theme(aspect.ratio=1)
+plot.opt %>%
+ ggplot() + aes(`40+y`, `15-24y`, label = country) +
+ geom_point(color = "skyblue", size = 2) +
+ xlim(0, 1) + ylim(0,1) +
+ geom_text(hjust = -0.1, vjust = -0.5) +
+ geom_abline(intercept = 0, slop = 1,
+ color="lightgrey", alpha=0.5, linetype="dashed") +
+ theme_minimal() +
+ theme(aspect.ratio=1)
![](W4_Optimism_by_Countries_files/figure-html/unnamed-chunk-3-1.png)
diff --git a/proportion.html b/proportion.html
index 897f238..df2e04e 100644
--- a/proportion.html
+++ b/proportion.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -807,77 +813,77 @@ 26.3 Treemap: Nested Proportion26.3.1 NYT: Carbon by countries
本案例取自紐時所報導之Who Has The Most Historical Responsibility for Climate Change? - The New York Times (nytimes.com)。該新聞報導了聯合國氣候峰會在格拉斯哥舉行期間的一個重要議題:世界上最富裕的國家,即那些對全球暖化負責任的不成比例的國家,應如何賠償因全球氣溫上升所造成的貧困國家的損失。報導指出,現今全球人口中,包括美國、加拿大、日本以及西歐大部分國家在內的富裕國家僅佔12%,但是在過去的170年中,這些國家卻負責了50%的溫室氣體排放。貧困國家要求富裕國家提供更多資金以應對全球暖化所帶來的風險。在峰會上,來自最不發達國家聯盟的Sonam P. Wangdi指出,他的祖國不丹對全球暖化的責任較小,因為該國目前吸收的二氧化碳比汽車和房屋排放的少。然而,不丹仍然面臨著由氣溫上升所帶來的嚴重風險,喜馬拉雅山脈融化的冰川已經導致了洪水和泥石流,摧毀了村莊。報導指出,最不發達國家需要更多的資金和支持,以應對全球暖化所帶來的影響。
本案例的Treemap以面積顯示了各國的碳排放所佔比例,並用顏色視覺化各國的人均GDP。Per Capita是拉丁語,通常用來表示某種統計數據與人口數量之間的關係。它是指將某一特定數量的總量除以人口數目,以得出每個人所擁有的平均數量。例如,國家的人均GDP(Gross Domestic Product,國內生產總值)是指該國的總GDP除以該國的人口數,以反映一個人在該國經濟中所創造的平均貢獻。Per Capita常用於比較不同國家或地區之間的平均水平,以及分析人均收入、人均支出、人均消費等數據。
-totreemap <- read_csv("data/GCB2021v34_MtCO2_flat.csv") %>%
- drop_na(`Total`) %>%
- filter(!Country %in% c("Global", "International Transport")) %>%
- filter(Year==2020) %>%
- arrange(desc(`Total`)) %>%
- mutate(perc = Total/sum(Total)) %>%
- slice(1:20)
-library(treemapify)
-totreemap %>%
- ggplot() + aes(area = perc, fill=`Per Capita`, label=Country) +
- geom_treemap() +
- geom_treemap_text(color="white",
- place="centre",
- grow=TRUE
- )
+totreemap <- read_csv("data/GCB2021v34_MtCO2_flat.csv") %>%
+ drop_na(`Total`) %>%
+ filter(!Country %in% c("Global", "International Transport")) %>%
+ filter(Year==2020) %>%
+ arrange(desc(`Total`)) %>%
+ mutate(perc = Total/sum(Total)) %>%
+ slice(1:20)
+library(treemapify)
+totreemap %>%
+ ggplot() + aes(area = perc, fill=`Per Capita`, label=Country) +
+ geom_treemap() +
+ geom_treemap_text(color="white",
+ place="centre",
+ grow=TRUE
+ )
![](V05_Proportion_files/figure-html/unnamed-chunk-2-1.png)
26.3.2 TW: Taiwan Annual Expenditure
上述案例未能突顯出Treemap能夠呈現階層式資料的特色。因此本案例將使用台灣中央預算,階層化地顯示不同機構層級(大類、一級部會)等的預算佔比。例如衛福部、財政部與勞動部的預算均屬於社會福利支出。
這段程式碼中,使用了 zoo
套件中的 na.locf()
函數。此函數用於將 raw
資料框中的 款
欄位的缺失值 (NA) 以最近已知的值 (向前填補) 進行填補。
-library(zoo)
-
-# raw <- readxl::read_excel("data/111B歲出政事別預算總表.xls")
-raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F)
-names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差")
-# raw$款 <- na.locf(raw$款)
-
-cleand <- raw %>%
- filter(!is.na(款) | !is.na(科)) %>%
- slice(-(1:2)) %>%
- select(-目, -節) %>%
- mutate(org = purrr::map(機構, function(x){str_split(x, "\n")[[1]][2]})) %>%
- mutate(款 = ifelse(!is.na(款), unlist(org), unlist(款))) %>%
- mutate(款 = zoo::na.locf(款)) %>%
- filter(!is.na(科)) %>%
- select(-科) %>% type_convert() %>%
- mutate(上年度預算 = as.numeric(上年度預算),
- 上年度決算 = as.integer(上年度決算),
- 預算差 = as.numeric(預算差)) %>%
- replace_na(list(上年度預算 = 0, 上年度決算 = 0)) %>%
- mutate(預算差 = 本年度預算 - 上年度預算)
-cleand %>%
- filter(款 %in% c("科學支出")) %>%
- ggplot() + aes(area = 本年度預算, fill=`本年度預算`, label=org) +
- geom_treemap() +
- geom_treemap_text(color="white",
- place="centre",
- grow=TRUE,
- family = "Heiti TC Light"
- ) +
- theme(title = element_text(family = "Heiti TC Light"),
- text = element_text(family = "Heiti TC Light"))
+library(zoo)
+
+# raw <- readxl::read_excel("data/111B歲出政事別預算總表.xls")
+raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F)
+names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差")
+# raw$款 <- na.locf(raw$款)
+
+cleand <- raw %>%
+ filter(!is.na(款) | !is.na(科)) %>%
+ slice(-(1:2)) %>%
+ select(-目, -節) %>%
+ mutate(org = purrr::map(機構, function(x){str_split(x, "\n")[[1]][2]})) %>%
+ mutate(款 = ifelse(!is.na(款), unlist(org), unlist(款))) %>%
+ mutate(款 = zoo::na.locf(款)) %>%
+ filter(!is.na(科)) %>%
+ select(-科) %>% type_convert() %>%
+ mutate(上年度預算 = as.numeric(上年度預算),
+ 上年度決算 = as.integer(上年度決算),
+ 預算差 = as.numeric(預算差)) %>%
+ replace_na(list(上年度預算 = 0, 上年度決算 = 0)) %>%
+ mutate(預算差 = 本年度預算 - 上年度預算)
+cleand %>%
+ filter(款 %in% c("科學支出")) %>%
+ ggplot() + aes(area = 本年度預算, fill=`本年度預算`, label=org) +
+ geom_treemap() +
+ geom_treemap_text(color="white",
+ place="centre",
+ grow=TRUE,
+ family = "Heiti TC Light"
+ ) +
+ theme(title = element_text(family = "Heiti TC Light"),
+ text = element_text(family = "Heiti TC Light"))
![](V05_Proportion_files/figure-html/unnamed-chunk-4-1.png)
-library(treemapify)
-cleand %>%
- # filter(款 %in% c("科學支出", "教育支出", "國防支出", "司法支出")) %>%
- ggplot() + aes(area = 本年度預算, fill=`本年度預算`, label=org, subgroup = 款) +
- geom_treemap() +
- geom_treemap_subgroup_border(color="gold") +
- geom_treemap_subgroup_text(place = "centre", grow = T, alpha = 0.5, colour =
- "gold", min.size = 0,
- family = "Heiti TC Light") +
- geom_treemap_text(color="white",
- place="centre",
- grow=F,
- family = "Heiti TC Light"
- ) +
- theme(title = element_text(family = "Heiti TC Light"),
- text = element_text(family = "Heiti TC Light"),
- legend.position = "none")
+library(treemapify)
+cleand %>%
+ # filter(款 %in% c("科學支出", "教育支出", "國防支出", "司法支出")) %>%
+ ggplot() + aes(area = 本年度預算, fill=`本年度預算`, label=org, subgroup = 款) +
+ geom_treemap() +
+ geom_treemap_subgroup_border(color="gold") +
+ geom_treemap_subgroup_text(place = "centre", grow = T, alpha = 0.5, colour =
+ "gold", min.size = 0,
+ family = "Heiti TC Light") +
+ geom_treemap_text(color="white",
+ place="centre",
+ grow=F,
+ family = "Heiti TC Light"
+ ) +
+ theme(title = element_text(family = "Heiti TC Light"),
+ text = element_text(family = "Heiti TC Light"),
+ legend.position = "none")
![](V05_Proportion_files/figure-html/unnamed-chunk-5-1.png)
diff --git a/ptt-scrape.html b/ptt-scrape.html
index 7e249bc..8b4e7ed 100644
--- a/ptt-scrape.html
+++ b/ptt-scrape.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -794,9 +800,9 @@ Chapter 19 Scraping PTT
19.1 Step 1. 載入所需套件
在這個例子中,不僅要用httr
來取得網頁頁面,還要用rvest
套件(其實是呼叫xml2
)來剖析網頁。網頁內容並不像json一樣可以直接轉為DataFrame
或list
。網頁內容可以是資料、視覺化元素、也可以是架構元素,相對於json而言複雜也冗贅許多。因此需要一個套件能夠剖析HTML標籤例如xml2
,而rvest
內則應用了xml2
套件的內容來剖析網頁,另外,我會用bind_rows()
將過程中所抓取的資料進行合併。
-
+
19.2 Step 2. 取回並剖析HTML檔案
@@ -812,11 +818,11 @@ 19.2.1 Step 2-1. re
read_html()
內部包含了GET()
與content()
等的實作,其主要的功能是將取回來的回應(response)轉為xml_document
。若以class(doc)
觀察其型態,會是xml_document xml_node
。
使用browseURL(url)
可以用瀏覽器打開該網址並瀏覽。
-
+
19.2.2 Step 2-2 以html_nodes()
以選擇所需的資料節點
@@ -829,15 +835,15 @@ 19.2.2 Step 2-2 以
div.title
指的是class
為title
的div
(排版元素)。
Div.r-list-container.action-bar-margin.bbs-screen
指的是同時具有r-list-container
、action-bar-margin
、bbs-scree
三個class
的div
元素。
-css <- "#main-container > div.r-list-container.action-bar-margin.bbs-screen > div > div.title > a"
-
-node.a <- html_nodes(doc, css)
-class(node.a) # "xml_nodeset"
-length(node.a)
+css <- "#main-container > div.r-list-container.action-bar-margin.bbs-screen > div > div.title > a"
+
+node.a <- html_nodes(doc, css)
+class(node.a) # "xml_nodeset"
+length(node.a)
用XPath抽取:
-
+
19.2.3 Step 2-2 補充說明與XPath、CSS Selector的最佳化
@@ -873,32 +879,32 @@ 19.2.4 Step 2-3 htm
html_attr()
: 在<a>
內的href="/bbs/Boy-Girl/M.1523983903.A.71E.html"
稱為<a>
的屬性,該屬性名稱為href
(Hyper Reference的意思),屬性值為/bbs/Boy-Girl/M.1523983903.A.71E.html
。要用html_attr(node.a, "href")
來抽取(相當於指定某個元素的href
屬性的內容)。
取出元素節點的內容,相當於取出<a></a>
間所夾的內容。
-
+
取出元素節點某個屬性的值,這邊是取出href
這個屬性的值,也就是超鏈結。
-links <- html_attr(node.a, "href")
-class(links)
-# character
-links[1]
-# "/bbs/Boy-Girl/M.1555188846.A.D5F.html"
+links <- html_attr(node.a, "href")
+class(links)
+# character
+links[1]
+# "/bbs/Boy-Girl/M.1555188846.A.D5F.html"
但這些超鏈結只有後半段,點開一篇文章觀察其網址,發現我們所抓到的網址少了前面那一段,因此用paste0()
黏上前綴的網址前段,便可得到完整網址,可用browseURL(links[1])
觀察。
-pre <- "https://www.ptt.cc"
-links <- paste0(pre, links)
-links[1]
-# [1] "https://www.ptt.cc/bbs/Boy-Girl/M.1555188846.A.D5F.html"
+pre <- "https://www.ptt.cc"
+links <- paste0(pre, links)
+links[1]
+# [1] "https://www.ptt.cc/bbs/Boy-Girl/M.1555188846.A.D5F.html"
重組上列程式碼如下:
-pre <- "https://www.ptt.cc"
-url <- "https://www.ptt.cc/bbs/Boy-Girl/index.html"
-doc <- read_html(url)
-css <- "#main-container div.r-ent div.title a"
-node.a <- html_nodes(doc, css)
+pre <- "https://www.ptt.cc"
+url <- "https://www.ptt.cc/bbs/Boy-Girl/index.html"
+doc <- read_html(url)
+css <- "#main-container div.r-ent div.title a"
+node.a <- html_nodes(doc, css)
題外話,因為rvest
與httr
均支援tidyverse的程式寫作,因此可改為以下pipeline的形式。但我不見得會這麼寫,比如說<a>
這個元素我可能不僅會取出其超鏈結,還打算取出標題文字,為了避免重複操作,我不見得會用tidyverse來寫。
-
+
@@ -912,30 +918,30 @@ 19.3 Step 3. 用for迴圈打撈
因此,我打算寫一個for迴圈,讓他幫我(先)抓最後10頁,那就是3894到3903頁。並且,把頁數當成網址的參數,用sprintf()
或paste0()
組合出網址,以下分別提供兩種版本。你可以把它印出來且點選看看是否是你所要的網頁。
-for(p in 3894:3903){
- url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p)
- # url <- paste0("https://www.ptt.cc/bbs/Boy-Girl/index", p, ".html")
-}
+for(p in 3894:3903){
+ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p)
+ # url <- paste0("https://www.ptt.cc/bbs/Boy-Girl/index", p, ".html")
+}
接下來,我要用一個all_links
變數來存放所有的網址,並且把每一個頁面抓到的網址們都用vector
的concatenation
,也就是c()
黏在一起 all_links <- c(all_links, links)
。
-all_links <- c()
-for(p in 3894:3903){
- url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p)
- all_links <- c(all_links, links)
-}
+all_links <- c()
+for(p in 3894:3903){
+ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p)
+ all_links <- c(all_links, links)
+}
最後,我就將上述抓到網址的方法填入這個for迴圈中,並把抓到的網址存為links,就會隨著每回合的for迴圈逐漸把抓到的網址整理在一起。
-pre <- "https://www.ptt.cc"
-all_links <- c()
-for(p in 3894:3903){
- url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p)
- print(url)
- doc <- read_html(url) # Get and parse the url
- css <- "#main-container div.r-ent div.title a"
- node.a <- html_nodes(doc, css)
- links <- html_attr(node.a, "href")
- links <- paste0(pre, links) # Recover links
- all_links <- c(all_links, links)
-}
-length(all_links)
+pre <- "https://www.ptt.cc"
+all_links <- c()
+for(p in 3894:3903){
+ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p)
+ print(url)
+ doc <- read_html(url) # Get and parse the url
+ css <- "#main-container div.r-ent div.title a"
+ node.a <- html_nodes(doc, css)
+ links <- html_attr(node.a, "href")
+ links <- paste0(pre, links) # Recover links
+ all_links <- c(all_links, links)
+}
+length(all_links)
19.4 Step 4. 根據連結取回所有貼文
@@ -943,50 +949,50 @@ 19.4 Step 4. 根據連結取回
不失一般性地,用第一篇貼文的鏈結來做資料抓取實驗,之後再抓第二篇、第三篇即可。
首先,對於這每篇文章,我要爬取作者(author)、標題(title)、時間(time)、看板(board)和內容(content)五個欄位,包含原本文章的連結url一共六個欄位。
從以下的圖發現,每篇文章的內容放置在div#main-content中,之後一連跟著四個div.article-metaline,裡面分別有作者、看板、標題與時間,但從class名稱看不出來哪個,但我們要的值會是在span.article-meta-value中。所以我的規劃是,一次把所有的.article-meta-value給抓回來,然後再去分別指定哪個是作者、看板、標題或時間。所以我用
-link <- all_links[1]
-doc <- read_html(link)
-meta.css <- "#main-content div.article-metaline span.article-meta-value"
-metadata <- html_text(html_nodes(doc, meta.css))
+link <- all_links[1]
+doc <- read_html(link)
+meta.css <- "#main-content div.article-metaline span.article-meta-value"
+metadata <- html_text(html_nodes(doc, meta.css))
PTT貼文的HTML結構
另外,從上面的文字中可發現,主文的部分被包含在div#main-content中,但在上述的作者、標題等後面,若這時候我們用CSS Selector搭配html_node()和html_text()把div#main-content的內容都給取出來,會連上述的作者、標題等都一起取出來。最好的方法是用XPath的text()來只取出文字的部分,而不取出有tag的部分。
而且這樣取出來會是每個paragraph都是一個character vector中的值,所以要把他們合併成一篇文章,此時要用paste()指令,paste()指令可以指定把一個character vector給串接成一個string,輸入的變數是一個character vector,然後設定參數collapse = ““,代表串接起這些character時中間不要有空白。
-post.xpath <- '//*[@id="main-content"]/text()'
-post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
-post <- paste(post.paragraph, collapse = "")
+post.xpath <- '//*[@id="main-content"]/text()'
+post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
+post <- paste(post.paragraph, collapse = "")
最後,我們知道metadata變數的第一個是作者、第二個是標題、第三個是時間、便依序指派給個別的變數後,組成DataFrame如下,這樣所組成的DataFrame是為只有一筆資料的DataFrame,但有五個變項。
-link <- all_links[1]
-doc <- read_html(link)
-meta.css <- "#main-content div.article-metaline span.article-meta-value"
-metadata <- html_text(html_nodes(doc, meta.css))
-post.xpath <- '//*[@id="main-content"]/text()'
-post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
-post <- paste(post.paragraph, collapse = "")
-post.df <- data.frame(post,
- uid = metadata[1],
- title = metadata[2],
- timestamp = metadata[3],
- url = link
- )
+link <- all_links[1]
+doc <- read_html(link)
+meta.css <- "#main-content div.article-metaline span.article-meta-value"
+metadata <- html_text(html_nodes(doc, meta.css))
+post.xpath <- '//*[@id="main-content"]/text()'
+post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
+post <- paste(post.paragraph, collapse = "")
+post.df <- data.frame(post,
+ uid = metadata[1],
+ title = metadata[2],
+ timestamp = metadata[3],
+ url = link
+ )
這樣我們取得的第一篇文章存放在post.df中,之後,我稍微修改一下上述的程式,就可以用for迴圈抓取第2至n篇文章,每一篇都存在名為temp.df的DataFrame中,然後用bind_rows()
依序和post.df
銜接在一起,除了黃色的部分是新增的之外,都跟前面的程式幾乎一模一樣。
-for(link in all_links[2:10]){
- doc <- read_html(link)
- meta.css <- "#main-content .article-metaline .article-meta-value"
- metadata <- html_text(html_nodes(doc, meta.css))
- post.xpath <- '//*[@id="main-content"]/text()'
- post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
- post <- paste(post.paragraph, collapse = "")
-
- temp.df <- data.frame(post,
- uid = metadata[1],
- title = metadata[2],
- timestamp = metadata[3],
- url = link
- )
- post.df <- bind_rows(post.df, temp.df)
-}
+for(link in all_links[2:10]){
+ doc <- read_html(link)
+ meta.css <- "#main-content .article-metaline .article-meta-value"
+ metadata <- html_text(html_nodes(doc, meta.css))
+ post.xpath <- '//*[@id="main-content"]/text()'
+ post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
+ post <- paste(post.paragraph, collapse = "")
+
+ temp.df <- data.frame(post,
+ uid = metadata[1],
+ title = metadata[2],
+ timestamp = metadata[3],
+ url = link
+ )
+ post.df <- bind_rows(post.df, temp.df)
+}
打撈回來的HTTP資料
@@ -996,44 +1002,44 @@ 19.4 Step 4. 根據連結取回
19.5 補充(1) 較好的寫法
一個比較好的寫法是,不用先讀第一篇文章,而是用data.frame()
初始化一個空的DataFrame,之後可以利用bind_rows()
可自動增添缺少的變數的特性,自然就會補上所需要的變數。因此,只要改寫黃色的部分。
但這樣的寫法仍會有一個缺點,也就是當文章數越來越多時會越跑越慢。原因是,假設現在你已經抓了9999篇文章,你這次的for迴圈要抓第10000篇,然後用bind_rows()
合併第10000篇,此時,post.df
已經有9999篇非常肥大,等號右邊的bind_rows()
跑完後會變成10000篇,此時又要把原本很肥大的post.df覆蓋掉,所以會非常費時。
-post.df <- data.frame()
-for(link in all_links[1:10]){
- doc <- read_html(link)
- meta.css <- "#main-content .article-metaline .article-meta-value"
- metadata <- html_text(html_nodes(doc, meta.css))
- post.xpath <- '//*[@id="main-content"]/text()'
- post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
- post <- paste(post.paragraph, collapse = "")
-
- temp.df <- data.frame(post,
- uid = metadata[1],
- title = metadata[2],
- timestamp = metadata[3],
- url = link
- )
- post.df <- bind_rows(post.df, temp.df)
-}
+post.df <- data.frame()
+for(link in all_links[1:10]){
+ doc <- read_html(link)
+ meta.css <- "#main-content .article-metaline .article-meta-value"
+ metadata <- html_text(html_nodes(doc, meta.css))
+ post.xpath <- '//*[@id="main-content"]/text()'
+ post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
+ post <- paste(post.paragraph, collapse = "")
+
+ temp.df <- data.frame(post,
+ uid = metadata[1],
+ title = metadata[2],
+ timestamp = metadata[3],
+ url = link
+ )
+ post.df <- bind_rows(post.df, temp.df)
+}
19.6 補充(2) 最佳的寫法
採用list
先將每一個DataFrame
存放起來,然後跑完所有的for迴圈後才用bind_rows()
將所有資料合併為DataFrame
。此時,p
指的是第幾個連結,而前例的link
就相當於下方的all_link[p]
。
-post.list <- list()
-for(p in 1:length(all_links)){
- doc <- read_html(all_links[p])
- meta.css <- "#main-content .article-metaline .article-meta-value"
- metadata <- html_text(html_nodes(doc, meta.css))
- post.xpath <- '//*[@id="main-content"]/text()'
- post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
- post <- paste(post.paragraph, collapse = "")
-
- post.list[[p]] <- data.frame(post,
- uid = metadata[1],
- title = metadata[2],
- timestamp = metadata[3],
- url = all_links[p]
- )
-}
-post.df <- bind_rows(post.list)
+post.list <- list()
+for(p in 1:length(all_links)){
+ doc <- read_html(all_links[p])
+ meta.css <- "#main-content .article-metaline .article-meta-value"
+ metadata <- html_text(html_nodes(doc, meta.css))
+ post.xpath <- '//*[@id="main-content"]/text()'
+ post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath))
+ post <- paste(post.paragraph, collapse = "")
+
+ post.list[[p]] <- data.frame(post,
+ uid = metadata[1],
+ title = metadata[2],
+ timestamp = metadata[3],
+ url = all_links[p]
+ )
+}
+post.df <- bind_rows(post.list)
diff --git a/r-basic.html b/r-basic.html
index 5f15002..d5e5bc9 100644
--- a/r-basic.html
+++ b/r-basic.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -804,11 +810,11 @@ 3.1.1 Assignmenta <- 1
-b <- c(1, 2, 3, 4)
-c <- c("1", "2", "3", "4")
-d <- c(b, a)
-e <- "abcd"
+
@@ -828,40 +834,40 @@ 3.2 Vector
3.2.1 Creating vectors
vector通常用c()
函數創建,其中c表示”combine”或”concatenate”,可以將多個元素組合成一個vector。
-income <- c(70100, 51300, 51100, 48400, 47600, 43000)
-county <- c("台北", "新北", "桃園", "高雄", "台中", "台南")
-population <- c(2.6, 3.9, 2.2, 2.7, 2.8, 1.8)
-area <- c(271.8, 2052.5, 1221, 2951.9, 2214.9, 2191.7)
-income
+income <- c(70100, 51300, 51100, 48400, 47600, 43000)
+county <- c("台北", "新北", "桃園", "高雄", "台中", "台南")
+population <- c(2.6, 3.9, 2.2, 2.7, 2.8, 1.8)
+area <- c(271.8, 2052.5, 1221, 2951.9, 2214.9, 2191.7)
+income
## [1] 70100 51300 51100 48400 47600 43000
-
+
## [1] "台中" "桃園" "台北"
-
+
## [1] "台中" "桃園" "台北"
-
+
## [1] 271.8 2052.5 1221.0 2951.9 2214.9 2191.7
-
+
## [1] 2.6 3.9 2.2 2.7 2.8 1.8
3.2.1.1 Creating a sequence
-
+
## [1] 11 22 33 44 55 66 77 88 99
-
+
## [1] 11 12 13 14 15 16 17 18 19 20
@@ -871,40 +877,40 @@ 3.2.2 Creating a fake data with C
3.2.3 Viewing
-
+
## [1] "台中" "桃園" "台北"
-
+
## [1] 70100 51300 51100 48400 47600 43000
-
+
## [1] "台中" "桃園" "台北"
-
+
## [1] "台中" "桃園" "台北"
-
+
## [1] 3
-
+
## [1] "character"
-
+
## [1] "character"
-
+
## [1] 3
-
+
## [1] 6
3.2.4 Subsetting, filtering
vector可以用中括號[]
搭配數字來取用vector中的元素,下標從1開始。例如,要取用上述的vector中的第三個元素,可以使用my_vector[3]
。
It is important to know how to neglect first n or last n elements. For example, a[1:(length(a)-2)] will neglect the last two elements. Thinking why I need parentheses for length(a)-2
here.
-
+
## [1] "台中" "桃園" "台北"
-
+
## [1] NA "台北" "台中"
-
+
## [1] "台北" NA NA NA
-
+
## [1] 13 14 15 16 17 18 19
-
+
## [1] 19 18 17 16 15 14 13
@@ -912,22 +918,22 @@ 3.2.5 Deletingb <- 11:20
-b[-(3:5)]
+
## [1] 11 12 16 17 18 19 20
-
+
## [1] 12 14 16 17 18 19 20
-
+
## [1] 11 12 13 14 15 16 17 18 19 20
- Correct deleting operations with assignment to replace original vector
-
+
## [1] 11 12 16 17 18 19 20
-
+
## [1] 22 44 66 77 88 99
@@ -935,17 +941,17 @@ 3.2.6 Concatenatinga <- 1:10
-a <- c(a, 11)
-a
+
## [1] 1 2 3 4 5 6 7 8 9 10 11
-
+
## [1] 11 12 16 17 18 19 20
-
-## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20
-a <- c(a, a, b)
+
+## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20
+
## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20 1 2 3 4 5 6 7
## [26] 8 9 10 11 11 12 16 17 18 19 20 11 12 16 17 18 19 20
@@ -954,51 +960,51 @@ 3.2.6 Concatenating3.3 Calculating with vectors
3.3.1 Arithmetic operations
-
+
## [1] 14 15 16 17 18 19 20 21 22
-
+
## [1] 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5
-
+
## [1] 1 0 1 0 1 0 1 0 1
-
+
## [1] 5 6 6 7 7 8 8 9 9
-
+
## [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE
-
+
## [1] 2 4 6 8
-
+
## [1] 12 14 16 18
-
+
## [1] 12 14 16 18
-
+
## [1] TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE
-
+
## [1] 12 14 16 18
-
+
## [1] 11 13 15 17 19
-
+
3.3.2 Logic comparisons
-
+
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
-
+
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
-
+
## [1] 0 0 0 0 0 0 0 0 0
-
+
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
-
+
## [1] TRUE FALSE FALSE FALSE FALSE FALSE
-
+
## [1] TRUE
-
+
## [1] TRUE
-
+
## [1] FALSE
-
+
## [1] FALSE
@@ -1006,23 +1012,23 @@ 3.3.3 Subsetting by logic compari
- two methods to filter data from vectors, by index vector or a logical vector with equal length.
-
+
## [1] 11 33 55
-
+
## [1] 11 33 55
-
+
## [1] 1 0 1 0 1
-
+
## [1] TRUE FALSE TRUE FALSE TRUE
-
+
## [1] "你好棒棒" "你真的好棒"
-
+
## [1] 11 33 55
-
+
## [1] 1 3 5
@@ -1032,51 +1038,51 @@ 3.3.4 Sorting and orderingorder(x)
函式會傳回x
數值由小到大的索引。這個例子的結果是5, 4, 3, 6, 1, 2
,也就是5
位置的那個數最小、4
那個位置的數次小、接下來3, 6, 1, 2
。
x[order(x)]
把order(x)
結果(也就是c(5, 4, 3, 6, 1, 2)
)傳給原本的x
便會使得原本的x
重新排序。通常order()
的用途是,我們可以將兩個等長的variables例如var1和var2,依據var2來重新排序var1,例如var1[order(var2)]。
-
+
## [1] "numeric"
-
+
## [1] "numeric"
-
+
## [1] 4 13 22 24 33 55
-
+
## [1] 5 4 3 6 1 2
-
+
## [1] 4 13 22 24 33 55
-
+
## [1] 4 13 22 24 33 55
3.3.5 Built-in math functions
-
+
## [1] 11
## [1] 19
## [1] 15
## [1] 15
## [1] 2.738613
-
+
## [1] 3.459432 3.584963 3.700440 3.807355 3.906891 4.000000 4.087463 4.169925
## [9] 4.247928
-
+
## [1] 2.484907 2.564949 2.639057 2.708050 2.772589 2.833213 2.890372 2.944439
## [9] 2.995732
-
+
3.4 Data types
3.4.1 Checking data type
-
+
## [1] "character"
-
+
## [1] "numeric"
-
+
## [1] "logical"
-
+
## [1] "character"
@@ -1086,25 +1092,25 @@ 3.4.2 Converting data type如果硬是在logical vector後附加一個numeric element的話,那就會整個vector被轉為numeric vector;相仿地,如果numeric vector後附加一個character element的話那整個vector就會被轉為character vector。
可以用sum()
函式來計算logical vector有幾個TRUE
值。例如sum(a%%2==1)
就是計算a
中有幾個奇數。TRUE
可視為1
、FALSE
可視為0
,所以加總起來就是TRUE
有幾個。
-income.c <- as.character(income)
-population.c <- as.numeric(population)
-
-a <- seq(11, 99, 11)
-a <- c(a, "100")
-
-a <- seq(11, 99, 11)
-sum(a%%2==1)
+income.c <- as.character(income)
+population.c <- as.numeric(population)
+
+a <- seq(11, 99, 11)
+a <- c(a, "100")
+
+a <- seq(11, 99, 11)
+sum(a%%2==1)
## [1] 5
-
+
## [1] 99
3.5 Character operations
-
+
## [1] "A 11" "A 22" "A 33" "A 44" "A 55"
-
+
## [1] "A11" "A22" "A33" "A44" "A55"
diff --git a/re.html b/re.html
index a9a9b9e..cddb58f 100644
--- a/re.html
+++ b/re.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
29.5.3 loading data
29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -783,7 +789,7 @@
Chapter 13 Regular expression
-
+
正規表達式(Regular
Expression)是一種用來描述、搜尋和操作文本的強大工具。它是由一系列字元和特殊符號所組成的模式,用於匹配和處理符合特定模式的字串。
@@ -1004,8 +1010,8 @@ 13.1 RE applications on s
[ABC]
character set
[^ABC]
neglect set (Leadning ^
in []
means neglecting)
-
+
## [1] "123456789"
13.1.1 Extracting
@@ -1020,34 +1026,34 @@ 13.1.1 Extracting
13.1.1.1 by str_extract()
以下這個例子是在爬取PTT資料後,嘗試能夠取出每則貼文的ID與暱稱。
-pname <- c("pttid111(kefan)", "pid2(hangfan)")
-
-
-# extracting at least one words until not word
-str_extract(pname, "\\w")
+pname <- c("pttid111(kefan)", "pid2(hangfan)")
+
+
+# extracting at least one words until not word
+str_extract(pname, "\\w")
## [1] "p" "p"
-
+
## [1] "pttid111" "pid2"
-
+
## [1] "pttid111" "pid2"
-
+
## [1] "pttid111" "pid2"
-
+
## [1] "pttid111" NA
-
+
## [1] "pttid111" "pid2"
-# extracting word between ()
-# () is controlled vocabulary in regular expression, needing \\( and \\) to specify the character themself
-str_extract(pname, "\\(\\w+\\)") %>% str_replace_all("[\\(\\)]", "")
+# extracting word between ()
+# () is controlled vocabulary in regular expression, needing \\( and \\) to specify the character themself
+str_extract(pname, "\\(\\w+\\)") %>% str_replace_all("[\\(\\)]", "")
## [1] "kefan" "hangfan"
-
+
## [1] "(kefan)" "(hangfan)"
13.1.1.2 by str_extract
for data frame
-data_frame(pname) %>%
- mutate(nickname = str_extract(pname, "\\(\\w+\\)") %>% str_replace_all("[\\(\\)]", "")) %>%
- mutate(id = str_extract(pname, "\\w+"))
+data_frame(pname) %>%
+ mutate(nickname = str_extract(pname, "\\(\\w+\\)") %>% str_replace_all("[\\(\\)]", "")) %>%
+ mutate(id = str_extract(pname, "\\w+"))
## Warning: `data_frame()` was deprecated in tibble 1.1.0.
## ℹ Please use `tibble()` instead.
## This warning is displayed once every 8 hours.
@@ -1066,8 +1072,8 @@ 13.1.1.3 by str_replace()
\\(.+\\)
則是把剩下的pattern matching 完
\\1
代表我要抽取前面第一組抽取出來的pattern,也就是(\\w+)
中間的\\w+
。
-
+
## # A tibble: 2 × 2
## pname id
## <chr> <chr>
@@ -1076,14 +1082,14 @@ 13.1.1.3 by str_replace()
@@ -1097,15 +1103,15 @@ 13.1.2 Detecting with non-greedy<
回到我們的例子,當使用默認的貪婪模式時,我們的正則表達式"Twitter for (.*)<"
會從第一個<p>
開始匹配,直到找到最後一個<
之前的所有字符。這意味著它會將整個<p>Twitter for iphone</p><div><p>
作為匹配結果,而不僅僅是<p>Twitter for iphone</p>
。
但如果我們想要只匹配第一個<p>
和之後的字符,而不是將整個<p>
標籤內容都包括在內,我們可以使用「非貪婪」模式,將正則表達式修改為"Twitter for (.*?)<"
,在量詞*
後面加上「?」。這樣,它會匹配到第一個<
之前的最短字串,即只匹配到<p>Twitter for iphone
。
-source <- c("<p>Twitter for iphone</p>",
- "<div><p>Twitter for iphone</p></div>")
-data_frame(source) %>% extract(source, "device", "Twitter for (.*)<") # Greedy
+source <- c("<p>Twitter for iphone</p>",
+ "<div><p>Twitter for iphone</p></div>")
+data_frame(source) %>% extract(source, "device", "Twitter for (.*)<") # Greedy
## # A tibble: 2 × 1
## device
## <chr>
## 1 iphone
## 2 iphone</p>
-
+
## # A tibble: 2 × 1
## device
## <chr>
@@ -1129,28 +1135,28 @@ 13.1.3 Detecting multiple pattern
進行邏輯「或」操作,將兩個邏輯向量進行元素級別的「或」運算,得到一個新的邏輯向量。該向量指示哪些句子符合
re1
或 re2
的模式。
-teststr <- c("B和A是不是男女朋友呢",
- "C與B是不是在一起呢",
- "A就是B。")
-re1 <- "(.*B.*呢$)"
-re2 <- "(.*A.*)"
-str_detect(teststr, re1)
+teststr <- c("B和A是不是男女朋友呢",
+ "C與B是不是在一起呢",
+ "A就是B。")
+re1 <- "(.*B.*呢$)"
+re2 <- "(.*A.*)"
+str_detect(teststr, re1)
## [1] TRUE TRUE FALSE
-
+
## [1] TRUE FALSE TRUE
-
+
## [1] TRUE FALSE FALSE
-
+
## [1] TRUE TRUE TRUE
13.1.4 Extracting nearby words
13.1.4.1 Extracting nearby 3 English words
-string2 <- "..., compelled to defend as never before the hard-charging progressivism and ...."
-data_frame(string2) %>%
- mutate(string2 = str_extract(string2, "(\\S+\\s){3}before(\\s\\S+){3}")) %>%
- extract(string2, c("prefix","hit", "tail"), "(.+)(before)(.+)")
+string2 <- "..., compelled to defend as never before the hard-charging progressivism and ...."
+data_frame(string2) %>%
+ mutate(string2 = str_extract(string2, "(\\S+\\s){3}before(\\s\\S+){3}")) %>%
+ extract(string2, c("prefix","hit", "tail"), "(.+)(before)(.+)")
## # A tibble: 1 × 3
## prefix hit tail
## <chr> <chr> <chr>
@@ -1158,20 +1164,20 @@ 13.1.4.1 Extracting nearby 3 Engl
13.1.4.2 Extracting nearby 3 Chinese words
-string3 <- c("呵呵呵呵呵呵呵我家就住在台灣,那是個美麗的地方",
- "臺灣真是個美麗的地方齁齁齁",
- "呵呵呵呵呵呵呵我愛台灣臺灣")
-str_extract(string3, ".{5}台灣.{5}|.{5}臺灣.{5}")
+string3 <- c("呵呵呵呵呵呵呵我家就住在台灣,那是個美麗的地方",
+ "臺灣真是個美麗的地方齁齁齁",
+ "呵呵呵呵呵呵呵我愛台灣臺灣")
+str_extract(string3, ".{5}台灣.{5}|.{5}臺灣.{5}")
## [1] "我家就住在台灣,那是個美" NA
## [3] NA
-
+
## [1] "我家就住在台灣,那是個美" NA
## [3] "呵呵呵我愛台灣臺灣"
13.1.4.3 Extracting nearby 3 Chinese words
-df <- data_frame(string3)
-df %>% extract(string3, c("pre", "hit", "tail"), "(.{0,5})(台灣|臺灣)(.{0,5})")
+df <- data_frame(string3)
+df %>% extract(string3, c("pre", "hit", "tail"), "(.{0,5})(台灣|臺灣)(.{0,5})")
## # A tibble: 3 × 3
## pre hit tail
## <chr> <chr> <chr>
@@ -1186,14 +1192,14 @@ 13.2 RE Case studies
13.2.1 Getting the last page of PTT HatePolitics
這段程式碼的目的是從URL中提取出頁數或特定的部分,並進行一些後續處理和轉換。這些操作可用於從URL中獲取有用的訊息,例如網頁索引、頁數等。
-urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html",
- "https://www.ptt.cc/bbs/HatePolitics/index348.html")
-df <- tibble(urls)
-str_extract(urls, "index(\\d+)\\.html")
+urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html",
+ "https://www.ptt.cc/bbs/HatePolitics/index348.html")
+df <- tibble(urls)
+str_extract(urls, "index(\\d+)\\.html")
## [1] "index4086.html" "index348.html"
-
+
## [1] 4086 348
-
+
## # A tibble: 2 × 2
## urls last_page
## <chr> <chr>
@@ -1238,12 +1244,12 @@ 13.2.2 Practice. Ask CHATGPT\\.html
:匹配字串中的”.html”字串。由於”.”在正則表達式中具有特殊意義,所以需要使用\\
進行轉義。
-urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html",
- "https://www.ptt.cc/bbs/HatePolitics/index348.html")
-
-df <- tibble(urls) %>%
- mutate(page_num = str_extract(urls, "(?<=index)\\d+(?=.html)"))
-df
+urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html",
+ "https://www.ptt.cc/bbs/HatePolitics/index348.html")
+
+df <- tibble(urls) %>%
+ mutate(page_num = str_extract(urls, "(?<=index)\\d+(?=.html)"))
+df
## # A tibble: 2 × 2
## urls page_num
## <chr> <chr>
@@ -1281,49 +1287,49 @@ 13.3.1 Matching URLpattern <- "^((https?|ftp)://|(www|ftp)\\.)?[a-z0-9-]+(\\.[a-z0-9-]+)+([/?].*)?$"
-
-str_detect("http://www.yahoo.com.tw", pattern)
+pattern <- "^((https?|ftp)://|(www|ftp)\\.)?[a-z0-9-]+(\\.[a-z0-9-]+)+([/?].*)?$"
+
+str_detect("http://www.yahoo.com.tw", pattern)
## [1] TRUE
-str_detect("https://m.facebook.com/story.php?story_fbid=1483357095305703&id=1435979486710131", pattern)
+str_detect("https://m.facebook.com/story.php?story_fbid=1483357095305703&id=1435979486710131", pattern)
## [1] TRUE
-
+
## [1] TRUE
13.3.3 Removing space
-# Removing space in Chinese sentence
-sentence <- c(' 噓 wwHui: 這批安好純 \n 辛苦了 \n 噓 ', '噓 wwHui: 這批安好純 ', '辛苦了 ')
-
-# Removing all space characters
-str_replace_all(sentence, "\\s", "")
+# Removing space in Chinese sentence
+sentence <- c(' 噓 wwHui: 這批安好純 \n 辛苦了 \n 噓 ', '噓 wwHui: 這批安好純 ', '辛苦了 ')
+
+# Removing all space characters
+str_replace_all(sentence, "\\s", "")
## [1] "噓wwHui:這批安好純辛苦了噓" "噓wwHui:這批安好純"
## [3] "辛苦了"
-# Removing leading and ending space by str_replace_all()
-# You cannot use trimws()
-str_replace_all(sentence, "^\\s+|\\s+$", "")
+# Removing leading and ending space by str_replace_all()
+# You cannot use trimws()
+str_replace_all(sentence, "^\\s+|\\s+$", "")
## [1] "噓 wwHui: 這批安好純 \n 辛苦了 \n 噓"
## [2] "噓 wwHui: 這批安好純"
## [3] "辛苦了"
13.3.4 Testing
-teststr1 <- c("我最近過的挺爽", "最近我過的不是很好。", "我最近過得不太好。")
-re1 <- "(^我.+)"
-re2 <- "(.*。)"
-
-str_detect(teststr1, str_c(re1,re2, sep = ""))
+teststr1 <- c("我最近過的挺爽", "最近我過的不是很好。", "我最近過得不太好。")
+re1 <- "(^我.+)"
+re2 <- "(.*。)"
+
+str_detect(teststr1, str_c(re1,re2, sep = ""))
## [1] FALSE FALSE TRUE
-
+
## [1] TRUE TRUE TRUE
diff --git a/read_json.html b/read_json.html
index e198604..3422177 100644
--- a/read_json.html
+++ b/read_json.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+29.6 Mapping Youbike Location
+
30 NETWORK VIS
@@ -784,8 +790,8 @@
Chapter 17 Read JSON
jsonlite套件提供了處理 JSON 格式資料的功能。
-
+
17.1 Reading JSON
@@ -807,20 +813,20 @@ 17.1.1 JSON as a stringlibrary(jsonlite)
-lst <- fromJSON('{"a":1, "b":2}')
-class(lst) #list
+
## [1] "list"
-
+
## [1] 1
-
+
## a b
## 1 1 2
## 2 1 3
-
+
## [1] "data.frame"
-
+
## [1] 1
@@ -833,9 +839,9 @@ 17.1.2 JSON as a local file
-
+
## $jobType
## [1] "2"
##
@@ -962,16 +968,17 @@ 17.1.3 JSON as a web file%>% content("text")
:content("text")
表示將 HTTP 回應的資料轉換為純文字格式,便於後續處理。當我們把該純文字格式打開後,會發現他以JSON格式書寫。
%>% fromJSON()
:一旦確認回傳的訊息以JSON格式書寫,那麼就可以用jsonlite
套件的fromJSON()
將該文字字串轉為R的物件。
-library(httr)
-library(jsonlite)
-
-raw <- GET("https://tcgbusfs.blob.core.windows.net/blobyoubike/YouBikeTP.json") %>%
- content("text") %>%
- fromJSON()
-write_json(raw, "data/opendata_ubike_202304261243.json")
+library(httr)
+library(jsonlite)
+
+url <- "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json"
+
+ubike.df <- fromJSON(content(GET(url),"text", encoding = "utf-8"))
+head(ubike.df) %>% select(1:6)
+# write_json(ubike.df, "data/opendata_ubike_202304261243.json")
你可以讀取本書預先爬取好的json檔來觀察前述程式所爬回的json檔轉成R物件後的結果。
-
+
## $sno
## [1] "0001"
##
@@ -1023,14 +1030,14 @@ 17.1.4 Practice. Convert ubike js
17.2 Case 1: Air-Quality (well-formatted )
前往 https://data.gov.tw/dataset/40448對JSON 檔案按右鍵,然後複製連結,例如 “https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON”。 (但是,連結地址,特別是 api_key=9be7b239-557b-4c10-9775-78cadfc555e9
,每次都會更改。所以你必須要自己嘗試)。
-url <- "https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON"
-
-df <- fromJSON(content(GET(url), "text", encoding = "utf-8"))
-df %>% glimpse()
-df$records %>% head() %>% knitr::kable(format = "html")
+url <- "https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON"
+
+df <- fromJSON(content(GET(url), "text", encoding = "utf-8"))
+df %>% glimpse()
+df$records %>% head() %>% knitr::kable(format = "html")
17.2.2 Step-by-step: Parse JSON format string to R objects
@@ -1039,34 +1046,34 @@ 17.2.2 Step-by-step: Parse JSON f
17.2.2.1 Step 1. GET()
發送請求
向該URL的伺服器發送GET()
request以取得該檔案。若成功取得,他會回覆一個HTML status code(你可上網查詢看看有哪些Status code)。如果成功的話就是2開頭的數字例如200 OK
代表該伺服器接受該請求並開始傳回檔案。
-# Getting url back by GET()
-response <- GET(url)
-
-# Inspecting returned data
-response
-class(response)
+# Getting url back by GET()
+response <- GET(url)
+
+# Inspecting returned data
+response
+class(response)
(Tips) Using ?httr::GET
to inspect the function
17.2.2.2 Step 2. httr::content()
將回應資料的轉純文字
回應的資料看他的class
是一個response
,但如果看Global Environment看來是個list
,裡面裝載很多資料,而主要核心的內容在content
這個欄位,但看來是用binary code
裝起來的,而不是純文字。
因此,對於這個抓回來的檔案,我需要用httr::content()
幫忙把純文字給解出來。經查詢help
可得知content()
後面的參數有三類,其中可以要轉為純文字的就是content(response, "text")
。因此偵測轉出來的變數會是長度為1的character
。
-# Parsing to textual data by content()
-text <- content(response, "text", encoding = "utf-8")
-nchar(text)
-cat(text)
-class(text)
-length(text)
+# Parsing to textual data by content()
+text <- content(response, "text", encoding = "utf-8")
+nchar(text)
+cat(text)
+class(text)
+length(text)
(Tips) using ??httr::content
to inspect the function
17.2.2.3 Step 3. fromJSON()
: 將JSON格式文字轉為R物件
最後是將這個character
轉為R的物件,也就是data.frame或list。注意,此時text是一個character
,那是我們知道他是用JSON格式編寫的文字檔,就像我們知道.csv檔是用逗號分隔表示法依樣,JSON就是用層層疊疊的[]{}
記號來表述資料的結構。
並要提醒初學者,.json
或.csv
都只是幫助程式初步篩選檔案的副檔名罷了,這兩種類型的檔案跟.txt
檔一樣,都被歸屬為Win系統所謂的「純文字文件檔案」(就打開以後看得到文字的意思)。裡面的究竟是不是個完整的json檔這都要去看、去測。我自然也可以在.json
的檔案裡偷偷亂用逗號分隔模式撰寫。
-
+
@@ -1077,19 +1084,19 @@ 17.2.3 Combining all
17.2.3.1 Get from web api
-
+
17.2.3.2 Read from pre-saved JSON
你可以讀取本書預先爬取好的json檔來觀察前述程式所爬回的json檔轉成R物件後的結果。
-# You can read the pre-crawled JSON file to observe the R object.
-raw <- fromJSON("data/opendata_uvi_202304261215.json")
-
-raw$records %>% head %>% knitr::kable()
+# You can read the pre-crawled JSON file to observe the R object.
+raw <- fromJSON("data/opendata_uvi_202304261215.json")
+
+raw$records %>% head %>% knitr::kable()
@@ -1195,13 +1202,13 @@ 17.3 Practices: traversin
17.4 Case 2: cnyes news (well-formatted)
第二類是最常會見到的例子,解出來的資料是個很多階層的list
,通常一筆資料傳回來時多會附加一些metadata,比方說,一共幾筆資料、下一個資料區塊在哪裡,好讓使用者或者本地端的瀏覽器能夠繼續取得下一筆資料。因此,資料通常會在樹狀節點的某一個子節點。
-url_cnyes <- "https://news.cnyes.com/api/v3/news/category/headline?startAt=1588262400&endAt=1589212799&limit=30"
-
-res <- fromJSON(content(GET(url_cnyes), "text", encoding = "utf-8"))
-glimpse(res)
-
+url_cnyes <- "https://news.cnyes.com/api/v3/news/category/headline?startAt=1588262400&endAt=1589212799&limit=30"
+
+res <- fromJSON(content(GET(url_cnyes), "text", encoding = "utf-8"))
+glimpse(res)
+
## newsId title
## 1 4475846 〈財報〉疫情衝擊 Under Armour Q1營收大減23%
## 2 4475874 若一年內疫情未控制 避險基金大佬:美國將面臨第2次經濟大蕭條
@@ -1367,21 +1374,21 @@ 17.4.1 (option) 取回資料並
17.5 Case 3: footRumor (ill-formatted)
食品闢謠的例子可能是個沒好好編過JSON的單位所編出來的案子,資料很簡單,但卻是一個list裡面有329個data.frame,且每個data.frame只有對腳現有資料,然後每一筆資料就一個data.frame。
-url <- 'http://data.fda.gov.tw/cacheData/159_3.json'
-safefood <- fromJSON(content(GET(url),'text'))
-# write_json(safefood, "data/opendata_safefood_202304261256.json")
+url <- 'http://data.fda.gov.tw/cacheData/159_3.json'
+safefood <- fromJSON(content(GET(url),'text'))
+# write_json(safefood, "data/opendata_safefood_202304261256.json")
為了避免產製本書時出錯,本程式採用預備好的資料來練習。但仍建議你用前述方式自網路上爬取資料下來練習。
-
+
## [1] "list"
-
+
## [1] "data.frame"
-
+
## [1] 5 5
-
+
17.5.1 處理非典型的JSON檔
@@ -1394,40 +1401,40 @@ 17.5.1 處理非典型的JSON檔<
safefood.m <- matrix(safefood.v, byrow = T, ncol = 5)
照列來折,因為每五個就一筆資料,所以是照列折,然後用ncol = 5
來指定五個一折。
-
+
## 分類1 分類2 分類3 分類4 分類5 標題1
## "" NA NA NA NA NA
-
+
## [1] TRUE
-
+
## [1] 10720
-# remove NAs
-safefood.v <- safefood.v[!is.na(safefood.v)]
-# length(safefood.v)
-
-# double-check NAs
-anyNA(safefood.v)
+# remove NAs
+safefood.v <- safefood.v[!is.na(safefood.v)]
+# length(safefood.v)
+
+# double-check NAs
+anyNA(safefood.v)
## [1] FALSE
-# head(safefood.v)
-
-
-# convert vector to matrix
-safefood.m <- matrix(safefood.v, byrow = T, ncol = 5)
-# ?matrix
-
-# convert matrix to dataframe
-safefood.df <- as.data.frame(safefood.m)
-
-# delete the 4th column
-safefood.df <- safefood.df[-4]
-
-# naming the data.frame
-names(safefood.df) <- c('category', 'question', 'answer', 'timestamp')
-head(safefood.df)
+# head(safefood.v)
+
+
+# convert vector to matrix
+safefood.m <- matrix(safefood.v, byrow = T, ncol = 5)
+# ?matrix
+
+# convert matrix to dataframe
+safefood.df <- as.data.frame(safefood.m)
+
+# delete the 4th column
+safefood.df <- safefood.df[-4]
+
+# naming the data.frame
+names(safefood.df) <- c('category', 'question', 'answer', 'timestamp')
+head(safefood.df)
## category question
## 1 使用含有acetaminophen成分藥品會傷腎,是真的嗎?
## 2 使用退燒藥會延誤治療,是真的嗎?
diff --git a/reference-keys.txt b/reference-keys.txt
index aee1e79..38bd16c 100644
--- a/reference-keys.txt
+++ b/reference-keys.txt
@@ -389,6 +389,10 @@ loading-taiwan-map
building-grid
loading-data-2
merging-data
+mapping-youbike-location
+creating-a-new-variable
+mapping-with-sf
+using-ggmap-deprecated
network-vis
generating-networks
random-network
diff --git a/scraping-104.html b/scraping-104.html
index 82f9e4f..b3df4d7 100644
--- a/scraping-104.html
+++ b/scraping-104.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
@@ -790,29 +796,29 @@ 16.1 Complete Codelibrary(tidyverse)
-library(httr)
-library(jsonlite)
-# options(stringsAsFactors = F)
-all.df <- tibble()
-refer_url <- "https://www.104.com.tw"
-
-for(p in 1:10){
- url <- str_c('https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&order=12&asc=0&page=',
- p,
- "&mode=s&jobsource=2018indexpoc")
- print(p)
- res <- GET(url, add_headers("referer"=refer_url)) %>%
- content("text") %>%
- fromJSON()
-
- res$data$list$tags <- NULL
- res$data$list$link <- NULL
-
- all.df <- bind_rows(all.df, res$data$list)
-}
-
-all.df$jobNo %>% unique %>% length
+
+all.df <- tibble()
+refer_url <- "https://www.104.com.tw"
+
+for(p in 1:10){
+ url <- str_c('https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&order=12&asc=0&page=',
+ p,
+ "&mode=s&jobsource=2018indexpoc")
+ print(p)
+ res <- GET(url, add_headers("referer"=refer_url)) %>%
+ content("text") %>%
+ fromJSON()
+
+ res$data$list$tags <- NULL
+ res$data$list$link <- NULL
+
+ all.df <- bind_rows(all.df, res$data$list)
+}
+
+all.df$jobNo %>% unique %>% length
16.2 Step-by-Step
@@ -821,111 +827,111 @@ 16.2.1 Get the first pages這段程式碼是用於爬取104人力銀行網站上與「資料科學」相關的職缺資訊,並將其存儲到名為df2的Data.Frame中。首先,我們嘗試點選104人力銀行網站上的第1頁、第2頁和第3頁的職缺搜尋結果,並將這三個網址儲存為三個URL變量,應該不難觀察到,這三個網址有何差別?僅有page=1
、page=2
、page=3
有所差別。接下來,我們使用R語言中的httr
套件中的GET()
函數,將URL作為參數傳入,從網站中獲取對應的數據,並使用fromJSON()
函數將該JSON格式的內容轉換為R中的Data.Frame格式。下面程式在獲取第2頁數據時,使用了add_headers()
函數設置了一個HTTP header,用於識別HTTP請求的來源。
這段程式碼使用了add_headers
函數添加了一個名為「Referer
」的HTTP header。這個header的作用是告訴104人力銀行網站,訪問這個頁面的用戶是從哪個網頁轉跳過來的,也就是告訴網站當前HTTP請求的來源。具體來說,這裡設置的「Referer」值為https://www.104.com.tw/
,代表我們偽裝這個請求是來自於104人力銀行首頁。如果沒有這個Referer,該網站會認為你是一個可疑的爬取,從沒根據和不當的頁面或用不當的方式(例如爬蟲)連過來。
對的!人家網站不歡迎你爬它,所以我們應止於測試。
-url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc"
-
-# Assigning the 2nd page data url to url2
-url2 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&order=14&asc=0&page=2&mode=s&jobsource=2018indexpoc"
-
-# Assigning the 3rd page data url to url3
-url3 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=3&mode=s&jobsource=2018indexpoc"
-
-# Getting back the url1 data, assigning to result1
-
-res <- GET(url2, config = add_headers("Referer" = "https://www.104.com.tw/"))
-
-res1 <- content(res, "text") %>% fromJSON()
-
-result2 <- fromJSON(content(GET(url2), "text"))
-
-# Tracing variable result2 and finding the data.frame, assigning to df2
-df2 <- res1$data$list
+url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc"
+
+# Assigning the 2nd page data url to url2
+url2 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&order=14&asc=0&page=2&mode=s&jobsource=2018indexpoc"
+
+# Assigning the 3rd page data url to url3
+url3 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=3&mode=s&jobsource=2018indexpoc"
+
+# Getting back the url1 data, assigning to result1
+
+res <- GET(url2, config = add_headers("Referer" = "https://www.104.com.tw/"))
+
+res1 <- content(res, "text") %>% fromJSON()
+
+result2 <- fromJSON(content(GET(url2), "text"))
+
+# Tracing variable result2 and finding the data.frame, assigning to df2
+df2 <- res1$data$list
16.2.2 Get the first page by modifying url
-# Guessing the 1st page data url to url1
-url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc"
-
-# Getting back the 1st page data
-url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc"
-
-result1 <- fromJSON(content(GET(url1), "text"))
-
-df1 <- result1$data$list
+# Guessing the 1st page data url to url1
+url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc"
+
+# Getting back the 1st page data
+url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc"
+
+result1 <- fromJSON(content(GET(url1), "text"))
+
+df1 <- result1$data$list
16.2.3 Combine two data with the same variables
-
+
16.2.4 Drop out hierarchical variables
Preserving numeric or character, dropping list of data.frame by assigning NULL to the variable
-
+
16.2.5 Dropping hierarchical variables by dplyr way
-# Getting the 1st page data and dropping variable tags and link
-# Assigning to df1
-df1 <- result1$data$list %>% select(-tags, -link)
-
-# Getting the 2nd page data and dropping variable tags and link
-# Assigning to df2
-df2 <- result2$data$list %>% select(-tags, -link)
-
-# binding df1 and df2
-all.df <- bind_rows(df1, df2)
+# Getting the 1st page data and dropping variable tags and link
+# Assigning to df1
+df1 <- result1$data$list %>% select(-tags, -link)
+
+# Getting the 2nd page data and dropping variable tags and link
+# Assigning to df2
+df2 <- result2$data$list %>% select(-tags, -link)
+
+# binding df1 and df2
+all.df <- bind_rows(df1, df2)
16.2.6 Finding out the last page number
-# Tracing the number of pages in result1
-last_page_num <- result1$data$totalPage
-# Checking the availability of the last page
-
-# Examining if the last page data available by re-composing URL with paste0()
-url.last_page <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", last_page_num, "&mode=s&jobsource=2018indexpoc")
-
-# Getting back and parsing the last page data
-result.last_page <- fromJSON(content(GET(url.last_page), "text"))
+# Tracing the number of pages in result1
+last_page_num <- result1$data$totalPage
+# Checking the availability of the last page
+
+# Examining if the last page data available by re-composing URL with paste0()
+url.last_page <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", last_page_num, "&mode=s&jobsource=2018indexpoc")
+
+# Getting back and parsing the last page data
+result.last_page <- fromJSON(content(GET(url.last_page), "text"))
16.2.7 Using for-loop to get all pages
-for(p in 1:last_page_num){
- url <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", p, "&mode=s&jobsource=2018indexpoc")
- result <- fromJSON(content(GET(url), "text"))
- temp.df <- select(result$data$list)
- print(paste(p, nrow(temp.df)))
-}
+for(p in 1:last_page_num){
+ url <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", p, "&mode=s&jobsource=2018indexpoc")
+ result <- fromJSON(content(GET(url), "text"))
+ temp.df <- select(result$data$list)
+ print(paste(p, nrow(temp.df)))
+}
16.2.8 combine all data.frame
-# The 1st url of the query
-url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc"
-
-# Getting back the 1st page data
-result1 <- fromJSON(content(GET(url1), "text"))
-
-# Tracing and getting total number of page
-last_page_num <- result1$data$totalPage
-
-# Truncating hierarchical variables: link and tags
-all.df <- select(result1$data$list, -link, -tags)
-
-# for-loop to getting back data and joining them
-for(p in 1:last_page_num){
- url <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", p, "&mode=s&jobsource=2018indexpoc")
- result <- fromJSON(content(GET(url), "text"))
- temp.df <- select(result$data$list)
- all.df <- bind_rows(all.df, temp.df)
- print(paste(p, nrow(all.df)))
-}
+# The 1st url of the query
+url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc"
+
+# Getting back the 1st page data
+result1 <- fromJSON(content(GET(url1), "text"))
+
+# Tracing and getting total number of page
+last_page_num <- result1$data$totalPage
+
+# Truncating hierarchical variables: link and tags
+all.df <- select(result1$data$list, -link, -tags)
+
+# for-loop to getting back data and joining them
+for(p in 1:last_page_num){
+ url <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", p, "&mode=s&jobsource=2018indexpoc")
+ result <- fromJSON(content(GET(url), "text"))
+ temp.df <- select(result$data$list)
+ all.df <- bind_rows(all.df, temp.df)
+ print(paste(p, nrow(all.df)))
+}
diff --git a/search_index.json b/search_index.json
index 49a2377..32ce46c 100644
--- a/search_index.json
+++ b/search_index.json
@@ -1 +1 @@
-[["index.html", "R for Data Journalism About", " R for Data Journalism HSIEH, JI-LUNG 2024-03-24 About 這本書是寫給臺大新聞所「新聞資料分析與視覺化」課程使用。該課程並重三個面向的訓練:程式語言、視覺化、資料新聞。學生必須先能夠熟練地使用R語言來操作、讀取、清理、視覺化資料;然後以產製新聞為課程目標,了解資料要如何清理,以及選擇適合的視覺化的方法來強化新聞敘事,並避免視覺化方式引起讀者對新聞的理解謬誤。準此,本書分為幾個部分,包含PART I介紹程式語言基礎;PART II則以國際或國內新聞為個案,來介紹資料獲取(爬蟲)、清理、合併、篩選、轉換;PART III則著重如何用資料視覺化來強化敘事。 本書所沿用的資料分析與視覺化案例均為國內、國外的新聞案例如各國產假支薪等級、居住正義、空氣污染、人口議題、COVID-19、資源區域分佈不均、選舉與公投、運輸交通等相關議題的新聞。並大量採用紐約時報挑選作為數據理解與視覺化推廣的「What’s going on in this graph?」系列新聞,包含美國不同年代各年齡層的淨資產來做視覺化案例。在視覺化教材的設計上,本書大量參考紐時「What’s going on in this graph?」的分類與(Wilke 2019)所著「Fundamentals of Data Visualization」一書的內容安排,強調利用資料視覺化方法來呈現新聞數據中的數量、分佈、比例、趨勢等,並均換用國內或紐時的相關資料新聞案例做範例,以利中文讀者的理解。 學習路徑 References "],["introduction.html", "Chapter 1 Introduction 1.1 Preloaded tool kits 1.2 Dataset used in the book 1.3 Cases in the book", " Chapter 1 Introduction 本書從基本的 base R 語法開始學習,因為 R 語言最初是為統計學研究而開發的。因此,許多統計套件和基礎操作都是使用 base R 語法編寫的,這些知識對於瞭解 R 的核心功能和基本操作是非常重要的,並能夠建立起對於數據分析和統計建模的基礎知識。不過,現在 tidyverse 風格的編寫方式越來越流行,這種方式使得程式碼撰寫效率更高且可讀性更強,對於數據科學家而言是非常有用的。因此,本書會接續使用 tidyverse 中的主要函式庫和函數,例如 dplyr、ggplot2 和 tidyr,以便讀者能夠掌握這些工具,並能夠有效地應用於實際數據分析項目中。 1.1 Preloaded tool kits 當 R 的程式開始執行時,會預載入一些基本的套件,包括 stats、graphics、grDevices、utils 和 datasets。這些套件為 R 提供了基本的數據處理、統計分析、圖形顯示和檔案處理等功能。以下是這些套件的重要函式: stats:這個套件包含了許多統計分析相關的函式,例如假設檢定、方差分析、線性迴歸和時間序列分析等。其中,比較常用的函式有 t.test()、lm()、glm()、anova()、cor() 等。 graphics:這個套件提供了用於繪製各種圖形的函式,例如散佈圖、直方圖、盒鬚圖、線圖、散點矩陣等。其中,常用的函式有 plot()、hist()、boxplot()、lines()、points() 等。 grDevices:這個套件包含了用於輸出圖形的函式,例如 pdf()、png()、jpeg() 和 tiff() 等。 utils:這個套件包含了一些實用的函式,例如 install.packages()、help()、data() 等。 datasets:這個套件包含了一些內建的數據集,可以用來進行測試和練習,例如 iris、mtcars、CO2 等。可以使用 data() 函式載入這些數據集。 1.2 Dataset used in the book 本書所採用的資料可以從台大新聞所「新聞資料分析與視覺呈現」的github repository下載。R4CSS/data。 1.3 Cases in the book WP: Paid maternity leave Taipei Residential Hot spot: Contingency table, categorical data Trump’s tweets: Line plot, Bar chart, timeline, and text processing NYT: Net worth: Line plot NYT: Carbon Proportion: Treemap NYT: Optimism by countries NYT: Population growth Annual Budget of TW government: NA Processing, Treemap Vaccinating proportion by country x year: Proportion NYT: LeBron James’s Achievement "],["basic.html", "Chapter 2 R Basic 2.1 Using RStudio 2.2 First Attempt 2.3 R Q&A", " Chapter 2 R Basic 本章介紹如何使用 RStudio 編寫和執行 R 程式語言、R語言的基本語法、以及Vector和data.frame資料型態。 2.1 Using RStudio 2.1.1 RStudio Interface RStudio的介面主要分為四大區塊: 左上的區塊是「Source」(可切換至「Visual」)是撰寫程式碼與R Markdown的區塊; 左下角「Console」的區塊,每行程式碼的執行和執行結果都會出現在此,也可觀察程式執行結果; 右上角區塊最常用的是「Environment」這個分頁,程式碼執行過程產生的變數/變項都會出現在這裡。 右下角區塊我最常用的是「Files」這個分頁,顯示的是我自己電腦本機端的檔案目錄。右下角區塊也常常用到「Packages」,可查閱現在的程式執行環境有載入哪些套件;當用help(some_function)查詢某個套件或某個函式的功能是,就會自動跳到「Help」分頁。 2.1.2 Writing R Markdown R Markdown這種格式讓程式寫作者可以將程式碼和非程式碼的內容寫在同一份文件中。例如我想要寫作一本關於程式的書,裡面有很多的程式碼,但也要有很多說明、章節與段落。此時,這些非程式碼的區塊通常被稱為「內容區塊(Text Cell)」,而程式碼的區塊就稱為「Code Cell」。尤其是資料分析師或資料科學家很愛用這種格式,因為經常要為程式的執行結果寫很多說明,甚至利用標題一、標題二來區分章節。 內容區塊使用Markdown格式撰寫,顧名思義,支援用Markdown這種標記語法來快速撰寫如標題一、標題二、點列、編號等格式化文字。詳細指令可以參考rmarkdown-cheatsheet (rstudio.com)。這種格式的靈活性和強大功能,使得 R Markdown 成為撰寫技術文檔和學術報告的理想選擇,能夠有效地將敘述性文本與程式碼結果結合,提升文檔的互動性和表達力。 程式碼區塊可以用下列鍵盤指令來新增和執行。 Cmd(Ctrl)+Option(Alt)+i 新增一個程式碼區塊 Cmd+Enter (Ctrl+Enter in Window) 執行程式碼區塊中游標所在的那一行指令。 Cmd(Ctrl)+Shift+Enter 執行游標所在的整個程式碼區塊 其他常用鍵盤指令 - 註解:用滑鼠或鍵盤圈選某幾行程式碼後,可用Cmd(Ctrl)+Shift+c來將這幾行標記為註解或將其去除註解標記。 Practice. 用鍵盤快速鍵新增一個程式碼區塊、輸入以下程式碼並嘗試用鍵盤快速鍵執行。 a <- c(1, 2, 3, 4, 5) b <- 4 a*b 2.1.3 Installing third-party packages 套件的使用分為安裝(install.packages(\"pkg_name\"))和載入(library(pkg_name))兩個動作。通常安裝好R的時候就已經安裝好基本base套件。當執行R時便會將base套件預載入程式的執行環境中。 熱心的R使用者會編寫第三方套件,並且將這些套件開放給群眾使用。通常這些套件已經被上載到R cran提供下載。而R cran上的套件我們可以使用install.packages(\"package_name\")來自動安裝到我們的電腦中。 Practice 1. 執行以下程式碼 install.packages("tidyverse") install.packages("jsonlite") install.packages("httr") 2.1.3.1 Loading package 在安裝這些第三方套件之後,需要將它們載入到程式的運行環境中,然後才能使用。因此,需要使用 library(package_name) 命令來載入它們。 library(tidyverse) library(jsonlite) library(httr) 2.1.4 Code “Comment” 下列程式碼中開頭有#符號者為註解,程式設計師用這種註解來為程式碼做說明,便於自己日後閱讀或與他人溝通。程式在執行時會自動忽略前面有#符號的程式碼。如果要執行以下程式碼,要把前面的#記號給拿掉。在RStudio中你可以用滑鼠或鍵盤圈選下三行,然後用快速鍵command(ctrl)+shift+c就可以開關(Comment/Un-comment)這幾行程式碼。 # a <- c(1, 2, 3, 4, 5) # b <- 4 # a*b 2.2 First Attempt 2.2.1 Loading Open Data from the MOI MOS(Ministry of the Interior): 中華民國行政院內政部 library(httr) library(jsonlite) url <- "https://www.ris.gov.tw/rs-opendata/api/v1/datastore/ODRP024/107?page=1" first_page <- fromJSON(content(GET(url), "text")) # head(first_page$responseData) head(first_page$responseData) %>% rename(戶長=headhousehold_count) ## statistic_yyy district_code site_id village edu sex 戶長 ## 1 107 65000010001 新北市板橋區 留侯里 博畢 男 3 ## 2 107 65000010001 新北市板橋區 留侯里 碩畢 男 26 ## 3 107 65000010001 新北市板橋區 留侯里 大畢 男 71 ## 4 107 65000010001 新北市板橋區 留侯里 專畢 男 52 ## 5 107 65000010001 新北市板橋區 留侯里 高中畢 男 122 ## 6 107 65000010001 新北市板橋區 留侯里 國中畢 男 40 2.2.2 Obtaining Taipei Youbike (v2) Realtime Data 觀察臺北市資料大平臺 (data.taipei)上關於Youbike的資料,你認為哪些資料是具有資料新聞價值的? YouBike區域互補站點 YouBike站位每月熱門站點 YouBike場站建置成本 YouBike臺北市權利金與補助支出 YouBike臺北市站位每月使用量 YouBike起訖站點統計 YouBike見車率統計 YouBike潛在需求預測 YouBike2.0臺北市公共自行車即時資訊 url <- "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json" ubike.df <- fromJSON(content(GET(url),"text", encoding = "utf-8")) head(ubike.df) %>% select(1:6) ## sno sna tot sbi sarea mday ## 1 500101001 YouBike2.0_捷運科技大樓站 28 9 大安區 2024-02-25 20:06:18 ## 2 500101002 YouBike2.0_復興南路二段273號前 21 7 大安區 2024-02-25 19:49:18 ## 3 500101003 YouBike2.0_國北教大實小東側門 16 10 大安區 2024-02-25 20:06:18 ## 4 500101004 YouBike2.0_和平公園東側 11 9 大安區 2024-02-25 20:06:18 ## 5 500101005 YouBike2.0_辛亥復興路口西北側 16 11 大安區 2024-02-25 20:02:04 ## 6 500101006 YouBike2.0_復興南路二段280號前 11 10 大安區 2024-02-25 20:06:14 2.2.3 Reading Taipei Residential Burglary Data 該資料網址可到臺北市資料大平臺 (data.taipei)上查詢「住宅竊盜點位資訊」後,點選「API」後複製取得。 url <- "https://data.taipei/api/v1/dataset/93d9bc2d-af08-4db7-a56b-9f0a49226fa3?scope=resourceAquire" res <- read_json(url, simplifyVector = T) df <- res$result$results head(df) dplyr::glimpse(df) 2.3 R Q&A 2.3.1 Encoding and Language Sys.setlocale(category = "LC_ALL", locale = "UTF-8") Sys.setlocale(category = "LC_ALL", locale = "cht") 如果讀取到資料有中文的話,此時,你只需要指定locale為cht,然後重開該data.frame就可以解決該問題。 Sys.setlocale(category = "LC_ALL", locale = "cht") 但你在寫程式剖析HTML時若使用了rvest這個套件,有可能在html_node()函式時會因為編碼而產生問題,此時你會需要把locale改為C。這個C指的是C語言的C。 Sys.setlocale(category = "LC_ALL", locale = "C") 參考連結:http://psmethods.postach.io/post/ru-he-geng-gai-rde-yu-she-yu-xi 參考連結:https://stat.ethz.ch/R-manual/R-devel/library/base/html/locales.html The locale describes aspects of the internationalization of a program. Initially most aspects of the locale of R are set to “C” (which is the default for the C language and reflects North-American usage) 2.3.2 RMD/R Notebook無法儲存 R Notebook 要存檔的時候檔名絕對不要有空白,若有空白就用底線_代替,否則Notebook寫到一半會無法預覽下半部的程式並出現錯誤訊息。若仍然無法儲存或出現錯誤訊息,應該只要開另外一個R Notebook檔案,複製程式碼即可。 "],["r-basic.html", "Chapter 3 R Basic 3.1 R Syntax 3.2 Vector 3.3 Calculating with vectors 3.4 Data types 3.5 Character operations", " Chapter 3 R Basic R base是R語言的基本程式庫和核心功能,提供了許多常用的指令和函數。以下是一些常見的R base指令: assignment operators(賦值運算符):<- 或 = 用來將數值、向量、函數等資料物件賦值給變數。 arithmetic operators(算術運算符):+、-、*、/、^、%/%和%%用於數值運算,如加、減、乘、除、指數、整除和取餘等。 relational operators(關係運算符):==、!=、>、>=、<和<=用於比較數值或字符型資料的大小關係,返回邏輯值(TRUE或FALSE)。 logical operators(邏輯運算符):&、|和!用於對邏輯值進行運算,如AND、OR和NOT等。 control flow statements(流程控制語句):if、else、for、while、repeat、break和next用於控制程式的執行流程。 functions(函數):R base提供了許多內置函數,如sum、mean、var、sd、cor、lm等,用於數值計算、統計分析、線性回歸等常見操作。 data structures(資料結構):R base提供了多種資料結構,如向量、矩陣、數組、列表、因子等,用於存儲和處理不同類型的資料。 data input/output(資料輸入輸出):R base提供了多種函數和工具,如read.table、write.table、read.csv、write.csv等,用於讀取和寫入資料。 3.1 R Syntax R可以做很複雜的加減乘除,例如直接在程式碼中打上(1+3)*2.01,總之,看你算式怎麼寫,他就會算出相對應的數值。但其實我們通常使用R語言是要餵給他資料,然後讓他來做運算。此時,要有一個容器來容納這些數值或資料,這個容器就是變數(Variable)。 3.1.1 Assignment <- 將右邊的算式或數值指(Assign)給左邊的變數。左側都是變數,右側則可能是數字或變數。你可以把他想像為把右側做完了以後,指(Assign)給左側的變數。 Assignment對變數型態(Variable Type)的影響:<-右側如果是numeric,那左側的變數就是numeric變數;右側如果是character,左側的變數就是character變數。 在幾乎所有程式語言中,單等號=指的是assignment,把右方的算式、值或物件指給左方的變數。而比較兩者相不相等,則用雙等號==,例如1==3-2。R當初在設計時可能是為了避免混淆,所以把assignment的符號設計為<-。 a <- 1 b <- c(1, 2, 3, 4) c <- c("1", "2", "3", "4") d <- c(b, a) e <- "abcd" 3.1.2 Comments 註解 註解:在程式碼區塊若前面有#字號後面跟著空白的話,那代表那行被標示為註解,程式執行時會自動跳過註解不執行。 快速鍵:當游標在某一行程式碼時打cmd(ctrl)-shift-c,就可以產生註解。 # df <- data.frame(a = c(1, 2, 3), b = c(3, 4, 5)) 3.2 Vector 但我如果要為所有我要運算的數字都產生一個與之對應的變數,這樣做不完。所以,我們會很常使用其他種序列或者對應的結構來儲存多筆資料。例如vector、list或Data.Frame。 在R語言中,vector是一種基本的資料類型,它是由相同類型的元素組成的序列,可以存儲數值、文字、邏輯值等不同類型的資料。例如,以下是一個由整數元素組成的vector:my_vector <- c(1, 2, 3, 4, 5)。而我如果要存取第一個數字,我便可用my_vector[1]的方式存取,分別代表my_vector中第一個位置的內容(第二個、第三個依此類推)。 在程式碼中,只要是文字必用成對的雙引號或單引號包含其中,以區隔「變數」和「數字」。例如如果看到沒有雙引號的「英文字母」必定是變數名稱,或函式名稱。如果看到有雙引號的數字,那也是文字。 以下資料來自各縣市平均每月薪資所得或各縣市人口數。 3.2.1 Creating vectors vector通常用c()函數創建,其中c表示”combine”或”concatenate”,可以將多個元素組合成一個vector。 income <- c(70100, 51300, 51100, 48400, 47600, 43000) county <- c("台北", "新北", "桃園", "高雄", "台中", "台南") population <- c(2.6, 3.9, 2.2, 2.7, 2.8, 1.8) area <- c(271.8, 2052.5, 1221, 2951.9, 2214.9, 2191.7) income ## [1] 70100 51300 51100 48400 47600 43000 county[c(5, 3, 1)] ## [1] "台中" "桃園" "台北" county <- county[c(5, 3, 1)] county ## [1] "台中" "桃園" "台北" area ## [1] 271.8 2052.5 1221.0 2951.9 2214.9 2191.7 population ## [1] 2.6 3.9 2.2 2.7 2.8 1.8 3.2.1.1 Creating a sequence a <- seq(11, 99, 11) a ## [1] 11 22 33 44 55 66 77 88 99 b <- 11:20 b ## [1] 11 12 13 14 15 16 17 18 19 20 3.2.1.2 Creating sequences by distribution x <- runif(10000000, 1, 10) # uniform dist, n=1000 plot(density(x)) x <- rnorm(1000, 1, 10) # uniform dist, n=1000 plot(density(x)) x <- rnorm(10000000, 1, 10) # normal dist, n=1000 plot(density(x)) 3.2.2 Creating a fake data with ChatGPT 你可以嘗試這麼問ChatGPT以獲得一些測試資料「可否幫我建立一個R語言的測試資料,為台北11個行政區的區名、人口數、地理面積。分別用vector來儲存,最後再把三個vector合併為一個dataframe」,觀察看看會有什麼樣的結果。 3.2.3 Viewing county ## [1] "台中" "桃園" "台北" income ## [1] 70100 51300 51100 48400 47600 43000 head(county) ## [1] "台中" "桃園" "台北" tail(county) ## [1] "台中" "桃園" "台北" length(county) ## [1] 3 mode(county) ## [1] "character" class(county) ## [1] "character" # View(county) length(county) ## [1] 3 length(income) ## [1] 6 3.2.4 Subsetting, filtering vector可以用中括號[]搭配數字來取用vector中的元素,下標從1開始。例如,要取用上述的vector中的第三個元素,可以使用my_vector[3]。 It is important to know how to neglect first n or last n elements. For example, a[1:(length(a)-2)] will neglect the last two elements. Thinking why I need parentheses for length(a)-2 here. county ## [1] "台中" "桃園" "台北" county[c(5, 3, 1)] # how about country[c(1, 3, 5)] ## [1] NA "台北" "台中" county[3:6] # is it equal to country[c(3, 4, 5, 6)] ## [1] "台北" NA NA NA a <- 11:19 a[3:length(a)] ## [1] 13 14 15 16 17 18 19 a[length(a):3] ## [1] 19 18 17 16 15 14 13 3.2.5 Deleting Without assignment, deletion won’t change original vectors b <- 11:20 b[-(3:5)] ## [1] 11 12 16 17 18 19 20 b[-c(1, 3, 5)] ## [1] 12 14 16 17 18 19 20 b ## [1] 11 12 13 14 15 16 17 18 19 20 Correct deleting operations with assignment to replace original vector b <- b[-(3:5)] b ## [1] 11 12 16 17 18 19 20 a <- seq(11, 99, 11) a <- a[-c(1, 3, 5)] a ## [1] 22 44 66 77 88 99 3.2.6 Concatenating Concatenating is quite useful for web crawling when you crawl article links page by page. You may be not sure the number of page you need to crawl. So you need to append entire new vector to old vector. It is concatenating. (“Appending” often means adding one new element at the end of data.) a <- 1:10 a <- c(a, 11) a ## [1] 1 2 3 4 5 6 7 8 9 10 11 b ## [1] 11 12 16 17 18 19 20 a <- c(a, b) a ## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20 a <- c(a, a, b) a ## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20 1 2 3 4 5 6 7 ## [26] 8 9 10 11 11 12 16 17 18 19 20 11 12 16 17 18 19 20 3.3 Calculating with vectors 3.3.1 Arithmetic operations a <- 11:19 a + 3 ## [1] 14 15 16 17 18 19 20 21 22 a / 2 ## [1] 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 a %% 2 ## [1] 1 0 1 0 1 0 1 0 1 a %/% 2 ## [1] 5 6 6 7 7 8 8 9 9 a %% 2== 0 ## [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE which(a %% 2== 0) ## [1] 2 4 6 8 a[which(a%% 2 == 0)] ## [1] 12 14 16 18 a[c(2, 4, 6, 8)] ## [1] 12 14 16 18 a %% 2 != 0 ## [1] TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE a[a%% 2 == 0] ## [1] 12 14 16 18 a[a%%2 != 0] ## [1] 11 13 15 17 19 a <- a %% 2 # modular arithmetic, get the reminder a <- a %/% 2 # Quotient 3.3.2 Logic comparisons a %% 2 == 0 # deteting odd/even number ## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE a %% 2 != 0 ## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE a[a%%2==0] ## [1] 0 0 0 0 0 0 0 0 0 a > b ## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE income > mean(income) ## [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE == T # == equal to, ## [1] TRUE TRUE != F # != Not equal to ## [1] TRUE any(a>11) # is there any element larger than 1 ## [1] FALSE all(a>11) # are all elements larger than 1 ## [1] FALSE 3.3.3 Subsetting by logic comparisons two methods to filter data from vectors, by index vector or a logical vector with equal length. a <- seq(11, 55, 11) a[c(T, F, T, F, T)] ## [1] 11 33 55 a[a%%2==1] ## [1] 11 33 55 a%%2 ## [1] 1 0 1 0 1 a%%2==1 ## [1] TRUE FALSE TRUE FALSE TRUE a <- c("你好","你好棒棒","你好棒","你真的好棒") a[nchar(a)>3] ## [1] "你好棒棒" "你真的好棒" # which will return "index-of" a <- seq(11, 55, 11) a[which(a%%2==1)] ## [1] 11 33 55 which(a%%2==1) ## [1] 1 3 5 3.3.4 Sorting and ordering sort(x)的結果必須用<-覆蓋原本的x,此時的x才算被排序的結果。 order(x)函式會傳回x數值由小到大的索引。這個例子的結果是5, 4, 3, 6, 1, 2,也就是5位置的那個數最小、4那個位置的數次小、接下來3, 6, 1, 2。 x[order(x)]把order(x)結果(也就是c(5, 4, 3, 6, 1, 2))傳給原本的x便會使得原本的x重新排序。通常order()的用途是,我們可以將兩個等長的variables例如var1和var2,依據var2來重新排序var1,例如var1[order(var2)]。 x <- c(33, 55, 22, 13, 4, 24) mode(x) ## [1] "numeric" class(x) ## [1] "numeric" sort(x) ## [1] 4 13 22 24 33 55 # x <- sort(x) # assign to replace original x order(x) ## [1] 5 4 3 6 1 2 x[order(x)] ## [1] 4 13 22 24 33 55 x[c(5, 4, 3, 6, 1, 2)] ## [1] 4 13 22 24 33 55 3.3.5 Built-in math functions a <- 11:19 min(a); max(a); mean(a); median(a); sd(a) ## [1] 11 ## [1] 19 ## [1] 15 ## [1] 15 ## [1] 2.738613 log2(a) ## [1] 3.459432 3.584963 3.700440 3.807355 3.906891 4.000000 4.087463 4.169925 ## [9] 4.247928 log1p(a) ## [1] 2.484907 2.564949 2.639057 2.708050 2.772589 2.833213 2.890372 2.944439 ## [9] 2.995732 ?log1p 3.4 Data types 3.4.1 Checking data type mode(county) # character ## [1] "character" mode(income) # numeric ## [1] "numeric" mode(income > mean(income)) # logical ## [1] "logical" testing <- c("26.142", "12.008", "7.032", "13.646", "4.589") mode(testing) # character ## [1] "character" 3.4.2 Converting data type numeric vector可以用as.character(x)轉成charcter;logical vector可以用as.numeric(x)轉為numeric。概念上可以說是character > numeric > logical。 如果硬是在logical vector後附加一個numeric element的話,那就會整個vector被轉為numeric vector;相仿地,如果numeric vector後附加一個character element的話那整個vector就會被轉為character vector。 可以用sum()函式來計算logical vector有幾個TRUE值。例如sum(a%%2==1)就是計算a中有幾個奇數。TRUE可視為1、FALSE可視為0,所以加總起來就是TRUE有幾個。 income.c <- as.character(income) population.c <- as.numeric(population) a <- seq(11, 99, 11) a <- c(a, "100") a <- seq(11, 99, 11) sum(a%%2==1) ## [1] 5 max(a) ## [1] 99 3.5 Character operations a <- seq(11, 55, 11) paste("A", a) # concatenate ## [1] "A 11" "A 22" "A 33" "A 44" "A 55" paste0("A", a) # concatenate ## [1] "A11" "A22" "A33" "A44" "A55" "],["dataframe.html", "Chapter 4 Dataframe 4.1 基本操作 4.2 簡易繪圖 4.3 延伸學習 4.4 Paid Maternity Leave", " Chapter 4 Dataframe 4.1 基本操作 4.1.1 產生新的Dataframe 4.1.1.1 建立資料並Assign給vector 用以下ChatGPT問句來產生測試資料「我現在正在準備R的教學範例, 請協助我產生台北市所有行政區的資料,包含行政區名、面積、人口數 分別指給town, area, population三個變數」。 town = c("松山區", "信義區", "大安區", "中山區", "中正區", "大同區", "萬華區", "文山區", "南港區", "內湖區", "士林區", "北投區") area = c(9.2878, 11.2077, 11.3614, 13.6821, 7.6071, 5.6815, 8.8522, 31.5090, 21.8424, 31.5787, 62.3682, 56.8216) # 單位:平方公里 population = c(206375, 225561, 309835, 203276, 159608, 132397, 194160, 275207, 122103, 287726, 288324, 255688) # 2023年的估計值 4.1.1.2 合併等長vector為dataframe df <- data.frame(town, population, area) df$density = df$population / df$area str(df) ## 'data.frame': 6 obs. of 4 variables: ## $ town : chr "中正" "大同" "中山" "松山" ... ## $ population: num 158228 126687 228075 204903 308383 ... ## $ area : num 7.61 5.68 13.68 9.29 11.36 ... ## $ density : num 20800 22298 16670 22062 27143 ... summary(df) ## town population area density ## Length:6 Min. :126687 Min. : 5.681 Min. :16670 ## Class :character 1st Qu.:165651 1st Qu.: 7.918 1st Qu.:20907 ## Mode :character Median :196412 Median : 9.070 Median :21645 ## Mean :202366 Mean : 9.412 Mean :21700 ## 3rd Qu.:222282 3rd Qu.:10.843 3rd Qu.:22239 ## Max. :308383 Max. :13.682 Max. :27143 # View(df) 4.1.1.3 存放台灣貿易各國進出口量 運用國際貿易署貿易統計系統 (trade.gov.tw)獲取臺灣進出口貿易資料。 country <- c("CN", "US", "JP", "HK", "KR", "SG", "DE", "MY", "VN", "PH", "TH", "AU", "NL", "SA", "ID", "GB", "IN", "FR", "IT", "AE") import <- c(26.142, 12.008, 7.032, 13.646, 4.589, 5.768, 2.131, 2.802, 3.428, 3.019, 1.976, 1.118, 1.624, 0.449, 0.983, 1.302, 1.027, 0.553, 0.670, 0.455) export <- c(22.987, 12.204, 11.837, 7.739, 5.381, 4.610, 2.866, 2.784, 2.414, 2.092, 1.839, 1.788, 1.665, 1.409, 1.391, 1.075, 0.974, 0.899, 0.800, 0.728) 4.1.1.4 合併vector為data.frame 當我們讀取或創建資料框架時,過去R預設會將字符串類型的變數轉換為因子(Factors),這對於統計分析而言是有益的,因為統計分析經常將文字型態的數據視為類別變數來處理。然而,隨著資料科學領域的快速發展,需要處理大量文字數據的情況日益增多,這時將文字資料預設為因子型態可能不再適合所有情境。因此,現在R的預設的處理方式已經改變,預設將文字型態的變數保持為字符型態(Character),而不是自動將其轉換為因子。這意味著,當我們使用read.csv等函數讀取數據時,除非明確指定,否則讀入的字符串不會自動轉換為Factors型態。 如果你在進行統計分析時希望將文字型態的變數作為類別變數(即因子)處理,你需要手動設定stringsAsFactors參數為TRUE。這可以在讀取數據時(如使用read.csv函數)或在數據處理過程中明確進行轉換。例如,當使用read.csv讀取CSV文件時,若想將所有的字符串變數自動轉為因子型態,可以這樣做:df <- read.csv(\"your_file.csv\", stringsAsFactors = TRUE)。若已經讀取數據且數據框架中的文字型態變數仍為Character型態,而你希望將其轉換為Factors,可以使用factor函數進行轉換:df$your_column <- factor(df$your_column)。 df <- data.frame(country, import, export, stringsAsFactors = TRUE) str(df) ## 'data.frame': 20 obs. of 3 variables: ## $ country: Factor w/ 20 levels "AE","AU","CN",..: 3 19 11 7 12 17 4 13 20 15 ... ## $ import : num 26.14 12.01 7.03 13.65 4.59 ... ## $ export : num 22.99 12.2 11.84 7.74 5.38 ... df <- data.frame(country, import, export) str(df) ## 'data.frame': 20 obs. of 3 variables: ## $ country: chr "CN" "US" "JP" "HK" ... ## $ import : num 26.14 12.01 7.03 13.65 4.59 ... ## $ export : num 22.99 12.2 11.84 7.74 5.38 ... 其他功能:建立一個新且空的data.frame。 df.test <- data.frame() 4.1.2 觀察dataframe 當我們處理數據框架(dataframe)時,有幾種常用的方法可以幫助我們更好地了解和觀察數據的結構和內容。 View(df): 使用RStudio提供的圖形使用者介面直接觀看dataframe。這個功能允許你直觀地瀏覽整個數據集,方便地查看不同行(變數)和列(觀測值)。這對於初步瞭解數據的分佈和檢查數據的格式特別有用。 head(df): 這個函數用於取出數據框架的前六筆資料(也就是前六列)。這可以讓我們快速概覽數據集的開頭部分,了解數據的基本結構和內容。如果需要查看更多或更少的列,可以向head函數傳遞一個額外的參數,如head(df, n = 10)來查看前十列。 class(df): 此函數返回該變數的類型。對於dataframe,它將返回”DataFrame”,表明該對象是一個dataframe。了解對象的類型是重要的基礎步驟,尤其是在R中,不同類型的變項能夠做的操作和應用的函數也不同。 str(df): str是結構(structure)的縮寫,這個函數提供了dataframe的詳細結構信息,包括變項的數量、變項名稱、變項數據類型以及每個變項前幾個值。這是一個非常強大的函數,用於深入了解數據集的內部結構,特別是當處理大型數據集時。 summary(df): 此函數提供了數據框架的摘要統計信息,包括數值變數的最小值、最大值、中位數、平均值、第一四分位數和第三四分位數,以及因子變數的水平計數。這對於快速獲取數據集的統計概述非常有用。 # View(df) head(df) # get first part of the data.frame ## country import export ## 1 CN 26.142 22.987 ## 2 US 12.008 12.204 ## 3 JP 7.032 11.837 ## 4 HK 13.646 7.739 ## 5 KR 4.589 5.381 ## 6 SG 5.768 4.610 class(df) ## [1] "data.frame" str(df) ## 'data.frame': 20 obs. of 3 variables: ## $ country: chr "CN" "US" "JP" "HK" ... ## $ import : num 26.14 12.01 7.03 13.65 4.59 ... ## $ export : num 22.99 12.2 11.84 7.74 5.38 ... summary(df) ## country import export ## Length:20 Min. : 0.449 Min. : 0.728 ## Class :character 1st Qu.: 1.016 1st Qu.: 1.312 ## Mode :character Median : 2.054 Median : 1.966 ## Mean : 4.536 Mean : 4.374 ## 3rd Qu.: 4.884 3rd Qu.: 4.803 ## Max. :26.142 Max. :22.987 # look up help help(summary) ?summary 4.1.2.1 觀察資料維度 dim(df) ## [1] 20 3 ncol(df) ## [1] 3 nrow(df) ## [1] 20 length(df) ## [1] 3 4.1.3 操作dataframe 4.1.3.1 取出一個變項 names(df) 列出變數名稱 df$發生.現.地點 顯示該變數內容 df$發生時段 顯示該變數內容 length(df$發生時段) 顯示該變數的長度(相當於有幾個) names(df) ## [1] "country" "import" "export" head(df$export) ## [1] 22.987 12.204 11.837 7.739 5.381 4.610 length(df$import) ## [1] 20 summary(df) ## country import export ## Length:20 Min. : 0.449 Min. : 0.728 ## Class :character 1st Qu.: 1.016 1st Qu.: 1.312 ## Mode :character Median : 2.054 Median : 1.966 ## Mean : 4.536 Mean : 4.374 ## 3rd Qu.: 4.884 3rd Qu.: 4.803 ## Max. :26.142 Max. :22.987 4.1.3.2 (mutate)透過運算產生新變數 這裡容易犯錯的是,要記得跟程式講說你要加總或四則運算的是哪個df的variable。 從下面的這個操作中,該data.frame會產生一個新的變數sub,這就相當於Excel中的某一行減去某一行,然後把資料放在新的一行。 df$sub <- df$import - df$export 4.1.3.3 (filter)篩選資料、選取變數 注意,要告訴程式import和export是哪個data.frame的。 df[,]為存取df中某個區段的數值或某個數值的方法。因此df[1, 1]會取出第一行第一列,也就是第一筆資料的第一個vector。df[2, 3]則會取出第二筆資料的第三個variable。 下面的例子nrow(df)為1894,有1894筆資料,所以自然df\\(import與df\\)export的長度都是1894。因此,比較這兩個變數的大小會得到一個長度為1894的boolean (logical) variable。因此把這個長度為1894、充滿TRUE和FALSE的logical vector丟進df的row之處,因為取自df,大小判斷式結果的長度自然和原本的df的列數相同。因此當這個TRUE/FALSE被丟在df的列之處,便會篩選出import大於p.xport的數值。 原本的df有五個variable,而上述的操作是篩選資料,所以被篩選的是列,因此行的數量、名稱都不會變。因此,我篩選完後,直接存取這個被篩選過的data.frame的country variable,自然是可以的。 df ## country import export sub ## 1 CN 26.142 22.987 3.155 ## 2 US 12.008 12.204 -0.196 ## 3 JP 7.032 11.837 -4.805 ## 4 HK 13.646 7.739 5.907 ## 5 KR 4.589 5.381 -0.792 ## 6 SG 5.768 4.610 1.158 ## 7 DE 2.131 2.866 -0.735 ## 8 MY 2.802 2.784 0.018 ## 9 VN 3.428 2.414 1.014 ## 10 PH 3.019 2.092 0.927 ## 11 TH 1.976 1.839 0.137 ## 12 AU 1.118 1.788 -0.670 ## 13 NL 1.624 1.665 -0.041 ## 14 SA 0.449 1.409 -0.960 ## 15 ID 0.983 1.391 -0.408 ## 16 GB 1.302 1.075 0.227 ## 17 IN 1.027 0.974 0.053 ## 18 FR 0.553 0.899 -0.346 ## 19 IT 0.670 0.800 -0.130 ## 20 AE 0.455 0.728 -0.273 names(df) ## [1] "country" "import" "export" "sub" nrow(df) ## [1] 20 # filter row data by column value df[df$import > df$export,] ## country import export sub ## 1 CN 26.142 22.987 3.155 ## 4 HK 13.646 7.739 5.907 ## 6 SG 5.768 4.610 1.158 ## 8 MY 2.802 2.784 0.018 ## 9 VN 3.428 2.414 1.014 ## 10 PH 3.019 2.092 0.927 ## 11 TH 1.976 1.839 0.137 ## 16 GB 1.302 1.075 0.227 ## 17 IN 1.027 0.974 0.053 df[df$import > df$export,]$country ## [1] "CN" "HK" "SG" "MY" "VN" "PH" "TH" "GB" "IN" df[df$import > df$export,1] ## [1] "CN" "HK" "SG" "MY" "VN" "PH" "TH" "GB" "IN" # 1 row == a data.frame with only one data entry class(df[df$import > df$export,1]) ## [1] "character" class(df[,1]) # character vector ## [1] "character" class(df[1,]) # data.frame ## [1] "data.frame" class(unlist(df[1, -1])) # filter the 1st row and select all columns except 1 ## [1] "numeric" 4.1.3.4 (arrange) 按某個變數排序 df.sorted <- df[order(df$import),]會使得整個df照import的大小排序重新做排列。因為order(df$import)會把資料照指定順序排列後的位置傳回來,所以把他丟給df的列的位置,便會使得df的資料照指定的順序排列。 預設是由小到大,加上decreasing = T這個參數後變成由大而小。 # sort rows by df$import column df.sorted <- df[order(df$import),] # View(df.sorted) # sort rows in decreasing order df.sorted <- df[order(df$import, decreasing = T),] # add - to column in order() can sort in decreasing order df.sorted <- df[order(-df$import),] head(df.sorted) ## country import export sub ## 1 CN 26.142 22.987 3.155 ## 4 HK 13.646 7.739 5.907 ## 2 US 12.008 12.204 -0.196 ## 3 JP 7.032 11.837 -4.805 ## 6 SG 5.768 4.610 1.158 ## 5 KR 4.589 5.381 -0.792 4.2 簡易繪圖 graphics::plot()為會預載入R的繪圖套件,如果希望繪圖的同時加上回歸線和資料點標籤的話,必須要三行一起執行。 # plot(df) # raise error, 1st column is a character vector plot(df[, 2:3]) plot(df[1:10, 2:3]) text(import, export, labels=country, cex= 0.5, pos=3) lines(1:25, 1:25, col='red') ?plot ## Help on topic 'plot' was found in the following packages: ## ## Package Library ## graphics /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library ## base /Library/Frameworks/R.framework/Resources/library ## ## ## Using the first match ... 4.3 延伸學習 4.3.1 使用dplyr library(dplyr) df <- data.frame(country, import, export, stringsAsFactors = F) df <- mutate(df, sub = import - export) filter(df, import > export) ## country import export sub ## 1 CN 26.142 22.987 3.155 ## 2 HK 13.646 7.739 5.907 ## 3 SG 5.768 4.610 1.158 ## 4 MY 2.802 2.784 0.018 ## 5 VN 3.428 2.414 1.014 ## 6 PH 3.019 2.092 0.927 ## 7 TH 1.976 1.839 0.137 ## 8 GB 1.302 1.075 0.227 ## 9 IN 1.027 0.974 0.053 select(df, c(1, 3)) ## country export ## 1 CN 22.987 ## 2 US 12.204 ## 3 JP 11.837 ## 4 HK 7.739 ## 5 KR 5.381 ## 6 SG 4.610 ## 7 DE 2.866 ## 8 MY 2.784 ## 9 VN 2.414 ## 10 PH 2.092 ## 11 TH 1.839 ## 12 AU 1.788 ## 13 NL 1.665 ## 14 SA 1.409 ## 15 ID 1.391 ## 16 GB 1.075 ## 17 IN 0.974 ## 18 FR 0.899 ## 19 IT 0.800 ## 20 AE 0.728 message(df$country) print(df$country) ## [1] "CN" "US" "JP" "HK" "KR" "SG" "DE" "MY" "VN" "PH" "TH" "AU" "NL" "SA" "ID" ## [16] "GB" "IN" "FR" "IT" "AE" 4.3.2 比較tibble, data_frame, data.frame 警告: \"data_frame()\" was deprecated in tibble 1.1.0. Please use \"tibble()\" instead. df <- data.frame(a=1:2, b=3:4, c=5:6) class(df) ## [1] "data.frame" df <- data_frame(a=1:2, b=3:4, c=5:6) class(df) ## [1] "tbl_df" "tbl" "data.frame" df <- tibble(a=1:2, b=3:4, c=5:6) class(df) ## [1] "tbl_df" "tbl" "data.frame" 4.4 Paid Maternity Leave 本案例將使用R重新製作華盛頓郵報2016年8月13日的一篇報導,該報導探討了美國婦女產假支薪情況。案例中將應用data.frame和基本的繪圖與資料摘要方法。 原始新聞來源:The world is getting better at paid maternity leave. The U.S. is not. - The Washington Post。該篇報導提及,美國因為目前的政策不保障帶薪產假,許多女性感到必須在工作和照顧家庭之間做出選擇,這種性別不平等破壞了她們在工作機會上的平等機會。同時,世界各地的婦女待遇正在逐漸改善。至少190個國家對嬰兒的母親規定了某種形式的帶薪假期,產假待遇在56個國家有所提高。專家表示,現在美國城市和州正通過不同形式的帶薪家庭假法案,這顯示美國雇主正在展示有競爭力的福利不會影響員工表現。特別是科技公司,如Twitter、Facebook和Google等,處於提供員工帶薪產假福利的前沿,美國可能有望追趕其他國家。 本案例主要呈現核心的視覺化概念,可以在Review Paid Maternity by dplyr找到更詳盡的案例說明與解析。 4.4.1 Reading .xlsx by readxl package 在進行產假支薪調查數據的分析與視覺化時,我們從該調查網站上所下載的資料是一個Excel文件。由於R語言本身不直接支援讀取Excel格式的文件,我們必須依靠外部的套件來實現這一功能,如readxl套件。它是專門設計來讀取.xls和.xlsx格式文件的強大工具。readxl套件是tidyverse套件集的一部分。tidyverse是一組旨在數據科學和數據處理領域提供便利的R套件集合,包括了ggplot2、dplyr、tidyr等多個流行的套件。如果你之前已經安裝了tidyverse,那麼readxl套件應該也已經安裝在你的系統上,無需進行重複安裝。 然而,即便readxl已經安裝,它並不會隨著tidyverse套件集的其他部分自動加載到R的執行環境中。這意味著,在你打算使用readxl套件來讀取Excel文件之前,需要先手動執行library(readxl)命令來加載它。 # Import readxl package # install.packages("tidyverse") library(readxl) 這段程式碼使用read_excel()函式從data資料夾中的WORLD-MACHE_Gender_6.8.15.xls檔案中的Sheet1工作表讀取資料。其中col_names=T為該函式的參數,表示第一列為欄位名稱。讀取後的資料會被Assign給變數df。 # Use read_excel() to convert excel sheet to data.frame df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) 4.4.2 Previewing data by View(), class(), dim(), str(), summary() and names() # View(df) class(df) # [1] "tbl_df" "tbl" "data.frame" ## [1] "tbl_df" "tbl" "data.frame" dim(df) ## [1] 197 156 # Show names of variables (vectors, columns) by names() names(df) ## [1] "country" "iso2" "iso3" ## [4] "region" "wb_econ" "matleave_95" ## [7] "matleave_96" "matleave_97" "matleave_98" ## [10] "matleave_99" "matleave_00" "matleave_01" ## [13] "matleave_02" "matleave_03" "matleave_04" ## [16] "matleave_05" "matleave_06" "matleave_07" ## [19] "matleave_08" "matleave_09" "matleave_10" ## [22] "matleave_11" "matleave_12" "matleave_13" ## [25] "matleave_wrr_95" "matleave_wrr_96" "matleave_wrr_97" ## [28] "matleave_wrr_98" "matleave_wrr_99" "matleave_wrr_00" ## [31] "matleave_wrr_01" "matleave_wrr_02" "matleave_wrr_03" ## [34] "matleave_wrr_04" "matleave_wrr_05" "matleave_wrr_06" ## [37] "matleave_wrr_07" "matleave_wrr_08" "matleave_wrr_09" ## [40] "matleave_wrr_10" "matleave_wrr_11" "matleave_wrr_12" ## [43] "matleave_wrr_13" "bf_dur_95" "bf_dur_96" ## [46] "bf_dur_97" "bf_dur_98" "bf_dur_99" ## [49] "bf_dur_00" "bf_dur_01" "bf_dur_02" ## [52] "bf_dur_03" "bf_dur_04" "bf_dur_05" ## [55] "bf_dur_06" "bf_dur_07" "bf_dur_08" ## [58] "bf_dur_09" "bf_dur_10" "bf_dur_11" ## [61] "bf_dur_12" "bf_dur_13" "mat_bfeed_6mon_95" ## [64] "mat_bfeed_6mon_96" "mat_bfeed_6mon_97" "mat_bfeed_6mon_98" ## [67] "mat_bfeed_6mon_99" "mat_bfeed_6mon_00" "mat_bfeed_6mon_01" ## [70] "mat_bfeed_6mon_02" "mat_bfeed_6mon_03" "mat_bfeed_6mon_04" ## [73] "mat_bfeed_6mon_05" "mat_bfeed_6mon_06" "mat_bfeed_6mon_07" ## [76] "mat_bfeed_6mon_08" "mat_bfeed_6mon_09" "mat_bfeed_6mon_10" ## [79] "mat_bfeed_6mon_11" "mat_bfeed_6mon_12" "mat_bfeed_6mon_13" ## [82] "minage_fem_leg_95" "minage_fem_leg_96" "minage_fem_leg_97" ## [85] "minage_fem_leg_98" "minage_fem_leg_99" "minage_fem_leg_00" ## [88] "minage_fem_leg_01" "minage_fem_leg_02" "minage_fem_leg_03" ## [91] "minage_fem_leg_04" "minage_fem_leg_05" "minage_fem_leg_06" ## [94] "minage_fem_leg_07" "minage_fem_leg_08" "minage_fem_leg_09" ## [97] "minage_fem_leg_10" "minage_fem_leg_11" "minage_fem_leg_12" ## [100] "legal_diff_leg_95" "legal_diff_leg_96" "legal_diff_leg_97" ## [103] "legal_diff_leg_98" "legal_diff_leg_99" "legal_diff_leg_00" ## [106] "legal_diff_leg_01" "legal_diff_leg_02" "legal_diff_leg_03" ## [109] "legal_diff_leg_04" "legal_diff_leg_05" "legal_diff_leg_06" ## [112] "legal_diff_leg_07" "legal_diff_leg_08" "legal_diff_leg_09" ## [115] "legal_diff_leg_10" "legal_diff_leg_11" "legal_diff_leg_12" ## [118] "minage_fem_pc_95" "minage_fem_pc_96" "minage_fem_pc_97" ## [121] "minage_fem_pc_98" "minage_fem_pc_99" "minage_fem_pc_00" ## [124] "minage_fem_pc_01" "minage_fem_pc_02" "minage_fem_pc_03" ## [127] "minage_fem_pc_04" "minage_fem_pc_05" "minage_fem_pc_06" ## [130] "minage_fem_pc_07" "minage_fem_pc_08" "minage_fem_pc_09" ## [133] "minage_fem_pc_10" "minage_fem_pc_11" "minage_fem_pc_12" ## [136] "legal_diff_pc_95" "legal_diff_pc_96" "legal_diff_pc_97" ## [139] "legal_diff_pc_98" "legal_diff_pc_99" "legal_diff_pc_00" ## [142] "legal_diff_pc_01" "legal_diff_pc_02" "legal_diff_pc_03" ## [145] "legal_diff_pc_04" "legal_diff_pc_05" "legal_diff_pc_06" ## [148] "legal_diff_pc_07" "legal_diff_pc_08" "legal_diff_pc_09" ## [151] "legal_diff_pc_10" "legal_diff_pc_11" "legal_diff_pc_12" ## [154] "minwage_ppp_2013" "mw_overtime" "oecd" 4.4.3 Select variables 由於所需要的資料為第三欄的變數iso3(為國家代碼)和第六至24欄的matleave95~matleave13共29年的資料,所以需要在df[ , ]中選出這幾欄。只要把所要取的欄以vector的型態放在df[row,col]之col的位置,便可以選出所要的欄。 # Select the 3rd and 6th to 24th columns matleave <- df[ , c(3, 6:24)] # Use class(), dim(), and str() to inspect the data class(matleave) ## [1] "tbl_df" "tbl" "data.frame" dim(matleave) ## [1] 197 20 str(matleave) ## tibble [197 × 20] (S3: tbl_df/tbl/data.frame) ## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ... ## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_96: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_97: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_98: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_99: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_00: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_01: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_02: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_03: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_04: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_05: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_06: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_07: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_08: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_09: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_10: num [1:197] 2 5 3 3 2 2 2 5 NA 5 ... ## $ matleave_11: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_12: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_13: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... 4.4.4 Check & Replace NAs 處理開放資料常常會遇到紀錄遺漏的情形,這些遺漏的值在R語言中通常以NA(Not Available)來表示。這種情況很常見,特別是當數據來自於廣泛的來源,如網絡調查或公開資料庫時。適當處理這些NA值對於維持分析的準確性和可靠性至關重要。 為了識別和處理這些NA值,R提供了一些有用的函數和技巧。例如,is.na(v)函數可以用來檢測向量v中的NA值。如果你想選擇所有的NA紀錄,可以使用v[is.na(v)]這樣的語法。這個表達式會傳回所有在向量v中為NA的元素,這對於進一步的分析和資料清洗非常有幫助。 在某些情況下,你可能會想要以某個特定值來取代NA值,以避免在繪圖或進行其他數據分析時產生錯誤。例如,你可以選擇以0來取代所有的NA值,這可以通過v[is.na(v)] <- 0來實現。這樣,所有原本為NA的資料格都會被賦予0值。 此外,sum(is.na(v))這個表達式可以用來檢測向量v中還有多少NA值。這個函數的運作機制是計算所有is.na(v)為TRUE的情況,即所有NA值的總數。如果這個結果不是0,那麼就表示在向量或dataframe中還存在NA值。這對於確保數據清理工作已經完成,並且數據集準備好進行分析是非常有用的。 # is.na() to indicate each element is NA or NOT(TRUE/FALSE) head(is.na(matleave), n=20) ## iso3 matleave_95 matleave_96 matleave_97 matleave_98 matleave_99 ## [1,] FALSE FALSE FALSE FALSE FALSE FALSE ## [2,] FALSE FALSE FALSE FALSE FALSE FALSE ## [3,] FALSE FALSE FALSE FALSE FALSE FALSE ## [4,] FALSE FALSE FALSE FALSE FALSE FALSE ## [5,] FALSE FALSE FALSE FALSE FALSE FALSE ## [6,] FALSE FALSE FALSE FALSE FALSE FALSE ## [7,] FALSE FALSE FALSE FALSE FALSE FALSE ## [8,] FALSE FALSE FALSE FALSE FALSE FALSE ## [9,] FALSE FALSE FALSE FALSE FALSE FALSE ## [10,] FALSE FALSE FALSE FALSE FALSE FALSE ## [11,] FALSE FALSE FALSE FALSE FALSE FALSE ## [12,] FALSE FALSE FALSE FALSE FALSE FALSE ## [13,] FALSE FALSE FALSE FALSE FALSE FALSE ## [14,] FALSE FALSE FALSE FALSE FALSE FALSE ## [15,] FALSE FALSE FALSE FALSE FALSE FALSE ## [16,] FALSE FALSE FALSE FALSE FALSE FALSE ## [17,] FALSE FALSE FALSE FALSE FALSE FALSE ## [18,] FALSE FALSE FALSE FALSE FALSE FALSE ## [19,] FALSE FALSE FALSE FALSE FALSE FALSE ## [20,] FALSE FALSE FALSE FALSE FALSE FALSE ## matleave_00 matleave_01 matleave_02 matleave_03 matleave_04 matleave_05 ## [1,] FALSE FALSE FALSE FALSE FALSE FALSE ## [2,] FALSE FALSE FALSE FALSE FALSE FALSE ## [3,] FALSE FALSE FALSE FALSE FALSE FALSE ## [4,] FALSE FALSE FALSE FALSE FALSE FALSE ## [5,] FALSE FALSE FALSE FALSE FALSE FALSE ## [6,] FALSE FALSE FALSE FALSE FALSE FALSE ## [7,] FALSE FALSE FALSE FALSE FALSE FALSE ## [8,] FALSE FALSE FALSE FALSE FALSE FALSE ## [9,] FALSE FALSE FALSE FALSE FALSE FALSE ## [10,] FALSE FALSE FALSE FALSE FALSE FALSE ## [11,] FALSE FALSE FALSE FALSE FALSE FALSE ## [12,] FALSE FALSE FALSE FALSE FALSE FALSE ## [13,] FALSE FALSE FALSE FALSE FALSE FALSE ## [14,] FALSE FALSE FALSE FALSE FALSE FALSE ## [15,] FALSE FALSE FALSE FALSE FALSE FALSE ## [16,] FALSE FALSE FALSE FALSE FALSE FALSE ## [17,] FALSE FALSE FALSE FALSE FALSE FALSE ## [18,] FALSE FALSE FALSE FALSE FALSE FALSE ## [19,] FALSE FALSE FALSE FALSE FALSE FALSE ## [20,] FALSE FALSE FALSE FALSE FALSE FALSE ## matleave_06 matleave_07 matleave_08 matleave_09 matleave_10 matleave_11 ## [1,] FALSE FALSE FALSE FALSE FALSE FALSE ## [2,] FALSE FALSE FALSE FALSE FALSE FALSE ## [3,] FALSE FALSE FALSE FALSE FALSE FALSE ## [4,] FALSE FALSE FALSE FALSE FALSE FALSE ## [5,] FALSE FALSE FALSE FALSE FALSE FALSE ## [6,] FALSE FALSE FALSE FALSE FALSE FALSE ## [7,] FALSE FALSE FALSE FALSE FALSE FALSE ## [8,] FALSE FALSE FALSE FALSE FALSE FALSE ## [9,] FALSE FALSE FALSE FALSE TRUE FALSE ## [10,] FALSE FALSE FALSE FALSE FALSE FALSE ## [11,] FALSE FALSE FALSE FALSE FALSE FALSE ## [12,] FALSE FALSE FALSE FALSE FALSE FALSE ## [13,] FALSE FALSE FALSE FALSE FALSE FALSE ## [14,] FALSE FALSE FALSE FALSE FALSE FALSE ## [15,] FALSE FALSE FALSE FALSE FALSE FALSE ## [16,] FALSE FALSE FALSE FALSE FALSE FALSE ## [17,] FALSE FALSE FALSE FALSE FALSE FALSE ## [18,] FALSE FALSE FALSE FALSE FALSE FALSE ## [19,] FALSE FALSE FALSE FALSE FALSE FALSE ## [20,] FALSE TRUE TRUE FALSE FALSE FALSE ## matleave_12 matleave_13 ## [1,] FALSE FALSE ## [2,] FALSE FALSE ## [3,] FALSE FALSE ## [4,] FALSE FALSE ## [5,] FALSE FALSE ## [6,] FALSE FALSE ## [7,] FALSE FALSE ## [8,] FALSE FALSE ## [9,] FALSE FALSE ## [10,] FALSE FALSE ## [11,] FALSE FALSE ## [12,] FALSE FALSE ## [13,] FALSE FALSE ## [14,] FALSE FALSE ## [15,] FALSE FALSE ## [16,] FALSE FALSE ## [17,] FALSE FALSE ## [18,] FALSE FALSE ## [19,] FALSE FALSE ## [20,] FALSE FALSE # Assign 0 to those NA data matleave[is.na(matleave)] <- 0 # anyNA() to check if there are still NA cells. anyNA(matleave) ## [1] FALSE # sum(is.na()) to count the number of NA sum(is.na(matleave)) ## [1] 0 4.4.5 Filtering data 4.4.5.1 Filtered by the last year value matleave[matleave$'matleave_13'==5, ]中的第一個matleave表示要篩選的資料集,中括號中的matleave$'matleave_13'==5是篩選條件,表示將篩選matleave資料集中的matleave_13變數值等於5的列;中括號中的逗號後方未有欄位名稱表示將保留所有欄位(變項),僅篩選出符合條件的列,並將篩選後所產生的dataframe指給變數m5。 # Use logical comparison to see if the last year equals to 5 # Assign matching data to var m5 m5 <- matleave[matleave$'matleave_13'==5, ] # nrow() to count matching data nrow(m5) ## [1] 34 # Is it possible to use length() to check the data length? # matleave$'matleave_13' # matleave$'matleave_13'==5 # length(matleave$'matleave_13'==5) 4.4.5.2 Filtered data by the first year value 接下來我們再做一次篩選,從m5中篩選出matleave_95這個欄位為5的資料,並指給m55;同時也從m5中篩選出matleave_95這個欄位不為5的資料,並指給m05。m5、m55和m05無特殊含義,只是變數名稱而已。 # filter rows whose 'matleave_95' is 5, and assign to var m55 m55<- m5[m5$'matleave_95'==5,] # filter rows whose 'matleave_95' is not 5, and assign to var m05 m05<- m5[m5$'matleave_95'!=5,] 4.4.6 Plotting 當我們在R中進行資料視覺化時,理解資料結構對於正確使用圖形化函數是非常重要的。以matleave資料集為例,如果我們想要繪製其第二列所有行(除了第一行)的條形圖,這裡有一段示範程式碼及相關的概念解釋。 首先,為何要除去第一行?因為第一行為國家名稱。所以我們利用class(matleave[2, -1])來查看matleave資料集第二行和除了第一列外所有列的資料類型。這個操作返回的是一個data.frame的資料類型,因為即使是單一行的選取,R仍然保持了資料的data.frame結構。 然而,當我們嘗試使用barplot()函數繪製長條圖時,就不能直接把data.frame給barplot()進行繪製。。這是因為barplot()函數期望的輸入是一個vector。因此,我們使用unlist(matleave[2, -1])將單行的data.frame轉換成vector。unlist()函數的作用是將一個列表(或在這個案例中是data.frame)中的所有元素合併成一個vector,這樣就可以用於barplot()。 為了進一步理解這種差異,我們可以使用class()或str()函數來觀察未經unlist()處理的資料。這將顯示出資料仍然保留在data.frame結構中,與unlist()後轉換為vector的結構有顯著的不同。這種轉換對於使用某些特定的繪圖函數,如barplot(),是必要的,因為它們需要一個vector作為輸入來正確地繪製圖形。 4.4.6.1 Plotting one row (one country) # barplot() the second row of m55 # barplot(m55[2, ]) # raise error # barplot() the second row when neglecting the first column # barplot(m55[2, -1]) # raise error # Take a look at the data type of matleave[2, ] class(matleave[2, -1]) ## [1] "tbl_df" "tbl" "data.frame" class(unlist(matleave[2, -1])) ## [1] "numeric" # unlist() to convert a single row data.frame to a vector for barplot() barplot(unlist(m55[2, -1])) Testing # View(matleave[1]) # select the 1st variable # View(matleave[ ,1]) # select the 1st column # View(matleave[1, ]) # select the 1st row class(m55[1]) # "tbl_df" "tbl" "data.frame" ## [1] "tbl_df" "tbl" "data.frame" class(m55[ ,1]) # "tbl_df" "tbl" "data.frame" ## [1] "tbl_df" "tbl" "data.frame" class(m55[1, ]) # "tbl_df" "tbl" "data.frame" ## [1] "tbl_df" "tbl" "data.frame" class(m55$iso3) # character (vector) ## [1] "character" 4.4.6.2 More arguments (args) 接下來我們要微調一下視覺化的結果。這行程式碼使用R中的barplot函數繪製一個長條圖,其中的參數說明如下: unlist(m55[2, -1]): 將m55資料集的第2行(不包括第1欄)轉換為一個向量,並作為長條圖的高度(即每個長條的高度)。 ylim=c(0, 5): 設置y軸的範圍為0到5,即長條圖的最大高度為5。 space=0: 設置相鄰兩個長條之間的距離為0,即長條緊密相連。 border=NA: 設置長條的邊框為透明,即不顯示邊框。 xaxt=\"n\": 不顯示x軸的標籤。 yaxt=\"n\": 不顯示y軸的標籤。 # barplot() the unlisted second row (neglecting the first col) barplot(unlist(m55[2, -1])) # use ?barplot to know more argument of the function. ?barplot # Add arguments ylim, space, border, and axat/yaxt one by one to barplot() barplot(unlist(m55[2, -1]), ylim=c(0, 5)) barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0) barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0, border=NA) barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") 4.4.6.3 Plotting multiple lines 我們已經成功繪製了一個國家的資料,接下來我們要繪出所有國家的資料。以m55這個篩選後的資料為例,我分別要繪製出第1列至第6列的國家。底下可以看見每一行非常相似且一致的特徵,僅有matleave內的索引由1被列出至6。對於這種重複的程式碼,最好的方法是用迴圈(for-loop)的方式將相同的程式碼,從1~6之間做六次。 # plot the first row barplot(unlist(m55[1, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") # plot the second to 6th rows barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") barplot(unlist(m55[3, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") barplot(unlist(m55[4, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") barplot(unlist(m55[5, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") barplot(unlist(m55[6, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") 4.4.6.4 for-loop to plot multiple lines 這段R語言程式碼使用for-loop來重複執行一個指定的程式區塊,將m55資料集的前六行資料分別繪製成長條圖。在這段程式碼中,變數i控制了for-loop的迭代次數,它從1到6依次取值,然後依次執行所指定的程式區塊。 一般的for-loop的結構如下:for (variable in sequence) {# code block to be executed}。其中,變數variable是用來控制for-loop的迭代次數的,它會從序列sequence中逐一取出元素,並將其賦值給變數variable,然後執行大括號{...}中所指定的程式區塊。 # use for loop and use i as index to barplot multiple subgraphs for(i in 1:6){ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") } 4.4.6.5 Subplots 但這樣一個國家就要畫成一個Plot,如果要將多個國家、也就是多個Plots繪製在同一張圖上的話,R也有支援Subplot的函式與設定。在R語言中,par(parameter的縮寫)是一個用於設置繪圖參數的函數,通過它可以控制繪圖的外觀、尺寸、排列等各方面,以便更好地展示數據和分析結果。par函數可以用來設置以下參數: mfrow:設置畫布的分割,即將畫布分為多少行和多少列,例如mfrow=c(3,2)代表三列二行。 mai:設置畫布的邊緣大小,包括上下左右四個邊緣的大小。 cex:設置字體大小的縮放比例。 col:設置線條、點和字體的顏色。 pch:設置散點圖中點的形狀。 lty:設置線條的類型。 在這段程式碼中,par函數被用來設置畫布的分割和邊緣大小,具體來說,par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2))表示將畫布分為3行2列的子圖,並設置邊緣大小為0.2,包括上下左右四個邊緣。這樣可以方便地在同一張畫布上顯示多個圖形,並控制它們之間的排列和間距。 # use ?par to get more plotting parameters ?par # use par() to set-up the layout of subgraphs # use the parameter main=c(0.2, 0.2, 0.2, 0.2) to thrink the padding of figures. par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2)) for(i in 1:6){ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") } 接下來我們用相同的for-loop來繪製10張子圖(十個國家)看看。會發現mfrow=c(3,2)可以容納六張子圖,多餘六張子圖時,會繪製至下一張。 # plot more rows to see what happens par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2)) for(i in 1:10){ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") } # plot all subplots in a figure 最後,我用nrow(m55)來取得m55這個data.frame共有多少個國家,然後,我讓for-loop從1:nrow(m55)相當於繪製完所有m55中的子圖。注意我已經修改了mfrow為mfrow=c(4, 6)。 # nrow() to check number of row of m55. nrow(m55) ## [1] 18 # use par() to set-up plotting parameters. par(mfrow=c(4, 6), mai= c(0.2, 0.2, 0.2, 0.2)) # use for-loop to plot all graph as subgraph for (i in 1:nrow(m55)){ barplot(unlist(m55[i, -1]), border=NA, space=0, xaxt="n", yaxt="n", ylim = c(0,5)) } 在每個子圖上,我要加上每個國家的國別代碼iso3,也就是m55的第一行,我用同樣的i來掃過每一列,繪製完barplot()後,便用title()函式來繪製文字。結果如下。注意我的設定title(m55[i,1], line = -4, cex.main=3)。line為繪製文字的基線,而cex.main是字型大小。 par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2)) for (i in 1:nrow(m55)){ barplot(unlist(m55[i, -1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5)) title(m55[i,1], line = -4, cex.main=3) } 4.4.7 Practice. Plotting more 請繪製m05的資料,也就是matleave_95!=5但matleave_13==5的資料。 請繪製m04的資料,也就是matleave_95!=4但matleave_13==4的資料。 請繪製m44的資料,也就是matleave_95==4但matleave_13==4的資料。 # plotting matleave_95 != 5 but matleave_13 == 5 # plotting for matleave_13 == 4 4.4.8 Practice. Selecting and filtering by dplyr I 請嘗試問問ChatGPT,如果將以下程式碼改為dplyr的寫法,要怎麼寫。 df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) # select columns by index # matleave <- df[ , c(3, 6:24)] # select all NA cells and assign 0 to them # matleave[is.na(matleave)] <- 0 # filter rows by condition # m5 <- matleave[matleave$'matleave_13' == 5, ] # filter rows by condition # m55<- m5[m5$'matleave_95' == 5,] # plot par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2)) for (i in c(1:nrow(m55))){ barplot(unlist(m55[i,-1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5)) title(m55[i,1], line = -4, cex.main=3) } 4.4.9 (More) Clean version # readxl::read_excel() to import the xls file df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) # select iso3, and matleave columns by index matleave <- df[ , c(3, 6:24)] # str() to inspect the data structure of str(matleave) ## tibble [197 × 20] (S3: tbl_df/tbl/data.frame) ## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ... ## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_96: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_97: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_98: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_99: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_00: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_01: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_02: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_03: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_04: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_05: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_06: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_07: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_08: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_09: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_10: num [1:197] 2 5 3 3 2 2 2 5 NA 5 ... ## $ matleave_11: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_12: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_13: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... # select all NA cells and assign 0 to them matleave[is.na(matleave)] <- 0 # filter rows by condition m5 <- matleave[matleave$'matleave_13' == 5, ] # filter rows by condition m55<- m5[m5$'matleave_95' == 5,] # plot par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2)) for (i in c(1:nrow(m55))){ barplot(unlist(m55[i,-1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5)) title(m55[i,1], line = -4, cex.main=3) } 4.4.10 (More) The fittest version to compute staySame # staySame version # staySame <- apply(m5[,2:20], 1, function(x) length(unique(x[!is.na(x)]))) # m55 <- m5[staySame, ] # m50 <- m5[!staySame, ] "],["crosstab.html", "Chapter 5 Counting and Cross-tabulation 5.1 Taipei Residential Burglary 5.2 Read online files 5.3 Counting Review 5.4 Pivoting long-wide tables 5.5 Residuals analysis", " Chapter 5 Counting and Cross-tabulation 交叉分析是一種對兩個或多個變數進行聯合分析的方法,通常用於研究不同類別或組別之間的關係和差異。交叉分析可以幫助我們發現變數之間的相互作用,以及不同類別或組別之間的異同點,進而進行更深入的分析和解釋。 在交叉分析中,通常會使用交叉表(cross tabulation)或稱為列聯表(contingency table)來對變數進行分析。交叉表是一種二維資料表格,其中一個變數作為行,另一個變數作為列,每個資料格中則表示兩個變數的交叉次數或百分比。交叉表可以幫助我們從不同角度瞭解變數之間的關係和差異,例如: 發現變數之間的相關性:可以通過交叉表計算兩個變數之間的相關係數或卡方檢定值,以評估它們之間的相關性程度。 比較不同類別或組別之間的差異:可以通過交叉表比較不同類別或組別之間的差異,例如不同性別、年齡、教育程度、地區等對某一變數的影響。 發現變數之間的交互作用:可以通過交叉表比較不同類別或組別之間的差異,並分析它們之間的交互作用,以進一步瞭解變數之間的關係和影響。 5.1 Taipei Residential Burglary 觀察值、點位資料:公部門所發布的開放資料通常會根據某些類別進行統計,例如年齡、性別、教育程度、地區等等,只有少部分的資料會用觀察值(Observation)的方式來記錄,也就是每一個案例紀錄一筆資料。例如疫情一開始人數還少的時候,會逐一記錄每個個案;地理資訊系統上面記錄某些機構或某些特定地點的時候也是點位資料;或在觀察輿情時,每筆發言或留言都是一筆觀察值。「臺北市住宅竊盜點位資訊」就是逐案紀錄的點位資料。而以下的例子也是點位資料,主要為主要為噪音、竊盜、交通事故等相關點位資料。 臺北市街頭隨機強盜案件點位資訊、 臺北市街頭隨機搶奪案件點位資訊、 臺北市汽車竊盜點位資訊、 臺北市機車竊盜點位資訊、 臺北市自行車竊盜點位資訊、 臺北市道路交通事故斑點圖、 臺北市娛樂營業場所噪音告發案件點位資訊、 臺北市非營業用卡拉OK噪音告發案件點位資訊、 臺北市營建工程噪音告發案件點位資訊等, 5.1.1 讀取檔案 規劃比較完善的開放資料平台會提供API給程式設計者存取,例如臺北資料大平台或內政部開放資料平台。但我們這邊用下載CSV(Common Separated Value)檔的方式來讀取這筆資料,以理解CSV這種檔案型態如何儲存資料。首先要至臺北資料大平台上查詢「住宅竊盜」,可以找到臺北市住宅竊盜點位資訊。將該CSV檔下載至個人本機端,置入data 資料夾中,便可以用read.csv()讀取該檔案。或可用tidyverse系列套件中的readr::read_csv()來直接讀取該網址所指到的檔案。 我習慣在Console視窗中用??read_csv()查詢到這些函式的用法。 read.csv() to read csv and convert it to a data.frame readr::read_csv() to read csv or read a csv by an url 如果知道這個套件是readr的話,也可以到右下方的工作區塊找到「Packages」工作視窗,裡面有列出現在載入的所有的套件,也有套件中的所有函式。偶而看一看會發現一些自己平常忽略的好用工具。 library(knitr) library(kableExtra) library(tidyverse) df <- read.csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv") head(df) ## 編號 案類 發生日期 發生時段 發生地點 ## 1 1 住宅竊盜 1030623 08~10 臺北市中正區廈門街91~120號 ## 2 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧街1~30號 ## 3 3 住宅竊盜 1040101 00~02 臺北市信義區富台里忠孝東路5段295巷6弄1~30號 ## 4 4 住宅竊盜 1040101 06~08 臺北市中山區新生北路1段91~120號 ## 5 5 住宅竊盜 1040101 10~12 臺北市文山區明興里興隆路4段1~30號 ## 6 6 住宅竊盜 1040102 00~02 臺北市士林區天福里1鄰忠誠路2段130巷1~30號 用read_csv()來讀取。除了 base套件的read.csv()外,也可使用readr套件的read_csv()函式來讀取,該套件屬於tidyverse套件系的其中一個套件,如果已經有用install.packages(\"tidyverse\")安裝過,只要用library(tidyverse)就可以使用read_csv()函式。在此鼓勵各位使用tidyverse系列套件。普遍來說,read_csv() 的功能和效果都會比read.csv()好,該函式還會自動猜測每個變數的變數型態並直接進行轉換(尤其是有時間欄位的時候,會非常方便)。 萬一遇到中文檔案會有讀檔編碼問題時,有可能該檔案是用big5來儲存的,可以在read_csv()中設定locale來指定讀取的編碼方法。如read_csv(url, locale = locale(encoding = \"Big5\")) library(readr) df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv") # df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv", locale = locale(encoding = "Big5")) head(df) ## # A tibble: 6 × 5 ## 編號 案類 發生日期 發生時段 發生地點 ## <dbl> <chr> <dbl> <chr> <chr> ## 1 1 住宅竊盜 1030623 08~10 臺北市中正區廈門街91~120號 ## 2 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧街1~30號 ## 3 3 住宅竊盜 1040101 00~02 臺北市信義區富台里忠孝東路5段295巷6弄1~30號 ## 4 4 住宅竊盜 1040101 06~08 臺北市中山區新生北路1段91~120號 ## 5 5 住宅竊盜 1040101 10~12 臺北市文山區明興里興隆路4段1~30號 ## 6 6 住宅竊盜 1040102 00~02 臺北市士林區天福里1鄰忠誠路2段130巷1~30號 5.1.1.1 觀察變數 names(df) 列出所有變數名稱 df$發生地點 顯示該變數內容 df$發生時段 顯示該變數內容 length(df$發生時段) 顯示該變數的長度(相當於有幾個) 5.1.2 萃取所需新變項 該data.frame包含編號、案類、發生日期、發生時段、發生地點五個變項。其中比較有意義的應該是發生日期、發生時段和發生地點。然而,發生地點幾乎是完整地址,除非要繪製發生的地圖點位地圖,才會需要近乎完整的地址。假設我們的目標是抽取出台北市的「行政區」,發生地點的格式還蠻一致的如「臺北市中正區廈門街91~120號」。因此,我們只要抽出發生地點的第4至6個字即可。 從一個字串中抽取出第n個字到第m個字,要用substr()或stringr套件的str_sub()。可以用?substr或?str_sub查詢help中的相關用法。在此 我將中文變數現在時間的資料指給一個新的英文變項time。 從變數發生地點,用substr()取出行政區(region) 或用stringr::str_sub() ?substr查詢其用法和意義。相當於getting sub string since x to y。 # Get substring of var "發生時段" and assign to a new time var df$time <- df$發生時段 # Get substring of var "發生地點" and assign to a new region var df$region <- substr(df$發生地點, 4, 5) head(df) ## # A tibble: 6 × 7 ## 編號 案類 發生日期 發生時段 發生地點 time region ## <dbl> <chr> <dbl> <chr> <chr> <chr> <chr> ## 1 1 住宅竊盜 1030623 08~10 臺北市中正區廈門街91~120號 08~10 中正 ## 2 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧街1~30號 00~02 文山 ## 3 3 住宅竊盜 1040101 00~02 臺北市信義區富台里忠孝東路5段29… 00~02 信義 ## 4 4 住宅竊盜 1040101 06~08 臺北市中山區新生北路1段91~120號 06~08 中山 ## 5 5 住宅竊盜 1040101 10~12 臺北市文山區明興里興隆路4段1~30… 10~12 文山 ## 6 6 住宅竊盜 1040102 00~02 臺北市士林區天福里1鄰忠誠路2段1… 00~02 士林 5.1.3 使用table()計數 清理完資料後,我們要回答的第一個數據問題通常是「那XXX的案例有幾個?」例如:大安區有多少竊盜案?10~12這個時段有多少案例。 table()函式可以對Vector中的值進行計數(Counting)。table(df$time) 相當於去計數不同的時間區間出現多少起案例;table(df$region) 相當於去計數不同地區各出現多少起案例。 提示:可以用class(tb_1) 觀察用table() 計數後所產生的資料型態(table)。 ## table # counting the frequency of region variable (table(df$region)) ## ## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華 ## 438 263 214 303 318 181 373 172 311 204 220 350 # counting the frequency of time variable (tb_1 <- table(df$time)) # %>% View ## ## 00~02 02~04 03~05 04~06 05~07 06~08 08~10 09~11 10~12 11~03 11~13 12~14 12~15 ## 272 214 8 156 23 191 305 6 338 1 26 338 2 ## 14~16 15~17 15~18 16~18 17~19 18~20 18~21 19~21 20~22 21~23 21~24 22~24 23~01 ## 342 3 1 246 21 314 1 4 303 5 1 206 20 class(tb_1) ## [1] "table" 5.1.4 依變數值篩選資料 該項竊盜案資料整理時經常不慎用不同的時間區間來標記,有時候也會不小心把新北市的資料給那進來,所以需要做資料篩選。從各個時間區間的竊盜案出現次數來觀察,有少數的案件出現在奇數的時間區間如09~11或12~15等等需要篩除;從各個行政區的竊盜案出現次數來觀察,確實都是台北市的竊盜案。 接下來要用base套件的R,根據某個變數值(例如上述的時間)來篩出符合條件的資料,或者篩去不符合條件的資料。其語法是要在df[ , ]逗號前加上篩選的條件,也就是對資料列進行篩選,篩出或篩除都是以整列為單位。在此的條件是df$time在00~02、02~04、…之間;或者是df$time不在03~05、05~07、…之間。表示法分別如下: df$time %in% c("00~02", "02~04", "04~6",...) !df$time %in% c("03~05", "05~07", ...) %in% 表示的是左方df$time的值是否是右方Vector中的其中一個 如果要表示不包含,就在df%time加一個NOT,也就是!。 依照各組時間的案例個數統計後,篩除資料未足100的時間區間如下,最後再用table(df$time) 計算一次,發現每個時段都兩三、百個案例,且涵蓋整日的時間。清理後沒有重疊的時間區間,做類別資料分析會比較準確。 # filter out irrelevant timestamp df <- df[!df$time %in% c("03~05", "05~07", "09~11", "11~13", "11~03", "12~15", "15~17", "15~18", "17~19", "18~21", "19~21", "21~23", "21~24", "23~01"), ] table(df$time) ## ## 00~02 02~04 04~06 06~08 08~10 10~12 12~14 14~16 16~18 18~20 20~22 22~24 ## 272 214 156 191 305 338 338 342 246 314 303 206 # filter out irrelevant region(area) # df <- df[!df$region %in% c("三重", "中和", "淡水", "板橋"), ] 5.1.5 做雙變數樞紐分析:table() 類別變項分析通常是要考驗兩個變項間的關係,從上述的計數中,我可以看見不同行政區或者不同時間的竊盜案數量,但我進一步想知道,那不同行政區的竊盜案常發生時間是否不同?這時後就要做時間和行政區的交叉分析。我們同樣可以用table()和tapply()來做兩個變項的交叉分析,寫法如下。 用table()來交叉分析的結果如下,所得到的結果之變數型態仍是table型態。 # Tabulating time and region variables (res_table <- table(df$time, df$region)) ## ## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華 ## 00~02 62 15 27 20 24 19 28 15 24 17 4 17 ## 02~04 26 22 12 15 17 12 29 10 15 14 13 29 ## 04~06 22 7 11 15 17 6 14 15 14 8 5 22 ## 06~08 20 19 13 16 24 13 17 9 19 9 11 21 ## 08~10 45 27 20 27 22 16 24 17 31 18 24 34 ## 10~12 38 20 18 33 35 19 35 12 34 18 35 41 ## 12~14 30 25 20 26 34 15 46 12 49 25 23 33 ## 14~16 43 19 18 39 32 20 40 26 32 19 22 32 ## 16~18 21 19 8 24 33 11 30 13 25 16 20 26 ## 18~20 39 42 23 22 40 18 31 13 23 23 17 23 ## 20~22 40 13 22 34 17 20 41 13 26 15 25 37 ## 22~24 33 20 16 18 15 9 23 9 12 17 14 20 # Checking it class and its content class(res_table) ## [1] "table" ## [1] "table" 5.1.6 繪圖 通常這種類別資料交叉分析最常用的圖表型態之一便是Mosaic Plot(但事實上Mosaic Plot不見能夠被一眼就了解)。我們可以把交叉分析後的變項res_table直接用MosaicPlot來繪圖。 # mosaicplot() to plot 2-dim categorical vars. mosaicplot(res_table) # Add argument main (figure title) mosaicplot(res_table, main="mosaic plot") 5.1.6.1 解決圖表無法顯示中文 大部分的視覺化套件都無法順利顯示中文,除非特別指定所要用的中文字型。這方面網路上可以找到很多的說明,但非常討厭的是,幾乎每換一套視覺化工具,換一套語言,就有不同的中文字體指定方式。例如用base的plot()來繪圖或用ggplot()的中文字型指定方法便不同,且軸上面有中文、圖標有中文、或者圖內有中文都要分開指定,非常討人厭。 Mosaic Plot屬於base R的plot(),其中文指定方法要指定在繪圖前的par()函式中(par為parameter的意思),指定方法為par(family=('Heiti TC Light')),Heiti TC Light為字體名稱,為OSX上在用的黑體細字,STKaiti則為標楷體。然後,par()和mosaicplot()兩個函式要「同時執行」,也就是請你直接用shift-cmd(ctrl)-Enter執行整個code-cell,或者將該兩個函式選起來一次執行。 par(family=('STKaiti')) # par(family=('Heiti TC Light')) mosaicplot(res_table, main="mosaic plot", color=T) 5.1.6.2 自訂顏色 目前顏色實在過醜,你可以自訂顏色指給mosaicplot()。例如我底下便產製了12種顏色後,將其作為mosaicplot()的參數 # Set up color by yourself. colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F', '#E79460', '#E98B2A', '#9B6E23', '#F7C242', '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8') # par(family=('STKaiti')) par(family=('Heiti TC Light')) mosaicplot(res_table, color=colors, border=0, off = 3, main="Theft rate of Taipei city (region by hour)") 5.1.7 Practices 5.1.7.1 萃取月份作為新變項month 除了時間和地區可能會有差別外,那月份會不會竊盜案的數量也有差異呢?會不會冬天小偷也都在家休息了,夏天多呢?請嘗試從發生日期萃取出竊盜案發生的月份,並儲存為一個新的變項month。 5.1.7.2 使用count()來計數 請練習看看如果用count()來計數單一變項,如前述的region、time或前面練習中新產生的month。 5.1.7.3 分週末與週間計算 使用lubridate套件可以將文字表示的日期轉換為R的時間物件,進而可以用lubridate的wday()函式求取該日期是週幾,便可以計算,週間和週末的竊盜率有何差別。可以先計算看看,週一到週日分別有什麼差別,再去計算週間與週末的平均會有什麼差別(要注意,週末和週間天數並不同) 5.2 Read online files 方法一:直接依資料網址讀取檔案。現在的程式語言所設計的讀取檔案函式通常會允許使用者直接讀取資料所在的URL。所以,我們可以直接從網路上載入台北市竊盜案資料。首先要至臺北資料大平台上查詢「住宅竊盜」,可以找到臺北市住宅竊盜點位資訊,點選後對右上方的下載按右鍵可取得鏈結到該資料的URL(如https://data.taipei/api/getDatasetInfo/downloadResource?id=68785231-d6c5-47a1-b001-77eec70bec02&rid=93d9bc2d-af08-4db7-a56b-9f0a49226fa3)。 由於該資料網址似非永久網址,故本範例並未執行以下程式碼,僅提供範例程式碼讓個人替換網址來做測試。 方法二:用R程式將該網址的檔案抓回本機端儲存。部分Mac電腦無法使用read.csv()從網路上取得資料又轉為data.frame,一個可行的辦法是先用GET(url,write_disk(\"data/tptheft.csv\"))將其取回並命名為data/tptheft.csv,之後再用df <- read.csv(\"data/tptheft.csv\")直接讀取該檔案。 {library(httr)} GET(url, write_disk(\"data/tptheft.csv\", overwrite = TRUE)) df <- read.csv(\"data/tptheft.csv\") 5.3 Counting Review 5.3.1 tapply() 我們也可用tapply() 函式來達到一樣的目的。Apply家族的函式都是,針對某個資料,將某個函式套用到某個物件上。tapply() 即是用來做計數的,tapply(df$編號, df$time, length)有三個輸入,第一個輸入為整體物件,第二個輸入為要據以彙整的變項,在此為df$time,第三個是要用來彙整的函式,因為這裡要做計數,所以要用length函式。 註:同樣用class()來觀察彙整後的資料型態為array,和前者的table資料型態不同。 5.3.2 tapply() two variables 用tapply()來做兩個變數交叉分析的語法如下,必須要把兩個Vector包在一個list()中。其他不變。兩個變項用tapply()交叉分析後的結果,變數型態會變成matrix。前者用table()來交叉分析的仍是table型態。 res_tapply ## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華 ## 00~02 62 15 27 20 24 19 28 15 24 17 4 17 ## 02~04 26 22 12 15 17 12 29 10 15 14 13 29 ## 04~06 22 7 11 15 17 6 14 15 14 8 5 22 ## 06~08 20 19 13 16 24 13 17 9 19 9 11 21 ## 08~10 45 27 20 27 22 16 24 17 31 18 24 34 ## 10~12 38 20 18 33 35 19 35 12 34 18 35 41 ## 12~14 30 25 20 26 34 15 46 12 49 25 23 33 ## 14~16 43 19 18 39 32 20 40 26 32 19 22 32 ## 16~18 21 19 8 24 33 11 30 13 25 16 20 26 ## 18~20 39 42 23 22 40 18 31 13 23 23 17 23 ## 20~22 40 13 22 34 17 20 41 13 26 15 25 37 ## 22~24 33 20 16 18 15 9 23 9 12 17 14 20 # View(res) 5.3.3 dplyr::count() two variables 這邊多介紹一個用dplyr套件的count()函式來做交叉分析的方法(未來會常用這個方法,因為dplyr是tidyverse系列套件的核心套件。dplyr的函式第一個參數永遠是該data.frame, 例如count();後面time與region則是這個data.frame中的兩個變項。不像tapply()或table()的結果一樣,欄與列分別為time與region,count()出來的結果會有兩個變項分別是指定要計數的time與region ,且會新增一個變項n,代表這組數據(time x region)共有幾個。這種表達型態通常稱為long-table(長表)、而tapply()或table() 的結果通常稱為wide-table(寬表)為典型的交叉分析表。 目前大部分的類別資料分析還是會採用交叉分析表的型態,但未來我們要用tidyverse系列套件做大量的數據彙整或視覺化時,都會盡可能想辦法轉為Long-table型態,讓每一欄剛好就是一個變項。只要是tidyverse系列套件所計算出來的資料型態幾乎都是類似data.frame的型態,例如觀察count的結果便是\"tbl_df\" \"tbl\" \"data.frame\"。 5.4 Pivoting long-wide tables 5.4.1 long-to-wide 那長表列可以轉為寬表嗎?可以,tidyverse系列套件中的tidyr套件有個函式spread()可以接著把某個變項展開為欄。例如原本上述的列是時間與行政區的交叉組合,但我可以把行政區展開為欄、或者把時間展開為欄 。如下例,spread(res_count, region, n, fill = 0) 有四個參數,遵循tidyverse系列套件的規則,第一個位置為data.frame,第二個參數則是要被展開至欄的變項這裡為region,第三個參數則是因應region被展開後,那中間交叉分析的數值就是n,最後一個參數是避免spread時有些交叉組是沒有資料的,因此fill=0可以指定,如果某個time x region的交叉組別是沒資料的,就填上0,也有可能是用fill=NA填上NA。以下的例子中也提供了將time 展開至欄的寫法供參考。 現在spread()函式已經被新的函式取代,為pivot_wider()。spread(res_count, region, n, fill = 0) 在此需要改寫為pivot_wider(res_count, names_from = region, values_from = n, values_fill = 0)。大致上和spread()用法是一樣的,只是要寫清楚,哪個變數要給哪一個參數。 展開後的資料型態和前者計數後的資料型態一樣,都是\"tbl_df\" \"tbl\" \"data.frame\"。這是為什麼tidyverse系列的套件逐漸變成R的顯學的原因之一。 library(tidyr) # spreading the region into columns # (res_count_spread <- spread(res_count, region, n, fill = 0)) res_count_spread <- pivot_wider(res_count, names_from = region, values_from = n, values_fill = 0) class(res_count_spread) ## [1] "tbl_df" "tbl" "data.frame" # spreading the time into columns # res_count_spread <- spread(res_count, time, n, fill = 0) res_count_spread # %>% View ## # A tibble: 12 × 13 ## time 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華 ## <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> ## 1 00~02 62 15 27 20 24 19 28 15 24 17 4 17 ## 2 02~04 26 22 12 15 17 12 29 10 15 14 13 29 ## 3 04~06 22 7 11 15 17 6 14 15 14 8 5 22 ## 4 06~08 20 19 13 16 24 13 17 9 19 9 11 21 ## 5 08~10 45 27 20 27 22 16 24 17 31 18 24 34 ## 6 10~12 38 20 18 33 35 19 35 12 34 18 35 41 ## 7 12~14 30 25 20 26 34 15 46 12 49 25 23 33 ## 8 14~16 43 19 18 39 32 20 40 26 32 19 22 32 ## 9 16~18 21 19 8 24 33 11 30 13 25 16 20 26 ## 10 18~20 39 42 23 22 40 18 31 13 23 23 17 23 ## 11 20~22 40 13 22 34 17 20 41 13 26 15 25 37 ## 12 22~24 33 20 16 18 15 9 23 9 12 17 14 20 # ??dplyr::count 5.4.2 Wide-to-long 寬表格亦可用tidyr的gather()函式轉回長表格型態。但gather()近期也已經被新的函式pivot_longer()取代。原先的gather(res_count_spread, region, n, -time)應取代為pivot_longer(res_count_spread, -time, names_to = \"region\", values_to = \"n\")。 # (long_table <- tidyr::gather(res_count_spread, region, n, -time)) long_table <- pivot_longer(res_count_spread, -time, names_to = "region", values_to = "n") 5.5 Residuals analysis mosaicplot()有幾個參數可以用,包含off與shade可用於呈現殘差分析。 off: vector of offsets to determine percentage spacing at each level of the mosaic (appropriate values are between 0 and 20, and the default is 20 times the number of splits for 2-dimensional tables, and 10 otherwise). Rescaled to maximally 50, and recycled if necessary. shade: a logical indicating whether to produce extended mosaic plots, or a numeric vector of at most 5 distinct positive numbers giving the absolute values of the cut points for the residuals. By default, shade is FALSE, and simple mosaics are created. Using shade = TRUE cuts absolute values at 2 and 4. # par(family=('STKaiti')) par(family=('Heiti TC Light')) mosaicplot(res_table, color=T, shade = T, border=0, off = 3, main="Theft rate of Taipei city (region by hour)") "],["base2dplyr.html", "Chapter 6 From base R to dplyr 6.1 dplyr 6.2 Taipie Theft Count (base to dplyr) 6.3 Paid Maternity Leave", " Chapter 6 From base R to dplyr From base to tidyverse style 相較於R base的較為傳統的R編程風格,tidyverse style的R programming具有以下幾個特點: 基於tidy data理念:tidyverse style的R programming基於tidy data理念,即資料應該以規律的方式組織,以方便分析和視覺化。tidyverse style的R程式庫提供了一些工具和函數,用於處理和轉換tidy data格式的資料,如dplyr、tidyr等。 使用管道操作符:tidyverse style的R programming通常使用管道操作符(%>%),將資料通過多個函數連接起來,形成一個清晰和易於理解的資料處理流程。使用管道操作符可以簡化程式碼並提高程式的可讀性。 強調函數庫的一致性:tidyverse style的R programming強調函數庫之間的一致性,即不同函數庫之間使用相似的函數名稱、參數名稱和返回值等,以方便使用者的學習和使用。 使用簡潔的命名方式:tidyverse style的R programming通常使用簡潔和易於理解的變數和函數命名方式,例如使用動詞表示操作,使用名詞表示資料,以方便使用者理解程式碼的含義。 提供高級的視覺化工具:tidyverse style的R programming提供了一些高級的視覺化工具,如ggplot2、gganimate等,可以幫助使用者更加輕鬆地進行資料視覺化和探索。 6.1 dplyr dplyr是一個tidyverse風格的R程式庫,用於對資料進行快速、一致、直觀的操作和轉換。dplyr提供了一些高效能的函數和工具,如filter、select、mutate、group_by和summarize等,用於對資料進行選擇、篩選、轉換、分組和摘要等操作。 以下是dplyr常用的函數: filter:用於選擇符合特定條件的資料列。 select:用於選擇特定的欄位。 mutate:用於新增或修改欄位。 group_by:用於按照特定欄位進行分組。 summarize:用於對分組後的資料進行摘要統計。 arrange:用於按照欄位的特定順序進行排序。 dplyr具有以下優點: 簡潔而直觀的語法:dplyr的函數名稱和語法都十分簡潔而直觀,易於使用和理解,尤其對於新手來說更加友好。 高效的運行速度:dplyr的設計考慮了資料處理的效率,使用C++實現了部分函數,因此dplyr在處理大型資料集時運行速度較快。 與tidyverse相容:dplyr與其他tidyverse程式庫,如ggplot2和tidyr,可以很好地相容,並且能夠與其他常用的R程式庫進行集成,提供更加全面和高效的資料分析和可視化工具。 6.2 Taipie Theft Count (base to dplyr) library(tidyverse) # options(stringsAsFactors = F) # default options in R ver.> 4.0 6.2.1 Reading data # Read by read_csv() # Will raise error # Error in make.names(x) : invalid multibyte string at '<bd>s<b8><b9>' # df <- read_csv("data/tp_theft.csv") # read_csv() with locale = locale(encoding = "Big5") library(readr) df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv") 6.2.2 Cleaning data I Renaming variables by select() Generating variable year by mutate() Generating variable month by mutate() Retrieving area by mutate() 6.2.2.1 (1) Without pipeline I df1 <- select(df, id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`) df2 <- mutate(df1, year = date %/% 10000) df3 <- mutate(df2, month = date %/% 100 %% 100) df4 <- mutate(df3, area = str_sub(location, 4, 6)) selected_df <- mutate(df4, county = str_sub(location, 1, 3)) 6.2.2.2 (2) Without pipeline II library(stringr) selected_df <- select(df, id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`) selected_df <- mutate(selected_df, year = date %/% 10000) selected_df <- mutate(selected_df, month = date %/% 100 %% 100) selected_df <- mutate(selected_df, area = str_sub(location, 4, 6)) selected_df <- mutate(selected_df, county = str_sub(location, 1, 3)) 6.2.2.3 (3) With pipeline library(stringr) selected_df <- df %>% select(id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`) %>% mutate(year = date %/% 10000) %>% mutate(month = date %/% 100 %% 100) %>% mutate(area = str_sub(location, 4, 6)) %>% mutate(county = str_sub(location, 1, 3)) 6.2.3 Cleaning data II Filtering out irrelevant data records # readr::guess_encoding("data/tp_theft.csv") filtered_df <- selected_df %>% # count(year) %>% View filter(county == "臺北市") %>% filter(year >= 104) %>% # count(time) %>% View # count(location) %>% filter(!area %in% c("中和市", "板橋市")) 6.2.4 Long to wide form count() two variables pivot_wider() spread one variable as columns to wide form # count() then pivot_wider() df.wide <- filtered_df %>% count(time, area) %>% pivot_wider(names_from = area, values_from = n, values_fill = 0) ??pivot_wider 6.2.5 Setting time as row.name for mosaicplot row.names(df.wide) <- df.wide$time df.wide$time <- NULL # Specify fonts for Chinese # par(family=('STKaiti')) par(family=('Heiti TC Light')) # for mac # Specify colors colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F', '#E79460', '#E98B2A', '#9B6E23', '#F7C242', '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8') # mosaicplot() mosaicplot(df.wide, color=colors, border=0, off = 3, main="Theft rate of Taipei city (region by hour)") 6.2.6 Clean version library(readr) # options(stringsAsFactors = F) df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv") selected_df <- df %>% select(id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`) %>% mutate(year = date %/% 10000) %>% mutate(month = date %/% 100 %% 100) %>% mutate(area = stringr::str_sub(location, 4, 6)) %>% mutate(county = stringr::str_sub(location, 1, 3)) selected_df %>% count(year) ## # A tibble: 9 × 2 ## year n ## <dbl> <int> ## 1 103 1 ## 2 104 687 ## 3 105 663 ## 4 106 560 ## 5 107 501 ## 6 108 411 ## 7 109 304 ## 8 110 189 ## 9 111 31 selected_df %>% count(time) %>% head(10) ## # A tibble: 10 × 2 ## time n ## <chr> <int> ## 1 00~02 272 ## 2 02~04 214 ## 3 03~05 8 ## 4 04~06 156 ## 5 05~07 23 ## 6 06~08 191 ## 7 08~10 305 ## 8 09~11 6 ## 9 10~12 338 ## 10 11~03 1 selected_df %>% arrange(time) %>% head(10) ## # A tibble: 10 × 9 ## id cat date time location year month area county ## <dbl> <chr> <dbl> <chr> <chr> <dbl> <dbl> <chr> <chr> ## 1 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧… 104 1 文山… 臺北市 ## 2 3 住宅竊盜 1040101 00~02 臺北市信義區富台里忠孝… 104 1 信義… 臺北市 ## 3 6 住宅竊盜 1040102 00~02 臺北市士林區天福里1鄰… 104 1 士林… 臺北市 ## 4 12 住宅竊盜 1040105 00~02 臺北市中山區南京東路3… 104 1 中山… 臺北市 ## 5 33 住宅竊盜 1040115 00~02 臺北市松山區饒河街181~… 104 1 松山… 臺北市 ## 6 74 住宅竊盜 1040131 00~02 臺北市南港區重陽路57巷… 104 1 南港… 臺北市 ## 7 75 住宅竊盜 1040201 00~02 臺北市北投區中心里中和… 104 2 北投… 臺北市 ## 8 92 住宅竊盜 1040210 00~02 臺北市北投區大同路200… 104 2 北投… 臺北市 ## 9 95 住宅竊盜 1040212 00~02 臺北市萬華區萬大路493… 104 2 萬華… 臺北市 ## 10 106 住宅竊盜 1040216 00~02 臺北市信義區吳興街269… 104 2 信義… 臺北市 filtered_df <- selected_df %>% # count(year) %>% View filter(year >= 104) %>% filter(!time %in% c("03~05", "05~07", "09~11", "11~13", "15~17", "17~19", "18~21", "21~23", "23~01")) # count(time) %>% View # count(location) %>% # filter(!area %in% c("中和市", "板橋市")) df.wide <- filtered_df %>% count(time, area) %>% pivot_wider(names_from = area, values_from = n, values_fill = 0) %>% as.data.frame() row.names(df.wide) <- df.wide$time df.wide$time <- NULL par(family=('Heiti TC Light')) # for mac # Specify colors colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F', '#E79460', '#E98B2A', '#9B6E23', '#F7C242', '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8') # mosaicplot() mosaicplot(df.wide, color=colors, border=0, off = 3, main="Theft rate of Taipei city (region by hour)") 6.3 Paid Maternity Leave 6.3.1 Visual Strategies 這個例子之所以有趣在於記者選定了「美國沒有產假支薪」作為新聞的賣點。在呈現的時候,就必須要盡可能地凸顯這樣的情形。一般來說,會繪製世界地圖來呈現美國是目前少數沒有產假支薪的國家之一(在本資料197個國家中僅有9國目前沒有給付產假薪水。其實該筆來自Word Policy Analysis Center資料含有自1995年至2003年共19年的資料(本案例即就是下載該中心所分享的調查資料,不用申請帳號)。於是該專題的作者便構思利用過去到現在的資料來凸顯美國在這方面一直沒有改變。 但要處理197個國家的在19年間的變化相當不易。例如若為每年繪製一張世界地圖,然後以動畫或動態卷軸來凸顯這19年間美國的變化,也會因為國家數過多而難以聚焦在作者想突顯的美國。 而這便是作者在視覺化上相當具有巧思的地方。由於產假給付程度在該調查中分為五個等級,包含0週、0-14週、14-25週、26-51週、52週以上等。作者便從給付程度最高的層級開始做長條圖,共五個階層的子圖。而每個階層的子圖,作者又將該層級的圖分為「保持不變(Stay Same)」和「持續增加(Increase)」兩組。經過這樣的分組,會得到9個子圖。分別為等級5(保持不變、持續增加)、等級4(保持不變、持續增加)、…、等級1(保持不變)。讀者在看的時候,會依次看到給付程度最高到最低的國家,也可以看到哪些國家在這19年間制度有所變化(通常是增加)。但看到最後的時候,便會看到美國的情形,即是無產假給付。 6.3.2 Code by base R library(readxl) # readxl::read_excel() to import the xls file df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) # select iso3, and matleave columns by index matleave <- df[ , c(3, 6:24)] # str() to inspect the data structure of str(matleave) ## tibble [197 × 20] (S3: tbl_df/tbl/data.frame) ## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ... ## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_96: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_97: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_98: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_99: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_00: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_01: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_02: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_03: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_04: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_05: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_06: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_07: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_08: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_09: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_10: num [1:197] 2 5 3 3 2 2 2 5 NA 5 ... ## $ matleave_11: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_12: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_13: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... # select all NA cells and assign 0 to them matleave[is.na(matleave)] <- 0 # filter rows by condition m5 <- matleave[matleave$'matleave_13' == 5, ] # filter rows by condition m55<- m5[m5$'matleave_95' == 5,] # plot par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2)) for (i in c(1:nrow(m55))){ barplot(unlist(m55[i,-1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5)) title(m55[i,1], line = -4, cex.main=3) } 6.3.3 Code by dplyr 首先,程式碼使用 filter() 函數篩選出符合條件的列,其中 matleave_13 和 matleave_95 兩欄都必須等於 5。接著,pivot_longer() 函數將資料框轉換成長格式(long format),將從第二欄到第二十欄的資料整合到兩個欄位 year 和 degree 中。這裡 names_to 參數指定新欄位 year 的名稱,values_to 參數指定新欄位 degree 的名稱,cols 參數指定要整合的欄位範圍。 接下來,replace_na() 函數將 degree 欄位中的 NA 值替換為 0。然後,mutate() 函數使用 as.POSIXct() 函數將 year 欄位中的字串轉換為日期時間格式,再使用 year() 函數從日期時間中提取年份,最終將年份資訊存儲回 year 欄位中。其中 “matleave_%y” 是日期時間格式字串,其中 “%y” 表示兩位數的年份(例如 “13”)。這樣就將 “matleave_13”、“matleave_14” 等字串轉換成了對應的日期時間。 ggplot() 函數創建了一個空的 ggplot2 圖形物件,使用 aes() 函數定義了 x 軸 year 和 y 軸 degree 的變數名稱。geom_col() 函數指定用長條圖呈現資料,設置了顏色和填充顏色。ylim() 函數限制了 y 軸的範圍,將其設置為 0 到 5,無論y軸資料有沒有到5或者是否超過5,都會限定在0到5之間。facet_wrap() 函數則根據 iso3 欄位生成多個子圖。最後,theme_void() 函數將圖形主題設置為空白,不帶任何邊框或背景。 library(tidyverse) ## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── ## ✔ dplyr 1.1.4 ✔ readr 2.1.5 ## ✔ forcats 1.0.0 ✔ stringr 1.5.1 ## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1 ## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1 ## ✔ purrr 1.0.2 ## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── ## ✖ dplyr::filter() masks stats::filter() ## ✖ dplyr::lag() masks stats::lag() ## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors options(scipen = 999) library(readxl) matleave <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>% select(iso3, 6:24) matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% pivot_longer(names_to = "year", values_to = "degree", cols = 2:20) %>% replace_na(list(degree = 0)) %>% mutate(year = year(as.POSIXct(strptime(year, "matleave_%y")))) %>% ggplot() + aes(year, degree) + geom_col(color = "royalblue", fill = "royalblue") + ylim(0, 5) + facet_wrap(~ iso3) + theme_void() 下圖為原始資料的截圖,matleave_95代表1995年的資料,每個變數的數據1至5分別代表產假時給付薪水的月數區間共有五個區間。區間大小通常需要查看編碼簿來獲取定義。 這類資料由於採用數字(其實是Factor)來替代類別,通常隨著數據會釋出該調查的編碼簿(Code Book),這個案例的編碼(1至5)如下: 6.3.4 Generating each 在 R 中,函式是一個可重複使用的程式碼塊,可以接受輸入參數,並返回計算結果。函式可以簡化程式碼,使其更易於維護和修改。為了不要重複相同的程式碼,以下程式碼將視覺化的部分改用「函式」來進行撰寫,再輸入不同子圖所要使用的資料來進行繪圖。 在這個程式碼中,generating_plot() 是一個自定義的函式,它接受一個資料框 df 作為輸入參數。成對大括號內部為該函式所執行的步驟,包含pivot_longer()、replace_na()等。輸出則是一個 ggplot2 圖形物件,其中包含了將這些資料轉換為長條圖的視覺化表示。 在 R 中,創建一個函式需要使用 function() 關鍵字。一個最簡單的函式可能只包含一個輸入參數和一個返回值,例如:my_function <- function(x) {return(x^2)}。在這個例子中,函式名稱是 my_function,它有一個輸入參數 x,函式主體是 x^2,表示將輸入的 x 參數平方。函式主體的執行結果通過 return() 函數返回,並可以存儲到變數中,例如:result <- my_function(3)。函式的定義亦可包含多個輸入參數,可以用數字、list、或Data.Frame等當成輸入參數。 library(tidyverse) options(scipen = 999) library(readxl) matleave <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>% select(iso3, 6:24) generating_plot <- function(df){ df %>% pivot_longer(names_to = "year", values_to = "degree", cols = 2:20) %>% replace_na(list(degree = 0)) %>% mutate(year = year(as.POSIXct(strptime(year, "matleave_%y")))) %>% ggplot() + aes(year, degree) + geom_col(color = "royalblue", fill = "royalblue") + ylim(0, 5) + facet_wrap(~ iso3) + theme_void() + theme(strip.text = element_text(size = 14, face = "bold", vjust=0.5), strip.placement = "inside" ) } matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% generating_plot() matleave %>% filter(matleave_13 == 5, matleave_95 != 5) %>% generating_plot() matleave %>% filter(matleave_13 == 4, matleave_95 == 4) %>% generating_plot() matleave %>% filter(matleave_13 == 4, matleave_95 != 4) %>% generating_plot() matleave %>% filter(matleave_13 == 3, matleave_95 == 3) %>% generating_plot() matleave %>% filter(matleave_13 == 3, matleave_95 != 3) %>% generating_plot() matleave %>% filter(matleave_13 == 2, matleave_95 == 2) %>% generating_plot() matleave %>% filter(matleave_13 == 2, matleave_95 != 2) %>% generating_plot() matleave %>% filter(matleave_13 == 1) %>% generating_plot() 6.3.5 Gathering subplots by cowplot 這段程式碼的作用是將多個 ggplot2 圖形物件組合成一個網格,然後將這個網格圖形儲存為一個圖像文件。首先,這段程式碼定義了多個變數,如 plot_row1、plot_row2、plot_row3 等,每個變數都是一個網格圖形。這些變數通過 plot_grid() 函數來創建,這個函數可以將多個 ggplot2 圖形物件組合成一個網格。在 plot_grid() 函數中,可以設置 labels 參數來為每個子圖添加標籤。 然後,這些變數通過 plot_grid() 函數再次組合,形成一個更大的網格圖形。這裡使用 ncol = 1 參數將多個網格排列成一列。最後,使用 ggsave() 函數將這個網格圖形儲存為一個圖像文件。在這個例子中,圖像文件的名稱是 “test.png”,大小為 10 英寸 x 30 英寸,分辨率為 300 DPI。 總的來說,這段程式碼的作用是將多個 ggplot2 圖形物件組合成一個網格,並將這個網格圖形儲存為一個圖像文件。這樣做可以方便地進行圖像導出和共享,並且可以將多個圖形合併在一起進行比較和分析。 library(cowplot) plot55 <- matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% generating_plot() plot05 <- matleave %>% filter(matleave_13 == 5, matleave_95 != 5) %>% generating_plot() plot44 <- matleave %>% filter(matleave_13 == 4, matleave_95 == 4) %>% generating_plot() plot04 <- matleave %>% filter(matleave_13 == 4, matleave_95 != 4) %>% generating_plot() plot33 <- matleave %>% filter(matleave_13 == 3, matleave_95 == 3) %>% generating_plot() plot03 <- matleave %>% filter(matleave_13 == 3, matleave_95 != 3) %>% generating_plot() plot22 <- matleave %>% filter(matleave_13 == 2, matleave_95 == 2) %>% generating_plot() plot02 <- matleave %>% filter(matleave_13 == 2, matleave_95 != 2) %>% generating_plot() plot11 <- matleave %>% filter(matleave_13 == 1) %>% generating_plot() plot_row1 <- plot_grid(plot55, plot05, labels = c('STAY 5', 'INCREASE TO 5')) plot_row2 <- plot_grid(plot44, plot04, labels = c('STAY 4', 'INCREASE TO 4')) plot_row3 <- plot_grid(plot33, plot03, labels = c('STAY 3', 'INCREASE TO 3')) plot_row4 <- plot_grid(plot22, plot02, labels = c('STAY 2', 'INCREASE TO 2')) final_plot <- plot_grid( plot_row1, plot_row2, plot_row3, plot_row4, plot11, ncol = 1 ) ggsave("test.png", final_plot, width=10, height=30, dpi=300) "],["joindata.html", "Chapter 7 Data manipultaiton: Join data 7.1 讀取內政部人口統計資料 7.2 讀取公投資料", " Chapter 7 Data manipultaiton: Join data 7.1 讀取內政部人口統計資料 先使用slice(-1)減去第一行中文欄位名稱。再來,目前縣市鄉鎮市區(site_id)和村里(village)分別是兩個變項,由於不同的鄉鎮市可能會有相同的村里名,所以把site_id與village粘接起來成為完整的村里名vname。 這邊我多加了一行程式碼讓vname可以排到前面一點的變項欄,可以用select()達到這個目的,我之後的變項欄的還要寶劉,所以我多打一個everything()就可以把剩下的變項欄都擺放在後面。因此這個重排變項欄的完整程式碼為select(vname, everything())。 raw <- read_csv("data/opendata107Y030.csv") %>% slice(-1) %>% mutate(vname = str_c(site_id, village)) %>% select(vname, everything()) raw %>% head ## # A tibble: 6 × 157 ## vname statistic_yyy district_code site_id village single_age_15down_m ## <chr> <chr> <chr> <chr> <chr> <chr> ## 1 新北市板橋區… 107 65000010001 新北市… 留侯里 118 ## 2 新北市板橋區… 107 65000010002 新北市… 流芳里 119 ## 3 新北市板橋區… 107 65000010003 新北市… 赤松里 60 ## 4 新北市板橋區… 107 65000010004 新北市… 黃石里 113 ## 5 新北市板橋區… 107 65000010005 新北市… 挹秀里 123 ## 6 新北市板橋區… 107 65000010006 新北市… 湳興里 351 ## # ℹ 151 more variables: single_age_15_19_m <chr>, single_age_20_24_m <chr>, ## # single_age_25_29_m <chr>, single_age_30_34_m <chr>, ## # single_age_35_39_m <chr>, single_age_40_44_m <chr>, ## # single_age_45_49_m <chr>, single_age_50_54_m <chr>, ## # single_age_55_59_m <chr>, single_age_60_64_m <chr>, ## # single_age_65_69_m <chr>, single_age_70_74_m <chr>, ## # single_age_75_79_m <chr>, single_age_80_84_m <chr>, … # raw %>% glimpse() 7.1.1 分析規劃 建立各鄉鎮市區的老年人口比例 建立各鄉鎮市區的年齡中位數 讀取所有(某一)公投案的結果 視覺化年齡與公投結果間的相關性 7.1.2 清理資料 我們之前在談資料的「觀察、統計、和二維表格」三種型態時,曾經談到統計型態和二維表格型態間的差異。當時所提到的「統計型態」,也就是每個變項欄恰好是我們所認知的單一變項(如每一個變項欄恰是人口統計變項的年齡、性別、教育程度、數量),會有助於進行統計分析,也就是tidy型態的資料。相較之下,上述的表格是把資料攤成二維的型態,每一個變項是某個年齡層的某種性別的某種婚姻狀況,包含了三個人口統計變項,是方便一般大眾讀的,但不是適合進行統計的tidy型態。 這類的資料tidyverse的相關套件把它稱為tidy form。遵守tidy form形式的資料是,每一個欄恰好一個變項。例如在內政部開放資料「15歲以上現住人口按性別、年齡、婚姻狀況及教育程度分」中,每個變數(年齡、婚姻狀況、教育程度、人口數等等)均各自為一個欄上的變項。 15歲以上現住人口按性別、年齡、婚姻狀況及教育程度分 | 政府資料開放平臺 (data.gov.tw) 接下來,我要把表格型態的資料轉為tidy型態資料。原本的資料是這樣的型態。 我要將後方的數值變項欄(single_age_15down_m等)轉為單一變項key的值,再把其所對應到的資料值,也轉為單一變項value。請注意看上圖和程式碼後方結果圖的顏色區塊。南投縣中寮鄉中寮村(綠色)被複製且展開為多列。而原本多個年齡層和資料的變數項(紅色)變成一個變項欄的資料,分別對應到其原本對應的數值(藍色)。 tidy_data <- raw %>% pivot_longer(names_to = "key", values_to = "value", cols = 6:ncol(.)) 相對於pivot_wider()把變項展開成欄,pivot_longer()函式可以收合被展開的變項,在此將要收合的變數名稱統一稱為key,並將該變數所對應到的數值稱為value。並且我用6:ncol(.)來指定我要收合哪些變項欄。 ncol(.)的「.」代表從前面%>% pipe進來的那個data.frame。 pivot_longer()後資料列從7760增加至1,179,520列。(灰底部分用來觀察結果用) 由於每一列恰好是一種婚姻狀態、一個年齡層和一個性別,所以,我們可以把key中的婚姻狀態、年齡層和性別切割出來做為變數。觀察key欄位發現其格式有一些規律性,主要是婚姻狀態_年齡下界_年齡上界_性別的形式。標準的範例如married_15_10_m或widowed_25_29_f,但有一些並非這種形式,例如: single_age_15_19_m:其中single_age之間多了一個底線,所以把single_age取代為single就好。 married_15down_m:因為是15down少了一個底線,所以取代為0_14。 married_100up_f:因為100up少了一個底線,所以取代為100_105。 之後,我使用tidyr::separate()函式將key切成四個變項,分別為married、ageLower、ageUpper、gender。 separate()有一個參數是remove=T(預設值),意思是說,當把key變項切割為四個變項後,預設把key變項給丟棄;但如果未來你還會用到key變項的話,你可以把remove改為FALSE,代表切割完後,還保留key變項。 tidyr::separate():Given either regular expression or a vector of character positions, separate() turns a single character column into multiple columns. 此時我清理出來的資料大致如下: 最後就剩零星的操作,包含轉換資料為數值型態、或者你也可以在這裡建立新的指標(例如年齡平均)。最後加上一個arrange(vname)讓他按照村里的全名排序。 tidy_data <- raw %>% pivot_longer(names_to = "key", values_to = "value", cols = 6:ncol(.)) %>% mutate(key = str_replace(key, "_age", "")) %>% mutate(key = str_replace(key, "100up", "100_110")) %>% mutate(key = str_replace(key, "15down", "0_15")) %>% separate(key, c("married", "ageLower", "ageUpper", "gender")) %>% mutate(ageLower = as.numeric(ageLower), # age = str(ageLower, ageUpper), ageUpper = as.numeric(ageUpper), value = as.numeric(value)) %>% select(-statistic_yyy) %>% arrange(vname) 7.1.3 進階:運用rowwise() raw %>% mutate_at(vars(6:157), as.numeric) %>% replace(is.na(.), 0) %>% rowwise() %>% mutate(married = sum(c_across(matches("widowed|divorced|married")), na.rm = T)) %>% mutate(lt65 = sum(c_across(matches("65|70|75|80|85|90|95|100")), na.rm = T)) %>% select(vname, married, lt65) %>% head ## # A tibble: 6 × 3 ## # Rowwise: ## vname married lt65 ## <chr> <dbl> <dbl> ## 1 新北市板橋區留侯里 920 272 ## 2 新北市板橋區流芳里 826 280 ## 3 新北市板橋區赤松里 463 149 ## 4 新北市板橋區黃石里 632 210 ## 5 新北市板橋區挹秀里 1061 365 ## 6 新北市板橋區湳興里 3157 838 7.1.4 建立鄉鎮市區與村里指標 7.1.4.1 使用group_by()建立村里指標 將資料轉換為tidy型態後,接下來要做的事情是建立村里、鄉鎮市區、縣市的分級指標。針對每個村里,我希望計算出總人口數people(原本依據年齡與性別、婚姻情形分割)、老年人總數elderSum、曾結婚人口總數marriedSum。之後再分別除以該村里的總人口數people,老年人的人口比例elderPerc以及結婚的人口比例marriedPerc。 因為一個村里的資料會根據不同性別、不同婚姻情形、不同年齡層被切割為不同的資料列,共2X4X19個資料列。因此,如果我想知道一個村里的總人口數或相關統計資料,就不需彙整這些資料列。dplyr有非常強大的group_by()可以根據群組來進行運算,我用村里代號(district_code)來做群組運算,所以是group_by(district_code)或用我們所產生的vname作為群組基準來運算group_by(vname)。 語法上,通常group_by()之後經常會跟著summarise(),跟mutate()的語法有點像,都會產生新變數,但因為這邊用group_by()針對某個或某幾個變數做彙整,相當於base套件的apply()函式,因此會根據每個不同的群組做組內的數值彙整運算。比方說,在以下的程式碼中,我用sum(num)計算了該群組內的總人數,然後同樣累計了年齡大於等於65歲的總人數,以及婚姻狀態不為single的總人數。 簡單地說,相當於按照不同的村里(district_code)各別做value的加總(該村里的總人口數)、篩選出年齡65歲以上的人口組別進行加總、篩選出不是單身者的人口組別進行加總。之後會加一個ungroup()解開群組。 最後一行left_join(raw %>% select(vname, site_id), by = \"vname\")是由於group_by()後會讓其他變數消失(例如鄉鎮市區名site_id),所以我希望將原本資料raw中的site_id給併回來。我可以抽取出raw中的vname和site_id兩個變項,然後以vname為key,用left_join()將site_id給併回來。 筆記:當group_by()、summarize()後不參與的變項會消失,但可以透過left_join()的方式將原有的變項併回來。 village_stat <- tidy_data %>% filter(ageLower >= 20) %>% group_by(vname) %>% summarise(legalPopulation = sum(value), elderSum = sum(value[ageLower >= 65]), marriedSum = sum(value[married %in% c("married", "divorced", "widowed")]), womenSum = sum(value[gender == "f"])) %>% ungroup() %>% left_join(raw %>% select(vname, site_id), by = "vname") 測試 7.1.4.2 將村里指標匯總為鄉鎮市區指標 剛剛是根據村里(village)來建立指標,現在要根據鄉鎮市區來建立指標。走過前方的邏輯後,我們只需要把原本用來做group_by()的村里變項vname改為鄉鎮市區的變項site_id,就可以完成這件事,其他都一樣,你發現沒? 不過這邊我要多做一件事。因為三民區和鳳山區兩個區非常的大(我猜),所以內政資料中的鄉鎮市區資料有分「三民一」、「三民二」、「鳳山一」、「鳳山二」。我們只要在彙整資料前,將site_id的這四類值取代好,便可以在鄉鎮市區的指標中一併彙整。以下我一共彙整出四種資料,分別為該區人口數(legalPopulation)、老年人口數(elderSum)、曾婚人口數(marriedSum)、女性人口數(womenSum)。不難想像接下來可以計算出各鄉鎮市區的老年人口比例、曾婚比例、女性比例等。 town_stat <- village_stat %>% # mutate(site_id = str_sub(vname, 1, 6)) %>% mutate(site_id = str_replace(site_id, "三民一|三民二", "三民區")) %>% mutate(site_id = str_replace(site_id, "鳳山一|鳳山二", "鳳山區")) %>% group_by(site_id) %>% summarize(legalPopulation = sum(legalPopulation), elderSum = sum(elderSum), marriedSum = sum(marriedSum), womenSum = sum(womenSum) )%>% ungroup() 7.1.5 視覺化測試(老年人口數 x 曾婚人口數) town_stat %>% mutate(marriedPerc = marriedSum / legalPopulation) %>% mutate(womenPerc = womenSum / legalPopulation) %>% mutate(elderPerc = elderSum / legalPopulation) %>% ggplot() + aes(marriedPerc, elderPerc) + geom_point(alpha = 0.3) # geom_jitter(alpha = 0.3) 7.2 讀取公投資料 首先,先讀取資料並重新命名每個變項。由於我們要連結公投資料和前面的內政部人口統計資料,所以要注意兩筆資料間是否有共通的key(資料庫稱為鍵值)。town_stat的是以site_id鄉鎮市區名為主鍵,所以公投資料這邊也產生一個同名的鄉鎮市區變項site_id。 ref10 <- read_csv("data/ref10.csv") %>% select(county = 縣市, town = 鄉鎮市區, agree = 同意票數, disagree = 不同意票數, legalVote = 有效票數, illegalVote = 無效票數, vote = 投票數, legalPopulation = 投票權人數) %>% mutate(site_id = str_c(county, town)) %>% drop_na(site_id) names(ref10) ## [1] "county" "town" "agree" "disagree" ## [5] "legalVote" "illegalVote" "vote" "legalPopulation" ## [9] "site_id" 合併資料測試,注意,由於兩邊都有legalPopulation,所以town_stat中的legalPopulation增生為legalPopulation.x,而ref10中的legalPopulation則重新命名為legalPopulation.y。 town_stat %>% left_join(ref10, by = "site_id") ## # A tibble: 368 × 13 ## site_id legalPopulation.x elderSum marriedSum womenSum county town agree ## <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl> ## 1 南投縣中寮… 12791 3272 9553 5824 南投縣 中寮… 5748 ## 2 南投縣仁愛… 12172 1713 9078 5899 南投縣 仁愛… 5702 ## 3 南投縣信義… 12860 1847 9050 5938 南投縣 信義… 6891 ## 4 南投縣南投… 81874 15855 57042 41343 南投縣 南投… 37547 ## 5 南投縣名間… 32388 7106 23375 15304 南投縣 名間… 14533 ## 6 南投縣國姓… 16196 3744 11826 7434 南投縣 國姓… 7089 ## 7 南投縣埔里… 66699 13411 46316 33718 南投縣 埔里… 29571 ## 8 南投縣水里… 15023 3644 10850 7106 南投縣 水里… 6392 ## 9 南投縣竹山… 45629 10154 33201 22244 南投縣 竹山… 19254 ## 10 南投縣草屯… 80426 15141 56384 40008 南投縣 草屯… 35215 ## # ℹ 358 more rows ## # ℹ 5 more variables: disagree <dbl>, legalVote <dbl>, illegalVote <dbl>, ## # vote <dbl>, legalPopulation.y <dbl> 7.2.1 合併公投資料並視覺化 由於人口統計資料中的鄉鎮市區若只有兩個字如「東區」中間有一全形空白「東 區」,但公投資料中並沒有這樣的空白,所以為了兩者要能夠正確合併,需要先做好取代。可以逐一取代,或者,直接取代掉該全形空白為空字串即可。 town_stat %>% mutate(site_id = str_replace(site_id, " ", "")) %>% # mutate(site_id = str_replace(site_id, "東 區", "東區"), # site_id = str_replace(site_id, "西 區", "西區"), # site_id = str_replace(site_id, "南 區", "南區"), # site_id = str_replace(site_id, "北 區", "北區"), # site_id = str_replace(site_id, "中 區", "中區")) %>% left_join(ref10, by = "site_id") %>% mutate(agreeRate = agree / legalVote, marriedPerc = marriedSum / legalPopulation.x) %>% # select(site_id, agree, legalVote, marriedSum, legalPopulation.x) %>% ggplot() + aes(agreeRate, marriedPerc) + geom_point(alpha = 0.5, color = "royalblue") + theme_light() "],["categorical.html", "Chapter 8 Categorical Data Analysis 8.1 Survey Analysis 8.2 The Case: Misinformation Perception 8.3 Factorizing data 8.4 Order-to-factor 8.5 Cross-tabulating", " Chapter 8 Categorical Data Analysis 8.1 Survey Analysis 國外不少媒體會用智庫或者學術單位所發佈的調查結果作為資料新聞素材,我們所曾經處理過的華盛頓郵報的產假支薪案例也是。以下為該案例資料的截圖。matleave_95代表1995年的資料,每個變數的數據1至5分別代表產假時給付薪水的月數區間共有五個區間。區間大小通常需要查看編碼簿來獲取定義。 這類資料由於採用數字(其實是Factor)來替代類別,通常隨著數據會釋出該調查的編碼簿(Code Book),這個案例的編碼(1至5)如下: 8.2 The Case: Misinformation Perception 這個範例涵括了在做問卷分析時常用的處理步驟。最核心的步驟是將文字陳述的類別資料轉換為便於後續運算的factor或數值資料。如果類別數量過多的時候,在這個過程會順便進行重新分組。例如依照年齡組把填答者分為老年、中壯年、青少年、兒童四組。 raw <- read_rds("data/tfc_survey.rds") raw ## # A tibble: 1,216 × 6 ## Q7 Q8 QAParty QASide QA3 QA4 ## <chr> <chr> <chr> <chr> <chr> <chr> ## 1 會 絕對會 民主進步黨 非常接近泛綠 25-29 研究所及以上 ## 2 會 絕對會 沒有政黨偏好 接近泛藍 35-39 研究所及以上 ## 3 不會 絕對會 沒有政黨偏好 接近泛綠 35-39 大專(專科與大學) ## 4 會 會 台灣民眾黨 接近泛綠 20-24 大專(專科與大學) ## 5 不會 不會 民主進步黨 非常接近泛綠 45-49 研究所及以上 ## 6 會 絕對會 沒有政黨偏好 非常接近泛藍 25-29 大專(專科與大學) ## 7 不會 絕對會 民主進步黨 接近泛綠 30-34 大專(專科與大學) ## 8 會 絕對會 台灣民眾黨 接近泛綠 20-24 大專(專科與大學) ## 9 會 絕對會 沒有政黨偏好 接近泛藍 20-24 大專(專科與大學) ## 10 會 會 民主進步黨 接近泛綠 55-59 高中、高職 ## # ℹ 1,206 more rows 8.3 Factorizing data 通常問卷會分為兩種類型的資料,一種是人口統計用的基本資料(如性別、年齡組、教育程度)、另一種是問卷本身要問的題項。以下是常見的問卷型態,包含把年齡從20歲開始每五年作為一組,70歲以上則歸類為一組,共會有十一組。而教育程度則常分為五至六組,但在問卷設計的時候,通常會需要增加「拒答」的選項。如果問卷中包含政黨意識形態,就必須要決定要以黨派作為類別變項,或者以意識形態做順序尺度。以下即為一個順序尺度的案例,從「非常接近泛綠」到「非常接近泛藍」共五個等第,但另增「拒答」選項。 dt <- raw %>% mutate(QA3 = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"))) %>% mutate(QA3_lv = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"), labels = c("青年", "青年", "壯年", "壯年", "壯年", "中年", "中年", "中年", "中年", "老年", "老年"))) %>% mutate(QA4 = ordered(QA4, levels=c("拒答", "國小及以下", "初中、國中", "高中、高職", "大專(專科與大學)", "研究所及以上"), labels=c("拒答", "國小以下", "國中", "高中職", "大專", "研究所以上"))) %>% mutate(QASide=ordered(QASide, exclude="拒答", levels=c("非常接近泛綠", "接近泛綠", "都不接近", "接近泛藍", "非常接近泛藍"))) 8.3.1 factor-to-order 在一開始清理資料的時候,會建議先把類別變數(通常是文字型態)轉為factor型態。常用的函式是用mutate()搭配ordered()來改變變數型態。ordered()會照類別順序來標定該factor所對應到的數字。可以用as.integer()將factor轉為整數後就可以看到各類別的順序。 mutate(QA3 = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"))) %>% dt$QA3[1:10] ## [1] 25-29 35-39 35-39 20-24 45-49 25-29 30-34 20-24 20-24 55-59 ## 11 Levels: 20-24 < 25-29 < 30-34 < 35-39 < 40-44 < 45-49 < 50-54 < ... < 70及以上 as.integer(dt$QA3[1:10]) ## [1] 2 4 4 1 6 2 3 1 1 8 8.3.2 Excluding 如果有某些類別變數的值(如「拒答」)不想被編入factor,可以在reorder()中加入exclude的參數指定不想被編入類別值。 mutate(QASide=ordered(QASide, exclude="拒答", levels=c("非常接近泛綠", "接近泛綠", "都不接近", "接近泛藍", "非常接近泛藍"))) dt$QASide[1:10] ## [1] 非常接近泛綠 接近泛藍 接近泛綠 接近泛綠 非常接近泛綠 ## [6] 非常接近泛藍 接近泛綠 接近泛綠 接近泛藍 接近泛綠 ## Levels: 非常接近泛綠 < 接近泛綠 < 都不接近 < 接近泛藍 < 非常接近泛藍 as.integer(dt$QASide[1:10]) ## [1] 1 4 2 2 1 5 2 2 4 2 8.3.3 Grouping-up 如果有某些類別變數的類別過多,希望再次群組化為較少的組別,如重新群組各年齡層為青年、壯年、中年與老年四個尺度。此時除了levels參數外,可以另外加入labels的參數,指定每個類別變數值所要對應到的群組。以下為群組後的結果,仔細觀察剩下多少個尺度。 mutate(QA3_lv = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"), labels = c("青年", "青年", "壯年", "壯年", "壯年", "中年", "中年", "中年", "中年", "老年", "老年"))) %>% dt$QA3[1:10] ## [1] 25-29 35-39 35-39 20-24 45-49 25-29 30-34 20-24 20-24 55-59 ## 11 Levels: 20-24 < 25-29 < 30-34 < 35-39 < 40-44 < 45-49 < 50-54 < ... < 70及以上 as.integer(dt$QA3[1:10]) ## [1] 2 4 4 1 6 2 3 1 1 8 dt$QA3_lv[1:10] ## [1] 青年 壯年 壯年 青年 中年 青年 壯年 青年 青年 中年 ## Levels: 青年 < 壯年 < 中年 < 老年 8.4 Order-to-factor Q7 請問您會不會受到假消息影響? Q8 請問您認為其他人會不會受到假消息的影響? 對於Q7、Q8的問題是詢問填答者認為自己或他人會不會受到假消息影響,並從「一點也不會」、「不會」、「會」到「絕對會」共分四個等第。Q7分別是「81, 446, 650, 39」、Q8分別是「5, 58, 803, 350」。相較於Q7,Q8的分佈略為左傾,亦即傾向於認為其他人較容易受影響。此時如果想要分析Q7和Q8間的關係,由於各有四個等第,其交叉分析表會有16個項目,相當難以分析。 dt2 <- dt %>% mutate(Q7 = ordered(Q7, levels=c("一點也不會", "不會", "會", "絕對會"))) %>% mutate(Q8 = ordered(Q8, levels=c("一點也不會", "不會", "會", "絕對會"))) %>% mutate(Q7_3rd = as.numeric(Q8)-as.numeric(Q7)) %>% mutate(Q7_3rd_lv = ifelse(Q7 %in% c("一點也不會", "不會") & Q8 %in% c("會", "絕對會"), "高", "低")) %>% mutate(Q7_3rd_lv = ordered(Q7_3rd_lv, levels=c("低", "高"))) 這時候一種策略是把這兩題視為順序尺度變數,然後把兩題的分數相減。相減後的分數從「-1, 0, 1, 2, 3」各有「12, 482, 600, 103, 19」,不難猜到會是一個較為集中的分佈,後續僅能當作順序尺度或連續變項來分析,不適合找一個閾值轉類別變項。 另一種策略是,分別先把Q7與Q8的「一點也不會」和「不會」群組為「不會」、再把「會」與「絕對會」群組為「會」,這樣Q7與Q8的交叉分析表會變成2X2的分析表,雖然群組數量比較少,但別忘記Q7的填答結果集中在會與不會、而Q8為一個較為偏右的分佈,集中在「會」和「絕對會」。Q8勢必會造成比例不均的分組。 dt2 %>% count(as.integer(Q8)-as.integer(Q7)) ## # A tibble: 5 × 2 ## `as.integer(Q8) - as.integer(Q7)` n ## <int> <int> ## 1 -1 12 ## 2 0 482 ## 3 1 600 ## 4 2 103 ## 5 3 19 最後這題所採行的策略是,做高、低第三人效果分組,也就是根據認為自己「一點也不會」、「不會」受影響,而他人「會」或「絕對會」受影響的重新群組為「高第三人效果組」,其他則為「低第三人效果組」。亦即,分組的一句是在對自己與他人的認知上,無模糊空間的分組方法(也就是認為自己至少不會,和認為別人應該會)。 dt2 %>% count(Q7_3rd_lv) ## # A tibble: 2 × 2 ## Q7_3rd_lv n ## <ord> <int> ## 1 低 746 ## 2 高 470 8.5 Cross-tabulating 在R語言中,xtabs()是一個用於建立交叉表(cross-tabulation)的函數。它可以將資料中的變數進行交叉分類,並計算每個交叉組合的頻次或其他統計量。 chisq.test(xtb)分析結果指出 X-squared(卡方值)等於10.017,df(自由度)等於3,p-value(p值)等於0.01842。 這個結果顯示在這個交叉表中,QA3_lv(年齡層)Q7_3rd_lv(第三人效應)間的分類狀態並非完全獨立,而是存在某種統計上的關聯性。 由於p值小於我們事先選定的顯著性水準(通常為0.05),我們可以拒絕虛無假設(兩個變數獨立),並認為這個關聯性是統計上顯著的。 對於vcd::assocstats(xtb)的分析結果: 這些統計量用於評估QA3_lv和Q7_3rd_lv之間的關聯性程度。 連續性係數(Contingency Coeff.)和克拉瑪爾V(Cramer’s V)的值,表示兩個變數之間的關聯性較弱,但仍存在一定程度的相關性。 (xtb <- xtabs(~QA3_lv + Q7_3rd_lv, data=dt2)) ## Q7_3rd_lv ## QA3_lv 低 高 ## 青年 178 110 ## 壯年 370 199 ## 中年 157 134 ## 老年 41 27 (chi2 <- chisq.test(xtb)) ## ## Pearson's Chi-squared test ## ## data: xtb ## X-squared = 10.017, df = 3, p-value = 0.01842 vcd::assocstats(xtb) ## X^2 df P(> X^2) ## Likelihood Ratio 9.9301 3 0.01917 ## Pearson 10.0173 3 0.01842 ## ## Phi-Coefficient : NA ## Contingency Coeff.: 0.09 ## Cramer's V : 0.091 print(round(chi2$observed, 2)) ## Q7_3rd_lv ## QA3_lv 低 高 ## 青年 178 110 ## 壯年 370 199 ## 中年 157 134 ## 老年 41 27 print(round(chi2$expected, 2)) ## Q7_3rd_lv ## QA3_lv 低 高 ## 青年 176.68 111.32 ## 壯年 349.07 219.93 ## 中年 178.52 112.48 ## 老年 41.72 26.28 print(round(chi2$residuals, 2)) ## Q7_3rd_lv ## QA3_lv 低 高 ## 青年 0.10 -0.12 ## 壯年 1.12 -1.41 ## 中年 -1.61 2.03 ## 老年 -0.11 0.14 par(family="Heiti TC Light") gplots::balloonplot(t(xtb), xlab="第三人效果", ylab="年齡組", main="", dotsize=4/max(strwidth(40),strheight(40)), text.size=1.5,label.size=2, rowmar=1, colmar=1) par(family="Heiti TC Light") corrplot::corrplot(chi2$residuals, is.corr = F) xtb %>% as_tibble() %>% group_by(QA3_lv) %>% mutate(fill = if_else(n == max(n), "orangered", "skyblue")) %>% ungroup() %>% mutate(QA3_lv = ordered(QA3_lv, levels=c("青年", "壯年", "中年", "老年"))) %>% arrange(desc(QA3_lv)) %>% ggplot() + aes(y = QA3_lv, x=Q7_3rd_lv, color = fill, size = n) + scale_size_area(max_size=70, guide = "none") + geom_point(alpha=0.7) + scale_color_manual(values = c("orangered", "skyblue"), guide = "none") + geom_text(aes( label=n, vjust=1.3, size=10 ), color="black",) + theme_minimal() + theme(text = element_text(family="Heiti TC Light"), title = element_text(family="Heiti TC Light")) "],["timeline.html", "Chapter 9 Processing Timeline 9.1 Time object 9.2 Example: Processing time object in social opinions", " Chapter 9 Processing Timeline 9.1 Time object 在當前的數位時代,網路上充斥著豐富的開放資料,許多其中包含著關鍵的時間資訊,如訂單成立的時間、氣象觀測的時刻以及股票的交易時間等。這些時間數據往往以字串形式存在,但若需進行時間計算或構建時間序列分析,在程式處理前必須將其轉化為專門的時間物件。 在R語言中,主要有兩種時間物件:POSIXct和POSIXlt,它們可通過as.POSIXct()和as.POSIXlt()函數將字串轉換成相應的時間物件形式。一旦轉換完成,各種時間相關的計算操作,如時間點之間的差異計算、時區轉換、時間序列的特定區間提取等,便可輕鬆進行。具體而言,POSIXct是以1970年1月1日00:00:00 UTC至當前的總秒數來表示時間點,適合於進行數學計算;而POSIXlt則採用結構化列表形式存儲,包括年、月、日、小時、分、秒等時間單位,更便於人工閱讀與理解。這兩種時間物件的主要差異在於,POSIXct較為適合於計算處理,POSIXlt則在時間元素的展示與處理上更為直觀。 此外,利用Sys.time()函數能夠獲取當前時刻的時間物件,這為時間數據的動態處理提供了便利。學習如何有效運用這些時間物件進行日期與時間的計算在許多領域,例如金融、氣象、交通等,都是非常關鍵的能力。 9.2 Example: Processing time object in social opinions 9.2.1 Char-to-Time 在 R 裡面,我們可以使用 strptime() 函數將字串轉換為時間物件,其中 %Y、%m、%d、%H、%M、%S 等是用來表示時間的格式碼。在這段程式碼中,我們使用 strptime() 函數將 ptime 這個字串轉換為一個時間物件,其中 %Y-%m-%dT%H:%M:%SZ 是該字串的時間格式,也就是說這個字串是以 ISO 8601 的格式表示的時間,例如 2022-03-31T14:30:00Z。tz = \"ASIA/Taipei\" 則是指定時間所在的時區,這裡指定的是台灣時間。轉換完成後,我們使用 as.POSIXct() 函數將 strptime() 轉換出來的時間物件再轉換為POSIXct時間物件,並將其存入 ptime 這個欄位中。這段程式碼的作用是將一個 ISO 8601 格式的字串轉換為 POSIXct 時間物件,並指定時區為台灣,方便之後進行時間相關的運算。 在 strptime() 函數中,可以使用不同的格式碼來指定時間的格式。以下是常用的幾種格式碼及其意義: %Y:四位數的年份,例如 2022。 %m:兩位數的月份,範圍是 01 到 12。 %d:兩位數的日期,範圍是 01 到 31。 %H:兩位數的小時,範圍是 00 到 23。 %M:兩位數的分鐘,範圍是 00 到 59。 %S:兩位數的秒數,範圍是 00 到 59。 %b:縮寫形式的月份名稱,例如 Jan。 %B:完整形式的月份名稱,例如 January。 %a:縮寫形式的星期幾名稱,例如 Mon。 %A:完整形式的星期幾名稱,例如 Monday。 %p:AM 或 PM,例如 AM。 在 strptime() 函數中,你可以使用這些格式碼來指定一個字串的時間格式,以便將其轉換為時間物件。例如,如果一個字串的格式是 2022-03-31 14:30:00,那麼可以使用 %Y-%m-%d %H:%M:%S 這個時間格式來將其轉換為一個時間物件。 # Reading from url # ptturl <- "https://github.com/P4CSS/R4CSSData/raw/main/ptt_hang_posts.csv" # raw <- read.csv(url(ptturl)) # read_csv() won't convert timestamp to POSIXct automatically # raw <- read.csv("data/ptt_hang_posts.csv") # clean <- raw %>% # mutate(ptime = as.POSIXct(strptime(ptime, "%Y-%m-%dT%H:%M:%SZ"))) # read_csv() will convert timestamp to POSIXct automatically clean <- read_csv("data/ptt_hang_posts.csv") t <- "2019-04-12T00:48:19Z" class(t) ## [1] "character" ?strptime t1 <- strptime(t, "%Y-%m-%dT%H:%M:%SZ") clean %>% head # %>% View ## # A tibble: 6 × 7 ## plink board pcontent poster ptitle ptime ipaddr ## <chr> <chr> <chr> <chr> <chr> <dttm> <chr> ## 1 https://www.ptt.cc/bb… Hate… "\\n\\n韓… loveb… Re: [… 2019-04-12 02:21:14 83.22… ## 2 https://www.ptt.cc/bb… Hate… "\\n\\n\\n… ikr36… Re: [… 2019-04-12 02:13:45 114.4… ## 3 https://www.ptt.cc/bb… Hate… "\\n\\n正… sunye… Re: [… 2019-04-12 02:10:18 118.1… ## 4 https://www.ptt.cc/bb… Hate… "\\n:\\n\\… rock7… Re: [… 2019-04-12 02:03:14 118.1… ## 5 https://www.ptt.cc/bb… Hate… "\\n\\n我… btm97… Re: [… 2019-04-12 02:01:12 101.1… ## 6 https://www.ptt.cc/bb… Hate… "\\n\\n\\n… cblade [討論… 2019-04-12 01:55:06 180.2… 9.2.2 Density plot along time 在資料分析的過程中,我們經常需要對資料進行分布分析,以了解資料的特性。ggplot2 套件提供了 geom_density() 函數,可以用來繪製密度圖(density plot)。密度圖顯示了一個連續變量的概率密度函數的近似值,可以用來了解該變量的分佈情況。密度圖與直方圖類似,但它是基於核密度估計方法繪製的,所以在某些情況下可以提供更好的分佈近似。它將一個連續變量區間劃分為若干個小區間,然後對每個小區間的密度進行估計,再將這些小區間的密度估計值連接起來,形成一條平滑曲線,用以描述變量的分佈情況。 在 ggplot2 中,使用 geom_density() 函數可以很方便地繪製密度圖。我們只需要指定變量名稱,即可繪製出該變量的密度圖。此外,我們也可以使用 stat_density() 函數來繪製密度圖,這個函數允許我們對密度圖進行更多的自定義設置,例如指定核函數、調整帶寬等。繪製密度圖可以讓我們更直觀地了解變量的分佈情況,進而對資料進行更深入的分析和探索。 clean %>% ggplot() + aes(ptime) + geom_density() 9.2.3 Freq by month 如果想要詳細觀察逐年逐月的變化,使用密度圖可能不夠直觀,此時可以考慮使用直方圖來呈現資料。直方圖可以將資料劃分為若干個等寬的區間,並計算每個區間內資料的頻率,然後將這些頻率顯示為長方形柱,以反映資料的分佈情況。對於時間序列資料,我們可以將其劃分為月、週等時間單位,然後計算每個時間單位內資料的出現次數,再使用 ggplot2 中的 geom_col() 函數繪製直方圖。 以上程式碼中,我們使用 mutate() 函數將 ptime 欄位轉換為月份 m,然後使用 count() 函數計算每個月份出現的次數。接著使用 ggplot() 函數初始化一個 ggplot 對象,指定 aes() 函數的 x 軸為月份 m,y 軸為出現次數 n,然後使用 geom_col() 函數繪製直方圖。這樣可以很直觀地看到每個月份資料的出現次數,進而觀察到逐年逐月的變化趨勢。如果需要更詳細的觀察,可以將資料劃分為更小的時間單位,例如週,然後使用類似的方法繪製直方圖。 ?lubridate clean %>% mutate(m = month(ptime)) %>% count(m) %>% ggplot() + aes(m, n) + geom_col() 9.2.4 Freq-by-date (good) 在處理時間序列資料時,我們常常需要將資料劃分為不同的時間單位,例如月、週、日等,以便進行更精細的分析和視覺化。然而,如果只是單純地提取出時間序列資料中的某一個時間單位,例如月份,就會失去時間軸在年的特性,因此需要採取一些方法來保留日期(如年)的特性。 以上程式碼中,我們使用 filter() 函數選取了時間範圍為 2019 年 3 月 18 日到 4 月 1 日的資料,然後使用 floor_date() 函數將每個時間點取整為當天的起始時間,以保留日期(如年)的特性。這樣可以確保同一天的資料都被歸到同一個時間單位中,進而保留時間軸在年的特性。接著使用 count() 函數計算每個時間單位內資料的出現次數,再使用 ggplot() 函數和 geom_col() 函數繪製直方圖,可以看到在時間軸上的年份特性被保留了下來。 總之,當我們需要從時間序列資料中提取某一個時間單位時,應該採用能夠保留日期(如年)特性的方法,例如使用 floor_date() 函數,以便進行更加精細的分析和視覺化。 clean %>% filter(ptime >= as_date("2019-03-18") & ptime < as_date("2019-04-01")) %>% mutate(m = floor_date(ptime, unit = "day")) %>% count(m) %>% ggplot() + aes(m, n) + geom_col() 9.2.5 Freq-by-hour 透過觀察資料在週末和週間的變化,可以幫助我們了解不同時間段的資料分佈情況。以下是一個範例程式碼,可以根據每天的時間點和文章數來觀察資料在週末和週間的變化。相較於將資料分為週間和週末,這個範例程式碼使用 X 軸作為 24 小時的時間點,而 Y 軸為不同日期的文章量,使用分組的方式,針對不同日期繪製折線圖,最後使用 facet_wrap() 函數將資料分成週末和週間兩個子圖來進行比較。 首先,我們使用 filter() 函數選取時間範圍為 2019 年 3 月 25 日到 4 月 1 日的資料。接著,使用 floor_date() 函數將每個時間點取整為當天的起始時間,以便進行統計。然後,使用 hour() 函數取出每個時間點的小時數,以及使用 count() 函數計算每個時間點和日期的文章數。接著,使用 wday() 函數取出每個日期的星期幾,並使用 ifelse() 函數將週末和週間的日期標記為不同的類別。最後,使用 ggplot() 函數初始化一個 ggplot 對象,指定 aes() 函數的 x 軸為小時數 h,y 軸為文章數 n,以及日期 d 的類別 color。然後,使用 geom_line() 函數繪製折線圖,並使用 facet_wrap() 函數將資料分為週末和週間兩個子圖。 透過這樣的方式,我們可以很清楚地看到週末和週間的文章量變化趨勢,從而對資料進行更深入的分析和探索。 clean %>% filter(ptime >= as_datetime("2019-03-25") & ptime < as_datetime("2019-04-01")) %>% mutate(d = floor_date(ptime, unit = "day")) %>% mutate(h = hour(ptime)) %>% count(d, h) %>% mutate(wd = wday(d, label = F, locale = Sys.getlocale("LC_TIME"))) %>% mutate(isweekend = ifelse(wd >= 6, "weekend", "weekday")) %>% ggplot() + aes(h, n, color = as.character(d)) + geom_line() + facet_wrap(~isweekend) ?ifelse "],["na.html", "Chapter 10 NA Processing 10.1 Cleaning Gov Annual Budget 10.2 Cleaning Covid Vaccinating data", " Chapter 10 NA Processing 許多統計資料都會有不同程度的NA(缺失值、遺漏值)。缺失值產生的原因不一,可能有以下原因: 資料運算的時候產生的填缺失值。例如spread()和pivot_wider()經常會產生NA,也經常會指定值(例如0)來取代可能產生的NA。 資料紀錄的時候遺漏某些時間點的資料。 開放資料在開放時已經被整理成階層化、易於展示、一般人易懂的表格型態。此時,若將其讀入也會產生非常大量的NA。例如本章節所要提到的政府各部會預算比例。 紀錄資料筆數非常龐大、來源眾多、紀錄時間不一時,雖然有很多紀錄,但這些紀錄必須要被對齊、刪減,才能夠獲得有意義的可計算資料。例如本章節會提到的世界各國疫苗注射資料。 10.1 Cleaning Gov Annual Budget 這個範例將清理中央政府111年度的歲出預算表。由於政府預算有款、科、目、節與機構,會呈現一個大部會到小布會的樹狀階層,因此非常適合用Treemap來做視覺化,預期視覺化的結果如下(視覺化的部分可參考章節26.3): 在讀入資料後,由於資料具有階層性、從最大的科款、項、目,由於是給一般讀者所閱讀的資料,在原本的EXCEL表格中,比較大的階層可能會合併數個資料格來表示,這會使得較大的階層會有相當多的缺失值。此時,我們會需要依據其他列的值,來回填這些NA值,所用的函式為zoo::na.locf()。 raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F) raw %>% head(10) ## # A tibble: 10 × 9 ## ...1 ...2 ...3 ...4 ...5 ...6 ...7 ...8 ...9 ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 科 … <NA> <NA> <NA> <NA> 本年… 上年… 前年… "本… ## 2 款 項 目 節 "名 … <NA> <NA> <NA> <NA> ## 3 <NA> <NA> <NA> <NA> "\\n… 2262… 2135… 2039… "126… ## 4 <NA> <NA> <NA> <NA> "\\n(… 2101… 2026… 1907… "750… ## 5 1 <NA> <NA> <NA> "310… 1210… 1186… 1176… "233… ## 6 <NA> 1 <NA> <NA> "310… 1004… 9789… 9973… "258… ## 7 <NA> <NA> 1 <NA> "310… 9205… 8963… 8821… "241… ## 8 <NA> <NA> 2 <NA> "310… 30000 30000 2999… "-" ## 9 <NA> <NA> 3 <NA> "310… 15760 15760 4557… "-" ## 10 <NA> <NA> 4 <NA> "310… 5332 5332 6720… "-" 10.1.1 Basic Cleaning 重新命名欄位名稱 刪去被當成表格標題的多於列(通常是前兩三列)slice(-(1:2))。 觀察資料,「款」可以說是支出大類的代號,例如總統府、行政支出、立法支出、軍事支出、教育支出等。「科」為該單位底下的部門或者項目,例如「行政支出」下有行政院、主計總處支出等。更底下的細類「目」並非本例的分析對象,所以可以刪除。所以,如果款、科均為缺失值的話,代表其為更細的「目」。因此篩去款科為缺失值的所有項目。filter(!is.na(款) | !is.na(科)) 將機構id和機構名稱切分開來,視覺化的時候只會用到機構名稱。separate(機構, c(\"oid\", \"org\"), sep=\"\\n\") names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差") cleaned <- raw %>% slice(-(1:2)) %>% filter(!is.na(款) | !is.na(科)) %>% select(-目, -節) %>% separate(機構, c("oid", "org"), sep="\\n") cleaned %>% head(10) ## # A tibble: 10 × 8 ## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差 ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 1 <NA> 3100000000 國務支出 1210301 1186955 1176955.12… 23346 ## 2 <NA> 1 3102010000 總統府 1004797 978916 997305.545… 25881 ## 3 <NA> 2 3102100000 國家安全會議 205504 208039 179649.579… -2535 ## 4 2 <NA> 3200000000 行政支出 6134276 5836481 5477154.58… 297795 ## 5 <NA> 1 3203010000 行政院 1256043 1286646 1268295.23 -30603 ## 6 <NA> 2 3203100000 主計總處 1604967 1478173 1578781.89… 126794 ## 7 <NA> 3 3203300000 人事行政總處 555363 573447 489516.177… -18084 ## 8 <NA> 4 3203340000 公務人力發展… 244346 239453 229852.261… 4893 ## 9 <NA> 5 3203420000 檔案管理局 787429 646081 443133.207… 141348 ## 10 <NA> 6 3203900000 大陸委員會 900896 900866 792491.221… 30 10.1.2 Processing NA 觀察一下現在的資料,發現,行政院、主計總處等均屬於行政支出,但行政支出卻自有一列。依照長表格的格式來說,應嘗試把「款」作為機構的變項。所以將款的數字取代為「行政支出」等支出類別的名稱。 cleaned %>% mutate(款 = ifelse(!is.na(款), org, 款)) %>% head(10) ## # A tibble: 10 × 8 ## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差 ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 國務支出 <NA> 3100000000 國務支出 1210301 1186955 1176955.1… 23346 ## 2 <NA> 1 3102010000 總統府 1004797 978916 997305.54… 25881 ## 3 <NA> 2 3102100000 國家安全會… 205504 208039 179649.57… -2535 ## 4 行政支出 <NA> 3200000000 行政支出 6134276 5836481 5477154.5… 297795 ## 5 <NA> 1 3203010000 行政院 1256043 1286646 1268295.23 -30603 ## 6 <NA> 2 3203100000 主計總處 1604967 1478173 1578781.8… 126794 ## 7 <NA> 3 3203300000 人事行政總… 555363 573447 489516.17… -18084 ## 8 <NA> 4 3203340000 公務人力發… 244346 239453 229852.26… 4893 ## 9 <NA> 5 3203420000 檔案管理局 787429 646081 443133.20… 141348 ## 10 <NA> 6 3203900000 大陸委員會 900896 900866 792491.22… 30 接下來,希望能夠在「款==NA」的地方填入該欄的「前一個值」例如行政支出。查詢一下(關鍵字如「Fill in NA column values with the last value that was not NA」)還真的有這樣的函式可以操作: zoo::na.locf():zoo::na.locf() 是 R 語言中 zoo 套件提供的函式,其作用是將缺失值(NA)用最後一個非缺失值(non-missing value)填充。具體而言,na.locf() 函式將會從第一個非缺失值開始向下填充,直到下一個非缺失值出現為止。這種方法稱為 “last observation carried forward”(LOCF),意思是最後觀測值向前填充。 library(zoo) cleaned %>% mutate(款 = ifelse(!is.na(款), org, 款)) %>% mutate(款 = zoo::na.locf(款)) %>% head(10) ## # A tibble: 10 × 8 ## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差 ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 國務支出 <NA> 3100000000 國務支出 1210301 1186955 1176955.1… 23346 ## 2 國務支出 1 3102010000 總統府 1004797 978916 997305.54… 25881 ## 3 國務支出 2 3102100000 國家安全會… 205504 208039 179649.57… -2535 ## 4 行政支出 <NA> 3200000000 行政支出 6134276 5836481 5477154.5… 297795 ## 5 行政支出 1 3203010000 行政院 1256043 1286646 1268295.23 -30603 ## 6 行政支出 2 3203100000 主計總處 1604967 1478173 1578781.8… 126794 ## 7 行政支出 3 3203300000 人事行政總… 555363 573447 489516.17… -18084 ## 8 行政支出 4 3203340000 公務人力發… 244346 239453 229852.26… 4893 ## 9 行政支出 5 3203420000 檔案管理局 787429 646081 443133.20… 141348 ## 10 行政支出 6 3203900000 大陸委員會 900896 900866 792491.22… 30 太神奇了!看見沒!接下來只要把「科 is NA」的那些該大類支出總數的紀錄給刪除,資料就乾淨了。最後就只會剩下一些資料清理的功伕。完整程式碼可以看下一節。 10.1.3 Complete Code library(zoo) # raw <- readxl::read_excel("data/111B歲出政事別預算總表.xls") raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F) names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差") # raw$款 <- na.locf(raw$款) cleaned <- raw %>% filter(!is.na(款) | !is.na(科)) %>% slice(-(1:2)) %>% select(-目, -節) %>% separate(機構, c("oid", "org"), sep="\\n") %>% mutate(款 = ifelse(!is.na(款), org, 款)) %>% mutate(款 = zoo::na.locf(款)) %>% filter(!is.na(科)) %>% select(-科) %>% type_convert() %>% mutate(上年度預算 = as.numeric(上年度預算), 上年度決算 = as.integer(上年度決算), 預算差 = as.numeric(預算差)) %>% replace_na(list(上年度預算 = 0, 上年度決算 = 0)) %>% mutate(預算差 = 本年度預算 - 上年度預算) cleaned %>% head() ## # A tibble: 6 × 7 ## 款 oid org 本年度預算 上年度預算 上年度決算 預算差 ## <chr> <dbl> <chr> <dbl> <dbl> <int> <dbl> ## 1 國務支出 3102010000 總統府 1004797 978916 997305 25881 ## 2 國務支出 3102100000 國家安全會議 205504 208039 179649 -2535 ## 3 行政支出 3203010000 行政院 1256043 1286646 1268295 -30603 ## 4 行政支出 3203100000 主計總處 1604967 1478173 1578781 126794 ## 5 行政支出 3203300000 人事行政總處 555363 573447 489516 -18084 ## 6 行政支出 3203340000 公務人力發展學院 244346 239453 229852 4893 10.2 Cleaning Covid Vaccinating data 這個案例是希望視覺化不同國家(Y)在不同時間點(X)的疫苗施打涵蓋率(將使用熱區圖,所以將用顏色來表示涵蓋率)。涵蓋率的表示法在該資料中為每百萬人施打疫苗數,但也可以轉為百分比,有多少比例的人已經施打過第一劑、第二劑或第三劑等。 資料來源為: https://ourworldindata.org/covid-vaccinations https://github.com/owid/covid-19-data/tree/master/public/data/vaccinations 預期希望看見的結果如下,如何將這份疫苗施打比例的資料做視覺化,請見視覺化的章節??: 10.2.1 觀察並評估資料概況 這是一份資料缺失相當多的資料。評估資料概況後可發現這個資料集每一列就是某一個國家某一天所上傳的紀錄。所以,一個國家會有很多列。乍聽之下不難處理,但事實上每個國家不會每天上傳、也不會固定某一天上傳、哪一週、哪一個月開始上傳也不一定,也有可能會漏掉一些月份或週次。所以,制定出一個時間單位(例如週、月)、然後延著時間軸將資料「對齊」,讓每個國家在每個時間單位都有資料。但每個國家疫情發展程度不一,所以也不可能有一個完美的對齊,所以通常會建議就所要觀察的國家進行對齊即可。至於想刪除的那些資料列,幾乎都可以當成是所謂的缺失值。 raw <- read_csv("data/vaccinations.csv") dim(raw) ## [1] 99442 16 raw %>% head(20) ## # A tibble: 20 × 16 ## location iso_code date total_vaccinations people_vaccinated ## <chr> <chr> <date> <dbl> <dbl> ## 1 Afghanistan AFG 2021-02-22 0 0 ## 2 Afghanistan AFG 2021-02-23 NA NA ## 3 Afghanistan AFG 2021-02-24 NA NA ## 4 Afghanistan AFG 2021-02-25 NA NA ## 5 Afghanistan AFG 2021-02-26 NA NA ## 6 Afghanistan AFG 2021-02-27 NA NA ## 7 Afghanistan AFG 2021-02-28 8200 8200 ## 8 Afghanistan AFG 2021-03-01 NA NA ## 9 Afghanistan AFG 2021-03-02 NA NA ## 10 Afghanistan AFG 2021-03-03 NA NA ## 11 Afghanistan AFG 2021-03-04 NA NA ## 12 Afghanistan AFG 2021-03-05 NA NA ## 13 Afghanistan AFG 2021-03-06 NA NA ## 14 Afghanistan AFG 2021-03-07 NA NA ## 15 Afghanistan AFG 2021-03-08 NA NA ## 16 Afghanistan AFG 2021-03-09 NA NA ## 17 Afghanistan AFG 2021-03-10 NA NA ## 18 Afghanistan AFG 2021-03-11 NA NA ## 19 Afghanistan AFG 2021-03-12 NA NA ## 20 Afghanistan AFG 2021-03-13 NA NA ## # ℹ 11 more variables: people_fully_vaccinated <dbl>, total_boosters <dbl>, ## # daily_vaccinations_raw <dbl>, daily_vaccinations <dbl>, ## # total_vaccinations_per_hundred <dbl>, people_vaccinated_per_hundred <dbl>, ## # people_fully_vaccinated_per_hundred <dbl>, ## # total_boosters_per_hundred <dbl>, daily_vaccinations_per_million <dbl>, ## # daily_people_vaccinated <dbl>, daily_people_vaccinated_per_hundred <dbl> 10.2.2 按月對齊資料 首先要挑選要拿來做視覺化的資料欄位。這邊所選擇的是people_fully_vaccinated_per_hundred,也就是每百人接種二劑疫苗的人數,相當於接種二劑疫苗的百分比。 接下來便是缺失值處理,如果這個欄位沒有數值的就直接用drop_na()篩除即可。 這個範例希望把該資料視覺化為Y軸為年、X軸為時間的熱區圖。但整個疫情資料橫亙二年多,如果以週為彙整單位的話,那勢必X軸會有近百個資料點。所以打算以「月」為單位來彙整這些資料,因為且資料中也有不少國家缺數週的資料,所以以月為彙整單位是一個權衡後的選擇(仍可以嘗試用週作為彙整單位試試看)。所以,運用了lubridate::floor_date()來將日期資料轉換為月,例如2022-03-12和2022-03-14都會被轉換為2022-03-01。 依照國家與時間群組彙整資料。接下來就依照各國的月份來做彙整(注意,此時會有不少資料同屬於某個月的資料)。彙整的方法是,經過對「日期」(不是對月)做排序後,僅留下第一筆資料,也就是僅留下最接近月份開頭的資料。經由這樣的操作,會使得各國在每個月剛好留下一筆資料,如下面程式的範例輸出。 library(lubridate) fullvaccinated <- raw %>% select(country = location, date, people_fully_vaccinated_per_hundred) %>% drop_na(people_fully_vaccinated_per_hundred) %>% mutate(m = floor_date(date, unit = "month")) %>% group_by(country, m) %>% arrange(date) %>% slice(1) %>% ungroup() %>% select(-date) fullvaccinated %>% head(10) ## # A tibble: 10 × 3 ## country people_fully_vaccinated_per_hundred m ## <chr> <dbl> <date> ## 1 Afghanistan 0.14 2021-05-01 ## 2 Afghanistan 0.36 2021-06-01 ## 3 Afghanistan 0.48 2021-07-01 ## 4 Afghanistan 1.08 2021-08-01 ## 5 Afghanistan 8 2021-11-01 ## 6 Afghanistan 9.42 2021-12-01 ## 7 Afghanistan 9.56 2022-01-01 ## 8 Afghanistan 9.82 2022-02-01 ## 9 Afghanistan 10.8 2022-03-01 ## 10 Afghanistan 11.4 2022-04-01 10.2.3 處理遺漏資料的月份 接下來要處理的是資料紀錄的缺漏值。每個國家登錄資料的時間是很不一致的,某些國家會缺某些月份,或者某些國家是在某年某月以後才開始登記,或者最近沒在登記。但這個範例所要視覺化的資料是接種疫苗的比例,所以即使是現在沒在登記了,但接種比例應列計最後一次資料紀錄的接種比例。 首先我要讓每個國家都有所有月份,這裡應會有某個函式可以做到這件事,但我沒查到這個函式。不過我可以很技巧性地用pivot_wider()(spread())和pivot_longer()(gather())來完成這件事。spread()在展開時對於缺少的資料項可以自動補NA。所以我就只要把資料的月份展開後再gather()回來後,就可以自動讓每個國家所擁有的月份資料一致。以下為spread()後的結果,可以觀察到每一列是一個國家,每一欄是個月份,如果當月都沒資料紀錄,那該月的值就會是缺失值。可以看見缺失值是相當多的,也就是在那段時間都沒有資料紀錄。 fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% head(10) ## # A tibble: 10 × 19 ## country `2020-12-01` `2021-01-01` `2021-02-01` `2021-03-01` `2021-04-01` ## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 Afghanistan NA NA NA NA NA ## 2 Africa NA NA 0 0.02 0.3 ## 3 Albania NA NA 0 NA NA ## 4 Algeria NA NA NA NA NA ## 5 Andorra NA NA NA 1.52 5.8 ## 6 Angola NA NA NA NA NA ## 7 Anguilla NA NA NA NA 5.18 ## 8 Antigua and… NA NA NA NA NA ## 9 Argentina 0 0 0.26 0.69 1.56 ## 10 Armenia NA NA NA NA NA ## # ℹ 13 more variables: `2021-05-01` <dbl>, `2021-06-01` <dbl>, ## # `2021-07-01` <dbl>, `2021-08-01` <dbl>, `2021-09-01` <dbl>, ## # `2021-10-01` <dbl>, `2021-11-01` <dbl>, `2021-12-01` <dbl>, ## # `2022-01-01` <dbl>, `2022-02-01` <dbl>, `2022-03-01` <dbl>, ## # `2022-04-01` <dbl>, `2022-05-01` <dbl> 在以下的範例輸出可以看到gather()後的結果。注意,需要照國家和月份來排序後才便於觀察。 fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% head(20) ## # A tibble: 20 × 3 ## country month perc ## <chr> <chr> <dbl> ## 1 Afghanistan 2020-12-01 NA ## 2 Afghanistan 2021-01-01 NA ## 3 Afghanistan 2021-02-01 NA ## 4 Afghanistan 2021-03-01 NA ## 5 Afghanistan 2021-04-01 NA ## 6 Afghanistan 2021-05-01 0.14 ## 7 Afghanistan 2021-06-01 0.36 ## 8 Afghanistan 2021-07-01 0.48 ## 9 Afghanistan 2021-08-01 1.08 ## 10 Afghanistan 2021-09-01 NA ## 11 Afghanistan 2021-10-01 NA ## 12 Afghanistan 2021-11-01 8 ## 13 Afghanistan 2021-12-01 9.42 ## 14 Afghanistan 2022-01-01 9.56 ## 15 Afghanistan 2022-02-01 9.82 ## 16 Afghanistan 2022-03-01 10.8 ## 17 Afghanistan 2022-04-01 11.4 ## 18 Afghanistan 2022-05-01 NA ## 19 Africa 2020-12-01 NA ## 20 Africa 2021-01-01 NA 接下來是最技巧性的部分。就接種比例而言是個遞增數列,所以如果這個月有紀錄,但下個月沒紀錄(NA),那下個月的資料應以這個月的資料來替代。此時可以用zoo套件的na.locf()來填NA值,其填NA值的規則是用最後一筆非NA值的資料來替代NA值。但要注意的是,因為資料紀錄可能到第六個月或第七個月才開始紀錄,但在前面的月份都沒資料紀錄,也就是說那些NA值沒有更早的資料紀錄權充填充值。原本na.locf()會把這些找不到參考對象的NA值直接刪除,但我們可以在裡面加一個參數使其不會被刪除(na.locf(perc, na.rm = F))。 最後,就把這些沒被刪除也沒得參考的早期資料項,用replace_na()填上0即可。 fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% group_by(country) %>% arrange(month) %>% mutate(perc = zoo::na.locf(perc, na.rm = F)) %>% ungroup() %>% arrange(country, month) %>% head(10) ## # A tibble: 10 × 3 ## country month perc ## <chr> <chr> <dbl> ## 1 Afghanistan 2020-12-01 NA ## 2 Afghanistan 2021-01-01 NA ## 3 Afghanistan 2021-02-01 NA ## 4 Afghanistan 2021-03-01 NA ## 5 Afghanistan 2021-04-01 NA ## 6 Afghanistan 2021-05-01 0.14 ## 7 Afghanistan 2021-06-01 0.36 ## 8 Afghanistan 2021-07-01 0.48 ## 9 Afghanistan 2021-08-01 1.08 ## 10 Afghanistan 2021-09-01 1.08 最後,就把這些沒被刪除也沒得參考的早期資料項,用replace_na()填上0即可。大功告成。 fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% group_by(country) %>% arrange(month) %>% mutate(perc = zoo::na.locf(perc, na.rm = F)) %>% ungroup() %>% arrange(country, month) %>% replace_na(list(perc=0)) %>% arrange(country, month) %>% head(10) ## # A tibble: 10 × 3 ## country month perc ## <chr> <chr> <dbl> ## 1 Afghanistan 2020-12-01 0 ## 2 Afghanistan 2021-01-01 0 ## 3 Afghanistan 2021-02-01 0 ## 4 Afghanistan 2021-03-01 0 ## 5 Afghanistan 2021-04-01 0 ## 6 Afghanistan 2021-05-01 0.14 ## 7 Afghanistan 2021-06-01 0.36 ## 8 Afghanistan 2021-07-01 0.48 ## 9 Afghanistan 2021-08-01 1.08 ## 10 Afghanistan 2021-09-01 1.08 10.2.4 完整程式碼 library(lubridate) raw <- read_csv("data/vaccinations.csv") fullvaccinated <- raw %>% select(country = location, date, people_fully_vaccinated_per_hundred) %>% drop_na(people_fully_vaccinated_per_hundred) %>% mutate(m = floor_date(date, unit = "month")) %>% group_by(country, m) %>% arrange(date) %>% slice(1) %>% ungroup() %>% select(-date) vperc_by_month <- fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% group_by(country) %>% arrange(month) %>% mutate(perc = zoo::na.locf(perc, na.rm = F)) %>% ungroup() %>% arrange(country, month) %>% replace_na(list(perc=0)) 如何將這份疫苗施打比例的資料做視覺化,請見視覺化的章節?? "],["tm.html", "Chapter 11 Text Processing", " Chapter 11 Text Processing "],["trump.html", "Chapter 12 Trump’s tweets 12.1 Loading data 12.2 Cleaning data 12.3 Visual Exploring 12.4 Keyness", " Chapter 12 Trump’s tweets 本範例取材自David Robinson的blog文章「Text analysis of Trump’s tweets confirms he writes only the (angrier) Android half」。David Robinson是「Text Mining with R」的共同作者, 可參考該書籍上的範例「7 Case study: comparing Twitter archives | Text Mining with R (tidytextmining.com)」。 這篇文章探討了美國前總統川普(Donald Trump)的推特帳號。有一個假設聲稱,當川普在推特上祝福奧運會選手好運時,他使用的是 iPhone ;當他侮辱競爭對手時,他通常是用 Android 來發推。文章作者想要透過數據分析來探討這個假設的真實性。 作者使用了文字探勘和情感分析等技術,從川普的推特內容入手,分析了不同時間和使用不同手機所發的推文。結果顯示,Android 和 iPhone 所發的推文顯然是由不同的人所發,他們在使用標籤、連結和轉推的方式上也不同。此外,Android 的推文更加憤怒和負面,而 iPhone 的推文則傾向於發佈善意的公告和圖片。整體而言,這些分析讓我們能夠區分出競選團隊所發佈的推文(iPhone)和川普自己所發佈的推文(Android)。 這個教學案例涵蓋了使用 R 語言進行社群輿論資料(tweets)的探索性分析的各種技術和工具。除了使用常見的資料處理套件 dplyr 和視覺化套件 ggplot 外,還使用了文字處理套件 stringr 和時間處理套件 lubridate,以及關鍵字分析技術 keyness。 透過這個教學案例,學習者可以掌握如何: 使用 dplyr 和 ggplot 進行資料處理和視覺化。 使用 stringr 和 extract() 進行文字處理,例如從文本中提取關鍵字。 使用 lubridate 進行時間處理,例如轉換時間格式和提取時間戳記。 學習關鍵字分析技術 keyness,以找出在不同文本之間對彼此相對突出的關鍵字。 這段程式碼是用來設計 ggplot2 的主題風格。作者首先定義了一個名為 th 的自訂主題,基於 ggplot2 的 theme_minimal() 主題,並設置了不同元素的字型、大小和樣式等屬性。接著,作者定義了一個名為 new_style() 的函數,用於更精細的主題風格設置,包括圖表標題、圖例、軸標籤和刻度標籤等。透過這些設置,可以讓 ggplot2 圖表更具有視覺吸引力,並強調重要的圖形元素,使圖表更加清晰易懂。這兩種方式都可以用來定義主題 library(tidyverse) # library(lubridate) # has been included in tidyverse options(scipen = 999) # Self-designed theme th <- theme_minimal() + theme(plot.title = element_text(size=24, face="bold"), legend.title = element_text(size=18, face="bold"), legend.text = element_text(size=18), axis.title = element_text(hjust=0.5, size=18, face="italic"), axis.text = element_text(size=18) ) # more settings new_style <- function() { font <- "Helvetica" theme( plot.title = element_text(family=font, size=28, face="bold"), plot.subtitle = element_text(family=font, size=22, margin=margin(9,0,9,0)), plot.caption = element_blank(), legend.position = "top", legend.text.align = 0, legend.background = element_blank(), # legend.title = element_blank(), legend.key = element_blank(), legend.text = element_text(family=font, size=18, color="#222222"), axis.text = element_text(family=font, size=18, color="#222222"), axis.text.x = element_text(margin=margin(5, b = 10)), axis.ticks = element_blank(), axis.line = element_blank(), panel.grid.minor = element_blank(), panel.grid.major.y = element_line(color="#cbcbcb"), panel.grid.major.x = element_blank(), panel.background = element_blank(), strip.background = element_rect(fill="white"), strip.text = element_text(size = 22, hjust = 0) ) } 12.1 Loading data load(url("http://varianceexplained.org/files/trump_tweets_df.rda")) dim(trump_tweets_df) ## [1] 1512 16 names(trump_tweets_df) ## [1] "text" "favorited" "favoriteCount" "replyToSN" ## [5] "created" "truncated" "replyToSID" "id" ## [9] "replyToUID" "statusSource" "screenName" "retweetCount" ## [13] "isRetweet" "retweeted" "longitude" "latitude" trump_tweets_df %>% select(id, text, created, favoriteCount, retweetCount, statusSource) %>% head(10) ## # A tibble: 10 × 6 ## id text created favoriteCount retweetCount statusSource ## <chr> <chr> <dttm> <dbl> <dbl> <chr> ## 1 7626698825… "My … 2016-08-08 15:20:44 9214 3107 "<a href=\\"… ## 2 7626415954… "Joi… 2016-08-08 13:28:20 6981 2390 "<a href=\\"… ## 3 7624396589… "#IC… 2016-08-08 00:05:54 15724 6691 "<a href=\\"… ## 4 7624253718… "Mic… 2016-08-07 23:09:08 19837 6402 "<a href=\\"… ## 5 7624008698… "The… 2016-08-07 21:31:46 34051 11717 "<a href=\\"… ## 6 7622845333… "I s… 2016-08-07 13:49:29 29831 9892 "<a href=\\"… ## 7 7621109187… "Tha… 2016-08-07 02:19:37 19223 5784 "<a href=\\"… ## 8 7621069044… ".@L… 2016-08-07 02:03:39 19543 7930 "<a href=\\"… ## 9 7621044117… "I a… 2016-08-07 01:53:45 75488 24663 "<a href=\\"… ## 10 7620164261… "#Cr… 2016-08-06 20:04:08 23661 7903 "<a href=\\"… 12.2 Cleaning data 這段程式碼的目的是從一個叫做trump_tweets_df的data.frame中,選擇幾個欄位並且進行過濾和轉換,最後將結果存儲在一個名為tweets的新data.frame中。 extract()函數用於從statusSource欄位中提取出一個新欄位source,該欄位包含了statusSource中的Twitter for iPhone和Twitter for Android這兩種可能的字串。這裡使用了一個正則表達式Twitter for (.*?)<,該表達式表示提取出以Twitter for開頭,且在<符號之前的任意字元序列,並將結果存儲在名為source的新欄位中。 最後,filter()函數用於過濾出source欄位中值為iPhone或Android的記錄,並將過濾結果存儲在tweets資料框中。 # tidyr::extract() # stringr::str_replace trump_tweets_df$statusSource[1] ## [1] "<a href=\\"http://twitter.com/download/android\\" rel=\\"nofollow\\">Twitter for Android</a>" tweets <- trump_tweets_df %>% select(id, statusSource, text, created) %>% # mutate(source = str_replace(statusSource, # ".*Twitter for (.*?)<.*", "\\\\1")) %>% # mutate(source = str_extract(statusSource, 'Twitter for (.*?)<')) %>% View extract(statusSource, "source", "Twitter for (.*?)<") %>% filter(source %in% c("iPhone", "Android")) # Using stringr::str_replace() to mutate a new source variable, replacing tidyr:: # str(tweets) Practice. 有時候我們會希望避免用太多種套件來寫程式,例如上面的extract()便屬於tidyr的函式。事實上我們可以用stringr::str_replace()來達到這個目的。嘗試寫寫看?或者嘗試問ChatGPT看看? Prompt. 我如果希望用stringr::str_replace來達到extract(statusSource, \"source\", \"Twitter for (.*?)<\") %>%的功能,我該怎麼寫? mutate(source = stringr::str_replace(statusSource, \".*Twitter for (.*?)<.*\", \"\\\\1\")) %>% 12.3 Visual Exploring 12.3.1 Productivity by time hour = hour(with_tz(created, \"EST\"))這段程式碼使用了with_tz()函數將created欄位的時區轉換為\"EST\"所對應的時區,然後使用hour()函數提取出該日期時間對應的小時數,並將結果存儲在hour變數中。該程式碼會將例如\"2023-04-12 12:30:00\"轉換為美國東部標準時間對應的小時數,即12(因為12點30分所在的小時是12點)。他所取出的並非某日的12時,他就只是取出是12時。 toplot1和toplot2的差異在於對source欄位的分組處理不同。具體來說,toplot1中沒有對source欄位進行分組,而是在後面使用mutate()函數將計數結果中的n列和sum(n)相除,得到了百分比列percent。這導致計算的是整個資料集中的hour和source的計數和百分比。相反,toplot2中使用了group_by()函數將source欄位進行分組處理,並在後面使用mutate()函數和ungroup()函數計算了每個source和hour的計數和百分比,即分別計算了iPhone和Android的計數和百分比。因此,toplot1和toplot2的計算結果是不同的,前者的計算結果中包含了整個資料集的計數和百分比,而後者的計算結果則分別對iPhone和Android進行了計數和百分比的計算。 程式碼使用了ggplot()函數創建了一個ggplot2物件,並使用aes()函數設置了hour和percent欄位作為X軸和Y軸的變數,並且設置color = source表示以source欄位的值作為不同群組(iPhone vs. Android)折線的顏色。接著,程式碼使用geom_line()函數添加折線到圖中,設置了折線的粗細為1。使用scale_color_manual()函數設置了圖例的名稱為Phone System,標籤依照分組指定為為Android和iPhone,顏色分別為royalblue和gold,並使用scale_y_continuous()函數設置了Y軸刻度標籤的格式為百分比形式,即0%到100%之間的數值。注意:percent_format()並非ggplot2既有的函式,要另外安裝並匯入library(scales)。 library(scales) # for percent_format() # lubridate::hour() # lubridate::with_tz() # scales::percent_format() toplot1 <- tweets %>% count(source, hour = hour(with_tz(created, "EST"))) %>% # group_by(source) %>% mutate(percent = n / sum(n)) # ungroup() %>% toplot2 <- tweets %>% count(source, hour = hour(with_tz(created, "EST"))) %>% group_by(source) %>% mutate(percent = n / sum(n)) %>% ungroup() p1 <- toplot1 %>% ggplot() + aes(hour, percent, color = source) + geom_line(linewidth = 1) + scale_color_manual(name = "Phone System", labels = c("Android", "iPhone"), values = c("royalblue", "gold")) + scale_y_continuous(labels = percent_format()) + labs(x = "Hour of day (EST)", y = "% of tweets", color = "") + theme_minimal() p2 <- toplot2 %>% ggplot() + aes(hour, percent, color = source) + geom_line(linewidth = 1) + scale_color_manual(name = "Phone System", labels = c("Android", "iPhone"), values = c("royalblue", "gold")) + scale_y_continuous(labels = percent_format()) + labs(x = "Hour of day (EST)", y = "% of tweets", color = "") + theme_minimal() cowplot::plot_grid( p1, NULL, p2, labels = c("(a) Normalized by all", "", "(b) Normalized in group"), nrow = 1, rel_widths = c(1, 0.1, 1) ) 12.3.2 Tweeting with figures 首先,filter()函數用於從tweets資料框中過濾出不以\"字符開頭的推文,即過濾掉引號開頭的推文。這裡使用了!str_detect(text, '^\"')表示將text欄位中以\"字符開頭的推文過濾掉,即保留那些不以引號開頭的推文。'^\"'是一個正規表示式(Regular Expression),'^'符號代表字串的開頭。 接著,mutate()函數用於在tweets資料框中添加一個新欄位picture,該欄位根據推文中是否包含t.co字串來判斷推文中是否包含圖片或者連結。具體來說,這裡使用了if_else()函數,如果text欄位中包含t.co字串,則將picture欄位設置為\"Picture/link\",否則設置為\"No picture/link\"。 最後,使用count()函數計算tweets資料框中每個source和picture的記錄數,並將結果存儲在toplot資料框中。最終的結果是一個展示tweets資料框中source和picture的記錄數的資料框,其中picture欄位表示推文中是否包含圖片或連結。 p1和p2的主要區別在於barplot的呈現方式不同。具體來說: p1中使用了position=\"stack\"的參數,表示將不同分組的bar疊加在一起,以展示每個source的總推文數量,並且bar的寬度設置為0.5(使用width參數),使得bar之間有一定的間隔。這種方式可以方便地比較不同source的總推文數量,並且可以看到每個source中有多少推文包含圖片或連結。 p2中使用了position=\"dodge\"的參數,表示將不同分組的bar並排放置,以便比較不同source中包含或不包含圖片或連結的推文數量。這種方式可以顯示出每個source中有多少推文包含或不包含圖片或連結,並且可以清楚地比較不同source之間的差異。 toplot <- tweets %>% filter(!str_detect(text, '^"')) %>% mutate(picture = if_else(str_detect(text, "t.co"), "Picture/link", "No picture/link")) %>% count(source, picture) p1 <- toplot %>% ggplot() + aes(source, n, fill = picture) + geom_col(position="stack", width = 0.5) + scale_fill_manual(name = "With Picture/link?", labels = c("No", "Yes"), values = c("gold", "royalblue")) + labs(x = "", y = "Number of tweets", fill = "") + theme_minimal() p2 <- toplot %>% ggplot() + aes(source, n, fill = picture) + geom_col(position="dodge") + scale_fill_manual(name = "With Picture/link?", labels = c("No", "Yes"), values = c("gold", "royalblue")) + labs(x = "", y = "Number of tweets", fill = "") + theme_minimal() cowplot::plot_grid( p1, NULL, p2, labels = c("(a) Stacked", "", "(b) Dodged"), nrow = 1, rel_widths = c(1, 0.1, 1) ) 12.4 Keyness Keyness是一種文本分析方法,用於比較兩個文本集合中某些詞彙的使用頻率(例如我們要比較用iPhone和Android兩支手機所發表的內容是否有文字上的差異),以評估這些詞彙在不同文本集合中的重要性或關鍵程度。Keyness分析通常用於比較兩個文本集合,其中一個是目標文本集合,另一個是參照文本集合,並且通常會將這些文本集合中的單詞或詞彙按照出現頻率排序。 使用filter()函數過濾出不以\"字符開頭的推文,即過濾掉引號開頭的推文,將結果存儲在tweets資料框中。 使用mutate()函數將推文中的URL和&字符替換為空白字符,即將推文中的網址和HTML實體轉換為正常的字符,方便後續的文本處理。 使用mutate()函數將tweets資料框中的text欄位拆分為單詞序列,存儲在word欄位中。這裡使用了str_split()函數將每個推文按照空格進行拆分,得到一個由單詞序列組成的列表,然後將這個列表存儲在word欄位中。 使用select()函數選擇需要的欄位,包括tweets資料框中的id、text和word欄位,以及tweets資料框中的所有其他欄位。 使用unnest()函數將word欄位中的單詞序列展開成一個單詞資料框,每個單詞對應一行記錄。 使用filter()函數過濾掉停用詞和非英文字符,其中停用詞(stop words)列表存儲在stop_words資料框中,通過!word %in% stop_words$word條件過濾掉停用詞,並且通過str_detect(word, \"[a-z]\")條件過濾掉不包含英文字母的單詞。最終,將結果存儲在tweets資料框中。 停用詞(stop words)指的是在文本中出現頻率非常高,但對於文本的內容和意義貢獻不大的詞彙。這些詞彙通常是一些常見的介詞、連詞、代詞、冠詞、助動詞等,例如”the”、“and”、“a”、“in”等。在文本分析中,停用詞通常被過濾掉,以便更好地捕捉文本中的主題和意義。在中文文本分析中,常見的停用詞包括一些虛詞、代詞、介詞、助詞等,例如”的”、“是”、“在”、“和”、“了”、“一”等。這些詞在中文文本中出現的頻率非常高,但對於文本的內容和意義貢獻不大,因此在文本分析中通常被過濾掉。 停用詞的列表通常是由人為構建的,根據具體的文本分析任務和文本的特徵來決定。在自然語言處理中,通常會使用預先定義好的停用詞列表,例如英文中的NLTK(Natural Language Toolkit)庫中就包含了一個預先定義好的停用詞列表。 在進行文本分析時,過濾掉停用詞可以幫助減少文本資料的雜訊和冗余訊息,提高分析的準確性和效率。但是,在某些特定的文本分析任務中,停用詞可能具有一定的重要性,例如情感分析中的否定詞(如”not”)可能對情感分析的結果產生重要的影響,因此需要特殊處理。如果進行的是網絡舆情分析,那麼一些特定的網絡用語和表情符號可能也需要被加入停用詞列表中,以避免對分析結果產生干擾。 unnest_tokens()和mutate()函數都可以用於將文本data.frame中的文本數據進行分詞處理,但它們的實現方式有所不同。mutate()函數使用str_split()函數將每個文本按照指定的分隔符(如上述程式碼即以空白\" \"做為分隔符號)進行拆分,得到一個由單詞序列組成的list。這樣做的缺點是無法同時將文本中的標點符號、空格、停用詞等過濾掉,因此在進行文本分析時需要額外進行過濾處理。 unnest_tokens()函數則使用更靈活的正則表達式(regex)來指定單詞的分割方式,可以將文本中的單詞、標點符號、空格等都分割開來,並且可以通過指定特定的正則表達式來過濾停用詞、非英文字符等。unnest_tokens()函數還可以將分割後的單詞list展開成一個單詞data.frame,每個單詞對應一行記錄,這樣更容易進行後續的文本分析和可視化。在unnest_tokens(word, text, token = \"regex\", pattern = \"[^A-Za-z\\\\d#@']\") %>%中,word表示新建的單詞欄位的名稱,text表示原始文本欄位的名稱,token表示使用的分割方式,這裡指定為正則表達式;pattern則是指定的正則表達式,其中[^A-Za-z\\\\d#@']表示匹配不屬於字母、數字、@、#、’的任意字符,即過濾掉非英文字符和一些標點符號。 library(tidytext) # unnest_tokens() library(stringr) # str_detect(), str_replace_all() # View(test) stop_words$word ## [1] "a" "a's" "able" "about" ## [5] "above" "according" "accordingly" "across" ## [9] "actually" "after" "afterwards" "again" ## [13] "against" "ain't" "all" "allow" ## [17] "allows" "almost" "alone" "along" ## [21] "already" "also" "although" "always" ## [25] "am" "among" "amongst" "an" ## [29] "and" "another" "any" "anybody" ## [33] "anyhow" "anyone" "anything" "anyway" ## [37] "anyways" "anywhere" "apart" "appear" ## [41] "appreciate" "appropriate" "are" "aren't" ## [45] "around" "as" "aside" "ask" ## [49] "asking" "associated" "at" "available" ## [53] "away" "awfully" "b" "be" ## [57] "became" "because" "become" "becomes" ## [61] "becoming" "been" "before" "beforehand" ## [65] "behind" "being" "believe" "below" ## [69] "beside" "besides" "best" "better" ## [73] "between" "beyond" "both" "brief" ## [77] "but" "by" "c" "c'mon" ## [81] "c's" "came" "can" "can't" ## [85] "cannot" "cant" "cause" "causes" ## [89] "certain" "certainly" "changes" "clearly" ## [93] "co" "com" "come" "comes" ## [97] "concerning" "consequently" "consider" "considering" ## [101] "contain" "containing" "contains" "corresponding" ## [105] "could" "couldn't" "course" "currently" ## [109] "d" "definitely" "described" "despite" ## [113] "did" "didn't" "different" "do" ## [117] "does" "doesn't" "doing" "don't" ## [121] "done" "down" "downwards" "during" ## [125] "e" "each" "edu" "eg" ## [129] "eight" "either" "else" "elsewhere" ## [133] "enough" "entirely" "especially" "et" ## [137] "etc" "even" "ever" "every" ## [141] "everybody" "everyone" "everything" "everywhere" ## [145] "ex" "exactly" "example" "except" ## [149] "f" "far" "few" "fifth" ## [153] "first" "five" "followed" "following" ## [157] "follows" "for" "former" "formerly" ## [161] "forth" "four" "from" "further" ## [165] "furthermore" "g" "get" "gets" ## [169] "getting" "given" "gives" "go" ## [173] "goes" "going" "gone" "got" ## [177] "gotten" "greetings" "h" "had" ## [181] "hadn't" "happens" "hardly" "has" ## [185] "hasn't" "have" "haven't" "having" ## [189] "he" "he's" "hello" "help" ## [193] "hence" "her" "here" "here's" ## [197] "hereafter" "hereby" "herein" "hereupon" ## [201] "hers" "herself" "hi" "him" ## [205] "himself" "his" "hither" "hopefully" ## [209] "how" "howbeit" "however" "i" ## [213] "i'd" "i'll" "i'm" "i've" ## [217] "ie" "if" "ignored" "immediate" ## [221] "in" "inasmuch" "inc" "indeed" ## [225] "indicate" "indicated" "indicates" "inner" ## [229] "insofar" "instead" "into" "inward" ## [233] "is" "isn't" "it" "it'd" ## [237] "it'll" "it's" "its" "itself" ## [241] "j" "just" "k" "keep" ## [245] "keeps" "kept" "know" "knows" ## [249] "known" "l" "last" "lately" ## [253] "later" "latter" "latterly" "least" ## [257] "less" "lest" "let" "let's" ## [261] "like" "liked" "likely" "little" ## [265] "look" "looking" "looks" "ltd" ## [269] "m" "mainly" "many" "may" ## [273] "maybe" "me" "mean" "meanwhile" ## [277] "merely" "might" "more" "moreover" ## [281] "most" "mostly" "much" "must" ## [285] "my" "myself" "n" "name" ## [289] "namely" "nd" "near" "nearly" ## [293] "necessary" "need" "needs" "neither" ## [297] "never" "nevertheless" "new" "next" ## [301] "nine" "no" "nobody" "non" ## [305] "none" "noone" "nor" "normally" ## [309] "not" "nothing" "novel" "now" ## [313] "nowhere" "o" "obviously" "of" ## [317] "off" "often" "oh" "ok" ## [321] "okay" "old" "on" "once" ## [325] "one" "ones" "only" "onto" ## [329] "or" "other" "others" "otherwise" ## [333] "ought" "our" "ours" "ourselves" ## [337] "out" "outside" "over" "overall" ## [341] "own" "p" "particular" "particularly" ## [345] "per" "perhaps" "placed" "please" ## [349] "plus" "possible" "presumably" "probably" ## [353] "provides" "q" "que" "quite" ## [357] "qv" "r" "rather" "rd" ## [361] "re" "really" "reasonably" "regarding" ## [365] "regardless" "regards" "relatively" "respectively" ## [369] "right" "s" "said" "same" ## [373] "saw" "say" "saying" "says" ## [377] "second" "secondly" "see" "seeing" ## [381] "seem" "seemed" "seeming" "seems" ## [385] "seen" "self" "selves" "sensible" ## [389] "sent" "serious" "seriously" "seven" ## [393] "several" "shall" "she" "should" ## [397] "shouldn't" "since" "six" "so" ## [401] "some" "somebody" "somehow" "someone" ## [405] "something" "sometime" "sometimes" "somewhat" ## [409] "somewhere" "soon" "sorry" "specified" ## [413] "specify" "specifying" "still" "sub" ## [417] "such" "sup" "sure" "t" ## [421] "t's" "take" "taken" "tell" ## [425] "tends" "th" "than" "thank" ## [429] "thanks" "thanx" "that" "that's" ## [433] "thats" "the" "their" "theirs" ## [437] "them" "themselves" "then" "thence" ## [441] "there" "there's" "thereafter" "thereby" ## [445] "therefore" "therein" "theres" "thereupon" ## [449] "these" "they" "they'd" "they'll" ## [453] "they're" "they've" "think" "third" ## [457] "this" "thorough" "thoroughly" "those" ## [461] "though" "three" "through" "throughout" ## [465] "thru" "thus" "to" "together" ## [469] "too" "took" "toward" "towards" ## [473] "tried" "tries" "truly" "try" ## [477] "trying" "twice" "two" "u" ## [481] "un" "under" "unfortunately" "unless" ## [485] "unlikely" "until" "unto" "up" ## [489] "upon" "us" "use" "used" ## [493] "useful" "uses" "using" "usually" ## [497] "uucp" "v" "value" "various" ## [501] "very" "via" "viz" "vs" ## [505] "w" "want" "wants" "was" ## [509] "wasn't" "way" "we" "we'd" ## [513] "we'll" "we're" "we've" "welcome" ## [517] "well" "went" "were" "weren't" ## [521] "what" "what's" "whatever" "when" ## [525] "whence" "whenever" "where" "where's" ## [529] "whereafter" "whereas" "whereby" "wherein" ## [533] "whereupon" "wherever" "whether" "which" ## [537] "while" "whither" "who" "who's" ## [541] "whoever" "whole" "whom" "whose" ## [545] "why" "will" "willing" "wish" ## [549] "with" "within" "without" "won't" ## [553] "wonder" "would" "would" "wouldn't" ## [557] "x" "y" "yes" "yet" ## [561] "you" "you'd" "you'll" "you're" ## [565] "you've" "your" "yours" "yourself" ## [569] "yourselves" "z" "zero" "i" ## [573] "me" "my" "myself" "we" ## [577] "our" "ours" "ourselves" "you" ## [581] "your" "yours" "yourself" "yourselves" ## [585] "he" "him" "his" "himself" ## [589] "she" "her" "hers" "herself" ## [593] "it" "its" "itself" "they" ## [597] "them" "their" "theirs" "themselves" ## [601] "what" "which" "who" "whom" ## [605] "this" "that" "these" "those" ## [609] "am" "is" "are" "was" ## [613] "were" "be" "been" "being" ## [617] "have" "has" "had" "having" ## [621] "do" "does" "did" "doing" ## [625] "would" "should" "could" "ought" ## [629] "i'm" "you're" "he's" "she's" ## [633] "it's" "we're" "they're" "i've" ## [637] "you've" "we've" "they've" "i'd" ## [641] "you'd" "he'd" "she'd" "we'd" ## [645] "they'd" "i'll" "you'll" "he'll" ## [649] "she'll" "we'll" "they'll" "isn't" ## [653] "aren't" "wasn't" "weren't" "hasn't" ## [657] "haven't" "hadn't" "doesn't" "don't" ## [661] "didn't" "won't" "wouldn't" "shan't" ## [665] "shouldn't" "can't" "cannot" "couldn't" ## [669] "mustn't" "let's" "that's" "who's" ## [673] "what's" "here's" "there's" "when's" ## [677] "where's" "why's" "how's" "a" ## [681] "an" "the" "and" "but" ## [685] "if" "or" "because" "as" ## [689] "until" "while" "of" "at" ## [693] "by" "for" "with" "about" ## [697] "against" "between" "into" "through" ## [701] "during" "before" "after" "above" ## [705] "below" "to" "from" "up" ## [709] "down" "in" "out" "on" ## [713] "off" "over" "under" "again" ## [717] "further" "then" "once" "here" ## [721] "there" "when" "where" "why" ## [725] "how" "all" "any" "both" ## [729] "each" "few" "more" "most" ## [733] "other" "some" "such" "no" ## [737] "nor" "not" "only" "own" ## [741] "same" "so" "than" "too" ## [745] "very" "a" "about" "above" ## [749] "across" "after" "again" "against" ## [753] "all" "almost" "alone" "along" ## [757] "already" "also" "although" "always" ## [761] "among" "an" "and" "another" ## [765] "any" "anybody" "anyone" "anything" ## [769] "anywhere" "are" "area" "areas" ## [773] "around" "as" "ask" "asked" ## [777] "asking" "asks" "at" "away" ## [781] "back" "backed" "backing" "backs" ## [785] "be" "became" "because" "become" ## [789] "becomes" "been" "before" "began" ## [793] "behind" "being" "beings" "best" ## [797] "better" "between" "big" "both" ## [801] "but" "by" "came" "can" ## [805] "cannot" "case" "cases" "certain" ## [809] "certainly" "clear" "clearly" "come" ## [813] "could" "did" "differ" "different" ## [817] "differently" "do" "does" "done" ## [821] "down" "down" "downed" "downing" ## [825] "downs" "during" "each" "early" ## [829] "either" "end" "ended" "ending" ## [833] "ends" "enough" "even" "evenly" ## [837] "ever" "every" "everybody" "everyone" ## [841] "everything" "everywhere" "face" "faces" ## [845] "fact" "facts" "far" "felt" ## [849] "few" "find" "finds" "first" ## [853] "for" "four" "from" "full" ## [857] "fully" "further" "furthered" "furthering" ## [861] "furthers" "gave" "general" "generally" ## [865] "get" "gets" "give" "given" ## [869] "gives" "go" "going" "good" ## [873] "goods" "got" "great" "greater" ## [877] "greatest" "group" "grouped" "grouping" ## [881] "groups" "had" "has" "have" ## [885] "having" "he" "her" "here" ## [889] "herself" "high" "high" "high" ## [893] "higher" "highest" "him" "himself" ## [897] "his" "how" "however" "i" ## [901] "if" "important" "in" "interest" ## [905] "interested" "interesting" "interests" "into" ## [909] "is" "it" "its" "itself" ## [913] "just" "keep" "keeps" "kind" ## [917] "knew" "know" "known" "knows" ## [921] "large" "largely" "last" "later" ## [925] "latest" "least" "less" "let" ## [929] "lets" "like" "likely" "long" ## [933] "longer" "longest" "made" "make" ## [937] "making" "man" "many" "may" ## [941] "me" "member" "members" "men" ## [945] "might" "more" "most" "mostly" ## [949] "mr" "mrs" "much" "must" ## [953] "my" "myself" "necessary" "need" ## [957] "needed" "needing" "needs" "never" ## [961] "new" "new" "newer" "newest" ## [965] "next" "no" "nobody" "non" ## [969] "noone" "not" "nothing" "now" ## [973] "nowhere" "number" "numbers" "of" ## [977] "off" "often" "old" "older" ## [981] "oldest" "on" "once" "one" ## [985] "only" "open" "opened" "opening" ## [989] "opens" "or" "order" "ordered" ## [993] "ordering" "orders" "other" "others" ## [997] "our" "out" "over" "part" ## [1001] "parted" "parting" "parts" "per" ## [1005] "perhaps" "place" "places" "point" ## [1009] "pointed" "pointing" "points" "possible" ## [1013] "present" "presented" "presenting" "presents" ## [1017] "problem" "problems" "put" "puts" ## [1021] "quite" "rather" "really" "right" ## [1025] "right" "room" "rooms" "said" ## [1029] "same" "saw" "say" "says" ## [1033] "second" "seconds" "see" "seem" ## [1037] "seemed" "seeming" "seems" "sees" ## [1041] "several" "shall" "she" "should" ## [1045] "show" "showed" "showing" "shows" ## [1049] "side" "sides" "since" "small" ## [1053] "smaller" "smallest" "some" "somebody" ## [1057] "someone" "something" "somewhere" "state" ## [1061] "states" "still" "still" "such" ## [1065] "sure" "take" "taken" "than" ## [1069] "that" "the" "their" "them" ## [1073] "then" "there" "therefore" "these" ## [1077] "they" "thing" "things" "think" ## [1081] "thinks" "this" "those" "though" ## [1085] "thought" "thoughts" "three" "through" ## [1089] "thus" "to" "today" "together" ## [1093] "too" "took" "toward" "turn" ## [1097] "turned" "turning" "turns" "two" ## [1101] "under" "until" "up" "upon" ## [1105] "us" "use" "used" "uses" ## [1109] "very" "want" "wanted" "wanting" ## [1113] "wants" "was" "way" "ways" ## [1117] "we" "well" "wells" "went" ## [1121] "were" "what" "when" "where" ## [1125] "whether" "which" "while" "who" ## [1129] "whole" "whose" "why" "will" ## [1133] "with" "within" "without" "work" ## [1137] "worked" "working" "works" "would" ## [1141] "year" "years" "yet" "you" ## [1145] "young" "younger" "youngest" "your" ## [1149] "yours" tweet_words <- tweets %>% filter(!str_detect(text, '^"')) %>% mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\\\d]+|&", "")) %>% # unnest_tokens(word, text) %>% # unnest_tokens(word, text, token = "regex", pattern = "[^A-Za-z\\\\d#@']") %>% mutate(word = str_split(text, " ")) %>% select(id, text, word, everything()) %>% unnest(word) %>% filter(!word %in% stop_words$word) %>% filter(str_detect(word, "[a-z]")) # View(tweet_words) 這段程式碼用於分析文本數據中出現頻率最高的單詞(word),並使用barplot進行視覺化呈現。具體來說,這段程式碼實現了以下幾個步驟: 使用count()函數對data.frame中的單詞word進行計數,得到每個單詞出現的次數,並按照次數降序排列。 使用head()函數選擇出現次數最高的前20個單詞,並用mutate()函數將這20個單詞按照出現次數重新排序(注意reorder()的寫法)。 geom_col()函數用於繪製barplot,coord_flip()函數用於將x軸和y軸互換,以便更好地顯示barplot。 tweet_words %>% count(word, sort = TRUE) %>% head(20) %>% mutate(word = reorder(word, n)) %>% ggplot(aes(word, n)) + geom_col(fill = "royalblue") + ylab("Occurrences") + coord_flip() + theme_minimal() + theme(axis.text = element_text(size=10)) 12.4.1 Log-likelihood ratio word_by_source的程式碼用於將單詞按照來源(source)進行分類,並統計每個來源中每個單詞出現的次數: 使用count()函數對單詞資料框中的單詞按照來源進行計數,並且將計數結果按照單詞和來源兩個變數進行分組。並使用filter()函數過濾掉在所有來源中出現次數少於5次的單詞。 使用pivot_wider()函數將分組後的資料框進行重構,將每個來源的單詞出現次數作為新欄(也就是把iPhone和Android展開成為欄位名稱),以便更方便地進行後續分析和可視化。這裡的names_from參數指定重構後的欄位名稱來自原來的source欄位,values_from參數指定要重構的值來自原來的count欄位,values_fill參數指定在重構後的資料框中缺失值的填充值,這裡設置為0。 android_iphone_ratios這段程式碼用於計算每個單詞在Android和iPhone兩個來源中的keyness的log likelihood ratio。具體來說,這段程式碼實現了以下幾個步驟: 從上一步驟得到的word_by_source資料框中,選擇了Android和iPhone兩個來源的單詞出現次數資訊。 對Android和iPhone兩個來源的單詞出現次數進行標準化處理,以便進行後續的keyness計算。具體來說,這裡使用了Laplace平滑處理(add-k smoothing),將每個來源的所有單詞出現次數都增加1,然後再將這些出現次數除以各自來源的總次數加1,得到每個單詞在Android和iPhone兩個來源中的出現概率。 對Android和iPhone兩個來源中的每個單詞,分別計算其在Android和iPhone兩個來源中的keyness log ratio。這裡使用了常見的對數比值(log ratio)方法,計算Android來源中單詞出現概率和iPhone來源中單詞出現概率的比值的對數,以此來衡量單詞在Android和iPhone兩個來源中的關鍵性差異。 將計算得到的log ratio值按照降序排列,以便進一步進行分析和可視化。 test <- tweet_words %>% count(word, source) %>% filter(n >= 5) %>% pivot_wider(names_from = source, values_from = n, values_fill = 0) # View(test) word_by_source <- tweet_words %>% count(word, source) %>% filter(n >= 5) %>% pivot_wider(names_from = source, values_from = n, values_fill = 0) %>% # spread(source, n, fill = 0) %>% ungroup() sum(word_by_source$iPhone) ## [1] 1383 sum(word_by_source$Android) ## [1] 2132 android_iphone_ratios <- word_by_source %>% mutate(iPhone = (iPhone+1)/sum(iPhone+1)) %>% mutate(Android = (Android+1)/sum(Android+1)) %>% # mutate_at(.cols = vars(iPhone, Android), # .funs = funs((. + 1) / sum(. + 1))) %>% mutate(logratio = log2(Android / iPhone)) %>% arrange(desc(logratio)) 這兩行分子分母加1的處理稱為拉普拉斯平滑。mutate(iPhone = (iPhone+1)/sum(iPhone+1)) %>% 拉普拉斯平滑(add-k smoothing)是一種用於處理計數資料中零值問題的技巧,其主要目的是將出現次數為零的類別在計算機率時賦予一個非零的機率值,以避免出現無限大的情況,從而影響後續的計算結果。 在這段程式碼中,拉普拉斯平滑的目的是對每個單詞在Android和iPhone兩個來源中的出現次數進行標準化處理,以便進行後續的keyness計算。這是因為在標準化的計算中,如果某個來源中出現次數為0的單詞,則計算出來的概率值會為0,而這樣的結果可能會產生一些問題,例如無法取log或分母為零的情形。因此,為了避免這種問題,需要對每個單詞在Android和iPhone兩個來源中的出現次數進行拉普拉斯平滑處理,使得每個單詞在Android和iPhone兩個來源中的出現概率都能夠有一個非零的值,從而進行後續的計算和分析。 12.4.2 Plotting keyness 這段程式碼是用來繪製Android和iPhone兩個來源中關鍵性差異最大的單詞的keyness log ratio的條形圖。在繪製條形圖時,使用了fill = logratio < 0的參數設置,這是一個布林值,當單詞在Android和iPhone兩個來源中的log ratio小於0時,填充的顏色是gold,否則填充的顏色是royalblue。 這種設計原理的目的是將Android和iPhone兩個來源中關鍵性不同的單詞進行區分,並用不同的填充顏色來表示。當單詞在Android來源中的出現概率高於在iPhone來源中的出現概率時,其log ratio值會為正,此時填充的顏色為royalblue;反之,當單詞在Android來源中的出現概率低於在iPhone來源中的出現概率時,其log ratio值會為負,此時填充的顏色為gold。 android_iphone_ratios %>% group_by(logratio > 0) %>% top_n(15, abs(logratio)) %>% ungroup() %>% mutate(word = reorder(word, logratio)) %>% ggplot(aes(word, logratio, fill = logratio < 0)) + geom_col() + coord_flip() + ylab("Android / iPhone log ratio") + scale_fill_manual(name = "", labels = c("Android", "iPhone"), values = c("royalblue", "gold")) + theme_minimal() + theme(axis.text = element_text(size=14)) "],["re.html", "Chapter 13 Regular expression 13.1 RE applications on string operations 13.2 RE Case studies 13.3 Useful cases", " Chapter 13 Regular expression library(tidyverse) 正規表達式(Regular Expression)是一種用來描述、搜尋和操作文本的強大工具。它是由一系列字元和特殊符號所組成的模式,用於匹配和處理符合特定模式的字串。 正規表達式提供了一種靈活且強大的方式來執行字串的模式匹配。這些模式可以包含字母、數字、特殊字符和控制字符等各種元素。使用正規表達式,可以進行字串的搜尋、替換、提取、驗證和分割等操作。 Online tools for detecting regular expression (RE) https://regex101.com/ http://regexr.com/ RE Patterns 在正規表達式中,一些特殊符號和字符具有特殊的含義。例如,\\d可以匹配任何一個數字,\\w可以匹配任何一個字母或數字,.可以匹配除換行符之外的任何一個字符,+表示前面的模式可以出現一次或多次,*表示前面的模式可以出現零次或多次,?表示前面的模式可以出現零次或一次,[]用於指定一組字符中的任意一個等等。較完整的表格如下。要注意到的是,如果是\\d的話,R中要以\\\\d雙斜線來表示。 pattern <- \"\\\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}\\\\b\"為一個用R來寫RE的範例:在R中,我們使用雙反斜線(\\)來表示正規表達式中的特殊字符。在這個示例中,使用的正規表達式模式包括以下幾個部分: \\\\b:匹配單詞的邊界,確保郵件地址不是部分字詞的一部分。 [A-Za-z0-9._%+-]+:匹配郵件地址的用戶名部分,它可以包含字母、數字、點(.)、下劃線(_)、百分比(%)、加號(+)和減號(-)。注意這個在中括號中的點(.)並非用來匹配任意字。後面的+號意思是代表至少要有一個字以上。 @:匹配郵件地址中的「@」符號。 [A-Za-z0-9.-]+:匹配郵件地址的域名部分,它可以包含字母、數字、點(.)和減號(-)。 \\\\.:匹配郵件地址中的點(.),需要使用反斜線進行轉義。 [A-Za-z]{2,}:匹配郵件地址的頂級域名部分,它可以是由至少兩個字母組成的字詞。 Pattern Description ^ Matches beginning of line. $ Matches end of line. . Matches any single character except newline. Using m option allows it to match newline as well. [...] Matches any single character in brackets. [^...] Matches any single character not in brackets re* Matches 0 or more occurrences of preceding expression. re+ Matches 1 or more occurrence of preceding expression. re? Matches 0 or 1 occurrence of preceding expression. *?, +?, ?? *, +和?預設是greedy的,如果要匹配’<H1>title</H1>‘時,會匹配整個句子。如果不希望它是greedy的,就要在上述符號後面加一個?。Using .*? in the previous expression will match only ’<H1>’. re{ n} Matches exactly n number of occurrences of preceding expression. re{ n,} Matches n or more occurrences of preceding expression. re{n, m} Matches at least n and at most m occurrences of preceding expression. a| b Matches either a or b. (re) 問號括住的部分就是match要留下來的部分。Groups regular expressions and remembers matched text. (?imx) Temporarily toggles on i, m, or x options within a regular expression. If in parentheses, only that area is affected. (?-imx) Temporarily toggles off i, m, or x options within a regular expression. If in parentheses, only that area is affected. (?: re) Groups regular expressions without remembering matched text. (?imx: re) Temporarily toggles on i, m, or x options within parentheses. (?-imx: re) Temporarily toggles off i, m, or x options within parentheses. (?#...) Comment. (?= re) Specifies position using a pattern. Doesn’t have a range. (?! re) Specifies position using pattern negation. Doesn’t have a range. (?> re) Matches independent pattern without backtracking. \\w Matches word characters. \\W Matches nonword characters. \\s Matches whitespace. Equivalent to [\\t\\n\\r\\f]. \\S Matches nonwhitespace. \\d Matches digits. Equivalent to [0-9]. \\D Matches nondigits. \\A Matches beginning of string. \\Z Matches end of string. If a newline exists, it matches just before newline. \\z Matches end of string. \\G Matches point where last match finished. \\b Matches word boundaries when outside brackets. Matches backspace (0x08) when inside brackets. \\B Matches nonword boundaries. \\n, \\t, etc. Matches newlines, carriage returns, tabs, etc. \\1...\\9 Matches nth grouped subexpression. \\10 Matches nth grouped subexpression if it matched already. Otherwise refers to the octal representation of a character code. 13.1 RE applications on string operations Replacing specific pattern Replacing all space or new line character to one space or empty string Deleting all number and alphabetic by empty string Deleting all HTML tags Detecting if it exists some specific pattern Fitering if one sentence starting with “. Extracting some words by specific pattern Extracting hashtags in text Extracting timestamp, email, hyperlink, or url in text Extracting number after some specific patterns Splitting Splitting string into several parts when detecting some specific pattern successfully. Replacing \\s matching any whitespace character including space, tabs, and line breaks R uses \\\\s, instead of \\s. \\\\d digit, \\\\D not digit \\\\s whitepsace, \\\\S not whitespace \\\\w word, \\\\W not word . matches any [A-Z0-9a-z] range [ABC] character set [^ABC] neglect set (Leadning ^ in [] means neglecting) s <- " 123 456 789 " str_replace_all(s, "\\\\s", "") ## [1] "123456789" 13.1.1 Extracting + means matching word occurring at least one time, matching longer is better * means matching word occurring any time, matching longer is better {1,3} means matching at least one time, but at most 3 times {3} means matching 3 times exactly. 13.1.1.1 by str_extract() 以下這個例子是在爬取PTT資料後,嘗試能夠取出每則貼文的ID與暱稱。 pname <- c("pttid111(kefan)", "pid2(hangfan)") # extracting at least one words until not word str_extract(pname, "\\\\w") ## [1] "p" "p" str_extract(pname, "\\\\w+") ## [1] "pttid111" "pid2" str_extract(pname, "[A-Za-z0-9]+") ## [1] "pttid111" "pid2" str_extract(pname, "[A-Za-z0-9]*") ## [1] "pttid111" "pid2" str_extract(pname, "[A-Za-z0-9]{8}") ## [1] "pttid111" NA str_extract(pname, "[A-Za-z0-9]{1,8}") ## [1] "pttid111" "pid2" # extracting word between () # () is controlled vocabulary in regular expression, needing \\\\( and \\\\) to specify the character themself str_extract(pname, "\\\\(\\\\w+\\\\)") %>% str_replace_all("[\\\\(\\\\)]", "") ## [1] "kefan" "hangfan" str_extract(pname, "\\\\(.+\\\\)") ## [1] "(kefan)" "(hangfan)" 13.1.1.2 by str_extract for data frame data_frame(pname) %>% mutate(nickname = str_extract(pname, "\\\\(\\\\w+\\\\)") %>% str_replace_all("[\\\\(\\\\)]", "")) %>% mutate(id = str_extract(pname, "\\\\w+")) ## Warning: `data_frame()` was deprecated in tibble 1.1.0. ## ℹ Please use `tibble()` instead. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated. ## # A tibble: 2 × 3 ## pname nickname id ## <chr> <chr> <chr> ## 1 pttid111(kefan) kefan pttid111 ## 2 pid2(hangfan) hangfan pid2 13.1.1.3 by str_replace() (\\\\w+)的括號代表,我等一下要抽取出這個pattern的字 \\\\(.+\\\\)則是把剩下的pattern matching 完 \\\\1代表我要抽取前面第一組抽取出來的pattern,也就是(\\\\w+)中間的\\\\w+。 data_frame(pname) %>% mutate(id = str_replace(pname, "(\\\\w+)\\\\(.+\\\\)", "\\\\1")) ## # A tibble: 2 × 2 ## pname id ## <chr> <chr> ## 1 pttid111(kefan) pttid111 ## 2 pid2(hangfan) pid2 13.1.1.4 by tidyr::extract() for data frame data_frame(pname) %>% tidyr::extract(pname, c("id", "nickname"), "(\\\\w+)\\\\((.+)\\\\)", remove = F) ## # A tibble: 2 × 3 ## pname id nickname ## <chr> <chr> <chr> ## 1 pttid111(kefan) pttid111 kefan ## 2 pid2(hangfan) pid2 hangfan ?tidyr::extract 13.1.2 Detecting with non-greedy 這段程式碼使用R中的tidyverse套件中的extract()函數,從source向量中的每個元素中提取出「device」的資訊。假設我們希望從<p>和</p>之間提取「Twitter for iPhone」這個資訊。 此時我們會需要理解正規表示式的寫法預設是貪婪(greedy)的概念。當我們談到正規表達式的「貪婪」(greedy)和「非貪婪」(non-greedy)時,我們指的是模式匹配時的行為。 「貪婪」指的是匹配器在尋找模式時傾向於匹配盡可能多的字符。換句話說,它會儘可能地擴展匹配範圍。在正規表達式中,默認情況下,量詞(如*和+)是貪婪的。這意味著它們會匹配盡可能長的字串。 「非貪婪」(或稱「勉強」)則相反,它傾向於匹配最短的可能字串。在正規表達式中,可以在量詞後面加上「?」來表示非貪婪匹配。這樣一來,量詞就會儘可能少地匹配字符。 回到我們的例子,當使用默認的貪婪模式時,我們的正則表達式\"Twitter for (.*)<\"會從第一個<p>開始匹配,直到找到最後一個<之前的所有字符。這意味著它會將整個<p>Twitter for iphone</p><div><p>作為匹配結果,而不僅僅是<p>Twitter for iphone</p>。 但如果我們想要只匹配第一個<p>和之後的字符,而不是將整個<p>標籤內容都包括在內,我們可以使用「非貪婪」模式,將正則表達式修改為\"Twitter for (.*?)<\",在量詞*後面加上「?」。這樣,它會匹配到第一個<之前的最短字串,即只匹配到<p>Twitter for iphone。 source <- c("<p>Twitter for iphone</p>", "<div><p>Twitter for iphone</p></div>") data_frame(source) %>% extract(source, "device", "Twitter for (.*)<") # Greedy ## # A tibble: 2 × 1 ## device ## <chr> ## 1 iphone ## 2 iphone</p> data_frame(source) %>% extract(source, "device", "Twitter for (.*?)<") # Non-Greedy ## # A tibble: 2 × 1 ## device ## <chr> ## 1 iphone ## 2 iphone 13.1.3 Detecting multiple patterns https://stackoverflow.com/questions/8020848/how-is-the-and-or-operator-represented-as-in-regular-expressions 以下練習重點是讓學生理解如何使用 str_detect() 函數和正則表達式進行模式匹配,以及如何進行邏輯操作來組合和篩選符合特定模式的句子。 str_detect(teststr, re1) & str_detect(teststr, re2) 通過 & 進行邏輯「與」操作,將兩個邏輯向量進行元素級別的「與」運算,得到一個新的邏輯向量。該向量指示哪些句子同時符合 re1 和 re2 的模式。 str_detect(teststr, re1) | str_detect(teststr, re2) 通過 | 進行邏輯「或」操作,將兩個邏輯向量進行元素級別的「或」運算,得到一個新的邏輯向量。該向量指示哪些句子符合 re1 或 re2 的模式。 teststr <- c("B和A是不是男女朋友呢", "C與B是不是在一起呢", "A就是B。") re1 <- "(.*B.*呢$)" re2 <- "(.*A.*)" str_detect(teststr, re1) ## [1] TRUE TRUE FALSE str_detect(teststr, re2) ## [1] TRUE FALSE TRUE str_detect(teststr, re1) & str_detect(teststr, re2) ## [1] TRUE FALSE FALSE str_detect(teststr, re1) | str_detect(teststr, re2) ## [1] TRUE TRUE TRUE 13.1.4 Extracting nearby words 13.1.4.1 Extracting nearby 3 English words string2 <- "..., compelled to defend as never before the hard-charging progressivism and ...." data_frame(string2) %>% mutate(string2 = str_extract(string2, "(\\\\S+\\\\s){3}before(\\\\s\\\\S+){3}")) %>% extract(string2, c("prefix","hit", "tail"), "(.+)(before)(.+)") ## # A tibble: 1 × 3 ## prefix hit tail ## <chr> <chr> <chr> ## 1 "defend as never " before " the hard-charging progressivism" 13.1.4.2 Extracting nearby 3 Chinese words string3 <- c("呵呵呵呵呵呵呵我家就住在台灣,那是個美麗的地方", "臺灣真是個美麗的地方齁齁齁", "呵呵呵呵呵呵呵我愛台灣臺灣") str_extract(string3, ".{5}台灣.{5}|.{5}臺灣.{5}") ## [1] "我家就住在台灣,那是個美" NA ## [3] NA str_extract(string3, ".{1,5}台灣.{1,5}|.{1,5}臺灣.{1,5}") ## [1] "我家就住在台灣,那是個美" NA ## [3] "呵呵呵我愛台灣臺灣" 13.1.4.3 Extracting nearby 3 Chinese words df <- data_frame(string3) df %>% extract(string3, c("pre", "hit", "tail"), "(.{0,5})(台灣|臺灣)(.{0,5})") ## # A tibble: 3 × 3 ## pre hit tail ## <chr> <chr> <chr> ## 1 "我家就住在" 台灣 ,那是個美 ## 2 "" 臺灣 真是個美麗 ## 3 "呵呵呵我愛" 台灣 臺灣 13.2 RE Case studies 13.2.1 Getting the last page of PTT HatePolitics 這段程式碼的目的是從URL中提取出頁數或特定的部分,並進行一些後續處理和轉換。這些操作可用於從URL中獲取有用的訊息,例如網頁索引、頁數等。 urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html", "https://www.ptt.cc/bbs/HatePolitics/index348.html") df <- tibble(urls) str_extract(urls, "index(\\\\d+)\\\\.html") ## [1] "index4086.html" "index348.html" str_replace(urls, ".*index(\\\\d+)\\\\.html", "\\\\1") %>% as.numeric() ## [1] 4086 348 data_frame(urls) %>% extract(urls, "last_page", "index(\\\\d+)\\\\.html", remove = F) ## # A tibble: 2 × 2 ## urls last_page ## <chr> <chr> ## 1 https://www.ptt.cc/bbs/HatePolitics/index4086.html 4086 ## 2 https://www.ptt.cc/bbs/HatePolitics/index348.html 348 13.2.2 Practice. Ask CHATGPT 我現在有一程式碼如下 ``` urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html", "https://www.ptt.cc/bbs/HatePolitics/index348.html") df <- tibble(urls) ``` 我希望來抽取出頁面的編號,新增一個page_num的變項,使得 ``` ...index4086.html: 4086 ...index348.html: 348 ``` 請以tidyverse pipeline的方式寫,並使用stringr的函式 以下為chatgpt的回答。 您可以使用tidyverse和stringr的函式來實現這個目標。以下是一個使用tidyverse pipeline和stringr的範例程式碼: library(tidyverse) urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html", "https://www.ptt.cc/bbs/HatePolitics/index348.html") df <- tibble(urls) %>% mutate(page_num = str_extract(urls, "(?<=index)\\\\d+(?=.html)")) PROMPT:請解釋(?<=index)\\\\d+(?=.html) (?<=index): 是一個Positive Lookbehind。它表示匹配位置之前必須出現”index”字串。在這種情況下,我們希望匹配的數字出現在”index”之後,所以使用正向肯定後願式來確定位置。 \\\\d+: 這是一個數字的匹配模式。\\\\d表示匹配一個數字字符(0-9),而+表示匹配一個或多個連續的數字字符。這樣可以確保我們匹配到的是一個或多個數字。 (?=.html): 是一個Positive Lookahead。它表示匹配位置之後必須出現”.html”字串。在這種情況下,我們希望匹配的數字出現在”.html”之前,所以使用正向肯定前願式來確定位置。 index:匹配字串中的”index”字串。 (\\\\d+):這是一個捕獲組(Capture Group),用於捕獲一個或多個連續的數字字符。\\\\d表示匹配一個數字字符(0-9),而+表示匹配一個或多個連續的數字字符。 \\\\.html:匹配字串中的”.html”字串。由於”.”在正則表達式中具有特殊意義,所以需要使用\\\\進行轉義。 urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html", "https://www.ptt.cc/bbs/HatePolitics/index348.html") df <- tibble(urls) %>% mutate(page_num = str_extract(urls, "(?<=index)\\\\d+(?=.html)")) df ## # A tibble: 2 × 2 ## urls page_num ## <chr> <chr> ## 1 https://www.ptt.cc/bbs/HatePolitics/index4086.html 4086 ## 2 https://www.ptt.cc/bbs/HatePolitics/index348.html 348 13.3 Useful cases 13.3.1 Matching URL 這個正規表達式用於檢測是否符合超連結的格式。它可以匹配包含 http://、https://、ftp://、www. 或 ftp. 前綴的URL,並確保後續的部分符合網址的正確格式,例如域名、路徑和查詢參數等。 ^ 表示匹配字符串的開頭。 ((https?|ftp)://|(www|ftp)\\\\.)? 是一個可選的前綴,它匹配以 http://、https://、ftp://、www. 或 ftp. 開頭的部分。其中 ? 表示前綴部分是可選的。 [a-z0-9-]+ 匹配一個或多個小寫字母、數字或破折號字符。 (\\\\.[a-z0-9-]+)+ 是一個重複組,它匹配一個或多個點(.)後跟一個或多個小寫字母、數字或破折號字符。 ([/?].*)? 是另一個可選的後綴,它匹配以 / 或 ? 開頭的部分,並跟隨著任意字符。 $ 表示匹配字符串的結尾。 根據需求和特定的使用情境,可以有不同的寫法。以下是一些可能的替代寫法: 捕獲更多的URL前綴:當前的正規表達式只捕獲了 http://、https://、ftp://、www. 和 ftp. 這些前綴。如果需要捕獲更多的前綴,可以擴展前綴部分,例如 ((https?|ftp|file)://|(www|ftp)\\\\.)?,這樣可以捕獲 file:// 這樣的前綴。 更精確的域名部分:當前的正規表達式使用 [a-z0-9-]+(\\\\.[a-z0-9-]+)+ 匹配域名部分,這允許了字母、數字和破折號字符。如果需要更精確的域名匹配,可以使用更複雜的正規表達式,例如 (?!-)[A-Za-z0-9-]{1,63}(?<!-)\\\\.(?!-)[A-Za-z0-9-]{1,63}(?<!-),這樣可以確保符合域名規範。 pattern <- "^((https?|ftp)://|(www|ftp)\\\\.)?[a-z0-9-]+(\\\\.[a-z0-9-]+)+([/?].*)?$" str_detect("http://www.yahoo.com.tw", pattern) ## [1] TRUE str_detect("https://m.facebook.com/story.php?story_fbid=1483357095305703&id=1435979486710131", pattern) ## [1] TRUE str_detect("https://www.facebook.com/groups/335691256571414/permalink/774316322708903/", pattern) ## [1] TRUE 13.3.2 Removing all html tags but keeping comment content ANS: \"推 ya870801: 推 218.166.12.10 10/16 15:56\" comment <- '<div class="push"><span class="hl push-tag">推 </span><span class="f3 hl push-userid">ya870801</span><span class="f3 push-content">: 推</span><span class="push-ipdatetime"> 218.166.12.10 10/16 15:56</span></div>' str_replace_all(comment, "<.+?>", "") ## [1] "推 ya870801: 推 218.166.12.10 10/16 15:56" str_replace_all(comment, "<.*?>", "") ## [1] "推 ya870801: 推 218.166.12.10 10/16 15:56" 13.3.3 Removing space # Removing space in Chinese sentence sentence <- c(' 噓 wwHui: 這批安好純 \\n 辛苦了 \\n 噓 ', '噓 wwHui: 這批安好純 ', '辛苦了 ') # Removing all space characters str_replace_all(sentence, "\\\\s", "") ## [1] "噓wwHui:這批安好純辛苦了噓" "噓wwHui:這批安好純" ## [3] "辛苦了" # Removing leading and ending space by str_replace_all() # You cannot use trimws() str_replace_all(sentence, "^\\\\s+|\\\\s+$", "") ## [1] "噓 wwHui: 這批安好純 \\n 辛苦了 \\n 噓" ## [2] "噓 wwHui: 這批安好純" ## [3] "辛苦了" 13.3.4 Testing teststr1 <- c("我最近過的挺爽", "最近我過的不是很好。", "我最近過得不太好。") re1 <- "(^我.+)" re2 <- "(.*。)" str_detect(teststr1, str_c(re1,re2, sep = "")) ## [1] FALSE FALSE TRUE str_detect(teststr1, str_c(re1,re2, sep = "|")) ## [1] TRUE TRUE TRUE "],["tmchi.html", "Chapter 14 Text processing in Chinese 14.1 Preprocessing 14.2 Tokenization 14.3 Exploring wording features 14.4 TF-IDF", " Chapter 14 Text processing in Chinese tidyverse內涵繪圖和操作資料所需要的ggplot2和dplyr stringr雖然隨著tidyverse被安裝了,但不會隨著tidyverse被載入,要另外載入。 在中文斷詞的時候要用到tidytext和jiebaR。 處理時間時要用到lubridate。 14.1 Preprocessing 14.1.1 Assigning unique id to each doc 為了便於後續建立Document-Term-Matrix,這時候若Document自身沒有編號的話,就得把整個Document內容當成該篇文章的id,但也有(極小)可能有兩篇Document內容相同,那就會被視為同一篇文章或發生錯誤。所以必須要編id。 row_number()產生每列的編號,所以這邊就直接把每列的編號視為每篇文章的id,可以保持該id的唯一性。當你在進行文本探勘或資料分析時,為每篇文章分配一個唯一的ID是非常重要的。唯一的ID確保每篇文章都有獨一無二的標識符號。這對於跟踪和識別特定文章非常重要,特別是當你處理大量的文本資料時。在進行資料合併時,唯一的ID可用於將不同來源的資料準確地匹配和合併在一起。這是非常實用的,尤其當你需要整合來自多個來源的文本資料時,例如合併多個資料集或者在不同時間點上進行的數據採集。 news.df <- readRDS("data/typhoon.rds") %>% mutate(doc_id = row_number()) %>% drop_na(title) 14.2 Tokenization 14.2.1 Initializer tokenizer cutter <- worker()這行程式碼使用worker()函式來初始化jieba分詞器,將其指派給名為cutter的變數。jieba是一個常用的中文分詞套件,用於將漢字序列分割成詞彙。初始化分詞器後,可以使用它來對中文文本進行分詞操作。 斷詞的時候不見能把我們要的字詞斷出來,比方說你可能希望台北市不會被斷開,偏偏被斷成台北+市。最簡單的辦法就是把他窮舉舉完。new_user_word(cutter, segment_not)這行程式碼使用new_user_word()函式將segment_not這個vector中的詞彙加入使用者自定義詞典。這樣做的目的是防止該詞彙被分詞器切分成不同的部分。使用者可以根據需要將自定義詞彙加入詞典,以確保這些詞彙在分詞過程中被正確處理。 載入中文停用詞:stopWords <- readRDS(\"data/stopWords.rds\") 這行程式碼載入中文停用詞(stop words)的資料,並將其讀取到名為stopWords的變數中。停用詞是在文本分析中被視為無意義或不重要的詞彙,例如連接詞、介詞、助詞等。載入停用詞列表後,可以在文本處理過程中使用它來過濾掉這些不需要的詞彙,以提高分析的效果。常見的中文停用詞包含 助詞:的、了、着、地、得、之等。 連詞:和、與、或、及、還、而等。 代詞:我、你、他、她、它、們、這、那等。 冠詞:一、個、些、這、那等。 介詞:在、從、到、以、為、因、應、對等。 虛詞:的、地、得、過、過去等。 數詞:一、二、三、十、百、千、萬等。 副詞:很、非常、太、真、已經、還、就等。 連接詞:而、並、所以、因此、然而、只是等。 感嘆詞:嗯、哦、啊、呀、吧、喔等。 # segment_not to avoid to be segmented by jeiba cutter segment_not <- c("第卅六條", "第卅八條", "蘇南成", "災前", "災後", "莫拉克", "颱風", "應變中心", "停班停課", "停課", "停班", "停駛", "路樹", "里長", "賀伯", "採收", "菜價", "蘇迪", "受災戶", "颱風警報", "韋恩", "台東縣", "馬總統", "豪大雨", "梅姬", "台東", "台北市政府", "工務段", "漂流木", "陳菊", "台南縣", "卡玫基", "魚塭", "救助金", "陳情", "全省", "強颱", "中颱", "輕颱", "小林村", "野溪", "蚵民", "農委會", "來襲", "中油公司", "蔣總統經國", "颱風天", "土石流", "蘇迪勒", "水利署", "陳說", "颱風假", "颱風地區", "台灣", "臺灣", "柯羅莎", "八八風災", "紓困","傅崑萁", "傅崐萁","台中", "文旦柚", "鄉鎮市公所", "鄉鎮市", "房屋稅", "高雄", "未達", "台灣省", "台北市") # Initialize jieba cutter cutter <- worker() # Add segment_not into user defined dictionary to avoid being cutted new_user_word(cutter, segment_not) ## [1] TRUE # loading Chinese stop words stopWords <- readRDS("data/stopWords.rds") # load("../segment_not.R") 14.2.2 Tokenization Tokenization(分詞)在文本探勘的過程中是將文本轉換為更小單位的步驟。它將連續的文本序列(例如句子或段落)分割成一系列被稱為「詞彙」或「tokens」的個別單位。在文本探勘中,進行分詞的目的是將文本轉換為可以進一步處理和分析的基本單位。每個詞彙代表著文本中的一個有意義的單詞、詞組或符號,例如一個英文單詞、一個漢字、一個數字等等。這些詞彙可以作為後續分析的基礎,用於進行文本處理、特徵提取、語義分析、情感分析等各種任務。 分詞的過程可以包括以下步驟: 斷句:如果文本是一個段落或一個文檔,首先需要將其分成句子。這可以使用標點符號(如句號、問號、驚嘆號等)作為分隔符號來實現。 分詞:將每個句子進一步分成詞彙或tokens。具體的分詞方法取決於文本的語言和特定的工具或套件。對於中文,常用的分詞工具包括jieba、SnowNLP等;而對於英文,常用的分詞方法是基於空格或標點符號進行切分。 去除停用詞:在分詞過程中,通常會過濾掉停用詞,這些詞彙被認為對文本分析沒有太大的意義。停用詞可以是常用的連接詞、介詞、助詞、冠詞等。 正規化:進行詞彙的正規化,例如將詞彙轉換成小寫,移除標點符號,處理詞彙的變體形式(如單數、複數、時態等)。 建立詞彙表:將所有詞彙收集到一個詞彙表或詞彙索引中,該詞彙表可以用於後續的文本處理和分析。 例如一個句子「今天天氣真好,我打算去公園散步。」可以被斷成「今天 天氣 真好 , 我 打算 去 公園 散步 。」 實際上中文斷詞相當不容易,常見的問題包括: 歧義詞彙:中文中存在許多具有歧義性的詞彙,例如「打開」可以是「開啟」的意思,也可以是「打碎」的意思。在分詞時,選擇正確的分詞方式對於確定詞彙的真正含義非常重要。 新詞辨識:中文是一個活躍的語言,新詞彙的產生非常頻繁。在分詞過程中,如果遇到未在詞典中出現的新詞彙,可能會無法正確切分,導致語義的失真或信息的丟失。 縮略詞和缺詞:中文中常使用縮略詞,例如「國際象棋」可以縮寫為「國象」。在分詞時,需要考慮這些縮略詞的存在,並確保正確切分。另外,有些中文詞彙存在缺詞現象,例如「下雨了」可以簡化為「下雨」,需要根據上下文來識別和處理這些情況。 斷詞歧異:「台北市/長」或「台北/市長」 外文詞彙和混合語言:中文文本中常包含外文詞彙或混合語言的情況。在分詞時,需要考慮如何處理這些詞彙,例如是否將其當作一個整體進行切分,或者保留其原有的形式。 未知詞彙和低頻詞彙:分詞工具常基於詞典來進行切分,因此對於一些罕見或專有名詞、專術詞彙可能無法進行正確的切分。這些未知詞彙和低頻詞彙的處理需要特殊的處理策略,例如使用統計方法或自定義詞彙表。 在segment(x, cutter)後會產生一個多詞的向量。亦即每一格就是一個向量,你可以把它印出來看看。可以用unnest()將word列中的字詞向量展開,使每個單詞成為一列。這樣可以將每個單詞視為一個觀察值,方便後續的處理。 # news.df$time %>% summary tokenized.df <- news.df %>% slice(-3069) %>% mutate(timestamp=ymd(time)) %>% # filter(timestamp > as.Date("2009-01-01")) %>% select(-time) %>% select(title, text, cat, timestamp, everything()) %>% mutate(word = purrr::map(text, function(x)segment(x, cutter))) tokenized.df %>% select(title, word) %>% head() ## # A tibble: 6 × 2 ## title word ## <chr> <list> ## 1 "昨天上班的人沒加班費也不補假\\n依法 員工無權利要求•體恤 雇主可酌情嘉惠" <chr> ## 2 "走過桑梓千田\\n東台水保之旅" <chr> ## 3 "走過桑梓千田\\n東台水保之旅" <chr> ## 4 "總統祝福大家新春如意\\n期勉迎接挑戰贏得勝利" <chr> ## 5 "總統至為關切颱風災害\\n電囑儘速展開救災重建" <chr> ## 6 "總統關懷澎湖災情 俞揆冒雨巡視災區\\n指示搶修道路•優先供應水電 復建資金… <chr> # unnest() to spread character into a new word variable # filter out stop words # filter out alphabetical and numeric characters unnested.df <- tokenized.df %>% select(doc_id, text, word) %>% unnest(word) %>% filter(!(word %in% stopWords$word)) %>% filter(!str_detect(word, "[a-zA-Z0-9]+")) unnested.df %>% head ## # A tibble: 6 × 3 ## doc_id text word ## <int> <chr> <chr> ## 1 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 昨天 ## 2 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 颱風… ## 3 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 北部 ## 4 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 地區 ## 5 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 機關 ## 6 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 學校 14.3 Exploring wording features 14.3.1 Word frequency distribution 這兩個函式是用於對X軸和Y軸進行對數轉換。對數轉換可以將原始數據的數值範圍較大的部分進行壓縮,使其在視覺化時更易於比較和理解。對數尺度的使用有助於呈現數據的相對變化和細節,尤其是當數據範圍跨度較大時。 對X軸和Y軸進行對數轉換的目的是為了更好地觀察數據的分佈特徵,尤其是在存在長尾分佈(power-law distribution)或Zipf’s law的情況下。 長尾分佈(Power-law distribution): 在長尾分佈中,少數的頻繁發生事件和大量的不太頻繁發生事件形成了一個長尾(即數量較小但頻率較高的事件非常稀有)。對於長尾分佈的數據,採取對數轉換可以將較大的數值範圍縮小,使得長尾部分的細節更容易被觀察和比較。這樣做可以更好地呈現數據的細微變化和分佈的特性。 Zipf’s law: Zipf’s law是一種描述詞彙頻率與詞彙排名之間關係的統計定律。根據Zipf’s law,詞彙的頻率與其在排序中的排名成反比。當觀察和分析詞彙頻率時,對X軸和Y軸進行對數轉換有助於更好地呈現Zipf’s law的特性。對數尺度轉換使我們能夠更清楚地觀察到詞彙頻率的排名和分佈情況。 在power-law distribution的情況下,如果對X軸和Y軸進行對數轉換,我們通常會看到以下情形: 直線關係:在對數尺度下,如果數據符合power-law distribution,我們會看到一條近似線性的直線關係。這表示在對數尺度下,數據點的分佈大致呈現線性趨勢,表示一種指數衰減或增長的規律。 長尾尾部:power-law distribution的特點是長尾尾部的存在,即少數極端值或稀有事件的出現頻率相對較高。在對數尺度下,我們能夠更清楚地看到這些極端值或稀有事件在數據分佈中的位置,因為它們在對數尺度下會呈現較為明顯的特徵。 分佈斜率:對數尺度下的power-law distribution,通常可以通過斜率來描述分佈的特性。斜率表示每個X單位變化對應的Y單位變化,或者說在對數尺度下,表示對數Y值相對於對數X值的變化率。如果數據點遵循power-law distribution,斜率會呈現相對恆定的特性。 word.count <- tokenized.df %>% unnest(word) %>% count(word, sort=T) %>% filter(!(word %in% stopWords$word)) %>% filter(nchar(word) > 1) %>% filter(!str_detect(word, "[a-zA-Z0-9]+")) %>% filter(n > 3) word.count %>% count(n, sort=T) %>% ggplot(aes(n, nn)) + geom_point(alpha=0.5, size = 1, color="#333333") word.count %>% count(n, sort=T) %>% ggplot(aes(n, nn)) + geom_point(alpha=0.5, size = 1, color="#333333") + scale_x_log10() + scale_y_log10() 14.3.2 Keyness by logratio 早、近期用字差異 cat_word.tf <- tokenized.df %>% unnest(word) %>% count(cat, word) %>% ungroup() %>% filter(!str_detect(word, "[a-zA-Z0-9]+")) %>% filter(!(word %in% stopWords$word)) %>% filter(nchar(word)>1) early_lat_ratio <- cat_word.tf %>% filter(n>1) %>% pivot_wider(names_from = cat, values_from = n, values_fill = 0) %>% # spread(cat, n, fill = 0) %>% ungroup() %>% mutate_if(is.numeric, funs((. + 1) / sum(. + 1))) %>% mutate(logratio = log2(early / lat)) %>% arrange(desc(logratio)) early_lat_ratio %>% group_by(logratio > 0) %>% top_n(20, abs(logratio)) %>% ungroup() %>% mutate(word = reorder(word, logratio)) %>% ggplot(aes(word, logratio, fill = logratio < 0)) + geom_bar(stat = "identity") + coord_flip() + ylab("early / recent log ratio") + scale_fill_manual(name = "", labels = c("early", "recent"), values = c("tomato", "lightblue")) + theme(axis.text.y=element_text(colour="black", family="Heiti TC Light")) 14.3.3 Keyness by scatter frequency <- cat_word.tf %>% filter(n>3) %>% group_by(cat) %>% mutate(proportion = n/sum(n)) %>% select(-n) %>% spread(cat, proportion) %>% na.omit() # datatable(frequency) library(scales) frequency %>% ggplot(aes(x = early, y = lat, color = abs(early - lat))) + geom_abline(color = "gray40", lty = 2) + geom_point(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) + geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5, family="Heiti TC Light", size = 3) + scale_x_log10(labels = percent_format()) + scale_y_log10(labels = percent_format()) + theme(legend.position="none") + coord_fixed(1) 14.4 TF-IDF TF-IDF (Term Frequency-Inverse Document Frequency) 是一種用於衡量一個詞彙在文本集合中重要性的統計方法。它結合了詞頻 (Term Frequency, TF) 和逆文檔頻率 (Inverse Document Frequency, IDF) 兩個指標。 詞頻 (Term Frequency, TF):衡量一個詞彙在單篇文檔中出現的頻率。詞頻可以通過計算詞彙在文檔中出現的次數,或者使用歸一化的詞頻計算公式來得到。 逆文檔頻率 (Inverse Document Frequency, IDF):衡量一個詞彙在整個文本集合中的普遍重要性。逆文檔頻率通過計算詞彙在文本集合中出現的文檔數量的倒數,並取對數來得到。這樣做的目的是對常見詞彙的重要性進行降低,並提高罕見詞彙的重要性。 TF-IDF 的計算公式如下:TF-IDF = TF * IDF 其中,TF表示詞頻,IDF表示逆文檔頻率。 TF-IDF 的應用主要有兩個方面: 文本檢索 (Information Retrieval):在文本檢索中,使用TF-IDF來計算詞彙對於給定查詢的相關性。詞彙的TF-IDF值越高,表示該詞彙在文檔中的重要性越高,並且與查詢的相關性越大。 文本特徵表示 (Text Feature Representation):在文本分析和機器學習中,使用TF-IDF來表示文本的特徵向量。將文本轉換為TF-IDF向量表示可以捕捉詞彙在文本中的重要性,並且有助於機器學習模型更好地理解和區分不同的文本。 14.4.1 Term-frequency word.tf <- tokenized.df %>% unnest(word) %>% count(cat, word, sort=T) %>% # mutate(total_words=sum(n)) %>% mutate(rank=row_number(), tf= n/sum(n)) 如果是跑histrogram因為不是常態分佈而是power-law分佈,通常會看不出什麼來 ggplot(word.tf, aes(tf, fill=cat)) + geom_histogram(show.legend = F) + xlim(NA, 0.0009) + scale_x_log10() + scale_y_log10() + facet_wrap(~cat, ncol=2, scales="free_y") 加上rank後可以看出最高rank到最後的差異,中段差不多,但是,相較於晚近的文章,早期文章用過很少次的字比較多,但用過很多次的字比較少。(是否可推論用字越來越貧乏?) word.tf %>% ggplot(aes(rank, tf, color=cat)) + geom_line(size=1.1, alpha=0.5) + scale_x_log10() + scale_y_log10() rank_subset <- word.tf %>% filter(rank < 500, rank > 10) lm_result <- lm(log10(tf) ~ log10(rank), data = rank_subset) lm_result$coefficients[[1]] ## [1] -1.739581 word.tf %>% ggplot(aes(rank, tf, color = cat)) + geom_abline(intercept = lm_result$coefficients[[1]], slope = lm_result$coefficients[[2]], color = "gray50", linetype = 2) + geom_line(size = 1.1, alpha = 0.8, show.legend = FALSE) + scale_x_log10() + scale_y_log10() 14.4.2 TF-IDF to filter significant words TF-IDF計算結果可以將原本的詞頻(TF)分布從一個長尾分佈轉變為一個呈現鐘形曲線的分佈。這種轉變使得我們能夠去除尾部,即刪除TF-IDF值很低的詞彙,從而重新優化我們要處理的詞彙集合。這樣的處理方式有兩個主要目的。 首先,透過刪除TF-IDF值很低的詞彙,我們可以去除那些在文本中出現頻率較低且普遍性較高的詞彙,這些詞彙對於區分不同文本的能力相對較低,因此可以忽略不計。 其次,我們可以僅保留大於平均值加上一個或兩個標準差的TF-IDF值較高的詞彙,這些詞彙可以作為有效辨識文章的關鍵字。這是因為這些詞彙在文本中出現的頻率較高,同時其與該文本的關聯性也相對較強。 透過這樣的過濾和選擇,我們可以得到一個更精簡且具有代表性的詞彙集合,這些詞彙能夠更好地描述和區分不同的文章。因此,使用TF-IDF計算結果進行這樣的處理,可以在文本分析和信息檢索等領域中提供更有價值的結果。 news_count <- tokenized.df %>% unnest(word) %>% count(doc_id, word) %>% bind_tf_idf(word, doc_id, n) %>% arrange(desc(tf_idf)) news_count %>% ggplot(aes(tf_idf)) + geom_histogram(bins = 100) + scale_x_log10() news_count %>% left_join(news.df, by="doc_id") %>% filter(!(word %in% c("NA"))) %>% group_by(cat) %>% arrange(desc(tf_idf)) %>% top_n(30, tf_idf) %>% ungroup() %>% mutate(word = reorder(word, tf_idf)) %>% ggplot(aes(word, tf_idf, fill = cat)) + geom_col(show.legend = FALSE) + labs(x = NULL, y = "tf-idf") + facet_wrap(~cat, ncol = 2, scales = "free") + coord_flip() + theme(axis.text.y=element_text(family="Heiti TC Light")) 14.4.3 Practice. Understanding TF-IDF TF-IDF也並非沒缺點,首先是會受到詞頻影響:TF-IDF主要依賴於詞頻作為計算的一部分,詞頻較高的詞彙往往具有較高的權重。這可能會導致在辨識關鍵字時,偏向於選擇出現頻率高的常見詞彙作為關鍵字,而忽略了一些在文本中出現頻率較低但具有重要性的詞彙。其次是長文本帶來的影響,在長文本中,由於詞彙的多樣性和詞彙數量的增加,TF-IDF計算可能導致高度稀疏的向量表示。這可能導致計算效率降低,並且在後續的處理和分析中增加了計算和存儲的負擔。 請就我們給的上述資料,選幾篇文章來觀察TF-IDF所抽出來的關鍵字,有哪一些真的是關鍵字?有哪一些不是呢?從TF和TF-IDF的數值來看,明明不是關鍵詞,但TF-IDF卻很高的誤判原因為何呢? "],["crawler-overview.html", "Chapter 15 Introduction to Web Scraping 15.1 Using Web API 15.2 Webpage Scraping 15.3 Using Chrome DevTools", " Chapter 15 Introduction to Web Scraping 爬蟲主要分為兩大類:一類是使用網站所提供的 API,另一類則是需要寫網頁爬蟲來剖析網頁。 第一類是使用網站所提供的 API,API 是指應用程式介面,是網站提供的一種接口,用戶可以通過 API 向網站發送請求,獲取網站數據。API 可以是 RESTful API、SOAP API、XML-RPC API 等等,使用 API 的好處是可以直接獲取需要的數據,且數據格式結構化,易於處理。不過使用 API 需要瞭解 API 的參數格式,而且不是所有網站都提供 API。常見且提供API讓客戶端來取用資料的社群網站服務包含: Google Maps API:提供地圖、地理位置等相關的 API。 Twitter API:提供關於 Twitter 的相關數據,包括推文、用戶資訊等。 Facebook API:提供關於 Facebook 的相關數據,包括用戶資訊、頁面資訊等。 GitHub API:提供關於 GitHub 的相關數據,包括存儲庫資訊、用戶資訊等。 OpenWeatherMap API:提供天氣資訊的 API。 YouTube API:提供關於 YouTube 的相關數據,包括影片、頻道等。 Spotify API:提供關於音樂的相關數據,包括歌曲、歌手等。 第二類是需要寫網頁爬蟲來剖析網頁,這種方法通常使用一些開源的爬蟲框架,如 Python 的 Scrapy 和 Beautiful Soup、R 的 rvest 等等。網頁爬蟲是通過模擬瀏覽器的方式,向網站發送請求,獲取網頁的 HTML 源代碼,然後使用相應的庫對 HTML 進行解析和剖析,獲取需要的數據。網頁爬蟲需要考慮很多因素,如網站的反爬機制、網頁的動態載入、網頁的解析方式等等,需要編寫複雜的代碼來處理這些問題。例如爬取國內外報紙的搜尋結果大多需要直接剖析網頁來找到所需要的資料。 15.1 Using Web API 使用 Web API 需要瞭解 JSON 檔案格式,JSON 是一種輕量級的數據交換格式,可以被多種語言解析和生成,是目前 Web API 應用中使用最廣泛的數據格式之一。JSON 的全稱是 JavaScript Object Notation,為基於 JavaScript 語言的一種文本格式,可以被解析為不同的資料型態,如數字、布林代數、字串、數值組和物件等。JSON 與 XML 相比,具有更輕量級、更容易讀寫和解析等優勢,也因此在 Web API 中被廣泛應用。 JSON 格式的基本結構是一個鍵-值對應(Key-Value)集合,其中每個鍵都是一個字串,每個值可以是數字、布爾值、字串、數組或對象等類型。例如,以下是一個簡單的 JSON 。在 JSON 中,可以使用大括號 {} 表示鍵值對應(Key-Value),使用中括號 [] 表示序列(類似R中的List),鍵和值之間用冒號 : 分隔以對應,不同的鍵值對之間用逗號 , 分隔。JSON可以是樹狀多階層的,即一個鍵的值可以是另一個 JSON物件的鍵值對應。 在 R 語言中讀取 JSON 檔案需要先將其轉換為 R 的物件。這可以使用 R 的 jsonlite 套件中的 fromJSON() 函數來實現。jsonlite 套件是一個方便解析 JSON 的工具,它提供了從 JSON 字符串到 R 物件之間的轉換功能。 { "name": "John", "age": 30, "isMarried": false, "hobbies": ["reading", "music", "movies"], "address": { "street": "123 Main St", "city": "Anytown", "state": "CA" } } 15.2 Webpage Scraping 網頁爬蟲是一種自動化工具,可用於收集網頁上的資料。想要寫出高效能、穩定的爬蟲程式,需要掌握以下基礎知識: HTML 和 CSS:這些是用於設計和呈現網頁的標準技術。HTML 是網頁的基礎架構,而 CSS 用於設計和美化網頁的外觀。例如了解了解 HTML 標籤和屬性的基本語法和用法,以及網頁的基本結構,例如 head、body、div、span、table、a 等等。並瞭解了解 CSS 的基本語法和用法,包括如何設置元素的樣式、顏色、字體、大小、邊框等等,以及常用的選擇器和屬性。 XPath 和 CSS 選擇器:XPath 和 CSS 選擇器是用於定位 HTML 元素的語言。XPath 是 XML 語言的一部分,而 CSS 選擇器是 CSS 的一部分。Chrome 瀏覽器的 Inspector 是一個強大的工具,可以幫助我們查找 HTML 元素的 XPath 和 CSS 選擇器。 HTTP 協議:HTTP 協議是網絡通信協議,用於網頁服務器和瀏覽器之間的通信。理解 HTTP 協議可以幫助理解網頁如何工作。例如最常見的HTTP回應代碼有「401 Unauthorized:未經授權,無法訪問所需內容」以及「404 Not Found:所請求的內容不存在」。 防止反爬:由於網站經常會採取反爬蟲措施,因此開發者需要學習如何繞過這些措施,例如使用代理服務器、設置間隔時間、更換用戶代理等。 15.2.1 HTTP Status Code 回應代碼用於向客戶端通報伺服器對請求的處理狀態,以便客戶端根據不同的回應代碼進行相應的處理。例如,當客戶端發送一個請求到服務器時,如果服務器返回的回應代碼是 200 OK,這意味著該請求已經成功處理,服務器已經返回所需的內容,客戶端可以根據返回的內容進行下一步操作;如果服務器返回的是 404 Not Found,這意味著客戶端所請求的內容不存在,客戶端需要提示用戶請求的資源不存在。以下是 HTTP 協議中常見的一些代碼: 1xx(Informational):這些代碼表示服務器已經接收到請求,但仍在處理中。 2xx(Successful):這些代碼表示請求已經成功處理。 3xx(Redirection):這些代碼表示客戶端需要採取進一步的操作才能完成請求。 4xx(Client Error):這些代碼表示客戶端發生了錯誤,請求無法完成。 5xx(Server Error):這些代碼表示服務器發生了錯誤,無法完成請求。 以下是常見的 HTTP 協議代碼: 200 OK:請求已經成功處理,並返回所需的內容。 301 Moved Permanently:請求的網頁已經永久轉移到新位置。 302 Found:請求的網頁暫時轉移到新位置。 400 Bad Request:請求的語法不正確。 401 Unauthorized:未經授權,無法訪問所需內容。 403 Forbidden:已經獲得授權,但仍無法訪問所需內容。 404 Not Found:所請求的內容不存在。 500 Internal Server Error:服務器內部錯誤,無法處理請求。 15.3 Using Chrome DevTools Chrome DevTools是一款由Google開發的網頁開發工具,可以幫助開發人員進行網頁測試、網頁性能分析、網頁設計等工作。DevTools提供了豐富的功能,包括元素查看器、Console、網絡監測器、源代碼編輯器等,可讓開發人員在開發過程中快速找到和解決問題。此外,DevTools還可以幫助開發人員模擬不同設備、網速,以及對網站進行性能分析和優化,提高網站的速度和使用體驗。 15.3.1 Observing web request 在開始網頁爬蟲之前,我們需要找到網頁中的JSON數據,以便進行後續的數據提取和處理。使用Chrome DevTools可以很容易地找到網頁背後的JSON檔案。以下是一些步驟: 打開Chrome瀏覽器,進入要爬取的網站。 按下F12鍵或右鍵點擊網頁上的任意位置並選擇「檢查」來開啟DevTools。 在DevTools中,選擇「Network」分頁。 在瀏覽器中執行您要查找JSON數據的操作,例如點擊一個按鈕或輸入一個查詢。 在DevTools的網絡監測器中,您可以看到所有網頁請求(Request)和回應(Response),包括我們感興趣的JSON檔案。如果您只想查看JSON請求,可以在過濾器中輸入「json」。 點選JSON請求,您可以查看Request和Response中的的詳細信息,包括URL、Headers、Request Payload和Response等。 在Response分頁中,您可以看到JSON數據的內容。如果JSON數據很大,您可以右鍵點擊JSON數據,然後選擇「Save Response As...」將其保存到本地檔案中。 "],["scraping-104.html", "Chapter 16 Scraping 104.com 16.1 Complete Code 16.2 Step-by-Step", " Chapter 16 Scraping 104.com 16.1 Complete Code 撰寫爬蟲時需要載入許多不同的函式庫,其中包括用於 HTTP 請求的httr,以及用於解析 JSON 數據的jsonlite。 httr:httr 庫是 R 語言中用於發送 HTTP 請求和處理 HTTP 響應的函式庫,它提供了一組簡單易用的函數,可以讓使用者方便地設置 HTTP 請求的各種參數,如 URL、HTTP 方法、HTTP 頭、HTTP 主體等,並處理 HTTP 響應的內容和狀態碼等。 jsonlite:jsonlite 庫是 R 語言中用於解析和生成 JSON 數據的函式庫,它提供了 fromJSON() 函數,可以將 JSON 字符串轉換為 R 物件,並提供 toJSON() 函數,可以將 R 物件轉換為 JSON 字符串。這個函式庫通常用於處理 API 回應數據中的 JSON 格式數據。 library(tidyverse) library(httr) library(jsonlite) # options(stringsAsFactors = F) all.df <- tibble() refer_url <- "https://www.104.com.tw" for(p in 1:10){ url <- str_c('https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&order=12&asc=0&page=', p, "&mode=s&jobsource=2018indexpoc") print(p) res <- GET(url, add_headers("referer"=refer_url)) %>% content("text") %>% fromJSON() res$data$list$tags <- NULL res$data$list$link <- NULL all.df <- bind_rows(all.df, res$data$list) } all.df$jobNo %>% unique %>% length 16.2 Step-by-Step 16.2.1 Get the first pages 這段程式碼是用於爬取104人力銀行網站上與「資料科學」相關的職缺資訊,並將其存儲到名為df2的Data.Frame中。首先,我們嘗試點選104人力銀行網站上的第1頁、第2頁和第3頁的職缺搜尋結果,並將這三個網址儲存為三個URL變量,應該不難觀察到,這三個網址有何差別?僅有page=1、page=2、page=3有所差別。接下來,我們使用R語言中的httr套件中的GET()函數,將URL作為參數傳入,從網站中獲取對應的數據,並使用fromJSON()函數將該JSON格式的內容轉換為R中的Data.Frame格式。下面程式在獲取第2頁數據時,使用了add_headers()函數設置了一個HTTP header,用於識別HTTP請求的來源。 這段程式碼使用了add_headers函數添加了一個名為「Referer」的HTTP header。這個header的作用是告訴104人力銀行網站,訪問這個頁面的用戶是從哪個網頁轉跳過來的,也就是告訴網站當前HTTP請求的來源。具體來說,這裡設置的「Referer」值為https://www.104.com.tw/,代表我們偽裝這個請求是來自於104人力銀行首頁。如果沒有這個Referer,該網站會認為你是一個可疑的爬取,從沒根據和不當的頁面或用不當的方式(例如爬蟲)連過來。 對的!人家網站不歡迎你爬它,所以我們應止於測試。 url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc" # Assigning the 2nd page data url to url2 url2 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&order=14&asc=0&page=2&mode=s&jobsource=2018indexpoc" # Assigning the 3rd page data url to url3 url3 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=3&mode=s&jobsource=2018indexpoc" # Getting back the url1 data, assigning to result1 res <- GET(url2, config = add_headers("Referer" = "https://www.104.com.tw/")) res1 <- content(res, "text") %>% fromJSON() result2 <- fromJSON(content(GET(url2), "text")) # Tracing variable result2 and finding the data.frame, assigning to df2 df2 <- res1$data$list 16.2.2 Get the first page by modifying url # Guessing the 1st page data url to url1 url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc" # Getting back the 1st page data url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc" result1 <- fromJSON(content(GET(url1), "text")) df1 <- result1$data$list 16.2.3 Combine two data with the same variables # all.df <- bind_rows(df1, df2) # will raise error # Error in bind_rows_(x, .id) : # Argument 31 can't be a list containing data frames 16.2.4 Drop out hierarchical variables Preserving numeric or character, dropping list of data.frame by assigning NULL to the variable # Drop list and data.frame inside the data.frame df1$link <- NULL df1$tags <- NULL df2$link <- NULL df2$tags <- NULL # Re-binding two data.frame df1 and df2 all.df <- bind_rows(df1, df2) 16.2.5 Dropping hierarchical variables by dplyr way # Getting the 1st page data and dropping variable tags and link # Assigning to df1 df1 <- result1$data$list %>% select(-tags, -link) # Getting the 2nd page data and dropping variable tags and link # Assigning to df2 df2 <- result2$data$list %>% select(-tags, -link) # binding df1 and df2 all.df <- bind_rows(df1, df2) 16.2.6 Finding out the last page number # Tracing the number of pages in result1 last_page_num <- result1$data$totalPage # Checking the availability of the last page # Examining if the last page data available by re-composing URL with paste0() url.last_page <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", last_page_num, "&mode=s&jobsource=2018indexpoc") # Getting back and parsing the last page data result.last_page <- fromJSON(content(GET(url.last_page), "text")) 16.2.7 Using for-loop to get all pages for(p in 1:last_page_num){ url <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", p, "&mode=s&jobsource=2018indexpoc") result <- fromJSON(content(GET(url), "text")) temp.df <- select(result$data$list) print(paste(p, nrow(temp.df))) } 16.2.8 combine all data.frame # The 1st url of the query url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc" # Getting back the 1st page data result1 <- fromJSON(content(GET(url1), "text")) # Tracing and getting total number of page last_page_num <- result1$data$totalPage # Truncating hierarchical variables: link and tags all.df <- select(result1$data$list, -link, -tags) # for-loop to getting back data and joining them for(p in 1:last_page_num){ url <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", p, "&mode=s&jobsource=2018indexpoc") result <- fromJSON(content(GET(url), "text")) temp.df <- select(result$data$list) all.df <- bind_rows(all.df, temp.df) print(paste(p, nrow(all.df))) } "],["read_json.html", "Chapter 17 Read JSON 17.1 Reading JSON 17.2 Case 1: Air-Quality (well-formatted ) 17.3 Practices: traversing json data 17.4 Case 2: cnyes news (well-formatted) 17.5 Case 3: footRumor (ill-formatted) 17.6 Reviewing JSON 17.7 ", " Chapter 17 Read JSON jsonlite套件提供了處理 JSON 格式資料的功能。 # loading jsonlite package to parse a textual json file to an R object library(jsonlite) 17.1 Reading JSON 17.1.1 JSON as a string fromJSON('{\"a\":1, \"b\":2}')。 這是一個 JSON 物件,由一對大括號 {} 包圍。 該物件中有兩個鍵值對,用逗號 , 分隔。 第一個鍵值對中,鍵 a 對應的值為數字 1。 第二個鍵值對中,鍵 b 對應的值為數字 2。 fromJSON('[{\"a\":1, \"b\":2}, {\"a\":1, \"b\":3}]') 這是一個 JSON 陣列,由一對中括號 [] 包圍。 該陣列中有兩個元素,用逗號 , 分隔。 每個元素都是一個 JSON 物件,由一對大括號 {} 包圍。 第一個元素的 JSON 物件中,鍵 a 對應的值為數字 1,鍵 b 對應的值為數字 2。 第二個元素的 JSON 物件中,鍵 a 對應的值為數字 1,鍵 b 對應的值為數字 3。 library(jsonlite) lst <- fromJSON('{"a":1, "b":2}') class(lst) #list ## [1] "list" lst$a ## [1] 1 fromJSON('[{"a":1, "b":2}, {"a":1, "b":3}]') ## a b ## 1 1 2 ## 2 1 3 tbl <- fromJSON('[{"a":1, "b":2}, {"a":1, "b":3}, {"a":5, "b":7}]') class(tbl) # a data.frame ## [1] "data.frame" tbl$a[1] ## [1] 1 17.1.2 JSON as a local file 有時候JSON在編製的過程會記錄很多詮釋資料,所以不見得會把資料放在第一層,因此要嘗試去「trace」它才會知道資料在哪裡。例如以下範例是爬蟲爬回來的104職缺查詢結果,可猜想資料應放在如下結構中: { "data": { "list": [ ... ] } } library(jsonlite) raw <- read_json("data/url_104.json") raw$data$list[[1]] ## $jobType ## [1] "2" ## ## $jobNo ## [1] "10788904" ## ## $jobName ## [1] "約聘資料分析師(T45駐點食藥署)" ## ## $jobNameSnippet ## [1] "約聘<em class='b-txt--highlight'>資料分析</em>師(T45駐點食藥署)" ## ## $jobRole ## [1] "1" ## ## $jobRo ## [1] "1" ## ## $jobAddrNoDesc ## [1] "台北市南港區" ## ## $jobAddress ## [1] "" ## ## $description ## [1] "1.負責資料標準化、探勘及分析工作\\r\\n2.依客戶需求產出[[[資料分析]]]報告\\r\\n3.其他交辦工作" ## ## $optionEdu ## [1] "大學" ## ## $period ## [1] "00" ## ## $periodDesc ## [1] "經歷不拘" ## ## $applyCnt ## [1] "00005" ## ## $applyDesc ## [1] "0~5人應徵" ## ## $custNo ## [1] "97162640000" ## ## $custName ## [1] "關貿網路股份有限公司" ## ## $coIndustry ## [1] "1001001001" ## ## $coIndustryDesc ## [1] "電腦系統整合服務業" ## ## $salaryLow ## [1] "0033000" ## ## $salaryHigh ## [1] "0050000" ## ## $salaryDesc ## [1] "月薪 33,000~50,000元" ## ## $s10 ## [1] "50" ## ## $appearDate ## [1] "20191004" ## ## $appearDateDesc ## [1] "10/04" ## ## $optionZone ## [1] "9703424" ## ## $isApply ## [1] "0" ## ## $applyDate ## [1] "" ## ## $isSave ## [1] "0" ## ## $descSnippet ## [1] "1.負責資料標準化、探勘及分析工作\\r\\n2.依客戶需求產出<em class='b-txt--highlight'>資料分析</em>報告\\r\\n3.其他交辦工作" ## ## $tags ## $tags[[1]] ## [1] "上市上櫃" ## ## $tags[[2]] ## [1] "員工560人" ## ## ## $link ## $link$applyAnalyze ## [1] "//www.104.com.tw/jobs/apply/analysis?j=64404a2d3a4c445c3738406932343d208466649725c4c4627272727273e34402b826j52&channel=104rpt&jobsource=apply_analyze" ## ## $link$job ## [1] "//www.104.com.tw/job/6f8rs?jobsource=jolist_c_relevance" ## ## $link$cust ## [1] "//www.104.com.tw/company/18mw4ku8?jobsource=jolist_c_relevance" ## ## ## $jobsource ## [1] "jolist_c_relevance" ## ## $jobNameRaw ## [1] "約聘資料分析師(T45駐點食藥署)" ## ## $custNameRaw ## [1] "關貿網路股份有限公司" 17.1.3 JSON as a web file 當你使用手機上的 App 查看天氣、查詢公車路線、搜尋商品資訊時,你會注意到這些 App 看起來很不同,但它們都可以透過 Web API 來存取相同的資訊來源。簡單來說,Web API 就像是一種「資訊櫃檯」,提供存取資料的服務,它允許不同的應用程式通訊,以存取、分享、更新或刪除資料。透過 Web API,其他應用程式可以查詢、存取、下載、上傳、更新等操作資料,而不需要直接與資料庫或其他應用程式進行通訊。 舉例來說,一個網站可能有一個 Web API,它可以提供網站上所有文章的標題和內容。當其他網站或 App 需要獲取這些文章時,它們可以向該 Web API 發送請求,獲取所需資料。這樣就可以在不同的應用程式之間分享資料,提高效率和便利性。 Web API 和 JSON 之間的關係在於,Web API 通常會將回應資料以 JSON 的格式返回,以便接收方應用程式可以方便地解析和使用該資料。當一個應用程式需要從另一個應用程式獲取資料時,它可以透過 Web API 發送請求,並期望以 JSON 格式獲取回應。 如果該JSON是網頁伺服器所提供的Web API,以下程式碼示範了如何使用 R 語言中的 httr 和 jsonlite 套件,透過 HTTP GET() 請求獲取 Web API 所提供的 JSON 資料。以下是程式碼的解釋: GET(\"https://tcgbusfs.blob.core.windows.net/blobyoubike/YouBikeTP.json\") :使用 httr 套件中的 GET 函數來發送 HTTP GET 請求,並取得 Web API 所提供的 JSON 資料。 %>% content(\"text\") :content(\"text\") 表示將 HTTP 回應的資料轉換為純文字格式,便於後續處理。當我們把該純文字格式打開後,會發現他以JSON格式書寫。 %>% fromJSON() :一旦確認回傳的訊息以JSON格式書寫,那麼就可以用jsonlite套件的fromJSON()將該文字字串轉為R的物件。 library(httr) library(jsonlite) raw <- GET("https://tcgbusfs.blob.core.windows.net/blobyoubike/YouBikeTP.json") %>% content("text") %>% fromJSON() write_json(raw, "data/opendata_ubike_202304261243.json") 你可以讀取本書預先爬取好的json檔來觀察前述程式所爬回的json檔轉成R物件後的結果。 raw <- fromJSON("data/opendata_ubike_202304261243.json") raw$retVal[["0001"]] ## $sno ## [1] "0001" ## ## $sna ## [1] "捷運市政府站(3號出口)" ## ## $tot ## [1] "84" ## ## $sbi ## [1] "72" ## ## $sarea ## [1] "信義區" ## ## $mday ## [1] "20221030161036" ## ## $lat ## [1] "25.0408578889" ## ## $lng ## [1] "121.567904444" ## ## $ar ## [1] "忠孝東路/松仁路(東南側)" ## ## $sareaen ## [1] "Xinyi Dist." ## ## $snaen ## [1] "MRT Taipei City Hall Stataion(Exit 3)-2" ## ## $aren ## [1] "The S.W. side of Road Zhongxiao East Road & Road Chung Yan." ## ## $bemp ## [1] "12" ## ## $act ## [1] "1" 17.1.4 Practice. Convert ubike json to data.frame 當你把ubike的資料給載回來並轉為R的物件後,你會發現該物件是一層又一層的named list,也就是每個list或每個值都有他的名字(name)。這是因為原本ubike的JSON格式是一層又一層的dict(Dictionary),全部是key-to-value的對應。這也是一種常見的Web API編法。 本練習希望你做的便是,希望你把這個好幾個階層的list,轉為一個以列(Rows)為每筆資料,欄(Columns)為變項的data.frame。 17.2 Case 1: Air-Quality (well-formatted ) 前往 https://data.gov.tw/dataset/40448對JSON 檔案按右鍵,然後複製連結,例如 “https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON”。 (但是,連結地址,特別是 api_key=9be7b239-557b-4c10-9775-78cadfc555e9,每次都會更改。所以你必須要自己嘗試)。 url <- "https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON" df <- fromJSON(content(GET(url), "text", encoding = "utf-8")) df %>% glimpse() df$records %>% head() %>% knitr::kable(format = "html") 17.2.1 Using knitr::kable() for better printing df$records %>% head() %>% knitr::kable(format = "html") 17.2.2 Step-by-step: Parse JSON format string to R objects fromJSON(content(GET(url), \"text\", encoding = \"utf-8\"))由內到外有三個函式。 * httr::GET()按照指定的url發出GET request把網頁抓回來,如果是個合乎規定存取,就會順利取回該伺服器發的response。 * hrrt::content(response, \"text\", encoding = \"utf-8\") 用?content查詢看看content(response, \"text\")的用途。其是把抓回來的檔案,轉為純文字的字串。content()是把抓回來的response解成純文字(JSON本身就是以純文字儲存,只是格式特別而已)。 jsonlite::fromJSON() 因為我們用眼睛看就知道他是個JSON格式的檔案,所以用fromJSON()這個函式,把用JSON格式編成的字串轉為R的物件,有可能是data.frame或list。fromJSON()預期會把JSON中[]的每一個項目轉為一筆筆的資料,然後把{}的pair當成column的變數名稱 17.2.2.1 Step 1. GET() 發送請求 向該URL的伺服器發送GET() request以取得該檔案。若成功取得,他會回覆一個HTML status code(你可上網查詢看看有哪些Status code)。如果成功的話就是2開頭的數字例如200 OK代表該伺服器接受該請求並開始傳回檔案。 # Getting url back by GET() response <- GET(url) # Inspecting returned data response class(response) (Tips) Using ?httr::GET to inspect the function 17.2.2.2 Step 2. httr::content() 將回應資料的轉純文字 回應的資料看他的class是一個response,但如果看Global Environment看來是個list,裡面裝載很多資料,而主要核心的內容在content這個欄位,但看來是用binary code裝起來的,而不是純文字。 因此,對於這個抓回來的檔案,我需要用httr::content()幫忙把純文字給解出來。經查詢help可得知content()後面的參數有三類,其中可以要轉為純文字的就是content(response, \"text\")。因此偵測轉出來的變數會是長度為1的character。 # Parsing to textual data by content() text <- content(response, "text", encoding = "utf-8") nchar(text) cat(text) class(text) length(text) (Tips) using ??httr::content to inspect the function 17.2.2.3 Step 3. fromJSON(): 將JSON格式文字轉為R物件 最後是將這個character轉為R的物件,也就是data.frame或list。注意,此時text是一個character,那是我們知道他是用JSON格式編寫的文字檔,就像我們知道.csv檔是用逗號分隔表示法依樣,JSON就是用層層疊疊的[]{}記號來表述資料的結構。 並要提醒初學者,.json或.csv都只是幫助程式初步篩選檔案的副檔名罷了,這兩種類型的檔案跟.txt檔一樣,都被歸屬為Win系統所謂的「純文字文件檔案」(就打開以後看得到文字的意思)。裡面的究竟是不是個完整的json檔這都要去看、去測。我自然也可以在.json的檔案裡偷偷亂用逗號分隔模式撰寫。 df <- fromJSON(text) dim(df) glimpse(df) ?fromJSON 17.2.3 Combining all UVI Open data: https://data.gov.tw/dataset/6076 https://data.epa.gov.tw/api/v2/uv_s_01?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=publishtime desc&format=JSON 17.2.3.1 Get from web api # specify data url url <- "https://data.epa.gov.tw/api/v2/uv_s_01?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=publishtime%20desc&format=JSON" # GET(), content(), then converting to R object by fromJSON() raw <- fromJSON(content(GET(url), "text", encoding = "utf-8")) 17.2.3.2 Read from pre-saved JSON 你可以讀取本書預先爬取好的json檔來觀察前述程式所爬回的json檔轉成R物件後的結果。 # You can read the pre-crawled JSON file to observe the R object. raw <- fromJSON("data/opendata_uvi_202304261215.json") raw$records %>% head %>% knitr::kable() sitename uvi publishagency county wgs84lon wgs84lat publishtime 宜蘭 0.00 中央氣象局 宜蘭縣 121,45,24 24,45,50 2023-04-26 00:00 大武 0.00 中央氣象局 臺東縣 120,54,14 22,21,20 2023-04-26 00:00 玉山 0.00 中央氣象局 南投縣 120,57,34 23,29,15 2023-04-26 00:00 臺南 0.00 中央氣象局 臺南市 120,12,17 22,59,36 2023-04-26 00:00 新竹 0.01 中央氣象局 新竹縣 121,00,51 24,49,40 2023-04-26 00:00 日月潭 0.00 中央氣象局 南投縣 120,54,29 23,52,53 2023-04-26 00:00 預期結果 sitename uvi publishagency county wgs84lon wgs84lat publishtime 宜蘭 0.00 中央氣象局 宜蘭縣 121,45,24 24,45,50 2023-04-26 00:00 大武 0.00 中央氣象局 臺東縣 120,54,14 22,21,20 2023-04-26 00:00 玉山 0.00 中央氣象局 南投縣 120,57,34 23,29,15 2023-04-26 00:00 臺南 0.00 中央氣象局 臺南市 120,12,17 22,59,36 2023-04-26 00:00 新竹 0.01 中央氣象局 新竹縣 121,00,51 24,49,40 2023-04-26 00:00 日月潭 0.00 中央氣象局 南投縣 120,54,29 23,52,53 2023-04-26 00:00 17.3 Practices: traversing json data 下列這些網路文件應該都是json檔,請在以下的練習中,一個一個把他帶入把他抓回來看看。並用str()或dplyr::glimpse()觀察資料的內容。注意,如果你用了View()會沒辦法knit成html檔。又,每個不同的Web API存放的核心資料階層都不一樣,你必須要嘗試找到該多筆資料所在的data.frame。例如url_cnyes的資料便放在raw$items$data這樣的階層底下。 如果你無法順利撈取,你可以運用本書所預備的url_cnyes.json來做觀察json結構的練習。 url_pchome <- "https://ecshweb.pchome.com.tw/search/v3.3/all/results?q=iphone&page=1&sort=rnk/dc" url_ubike <- "https://tcgbusfs.blob.core.windows.net/blobyoubike/YouBikeTP.json" url_cnyes <- "https://news.cnyes.com/api/v3/news/category/headline?startAt=1588262400&endAt=1589212799&limit=30" raw <- fromJSON(content(GET(url_cnyes), "text", encoding = "utf-8")) # raw <- fromJSON("data/url_cnyes.json") raw$items$data 17.4 Case 2: cnyes news (well-formatted) 第二類是最常會見到的例子,解出來的資料是個很多階層的list,通常一筆資料傳回來時多會附加一些metadata,比方說,一共幾筆資料、下一個資料區塊在哪裡,好讓使用者或者本地端的瀏覽器能夠繼續取得下一筆資料。因此,資料通常會在樹狀節點的某一個子節點。 url_cnyes <- "https://news.cnyes.com/api/v3/news/category/headline?startAt=1588262400&endAt=1589212799&limit=30" res <- fromJSON(content(GET(url_cnyes), "text", encoding = "utf-8")) glimpse(res) raw <- fromJSON("data/url_cnyes.json") df <- raw$items$data head(df) ## newsId title ## 1 4475846 〈財報〉疫情衝擊 Under Armour Q1營收大減23% ## 2 4475874 若一年內疫情未控制 避險基金大佬:美國將面臨第2次經濟大蕭條 ## 3 4475873 〈美股早盤〉市場憂經濟重啟條件不成熟 道瓊早盤跌逾200點 ## 4 4475465 挽救國家財政危機 沙烏地撙節支出266億美元 ## 5 4475875 長榮攜手海大開輪機工程專班 實習後正職月薪15萬元 ## 6 4475855 泰鼎-KY首季每股純益 1.5元 僅次健鼎 ## content ## 1 <p>美國運動用品大廠 Under Armour (UAA-US) 於週一 (11 日) 盤前公佈 2020 財年第一季財報,受到新冠肺炎 (COVID-19) 疫情影響,導致零售業者被迫關閉店面,該公司於 Q1 營收及獲利雙雙不如市場預期。</p>\\n\\n<p>受到財報表現不佳的影響,Under Armour 股價應聲下跌,於週一 (11 日) 台北時間晚上 10 時許,該公司股價下跌 10.97%,報每股 8.85 美元。自今年以來,Under Armour 股價已下跌了 54%。</p>\\n\\n\\n\\n<p><em>基於 non GAAP 財報關鍵數據:</em></p>\\n\\n<ul>\\n<li>營收:9.302 億美元,較去年同期的 12 億美元衰退,且低於市場預估值 9.49 億美元</li>\\n<li>稅後淨損:5.897 億美元,去年同期報稅後淨利 2250 萬美元</li>\\n<li>每股虧損:0.34 美元,低於市場預估值每股虧損 0.19 美元,去年同期每股盈餘報 0.05 美元</li>\\n</ul>\\n\\n<p>由於疫情重創買氣,導致零售產業受到嚴重打擊,Under Armour CEO Patrik Frisk 表示,自 3 月中旬開始,疫情於北美地區快速蔓延,導致零售店面被迫關閉,並造成 Q1 營收大幅衰退 23%。</p>\\n\\n<p>根據不同產品類別來看,Q1 服裝銷售下滑了 23%,報 5.98 億美元,鞋類銷售下滑 28%,報 2.1 億美元,配件銷售則下滑 17%,報 6800 萬美元。</p>\\n\\n<p>根據不同銷售市場來看,Q1 北美營收下滑 28%,報 6.09 億美元,北美以外其他地區銷售則下滑 12%,報 2.87 億美元。北美地區的營收佔了 Under Armour 總營收的 65%。</p>\\n\\n<p>此外,該公司表示,截至第一季為止,該公司帳上現金為 9.59 億美元。另外,預估今年的資本支出金額將達 1 億美元,低於較先前所預估的 1.6 億美元。</p>\\n\\n<p>Under Armour 的營收成長,相當仰賴百貨公司等通路的銷售表現,但受到封鎖措施的影響,導致百貨公司被迫關閉。</p>\\n\\n<p><em>公司展望:</em></p>\\n\\n<p>隨著美國宣佈實施經濟重啟計劃,包括梅西百貨 (M-US) 及 GAP(GPS-US) 皆規劃逐步重新恢復營業,但 Under Armour 卻於週一 (11 日) 表示,對於營業恢復的時程尚不確定。</p>\\n\\n<p>此外,為了減輕疫情的衝擊,該公司計劃於 2020 年削減 3.25 億美元營運成本,包括暫時裁員部份零售店面的員工。由於疫情導致營運不確定性高,該公司已於上個月撤回了對於 2020 全年的財務預測。</p>\\n ## 2 <p>美國知名避險基金經理人、Tudor Investment Corp. 創辦人 Paul Tudor Jones 週一 (11 日) 警告,若疫情在一年之內無法獲得控制,美國經濟將會陷入「第二次」經濟大蕭條。</p>\\n\\n<p>Tudor Jones 表示:「若一年後我們依舊處於相同狀況,這將會形成第二次經濟大蕭條,這一切取決於封鎖措施是否解除。」</p>\\n\\n<p>相較於中國、南韓等國在疫情控制及追蹤方面的努力,美國人對於自由的重視,正可能成為防疫過程中的一大阻礙,美國公衛專家即警告,若疫情尚未明顯趨緩即解封經濟,那麼可能帶來第二波的疫情蔓延。</p>\\n\\n<p>Tudor Jones 說道:「與其他國家不同,我認為美國最大優勢在於個人主義,也就是對自由的熱愛,然而這在疫情之下卻是我們最大的弱點,看看在這方面取得成功的亞洲國家,他們的選擇顯示比起個人權利,他們更加重視社會價值觀。」</p>\\n\\n<p>由於投資人認為經濟終將重啟,美股在今年 3 月創下史上最快步入熊市的紀錄後,正自低點迅速反彈,標普 500 指數已自疫情爆發後的底點反彈 30% 以上,且和紀錄高點僅相差 13.6%。</p>\\n\\n\\n\\n<p>Tudor Jones 認為這波反彈相當容易預測,並強調未來走勢在很大程度上取決於疫情防控作業,重點將從流動性轉移到償債能力。</p>\\n\\n<p>「若還是無法找到疫苗或治療方法,或者是更適合的大規模檢測方案,市場將會面臨更加艱難的時刻。」Tudor Jones 表示。</p>\\n ## 3 <p>自上週以來,由於各國政府開始逐步放寬封鎖措施,並重新開放經濟活動,帶動美股呈現上揚的趨勢。但是,近日來部份國家傳出新冠疫情再度惡化的消息,除了南韓新增確診病例快速攀升之外,日本及新加坡的新增病例亦呈增加趨勢,顯示疫情的狀況仍不穩定,導致投資人不安情緒升溫,並衝擊了市場對於經濟重啟的信心。</p>\\n\\n<p>由於擔憂若過早重啟經濟,將可能冒著第二波疫情感染的風險,美股於週一 (11 日) 開盤 4 大指數皆下跌,另外,與疫情關聯性較高的產業,包括航空、零售、郵輪及賭場等,股價亦呈現下跌的趨勢,道瓊早盤下跌超過 200 點。</p>\\n\\n<p><em>新冠肺炎疫情</em></p>\\n\\n<p>英國首相強生 (Boris Johnson) 於上週日 (10) 宣佈了解除英國封鎖並重啟經濟的「首批謹慎步驟」,呼籲英國各地的人們重返工作崗位。強生強調,不會立即結束封鎖,但自週三 (13 日) 起,將放鬆對人們行動的限制,從戶外體育運動時間不再設限開始,例如高爾夫和網球,並允許人們開車前往公園和海灘。</p>\\n\\n<p>新冠疫情於西歐國家呈現放緩的跡象,但於俄羅斯卻日益嚴重,不僅連續數日的單日新增確診病例皆突破 1 萬例,且累計確診病例數已突破 20 萬例,並超越德國及法國,成為全球疫情第五嚴重的國家。</p>\\n\\n<p><em>中美貿易協議</em></p>\\n\\n<p>美國智庫戰略及國際研究中心 (CSIS) 上週五 (8 日) 發佈報告預計,新冠疫情將導致今年中國對美採購量遠低第一階段貿易協議的要求。</p>\\n\\n<p>美中矛盾因疫情衝擊而逐漸加劇,使外界對於第一階段貿易協議的現況感到疑慮,儘管兩國最高官員上週同意持續落實貿易協議,同時保持溝通協調,美國總統川普仍在上週五 (8 日) 表示,疫情衝擊大大改變他對於協議的觀感,對於是否終止協議感到相當掙扎。</p>\\n\\n<p><em>截至台北時間週一 (11 日)22 時許:&nbsp;</em></p>\\n\\n<ul>\\n<li>道瓊指數下跌 241.98 點或 -0.99%,暫報 24089.34 點</li>\\n<li>那斯達克下跌 44.12 點或 -0.48%,暫報 9077.20 點</li>\\n<li>標普 500 下跌 24 點或 -0.82%,暫報 2905.80 點</li>\\n<li>費半下跌 15.59 點或 -0.88%,暫報 1760.02 點</li>\\n<li>台積電 ADR 下跌 0.64% 至每股 52.53 美元</li>\\n<li>十年期美債殖利率上漲至 0.686%</li>\\n<li> 紐約輕原油上漲 0.97% 至每桶 24.98 美元</li>\\n<li>布蘭特原油下跌 0.16% 至每桶 30.92 美元</li>\\n<li>黃金下跌 0.41% 至每盎司 1706.85 美元</li>\\n<li>美元指數上漲 0.31% 至 100.078 點 &nbsp;</li>\\n</ul>\\n\\n\\n\\n<p><em>焦點個股:</em></p>\\n\\n<p><em>特斯拉 (TSLA-US)</em></p>\\n\\n<p>特斯拉早盤下跌 3.46%,達 790.68 美元。</p>\\n\\n<p>根據中國乘用車市場信息聯席會於週一 (11 日) 報告指出,儘管 4 月份中國整體電動車市場呈現成長的趨勢,但特斯拉平價車款 Model 3 的銷售,卻較 3 月份暴跌了 64%,由 10160 輛減少至 3635 輛。此外,特斯拉在今年 1 月至 4 月,於中國的 Model 3 車款累計銷售量則達 19705 輛。</p>\\n\\n<p>特斯拉執行長馬斯克 (Elon Musk) 於日前表示,為了使中國消費者能夠獲得電動車補貼的資格,已調降了 Model 3 於中國的銷售價格。此外,特斯拉亦致力於降低生產成本,因此,即使調降了銷售價格,該公司仍舊可以維持穩定的毛利率。</p>\\n\\n<p><em>蘋果 (AAPL-US)</em></p>\\n\\n<p>蘋果早盤下跌 0.80%,達 307.61 美元。&nbsp;</p>\\n\\n<p>據報導指出,蘋果正計劃將該公司近五分之一的產能從中國轉移到印度,並通過富士康和緯創資通等合作製造商,擴大印度當地的生產業務,未來五年內投資規模可能升至 400 億美元,也可能使印度成為蘋果商品最大出口國。</p>\\n\\n<p>數據顯示,蘋果的產品中有 90% 以上的產能來自中國。其中,iPhone 的代工生產很大一部分來自富士康與和碩。在 2015 年時,蘋果代工廠富士康就曾與印度達成備忘錄,同意加大對印度製造業的投資,並有計劃於 2020 年在印度建立 10 至 12 家製造消費電子產品的工廠。</p>\\n\\n<p><em>Under Armour (UAA-US)</em></p>\\n\\n<p>Under Armour 早盤下跌 7.95%,達 9.15 美元。</p>\\n\\n<p>美國運動用品大廠 Under Armour 於週一 (11 日) 盤前公佈 2020 財年第一季財報,受到疫情影響,導致零售業者被迫關閉店面,該公司於 Q1 營收衰退 23% 至 9.3 億美元。其中,服裝銷售下跌了 23%,鞋類銷售下滑 28%,配件銷售則下滑 17%。</p>\\n\\n<p>此外,疫情亦造成 Under Armour 獲利能力大幅下降,Q1 稅後淨損報 5.89 億美元,每股損失 0.34 美元。去年同期稅後淨利則為 2250 萬美元,每股盈餘為 0.05 美元。</p>\\n\\n<p><em>今日關鍵經濟數據:</em></p>\\n\\n<p><em>無</em></p>\\n\\n<p><em>華爾街分析:</em></p>\\n\\n<p>Vital Knowledge 創辦人 Adam Crisafulli 表示,全球經濟呈現逐步重啟的態勢,預期在接下來幾週,開放的速度將會加速,但儘管如此,目前 S&amp;P 500 的估值仍屬被高估的狀態。</p>\\n\\n<p>Principal Global Investors 經濟學家 Bob Baur 亦表示,全球疫情逐漸好轉的消息、以及對於經濟成長的預期,目前皆已被反映在股價的估值上。</p>\\n\\n<p>穆迪首席經濟學家 Mark Zandi 警告,各州過早重新開放企業是一次豪賭,如果因此出現第二波感染潮,將引發經濟蕭條。Zandi 表示,市場認為 V 型復甦的可能性很高,而隨著美國企業重新開放,就業有望從 5 月最後一週開始反彈,如果不出現第二波感染,就業增長將從夏季持續至秋季初。</p>\\n ## 4 <p>為挽救低油價及疫情帶來的國家財政危機,沙烏地阿拉伯週一 (11 日) 宣布自 6 月起停發生活津貼,同時將加值稅上調三倍,撙節支出總計 266 億美元。</p>\\n\\n<p>受外在因素衝擊,財政部長賈丹 (Mohammed Al-Jadaan) 認為沙國正處於財政危機邊緣,宣布縮減「願景 2030」(Vision 2030) 經濟改革計劃內的部分措施,國家將自 6 月 1 日起停發生活津貼,並自 7 月 1 日起將加值稅上調三倍至 15%,總計削減規模達 266 億美元。</p>\\n\\n<p>賈丹稱道:「肺炎疫情導致政府收入下滑,對公共財政形成的壓力來到難以應付的水平,將衝擊國家中長期宏觀經濟及公共財政,因此我們必須削減開支,並採取相關措施來支撐非石油收入的穩定。」</p>\\n\\n<p>賈丹上週警告,沙國已數十年沒有經歷這種嚴重危機,強調該國必須大幅削減支出。根據統計,今年第一季沙國預算赤字約達 91 億美元,光是石油收入就減少 350 億美元,非石油收入則減少 170 億美元。</p>\\n\\n<p>由於各國政府相繼頒布旅遊及封鎖禁令,沙國已受到油價暴跌和原油減產的深刻影響。今年 3 月,國際原油基準布蘭特原油暴跌逾 50%,導致沙國央行的淨海外資產每月損失 270 億美元,創下歷史紀錄,3 月外匯存底以 20 年幾年來最快速度下滑。</p>\\n\\n\\n\\n<p>儘管高盛預計第二季石油收入將持續下滑,高盛經濟學家 Farouk Soussa 仍表示,預計沙國外匯存底損耗速度將逐漸放緩。</p>\\n ## 5 <p>為擴大培育國籍海事專業人才,長榮海運 (2603-TW) 今 (11) 日宣布,與國立台灣海洋大學再度合作開辦學士後多元專長培力方案(輪機工程學系專班),希望透過產業與學術密切合作,培養有志投身海勤工作的學員,並可在畢業後隨即就業,長榮指出,一旦正式成為長榮的海勤人員,月薪約 15 萬元。</p>\\n\\n<p>長榮說明,此專班的招生對象為非輪機科系畢業的學員,只要具備學士資格,役畢或免服兵役者皆可報考,通過遴選後開始就讀,修業時間為三學期,長榮海運將全額補助學雜費和部分住宿費用,自 5 月 12 日起開放報名,預計 9 月正式開學。</p>\\n\\n<p>而此方案是為配合長榮永續發展的專業人才需求,透過不同的管道來擴大培育優秀的國籍海事尖兵,並不影響海事科系學生到長榮實習和工作的機會。</p>\\n\\n<p>長榮於 2017 年開始與海洋大學開辦第一期學士後輪機技術人才專班,該期學員已於去年畢業,並有超過 90% 的學員通過交通部的航海人員一等管輪測驗,陸續上船實習;部分學員已依規定累積一年的實習資歷,取得管輪適任證書,正式成為長榮的海勤人員,月薪約 15 萬元,未來隨著海勤年資與經驗增加,並通過相關測驗,可逐級晉升為輪機長,月薪將達 28-30 萬元的水準。</p>\\n\\n<p>除了優渥的薪資外,長榮強調,貨櫃船隊提供舒適的住艙環境,並有圖書室、健身房、三溫暖及影音娛樂等設施,以及無線網路。</p>\\n ## 6 <p>PCB 廠泰鼎 - KY(4927-TW) 今 (11) 日公布日首季稅後純益達 2.85 億元,每股純益為 1.5 元,在已公布 2020 年第一季財報的 PCB 廠中,僅次健鼎 (3044-TW) 的每股純益 1.86 元,第三名則是臻鼎 (4958-TW) 的 0.97 元。</p>\\n\\n<p>泰鼎 2020 年首季營收 26.05 億元,毛利率 21%,季增 6 個百分點,年增 2 個百分點,稅後純益 2.85 億元,季增 5.06 倍、年增 11.8%,為單季次高,每股純益&nbsp;1.5 元,也優於去年同期&nbsp;1.43 元。</p>\\n\\n<p>泰鼎 4 月營收 10.14 億元,月增 23.2%、年增 28.4%,為 9 個月新高,也創單月歷年同期新高; 累計今年前 4 月營收 36.19 億元,年減 0.5%。</p>\\n\\n<p>展望第二季,泰鼎在 PC、家電、汽車、通訊四大區塊接單順利,預估營收相對第一季 26.05 億元,將雙位數成長。</p>\\n\\n<p>泰鼎目前在泰國擁有每月 500 萬平方呎 PCB 產能,第 3 廠已經動工,全部完工後每月將再增加 180 萬平方呎新產能。</p>\\n ## hasCoverPhoto isIndex ## 1 0 1 ## 2 0 1 ## 3 0 1 ## 4 0 1 ## 5 1 1 ## 6 1 1 ## summary ## 1 Under Armour (UAA-US) 於週一 (11 日) 盤前公佈 2020 財年第一季財報,受到新冠肺炎 (COVID-19) 疫情影響,導致零售業者被迫關閉店面,該公司於 Q1 營收及獲利雙雙不如市場預期。 ## 2 美國知名避險基金經理人、Tudor Investment Corp. 創辦人 Paul Tudor Jones 週一 (11 日) 警告,若疫情在一年之內無法獲得控制,美國經濟將陷入「第二次」經濟大蕭條。 ## 3 由於擔憂若過早重啟經濟,將可能冒著第二波感染的風險,美股於週一 (11 日) 開盤 4 大指數皆下跌,另外,與疫情關聯性較高的產業,包括航空、零售、郵輪及賭場等,股價亦呈現下跌的趨勢。道瓊指數下跌超過 200 點。 ## 4 為挽救低油價及疫情帶來的國家財政危機,沙烏地阿拉伯週一 (11 日) 宣布自 6 月起停發生活津貼,同時將加值稅上調三倍,撙節支出總計 266 億美元。 ## 5 長榮攜手海大開輪機工程專班 實習後正職月薪 15 萬元 ## 6 PCB 廠泰鼎 - KY(4927-TW) 今 (11) 日公布日首季稅後純益達 2.85 億元,每股純益為 1.5 元,在已公布 2020 年第一季財報的 PCB 廠中,僅次於健鼎 (3044-TW) 的每股純益 1.86 元,而第三為臻鼎。 ## isCategoryHeadline video payment ## 1 1 0 ## 2 1 0 ## 3 1 0 ## 4 1 0 ## 5 1 0 ## 6 1 0 ## otherProduct ## 1 USS:UAA:STOCK:COMMON, USS:M:STOCK:COMMON, USS:GPS:STOCK:COMMON ## 2 ## 3 TWS:2330:STOCK:COMMON, USS:TSLA:STOCK:COMMON, USS:AAPL:STOCK:COMMON, USS:UAA:STOCK:COMMON, USS:TSM:STOCK:COMMON ## 4 ## 5 TWS:2603:STOCK:COMMON ## 6 TWS:4927:STOCK:COMMON, TWS:3044:STOCK:COMMON, TWS:4958:STOCK:COMMON ## isOutsource publishAt ## 1 0 1589211902 ## 2 0 1589209204 ## 3 0 1589205268 ## 4 0 1589204403 ## 5 0 1589203838 ## 6 0 1589203802 ## coverSrc.xs.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/xs/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/xs/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.xs.width coverSrc.xs.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 100 56 ## 6 100 56 ## coverSrc.s.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/s/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/s/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.s.width coverSrc.s.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 180 101 ## 6 180 101 ## coverSrc.m.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/m/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/m/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.m.width coverSrc.m.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 380 214 ## 6 380 214 ## coverSrc.l.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/l/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/l/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.l.width coverSrc.l.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 640 360 ## 6 640 360 ## coverSrc.xl.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/xl/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/xl/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.xl.width coverSrc.xl.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 960 539 ## 6 960 540 ## coverSrc.xxl.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/xxl/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/xl/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.xxl.width coverSrc.xxl.height categoryId fundCategoryAbbr etf ## 1 NA NA 831 NULL NULL ## 2 NA NA 831 NULL NULL ## 3 NA NA 831 NULL NULL ## 4 NA NA 833 NULL NULL ## 5 1080 607 827 NULL NULL ## 6 960 540 827 NULL NULL ## fbShare fbComment fbCommentPluginCount ## 1 0 0 0 ## 2 0 0 0 ## 3 0 0 0 ## 4 0 0 0 ## 5 0 0 0 ## 6 0 0 0 ## market ## 1 NULL ## 2 NULL ## 3 2330, 台積電, TWS:2330:STOCK ## 4 NULL ## 5 2603, 長榮, TWS:2603:STOCK ## 6 4927, 3044, 4958, 泰鼎-KY, 健鼎, 臻鼎-KY, TWS:4927:STOCK, TWS:3044:STOCK, TWS:4958:STOCK ## source ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 ## 6 17.4.1 (option) 取回資料並寫在硬碟 有時候寫爬蟲尤其是在爬會即時更新的資料時,會需要反覆定時地抓資料,這時候通常會先通通抓回來再慢慢合併整理。此時要特別注意如何保持每次抓回來的資料都是獨特的一個資料。以下面的例子來講,因為每次檔名都是一樣的,他會一直覆蓋過去,所以再怎麼抓,都不會是歷時性資料。通常會自動讀取當下時間當成檔名的一部分,這樣就不會重複了。這將在日後youbike的例子中用到。 response <- GET(url_cnyes, write_disk("data/url_cnyes.json", overwrite=TRUE)) 17.5 Case 3: footRumor (ill-formatted) 食品闢謠的例子可能是個沒好好編過JSON的單位所編出來的案子,資料很簡單,但卻是一個list裡面有329個data.frame,且每個data.frame只有對腳現有資料,然後每一筆資料就一個data.frame。 url <- 'http://data.fda.gov.tw/cacheData/159_3.json' safefood <- fromJSON(content(GET(url),'text')) # write_json(safefood, "data/opendata_safefood_202304261256.json") 為了避免產製本書時出錯,本程式採用預備好的資料來練習。但仍建議你用前述方式自網路上爬取資料下來練習。 safefood <- fromJSON("data/opendata_safefood_202304261256.json") # str(safefood) class(safefood) ## [1] "list" class(safefood[[1]]) ## [1] "data.frame" dim(safefood[[1]]) ## [1] 5 5 # View(safefood[[1]]) # View(safefood) # print(content(GET(url), "text")) 17.5.1 處理非典型的JSON檔 但這時候也不難觀察到其規律性。既然每個data.frame是一筆資料,且資料都是照順序出現在對角線,那我就把data.frame給unlist()拆成vector後,把NA給移除了,那剩下的就是我們要的資料了。 但,由於對整筆資料unlist(),那整筆資料會變成一個很長的vector,不過我們知道每五個元素就是一筆資料。所以我可以嘗試用matrix()的指令,讓資料每五個就折成一筆資料。 程序大致上是 safefood.v <- unlist(safefood) 把資料unlist()。 safefood.v <- safefood.v[!is.na(safefood.v)]剔除NA值 safefood.m <- matrix(safefood.v, byrow = T, ncol = 5)照列來折,因為每五個就一筆資料,所以是照列折,然後用ncol = 5來指定五個一折。 # unlist data structure to a list safefood.v <- unlist(safefood) head(safefood.v) ## 分類1 分類2 分類3 分類4 分類5 標題1 ## "" NA NA NA NA NA # anyNA() to check if NAs still exist anyNA(safefood.v) ## [1] TRUE # (option) check if NAs exist sum(is.na(safefood.v)) ## [1] 10720 # remove NAs safefood.v <- safefood.v[!is.na(safefood.v)] # length(safefood.v) # double-check NAs anyNA(safefood.v) ## [1] FALSE # head(safefood.v) # convert vector to matrix safefood.m <- matrix(safefood.v, byrow = T, ncol = 5) # ?matrix # convert matrix to dataframe safefood.df <- as.data.frame(safefood.m) # delete the 4th column safefood.df <- safefood.df[-4] # naming the data.frame names(safefood.df) <- c('category', 'question', 'answer', 'timestamp') head(safefood.df) ## category question ## 1 使用含有acetaminophen成分藥品會傷腎,是真的嗎? ## 2 使用退燒藥會延誤治療,是真的嗎? ## 3 美國全面禁止2歲以下幼兒使用感冒藥及退燒藥嗎? ## 4 凡士林(Petrolatum)會致癌,請問是真的嗎? ## 5 市售護唇膏多含石蠟,長期使用可能致癌,是真的嗎? ## 6 含藥化粧品比一般化粧品效果更好嗎? ## answer ## 1 解答: Acetaminophen 是一種中樞作用型解熱鎮痛藥品,在正常健康狀況下,使用正常的建議劑量(成人每日不超過4000 毫克,兒童每日每公斤不超過50 毫克,分多次服用,每次至少間隔4 小時),並不會引起腎毒性。有少數報告顯示當急性過量使用時,會導致腎功能不良,但多為可逆性,如果慢性大量使用,才有嚴重腎臟傷害的可能性。 根據國外報告,成人長期持續使用1 年以上,而且累積劑量超過1 公斤(以一般每顆500 毫克的成人劑型而言,相當於2000 顆)時,可能導致嚴重腎臟傷害。此外,過量使用acetaminophen 或併服酒精性飲料時,具有肝臟損傷之風險。因此使用該成分藥品,應依照仿單或醫師指示使用,且避免長期持續使用或同時飲用酒精。 本文案為食藥署與臺灣兒科醫學會共同撰文 ## 2 解答: (1)發燒為一種症狀,並非病因,瞭解引起發燒之原因遠比退燒重要。因此,出現發燒症狀時,應立即就醫治療,以瞭解導致發燒的原因,切勿自行購買退燒藥使用,以免延誤疾病之治療。 (2)退燒藥之使用,主要目的是減緩因發燒出現之不適感。當發燒超過38.5° C且有不舒服的感覺,可適當給予退燒藥,但不一定要讓體溫降到正常範圍。 本文案為食藥署與臺灣兒科醫學會共同撰文 ## 3 解答: 美國食品藥物管理局並未完全禁止2 歲以下幼兒使用退燒藥或感冒藥,而是強調應在醫師指示下使用。美國分析兒童使用感冒藥產生的嚴重不良反應,主要是因為美國民眾可於藥局自行購買成藥,家長因為沒有劑量觀念,可能導致藥物過量而使幼兒發生危險。我國對於該類藥品之使用建議與國外一致,且中文仿單已註明「幼兒應洽醫師診治,不宜自行使用」,強調感冒藥必須經由專業醫師診治後,方能用於2 歲以下幼兒。 幼兒的生理發展尚未健全,必須特別注意藥物劑量。因此,無論中藥或西藥,幼兒使用藥品一定要經熟悉兒科專業的醫師評估其臨床效益及風險,並依幼兒之體重年齡處方適當劑量。家長依循專業醫師處方使用藥物,比較不會發生腎毒性等不良反應。 本文案為食藥署與臺灣兒科醫學會共同撰文 ## 4 解答: 凡士林(Petrolatum) 成分常被用於髮蠟、髮乳、潤膚霜、冷霜、唇膏、乳液等化粧品中,該成分安定性佳且歐盟、美國、日本等國的化粧品均未禁止使用凡士林成分,更可用於食品及口服藥品中,做為油性鎖水保濕劑使用。 提醒大家不要被謠言所誤導,選擇適合自己的產品,瞭解成分的用途與使用方式,才是保養身體的關鍵。 ## 5 解答: 石蠟是護唇膏、各種保濕保養化粧品的常見的成分,目前國際間均允許該成分可添加於化粧品中。化粧品中使用之石蠟已經精製,而精製過後的石蠟安定性佳,更可用於食品及口服藥品中。 食藥署提醒大家,不要被謠言所誤導,選擇標示完整及適合自己的產品,瞭解成分的用途與使用方式,才是保障自身權益的關鍵。 ## 6 解答: (1)我國所謂的「含藥化粧品」,實際上為含有衛生福利部公告的「化粧品含有醫療或毒劇藥品基準」成分之化粧品,主要針對添加前述基準成分之染髮劑、燙髮劑、止汗制臭劑等產品加強安全性管理,與化粧品的效果無關。 (2)目前含藥化粧品依規定需於進口或上市前辦理查驗登記,取得許可證後始得輸入、製造及販售。 (3)民眾在選購含藥化粧品前,可先上食藥署首頁>業務專區>化粧品>含藥化粧品許可證查詢作業,查詢該含藥化粧品是否已取得許可證,才可安心購買。 相關連結: 西藥、醫療器材、含藥化粧品許可證查詢作業http://www.fda.gov.tw/mlms/H0001.aspx (另開視窗) ## timestamp ## 1 06 25 2015 12:00AM ## 2 06 25 2015 12:00AM ## 3 06 25 2015 12:00AM ## 4 06 25 2015 12:00AM ## 5 06 25 2015 12:00AM ## 6 06 25 2015 12:00AM 17.6 Reviewing JSON 17.6.1 Type I: Well-formatted JSON: UVI, AQI, Hospital_revisits 這類的資料以典型的[{}, {}, {}]形式儲存,以以下方式就可直接轉為data.frame df <- fromJSON(content(GET(url), \"text\")) 17.6.2 Type II: hierarchical JSON: rent591, facebook graph api, google map 這類的json資料為well-formatted,但要的資料儲存在比較深的階層中,代表其並非簡單地二維表格,還有其他更多的詮釋資料被擺在同一個JSON檔案中。解決策略:通常fromJSON()轉完後為list,逐一就variable names查看資料在哪裡。View(res$data$data) 17.6.3 Type III: Ill-formatted JSON: food_rumors, ubike 這類的資料並非以典型的[{}, {}, {}]形式儲存,但仍是有序的二維數據。可將資料unlist()攤開,然後去除不必要的NA後,按欄位數目重建Matrix再轉回data.frame 解決策略:用as.data.frame()或unlist()硬轉成data.frame或vector來看資料的出現是否有所規律。 17.7 "],["html-parser.html", "Chapter 18 HTML Parser 18.1 HTML 18.2 Detecting Element Path", " Chapter 18 HTML Parser 本章已經介紹了如何讀取XLSX、CSV、JSON檔等常見的開放資料,也可以讀取來自各種網站的資料,例如104、信義房屋、Dcard、facebook、Google Map API、Flickr API、Twitter Rest API等等。但是有些網站不是以資料檔案的方式提供資料,而是直接由伺服器端傳回整個網頁,例如PTT網頁版、不動產實價登錄網站、政府標案決標資訊等等。對於這些網頁,我們需要使用HTML剖析器來解析網頁並獲取其中的資料。 大多數網頁都是由多個<div>、<table>或<li>等標籤層層巢套組成,包括導覽元件、廣告、標題、分類等等各種資訊,而我們需要的資料僅佔其中的一小部分,因此必須要撰寫HTML剖析器,找到目標的HTML標籤,將其獲取回來。 這些網站的HTML標籤通常會巢套很多層,甚至會動態更改巢套的階層以防止被爬取。但是如果仔細觀察,就會發現其中有一些規律性,例如新聞搜尋結果通常包括標題、簡要內文、時間和圖片等元素。瀏覽器發出搜尋請求後,伺服器會傳回一個HTML檔案,並且會傳回一些CSS或JavaScript來指示瀏覽器如何視覺化這個HTML檔案。因此,這個HTML和CSS是在傳回你的瀏覽器後視覺化成網頁的模樣,如果看起來有規律性,那就意味著有一套規律性是設計來讓程式知道如何視覺化這些標題或內容,以便使它們看起來具有一定的規則性。這套規則主要由HTML標籤和屬性組成,使我們可以使用CSS選取相同規則的元件,將之視覺化為相同的樣子。 因此,在進行網頁爬蟲時,我們需要了解HTML和CSS,並學習如何使用CSS Selector和XPath這兩種方法選取HTML元素。CSS Selector和XPath是兩種定義路徑的方法,它們可以通過選擇器(selector)定位HTML元素,以便選取一個或多個條件相同的元素。 CSS Selector是CSS中的一個語法,可以根據HTML元素的標籤名稱、屬性、類別、ID等條件選取對應的元素。舉例來說,可以使用以下CSS Selector選取所有標籤名稱為div的元素:div,或選取所有class屬性為test的元素: .test。 XPath則是XML Path Language的縮寫,是一種用於選擇XML文件中元素的語言,同樣可以用於HTML文件的選擇。XPath使用路徑表達式來定位元素,可以根據標籤名稱、屬性、位置等多種條件進行選擇。例如,以下XPath可以選擇所有標籤名稱為div的元素://div,或選取所有class屬性為test的元素://*[@class='test']。 掌握CSS Selector和XPath的使用,可以讓我們更加靈活地獲取網頁上的元素,並且能夠解析複雜的HTML結構,提取出需要的資料。 18.1 HTML HTML檔案的結構大致如下: 首先會有一個檔案類別的宣告<!DOCTYPE html>,用以告訴第三方瀏覽器或應用程式說這是一個HTML5檔案; 再來是成對標籤所組成的巢套結構,下例即有一對<html></html>包著一對<head></head>和一對<body></body>。 另外<!---->包著的內容為註解,瀏覽器或程式遇到該區段的內容會略過不處理。 下圖可用以說明HTML檔案的巢套(一層包一層)結構(圖片來源https://www.w3schools.com/html/html_intro.asp)。 18.2 Detecting Element Path Chrome DevTools的使用如下: 打開Chrome瀏覽器,進入要爬取的網站。 按下F12鍵或「右鍵」點擊網頁上的任意你感興趣的內容並選擇「檢查(Inspector)」來開啟DevTools。 在DevTools中,選擇「Elements」分頁。Elements分頁用於查看和修改網頁的HTML和CSS,以及網頁中的DOM元素。在Elements分頁中可以看到網頁中所有的HTML標籤和屬性,以及網頁中的DOM樹狀結構。程式寫作者可使用此功能來檢查和修改網頁元素,例如更改元素的文本、樣式或屬性,或者添加、刪除或重新排列元素。Elements分頁還提供了選擇元素和檢查元素屬性的工具,便於快速找到和解決網頁問題。此外,Elements分頁還具有許多有用的功能,例如網頁渲染性能分析、Box-Model、色彩選擇器等,可幫助使用者更好地理解和設計網頁。 在「Elements」分頁中找到你要查找的元素,例如一個按鈕或一個超連結。你可以輕點一下Elements中的任意元素,然後按「Ctrl/Cmd+F」就可以搜尋在Elements分頁中的內容。例如你感興趣的是網頁上的「下一頁」三個字,那你搜尋「下一頁」就可以找到相對應的元素。或者,你可以在「Elements」分頁開啟的狀況下,用右鍵輕點左側原始網頁中你感興趣的內容或元素,然後再次選擇「檢查(Inspector)」,此時「Elements」分頁就會自動跳到你感興趣的內容或元素。 在DevTools的選擇元素面板中,右鍵點擊選擇的元素,然後選擇「Copy」>「Copy XPath」或「Copy」>「Copy selector」。 將複製的XPath或CSS Selector粘貼到您的爬蟲程式中,以查找和提取相應的數據。 18.2.1 XPath XPath是一種用於定位和選擇XML文檔中元素的語言,也可以應用於HTML文檔。XPath使用路徑表達式來選擇文檔中的節點或節點集,這些路徑表達式可以是絕對的或相對的,可以根據元素名、屬性、節點位置等進行篩選。XPath提供了一種簡單而強大的方式來編寫網頁爬蟲,使得開發者能夠精確地定位需要提取的數據,進而進行數據清洗和分析。 以下是一個XPath的例子:考慮一個HTML文檔,其中有一個表格,表格中包含多個行和列,每一個單元格包含一些數據。如果我們想要提取表格中第一行第一列的數據,可使用//table/tr[1]/td[1]。這個XPath表達式由以下幾個部分組成: //table: 選擇文檔中的所有表格元素。 /tr[1]: 選擇表格中的第一行。 /td[1]: 選擇第一行中的第一列。 18.2.2 CSS Selector CSS Selector是一種用於定位和選擇HTML元素的語言,它可以根據元素的屬性、標籤名稱、類名稱等進行篩選和定位。CSS Selector同樣也是網頁爬蟲中經常使用的一種定位方式。和XPath相比,CSS Selector的寫法更加簡潔和直觀,因此在一些簡單的定位場景中,使用CSS Selector可以更加方便和快捷。但是,在一些複雜的定位場景中,XPath可能更加適合,因為它可以根據節點的位置等進行更加精確的篩選。 用CSS Selector如前面XPath的例子來選擇表格中第一行第一列:table tr:first-child td:first-child。這個CSS Selector由以下幾個部分組成: table: 選擇文檔中的所有表格元素。 tr:first-child: 選擇表格中的第一行。 td:first-child: 選擇第一行中的第一列。 "],["ptt-scrape.html", "Chapter 19 Scraping PTT 19.1 Step 1. 載入所需套件 19.2 Step 2. 取回並剖析HTML檔案 19.3 Step 3. 用for迴圈打撈多頁的連結 19.4 Step 4. 根據連結取回所有貼文 19.5 補充(1) 較好的寫法 19.6 補充(2) 最佳的寫法", " Chapter 19 Scraping PTT 在爬取HTML之前,你要先知道的是,資料如何被放在巢套元素的HTML檔案中,而Attribute(尤其是id和class和<a>的href)又如何提供線索給CSS Selector或XPath來選取我們所要的元素,最後要知道XPath和CSS Selector的用途是用來選取你所需要的HTML中的資料。 以下以ptt boy-girl版為例,展示如何以爬蟲擷取網頁上的資料,並整理成DataFrame。PTT的網頁分為兩種主要類型, 其一稱為鏈結頁或索引頁,為文章的超鏈結,例如https://www.ptt.cc/bbs/Boy-Girl/index.html。 其二為每一篇文章的內容頁https://www.ptt.cc/bbs/Boy-Girl/M.1523994970.A.71C.html。 對於這種網頁,要設計兩階段的爬蟲,第一階段是把所有所需鏈結撈回來,第二階段是根據撈回來的鏈結去打撈文章,並把裡面的內文整理出來。對於第一階段而言,概念大概如下面的示意圖,其實爬取HTML的概念都差不多是這樣,但以下示意圖說明了用XPath或CSS Selector「分別」選取出整個頁面中的標題、超鏈結、時間、和作者,然後用data.frame()組合成一個DataFrame;Page 2也如此炮製,然後把Page 2的DataFrame用bind_rows()附加在Page 1的DataFrame後面。 19.1 Step 1. 載入所需套件 在這個例子中,不僅要用httr來取得網頁頁面,還要用rvest套件(其實是呼叫xml2)來剖析網頁。網頁內容並不像json一樣可以直接轉為DataFrame或list。網頁內容可以是資料、視覺化元素、也可以是架構元素,相對於json而言複雜也冗贅許多。因此需要一個套件能夠剖析HTML標籤例如xml2,而rvest內則應用了xml2套件的內容來剖析網頁,另外,我會用bind_rows()將過程中所抓取的資料進行合併。 library(tidyverse) library(rvest) library(httr) 19.2 Step 2. 取回並剖析HTML檔案 在從HTML檔案中打撈出我們所要的資料有三個重要的rvest函式(步驟),分別為: read_html()依照網址將網頁取回並轉為xml_document。 html_nodes() 用CSS Selector或XPath選擇所需的資料節點,另外html_node()是只取滿足條件的第一個節點。 html_text()或html_attr()或html_table()、html_tags()取出所要抓的節點的目標資料,可能是一個表格、一個標籤內容、或者是一個屬性值。 19.2.1 Step 2-1. read_html() 將網頁取回並轉為xml_document read_html()內部包含了GET()與content()等的實作,其主要的功能是將取回來的回應(response)轉為xml_document。若以class(doc)觀察其型態,會是xml_document xml_node。 使用browseURL(url)可以用瀏覽器打開該網址並瀏覽。 url <- "https://www.ptt.cc/bbs/Boy-Girl/index.html" doc <- read_html(url) class(doc) ## [1] "xml_document" "xml_node" browseURL(url) 19.2.2 Step 2-2 以html_nodes() 以選擇所需的資料節點 html的檔案還包含了相當多其他視覺、互動、排版的標籤,因此通常只有少部分是資料,且存在層層的html元素中。因此,獲取到該網頁並轉為xml_document後,便要用html_nodes()或html_node()根據所給的CSS Selector或XPath來選擇所要取出的節點中的資料。要獲取該元素的CSS Selector可以利用Chrome DevTool或者是Firefox。用法是對著該網頁空白處按右鍵選擇檢查(insepect)。 以下用CSS Selector抽取: #指的是id、.指的是class。 #main-container意思是,某個id為main-container的元素。 .title指的是某個class為title的元素。 div.title指的是class為title的div(排版元素)。 Div.r-list-container.action-bar-margin.bbs-screen指的是同時具有r-list-container、action-bar-margin、bbs-scree三個class的div元素。 css <- "#main-container > div.r-list-container.action-bar-margin.bbs-screen > div > div.title > a" node.a <- html_nodes(doc, css) class(node.a) # "xml_nodeset" length(node.a) 用XPath抽取: path <- '//*[@id="main-container"]/div[2]//div/div[3]/a' node.a <- html_nodes(doc, xpath = path) links <- html_attr(node.a, "href") 19.2.3 Step 2-2 補充說明與XPath、CSS Selector的最佳化 用CSS Selector和XPath抽取有一些經驗法則,以PTT為案例來說的話,原本複製得來的CSS Selector和XPath分別為 CSS Selector:#main-container > div.r-list-container.action-bar-margin.bbs-screen > div:nth-child(3) > div.title > a XPath://*[@id=\"main-container\"]/div[2]/div[3]/div[2]/a PTT貼文目錄頁面的HTML結構。 到html之間,有一個id為#main-container的div。所以從div#main-container開始取即可。通常確定有id後,我就會開始找重複項,這邊的重複項是class為r-ent的div,找到重複項後,我就會去找重複項後面到我要的資料的路徑,而我們要的<a>就在class為title的div中。所以一個簡化的路徑是div#main-container div.r-ent div.title a。 但在這邊,既然有id,就不在乎是什麼元素會有id,所以可以只寫#main-container,而也只有資料在的div才有.r-ent的class,所以也不用強調前面的div,至於.title前面一定是搭div的元素,所以我可以簡化到寫為#main-container .r-ent .title a。甚至,由於.r-ent一定在#main-container裡面,所以連前面的id我都可以省略掉。 如果用XPath來寫的話,照上面的邏輯應該要寫成//*[@id=\"main-container\"]//div[@class=\"r-ent\"]/div[@class=\"title\"]/a。注意到第二個div前有兩個斜線//,原因是#main-container和.r-ent之間還有一層div,兩個斜線代表前後兩者間還有其他層,如果沒有兩個斜線而只有一個斜線的話,那就是代表#main-container下面一層馬上就要是.r-ent,若你把它改成單斜線的話,就會發現取不到資料。 以政府招標為範例來解釋 最終要抓的資料節點為何?主要為<a href=\"...\">的href屬性值和<a>底下<div>中的內容。 觀察資料在哪個節點「逐筆」出現?這邊是<tr>(table row),<td>則是資料欄位 利用id和class來辨識:遇到有id就從id開始取就好,例如#searchResult。 中間的節點多可以忽略:例如這個CSS selector可省略寫為#searchResult tr a 政府招標網站的HTML結構 19.2.4 Step 2-3 html_text()或html_attr()轉出所要的資料 我們所要的資料為<a href=\"/bbs/Boy-Girl/M.1523983903.A.71E.html\">[心情] 看到自己喜歡女生跟別的男生走很近好難過</a>中的超鏈結和標題文字。 html_text(): 在<a>與</a>之間的[心情] 看到自己喜歡女生跟別的男生走很近好難過稱為<a>的元素內容,要用html_text(node.a)來抽取。 html_attr(): 在<a>內的href=\"/bbs/Boy-Girl/M.1523983903.A.71E.html\"稱為<a>的屬性,該屬性名稱為href(Hyper Reference的意思),屬性值為/bbs/Boy-Girl/M.1523983903.A.71E.html。要用html_attr(node.a, \"href\")來抽取(相當於指定某個元素的href屬性的內容)。 取出元素節點的內容,相當於取出<a></a>間所夾的內容。 texts <- html_text(node.a) length(texts) 取出元素節點某個屬性的值,這邊是取出href這個屬性的值,也就是超鏈結。 links <- html_attr(node.a, "href") class(links) # character links[1] # "/bbs/Boy-Girl/M.1555188846.A.D5F.html" 但這些超鏈結只有後半段,點開一篇文章觀察其網址,發現我們所抓到的網址少了前面那一段,因此用paste0()黏上前綴的網址前段,便可得到完整網址,可用browseURL(links[1])觀察。 pre <- "https://www.ptt.cc" links <- paste0(pre, links) links[1] # [1] "https://www.ptt.cc/bbs/Boy-Girl/M.1555188846.A.D5F.html" 重組上列程式碼如下: pre <- "https://www.ptt.cc" url <- "https://www.ptt.cc/bbs/Boy-Girl/index.html" doc <- read_html(url) css <- "#main-container div.r-ent div.title a" node.a <- html_nodes(doc, css) 題外話,因為rvest與httr均支援tidyverse的程式寫作,因此可改為以下pipeline的形式。但我不見得會這麼寫,比如說<a>這個元素我可能不僅會取出其超鏈結,還打算取出標題文字,為了避免重複操作,我不見得會用tidyverse來寫。 pre <- "https://www.ptt.cc" url <- "https://www.ptt.cc/bbs/Boy-Girl/index.html" links <- url %>% read_html %>% html_nodes("#main-container div.r-ent div.title a") %>% html_attr("href") %>% paste0(pre, .) 19.3 Step 3. 用for迴圈打撈多頁的連結 我們可以觀察到PTT該版的鏈結頁的網址規則如下 最新頁:https://www.ptt.cc/bbs/Boy-Girl/index.html 倒數第二頁:https://www.ptt.cc/bbs/Boy-Girl/index3902.html 倒數第三頁:https://www.ptt.cc/bbs/Boy-Girl/index3901.html 倒數第四頁:https://www.ptt.cc/bbs/Boy-Girl/index3900.html 最新一頁因此可類推出為https://www.ptt.cc/bbs/Boy-Girl/index3903.html 因此,我打算寫一個for迴圈,讓他幫我(先)抓最後10頁,那就是3894到3903頁。並且,把頁數當成網址的參數,用sprintf()或paste0()組合出網址,以下分別提供兩種版本。你可以把它印出來且點選看看是否是你所要的網頁。 for(p in 3894:3903){ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p) # url <- paste0("https://www.ptt.cc/bbs/Boy-Girl/index", p, ".html") } 接下來,我要用一個all_links變數來存放所有的網址,並且把每一個頁面抓到的網址們都用vector的concatenation,也就是c()黏在一起 all_links <- c(all_links, links)。 all_links <- c() for(p in 3894:3903){ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p) all_links <- c(all_links, links) } 最後,我就將上述抓到網址的方法填入這個for迴圈中,並把抓到的網址存為links,就會隨著每回合的for迴圈逐漸把抓到的網址整理在一起。 pre <- "https://www.ptt.cc" all_links <- c() for(p in 3894:3903){ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p) print(url) doc <- read_html(url) # Get and parse the url css <- "#main-container div.r-ent div.title a" node.a <- html_nodes(doc, css) links <- html_attr(node.a, "href") links <- paste0(pre, links) # Recover links all_links <- c(all_links, links) } length(all_links) 19.4 Step 4. 根據連結取回所有貼文 前面是針對每一個頁面的網址取回該頁面中所有的貼文鏈結,所以我現在all_links中是所有的貼文鏈結。我可以仿照前面的做法,就每一個貼文鏈結,取回貼文內容,貼文內容可能包含作者、時間、標題、版別、內文等資料欄位 不失一般性地,用第一篇貼文的鏈結來做資料抓取實驗,之後再抓第二篇、第三篇即可。 首先,對於這每篇文章,我要爬取作者(author)、標題(title)、時間(time)、看板(board)和內容(content)五個欄位,包含原本文章的連結url一共六個欄位。 從以下的圖發現,每篇文章的內容放置在div#main-content中,之後一連跟著四個div.article-metaline,裡面分別有作者、看板、標題與時間,但從class名稱看不出來哪個,但我們要的值會是在span.article-meta-value中。所以我的規劃是,一次把所有的.article-meta-value給抓回來,然後再去分別指定哪個是作者、看板、標題或時間。所以我用 link <- all_links[1] doc <- read_html(link) meta.css <- "#main-content div.article-metaline span.article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) PTT貼文的HTML結構 另外,從上面的文字中可發現,主文的部分被包含在div#main-content中,但在上述的作者、標題等後面,若這時候我們用CSS Selector搭配html_node()和html_text()把div#main-content的內容都給取出來,會連上述的作者、標題等都一起取出來。最好的方法是用XPath的text()來只取出文字的部分,而不取出有tag的部分。 而且這樣取出來會是每個paragraph都是一個character vector中的值,所以要把他們合併成一篇文章,此時要用paste()指令,paste()指令可以指定把一個character vector給串接成一個string,輸入的變數是一個character vector,然後設定參數collapse = ““,代表串接起這些character時中間不要有空白。 post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") 最後,我們知道metadata變數的第一個是作者、第二個是標題、第三個是時間、便依序指派給個別的變數後,組成DataFrame如下,這樣所組成的DataFrame是為只有一筆資料的DataFrame,但有五個變項。 link <- all_links[1] doc <- read_html(link) meta.css <- "#main-content div.article-metaline span.article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") post.df <- data.frame(post, uid = metadata[1], title = metadata[2], timestamp = metadata[3], url = link ) 這樣我們取得的第一篇文章存放在post.df中,之後,我稍微修改一下上述的程式,就可以用for迴圈抓取第2至n篇文章,每一篇都存在名為temp.df的DataFrame中,然後用bind_rows()依序和post.df銜接在一起,除了黃色的部分是新增的之外,都跟前面的程式幾乎一模一樣。 for(link in all_links[2:10]){ doc <- read_html(link) meta.css <- "#main-content .article-metaline .article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") temp.df <- data.frame(post, uid = metadata[1], title = metadata[2], timestamp = metadata[3], url = link ) post.df <- bind_rows(post.df, temp.df) } 打撈回來的HTTP資料 19.5 補充(1) 較好的寫法 一個比較好的寫法是,不用先讀第一篇文章,而是用data.frame()初始化一個空的DataFrame,之後可以利用bind_rows()可自動增添缺少的變數的特性,自然就會補上所需要的變數。因此,只要改寫黃色的部分。 但這樣的寫法仍會有一個缺點,也就是當文章數越來越多時會越跑越慢。原因是,假設現在你已經抓了9999篇文章,你這次的for迴圈要抓第10000篇,然後用bind_rows()合併第10000篇,此時,post.df已經有9999篇非常肥大,等號右邊的bind_rows()跑完後會變成10000篇,此時又要把原本很肥大的post.df覆蓋掉,所以會非常費時。 post.df <- data.frame() for(link in all_links[1:10]){ doc <- read_html(link) meta.css <- "#main-content .article-metaline .article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") temp.df <- data.frame(post, uid = metadata[1], title = metadata[2], timestamp = metadata[3], url = link ) post.df <- bind_rows(post.df, temp.df) } 19.6 補充(2) 最佳的寫法 採用list先將每一個DataFrame存放起來,然後跑完所有的for迴圈後才用bind_rows()將所有資料合併為DataFrame。此時,p指的是第幾個連結,而前例的link就相當於下方的all_link[p]。 post.list <- list() for(p in 1:length(all_links)){ doc <- read_html(all_links[p]) meta.css <- "#main-content .article-metaline .article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") post.list[[p]] <- data.frame(post, uid = metadata[1], title = metadata[2], timestamp = metadata[3], url = all_links[p] ) } post.df <- bind_rows(post.list) "],["lebron.html", "Chapter 20 NYT: LeBron James Achievement 20.1 Get top250 players 20.2 Scraping live scores 20.3 Cleaning data 20.4 Visualization 20.5 Scraping and cleaning 20.6 (More) Scraping all players", " Chapter 20 NYT: LeBron James Achievement 這個案例的靈感來自於紐約時報於2023年2月7日所發布的一篇新聞「How LeBron James Outscored Kareem Abdul-Jabbar and All the N.B.A. Greats」。該篇新聞的破題點在於LeBron James 打破 Kareem Abdul-Jabbar 的紀錄,成為 NBA 歷史上得分王,這是許多人認為無法達成的成就。今年 38 歲的 James,本季平均每場比賽可以攻下 30.2 分,以 38,390 分超越了 Abdul-Jabbar 的 38,387 分。Abdul-Jabbar 以 sky hook 聞名,而 James 則透過多種得分方式積累分數,包括近年來在聯盟中日益盛行的三分球。James 的長壽、創意、天賦和能力讓他達成了這個成就。但實際上,這篇新聞同時也凸顯了 NBA 在過去50年的演變。 這篇新聞中運用了NBA球員與球賽資料庫中250名頂尖球員的資料來繪製視覺圖表,頂尖球員援引該網站的定義,為歷年的每場平均得分(PTS)。其用了折線圖、長條圖、散佈圖等多種視覺呈現方法,並採用了多項指標來凸顯LeBron James的成就,包含年齡、累積得分數、場均得分數、三分球與二分球的比例等。 除了資料視覺化外,這個案例也是相當好的爬蟲練習,可用R語言的rvest套件來爬取https://www.basketball-reference.com/網站的球員資料,包含每個球季的比分,甚至著名球員每場的得分和進球數等等。該網站的網頁多為具有id的HTML表格,相對來說爬取難度較低,但如果要仿照該篇新聞來製作視覺圖表,需要爬取多個頁面的資料,反而是訓練學生從篩檢資料到產生新聞的一個好範例。 20.1 Get top250 players 事實上我是知道有NBA球員比分網站的,看到這則新聞時我就去線上查找了相關的網站https://www.basketball-reference.com。而且該網站的球員資料是表格形式,代表我們可以用一些比較方便的函式(html_table())直接將該表格的內容轉為data.frame。 但目前(2023/04/01)的球員數共有五千多人,我們不可能將所有的球員通通繪製在圖上,反而會影響我們看到重要的訊息,因此要有效且有意義地減少要視覺化的資料量。這有幾種策略,一種是根據目的取出想要比較的球員、一種是直接設一個閥值(例如職涯超過15年的約90人),一種是看看該資料網站上有沒有列出一些頂尖球員名單。(猜想)紐約時報用的是該網站上的Top 250,因此第一個步驟要做的就是先把要分析的這250名球員的名冊爬取下來,之後再逐一爬取每個球員的資料紀錄。 這段程式碼的目的是從網站 “https://www.basketball-reference.com%22 中提取出排名前幾位的籃球員生涯表現數據,以及每個球員的個人資料頁面連結。Top 250球員的頁面網址為https://www.basketball-reference.com/leaders/per_career.html。 現在,我們可以使用rvest套件中的read_html()函數讀取網頁的 HTML 內容,該。接著傳遞給下一個函數html_node(),並指定要選取的 HTML 元素 ID 為nba。這個 ID 代表了包含球員表現數據的表格。最後,使用html_table() 函數提取表格資料並將結果存入top_players變數中。 read_html(url) 函數是 rvest 套件中的一個函數,它可讀取指定網址的 HTML 內容,以轉換為R的物件。 html_node() 函數則可用於選擇 HTML 內容中的指定元素。指定元素的方法是使用XPath或CSS Selector,本範例採用的是CSS Selector。若所要選取的同類型元素大於一個,那就要使用html_nodes(),所取得的結果會存入一個由1開始編號的List。 如果前一個步驟所指定的元素恰巧是一個表格的話,那我們就可以使用html_table()直接將表格轉換為一個R的data.frame,但如果不是表格的話,就必須要搭配使用html_text()或html_attr()來取出指定元素中的所需內容。 做完html_table()後的dataframe存於top_players,該dataframe共有三個變項:Rk(Rank)、PER(每場平均得分)、Player(球員名)。但該dataframe中缺少球員資料頁面的連結,所以需要另外再爬取一次球員名中的連結。取得的方式還是那三個步驟 read_html():取得該url的網頁內容並轉為R的物件。 html_node()/html_nodes():選取所需的HTML元素。此時我們要娶的是#nba這個表格中每一列<tr>的第二欄<td>中的超鏈結<a>。 html_text()/html_attr()/html_table():抽取所選取的HTML元素內容。此時要抽取的是<a>中的超鏈結,也就是<a>的href屬性(Attribute),所以要用html_attr(\"href\")。 抽取出來的連結往往是相對於主要連結的後半段,因此,最後要將所取得的連結黏接在主頁連結的後方,如str_c(url.base, .)。 url.base <- "https://www.basketball-reference.com" url <- "https://www.basketball-reference.com/leaders/per_career.html" top_players <- read_html(url) %>% html_node("#nba") %>% html_table() top_players$plink <- read_html(url) %>% html_node("#nba") %>% html_nodes("tr td:nth-child(2) a") %>% html_attr("href") %>% str_c(url.base, .) top_players 20.2 Scraping live scores https://www.basketball-reference.com/players/c/chambto01.html 20.2.1 Testing: Scrape one url <- "https://www.basketball-reference.com/players/c/chambto01.html" table2 <- read_html(url) %>% html_node("#per_game") %>% html_table(convert=T) 20.2.2 Scrape life time scores of all top-250 players # pinks <- long_players$plink plinks <- top_players$plink totals <- tibble() for(i in 1:length(plinks)){ plink <- plinks[i] message(sprintf("[%s] ", i), plink) table <- read_html(plink) %>% html_node("#totals") %>% html_table() table$plink <- plink totals <- bind_rows(totals, table) Sys.sleep(sample(1:2, 1)) } 20.3 Cleaning data top250 <- totals %>% filter(str_detect(Season, "\\\\d{4}-\\\\d{2}")) %>% left_join(top_players, by="plink") %>% select(-(34:53)) %>% select(-31) %>% mutate(year = year(paste0(str_sub(Season, 1, 4), "-01-01"))) %>% mutate(PERyear = PTS/G) %>% group_by(plink) %>% arrange(Age) %>% mutate(cumPTS = cumsum(PTS)) %>% ungroup() 20.4 Visualization Load pre-save data load("data/nba_players.rda") 20.4.1 Line: Age x cumPTS library(gghighlight) selected_players <- c("Michael Jordan*", "LeBron James", "Kobe Bryant*", "Wilt Chamberlain*", "Kareem Abdul-Jabbar*", "Stephen Curry") top250 %>% ggplot() + aes(Age, cumPTS, group=Player) + geom_line() + gghighlight(Player %in% selected_players) + theme_bw() + theme(legend.position = "none") 20.4.2 Line: year x cumPTS top250 %>% ggplot() + aes(year, cumPTS, group=Player) + geom_line() + gghighlight(Player %in% selected_players) + theme_bw() + theme(legend.position = "none") 20.4.3 Line: Age x PER_by_year top250 %>% ggplot() + aes(Age, PERyear, group=Player) + geom_line() + gghighlight(Player %in% selected_players) + theme_bw() + theme(legend.position = "none") 20.4.4 Comparing LeBron James and Jabbar 20.5 Scraping and cleaning # plink <- "https://www.basketball-reference.com/players/j/jamesle01.html" plink <- "https://www.basketball-reference.com/players/a/abdulka01.html" loglinks <- read_html(plink) %>% html_node("#totals") %>% html_nodes("tr th a") %>% html_attr("href") %>% paste0(url.base, .) logtable <- tibble() for(link in loglinks){ table <- read_html(link) %>% html_node("#pgl_basic") %>% html_table() logtable <- bind_rows(logtable, table) message(nrow(logtable), link) } jabbar.log <- logtable %>% select(Rk, G, Date, FG, `3P`, FT, PTS) %>% mutate(Rk = as.numeric(Rk), FG = as.numeric(FG), `3P` = as.numeric(`3P`), FT = as.numeric(FT), PTS = as.numeric(PTS)) %>% filter(!is.na(PTS)) %>% replace(is.na(.), 0) %>% mutate(try = FG + `3P` + FT) %>% mutate(FGperc = FG/try, P3perc = `3P`/try, FTperc = FT/try) %>% mutate(gid = row_number()) 20.5.1 VIS LJames and jabbar james.log %>% pivot_longer(names_to = "type", cols = c("FGperc", "P3perc", "FTperc"), values_to = "perc") %>% ggplot() + aes(gid, perc, fill = type) + geom_area() + theme_bw() jabbar.log %>% pivot_longer(names_to = "type", cols = c("FGperc", "P3perc", "FTperc"), values_to = "perc") %>% ggplot() + aes(gid, perc, fill = type) + geom_area() + theme_bw() top250 %>% group_by(Player) %>% summarize(FGsum = sum(FG), FTsum = sum(FT), P3sum = sum(`3P`)) %>% ungroup() %>% replace(is.na(.), 0) %>% mutate(trials = FGsum + FTsum + P3sum) %>% mutate(FGperc = FGsum/trials, FTperc = FTsum/trials, P3perc = P3sum/trials) %>% ggplot() + aes(FGperc, P3perc) + geom_point() + geom_text(aes(label = Player), hjust = -0.1) + gghighlight(Player %in% selected_players) + theme_bw() + theme(aspect.ratio = 2/3) save(jabbar.log, james.log, top_players, top250, totals, file="../data/nba_players.rda") 20.6 (More) Scraping all players 20.6.1 Testing url <- "https://www.basketball-reference.com/players/x/" table.path <- read_html(url) %>% html_node("#players") table <- table.path %>% html_table() table$pid <- table.path %>% html_nodes("tbody th") %>% html_attr("data-append-csv") table$plink <- table.path %>% html_nodes("tbody th a") %>% html_attr("href") %>% str_c("https://www.basketball-reference.com",.) 20.6.2 Scrape from a-z except x(no x) # letters[c(1:23, 25:26)] players <- tibble() for(letter in letters[c(1:23, 25:26)]){ url <- str_c("https://www.basketball-reference.com/players/", letter, "/") print(url) table.path <- read_html(url) %>% html_node("#players") table <- table.path %>% html_table() table$pid <- table.path %>% html_nodes("tbody th") %>% html_attr("data-append-csv") table$plink <- table.path %>% html_nodes("tbody th a") %>% html_attr("href") %>% str_c("https://www.basketball-reference.com",.) players <- bind_rows(players, table) } "],["visualization-1.html", "Chapter 21 Visualization 21.1 ggplot2 21.2 VIS packages 21.3 Case Gallery", " Chapter 21 Visualization 21.1 ggplot2 ggplot2和Python的matplotlib都是常用的視覺化套件,但在設計上有一些主要的差異。首先,ggplot2是基於grammar of graphics的設計原則,而matplotlib則是基於pyplot-style的設計風格。這意味著ggplot2更加著重於資料和視覺化之間的關係,並且提供了一個統一的語法來描述這些關係,而matplotlib則更加注重對於底層圖形物件的控制。其次,ggplot2支持更多的圖形屬性,例如數值變數、類別變數、時間序列等等,並且可以輕鬆地進行層疊圖、面積圖等高級視覺化技巧,而matplotlib則需要手動設置較多的屬性來達到類似的效果。此外,ggplot2在設計上更加注重美學和可讀性,因此預設的圖形風格更加美觀且易於閱讀,而matplotlib的預設風格則比較簡單,需要進行額外的設置才能達到類似的效果。 21.2 VIS packages 除了ggplot2本身之外,尚有相當多基於ggplot或tidyverse風格的視覺化套件,如: ggraph:ggraph是一個基於ggplot2的視覺化套件,專門用於網絡和關係圖的繪製,提供了多種佈局和美學風格的選擇。 ggmap:ggmap是一個基於ggplot2的地圖繪製套件,可以將Google Maps、OpenStreetMap等地圖數據與ggplot2圖形整合起來,方便進行地理位置相關的資料視覺化。 ggridge:ggridge是一個基於ggplot2的視覺化套件,專門用於繪製ridge plots,也就是密度圖的一種變形。它可以幫助使用者更好地展示數據的分佈和趨勢。Introduction to ggridges (r-project.org) ggthemes:ggthemes是一個基於ggplot2的視覺化套件,提供了多種高質量的主題風格和顏色調色板,可以讓使用者快速改善圖表的外觀和可讀性。 ggnatimate:ggnatimate用於將ggplot所產製的圖表多增加一個變量以轉製為動態圖表,支持多種動畫效果。 ggally:ggally是一個基於ggplot2的視覺化套件,提供了多種高級散點圖和數據矩陣的繪製方式,方便使用者進行多變量分析和資料探索。 ggrepel:ggrepel是一個基於ggplot2的視覺化套件,用於解決文字標籤重疊的問題,可以自動調整文字標籤的位置,使其更加易讀和美觀。 21.3 Case Gallery 21.3.1 WP: Paid Maternity Leave (產假支薪): barplot 原始新聞來源:The world is getting better at paid maternity leave. The U.S. is not. - The Washington Post。該篇報導提及,美國因為目前的政策不保障帶薪產假,許多女性感到必須在工作和照顧家庭之間做出選擇,這種性別不平等破壞了她們在工作機會上的平等機會。同時,世界各地的婦女待遇正在逐漸改善。至少190個國家對嬰兒的母親規定了某種形式的帶薪假期,產假待遇在56個國家有所提高。專家表示,現在美國城市和州正通過不同形式的帶薪家庭假法案,這顯示美國雇主正在展示有競爭力的福利不會影響員工表現。特別是科技公司,如Twitter、Facebook和Google等,處於提供員工帶薪產假福利的前沿,美國可能有望追趕其他國家。 21.3.2 NYT: Population Changes Over More Than 20,000 Years: Coordinate, lineplot 紐時這篇報導「When Did the Anthropocene Start? Scientists Closer to Saying When. - The New York Times (nytimes.com)」討論了人類活動對地球所產生的深遠影響,並探討人類是否已經進入了一個新的地質時期,被稱為「人新世」。報導指出,人類的經濟活動、能源消耗和人口增長是人新世的主要因素,並且這些因素已經在地球上留下了不可磨滅的痕跡。報導也提到,地質學家已經發現了人新世的證據,包括核爆炸中的鈽同位素、肥料中的氮和發電廠的灰燼等。然而,報導也問道,人新世是否真的已經開始,以及它的開始點是否應該是農業革命、工業革命、核彈(77年前)或其他發展。 21.3.3 NYT: LeBron James’ Achievement: Coordinate, lineplot 這個案例的靈感來自於紐約時報於2023年2月7日所發布的一篇新聞「How LeBron James Outscored Kareem Abdul-Jabbar and All the N.B.A. Greats」。該篇新聞的破題點在於LeBron James 打破 Kareem Abdul-Jabbar 的紀錄,成為 NBA 歷史上得分王,這是許多人認為無法達成的成就。今年 38 歲的 James,本季平均每場比賽可以攻下 30.2 分,以 38,390 分超越了 Abdul-Jabbar 的 38,387 分。Abdul-Jabbar 以 sky hook 聞名,而 James 則透過多種得分方式積累分數,包括近年來在聯盟中日益盛行的三分球。James 的長壽、創意、天賦和能力讓他達成了這個成就。但實際上,這篇新聞同時也凸顯了 NBA 在過去50年的演變。 21.3.4 Taiwan Village Population Distribution: Coordinate, lineplot 以下我打算繪製出每個村里在15歲以上的人口數,來呈現台灣有些村里人口相當稀少,尤其是花蓮縣、澎湖縣、南投縣和宜蘭縣的幾個聚落。並標記出幾個人口數最高的里。如果我的目的是呈現村里人口數的統計分佈,我會用geom_density()來繪圖(如下),但實際上沒辦法從這樣的密度函式圖來說故事,指出那些人口數過高或過低的村里。 21.3.5 NYT: Net Worth by Age Group: Coordinate, barplot 這個教學案例來自紐約時報的「What’s going on in this gragh」系列資料視覺化教學之Teach About Inequality With These 28 New York Times Graphs - The New York Times (nytimes.com) 。該圖表呈現在不同年代、不同年齡層的人所擁有的淨資產(包含土地、存款、投資等減去債務)。該圖表的結果指出,在不同年代的老年人是越來越有錢,但年輕人卻越來越窮 21.3.6 NYT: Optimistic of different generation: Association, scatter 這個練習為紐約時報的一則報導「Where Are Young People Most Optimistic? In Poorer Nations. - The New York Times (nytimes.com)」。該報導乃根據一項涵蓋 21 個國家的大型調查,這項調查比較了不同國家和年齡層(年輕人對成年人)對於下一代的生活是否會比現在更好的看法。該調查還比較了不同國家(富裕與貧窮)和年齡層(年輕人對成年人)對於當今兒童在基本方面的狀況,以及對於社會和環境問題的看法。此外,調查還比較了不同國家和年齡層對於現代科技對年輕人生活的影響看法,以及對於焦慮和壓力等方面的看法。 21.3.7 Vaccinating Proportion by countries: Amount, heatmap 這個例子參考(Wilke 2019)在視覺化數量(Amount)時的熱圖範例(Heatmap),但改用為視覺化各國每百人完整注射COVID-19疫苗人數歷時資料。 21.3.8 Taiwan salary distribution: Distribution, boxmap 箱形圖(Box plot)是一種用於展示數據分佈情況的統計圖表。它通常顯示數據的中位數、四分位數、極值和異常值等統計量。箱形圖的中間線表示數據的中位數,箱子的上下邊界則分別表示數據的上四分位數和下四分位數。箱子的高度表示數據的變異程度,而箱子外的線段則表示數據的最大值和最小值。如果數據中存在異常值,則通常使用圓圈或星號等符號來標記。箱形圖可以用來比較不同數據集之間的分佈情況,以及檢查數據是否存在異常值。 Inspired by Six Myths About Choosing a College Major - The New York Times (nytimes.com) and What’s Going On in This Graph? | Jan. 9, 2018 - The New York Times (nytimes.com) 21.3.9 Taiwan income distribution by each town: Distribution, boxmap 本案例用BoxPlot來呈現某個行政區(鄉鎮市區)各村里的所得中位數、平均數、四分位數的分佈。如果在箱型圖中,平均數高於第三分位數,這代表數據集呈現右偏分佈。也就是說,數據中的大部分觀測值都分佈在第一、二分位數之間,但存在一些較大的極端值,使平均值被往右偏移。從這樣的分佈中可以察覺某些里因為有少數極端高收入住戶,而使得平均高於四分位數。 21.3.10 NYT: Carbon by countries: Proportion, Treemap 本案例取自紐時所報導之Who Has The Most Historical Responsibility for Climate Change? - The New York Times (nytimes.com)。該新聞報導了聯合國氣候峰會在格拉斯哥舉行期間的一個重要議題:世界上最富裕的國家,即那些對全球暖化負責任的不成比例的國家,應如何賠償因全球氣溫上升所造成的貧困國家的損失。報導指出,現今全球人口中,包括美國、加拿大、日本以及西歐大部分國家在內的富裕國家僅佔12%,但是在過去的170年中,這些國家卻負責了50%的溫室氣體排放。 21.3.11 Taiwan Annual Expenditure: Proportion, Treemap 本案例將就台灣中央預算的資料,以TreeMap階層化地顯示不同機構層級(大類、一級部會)等的預算佔比。例如衛福部、財政部與勞動部的預算均屬於社會福利支出。 References "],["ggplot.html", "Chapter 22 ggplot 22.1 Essentials of ggplot 22.2 NYT: Inequality 22.3 Adjusting Chart 22.4 Highlighting & Storytelling", " Chapter 22 ggplot 本節著重在介紹ggplot的基本概念與設定。 小訣竅:可在一開始便透過knitr::opts_chunk$set(echo = TRUE, fig.width = 2, fig.asp = 0.4)來一次設定所有圖片。fig.width = 8與fig.height = 6 是以英吋(inches)為單位,或用fig.dim = c(8, 6)一次設定長寬1。echo = TRUE是設定knit出輸出格式(如html)時,也要包含程式碼。如果echo = FALSE的話,就只會輸出文字和圖形。 22.1 Essentials of ggplot 用ggplot來繪製圖形有三個基本函式ggplot() + aes() + geom_圖表類型。 指定要進行繪圖ggplot():用%>%將資料(dataframe)pipe給ggplot()後,底下各增添的繪圖選項都用+的符號,類似不斷修正繪圖結果的意思。 指定X/Y軸與群組因子aes():指定圖表的X/Y軸分別是什麼變數,有些圖表只需要單一個變數(例如Density-chart和Histogram),有些需要X/Y兩個變數(例如Scatter-chart)什麼的變數要做視覺化,Boxplot甚至可以直接指定最大、最小、Q1、Q3和Median等多個變數。 指定要繪製的圖表類型。例如Line-chart為geom_line()、Scatter-chart為geom_point()、Bar-chart為geom_col()或geom_bar()。查閱ggplot cheat sheet可以快速翻閱有哪些圖表類型(如截圖)。 ggplot-cheat-sheet 22.1.1 (1) ggplot() 秀出預備要繪製的繪圖區 tibble(a=1:5, b=5:1) %>% ggplot() 22.1.2 (2) aes() 指定X/Y軸與群組因子 aes()會在繪圖區上繪製X與Y軸 tibble(a=1:5, b=5:1) %>% ggplot() + aes(x=a, y=b) 22.1.3 (3) geom_???() 指定要繪製的圖表類型。 例如折線圖為為geom_line()、X/Y散佈圖為geom_point()、長條圖我多會使用geom_col()。ggplot繪圖種類除了可以參照前面的ggplot cheat sheet之外,可以詢問ChatGPT有哪些常見的類別,甚至可以請他舉例給你測試該繪圖方法。 tibble(a=1:5, b=5:1) %>% ggplot() + aes(x=a, y=b) + geom_line() 亦可同時繪製兩種類型的圖表於同一張圖上。例如以下同時繪製了geom_line()與geom_plot()。 tibble(a=1:5, b=5:1) %>% ggplot() + aes(x=a, y=b) + geom_line() + geom_point() 注意:ggplot是以變數為基礎的視覺化套件,也就是說,當準備好dataframe後,就可以在ggplot中指定要用哪些變數來繪圖。也因此,務必把dataframe整理為tidy型態,也就是長表格(long-form)的型態。整理完資料後,我會習慣地用names(plot)或glimpse(plot)來看一下該資料所有的變項,好可以在下一階段的繪圖做參考。 22.2 NYT: Inequality 以下將以紐時的這個Teach About Inequality With These 28 New York Times Graphs 案例來做繪圖教學。該教學引用了Opinion | America Will Struggle After Coronavirus. These Charts Show Why.這篇新聞中的圖表,我們拿來做範例的這張圖,主要是在說財富趨勢對年輕人而言尤其艱難。35歲以下美國人的凈資產中位數 - 他們平均比年長的美國人差得多 - 比2004年35歲以下美國人的凈資產低40%。相比之下,65歲以上美國人的凈資產在同一時期增長了9%。簡而言之,嬰兒潮一代比他們的前輩更富有,而千禧一代和X世代比他們的前輩更窮;或者說,年輕人拿自己和10年前的年輕人相比,現在的年輕人更窮;而現在的老年人拿自己和10年前的老年人比,現在的老年人更富有。 22.2.1 (1) Loading data 仔細觀察一下資料,你會怎樣描述這個資料? 這個Dataframe包含三個變數(Category, year, Net_Worth),共66個觀測值。變數「Category」描述的是年齡範圍,包含六個類別(Level)。變數「year」代表年份,從1989年到2019年,以三年為一個週期觀察,共有11個Levels。變數「Net_Worth」則表示在該年齡範圍內的淨資產。從資料可以觀察到,在不同的時間點,不同年齡範圍的人群的財富狀況看似有明顯差異。例如,比較1989年和2019年,45-54歲的年齡組在這段期間內的淨值似乎較35-44歲組要高,這可能反映了隨著年齡增長,個人或家庭的財富累積增加的趨勢。 NW <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(Category, year, Net_Worth) %>% group_by(Category) %>% arrange(year) %>% ungroup() ## Rows: 66 Columns: 37 ## ── Column specification ──────────────────────────────────────────────────────── ## Delimiter: "," ## chr (1): Category ## dbl (36): year, Before_Tax_Income, Net_Worth, Assets, Financial_Assets, Tran... ## ## ℹ Use `spec()` to retrieve the full column specification for this data. ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. NW %>% head(12) ## # A tibble: 12 × 3 ## Category year Net_Worth ## <chr> <dbl> <dbl> ## 1 Less than 35 1989 16.2 ## 2 35-44 1989 112. ## 3 45-54 1989 195. ## 4 55-64 1989 195. ## 5 65-74 1989 154. ## 6 75 or older 1989 144. ## 7 Less than 35 1992 16.6 ## 8 35-44 1992 79.9 ## 9 45-54 1992 140. ## 10 55-64 1992 203. ## 11 65-74 1992 176. ## 12 75 or older 1992 155. 22.2.1.1 (1.1) group_by()的概念 在提供的程式碼中,group_by(Category)是一個關鍵步驟,它影響了數據處理的方式,尤其是在隨後的操作中。以下是有和沒有group_by(Category)時的主要差異: 有group_by(Category):當在程式碼中使用group_by(Category)時,這意味著接下來的操作將在每個Category類別的子集上單獨進行。這對於需要按類別分析或操作數據時非常有用。在此程式碼中,arrange(year)將會在每個Category內部對year進行排序。這意味著每個類別內的年份會從最小到最大排序,但這種排序是獨立於其他類別的。 沒有group_by(Category):如果省略group_by(Category),則後續的操作將考慮所有的數據作為一個整體來進行。 省略group_by(Category)後,arrange(year)會對整個數據集按year進行全局排序,而不會考慮Category的界限。由於year是一個類別變項,出現在多個Category組中,因此,會有多個相同year的列排在一起。 22.2.2 (2) Visualizing 這是預期視覺化的結果。 22.2.2.1 (2.1) Plot without group 先將year和Net_worth分別繪製在X與Y軸上,並用geom_line()繪製為折線圖。結果圖表中呈現鋸齒狀的折線,看似有問題,但其實是合理的。因為year是一個離散變數,而我們希望每個年齡層一條線的話,那就要照年齡層來分組。也因此,每一年都有有每個年齡層的資料,當我們把「年」作為X軸時,自然同一年就會有數筆不同年齡層的資料,因此才會是鋸齒狀的。 NW %>% ggplot() + aes(x=year, y=Net_Worth) + geom_line() 不同的圖表類型是可以疊加在同一張圖上的。我們也可以把geom_point() 另一種圖表型態加入,也是可以的,兩者的X與Y不相衝突。geom_line()、geom_point()、geom_text()三者會經常伴隨出現。 NW %>% ggplot() + aes(x=year, y=Net_Worth) + geom_line() + geom_point() 22.2.2.2 (2.2) Grouping 上圖是我們把多個年齡層的逐年資料畫在同一條折線上,所以會呈現鋸齒狀折現的狀況。但這些年齡層並非在同一條線上呀?因此,我們要根據Category這個變數來做分組。 NW %>% ggplot() + aes(x=year, y=Net_Worth, group=Category) + geom_line() + geom_point(stat="identity") 如希望不同線條上不一樣的色彩,應指定color=Category。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() 用color、fill或group來做分組? 在使用geom_line()函數時,顏色的設定是針對線條本身,而非填充面積。當我們希望指定點(透過geom_point())或線條(使用geom_line())的顏色時,我們會使用color參數來定義顏色。 相對地,當使用`geom_area()`函數進行視覺化時,由於它涉及的是面積的填充,因此我們應該使用`fill`參數來指定填充色。在某些情況下,我們可能會同時使用`color=Category`和`fill=Category`來對`geom_area()`進行設定,這樣做能夠同時定義邊線顏色和填充顏色。然而,當利用`geom_area()`來展示折線圖時,建議限制使用的顏色種類不超過兩種,以避免顏色層疊導致的視覺混淆,即便是設定了`alpha=0.2`以降低透明度。 `geom_area()`函數默認展示的是累積分佈圖,即不同群組的數值會在Y軸方向上疊加。若目的是比較兩個群組之間的差異,而非觀察整體趨勢,則可以通過添加`position="dodge"`參數來調整分佈方式,並將`alpha`設定為小於1的值以增加圖形的透明度,從而更清晰地分辨不同群組之間的差異。 NW %>% ggplot() + aes(year, Net_Worth, color=Category, fill=Category) + geom_area(position="dodge", alpha=0.2) 22.3 Adjusting Chart 22.3.1 Type of Points and Lines 下面的例子同時用了geom_line()和geom_point(),且分別設定了線寬(size=1)、點的大小(size=2),折線型態(linetype=\"dashed\")、半透明程度(alpha)。 ggplot2 line types : How to change line types of a graph in R software? - Easy Guides - Wiki - STHDA NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line(size=1, linetype = "dashed", alpha=0.5) + geom_point(size=2, color="dimgrey", alpha=0.5) ## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. ## ℹ Please use `linewidth` instead. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated. 22.3.2 Line Types See more from ggthemes https://github.com/BTJ01/ggthemes/tree/master/inst/examples library(ggthemes) rescale01 <- function(x) { (x - min(x)) / diff(range(x)) } gather(economics, variable, value, -date) %>% group_by(variable) %>% mutate(value = rescale01(value)) %>% ggplot(aes(x = date, y = value, linetype = variable)) + geom_line() + scale_linetype_stata() + theme_minimal() 22.3.3 Title, Labels and Legends Titles, labels, and legend 設定標題與X/Y軸標題(法一):以下設定了圖表的圖表標題、和X軸與Y軸的軸標題(xlab與ylab)。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + xlab("Year") + ylab("Net Worth") + ggtitle("Net Worth by year grouped by age groups") 設定標題與X/Y軸標題(法二):這是一次設定圖表標題(title)、次標題(suttitle)、X軸與Y軸標題的方法。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", subtitle = "Source from: ...", x = "Year", y = "Net Worth") 調整X軸與Y軸標題位置的:必須要透過theme()來設定axis.title.x = element_text(hjust=1)。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + theme(axis.title.x = element_text(hjust=1), axis.title.y = element_text(hjust=1)) 去除X/Y軸標題(不佳):直接將空字串Assign給title、x、與y即可。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "", x = "", y = "") 去除X/Y軸標題(較佳):透過設定theme()來調整。可發現透過這種設定方法,原本標題和X/Y軸標題的邊界空間就會被釋放出來。 # No extra space for xlab, ylab and title NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line(show.legend = F) + theme_minimal() + theme(plot.title = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank()) 22.3.4 Font 調整字型會建議都從theme()來做調整,所有圖面上看得到的字都有相對應的變數可以調整字型。例如以下的例子中,把標題的字型大小調整為14粗體、X與Y軸的字型則調整了向右對齊、10粗斜體、顏色為dimgrey。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + theme(plot.title = element_text(size=14, face="bold"), axis.title.x = element_text(hjust=1, size=10, color="dimgrey", face="bold.italic"), axis.title.y = element_text(hjust=1, size=10, color="dimgrey", face="bold.italic") ) 22.3.5 Color Themes ggplot也有其圖表主題色調。之前範例的灰色圖表背景就是預設的主題,ggplot中還有好幾個預設圖表主題可以選,例如theme_minimal()或theme_tw()等等。 Modify components of a theme — theme • ggplot2 (tidyverse.org) bbplot/bbc_style.R at master · bbc/bbplot (github.com) NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() 22.3.6 Set-up Default Theme 如果希望所有的圖表都有一致的顏色和排版的調性,可以在一開始編輯Rmd的時候就設計好一套theme()並指給一個變數(例如以下的th)。 th <- theme(plot.title = element_text(size=14, face="bold"), axis.title.x = element_text(hjust=1, size=10, color="dimgrey", face="bold.italic"), axis.title.y = element_text(hjust=1, size=10, color="dimgrey", face="bold.italic") ) NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line(linetype = "dashed", alpha=0.5) + geom_point(size=2, color="dimgrey", alpha=0.5) + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + th 22.3.7 Show Chinese Text Python和R這些程式語言的預設視覺化套件都沒辦法顯示中文,所以如果要顯示中文的話,就要指定圖表標題、X、Y軸標籤、圖說和各個部件的字型。因為我在Mac上繪圖,所以我將字型指定為Heiti TC Light。如果想知道自己的電腦上有什麼可以用,可以到電腦的字體簿上查找中文字體名稱,或者上網google「ggplot 中文字型選擇」。 county <- read_csv("data/tw_population_opendata110N010.csv") %>% slice(-1, -(370:375)) %>% type_convert() %>% mutate(county = str_sub(site_id, 1, 3)) %>% group_by(county) %>% summarize( area = sum(area), people_total = sum(people_total) ) %>% ungroup() ## Rows: 375 Columns: 5 ## ── Column specification ──────────────────────────────────────────────────────── ## Delimiter: "," ## chr (5): statistic_yyy, site_id, people_total, area, population_density ## ## ℹ Use `spec()` to retrieve the full column specification for this data. ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. ## ## ── Column specification ──────────────────────────────────────────────────────── ## cols( ## statistic_yyy = col_double(), ## site_id = col_character(), ## people_total = col_double(), ## area = col_double(), ## population_density = col_double() ## ) 下面這是一個長條圖的範例(barplot,不是histogram)。Barplot可以直接指定X軸為縣市(county)和Y軸為總人口數(people_total),但是要用geom_col()而非geom_bar()。除此之外,Bar的顏色有「面」的特徵,所以若要自訂整條bar的顏色,要用fill而非color,color只會是每條Bar的外框。 county %>% arrange(desc(people_total)) %>% ggplot() + aes(county, people_total) %>% geom_col(fill="lightgrey", color="black") + theme_minimal() + theme(axis.text.x = element_text(family="Heiti TC Light")) 舉例來說,中文字型可以是標楷體(BiauKai)、宋體(Songti TC)、黑體(Heiti TC Light)、蘋方(PingFang TC)、Noto(Noto Sans CJK TC) th <- theme(title = element_text(family="Heiti TC Light"), text = element_text(family="Heiti TC Light"), axis.text.y = element_text(family="PingFang TC"), axis.text.x = element_text(family="Heiti TC Light"), legend.text = element_text(family="Heiti TC Light"), plot.title = element_text(family="Heiti TC Light") ) county %>% ggplot() + aes(county, people_total) %>% geom_col(fill="skyblue") + theme_minimal() + th + theme(axis.text.x = element_text(angle = 45)) 22.3.8 X/Y axis 調整圖表方向 county %>% ggplot() + aes(county, people_total) %>% geom_col(fill="skyblue") + coord_flip() + theme_minimal() + th + theme(axis.text.x = element_text(angle = 45)) 通常coord_flip()後往往會希望這些bar會是由上而下排序好的,但用arrange(desc(people_total)是無法解決問題的,因為Y軸原本會是照Y軸的刻度排列,而不是Y軸的數值。所以,要被排序的應該是Y軸的「文字」也就是那些縣市。因此,我們需要將該縣市轉為factor(1~n),並且讓這些縣市被安排的factor數值照people_total排列,因此要用mutate(county = reorder(county, people_total))。reorder()是一個將文字轉factor的函式,但在此特別指定照people_total的編排。 county %>% # arrange(desc(people_total) %>% mutate(county = reorder(county, people_total)) %>% ggplot() + aes(county, people_total) %>% geom_col(fill="skyblue") + coord_flip() + theme_minimal() + th 22.4 Highlighting & Storytelling 「說故事」才是整則資料新聞的核心,在運用圖表來輔助敘事時,應搭配說理說服的內容來突顯(highlight)圖面上的特徵,而不是留待讀者自己觀察。以下有三種highlight圖表部分資料的方法。第一個方法是在繪圖時用+ scale_color_manual()或+ scale_fill_manual()指定顏色給不同群組;方法二是利用gghighlight這個套件來指定要上色的群組,而且gghighlight可以和fill與color相互搭配,仍然可以用scale_fill_manual和scale_color_manual來指定顏色。但會有個狀況是,如果原本沒群組那怎麼辦?就自己用mutate()打造群組就好。方法各有利弊與使用時機。 22.4.1 依群組指定顏色 scale_color_manual() 與scale_fill_manual() NW %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line() + scale_color_manual( limits=c("65-74", "35-44"), # original chart group values=c("gold", "skyblue"), # map to color name="Age group", # legend title breaks=c("65-74", "35-44"), # original legend group labels labels=c("elder(65-74)","younger(35-44)"), # map to new labels na.value = "lightgrey" # color for other groups ) + theme_minimal() 22.4.2 使用gghighlight套件 library(gghighlight) NW %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line() + gghighlight(Category %in% c("65-74", "35-44")) + theme_minimal() + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "whitesmoke", colour = "whitesmoke", size = 0.5, linetype = "solid")) 使用gghighlight仍能自己使用scale_color_manual()來指定顏色 NW %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line() + gghighlight(Category %in% c("65-74", "35-44")) + scale_color_manual( limits=c("65-74", "35-44"), # original chart group values=c("gold", "skyblue")) + # map to color theme_minimal() ## Warning: Tried to calculate with group_by(), but the calculation failed. ## Falling back to ungrouped filter operation... ## label_key: Category 22.4.3 為視覺化建立群組 這個方法是在原本的資料並沒有可以作為color或fill的因子,所以自行創建一個要突顯的群組。 county %>% mutate(group = if_else(county %in% c("新竹縣", "新竹市"), "highlight", "other")) %>% mutate(county = reorder(county, people_total)) %>% ggplot() + aes(county, people_total, fill=group) %>% geom_col() + scale_fill_manual(values=c("highlight"="Khaki", "other"="lightgrey")) + guides(fill="none") + coord_flip() + theme_minimal() + th 但事實上也可以用gghighlight直接達成 county %>% mutate(county = reorder(county, people_total)) %>% ggplot() + aes(county, people_total) %>% geom_col(fill="deeppink") + gghighlight(county %in% c("新竹縣", "新竹市")) + guides(fill="none") + coord_flip() + theme_minimal() + th 參考資料:5.4 Control the size of plots/images | R Markdown Cookbook (bookdown.org)↩︎ "],["coordinate.html", "Chapter 23 Coordinate 23.1 NYT: Population Growth 23.2 Order as axis 23.3 Log-scale 23.4 23.5 Square-root scale 23.6 Increasing percentage as Y 23.7 X/Y aspect ratio", " Chapter 23 Coordinate 本章節談論的是視覺化圖表的座標軸,本章節所涵蓋的概念可參考Claus O. Wilke所著之Fundamentals of Data Visualization的Chap3 Coordination & Axis與Chapter 8 Visualizing distributions: Empirical cumulative distribution functions and q-q plots。 23.1 NYT: Population Growth 紐時這篇報導「When Did the Anthropocene Start? Scientists Closer to Saying When. - The New York Times (nytimes.com)」討論了人類活動對地球所產生的深遠影響,並探討人類是否已經進入了一個新的地質時期,被稱為「人新世」。報導指出,人類的經濟活動、能源消耗和人口增長是人新世的主要因素,並且這些因素已經在地球上留下了不可磨滅的痕跡。報導也提到,地質學家已經發現了人新世的證據,包括核爆炸中的鈽同位素、肥料中的氮和發電廠的灰燼等。然而,報導也問道,人新世是否真的已經開始,以及它的開始點是否應該是農業革命、工業革命、核彈(77年前)或其他發展。 23.1.1 Parsing table from pdf 至R4CSS/data可以下載到本範例所用的資料(是一個pdf檔案)https://github.com/p4css/R4CSS/raw/master/data/world_population_change.pdf。 我們可使用tabulizer這個套件來萃取PDF文件中的表格,官方雖然提供cran可以直接安裝,但有可能會遇到R的版本不符要求而安裝不起來的情形。此時可用第二種方法,直接從github上安裝該套件。 程式碼使用 extract_tables() 函數從指定的PDF文件中提取表格數據,並將其存儲在 tables 變量中。在這個函數中,我們指定了要從第1頁中提取表格數據。 # Method 1 # install.packages("tabulizer") # Method 2 # if (!require("remotes")) { # install.packages("remotes") # } # remotes::install_github(c("ropensci/tabulizerjars", "ropensci/tabulizer")) library(tidyverse) library(tabulizer) # Extract the table tables <- extract_tables('data/world_population_change.pdf', pages = 1) # Extract the first element of the variable raw <- as.data.frame(tables[[1]]) population_by_year <- raw %>% select(1, 2) %>% slice(-c(1:4)) %>% rename(years_to_2020 = V1, population = V2) # select(years_to_2020 = v1, population = v2) # mutate(years_to_2020 = v1, population = v2) 23.1.2 X and Y with log-scale 通常情況下,當數據範圍很大,且存在極端值或者偏離值時,使用對數轉換可以更好地展示數據的分佈情況。在這種情況下,你可以使用 scale_x_log10() 或 scale_y_log10() 函數將 x 軸或 y 軸轉換為對數刻度。 例如,如果你有一個數據集,其中一個變量的數值範圍從1到100000,且大多數數據會集中在較小的值上,那麼使用線性刻度將導致數據在圖形中的分佈不平衡,而較大的值會集中在圖形的邊緣或者消失在圖形之外。在這種情況下,使用對數刻度可以更好地展示數據的分佈情況,並且可以更好地顯示較大值之間的差異。而上述資料便有這樣的特色,尤其是在Y軸方向,一開始人口增加量不多,後來指數成長,此時若使用線性尺度,會看不清楚一開始的人口增加量。 library(cowplot) load("data/world_population_change.rda") population_by_year ## years_to_2020 population ## 1 11,720 4 ## 2 10,020 5 ## 3 8220 8 ## 4 7020 11 ## 5 6020 7 ## 6 5020 14 ## 7 4220 27 ## 8 3020 50 ## 9 2520 100 ## 10 2020 268 ## 11 1020 289 ## 12 720 397 ## 13 520 471 ## 14 420 561 ## 15 320 629 ## 16 270 772 ## 17 220 951 ## 18 170 1247 ## 19 120 1643 ## 20 70 2499 ## 21 65 2769 ## 22 60 3042 ## 23 55 3333 ## 24 50 3691 ## 25 45 4071 ## 26 40 4440 ## 27 35 4838 ## 28 30 5269 ## 29 25 5735 ## 30 20 6076 ## 31 15 6463 ## 32 10 6930 ## 33 5 7349 ## 34 0 7717 toplot <- population_by_year %>% mutate(years_to_2020 = map(years_to_2020, ~(str_remove(., ",")))) %>% mutate(years_to_2020 = as.numeric(years_to_2020), population = as.numeric(population)) toplot %>% head ## years_to_2020 population ## 1 11720 4 ## 2 10020 5 ## 3 8220 8 ## 4 7020 11 ## 5 6020 7 ## 6 5020 14 p1 <- toplot %>% ggplot() + aes(x=years_to_2020, y=population) + geom_point() + theme_bw() p2 <- toplot %>% ggplot() + aes(x=years_to_2020, y=population) + geom_point() + scale_x_log10() + scale_y_log10() + scale_x_reverse() + theme_bw() cowplot::plot_grid( p1, NULL, p2, labels = c("(a) Original Scale", "", "(b) Low-Scale"), nrow = 1, rel_widths = c(1, 0.1, 1) ) 23.2 Order as axis 學術論文若要呈現一群數據的分佈時,最常用的是密度(分佈)函數、累積分佈函數,最常視覺化的方法是密度分佈圖(geom_density())或直方圖(geom_histogram())。然而,對新聞等強調「說故事」的文體而言,說故事的技巧往往不是「那一群資源多或資源少的對象」,而經常要直指「那個對象」,要能夠看得見所敘述的對象在圖中的位置。此時,用密度分佈來呈現的話,只能看出,該對象在分佈的某個位置;但可以改用將資料對象根據某個數據來排序後,繪製折現圖的方式來表現。例如,若要繪製一個班級的成績分佈,通常X軸是分數(組),Y軸是獲得該分數(組)的人數;但其實可以將個體依照分數來做排序,Y軸不是某個分數(組)的個數,而是每個排序後的個體,而且以排序後的序號(Ranking)來表示。用折線圖繪製後,一樣可以看出分數的分佈,但卻能夠直接標記敘事中的某個對象是Y軸中得哪個點。 Figure 3.5: Population numbers of Texas counties relative to their median value. Select counties are highlighted by name. The dashed line indicates a ratio of 1, corresponding to a county with median population number. The most populous counties have approximately 100 times more inhabitants than the median county, and the least populous counties have approximately 100 times fewer inhabitants than the median county. Data source: 2010 Decennial U.S. Census. See What’s Going On in This Graph? | Vaccination by Country fromWhat Data Shows About Vaccine Supply and Demand in the Most Vulnerable Places - The New York Times (nytimes.com) The original chart is animated along the timeline.What Data Shows About Vaccine Supply and Demand in the Most Vulnerable Places - The New York Times (nytimes.com) 23.3 Log-scale 以下我打算繪製出每個村里在15歲以上的人口數,來呈現台灣有些村里人口相當稀少,尤其是花蓮縣、澎湖縣、南投縣和宜蘭縣的幾個聚落。並標記出幾個人口數最高的里。如果我的目的是呈現村里人口數的統計分佈,我會用geom_density()來繪圖(如下),但實際上沒辦法從這樣的密度函式圖來說故事,指出那些人口數過高或過低的村里。 raw <- read_csv("data/opendata107Y020.csv", show_col_types = FALSE) %>% slice(-1) %>% type_convert() raw %>% ggplot() + aes(edu_age_15up_total) + geom_density() 因此,一個比較好的策略是,把各村里的人口數由小到大或由大到小排序好,編好Rank比序的代號,然後讓X軸做為比序,逐一在Y軸打出每一個村里的數據。 但這邊值得注意的是,如果沒有放大尾端(也就是村里人口數最少的那部分),實際上也很難繪圖。所以對Y軸取log,就可以看清楚Y軸的資料點。 toplot <- raw %>% select(site_id, village, edu_age_15up_total) %>% arrange(desc(edu_age_15up_total)) %>% mutate(index = row_number()) %>% mutate(label = ifelse(index <= 5 | index > n()-5, paste0(site_id, village), "")) library(ggrepel) p2 <- toplot %>% ggplot() + aes(index, edu_age_15up_total) + geom_point(alpha=0.5, color="royalblue") + geom_text_repel(aes(label = label), point.padding = .4, color = "black", min.segment.length = 0, family = "Heiti TC Light") + theme(axis.text.x=element_blank()) + scale_y_log10(breaks = c(0, 1, 10, 100, 1000, 10000)) + theme_minimal() p1 <- toplot %>% ggplot() + aes(index, edu_age_15up_total) + geom_point(alpha=0.5, color="royalblue") + theme(axis.text.x=element_blank()) + theme_minimal() cowplot::plot_grid( p2, NULL, p1, labels = c("a", "", "b"), nrow = 1, rel_widths = c(1, 0.1, 1) ) library(tidyverse) library(gghighlight) 23.4 23.5 Square-root scale Chap3 Coordination & Axis Fundamentals of Data Visualization (clauswilke.com) Figure 3.8: Areas of Northeastern U.S. states. (a) Areas shown on a linear scale. (b) Areas shown on a square-root scale. Data source: Google. 前面是視覺化了各村里大於十五歲以上人口的人口數分佈,採用對數尺度(log-scale)可以觀察到比較小的村里。那有什麼是適合用平方根尺度(sqrt-scale)的呢?是土地嗎?密度嗎?還是人口數?是村里等級嗎?鄉鎮市區等級嗎?還是縣市等級? town <- read_csv("data/tw_population_opendata110N010.csv") %>% slice(-1, -(370:375)) %>% type_convert() town %>% arrange(desc(area)) %>% mutate(index = row_number()) %>% ggplot() + aes(index, area) %>% geom_col(fill="skyblue") + scale_y_sqrt() + theme_minimal() Figure 23.1: (ref:population-area) county <- town %>% mutate(county = str_sub(site_id, 1, 3)) %>% group_by(county) %>% summarize( area = sum(area), people_total = sum(people_total) ) %>% ungroup() p1 <- county %>% arrange(desc(people_total)) %>% mutate(index = row_number()) %>% ggplot() + aes(index, people_total) %>% geom_col(fill="lightgrey") + # scale_y_sqrt() + theme_minimal() p2 <- county %>% arrange(desc(people_total)) %>% mutate(index = row_number()) %>% ggplot() + aes(index, people_total) %>% geom_col(fill="khaki") + scale_y_sqrt(breaks=c(0, 250000, 500000, 1000000, 2000000, 4000000)) + theme_minimal() cowplot::plot_grid( p1, p2, labels = c("a", "b"), nrow = 1 ) Figure 23.2: (ref:population-area) 23.6 Increasing percentage as Y 23.6.1 NYT: Net Worth by Age Group LEARNING NOTES Median for Inequality 這個教學案例來自紐約時報的「What’s going on in this gragh」系列資料視覺化教學之Teach About Inequality With These 28 New York Times Graphs - The New York Times (nytimes.com) 。該圖表呈現在不同年代、不同年齡層的人所擁有的淨資產(包含土地、存款、投資等減去債務)。該圖表的結果指出,在不同年代的老年人是越來越有錢,但年輕人卻越來越窮(該曲線為減去1989年 23.6.2 Read and sort data Sorted by arrange() function. p1 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(year, Category, Net_Worth) %>% group_by(Category) %>% arrange(year) %>% ungroup() p1 %>% filter(year <= 1992) %>% knitr::kable() year Category Net_Worth 1989 Less than 35 16.17019 1989 35-44 112.47530 1989 45-54 195.11630 1989 55-64 195.25554 1989 65-74 154.34277 1989 75 or older 144.29855 1992 Less than 35 16.60780 1992 35-44 79.91050 1992 45-54 139.97745 1992 55-64 203.44104 1992 65-74 176.44667 1992 75 or older 155.35173 library(gghighlight) p1 %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line() + geom_point() + gghighlight(Category %in% c("65-74", "35-44")) + theme_minimal() + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) p2 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(year, Category, NW = Net_Worth) %>% group_by(Category) %>% arrange(year) %>% mutate(increase = (NW-first(NW))/first(NW)) %>% ungroup() p2 %>% filter(year <= 1992) %>% knitr::kable() year Category NW increase 1989 Less than 35 16.17019 0.0000000 1989 35-44 112.47530 0.0000000 1989 45-54 195.11630 0.0000000 1989 55-64 195.25554 0.0000000 1989 65-74 154.34277 0.0000000 1989 75 or older 144.29855 0.0000000 1992 Less than 35 16.60780 0.0270627 1992 35-44 79.91050 -0.2895285 1992 45-54 139.97745 -0.2825948 1992 55-64 203.44104 0.0419220 1992 65-74 176.44667 0.1432131 1992 75 or older 155.35173 0.0765994 美國35歲以下的年輕人的中位淨資產比起年長的美國人來說,一開始平均貧窮得多。從「Less than 35」這條線看來,現在的年輕世代比起2004年的年輕世代所擁有的淨資產低了40%。相比之下,65歲以上的美國人現在的淨資產,相較於2004年增加了9%。隨著時代變化,可想像會有一群人的淨資產越來越多,只是現在從這個圖表看來,年輕人所擁有的淨資產相較於過去是越來越低的,多半流入了成年人和老年人手中。 p2 %>% ggplot() + aes(year, increase, color = Category) + geom_line() + geom_point() + gghighlight(Category %in% c("65-74", "Less than 35")) + theme_minimal() + scale_y_continuous(labels=scales::parse_format()) + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) 23.7 X/Y aspect ratio 23.7.1 UNICEF-Optimistic (WGOITH) https://www.nytimes.com/2021/11/17/upshot/global-survey-optimism.html https://changingchildhood.unicef.org/about plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>% select(country = WP5, age = WP22140, bw = WP22092) %>% mutate(country = ordered(country, levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17, 29, 31, 33, 35, 36, 60, 61, 77, 79, 81, 87, 165), labels=c("USA", "Morocco", "Lebanon", "Indonesia", "Bangladesh", "UK", "France", "Germany", "Spain", "Japan", "India", "Brazil", "Nigeria", "Kenya", "Ethiopia", "Mali", "Ukraine", "Cameroon", "Zimbabwe", "Argentina", "Peru"))) %>% count(country, age, bw) %>% group_by(country, age) %>% mutate(perc = n/sum(n)) %>% ungroup() %>% filter(bw == 1) %>% select(country, age, perc) %>% spread(age, perc) %>% rename(`15-24y` = `1`, `40+y` = `2`) plot.opt %>% head(10) %>% knitr::kable() country 15-24y 40+y USA 0.6679842 0.4611465 Morocco 0.4365079 0.4735812 Lebanon 0.5467197 0.4435798 Indonesia 0.7920605 0.8027344 Bangladesh 0.4624506 0.4319527 UK 0.5040000 0.4140000 France 0.3900000 0.2640000 Germany 0.5900000 0.3860000 Spain 0.5160000 0.3340000 Japan 0.6367265 0.2586873 plot.opt %>% ggplot() + aes(`40+y`, `15-24y`, label = country) + geom_point(color = "skyblue", size = 2) + xlim(0, 1) + ylim(0,1) + geom_text(hjust = -0.1, vjust = -0.5) + geom_abline(intercept = 0, slop = 1, color="lightgrey", alpha=0.5, linetype="dashed") + theme_minimal() + theme(aspect.ratio=1) "],["amount.html", "Chapter 24 AMOUNT 24.1 Bar chart 24.2 Heatmap: Vaccination", " Chapter 24 AMOUNT 24.1 Bar chart 24.2 Heatmap: Vaccination 這個例子參考(Wilke 2019)在視覺化數量(Amount)時的熱圖範例(Heatmap),但改用為視覺化各國每百人完整注射COVID-19疫苗人數歷時資料。 - https://ourworldindata.org/covid-vaccinations - https://github.com/owid/covid-19-data/tree/master/public/data/vaccinations 在R語言中,我們可以使用ggplot2套件來創建熱圖。熱圖通常使用顏色來表示數據的強度或值,通常是從淺色到深色或從冷色到暖色的漸變。ggplot2套件提供了geom_tile()函數來繪製熱圖。熱圖主要有以下幾個作用: 顯示數據的分布情況:熱圖可以將數據的分布情況一目了然地呈現出來,讓觀察者可以快速了解數據的分布情況。 發現數據之間的相關性:熱圖可以將數據之間的相關性直觀地呈現出來,這對於探索數據之間的關係非常有用。 篩選數據:熱圖可以幫助我們快速地篩選出數據中的關鍵部分,從而更好地理解數據。 使用ggplot2繪製熱圖的過程中,我們可以使用scale_fill_gradient()函數設置顏色的漸變方式和範圍,使用coord_equal()函數使x和y軸的尺度相同,從而保持正方形。 24.2.1 The case: Vaccinating coverage by month 本例子的資料前處理難度較高(OS:惡魔級)。困難來自於每個國家登記資料的時間不同,因此會產生大量NA值。但在這樣的狀況下,又要找到以月為時間單位的共同數值,就會更挑戰程式編寫者的資料清理技術。除此之外,如何偵測「每個國家超過每百人有二十人完整注射疫苗的時間點」,更是技巧中的技巧。是個磨練NA值處理和高難度資料前處理的好例子。這個例子同時也是大量在長表格、寬表格間轉換,多次運用spread()/pivot_wider()與gather()/pivot_longer(),搭配group_by()來達到資料整理目的的困難例子。 24.2.2 Data cleaning library(lubridate) raw <- read_csv("data/vaccinations.csv") fullvaccinated <- raw %>% select(country = location, date, people_fully_vaccinated_per_hundred) %>% drop_na(people_fully_vaccinated_per_hundred) %>% mutate(m = floor_date(date, unit = "month")) %>% group_by(country, m) %>% arrange(date) %>% slice(1) %>% ungroup() %>% select(-date) vperc_by_month <- fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% group_by(country) %>% arrange(month) %>% mutate(perc = zoo::na.locf(perc, na.rm = F)) %>% ungroup() %>% arrange(country, month) %>% replace_na(list(perc=0)) 24.2.3 Visualization https://clauswilke.com/dataviz/visualizing-amounts.html 這個案例使用了三個維度的資料,分別為X軸的時間(月)、Y軸的國家、以及用顏色來呈現各國疫苗注射量(每百人)。並使用geom_tile()來製作熱圖。然而,Y軸的排序卻會影響讀圖。例如,在第一個例子中,Y軸的順序是用最後一個時間點的疫苗注射比例來排序。但每個國家政策和疫苗可獲量均不同,故開始注射和覆蓋速度也差很多,最終覆蓋量也會差很多。所以如果以最終覆蓋量來排序的話,反而不易觀察過程的變化,且「顏色」並不容易用來比較最終覆蓋量的大小,因而會產生很多讀圖上的困擾。 另一種繪圖策略是該書上的做法,其Y軸的排序是依照疫苗覆蓋率達到某個數值(例如每百人中有20人完整注射二劑疫苗)的時間早晚來排序。有此作為基準,每個國家在後續時間點的覆蓋速度的比較便比較容易。 另外需要注意到,顏色的取捨、以及相對於尺度的漸層設計也會影響讀圖。 24.2.3.1 Heatmap 01: Sorted by coverage of the last month watched <- c("United Arab Emirates", "Japan", "Singapore", "South Korea", "Taiwan", "Malaysia", "Hong Kong", "New Zealand", "Thailand", "Netherlands", "United States", "Israel", "United Kingdom", "Indonesia", "Thailand", "Philippines") vperc_by_month %>% spread(month, perc) %>% filter(country %in% watched) %>% mutate(country = reorder(country, -`2022-05-01`)) %>% gather(month, perc, -country) %>% ggplot() + aes(month, country, fill=perc) + geom_tile() + theme_minimal() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) 24.2.3.2 Heatmap 02: Sorted by the time of specific coverage rate Sort by the time when the vaccine coverage rate exceeds 20% for all countries on the Y-axis. https://clauswilke.com/dataviz/visualizing-amounts.html vperc_by_month %>% filter(country %in% watched) %>% mutate(month = lubridate::as_date(month)) %>% group_by(country) %>% mutate(month1 = min((month[perc > 20]))) %>% ungroup() %>% spread(month, perc) %>% mutate(country = reorder(country, -as.numeric(month1))) %>% select(-month1) %>% gather(month, perc, -country) %>% ggplot() + aes(month, country, fill=perc) + geom_tile() + theme_minimal() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) References "],["distribution-histogram-density.html", "Chapter 25 DISTRIBUTION: Histogram & Density 25.1 Density plot 25.2 Histogram 25.3 Pyramid Plot 25.4 Box plot: Muitiple Distrubution 25.5 Likert plot", " Chapter 25 DISTRIBUTION: Histogram & Density 本章節將介紹與資料分布相關的視覺化方法。資料分布是指數據中每個值出現的頻率或概率。在統計學中,了解資料分布是非常重要的,因為它可以幫助我們判斷數據是否為正態分佈,或者是否存在異常值或極端值。本章節將涵蓋常見的資料分布視覺化方法,包括直方圖、密度圖、箱形圖和金字塔圖等。 以下是R語言ggplot2套件中,用於資料分布視覺化的一些常用函式: geom_histogram():用於創建直方圖。 geom_density():用於創建密度圖。 geom_boxplot():用於創建箱形圖。 geom_bar():用於創建柱狀圖。 geom_freqpoly():用於創建頻率多邊形圖。 註:本節的設計概念不少是參考 Claus O. Wilke 所著的「Foundations of Data Visualization」一書的章節,同時也參考臺灣和資料新聞的案例進行了改編。 接下來我們將使用Histogram和Density Plot這兩種資料視覺化方法來探索台灣村里長的年齡和性別分布情況。我們所使用的資料來源包括內政部和中選會的投票資料,這些資料能夠提供具有代表性的統計樣本,幫助我們更好地了解村里長的整體特徵。在進行資料視覺化的過程中,我們將會運用R語言中的ggplot2套件,並根據不同的視覺化需求進行相應的設置和調整。 https://www.moi.gov.tw/LocalOfficial.aspx?n=577&TYP=KND0007。 vilmaster <- readr::read_csv("data/tw_vil2018_elccand.csv") %>% drop_na(當選註記) 25.1 Density plot 密度圖(Density Plot)是一種展示數據集分佈情況的圖表,它可以幫助我們更好地理解數據集中數值出現的概率。圖表的 X 軸代表數據集的數值範圍,Y 軸則代表每個數值的出現概率。與直方圖不同,密度圖的曲線是光滑的,因為它是通過連續的數值範圍估算出的概率密度函數。通過比較不同數據集的密度圖,我們可以更好地了解它們之間的差異。在ggplot2中,可以用geom_density()函數來創建密度圖。 p1 <- vilmaster %>% ggplot() + aes(年齡) + geom_density() + th p2 <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_density(alpha=0.5) + th + scale_fill_manual( limits=c('1', '2'), # original chart group values=c("gold", "skyblue"), # map to color name="性別", # legend title breaks=c(1, 2), # original legend group labels labels=c("Male","Female"), # map to new labels na.value = "lightgrey" # color for other groups ) cowplot::plot_grid( p1, p2, labels = c("(a) Overall", "(b) Group by gender"), nrow = 1, rel_widths = c(1, 1) ) 25.1.1 Density with different bandwidth 參數bw指的是bnadwidth,為繪製histogram時的bar所涵蓋的資料寬度。以step-plot來說,bw越大,則梯距越寬;以density-plot來說,若bw越大則越是平滑。 library(ggridges) # for geom_density_line() p.b05 <- vilmaster %>% ggplot() + aes(年齡) + geom_density_line(fill='gold', bw=0.5, kernel='gaussian') + th p.b1 <- vilmaster %>% ggplot() + aes(年齡) + geom_density_line(fill='gold', bw=1, kernel='gaussian') + th p.b5 <- vilmaster %>% ggplot() + aes(年齡) + geom_density_line(fill='gold', bw=5, kernel='gaussian') + th p.rect <- vilmaster %>% ggplot() + aes(年齡) + geom_density_line(fill='gold', bw=10, kernel='rectangular') + th cowplot::plot_grid( p.b05, p.b1, p.b5, p.rect, labels = c("(a) bw=.5", "(b) bw=1", "(c) bw=2", "(b) rect"), nrow = 2, rel_widths = c(1, 1) ) 25.2 Histogram 直方圖(Histogram)是一種用於展示數據集分佈的圖表。它通過將數據範圍分成若干個區間(稱為 “bins” 或 “buckets”),然後計算落在每個區間內的數據的數量(稱為 “frequency”),來展示數據集的分佈情況。直方圖的 X 軸表示數據範圍,Y 軸表示每個區間中的頻數。直方圖可以幫助我們快速了解數據的分佈情況,特別是數據的中心趨勢、數據的離散程度和是否存在異常值等。 25.2.1 Histogram with different number of bins p10 <- vilmaster %>% ggplot() + aes(年齡) + geom_histogram(bins=10, fill='royalblue') + th p20 <- vilmaster %>% ggplot() + aes(年齡) + geom_histogram(bins=20, fill='royalblue') + th p30 <- vilmaster %>% ggplot() + aes(年齡) + geom_histogram(bins=30, fill='royalblue') + th p40 <- vilmaster %>% ggplot() + aes(年齡) + geom_histogram(bins=40, fill='royalblue') + th cowplot::plot_grid( p10, p20, p30, p40, labels = c("(a) bins=10", "(b) bins=20", "(c) bins=30", "(b) bins=40"), nrow = 2, rel_widths = c(1, 1) ) 25.2.2 Density vs histogram Histogram通常用來顯示數據的分佈情況,它會把數據區間分成若干個等寬的區間,然後計算每個區間內數據的頻率,再將這些頻率表示在y軸上。因此,histogram顯示的是數據的頻率,而不是數據的密度。 Density plot則是用來顯示數據的概率密度函數,它會通過核密度估計(Kernel Density Estimation, KDE)方法,將數據點周圍的密度估計出來,然後將這些估計值表示在y軸上。因此,density plot顯示的是數據的密度,而不是數據的頻率。 pd <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_density(alpha=0.5) + th + scale_fill_manual( values=c("1"='gold', '2'="skyblue"), labels=c('1'="Male",'2'="Female"), name='Sex' ) ph <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_histogram(bins=20, position="dodge") + th + scale_fill_manual(values=c("1"='gold', '2'="skyblue ")) + theme(legend.position="none") cowplot::plot_grid( pd, ph, labels = c("(a) geom_density()", "(b) geom_histogram()"), nrow = 1, rel_widths = c(6, 4) ) 25.2.3 Positions of bar chart p.hist.dodge <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_histogram(bins=20, position="dodge") + th + scale_fill_manual( values=c("1"='gold', '2'="skyblue "), labels=c('1'="Male",'2'="Female"), name='Sex' ) p.hist.stack <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_histogram(bins=20, position="stack") + th + scale_fill_manual(values=c("1"='gold', '2'="skyblue ")) + theme(legend.position="none") cowplot::plot_grid( p.hist.dodge, p.hist.stack, labels = c("(a) position:dodge", "(b) position:stack"), nrow = 1, rel_widths = c(6, 4) ) 25.2.4 Display two groups histogram by facet_wrap() geom_histogram(bins=20, position=\"dodge\") 用於繪製直方圖, bins=20表示將數據分成20個區間, position=\"dodge\"表示將不同性別的數據分開顯示。 th 是本範例在最早先所建立的ggplot主題,用於設置圖表的樣式(例如背景顏色、字體等)。 scale_fill_manual() 用於手動設置填充顏色, values=c(\"1\"='gold', '2'=\"skyblue\") 表示性別為1時填充金色,性別為2時填充天藍色。 labels=c('1'=\"Male\",'2'=\"Female\") 表示將性別1標記為Male,性別2標記為Female。 name='Sex' 表示設置顏色圖例的標題為Sex。 facet_wrap(.~性別, nrow=1) 表示將不同性別的數據分開顯示,每直行顯示一個性別。.~性別 表示將數據按性別分組。 vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_histogram(bins=20, position="dodge") + th + scale_fill_manual( values=c("1"='gold', '2'="skyblue "), labels=c('1'="Male",'2'="Female"), name='Sex' ) + facet_wrap(.~性別, nrow=1) 25.3 Pyramid Plot 金字塔圖(Pyramid plot)是一種用於比較兩個群體的統計圖表。它的形狀像一座金字塔,通常用於展示男女或年齡分佈等相關的數據。金字塔圖以垂直線為軸線,其中一側代表一個群體(如男性),另一側代表另一個群體(如女性)。圖表的左右兩側是對稱的,並以一條中心線分開。圖表中的每一行表示一個年齡段,而每一列則表示一個群體的比例或頻數。金字塔圖的高度表示總人數或總比例,並且可以用不同的顏色區分不同的群體。金字塔圖可以直觀地顯示兩個群體之間的差異,特別是在不同年齡段之間。 25.3.1 Modify geom_col() to pyramid plot vilmaster %>% group_by(性別) %>% mutate(age_group = cut(年齡, 0:20*5+.01)) %>% count(age_group) %>% ungroup() %>% ggplot() + aes(x=age_group, y=ifelse(性別=='1', -1, 1)*n, fill=factor(性別)) + geom_col() + scale_y_continuous(name = "Count", breaks = 250*(-6:2), labels = c("1500", "1250", "1000", "750", "500", "250", "0", "250", "500")) + coord_flip() + scale_fill_manual( values=c("1"='gold', '2'="skyblue "), labels=c('1'="Male",'2'="Female"), name='Sex' ) + th + labs(y="Count", x="Age Group") 25.4 Box plot: Muitiple Distrubution 箱形圖(Box plot)是一種用於展示數據分佈情況的統計圖表。它通常顯示數據的中位數、四分位數、極值和異常值等統計量。箱形圖的中間線表示數據的中位數,箱子的上下邊界則分別表示數據的上四分位數和下四分位數。箱子的高度表示數據的變異程度,而箱子外的線段則表示數據的最大值和最小值。如果數據中存在異常值,則通常使用圓圈或星號等符號來標記。箱形圖可以用來比較不同數據集之間的分佈情況,以及檢查數據是否存在異常值。 25.4.1 TW-Salary (boxplot) Inspired by Six Myths About Choosing a College Major - The New York Times (nytimes.com) and What’s Going On in This Graph? | Jan. 9, 2018 - The New York Times (nytimes.com) library(readxl) raw <- read_excel("data/tw_salary109.xlsx", sheet=1, trim_ws = T) raw Category Q1 Median Q3 Mean 男 39.0 53.2 82.3 70.7 女 35.1 46.8 67.6 58.6 未滿25歲 28.1 35.8 45.1 37.7 25-29歲 36.6 47.8 61.7 53.0 30-39歲 39.2 53.3 77.0 64.1 40-49歲 39.9 56.9 91.8 74.8 50-64歲 37.8 53.3 88.4 75.5 65歲以上 30.6 40.9 63.1 62.6 國中及以下 32.7 40.5 52.0 45.4 高中(職) 34.5 44.7 59.8 51.9 大專 38.6 53.7 80.2 67.0 研究所 60.9 96.0 139.3 116.4 礦業及土石採取業 34.2 57.2 91.7 68.5 製造業 38.7 50.4 73.2 64.8 電力及燃氣供應業 73.9 110.7 139.9 113.2 用水供應及污染整治業 31.9 45.7 63.9 54.6 營建工程業 34.1 46.1 64.0 54.7 批發及零售業 36.6 49.5 71.7 62.7 運輸及倉儲業 40.3 58.3 81.4 66.1 住宿及餐飲業 30.1 36.7 49.3 42.0 出版﹑影音製作﹑傳播及 資通訊服務業 53.0 71.5 111.2 88.8 金融及保險業 65.6 96.9 140.1 113.4 不動產業 36.8 52.2 76.6 65.0 專業科學及技術服務業 41.9 61.3 95.0 77.5 支援服務業 33.1 42.1 49.3 45.3 教育業-不含小學以上各級 學校 28.4 33.7 42.7 37.2 醫療保健及社會工作服務業 41.3 60.1 88.1 77.1 藝術娛樂及休閒服務業 28.8 39.2 57.2 48.8 其他服務業 30.6 35.8 49.1 43.6 raw %>% slice(-(1:12)) %>% mutate(Category = reorder(Category, desc(Median))) %>% ggplot() + aes(y = Category, xlower=Q1, xmiddle=Median, xupper=Q3, xmin=0, xmax=150) + geom_boxplot(stat = "identity", color="white", fill="skyblue") + geom_point(aes(x = Mean)) + th + theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank()) 25.4.2 TW-Income (boxplot) 本案例用BoxPlot來呈現某個行政區(鄉鎮市區)各村里的所得中位數、平均數、四分位數的分佈。如果在箱型圖中,平均數高於第三分位數,這代表數據集呈現右偏分佈。也就是說,數據中的大部分觀測值都分佈在第一、二分位數之間,但存在一些較大的極端值,使平均值被往右偏移。從這樣的分佈中可以察覺某些里因為有少數極端高收入住戶,而使得平均高於四分位數。 library(gghighlight) toplot <- read_csv("data/tw_income_107.csv", ) %>% filter(!`村里` %in% c("合計", "其他", "福住里")) %>% filter(鄉鎮市區 %in% c("信義區")) %>% mutate(村里 = reorder(村里, desc(中位數))) toplot %>% mutate(group = if_else((平均數>第三分位數), "highlight", "none")) %>% ggplot() + aes(y = 村里, xlower=第一分位數, xmiddle=中位數, xupper=第三分位數, xmin= min(第一分位數), xmax=max(第三分位數), fill=group) + geom_boxplot(stat = "identity", color="white") + scale_fill_manual(values = c("highlight"="orangered", "none"="skyblue")) + guides(fill=FALSE) + geom_point(aes(x = 平均數)) + xlab("年所得(單位:千元)") + th + theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank()) 25.5 Likert plot raw <- read_rds("data/tfc_survey.rds") dt <- raw %>% mutate(QA3_lv = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"), labels = c("青年", "青年", "壯年", "壯年", "壯年", "中年", "中年", "中年", "中年", "老年", "老年"))) %>% mutate(Q7 = ordered(Q7, levels=c("一點也不會", "不會", "會", "絕對會"))) %>% mutate(Q8 = ordered(Q8, levels=c("一點也不會", "不會", "會", "絕對會"))) 25.5.1 Stacked or dodged bar 要比較不同年齡層在某個題項的填答結果時,最常見的是用Stacked或Dodged長條圖。Stacked是便於看到各組的總數大小但難以比較各組之間回應的比例,而Dodged是便於比較各組之間每個項目的比例,而不容易觀察總數大小。但這兩種呈現方法,以上面這個例子來說,從視覺化上均難以閱讀出來,哪個年齡層的填答比較靠近「會或絕對會」,又哪個年齡層比較靠近「絕對不會或不會」。 這時候我們可以用一種繪製方法來表達這類Likert問卷的結果,這種圖表稱為Likert Plot(Graph)。 p1 <- dt %>% count(QA3_lv, Q7) %>% ggplot() + aes(QA3_lv, n, fill=Q7) + geom_col(position = position_stack(reverse = TRUE)) + coord_flip() + th p2 <- dt %>% count(QA3_lv, Q7) %>% ggplot() + aes(QA3_lv, n, fill=Q7) + geom_col(position="dodge") + th cowplot::plot_grid( p1, NULL, p2, labels = c("(a) Stacked", "", "(b) Dodged"), ncol = 1, rel_heights = c(1, 0.1, 1) ) 25.5.2 Likert Graph Likert Graph繪製重點有幾個: 要轉用比例來繪製。例如下圖就是用絕對的數值來繪製,因為年齡層人數的不同,例如壯年人數比較多,而老年人數少非常多,反而難以跨組比較。 ggstats的套件有gglikert()可以用(請見Plot Likert-type items with `gglikert()` • ggstats (larmarange.github.io))的說明,但也可以用geom_segment()來自己刻。 用geom_segment()時在aes()多了幾個參數,為該資料在X軸的起始點與終點(x, xend)與Y軸的起始點與終點(y, yend)。要自己運算。 color <- c("#9393C6", "#A8A8A8","#FFA166", "#FF6200") dt %>% count(QA3_lv, Q7) %>% mutate(y_acc = cumsum(n)) %>% group_by(QA3_lv) %>% mutate(y_end = y_acc - min(y_acc) - n[[2]]) %>% mutate(y_start = y_end - n) %>% ungroup() %>% ggplot() + aes(x = QA3_lv, xend = QA3_lv, y = y_start, yend = y_end, , color=Q7) + geom_segment(linewidth = 18) + coord_flip() + theme_bw() + scale_color_manual("", labels = c("一點也不會", "不會", "會", "絕對會"), values = color, guide = "legend") + th 正確用比例繪製的結果如下。Likert Graph和本節所提到的Pyramid Graph在數位敘事上的效果很類似,都是對應到一般的Stacked或Dodged長條圖不易做組間比較。Pyramid Graph適於做兩組間的數值左右對照,Likert Graph則有助於快速看出不同題項或不同組別間的填答差異。 library(scales) dt %>% count(QA3_lv, Q7) %>% group_by(QA3_lv) %>% mutate(perc = n/sum(n)) %>% mutate(y_acc = cumsum(perc)) %>% mutate(y_end = y_acc - y_acc[[2]]) %>% # mutate(y_end = y_acc - perc[[1]] - perc[[2]]) %>% # mutate(y_end = y_acc - min(y_acc) - perc[[2]]) %>% mutate(y_start = y_end - perc) %>% ungroup() %>% ggplot() + aes(x = QA3_lv, xend = QA3_lv, y = y_start, yend = y_end, , color=Q7) + geom_segment(linewidth = 18) + scale_y_continuous(labels = percent_format()) + coord_flip() + scale_color_manual("", labels = c("一點也不會", "不會", "會", "絕對會"), values = color, guide = "legend") + ylab("Perc(%)") + xlab("Age group") + th "],["proportion.html", "Chapter 26 PROPORTION 26.1 Pie Chart 26.2 Dodged Bar Chart 26.3 Treemap: Nested Proportion", " Chapter 26 PROPORTION 26.1 Pie Chart 26.2 Dodged Bar Chart 26.3 Treemap: Nested Proportion Treemap是一種資料視覺化工具,用於呈現層級式結構的數據。它通常使用矩形或正方形區域來表示不同的數據單元,並將它們分層排列以形成層次樹狀結構。Treemap的特點包括: 易於理解:Treemap以直觀的方式呈現數據,讓使用者能夠輕鬆地了解各個數據單元之間的比例關係。 節省空間:Treemap使用矩形或正方形區域排列數據,能夠更有效地利用空間,呈現更多的數據。 可互動性:Treemap通常支持互動式操作,使用者可以通過縮放、懸停等方式,進一步了解數據。 Treemap適用於以下情況: 層級式數據:Treemap適用於層級式數據,例如組織架構、檔案系統等。 大量數據:Treemap能夠有效地呈現大量數據,並在縮放時保持清晰度。 比例關係:Treemap適用於呈現不同數據單元之間的比例關係,例如市場份額、支出等。 26.3.1 NYT: Carbon by countries 本案例取自紐時所報導之Who Has The Most Historical Responsibility for Climate Change? - The New York Times (nytimes.com)。該新聞報導了聯合國氣候峰會在格拉斯哥舉行期間的一個重要議題:世界上最富裕的國家,即那些對全球暖化負責任的不成比例的國家,應如何賠償因全球氣溫上升所造成的貧困國家的損失。報導指出,現今全球人口中,包括美國、加拿大、日本以及西歐大部分國家在內的富裕國家僅佔12%,但是在過去的170年中,這些國家卻負責了50%的溫室氣體排放。貧困國家要求富裕國家提供更多資金以應對全球暖化所帶來的風險。在峰會上,來自最不發達國家聯盟的Sonam P. Wangdi指出,他的祖國不丹對全球暖化的責任較小,因為該國目前吸收的二氧化碳比汽車和房屋排放的少。然而,不丹仍然面臨著由氣溫上升所帶來的嚴重風險,喜馬拉雅山脈融化的冰川已經導致了洪水和泥石流,摧毀了村莊。報導指出,最不發達國家需要更多的資金和支持,以應對全球暖化所帶來的影響。 本案例的Treemap以面積顯示了各國的碳排放所佔比例,並用顏色視覺化各國的人均GDP。Per Capita是拉丁語,通常用來表示某種統計數據與人口數量之間的關係。它是指將某一特定數量的總量除以人口數目,以得出每個人所擁有的平均數量。例如,國家的人均GDP(Gross Domestic Product,國內生產總值)是指該國的總GDP除以該國的人口數,以反映一個人在該國經濟中所創造的平均貢獻。Per Capita常用於比較不同國家或地區之間的平均水平,以及分析人均收入、人均支出、人均消費等數據。 totreemap <- read_csv("data/GCB2021v34_MtCO2_flat.csv") %>% drop_na(`Total`) %>% filter(!Country %in% c("Global", "International Transport")) %>% filter(Year==2020) %>% arrange(desc(`Total`)) %>% mutate(perc = Total/sum(Total)) %>% slice(1:20) library(treemapify) totreemap %>% ggplot() + aes(area = perc, fill=`Per Capita`, label=Country) + geom_treemap() + geom_treemap_text(color="white", place="centre", grow=TRUE ) 26.3.2 TW: Taiwan Annual Expenditure 上述案例未能突顯出Treemap能夠呈現階層式資料的特色。因此本案例將使用台灣中央預算,階層化地顯示不同機構層級(大類、一級部會)等的預算佔比。例如衛福部、財政部與勞動部的預算均屬於社會福利支出。 這段程式碼中,使用了 zoo 套件中的 na.locf() 函數。此函數用於將 raw 資料框中的 款 欄位的缺失值 (NA) 以最近已知的值 (向前填補) 進行填補。 library(zoo) # raw <- readxl::read_excel("data/111B歲出政事別預算總表.xls") raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F) names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差") # raw$款 <- na.locf(raw$款) cleand <- raw %>% filter(!is.na(款) | !is.na(科)) %>% slice(-(1:2)) %>% select(-目, -節) %>% mutate(org = purrr::map(機構, function(x){str_split(x, "\\n")[[1]][2]})) %>% mutate(款 = ifelse(!is.na(款), unlist(org), unlist(款))) %>% mutate(款 = zoo::na.locf(款)) %>% filter(!is.na(科)) %>% select(-科) %>% type_convert() %>% mutate(上年度預算 = as.numeric(上年度預算), 上年度決算 = as.integer(上年度決算), 預算差 = as.numeric(預算差)) %>% replace_na(list(上年度預算 = 0, 上年度決算 = 0)) %>% mutate(預算差 = 本年度預算 - 上年度預算) cleand %>% filter(款 %in% c("科學支出")) %>% ggplot() + aes(area = 本年度預算, fill=`本年度預算`, label=org) + geom_treemap() + geom_treemap_text(color="white", place="centre", grow=TRUE, family = "Heiti TC Light" ) + theme(title = element_text(family = "Heiti TC Light"), text = element_text(family = "Heiti TC Light")) library(treemapify) cleand %>% # filter(款 %in% c("科學支出", "教育支出", "國防支出", "司法支出")) %>% ggplot() + aes(area = 本年度預算, fill=`本年度預算`, label=org, subgroup = 款) + geom_treemap() + geom_treemap_subgroup_border(color="gold") + geom_treemap_subgroup_text(place = "centre", grow = T, alpha = 0.5, colour = "gold", min.size = 0, family = "Heiti TC Light") + geom_treemap_text(color="white", place="centre", grow=F, family = "Heiti TC Light" ) + theme(title = element_text(family = "Heiti TC Light"), text = element_text(family = "Heiti TC Light"), legend.position = "none") "],["association.html", "Chapter 27 ASSOCIATION 27.1 等比例座標軸", " Chapter 27 ASSOCIATION 27.1 等比例座標軸 27.1.1 UNICEF-Optimistic (WGOITH) https://www.nytimes.com/2021/11/17/upshot/global-survey-optimism.html https://changingchildhood.unicef.org/about plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>% select(country = WP5, age = WP22140, bw = WP22092) %>% mutate(country = ordered(country, levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17, 29, 31, 33, 35, 36, 60, 61, 77, 79, 81, 87, 165), labels=c("USA", "Morocco", "Lebanon", "Indonesia", "Bangladesh", "UK", "France", "Germany", "Spain", "Japan", "India", "Brazil", "Nigeria", "Kenya", "Ethiopia", "Mali", "Ukraine", "Cameroon", "Zimbabwe", "Argentina", "Peru"))) %>% count(country, age, bw) %>% group_by(country, age) %>% mutate(perc = n/sum(n)) %>% ungroup() %>% filter(bw == 1) %>% select(country, age, perc) %>% spread(age, perc) %>% rename(`15-24y` = `1`, `40+y` = `2`) plot.opt %>% head(10) %>% knitr::kable() country 15-24y 40+y USA 0.6679842 0.4611465 Morocco 0.4365079 0.4735812 Lebanon 0.5467197 0.4435798 Indonesia 0.7920605 0.8027344 Bangladesh 0.4624506 0.4319527 UK 0.5040000 0.4140000 France 0.3900000 0.2640000 Germany 0.5900000 0.3860000 Spain 0.5160000 0.3340000 Japan 0.6367265 0.2586873 plot.opt %>% ggplot() + aes(`40+y`, `15-24y`, label = country) + geom_point(color = "skyblue", size = 2) + xlim(0, 1) + ylim(0,1) + geom_text(hjust = -0.1, vjust = -0.5) + geom_abline(intercept = 0, slop = 1, color="lightgrey", alpha=0.5, linetype="dashed") + theme_minimal() + theme(aspect.ratio=1) "],["time-trends.html", "Chapter 28 TIME & TRENDS 28.1 Highlighting: Unemployed Population 28.2 Smoothing: Unemployed", " Chapter 28 TIME & TRENDS 28.1 Highlighting: Unemployed Population This example is referenced from Datacamp’s Introduction to data visualization with ggplot2。 28.1.1 The econimics data 這是一個包含美國經濟時間序列資料的資料集,資料來源為https://fred.stlouisfed.org/。economics是以「寬」表格方式儲存,而economics_long 資料框則以「長」表格方式儲存。每一列之date為資料收集的月份。 pce:個人消費支出,以十億美元為單位,資料來源為 https://fred.stlouisfed.org/series/PCE pop:總人口數,以千人為單位,資料來源為 https://fred.stlouisfed.org/series/POP psavert:個人儲蓄率,資料來源為 https://fred.stlouisfed.org/series/PSAVERT/ uempmed:失業中位數持續時間,以週為單位,資料來源為 https://fred.stlouisfed.org/series/UEMPMED unemploy:失業人數,以千人為單位,資料來源為 https://fred.stlouisfed.org/series/UNEMPLOY economics %>% head() ## # A tibble: 6 × 6 ## date pce pop psavert uempmed unemploy ## <date> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1967-07-01 507. 198712 12.6 4.5 2944 ## 2 1967-08-01 510. 198911 12.6 4.7 2945 ## 3 1967-09-01 516. 199113 11.9 4.6 2958 ## 4 1967-10-01 512. 199311 12.9 4.9 3143 ## 5 1967-11-01 517. 199498 12.8 4.7 3066 ## 6 1967-12-01 525. 199657 11.8 4.8 3018 28.1.2 Setting marking area recess <- data.frame( begin = c("1969-12-01","1973-11-01","1980-01-01","1981-07-01","1990-07-01","2001-03-01", "2007-12-01"), end = c("1970-11-01","1975-03-01","1980-07-01","1982-11-01","1991-03-01","2001-11-01", "2009-07-30"), event = c("Fiscal & Monetary\\ntightening", "1973 Oil crisis", "Double dip I","Double dip II", "Oil price shock", "Dot-com bubble", "Sub-prime\\nmortgage crisis"), y = c(.01415981, 0.02067402, 0.02951190, 0.03419201, 0.02767339, 0.02159662, 0.02520715) ) library(lubridate) recess <- recess %>% mutate(begin = ymd(begin), end = ymd(end)) economics %>% ggplot() + aes(x = date, y = unemploy/pop) + ggtitle(c("The percentage of unemployed Americans \\n increases sharply during recessions")) + geom_line() + geom_rect(data = recess, aes(xmin = begin, xmax = end, ymin = -Inf, ymax = +Inf, fill = "Recession"), inherit.aes = FALSE, alpha = 0.2) + geom_label(data = recess, aes(x = end, y = y, label=event), size = 3) + scale_fill_manual(name = "", values="red", label="Recessions") 28.2 Smoothing: Unemployed Smooth by bin smoothing fit <- with(economics, ksmooth(date, unemploy, kernel = "box", bandwidth=210)) economics %>% mutate(smooth = fit$y) %>% ggplot() + aes(date, unemploy) + geom_point(alpha = 5, color = "skyblue") + geom_line(aes(date, smooth), color="red") + theme_minimal() 28.2.1 Polls_2008 Second Example comes from Rafael’s online book library(dslabs) span <- 7 polls_2008 ## # A tibble: 131 × 2 ## day margin ## <dbl> <dbl> ## 1 -155 0.0200 ## 2 -153 0.0300 ## 3 -152 0.065 ## 4 -151 0.06 ## 5 -150 0.07 ## 6 -149 0.05 ## 7 -147 0.035 ## 8 -146 0.06 ## 9 -145 0.0267 ## 10 -144 0.0300 ## # ℹ 121 more rows fit <- with(polls_2008, ksmooth(day, margin, kernel = "box", bandwidth = span)) polls_2008 %>% mutate(smooth = fit$y) %>% ggplot(aes(day, margin)) + geom_point(size = 3, alpha = .5, color = "grey") + geom_line(aes(day, smooth), color="red") + theme_minimal() "],["geospatial.html", "Chapter 29 GEOSPATIAL 29.1 World Map 29.2 Read Spatial Data from SEGIS 29.3 Town-level: Taipei income 29.4 Voting map - County level 29.5 Mapping data with grid", " Chapter 29 GEOSPATIAL 地圖是一種用來展示地理空間信息的視覺化工具,可以幫助我們更好地了解和分析地理現象。常見的地圖種類通常可以分為兩類:區域圖和點位圖。 區域圖(Choropleth Map)是通過將地理區域劃分為幾個區域,然後用不同的顏色、陰影或圖案等方式來表示這些區域的某種屬性或數量。這種地圖通常用於展示國家、省份、城市等區域的人口、經濟、地形、氣候等相關數據。區域圖能夠直觀地展示地理現象在不同區域之間的差異和變化,並有助於我們進行比較和分析。 點位圖(Dot Density Map)則是通過在地圖上用點或符號來表示某種地理空間現象的分布或密度。例如,可以用紅點表示城市、綠點表示森林、藍點表示湖泊等等。這種地圖通常用於展示地理現象在空間上的分布和密度,並能夠直觀地展示相對密度和稀疏程度。 區域圖的數據形式:有兩種基本數據模型:向量(Vector)和網格(Raster)。 向量數據模型使用點、線、多邊形等基本要素來描述地理空間現象。例如,可以用一個線段來表示一條河流,用一個多邊形來表示一個國家或城市的邊界等。向量數據模型具有比較強的邏輯性和表達能力,特別適合描述較簡單的地理現象。 網格數據模型則是將地理空間區域劃分為一個個大小相等的格子,每個格子都有一個固定的數值,用來表示這個區域的某種屬性,例如溫度、濕度、高程等等。網格數據模型適合描述分布比較連續和具有變化的地理現象。 通常繪製地理資訊地圖的時候,會需要因應你要繪製的地域去下載地圖空間數據檔案(例如.shape或geojson檔等)。如台灣的就可以去社會經濟資料服務平台 (moi.gov.tw)下載。但也有一些套件內部就包含這些地理空間數據,例如下一節的例子rworldmap套件本身就有世界地圖。或者可以嘗試ggmap或rgooglemap等第三方服務(參考簡介:Map Visualization in R · Data Science and R) 29.1 World Map library(readxl) library(rworldmap) # for drawing rworldmap rawdata <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) mapdata <- rawdata[,c(3, 6:24)] 29.1.1 Bind data to map data 這段程式碼是在將自己的數據mapdata與rworldmap世界地圖數據進行結合。 首先,使用 joinCountryData2Map() 函數,將自己的數據和世界地圖數據按照國家的 ISO3 代碼進行連接,生成一張新的地圖。其中, mapdata 是指世界地圖數據, joinCode 參數指定連接時使用的 ISO3 代碼(亦即你預先知道你自己的資料中有ISO3國家代碼)。 nameJoinColumn 參數則用於指定自己數據中與國家對應的欄位名稱為iso3。 還有其他的joinCode如「“ISO2”,“ISO3”,“FIPS”,“NAME”, “UN” = numeric codes」等可參見該套件的說明rworldmap package - RDocumentation。 # join your data with the world map data myMap <- joinCountryData2Map(mapdata, joinCode = "ISO3", nameJoinColumn = "iso3") ## 196 codes from your data successfully matched countries in the map ## 1 codes from your data failed to match with a country code in the map ## 47 codes from the map weren't represented in your data myMap$matleave_13 ## [1] 2 2 5 2 2 5 NA NA 3 5 5 2 4 3 3 3 5 2 5 5 3 2 3 3 2 ## [26] 2 3 4 3 4 3 3 3 3 3 3 3 5 NA 3 5 5 3 5 2 3 2 2 2 3 ## [51] 5 2 5 2 NA 4 3 4 3 2 3 4 2 2 4 NA 2 2 2 5 2 5 2 2 4 ## [76] 4 2 4 3 4 2 2 5 3 2 3 2 5 NA 2 2 2 2 3 2 2 5 4 5 3 ## [101] 5 3 2 4 3 2 5 5 2 3 2 2 2 NA 3 2 2 3 4 2 3 2 2 3 2 ## [126] 2 1 5 NA 2 4 2 2 5 5 2 NA 2 2 2 3 2 2 2 3 5 1 5 5 5 ## [151] 2 3 3 3 2 5 3 2 3 2 3 NA 2 2 5 2 1 5 4 4 2 NA 2 3 3 ## [176] 3 NA NA NA 3 NA NA 2 2 NA NA 2 2 3 2 NA NA 2 NA 1 NA NA 2 NA NA ## [201] NA NA NA NA NA NA 2 2 2 3 NA NA 3 2 1 3 NA NA 2 NA 1 1 NA 1 NA ## [226] 3 NA NA 5 NA 2 NA 3 NA 1 5 2 NA NA NA 2 2 NA 29.1.2 Drawing Map mapCountryData() 函數用於將數據繪製在地圖上。其中, myMap 是已經連接過的世界地圖數據和自己的數據,包含了各國的地理空間信息和相關的數據資訊。 nameColumnToPlot 指定要顯示在地圖上的數據欄位為matleave_13,也就是 2013 年的產假長度。 catMethod 參數是決定視覺化時的數據分類是類別或連續,categorical表示將數據分成幾個等級來展示在地圖上。 mapCountryData(myMap , nameColumnToPlot="matleave_13" , catMethod = "categorical" ) 29.1.3 Drawing map by specific colors # self-defined colors colors <- c("#FF8000", "#A9D0F5", "#58ACFA", "#0080FF", "#084B8A") mapCountryData(myMap , nameColumnToPlot="matleave_13" , catMethod = "categorical" , colourPalette = colors , addLegend="FALSE" ) 29.1.4 Practice. Drawing map for every years 繪製自1995至2013年每年的地圖並觀察其上的變化。 繪製的時候請嘗試使用par()來把每年的地圖繪製在同一張圖上,怎麼做? 你能觀察出變化來嗎?可否透過顏色的調整來凸顯變化?你的策略是什麼? 29.2 Read Spatial Data from SEGIS 要繪製地理地圖會要先下載地圖檔,可以查詢「直轄市、縣市界線(TWD97經緯度)」和鄉鎮市區界線(TWD97經緯度) | 政府資料開放平臺 (data.gov.tw)。 接下來是取得要繪製在地圖上的資料。前面的rworldmap是已知地圖檔和資料檔中都有每個國家的ISO3代碼,所以可以用ISO3代碼來連結地圖檔和資料檔。如果是臺灣的資料,可能就要用縣市名稱來做連結。或者,某些圖資本身就有經緯度,甚至它並非區域圖,而是有經緯度的點位圖。這類的圖資檔案可以到社會經濟資料服務平台 (moi.gov.tw)查找並下載。 通常地理圖資檔有兩種格式:一種是geojson,一種是shapefile。 shapefile 是一種老舊的地理圖資檔案格式,通常由 shp, shx, dbf, prj 等檔案組成。其中,shp 檔案包含了地理空間範圍和形狀的點與邊(邊通常是由點依序所構成,不會特別把邊標出來),shx 檔案是其索引文件,dbf 檔案則儲存了相關的屬性資訊,例如幾何特徵的名稱或變數,prj 檔案則是儲存了投影信息。shapefile 格式的優點是廣泛的應用性和支援程式豐富,可以在許多地理信息系統(GIS)和軟件中使用,是許多組織和機構最常用的地理圖資格式之一。 geojson 則是一種基於 JSON 格式的地理圖資檔案格式,內容包含了地理空間範圍和屬性。geojson 的優點是格式簡單、容易理解和易於編輯,支援性也比較好。由於 geojson 使用的是文本格式,因此可以直接在許多文本編輯器中編輯和查看,也可以輕易地轉換成其他格式的地理圖資檔案。 這邊我們所要用的套件是sf,sf 是一個在 R 環境下進行地理圖資處理和分析的套件,他不僅支援多種檔案格式,包括 shapefile、GeoJSON、KML 等,並且可以直接將這些檔案轉換為 R 中的空間資料框架,方便進行進一步的處理和分析。更方便的特色是在於,它可以用tidyverse的風格來寫作,方便對地理圖資和其他數據進行整合和分析,甚至在使用View()的時候,把圖資當成一個變項。 library(sf) 29.2.1 The case: Population and Density of Taipei 這個資料下載自社會經濟資料服務平台 (moi.gov.tw)的111年9月行政區人口統計_鄉鎮市區_臺北市,實際上內部的資料包含368個鄉鎮的依性別分人口數、家戶數等。 資料變項包含每個區的家戶數(H_CNT)、總人口數(P_CNT)、男性人口數(M_CNT)、女性人口數(F_CNT)。等一下要計算每平方公里的家戶數或人口數時,你會疑惑為何沒有面積資料。 sf_tpe <- st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/", layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>% mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>% # mutate(across(where(is.double), ~if_else(is.na(.),as.double(0),.))) %>% # st_set_crs(3826) %>% st_transform(4326) %>% # filter(COUNTY == "臺北市") filter(str_detect(COUNTY, "臺北市")) sf_tpe %>% head() ## Simple feature collection with 6 features and 9 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 300874.7 ymin: 2766756 xmax: 309745.8 ymax: 2776127 ## CRS: NA ## TOWN_ID TOWN COUNTY_ID COUNTY H_CNT P_CNT M_CNT F_CNT INFO_TIME ## 1 63000010 松山區 63000 臺北市 78977 187552 87625 99927 111Y09M ## 2 63000020 信義區 63000 臺北市 87407 201951 95884 106067 111Y09M ## 3 63000030 大安區 63000 臺北市 117243 280332 130596 149736 111Y09M ## 4 63000040 中山區 63000 臺北市 98825 210156 97114 113042 111Y09M ## 5 63000050 中正區 63000 臺北市 64491 146628 69663 76965 111Y09M ## 6 63000060 大同區 63000 臺北市 51988 118065 57003 61062 111Y09M ## geometry ## 1 MULTIPOLYGON (((307703.1 27... ## 2 MULTIPOLYGON (((307788.7 27... ## 3 MULTIPOLYGON (((304591.5 27... ## 4 MULTIPOLYGON (((305699 2776... ## 5 MULTIPOLYGON (((302203.6 27... ## 6 MULTIPOLYGON (((302217.9 27... 試著畫畫看。你會發現它的座標系是一個我們看不懂的數字,而不是想像中的經緯度。 sf_tpe %>% ggplot() + geom_sf() 29.2.2 Projection 投影的概念 投影是指將地球表面的三維空間坐標轉換為二維平面坐標的過程,這是因為在實際應用中需要將地球表面的訊息表示在平面上,方便分析和可視化。然而,由於地球是一個球體,不同的投影方式會導致在不同位置和距離上的形狀、面積和方向出現差異,因此在使用地理空間數據進行分析和視覺化時需要注意投影的選擇和轉換。 除了投影之外,每個地理區域還有適合的參考橢球體和大地基準面。橢球體是指地球表面的形狀,大地基準面則是指地球表面的平均高程面。這些概念的選擇取決於具體的地理區域和應用場景,並且可能會對數據分析結果產生影響。基準點(Datum)則是用來定義地球表面上的某個點,從而將地球表面的形狀和大小轉換為平面坐標系中的數值。基準點分為區域性的(local)和全球的(global)。區域性的基準點通常是針對某個特定的地理區域進行定義,而全球的基準點則是針對整個地球進行定義。全球最常用的基準點是WGS84,它以地球質心為中心;而台灣常用的區域性基準點是TWD97,舊版則是用TWD67。基準點的選擇也可能會對數據分析結果產生影響。 投影法有對應的代號稱為 EPSG(歐洲石油探勘組織),他們制定了空間參考識別系統(SRID)。可以記兩個重要的: WGS84 = 4326 TWD97 = 3826 參考:https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet Google Earth採用WGS84坐標系統的地理坐標系統。(EPSG:4326) Google Maps採用以WGS84為基礎的投影坐標系統。(EPSG 3857) Open Street Map數據庫中的數據以WGS84坐標系統的十進制度為單位進行儲存。(EPSG:4326) Open Street Map瓦片和WMS服務採用以WGS84為基礎的投影坐標系統。(EPSG 3857) https://epsg.io/3825 是台灣的坐標系統(3826、3827等也是,你可以打開看看) 用得到投影的情境 研究區域,想轉換座標(changing projections):修改 EPSG code 或是改掉 proj4string 的內容 原始資料缺投影方法:加上 EPSG code 或是加上 proj4string 的內容 如果需要進行投影轉換,可以使用 R 中的相關函數和方法。例如, 使用 st_crs() 函數可以取得地理空間數據的投影系統; 使用 st_transform() 函數可以進行地理空間數據的投影變換; 使用 st_set_crs() 函數可以設定地理空間數據的投影系統等等。 就下載的這個資料來說,他並沒有設定他的投影座標。 st_crs(sf_tpe)$proj4string ## [1] NA st_crs(sf_tpe) ## Coordinate Reference System: NA 我們會希望在讀取資料的時候,設定他的投影座標。例如以下的例子是設定為TWD96(3826)然後轉換為全球座標WGS84(4326)。 sf_tpe <- st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/", layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>% mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>% st_set_crs(3826) %>% # st_transform(4326) %>% filter(str_detect(COUNTY, "臺北市")) st_crs(sf_tpe)$proj4string ## [1] "+proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs" st_crs(sf_tpe) ## Coordinate Reference System: ## User input: EPSG:3826 ## wkt: ## PROJCRS["TWD97 / TM2 zone 121", ## BASEGEOGCRS["TWD97", ## DATUM["Taiwan Datum 1997", ## ELLIPSOID["GRS 1980",6378137,298.257222101, ## LENGTHUNIT["metre",1]]], ## PRIMEM["Greenwich",0, ## ANGLEUNIT["degree",0.0174532925199433]], ## ID["EPSG",3824]], ## CONVERSION["Taiwan 2-degree TM zone 121", ## METHOD["Transverse Mercator", ## ID["EPSG",9807]], ## PARAMETER["Latitude of natural origin",0, ## ANGLEUNIT["degree",0.0174532925199433], ## ID["EPSG",8801]], ## PARAMETER["Longitude of natural origin",121, ## ANGLEUNIT["degree",0.0174532925199433], ## ID["EPSG",8802]], ## PARAMETER["Scale factor at natural origin",0.9999, ## SCALEUNIT["unity",1], ## ID["EPSG",8805]], ## PARAMETER["False easting",250000, ## LENGTHUNIT["metre",1], ## ID["EPSG",8806]], ## PARAMETER["False northing",0, ## LENGTHUNIT["metre",1], ## ID["EPSG",8807]]], ## CS[Cartesian,2], ## AXIS["easting (X)",east, ## ORDER[1], ## LENGTHUNIT["metre",1]], ## AXIS["northing (Y)",north, ## ORDER[2], ## LENGTHUNIT["metre",1]], ## USAGE[ ## SCOPE["Engineering survey, topographic mapping."], ## AREA["Taiwan, Republic of China - between 120°E and 122°E, onshore and offshore - Taiwan Island."], ## BBOX[20.41,119.99,26.72,122.06]], ## ID["EPSG",3826]] sf_tpe %>% ggplot() + geom_sf() sf_tpe %>% ggplot() + aes(fill = P_CNT) + geom_sf(color = NA) + scale_fill_gradient(low = "white", high = "purple") 面積資料可以用st_area()這個函式求得。st_area() 是 R 中一個與地理空間數據相關的函數,用於計算地理多邊形的面積。具體而言,st_area() 函數接受一個 Spatial* 或是 sf 的資料物件,可以計算其包含的每個多邊形的面積,並以相應的單位返回結果。其中 as.double(st_area(.))/1000000 的作用是將地理多邊形的面積從平方公尺轉換為平方公里。因為面積的單位是平方公尺,而人口密度的常用單位是人口數/平方公里,因此需要進行單位換算,將面積轉換為平方公里。 st_area() 函數的計算方式基於多邊形的投影,因此在使用該函數時需要注意地理空間數據的投影選擇和轉換。通常情況下,st_area() 函數可以自動識別多邊形的投影系統,並返回相應的面積值。如果需要在不同的投影系統間進行面積的轉換,則需要使用 st_transform() 函數進行投影變換。 需要注意的是,由於地球是一個球體,因此在計算面積時需要考慮到地球的曲率效應。st_area() 函數默認使用的是橢球面積計算公式(ellipsoidal area formula),可以更準確地計算地理多邊形的面積。如果需要更精確的面積計算結果,也可以使用球面面積計算公式(spherical area formula)或是進行局部的面積校正。 sf_tpe %>% mutate(p_density = P_CNT/(as.double(st_area(.))/1000000)) %>% ggplot() + aes(fill = p_density) + geom_sf(color = NA) + scale_fill_gradient(low = "white", high = "purple") 29.3 Town-level: Taipei income 有時候我們所希望繪製的資料並非來自SEGIS這類有圖資的平台(例如下面所用的台北各區每人平均所得),那我們就會需要先取得另一份圖資資料(例如下例的鄉鎮市區界圖資),再透過一些索引(Index)來結合這兩方的資料。而下面這個例子,還為了要將鄉鎮市區名稱打在各區的中央,結合了另一份資料,一共結合了三方的資料。 29.3.1 Reading income data taipei_income <- readxl::read_xlsx('data/台北各區每人所得.xlsx') taipei_income %>% head() ## # A tibble: 6 × 2 ## district income ## <chr> <dbl> ## 1 松山區 1012678 ## 2 信義區 909336 ## 3 大安區 1038921 ## 4 中山區 861415 ## 5 中正區 1022438 ## 6 大同區 814439 29.3.2 Read Taipei zip code 等一下我打算把每區的名稱打在各區上,但是我沒有各區的名稱應該打在哪裡的經緯度,恰好Zip Code這份資料裡面有台北市各區的經緯度中心,因此先把它讀進來合併用。 library(jsonlite) twzipcode_json <- fromJSON("data/twzipcode.json")[[1]] taipei_zipcode <- twzipcode_json %>% filter(city == "台北市") taipei_zipcode %>% head() ## zip_code district city lat lng ## 1 100 中正區 台北市 25.0324 121.520 ## 2 103 大同區 台北市 25.0634 121.513 ## 3 104 中山區 台北市 25.0697 121.538 ## 4 105 松山區 台北市 25.0600 121.558 ## 5 106 大安區 台北市 25.0268 121.543 ## 6 108 萬華區 台北市 25.0286 121.498 # install.packages("rmapshaper") st_read("data/shapefiles/TOWN_MOI_1100415.shp") %>% filter(COUNTYNAME == "臺北市") %>% # st_transform(3825) %>% #3857 # rmapshaper::ms_simplify(keep=0.05) %>% left_join(taipei_income, by = c("TOWNNAME" = "district")) %>% left_join(taipei_zipcode, by= c("TOWNNAME" = "district")) %>% ggplot() + aes(fill = income) + geom_sf() + scale_fill_gradient2(low = "#FF8888", high = "#0000AA", midpoint = median(taipei_income$income)) + geom_text(aes(x = lng, y = lat, label = TOWNNAME), family = "Heiti TC Light", color = "black", size = 2.5) ## Reading layer `TOWN_MOI_1100415' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/TOWN_MOI_1100415.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 368 features and 7 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 29.4 Voting map - County level 本練習將以2016年總統選舉為例,比較朱立倫、宋楚瑜、蔡英文在不同縣市的得票率,並繪製為地圖。該地圖比較有趣的是,因為台灣的地圖實際上是由很多點連成的,在這麼大的規模如果把全部的點全部繪製上去,會繪製非常久,而讀者也不盡然能夠看清楚這個差別,所以可以降低點的數量。 29.4.1 Loading county-level president voting rate president_vote <- readxl::read_xlsx('data/president.xlsx') %>% mutate(total = chu + tsai + song) %>% mutate(chu_ratio = chu / total, tsai_ratio = tsai / total, song_ratio = song / total, tsai_chu_ratio = tsai / chu) 29.4.2 sf to load county level shp https://fidanalytics.co.uk/blog/simplifying-polygons-r county_sf <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") ## Reading layer `COUNTY_MOI_1090820' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 22 features and 4 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 # plot(county_sf) # Taking very long time 29.4.3 Simplfying map polygon county_ms_simp <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>% # rmapshaper::ms_simplify(county_sf, keep=0.001) st_simplify(dTolerance = 100) ## Reading layer `COUNTY_MOI_1090820' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 22 features and 4 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 plot(county_ms_simp) # install.packages("rmapshaper") plot_chu <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>% # st_transform(3825) %>% #3857 st_simplify(dTolerance = 10) %>% # rmapshaper::ms_simplify(keep=0.01) %>% right_join(president_vote, by=c("COUNTYNAME"="county")) ## Reading layer `COUNTY_MOI_1090820' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 22 features and 4 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 plot_chu %>% ggplot(aes(fill = chu_ratio)) + geom_sf(color="white", size=0.2) + scale_fill_gradient(low = "#FFFFFF", high = "#0000FF") 29.4.4 Practice. Drawing Taiwan county-scale map from SEGIS data 這個練習希望你從SEGIS下載一個縣市層級的資料,並測試以下函式的結果: 運用st_transform()和st_set_crs()等函式測試用3826或4326座標系有何不同? 在用st_area()計算面積時會不會有何不同? 在視覺化的時候可否看出來有何不同?請寫程式測試看看。 st_simplify()這個函式可以降低點的數量,但運用st_simplify(dTolerance = 100),dTolerance的設定是如何影響點的數量?100所指的是什麼?公尺嗎? 用st_bbox()可以得知上下界為何,請試用這個函式看看? 如何運用st_crop()切出台灣本島(不包含澎湖、金門、馬祖)得地圖? 29.5 Mapping data with grid library(sf) 29.5.1 Loading Taiwan map TW.island <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>% st_transform(3826) %>% mutate(id = row_number()) ## Reading layer `COUNTY_MOI_1090820' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 22 features and 4 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 29.5.2 Building grid # Defining grid size grid.extent <- matrix(c(-50000, 2920000, # (Xmin, Ymax) 610000, 2920000, # (Xmax, Ymax) 610000, 2420000, # (Xmax, Ymin) -50000, 2420000, # (Xmin, Ymin) -50000, 2920000), # (Xmin, Ymax) byrow = TRUE, ncol = 2) %>% list() %>% # convert to list for st_polygon() st_polygon() %>% # generate polygon st_sfc(crs = 3826) # convert format and crs # plot(grid.extent) # Generating grid Grid.sys <- st_make_grid(grid.extent, n = c(132, 100), # Resolution of grids crs = 3826, # crs: TWD97 121 what = 'polygons') %>% # output format: polygon st_sf('geometry' = ., data.frame('ID' = 1:length(.))) # convert to sf with id # st_transform(3826) # assigning crs again ? plot(Grid.sys) Grid.TW <- Grid.sys[subset(TW.island),] plot(Grid.TW) 29.5.3 loading data president_vote <- readxl::read_xlsx('data/president.xlsx') %>% mutate(total = chu + tsai + song) %>% mutate(chu_ratio = chu / total, tsai_ratio = tsai / total, song_ratio = song / total, tsai_chu_ratio = tsai / chu) 29.5.4 Merging data tw_info <- TW.island %>% st_set_geometry(NULL) %>% left_join(president_vote, by=c("COUNTYNAME"="county")) # TW_info <- sf::st_intersects(Grid.TW, TW.island) # creat a data.frame of IDs in IBA for 1km grid grid_id <- sapply(st_intersects(Grid.TW, TW.island), function(z) if (length(z)==0) NA_integer_ else z[1]) Grid.TW <- Grid.TW %>% mutate(grid_id = grid_id) %>% left_join(tw_info, by=c("grid_id"="id")) Grid.TW %>% ggplot(aes(fill = tsai_ratio)) + geom_sf(lwd = 0.1, color="black") + scale_fill_continuous(high="#2EFF71", low="blue") + theme_void() "],["network-vis.html", "Chapter 30 NETWORK VIS 30.1 Generating networks 30.2 Retrieve Top3 Components 30.3 Motif visualization and analysis", " Chapter 30 NETWORK VIS 網絡視覺化其實已經有非常好的簡介和指南。但在此補充一些常用的網絡視覺化參數 library(igraph) 30.1 Generating networks 30.1.1 Random network g <- barabasi.game(500, directed = T) message("\\n(V, E, Reciprocity, nComponent)\\n", length(V(g)), "\\t", length(E(g)), "\\t", sprintf("%.3f\\t", reciprocity(g)), count_components(g, mode = "weak") ) l <- layout.fruchterman.reingold(g) # l <- layout_with_kk(g) # l <- layout_in_circle(g) par(mar = c(0,0,0,0) + 0.1) plot(g, layout = l, vertex.color = rgb(1, 1, 0, 0.2), # vertex.color = factor(V(g)$blocked), vertex.size = 3, # vertex.size = sqrt(V(g)$degree)*3, vertex.frame.color= rgb(0, 0, 0, 0.5), # vertex.label = V(g)$display, # vertex.label = str_sub(V(g)$name, 1, 10), vertex.label.cex = 0.6, vertex.label.color = rgb(0, 0, 0, 0.7), vertex.label.family = 'Heiti TC Light', edge.curved = 0.1, edge.arrow.size = 0.1, # edge.width = sqrt(E(g)$weight), # edge.color = E(g)$year, # edge.color = E(g)$weight, edge.color = "#4169E1", # edge.color = E(g)$color, # edge.label = E(g)$weight, # edge.label = E(g)$year, edge.label.cex = 0.4, edge.label.color = rgb(1, 0, 0) ) 30.1.2 Random network rg <- sample_gnm(length(V(g)), length(E(g)), directed=T) message("\\n(V, E, Reciprocity, nComponent)\\n", length(V(rg)), "\\t", length(E(rg)), "\\t", sprintf("%.3f\\t", reciprocity(rg)), count_components(rg, mode = "weak") ) l <- layout.fruchterman.reingold(rg) par(mar = c(0,0,0,0) + 0.1) plot(rg, layout = l, vertex.color = rgb(1, 1, 0, 0.2), vertex.size = 3, vertex.frame.color= rgb(0, 0, 0, 0.5), vertex.label.cex = 0.6, vertex.label.color = rgb(0, 0, 0, 0.7), vertex.label.family = 'Heiti TC Light', edge.curved = 0.1, edge.arrow.size = 0.1, edge.color = "#4169E1", edge.label.cex = 0.4, edge.label.color = rgb(1, 0, 0) ) 30.2 Retrieve Top3 Components components <- igraph::clusters(rg, mode="weak") biggest_cluster_id <- which.max(components$csize) # which.max(components$csize) # components$csize # biggest_cluster_id top3_break <- sort(unique(components$csize), decreasing = T)[3] biggest_cluster_id <- which(components$csize >= top3_break) vert_ids <- V(rg)[components$membership %in% biggest_cluster_id] rg <- igraph::induced_subgraph(rg, vert_ids) message("\\n(V, E, Reciprocity, nComponent)\\n", length(V(rg)), "\\t", length(E(rg)), "\\t", sprintf("%.3f", reciprocity(rg)) ) 30.2.1 Visualize again l <- layout.fruchterman.reingold(rg) par(mar = c(0,0,0,0) + 0.1) plot(rg, layout = l, vertex.color = rgb(1, 1, 0, 0.2), vertex.size = 3, vertex.frame.color= rgb(0, 0, 0, 0.5), vertex.label.cex = 0.6, vertex.label.color = rgb(0, 0, 0, 0.7), vertex.label.family = 'Heiti TC Light', edge.curved = 0.1, edge.arrow.size = 0.1, edge.color = "#4169E1", edge.label.cex = 0.4, edge.label.color = rgb(1, 0, 0) ) 30.3 Motif visualization and analysis 30.3.1 Motif type library(igraph) par(mfrow=c(4,4), mai= rep(0.2, 4)) for(i in 0:15){ g1 <- graph_from_isomorphism_class(3, i) plot(g1, vertex.color = "gold", vertex.size = 20, # vertex.size = (V(g)$nTweets)^(1/3)+1, vertex.frame.color= "black", vertex.label = NA, edge.color = "black", edge.arrow.size = 0.5) title(i, line=-3, adj=0.4 ,col.main="royalblue") } 30.3.2 Motif analysis 30.3.2.1 Generate network res <- motifs(g, 3) res ## [1] NA NA 4085 NA 419 0 0 0 0 0 0 0 0 0 0 ## [16] 0 writeLines(as.character(res), sep = "\\t") ## NA NA 4085 NA 419 0 0 0 0 0 0 0 0 0 0 0 30.3.3 Generate motives barabas_motif <- function(e){ g <- barabasi.game(e, directed = T) vec <- motifs(g, 3) %>% replace_na(0) for(i in 1:99){ g <- barabasi.game(e, directed = T) tmp <- motifs(g, 3) %>% replace_na(0) vec <- vec + tmp } vec <- vec / 100 writeLines(as.character(vec), sep = "\\t") } random_net_motif <- function(v, e){ g <- sample_gnm(v, e, directed=T) vec <- motifs(g, 3) %>% replace_na(0) for(i in 1:99){ g <- sample_gnm(v, e, directed=T) tmp <- motifs(g, 3) %>% replace_na(0) vec <- vec + tmp } vec <- vec / 100 writeLines(as.character(vec), sep = "\\t") } random_net_motif(length(V(g)), length(E(g))) ## 0 0 245.78 0 490.12 0.87 247.04 0.77 0 0.78 0 0.36 0.01 0 0 0 barabas_motif(length(E(g))) ## 0 0 2517.01 0 459.54 0 0 0 0 0 0 0 0 0 0 0 "],["interactivity.html", "Chapter 31 Interactivity 31.1 ggplotly 31.2 產製圖表動畫", " Chapter 31 Interactivity 31.1 ggplotly Scatter plots with ggplot2 (plotly.com) 31.1.1 LINE CHART Line plots with R (plotly.com) NW <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(Category, year, Net_Worth) %>% group_by(Category) %>% arrange(year) %>% ungroup() 如果希望滑鼠在移到折線上時就會有浮出的資訊(tips)顯示該資料點的屬性特徵,可以採用plotly()這個套件。這個套件原本就是做線上互動圖表的,但他開發了R client讓R的使用者可以很輕易地把ggplot2的結果轉為互動圖表。但這所謂的互動也僅限於滑鼠移過去所浮出的資訊罷了,不過已經能夠達到吸引部分讀者目光、提供訊息的效果。 而plotly的設計非常簡單,就是把ggplot的結果指給一個變數後,然後用ggplotly(NW.plot)將其轉為plotly即可。但要注意的是,並不是每一個圖都可以順利轉換。例如本節最後一個例子Treemap便無法成功轉換。 設定:原本plotly會帶一個操控列,可以在ggplotly()指令後加入config()便可將其隱藏。 NW.plot <- NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + th library(plotly) ggplotly(NW.plot) %>% config(displayModeBar = FALSE) 可以在aes()設定要帶入圖的變數時,新增一個text變數,手動設定要呈現的動態呈現方塊。但要注意的是,要多加入一個group=1才能夠作用(WHY?)。但前例浮出視窗的原始內容所顯示的是原本的變數名稱和值,往往不易觀察。比較好的方式是在下ggplot() + aes()指令時,在aes()中指定text來作為後續浮出視窗內容。指定方法如下。要注意的是,該浮出視窗的語法是HTML,所以如果要改寫浮出視窗內容,要用paste0()將變數和HTML的標籤給銜接起來。以下例子中的<b>代表粗體的意思,<br>則是換行符號。 NW.plot <- NW %>% ggplot() + aes(year, Net_Worth, color=Category, text = paste0("<b>年(X): </b>", year, "<br>", "<b>淨資產(Y): </b>", Net_Worth,"<br>", "<b>年齡組: </b>", Category), group=1) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + th ggplotly(NW.plot, tooltip = "text") %>% config(displayModeBar = FALSE) 其他例子中使用ggplotly()都是直接照前面的方法套用即可。唯獨在Treemap中無法用這樣的方法來做互動的視覺化。想想這也正常,畢竟Treemap是用非ggplot的第三方套件(library(treemapify))。 除此之外,可以把R Markdown中Code Cell的的設定加入include=FALSE,這樣可以讓RMD在編製為HTML檔時,不要顯示程式碼,而直接顯示互動的視覺化介面。 31.1.2 SCATTER bw <- read_csv("data/unicef-changing-childhood-data.csv") %>% select(country = WP5, age = WP22140, bw = WP22092) %>% mutate(country = ordered(country, levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17, 29, 31, 33, 35, 36, 60, 61, 77, 79, 81, 87, 165), labels=c("USA", "Morocco", "Lebanon", "Indonesia","Bangladesh", "UK", "France", "Germany", "Spain", "Japan", "India", "Brazil", "Nigeria", "Kenya", "Ethiopia", "Mali", "Ukraine", "Cameroon", "Zimbabwe","Argentina", "Peru"))) %>% count(country, age, bw) %>% group_by(country, age) %>% mutate(perc = n/sum(n)) %>% ungroup() %>% filter(bw == 1) %>% select(country, age, perc) %>% spread(age, perc) %>% rename(`15-24y` = `1`, `40+y` = `2`) bw.p <- bw %>% ggplot() + aes(`40+y`, `15-24y`, label = country) + geom_point(color = "skyblue", size = 2) + xlim(0.2, 0.85) + ylim(0.2, 0.85) + geom_text(hjust = -0.1, vjust = -0.5) + geom_abline(intercept = 0, slop = 1, color="lightgrey", alpha=0.5, linetype="dashed") + th + theme(aspect.ratio=1) bw.p %>% ggplotly() 31.1.3 Barplot Bar charts with R (plotly.com) county <- read_csv("data/tw_population_opendata110N010.csv") %>% slice(-1, -(370:375)) %>% type_convert() %>% mutate(county = str_sub(site_id, 1, 3)) %>% group_by(county) %>% summarize( area = sum(area), people_total = sum(people_total) ) %>% ungroup() population.p <- county %>% mutate(county = reorder(county, people_total)) %>% ggplot() + aes(county, people_total) %>% geom_col(fill="skyblue") + coord_flip() + th population.p %>% ggplotly() 31.1.4 Boxplot Box plots with ggplot2 (plotly.com) aqi.toplot <- read_rds("https://github.com/p4css/R4CSS/raw/master/data/AQI_Chaozhou.rds") %>% arrange(日期)%>% filter(測項=="PM2.5") %>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% filter(month %in% c(11, 12, 1, 2, 3)) aqi.plot <- aqi.toplot %>% mutate(year = as.character(year)) %>% ggplot() + aes(x=year, y=PM25) + geom_boxplot(fill="skyblue", alpha=0.2) + ylim(0, 200) + coord_flip() + theme_minimal() aqi.plot %>% ggplotly 31.1.5 Treemap (Global Carbon) 其他例子中使用ggplotly()都是直接照前面的方法套用即可。唯獨在Treemap中無法用這樣的方法來做互動的視覺化。想想這也正常,畢竟Treemap是用非ggplot的第三方套件(library(treemapify))。 totreemap <- read_csv("data/GCB2021v34_MtCO2_flat.csv") %>% drop_na(`Total`) %>% filter(!Country %in% c("Global", "International Transport")) %>% filter(Year==2020) %>% arrange(desc(`Total`)) %>% mutate(perc = Total/sum(Total)) %>% slice(1:20) library(treemapify) carbon.p <- totreemap %>% ggplot() + aes(area = perc, fill=`Per Capita`, label=Country) + geom_treemap() + geom_treemap_text(color="white", place="centre", grow=TRUE ) # carbon.p %>% ggplotly 31.2 產製圖表動畫 https://gist.github.com/rafapereirabr/0d68f7ccfc3af1680c4c8353cf9ab345 R也有套工具可以產製圖表動畫,概念上就是沿著一條資料維度,把多張圖給疊在一起變成一個gif動畫。本例子即是把產假之薪的範例沿著時間軸做動畫。每個時間點都是當年各國產假支薪給付程度的地圖,但由於有19年的資料,所以可以把年代當成動畫的時間軸。 以下是清理資料的步驟,會彙整出國名、國家代碼(ISO3)、年、和給付等級四個變項。預期利用國名、國家代碼和給付等級就可以畫出每年的圖。然後將年作為動畫的時間軸,便可產生地圖動畫。 pml <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>% select(country, iso3, contains("matleave"), -contains("wrr")) %>% gather("year", "degree", 3:21) %>% replace_na(list(degree=0)) %>% mutate(year2=as.POSIXct(strptime(year, "matleave_%y"))) %>% mutate(year3 = strftime(year2, "%Y")) %>% select(country, ISO3=iso3, year=year3, degree) 31.2.1 地圖下載與轉換投影方法 此為下載地圖並處理地圖成為可以用geom_polygom()繪圖的多邊形資料點。 library(rworldmap) wmap <- getMap(resolution="low") wmap <- spTransform(wmap, CRS("+proj=robin")) # reproject wmap <- fortify(wmap) wmap %>% filter(!duplicated(id)) %>% head(10) ## long lat order hole piece id ## 1 -6558139.1 1331765.9 1 FALSE 1 Aruba ## 2 6607120.5 3981587.8 1 FALSE 1 Afghanistan ## 3 1357824.3 -630231.6 1 FALSE 1 Angola ## 4 -5863722.7 1948851.8 1 FALSE 1 Anguilla ## 5 1723246.7 4546403.9 1 FALSE 1 Albania ## 6 1506389.0 6371182.0 1 FALSE 1 Aland ## 7 146562.7 4541753.0 1 FALSE 1 Andorra ## 8 5174600.6 2734691.9 1 FALSE 1 United Arab Emirates ## 9 -6057672.4 -2363055.4 1 FALSE 1 Argentina ## 10 3911094.7 4398155.0 1 FALSE 1 Armenia ## group ## 1 Aruba.1 ## 2 Afghanistan.1 ## 3 Angola.1 ## 4 Anguilla.1 ## 5 Albania.1 ## 6 Aland.1 ## 7 Andorra.1 ## 8 United Arab Emirates.1 ## 9 Argentina.1 ## 10 Armenia.1 pml_map <- wmap %>% left_join(pml, by=c("id"="country")) %>% filter(!is.na(ISO3)) %>% mutate(year = as.integer(year)) # devtools::install_github("thomasp85/transformr") pml_map %>% select(id) %>% filter(!duplicated(.)) %>% head(10) ## id ## 1 Afghanistan ## 2 Angola ## 3 Albania ## 4 Andorra ## 5 United Arab Emirates ## 6 Argentina ## 7 Armenia ## 8 Antigua and Barbuda ## 9 Australia ## 10 Austria 31.2.2 靜態繪圖測試 pml_map %>% filter(year==1995) %>% ggplot() + aes(x = long, y = lat, group=group, fill=factor(degree)) + geom_polygon(color="grey") + theme_void() + scale_fill_manual(values=c("1"="red", "2"="LightCyan", "3"="lightskyblue", "4"="DodgerBlue", "5"="MediumBlue")) + coord_cartesian(xlim = c(-11807982, 14807978)) 在採用gganimate繪圖時,僅需要多加一個動畫繪圖函式+ transition_time(year)即可,其他繪圖部分並無修改。最後才用animate()函式把這整個繪圖指令轉製為動畫,包含指定fps(frame per second)和長寬等參數。 library(gganimate) pml.ani <- pml_map %>% ggplot() + aes(x = long, y = lat, group=group, fill=factor(degree)) + geom_polygon(color="grey") + theme_void() + scale_fill_manual(values=c("1"="red", "2"="LightCyan", "3"="lightskyblue", "4"="DodgerBlue", "5"="MediumBlue")) + coord_cartesian(xlim = c(-11807982, 14807978)) + transition_time(year) # + # ease_aes("linear") + # enter_fade() + # exit_fade() animate(pml.ani, fps = 10, end_pause = 30, width = 750, height = 450, renderer = gifski_renderer()) anim_save("jour5014/pml2.gif", animation = last_animation()) knitr::include_graphics("jour5014/pml2.gif") "],["wgoitg.html", "Chapter 32 WGOITG of NyTimes", " Chapter 32 WGOITG of NyTimes 紐約時報提供的what’s going on in the graph 系列教學旨在幫助讀者更好地理解和解讀圖表,特別是在時事和政治等敏感領域中的圖表。這些教學以實際的新聞圖表為例,介紹了如何分析和評估圖表的質量、有效性和可靠性,並提供了一些技巧和策略,幫助讀者從圖表中獲取準確和全面的資訊。 具體來說,what’s going on in the graph系列教學的目的包括以下幾點: 提高讀者對圖表的識讀能力和分析能力,讓讀者能夠更加自信和準確地理解和評估圖表。 幫助讀者識別和處理常見的資訊偏差和誤導,如選擇性展示數據、扭曲比例、誤導標籤等。 強調圖表應該為讀者服務,而不是為了強調某個立場或觀點而有意歪曲事實。 提供了一些有效的技巧和策略,如注意圖表的標題、軸標籤和單位、比較數據的趨勢和範圍、理解圖表的背景和上下文等。 "],["inequality-net-worth-by-age-group.html", "Chapter 33 Inequality: Net Worth by Age Group", " Chapter 33 Inequality: Net Worth by Age Group LEARNING NOTES 座標軸從數值到增加值 這個教學案例來自紐約時報的「What’s going on in this gragh」系列資料視覺化教學之Teach About Inequality With These 28 New York Times Graphs - The New York Times (nytimes.com) 。該圖表呈現在不同年代、不同年齡層的人所擁有的淨資產(包含土地、存款、投資等減去債務)。該圖表的結果指出,在不同年代的老年人是越來越有錢,但年輕人卻越來越窮(該曲線為減去1989年 淨資產(Net worth)是一個財務術語,指的是一個人或機構的總資產減去總負債後剩餘的價值。換言之,Net worth是一個人或機構在財務上的價值或實力。如果一個人或機構的總資產超過了總負債,那麼其net worth為正值,反之則為負值。在個人財務上,Net worth通常用來評估一個人的財務健康狀況。一個人的Net worth越高,通常代表其擁有更多的財富和投資,並能夠更好地應對突發事件和生活變數。因此,許多投資者和財務顧問都會建議人們注重提高自己的net worth。 Sorted by arrange() function. p1 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(year, Category, Net_Worth) %>% group_by(Category) %>% arrange(year) %>% ungroup() p1 %>% filter(year <= 1992) %>% knitr::kable() year Category Net_Worth 1989 Less than 35 16.17019 1989 35-44 112.47530 1989 45-54 195.11630 1989 55-64 195.25554 1989 65-74 154.34277 1989 75 or older 144.29855 1992 Less than 35 16.60780 1992 35-44 79.91050 1992 45-54 139.97745 1992 55-64 203.44104 1992 65-74 176.44667 1992 75 or older 155.35173 library(gghighlight) p1 %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line(linetype="dotted") + geom_point() + gghighlight(Category %in% c("65-74", "35-44")) + theme_minimal() + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) p2 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(year, Category, NW = Net_Worth) %>% group_by(Category) %>% arrange(year) %>% mutate(increase = (NW-first(NW))/first(NW)) %>% ungroup() p2 %>% filter(year <= 1992) %>% knitr::kable() year Category NW increase 1989 Less than 35 16.17019 0.0000000 1989 35-44 112.47530 0.0000000 1989 45-54 195.11630 0.0000000 1989 55-64 195.25554 0.0000000 1989 65-74 154.34277 0.0000000 1989 75 or older 144.29855 0.0000000 1992 Less than 35 16.60780 0.0270627 1992 35-44 79.91050 -0.2895285 1992 45-54 139.97745 -0.2825948 1992 55-64 203.44104 0.0419220 1992 65-74 176.44667 0.1432131 1992 75 or older 155.35173 0.0765994 p2 %>% ggplot() + aes(year, increase, color = Category) + geom_line(linetype="dotted") + geom_point() + gghighlight(Category %in% c("65-74", "35-44")) + theme_minimal() + scale_y_continuous(labels=scales::parse_format()) + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) "],["optimism-survey-by-countries.html", "Chapter 34 Optimism Survey by Countries", " Chapter 34 Optimism Survey by Countries 這個練習為紐約時報的一則報導「Where Are Young People Most Optimistic? In Poorer Nations. - The New York Times (nytimes.com)」。該報導乃根據一項涵蓋 21 個國家的大型調查,這項調查比較了不同國家和年齡層(年輕人對成年人)對於下一代的生活是否會比現在更好的看法。該調查還比較了不同國家(富裕與貧窮)和年齡層(年輕人對成年人)對於當今兒童在基本方面的狀況,以及對於社會和環境問題的看法。此外,調查還比較了不同國家和年齡層對於現代科技對年輕人生活的影響看法,以及對於焦慮和壓力等方面的看法。 聯合國兒童基金會與 Gallup 共同進行了這項調查,該調查共有 21,000 名受訪者,分為兩個年齡組別——15 至 24 歲和 40 歲以上,並包括來自世界各地的代表性樣本。年輕組表示,當今兒童在教育、醫療保健和身體安全等基本方面都比他們的父母更好。在中位數國家中,有 57% 的年輕人表示,隨著每一代的到來,世界正在變得越來越美好,而這一比例在老年人中僅有 39%。然而,在富裕國家,56% 的年輕人和 64% 的老年人表示,當今兒童在經濟方面將比他們的父母更加困難——這種觀點與近年來許多人的經濟現實相符。 視覺化的重點是等比例之座標軸的運用 plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>% select(country = WP5, age = WP22140, bw = WP22092) %>% mutate(country = ordered(country, levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17, 29, 31, 33, 35, 36, 60, 61, 77, 79, 81, 87, 165), labels=c("USA", "Morocco", "Lebanon", "Indonesia", "Bangladesh", "UK", "France", "Germany", "Spain", "Japan", "India", "Brazil", "Nigeria", "Kenya", "Ethiopia", "Mali", "Ukraine", "Cameroon", "Zimbabwe", "Argentina", "Peru"))) %>% count(country, age, bw) %>% group_by(country, age) %>% mutate(perc = n/sum(n)) %>% ungroup() %>% filter(bw == 1) %>% select(country, age, perc) %>% spread(age, perc) %>% rename(`15-24y` = `1`, `40+y` = `2`) plot.opt %>% head(10) %>% knitr::kable() country 15-24y 40+y USA 0.6679842 0.4611465 Morocco 0.4365079 0.4735812 Lebanon 0.5467197 0.4435798 Indonesia 0.7920605 0.8027344 Bangladesh 0.4624506 0.4319527 UK 0.5040000 0.4140000 France 0.3900000 0.2640000 Germany 0.5900000 0.3860000 Spain 0.5160000 0.3340000 Japan 0.6367265 0.2586873 plot.opt %>% ggplot() + aes(`40+y`, `15-24y`, label = country) + geom_point(color = "skyblue", size = 2) + xlim(0, 1) + ylim(0,1) + geom_text(hjust = -0.1, vjust = -0.5) + geom_abline(intercept = 0, slop = 1, color="lightgrey", alpha=0.5, linetype="dashed") + theme_minimal() + theme(aspect.ratio=1) "],["taiwan.html", "Chapter 35 Case Studies (Taiwan) 35.1 TW AQI Visual Studies", " Chapter 35 Case Studies (Taiwan) 35.1 TW AQI Visual Studies library(tidyverse) ## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── ## ✔ dplyr 1.1.4 ✔ readr 2.1.5 ## ✔ forcats 1.0.0 ✔ stringr 1.5.1 ## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1 ## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1 ## ✔ purrr 1.0.2 ## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── ## ✖ dplyr::filter() masks stats::filter() ## ✖ dplyr::lag() masks stats::lag() ## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors library(readxl) # options(stringsAsFactors = F) 35.1.1 eda-load-data-from-github # aqi_data <- read_rds("https://github.com/p4css/R4CSS/raw/master/data/AQI_Chaozhou.rds") aqi_data <- read_rds("data/AQI_Chaozhou.rds") 35.1.2 Trending: Central tendency toplot <- aqi_data %>% arrange(日期)%>% filter(測項=="PM2.5") %>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% group_by(日期) %>% summarize(avg = mean(PM25)) %>% ungroup() %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% group_by(year, month) %>% summarize(avg = mean(avg)) %>% ungroup() ## Warning: There was 1 warning in `mutate()`. ## ℹ In argument: `PM25 = as.numeric(PM25)`. ## Caused by warning: ## ! NAs introduced by coercion ## `summarise()` has grouped output by 'year'. You can override using the ## `.groups` argument. Counting data by month and plotting to ensure the degree of data loss. aqi_data %>% filter(測項=="PM2.5") %>% arrange(日期)%>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% group_by(日期) %>% summarize(avg = mean(PM25)) %>% ungroup() %>% arrange(日期) %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% count(year, month) %>% mutate(rn = row_number()) %>% ggplot() + aes(rn, n) + geom_line() + theme_minimal() ## Warning: There was 1 warning in `mutate()`. ## ℹ In argument: `PM25 = as.numeric(PM25)`. ## Caused by warning: ## ! NAs introduced by coercion 科普小學堂-空氣中的懸浮粒子 台灣PM2.5三大面向:空汙現況多嚴重?要怪中國還是怪自己? - 第 1 頁 - The News Lens 關鍵評論網 library(gghighlight) toplot %>% mutate(month = as.character(month)) %>% group_by(month) %>% arrange(year) %>% # mutate(diff = avg -first(avg), # month = as.character(month)) %>% # ungroup() %>% ggplot() + aes(year, avg, color = month) + geom_line() + # geom_point() + gghighlight(month %in% c("11", "12", "1", "2", "3")) + theme_minimal() ## Warning: Tried to calculate with group_by(), but the calculation failed. ## Falling back to ungrouped filter operation... ## label_key: month 35.1.3 Trending: Extreme value toplot2 <- aqi_data %>% arrange(日期)%>% filter(測項=="PM2.5") %>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% group_by(日期) %>% summarize(avg = sum(PM25)/24) %>% ungroup() %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% group_by(year, month) %>% summarize(purple = sum(avg>150), red = sum(avg>54), orange = sum(avg>35)) %>% ungroup() ## Warning: There was 1 warning in `mutate()`. ## ℹ In argument: `PM25 = as.numeric(PM25)`. ## Caused by warning: ## ! NAs introduced by coercion ## `summarise()` has grouped output by 'year'. You can override using the ## `.groups` argument. toplot2 %>% mutate(month = as.character(month)) %>% group_by(month) %>% arrange(year) %>% ggplot() + aes(year, orange, color = month) + geom_line() + # geom_point() + gghighlight(month %in% c("11", "12", "1", "2", "3")) + ylab("Days (PM25 > 35) in one month") + theme_minimal() ## Warning: Tried to calculate with group_by(), but the calculation failed. ## Falling back to ungrouped filter operation... ## label_key: month toplot3 <- aqi_data %>% arrange(日期)%>% filter(測項=="PM2.5") %>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% filter(month %in% c(11, 12, 1, 2, 3)) ## Warning: There was 1 warning in `mutate()`. ## ℹ In argument: `PM25 = as.numeric(PM25)`. ## Caused by warning: ## ! NAs introduced by coercion toplot3 %>% mutate(year = as.character(year)) %>% ggplot() + aes(y=year, x=PM25) + geom_boxplot(fill="skyblue", alpha=0.2) + xlim(0, 200) + theme_minimal() "],["appendix.html", "Chapter 36 Appendix 36.1 Dataset", " Chapter 36 Appendix 36.1 Dataset 111B歲出政事別預算表.xls - 111B歲出政事別預算總表.xls 臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv opendata107Y020.csv opendata110Y060.csv tptheft.csv tw_income_107.csv tw_population_opendata110N010.csv tw_salary109.xlsx villmast_excel.xls WORLD-MACHE_Gender_6.8.15.xls "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]]
+[["index.html", "R for Data Journalism About", " R for Data Journalism HSIEH, JI-LUNG 2024-03-31 About 這本書是寫給臺大新聞所「新聞資料分析與視覺化」課程使用。該課程並重三個面向的訓練:程式語言、視覺化、資料新聞。學生必須先能夠熟練地使用R語言來操作、讀取、清理、視覺化資料;然後以產製新聞為課程目標,了解資料要如何清理,以及選擇適合的視覺化的方法來強化新聞敘事,並避免視覺化方式引起讀者對新聞的理解謬誤。準此,本書分為幾個部分,包含PART I介紹程式語言基礎;PART II則以國際或國內新聞為個案,來介紹資料獲取(爬蟲)、清理、合併、篩選、轉換;PART III則著重如何用資料視覺化來強化敘事。 本書所沿用的資料分析與視覺化案例均為國內、國外的新聞案例如各國產假支薪等級、居住正義、空氣污染、人口議題、COVID-19、資源區域分佈不均、選舉與公投、運輸交通等相關議題的新聞。並大量採用紐約時報挑選作為數據理解與視覺化推廣的「What’s going on in this graph?」系列新聞,包含美國不同年代各年齡層的淨資產來做視覺化案例。在視覺化教材的設計上,本書大量參考紐時「What’s going on in this graph?」的分類與(Wilke 2019)所著「Fundamentals of Data Visualization」一書的內容安排,強調利用資料視覺化方法來呈現新聞數據中的數量、分佈、比例、趨勢等,並均換用國內或紐時的相關資料新聞案例做範例,以利中文讀者的理解。 學習路徑 References "],["introduction.html", "Chapter 1 Introduction 1.1 Preloaded tool kits 1.2 Dataset used in the book 1.3 Cases in the book", " Chapter 1 Introduction 本書從基本的 base R 語法開始學習,因為 R 語言最初是為統計學研究而開發的。因此,許多統計套件和基礎操作都是使用 base R 語法編寫的,這些知識對於瞭解 R 的核心功能和基本操作是非常重要的,並能夠建立起對於數據分析和統計建模的基礎知識。不過,現在 tidyverse 風格的編寫方式越來越流行,這種方式使得程式碼撰寫效率更高且可讀性更強,對於數據科學家而言是非常有用的。因此,本書會接續使用 tidyverse 中的主要函式庫和函數,例如 dplyr、ggplot2 和 tidyr,以便讀者能夠掌握這些工具,並能夠有效地應用於實際數據分析項目中。 1.1 Preloaded tool kits 當 R 的程式開始執行時,會預載入一些基本的套件,包括 stats、graphics、grDevices、utils 和 datasets。這些套件為 R 提供了基本的數據處理、統計分析、圖形顯示和檔案處理等功能。以下是這些套件的重要函式: stats:這個套件包含了許多統計分析相關的函式,例如假設檢定、方差分析、線性迴歸和時間序列分析等。其中,比較常用的函式有 t.test()、lm()、glm()、anova()、cor() 等。 graphics:這個套件提供了用於繪製各種圖形的函式,例如散佈圖、直方圖、盒鬚圖、線圖、散點矩陣等。其中,常用的函式有 plot()、hist()、boxplot()、lines()、points() 等。 grDevices:這個套件包含了用於輸出圖形的函式,例如 pdf()、png()、jpeg() 和 tiff() 等。 utils:這個套件包含了一些實用的函式,例如 install.packages()、help()、data() 等。 datasets:這個套件包含了一些內建的數據集,可以用來進行測試和練習,例如 iris、mtcars、CO2 等。可以使用 data() 函式載入這些數據集。 1.2 Dataset used in the book 本書所採用的資料可以從台大新聞所「新聞資料分析與視覺呈現」的github repository下載。R4CSS/data。 1.3 Cases in the book WP: Paid maternity leave Taipei Residential Hot spot: Contingency table, categorical data Trump’s tweets: Line plot, Bar chart, timeline, and text processing NYT: Net worth: Line plot NYT: Carbon Proportion: Treemap NYT: Optimism by countries NYT: Population growth Annual Budget of TW government: NA Processing, Treemap Vaccinating proportion by country x year: Proportion NYT: LeBron James’s Achievement "],["basic.html", "Chapter 2 R Basic 2.1 Using RStudio 2.2 First Attempt 2.3 R Q&A", " Chapter 2 R Basic 本章介紹如何使用 RStudio 編寫和執行 R 程式語言、R語言的基本語法、以及Vector和data.frame資料型態。 2.1 Using RStudio 2.1.1 RStudio Interface RStudio的介面主要分為四大區塊: 左上的區塊是「Source」(可切換至「Visual」)是撰寫程式碼與R Markdown的區塊; 左下角「Console」的區塊,每行程式碼的執行和執行結果都會出現在此,也可觀察程式執行結果; 右上角區塊最常用的是「Environment」這個分頁,程式碼執行過程產生的變數/變項都會出現在這裡。 右下角區塊我最常用的是「Files」這個分頁,顯示的是我自己電腦本機端的檔案目錄。右下角區塊也常常用到「Packages」,可查閱現在的程式執行環境有載入哪些套件;當用help(some_function)查詢某個套件或某個函式的功能是,就會自動跳到「Help」分頁。 2.1.2 Writing R Markdown R Markdown這種格式讓程式寫作者可以將程式碼和非程式碼的內容寫在同一份文件中。例如我想要寫作一本關於程式的書,裡面有很多的程式碼,但也要有很多說明、章節與段落。此時,這些非程式碼的區塊通常被稱為「內容區塊(Text Cell)」,而程式碼的區塊就稱為「Code Cell」。尤其是資料分析師或資料科學家很愛用這種格式,因為經常要為程式的執行結果寫很多說明,甚至利用標題一、標題二來區分章節。 內容區塊使用Markdown格式撰寫,顧名思義,支援用Markdown這種標記語法來快速撰寫如標題一、標題二、點列、編號等格式化文字。詳細指令可以參考rmarkdown-cheatsheet (rstudio.com)。這種格式的靈活性和強大功能,使得 R Markdown 成為撰寫技術文檔和學術報告的理想選擇,能夠有效地將敘述性文本與程式碼結果結合,提升文檔的互動性和表達力。 程式碼區塊可以用下列鍵盤指令來新增和執行。 Cmd(Ctrl)+Option(Alt)+i 新增一個程式碼區塊 Cmd+Enter (Ctrl+Enter in Window) 執行程式碼區塊中游標所在的那一行指令。 Cmd(Ctrl)+Shift+Enter 執行游標所在的整個程式碼區塊 其他常用鍵盤指令 - 註解:用滑鼠或鍵盤圈選某幾行程式碼後,可用Cmd(Ctrl)+Shift+c來將這幾行標記為註解或將其去除註解標記。 Practice. 用鍵盤快速鍵新增一個程式碼區塊、輸入以下程式碼並嘗試用鍵盤快速鍵執行。 a <- c(1, 2, 3, 4, 5) b <- 4 a*b 2.1.3 Installing third-party packages 套件的使用分為安裝(install.packages(\"pkg_name\"))和載入(library(pkg_name))兩個動作。通常安裝好R的時候就已經安裝好基本base套件。當執行R時便會將base套件預載入程式的執行環境中。 熱心的R使用者會編寫第三方套件,並且將這些套件開放給群眾使用。通常這些套件已經被上載到R cran提供下載。而R cran上的套件我們可以使用install.packages(\"package_name\")來自動安裝到我們的電腦中。 Practice 1. 執行以下程式碼 install.packages("tidyverse") install.packages("jsonlite") install.packages("httr") 2.1.3.1 Loading package 在安裝這些第三方套件之後,需要將它們載入到程式的運行環境中,然後才能使用。因此,需要使用 library(package_name) 命令來載入它們。 library(tidyverse) library(jsonlite) library(httr) 2.1.4 Code “Comment” 下列程式碼中開頭有#符號者為註解,程式設計師用這種註解來為程式碼做說明,便於自己日後閱讀或與他人溝通。程式在執行時會自動忽略前面有#符號的程式碼。如果要執行以下程式碼,要把前面的#記號給拿掉。在RStudio中你可以用滑鼠或鍵盤圈選下三行,然後用快速鍵command(ctrl)+shift+c就可以開關(Comment/Un-comment)這幾行程式碼。 # a <- c(1, 2, 3, 4, 5) # b <- 4 # a*b 2.2 First Attempt 2.2.1 Loading Open Data from the MOI MOS(Ministry of the Interior): 中華民國行政院內政部 library(httr) library(jsonlite) url <- "https://www.ris.gov.tw/rs-opendata/api/v1/datastore/ODRP024/107?page=1" first_page <- fromJSON(content(GET(url), "text")) # head(first_page$responseData) head(first_page$responseData) %>% rename(戶長=headhousehold_count) ## statistic_yyy district_code site_id village edu sex 戶長 ## 1 107 65000010001 新北市板橋區 留侯里 博畢 男 3 ## 2 107 65000010001 新北市板橋區 留侯里 碩畢 男 26 ## 3 107 65000010001 新北市板橋區 留侯里 大畢 男 71 ## 4 107 65000010001 新北市板橋區 留侯里 專畢 男 52 ## 5 107 65000010001 新北市板橋區 留侯里 高中畢 男 122 ## 6 107 65000010001 新北市板橋區 留侯里 國中畢 男 40 2.2.2 Obtaining Taipei Youbike (v2) Realtime Data 觀察臺北市資料大平臺 (data.taipei)上關於Youbike的資料,你認為哪些資料是具有資料新聞價值的? YouBike區域互補站點 YouBike站位每月熱門站點 YouBike場站建置成本 YouBike臺北市權利金與補助支出 YouBike臺北市站位每月使用量 YouBike起訖站點統計 YouBike見車率統計 YouBike潛在需求預測 YouBike2.0臺北市公共自行車即時資訊 url <- "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json" ubike.df <- fromJSON(content(GET(url),"text", encoding = "utf-8")) head(ubike.df) %>% select(1:6) ## sno sna tot sbi sarea mday ## 1 500101001 YouBike2.0_捷運科技大樓站 28 1 大安區 2024-03-31 23:09:14 ## 2 500101002 YouBike2.0_復興南路二段273號前 21 1 大安區 2024-03-31 23:02:18 ## 3 500101003 YouBike2.0_國北教大實小東側門 16 14 大安區 2024-03-31 22:26:18 ## 4 500101004 YouBike2.0_和平公園東側 11 11 大安區 2024-03-31 23:01:14 ## 5 500101005 YouBike2.0_辛亥復興路口西北側 16 11 大安區 2024-03-31 22:50:25 ## 6 500101006 YouBike2.0_復興南路二段280號前 11 8 大安區 2024-03-31 22:46:18 ubike.df # %>% View ## sno sna tot sbi ## 1 500101001 YouBike2.0_捷運科技大樓站 28 1 ## 2 500101002 YouBike2.0_復興南路二段273號前 21 1 ## 3 500101003 YouBike2.0_國北教大實小東側門 16 14 ## 4 500101004 YouBike2.0_和平公園東側 11 11 ## 5 500101005 YouBike2.0_辛亥復興路口西北側 16 11 ## 6 500101006 YouBike2.0_復興南路二段280號前 11 8 ## 7 500101007 YouBike2.0_復興南路二段340巷口 11 6 ## 8 500101008 YouBike2.0_新生南路三段52號前 17 5 ## 9 500101009 YouBike2.0_新生南路三段66號前 16 0 ## 10 500101010 YouBike2.0_新生南路三段82號前 20 10 ## 11 500101012 YouBike2.0_辛亥路一段30號前 8 0 ## 12 500101013 YouBike2.0_和平復興路口西北側 9 4 ## 13 500101014 YouBike2.0_羅斯福路三段311號前 11 2 ## 14 500101015 YouBike2.0_大安運動中心停車場 14 12 ## 15 500101016 YouBike2.0_羅斯福路三段245號前 8 2 ## 16 500101018 YouBike2.0_溫州公園 5 2 ## 17 500101019 YouBike2.0_和平臥龍街口 15 15 ## 18 500101020 YouBike2.0_溫州停車場 5 0 ## 19 500101021 YouBike2.0_銘傳國小側門 7 1 ## 20 500101022 YouBike2.0_捷運公館站(2號出口) 99 0 ## 21 500101023 YouBike2.0_第二學生活動中心 25 1 ## 22 500101024 YouBike2.0_臺灣科技大學正門 30 9 ## 23 500101025 YouBike2.0_臺灣科技大學側門 99 24 ## 24 500101026 YouBike2.0_公館公園 15 14 ## 25 500101027 YouBike2.0_臺灣科技大學後門 39 12 ## 26 500101028 YouBike2.0_臺大醫學院附設癌醫中心 20 8 ## 27 500101029 YouBike2.0_臺大環研大樓 15 9 ## 28 500101030 YouBike2.0_臺大永齡生醫工程館 34 3 ## 29 500101031 YouBike2.0_臺大男七舍前 20 19 ## 30 500101032 YouBike2.0_臺大男一舍前 61 60 ## 31 500101033 YouBike2.0_臺大男六舍前 46 39 ## 32 500101034 YouBike2.0_臺大動物醫院前 18 6 ## 33 500101035 YouBike2.0_臺大土木研究大樓前 24 8 ## 34 500101036 YouBike2.0_臺大萬才館前 20 8 ## 35 500101037 YouBike2.0_臺大國青大樓宿舍前 20 19 ## 36 500101038 YouBike2.0_臺大社科院圖書館前 27 0 ## 37 500101039 YouBike2.0_臺大法人語言訓練中心前 28 11 ## 38 500101040 YouBike2.0_臺大綜合體育館停車場前 25 7 ## 39 500101041 YouBike2.0_辛亥新生路口東南側 41 24 ## 40 500101042 YouBike2.0_基隆長興路口東側 15 15 ## 41 500101091 YouBike2.0_國北教大側門南側 25 20 ## 42 500101092 YouBike2.0_和平實小東北側 13 11 ## 43 500101093 YouBike2.0_大安區健康服務中心 15 4 ## 44 500101094 YouBike2.0_辛亥泰順街口 20 12 ## 45 500101095 YouBike2.0_芳和國中 37 32 ## 46 500101097 YouBike2.0_臥龍樂業街口 41 36 ## 47 500101098 YouBike2.0_臥龍公園 14 13 ## 48 500101099 YouBike2.0_嘉興公園 44 33 ## 49 500101100 YouBike2.0_捷運麟光站(2號出口) 50 12 ## 50 500101101 YouBike2.0_捷運六張犁站 64 12 ## 51 500101102 YouBike2.0_喬治工商 24 14 ## 52 500101103 YouBike2.0_法治公園 15 7 ## 53 500101104 YouBike2.0_捷運臺電大樓站(2號出口) 18 3 ## 54 500101105 YouBike2.0_和平金山路口 45 17 ## 55 500101107 YouBike2.0_和平龍泉街口 34 34 ## 56 500101108 YouBike2.0_和平泰順街口 9 9 ## 57 500101109 YouBike2.0_臺灣師範大學(圖書館) 40 29 ## 58 500101110 YouBike2.0_捷運古亭站(6號出口) 60 5 ## 59 500101111 YouBike2.0_捷運古亭站(5號出口) 14 1 ## 60 500101113 YouBike2.0_臺北市立圖書館(總館) 51 50 ## 61 500101114 YouBike2.0_新生和平路口東北側 51 7 ## 62 500101115 YouBike2.0_建國和平路口西北側 50 45 ## 63 500101116 YouBike2.0_金華公園 46 40 ## 64 500101117 YouBike2.0_捷運東門站(3號出口) 15 3 ## 65 500101118 YouBike2.0_金甌女中 12 1 ## 66 500101119 YouBike2.0_金杭公園 20 11 ## 67 500101120 YouBike2.0_愛國金山路口 43 6 ## 68 500101122 YouBike2.0_敦化南路二段293巷口南側 14 7 ## 69 500101123 YouBike2.0_敦化基隆路口 38 7 ## 70 500101124 YouBike2.0_安和路二段181巷口 17 8 ## 71 500101125 YouBike2.0_臨江街夜市(通化街101巷口) 30 25 ## 72 500101126 YouBike2.0_臨江街夜市(基隆路) 29 6 ## 73 500101127 YouBike2.0_台北科技大學億光大樓 46 0 ## 74 500101128 YouBike2.0_新生南路一段119巷口 33 24 ## 75 500101129 YouBike2.0_幸安國小(仁愛路) 16 8 ## 76 500101130 YouBike2.0_民榮公園 15 14 ## 77 500101131 YouBike2.0_復興南路1段340巷口 50 10 ## 78 500101132 YouBike2.0_建國濟南路口 54 27 ## 79 500101133 YouBike2.0_捷運忠孝復興站(2號出口) 43 24 ## 80 500101134 YouBike2.0_捷運大安站(4號出口) 13 11 ## 81 500101135 YouBike2.0_捷運大安站(2號出口) 22 22 ## 82 500101136 YouBike2.0_信義大安路口(信維大樓) 12 4 ## 83 500101137 YouBike2.0_龍門廣場 70 6 ## 84 500101138 YouBike2.0_仁愛安和路口 33 1 ## 85 500101139 YouBike2.0_信義敦化路口 52 31 ## 86 500101140 YouBike2.0_仁愛國中 25 1 ## 87 500101141 YouBike2.0_捷運信義安和站(2號出口) 24 5 ## 88 500101142 YouBike2.0_八德市場 30 27 ## 89 500101143 YouBike2.0_昌隆公園 16 14 ## 90 500101144 YouBike2.0_捷運大安森林公園站(2號出口) 69 42 ## 91 500101145 YouBike2.0_信義延吉街口 15 1 ## 92 500101146 YouBike2.0_光信公園(光復南路456巷) 15 15 ## 93 500101147 YouBike2.0_僑安地下停車場(2號出口)東南側 20 0 ## 94 500101148 YouBike2.0_建國南路一段279巷口 32 10 ## 95 500101149 YouBike2.0_捷運忠孝新生站(6號出口) 15 2 ## 96 500101150 YouBike2.0_捷運忠孝新生站(4號出口) 34 6 ## 97 500101151 YouBike2.0_大安高工 23 18 ## 98 500101152 YouBike2.0_捷運忠孝新生站(3號出口) 23 6 ## 99 500101153 YouBike2.0_瑠公公園 20 0 ## 100 500101154 YouBike2.0_敦化市民路口 23 7 ## 101 500101155 YouBike2.0_捷運大安森林公園站(5號出口) 15 3 ## 102 500101156 YouBike2.0_信義建國路口 52 24 ## 103 500101157 YouBike2.0_東豐公園 19 14 ## 104 500101158 YouBike2.0_德安公園(四維路66巷) 14 3 ## 105 500101159 YouBike2.0_捷運忠孝復興站(5號出口) 41 0 ## 106 500101160 YouBike2.0_捷運忠孝敦化站(2號出口) 17 0 ## 107 500101161 YouBike2.0_捷運忠孝敦化站(7號出口) 18 0 ## 108 500101163 YouBike2.0_瑞安街208巷 15 11 ## 109 500101165 YouBike2.0_樂利路21巷口 17 13 ## 110 500101166 YouBike2.0_捷運科技大樓站(台北教育大學) 54 18 ## 111 500101167 YouBike2.0_捷運國父紀念館站(2號出口) 45 1 ## 112 500101168 YouBike2.0_仁愛醫院 36 8 ## 113 500101169 YouBike2.0_捷運信義安和站(4號出口) 30 6 ## 114 500101170 YouBike2.0_成功國宅 36 23 ## 115 500101171 YouBike2.0_仁愛延吉街口 33 3 ## 116 500101172 YouBike2.0_捷運信義安和站(1號出口) 33 10 ## 117 500101173 YouBike2.0_敦化南路二段103巷口 24 20 ## 118 500101174 YouBike2.0_復興南路二段128巷口 37 4 ## 119 500101175 YouBike2.0_和平東建國南路口 17 2 ## 120 500101176 YouBike2.0_芳蘭山莊 16 5 ## 121 500101177 YouBike2.0_復興南路一段126巷口 15 14 ## 122 500101179 YouBike2.0_捷運東門站(5號出口) 28 0 ## 123 500101180 YouBike2.0_仁愛路四段48巷口 11 0 ## 124 500101181 YouBike2.0_捷運公館站(3號出口) 90 1 ## 125 500101182 YouBike2.0_臺北科技大學(電機工程系) 16 11 ## 126 500101183 YouBike2.0_忠孝東路三段217巷口 34 0 ## 127 500101184 YouBike2.0_新生南路三段94巷口 15 0 ## 128 500101185 YouBike2.0_辛亥新生路口西北側 12 7 ## 129 500101186 YouBike2.0_捷運大安站(6號出口) 19 8 ## 130 500101187 YouBike2.0_臥龍街195巷口 14 5 ## 131 500101188 YouBike2.0_辛亥路三段157巷口 19 19 ## 132 500101189 YouBike2.0_臥龍基隆路口 16 6 ## 133 500101190 YouBike2.0_敦親公園 26 23 ## 134 500101191 YouBike2.0_大安運動中心 33 2 ## 135 500101192 YouBike2.0_和平敦化路口 36 15 ## 136 500101193 YouBike2.0_基隆長興路口 43 31 ## 137 500101194 YouBike2.0_仁愛路四段122巷口 16 8 ## 138 500101196 YouBike2.0_市民敦化路口 15 1 ## 139 500101197 YouBike2.0_忠孝東路四段49巷口 15 0 ## 140 500101198 YouBike2.0_市民復興路口(東南側) 16 0 ## 141 500101199 YouBike2.0_和平新生路口西南側 13 8 ## 142 500101200 YouBike2.0_全安公園 16 13 ## 143 500101201 YouBike2.0_信義路三段134巷口 19 10 ## 144 500101202 YouBike2.0_仁愛敦南圓環(東南側) 16 7 ## 145 500101203 YouBike2.0_臺北遠企購物中心 33 4 ## 146 500101204 YouBike2.0_外交部外交及國際事務學院 17 12 ## 147 500101205 YouBike2.0_四維路170巷口 22 17 ## 148 500101206 YouBike2.0_捷運大安站(3號出口) 46 31 ## 149 500101207 YouBike2.0_捷運臺電大樓站(2號出口)_1 35 1 ## 150 500101208 YouBike2.0_信義路四段199巷 15 7 ## 151 500101209 YouBike2.0_臺大資訊大樓 40 1 ## 152 500101210 YouBike2.0_敦化南路二段81巷 40 10 ## 153 500101211 YouBike2.0_原臺北刑務所官舍 23 23 ## 154 500101212 YouBike2.0_捷運國父紀念館站(1號出口) 25 0 ## 155 500101213 YouBike2.0_懷生國中 15 9 ## 156 500101214 YouBike2.0_仁愛敦南圓環(西北側) 20 6 ## 157 500101215 YouBike2.0_立人國小 17 16 ## 158 500101216 YouBike2.0_和平東路二段18巷口 24 24 ## 159 500101217 YouBike2.0_捷運大安站(5號出口) 26 14 ## 160 500101218 YouBike2.0_臨江公園 23 18 ## 161 500101219 YouBike2.0_羅斯福路四段113巷19弄口 14 7 ## 162 500101221 YouBike2.0_忠孝東路四段248巷口 15 1 ## 163 500101222 YouBike2.0_仁愛延吉路口(西北側) 18 5 ## 164 500101223 YouBike2.0_樂利路101巷口 13 12 ## 165 500101224 YouBike2.0_羅斯福浦城街口 15 8 ## 166 500101225 YouBike2.0_敦化南路一段295巷口 18 15 ## 167 500101226 YouBike2.0_通安區民活動中心 19 16 ## 168 500101227 YouBike2.0_復興忠孝東路口(東南側) 28 13 ## 169 500101228 YouBike2.0_仁愛大安路口(東北側) 21 4 ## 170 500101229 YouBike2.0_臺灣師範大學(浦城街) 15 12 ## 171 500101230 YouBike2.0_安和路二段69巷口 20 10 ## 172 500101231 YouBike2.0_大安國小 25 16 ## 173 500101232 YouBike2.0_捷運古亭站(3號出口) 15 3 ## 174 500101233 YouBike2.0_捷運忠孝復興站(3號出口) 37 4 ## 175 500101234 YouBike2.0_和平東路二段90巷 20 6 ## 176 500101235 YouBike2.0_光復南路420巷口 16 0 ## 177 500101236 YouBike2.0_富陽臥龍街口 18 8 ## 178 500101237 YouBike2.0_仁愛復興路口 25 3 ## 179 500101238 YouBike2.0_仁愛敦南圓環(東側) 16 9 ## 180 500101239 YouBike2.0_古風公園 15 3 ## 181 500103001 YouBike2.0_延平國宅 30 28 ## 182 500103002 YouBike2.0_臺北市立圖書館大同分館 20 11 ## 183 500103003 YouBike2.0_合昌宮 15 9 ## 184 500103004 YouBike2.0_民族延平路口 36 19 ## 185 500103005 YouBike2.0_重慶酒泉街口 44 15 ## 186 500103006 YouBike2.0_樹德公園 14 5 ## 187 500103007 YouBike2.0_陳天來故居 18 18 ## 188 500103008 YouBike2.0_臺北孔廟 37 25 ## 189 500103009 YouBike2.0_捷運圓山站(1號出口) 44 0 ## 190 500103010 YouBike2.0_酒泉延平路口 41 23 ## 191 500103011 YouBike2.0_重慶國中 49 6 ## 192 500103012 YouBike2.0_重慶北路三段383巷口 25 25 ## 193 500103013 YouBike2.0_台北數位產業園區 24 13 ## 194 500103019 YouBike2.0_民權延平路口(西北側) 20 20 ## 195 500103020 YouBike2.0_民權迪化街口 47 25 ## 196 500103021 YouBike2.0_大稻埕公園 35 22 ## 197 500103022 YouBike2.0_大龍老人住宅 14 12 ## 198 500103023 YouBike2.0_大龍峒社會住宅 20 13 ## 199 500103024 YouBike2.0_捷運大橋頭站(2號出口) 57 4 ## 200 500103025 YouBike2.0_捷運大橋頭站(1A出口) 18 10 ## 201 500103026 YouBike2.0_捷運民權西路站(2號出口) 25 0 ## 202 500103027 YouBike2.0_捷運雙連站(2號出口) 41 3 ## 203 500103028 YouBike2.0_捷運北門站(3號出口) 62 22 ## 204 500103029 YouBike2.0_朝陽公園 10 5 ## 205 500103030 YouBike2.0_永樂市場 38 24 ## 206 500103031 YouBike2.0_大龍公園 18 13 ## 207 500103032 YouBike2.0_重慶涼州街口 13 7 ## 208 500103033 YouBike2.0_圓山線形公園 14 8 ## 209 500103034 YouBike2.0_圓環站 31 15 ## 210 500103035 YouBike2.0_重慶民族路口 26 16 ## 211 500103036 YouBike2.0_承德路三段8巷口 21 4 ## 212 500103037 YouBike2.0_太原廣場 31 15 ## 213 500103038 YouBike2.0_國順公園 20 17 ## 214 500103039 YouBike2.0_聯合醫院中興院區 40 19 ## 215 500103040 YouBike2.0_蔣渭水紀念公園 36 21 ## 216 500103041 YouBike2.0_迪化休閒運動公園 15 2 ## 217 500103042 YouBike2.0_大同運動中心 16 15 ## 218 500103043 YouBike2.0_重慶保安街口(家樂福重慶店) 20 12 ## 219 500103044 YouBike2.0_大稻埕碼頭 52 16 ## 220 500103045 YouBike2.0_歸綏戲曲公園 20 17 ## 221 500103046 YouBike2.0_民權國中(民權西路) 17 2 ## 222 500103047 YouBike2.0_承德民權路口 17 10 ## 223 500103048 YouBike2.0_南京太原路口 18 4 ## 224 500103049 YouBike2.0_承德民生西路口 11 3 ## 225 500103050 YouBike2.0_太原五原路口 32 16 ## 226 500103051 YouBike2.0_臺北轉運站(華陰街) 20 0 ## 227 500103052 YouBike2.0_捷運民權西路站(3號出口) 50 0 ## 228 500103053 YouBike2.0_捷運中山站(5號出口) 15 2 ## 229 500103054 YouBike2.0_重慶長安路口 15 12 ## 230 500103055 YouBike2.0_承德昌吉街口 18 17 ## 231 500103056 YouBike2.0_大同16號廣場 14 6 ## 232 500103057 YouBike2.0_捷運圓山站(2號出口) 37 0 ## 233 500103058 YouBike2.0_樹德公園_1 40 20 ## 234 500103059 YouBike2.0_承德鄭州路口(市民高架下) 38 5 ## 235 500103060 YouBike2.0_成淵高中 14 3 ## 236 500103061 YouBike2.0_雙蓮國小 20 20 ## 237 500103062 YouBike2.0_寧夏涼州街口 15 3 ## 238 500103063 YouBike2.0_延平涼州街口 14 9 ## 239 500103064 YouBike2.0_大同行政中心 16 11 ## 240 500103065 YouBike2.0_大龍市場 15 14 ## 241 500103068 YouBike2.0_哈密街23巷19弄口 23 3 ## 242 500104001 YouBike2.0_劍潭抽水站 17 7 ## 243 500104002 YouBike2.0_通河東街大南路口 15 9 ## 244 500104003 YouBike2.0_福港街停車場 22 14 ## 245 500104004 YouBike2.0_百齡國小 50 39 ## 246 500104005 YouBike2.0_雨聲街165巷口 15 7 ## 247 500104006 YouBike2.0_天和公園 13 6 ## 248 500104007 YouBike2.0_中山天母路口 29 16 ## 249 500104008 YouBike2.0_天母運動公園 50 32 ## 250 500104009 YouBike2.0_臺北市立大學(天母校區) 48 8 ## 251 500104010 YouBike2.0_忠誠路二段53巷 18 7 ## 252 500104012 YouBike2.0_天母棒球場 26 21 ## 253 500104013 YouBike2.0_天母北天玉街口 15 11 ## 254 500104014 YouBike2.0_蘭興公園 48 19 ## 255 500104015 YouBike2.0_明勝公園 14 10 ## 256 500104016 YouBike2.0_劍潭海外青年活動中心 23 0 ## 257 500104018 YouBike2.0_忠誠路一段173巷口 11 2 ## 258 500104019 YouBike2.0_雨農國小 14 10 ## 259 500104020 YouBike2.0_忠誠公園 14 5 ## 260 500104021 YouBike2.0_芝山抽水站 46 26 ## 261 500104022 YouBike2.0_至誠路一段305巷口 21 7 ## 262 500104023 YouBike2.0_華齡公園 32 28 ## 263 500104024 YouBike2.0_前港公園(福德宮) 18 12 ## 264 500104025 YouBike2.0_華齡街185巷口 12 7 ## 265 500104026 YouBike2.0_前港公園(前港街) 19 13 ## 266 500104027 YouBike2.0_百齡高中 15 8 ## 267 500104028 YouBike2.0_捷運芝山站(2號出口) 21 9 ## 268 500104029 YouBike2.0_臺灣戲曲中心 25 7 ## 269 500104030 YouBike2.0_捷運劍潭站(2號出口) 49 14 ## 270 500104031 YouBike2.0_劍潭基河路口 66 1 ## 271 500104032 YouBike2.0_志成公園 23 13 ## 272 500104033 YouBike2.0_福林國小 14 11 ## 273 500104034 YouBike2.0_中山中正路口 19 10 ## 274 500104035 YouBike2.0_士林運動中心 30 10 ## 275 500104036 YouBike2.0_陽明高中 36 32 ## 276 500104037 YouBike2.0_兒童新樂園 23 12 ## 277 500104038 YouBike2.0_臺北市立天文館 46 25 ## 278 500104039 YouBike2.0_華聲公園 27 0 ## 279 500104040 YouBike2.0_福林公園 17 10 ## 280 500104041 YouBike2.0_捷運士林站(2號出口) 30 6 ## 281 500104042 YouBike2.0_銘傳大學 26 11 ## 282 500104043 YouBike2.0_士林高商 26 4 ## 283 500104044 YouBike2.0_蘭雅公園 38 9 ## 284 500104045 YouBike2.0_聯合醫院陽明院區 25 14 ## 285 500104046 YouBike2.0_捷運芝山站(1號出口) 36 0 ## 286 500104047 YouBike2.0_至誠公園 15 10 ## 287 500104048 YouBike2.0_原住民文化主題公園 21 14 ## 288 500104049 YouBike2.0_通河東街2段10巷口 15 12 ## 289 500104050 YouBike2.0_梅林新村 15 4 ## 290 500104051 YouBike2.0_延平北中正路口 30 22 ## 291 500104052 YouBike2.0_重慶北路四段190巷口 13 10 ## 292 500104053 YouBike2.0_重慶北葫東街口 15 11 ## 293 500104054 YouBike2.0_葫蘆國小 30 21 ## 294 500104055 YouBike2.0_士林3號廣場 30 13 ## 295 500104056 YouBike2.0_社正公園 15 1 ## 296 500104057 YouBike2.0_社子國小 15 10 ## 297 500104058 YouBike2.0_社中街384巷口 18 7 ## 298 500104059 YouBike2.0_忠誠路一段138號 15 12 ## 299 500104060 YouBike2.0_社子公園 32 15 ## 300 500104061 YouBike2.0_國立故宮博物院 17 3 ## 301 500104062 YouBike2.0_泰北高中 16 10 ## 302 500104063 YouBike2.0_後港公園 15 6 ## 303 500104064 YouBike2.0_重慶北路四段117號 18 10 ## 304 500104065 YouBike2.0_社子島島頭公園 15 8 ## 305 500104066 YouBike2.0_延平北路八段133巷口 15 8 ## 306 500104067 YouBike2.0_坤天亭 14 8 ## 307 500104068 YouBike2.0_社子島濕地解說小築 15 9 ## 308 500104069 YouBike2.0_福安國中 25 14 ## 309 500104070 YouBike2.0_福安消防分隊 15 8 ## 310 500104071 YouBike2.0_聖山綠地 15 9 ## 311 500104072 YouBike2.0_芝山國小 38 25 ## 312 500104073 YouBike2.0_士林新天地 29 8 ## 313 500104074 YouBike2.0_蘭雅國小 37 33 ## 314 500104075 YouBike2.0_中正基河路口 37 17 ## 315 500104076 YouBike2.0_福林公園(中正路) 45 14 ## 316 500104077 YouBike2.0_至善臨溪路口 48 19 ## 317 500104078 YouBike2.0_市立圖書館葫蘆堵分館 13 9 ## 318 500104079 YouBike2.0_東山路110巷口 16 6 ## 319 500104080 YouBike2.0_永平社會住宅 15 6 ## 320 500104081 YouBike2.0_雨農橋 16 9 ## 321 500104082 YouBike2.0_通河街76巷/承德路四段10巷口 14 5 ## 322 500104083 YouBike2.0_芝山聖佑宮 15 5 ## 323 500104084 YouBike2.0_至誠雨聲街口 9 0 ## 324 500104085 YouBike2.0_捷運線型公園(後街) 13 12 ## 325 500104086 YouBike2.0_天母公園 12 9 ## 326 500104087 YouBike2.0_基河文林路口 16 6 ## 327 500104088 YouBike2.0_文林福華路口 19 6 ## 328 500104089 YouBike2.0_劍潭海外青年活動中心_1 39 13 ## 329 500104090 YouBike2.0_社子國小_1 36 25 ## 330 500104091 YouBike2.0_捷運劍潭站(1號出口) 70 3 ## 331 500104092 YouBike2.0_德行東山路口 12 8 ## 332 500104094 YouBike2.0_重慶北通河西街口 12 3 ## 333 500104095 YouBike2.0_葫蘆國小(延平北路五段285巷) 15 11 ## 334 500104096 YouBike2.0_社子市場 15 10 ## 335 500104097 YouBike2.0_士林區農會社子分部 8 6 ## 336 500104098 YouBike2.0_承德劍潭路口 19 4 ## 337 500104099 YouBike2.0_文林路101巷口 17 9 ## 338 500104100 YouBike2.0_延平北路五段257巷15弄口 11 8 ## 339 500104101 YouBike2.0_延平北路五段257巷4弄口 15 9 ## 340 500104102 YouBike2.0_啟明學校 16 8 ## 341 500104103 YouBike2.0_中山福國路口 14 6 ## 342 500104104 YouBike2.0_德行公園 14 9 ## 343 500104105 YouBike2.0_承德後港街口 11 3 ## 344 500104106 YouBike2.0_中山北路五段698巷口 15 12 ## 345 500104107 YouBike2.0_捷運士林站(1號出口) 38 24 ## 346 500104108 YouBike2.0_捷運芝山站(2號出口)_1 62 4 ## 347 500104109 YouBike2.0_銘傳大學(中山北路五段280巷口) 23 1 ## 348 500104110 YouBike2.0_海光公園南側 12 5 ## 349 500104111 YouBike2.0_士商路40巷口 15 10 ## 350 500104112 YouBike2.0_劍潭郵局 16 7 ## 351 500104113 YouBike2.0_士東路91巷口 16 8 ## 352 500104114 YouBike2.0_美崙公園 13 8 ## 353 500104115 YouBike2.0_臺北市立大學(忠誠路二段207巷) 17 6 ## 354 500104116 YouBike2.0_天母東路8巷/忠誠路二段154巷口 14 2 ## 355 500104117 YouBike2.0_美崙公園(東北側) 15 7 ## 356 500104118 YouBike2.0_福安河濱公園 14 6 ## 357 500104119 YouBike2.0_忠誠忠義街口(北側) 13 8 ## 358 500104120 YouBike2.0_忠誠忠義街口(南側) 14 4 ## 359 500104121 YouBike2.0_士林國小 15 7 ## 360 500104124 YouBike2.0_天和一號公園 15 10 ## 361 500104125 YouBike2.0_忠誠路二段178巷口 15 5 ## 362 500104126 YouBike2.0_克強磺溪街口 14 4 ## 363 500104128 YouBike2.0_蘭雅公園(西側) 15 11 ## 364 500104129 YouBike2.0_福林路100巷77弄口 18 5 ## 365 500105001 YouBike2.0_台北花木批發市場 40 21 ## 366 500105002 YouBike2.0_捷運萬隆站(4號出口) 22 0 ## 367 500105003 YouBike2.0_捷運萬隆站(1號出口) 34 0 ## 368 500105004 YouBike2.0_萬和二號公園 35 17 ## 369 500105005 YouBike2.0_捷運萬隆站(2號出口) 12 0 ## 370 500105006 YouBike2.0_景仁公園 16 8 ## 371 500105007 YouBike2.0_捷運景美站(2號出口) 63 2 ## 372 500105008 YouBike2.0_羅斯福景隆街口 25 7 ## 373 500105009 YouBike2.0_景福街/羅斯福路6段142巷口 28 11 ## 374 500105010 YouBike2.0_興旺公園 30 22 ## 375 500105011 YouBike2.0_興福國中 25 15 ## 376 500105012 YouBike2.0_興隆路2段203巷 32 14 ## 377 500105013 YouBike2.0_景美運動公園 11 3 ## 378 500105014 YouBike2.0_景美醫院 18 6 ## 379 500105015 YouBike2.0_師範大學公館校區 14 10 ## 380 500105016 YouBike2.0_景華街128巷口 29 21 ## 381 500105017 YouBike2.0_仙跡岩登山口(景興路) 22 4 ## 382 500105018 YouBike2.0_國立政治大學 35 18 ## 383 500105019 YouBike2.0_捷運動物園站 57 1 ## 384 500105020 YouBike2.0_捷運木柵站 31 19 ## 385 500105021 YouBike2.0_捷運萬芳社區站 49 17 ## 386 500105022 YouBike2.0_文山運動中心 30 16 ## 387 500105023 YouBike2.0_捷運辛亥站 42 0 ## 388 500105024 YouBike2.0_興豐公園 25 8 ## 389 500105025 YouBike2.0_木柵光輝路口 33 31 ## 390 500105026 YouBike2.0_考試院 26 10 ## 391 500105027 YouBike2.0_和興路26巷口 22 7 ## 392 500105028 YouBike2.0_世新大學 30 5 ## 393 500105029 YouBike2.0_一壽橋 28 18 ## 394 500105030 YouBike2.0_臺北市立景美女中 25 12 ## 395 500105031 YouBike2.0_永安藝文館-表演36房 29 17 ## 396 500105032 YouBike2.0_忠順區民活動中心 31 14 ## 397 500105033 YouBike2.0_景文中學 36 19 ## 398 500105034 YouBike2.0_老泉街籃球場 14 9 ## 399 500105035 YouBike2.0_文山行政中心 27 0 ## 400 500105036 YouBike2.0_木柵公園 38 5 ## 401 500105037 YouBike2.0_興隆公共住宅D2區 19 12 ## 402 500105038 YouBike2.0_木新路3段95巷口 16 9 ## 403 500105039 YouBike2.0_樟腳里公園 15 15 ## 404 500105040 YouBike2.0_實踐國中 13 6 ## 405 500105041 YouBike2.0_指南路3段2巷 13 13 ## 406 500105042 YouBike2.0_萊茵公園 14 8 ## 407 500105043 YouBike2.0_木柵社會住宅 12 3 ## 408 500105044 YouBike2.0_秀明路一段185巷口 20 4 ## 409 500105045 YouBike2.0_秀明路一段129巷口 22 12 ## 410 500105046 YouBike2.0_恆光橋(老泉街) 13 2 ## 411 500105047 YouBike2.0_萬有3號公園 14 6 ## 412 500105048 YouBike2.0_捷運萬芳醫院站(興隆路三段115巷) 20 5 ## 413 500105049 YouBike2.0_興得閱覽室 24 13 ## 414 500105050 YouBike2.0_辛亥生態公園 18 0 ## 415 500105051 YouBike2.0_博嘉運動公園 12 0 ## 416 500105052 YouBike2.0_國立政治大學(萬壽路) 54 40 ## 417 500105053 YouBike2.0_仙岩公園 11 9 ## 418 500105054 YouBike2.0_政大一街口 14 3 ## 419 500105055 YouBike2.0_文山第二行政中心 38 12 ## 420 500105056 YouBike2.0_移民署訓練中心 13 9 ## 421 500105057 YouBike2.0_海巡署(南側) 10 2 ## 422 500105058 YouBike2.0_明道國小東南側 18 3 ## 423 500105059 YouBike2.0_木南公園 12 7 ## 424 500105060 YouBike2.0_實踐國中(木新路三段310巷口) 17 8 ## 425 500105061 YouBike2.0_師範大學公館校區_1 34 8 ## 426 500105062 YouBike2.0_捷運動物園站(2號出口) 39 0 ## 427 500105063 YouBike2.0_政大水岸電梯 10 9 ## 428 500105064 YouBike2.0_敦南山林 14 2 ## 429 500105066 YouBike2.0_景美污水抽水站 15 1 ## 430 500105067 YouBike2.0_萬和三號公園(北側) 13 6 ## 431 500105068 YouBike2.0_景興國中 10 4 ## 432 500105069 YouBike2.0_景仁公園_1 30 17 ## 433 500105070 YouBike2.0_師大公館校區學二舍 40 15 ## 434 500105071 YouBike2.0_景行公園 15 0 ## 435 500105072 YouBike2.0_萬興國小 16 6 ## 436 500105073 YouBike2.0_辛亥路四段77巷口 14 9 ## 437 500105074 YouBike2.0_景興路42巷口 12 4 ## 438 500105075 YouBike2.0_木柵路三段48巷 15 7 ## 439 500105076 YouBike2.0_木柵路二段109巷 15 11 ## 440 500105077 YouBike2.0_試院公園 15 7 ## 441 500105079 YouBike2.0_樟樹公園 15 11 ## 442 500105080 YouBike2.0_萬美萬安街口 16 2 ## 443 500105081 YouBike2.0_興隆路二段203巷(敦南) 27 22 ## 444 500105082 YouBike2.0_新光秀明路口 15 4 ## 445 500105083 YouBike2.0_光輝路134巷口 15 8 ## 446 500105084 YouBike2.0_光輝公園 15 15 ## 447 500105085 YouBike2.0_木新公園 12 6 ## 448 500105086 YouBike2.0_興隆路二段275巷1弄口 16 6 ## 449 500105087 YouBike2.0_中國科技大學 21 3 ## 450 500105088 YouBike2.0_樟新街8巷 17 4 ## 451 500105089 YouBike2.0_仙岩路22巷口 28 20 ## 452 500105090 YouBike2.0_木柵萬芳路口 18 8 ## 453 500105091 YouBike2.0_福興路78巷 14 11 ## 454 500105093 YouBike2.0_興泰公園 12 7 ## 455 500105094 YouBike2.0_興岩社會福利綜合大樓 18 6 ## 456 500105095 YouBike2.0_興隆路二段22巷9弄口 13 6 ## 457 500106001 YouBike2.0_臺北自來水事業處 20 1 ## 458 500106002 YouBike2.0_汀州思源街口東南側 20 2 ## 459 500106003 YouBike2.0_捷運公館站(1號出口) 12 1 ## 460 500106004 YouBike2.0_捷運公館站(4號出口) 12 2 ## 461 500106005 YouBike2.0_捷運古亭站(9號出口) 20 13 ## 462 500106006 YouBike2.0_捷運古亭站(2號出口) 55 0 ## 463 500106007 YouBike2.0_捷運臺電大樓站(1號出口) 34 0 ## 464 500106008 YouBike2.0_客家文化主題公園 15 15 ## 465 500106009 YouBike2.0_河堤國小 39 26 ## 466 500106010 YouBike2.0_紀州庵 25 17 ## 467 500106011 YouBike2.0_捷運臺電大樓站(5號出口) 14 8 ## 468 500106012 YouBike2.0_捷運臺電大樓站(4號出口) 13 10 ## 469 500106013 YouBike2.0_羅斯福三段金門街口 15 13 ## 470 500106014 YouBike2.0_牯嶺公園 58 28 ## 471 500106015 YouBike2.0_捷運古亭站(8號出口) 15 0 ## 472 500106016 YouBike2.0_捷運古亭站(7號出口) 12 2 ## 473 500106017 YouBike2.0_南昌公園 55 20 ## 474 500106018 YouBike2.0_和平重慶路口 46 31 ## 475 500106019 YouBike2.0_孫立人將軍官邸 23 9 ## 476 500106020 YouBike2.0_羅斯福路二段6巷口 14 7 ## 477 500106021 YouBike2.0_金華杭州南路口 21 13 ## 478 500106022 YouBike2.0_捷運中正紀念堂站(3號出口) 18 5 ## 479 500106023 YouBike2.0_捷運中正紀念堂站(4號出口) 21 8 ## 480 500106025 YouBike2.0_螢橋國小 41 29 ## 481 500106026 YouBike2.0_古亭智慧圖書館 14 8 ## 482 500106027 YouBike2.0_永昌公園 15 5 ## 483 500106028 YouBike2.0_中華路二段409巷口 15 9 ## 484 500106029 YouBike2.0_南機場夜市(中華路二段) 41 27 ## 485 500106030 YouBike2.0_南海和平路口西南側 19 2 ## 486 500106031 YouBike2.0_莒光和平路口 20 11 ## 487 500106037 YouBike2.0_水源路11-1號旁 19 13 ## 488 500106038 YouBike2.0_南門國中 29 12 ## 489 500106039 YouBike2.0_捷運小南門站(2號出口) 18 9 ## 490 500106040 YouBike2.0_介壽公園 23 14 ## 491 500106041 YouBike2.0_中華貴陽街口 20 4 ## 492 500106042 YouBike2.0_華山文創園區 39 30 ## 493 500106043 YouBike2.0_捷運善導寺站(1號出口) 46 14 ## 494 500106044 YouBike2.0_濟南紹興路口 39 18 ## 495 500106046 YouBike2.0_林森仁愛路口 13 4 ## 496 500106047 YouBike2.0_中正運動中心 39 13 ## 497 500106048 YouBike2.0_信義杭州路口 59 17 ## 498 500106049 YouBike2.0_捷運善導寺站(3號出口) 20 0 ## 499 500106050 YouBike2.0_捷運小南門站(1號出口) 46 27 ## 500 500106051 YouBike2.0_延平南路133巷口 17 7 ## 501 500106052 YouBike2.0_捷運西門站(2號出口) 36 9 ## 502 500106053 YouBike2.0_寶慶博愛路口 47 6 ## 503 500106054 YouBike2.0_法務部 27 6 ## 504 500106055 YouBike2.0_臺北市立大學(博愛校區) 59 29 ## 505 500106056 YouBike2.0_國家圖書館 36 11 ## 506 500106057 YouBike2.0_市民金山路口 50 15 ## 507 500106058 YouBike2.0_聯合醫院和平院區 32 24 ## 508 500106059 YouBike2.0_中山堂 43 4 ## 509 500106060 YouBike2.0_中華漢口街口 19 9 ## 510 500106061 YouBike2.0_中華路一段21巷口 22 4 ## 511 500106062 YouBike2.0_捷運臺大醫院站(4號出口) 60 22 ## 512 500106063 YouBike2.0_寶藏巖觀音亭 23 9 ## 513 500106064 YouBike2.0_師大水源路口 21 10 ## 514 500106065 YouBike2.0_中山徐州路口 26 15 ## 515 500106066 YouBike2.0_信義連雲街口 39 2 ## 516 500106067 YouBike2.0_臺北轉運站 68 35 ## 517 500106068 YouBike2.0_莒光大埔街口 32 19 ## 518 500106069 YouBike2.0_捷運忠孝新生站(2號出口) 32 0 ## 519 500106070 YouBike2.0_光華商場 39 6 ## 520 500106071 YouBike2.0_中山青島路口 40 0 ## 521 500106072 YouBike2.0_捷運中正紀念堂站(5號出口) 29 12 ## 522 500106073 YouBike2.0_北平東杭州北路口 20 0 ## 523 500106074 YouBike2.0_王貫英先生紀念圖書館 15 15 ## 524 500106075 YouBike2.0_金山信義路口 25 2 ## 525 500106077 YouBike2.0_林森徐州路口 16 16 ## 526 500106078 YouBike2.0_徐州杭州路口 19 11 ## 527 500106079 YouBike2.0_捷運中正紀念堂站(6號出口) 17 9 ## 528 500106080 YouBike2.0_捷運臺北車站(M2出口) 20 0 ## 529 500106083 YouBike2.0_臺北市國父史蹟館(逸仙公園) 31 0 ## 530 500106084 YouBike2.0_捷運西門站(5號出口) 30 2 ## 531 500106085 YouBike2.0_弘道國中 18 9 ## 532 500106086 YouBike2.0_臺北市第一女子高級中學 17 2 ## 533 500106087 YouBike2.0_台北市替代役中心 15 4 ## 534 500106088 YouBike2.0_紹興徐州路口 18 17 ## 535 500106089 YouBike2.0_羅斯福寧波東街口 26 1 ## 536 500106090 YouBike2.0_自來水園區 40 0 ## 537 500106091 YouBike2.0_仁愛林森路口 31 3 ## 538 500106092 YouBike2.0_捷運西門站(3號出口) 36 3 ## 539 500106093 YouBike2.0_仁愛金山路口 9 5 ## 540 500106094 YouBike2.0_杭州南路一段101巷口 14 8 ## 541 500106095 YouBike2.0_仁愛杭州路口 16 8 ## 542 500106096 YouBike2.0_龍興里活動中心 21 17 ## 543 500106097 YouBike2.0_植物園 29 25 ## 544 500106098 YouBike2.0_郵政博物館 24 9 ## 545 500106099 YouBike2.0_林森北平路口 20 8 ## 546 500106100 YouBike2.0_北平紹興路口 15 3 ## 547 500106101 YouBike2.0_天津北平路口 15 4 ## 548 500106102 YouBike2.0_捷運忠孝新生站(1號出口) 19 1 ## 549 500106103 YouBike2.0_捷運忠孝新生站(5號出口) 13 2 ## 550 500106104 YouBike2.0_捷運臺大醫院站(1號出口) 19 6 ## 551 500106105 YouBike2.0_臺大醫院兒童醫院 22 3 ## 552 500106106 YouBike2.0_林森濟南路口(東北側) 15 4 ## 553 500106107 YouBike2.0_仁愛紹興街口(南側) 17 4 ## 554 500106108 YouBike2.0_中華南海路口 15 8 ## 555 500106109 YouBike2.0_立法院台北會館 15 10 ## 556 500106110 YouBike2.0_捷運善導寺站(3號出口)(忠孝東路側) 17 0 ## 557 500106111 YouBike2.0_國家音樂廳 22 2 ## 558 500106112 YouBike2.0_忠孝西重慶南路口 33 5 ## 559 500106113 YouBike2.0_濟南路二段8巷口 14 6 ## 560 500106114 YouBike2.0_仁愛金山路口(東南側) 14 8 ## 561 500106115 YouBike2.0_臺灣文學基地 15 2 ## 562 500106116 YouBike2.0_重慶南詔安街口 15 12 ## 563 500106117 YouBike2.0_文光公園 17 9 ## 564 500106118 YouBike2.0_捷運中正紀念堂站(2號出口) 12 3 ## 565 500106119 YouBike2.0_螢圃里小公園 19 11 ## 566 500106120 YouBike2.0_螢橋公園 15 14 ## 567 500106121 YouBike2.0_泉州寧波西街口 30 22 ## 568 500106122 YouBike2.0_和平西路二段98巷口 16 7 ## 569 500106123 YouBike2.0_仁愛新生路口(西南側) 18 17 ## 570 500106124 YouBike2.0_幸安市場 15 6 ## 571 500106125 YouBike2.0_龍口市場 14 9 ## 572 500107001 YouBike2.0_通北街65巷口 16 12 ## 573 500107002 YouBike2.0_圓山風景區 15 2 ## 574 500107003 YouBike2.0_樂群二堤頂大道口 20 6 ## 575 500107004 YouBike2.0_劍潭社區 13 7 ## 576 500107005 YouBike2.0_培英公園 40 14 ## 577 500107006 YouBike2.0_樂群二明水路口 20 4 ## 578 500107007 YouBike2.0_北安大直街口 31 6 ## 579 500107008 YouBike2.0_捷運劍南路站(2號出口) 86 38 ## 580 500107009 YouBike2.0_樂群二敬業三路口 20 14 ## 581 500107010 YouBike2.0_樂群二敬業四路口 36 27 ## 582 500107011 YouBike2.0_捷運大直站(3號出口) 34 30 ## 583 500107012 YouBike2.0_復興市民路口 52 9 ## 584 500107013 YouBike2.0_南京遼寧街口 42 1 ## 585 500107014 YouBike2.0_伊通長安路口 21 17 ## 586 500107015 YouBike2.0_新生長安路口 30 3 ## 587 500107016 YouBike2.0_市民林森路口 39 33 ## 588 500107017 YouBike2.0_南京新生路口 34 8 ## 589 500107018 YouBike2.0_一江公園 37 1 ## 590 500107019 YouBike2.0_松江公園 37 10 ## 591 500107020 YouBike2.0_新生長春路口 32 5 ## 592 500107021 YouBike2.0_第二果菜批發市場 40 19 ## 593 500107022 YouBike2.0_民生建國路口 33 0 ## 594 500107023 YouBike2.0_興安華城 62 55 ## 595 500107024 YouBike2.0_捷運中山國中站 62 0 ## 596 500107025 YouBike2.0_龍江錦州街口 16 10 ## 597 500107026 YouBike2.0_建國長春路口 16 9 ## 598 500107027 YouBike2.0_南京建國路口 42 2 ## 599 500107028 YouBike2.0_捷運松江南京站(7號出口) 75 0 ## 600 500107029 YouBike2.0_朱崙商場 37 27 ## 601 500107030 YouBike2.0_中吉公園 15 5 ## 602 500107031 YouBike2.0_華山公園 19 13 ## 603 500107032 YouBike2.0_建國北路一段17巷 45 13 ## 604 500107033 YouBike2.0_江寧公園 15 13 ## 605 500107034 YouBike2.0_民權龍江路口 32 24 ## 606 500107035 YouBike2.0_捷運中山國小站(2號出口) 59 5 ## 607 500107036 YouBike2.0_捷運行天宮站(3號出口) 42 7 ## 608 500107037 YouBike2.0_林森農安街口 17 9 ## 609 500107038 YouBike2.0_捷運中山國小站(4號出口) 20 6 ## 610 500107039 YouBike2.0_農安雙城街口 15 2 ## 611 500107040 YouBike2.0_新生德惠街口 15 15 ## 612 500107041 YouBike2.0_民族林森路口 37 21 ## 613 500107042 YouBike2.0_臺北市立美術館 24 17 ## 614 500107043 YouBike2.0_中山民族路口 16 5 ## 615 500107044 YouBike2.0_新生高架停車場(林森北路107巷口) 14 13 ## 616 500107045 YouBike2.0_南京林森路口(東南側) 10 10 ## 617 500107046 YouBike2.0_仁德公園 18 18 ## 618 500107047 YouBike2.0_中原公園 15 11 ## 619 500107048 YouBike2.0_下埤公園 24 13 ## 620 500107049 YouBike2.0_五常國中 16 15 ## 621 500107050 YouBike2.0_榮星花園 46 38 ## 622 500107051 YouBike2.0_民權建國路口 50 23 ## 623 500107052 YouBike2.0_松江路431巷口 15 6 ## 624 500107053 YouBike2.0_新喜公園 13 11 ## 625 500107054 YouBike2.0_吉林路407巷口 15 8 ## 626 500107055 YouBike2.0_民族松江路口 17 9 ## 627 500107056 YouBike2.0_林安泰古厝 36 3 ## 628 500107057 YouBike2.0_中山公民會館 20 10 ## 629 500107058 YouBike2.0_渭水八德路口 23 5 ## 630 500107059 YouBike2.0_捷運中山站(2號出口) 33 1 ## 631 500107060 YouBike2.0_撫順公園 30 1 ## 632 500107061 YouBike2.0_新生公園 29 25 ## 633 500107062 YouBike2.0_捷運行天宮站(1號出口) 46 6 ## 634 500107063 YouBike2.0_林森長春路口 28 1 ## 635 500107064 YouBike2.0_建國農安街口 50 29 ## 636 500107065 YouBike2.0_松江路77巷口 10 4 ## 637 500107066 YouBike2.0_建國長安路口 20 5 ## 638 500107067 YouBike2.0_市民新生路口 15 4 ## 639 500107068 YouBike2.0_民權吉林路口 15 9 ## 640 500107069 YouBike2.0_中山農安街口 17 11 ## 641 500107070 YouBike2.0_捷運行政大樓 14 4 ## 642 500107071 YouBike2.0_中吉公園(松江路188巷) 22 2 ## 643 500107072 YouBike2.0_吉林路123巷口 13 11 ## 644 500107074 YouBike2.0_中原民生路口 15 6 ## 645 500107075 YouBike2.0_國立臺北大學(臺北校區) 38 7 ## 646 500107076 YouBike2.0_錦州吉林路口 30 19 ## 647 500107077 YouBike2.0_中山北路二段59巷口 12 10 ## 648 500107078 YouBike2.0_永盛公園(民生東路一段23巷) 24 23 ## 649 500107079 YouBike2.0_新生錦州街口 20 8 ## 650 500107080 YouBike2.0_濱江街199巷口 15 7 ## 651 500107081 YouBike2.0_大佳社區公園 15 5 ## 652 500107082 YouBike2.0_濱江果菜市場 22 19 ## 653 500107083 YouBike2.0_興安合江路口 19 4 ## 654 500107084 YouBike2.0_復興北路514巷口東側 12 9 ## 655 500107085 YouBike2.0_台泥大樓 18 1 ## 656 500107086 YouBike2.0_植福樂群路口 10 2 ## 657 500107087 YouBike2.0_新興公園 26 6 ## 658 500107088 YouBike2.0_南京伊通街口 11 2 ## 659 500107089 YouBike2.0_南京龍江路口 15 4 ## 660 500107090 YouBike2.0_撫順街41巷(崇德宮前) 19 6 ## 661 500107091 YouBike2.0_臺北市立圖書館大直分館 20 9 ## 662 500107092 YouBike2.0_捷運大直站(1號出口) 27 5 ## 663 500107093 YouBike2.0_捷運松江南京站(4號出口) 32 0 ## 664 500107095 YouBike2.0_中429公園 15 6 ## 665 500107096 YouBike2.0_長春路137巷口 16 5 ## 666 500107097 YouBike2.0_松江民生路口 17 1 ## 667 500107098 YouBike2.0_松江路132巷口 14 2 ## 668 500107099 YouBike2.0_長春吉林路口 10 3 ## 669 500107100 YouBike2.0_長春一江街口 11 1 ## 670 500107101 YouBike2.0_捷運松江南京站(8號出口) 20 0 ## 671 500107102 YouBike2.0_南京一江街口 10 0 ## 672 500107103 YouBike2.0_松江長春路口 16 0 ## 673 500107104 YouBike2.0_經國七海文化園區 15 7 ## 674 500107105 YouBike2.0_民族玉門街口 20 3 ## 675 500107106 YouBike2.0_新生農安街口 15 13 ## 676 500107107 YouBike2.0_稻江高級護理家事職業學校 14 10 ## 677 500107108 YouBike2.0_捷運大直站(3號出口)_1 18 11 ## 678 500107109 YouBike2.0_樂群二明水路口_1 34 16 ## 679 500107110 YouBike2.0_民權吉林路口(南側) 16 11 ## 680 500107111 YouBike2.0_長春龍江路口 24 7 ## 681 500107112 YouBike2.0_民權新生路口 26 1 ## 682 500107113 YouBike2.0_建國長春路口(北側) 30 19 ## 683 500107114 YouBike2.0_中山行政中心 30 19 ## 684 500107115 YouBike2.0_臺北市立美術館_1 30 27 ## 685 500107116 YouBike2.0_劍潭社區_1 42 24 ## 686 500107117 YouBike2.0_濱江國小游泳池 16 5 ## 687 500107118 YouBike2.0_林森公園 32 15 ## 688 500107119 YouBike2.0_中428公園 15 5 ## 689 500107120 YouBike2.0_復華公園 20 4 ## 690 500107121 YouBike2.0_新生民族路口(西南側) 15 13 ## 691 500107122 YouBike2.0_捷運南京復興站(1號出口) 21 1 ## 692 500107123 YouBike2.0_八德市場(北側) 26 9 ## 693 500107124 YouBike2.0_龍江朱崙街口 14 1 ## 694 500107125 YouBike2.0_大直街94巷 15 9 ## 695 500107126 YouBike2.0_捷運南京復興站(8號出口) 25 3 ## 696 500107127 YouBike2.0_民權建國路口(南側) 15 5 ## 697 500107128 YouBike2.0_林森德惠街口 16 6 ## 698 500107129 YouBike2.0_新生濱江街口(東南側) 21 9 ## 699 500107130 YouBike2.0_新生北路一段62巷口 20 9 ## 700 500107131 YouBike2.0_新生長春路口(東北側) 19 1 ## 701 500107132 YouBike2.0_捷運劍南路站(1號出口) 21 8 ## 702 500107133 YouBike2.0_敬業三樂群三路口(西北側) 16 1 ## 703 500107134 YouBike2.0_長春路258巷2弄口 15 15 ## 704 500107135 YouBike2.0_長寧大廈社區(南側) 15 13 ## 705 500107136 YouBike2.0_建國五常街口 20 12 ## 706 500107137 YouBike2.0_中山北路二段62巷口 12 4 ## 707 500107138 YouBike2.0_市民安東街口 20 11 ## 708 500107139 YouBike2.0_市民大道二段5巷口 15 3 ## 709 500107140 YouBike2.0_捷運中山站(3號出口) 21 0 ## 710 500107141 YouBike2.0_建國北路高架橋下停車場G區 18 4 ## 711 500107142 YouBike2.0_朱崙公園 20 8 ## 712 500107143 YouBike2.0_朱崙復興北路口 12 4 ## 713 500107144 YouBike2.0_捷運行天宮站(4號出口) 30 20 ## 714 500107145 YouBike2.0_建國北路三段86巷口 15 11 ## 715 500107146 YouBike2.0_正守公園 15 13 ## 716 500107147 YouBike2.0_四平松江路口 18 1 ## 717 500107148 YouBike2.0_金泰公園 16 4 ## 718 500107149 YouBike2.0_北安通北街口 17 13 ## 719 500107150 YouBike2.0_民權東復興北路口(西北側) 20 4 ## 720 500107151 YouBike2.0_臺北市立大同高中 22 1 ## 721 500107153 YouBike2.0_北安明水路口(自強隧道) 12 5 ## 722 500108001 YouBike2.0_文湖街21巷118弄口 28 15 ## 723 500108002 YouBike2.0_北勢湖環保公園 15 5 ## 724 500108003 YouBike2.0_洲子一號公園 43 4 ## 725 500108004 YouBike2.0_西康公園 16 10 ## 726 500108005 YouBike2.0_文湖國小 43 18 ## 727 500108006 YouBike2.0_文湖街81巷10號西側 14 9 ## 728 500108007 YouBike2.0_德明財經科技大學 27 17 ## 729 500108008 YouBike2.0_麗山國小 18 10 ## 730 500108009 YouBike2.0_麗山高中 33 7 ## 731 500108010 YouBike2.0_港華五號公園 16 13 ## 732 500108011 YouBike2.0_大湖國小 25 6 ## 733 500108012 YouBike2.0_安湖三號公園 12 3 ## 734 500108013 YouBike2.0_東湖路113巷95弄 10 7 ## 735 500108014 YouBike2.0_瑞光計程車服務站 20 10 ## 736 500108015 YouBike2.0_文德三號公園(江南街71巷16弄) 15 10 ## 737 500108016 YouBike2.0_捷運大湖公園站(2號出口) 28 5 ## 738 500108018 YouBike2.0_康寧星雲街口 12 8 ## 739 500108019 YouBike2.0_星雲街47號 15 5 ## 740 500108020 YouBike2.0_捷運西湖站(1號出口) 23 0 ## 741 500108021 YouBike2.0_捷運西湖站(2號出口) 19 9 ## 742 500108022 YouBike2.0_洲子二號公園 60 18 ## 743 500108023 YouBike2.0_港都公園 15 4 ## 744 500108024 YouBike2.0_環山路二段26巷口 22 9 ## 745 500108025 YouBike2.0_成功金龍路口 29 13 ## 746 500108026 YouBike2.0_碧山公園 31 9 ## 747 500108027 YouBike2.0_金瑞公園 30 16 ## 748 500108028 YouBike2.0_捷運文德站(2號出口) 49 1 ## 749 500108029 YouBike2.0_陽光公園 16 6 ## 750 500108030 YouBike2.0_文德二號公園(南側) 13 10 ## 751 500108031 YouBike2.0_文德二號公園(北側) 15 0 ## 752 500108032 YouBike2.0_瑞陽公園 12 7 ## 753 500108033 YouBike2.0_湖光國宅 37 12 ## 754 500108034 YouBike2.0_潭美街213號 12 8 ## 755 500108035 YouBike2.0_南京東路六段180號 21 11 ## 756 500108036 YouBike2.0_潭美國小(南京舊宗路口) 16 7 ## 757 500108037 YouBike2.0_新明路343號 10 6 ## 758 500108038 YouBike2.0_週美里活動廣場 17 15 ## 759 500108039 YouBike2.0_內湖行政中心 25 19 ## 760 500108040 YouBike2.0_樂康公園 20 14 ## 761 500108041 YouBike2.0_安康路32巷24弄 21 6 ## 762 500108043 YouBike2.0_明美公園 30 9 ## 763 500108044 YouBike2.0_南京東路六段368巷 47 16 ## 764 500108045 YouBike2.0_新明成功路口 30 12 ## 765 500108046 YouBike2.0_民權瑞光路口 32 7 ## 766 500108047 YouBike2.0_瑞光公共住宅(瑞光路) 18 6 ## 767 500108048 YouBike2.0_民權東路六段15巷 28 6 ## 768 500108049 YouBike2.0_扶輪親恩公園 30 14 ## 769 500108050 YouBike2.0_新湖三民善街口 15 2 ## 770 500108051 YouBike2.0_內湖119號綠地 24 14 ## 771 500108052 YouBike2.0_行善公園 20 1 ## 772 500108054 YouBike2.0_三軍總醫院 34 13 ## 773 500108055 YouBike2.0_福華商場 25 14 ## 774 500108056 YouBike2.0_臺北市網球中心 34 10 ## 775 500108057 YouBike2.0_捷運葫洲站(1號出口) 37 27 ## 776 500108058 YouBike2.0_麗湖國小 27 14 ## 777 500108059 YouBike2.0_金湖路347巷125弄口 15 6 ## 778 500108060 YouBike2.0_碧湖公園 25 1 ## 779 500108061 YouBike2.0_碧湖公園(內湖路二段103巷) 19 9 ## 780 500108062 YouBike2.0_貿七社區 17 13 ## 781 500108063 YouBike2.0_內湖區農會 12 6 ## 782 500108064 YouBike2.0_捷運內湖站(2號出口) 10 1 ## 783 500108065 YouBike2.0_康寧金湖路口 14 5 ## 784 500108066 YouBike2.0_康寧路一段156巷20弄口 17 6 ## 785 500108067 YouBike2.0_安康公園 19 11 ## 786 500108068 YouBike2.0_安泰街83巷 34 13 ## 787 500108069 YouBike2.0_內溝溪生態展示館 16 5 ## 788 500108070 YouBike2.0_捷運港墘站(2號出口) 47 3 ## 789 500108071 YouBike2.0_東湖國中 42 11 ## 790 500108072 YouBike2.0_石潭公園(安康路) 20 6 ## 791 500108073 YouBike2.0_內湖垃圾焚化廠 20 7 ## 792 500108074 YouBike2.0_康寧公園(北側) 20 9 ## 793 500108075 YouBike2.0_康寧路三段54巷口 15 5 ## 794 500108076 YouBike2.0_行善路25巷口 21 15 ## 795 500108077 YouBike2.0_新明路460巷口 15 3 ## 796 500108078 YouBike2.0_下灣公園 30 13 ## 797 500108079 YouBike2.0_民權東路六段245巷口 12 5 ## 798 500108081 YouBike2.0_東湖國小 29 17 ## 799 500108082 YouBike2.0_捷運內湖站(1號出口) 28 9 ## 800 500108083 YouBike2.0_瑞光港墘路口 30 21 ## 801 500108084 YouBike2.0_瑞湖陽光街口 34 7 ## 802 500108085 YouBike2.0_金龍公園 15 5 ## 803 500108086 YouBike2.0_星雲街138巷1弄口 15 6 ## 804 500108087 YouBike2.0_東湖一號公園 10 6 ## 805 500108088 YouBike2.0_東湖二號公園 15 11 ## 806 500108089 YouBike2.0_康湖二號公園(康寧醫院) 16 11 ## 807 500108090 YouBike2.0_堤頂大道新湖一路口 13 4 ## 808 500108091 YouBike2.0_下灣公園(成功路) 16 5 ## 809 500108092 YouBike2.0_舊宗行善路口 9 0 ## 810 500108093 YouBike2.0_新湖二路250巷口 20 3 ## 811 500108094 YouBike2.0_成功路四段41巷口 12 6 ## 812 500108095 YouBike2.0_金湖星雲街口 30 11 ## 813 500108096 YouBike2.0_國防醫學院 15 7 ## 814 500108097 YouBike2.0_民權東路六段190巷117弄口 15 9 ## 815 500108098 YouBike2.0_內湖運動中心 21 10 ## 816 500108099 YouBike2.0_九華公園 16 9 ## 817 500108100 YouBike2.0_內湖路二段179巷口 16 9 ## 818 500108102 YouBike2.0_行善行愛路口 12 2 ## 819 500108103 YouBike2.0_民善新湖二路口(家樂福內湖店) 23 0 ## 820 500108104 YouBike2.0_統振大樓 25 11 ## 821 500108105 YouBike2.0_陽光街161巷口 16 9 ## 822 500108106 YouBike2.0_潭美公園(南京東路六段368巷) 18 13 ## 823 500108107 YouBike2.0_西康二號公園 21 11 ## 824 500108108 YouBike2.0_三民國中(民權東路六段47巷) 13 3 ## 825 500108109 YouBike2.0_瑞光路76巷口 12 2 ## 826 500108110 YouBike2.0_捷運東湖站 35 11 ## 827 500108111 YouBike2.0_新湖國小 12 4 ## 828 500108112 YouBike2.0_碧山內湖路口 16 16 ## 829 500108115 YouBike2.0_民權東路六段413巷 16 4 ## 830 500108116 YouBike2.0_宏匯瑞光廣場(瑞光路) 16 9 ## 831 500108117 YouBike2.0_宏匯瑞光廣場(港墘路) 20 11 ## 832 500108118 YouBike2.0_康樂街151巷 14 8 ## 833 500108119 YouBike2.0_內湖路一段360巷 15 8 ## 834 500108120 YouBike2.0_成功路三段83號前 11 10 ## 835 500108121 YouBike2.0_內湖路一段47巷 16 5 ## 836 500108122 YouBike2.0_陽光舊宗路口 20 4 ## 837 500108123 YouBike2.0_安湖公園 8 6 ## 838 500108124 YouBike2.0_湖興公園 16 3 ## 839 500108126 YouBike2.0_安泰街(康樂橋下) 15 7 ## 840 500108127 YouBike2.0_康樂綠地 15 9 ## 841 500108128 YouBike2.0_捷運港墘站(1號出口) 23 8 ## 842 500108129 YouBike2.0_明美公園(行善路333巷) 16 12 ## 843 500108130 YouBike2.0_行善路383巷 17 8 ## 844 500108131 YouBike2.0_舊宗新湖三路口 18 8 ## 845 500108132 YouBike2.0_內湖運動公園 17 9 ## 846 500108133 YouBike2.0_內湖路三段326巷口 15 5 ## 847 500108134 YouBike2.0_成功公園 11 8 ## 848 500108135 YouBike2.0_康寧路三段189巷93弄口 14 6 ## 849 500108136 YouBike2.0_中國醫藥大學附設醫院臺北分院 13 2 ## 850 500108137 YouBike2.0_康樂抽水站 15 9 ## 851 500108138 YouBike2.0_環山路三段16巷口 13 5 ## 852 500108139 YouBike2.0_文德一號綠地 15 5 ## 853 500108140 YouBike2.0_臺北花市 30 2 ## 854 500108141 YouBike2.0_行善社會住宅 23 2 ## 855 500108142 YouBike2.0_康寧路三段99巷17弄口 15 8 ## 856 500108143 YouBike2.0_堤頂大道二段407巷口 15 6 ## 857 500108144 YouBike2.0_海德堡科技大樓 12 9 ## 858 500108145 YouBike2.0_致伸科技大樓 17 10 ## 859 500108146 YouBike2.0_內湖路一段288巷口 20 7 ## 860 500108147 YouBike2.0_大都會客運內湖站 15 12 ## 861 500108148 YouBike2.0_瑞湖公園 15 6 ## 862 500108150 YouBike2.0_台灣世曦大樓 16 3 ## 863 500108151 YouBike2.0_遠雄時代總部 14 2 ## 864 500108152 YouBike2.0_瑞光路358巷口 14 6 ## 865 500108153 YouBike2.0_大港墘公園(洲子街) 18 7 ## 866 500108154 YouBike2.0_世紀經貿 16 13 ## 867 500108156 YouBike2.0_民權東路六段56巷口 15 6 ## 868 500108157 YouBike2.0_新湖三行忠路72巷口 15 4 ## 869 500108158 YouBike2.0_新湖三新湖二146巷口 15 2 ## 870 500108159 YouBike2.0_舊宗新湖二路口 17 2 ## 871 500108160 YouBike2.0_新光基湖大樓 19 9 ## 872 500108161 YouBike2.0_內湖路一段120巷15弄 19 8 ## 873 500108162 YouBike2.0_北勢湖環保公園(堤頂大道側) 14 3 ## 874 500108164 YouBike2.0_達爾文大樓 15 6 ## 875 500108165 YouBike2.0_東湖四號公園 15 6 ## 876 500108166 YouBike2.0_加瑪科技中心 13 2 ## 877 500108167 YouBike2.0_福壽公園 14 9 ## 878 500108168 YouBike2.0_捷運西湖站(1號出口)內湖路側 13 1 ## 879 500108169 YouBike2.0_威剛科技總部 25 9 ## 880 500108170 YouBike2.0_太陽科技廣場 15 3 ## 881 500108171 YouBike2.0_瑞光路316巷 20 3 ## 882 500108172 YouBike2.0_文德路220巷口 15 8 ## 883 500108173 YouBike2.0_長壽抽水站 15 4 ## 884 500108174 YouBike2.0_捷運葫洲站(2號出口) 18 7 ## 885 500108175 YouBike2.0_五分埤 16 2 ## 886 500108176 YouBike2.0_環山路三段1巷(麗山高中) 18 9 ## 887 500108177 YouBike2.0_潭美公園(南京東路六段482號) 29 3 ## 888 500109001 YouBike2.0_承德路七段304巷口 20 15 ## 889 500109002 YouBike2.0_洲美運動公園 20 7 ## 890 500109003 YouBike2.0_榮華二明德路口 30 15 ## 891 500109004 YouBike2.0_捷運明德站(1號出口) 23 8 ## 892 500109005 YouBike2.0_文林建民路口 25 18 ## 893 500109006 YouBike2.0_永欣綠地 37 14 ## 894 500109007 YouBike2.0_關渡宮 40 31 ## 895 500109008 YouBike2.0_關渡自然公園 25 6 ## 896 500109009 YouBike2.0_關渡醫院 14 5 ## 897 500109010 YouBike2.0_捷運忠義站(1號出口) 30 15 ## 898 500109011 YouBike2.0_捷運關渡站(1號出口) 54 31 ## 899 500109012 YouBike2.0_捷運關渡站(2號出口) 14 1 ## 900 500109013 YouBike2.0_中央北路四段540巷口 27 12 ## 901 500109014 YouBike2.0_大度立德路口 18 13 ## 902 500109015 YouBike2.0_捷運復興崗站(1號出口) 45 12 ## 903 500109016 YouBike2.0_捷運復興崗站旅客服務中心 15 6 ## 904 500109017 YouBike2.0_豐年公園 20 9 ## 905 500109018 YouBike2.0_稻香重三路口 15 2 ## 906 500109019 YouBike2.0_國防大學政治作戰學院 45 23 ## 907 500109020 YouBike2.0_秀山區民活動中心 36 15 ## 908 500109022 YouBike2.0_大業大同街口 42 17 ## 909 500109023 YouBike2.0_捷運新北投站 42 26 ## 910 500109024 YouBike2.0_捷運北投站 30 6 ## 911 500109025 YouBike2.0_捷運奇岩站(三合街) 40 6 ## 912 500109026 YouBike2.0_八仙里辦公處 16 5 ## 913 500109027 YouBike2.0_清江國小 58 41 ## 914 500109028 YouBike2.0_大業路300巷口 20 6 ## 915 500109029 YouBike2.0_立農公園 21 16 ## 916 500109030 YouBike2.0_北投奇岩長青樂活大樓 15 1 ## 917 500109031 YouBike2.0_捷運唭哩岸站(2號出口) 54 29 ## 918 500109032 YouBike2.0_北投運動中心 60 10 ## 919 500109033 YouBike2.0_陽明大學 53 16 ## 920 500109034 YouBike2.0_捷運石牌站(2號出口) 62 40 ## 921 500109035 YouBike2.0_台北護理大學 42 9 ## 922 500109036 YouBike2.0_捷運石牌站(1號出口) 33 18 ## 923 500109037 YouBike2.0_振興醫院 36 11 ## 924 500109039 YouBike2.0_石牌國小 26 8 ## 925 500109040 YouBike2.0_振興公園 13 8 ## 926 500109041 YouBike2.0_立農國小 19 11 ## 927 500109042 YouBike2.0_承德路七段280巷口 17 10 ## 928 500109043 YouBike2.0_致遠一路二段11巷 22 13 ## 929 500109044 YouBike2.0_榮富公園 13 3 ## 930 500109045 YouBike2.0_中正高中 31 6 ## 931 500109046 YouBike2.0_立功立德路口 41 23 ## 932 500109047 YouBike2.0_中央北路四段30巷口 16 4 ## 933 500109048 YouBike2.0_陽明交大圖書館 37 13 ## 934 500109049 YouBike2.0_捷運新北投站(2號出口) 11 3 ## 935 500109050 YouBike2.0_復興公園 14 5 ## 936 500109051 YouBike2.0_承德石牌路口 17 3 ## 937 500109052 YouBike2.0_承德路七段188巷口 16 10 ## 938 500109053 YouBike2.0_捷運明德站(3號出口) 48 3 ## 939 500109054 YouBike2.0_大豐公園 39 22 ## 940 500109055 YouBike2.0_洲美公園 30 23 ## 941 500109056 YouBike2.0_中和街455巷11弄 13 4 ## 942 500109057 YouBike2.0_洲美蜆仔港公園 20 5 ## 943 500109058 YouBike2.0_文化三杏林一路口 17 11 ## 944 500109059 YouBike2.0_珠海復興一路口 15 10 ## 945 500109060 YouBike2.0_裕民二路33巷 15 8 ## 946 500109061 YouBike2.0_新奇岩社會住宅 12 8 ## 947 500109062 YouBike2.0_泉源公園 15 10 ## 948 500109063 YouBike2.0_奇岩4號綠地 12 8 ## 949 500109064 YouBike2.0_臺北健康護理大學(教研大樓) 15 5 ## 950 500109065 YouBike2.0_奇岩一號公園 24 0 ## 951 500109066 YouBike2.0_福星公園 18 2 ## 952 500109067 YouBike2.0_中庸公園 12 10 ## 953 500109068 YouBike2.0_豐年公園_1 33 17 ## 954 500109070 YouBike2.0_光明溫泉路口 20 12 ## 955 500109071 YouBike2.0_和信治癌中心醫院 18 8 ## 956 500109072 YouBike2.0_致遠新村 15 5 ## 957 500109073 YouBike2.0_北投公園露天溫泉 15 8 ## 958 500109074 YouBike2.0_中和街493巷9弄口 16 4 ## 959 500109075 YouBike2.0_捷運北投站(1號出口) 58 14 ## 960 500109076 YouBike2.0_石牌立農街口 29 3 ## 961 500109077 YouBike2.0_捷運唭哩岸站(1號出口) 20 13 ## 962 500109078 YouBike2.0_大興光明路2巷口 14 7 ## 963 500109079 YouBike2.0_捷運忠義站(2號出口) 20 11 ## 964 500109080 YouBike2.0_福國承德路口 15 10 ## 965 500109081 YouBike2.0_捷運北投站(1號出口)(北投路側) 31 0 ## 966 500109082 YouBike2.0_華固創富中心 15 5 ## 967 500109084 YouBike2.0_崇仰公園(公舘路255巷) 20 10 ## 968 500109085 YouBike2.0_北投文化公園(北側) 15 4 ## 969 500109086 YouBike2.0_中和綠地 13 4 ## 970 500109087 YouBike2.0_大業路65巷口 15 12 ## 971 500109088 YouBike2.0_公舘承德路口 17 9 ## 972 500109089 YouBike2.0_文林北明德路口(東北側) 15 5 ## 973 500109091 YouBike2.0_永興路一段32巷口 12 6 ## 974 500109093 YouBike2.0_關渡國中 24 16 ## 975 500109094 YouBike2.0_立功街55巷口 14 7 ## 976 500109095 YouBike2.0_承德路七段401巷(洲美橋下) 15 9 ## 977 500109096 YouBike2.0_大業路(農禪寺) 16 11 ## 978 500110002 YouBike2.0_捷運松山站(4號出口) 19 2 ## 979 500110003 YouBike2.0_塔悠八德路口 34 24 ## 980 500110004 YouBike2.0_鵬程公園 24 19 ## 981 500110005 YouBike2.0_中崙高中 50 13 ## 982 500110006 YouBike2.0_捷運南京三民站(2號出口) 19 0 ## 983 500110007 YouBike2.0_捷運南京三民站(1號出口) 39 1 ## 984 500110008 YouBike2.0_光復北路11巷口 23 3 ## 985 500110009 YouBike2.0_捷運南京三民站(4號出口) 13 2 ## 986 500110010 YouBike2.0_西松高中 14 7 ## 987 500110011 YouBike2.0_民權復興路口 36 5 ## 988 500110012 YouBike2.0_民福三號綠地 15 12 ## 989 500110013 YouBike2.0_民有一號公園 41 22 ## 990 500110014 YouBike2.0_民生敦化路口 66 52 ## 991 500110015 YouBike2.0_松基公園 20 1 ## 992 500110016 YouBike2.0_三民路166巷口 12 11 ## 993 500110017 YouBike2.0_民生活動中心 43 25 ## 994 500110018 YouBike2.0_捷運小巨蛋站(2號出口) 26 1 ## 995 500110019 YouBike2.0_臺北市藝文推廣處 45 16 ## 996 500110020 YouBike2.0_民生國小(敦化北路199巷) 20 18 ## 997 500110021 YouBike2.0_敦北公園 48 4 ## 998 500110022 YouBike2.0_民權運動公園 44 26 ## 999 500110023 YouBike2.0_新東公園 36 11 ## 1000 500110024 YouBike2.0_民生光復路口 33 25 ## 1001 500110025 YouBike2.0_三民公園 27 19 ## 1002 500110026 YouBike2.0_八德路三段74巷口 17 3 ## 1003 500110027 YouBike2.0_八德路三段8巷口 15 0 ## 1004 500110028 YouBike2.0_三軍總醫院(松山分院) 44 0 ## 1005 500110029 YouBike2.0_平安新城 16 11 ## 1006 500110030 YouBike2.0_健康社會住宅 20 7 ## 1007 500110031 YouBike2.0_民權光復路口(東北側) 24 8 ## 1008 500110032 YouBike2.0_市民東興路口 30 15 ## 1009 500110033 YouBike2.0_光復南路22巷口 29 24 ## 1010 500110034 YouBike2.0_光復南路58巷 12 9 ## 1011 500110035 YouBike2.0_松山新城 14 8 ## 1012 500110036 YouBike2.0_內政部營建署 33 19 ## 1013 500110037 YouBike2.0_南京光復路口 31 1 ## 1014 500110038 YouBike2.0_民生立體停車場 24 18 ## 1015 500110039 YouBike2.0_健康新城 44 28 ## 1016 500110040 YouBike2.0_健安新城 30 12 ## 1017 500110041 YouBike2.0_復盛公園 37 20 ## 1018 500110042 YouBike2.0_中崙福成宮 31 2 ## 1019 500110043 YouBike2.0_捷運南京復興站(7號出口) 15 8 ## 1020 500110044 YouBike2.0_捷運南京復興站(5號出口) 52 16 ## 1021 500110045 YouBike2.0_塔悠疏散門 32 12 ## 1022 500110046 YouBike2.0_臺北田徑場 47 26 ## 1023 500110047 YouBike2.0_捷運小巨蛋站(5號出口) 22 3 ## 1024 500110048 YouBike2.0_敦化長春路口 34 24 ## 1025 500110049 YouBike2.0_饒河疏散門(基四號疏散門) 19 2 ## 1026 500110050 YouBike2.0_捷運松山站(2號出口) 14 7 ## 1027 500110051 YouBike2.0_民權東路三段106巷口 22 7 ## 1028 500110052 YouBike2.0_南京東路五段59巷口 11 8 ## 1029 500110053 YouBike2.0_三民公園(塔悠路) 20 9 ## 1030 500110054 YouBike2.0_寶清公園 13 12 ## 1031 500110055 YouBike2.0_西松公園 11 7 ## 1032 500110056 YouBike2.0_長壽公園 15 11 ## 1033 500110057 YouBike2.0_復源公園 14 14 ## 1034 500110058 YouBike2.0_南京東路四段179巷口 13 6 ## 1035 500110059 YouBike2.0_臺北田徑場(北寧路側) 38 13 ## 1036 500110060 YouBike2.0_西松高中(健康路325巷) 31 10 ## 1037 500110061 YouBike2.0_南京東興路口 30 3 ## 1038 500110062 YouBike2.0_捷運松山站(3號出口) 52 5 ## 1039 500110063 YouBike2.0_介壽國中 12 12 ## 1040 500110064 YouBike2.0_敦化南京路口(東北側) 14 0 ## 1041 500110065 YouBike2.0_敦化八德路口 20 13 ## 1042 500110066 YouBike2.0_新東街51巷口 30 9 ## 1043 500110067 YouBike2.0_八德立體停車場 34 10 ## 1044 500110068 YouBike2.0_長春慶城街口 16 7 ## 1045 500110069 YouBike2.0_八德路四段652巷口 20 16 ## 1046 500110070 YouBike2.0_捷運松山站(1號出口) 15 5 ## 1047 500110071 YouBike2.0_捷運小巨蛋站(3號出口) 28 6 ## 1048 500110072 YouBike2.0_捷運小巨蛋站(5號出口)_1 20 0 ## 1049 500110073 YouBike2.0_敦化北路155巷口 30 1 ## 1050 500110074 YouBike2.0_民生復興路口 17 10 ## 1051 500110076 YouBike2.0_市民延吉街口 30 12 ## 1052 500110077 YouBike2.0_龍城市場 15 14 ## 1053 500110078 YouBike2.0_捷運南京三民站(3號出口) 28 0 ## 1054 500110079 YouBike2.0_塔悠基隆路口(麥帥一橋下) 20 5 ## 1055 500110080 YouBike2.0_五常街370巷 11 3 ## 1056 500110081 YouBike2.0_延壽街119巷口 15 14 ## 1057 500110082 YouBike2.0_市民東寧路口 15 4 ## 1058 500110083 YouBike2.0_民福簡易綠地 15 10 ## 1059 500110084 YouBike2.0_三民國小(撫遠街) 20 16 ## 1060 500110085 YouBike2.0_民生郵局 14 13 ## 1061 500110086 YouBike2.0_民權敦化路口(西北側) 24 7 ## 1062 500111001 YouBike2.0_南港公園(東新街) 20 7 ## 1063 500111002 YouBike2.0_南港公園(福德街) 56 48 ## 1064 500111003 YouBike2.0_捷運昆陽站(1號出口) 65 8 ## 1065 500111004 YouBike2.0_忠孝東路六段225巷口 35 30 ## 1066 500111005 YouBike2.0_捷運後山埤站(1號出口) 53 13 ## 1067 500111006 YouBike2.0_合樂公園 15 3 ## 1068 500111007 YouBike2.0_合心廣場 43 30 ## 1069 500111008 YouBike2.0_成德國中 44 9 ## 1070 500111009 YouBike2.0_玉成公園 36 13 ## 1071 500111010 YouBike2.0_研究院舊莊街口 30 11 ## 1072 500111011 YouBike2.0_中研院綜合體育館東側 30 20 ## 1073 500111012 YouBike2.0_國家生技園區 30 6 ## 1074 500111013 YouBike2.0_捷運南港展覽館站(5號出口) 73 3 ## 1075 500111014 YouBike2.0_中研公園 40 27 ## 1076 500111015 YouBike2.0_福山公園 25 25 ## 1077 500111016 YouBike2.0_舊莊區民活動中心 25 11 ## 1078 500111017 YouBike2.0_凌雲市場 25 13 ## 1079 500111018 YouBike2.0_市民大道八段532號 15 6 ## 1080 500111019 YouBike2.0_捷運南港軟體園區(2號出口) 37 20 ## 1081 500111020 YouBike2.0_南港國小 41 12 ## 1082 500111021 YouBike2.0_興中立體停車場(興中路) 26 18 ## 1083 500111022 YouBike2.0_臺北市立圖書館南港分館 40 25 ## 1084 500111023 YouBike2.0_東陽公園 30 23 ## 1085 500111024 YouBike2.0_向陽南港路口 27 9 ## 1086 500111025 YouBike2.0_南港車站(忠孝東路七段415巷) 11 9 ## 1087 500111026 YouBike2.0_捷運南港站(2號出口) 14 5 ## 1088 500111027 YouBike2.0_捷運南港站(1號出口) 20 11 ## 1089 500111028 YouBike2.0_東新國小 22 13 ## 1090 500111029 YouBike2.0_中華科技大學 20 5 ## 1091 500111030 YouBike2.0_六福公園 19 18 ## 1092 500111031 YouBike2.0_南港加壓站 24 7 ## 1093 500111032 YouBike2.0_臺北流行音樂中心(南港路) 21 11 ## 1094 500111033 YouBike2.0_興南公園 26 19 ## 1095 500111034 YouBike2.0_臺北流行音樂中心(市民大道) 21 2 ## 1096 500111035 YouBike2.0_南港車站(市民大道) 30 5 ## 1097 500111036 YouBike2.0_忠孝東路七段527巷口 15 9 ## 1098 500111037 YouBike2.0_南港軟體園區(新民街) 19 11 ## 1099 500111038 YouBike2.0_世貿公園 35 8 ## 1100 500111039 YouBike2.0_凌雲五村(研究院路三段8巷) 26 25 ## 1101 500111040 YouBike2.0_新新公園(昆陽街60巷) 20 16 ## 1102 500111041 YouBike2.0_南港高中(昆陽街) 14 10 ## 1103 500111042 YouBike2.0_南港路三段290巷口 20 11 ## 1104 500111043 YouBike2.0_南港路三段220巷口 25 9 ## 1105 500111044 YouBike2.0_南港東新街口 28 11 ## 1106 500111045 YouBike2.0_八德中坡路口 40 24 ## 1107 500111046 YouBike2.0_捷運後山埤站(3號出口) 12 0 ## 1108 500111047 YouBike2.0_玉成公園運動中心 15 7 ## 1109 500111048 YouBike2.0_百福公園 18 14 ## 1110 500111049 YouBike2.0_南湖大橋(經貿二路255巷) 20 11 ## 1111 500111050 YouBike2.0_園區重陽路口 13 11 ## 1112 500111051 YouBike2.0_南港車站B棟(市民大道) 16 7 ## 1113 500111052 YouBike2.0_胡適公園 20 10 ## 1114 500111053 YouBike2.0_南港抽水站 13 9 ## 1115 500111054 YouBike2.0_經貿公園 20 16 ## 1116 500111055 YouBike2.0_育成高中 20 7 ## 1117 500111056 YouBike2.0_捷運南港展覽館站(7號出口) 20 7 ## 1118 500111057 YouBike2.0_力行橋(南港) 18 5 ## 1119 500111058 YouBike2.0_舊莊國小(舊莊街一段) 15 3 ## 1120 500111059 YouBike2.0_向陽公園 17 6 ## 1121 500111060 YouBike2.0_小彎社會住宅 51 28 ## 1122 500111061 YouBike2.0_捷運南港展覽館站(6號出口) 25 8 ## 1123 500111062 YouBike2.0_捷運南港展覽館站(4號出口) 22 12 ## 1124 500111063 YouBike2.0_成德綠地 17 10 ## 1125 500111064 YouBike2.0_南港公園(東新街170巷) 16 6 ## 1126 500111065 YouBike2.0_中坡市民路口(東北側) 19 12 ## 1127 500111066 YouBike2.0_昆陽公園 14 8 ## 1128 500111067 YouBike2.0_南港路二段178巷口 18 12 ## 1129 500111068 YouBike2.0_南港車站(忠孝東路) 24 20 ## 1130 500111069 YouBike2.0_南港車站(興華路) 48 14 ## 1131 500111070 YouBike2.0_玉成公園(成福路178巷口) 18 8 ## 1132 500111071 YouBike2.0_玉東公園(東新街) 14 11 ## 1133 500111072 YouBike2.0_南港出租國宅社區 25 14 ## 1134 500111073 YouBike2.0_成福路197巷口 15 8 ## 1135 500111074 YouBike2.0_南港疏散門(基三號疏散門) 15 11 ## 1136 500111075 YouBike2.0_成德立體停車場 14 7 ## 1137 500111076 YouBike2.0_南港展覽館2館 18 8 ## 1138 500111077 YouBike2.0_舊莊派出所 15 10 ## 1139 500111078 YouBike2.0_南港路三段80巷 15 10 ## 1140 500111079 YouBike2.0_捷運昆陽站(4號出口) 28 2 ## 1141 500111080 YouBike2.0_忠孝東路六段278巷口 14 4 ## 1142 500111081 YouBike2.0_中研院人文社會科學館 20 0 ## 1143 500111082 YouBike2.0_南港路三段130巷口 12 12 ## 1144 500111083 YouBike2.0_南港路三段190巷口 16 14 ## 1145 500111084 YouBike2.0_忠孝東路六段212巷口 15 15 ## 1146 500111085 YouBike2.0_新富公園 13 0 ## 1147 500111086 YouBike2.0_東新街63巷口 15 10 ## 1148 500111087 YouBike2.0_中興公園 15 10 ## 1149 500111088 YouBike2.0_向陽市民大道路口(西北側) 13 4 ## 1150 500111089 YouBike2.0_向陽南港路口(西北側) 16 3 ## 1151 500111090 YouBike2.0_研究院路一段151巷口 14 5 ## 1152 500111113 YouBike2.0_內湖機廠(港東街) 15 11 ## 1153 500112001 YouBike2.0_黎忠區民活動中心 16 11 ## 1154 500112002 YouBike2.0_基隆路二段159巷口 14 14 ## 1155 500112003 YouBike2.0_嘉興街175巷口 16 12 ## 1156 500112004 YouBike2.0_和平東路三段631巷口 15 5 ## 1157 500112005 YouBike2.0_和平東路三段530巷口 15 4 ## 1158 500112006 YouBike2.0_景勤二號公園 41 15 ## 1159 500112007 YouBike2.0_臺北醫學大學 64 7 ## 1160 500112008 YouBike2.0_三興公園 47 29 ## 1161 500112009 YouBike2.0_松德站 48 35 ## 1162 500112010 YouBike2.0_捷運象山站(2號出口) 31 0 ## 1163 500112011 YouBike2.0_象山公園 48 0 ## 1164 500112012 YouBike2.0_松仁路253巷3弄 25 19 ## 1165 500112013 YouBike2.0_興雅國中 18 7 ## 1166 500112014 YouBike2.0_捷運象山站(1號出口) 24 1 ## 1167 500112015 YouBike2.0_松德路200巷 41 21 ## 1168 500112016 YouBike2.0_中全公園 34 15 ## 1169 500112017 YouBike2.0_台北市災害應變中心 53 32 ## 1170 500112018 YouBike2.0_信義運動中心 35 9 ## 1171 500112019 YouBike2.0_捷運台北101/世貿站(3號出口) 15 0 ## 1172 500112020 YouBike2.0_景新公園 17 8 ## 1173 500112021 YouBike2.0_光復信義路口東南側 16 13 ## 1174 500112022 YouBike2.0_三張犁 56 15 ## 1175 500112023 YouBike2.0_仁愛路四段496巷口 34 8 ## 1176 500112024 YouBike2.0_松山工農 34 10 ## 1177 500112025 YouBike2.0_松友公園 31 20 ## 1178 500112026 YouBike2.0_林口公園 51 28 ## 1179 500112027 YouBike2.0_松山家商 25 4 ## 1180 500112028 YouBike2.0_永春陂濕地公園 23 22 ## 1181 500112029 YouBike2.0_臺北市政府 63 19 ## 1182 500112030 YouBike2.0_松智松壽路口 39 20 ## 1183 500112031 YouBike2.0_市府松壽路口 28 14 ## 1184 500112032 YouBike2.0_市府松高路口 54 12 ## 1185 500112033 YouBike2.0_市民廣場 44 2 ## 1186 500112035 YouBike2.0_信義廣場(台北101) 96 27 ## 1187 500112036 YouBike2.0_捷運台北101/世貿站(5號出口) 15 0 ## 1188 500112037 YouBike2.0_春光公園 41 15 ## 1189 500112038 YouBike2.0_松仁路121巷口 31 9 ## 1190 500112039 YouBike2.0_福德國小 36 20 ## 1191 500112040 YouBike2.0_福德公園 35 31 ## 1192 500112042 YouBike2.0_松高路(信義新天地A4館) 17 0 ## 1193 500112043 YouBike2.0_興雅松仁路口 65 8 ## 1194 500112044 YouBike2.0_福祥公園 19 16 ## 1195 500112045 YouBike2.0_吳興公車總站 56 44 ## 1196 500112046 YouBike2.0_泰和公園 40 15 ## 1197 500112047 YouBike2.0_興雅國小(基隆路一段37巷) 27 19 ## 1198 500112048 YouBike2.0_雅祥公園(松信路50巷口) 12 8 ## 1199 500112049 YouBike2.0_松山車站 70 19 ## 1200 500112050 YouBike2.0_五常公園 37 29 ## 1201 500112051 YouBike2.0_永吉松信路口 35 21 ## 1202 500112052 YouBike2.0_三興國小 22 8 ## 1203 500112053 YouBike2.0_市民松信路口 20 19 ## 1204 500112054 YouBike2.0_松山高中 42 0 ## 1205 500112055 YouBike2.0_基隆光復路口 31 6 ## 1206 500112056 YouBike2.0_基隆忠孝路口西南側 14 0 ## 1207 500112057 YouBike2.0_泰和里民活動中心 18 2 ## 1208 500112058 YouBike2.0_捷運後山埤站(2號出口) 22 1 ## 1209 500112059 YouBike2.0_虎林永吉路口 15 6 ## 1210 500112060 YouBike2.0_永吉公園 18 7 ## 1211 500112061 YouBike2.0_永吉路321巷口 15 5 ## 1212 500112062 YouBike2.0_松山永吉路口 20 11 ## 1213 500112063 YouBike2.0_松山路292巷口 17 11 ## 1214 500112064 YouBike2.0_捷運象山站(3號出口) 51 13 ## 1215 500112065 YouBike2.0_松德公園 40 12 ## 1216 500112066 YouBike2.0_世貿三館 54 11 ## 1217 500112067 YouBike2.0_松德虎林街口 30 20 ## 1218 500112068 YouBike2.0_富台公園 32 10 ## 1219 500112069 YouBike2.0_基隆路一段101巷口 32 20 ## 1220 500112070 YouBike2.0_捷運永春站(2號出口) 30 0 ## 1221 500112071 YouBike2.0_吳興街260巷 32 10 ## 1222 500112072 YouBike2.0_松山家商(林口街) 47 22 ## 1223 500112073 YouBike2.0_仁愛逸仙路口 38 6 ## 1224 500112074 YouBike2.0_安強公園 20 16 ## 1225 500112075 YouBike2.0_信義基隆路口 26 1 ## 1226 500112076 YouBike2.0_捷運台北101/世貿站(2號出口) 52 2 ## 1227 500112078 YouBike2.0_吳興街284巷36弄口 25 13 ## 1228 500112079 YouBike2.0_協和祐德高級中學 20 5 ## 1229 500112080 YouBike2.0_福德國小公車站 10 10 ## 1230 500112081 YouBike2.0_松仁路95巷口 60 22 ## 1231 500112082 YouBike2.0_臺北南山廣場_1 68 14 ## 1232 500112083 YouBike2.0_景聯廣場 13 0 ## 1233 500112084 YouBike2.0_景平公園 13 8 ## 1234 500112085 YouBike2.0_捷運市政府站(3號出口) 92 2 ## 1235 500112086 YouBike2.0_五分埔公園 18 7 ## 1236 500112087 YouBike2.0_松仁路305號 14 11 ## 1237 500112088 YouBike2.0_吳興街394巷口 12 7 ## 1238 500112089 YouBike2.0_忠孝東路五段215巷口 24 14 ## 1239 500112090 YouBike2.0_松勤莊敬路口 15 0 ## 1240 500112091 YouBike2.0_松仁松平路口 10 4 ## 1241 500112092 YouBike2.0_信義松德路口 18 16 ## 1242 500112093 YouBike2.0_捷運市政府站(4號出口) 14 0 ## 1243 500112094 YouBike2.0_吳興街284巷(廣安宮) 15 12 ## 1244 500112095 YouBike2.0_景勤二號公園(西南側) 22 18 ## 1245 500112096 YouBike2.0_克勤新村 18 10 ## 1246 500112097 YouBike2.0_和平東路三段291號 15 14 ## 1247 500112098 YouBike2.0_永吉路468巷口 13 9 ## 1248 500112099 YouBike2.0_廣慈博愛園區(西側) 23 14 ## 1249 500112100 YouBike2.0_和平東路三段341巷口 16 12 ## 1250 500112101 YouBike2.0_革新公園 14 2 ## 1251 500112102 YouBike2.0_黎雙公園 17 11 ## 1252 500112103 YouBike2.0_臺北文化體育園區辦公大樓 33 1 ## 1253 500112104 YouBike2.0_捷運國父紀念館站(5號出口) 23 0 ## 1254 500112105 YouBike2.0_光復南菸廠路口 25 1 ## 1255 500112106 YouBike2.0_中坡北永吉路口 15 7 ## 1256 500112107 YouBike2.0_松仁路281巷66弄 20 14 ## 1257 500112108 YouBike2.0_基隆市民路口 26 16 ## 1258 500113001 YouBike2.0_德昌寶興街口(西北角) 14 2 ## 1259 500113002 YouBike2.0_寶興長泰街口(西南角) 17 4 ## 1260 500113003 YouBike2.0_萬大路486巷口 10 4 ## 1261 500113004 YouBike2.0_國興中華路口 14 5 ## 1262 500113005 YouBike2.0_古亭國中 25 16 ## 1263 500113006 YouBike2.0_國興水源路口 14 4 ## 1264 500113007 YouBike2.0_青年公園高爾夫球場 16 7 ## 1265 500113008 YouBike2.0_國興青年路口 43 26 ## 1266 500113009 YouBike2.0_青年公園棒球場 28 9 ## 1267 500113010 YouBike2.0_青年公園籃球場 16 9 ## 1268 500113012 YouBike2.0_復華花園新城 38 24 ## 1269 500113013 YouBike2.0_新和國小 20 11 ## 1270 500113014 YouBike2.0_莒光郵局 16 3 ## 1271 500113015 YouBike2.0_莒光立體停車場 10 4 ## 1272 500113016 YouBike2.0_艋舺大道146巷口 14 4 ## 1273 500113017 YouBike2.0_東園國小 33 18 ## 1274 500113018 YouBike2.0_華中疏散門 12 1 ## 1275 500113019 YouBike2.0_錦德公園 29 15 ## 1276 500113020 YouBike2.0_忠德公園 19 10 ## 1277 500113022 YouBike2.0_華江高中 50 36 ## 1278 500113023 YouBike2.0_西園艋舺路口 50 17 ## 1279 500113025 YouBike2.0_雙園國中 24 12 ## 1280 500113026 YouBike2.0_長順區民活動中心 26 15 ## 1281 500113027 YouBike2.0_華江國小 23 13 ## 1282 500113028 YouBike2.0_華江八號公園 20 15 ## 1283 500113029 YouBike2.0_環河南雙園街口 15 6 ## 1284 500113030 YouBike2.0_大理高中 35 20 ## 1285 500113031 YouBike2.0_糖廍文化園區 14 9 ## 1286 500113032 YouBike2.0_兩棵樹公園 19 9 ## 1287 500113033 YouBike2.0_萬華青年公宅 23 11 ## 1288 500113034 YouBike2.0_開封西寧路口 41 22 ## 1289 500113035 YouBike2.0_峨眉停車場 47 9 ## 1290 500113036 YouBike2.0_長沙公園 30 5 ## 1291 500113037 YouBike2.0_貓公園(中興橋頭) 15 0 ## 1292 500113038 YouBike2.0_西本願寺廣場 87 1 ## 1293 500113039 YouBike2.0_中華桂林路口 34 7 ## 1294 500113040 YouBike2.0_捷運龍山寺站(1號出口) 30 2 ## 1295 500113041 YouBike2.0_龍山國小 30 11 ## 1296 500113042 YouBike2.0_華西公園 39 24 ## 1297 500113043 YouBike2.0_老松國小 50 31 ## 1298 500113044 YouBike2.0_萬華火車站 53 15 ## 1299 500113045 YouBike2.0_萬華火車站(D2廣場) 17 2 ## 1300 500113046 YouBike2.0_捷運龍山寺站(3號出口) 23 0 ## 1301 500113047 YouBike2.0_臺北市電影主題公園(峨眉街) 15 2 ## 1302 500113048 YouBike2.0_臺北市電影主題公園(康定路) 15 5 ## 1303 500113049 YouBike2.0_中華峨眉街口 24 12 ## 1304 500113050 YouBike2.0_萬華266號綠地 15 8 ## 1305 500113051 YouBike2.0_萬大國小(萬大路344巷口) 18 1 ## 1306 500113052 YouBike2.0_德昌街10巷口 10 6 ## 1307 500113053 YouBike2.0_環河南和平西路口 20 15 ## 1308 500113054 YouBike2.0_長順街60巷口 15 7 ## 1309 500113055 YouBike2.0_西園公園 14 6 ## 1310 500113056 YouBike2.0_華江污水廠 20 20 ## 1311 500113057 YouBike2.0_柳鄉公園 15 15 ## 1312 500113058 YouBike2.0_綠堤社區公園 22 14 ## 1313 500113059 YouBike2.0_長順艋舺大道口 26 20 ## 1314 500113060 YouBike2.0_富民路145巷口 20 6 ## 1315 500113061 YouBike2.0_環南綜合市場 14 4 ## 1316 500113062 YouBike2.0_龍山國中 15 8 ## 1317 500113063 YouBike2.0_洛陽停車場 22 16 ## 1318 500113064 YouBike2.0_桂林昆明街口 20 16 ## 1319 500113065 YouBike2.0_萬華國中_1 36 7 ## 1320 500113066 YouBike2.0_青年公園3號出口 38 15 ## 1321 500113068 YouBike2.0_捷運龍山寺站(1號出口)_1 49 31 ## 1322 500113069 YouBike2.0_莒光社會住宅 30 21 ## 1323 500113070 YouBike2.0_艋舺西藏路口 20 5 ## 1324 500113071 YouBike2.0_萬大路493巷 10 10 ## 1325 500113072 YouBike2.0_雙園國中地下停車場 12 8 ## 1326 500113073 YouBike2.0_青年路152巷口 16 9 ## 1327 500113074 YouBike2.0_和平西路二段190巷口 15 11 ## 1328 500113075 YouBike2.0_萬大路424巷口 15 5 ## 1329 500113077 YouBike2.0_長泰街52巷口 15 5 ## 1330 500113078 YouBike2.0_水源青年路口 24 7 ## 1331 500113079 YouBike2.0_青年公園4號出口 24 7 ## 1332 500113080 YouBike2.0_祥安水岸景觀大廈 15 4 ## 1333 500113081 YouBike2.0_大理高中(西藏路) 19 11 ## 1334 500113085 YouBike2.0_艋舺雙園街口 14 13 ## 1335 500113086 YouBike2.0_德昌街125巷口 15 5 ## 1336 500119005 YouBike2.0_臺大水源舍區A棟 37 20 ## 1337 500119006 YouBike2.0_臺大卓越研究大樓 32 22 ## 1338 500119007 YouBike2.0_臺大水源修齊會館 18 0 ## 1339 500119008 YouBike2.0_臺大檔案展示館 10 6 ## 1340 500119009 YouBike2.0_臺大水源舍區B棟 30 27 ## 1341 500119043 YouBike2.0_臺大男八舍東側 42 40 ## 1342 500119044 YouBike2.0_臺大禮賢樓東南側 23 13 ## 1343 500119045 YouBike2.0_臺大農業陳列館北側 45 15 ## 1344 500119046 YouBike2.0_臺大管理學院二館北側 40 1 ## 1345 500119047 YouBike2.0_臺大土木系館 30 0 ## 1346 500119048 YouBike2.0_臺大大一女舍北側 53 0 ## 1347 500119049 YouBike2.0_臺大女九舍西南側 62 6 ## 1348 500119050 YouBike2.0_臺大小福樓東側 31 0 ## 1349 500119051 YouBike2.0_臺大立體機車停車場 27 6 ## 1350 500119052 YouBike2.0_臺大工綜館南側 26 3 ## 1351 500119053 YouBike2.0_臺大天文數學館南側 19 7 ## 1352 500119054 YouBike2.0_臺大心理系館南側 30 3 ## 1353 500119055 YouBike2.0_臺大樂學館東側 28 2 ## 1354 500119056 YouBike2.0_臺大農化新館西側 10 5 ## 1355 500119057 YouBike2.0_臺大五號館西側 20 1 ## 1356 500119058 YouBike2.0_臺大舊體育館西側 33 2 ## 1357 500119059 YouBike2.0_臺大共同教室北側 20 0 ## 1358 500119060 YouBike2.0_臺大共同教室東南側 12 0 ## 1359 500119061 YouBike2.0_臺大鹿鳴堂東側 27 5 ## 1360 500119062 YouBike2.0_臺大公館停車場西北側 12 3 ## 1361 500119063 YouBike2.0_臺大第二行政大樓南側 27 15 ## 1362 500119064 YouBike2.0_臺大明達館機車停車場 28 11 ## 1363 500119065 YouBike2.0_臺大二號館 10 0 ## 1364 500119066 YouBike2.0_臺大凝態館南側 20 4 ## 1365 500119067 YouBike2.0_臺大社科院西側 42 3 ## 1366 500119068 YouBike2.0_臺大社會系館南側 39 16 ## 1367 500119069 YouBike2.0_臺大思亮館東南側 10 3 ## 1368 500119070 YouBike2.0_臺大椰林小舖 48 1 ## 1369 500119071 YouBike2.0_臺大計資中心南側 34 6 ## 1370 500119072 YouBike2.0_臺大原分所北側 12 6 ## 1371 500119074 YouBike2.0_臺大生命科學館西北側 30 14 ## 1372 500119075 YouBike2.0_臺大第一活動中心西南側 40 11 ## 1373 500119076 YouBike2.0_臺大博理館西側 22 2 ## 1374 500119077 YouBike2.0_臺大博雅館西側 56 11 ## 1375 500119078 YouBike2.0_臺大森林館北側 10 4 ## 1376 500119079 YouBike2.0_臺大一號館 19 1 ## 1377 500119080 YouBike2.0_臺大小小福西南側 10 1 ## 1378 500119081 YouBike2.0_臺大教研館北側 11 2 ## 1379 500119082 YouBike2.0_臺大四號館東北側 10 2 ## 1380 500119083 YouBike2.0_臺大新生教室南側 18 4 ## 1381 500119084 YouBike2.0_臺大鄭江樓北側 10 0 ## 1382 500119085 YouBike2.0_臺大電機二館東南側 14 6 ## 1383 500119086 YouBike2.0_臺大圖資系館北側 25 1 ## 1384 500119087 YouBike2.0_臺大總圖書館西南側 30 2 ## 1385 500119088 YouBike2.0_臺大黑森林西側 20 20 ## 1386 500119089 YouBike2.0_臺大獸醫館南側 24 2 ## 1387 500119090 YouBike2.0_臺大新體育館東南側 40 4 ## 1388 500119091 YouBike2.0_臺大明達館北側(員工宿舍) 18 2 ## sarea mday lat lng ## 1 大安區 2024-03-31 23:09:14 25.02605 121.5436 ## 2 大安區 2024-03-31 23:02:18 25.02565 121.5436 ## 3 大安區 2024-03-31 22:26:18 25.02429 121.5412 ## 4 大安區 2024-03-31 23:01:14 25.02351 121.5428 ## 5 大安區 2024-03-31 22:50:25 25.02153 121.5430 ## 6 大安區 2024-03-31 22:46:18 25.02429 121.5433 ## 7 大安區 2024-03-31 22:29:18 25.02253 121.5433 ## 8 大安區 2024-03-31 22:32:18 25.02112 121.5341 ## 9 大安區 2024-03-31 23:09:14 25.01976 121.5338 ## 10 大安區 2024-03-31 23:08:18 25.01894 121.5336 ## 11 大安區 2024-03-31 21:53:13 25.01986 121.5298 ## 12 大安區 2024-03-31 23:07:17 25.02543 121.5433 ## 13 大安區 2024-03-31 23:08:19 25.01717 121.5320 ## 14 大安區 2024-03-31 22:56:19 25.02035 121.5464 ## 15 大安區 2024-03-31 23:08:18 25.01927 121.5299 ## 16 大安區 2024-03-31 23:03:14 25.01895 121.5316 ## 17 大安區 2024-03-31 22:40:21 25.02446 121.5467 ## 18 大安區 2024-01-14 04:17:15 25.02093 121.5331 ## 19 大安區 2024-03-31 23:09:18 25.01385 121.5355 ## 20 大安區 2024-03-31 23:01:35 25.01491 121.5344 ## 21 大安區 2024-03-31 22:38:17 25.01244 121.5366 ## 22 大安區 2024-03-31 23:04:18 25.01451 121.5414 ## 23 大安區 2024-03-31 22:58:18 25.01295 121.5397 ## 24 大安區 2024-03-31 22:45:14 25.01137 121.5406 ## 25 大安區 2024-03-31 23:07:18 25.01182 121.5417 ## 26 大安區 2024-03-31 22:49:18 25.01426 121.5438 ## 27 大安區 2024-03-31 22:44:17 25.01234 121.5450 ## 28 大安區 2024-03-31 23:05:19 25.01360 121.5466 ## 29 大安區 2024-03-31 23:08:19 25.01537 121.5470 ## 30 大安區 2024-03-31 23:08:14 25.01637 121.5453 ## 31 大安區 2024-03-31 23:07:17 25.01664 121.5452 ## 32 大安區 2024-03-31 22:10:31 25.01576 121.5429 ## 33 大安區 2024-03-31 22:34:17 25.01787 121.5476 ## 34 大安區 2024-03-31 22:59:17 25.02032 121.5450 ## 35 大安區 2024-03-31 22:57:19 25.02076 121.5443 ## 36 大安區 2024-03-31 22:46:14 25.02101 121.5428 ## 37 大安區 2024-03-31 22:31:08 25.02104 121.5408 ## 38 大安區 2024-03-31 21:45:18 25.02220 121.5363 ## 39 大安區 2024-03-31 23:03:17 25.02218 121.5347 ## 40 大安區 2024-03-31 22:49:14 25.01727 121.5447 ## 41 大安區 2024-03-31 22:54:18 25.02286 121.5466 ## 42 大安區 2024-03-31 21:45:19 25.02164 121.5470 ## 43 大安區 2024-03-31 22:21:21 25.02147 121.5441 ## 44 大安區 2024-03-31 22:52:18 25.02193 121.5316 ## 45 大安區 2024-03-31 23:08:19 25.01890 121.5501 ## 46 大安區 2024-03-31 22:32:14 25.01856 121.5556 ## 47 大安區 2024-03-31 22:21:21 25.01623 121.5504 ## 48 大安區 2024-03-31 23:04:18 25.02100 121.5521 ## 49 大安區 2024-03-31 22:57:19 25.01810 121.5593 ## 50 大安區 2024-03-31 23:07:18 25.02397 121.5527 ## 51 大安區 2024-03-31 23:04:18 25.02705 121.5555 ## 52 大安區 2024-03-31 23:09:17 25.02694 121.5533 ## 53 大安區 2024-03-31 22:59:18 25.02021 121.5294 ## 54 大安區 2024-03-31 23:08:18 25.02669 121.5253 ## 55 大安區 2024-03-31 23:08:14 25.02638 121.5297 ## 56 大安區 2024-03-31 23:09:14 25.02621 121.5317 ## 57 大安區 2024-03-31 23:09:17 25.02660 121.5297 ## 58 大安區 2024-03-31 23:03:18 25.02760 121.5222 ## 59 大安區 2024-03-31 23:07:14 25.02715 121.5229 ## 60 大安區 2024-03-31 23:01:14 25.02895 121.5379 ## 61 大安區 2024-03-31 23:04:18 25.02657 121.5352 ## 62 大安區 2024-03-31 23:09:18 25.02606 121.5374 ## 63 大安區 2024-03-31 23:01:19 25.02984 121.5311 ## 64 大安區 2024-03-31 22:56:19 25.03383 121.5281 ## 65 大安區 2024-03-31 23:05:19 25.03519 121.5245 ## 66 大安區 2024-03-31 22:37:18 25.03325 121.5244 ## 67 大安區 2024-03-31 23:09:17 25.03164 121.5266 ## 68 大安區 2024-03-31 21:25:19 25.02370 121.5490 ## 69 大安區 2024-03-31 23:04:18 25.02215 121.5484 ## 70 大安區 2024-03-31 22:43:17 25.02721 121.5499 ## 71 大安區 2024-03-31 23:09:17 25.02952 121.5541 ## 72 大安區 2024-03-31 23:03:17 25.02931 121.5572 ## 73 大安區 2024-03-02 02:25:18 25.04177 121.5383 ## 74 大安區 2024-03-31 23:03:18 25.04003 121.5330 ## 75 大安區 2024-03-31 23:09:18 25.03753 121.5352 ## 76 大安區 2024-03-31 22:53:18 25.03534 121.5354 ## 77 大安區 2024-03-31 23:09:17 25.03701 121.5435 ## 78 大安區 2024-03-31 23:08:18 25.03935 121.5383 ## 79 大安區 2024-03-31 23:03:17 25.04035 121.5436 ## 80 大安區 2024-03-31 23:05:18 25.03320 121.5439 ## 81 大安區 2024-03-31 21:39:14 25.03358 121.5414 ## 82 大安區 2024-03-31 22:59:18 25.03317 121.5464 ## 83 大安區 2024-03-31 23:08:19 25.04092 121.5482 ## 84 大安區 2024-03-31 23:01:14 25.03754 121.5529 ## 85 大安區 2024-03-31 23:08:19 25.03333 121.5498 ## 86 大安區 2024-03-31 22:29:19 25.03706 121.5517 ## 87 大安區 2024-03-31 23:09:17 25.03304 121.5517 ## 88 大安區 2024-03-31 22:46:18 25.04463 121.5366 ## 89 大安區 2024-03-31 23:04:18 25.04448 121.5395 ## 90 大安區 2024-03-31 23:04:18 25.03332 121.5344 ## 91 大安區 2024-03-31 23:07:18 25.03318 121.5572 ## 92 大安區 2024-03-31 22:43:13 25.03513 121.5561 ## 93 大安區 2024-03-31 22:42:14 25.03910 121.5569 ## 94 大安區 2024-03-31 22:40:26 25.03635 121.5383 ## 95 大安區 2024-03-31 22:53:18 25.04091 121.5329 ## 96 大安區 2024-03-31 23:09:17 25.04239 121.5332 ## 97 大安區 2024-03-31 23:07:18 25.03126 121.5434 ## 98 大安區 2024-03-31 22:56:19 25.04189 121.5338 ## 99 大安區 2024-03-30 08:59:14 25.04201 121.5461 ## 100 大安區 2024-03-31 23:05:19 25.04405 121.5486 ## 101 大安區 2024-03-31 23:09:17 25.03336 121.5364 ## 102 大安區 2024-03-31 22:50:25 25.03280 121.5375 ## 103 大安區 2024-03-31 22:38:17 25.03569 121.5451 ## 104 大安區 2024-03-31 22:19:19 25.03473 121.5477 ## 105 大安區 2024-01-14 04:19:10 25.04262 121.5444 ## 106 大安區 2024-03-31 22:23:14 25.04153 121.5524 ## 107 大安區 2024-03-31 22:53:14 25.04159 121.5494 ## 108 大安區 2024-03-31 23:09:17 25.02979 121.5405 ## 109 大安區 2024-03-31 23:01:20 25.02770 121.5513 ## 110 大安區 2024-03-31 23:05:18 25.02469 121.5446 ## 111 大安區 2024-03-31 23:04:18 25.04122 121.5575 ## 112 大安區 2024-03-31 22:56:19 25.03756 121.5459 ## 113 大安區 2024-03-31 23:08:19 25.03305 121.5538 ## 114 大安區 2024-03-31 23:04:18 25.02681 121.5467 ## 115 大安區 2024-03-31 22:49:18 25.03748 121.5556 ## 116 大安區 2024-03-31 23:08:18 25.03331 121.5526 ## 117 大安區 2024-03-31 22:56:19 25.02870 121.5490 ## 118 大安區 2024-03-31 23:08:18 25.02861 121.5434 ## 119 大安區 2024-03-31 22:51:18 25.02575 121.5377 ## 120 大安區 2024-03-31 22:37:18 25.01223 121.5479 ## 121 大安區 2024-03-31 23:04:18 25.04311 121.5431 ## 122 大安區 2024-03-31 23:09:18 25.03363 121.5296 ## 123 大安區 2024-03-31 23:09:14 25.03609 121.5471 ## 124 大安區 2024-03-31 22:58:18 25.01551 121.5337 ## 125 大安區 2024-03-31 22:58:18 25.04196 121.5365 ## 126 大安區 2024-01-14 04:19:10 25.04176 121.5403 ## 127 大安區 2024-03-31 23:09:18 25.01744 121.5333 ## 128 大安區 2024-03-31 22:53:18 25.02267 121.5341 ## 129 大安區 2024-03-31 23:03:18 25.03479 121.5438 ## 130 大安區 2024-03-31 22:28:19 25.01783 121.5522 ## 131 大安區 2024-03-31 21:58:14 25.01727 121.5490 ## 132 大安區 2024-03-31 22:52:18 25.02039 121.5485 ## 133 大安區 2024-03-31 23:07:17 25.02347 121.5411 ## 134 大安區 2024-03-31 23:05:18 25.02054 121.5456 ## 135 大安區 2024-03-31 23:03:18 25.02444 121.5491 ## 136 大安區 2024-03-31 22:51:18 25.01705 121.5443 ## 137 大安區 2024-03-31 21:03:18 25.03762 121.5501 ## 138 大安區 2024-03-31 23:09:18 25.04464 121.5494 ## 139 大安區 2024-03-31 22:47:13 25.04172 121.5454 ## 140 大安區 2024-03-31 23:08:18 25.04472 121.5440 ## 141 大安區 2024-03-31 23:08:18 25.02598 121.5345 ## 142 大安區 2024-03-31 22:45:19 25.02535 121.5510 ## 143 大安區 2024-03-31 23:07:18 25.03333 121.5397 ## 144 大安區 2024-03-31 22:23:19 25.03715 121.5494 ## 145 大安區 2024-03-31 23:05:18 25.02709 121.5490 ## 146 大安區 2024-03-31 23:05:18 25.03710 121.5484 ## 147 大安區 2024-03-31 22:52:18 25.02821 121.5486 ## 148 大安區 2024-03-31 23:06:17 25.03328 121.5425 ## 149 大安區 2024-03-31 22:29:18 25.02055 121.5285 ## 150 大安區 2024-03-31 22:56:19 25.03459 121.5516 ## 151 大安區 2024-03-31 22:40:26 25.02101 121.5415 ## 152 大安區 2024-03-31 22:33:18 25.03002 121.5489 ## 153 大安區 2024-03-31 22:21:16 25.03054 121.5247 ## 154 大安區 2024-03-31 23:09:17 25.04205 121.5566 ## 155 大安區 2024-03-31 22:46:18 25.04010 121.5412 ## 156 大安區 2024-03-31 23:01:20 25.03827 121.5480 ## 157 大安區 2024-03-31 22:57:19 25.02974 121.5515 ## 158 大安區 2024-03-31 23:09:17 25.02268 121.5361 ## 159 大安區 2024-03-31 23:06:17 25.03303 121.5437 ## 160 大安區 2024-03-31 23:09:18 25.02832 121.5559 ## 161 大安區 2024-03-31 22:46:18 25.01027 121.5400 ## 162 大安區 2024-03-31 23:03:14 25.04132 121.5539 ## 163 大安區 2024-03-31 22:47:18 25.03795 121.5547 ## 164 大安區 2024-03-31 22:56:19 25.02528 121.5522 ## 165 大安區 2024-03-31 23:03:18 25.02208 121.5268 ## 166 大安區 2024-03-31 23:02:18 25.03551 121.5495 ## 167 大安區 2024-03-31 23:05:19 25.02942 121.5529 ## 168 大安區 2024-03-31 23:06:18 25.04061 121.5439 ## 169 大安區 2024-03-31 22:59:17 25.03813 121.5463 ## 170 大安區 2024-03-31 23:08:19 25.02476 121.5280 ## 171 大安區 2024-03-31 23:02:17 25.03056 121.5525 ## 172 大安區 2024-03-31 22:47:18 25.02014 121.5508 ## 173 大安區 2024-03-31 22:40:25 25.02572 121.5236 ## 174 大安區 2024-03-31 23:07:18 25.04152 121.5441 ## 175 大安區 2024-03-31 22:32:18 25.02468 121.5396 ## 176 大安區 2024-03-31 23:03:14 25.03601 121.5574 ## 177 大安區 2024-03-31 23:07:17 25.01870 121.5569 ## 178 大安區 2024-03-31 23:05:18 25.03817 121.5440 ## 179 大安區 2024-03-31 22:14:18 25.03804 121.5504 ## 180 大安區 2024-03-31 22:15:19 25.02187 121.5291 ## 181 大同區 2024-03-31 23:03:17 25.07894 121.5112 ## 182 大同區 2024-03-31 22:51:17 25.07410 121.5135 ## 183 大同區 2024-03-31 22:52:18 25.07717 121.5093 ## 184 大同區 2024-03-31 22:26:18 25.06864 121.5107 ## 185 大同區 2024-03-31 23:07:17 25.07158 121.5137 ## 186 大同區 2024-03-31 23:08:19 25.06647 121.5165 ## 187 大同區 2024-03-31 22:32:14 25.05601 121.5089 ## 188 大同區 2024-03-31 22:21:20 25.07378 121.5158 ## 189 大同區 2024-03-31 23:08:14 25.07133 121.5202 ## 190 大同區 2024-03-31 23:07:18 25.07220 121.5106 ## 191 大同區 2024-03-31 23:01:20 25.07567 121.5186 ## 192 大同區 2024-03-31 22:59:13 25.07598 121.5141 ## 193 大同區 2024-03-31 22:16:19 25.07447 121.5200 ## 194 大同區 2024-03-31 22:42:14 25.06326 121.5110 ## 195 大同區 2024-03-31 22:58:18 25.06327 121.5094 ## 196 大同區 2024-03-31 22:52:18 25.05915 121.5103 ## 197 大同區 2024-03-31 22:16:18 25.06853 121.5173 ## 198 大同區 2024-03-31 22:37:18 25.07080 121.5183 ## 199 大同區 2024-03-31 23:04:18 25.06314 121.5131 ## 200 大同區 2024-03-31 23:09:18 25.06325 121.5116 ## 201 大同區 2024-03-31 22:27:14 25.06174 121.5197 ## 202 大同區 2024-03-31 23:04:18 25.05826 121.5206 ## 203 大同區 2024-03-31 23:07:18 25.04991 121.5104 ## 204 大同區 2024-03-31 23:06:18 25.05592 121.5137 ## 205 大同區 2024-03-31 23:08:18 25.05454 121.5105 ## 206 大同區 2024-03-31 22:24:19 25.07049 121.5160 ## 207 大同區 2024-03-31 23:09:18 25.06054 121.5134 ## 208 大同區 2024-03-31 22:57:19 25.06867 121.5199 ## 209 大同區 2024-03-31 23:08:18 25.05369 121.5142 ## 210 大同區 2024-03-31 23:06:18 25.06853 121.5136 ## 211 大同區 2024-03-31 22:21:21 25.06407 121.5182 ## 212 大同區 2024-03-31 22:48:18 25.04925 121.5147 ## 213 大同區 2024-03-31 23:09:17 25.06594 121.5108 ## 214 大同區 2024-03-31 22:58:18 25.05205 121.5082 ## 215 大同區 2024-03-31 23:04:18 25.06011 121.5173 ## 216 大同區 2024-03-31 22:19:19 25.07491 121.5115 ## 217 大同區 2024-03-31 22:16:19 25.06496 121.5161 ## 218 大同區 2024-03-31 23:08:19 25.05918 121.5137 ## 219 大同區 2024-03-31 22:44:18 25.05662 121.5078 ## 220 大同區 2024-03-31 22:54:18 25.05805 121.5135 ## 221 大同區 2024-03-31 22:56:19 25.06322 121.5144 ## 222 大同區 2024-03-31 23:07:18 25.06247 121.5184 ## 223 大同區 2024-03-31 23:06:18 25.05366 121.5164 ## 224 大同區 2024-03-31 22:45:19 25.05756 121.5183 ## 225 大同區 2024-03-31 23:03:17 25.05646 121.5170 ## 226 大同區 2024-03-31 23:09:14 25.04937 121.5191 ## 227 大同區 2024-03-31 22:49:14 25.06129 121.5202 ## 228 大同區 2024-03-31 23:08:18 25.05296 121.5194 ## 229 大同區 2024-03-31 23:07:18 25.05150 121.5140 ## 230 大同區 2024-03-31 23:09:18 25.06587 121.5185 ## 231 大同區 2024-03-31 22:40:26 25.05658 121.5083 ## 232 大同區 2024-03-31 22:12:14 25.07182 121.5193 ## 233 大同區 2024-03-31 22:43:17 25.06669 121.5161 ## 234 大同區 2024-03-31 23:08:19 25.04879 121.5163 ## 235 大同區 2024-03-31 22:40:25 25.06036 121.5200 ## 236 大同區 2024-03-31 22:37:14 25.06157 121.5168 ## 237 大同區 2024-03-31 23:09:18 25.06095 121.5143 ## 238 大同區 2024-03-31 23:05:18 25.06092 121.5113 ## 239 大同區 2024-03-31 23:08:19 25.06603 121.5148 ## 240 大同區 2024-03-31 22:18:18 25.07473 121.5145 ## 241 大同區 2024-03-31 21:01:57 25.07563 121.5182 ## 242 士林區 2024-03-31 22:52:18 25.08128 121.5178 ## 243 士林區 2024-03-31 20:13:18 25.08914 121.5154 ## 244 士林區 2024-03-31 22:52:14 25.08695 121.5190 ## 245 士林區 2024-03-31 23:09:17 25.08521 121.5192 ## 246 士林區 2024-03-31 22:52:18 25.10277 121.5336 ## 247 士林區 2024-03-31 22:44:18 25.12001 121.5334 ## 248 士林區 2024-03-31 22:51:18 25.11856 121.5296 ## 249 士林區 2024-03-31 22:26:18 25.11633 121.5341 ## 250 士林區 2024-03-31 22:56:19 25.11356 121.5372 ## 251 士林區 2024-03-31 22:54:18 25.11127 121.5324 ## 252 士林區 2024-03-31 22:41:17 25.11341 121.5319 ## 253 士林區 2024-03-31 22:23:19 25.12011 121.5265 ## 254 士林區 2024-03-31 22:57:19 25.11184 121.5259 ## 255 士林區 2024-03-31 22:28:19 25.08009 121.5190 ## 256 士林區 2024-03-31 22:44:14 25.07994 121.5243 ## 257 士林區 2024-03-31 23:08:18 25.10813 121.5304 ## 258 士林區 2024-03-31 22:33:17 25.10540 121.5295 ## 259 士林區 2024-03-31 22:56:18 25.10399 121.5259 ## 260 士林區 2024-03-31 23:02:17 25.10155 121.5283 ## 261 士林區 2024-03-31 21:21:17 25.10186 121.5308 ## 262 士林區 2024-03-31 22:56:19 25.08302 121.5207 ## 263 士林區 2024-03-31 22:42:18 25.08671 121.5210 ## 264 士林區 2024-03-31 22:50:25 25.08828 121.5199 ## 265 士林區 2024-03-31 23:01:20 25.08480 121.5212 ## 266 士林區 2024-03-31 22:59:17 25.08736 121.5227 ## 267 士林區 2024-03-31 22:47:17 25.10364 121.5222 ## 268 士林區 2024-03-31 21:56:14 25.10208 121.5198 ## 269 士林區 2024-03-31 22:57:19 25.08388 121.5254 ## 270 士林區 2024-03-31 23:03:18 25.08403 121.5249 ## 271 士林區 2024-03-31 20:45:18 25.09667 121.5321 ## 272 士林區 2024-03-31 22:29:19 25.09896 121.5302 ## 273 士林區 2024-03-31 22:59:18 25.09651 121.5275 ## 274 士林區 2024-03-31 22:56:19 25.08911 121.5215 ## 275 士林區 2024-03-31 23:09:18 25.09164 121.5171 ## 276 士林區 2024-03-31 23:03:17 25.09631 121.5145 ## 277 士林區 2024-03-31 22:16:18 25.09598 121.5178 ## 278 士林區 2024-01-14 04:18:09 25.09619 121.5223 ## 279 士林區 2024-03-31 22:48:18 25.09419 121.5283 ## 280 士林區 2024-03-31 23:07:17 25.09343 121.5264 ## 281 士林區 2024-03-31 22:58:18 25.08771 121.5268 ## 282 士林區 2024-03-31 22:56:19 25.09435 121.5170 ## 283 士林區 2024-03-31 22:51:17 25.10991 121.5304 ## 284 士林區 2024-03-31 20:57:26 25.10455 121.5319 ## 285 士林區 2024-03-31 23:09:18 25.10225 121.5229 ## 286 士林區 2024-03-31 22:40:26 25.10143 121.5358 ## 287 士林區 2024-03-31 21:23:18 25.10113 121.5516 ## 288 士林區 2024-03-31 23:04:18 25.09106 121.5150 ## 289 士林區 2024-03-31 22:28:19 25.09755 121.5404 ## 290 士林區 2024-03-31 23:01:19 25.08678 121.5095 ## 291 士林區 2024-03-31 23:01:20 25.08505 121.5117 ## 292 士林區 2024-03-31 21:21:39 25.08393 121.5117 ## 293 士林區 2024-03-31 20:01:50 25.08254 121.5075 ## 294 士林區 2024-03-31 22:32:18 25.10459 121.5242 ## 295 士林區 2024-03-31 23:06:17 25.08824 121.5105 ## 296 士林區 2024-03-31 21:08:18 25.09058 121.5014 ## 297 士林區 2024-03-31 22:29:18 25.09346 121.5038 ## 298 士林區 2024-03-31 22:46:18 25.10641 121.5294 ## 299 士林區 2024-03-31 23:03:18 25.09020 121.5062 ## 300 士林區 2024-03-31 15:16:19 25.09833 121.5479 ## 301 士林區 2024-03-31 21:15:18 25.09763 121.5340 ## 302 士林區 2024-03-31 22:04:19 25.09312 121.5142 ## 303 士林區 2024-03-31 22:59:18 25.08279 121.5122 ## 304 士林區 2024-03-31 19:03:17 25.10893 121.4664 ## 305 士林區 2024-03-31 22:16:18 25.10304 121.4830 ## 306 士林區 2024-03-31 14:18:19 25.10640 121.4836 ## 307 士林區 2024-03-31 21:56:19 25.11314 121.4897 ## 308 士林區 2024-03-31 21:56:18 25.10261 121.4882 ## 309 士林區 2024-03-31 19:43:17 25.09669 121.4971 ## 310 士林區 2024-03-31 23:07:18 25.10696 121.5323 ## 311 士林區 2024-03-31 23:04:18 25.11044 121.5359 ## 312 士林區 2024-03-31 23:01:20 25.08899 121.5175 ## 313 士林區 2024-03-31 22:59:18 25.10775 121.5231 ## 314 士林區 2024-03-31 22:21:21 25.09330 121.5196 ## 315 士林區 2024-03-31 22:09:19 25.09609 121.5301 ## 316 士林區 2024-03-31 22:13:19 25.09709 121.5423 ## 317 士林區 2024-03-31 22:46:18 25.08217 121.5107 ## 318 士林區 2024-03-31 22:36:18 25.11306 121.5395 ## 319 士林區 2024-03-31 21:14:17 25.08887 121.5031 ## 320 士林區 2024-03-31 22:47:18 25.10012 121.5325 ## 321 士林區 2024-03-31 23:01:35 25.08019 121.5202 ## 322 士林區 2024-03-31 19:28:18 25.10455 121.5302 ## 323 士林區 2024-03-31 23:01:14 25.10199 121.5293 ## 324 士林區 2024-03-31 23:09:17 25.09812 121.5245 ## 325 士林區 2024-03-31 17:43:15 25.12408 121.5300 ## 326 士林區 2024-03-31 22:56:19 25.08637 121.5247 ## 327 士林區 2024-03-31 22:51:18 25.10094 121.5224 ## 328 士林區 2024-03-31 22:42:18 25.07960 121.5237 ## 329 士林區 2024-03-31 18:21:19 25.09029 121.5019 ## 330 士林區 2024-03-31 23:08:19 25.08577 121.5253 ## 331 士林區 2024-03-31 22:11:19 25.11070 121.5400 ## 332 士林區 2024-03-31 20:22:18 25.08756 121.5118 ## 333 士林區 2024-03-31 22:57:19 25.08406 121.5067 ## 334 士林區 2024-03-31 22:53:18 25.08810 121.5087 ## 335 士林區 2024-03-31 21:49:18 25.08912 121.5049 ## 336 士林區 2024-03-31 22:41:17 25.08410 121.5234 ## 337 士林區 2024-03-31 22:59:18 25.08761 121.5261 ## 338 士林區 2024-03-31 22:59:18 25.08408 121.5096 ## 339 士林區 2024-03-31 22:38:17 25.08471 121.5089 ## 340 士林區 2024-03-31 22:12:19 25.11742 121.5347 ## 341 士林區 2024-03-31 22:47:18 25.10203 121.5256 ## 342 士林區 2024-03-31 22:45:19 25.10585 121.5238 ## 343 士林區 2024-03-31 22:56:19 25.08238 121.5231 ## 344 士林區 2024-03-31 23:08:19 25.09765 121.5276 ## 345 士林區 2024-03-31 23:03:17 25.09561 121.5255 ## 346 士林區 2024-03-31 23:02:18 25.10336 121.5226 ## 347 士林區 2024-03-31 15:19:18 25.08762 121.5271 ## 348 士林區 2024-03-31 20:43:19 25.08036 121.5084 ## 349 士林區 2024-03-31 23:04:18 25.09013 121.5205 ## 350 士林區 2024-03-31 23:04:18 25.08182 121.5243 ## 351 士林區 2024-03-31 22:56:19 25.11247 121.5291 ## 352 士林區 2024-03-31 23:05:14 25.09677 121.5193 ## 353 士林區 2024-03-31 22:50:25 25.11642 121.5374 ## 354 士林區 2024-03-31 23:01:20 25.11579 121.5311 ## 355 士林區 2024-03-31 22:57:19 25.09886 121.5183 ## 356 士林區 2024-03-31 19:52:18 25.09646 121.4936 ## 357 士林區 2024-03-31 20:37:18 25.10566 121.5292 ## 358 士林區 2024-03-31 23:04:18 25.10519 121.5287 ## 359 士林區 2024-03-31 22:53:18 25.09204 121.5247 ## 360 士林區 2024-03-31 22:56:18 25.11836 121.5347 ## 361 士林區 2024-03-31 22:23:18 25.11633 121.5329 ## 362 士林區 2024-03-31 22:27:19 25.10893 121.5232 ## 363 士林區 2024-03-31 22:53:18 25.10985 121.5286 ## 364 士林區 2024-03-31 20:42:18 25.09441 121.5328 ## 365 文山區 2024-03-31 23:08:19 25.00402 121.5407 ## 366 文山區 2024-03-31 22:56:14 25.00270 121.5386 ## 367 文山區 2024-03-31 22:47:13 25.00115 121.5392 ## 368 文山區 2024-03-31 23:09:18 25.00154 121.5364 ## 369 文山區 2024-03-31 22:23:14 25.00144 121.5398 ## 370 文山區 2024-03-31 22:54:18 24.99621 121.5404 ## 371 文山區 2024-03-31 23:04:18 24.99366 121.5412 ## 372 文山區 2024-03-31 22:57:19 24.99898 121.5403 ## 373 文山區 2024-03-31 22:10:30 24.99812 121.5366 ## 374 文山區 2024-03-31 22:56:14 25.00587 121.5501 ## 375 文山區 2024-03-31 23:08:18 25.00465 121.5492 ## 376 文山區 2024-03-31 23:06:17 25.00346 121.5471 ## 377 文山區 2024-03-31 22:59:18 25.00219 121.5445 ## 378 文山區 2024-03-31 23:08:19 24.99136 121.5401 ## 379 文山區 2024-03-31 23:04:18 25.00792 121.5373 ## 380 文山區 2024-03-31 23:07:17 24.99543 121.5473 ## 381 文山區 2024-03-31 22:56:19 24.99118 121.5436 ## 382 文山區 2024-03-31 22:52:18 24.98737 121.5773 ## 383 文山區 2024-03-31 22:37:14 24.99873 121.5798 ## 384 文山區 2024-03-31 22:57:18 24.99798 121.5746 ## 385 文山區 2024-03-31 22:59:17 24.99886 121.5677 ## 386 文山區 2024-03-31 22:53:18 24.99676 121.5596 ## 387 文山區 2024-03-31 21:17:24 25.00467 121.5568 ## 388 文山區 2024-03-31 23:01:19 24.99982 121.5476 ## 389 文山區 2024-03-31 23:08:19 24.98816 121.5553 ## 390 文山區 2024-03-31 23:03:18 24.98747 121.5498 ## 391 文山區 2024-03-31 22:26:18 24.98573 121.5453 ## 392 文山區 2024-03-31 22:43:17 24.98859 121.5434 ## 393 文山區 2024-03-31 23:07:18 24.97837 121.5555 ## 394 文山區 2024-03-31 22:08:21 24.98058 121.5562 ## 395 文山區 2024-03-31 21:59:17 24.98414 121.5691 ## 396 文山區 2024-03-31 22:47:18 24.98471 121.5633 ## 397 文山區 2024-03-31 21:51:17 24.98574 121.5674 ## 398 文山區 2024-03-31 16:50:26 24.97619 121.5583 ## 399 文山區 2024-03-31 22:26:13 24.98959 121.5696 ## 400 文山區 2024-03-31 22:52:18 24.98718 121.5606 ## 401 文山區 2024-03-31 23:09:18 24.98814 121.5636 ## 402 文山區 2024-03-31 23:09:18 24.98088 121.5631 ## 403 文山區 2024-03-31 22:39:14 24.98181 121.5657 ## 404 文山區 2024-03-31 22:42:18 24.98301 121.5540 ## 405 文山區 2024-03-31 22:28:14 24.98537 121.5796 ## 406 文山區 2024-03-31 21:03:18 24.98642 121.5651 ## 407 文山區 2024-03-31 22:57:19 24.98935 121.5665 ## 408 文山區 2024-03-31 19:09:18 24.99151 121.5684 ## 409 文山區 2024-03-31 21:05:19 24.99111 121.5670 ## 410 文山區 2024-03-31 21:38:18 24.97989 121.5675 ## 411 文山區 2024-03-31 22:54:18 24.99889 121.5433 ## 412 文山區 2024-03-31 22:03:20 24.99939 121.5585 ## 413 文山區 2024-03-31 23:01:19 24.99579 121.5550 ## 414 文山區 2024-03-31 23:03:14 25.00348 121.5564 ## 415 文山區 2024-03-31 21:01:14 25.00079 121.5753 ## 416 文山區 2024-03-31 22:12:19 24.98841 121.5765 ## 417 文山區 2024-03-31 22:56:19 24.99797 121.5498 ## 418 文山區 2024-03-31 22:39:18 24.98543 121.5801 ## 419 文山區 2024-03-31 23:01:35 25.00115 121.5514 ## 420 文山區 2024-03-31 22:41:18 24.99271 121.5587 ## 421 文山區 2024-03-31 22:06:19 24.99472 121.5595 ## 422 文山區 2024-03-31 13:14:19 24.98695 121.5646 ## 423 文山區 2024-03-31 22:42:18 24.98662 121.5707 ## 424 文山區 2024-03-31 22:02:18 24.98339 121.5564 ## 425 文山區 2024-03-31 23:06:17 25.00753 121.5372 ## 426 文山區 2024-01-14 04:19:10 24.99766 121.5787 ## 427 文山區 2024-03-31 16:48:18 24.98200 121.5717 ## 428 文山區 2024-03-31 22:02:18 25.00264 121.5768 ## 429 文山區 2024-03-31 23:06:18 25.01076 121.5364 ## 430 文山區 2024-03-31 22:09:19 25.00345 121.5364 ## 431 文山區 2024-03-31 23:05:18 24.99609 121.5428 ## 432 文山區 2024-03-31 22:59:17 24.99660 121.5403 ## 433 文山區 2024-03-31 23:09:18 25.00825 121.5342 ## 434 文山區 2024-03-31 22:45:14 24.99279 121.5426 ## 435 文山區 2024-03-31 22:35:18 24.98939 121.5768 ## 436 文山區 2024-03-31 22:05:21 25.00743 121.5588 ## 437 文山區 2024-03-31 23:07:17 24.99696 121.5445 ## 438 文山區 2024-03-31 22:11:19 24.98768 121.5657 ## 439 文山區 2024-03-31 22:21:20 24.98944 121.5619 ## 440 文山區 2024-03-31 22:32:18 24.98808 121.5472 ## 441 文山區 2024-03-31 22:40:26 24.98250 121.5595 ## 442 文山區 2024-03-31 22:07:20 25.00223 121.5704 ## 443 文山區 2024-03-31 22:47:17 25.00198 121.5486 ## 444 文山區 2024-03-31 22:56:19 24.99197 121.5737 ## 445 文山區 2024-03-31 22:50:25 24.98532 121.5583 ## 446 文山區 2024-03-31 21:58:14 24.98655 121.5552 ## 447 文山區 2024-03-31 22:31:09 24.98217 121.5578 ## 448 文山區 2024-03-31 22:47:18 25.00268 121.5528 ## 449 文山區 2024-03-31 23:02:18 24.99925 121.5555 ## 450 文山區 2024-03-31 21:31:08 24.97932 121.5541 ## 451 文山區 2024-03-31 22:59:17 24.99892 121.5489 ## 452 文山區 2024-03-31 22:21:21 24.99509 121.5720 ## 453 文山區 2024-03-31 22:50:25 25.00437 121.5505 ## 454 文山區 2024-03-31 16:45:19 25.00492 121.5558 ## 455 文山區 2024-03-31 22:57:18 25.00061 121.5494 ## 456 文山區 2024-03-31 21:16:18 24.99746 121.5454 ## 457 中正區 2024-03-31 17:43:19 25.01374 121.5307 ## 458 中正區 2024-03-31 23:07:17 25.01470 121.5319 ## 459 中正區 2024-03-31 23:08:19 25.01453 121.5344 ## 460 中正區 2024-03-31 23:09:18 25.01507 121.5338 ## 461 中正區 2024-03-31 22:53:18 25.02694 121.5222 ## 462 中正區 2024-03-31 23:04:14 25.02550 121.5235 ## 463 中正區 2024-03-31 23:08:19 25.01970 121.5290 ## 464 中正區 2024-03-31 22:53:14 25.02069 121.5246 ## 465 中正區 2024-03-31 22:57:41 25.02277 121.5229 ## 466 中正區 2024-03-31 23:07:17 25.02092 121.5205 ## 467 中正區 2024-03-31 23:04:18 25.02075 121.5277 ## 468 中正區 2024-03-31 23:08:18 25.02102 121.5275 ## 469 中正區 2024-03-31 23:08:18 25.02345 121.5250 ## 470 中正區 2024-03-31 22:54:18 25.02338 121.5189 ## 471 中正區 2024-03-31 22:36:13 25.02701 121.5216 ## 472 中正區 2024-03-31 23:02:18 25.02805 121.5216 ## 473 中正區 2024-03-31 23:01:35 25.02698 121.5208 ## 474 中正區 2024-03-31 23:04:18 25.02723 121.5166 ## 475 中正區 2024-03-31 23:05:19 25.02933 121.5185 ## 476 中正區 2024-03-31 21:44:18 25.02923 121.5206 ## 477 中正區 2024-03-31 23:09:17 25.03100 121.5221 ## 478 中正區 2024-03-31 23:08:18 25.03239 121.5187 ## 479 中正區 2024-03-31 23:05:19 25.03376 121.5177 ## 480 中正區 2024-03-31 22:58:18 25.02609 121.5139 ## 481 中正區 2024-03-31 22:34:18 25.02543 121.5105 ## 482 中正區 2024-03-31 22:43:17 25.02643 121.5094 ## 483 中正區 2024-03-31 23:09:18 25.02598 121.5081 ## 484 中正區 2024-03-31 23:02:17 25.02886 121.5052 ## 485 中正區 2024-03-31 22:50:25 25.03024 121.5090 ## 486 中正區 2024-03-31 22:01:43 25.03132 121.5075 ## 487 中正區 2024-03-31 22:48:18 25.01602 121.5256 ## 488 中正區 2024-03-31 22:46:18 25.03543 121.5083 ## 489 中正區 2024-03-31 23:02:17 25.03567 121.5101 ## 490 中正區 2024-03-31 23:01:20 25.03907 121.5138 ## 491 中正區 2024-03-31 23:09:18 25.03938 121.5077 ## 492 中正區 2024-03-31 23:02:18 25.04367 121.5285 ## 493 中正區 2024-03-31 23:07:18 25.04527 121.5222 ## 494 中正區 2024-03-31 23:02:18 25.04193 121.5246 ## 495 中正區 2024-03-31 22:57:41 25.03915 121.5216 ## 496 中正區 2024-03-31 22:42:18 25.03786 121.5199 ## 497 中正區 2024-03-31 23:08:18 25.03570 121.5241 ## 498 中正區 2024-03-31 22:59:13 25.04428 121.5234 ## 499 中正區 2024-03-31 23:03:17 25.03648 121.5095 ## 500 中正區 2024-03-31 22:57:19 25.03792 121.5085 ## 501 中正區 2024-03-31 22:54:18 25.04160 121.5084 ## 502 中正區 2024-03-31 22:44:18 25.04129 121.5112 ## 503 中正區 2024-03-31 22:56:19 25.03705 121.5125 ## 504 中正區 2024-03-31 23:03:17 25.03545 121.5133 ## 505 中正區 2024-03-31 20:45:18 25.03763 121.5171 ## 506 中正區 2024-03-31 23:02:17 25.04590 121.5307 ## 507 中正區 2024-03-31 22:45:19 25.03516 121.5064 ## 508 中正區 2024-03-31 23:09:18 25.04412 121.5102 ## 509 中正區 2024-03-31 23:07:18 25.04533 121.5094 ## 510 中正區 2024-03-31 23:04:18 25.04677 121.5099 ## 511 中正區 2024-03-31 23:01:19 25.04297 121.5164 ## 512 中正區 2024-03-31 23:02:17 25.01027 121.5331 ## 513 中正區 2024-03-31 23:06:18 25.02030 121.5230 ## 514 中正區 2024-03-31 22:58:18 25.04178 121.5191 ## 515 中正區 2024-03-31 22:33:17 25.03377 121.5304 ## 516 中正區 2024-03-31 22:56:19 25.04842 121.5199 ## 517 中正區 2024-03-31 22:12:18 25.03132 121.5052 ## 518 中正區 2024-03-31 23:09:14 25.04235 121.5322 ## 519 中正區 2024-03-31 22:56:19 25.04478 121.5327 ## 520 中正區 2024-03-31 21:06:14 25.04503 121.5197 ## 521 中正區 2024-03-31 22:50:25 25.03526 121.5168 ## 522 中正區 2024-03-31 22:32:14 25.04553 121.5274 ## 523 中正區 2024-03-31 21:42:13 25.02266 121.5236 ## 524 中正區 2024-03-31 22:56:18 25.03443 121.5272 ## 525 中正區 2024-03-31 22:41:14 25.04094 121.5221 ## 526 中正區 2024-03-31 22:56:19 25.04023 121.5256 ## 527 中正區 2024-03-31 21:13:18 25.03615 121.5166 ## 528 中正區 2024-03-31 23:07:14 25.04821 121.5190 ## 529 中正區 2024-03-31 23:09:18 25.04779 121.5204 ## 530 中正區 2024-03-31 22:38:17 25.04244 121.5086 ## 531 中正區 2024-03-31 22:33:18 25.03828 121.5152 ## 532 中正區 2024-03-31 22:40:26 25.03850 121.5129 ## 533 中正區 2024-03-31 22:38:17 25.01808 121.5275 ## 534 中正區 2024-03-31 23:07:14 25.04051 121.5240 ## 535 中正區 2024-03-31 23:09:17 25.03145 121.5194 ## 536 中正區 2024-03-31 23:09:14 25.01328 121.5300 ## 537 中正區 2024-03-31 22:54:18 25.03895 121.5223 ## 538 中正區 2024-03-31 23:08:19 25.04178 121.5087 ## 539 中正區 2024-03-31 22:59:18 25.03840 121.5280 ## 540 中正區 2024-03-31 22:09:19 25.03746 121.5280 ## 541 中正區 2024-03-31 22:52:18 25.03846 121.5250 ## 542 中正區 2024-03-31 23:02:18 25.02815 121.5111 ## 543 中正區 2024-03-31 22:45:19 25.02990 121.5103 ## 544 中正區 2024-03-31 22:56:19 25.03158 121.5146 ## 545 中正區 2024-03-31 23:05:18 25.04659 121.5238 ## 546 中正區 2024-03-31 22:56:18 25.04597 121.5258 ## 547 中正區 2024-03-31 22:13:19 25.04692 121.5221 ## 548 中正區 2024-03-31 23:08:14 25.04272 121.5321 ## 549 中正區 2024-03-31 23:03:18 25.04113 121.5327 ## 550 中正區 2024-03-31 23:06:17 25.04074 121.5159 ## 551 中正區 2024-03-31 23:08:14 25.04461 121.5188 ## 552 中正區 2024-03-31 23:04:18 25.04250 121.5227 ## 553 中正區 2024-03-31 23:07:17 25.03837 121.5234 ## 554 中正區 2024-03-31 22:42:18 25.02703 121.5069 ## 555 中正區 2024-03-31 22:24:19 25.03371 121.5107 ## 556 中正區 2024-03-31 22:56:14 25.04467 121.5236 ## 557 中正區 2024-03-31 22:58:18 25.03788 121.5190 ## 558 中正區 2024-03-31 22:44:18 25.04724 121.5127 ## 559 中正區 2024-03-31 22:40:25 25.04127 121.5270 ## 560 中正區 2024-03-31 23:01:20 25.03811 121.5285 ## 561 中正區 2024-03-31 22:45:19 25.04148 121.5287 ## 562 中正區 2024-03-31 23:05:19 25.02507 121.5165 ## 563 中正區 2024-03-31 22:44:18 25.03898 121.5306 ## 564 中正區 2024-03-31 23:04:18 25.03212 121.5186 ## 565 中正區 2024-03-31 22:26:18 25.02484 121.5197 ## 566 中正區 2024-03-31 22:52:18 25.02682 121.5174 ## 567 中正區 2024-03-31 22:14:19 25.02965 121.5142 ## 568 中正區 2024-03-31 22:09:19 25.02890 121.5097 ## 569 中正區 2024-03-31 23:06:18 25.03796 121.5326 ## 570 中正區 2024-03-31 23:01:20 25.04032 121.5314 ## 571 中正區 2024-03-31 23:01:20 25.02750 121.5101 ## 572 中山區 2024-03-31 21:52:18 25.08251 121.5400 ## 573 中山區 2024-03-31 22:38:17 25.07805 121.5295 ## 574 中山區 2024-03-31 22:03:20 25.08030 121.5625 ## 575 中山區 2024-03-31 21:11:18 25.08524 121.5375 ## 576 中山區 2024-03-31 23:09:18 25.08258 121.5446 ## 577 中山區 2024-03-31 22:54:18 25.08009 121.5523 ## 578 中山區 2024-03-31 23:01:20 25.08474 121.5497 ## 579 中山區 2024-03-31 22:45:19 25.08401 121.5554 ## 580 中山區 2024-03-31 22:12:19 25.07985 121.5561 ## 581 中山區 2024-03-31 23:06:17 25.07976 121.5581 ## 582 中山區 2024-03-31 23:04:18 25.07923 121.5473 ## 583 中山區 2024-03-31 23:08:19 25.04585 121.5438 ## 584 中山區 2024-03-31 23:08:19 25.05176 121.5422 ## 585 中山區 2024-03-31 23:02:17 25.04833 121.5347 ## 586 中山區 2024-03-31 23:03:18 25.04861 121.5293 ## 587 中山區 2024-03-31 23:06:18 25.04796 121.5244 ## 588 中山區 2024-03-31 23:09:18 25.05194 121.5277 ## 589 中山區 2024-03-31 22:57:36 25.05316 121.5315 ## 590 中山區 2024-03-31 22:45:19 25.05025 121.5327 ## 591 中山區 2024-03-31 22:45:19 25.05639 121.5275 ## 592 中山區 2024-03-31 22:52:18 25.06642 121.5374 ## 593 中山區 2024-03-31 22:49:14 25.05778 121.5369 ## 594 中山區 2024-03-31 23:08:18 25.05606 121.5417 ## 595 中山區 2024-03-31 23:09:14 25.06106 121.5441 ## 596 中山區 2024-03-31 23:09:18 25.06045 121.5408 ## 597 中山區 2024-03-31 21:59:18 25.05469 121.5369 ## 598 中山區 2024-03-31 23:07:18 25.05214 121.5368 ## 599 中山區 2024-03-31 22:56:14 25.05246 121.5332 ## 600 中山區 2024-03-31 23:04:18 25.04762 121.5404 ## 601 中山區 2024-03-31 22:28:19 25.05604 121.5317 ## 602 中山區 2024-03-31 23:02:18 25.04710 121.5277 ## 603 中山區 2024-03-31 22:31:09 25.04699 121.5374 ## 604 中山區 2024-03-31 23:08:18 25.06140 121.5393 ## 605 中山區 2024-03-31 23:09:18 25.06225 121.5411 ## 606 中山區 2024-03-31 23:08:19 25.06246 121.5271 ## 607 中山區 2024-03-31 23:07:18 25.05992 121.5333 ## 608 中山區 2024-03-31 22:59:18 25.06531 121.5256 ## 609 中山區 2024-03-31 23:05:18 25.06283 121.5270 ## 610 中山區 2024-03-31 23:08:19 25.06491 121.5245 ## 611 中山區 2024-03-31 22:52:14 25.06652 121.5276 ## 612 中山區 2024-03-31 22:53:18 25.06847 121.5256 ## 613 中山區 2024-03-31 22:38:17 25.06987 121.5229 ## 614 中山區 2024-03-31 22:14:19 25.06816 121.5226 ## 615 中山區 2024-03-31 23:01:20 25.04983 121.5285 ## 616 中山區 2024-03-31 23:03:14 25.05201 121.5256 ## 617 中山區 2024-03-31 20:58:14 25.05337 121.5289 ## 618 中山區 2024-03-31 22:46:14 25.05583 121.5282 ## 619 中山區 2024-03-31 22:48:18 25.06682 121.5421 ## 620 中山區 2024-03-31 22:19:14 25.06505 121.5437 ## 621 中山區 2024-03-31 22:54:14 25.06424 121.5404 ## 622 中山區 2024-03-31 22:56:19 25.06251 121.5376 ## 623 中山區 2024-03-31 23:05:19 25.06585 121.5334 ## 624 中山區 2024-03-31 22:58:18 25.06533 121.5318 ## 625 中山區 2024-03-31 22:48:18 25.06595 121.5304 ## 626 中山區 2024-03-31 23:06:17 25.06833 121.5328 ## 627 中山區 2024-03-31 22:31:09 25.07154 121.5306 ## 628 中山區 2024-03-31 22:48:18 25.06185 121.5226 ## 629 中山區 2024-03-31 22:49:18 25.04573 121.5351 ## 630 中山區 2024-03-31 22:46:14 25.05228 121.5218 ## 631 中山區 2024-03-31 22:39:18 25.06416 121.5220 ## 632 中山區 2024-03-31 22:21:21 25.06839 121.5303 ## 633 中山區 2024-03-31 22:32:17 25.05867 121.5331 ## 634 中山區 2024-03-31 22:59:17 25.05497 121.5254 ## 635 中山區 2024-03-31 23:08:18 25.06503 121.5368 ## 636 中山區 2024-03-31 23:03:18 25.04985 121.5331 ## 637 中山區 2024-03-31 22:09:19 25.04836 121.5367 ## 638 中山區 2024-03-31 22:32:18 25.04611 121.5319 ## 639 中山區 2024-03-31 23:04:18 25.06269 121.5306 ## 640 中山區 2024-03-31 22:57:19 25.06510 121.5224 ## 641 中山區 2024-03-31 22:12:19 25.05575 121.5217 ## 642 中山區 2024-03-31 22:40:21 25.05680 121.5319 ## 643 中山區 2024-03-31 23:04:18 25.05731 121.5302 ## 644 中山區 2024-03-31 23:07:18 25.05808 121.5289 ## 645 中山區 2024-03-31 23:06:18 25.05794 121.5424 ## 646 中山區 2024-03-31 23:09:17 25.06028 121.5299 ## 647 中山區 2024-03-31 23:04:18 25.05606 121.5229 ## 648 中山區 2024-03-31 23:01:14 25.05873 121.5249 ## 649 中山區 2024-03-31 22:36:18 25.05955 121.5274 ## 650 中山區 2024-03-31 22:44:18 25.07340 121.5399 ## 651 中山區 2024-03-31 17:29:14 25.07275 121.5373 ## 652 中山區 2024-03-31 22:40:25 25.06807 121.5367 ## 653 中山區 2024-03-31 23:08:18 25.05619 121.5395 ## 654 中山區 2024-03-31 23:06:18 25.06597 121.5412 ## 655 中山區 2024-03-31 23:09:17 25.06142 121.5230 ## 656 中山區 2024-03-31 22:15:19 25.08303 121.5604 ## 657 中山區 2024-03-31 22:42:18 25.06157 121.5244 ## 658 中山區 2024-03-31 22:59:18 25.05189 121.5352 ## 659 中山區 2024-03-31 22:51:18 25.05205 121.5401 ## 660 中山區 2024-03-31 22:49:18 25.06389 121.5192 ## 661 中山區 2024-03-31 22:27:19 25.08152 121.5465 ## 662 中山區 2024-03-31 23:07:18 25.08010 121.5471 ## 663 中山區 2024-03-31 23:09:18 25.05120 121.5331 ## 664 中山區 2024-03-31 22:09:19 25.07864 121.5556 ## 665 中山區 2024-03-31 22:54:18 25.05791 121.5311 ## 666 中山區 2024-03-31 22:45:19 25.05765 121.5330 ## 667 中山區 2024-03-31 23:06:18 25.05277 121.5301 ## 668 中山區 2024-03-31 22:59:18 25.05481 121.5303 ## 669 中山區 2024-03-31 23:08:14 25.05488 121.5314 ## 670 中山區 2024-03-31 22:49:14 25.05215 121.5328 ## 671 中山區 2024-03-31 23:08:18 25.05215 121.5317 ## 672 中山區 2024-03-31 22:15:14 25.05499 121.5329 ## 673 中山區 2024-03-31 23:08:18 25.07802 121.5351 ## 674 中山區 2024-03-31 21:28:17 25.06873 121.5200 ## 675 中山區 2024-03-31 23:06:13 25.06493 121.5278 ## 676 中山區 2024-03-31 23:06:18 25.06532 121.5285 ## 677 中山區 2024-03-31 22:56:19 25.07934 121.5467 ## 678 中山區 2024-03-31 22:33:17 25.07983 121.5524 ## 679 中山區 2024-03-31 23:08:18 25.06245 121.5304 ## 680 中山區 2024-03-31 23:09:18 25.05473 121.5403 ## 681 中山區 2024-03-31 22:28:18 25.06305 121.5278 ## 682 中山區 2024-03-31 22:58:18 25.05476 121.5369 ## 683 中山區 2024-03-31 23:09:18 25.06432 121.5335 ## 684 中山區 2024-03-31 22:48:17 25.07063 121.5233 ## 685 中山區 2024-03-31 22:54:18 25.08476 121.5379 ## 686 中山區 2024-03-31 22:35:19 25.07818 121.5618 ## 687 中山區 2024-03-31 23:06:17 25.05223 121.5258 ## 688 中山區 2024-03-31 22:39:18 25.07825 121.5534 ## 689 中山區 2024-03-31 23:04:18 25.05339 121.5401 ## 690 中山區 2024-03-31 23:09:18 25.06819 121.5277 ## 691 中山區 2024-03-31 23:03:14 25.05253 121.5426 ## 692 中山區 2024-03-31 23:09:18 25.04478 121.5366 ## 693 中山區 2024-03-31 22:50:20 25.05004 121.5404 ## 694 中山區 2024-03-31 22:51:17 25.08431 121.5476 ## 695 中山區 2024-03-31 23:01:20 25.05196 121.5433 ## 696 中山區 2024-03-31 22:43:17 25.06228 121.5370 ## 697 中山區 2024-03-31 23:03:18 25.06688 121.5257 ## 698 中山區 2024-03-31 22:13:19 25.07059 121.5281 ## 699 中山區 2024-03-31 21:56:19 25.04699 121.5307 ## 700 中山區 2024-03-31 23:06:17 25.05532 121.5277 ## 701 中山區 2024-03-31 23:09:18 25.08519 121.5550 ## 702 中山區 2024-03-31 22:46:18 25.08272 121.5562 ## 703 中山區 2024-03-31 23:07:14 25.05427 121.5390 ## 704 中山區 2024-03-31 23:07:18 25.05418 121.5433 ## 705 中山區 2024-03-31 23:09:14 25.06419 121.5373 ## 706 中山區 2024-03-31 23:06:17 25.05676 121.5227 ## 707 中山區 2024-03-31 23:02:17 25.04480 121.5421 ## 708 中山區 2024-03-31 21:46:18 25.04812 121.5217 ## 709 中山區 2024-03-31 23:05:14 25.05236 121.5221 ## 710 中山區 2024-03-31 22:56:19 25.05959 121.5368 ## 711 中山區 2024-03-31 22:16:19 25.04919 121.5420 ## 712 中山區 2024-03-31 22:34:18 25.04992 121.5438 ## 713 中山區 2024-03-31 23:08:19 25.06037 121.5328 ## 714 中山區 2024-03-31 21:32:18 25.06617 121.5353 ## 715 中山區 2024-03-31 23:07:17 25.04808 121.5290 ## 716 中山區 2024-03-31 22:53:14 25.05366 121.5328 ## 717 中山區 2024-03-31 22:01:20 25.07702 121.5664 ## 718 中山區 2024-03-31 23:04:18 25.07965 121.5415 ## 719 中山區 2024-03-31 23:04:18 25.06246 121.5432 ## 720 中山區 2024-03-31 22:56:19 25.05484 121.5352 ## 721 中山區 2024-03-31 21:16:18 25.08578 121.5523 ## 722 內湖區 2024-03-31 23:03:17 25.09122 121.5596 ## 723 內湖區 2024-03-31 22:18:18 25.08378 121.5621 ## 724 內湖區 2024-03-31 23:05:18 25.07977 121.5645 ## 725 內湖區 2024-03-31 21:31:08 25.08284 121.5645 ## 726 內湖區 2024-03-31 23:01:20 25.08637 121.5609 ## 727 內湖區 2024-03-31 23:07:17 25.08707 121.5641 ## 728 內湖區 2024-03-31 23:01:20 25.08637 121.5657 ## 729 內湖區 2024-03-31 22:12:19 25.08260 121.5716 ## 730 內湖區 2024-03-31 21:59:18 25.08398 121.5773 ## 731 內湖區 2024-03-31 21:33:18 25.08522 121.5746 ## 732 內湖區 2024-03-31 22:59:18 25.08803 121.5996 ## 733 內湖區 2024-03-31 23:04:18 25.07021 121.6159 ## 734 內湖區 2024-03-31 22:37:18 25.07177 121.6149 ## 735 內湖區 2024-03-31 23:03:17 25.07450 121.5739 ## 736 內湖區 2024-03-31 22:57:19 25.07524 121.5772 ## 737 內湖區 2024-03-31 22:54:18 25.08395 121.6018 ## 738 內湖區 2024-03-31 21:59:18 25.07958 121.5934 ## 739 內湖區 2024-03-31 22:10:31 25.07864 121.5918 ## 740 內湖區 2024-03-31 23:05:14 25.08301 121.5664 ## 741 內湖區 2024-03-31 23:01:35 25.08205 121.5672 ## 742 內湖區 2024-03-31 23:09:17 25.07932 121.5687 ## 743 內湖區 2024-03-31 22:48:17 25.08296 121.5752 ## 744 內湖區 2024-03-31 22:12:18 25.08598 121.5720 ## 745 內湖區 2024-03-31 22:45:19 25.08436 121.5948 ## 746 內湖區 2024-03-31 23:04:18 25.08780 121.5923 ## 747 內湖區 2024-03-31 23:08:19 25.08785 121.5879 ## 748 內湖區 2024-03-31 23:04:18 25.07842 121.5846 ## 749 內湖區 2024-03-31 21:12:17 25.07695 121.5876 ## 750 內湖區 2024-03-31 22:44:18 25.07504 121.5837 ## 751 內湖區 2024-03-31 23:08:14 25.07758 121.5838 ## 752 內湖區 2024-03-31 23:02:18 25.07777 121.5796 ## 753 內湖區 2024-03-31 22:31:09 25.07538 121.5808 ## 754 內湖區 2024-03-31 22:10:31 25.05575 121.5849 ## 755 內湖區 2024-03-31 21:38:18 25.05590 121.5799 ## 756 內湖區 2024-03-31 22:33:18 25.05768 121.5816 ## 757 內湖區 2024-03-31 22:59:17 25.05653 121.5834 ## 758 內湖區 2024-03-31 22:53:18 25.05390 121.5808 ## 759 內湖區 2024-03-31 21:49:18 25.06915 121.5890 ## 760 內湖區 2024-03-31 17:21:18 25.07007 121.6205 ## 761 內湖區 2024-03-31 23:04:18 25.06181 121.5945 ## 762 內湖區 2024-03-31 21:26:17 25.06256 121.5861 ## 763 內湖區 2024-03-31 22:39:18 25.05827 121.5871 ## 764 內湖區 2024-03-31 22:28:19 25.06058 121.5911 ## 765 內湖區 2024-03-31 22:31:09 25.06835 121.5832 ## 766 內湖區 2024-03-31 22:53:18 25.07335 121.5795 ## 767 內湖區 2024-03-31 21:17:29 25.06853 121.5781 ## 768 內湖區 2024-03-31 22:46:18 25.06709 121.5800 ## 769 內湖區 2024-03-31 22:53:18 25.06286 121.5750 ## 770 內湖區 2024-03-31 23:05:18 25.05594 121.5786 ## 771 內湖區 2024-03-31 22:31:09 25.05301 121.5759 ## 772 內湖區 2024-03-31 23:07:18 25.07151 121.5899 ## 773 內湖區 2024-03-31 23:01:20 25.06877 121.5927 ## 774 內湖區 2024-03-31 22:56:19 25.06740 121.5975 ## 775 內湖區 2024-03-31 22:45:19 25.07249 121.6080 ## 776 內湖區 2024-03-31 22:47:17 25.07332 121.6022 ## 777 內湖區 2024-03-31 21:59:18 25.07330 121.5983 ## 778 內湖區 2024-03-31 22:38:17 25.07988 121.5829 ## 779 內湖區 2024-03-31 22:36:18 25.08317 121.5811 ## 780 內湖區 2024-03-31 22:43:17 25.08357 121.5853 ## 781 內湖區 2024-03-31 22:40:26 25.08165 121.5889 ## 782 內湖區 2024-03-31 23:08:18 25.08350 121.5945 ## 783 內湖區 2024-03-31 21:29:17 25.07896 121.5992 ## 784 內湖區 2024-03-31 22:31:09 25.07792 121.5935 ## 785 內湖區 2024-03-31 22:46:18 25.06657 121.6136 ## 786 內湖區 2024-03-31 22:56:19 25.07669 121.6171 ## 787 內湖區 2024-03-31 20:41:18 25.08722 121.6231 ## 788 內湖區 2024-03-31 23:09:18 25.07967 121.5758 ## 789 內湖區 2024-03-31 22:36:18 25.07334 121.6196 ## 790 內湖區 2024-03-31 20:56:19 25.06261 121.5933 ## 791 內湖區 2024-03-31 22:10:31 25.06209 121.6035 ## 792 內湖區 2024-03-31 23:01:20 25.06927 121.6102 ## 793 內湖區 2024-03-31 22:07:20 25.07160 121.6094 ## 794 內湖區 2024-03-31 23:08:19 25.05707 121.5766 ## 795 內湖區 2024-03-31 20:03:18 25.05503 121.5782 ## 796 內湖區 2024-03-31 22:27:19 25.06516 121.5956 ## 797 內湖區 2024-03-31 22:40:25 25.06708 121.6006 ## 798 內湖區 2024-03-31 22:49:18 25.06854 121.6153 ## 799 內湖區 2024-03-31 23:02:17 25.08373 121.5941 ## 800 內湖區 2024-03-31 22:01:20 25.07611 121.5749 ## 801 內湖區 2024-03-31 23:09:18 25.07296 121.5760 ## 802 內湖區 2024-03-31 22:57:18 25.08554 121.5908 ## 803 內湖區 2024-03-31 22:26:18 25.07943 121.5954 ## 804 內湖區 2024-03-31 22:04:21 25.07567 121.6118 ## 805 內湖區 2024-03-31 22:48:18 25.07415 121.6107 ## 806 內湖區 2024-03-31 22:05:21 25.07514 121.6086 ## 807 內湖區 2024-03-31 15:54:18 25.05892 121.5735 ## 808 內湖區 2024-03-31 22:25:19 25.06682 121.5907 ## 809 內湖區 2024-03-31 22:59:13 25.05876 121.5806 ## 810 內湖區 2024-03-31 15:39:18 25.06455 121.5826 ## 811 內湖區 2024-03-31 23:01:20 25.08105 121.5921 ## 812 內湖區 2024-03-31 19:50:25 25.08151 121.5976 ## 813 內湖區 2024-03-31 22:26:18 25.06851 121.5956 ## 814 內湖區 2024-03-31 21:57:02 25.06434 121.5940 ## 815 內湖區 2024-03-31 22:07:19 25.07848 121.5749 ## 816 內湖區 2024-03-31 22:43:17 25.08844 121.5612 ## 817 內湖區 2024-03-31 20:26:17 25.08454 121.5840 ## 818 內湖區 2024-03-31 20:17:30 25.06060 121.5829 ## 819 內湖區 2024-03-31 23:09:14 25.06017 121.5755 ## 820 內湖區 2024-03-31 20:44:18 25.06007 121.6014 ## 821 內湖區 2024-03-31 22:57:14 25.07433 121.5858 ## 822 內湖區 2024-03-31 22:44:17 25.05928 121.5862 ## 823 內湖區 2024-03-31 21:08:18 25.08503 121.5637 ## 824 內湖區 2024-03-31 20:01:49 25.06935 121.5869 ## 825 內湖區 2024-03-31 21:09:18 25.07168 121.5812 ## 826 內湖區 2024-03-31 23:03:17 25.06664 121.6135 ## 827 內湖區 2024-03-31 21:25:19 25.06874 121.5892 ## 828 內湖區 2024-03-31 23:04:14 25.08627 121.5914 ## 829 內湖區 2024-03-31 13:46:18 25.07038 121.6035 ## 830 內湖區 2024-03-31 23:01:20 25.07676 121.5743 ## 831 內湖區 2024-03-31 22:05:20 25.07777 121.5756 ## 832 內湖區 2024-03-31 22:48:17 25.07192 121.6196 ## 833 內湖區 2024-03-31 22:46:18 25.08120 121.5707 ## 834 內湖區 2024-03-31 23:05:19 25.07823 121.5898 ## 835 內湖區 2024-03-31 22:57:41 25.08781 121.5587 ## 836 內湖區 2024-03-31 19:34:18 25.07243 121.5742 ## 837 內湖區 2024-03-31 22:17:32 25.07392 121.6154 ## 838 內湖區 2024-03-31 21:08:18 25.06671 121.5891 ## 839 內湖區 2024-03-31 17:07:18 25.07849 121.6167 ## 840 內湖區 2024-03-31 22:37:18 25.07539 121.6203 ## 841 內湖區 2024-03-31 22:57:41 25.08004 121.5757 ## 842 內湖區 2024-03-31 22:40:25 25.06058 121.5866 ## 843 內湖區 2024-03-31 21:21:18 25.06365 121.5861 ## 844 內湖區 2024-03-31 22:16:19 25.06321 121.5768 ## 845 內湖區 2024-03-31 16:53:18 25.06766 121.5746 ## 846 內湖區 2024-03-31 22:31:09 25.08968 121.5835 ## 847 內湖區 2024-03-31 19:35:19 25.08416 121.5966 ## 848 內湖區 2024-03-31 23:08:19 25.07350 121.6126 ## 849 內湖區 2024-03-31 22:58:18 25.08227 121.5909 ## 850 內湖區 2024-03-31 22:56:19 25.06643 121.6173 ## 851 內湖區 2024-03-31 23:09:17 25.08464 121.5794 ## 852 內湖區 2024-03-31 21:41:18 25.07860 121.5830 ## 853 內湖區 2024-03-31 23:04:18 25.06265 121.5743 ## 854 內湖區 2024-03-31 21:50:25 25.06126 121.5820 ## 855 內湖區 2024-03-31 20:21:19 25.07210 121.6099 ## 856 內湖區 2024-03-31 19:19:18 25.08019 121.5632 ## 857 內湖區 2024-03-31 18:50:29 25.08156 121.5623 ## 858 內湖區 2024-03-31 19:46:17 25.08067 121.5656 ## 859 內湖區 2024-03-31 22:48:17 25.08202 121.5686 ## 860 內湖區 2024-03-31 22:28:18 25.06749 121.5778 ## 861 內湖區 2024-03-31 22:38:17 25.06888 121.5771 ## 862 內湖區 2024-03-31 23:09:17 25.07345 121.5785 ## 863 內湖區 2024-03-31 22:43:17 25.07821 121.5710 ## 864 內湖區 2024-03-31 21:10:25 25.07733 121.5727 ## 865 內湖區 2024-03-31 23:02:17 25.07897 121.5737 ## 866 內湖區 2024-03-31 22:12:19 25.08049 121.5736 ## 867 內湖區 2024-03-31 22:09:19 25.06805 121.5849 ## 868 內湖區 2024-03-31 19:04:19 25.06605 121.5821 ## 869 內湖區 2024-03-31 21:32:18 25.06407 121.5779 ## 870 內湖區 2024-03-31 22:32:18 25.06151 121.5781 ## 871 內湖區 2024-03-31 22:37:18 25.08152 121.5649 ## 872 內湖區 2024-03-31 13:29:18 25.08203 121.5630 ## 873 內湖區 2024-03-31 18:49:18 25.08318 121.5615 ## 874 內湖區 2024-03-31 18:29:18 25.07941 121.5728 ## 875 內湖區 2024-03-31 22:36:17 25.07074 121.6180 ## 876 內湖區 2024-03-31 22:29:19 25.08035 121.5705 ## 877 內湖區 2024-03-31 23:07:18 25.07983 121.5962 ## 878 內湖區 2024-03-31 22:57:18 25.08227 121.5671 ## 879 內湖區 2024-03-31 20:12:18 25.06153 121.6003 ## 880 內湖區 2024-03-31 21:14:18 25.08514 121.5616 ## 881 內湖區 2024-03-31 18:56:19 25.07567 121.5734 ## 882 內湖區 2024-03-31 22:47:13 25.07862 121.5880 ## 883 內湖區 2024-03-30 14:06:19 25.06099 121.5966 ## 884 內湖區 2024-03-31 22:57:19 25.07264 121.6069 ## 885 內湖區 2024-03-31 17:12:20 25.07595 121.6226 ## 886 內湖區 2024-03-31 22:01:20 25.08438 121.5788 ## 887 內湖區 2024-03-31 15:43:18 25.06092 121.5890 ## 888 北投區 2024-03-31 22:49:17 25.11680 121.5048 ## 889 北投區 2024-03-31 22:21:21 25.10981 121.4989 ## 890 北投區 2024-03-31 23:07:18 25.11357 121.5225 ## 891 北投區 2024-03-31 22:10:31 25.10896 121.5194 ## 892 北投區 2024-03-31 22:49:18 25.10788 121.5146 ## 893 北投區 2024-03-31 21:24:18 25.12416 121.5261 ## 894 北投區 2024-03-31 21:17:29 25.11739 121.4629 ## 895 北投區 2024-03-31 21:57:02 25.11884 121.4691 ## 896 北投區 2024-03-31 22:31:18 25.12030 121.4665 ## 897 北投區 2024-03-31 20:37:18 25.13149 121.4737 ## 898 北投區 2024-03-31 22:03:19 25.12397 121.4671 ## 899 北投區 2024-03-31 22:18:18 25.12618 121.4674 ## 900 北投區 2024-03-31 22:21:21 25.12796 121.4678 ## 901 北投區 2024-03-31 19:46:17 25.12310 121.4709 ## 902 北投區 2024-03-31 22:46:18 25.13780 121.4863 ## 903 北投區 2024-03-31 21:35:19 25.13666 121.4816 ## 904 北投區 2024-03-31 22:19:19 25.13475 121.4961 ## 905 北投區 2024-03-31 21:02:18 25.13997 121.4897 ## 906 北投區 2024-03-31 23:06:17 25.13776 121.4934 ## 907 北投區 2024-03-31 21:44:18 25.14582 121.4930 ## 908 北投區 2024-03-31 22:23:19 25.13691 121.4999 ## 909 北投區 2024-03-31 23:06:18 25.13733 121.5034 ## 910 北投區 2024-03-31 22:39:17 25.13187 121.4990 ## 911 北投區 2024-03-31 23:09:18 25.12634 121.5010 ## 912 北投區 2024-03-31 21:27:18 25.12297 121.5016 ## 913 北投區 2024-03-31 22:59:17 25.12725 121.5068 ## 914 北投區 2024-03-31 21:21:39 25.12814 121.4978 ## 915 北投區 2024-03-31 22:56:19 25.11798 121.5034 ## 916 北投區 2024-03-31 22:04:21 25.12666 121.5037 ## 917 北投區 2024-03-31 22:53:18 25.12087 121.5052 ## 918 北投區 2024-03-31 23:07:17 25.11666 121.5096 ## 919 北投區 2024-03-31 22:19:19 25.11912 121.5122 ## 920 北投區 2024-03-31 22:56:19 25.11451 121.5157 ## 921 北投區 2024-03-31 22:56:19 25.11752 121.5166 ## 922 北投區 2024-03-31 22:58:18 25.11542 121.5147 ## 923 北投區 2024-03-31 23:02:17 25.11753 121.5219 ## 924 北投區 2024-03-31 23:09:18 25.11440 121.5131 ## 925 北投區 2024-03-31 23:02:17 25.11865 121.5235 ## 926 北投區 2024-03-31 20:42:18 25.11978 121.5042 ## 927 北投區 2024-03-31 22:25:19 25.11587 121.5058 ## 928 北投區 2024-03-31 23:04:18 25.11093 121.5138 ## 929 北投區 2024-03-31 22:45:19 25.11370 121.5244 ## 930 北投區 2024-03-31 20:32:17 25.10467 121.5165 ## 931 北投區 2024-03-31 23:04:18 25.12501 121.4716 ## 932 北投區 2024-03-31 19:53:18 25.13539 121.4780 ## 933 北投區 2024-03-31 22:01:20 25.12081 121.5135 ## 934 北投區 2024-03-31 23:09:17 25.13675 121.5022 ## 935 北投區 2024-03-31 22:33:18 25.13872 121.5021 ## 936 北投區 2024-03-31 22:57:41 25.11272 121.5092 ## 937 北投區 2024-03-31 22:10:31 25.11416 121.5077 ## 938 北投區 2024-03-31 23:06:17 25.11000 121.5184 ## 939 北投區 2024-03-31 23:06:17 25.13102 121.5041 ## 940 北投區 2024-03-31 20:58:17 25.10032 121.5060 ## 941 北投區 2024-03-31 22:14:14 25.14319 121.4962 ## 942 北投區 2024-03-31 21:10:25 25.10065 121.5111 ## 943 北投區 2024-03-31 22:49:18 25.14058 121.4992 ## 944 北投區 2024-03-31 20:37:18 25.14045 121.5045 ## 945 北投區 2024-03-31 23:09:17 25.11535 121.5174 ## 946 北投區 2024-03-31 22:56:19 25.12287 121.5037 ## 947 北投區 2024-03-31 16:15:15 25.14193 121.5083 ## 948 北投區 2024-03-31 22:52:18 25.12533 121.5057 ## 949 北投區 2024-03-31 22:38:17 25.11857 121.5185 ## 950 北投區 2024-03-31 16:15:15 25.12862 121.5033 ## 951 北投區 2024-03-31 20:50:25 25.10940 121.5125 ## 952 北投區 2024-03-31 22:13:19 25.13774 121.5014 ## 953 北投區 2024-03-31 22:57:18 25.13597 121.4970 ## 954 北投區 2024-03-31 22:50:25 25.13431 121.5023 ## 955 北投區 2024-03-31 23:09:17 25.12757 121.4721 ## 956 北投區 2024-03-31 21:03:18 25.14319 121.4909 ## 957 北投區 2024-03-31 21:31:18 25.13684 121.5079 ## 958 北投區 2024-03-31 22:56:19 25.14390 121.4945 ## 959 北投區 2024-03-31 23:09:17 25.13258 121.4986 ## 960 北投區 2024-03-31 21:21:18 25.11879 121.5192 ## 961 北投區 2024-03-31 22:36:17 25.12082 121.5073 ## 962 北投區 2024-03-31 22:18:19 25.13043 121.5002 ## 963 北投區 2024-03-31 23:07:18 25.13076 121.4735 ## 964 北投區 2024-03-31 20:42:18 25.10171 121.5126 ## 965 北投區 2024-03-31 23:04:14 25.13201 121.4982 ## 966 北投區 2024-03-31 18:45:19 25.10392 121.5124 ## 967 北投區 2024-03-31 20:54:17 25.12595 121.5110 ## 968 北投區 2024-03-31 23:02:17 25.13713 121.4971 ## 969 北投區 2024-03-31 22:52:18 25.14190 121.4989 ## 970 北投區 2024-03-31 22:31:09 25.12307 121.4991 ## 971 北投區 2024-03-31 22:28:18 25.11969 121.5017 ## 972 北投區 2024-03-31 22:52:18 25.10576 121.5173 ## 973 北投區 2024-03-31 21:40:26 25.13905 121.5001 ## 974 北投區 2024-03-31 21:17:28 25.11955 121.4673 ## 975 北投區 2024-03-31 21:21:18 25.12518 121.4692 ## 976 北投區 2024-03-31 21:57:02 25.11483 121.4993 ## 977 北投區 2024-03-31 16:15:15 25.12231 121.4996 ## 978 松山區 2024-03-31 23:08:19 25.04987 121.5778 ## 979 松山區 2024-03-31 22:56:19 25.05009 121.5720 ## 980 松山區 2024-03-31 22:53:18 25.05503 121.5688 ## 981 松山區 2024-03-31 22:51:18 25.04878 121.5609 ## 982 松山區 2024-03-31 22:39:14 25.05136 121.5628 ## 983 松山區 2024-03-31 23:09:17 25.05155 121.5636 ## 984 松山區 2024-03-31 23:09:17 25.04937 121.5580 ## 985 松山區 2024-03-31 23:09:18 25.05152 121.5646 ## 986 松山區 2024-03-31 22:09:19 25.05492 121.5670 ## 987 松山區 2024-03-31 23:03:17 25.06220 121.5456 ## 988 松山區 2024-03-31 22:47:18 25.06374 121.5477 ## 989 松山區 2024-03-31 22:58:18 25.06095 121.5473 ## 990 松山區 2024-03-31 23:06:17 25.05804 121.5490 ## 991 松山區 2024-03-31 23:01:20 25.05460 121.5449 ## 992 松山區 2024-03-31 22:35:18 25.06190 121.5633 ## 993 松山區 2024-03-31 23:04:18 25.05907 121.5631 ## 994 松山區 2024-03-31 23:01:20 25.05157 121.5512 ## 995 松山區 2024-03-31 22:48:18 25.04826 121.5524 ## 996 松山區 2024-03-31 23:01:20 25.05633 121.5529 ## 997 松山區 2024-03-31 23:09:18 25.06118 121.5510 ## 998 松山區 2024-03-31 22:51:18 25.06200 121.5602 ## 999 松山區 2024-03-31 23:06:17 25.05925 121.5689 ## 1000 松山區 2024-03-31 23:05:18 25.05834 121.5550 ## 1001 松山區 2024-03-31 22:59:17 25.06129 121.5667 ## 1002 松山區 2024-03-31 22:40:26 25.04459 121.5525 ## 1003 松山區 2024-03-31 23:01:14 25.04488 121.5499 ## 1004 松山區 2024-01-14 04:19:10 25.05419 121.5563 ## 1005 松山區 2024-03-31 22:53:18 25.05528 121.5590 ## 1006 松山區 2024-03-31 22:56:19 25.05433 121.5654 ## 1007 松山區 2024-03-31 22:47:18 25.06206 121.5547 ## 1008 松山區 2024-03-31 22:57:18 25.04840 121.5659 ## 1009 松山區 2024-03-31 22:57:41 25.04693 121.5577 ## 1010 松山區 2024-03-31 23:08:18 25.04566 121.5566 ## 1011 松山區 2024-03-31 23:09:18 25.05347 121.5544 ## 1012 松山區 2024-03-31 22:52:18 25.04769 121.5448 ## 1013 松山區 2024-03-31 23:07:18 25.05143 121.5572 ## 1014 松山區 2024-03-31 23:09:17 25.05846 121.5595 ## 1015 松山區 2024-03-31 23:06:17 25.05408 121.5610 ## 1016 松山區 2024-03-31 23:01:19 25.05606 121.5635 ## 1017 松山區 2024-03-31 23:01:20 25.04763 121.5611 ## 1018 松山區 2024-03-31 23:07:17 25.04524 121.5466 ## 1019 松山區 2024-03-31 23:07:17 25.05278 121.5448 ## 1020 松山區 2024-03-31 23:08:18 25.05168 121.5451 ## 1021 松山區 2024-03-31 22:54:18 25.06480 121.5679 ## 1022 松山區 2024-03-31 22:49:18 25.04951 121.5494 ## 1023 松山區 2024-03-31 23:02:17 25.05176 121.5535 ## 1024 松山區 2024-03-31 23:01:19 25.05360 121.5487 ## 1025 松山區 2024-03-31 23:05:19 25.05147 121.5768 ## 1026 松山區 2024-03-31 23:04:18 25.05013 121.5764 ## 1027 松山區 2024-03-31 23:01:20 25.06200 121.5447 ## 1028 松山區 2024-03-31 22:56:19 25.05163 121.5591 ## 1029 松山區 2024-03-31 21:24:17 25.06241 121.5683 ## 1030 松山區 2024-03-31 23:01:14 25.05198 121.5681 ## 1031 松山區 2024-03-31 23:06:18 25.05406 121.5641 ## 1032 松山區 2024-03-31 23:01:20 25.05378 121.5589 ## 1033 松山區 2024-03-31 22:57:36 25.04634 121.5542 ## 1034 松山區 2024-03-31 23:01:20 25.05173 121.5561 ## 1035 松山區 2024-03-31 23:01:20 25.04954 121.5526 ## 1036 松山區 2024-03-31 23:04:18 25.05567 121.5671 ## 1037 松山區 2024-03-31 23:01:19 25.05149 121.5653 ## 1038 松山區 2024-03-31 23:09:17 25.04962 121.5775 ## 1039 松山區 2024-03-31 22:51:14 25.05722 121.5571 ## 1040 松山區 2024-03-31 22:48:14 25.05226 121.5493 ## 1041 松山區 2024-03-31 22:56:18 25.04802 121.5486 ## 1042 松山區 2024-03-31 22:54:18 25.06150 121.5633 ## 1043 松山區 2024-03-31 23:08:18 25.04985 121.5719 ## 1044 松山區 2024-03-31 22:51:14 25.05452 121.5464 ## 1045 松山區 2024-03-31 22:38:17 25.04942 121.5750 ## 1046 松山區 2024-03-31 23:04:18 25.05014 121.5769 ## 1047 松山區 2024-03-31 23:03:18 25.05152 121.5524 ## 1048 松山區 2024-03-31 23:09:14 25.05181 121.5521 ## 1049 松山區 2024-03-31 22:07:20 25.05420 121.5491 ## 1050 松山區 2024-03-31 22:49:18 25.05764 121.5444 ## 1051 松山區 2024-03-31 23:03:18 25.04440 121.5540 ## 1052 松山區 2024-03-31 22:42:14 25.05454 121.5542 ## 1053 松山區 2024-03-31 22:52:14 25.05129 121.5643 ## 1054 松山區 2024-03-31 23:09:17 25.05139 121.5706 ## 1055 松山區 2024-03-31 23:09:18 25.06432 121.5454 ## 1056 松山區 2024-03-31 23:07:14 25.05708 121.5649 ## 1057 松山區 2024-03-31 23:04:18 25.04742 121.5631 ## 1058 松山區 2024-03-31 22:34:18 25.06589 121.5453 ## 1059 松山區 2024-03-31 22:41:18 25.06457 121.5646 ## 1060 松山區 2024-03-31 22:57:19 25.05936 121.5659 ## 1061 松山區 2024-03-31 22:45:19 25.06185 121.5500 ## 1062 南港區 2024-03-31 22:31:09 25.04591 121.5923 ## 1063 南港區 2024-03-31 22:53:18 25.04128 121.5909 ## 1064 南港區 2024-03-31 22:54:18 25.05014 121.5924 ## 1065 南港區 2024-03-31 22:48:18 25.04919 121.5883 ## 1066 南港區 2024-03-31 22:59:18 25.04437 121.5813 ## 1067 南港區 2024-03-31 22:43:17 25.04843 121.5815 ## 1068 南港區 2024-03-31 23:09:17 25.04608 121.5832 ## 1069 南港區 2024-03-31 23:08:18 25.04592 121.5882 ## 1070 南港區 2024-03-31 22:59:17 25.04281 121.5861 ## 1071 南港區 2024-03-31 23:02:18 25.04239 121.6168 ## 1072 南港區 2024-03-31 22:31:08 25.04054 121.6137 ## 1073 南港區 2024-03-31 21:07:17 25.04763 121.6115 ## 1074 南港區 2024-03-31 23:07:17 25.05469 121.6167 ## 1075 南港區 2024-03-31 23:05:19 25.04697 121.6137 ## 1076 南港區 2024-03-31 22:09:14 25.04499 121.6178 ## 1077 南港區 2024-03-31 22:53:18 25.04139 121.6191 ## 1078 南港區 2024-03-31 23:05:18 25.03564 121.6141 ## 1079 南港區 2024-03-31 22:13:19 25.05400 121.6133 ## 1080 南港區 2024-03-31 23:01:20 25.05933 121.6168 ## 1081 南港區 2024-03-31 21:49:18 25.05668 121.6114 ## 1082 南港區 2024-03-31 23:07:18 25.05629 121.6070 ## 1083 南港區 2024-03-31 23:09:18 25.05485 121.6087 ## 1084 南港區 2024-03-31 23:04:18 25.05716 121.5979 ## 1085 南港區 2024-03-31 22:51:17 25.05437 121.5942 ## 1086 南港區 2024-03-31 22:53:18 25.05252 121.6092 ## 1087 南港區 2024-03-31 23:01:19 25.05201 121.6074 ## 1088 南港區 2024-03-31 23:02:18 25.05192 121.6064 ## 1089 南港區 2024-03-31 22:47:17 25.05507 121.6028 ## 1090 南港區 2024-03-31 22:36:18 25.03392 121.6098 ## 1091 南港區 2024-03-31 23:08:18 25.04681 121.6170 ## 1092 南港區 2024-03-31 22:02:19 25.04805 121.6159 ## 1093 南港區 2024-03-31 23:05:18 25.05343 121.5995 ## 1094 南港區 2024-03-31 23:05:19 25.05766 121.6040 ## 1095 南港區 2024-03-31 23:07:18 25.05211 121.5984 ## 1096 南港區 2024-03-31 23:05:19 25.05326 121.6066 ## 1097 南港區 2024-03-31 22:56:19 25.05266 121.6128 ## 1098 南港區 2024-03-31 22:41:17 25.05627 121.6137 ## 1099 南港區 2024-03-31 22:56:19 25.05831 121.6142 ## 1100 南港區 2024-03-31 23:06:18 25.03595 121.6169 ## 1101 南港區 2024-03-31 21:50:25 25.05210 121.5905 ## 1102 南港區 2024-03-31 22:07:20 25.05285 121.5928 ## 1103 南港區 2024-03-31 23:03:18 25.05234 121.5815 ## 1104 南港區 2024-03-31 22:31:09 25.05289 121.5860 ## 1105 南港區 2024-03-31 21:57:02 25.05168 121.5828 ## 1106 南港區 2024-03-31 23:03:17 25.05064 121.5803 ## 1107 南港區 2024-03-31 22:21:16 25.04511 121.5836 ## 1108 南港區 2024-03-31 22:37:18 25.04193 121.5849 ## 1109 南港區 2024-03-31 22:57:41 25.03884 121.5879 ## 1110 南港區 2024-03-31 22:47:18 25.06148 121.6138 ## 1111 南港區 2024-03-31 22:50:25 25.05937 121.6107 ## 1112 南港區 2024-03-31 23:01:35 25.05293 121.6055 ## 1113 南港區 2024-03-31 19:27:18 25.04014 121.6177 ## 1114 南港區 2024-03-31 19:24:18 25.06164 121.6127 ## 1115 南港區 2024-03-31 22:17:32 25.06271 121.6160 ## 1116 南港區 2024-03-31 22:57:19 25.05853 121.6098 ## 1117 南港區 2024-03-31 23:01:20 25.05436 121.6181 ## 1118 南港區 2024-03-31 23:09:18 25.05172 121.6169 ## 1119 南港區 2024-03-31 23:05:18 25.03987 121.6201 ## 1120 南港區 2024-03-31 22:56:19 25.05705 121.5927 ## 1121 南港區 2024-03-31 23:01:20 25.05820 121.5937 ## 1122 南港區 2024-03-31 22:29:19 25.05465 121.6185 ## 1123 南港區 2024-03-31 21:40:26 25.05535 121.6184 ## 1124 南港區 2024-03-31 22:26:18 25.04675 121.5873 ## 1125 南港區 2024-03-31 22:21:21 25.04134 121.5932 ## 1126 南港區 2024-03-31 23:04:18 25.04969 121.5803 ## 1127 南港區 2024-03-31 22:31:09 25.04830 121.5943 ## 1128 南港區 2024-03-31 22:46:18 25.05368 121.5997 ## 1129 南港區 2024-03-31 23:08:19 25.05225 121.6077 ## 1130 南港區 2024-03-31 22:59:17 25.05343 121.6063 ## 1131 南港區 2024-03-31 23:09:17 25.04177 121.5874 ## 1132 南港區 2024-03-31 23:04:18 25.04998 121.5838 ## 1133 南港區 2024-03-31 22:11:19 25.03878 121.5930 ## 1134 南港區 2024-03-31 22:40:26 25.04066 121.5888 ## 1135 南港區 2024-03-31 22:57:19 25.05543 121.5892 ## 1136 南港區 2024-03-31 22:54:18 25.04557 121.5863 ## 1137 南港區 2024-03-31 22:31:09 25.05545 121.6165 ## 1138 南港區 2024-03-31 22:01:43 25.03827 121.6227 ## 1139 南港區 2024-03-31 21:51:18 25.05394 121.5912 ## 1140 南港區 2024-03-31 22:57:19 25.05066 121.5943 ## 1141 南港區 2024-03-31 23:09:17 25.04916 121.5891 ## 1142 南港區 2024-03-15 13:02:36 25.04126 121.6118 ## 1143 南港區 2024-03-31 22:21:16 25.05457 121.5878 ## 1144 南港區 2024-03-31 22:13:19 25.05381 121.5864 ## 1145 南港區 2024-03-31 22:03:14 25.04880 121.5874 ## 1146 南港區 2024-03-18 00:17:22 25.05296 121.6171 ## 1147 南港區 2024-03-31 22:59:18 25.04728 121.5861 ## 1148 南港區 2024-03-31 23:05:19 25.04487 121.6148 ## 1149 南港區 2024-03-31 23:04:18 25.05163 121.5953 ## 1150 南港區 2024-03-31 22:34:17 25.05486 121.5944 ## 1151 南港區 2024-03-31 22:09:19 25.04997 121.6162 ## 1152 南港區 2024-03-31 23:01:19 25.05800 121.6219 ## 1153 信義區 2024-03-31 23:01:20 25.02035 121.5577 ## 1154 信義區 2024-03-31 23:03:14 25.02561 121.5541 ## 1155 信義區 2024-03-31 23:09:18 25.02811 121.5567 ## 1156 信義區 2024-03-31 19:07:17 25.01320 121.5633 ## 1157 信義區 2024-03-31 22:45:19 25.01545 121.5613 ## 1158 信義區 2024-03-31 22:56:19 25.02698 121.5584 ## 1159 信義區 2024-03-31 23:05:19 25.02668 121.5618 ## 1160 信義區 2024-03-31 23:02:18 25.02868 121.5593 ## 1161 信義區 2024-03-31 22:44:18 25.03162 121.5740 ## 1162 信義區 2024-03-31 22:40:21 25.03222 121.5697 ## 1163 信義區 2024-03-31 23:07:14 25.02863 121.5698 ## 1164 信義區 2024-03-31 23:01:19 25.02678 121.5688 ## 1165 信義區 2024-03-31 22:19:19 25.03616 121.5698 ## 1166 信義區 2024-03-31 22:32:18 25.03295 121.5687 ## 1167 信義區 2024-03-31 22:46:18 25.03471 121.5730 ## 1168 信義區 2024-03-31 22:54:18 25.03820 121.5750 ## 1169 信義區 2024-03-31 23:08:19 25.02868 121.5667 ## 1170 信義區 2024-03-31 22:47:18 25.03189 121.5668 ## 1171 信義區 2024-03-31 22:47:13 25.03275 121.5634 ## 1172 信義區 2024-03-31 22:42:18 25.03003 121.5629 ## 1173 信義區 2024-03-31 23:09:18 25.03281 121.5576 ## 1174 信義區 2024-03-31 22:57:41 25.03452 121.5576 ## 1175 信義區 2024-03-31 23:08:19 25.03745 121.5602 ## 1176 信義區 2024-03-31 23:06:18 25.03961 121.5720 ## 1177 信義區 2024-03-31 23:07:18 25.03423 121.5764 ## 1178 信義區 2024-03-31 23:08:19 25.03894 121.5791 ## 1179 信義區 2024-03-31 20:32:17 25.03470 121.5802 ## 1180 信義區 2024-03-31 22:31:09 25.03301 121.5810 ## 1181 信義區 2024-03-31 23:05:18 25.03801 121.5654 ## 1182 信義區 2024-03-31 23:04:18 25.03607 121.5653 ## 1183 信義區 2024-03-31 22:47:17 25.03627 121.5638 ## 1184 信義區 2024-03-31 23:01:20 25.03899 121.5637 ## 1185 信義區 2024-03-31 23:07:18 25.03599 121.5622 ## 1186 信義區 2024-03-31 23:05:18 25.03306 121.5662 ## 1187 信義區 2024-03-31 23:07:14 25.03338 121.5633 ## 1188 信義區 2024-03-31 23:07:18 25.04270 121.5811 ## 1189 信義區 2024-03-31 23:04:18 25.03476 121.5687 ## 1190 信義區 2024-03-31 23:03:18 25.03846 121.5862 ## 1191 信義區 2024-03-31 23:07:17 25.03841 121.5836 ## 1192 信義區 2024-03-31 22:42:14 25.03918 121.5665 ## 1193 信義區 2024-03-31 23:09:18 25.04010 121.5682 ## 1194 信義區 2024-03-31 23:09:18 25.04626 121.5704 ## 1195 信義區 2024-03-31 23:09:17 25.02388 121.5698 ## 1196 信義區 2024-03-31 22:59:18 25.01930 121.5710 ## 1197 信義區 2024-03-31 22:44:18 25.04773 121.5690 ## 1198 信義區 2024-03-31 22:51:14 25.04732 121.5721 ## 1199 信義區 2024-03-31 23:08:19 25.04890 121.5784 ## 1200 信義區 2024-03-31 22:54:18 25.04797 121.5743 ## 1201 信義區 2024-03-31 23:03:17 25.04548 121.5721 ## 1202 信義區 2024-03-31 23:08:19 25.02969 121.5577 ## 1203 信義區 2024-03-31 22:56:19 25.04927 121.5721 ## 1204 信義區 2024-03-31 22:36:13 25.04330 121.5638 ## 1205 信義區 2024-03-31 23:01:20 25.03005 121.5576 ## 1206 信義區 2024-03-31 22:25:14 25.04108 121.5629 ## 1207 信義區 2024-03-31 22:51:17 25.02130 121.5703 ## 1208 信義區 2024-03-31 22:57:19 25.04395 121.5818 ## 1209 信義區 2024-03-31 22:59:17 25.04519 121.5771 ## 1210 信義區 2024-03-31 23:07:18 25.04345 121.5754 ## 1211 信義區 2024-03-31 23:07:17 25.04561 121.5755 ## 1212 信義區 2024-03-31 23:07:17 25.04623 121.5777 ## 1213 信義區 2024-03-31 22:57:14 25.04320 121.5779 ## 1214 信義區 2024-03-31 23:03:17 25.03295 121.5712 ## 1215 信義區 2024-03-31 23:01:20 25.03657 121.5735 ## 1216 信義區 2024-03-31 22:58:18 25.03511 121.5637 ## 1217 信義區 2024-03-31 23:07:17 25.03830 121.5762 ## 1218 信義區 2024-03-31 23:08:18 25.04185 121.5720 ## 1219 信義區 2024-03-31 23:07:17 25.04516 121.5670 ## 1220 信義區 2024-03-31 23:07:14 25.04050 121.5754 ## 1221 信義區 2024-03-31 23:07:17 25.02606 121.5631 ## 1222 信義區 2024-03-31 23:07:18 25.03593 121.5791 ## 1223 信義區 2024-03-31 23:07:14 25.03771 121.5612 ## 1224 信義區 2024-03-31 23:01:20 25.03693 121.5754 ## 1225 信義區 2024-03-31 23:08:19 25.03321 121.5587 ## 1226 信義區 2024-03-31 23:09:14 25.03270 121.5616 ## 1227 信義區 2024-03-31 22:59:13 25.02236 121.5627 ## 1228 信義區 2024-03-31 22:56:19 25.04260 121.5838 ## 1229 信義區 2024-03-31 22:56:14 25.03929 121.5875 ## 1230 信義區 2024-03-31 23:06:17 25.03656 121.5687 ## 1231 信義區 2024-03-31 23:08:19 25.03404 121.5660 ## 1232 信義區 2024-03-26 12:18:17 25.03214 121.5597 ## 1233 信義區 2024-03-31 23:09:17 25.02976 121.5642 ## 1234 信義區 2024-03-31 23:07:14 25.04084 121.5679 ## 1235 信義區 2024-03-31 22:37:18 25.04719 121.5806 ## 1236 信義區 2024-03-31 23:08:19 25.02306 121.5704 ## 1237 信義區 2024-03-31 23:04:18 25.02474 121.5674 ## 1238 信義區 2024-03-31 22:43:17 25.04090 121.5705 ## 1239 信義區 2024-03-31 22:49:14 25.03203 121.5615 ## 1240 信義區 2024-03-31 23:09:18 25.03047 121.5684 ## 1241 信義區 2024-03-31 23:06:17 25.03322 121.5743 ## 1242 信義區 2024-03-31 23:08:14 25.04146 121.5673 ## 1243 信義區 2024-03-31 22:37:18 25.02326 121.5633 ## 1244 信義區 2024-03-31 23:01:20 25.02605 121.5577 ## 1245 信義區 2024-03-31 22:40:25 25.02589 121.5607 ## 1246 信義區 2024-03-31 23:08:18 25.02186 121.5553 ## 1247 信義區 2024-03-31 23:05:18 25.04533 121.5791 ## 1248 信義區 2024-03-31 23:09:18 25.03866 121.5808 ## 1249 信義區 2024-03-31 22:47:17 25.02188 121.5589 ## 1250 信義區 2024-03-31 22:57:19 25.04367 121.5674 ## 1251 信義區 2024-03-31 23:09:17 25.02460 121.5603 ## 1252 信義區 2024-03-31 22:53:18 25.04144 121.5613 ## 1253 信義區 2024-03-31 22:01:14 25.04206 121.5579 ## 1254 信義區 2024-03-31 22:57:18 25.04482 121.5580 ## 1255 信義區 2024-03-31 22:36:17 25.04557 121.5806 ## 1256 信義區 2024-03-31 23:01:19 25.02261 121.5718 ## 1257 信義區 2024-03-31 21:42:17 25.04892 121.5691 ## 1258 萬華區 2024-03-31 23:08:14 25.02365 121.4953 ## 1259 萬華區 2024-03-31 23:04:18 25.02160 121.4960 ## 1260 萬華區 2024-03-31 22:48:18 25.01975 121.4973 ## 1261 萬華區 2024-03-31 22:53:14 25.02485 121.5090 ## 1262 萬華區 2024-03-31 23:07:18 25.02442 121.5107 ## 1263 萬華區 2024-03-31 22:58:18 25.02297 121.5084 ## 1264 萬華區 2024-03-31 22:15:19 25.02481 121.5075 ## 1265 萬華區 2024-03-31 22:46:18 25.02594 121.5065 ## 1266 萬華區 2024-03-31 22:38:17 25.02410 121.5029 ## 1267 萬華區 2024-03-31 22:43:17 25.02085 121.5054 ## 1268 萬華區 2024-03-31 22:54:18 25.02964 121.5026 ## 1269 萬華區 2024-03-31 22:56:18 25.02582 121.5025 ## 1270 萬華區 2024-03-31 22:47:18 25.03124 121.5012 ## 1271 萬華區 2024-03-31 22:31:18 25.03116 121.5034 ## 1272 萬華區 2024-03-31 22:35:19 25.03301 121.5016 ## 1273 萬華區 2024-03-31 22:17:32 25.02257 121.4981 ## 1274 萬華區 2024-03-31 23:03:14 25.01688 121.4953 ## 1275 萬華區 2024-03-31 23:03:18 25.02332 121.4926 ## 1276 萬華區 2024-03-31 23:06:17 25.02516 121.4960 ## 1277 萬華區 2024-03-31 22:57:41 25.02744 121.4962 ## 1278 萬華區 2024-03-31 23:05:19 25.03267 121.4976 ## 1279 萬華區 2024-03-31 23:01:20 25.02673 121.4918 ## 1280 萬華區 2024-03-31 21:25:19 25.03284 121.4891 ## 1281 萬華區 2024-03-31 22:46:18 25.03397 121.4903 ## 1282 萬華區 2024-03-31 23:07:17 25.03388 121.4929 ## 1283 萬華區 2024-03-31 22:10:31 25.03203 121.4913 ## 1284 萬華區 2024-03-31 23:06:18 25.03124 121.4908 ## 1285 萬華區 2024-03-31 22:56:19 25.03383 121.4946 ## 1286 萬華區 2024-03-31 23:01:20 25.03253 121.4955 ## 1287 萬華區 2024-03-31 22:43:17 25.02021 121.5038 ## 1288 萬華區 2024-03-31 22:40:26 25.04662 121.5072 ## 1289 萬華區 2024-03-31 23:09:17 25.04441 121.5054 ## 1290 萬華區 2024-03-31 21:37:18 25.04170 121.4999 ## 1291 萬華區 2024-03-31 22:46:14 25.04367 121.5022 ## 1292 萬華區 2024-03-31 23:09:17 25.04099 121.5077 ## 1293 萬華區 2024-03-31 23:07:17 25.03771 121.5066 ## 1294 萬華區 2024-03-31 23:06:18 25.03535 121.4994 ## 1295 萬華區 2024-03-31 22:46:18 25.03550 121.4954 ## 1296 萬華區 2024-03-31 23:02:17 25.03852 121.4988 ## 1297 萬華區 2024-03-31 22:46:18 25.03792 121.5018 ## 1298 萬華區 2024-03-31 22:43:17 25.03364 121.5032 ## 1299 萬華區 2024-03-31 23:09:17 25.03394 121.5012 ## 1300 萬華區 2024-03-31 22:31:04 25.03509 121.5020 ## 1301 萬華區 2024-03-31 22:53:18 25.04445 121.5031 ## 1302 萬華區 2024-03-31 23:06:18 25.04551 121.5032 ## 1303 萬華區 2024-03-31 23:04:18 25.04345 121.5084 ## 1304 萬華區 2024-03-31 22:56:19 25.04030 121.5020 ## 1305 萬華區 2024-03-31 23:09:17 25.02376 121.4999 ## 1306 萬華區 2024-03-31 22:32:18 25.02533 121.4996 ## 1307 萬華區 2024-03-31 22:24:19 25.03517 121.4905 ## 1308 萬華區 2024-03-31 21:19:18 25.03119 121.4886 ## 1309 萬華區 2024-03-31 22:16:19 25.02710 121.4977 ## 1310 萬華區 2024-03-31 22:08:14 25.03606 121.4916 ## 1311 萬華區 2024-03-31 22:36:13 25.03731 121.4953 ## 1312 萬華區 2024-03-31 22:50:25 25.03302 121.4931 ## 1313 萬華區 2024-03-31 22:01:20 25.03035 121.4923 ## 1314 萬華區 2024-03-31 22:19:19 25.01796 121.4999 ## 1315 萬華區 2024-03-31 22:47:17 25.02860 121.4891 ## 1316 萬華區 2024-03-31 22:57:19 25.03646 121.5049 ## 1317 萬華區 2024-03-31 23:02:18 25.04776 121.5061 ## 1318 萬華區 2024-03-31 22:46:18 25.03811 121.5036 ## 1319 萬華區 2024-03-31 23:07:18 25.02926 121.4994 ## 1320 萬華區 2024-03-31 22:59:17 25.02273 121.5027 ## 1321 萬華區 2024-03-31 22:58:18 25.03548 121.5003 ## 1322 萬華區 2024-03-31 22:57:19 25.03170 121.5003 ## 1323 萬華區 2024-03-31 22:27:19 25.02870 121.4916 ## 1324 萬華區 2024-03-31 21:37:14 25.01975 121.4992 ## 1325 萬華區 2024-03-31 22:41:17 25.02768 121.4913 ## 1326 萬華區 2024-03-31 23:08:19 25.01979 121.5009 ## 1327 萬華區 2024-03-31 22:43:17 25.03348 121.5045 ## 1328 萬華區 2024-03-31 23:01:20 25.02039 121.4927 ## 1329 萬華區 2024-03-31 21:38:17 25.02320 121.5003 ## 1330 萬華區 2024-03-31 22:51:17 25.02005 121.5043 ## 1331 萬華區 2024-03-31 22:37:18 25.02114 121.5027 ## 1332 萬華區 2024-03-31 21:17:28 25.01907 121.5022 ## 1333 萬華區 2024-03-31 22:26:18 25.03062 121.4902 ## 1334 萬華區 2024-03-31 22:41:17 25.03010 121.4932 ## 1335 萬華區 2024-03-31 23:09:18 25.02406 121.4964 ## 1336 臺大公館校區 2024-03-31 23:08:19 25.01493 121.5304 ## 1337 臺大公館校區 2024-03-31 23:08:18 25.01466 121.5292 ## 1338 臺大公館校區 2024-03-31 22:42:14 25.01411 121.5300 ## 1339 臺大公館校區 2024-03-31 19:21:18 25.01391 121.5289 ## 1340 臺大公館校區 2024-03-31 23:08:18 25.01525 121.5301 ## 1341 臺大公館校區 2024-03-31 23:03:14 25.01729 121.5453 ## 1342 臺大公館校區 2024-03-31 23:09:17 25.01408 121.5376 ## 1343 臺大公館校區 2024-03-31 22:41:18 25.01839 121.5340 ## 1344 臺大公館校區 2024-03-31 23:09:17 25.01355 121.5367 ## 1345 臺大公館校區 2024-03-31 21:56:14 25.01761 121.5384 ## 1346 臺大公館校區 2024-03-31 23:09:17 25.01547 121.5344 ## 1347 臺大公館校區 2024-03-31 23:05:19 25.01937 121.5390 ## 1348 臺大公館校區 2024-03-31 22:59:13 25.01846 121.5376 ## 1349 臺大公館校區 2024-03-31 22:53:18 25.01616 121.5425 ## 1350 臺大公館校區 2024-03-31 23:09:18 25.01857 121.5406 ## 1351 臺大公館校區 2024-03-31 22:51:18 25.02108 121.5378 ## 1352 臺大公館校區 2024-03-31 22:41:18 25.01941 121.5404 ## 1353 臺大公館校區 2024-03-31 22:42:18 25.01793 121.5358 ## 1354 臺大公館校區 2024-03-31 23:05:19 25.01627 121.5353 ## 1355 臺大公館校區 2024-03-31 22:56:14 25.01666 121.5372 ## 1356 臺大公館校區 2024-03-31 23:03:17 25.01980 121.5358 ## 1357 臺大公館校區 2024-01-14 04:17:15 25.01595 121.5379 ## 1358 臺大公館校區 2024-03-31 22:17:26 25.01566 121.5379 ## 1359 臺大公館校區 2024-03-31 23:09:18 25.01511 121.5379 ## 1360 臺大公館校區 2024-03-31 23:02:18 25.01345 121.5380 ## 1361 臺大公館校區 2024-03-31 23:09:18 25.01603 121.5363 ## 1362 臺大公館校區 2024-03-31 22:48:17 25.01754 121.5440 ## 1363 臺大公館校區 2024-03-31 22:29:14 25.01699 121.5357 ## 1364 臺大公館校區 2024-03-31 22:53:18 25.02157 121.5363 ## 1365 臺大公館校區 2024-03-31 23:09:17 25.02053 121.5414 ## 1366 臺大公館校區 2024-03-31 22:54:18 25.01987 121.5417 ## 1367 臺大公館校區 2024-03-31 21:05:19 25.02074 121.5391 ## 1368 臺大公館校區 2024-03-31 23:08:19 25.01561 121.5358 ## 1369 臺大公館校區 2024-03-31 21:18:18 25.02036 121.5399 ## 1370 臺大公館校區 2024-03-31 21:01:19 25.01881 121.5387 ## 1371 臺大公館校區 2024-03-31 23:09:18 25.01548 121.5383 ## 1372 臺大公館校區 2024-03-31 22:45:19 25.01761 121.5400 ## 1373 臺大公館校區 2024-03-31 22:54:18 25.01922 121.5419 ## 1374 臺大公館校區 2024-03-31 16:07:17 25.01890 121.5360 ## 1375 臺大公館校區 2024-03-31 23:05:18 25.01704 121.5389 ## 1376 臺大公館校區 2024-03-31 23:09:17 25.01698 121.5345 ## 1377 臺大公館校區 2024-03-31 21:46:17 25.01539 121.5369 ## 1378 臺大公館校區 2024-03-31 23:05:18 25.01337 121.5391 ## 1379 臺大公館校區 2024-03-31 17:59:18 25.01703 121.5378 ## 1380 臺大公館校區 2024-03-31 21:27:18 25.01960 121.5385 ## 1381 臺大公館校區 2024-03-31 22:57:36 25.01900 121.5430 ## 1382 臺大公館校區 2024-03-31 22:28:18 25.01857 121.5425 ## 1383 臺大公館校區 2024-03-31 22:53:18 25.01804 121.5393 ## 1384 臺大公館校區 2024-03-31 21:17:29 25.01690 121.5403 ## 1385 臺大公館校區 2024-03-31 23:06:13 25.01995 121.5435 ## 1386 臺大公館校區 2024-03-31 22:48:17 25.01791 121.5424 ## 1387 臺大公館校區 2024-03-31 21:56:19 25.02112 121.5359 ## 1388 臺大公館校區 2024-03-31 20:52:18 25.01816 121.5447 ## ar sareaen ## 1 復興南路二段235號前 Daan Dist. ## 2 復興南路二段273號西側 Daan Dist. ## 3 和平東路二段96巷7號 Daan Dist. ## 4 和平東路二段118巷33號 Daan Dist. ## 5 復興南路二段368號 Daan Dist. ## 6 復興南路二段280號 Daan Dist. ## 7 復興南路二段342號 Daan Dist. ## 8 新生南路三段52號 Daan Dist. ## 9 新生南路三段66號東側 Daan Dist. ## 10 新生南路三段82號 Daan Dist. ## 11 辛亥路一段30號 Daan Dist. ## 12 復興南路二段236號 Daan Dist. ## 13 羅斯福路三段311號 Daan Dist. ## 14 敦南街76巷28號 Daan Dist. ## 15 羅斯福路三段245號 Daan Dist. ## 16 羅斯福路三段283巷11號 Daan Dist. ## 17 臥龍街1號 Daan Dist. ## 18 新生南路三段54巷/溫州街口 Daan Dist. ## 19 羅斯福路四段21號旁天橋下 Daan Dist. ## 20 捷運公館站(2號出口)外側 Daan Dist. ## 21 羅斯福路四段107號(西南側) Daan Dist. ## 22 基隆路四段43號(臺灣科技大學正門旁小側門靠田徑場) Daan Dist. ## 23 基隆路四段73巷與基隆路口 Daan Dist. ## 24 羅斯福路四段113巷基隆路四段41巷口 Daan Dist. ## 25 基隆路四段41巷68弄臺科帆船大樓旁 Daan Dist. ## 26 基隆路三段155巷57號西側 Daan Dist. ## 27 芳蘭路/基隆路三段155巷口 Daan Dist. ## 28 芳蘭路51號西北側 Daan Dist. ## 29 長興街/長興街80巷口西側 Daan Dist. ## 30 長興街50號西北側 Daan Dist. ## 31 大安區長興街31號 Daan Dist. ## 32 基隆路三段155巷/基隆路四段口 Daan Dist. ## 33 辛亥路三段188號 Daan Dist. ## 34 臺大萬才館北側 Daan Dist. ## 35 辛亥路三段30號西北側 Daan Dist. ## 36 辛亥路與復興南路口西南側 Daan Dist. ## 37 臺大法人語言訓練中心北側 Daan Dist. ## 38 臺大綜合體育館北側 Daan Dist. ## 39 辛亥新生路口東南側 Daan Dist. ## 40 基隆長興路口東側 Daan Dist. ## 41 敦南街51號 Daan Dist. ## 42 敦南街73號 Daan Dist. ## 43 辛亥路三段15號 Daan Dist. ## 44 辛亥泰順街口東南側 Daan Dist. ## 45 臥龍街170號(前) Daan Dist. ## 46 臥龍街234-2號 Daan Dist. ## 47 辛亥路三段223號西側 Daan Dist. ## 48 樂業街101巷3號西北側 Daan Dist. ## 49 和平東路三段420號東北側 Daan Dist. ## 50 和平東路三段410號 Daan Dist. ## 51 基隆路二段166號 Daan Dist. ## 52 通化街189號西側 Daan Dist. ## 53 辛亥路一段/羅斯福路三段口北側(辛亥路側) Daan Dist. ## 54 和平東路一段/金山南路二段西南側 Daan Dist. ## 55 和平東路一段/龍泉街口西南側 Daan Dist. ## 56 和平東路一段/泰順街口東南側 Daan Dist. ## 57 和平東路一段129號前 Daan Dist. ## 58 羅斯福路二段41號前 Daan Dist. ## 59 和平東路一段19號前 Daan Dist. ## 60 建國南路二段/建國南路二段151巷(橋下空間) Daan Dist. ## 61 新生南路二段與和平東路二段口東北側 Daan Dist. ## 62 建國南路二段與和平東路二段口西北側 Daan Dist. ## 63 金華街249號對面 Daan Dist. ## 64 信義路二段128號前 Daan Dist. ## 65 信義路二段與杭州南路二段東南側 Daan Dist. ## 66 愛國東路21巷與杭州南路二段25巷口東南側 Daan Dist. ## 67 愛國東路與杭州南路二段口西南側 Daan Dist. ## 68 敦化南路二段293巷口南側 Daan Dist. ## 69 敦化南路二段218號 Daan Dist. ## 70 安和路二段185號 Daan Dist. ## 71 通化街111號 Daan Dist. ## 72 基隆路二段108號 Daan Dist. ## 73 忠孝東路三段81號 Daan Dist. ## 74 新生南路一段113號 Daan Dist. ## 75 仁愛路三段22號 Daan Dist. ## 76 建國南路一段304巷45號南側 Daan Dist. ## 77 復興南路一段信義路三段147巷45弄口 Daan Dist. ## 78 建國南路一段/濟南路三段口(東南側) Daan Dist. ## 79 復興南路一段/仁愛路三段123巷13弄(西北側) Daan Dist. ## 80 信義路4段6號(前) Daan Dist. ## 81 信義路3段143號(前) Daan Dist. ## 82 信義路四段74號(前) Daan Dist. ## 83 敦化南路一段與敦化南路一段236巷口 Daan Dist. ## 84 仁愛路四段258號前 Daan Dist. ## 85 信義路四段155號前 Daan Dist. ## 86 安和路一段75號(對面) Daan Dist. ## 87 信義路四段188號前 Daan Dist. ## 88 市民大道三段170號 Daan Dist. ## 89 市民大道三段206號西側 Daan Dist. ## 90 捷運大安森林公園站(2號出口)西側 Daan Dist. ## 91 信義路四段353號 Daan Dist. ## 92 延吉街249號 Daan Dist. ## 93 光復南路290巷5號 Daan Dist. ## 94 建國南路一段275號 Daan Dist. ## 95 新生南路一段101號 Daan Dist. ## 96 忠孝新生路口北側 Daan Dist. ## 97 復興南路二段52號(前) Daan Dist. ## 98 忠孝東路三段與10巷口 Daan Dist. ## 99 忠孝東路四段49巷4弄/大安路口 Daan Dist. ## 100 敦化南路1段158號(前) Daan Dist. ## 101 捷運大安森林公園站(5號出口)東側 Daan Dist. ## 102 建國南路二段與信義路三段口西南側 Daan Dist. ## 103 東豐街24號(旁公園路側) Daan Dist. ## 104 四維路66巷6號北側 Daan Dist. ## 105 復興南路一段135巷3號(對面) Daan Dist. ## 106 忠孝東路四段221號 Daan Dist. ## 107 忠孝東路四段143號 Daan Dist. ## 108 瑞安街208巷39號對面 Daan Dist. ## 109 樂利路25號 Daan Dist. ## 110 和平東路二段134號前 Daan Dist. ## 111 忠孝東路四段/光復南路口(西南側) Daan Dist. ## 112 仁愛路四段/大安路一段口(西南側) Daan Dist. ## 113 信義路四段252號前 Daan Dist. ## 114 和平東路三段1巷/四維路198巷口(西北側) Daan Dist. ## 115 仁愛路四段376號前 Daan Dist. ## 116 信義路四段225號前 Daan Dist. ## 117 敦化南路二段99號前 Daan Dist. ## 118 復興南路二段142之1號前 Daan Dist. ## 119 和平東路/建國南路口(北側) Daan Dist. ## 120 基隆路三段155巷148號 Daan Dist. ## 121 復興南路一段126巷1號前 Daan Dist. ## 122 信義路二段178號前 Daan Dist. ## 123 仁愛路四段48巷/東豐街(北側) Daan Dist. ## 124 捷運公館站(3號出口)西側 Daan Dist. ## 125 忠孝東路三段100號對側 Daan Dist. ## 126 忠孝東路三段229-1號前 Daan Dist. ## 127 新生南路三段94號前 Daan Dist. ## 128 辛亥路一段/新生南路三段(西北側) Daan Dist. ## 129 復興南路一段303號前 Daan Dist. ## 130 臥龍街/臥龍街195巷(南側) Daan Dist. ## 131 辛亥路三段與辛亥路三段157巷口西北側 Daan Dist. ## 132 臥龍街與基隆路二段口東北側 Daan Dist. ## 133 和平東路二段96巷8之1號(前方) Daan Dist. ## 134 辛亥路三段55號前方人行道(大安運動中心) Daan Dist. ## 135 和平東路三段 / 敦化南路二段口(東側) Daan Dist. ## 136 基隆路/長興街(東南側) Daan Dist. ## 137 仁愛路四段118號前 Daan Dist. ## 138 敦化南路一段111號前 Daan Dist. ## 139 忠孝東路四段55號前 Daan Dist. ## 140 市民大道四段/復興路一段口(東南側) Daan Dist. ## 141 新生南路三段2號前 Daan Dist. ## 142 安和路二段227巷16號對側 Daan Dist. ## 143 信義路三段/信義路三段134巷口 Daan Dist. ## 144 仁愛路四段110號前 Daan Dist. ## 145 敦化南路二段201號前 Daan Dist. ## 146 敦化南路一段280號 Daan Dist. ## 147 敦化南路二段92號對側中央分隔島 Daan Dist. ## 148 信義路三段184號前 Daan Dist. ## 149 羅斯福路三段201號旁 Daan Dist. ## 150 信義路四段199巷/安和路一段90巷口 Daan Dist. ## 151 辛亥路二段(臺大外語學院外) Daan Dist. ## 152 敦化南路二段與敦化南路二段81巷口西北側 Daan Dist. ## 153 金華街78號對側 Daan Dist. ## 154 光復南路200巷26號東側 Daan Dist. ## 155 忠孝東路三段248巷30號 Daan Dist. ## 156 仁愛路四段85號前 Daan Dist. ## 157 安和路二段/敦化南路二段81巷(西南側) Daan Dist. ## 158 辛亥路二段43號前 Daan Dist. ## 159 復興南路二段/信義路四段(東南側) Daan Dist. ## 160 通化街143巷33號對側 Daan Dist. ## 161 羅斯福路四段119巷84號對側 Daan Dist. ## 162 忠孝東路四段230號前 Daan Dist. ## 163 仁愛路四段363號前 Daan Dist. ## 164 樂利路97號前 Daan Dist. ## 165 羅斯福路三段117號前 Daan Dist. ## 166 敦化南路一段295巷1號 Daan Dist. ## 167 通安街129號對面 Daan Dist. ## 168 復興南路一段191號前 Daan Dist. ## 169 仁愛路四段37號前 Daan Dist. ## 170 浦城街1號對側 Daan Dist. ## 171 安和路二段/安和路二段69巷 Daan Dist. ## 172 臥龍街131巷11弄與樂業街108巷口 Daan Dist. ## 173 羅斯福路二段81-1號前 Daan Dist. ## 174 忠孝東路四段48號前 Daan Dist. ## 175 和平東路二段90巷/和平東路二段76巷5弄 Daan Dist. ## 176 光復南路438號 Daan Dist. ## 177 富陽街129號前 Daan Dist. ## 178 仁愛路四段1號前 Daan Dist. ## 179 仁愛路四段121號 Daan Dist. ## 180 龍泉街93巷7號對側 Daan Dist. ## 181 延平北路五段1-1號(對面) Datong Dist ## 182 重慶北路三段318號旁 Datong Dist ## 183 環河北路二段371號旁 Datong Dist ## 184 延平北路三段123號北側 Datong Dist ## 185 重慶北路三段260號前 Datong Dist ## 186 大龍街85巷12號對側 Datong Dist ## 187 西寧北路112號前方 Datong Dist ## 188 哈密街61號口對側人行道 Datong Dist ## 189 酒泉街235號前 Datong Dist ## 190 酒泉街235號前 Datong Dist ## 191 敦煌路19號前 Datong Dist ## 192 敦煌路與重慶北路三段383巷口 Datong Dist ## 193 承德路三段287號前方 Datong Dist ## 194 民權西路239號前方 Datong Dist ## 195 民權西路與迪化街一段口(橋墩下) Datong Dist ## 196 安西街1巷7號(對側) Datong Dist ## 197 民族西路82號前方 Datong Dist ## 198 承德路三段210號旁 Datong Dist ## 199 捷運大橋頭站(2號出口)西側 Datong Dist ## 200 民權西路237號旁 Datong Dist ## 201 捷運民權西路站(2號出口)西側 Datong Dist ## 202 萬全街22號對面 Datong Dist ## 203 塔城街與鄭州路口西南側 Datong Dist ## 204 重慶北路二段62-1號旁 Datong Dist ## 205 南京西路233巷103號旁 Datong Dist ## 206 大龍街217號對側 Datong Dist ## 207 重慶北路二段180號旁 Datong Dist ## 208 玉門街/民族西路(西北側) Datong Dist ## 209 重慶北路一段128號前 Datong Dist ## 210 重慶北路三段162號前 Datong Dist ## 211 承德路三段14號前 Datong Dist ## 212 鄭州路23號(旁) Datong Dist ## 213 昌吉街117號前 Datong Dist ## 214 長安西路299號(對面) Datong Dist ## 215 錦西街/興城街口(西南側) Datong Dist ## 216 延平北路四段200號(南側) Datong Dist ## 217 大龍街51號(旁) Datong Dist ## 218 重慶北路二段171號(旁) Datong Dist ## 219 大稻埕疏散門(淡五號水門)外 Datong Dist ## 220 重慶北路二段/歸綏街口(南側) Datong Dist ## 221 民權西路/蘭州街(西側) Datong Dist ## 222 承德路二段239號前 Datong Dist ## 223 南京西路/太原路(東側) Datong Dist ## 224 承德路二段137號前 Datong Dist ## 225 太原路 / 五原路口(東南側) Datong Dist ## 226 華陰街45號(對面) Datong Dist ## 227 民權西路70巷37號對面 Datong Dist ## 228 南京西路57號前 Datong Dist ## 229 長安西路244號(重慶路側) Datong Dist ## 230 承德路三段83號前 Datong Dist ## 231 環河北路一段/民生西路口(東南側) Datong Dist ## 232 承德路三段/庫倫街(東南側) Datong Dist ## 233 大龍街/大龍街85巷(東北側) Datong Dist ## 234 承德路一段/鄭州路口(市民高架下) Datong Dist ## 235 錦西街與錦西街52巷口東北側 Datong Dist ## 236 民權西路102巷4弄25號對側人行道 Datong Dist ## 237 寧夏路141號對側 Datong Dist ## 238 延平北路二段/涼州街口(行人天橋下) Datong Dist ## 239 昌吉街63號旁 Datong Dist ## 240 重慶北路三段335巷13號對面 Datong Dist ## 241 敦煌路78號 Datong Dist ## 242 通河東街325巷/通河東街口 Shilin Dist ## 243 通河東街1段192號(旁) Shilin Dist ## 244 華齡街175號(旁) Shilin Dist ## 245 前港街104號(對面) Shilin Dist ## 246 雨聲街/雨聲街165巷(西北側) Shilin Dist ## 247 天母東路69巷30號(前方路側) Shilin Dist ## 248 天母西路3-55號前人行道 Shilin Dist ## 249 忠誠路二段/忠誠路二段207巷(東南側) Shilin Dist ## 250 士東路276號至280號對面人行道 Shilin Dist ## 251 忠誠路2段53巷7號(對面) Shilin Dist ## 252 忠誠路二段122號(對面) Shilin Dist ## 253 天母北路33號(前) Shilin Dist ## 254 中山北路六段/士東路(西北側) Shilin Dist ## 255 承德路4段6巷71號(對面) Shilin Dist ## 256 中山北路4段/通河街口 Shilin Dist ## 257 忠誠路一段177號(前) Shilin Dist ## 258 忠義街6號對側 Shilin Dist ## 259 忠誠路一段18號(對面) Shilin Dist ## 260 至誠路二段47-49號(前) Shilin Dist ## 261 至誠路一段303號(對面) Shilin Dist ## 262 劍潭路76號(對面) Shilin Dist ## 263 後港街134巷/後港街口 Shilin Dist ## 264 華齡街188號(前) Shilin Dist ## 265 前港街48號(對面) Shilin Dist ## 266 承德路四段179巷/承德路4段口 Shilin Dist ## 267 福華路151號(對面) Shilin Dist ## 268 文林路751號(南側) Shilin Dist ## 269 基河路18號(對面) Shilin Dist ## 270 劍潭路基河路口(捷運站橋下空間) Shilin Dist ## 271 中正路/雨農路口(西北側) Shilin Dist ## 272 福志路50號(對面) Shilin Dist ## 273 中山北路五段609號(前) Shilin Dist ## 274 士商路1號(前) Shilin Dist ## 275 中正路510號(前) Shilin Dist ## 276 承德路五段55號(旁公車亭) Shilin Dist ## 277 基河路363號(前) Shilin Dist ## 278 華聲街17號(南側路側) Shilin Dist ## 279 福林路/中山北路五段(東北側) Shilin Dist ## 280 中山北路五段505巷44弄2號(對面) Shilin Dist ## 281 中山北路五段250號(銘傳大學對側) Shilin Dist ## 282 士商路150號(校門旁) Shilin Dist ## 283 忠誠路二段/忠誠路二段40巷(西南側) Shilin Dist ## 284 雨聲街105號(南側) Shilin Dist ## 285 福華路114號(對面) Shilin Dist ## 286 至誠路一段80號(對面) Shilin Dist ## 287 至善路二段280號(對面) Shilin Dist ## 288 通河東街2段5號(對面) Shilin Dist ## 289 至善路一段/至善路一段138巷(北側) Shilin Dist ## 290 中正路613號(對面) Shilin Dist ## 291 重慶北路四段198號(前) Shilin Dist ## 292 重慶北路四段177號(前) Shilin Dist ## 293 環河北路三段/葫蘆街(東北側) Shilin Dist ## 294 中山北路六段81號(旁) Shilin Dist ## 295 社中街39號(對面) Shilin Dist ## 296 社中街476號(對面) Shilin Dist ## 297 通河西街二段194號(對面) Shilin Dist ## 298 忠誠路一段138號(斜前方) Shilin Dist ## 299 永平街20巷37弄/永平街20巷11弄(社子公園南側) Shilin Dist ## 300 力行街8號(對面) Shilin Dist ## 301 福林路240號(前) Shilin Dist ## 302 通河東街二段26號(旁公園) Shilin Dist ## 303 重慶北路四段117號(前) Shilin Dist ## 304 延平北路九段323號(後方堤外) Shilin Dist ## 305 延平北路八段133巷42號(對面) Shilin Dist ## 306 延平北路八段96巷15號(前) Shilin Dist ## 307 社子島濕地解說小築 Shilin Dist ## 308 延平北路七段250號(前) Shilin Dist ## 309 延平北路七段42之7號(對面) Shilin Dist ## 310 忠義街94號(旁) Shilin Dist ## 311 德行東路285號(德行東路283巷側人行道) Shilin Dist ## 312 大南路325號前方 Shilin Dist ## 313 礦溪街與中山北路六段195巷口 Shilin Dist ## 314 中正路420號前 Shilin Dist ## 315 中正路/志成街口(南側) Shilin Dist ## 316 至善路一段/臨溪路(西南側) Shilin Dist ## 317 延平北路五段136巷1號前 Shilin Dist ## 318 東山路114號對側 Shilin Dist ## 319 環河北路三段261巷2號 Shilin Dist ## 320 福志路14巷42號(對面) Shilin Dist ## 321 承德路四段10巷37號(旁) Shilin Dist ## 322 雨聲街90號旁 Shilin Dist ## 323 至誠路二段與雨聲街口東北側 Shilin Dist ## 324 後街15號旁 Shilin Dist ## 325 中山北路七段141巷30號對側 Shilin Dist ## 326 基河路3-1號對側人行道 Shilin Dist ## 327 文林路 / 福華路口(東側) Shilin Dist ## 328 通河街 / 通河街2巷(南側) Shilin Dist ## 329 延平北路六段/社中街(社子國小對面跨提便道橋下) Shilin Dist ## 330 捷運劍潭站(1號出口)北側 Shilin Dist ## 331 德行東路/東山路(西北側) Shilin Dist ## 332 重慶北路四段276號(前) Shilin Dist ## 333 環河北路三段/延平北路五段285巷 Shilin Dist ## 334 延平北路六段67號旁 Shilin Dist ## 335 社子街162號旁 Shilin Dist ## 336 承德路四段與劍潭路口西側 Shilin Dist ## 337 文林路100號前 Shilin Dist ## 338 葫蘆街184號對側 Shilin Dist ## 339 延平北路五段257巷17號前 Shilin Dist ## 340 忠誠路二段200號(新光三越天母店)對側 Shilin Dist ## 341 中山北路五段837號前 Shilin Dist ## 342 德行西路33號對側 Shilin Dist ## 343 承德路四段/後港街口 Shilin Dist ## 344 中山北路五段692號前 Shilin Dist ## 345 中正路236巷/中正路口 Shilin Dist ## 346 福華路/福華路162巷(東南側) Shilin Dist ## 347 中山北路五段280巷口 Shilin Dist ## 348 葫蘆街79號對側公園 Shilin Dist ## 349 士商路40巷2號旁 Shilin Dist ## 350 基河路/承德路四段77巷口(捷運橋下) Shilin Dist ## 351 士東路91巷3號旁 Shilin Dist ## 352 美崙街118號斜對面人行道 Shilin Dist ## 353 忠誠路二段207巷/士東路299巷口 Shilin Dist ## 354 天母東路8巷57號對側 Shilin Dist ## 355 文林路587巷115號對側 Shilin Dist ## 356 延平北路七段145巷45號斜對面 Shilin Dist ## 357 忠誠路一段125號前 Shilin Dist ## 358 忠誠路一段109號前 Shilin Dist ## 359 福德路與福德路48巷口 Shilin Dist ## 360 天母東路69巷/天母東路 Shilin Dist ## 361 忠誠路二段178巷13號對面 Shilin Dist ## 362 克強路與磺溪街口西南側 Shilin Dist ## 363 德行東路109巷75號東側 Shilin Dist ## 364 福林路100巷/福林路100巷77弄 Shilin Dist ## 365 萬盛街/興隆路一段(西北側) Wenshan Dist ## 366 羅斯福路5段210號(前) Wenshan Dist ## 367 羅斯福路五段250號(前) Wenshan Dist ## 368 萬隆街255號(對面) Wenshan Dist ## 369 興隆路一段70巷/羅斯福路5段211巷26弄口 Wenshan Dist ## 370 羅斯福路六段142巷1號(旁) Wenshan Dist ## 371 景文街1號(對面) Wenshan Dist ## 372 羅斯福路六段/景隆街口(東南側) Wenshan Dist ## 373 景福街/羅斯福路6段142巷口 Wenshan Dist ## 374 福興路106巷28弄96號(對面) Wenshan Dist ## 375 福興路95巷/福興路63巷4弄口 Wenshan Dist ## 376 興隆路2段203巷108號(對面) Wenshan Dist ## 377 景豐街79號(旁公園) Wenshan Dist ## 378 羅斯福路六段280號(前) Wenshan Dist ## 379 汀州路四段77號(旁) Wenshan Dist ## 380 景華街124號(旁汽車格) Wenshan Dist ## 381 景興街239號(前) Wenshan Dist ## 382 指南路二段153號(對面) Wenshan Dist ## 383 新光路二段30號(對面) Wenshan Dist ## 384 木柵路四段82巷18號前(捷運橋樑下) Wenshan Dist ## 385 萬芳路60號(西側廣場) Wenshan Dist ## 386 興隆路三段/興隆路三段192巷8弄 Wenshan Dist ## 387 辛亥路四段114號(旁人行道) Wenshan Dist ## 388 興隆路二段123巷/興隆路二段(西北側) Wenshan Dist ## 389 木柵路一段290號(旁) Wenshan Dist ## 390 試院路(雙號)/木柵路一段(東北側) Wenshan Dist ## 391 和興路44巷 / 和興路26巷口 Wenshan Dist ## 392 木柵路一段17巷1號(西側) Wenshan Dist ## 393 樟新街64號前方 Wenshan Dist ## 394 木新路三段/一壽街(西北側) Wenshan Dist ## 395 木新路二段156號前人行道(永安市場) Wenshan Dist ## 396 忠順街二段22號前方人行道(忠順區民活動中心) Wenshan Dist ## 397 保儀路/木柵路三段102巷口(西南側) Wenshan Dist ## 398 老泉街26巷老泉街口(籃球場前) Wenshan Dist ## 399 木柵路三段220號(前) Wenshan Dist ## 400 興隆路四段50號(前) Wenshan Dist ## 401 興隆路四段105巷49號(旁) Wenshan Dist ## 402 木新路三段95巷30號(對面) Wenshan Dist ## 403 木新路二段299巷15號(旁) Wenshan Dist ## 404 忠順街一段2號(旁) Wenshan Dist ## 405 指南路三段4號(旁) Wenshan Dist ## 406 忠順街二段87巷25弄29號 Wenshan Dist ## 407 久康街24巷46號對側 Wenshan Dist ## 408 秀明路一段與秀明路一段185巷口 Wenshan Dist ## 409 秀明路一段129巷與秀明路一段路口 Wenshan Dist ## 410 老泉街/恆光街口 Wenshan Dist ## 411 景隆街105號(對面) Wenshan Dist ## 412 興隆路三段115巷2號 Wenshan Dist ## 413 興隆路三段304巷145號 Wenshan Dist ## 414 辛亥路四段199號 Wenshan Dist ## 415 木柵路四段159巷16號 Wenshan Dist ## 416 萬壽路16巷6號(前) Wenshan Dist ## 417 仙岩路16巷37號旁 Wenshan Dist ## 418 政大一街19號對側 Wenshan Dist ## 419 興隆路二段160-1號前 Wenshan Dist ## 420 興隆路三段306號 Wenshan Dist ## 421 興隆路三段211號對側(公車亭後) Wenshan Dist ## 422 興隆路四段109巷116號對側 Wenshan Dist ## 423 木新路二段永安街22巷口 Wenshan Dist ## 424 忠順街一段木新路三段310巷口 Wenshan Dist ## 425 師大公館校區校門口(汀州路側) Wenshan Dist ## 426 新光路二段28號前 Wenshan Dist ## 427 政治大學水岸電梯旁 Wenshan Dist ## 428 木柵路四段159巷16弄(社區出入口對側) Wenshan Dist ## 429 汀州路四段10號北側人行道 Wenshan Dist ## 430 溪洲街107巷(公園北側) Wenshan Dist ## 431 三福街4巷與景興路46巷口 Wenshan Dist ## 432 景仁街 / 羅斯福路六段142巷口(北側) Wenshan Dist ## 433 臺灣師範大學學二舍西側人行道 Wenshan Dist ## 434 景中街與景中街30巷口 Wenshan Dist ## 435 秀明路二段114號公車亭旁 Wenshan Dist ## 436 辛亥路四段77巷口 Wenshan Dist ## 437 景興路42巷與景興路口西南側 Wenshan Dist ## 438 木柵路三段48巷1弄口 Wenshan Dist ## 439 木柵路二段109巷14號旁 Wenshan Dist ## 440 木柵路一段59巷29號對側 Wenshan Dist ## 441 忠順街一段26巷30弄1號對側 Wenshan Dist ## 442 萬美街一段/萬安街口 Wenshan Dist ## 443 興隆路二段203巷16號 Wenshan Dist ## 444 新光路一段145號前 Wenshan Dist ## 445 光輝路140號對側 Wenshan Dist ## 446 光輝路7號後側 Wenshan Dist ## 447 木新路三段278巷11號斜對面 Wenshan Dist ## 448 興隆路二段275巷1弄2號前 Wenshan Dist ## 449 興隆路三段56號 Wenshan Dist ## 450 樟新街8巷9號對側 Wenshan Dist ## 451 仙岩路26號旁 Wenshan Dist ## 452 木柵路四段75號對側自行車道旁 Wenshan Dist ## 453 福興路78巷/福興路78巷10弄 Wenshan Dist ## 454 辛亥路四段166巷24號對側 Wenshan Dist ## 455 興隆路二段88號前 Wenshan Dist ## 456 興隆路二段22巷9弄與景興街23巷6弄口 Wenshan Dist ## 457 思源街1號東側 Zhongzheng Dist ## 458 汀州路三段思源街口東南側 Zhongzheng Dist ## 459 羅斯福路四段68號 Zhongzheng Dist ## 460 羅斯福路四段48號 Zhongzheng Dist ## 461 羅斯福路二段100號(前方) Zhongzheng Dist ## 462 羅斯福路二段168號前 Zhongzheng Dist ## 463 辛亥路一段/羅斯福路三段南側 Zhongzheng Dist ## 464 師大路/金門街11巷口對側人行道 Zhongzheng Dist ## 465 汀洲路二段182巷內186號旁 Zhongzheng Dist ## 466 水源路/同安街口(東側) Zhongzheng Dist ## 467 羅斯福路三段126號前 Zhongzheng Dist ## 468 師大路/羅斯福路三段西側 Zhongzheng Dist ## 469 羅斯福路三段2號前 Zhongzheng Dist ## 470 廈門街113巷/牯嶺街口(西側) Zhongzheng Dist ## 471 和平西路一段13-1號前方 Zhongzheng Dist ## 472 羅斯福路二段44號前方 Zhongzheng Dist ## 473 和平西路一段與南昌路二段口西北側 Zhongzheng Dist ## 474 和平西路一段/福州街口東側 Zhongzheng Dist ## 475 南昌路一段136號前 Zhongzheng Dist ## 476 羅斯福路二段/羅斯福路二段6巷口 Zhongzheng Dist ## 477 金華街口/杭州南路二段西北側 Zhongzheng Dist ## 478 金華街17號前方 Zhongzheng Dist ## 479 羅斯福路一段5號前方 Zhongzheng Dist ## 480 泉州街32號對面人行道 Zhongzheng Dist ## 481 中華路二段443巷45號前 Zhongzheng Dist ## 482 詔安街224號前 Zhongzheng Dist ## 483 中華路二段403號前 Zhongzheng Dist ## 484 中華路二段305巷至307巷 Zhongzheng Dist ## 485 南海路與和平西路二段西南側 Zhongzheng Dist ## 486 莒光路2號前 Zhongzheng Dist ## 487 水源路11-1號(旁) Zhongzheng Dist ## 488 廣州街8巷/廣州街口東南側 Zhongzheng Dist ## 489 愛國西路30號之2前方 Zhongzheng Dist ## 490 貴陽街懷寧街口(東北側) Zhongzheng Dist ## 491 貴陽街一段243之1號(前) Zhongzheng Dist ## 492 忠孝東路二段41號 Zhongzheng Dist ## 493 忠孝東路一段7號 Zhongzheng Dist ## 494 濟南紹興路口東南側 Zhongzheng Dist ## 495 林森南路與仁愛路一段西北側 Zhongzheng Dist ## 496 信義路一段1號前 Zhongzheng Dist ## 497 信義路一段21號前 Zhongzheng Dist ## 498 林森南路1號南側 Zhongzheng Dist ## 499 愛國西路/延平南路(西北側) Zhongzheng Dist ## 500 延平南路162號對側 Zhongzheng Dist ## 501 中華路一段59號旁 Zhongzheng Dist ## 502 博愛路162號 Zhongzheng Dist ## 503 重慶南路一段130號旁 Zhongzheng Dist ## 504 愛國西路1號(前) Zhongzheng Dist ## 505 中山南路20號前 Zhongzheng Dist ## 506 金山市民大道口南側 Zhongzheng Dist ## 507 中華路二段33號旁 Zhongzheng Dist ## 508 武昌街一段與延平南路口 Zhongzheng Dist ## 509 中華路一段與漢口街一段路口 Zhongzheng Dist ## 510 中華路一段11號(斜前方) Zhongzheng Dist ## 511 常德街1號(公園路側) Zhongzheng Dist ## 512 汀州路三段230巷23號 Zhongzheng Dist ## 513 師大路/水源路口(東南側) Zhongzheng Dist ## 514 中山南路/徐州路(東南側) Zhongzheng Dist ## 515 信義路二段213號前 Zhongzheng Dist ## 516 市民大道一段/中山北路一段(西北側) Zhongzheng Dist ## 517 莒光路/大埔街口(東北側) Zhongzheng Dist ## 518 忠孝東路二段132號(東側) Zhongzheng Dist ## 519 新生北路一段/市民大道三段口(西側) Zhongzheng Dist ## 520 中山南路/青島東路口(東北側) Zhongzheng Dist ## 521 捷運中正紀念堂站(5號出口)西側 Zhongzheng Dist ## 522 北平東路/杭州北路口(東北側) Zhongzheng Dist ## 523 汀州路二段265號 Zhongzheng Dist ## 524 金山南路一段148號前側 Zhongzheng Dist ## 525 林森南路/徐州路口(西南側) Zhongzheng Dist ## 526 徐州路/杭州南路一段口(西北側) Zhongzheng Dist ## 527 捷運中正紀念堂站(6號出口)北側 Zhongzheng Dist ## 528 市民大道一段168號旁 Zhongzheng Dist ## 529 中山北路一段46號北側 Zhongzheng Dist ## 530 捷運西門站(5號出口)南側 Zhongzheng Dist ## 531 公園路21號西北側 Zhongzheng Dist ## 532 重慶南路一段165號旁 Zhongzheng Dist ## 533 汀州路三段8號前 Zhongzheng Dist ## 534 紹興南街/徐州路(東南側) Zhongzheng Dist ## 535 羅斯福路一段/寧波東街(東南側) Zhongzheng Dist ## 536 中正區思源街16號對面人行道 Zhongzheng Dist ## 537 仁愛路一段路口/林森南路(東北側) Zhongzheng Dist ## 538 中華路一段/寶慶路(東南側) Zhongzheng Dist ## 539 仁愛路二段31號前 Zhongzheng Dist ## 540 金山南路一段72號前 Zhongzheng Dist ## 541 仁愛路一段59號旁 Zhongzheng Dist ## 542 三元街131號旁 Zhongzheng Dist ## 543 和平西路二段100號前 Zhongzheng Dist ## 544 重慶南路二段45號前方(郵政博物館前) Zhongzheng Dist ## 545 林森北路與北平東路口西北側 Zhongzheng Dist ## 546 北平東路30號對側人行道 Zhongzheng Dist ## 547 天津街1號對側人行道 Zhongzheng Dist ## 548 捷運忠孝新生站(1號出口)後方 Zhongzheng Dist ## 549 新生南路一段56號前方 Zhongzheng Dist ## 550 公園路/常德街口(西側) Zhongzheng Dist ## 551 中山南路8號(青島西路側) Zhongzheng Dist ## 552 林森南路/濟南路一段口(東北側) Zhongzheng Dist ## 553 仁愛路一段/紹興南街口(南側) Zhongzheng Dist ## 554 中華路二段343號前 Zhongzheng Dist ## 555 博愛路217號旁 Zhongzheng Dist ## 556 忠孝東路一段/林森南路口 Zhongzheng Dist ## 557 信義路一段(國家音樂廳西北側) Zhongzheng Dist ## 558 忠孝西路一段100號前 Zhongzheng Dist ## 559 濟南路二段6-1號對側 Zhongzheng Dist ## 560 仁愛路二段48-4號前 Zhongzheng Dist ## 561 齊東街53巷10號 Zhongzheng Dist ## 562 重慶南路三段/詔安街 Zhongzheng Dist ## 563 仁愛路二段65巷4號對側 Zhongzheng Dist ## 564 羅斯福路一段10號前 Zhongzheng Dist ## 565 汀州路二段135號對側 Zhongzheng Dist ## 566 和平西路一段110號旁 Zhongzheng Dist ## 567 泉州街15號對側 Zhongzheng Dist ## 568 三元街81號前 Zhongzheng Dist ## 569 仁愛路二段110號 Zhongzheng Dist ## 570 濟南路二段55號 Zhongzheng Dist ## 571 汀州路一段232號對側 Zhongzheng Dist ## 572 通北街/通北街65巷口(東北側) Zhongshan Dist ## 573 北安路/北安路77巷口(西北側) Zhongshan Dist ## 574 堤頂大道二段382號(旁) Zhongshan Dist ## 575 通北街146巷2弄2號(對面公園) Zhongshan Dist ## 576 崇實路/大直街62巷(東南側) Zhongshan Dist ## 577 樂群二路/明水路口(東北側) Zhongshan Dist ## 578 北安路676號前人行道 Zhongshan Dist ## 579 敬業三路11號(植福路側對面) Zhongshan Dist ## 580 敬業三路155號(前) Zhongshan Dist ## 581 樂群二路186號 Zhongshan Dist ## 582 北安路536號(旁) Zhongshan Dist ## 583 復興南路一段36-9號前人行道 Zhongshan Dist ## 584 南京東路三段189號(對面) Zhongshan Dist ## 585 伊通街/長安東路二段(西南側路側) Zhongshan Dist ## 586 新生北路一段/長安東路二段交叉口(北側) Zhongshan Dist ## 587 市民大道二段/林森北路(東北側) Zhongshan Dist ## 588 新生北路一段/南京東路一段口(橋墩下方) Zhongshan Dist ## 589 一江街/松江路132巷口(西北側) Zhongshan Dist ## 590 松江路/松江路84巷(西北側路側) Zhongshan Dist ## 591 新生北路二段/新生北路二段68巷交叉口(新生橋下) Zhongshan Dist ## 592 民族東路410巷2弄18號(東側) Zhongshan Dist ## 593 民生東路三段 / 建國北路二段口 Zhongshan Dist ## 594 興安街53-4號對側 Zhongshan Dist ## 595 復興北路386號南側 Zhongshan Dist ## 596 龍江路287號前方 Zhongshan Dist ## 597 建國北路/長春路口(南側) Zhongshan Dist ## 598 南京東路二段/建國北路二段(北側) Zhongshan Dist ## 599 松江路119號前 Zhongshan Dist ## 600 龍江路15號前 Zhongshan Dist ## 601 松江路170巷20號對側 Zhongshan Dist ## 602 市民大道與長安東路一段52巷口 Zhongshan Dist ## 603 建國北路一段17巷/八德路二段137巷口 Zhongshan Dist ## 604 合江街186號對側 Zhongshan Dist ## 605 民權東路三段與龍江路口東南側 Zhongshan Dist ## 606 捷運中山國小站(2號出口)後方 Zhongshan Dist ## 607 松江路261號前 Zhongshan Dist ## 608 林森北路582號(前) Zhongshan Dist ## 609 民權東路一段/民權東路一段71巷口 Zhongshan Dist ## 610 農安街12-1號前方 Zhongshan Dist ## 611 新生北路三段76號對側 Zhongshan Dist ## 612 民族東路17號前 Zhongshan Dist ## 613 花博公園5號出入口旁 Zhongshan Dist ## 614 中山北路三段54號前 Zhongshan Dist ## 615 新生北路一段與林森北路107巷口(新生高架橋下) Zhongshan Dist ## 616 南京東路一段86號前 Zhongshan Dist ## 617 吉林路108巷與南京東路二段21巷口東南側 Zhongshan Dist ## 618 新生北路二段45巷(中原公園西側) Zhongshan Dist ## 619 民族東路512巷13弄4號 Zhongshan Dist ## 620 復興北路488巷2弄5號對側 Zhongshan Dist ## 621 五常街77號對側 Zhongshan Dist ## 622 民權東路三段/建國北路三段口(東北側) Zhongshan Dist ## 623 松江路433號前 Zhongshan Dist ## 624 德惠街170巷22號對側 Zhongshan Dist ## 625 吉林路401號前 Zhongshan Dist ## 626 民族東路與松江路口西北側 Zhongshan Dist ## 627 濱江街5號對側 Zhongshan Dist ## 628 中山北路二段128巷口 Zhongshan Dist ## 629 渭水路54號對側 Zhongshan Dist ## 630 南京西路4號前 Zhongshan Dist ## 631 中山北路三段2號對側 Zhongshan Dist ## 632 民族東路/吉林路口(西北側) Zhongshan Dist ## 633 松江路230號前 Zhongshan Dist ## 634 長春路29號前 Zhongshan Dist ## 635 建國北路/農安街口(建國橋下) Zhongshan Dist ## 636 松江路77巷口 Zhongshan Dist ## 637 建國北路一段與長安東路二段口北側 Zhongshan Dist ## 638 新生北路一段36號前 Zhongshan Dist ## 639 民權東路二段51號前 Zhongshan Dist ## 640 中山北路三段25號前 Zhongshan Dist ## 641 中山北路二段48巷7號前 Zhongshan Dist ## 642 松江路188巷11號對側 Zhongshan Dist ## 643 吉林路125號前 Zhongshan Dist ## 644 民生東路二段33號旁 Zhongshan Dist ## 645 民生東路三段67號前 Zhongshan Dist ## 646 錦州街174號前 Zhongshan Dist ## 647 中山北路二段59之3號前 Zhongshan Dist ## 648 民生東路一段23巷/民生東路一段27巷口 Zhongshan Dist ## 649 新生北路二段100號前 Zhongshan Dist ## 650 濱江街199巷(八號疏散門前) Zhongshan Dist ## 651 濱江街154巷對側 Zhongshan Dist ## 652 民族東路336號前 Zhongshan Dist ## 653 興安街60號對側 Zhongshan Dist ## 654 復興北路514巷66號前側 Zhongshan Dist ## 655 中山北路二段113-133號前 Zhongshan Dist ## 656 植福路/樂群三路(西北側) Zhongshan Dist ## 657 錦州街13巷/中山北路二段137巷口(東南側) Zhongshan Dist ## 658 南京東路二段178-1號 Zhongshan Dist ## 659 南京東路三段121號前 Zhongshan Dist ## 660 撫順街41巷1-7號對側 Zhongshan Dist ## 661 大直街28號對側 Zhongshan Dist ## 662 北安路535之2號旁 Zhongshan Dist ## 663 松江路95-1至109號前方 Zhongshan Dist ## 664 敬業三路177巷南側 Zhongshan Dist ## 665 民生東路二段134號前 Zhongshan Dist ## 666 松江路208號前 Zhongshan Dist ## 667 吉林路100號對側 Zhongshan Dist ## 668 長春路120號前 Zhongshan Dist ## 669 長春路135號前 Zhongshan Dist ## 670 南京東路二段101號前 Zhongshan Dist ## 671 南京東路二段85號前 Zhongshan Dist ## 672 松江路158號前 Zhongshan Dist ## 673 北安路301號前 Zhongshan Dist ## 674 民族西路口與玉門街口東北側 Zhongshan Dist ## 675 新生北路三段與農安街口(高架橋下) Zhongshan Dist ## 676 農安街77巷與農安街77巷1弄口 Zhongshan Dist ## 677 北安路458巷41弄52之1號前 Zhongshan Dist ## 678 樂群二路 / 明水路口(東側) Zhongshan Dist ## 679 民權東路二段46號前 Zhongshan Dist ## 680 長春路與龍江路口西北側 Zhongshan Dist ## 681 民權東路一段/新生北路三段(北側)(新生高架橋下) Zhongshan Dist ## 682 建國北路/長春路口(北側) Zhongshan Dist ## 683 松江路/農安街口 Zhongshan Dist ## 684 中山北路三段(花博流行館前) Zhongshan Dist ## 685 通北街143號前 Zhongshan Dist ## 686 樂群二路266巷99號前 Zhongshan Dist ## 687 林森北路/南京東路一段 Zhongshan Dist ## 688 樂群二路30巷/樂群二路116巷61弄 Zhongshan Dist ## 689 南京東路三段109巷/龍江路120巷 Zhongshan Dist ## 690 新生北路三段/民族東路(西南側) Zhongshan Dist ## 691 捷運南京復興站(1號出口)後方(遼寧街155巷) Zhongshan Dist ## 692 建國南路一段/市民大道交叉口(北側) Zhongshan Dist ## 693 龍江路/朱崙街口西北側 Zhongshan Dist ## 694 大直街94巷口 Zhongshan Dist ## 695 南京東路三段221號前 Zhongshan Dist ## 696 民權東路三段/建國北路二段(南側高架橋下) Zhongshan Dist ## 697 德惠街11號東側 Zhongshan Dist ## 698 新生北路三段/濱江街口(東南側) Zhongshan Dist ## 699 新生北路一段64號對側 Zhongshan Dist ## 700 新生北路二段39-2號對側 Zhongshan Dist ## 701 北安路807號 Zhongshan Dist ## 702 敬業三路/樂群三路口 Zhongshan Dist ## 703 長春路258巷6號北側 Zhongshan Dist ## 704 遼寧街201巷13號前 Zhongshan Dist ## 705 建國北路三段/五常街 Zhongshan Dist ## 706 中山北路二段66號前 Zhongshan Dist ## 707 市民大道三段179號前 Zhongshan Dist ## 708 市民大道二段/市民大道二段5巷 Zhongshan Dist ## 709 南京西路1號前 Zhongshan Dist ## 710 建國北路高架橋下停車場G區 Zhongshan Dist ## 711 龍江路45巷42號對側 Zhongshan Dist ## 712 復興北路56號 Zhongshan Dist ## 713 松江路316號旁 Zhongshan Dist ## 714 建國北路三段/建國北路三段86巷 Zhongshan Dist ## 715 長安東路一段56巷/長安東路一段 Zhongshan Dist ## 716 松江路148號旁 Zhongshan Dist ## 717 堤頂大道二段246巷3號旁 Zhongshan Dist ## 718 北安路與通北街口東北側 Zhongshan Dist ## 719 民權東路三段69號前 Zhongshan Dist ## 720 長春路167號前 Zhongshan Dist ## 721 北安路/明水路(公車站:自強隧道) Zhongshan Dist ## 722 文湖街21巷118弄6-10號(前) Neihu Dist ## 723 內湖路一段66-72號前方公園 Neihu Dist ## 724 基湖路37號西側 Neihu Dist ## 725 內湖路一段225巷口 Neihu Dist ## 726 文湖街21巷口北側 Neihu Dist ## 727 文湖街81巷10號西側 Neihu Dist ## 728 環山路一段56號南側 Neihu Dist ## 729 內湖路一段411巷19弄9號對側 Neihu Dist ## 730 環山路二段141號北側 Neihu Dist ## 731 環山路二段81號西北側 Neihu Dist ## 732 大湖山莊街/大湖山莊街176巷(東南側) Neihu Dist ## 733 東湖路113巷49弄3號北側 Neihu Dist ## 734 東湖路113巷95弄13號西側 Neihu Dist ## 735 港墘路221巷2號 Neihu Dist ## 736 瑞光路271號東南側 Neihu Dist ## 737 成功路五段5號東側 Neihu Dist ## 738 康寧路一段116號 Neihu Dist ## 739 星雲街47號南側 Neihu Dist ## 740 環山路一段9巷9號對側 Neihu Dist ## 741 內湖路一段291號(對面) Neihu Dist ## 742 瑞光路500號(對面) Neihu Dist ## 743 港華街57號(對面) Neihu Dist ## 744 環山路二段/環山路二段26巷(西南側) Neihu Dist ## 745 成功路四段188號 Neihu Dist ## 746 內湖路三段60巷28號東側 Neihu Dist ## 747 金龍路203-8號北側 Neihu Dist ## 748 文德路212號旁 Neihu Dist ## 749 陽光街與文德路220巷口西側 Neihu Dist ## 750 陽光街與陽光街68巷102弄口 Neihu Dist ## 751 文德路210巷12號對側 Neihu Dist ## 752 文德路22巷6號(對面) Neihu Dist ## 753 文德路22巷與文德路22巷74弄口 Neihu Dist ## 754 潭美街213號南側 Neihu Dist ## 755 南京東路六段180號北側 Neihu Dist ## 756 行善路179號南側 Neihu Dist ## 757 新明路341號北側 Neihu Dist ## 758 潭美街139號對側 Neihu Dist ## 759 民權東路六段99號(前) Neihu Dist ## 760 康樂街61巷73弄22-1號南側 Neihu Dist ## 761 安康路32巷24弄22號 Neihu Dist ## 762 石潭路27號南側 Neihu Dist ## 763 南京東路六段382號西南側 Neihu Dist ## 764 新明路22號 Neihu Dist ## 765 民權東路六段50號 Neihu Dist ## 766 瑞光路160號 Neihu Dist ## 767 民權東路六段15巷29號 Neihu Dist ## 768 民權東路六段30號 Neihu Dist ## 769 新湖三路36號 Neihu Dist ## 770 南京東路六段125號南側 Neihu Dist ## 771 潭美街27號西側 Neihu Dist ## 772 成功路二段424號(對面) Neihu Dist ## 773 民權東路六段/民權東路六段180巷(西南側) Neihu Dist ## 774 民權東路六段208號(前) Neihu Dist ## 775 康寧路三段39號(對面) Neihu Dist ## 776 金湖路363巷11號(對面) Neihu Dist ## 777 金湖路347巷125弄1號(對面) Neihu Dist ## 778 內湖路二段/內湖路二段103巷口(東北側) Neihu Dist ## 779 內湖路二段103巷76號(對面) Neihu Dist ## 780 內湖路二段179巷48弄17號(旁) Neihu Dist ## 781 內湖路二段334號(前) Neihu Dist ## 782 成功路四段167巷6弄2號(旁) Neihu Dist ## 783 康寧路一段273號(對面) Neihu Dist ## 784 康寧路一段156巷/康寧路一段156巷20弄(西側) Neihu Dist ## 785 五分街14巷31號(對面) Neihu Dist ## 786 安泰街83巷3號(對面) Neihu Dist ## 787 康樂街236-3號(前) Neihu Dist ## 788 內湖路一段520號 Neihu Dist ## 789 康樂街125巷4號(對面) Neihu Dist ## 790 安康路28號西北側 Neihu Dist ## 791 安康路290號西側 Neihu Dist ## 792 康寧路三段60號南側 Neihu Dist ## 793 康寧路三段54-5號西側 Neihu Dist ## 794 行善路39號(前) Neihu Dist ## 795 南京東路六段122號(斜前方) Neihu Dist ## 796 民權東路六段206巷/民權東路六段190巷75弄(西北側) Neihu Dist ## 797 民權東路六段247號(前) Neihu Dist ## 798 東湖路與東湖路113巷口東側 Neihu Dist ## 799 成功路四段182巷/成功路四段口(西側) Neihu Dist ## 800 港墘路185號前 Neihu Dist ## 801 瑞湖街101號對側 Neihu Dist ## 802 金龍路112巷口(金龍公園側) Neihu Dist ## 803 星雲街138巷18號 Neihu Dist ## 804 康寧路三段189巷163弄13號東南側 Neihu Dist ## 805 康寧路三段99巷39弄70號東南側 Neihu Dist ## 806 成功路五段420巷17號東側 Neihu Dist ## 807 堤頂大道一段215號前 Neihu Dist ## 808 成功路二段189號北側 Neihu Dist ## 809 行善路179號西側 Neihu Dist ## 810 新湖二路/新湖二路250巷(西南側) Neihu Dist ## 811 成功路四段41巷6號前側 Neihu Dist ## 812 金湖路83號對側 Neihu Dist ## 813 民權東路六段161號前側 Neihu Dist ## 814 民權東路六段190巷117弄15號對側 Neihu Dist ## 815 洲子街12號前 Neihu Dist ## 816 文湖街21巷68弄25-6號北側 Neihu Dist ## 817 內湖路二段179巷242號對側 Neihu Dist ## 818 行善路243號(前) Neihu Dist ## 819 民善街88號(旁) Neihu Dist ## 820 安美街181號前 Neihu Dist ## 821 陽光街161巷14號對側 Neihu Dist ## 822 南京東路六段366號對側 Neihu Dist ## 823 文湖街60巷/環山路一段24巷(北側) Neihu Dist ## 824 民權東路六段47巷6號對側 Neihu Dist ## 825 瑞光路102號前 Neihu Dist ## 826 安康路315巷/五分街14巷(西側) Neihu Dist ## 827 民權東路六段/成功路二段320巷31弄(東南側) Neihu Dist ## 828 內湖路三段72巷15號西側 Neihu Dist ## 829 民權東路六段409號前 Neihu Dist ## 830 瑞光路353號前(瑞光路側人行道) Neihu Dist ## 831 瑞光路355號前(港墘路側人行道) Neihu Dist ## 832 康樂街151巷/康樂街 Neihu Dist ## 833 內湖路一段358號 Neihu Dist ## 834 成功路三段83號前 Neihu Dist ## 835 內湖路一段47巷/內湖路一段47巷22弄 Neihu Dist ## 836 陽光街/舊宗路二段 Neihu Dist ## 837 東湖路113巷95弄/康寧路三段75巷 Neihu Dist ## 838 成功路二段250巷23弄/成功路二段312巷 Neihu Dist ## 839 安泰街(康樂橋下) Neihu Dist ## 840 康樂街191巷/康樂街 Neihu Dist ## 841 內湖路一段663號前 Neihu Dist ## 842 行善路333巷92號前 Neihu Dist ## 843 行善路383巷27號對側 Neihu Dist ## 844 舊宗路一段/新湖三路(南側) Neihu Dist ## 845 舊宗路二段/民權東路六段11巷 Neihu Dist ## 846 內湖路三段326巷/內湖路三段 Neihu Dist ## 847 成功路四段223巷/成功路四段223巷6弄 Neihu Dist ## 848 康寧路三段189巷/康寧路三段189巷93弄 Neihu Dist ## 849 內湖路二段368號對側 Neihu Dist ## 850 東湖路160巷23號 Neihu Dist ## 851 環山路三段/環山路三段16巷口(東南側) Neihu Dist ## 852 內湖區文德路91號旁 Neihu Dist ## 853 新湖三路28號前人行道 Neihu Dist ## 854 行愛路與新湖一路口西南側 Neihu Dist ## 855 康寧路三段99巷19號對側 Neihu Dist ## 856 堤頂大道二段405號前 Neihu Dist ## 857 堤頂大道二段473號前 Neihu Dist ## 858 瑞光路669號旁 Neihu Dist ## 859 內湖路一段290號前 Neihu Dist ## 860 民權東路六段11巷25號對側 Neihu Dist ## 861 民權東路六段15巷/民權東路六段19巷 Neihu Dist ## 862 陽光街323號 Neihu Dist ## 863 瑞光路423號 Neihu Dist ## 864 瑞光路/瑞光路358巷 Neihu Dist ## 865 洲子街/瑞光路393巷 Neihu Dist ## 866 內湖路一段396號 Neihu Dist ## 867 民權東路六段56巷7號對側 Neihu Dist ## 868 新湖三路/行忠路72巷 Neihu Dist ## 869 新湖三路122、124號對側 Neihu Dist ## 870 舊宗路一段/新湖二路(南側) Neihu Dist ## 871 基湖路12號 Neihu Dist ## 872 內湖路一段120巷15弄8號對側 Neihu Dist ## 873 堤頂大道二段501號前 Neihu Dist ## 874 洲子街61號 Neihu Dist ## 875 康樂街110巷21號對側 Neihu Dist ## 876 內湖路一段360巷17-19號 Neihu Dist ## 877 星雲街156號對側 Neihu Dist ## 878 內湖區內湖路一段289號 Neihu Dist ## 879 潭美街537號前 Neihu Dist ## 880 內湖路一段91巷16號對側 Neihu Dist ## 881 瑞光路316巷35號 Neihu Dist ## 882 文德路與文德路220巷口西南側 Neihu Dist ## 883 安美街38號前方 Neihu Dist ## 884 康寧路三段16巷6號斜對面 Neihu Dist ## 885 康樂街201巷25-35號對側 Neihu Dist ## 886 環山路三段15號對面 Neihu Dist ## 887 南京東路六段482號 Neihu Dist ## 888 承德路七段306-308號(前) Beitou Dist ## 889 洲美街271號(對面) Beitou Dist ## 890 明德路212號(榮華二路側人行道) Beitou Dist ## 891 西安街一段明德路口(東南側) Beitou Dist ## 892 文林北路214-216號(前) Beitou Dist ## 893 行義路10巷2號(旁) Beitou Dist ## 894 知行路360號(旁) Beitou Dist ## 895 關渡路68號(對面) Beitou Dist ## 896 知行路235巷7號(對面) Beitou Dist ## 897 中央北路四段262號(對面) Beitou Dist ## 898 大度路三段270巷/立功街55巷(西南側) Beitou Dist ## 899 捷運關渡站2號出口外人行道 Beitou Dist ## 900 中央北路四段529號(對面) Beitou Dist ## 901 大度路三段立德路口(西北側) Beitou Dist ## 902 中央北路三段9-1號(對面) Beitou Dist ## 903 中央北路三段185號(前方) Beitou Dist ## 904 大業路529號(對面) Beitou Dist ## 905 稻香重三路口(對面路側) Beitou Dist ## 906 中央北路二段167號(對面) Beitou Dist ## 907 秀山路50號(旁) Beitou Dist ## 908 大業路671號(對面) Beitou Dist ## 909 中和街10號(對面) Beitou Dist ## 910 光明路2巷3號(對面) Beitou Dist ## 911 三合街二段486號(旁) Beitou Dist ## 912 北投路一段臨20號(旁) Beitou Dist ## 913 公舘路198號(對面) Beitou Dist ## 914 大業路302號(前) Beitou Dist ## 915 承德路七段/吉利街(西北側) Beitou Dist ## 916 三合街一段119號(前) Beitou Dist ## 917 西安街二段345-349號(對面) Beitou Dist ## 918 石牌路一段39巷100號(旁) Beitou Dist ## 919 東華街二段136號(對面) Beitou Dist ## 920 東華街一段526號(對面) Beitou Dist ## 921 石牌路二段100號(前) Beitou Dist ## 922 石牌路一段139號(對面) Beitou Dist ## 923 明德路365號(前) Beitou Dist ## 924 石牌路一段142號(對面) Beitou Dist ## 925 天母西路109號(對面) Beitou Dist ## 926 立農街一段201號(對面) Beitou Dist ## 927 承德路七段260號(前) Beitou Dist ## 928 自強街61巷8號(旁) Beitou Dist ## 929 榮華三路2號(旁) Beitou Dist ## 930 文林北路77號(前) Beitou Dist ## 931 立德路15號(前) Beitou Dist ## 932 中央北路四段32號(旁) Beitou Dist ## 933 陽明交大圖書館後方機車停車場 Beitou Dist ## 934 光明路225號(對面) Beitou Dist ## 935 中和街61號對側 Beitou Dist ## 936 承德路七段與石牌路一段口北側 Beitou Dist ## 937 承德路七段192-198號前 Beitou Dist ## 938 明德路95號 Beitou Dist ## 939 大興街145號前 Beitou Dist ## 940 福美路199號旁 Beitou Dist ## 941 中和街455巷11弄6-8號(前) Beitou Dist ## 942 洲美蜆仔港公園西南側(福美路側) Beitou Dist ## 943 杏林一路3號(旁) Beitou Dist ## 944 珠海路/復興一路口(東側) Beitou Dist ## 945 裕民二路33巷/裕民六路(西北側) Beitou Dist ## 946 磺港路269-271號(旁) Beitou Dist ## 947 珠海路145號(對側公園) Beitou Dist ## 948 三合街一段79巷16號(對面) Beitou Dist ## 949 石牌路二段185號對側 Beitou Dist ## 950 磺港路/清江路177巷(東側) Beitou Dist ## 951 文林北路280號(對側公園) Beitou Dist ## 952 珠海路1號旁 Beitou Dist ## 953 大業路539號 Beitou Dist ## 954 光明路148號對側人行道 Beitou Dist ## 955 立德路125號 Beitou Dist ## 956 秀山路26號(懷遠新村社區入口南側) Beitou Dist ## 957 中山路6號西側(北投溪木道西側) Beitou Dist ## 958 中和街493巷9弄2號對側 Beitou Dist ## 959 光明路2巷/光明路交叉口 Beitou Dist ## 960 石牌路二段/立農街二段口 Beitou Dist ## 961 捷運唭哩岸站一(東華) 公車亭對側人行道 Beitou Dist ## 962 大興街50號對側人行道 Beitou Dist ## 963 捷運忠義站(2號出口)無障礙坡道旁 Beitou Dist ## 964 承德路六段80號南側 Beitou Dist ## 965 捷運北投站(1號出口)(北投路側) Beitou Dist ## 966 承德路六段120號(北側地下室車道旁) Beitou Dist ## 967 公舘路255巷43號東側道路對面 Beitou Dist ## 968 文化三路2號西側公園 Beitou Dist ## 969 中和街365號旁 Beitou Dist ## 970 大業路/大業路65巷口 Beitou Dist ## 971 承德路七段390號前 Beitou Dist ## 972 文林北路112號 Beitou Dist ## 973 永興路一段32巷/永興路一段 Beitou Dist ## 974 知行路210巷16號前對側 Beitou Dist ## 975 立功街76號對側 Beitou Dist ## 976 承德路七段401巷200號斜對面 Beitou Dist ## 977 大業路6號 Beitou Dist ## 978 八德路四段742號 Songshan Dist ## 979 塔悠路2號(旁) Songshan Dist ## 980 健康路399號北側 Songshan Dist ## 981 八德路四段91巷9號(對面) Songshan Dist ## 982 南京東路五段156號(前) Songshan Dist ## 983 捷運南京三民站(1號出口) Songshan Dist ## 984 光復北路13號(旁) Songshan Dist ## 985 南京東路五段229號(前) Songshan Dist ## 986 健康路325巷5弄5號(前) Songshan Dist ## 987 民權東路三段119號(前) Songshan Dist ## 988 民族東路712號(對面) Songshan Dist ## 989 敦化北路244巷43號(對面) Songshan Dist ## 990 敦化北路216號(對面) Songshan Dist ## 991 長春路432號(對面) Songshan Dist ## 992 三民路166巷1號(對面) Songshan Dist ## 993 民生東路五段163-1號(前) Songshan Dist ## 994 南京東路四段6號(前) Songshan Dist ## 995 八德路三段25號(前) Songshan Dist ## 996 敦化北路199巷15號(旁) Songshan Dist ## 997 敦化北路/富錦街77巷口(東南側) Songshan Dist ## 998 民權東路四段/新中街口(西南側) Songshan Dist ## 999 民生東路五段/塔悠路口(西南側) Songshan Dist ## 1000 光復北路266號(前) Songshan Dist ## 1001 撫遠街298號對側公園 Songshan Dist ## 1002 八德路三段74巷95號南側 Songshan Dist ## 1003 市民大道四段123號 Songshan Dist ## 1004 光復北路/光復北路190巷口(東南側) Songshan Dist ## 1005 延壽街356巷/延壽街330巷16弄(東北側) Songshan Dist ## 1006 健康路305號(前) Songshan Dist ## 1007 民權東路四段/光復北路(東北側) Songshan Dist ## 1008 東興路33號南側 Songshan Dist ## 1009 光復南路19號西側 Songshan Dist ## 1010 光復南路58巷11號東側 Songshan Dist ## 1011 健康路78號(對面) Songshan Dist ## 1012 八德路二段342號(前) Songshan Dist ## 1013 南京東路四段186號前 Songshan Dist ## 1014 民生東路五段84號前 Songshan Dist ## 1015 健康路179號前 Songshan Dist ## 1016 三民路43巷1號前 Songshan Dist ## 1017 八德路四段106巷/八德路四段106巷6弄口(東側) Songshan Dist ## 1018 市民大道四段73號前 Songshan Dist ## 1019 慶城街1號(東南側) Songshan Dist ## 1020 南京東路三段262號 Songshan Dist ## 1021 民權東路五段41之1號 Songshan Dist ## 1022 敦化北路/八德路三段(東北側) Songshan Dist ## 1023 南京東路四段75-1號前 Songshan Dist ## 1024 敦化北路112號前 Songshan Dist ## 1025 松河街182號對側 Songshan Dist ## 1026 八德路四段685號前 Songshan Dist ## 1027 民權東路三段102號前 Songshan Dist ## 1028 南京東路五段57號(前) Songshan Dist ## 1029 塔悠路/撫遠街261巷(西側) Songshan Dist ## 1030 寶清街/寶清街30巷(北側) Songshan Dist ## 1031 健康路/南京東路五段251巷50弄(西側) Songshan Dist ## 1032 健康路174號(旁) Songshan Dist ## 1033 八德路三段106巷62號(對面) Songshan Dist ## 1034 南京東路四段163號(前) Songshan Dist ## 1035 八德路三段25號前 Songshan Dist ## 1036 健康路325巷 / 健康路325巷12弄口(東北側) Songshan Dist ## 1037 南京東路五段 / 東興路口(北側) Songshan Dist ## 1038 松山路/市民大道六段(西北側捷運3號出口) Songshan Dist ## 1039 民生東路五段36巷/光復北路165巷 Songshan Dist ## 1040 敦化北路/南京東路四段 Songshan Dist ## 1041 敦化南路一段/八德路二段(西南側) Songshan Dist ## 1042 三民路 / 新東街51巷口(東側) Songshan Dist ## 1043 八德路/松信路(西南側) Songshan Dist ## 1044 長春路431號前 Songshan Dist ## 1045 八德路四段650號南側 Songshan Dist ## 1046 八德路四段711號前 Songshan Dist ## 1047 南京東路四段12號前 Songshan Dist ## 1048 南京東路四段/健康路(西北側) Songshan Dist ## 1049 敦化北路151號前分隔島 Songshan Dist ## 1050 民生東路三段/復興北路(東南側) Songshan Dist ## 1051 市民大道/延吉街(市民大道橋下空地) Songshan Dist ## 1052 光復北路190巷35號對側 Songshan Dist ## 1053 捷運南京三民站(3號出口) Songshan Dist ## 1054 南京東路五段386號前 Songshan Dist ## 1055 五常街370巷8號 Songshan Dist ## 1056 延壽街119巷/延壽街 Songshan Dist ## 1057 市民大道五段111號前 Songshan Dist ## 1058 民族東路630號對側 Songshan Dist ## 1059 撫遠街390巷27號對側 Songshan Dist ## 1060 民生東路五段191號 Songshan Dist ## 1061 民權東路三段211號前人行道 Songshan Dist ## 1062 東新街170巷1號西南側 Nangang Dist ## 1063 福德街383號北側 Nangang Dist ## 1064 忠孝東路六段403號 Nangang Dist ## 1065 忠孝東路六段219號 Nangang Dist ## 1066 中坡北路7號東側 Nangang Dist ## 1067 玉成街46號東側 Nangang Dist ## 1068 忠孝東路六段17號東北側 Nangang Dist ## 1069 東新街118巷15號南側 Nangang Dist ## 1070 玉成街247號對側 Nangang Dist ## 1071 舊莊街一段1號西側 Nangang Dist ## 1072 研究院路二段128號(體育館) Nangang Dist ## 1073 研究院路一段130巷99號(國家生技園區) Nangang Dist ## 1074 研究院路一段1號(5號出口) Nangang Dist ## 1075 研究院路二段12巷58弄9號西側 Nangang Dist ## 1076 福山街44巷27號東南側 Nangang Dist ## 1077 舊莊街一段91巷11號西南側 Nangang Dist ## 1078 研究院路三段68巷9號北側 Nangang Dist ## 1079 市民大道八段532號北側 Nangang Dist ## 1080 經貿二路183號(2號出口) Nangang Dist ## 1081 惠民街67號東南側 Nangang Dist ## 1082 興中路44巷1號東側 Nangang Dist ## 1083 南港路一段350號 Nangang Dist ## 1084 重陽路125巷34號東側 Nangang Dist ## 1085 向陽路49號北側 Nangang Dist ## 1086 忠孝東路七段510號西北側 Nangang Dist ## 1087 忠孝東路七段380號(2號出口) Nangang Dist ## 1088 忠孝東路七段380號(1號出口) Nangang Dist ## 1089 東明街68號北側 Nangang Dist ## 1090 研究院路三段246號東側 Nangang Dist ## 1091 研究院路二段35巷23弄25號北側 Nangang Dist ## 1092 研究院路二段3巷1號西側 Nangang Dist ## 1093 南港路二段200-1號南側 Nangang Dist ## 1094 重陽路269號南側 Nangang Dist ## 1095 市民大道八段99號 Nangang Dist ## 1096 南港路一段313號(市民大道) Nangang Dist ## 1097 忠孝東路七段552號 Nangang Dist ## 1098 新民街15號北側 Nangang Dist ## 1099 經貿二路188-1號 Nangang Dist ## 1100 研究院路三段10巷1號東側 Nangang Dist ## 1101 南港路三段47巷8號南側 Nangang Dist ## 1102 昆陽街58號東側 Nangang Dist ## 1103 南港路三段314巷20號 Nangang Dist ## 1104 南港路三段133號 Nangang Dist ## 1105 東新街4號東側 Nangang Dist ## 1106 八德路四段873號 Nangang Dist ## 1107 玉成街150號 Nangang Dist ## 1108 中坡南路19號 Nangang Dist ## 1109 福德街309巷7號南側 Nangang Dist ## 1110 經貿二路255巷1號 Nangang Dist ## 1111 重陽路458號西側 Nangang Dist ## 1112 忠孝東路七段359號(市民大道) Nangang Dist ## 1113 研究院路二段/研究院路二段132巷北側 Nangang Dist ## 1114 重陽路505號 Nangang Dist ## 1115 經園街58號北側 Nangang Dist ## 1116 惠民街71號西側 Nangang Dist ## 1117 富康街1巷16弄2號東側 Nangang Dist ## 1118 研究院路一段101巷16弄2號南側 Nangang Dist ## 1119 舊莊街一段/舊莊街一段145巷口 Nangang Dist ## 1120 成功路一段76號對側 Nangang Dist ## 1121 向陽路258巷/重陽路39巷口(西南側) Nangang Dist ## 1122 南港路一段28號旁 Nangang Dist ## 1123 南港路一段32號(4號出口) Nangang Dist ## 1124 東新街65號東南側 Nangang Dist ## 1125 東新街170巷63號對側 Nangang Dist ## 1126 中坡北路/市民大道七段路口(東北側) Nangang Dist ## 1127 昆陽街173號對側 Nangang Dist ## 1128 南港路二段 / 南港路二段178巷口(北側) Nangang Dist ## 1129 忠孝東路七段/興中路(西北側) Nangang Dist ## 1130 興華路/市民大道八段路口西北側人行道 Nangang Dist ## 1131 成福路178巷8號對側 Nangang Dist ## 1132 東新街/市民大道七段(北側) Nangang Dist ## 1133 福德街373巷80號前 Nangang Dist ## 1134 成福路197巷/成福路 Nangang Dist ## 1135 松河街398號對側 Nangang Dist ## 1136 成福路/東新街80巷10弄 Nangang Dist ## 1137 經貿二路/南港路一段(西北側) Nangang Dist ## 1138 舊莊街一段/舊莊街一段215巷 Nangang Dist ## 1139 南港路三段/南港路三段80巷 Nangang Dist ## 1140 忠孝東路六段465號 Nangang Dist ## 1141 忠孝東路/忠孝東路六段278巷 Nangang Dist ## 1142 研究院路二段128號(人文社會科學館) Nangang Dist ## 1143 松河街380號對側 Nangang Dist ## 1144 松河街358號對側 Nangang Dist ## 1145 忠孝東路六段226號前 Nangang Dist ## 1146 富康街47巷2號對側 Nangang Dist ## 1147 東新街/東新街63巷 Nangang Dist ## 1148 研究院路二段70巷10弄/研究院路二段98巷 Nangang Dist ## 1149 向陽路/市民大道七段 Nangang Dist ## 1150 南港路二段312號 Nangang Dist ## 1151 研究院路1段151巷18號前 Nangang Dist ## 1152 經貿一路77號(港東街) Nangang Dist ## 1153 和平東路三段391巷16號 Xinyi Dist ## 1154 基隆路二段155號 Xinyi Dist ## 1155 基隆路二段131-4號(前) Xinyi Dist ## 1156 和平東路三段633號前 Xinyi Dist ## 1157 和平東路三段530巷口東北側 Xinyi Dist ## 1158 信安街50號(對面) Xinyi Dist ## 1159 台北醫學大學(吳興街220巷59弄) Xinyi Dist ## 1160 吳興街118巷35弄28號前方(三興公園) Xinyi Dist ## 1161 松德路300號南側 Xinyi Dist ## 1162 信義路五段128號東側 Xinyi Dist ## 1163 松仁路153巷15號東側 Xinyi Dist ## 1164 松仁路215巷6號 Xinyi Dist ## 1165 松仁路101號東側 Xinyi Dist ## 1166 信義路5段152號(1號出口) Xinyi Dist ## 1167 松德路200巷53號北側 Xinyi Dist ## 1168 虎林街164巷54號北側 Xinyi Dist ## 1169 莊敬路391巷11弄2號(東北側) Xinyi Dist ## 1170 松勤街100號(前) Xinyi Dist ## 1171 信義路五段16號前 Xinyi Dist ## 1172 莊敬路239巷12號(對面) Xinyi Dist ## 1173 光復南路485號前方 Xinyi Dist ## 1174 光復南路455號前方 Xinyi Dist ## 1175 仁愛路四段與仁愛路四段496巷口西南側 Xinyi Dist ## 1176 忠孝東路五段236巷15號(前) Xinyi Dist ## 1177 信義路六段76巷2弄22號(對面) Xinyi Dist ## 1178 林口街82號(對面) Xinyi Dist ## 1179 松山路655號(前) Xinyi Dist ## 1180 松山路721號(對面) Xinyi Dist ## 1181 台北市政府東門(松智路) Xinyi Dist ## 1182 松智路/松壽路(西北側) Xinyi Dist ## 1183 市府路/松壽路(東北側) Xinyi Dist ## 1184 市府路/松高路(東南側) Xinyi Dist ## 1185 市府路/松壽路(西北側) Xinyi Dist ## 1186 松智路/信義路(東北側) Xinyi Dist ## 1187 市府路/信義路(西北側) Xinyi Dist ## 1188 林口街230號(斜對面) Xinyi Dist ## 1189 松仁路123號北側 Xinyi Dist ## 1190 福德街251巷2號對側 Xinyi Dist ## 1191 大道路與大道路145巷口 Xinyi Dist ## 1192 松高路19號 Xinyi Dist ## 1193 松仁路28號北側 Xinyi Dist ## 1194 松隆路99號西南側 Xinyi Dist ## 1195 松仁路277號南側 Xinyi Dist ## 1196 吳興街600巷81號西側 Xinyi Dist ## 1197 基隆路一段83巷9號西側 Xinyi Dist ## 1198 松信路61號西側 Xinyi Dist ## 1199 松山路11號南側 Xinyi Dist ## 1200 松隆路161號對側 Xinyi Dist ## 1201 松信路/永吉路西南側人行道 Xinyi Dist ## 1202 基隆路二段99-1號(前) Xinyi Dist ## 1203 市民大道六段/松信路口(西側) Xinyi Dist ## 1204 忠孝東路四段599巷36號對側 Xinyi Dist ## 1205 基隆路二段/光復南路(東北側) Xinyi Dist ## 1206 忠孝東路四段550號 Xinyi Dist ## 1207 松仁路308巷60號 Xinyi Dist ## 1208 忠孝東路五段800號 Xinyi Dist ## 1209 永吉路356號東側 Xinyi Dist ## 1210 永吉路326巷66號西側 Xinyi Dist ## 1211 永吉路323號西側 Xinyi Dist ## 1212 松山路166號 Xinyi Dist ## 1213 松山路279號 Xinyi Dist ## 1214 信義路五段/信義路五段91巷口(西北側) Xinyi Dist ## 1215 松德路168巷20號前 Xinyi Dist ## 1216 市府路/松壽路口東南側 Xinyi Dist ## 1217 松德路79號前 Xinyi Dist ## 1218 松信路209號旁 Xinyi Dist ## 1219 基隆路一段109-6號前 Xinyi Dist ## 1220 虎林街132巷44號西側 Xinyi Dist ## 1221 吳興街260巷/吳興街260巷21弄口(東南側) Xinyi Dist ## 1222 林口街/福德街口(東南側) Xinyi Dist ## 1223 仁愛路四段/逸仙路口(西北側) Xinyi Dist ## 1224 虎林街222巷55號 Xinyi Dist ## 1225 信義路四段393號前 Xinyi Dist ## 1226 捷運台北101/世貿站(2號出口)(西側) Xinyi Dist ## 1227 吳興街284巷36弄24號西側 Xinyi Dist ## 1228 中坡南路51號對側 Xinyi Dist ## 1229 福德街308號對側 Xinyi Dist ## 1230 松仁路/松仁路95巷(東南側) Xinyi Dist ## 1231 松智路/松廉路(東北側) Xinyi Dist ## 1232 松勤街8號對側 Xinyi Dist ## 1233 松平路50巷15號對側 Xinyi Dist ## 1234 忠孝東路/松仁路(東南側) Xinyi Dist ## 1235 中坡北路57號旁 Xinyi Dist ## 1236 松仁路/吳興街583巷3弄 Xinyi Dist ## 1237 吳興街394巷/吳興街 Xinyi Dist ## 1238 忠孝東路五段/忠孝東路五段215巷 Xinyi Dist ## 1239 松勤街/莊敬路 Xinyi Dist ## 1240 松仁路/松平路 Xinyi Dist ## 1241 信義路五段180號前 Xinyi Dist ## 1242 忠孝東路五段71巷/忠孝東路五段31巷18弄 Xinyi Dist ## 1243 吳興街284巷23號對側 Xinyi Dist ## 1244 信安街67巷/信安街口東南側 Xinyi Dist ## 1245 信安街67巷75號對側 Xinyi Dist ## 1246 和平東路三段291號前 Xinyi Dist ## 1247 永吉路478號前 Xinyi Dist ## 1248 福德街84巷15號對側 Xinyi Dist ## 1249 和平東路三段341巷63號對側 Xinyi Dist ## 1250 松隆路36號對側 Xinyi Dist ## 1251 信安街103巷/吳興街284巷22弄 Xinyi Dist ## 1252 忠孝東路四段545號 Xinyi Dist ## 1253 光復南路200號對側 Xinyi Dist ## 1254 光復南路76號對側 Xinyi Dist ## 1255 中坡北路35號前 Xinyi Dist ## 1256 松仁路281巷66弄14號 Xinyi Dist ## 1257 基隆路一段3號前方橋下空間 Xinyi Dist ## 1258 寶興街186號(前) Wanhua Dist ## 1259 寶興街/長泰街(西南側) Wanhua Dist ## 1260 萬大路482號(旁) Wanhua Dist ## 1261 國興路2號前 Wanhua Dist ## 1262 中華路二段465號對側 Wanhua Dist ## 1263 國興路1巷15號對側 Wanhua Dist ## 1264 國興路42號對側 Wanhua Dist ## 1265 國興路與青年路口西南側 Wanhua Dist ## 1266 青年路66號對側 Wanhua Dist ## 1267 青年公園籃球場南側 Wanhua Dist ## 1268 西藏路123號前 Wanhua Dist ## 1269 萬大路277巷37弄1號東側 Wanhua Dist ## 1270 莒光路210號前 Wanhua Dist ## 1271 莒光路137號前 Wanhua Dist ## 1272 艋舺大道142號前 Wanhua Dist ## 1273 東園街199號前方 Wanhua Dist ## 1274 環河南路三段371號前 Wanhua Dist ## 1275 德昌街243號前 Wanhua Dist ## 1276 東園街66巷20弄27號前 Wanhua Dist ## 1277 東園街35巷14號對側 Wanhua Dist ## 1278 西園路二段與艋舺大道口西南側 Wanhua Dist ## 1279 西園路二段320巷與興義街口 Wanhua Dist ## 1280 長順街127號前 Wanhua Dist ## 1281 環河南路二段250巷25弄2號對側 Wanhua Dist ## 1282 環河南路二段216號旁 Wanhua Dist ## 1283 環河南路二段282號前 Wanhua Dist ## 1284 環河南路二段與西藏路口東側 Wanhua Dist ## 1285 大理街177號對側 Wanhua Dist ## 1286 艋舺大道與大理街160巷20弄口東側 Wanhua Dist ## 1287 青年路188號前 Wanhua Dist ## 1288 西寧南路12號(對面) Wanhua Dist ## 1289 峨嵋街83號(旁) Wanhua Dist ## 1290 環河南路一段280-1號(對面) Wanhua Dist ## 1291 成都路108號(對面) Wanhua Dist ## 1292 中華路一段164號(前) Wanhua Dist ## 1293 中華路一段與桂林路口西北側 Wanhua Dist ## 1294 和平西路三段/西園路一段(東北側) Wanhua Dist ## 1295 和平西路三段235號(旁) Wanhua Dist ## 1296 桂林路134號(對面) Wanhua Dist ## 1297 康定路238號(對面) Wanhua Dist ## 1298 艋舺大道83號(前) Wanhua Dist ## 1299 康定路/康定路287巷(東南側) Wanhua Dist ## 1300 和平西路三段/和平西路三段88巷(西南側) Wanhua Dist ## 1301 峨嵋街100號(對面) Wanhua Dist ## 1302 康定路18-2號(對面) Wanhua Dist ## 1303 中華路一段130號(前) Wanhua Dist ## 1304 康定路81號(對面) Wanhua Dist ## 1305 萬大路346號(旁) Wanhua Dist ## 1306 德昌街15號(對面) Wanhua Dist ## 1307 環河南路一段/和平西路三段口(西南側) Wanhua Dist ## 1308 長順街60巷38號對側 Wanhua Dist ## 1309 東園街35巷/東園街67巷交叉口 Wanhua Dist ## 1310 桂林路246巷66號南側 Wanhua Dist ## 1311 環河南路二段100巷15號對側 Wanhua Dist ## 1312 大理街170巷與環河南路二段159巷口 Wanhua Dist ## 1313 長順街與雙園街106巷口 Wanhua Dist ## 1314 富民路151號對側 Wanhua Dist ## 1315 環河南路二段245號旁 Wanhua Dist ## 1316 南寧路與廣州街口南側 Wanhua Dist ## 1317 昆明街與洛陽街口西側 Wanhua Dist ## 1318 桂林路與昆明街口西北側 Wanhua Dist ## 1319 西藏路 / 莒光路299巷口(東南側) Wanhua Dist ## 1320 青年路/青年路106巷(東側) Wanhua Dist ## 1321 和平西路三段/和平西路三段109巷(西北側) Wanhua Dist ## 1322 萬大路與興寧街66巷22弄口西北側 Wanhua Dist ## 1323 艋舺大道與西藏路口西南側(華翠大橋下) Wanhua Dist ## 1324 萬大路493巷44號旁 Wanhua Dist ## 1325 西園路二段320巷55弄8-10號前 Wanhua Dist ## 1326 青年路152巷59號對側 Wanhua Dist ## 1327 和平西路二段190巷11號前 Wanhua Dist ## 1328 環河南路三段/萬大路424巷 Wanhua Dist ## 1329 長泰街45號對側 Wanhua Dist ## 1330 水源路與青年路口北側 Wanhua Dist ## 1331 青年路162號對側人行道 Wanhua Dist ## 1332 水源路207之7號前 Wanhua Dist ## 1333 環河南路二段與西藏路口 Wanhua Dist ## 1334 艋舺大道404號前方 Wanhua Dist ## 1335 德昌街142號對側 Wanhua Dist ## 1336 汀洲路三段60巷2弄路側(A舍北側) NTU Dist ## 1337 臺大水源舍區C南側 NTU Dist ## 1338 思源街16號之1旁 NTU Dist ## 1339 臺大檔案展示館東北側 NTU Dist ## 1340 汀洲路三段60巷2弄路側(B舍北側) NTU Dist ## 1341 臺大男八舍東側 NTU Dist ## 1342 臺大仰萃樓東南側 NTU Dist ## 1343 農業陳列館北側 NTU Dist ## 1344 管理學院二號館北側 NTU Dist ## 1345 臺大土木工程學系所南側 NTU Dist ## 1346 臺大女一舍北側 NTU Dist ## 1347 臺大女九舍西南側 NTU Dist ## 1348 臺大小福樓東側 NTU Dist ## 1349 基隆路三段/基隆路三段156巷口北側 NTU Dist ## 1350 臺大工學院東南側 NTU Dist ## 1351 臺大天文數學館西南側 NTU Dist ## 1352 臺大心理學系南側 NTU Dist ## 1353 臺大文學院西側 NTU Dist ## 1354 臺大生化科技學系西側 NTU Dist ## 1355 臺大生物系館西側 NTU Dist ## 1356 臺大田徑場東側 NTU Dist ## 1357 臺大共同教學館東北側 NTU Dist ## 1358 臺大共同教學館東南側 NTU Dist ## 1359 臺大鹿鳴廣場人行道側 NTU Dist ## 1360 臺大公館停車場西北側 NTU Dist ## 1361 臺大行政大樓西側 NTU Dist ## 1362 臺大明達館西側 NTU Dist ## 1363 臺大物理文物廳北側 NTU Dist ## 1364 臺大物理系館南側 NTU Dist ## 1365 臺大社科院西側 NTU Dist ## 1366 臺大社會及社工館南側 NTU Dist ## 1367 臺大思亮館東南側 NTU Dist ## 1368 臺大椰林小舖旁 NTU Dist ## 1369 臺大計算機網路資訊中心南側 NTU Dist ## 1370 臺大原子與分子科學研究所東北側 NTU Dist ## 1371 臺大動物博物館西側 NTU Dist ## 1372 第一學生活動中心東南側 NTU Dist ## 1373 臺大博理館西側 NTU Dist ## 1374 臺大博雅館西側 NTU Dist ## 1375 臺大森林系學系北側 NTU Dist ## 1376 臺大植物魚類標本館一號館北側 NTU Dist ## 1377 臺大進修教育大樓 NTU Dist ## 1378 臺大雅頌廣場東南側 NTU Dist ## 1379 臺大園藝暨景觀學系北側 NTU Dist ## 1380 臺大新生教學館南側 NTU Dist ## 1381 臺大新聞研究所南側 NTU Dist ## 1382 臺大電機二館南側 NTU Dist ## 1383 臺大圖書資訊館北側 NTU Dist ## 1384 臺大圖書館西南側 NTU Dist ## 1385 臺大霖澤館南側 NTU Dist ## 1386 臺大獸醫系館南側 NTU Dist ## 1387 臺大體育館東側 NTU Dist ## 1388 明達館北側前空地 NTU Dist ## snaen ## 1 YouBike2.0_MRT Technology Bldg. Sta. ## 2 YouBike2.0_No.273, Sec. 2, Fuxing S. Rd. ## 3 YouBike2.0_NTUE Experiment Elementary School (East) ## 4 YouBike2.0_Heping Park (East) ## 5 YouBike2.0_Xinhai Fuxing Rd. Intersection (Northwest) ## 6 YouBike2.0_No. 280, Sec. 2, Fuxing S. Rd. ## 7 YouBike2.0_Ln. 340, Sec. 2, Fuxing S. Rd. ## 8 YouBike2.0_No. 52, Sec. 3, Xinsheng S. Rd. ## 9 YouBike2.0_No. 66, Sec. 3, Xinsheng S. Rd. ## 10 YouBike2.0_No. 82, Sec. 3, Xinsheng S. Rd. ## 11 YouBike2.0_No. 30, Sec. 1, Xinhai Rd. ## 12 YouBike2.0_Heping Fuxing Rd. Intersection (Northwest) ## 13 YouBike2.0_No. 311, Sec. 3, Roosevelt Rd. ## 14 YouBike2.0_Taipei Da-an Sports Center Parking lot ## 15 YouBike2.0_No. 245, Sec. 3, Roosevelt Rd. ## 16 YouBike2.0_Wenzhou Park ## 17 YouBike2.0_Heping Wolong St. Intersection ## 18 YouBike2.0_Wenzhou Parking Lot ## 19 YouBike2.0_Taipei Municipal MingChuan Elementary School(Side Gate) ## 20 YouBike2.0_MRT Gongguan Sta. (Exit 2) ## 21 YouBike2.0_2nd Student Activity Center ## 22 YouBike2.0_NTUST(Main Gate) ## 23 YouBike2.0_NTUST(Side Gate) ## 24 YouBike2.0_Gongguan Park ## 25 YouBike2.0_NTUST(Back Gate) ## 26 YouBike2.0_NTU Cancer Center ## 27 YouBike2.0_NTU Environment Research Building ## 28 YouBike2.0_NTU Yonglin Biomedical Engineering Hall ## 29 YouBike2.0_NTU 7th Men's Dorm ## 30 YouBike2.0_NTU 1st Men's Dorm ## 31 YouBike2.0_NTU 6th Men's Dorm ## 32 YouBike2.0_NTU Veterinary Hospital ## 33 YouBike2.0_NTU Civil Engineering Research Building ## 34 YouBike2.0_NTU Wan Tsai Research Hall ## 35 YouBike2.0_NTU Guo - Ching Building ## 36 YouBike2.0_NTU College of social Sciences Building ## 37 YouBike2.0_NTU Language Training & Testing Center ## 38 YouBike2.0_NTU Sports Center Car Park ## 39 YouBike2.0_Xinhai Xinsheng Rd. Intersection (Southeast) ## 40 YouBike2.0_Keelung Changxing Rd. Intersection(East) ## 41 YouBike2.0_NTUE Side Gate(South) ## 42 YouBike2.0_Heping Experiment Elementary School (Northeast) ## 43 YouBike2.0_Daan District Public Health Center ## 44 YouBike2.0_Xinhai Taishun St. Intersection ## 45 YouBike2.0_Fanghe Junior High School ## 46 YouBike2.0_Wolong Leye St. Intersection ## 47 YouBike2.0_Wolong Park ## 48 YouBike2.0_Jiaxing Park ## 49 YouBike2.0_MRT Linguang Sta. (Exit 2) ## 50 YouBike2.0_MRT Liuzhangli Sta. ## 51 YouBike2.0_George Vocational High School of Taipei ## 52 YouBike2.0_Fazhi Park ## 53 YouBike2.0_MRT Taipower Building Sta. (Exit 2) ## 54 YouBike2.0_Sec. 1, Heping E. Rd & Sec. 2, Jinshan S. Rd Intersection ## 55 YouBike2.0_Sec. 1, Heping E. Rd & Longquan St. Intersection ## 56 YouBike2.0_Sec. 1, Heping E. Rd & Taishun St Intersection ## 57 YouBike2.0_National Taiwan Normal University (library) ## 58 YouBike2.0_MRT Guting Sta. (Exit 6) ## 59 YouBike2.0_MRT Guting Sta. (Exit 5) ## 60 YouBike2.0_Taipei Public library ## 61 YouBike2.0_Sec. 2, Xinsheng S. Rd & Sec. 2, Heping E. Rd Intersection ## 62 YouBike2.0_Sec. 2, Jianguo S. Rd & Sec. 2, Heping E. Rd Intersection ## 63 YouBike2.0_Jinhua Park ## 64 YouBike2.0_MRT Dongmen Sta. (Exit 3) ## 65 YouBike2.0_Jin'ou Girls High School ## 66 YouBike2.0_Jinhang Park ## 67 YouBike2.0_Aiguo & Jinshan Rd. Intersection ## 68 YouBike2.0_Ln. 293, Sec. 2, Dunhua S. Rd (South) ## 69 YouBike2.0_Sec. 2, Dunhua S. Rd & Sec. 2, Keelung Rd Intersection ## 70 YouBike2.0_Ln. 181, Sec. 2, Anhe Rd ## 71 YouBike2.0_Linjiang St night market (Ln. 101, Tonghua St) ## 72 YouBike2.0_Linjiang St night market (Keelung Rd) ## 73 YouBike2.0_National Taipei University of Technology (Everlight Building) ## 74 YouBike2.0_Ln. 119, Sec. 1, Xinsheng S. Rd Intersection ## 75 YouBike2.0_Xing'an Elementary School (Ren'ai Rd) ## 76 YouBike2.0_Minrong Park ## 77 YouBike2.0_Ln. 340, Sec. 1, Fuxing S. Rd Intersection ## 78 YouBike2.0_Sec. 1, Jianguo S. Rd & Sec. 3, Jinan Rd Intersection ## 79 YouBike2.0_MRT Zhongxiao Fuxing Sta (Exit 2) ## 80 YouBike2.0_MRT Da’an Sta (Exit 4) ## 81 YouBike2.0_MRT Da’an Sta (Exit 2) ## 82 YouBike2.0_Sec. 4, Xinyi Rd & Da’an Rd Intersection (Xinwei Building) ## 83 YouBike2.0_Long Men Plaza ## 84 YouBike2.0_Sec. 4, Ren'ai Rd & Sec. 1, Anhe Rd Intersection ## 85 YouBike2.0_Sec. 4, Xinyi Rd & Sec. 1, Dunhua S. Rd Intersection ## 86 YouBike2.0_Ren Ai Junior High School ## 87 YouBike2.0_MRT Xinyi Anhe Sta (Exit 2) ## 88 YouBike2.0_Bade Traditional Market ## 89 YouBike2.0_Changlong Park ## 90 YouBike2.0_MRT Daan Park Sta. (Exit 2) ## 91 YouBike2.0_Sec. 4,Xinyi Rd & Yanji St Intersection ## 92 YouBike2.0_Guangxin Park (Ln. 456, Guangfu S. Rd) ## 93 YouBike2.0_Qiao An Dixia Parking (Exit 2) (Southeast) ## 94 YouBike2.0_Ln. 279, Sec. 1, Jianguo S. Rd Intersection ## 95 YouBike2.0_MRT Zhongxiao Xinsheng Sta. (Exit 6) ## 96 YouBike2.0_MRT Zhongxiao Xinsheng Sta. (Exit 4) ## 97 YouBike2.0_Daan Vocational High School ## 98 YouBike2.0_MRT Zhongxiao Xinsheng Sta. (Exit 3) ## 99 YouBike2.0_Liugong Park ## 100 YouBike2.0_Dunhua S. Rd. & Civic Blvd. Intersection ## 101 YouBike2.0_MRT Daan Park Sta. (Exit 5) ## 102 YouBike2.0_Xinyi Rd. & Jianguo Rd. Intersection ## 103 YouBike2.0_Dongfeng Park ## 104 YouBike2.0_Dean Park ## 105 YouBike2.0_MRT Zhongxiao Fuxing Sta (Exit 5) ## 106 YouBike2.0_MRT Zhongxiao Dunhua Sta. (Exit 2) ## 107 YouBike2.0_MRT Zhongxiao Dunhua Sta. (Exit 7) ## 108 YouBike2.0_Ln. 208, Rui'an St. ## 109 YouBike2.0_Ln. 21, Leli Rd. Intersection ## 110 YouBike2.0_MRT Technology Building Station ## 111 YouBike2.0_MRT S.Y.S Memorial Hall Stataion(Exit 2.) ## 112 YouBike2.0_Taipei City Hospital Renai Branch ## 113 YouBike2.0_MRT Xinyi Anhe Sta.(Exit.4) ## 114 YouBike2.0_Chengong Public Housing ## 115 YouBike2.0_Renai & Yanji Intersection ## 116 YouBike2.0_MRT Xinyi Anhe Sta.(Exit.1) ## 117 YouBike2.0_Ln. 103,Sec. 2,Dunhua S. Rd. ## 118 YouBike2.0_Ln. 128, Sec. 2, Fuxing S. Rd. ## 119 YouBike2.0_Heping E. Rd. & Jianguo S. Rd. Intersection ## 120 YouBike2.0_Fanglan ## 121 YouBike2.0_Ln. 126, Sec. 1, Fuxing S. Rd. ## 122 YouBike2.0_MRT Dongmen Sta. (Exit 5) ## 123 YouBike2.0_Ln. 48, Sec. 4, Ren'ai Rd. ## 124 YouBike2.0_MRT Gongguan Sta.(Exit.3) ## 125 YouBike2.0_NTUT(EE) ## 126 YouBike2.0_Ln. 217, Sec. 3, Zhongxiao E. Rd. ## 127 YouBike2.0_Ln. 94, Sec. 3, Xinsheng S. Rd. Intersection ## 128 YouBike2.0_Xinhai Rd. & Xinsheng S. Rd. Intersection ## 129 YouBike2.0_MRT Da’an Sta. (Exit 6) ## 130 YouBike2.0_Ln. 195, Wolong St. ## 131 YouBike2.0_Ln. 157, Sec. 3, Xinhai Rd. ## 132 YouBike2.0_Wolong St. & Xinyi Rd. Intersection ## 133 YouBike2.0_Dunchin Park ## 134 YouBike2.0_Taipei Daan Sports Center ## 135 YouBike2.0_Heping Rd. & Dunhua Rd. Intersection ## 136 YouBike2.0_Keelung Rd. & Changxing St. Intersection ## 137 YouBike2.0_Ln. 122, Sec. 4, Ren'ai Rd. ## 138 YouBike2.0_Civic Blvd. & Dunhua Rd. Intersection ## 139 YouBike2.0_Ln. 49, Sec. 4, Zhongxiao E. Rd. ## 140 YouBike2.0_Civic Blvd. & Fuxing Rd. Intersection (Southeast) ## 141 YouBike2.0_Heping Rd. & Xinsheng S. Rd. Intersection (Southwest) ## 142 YouBike2.0_Quanan Park ## 143 YouBike2.0_Ln. 134, Sec. 3, Xinyi Rd. ## 144 YouBike2.0_Renai Dunnan Traffic Cir (Southeast) ## 145 YouBike2.0_Chenggong Public House ## 146 YouBike2.0_Institute of Diplomacy and International Affairs ## 147 YouBike2.0_Ln. 170, Siwei Rd. ## 148 YouBike2.0_MRT Da’an Sta. (Exit 3) ## 149 YouBike2.0_MRT Taipower Building Sta. (Exit 2)_1 ## 150 YouBike2.0_Ln. 199, Sec. 4, Xinyi Rd. ## 151 YouBike2.0_NTU Information Building ## 152 YouBike2.0_Ln. 81, Sec. 2, Dunhua S. Rd. ## 153 YouBike2.0_Former Taipei Prison Office ## 154 YouBike2.0_MRT S.Y.S Memorial Hall Sta. (Exit 1) ## 155 YouBike2.0_Huai Sheng Junior High School ## 156 YouBike2.0_Renai Dunnan Traffic Cir (Northwest) ## 157 YouBike2.0_Lih Jen International Private Elementary and Middle School ## 158 YouBike2.0_Ln. 18, Sec. 2, Heping E. Rd. ## 159 YouBike2.0_MRT Da’an Sta. (Exit 5) ## 160 YouBike2.0_Linjiang Park ## 161 YouBike2.0_Aly. 19, Ln. 113, Sec. 4, Roosevelt Rd. ## 162 YouBike2.0_Ln. 248, Sec. 4, Zhongxiao E. Rd. ## 163 YouBike2.0_Ren'ai Rd. & Yanji St. Intersection (Northwest) ## 164 YouBike2.0_Ln. 101, Leli Rd. ## 165 YouBike2.0_Roosevelt Rd. & Pucheng St. Intersection ## 166 YouBike2.0_Ln. 295, Sec. 1, Dunhua S. Rd. ## 167 YouBike2.0_Ln. 108, Tong'an St. ## 168 YouBike2.0_Zhongxiao E. Rd. & Fuxing S. Rd. Intersection (Southeast) ## 169 YouBike2.0_Ren'ai Rd. & Da'an Rd. Intersection (Northeast) ## 170 YouBike2.0_National Taiwan Normal University (Pucheng St.) ## 171 YouBike2.0_Ln. 69, Sec. 2, Anhe Rd. ## 172 YouBike2.0_DaAn Elementary School ## 173 YouBike2.0_MRT Guting Sta. (Exit 3) ## 174 YouBike2.0_MRT Zhongxiao Fuxing Sta. (Exit 3) ## 175 YouBike2.0_Ln. 90, Sec. 2, HePing E. Rd. ## 176 YouBike2.0_Ln. 420, GuangFu S. Rd. ## 177 YouBike2.0_FuYang St. & WoLong St. Intersection ## 178 YouBike2.0_RenAi Rd. & FuXing Rd. Intersection ## 179 YouBike2.0_RenAi DunNan Traffic Circle (East) ## 180 YouBike2.0_GuFeng Park ## 181 YouBike2.0_Yanping Public Housing ## 182 YouBike2.0_Taipei Public Library DaTong Branch ## 183 YouBike2.0_Hechang Temple ## 184 YouBike2.0_Minzu Rd. & Yanping Rd. Intersection ## 185 YouBike2.0_Chongqing Rd. & Jiuquan St. Intersection ## 186 YouBike2.0_Shude Park ## 187 YouBike2.0_Chen Tian-lai Residence ## 188 YouBike2.0_Taipei Confucius Temple ## 189 YouBike2.0_MRT Yuanshan Sta. (Exit 1) ## 190 YouBike2.0_Jiuquan St. & Yanping Rd. Intersection ## 191 YouBike2.0_Chongqing Junior High School ## 192 YouBike2.0_Ln. 383, Sec. 3, Chongqing N Rd. Intersection ## 193 YouBike2.0_DigiBlock Taipei ## 194 YouBike2.0_Minquan Rd. & Yanping Rd. Intersection (Northwest) ## 195 YouBike2.0_Minquan Rd. & Dihua St. Intersection ## 196 YouBike2.0_Dadaocheng Park ## 197 YouBike2.0_Dalong Old People Housing ## 198 YouBike2.0_Dalongdong Social Housing ## 199 YouBike2.0_MRT Daqiaotou Sta. (Exit 2) ## 200 YouBike2.0_MRT Daqiaotou Sta. (Exit 1A) ## 201 YouBike2.0_MRT Minquan W. Rd. Sta. (Exit 2) ## 202 YouBike2.0_MRT Shuanglian Sta. (Exit 2) ## 203 YouBike2.0_MRT Beimen. (Exit 3) ## 204 YouBike2.0_Zhaoyang Park ## 205 YouBike2.0_Yongle Market ## 206 YouBike2.0_Dalong Park ## 207 YouBike2.0_Chongcing Rd. & Liangjhou St. Intersection ## 208 YouBike2.0_Linear Park - Yuanshan ## 209 YouBike2.0_Yuanhuan ## 210 YouBike2.0_Chongcing Rd. & Minzu Rd. Intersection ## 211 YouBike2.0_Ln. 8, Sec. 3, Chengde Rd. Intersection ## 212 YouBike2.0_Tai Yuan Guang Chang ## 213 YouBike2.0_Guoshun Park ## 214 YouBike2.0_Taipei City Hospital Zhongxing Branch ## 215 YouBike2.0_Chiang Wei-shui Memorial Park ## 216 YouBike2.0_Dihua Recreational Sports Park ## 217 YouBike2.0_Taipei DaTong Sports Center ## 218 YouBike2.0_Chongqing Rd. & Bao'an St. Intersection ## 219 YouBike2.0_Dadaocheng Wharf ## 220 YouBike2.0_Guisui Park ## 221 YouBike2.0_Min-Quan Junior High School (Minquan W. Rd.) ## 222 YouBike2.0_Chengde Rd. & Minquan Rd. Intersection ## 223 YouBike2.0_Nanjing Rd. & Taiyuan Rd. Intersection ## 224 YouBike2.0_Chengde Rd. & Minsheng W. Rd. Intersection ## 225 YouBike2.0_Taiyuan Rd. & Wuyuan Rd. Intersection ## 226 YouBike2.0_Taipei Bus Station (Huayin St.) ## 227 YouBike2.0_MRT Minquan W. Rd. Sta. (Exit 3) ## 228 YouBike2.0_MRT Zhongshan Sta. (Exit 5) ## 229 YouBike2.0_Chongqing Rd. & Chang'an Rd. Intersection ## 230 YouBike2.0_Chengde Rd. & Changji St. Intersection ## 231 YouBike2.0_Datong Plaza No.16 ## 232 YouBike2.0_MRT Yuanshan Sta. (Exit 2) ## 233 YouBike2.0_Shude Park ## 234 YouBike2.0_Chengde Rd. & Zhengzhou Rd. Intersection ## 235 YouBike2.0_ChengYuan High School ## 236 YouBike2.0_ShuangLian Elementary School ## 237 YouBike2.0_Ningxia Rd. & Liangzhou St. Intersection ## 238 YouBike2.0_Yanping Rd. & Liangzhou St. Intersection ## 239 YouBike2.0_Datong District Admin. Center ## 240 YouBike2.0_Dalong Market ## 241 YouBike2.0_Aly. 19, Ln. 23, Hami St. ## 242 YouBike2.0_Jiantan Pumping Station ## 243 YouBike2.0_Tonghe E. St. & Danan Rd. Intersection ## 244 YouBike2.0_Fugang St. Parking Lot ## 245 YouBike2.0_Bailing Elementary School ## 246 YouBike2.0_Ln. 165, Yusheng St. Intersection ## 247 YouBike2.0_Tianhe Park ## 248 YouBike2.0_Zhongshan & Tianmu Rd. Intersection ## 249 YouBike2.0_Tianmu Sports Park ## 250 YouBike2.0_University of Taipei (Tianmu Campus) ## 251 YouBike2.0_Ln. 53, Sec. 2, Zhongcheng Rd. ## 252 YouBike2.0_Taipei Tianmu Baseball Stadium ## 253 YouBike2.0_Tianmu N. Rd. & Tianyu St. Intersection ## 254 YouBike2.0_Lanxing Park ## 255 YouBike2.0_Mingsheng Park ## 256 YouBike2.0_Chientan Youth Activity Center ## 257 YouBike2.0_No. 173, Sec. 1, Zhongcheng Rd. Intersection ## 258 YouBike2.0_Yunong Elementary School ## 259 YouBike2.0_Zhongcheng Park ## 260 YouBike2.0_Zhishan Pumping Plant ## 261 YouBike2.0_Ln. 305, Sec. 1, Zhicheng Rd. Intersection ## 262 YouBike2.0_Hualing Park ## 263 YouBike2.0_Qiangang Park(Fude Temple) ## 264 YouBike2.0_Ln. 185, Hualing St. ## 265 YouBike2.0_Qiangang Park (Qiangang St) ## 266 YouBike2.0_Bailing High School ## 267 YouBike2.0_MRT Zhishan Station ## 268 YouBike2.0_Taiwan Traditional Theatre Center ## 269 YouBike2.0_MRT Jianta Station ## 270 YouBike2.0_Jiantan Rd & Jihe Rd Intersection ## 271 YouBike2.0_Zhicheng Park ## 272 YouBike2.0_Fu-Lin Elementary School ## 273 YouBike2.0_Sec. 5, Jhongshan N. Rd & Jhongjheng Rd Intersection ## 274 YouBike2.0_Shihlin Sport Center ## 275 YouBike2.0_Yangming High School ## 276 YouBike2.0_Taipei Children's Amusement Park ## 277 YouBike2.0_Taipei Astronomical Museum ## 278 YouBike2.0_Huasheng Park ## 279 YouBike2.0_Fulin Park ## 280 YouBike2.0_MRT Shilin Station (Exit 2) ## 281 YouBike2.0_Ming Chuan University Taipei Campus ## 282 YouBike2.0_Shilin High School of Commerce ## 283 YouBike2.0_Lanya Park ## 284 YouBike2.0_Taipei City Hospital Yangming Branch ## 285 YouBike2.0_MRT Zhishan Sta. (Exit 1) ## 286 YouBike2.0_Zhicheng Park ## 287 YouBike2.0_Indigenous People's Park ## 288 YouBike2.0_Ln. 10, Sec. 2, Tonghe E. St. Intersection ## 289 YouBike2.0_Meilin New Village ## 290 YouBike2.0_Yanping N. Rd & Zhongzheng Rd Intersection ## 291 YouBike2.0_Ln. 190, Sec. 4, Chongqing N. Rd Intersection ## 292 YouBike2.0_Sec. 4, Chongqing N. Rd.& Hudong St Intersection ## 293 YouBike2.0_Hulu Elementary School ## 294 YouBike2.0_Shilin Plaza ## 295 YouBike2.0_Shezheng Park ## 296 YouBike2.0_Shezi Elementary School ## 297 YouBike2.0_Ln. 384, Shezhong St Intersection ## 298 YouBike2.0_No. 138, Sec. 1, Zhongcheng Rd ## 299 YouBike2.0_Shezi Park ## 300 YouBike2.0_National Palace Museum ## 301 YouBike2.0_Taibei High School ## 302 YouBike2.0_Hougang Park ## 303 YouBike2.0_No. 117, Sec. 4, Chongqing N. Rd ## 304 YouBike2.0_Daotou Park ## 305 YouBike2.0_Ln. 133, Sec. 8, Yanping N. Rd Intersection ## 306 YouBike2.0_Kuntian Temple ## 307 YouBike2.0_Shezidao Wetlands Service Center ## 308 YouBike2.0_Fu'an Junior High School ## 309 YouBike2.0_Taipei City Fire Department of Fuan Station ## 310 YouBike2.0_Shengshan Greens ## 311 YouBike2.0_Zhishan Elementary School ## 312 YouBike2.0_Shilin New Village ## 313 YouBike2.0_Lanya Elementary School ## 314 YouBike2.0_Jhongjheng Rd. & Jihe Rd. Intersection ## 315 YouBike2.0_Fulin Park (Jhongjheng Rd.) ## 316 YouBike2.0_Jhihshan Rd. & Linsi Rd. Intersection ## 317 YouBike2.0_Taipei Public Library Huludu Branch ## 318 YouBike2.0_Ln. 110, Dongshan Rd. ## 319 YouBike2.0_Yongping Social Housing ## 320 YouBike2.0_Yunong Bridge ## 321 YouBike2.0_Ln. 76, Tonghe St. & Ln. 10, Sec. 4, Chengde Rd. Intersection ## 322 YouBike2.0_Zhishan Shengyou Temple ## 323 YouBike2.0_Zhicheng Rd. & Yusheng St. Intersection ## 324 YouBike2.0_MRT Linear Park (Hou St.) ## 325 YouBike2.0_Tianmu Park ## 326 YouBike2.0_Jihe Rd. & Wenlin Rd. Intersection ## 327 YouBike2.0_Wenlin Rd. & Fude Rd. Intersection ## 328 YouBike2.0_Chientan Overseas Youth Activity Center_1 ## 329 YouBike2.0_SheZi Elementary School ## 330 YouBike2.0_MRT Jianta Sta. (Exit 1) ## 331 YouBike2.0_Dexing Rd. & Dongshan Rd. Intersection ## 332 YouBike2.0_Chongqing N. Rd. & Tonghe W. St. Intersection ## 333 YouBike2.0_Hulu Elementary School (Ln. 285, Sec. 5, Yanping N. Rd.) ## 334 YouBike2.0_Shezi Market ## 335 YouBike2.0_Shilin District Farmers' Association (Shezi St.) ## 336 YouBike2.0_Chengde Rd. & Jiantan Rd. Intersection ## 337 YouBike2.0_Ln. 101, Wenlin Rd. ## 338 YouBike2.0_Aly. 15, Ln. 257, Sec. 5, Yanping N. Rd. ## 339 YouBike2.0_Aly. 4, Ln. 257, Sec. 5, Yanping N. Rd. ## 340 YouBike2.0_Taipei School For The Visually Impaired ## 341 YouBike2.0_Zhongshan N. Rd. & Fuguo Rd. Intersection ## 342 YouBike2.0_Dexing Park ## 343 YouBike2.0_Chengde Rd & Hougang St. Intersection ## 344 YouBike2.0_Ln. 698, Sec. 5, Zhongshan N. Rd. ## 345 YouBike2.0_MRT Shilin Sta. (Exit 1) ## 346 YouBike2.0_MRT Zhishan Sta. (Exit 2)_1 ## 347 YouBike2.0_MCU (Ln. 280, Sec. 5, Zhongshan N. Rd.) ## 348 YouBike2.0_Haiguang Park (South) ## 349 YouBike2.0_Ln. 40, Shishang Rd. ## 350 YouBike2.0_Shihlin Jiantan Post Office ## 351 YouBike2.0_Ln. 91, Shidong Rd. ## 352 YouBike2.0_Meilun Park ## 353 YouBike2.0_University of Taipei (Ln. 270, Sec. 2, Zhongcheng Rd.) ## 354 YouBike2.0_Ln. 8, Tianmu E. Rd. & Ln. 154, Sec. 2, Zhongcheng Rd. Intersection ## 355 YouBike2.0_Meilun Park (Northeast) ## 356 YouBike2.0_Fuan Riverside Park ## 357 YouBike2.0_Zhongcheng Rd. & Zhongyi St. Intersection (North) ## 358 YouBike2.0_Zhongcheng Rd. & Zhongyi St. Intersection (South) ## 359 YouBike2.0_Shilin Elementary School ## 360 YouBike2.0_No.1 TianHe Park ## 361 YouBike2.0_Ln. 178, Sec. 2, ZhongCheng Rd. ## 362 YouBike2.0_KeGiang Rd. & HuangXi St. Intersection ## 363 YouBike2.0_LanYa Park (West) ## 364 YouBike2.0_Aly. 77, Ln. 100, FuLin Rd. ## 365 YouBike2.0_Taipei Pot Plant Market ## 366 YouBike2.0_MRT Wanlong Sta. (Exit 4) ## 367 YouBike2.0_MRT Wanlong Sta. (Exit 1) ## 368 YouBike2.0_Wanhe 2nd Park ## 369 YouBike2.0_MRT Wanlong Sta. (Exit 2) ## 370 YouBike2.0_Jingren Park ## 371 YouBike2.0_MRT Jingmei Sta. (Exit 2) ## 372 YouBike2.0_Roosevelt Jinglong St. Intersection ## 373 YouBike2.0_Jingfu St & Ln. 142, Sec. 6, Roosevelt Rd Intersection ## 374 YouBike2.0_Xingwang Park ## 375 YouBike2.0_Xing Fu Junior High School ## 376 YouBike2.0_Ln. 203, Sec. 2, Xinglong Rd ## 377 YouBike2.0_Jingmei Sports Park ## 378 YouBike2.0_Jing Mei Hospital ## 379 YouBike2.0_National Taiwan Normal University Gongguan Campus ## 380 YouBike2.0_Ln 128, Jinghua St. ## 381 YouBike2.0_Xianjiyan Trailhead (Jingxing Rd.) ## 382 YouBike2.0_National Chengchi University ## 383 YouBike2.0_MRT Taipei Zoo Sta. ## 384 YouBike2.0_MRT Muzha Sta. ## 385 YouBike2.0_MRT Wanfang Community Sta. ## 386 YouBike2.0_Wen Shan Sports Center ## 387 YouBike2.0_MRT Xinhai Sta. ## 388 YouBike2.0_Xingfeng Park ## 389 YouBike2.0_Muzha Rd. & Guanghui Rd. Intersection ## 390 YouBike2.0_Examination Yuan ## 391 YouBike2.0_No. 26, Hexing St. Intersection ## 392 YouBike2.0_Shih Hsin University ## 393 YouBike2.0_Yishou Bridge ## 394 YouBike2.0_Jingmei Girls High School ## 395 YouBike2.0_Performing Arts School 36 ## 396 YouBike2.0_Zhongshun Community Center ## 397 YouBike2.0_Jingwen Bilingual High School ## 398 YouBike2.0_Laoquan St. Basketball Court ## 399 YouBike2.0_Wenshan District Admin. Center ## 400 YouBike2.0_Muzha Park ## 401 YouBike2.0_Xinglong Public Housing (D2) ## 402 YouBike2.0_Ln. 95, Sec. 3, Muxin Rd. Intersection ## 403 YouBike2.0_Zhangjiaoli Park ## 404 YouBike2.0_Shijian Junior High School ## 405 YouBike2.0_Ln. 2, Sec. 3, Zhinan Rd. ## 406 YouBike2.0_Laiyin Park ## 407 YouBike2.0_Muzha Social Housing ## 408 YouBike2.0_Ln. 185, Sec. 1, Xiuming Rd. Intersection ## 409 YouBike2.0_Ln. 129, Sec. 1, Xiuming Rd. Intersection ## 410 YouBike2.0_Hengguang Bridge (Laoquan St.) ## 411 YouBike2.0_Wan You NO.3 Park ## 412 YouBike2.0_MRT Wanfang Hospital Sta. (Ln. 115, Sec. 3, Xinglong Rd.) ## 413 YouBike2.0_Xingde Reading Room ## 414 YouBike2.0_Xinhai Ecological Park ## 415 YouBike2.0_Bo Jia Sports Park ## 416 YouBike2.0_National Chengchi University (Wanshou Rd.) ## 417 YouBike2.0_Sian Yan Park ## 418 YouBike2.0_Zhengda 1st St. ## 419 YouBike2.0_Wenshan 2nd District Office ## 420 YouBike2.0_National Immigration Agency Training Center ## 421 YouBike2.0_Coast Guard Administration (South) ## 422 YouBike2.0_Ming Dao Elementary School (Southeast) ## 423 YouBike2.0_Mu Nan Park ## 424 YouBike2.0_Shijian Junior High School (Ln. 310, Sec. 3, Muxin Rd.) ## 425 YouBike2.0_National Taiwan Normal University Gongguan Campus_1 ## 426 YouBike2.0_MRT Taipei Zoo Sta. (Exit 2) ## 427 YouBike2.0_Waterfront Elevator ## 428 YouBike2.0_Dunnan Forest ## 429 YouBike2.0_Jingmei Pumping Station ## 430 YouBike2.0_Wan He NO.3 Park ## 431 YouBike2.0_Jing Xing Junior High School ## 432 YouBike2.0_Jingren Park_1 ## 433 YouBike2.0_NTNU Gongguan Campus (Student Dorm 2) ## 434 YouBike2.0_Jing Sing Park ## 435 YouBike2.0_WangXin Elementary School ## 436 YouBike2.0_Ln. 77, Sec. 4, Xinhai Rd. ## 437 YouBike2.0_Ln. 42, Jingxing Rd. ## 438 YouBike2.0_Ln. 48, Sec. 3, Muzha Rd. ## 439 YouBike2.0_Ln. 109, Sec. 2, Muzha Rd. ## 440 YouBike2.0_Shih Yuan Park ## 441 YouBike2.0_Jhang Shu Park ## 442 YouBike2.0_Wanmei St. & Wan'an St. Intersection ## 443 YouBike2.0_Ln. 203, Sec. 2, Xinglong Rd. (Dunnan) ## 444 YouBike2.0_Xinguang Rd. & Xiuming Rd. Intersection ## 445 YouBike2.0_Ln. 134, Guanghui Rd. ## 446 YouBike2.0_Guang Huei Park ## 447 YouBike2.0_Mu Sin Park ## 448 YouBike2.0_Aly. 1, Ln. 275, Sec. 2, Xinglong Rd. ## 449 YouBike2.0_China University of Technology ## 450 YouBike2.0_Ln. 8, Zhangxin St. ## 451 YouBike2.0_Ln. 22, Xianyan Rd. ## 452 YouBike2.0_Muzha &Wanfang Rd. Intersection ## 453 YouBike2.0_Ln. 78, Fuxing Rd. ## 454 YouBike2.0_Sing Tai Park ## 455 YouBike2.0_Taipei City Xing Yan Social Welfare Services Building ## 456 YouBike2.0_Aly. 9, Ln. 22, Sec. 2, XingLong Rd. ## 457 YouBike2.0_Taipei Water Department ## 458 YouBike2.0_Tingzhou Rd. / Siyuan St. intersection (Southeast) ## 459 YouBike2.0_MRT Gongguan Sta. (Exit 1) ## 460 YouBike2.0_MRT Gongguan Sta. (Exit 4) ## 461 YouBike2.0_MRT Guting Sta. (Exit 9) ## 462 YouBike2.0_MRT Guting Sta. (Exit 2) ## 463 YouBike2.0_MRT Taipower Building Sta. (Exit 1) ## 464 YouBike2.0_Hakka Cultural Park ## 465 YouBike2.0_Taipei Municipal Heti Elementary School ## 466 YouBike2.0_Jizhouan Heritage Building ## 467 YouBike2.0_MRT Taipower Building Sta. (Exit 5) ## 468 YouBike2.0_MRT Taipower Building Sta. (Exit 4) ## 469 YouBike2.0_Sec. 3, Roosevelt Rd & Jinmen St Intersection ## 470 YouBike2.0_Guling Park ## 471 YouBike2.0_MRT Guting Sta. (Exit 8) ## 472 YouBike2.0_MRT Guting Sta. (Exit 7) ## 473 YouBike2.0_Nanchang Park ## 474 YouBike2.0_Heping & Chongqing Rd. Intersection ## 475 YouBike2.0_Gen.Sun Li-Jen Residence ## 476 YouBike2.0_Ln.6, Sec.2, Roosevelt Rd. ## 477 YouBike2.0_Jinhua & Hangzhou S. Rd. Intersection ## 478 YouBike2.0_MRT C.K.S. Memorial Hall Sta. (Exit 3) ## 479 YouBike2.0_MRT C.K.S. Memorial Hall Sta. (Exit 4) ## 480 YouBike2.0_Ying-Qiao Elementary School ## 481 YouBike2.0_Guting Intelligent Library ## 482 YouBike2.0_Yongchang Park ## 483 YouBike2.0_Ln. 409, Sec. 2, Zhonghua Rd ## 484 YouBike2.0_Nanjichang Night Market (Sec. 2, Zhonghua Rd) ## 485 YouBike2.0_Nanhai Rd & Sec. 2, Heping W. Rd (Southwest) ## 486 YouBike2.0_Juguang Rd & Sec. 2, Heping W. Rd Intersection ## 487 YouBike2.0_No. 11-1, Shuiyuan Rd ## 488 YouBike2.0_Nan Men Junior High School ## 489 YouBike2.0_MRT Xiaonanmen Sta. (Exit 2) ## 490 YouBike2.0_Jieshou Park ## 491 YouBike2.0_Zhonghua Rd & Guiyang St Intersection ## 492 YouBike2.0_Huashan 1914 Creative Park ## 493 YouBike2.0_MRT Shandao Temple Sta (Exit 1) ## 494 YouBike2.0_Jinan Rd & Shaoxing S. St Intersection ## 495 YouBike2.0_Linsen S. Rd & Sec 1, Ren'ai Rd Intersection ## 496 YouBike2.0_Zhongzheng Sports Center ## 497 YouBike2.0_Sec 1, Xinyi Rd & Hangzhou S. Rd Intersection ## 498 YouBike2.0_MRT Shandao Temple Sta (Exit 3) ## 499 YouBike2.0_MRT Xiaonanmen Sta. (Exit 1) ## 500 YouBike2.0_Ln. 133, Yanping S. Rd Intersection ## 501 YouBike2.0_MRT Ximen Sta (Exit 2) ## 502 YouBike2.0_Baoqing Rd & Bo'ai Rd Intersection ## 503 YouBike2.0_Agency Against Corruption ## 504 YouBike2.0_University of Taipei Boai Campus ## 505 YouBike2.0_National Central Library ## 506 YouBike2.0_Civic Blvd & Jinshan N. Rd Intersection ## 507 YouBike2.0_Taipei City Hospital Heping Branch ## 508 YouBike2.0_Zhongshan Hall ## 509 YouBike2.0_Sec. 1, Zhonghua Rd & Hankou St Intersection ## 510 YouBike2.0_Ln. 21, Sec. 1, Zhonghua Rd Intersection ## 511 YouBike2.0_MRT NTU Hospital Sta. (Exit 4) ## 512 YouBike2.0_Treasure Hill Guanyin Temple ## 513 YouBike2.0_Shida Rd. & Shuiyuan Rd. Intersection ## 514 YouBike2.0_Zhongshan Rd. & Xuzhou Rd. Intersection ## 515 YouBike2.0_Xinyi Rd. & Lianyun St. Intersection ## 516 YouBike2.0_Taipei Bus Station ## 517 YouBike2.0_Jyuguang Rd. & Dapu St. Intersection ## 518 YouBike2.0_MRT Zhongxiao Xinsheng Sta.(Exit.2) ## 519 YouBike2.0_Guang Hua Computer Market ## 520 YouBike2.0_Zhongshan & Qingdao Intersection ## 521 YouBike2.0_MRT C.K.S Memorial Hall Sta.(Exit.5) ## 522 YouBike2.0_Beiping E. Rd. & Hangzhou N. Rd. Intersection ## 523 YouBike2.0_Taipei Public Library Wang Guan-Ying Branch ## 524 YouBike2.0_Jinshan Rd. & Xinyi Rd. Intersection ## 525 YouBike2.0_Linsen Rd. & Xuzhou Rd. Intersection ## 526 YouBike2.0_Xuzhou Rd. Hangzhou Rd. Intersection ## 527 YouBike2.0_MRT C.K.S Memorial Hall Sta.(Exit 6) ## 528 YouBike2.0_MRT Taipei Main Sta.(Exit M2) ## 529 YouBike2.0_Dr. Sun Yat-Sen Memorial House (Sun Yat-sen Park) ## 530 YouBike2.0_MRT Ximen Sta. (Exit 5) ## 531 YouBike2.0_Hondao Junior High School ## 532 YouBike2.0_Taipei First Girls High School ## 533 YouBike2.0_Substitute Military Service Center ## 534 YouBike2.0_Shaoxing St. & Xuzhou Rd. Intersection ## 535 YouBike2.0_Roosevelt Rd. & Ningbo E. St. Intersection ## 536 YouBike2.0_Taipei Water Park ## 537 YouBike2.0_Ren'ai Rd. & Linsen Rd. Intersection ## 538 YouBike2.0_MRT Ximen Sta. (Exit 3) ## 539 YouBike2.0_Ren'ai Rd. & Jinshan Rd. Intersection ## 540 YouBike2.0_Ln. 101, Sec. 1, Hangzhou S. Rd. ## 541 YouBike2.0_Ren'ai Rd. & Hangzhou Rd. Intersection ## 542 YouBike2.0_Longxing Community Center ## 543 YouBike2.0_Taipei Botanical Garden ## 544 YouBike2.0_Postal Museum ## 545 YouBike2.0_Linsen Rd & Beiping Rd. Intersection ## 546 YouBike2.0_Beiping Rd. & Shaoxing St. Intersection ## 547 YouBike2.0_Tianjin St. & Beiping Rd. Intersection ## 548 YouBike2.0_MRT Zhongxiao Xinsheng Sta.(Exit.1) ## 549 YouBike2.0_MRT Zhongxiao Xinsheng Sta.(Exit.5) ## 550 YouBike2.0_MRT NTU Hospital Sta. (Exit. 1) ## 551 YouBike2.0_National Taiwan University Children's Hospital ## 552 YouBike2.0_Linsen Rd. & Jinan Rd. Intersection (Northeast) ## 553 YouBike2.0_Ren'ai Rd. & Shaoxing St. Intersection (South) ## 554 YouBike2.0_Zhonghua Rd. & Nanhai Rd. Intersection ## 555 YouBike2.0_Taipei Association ## 556 YouBike2.0_MRT Shandao Temple Sta. (Exit 3) (Zhongxiao E. Rd.) ## 557 YouBike2.0_National Concert Hall ## 558 YouBike2.0_Zhongxiao W. Rd. & Chongqing S. Rd. Intersection ## 559 YouBike2.0_Ln. 8, Sec. 2, Jinan Rd. ## 560 YouBike2.0_Ren'ai Rd. & Jinshan Rd. Intersection (Southeast) ## 561 YouBike2.0_Taiwan Literature Base ## 562 YouBike2.0_Chongqing S. Rd. & Zhao'an St. Intersection ## 563 YouBike2.0_Wenguang Park ## 564 YouBike2.0_MRT C.K.S Memorial Hall Sta.(Exit 2) ## 565 YouBike2.0_Yingpulixiao Park ## 566 YouBike2.0_Yingqiao Park ## 567 YouBike2.0_Ningbo W. St. & Quanzhou St. Intersection ## 568 YouBike2.0_Ln. 98, Sec. 2, Heping W. Rd. ## 569 YouBike2.0_Ren'ai Rd. & Xinsheng Rd. Intersection (Southwest) ## 570 YouBike2.0_Xingan Market ## 571 YouBike2.0_LongKou Market ## 572 YouBike2.0_Ln. 65, Tongbei St. ## 573 YouBike2.0_Yuanshan Scenic Area ## 574 YouBike2.0_Lequn 2nd & Tiding Blvd. Intersection ## 575 YouBike2.0_Jiantan Community ## 576 YouBike2.0_Peiying Park ## 577 YouBike2.0_Lequn 2nd & Mingshui Rd. Intersection ## 578 YouBike2.0_Bei'an & Dajhih St. Intersection ## 579 YouBike2.0_MRT Jiannan Rd. Station (Exit 2) ## 580 YouBike2.0_Lequn 2nd & Jingye 3rd Rd. Intersection ## 581 YouBike2.0_Lequn 2nd & Jingye 4th Rd. Intersection ## 582 YouBike2.0_Dazhi Station (Exit 3) ## 583 YouBike2.0_Fuxing Rd. & Civic Blvd. Intersection ## 584 YouBike2.0_Nanjing Rd. & Liaoning St. Intersection ## 585 YouBike2.0_Yitong St. & Chang'an Rd. Intersection ## 586 YouBike2.0_Xinsheng Rd. & Chang'an Rd. Intersection ## 587 YouBike2.0_Civic Blvd. & Linsen Rd. Intersection ## 588 YouBike2.0_Nanjing Rd. & Xinsheng Rd. Intersection ## 589 YouBike2.0_Yijiang Park ## 590 YouBike2.0_Songjiang Park ## 591 YouBike2.0_Xinsheng Rd. & Changchun Rd. Intersection ## 592 YouBike2.0_The Second Wholesale Fruit and Vegetable Market ## 593 YouBike2.0_Minsheng Rd. & Jianguo Rd. Intersection ## 594 YouBike2.0_Xing An Hua Cheng ## 595 YouBike2.0_MRT Zhongshan Junior High School Sta. ## 596 YouBike2.0_Long Jiang Rd. & Jinzhou St. Intersection ## 597 YouBike2.0_Jianguo Rd. & Changchun Rd. Intersection ## 598 YouBike2.0_Nanjing E Rd. & Jianguo Rd. Intersection ## 599 YouBike2.0_MRT Songjiang Nanjing Sta. (Exit 7) ## 600 YouBike2.0_Zhulun Market ## 601 YouBike2.0_Zhongji Park ## 602 YouBike2.0_Huashan Park ## 603 YouBike2.0_Ln. 17, Sec. 1, Jianguo N. Rd. ## 604 YouBike2.0_Jiangning Park ## 605 YouBike2.0_Minquan E. Rd. & Long Jiang Rd. Intersection ## 606 YouBike2.0_MRT Zhongshan Elementary School Sta. (Exit 2) ## 607 YouBike2.0_MRT Xingtian Temple Sta. (Exit 3) ## 608 YouBike2.0_Linsen Rd. & Nong'an St. Intersection ## 609 YouBike2.0_MRT Zhongshan Elementary School Sta. (Exit 4) ## 610 YouBike2.0_Nong'an St. & Shuangcheng St. Intersection ## 611 YouBike2.0_Xinsheng Rd. & Dehui St. Intersection ## 612 YouBike2.0_Minzu Rd. & Linsen Rd. Intersection ## 613 YouBike2.0_Taipei Fine Arts Museum ## 614 YouBike2.0_Zhongshan Rd. & Minzu Rd. Intersection ## 615 YouBike2.0_Xinsheng Elevated Parking Lot (Ln. 107, Linsen N. Rd.) ## 616 YouBike2.0_Nanjing E. Rd. ## 617 YouBike2.0_Rende Park ## 618 YouBike2.0_Zhongyuan Park ## 619 YouBike2.0_Xiapi Park ## 620 YouBike2.0_Wuchang Junior High School ## 621 YouBike2.0_Rongxing Garden ## 622 YouBike2.0_Minquan Rd. & Jianguo N. Rd. Intersection ## 623 YouBike2.0_Ln. 431, Songshan Rd. Intersection ## 624 YouBike2.0_Xinxi Park ## 625 YouBike2.0_Ln. 407, Jilin Rd. Intersection ## 626 YouBike2.0_Minzu Rd. & Songjiang Rd. Intersection ## 627 YouBike2.0_Lin An Tai Historical House ## 628 YouBike2.0_zhongshan Public Assembly Hall ## 629 YouBike2.0_Weishuei Rd. & Bade Rd. Intersection ## 630 YouBike2.0_MRT Zhongshan Sta. (Exit 2) ## 631 YouBike2.0_Fushun Park ## 632 YouBike2.0_Xinsheng Park ## 633 YouBike2.0_MRT Xingtian Temple Sta. (Exit 1) ## 634 YouBike2.0_Linsen & Changchun Intersection ## 635 YouBike2.0_Jianguo & Nong'an Intersection ## 636 YouBike2.0_Ln. 77, Songjiang Rd. ## 637 YouBike2.0_Jianguo & Chang'an Intersection ## 638 YouBike2.0_Civic & Xinsheng Intersection ## 639 YouBike2.0_Minquan & Jilin Intersection ## 640 YouBike2.0_Zhongshan Rd. & Nong'an St. Intersection ## 641 YouBike2.0_MRT Administration Building ## 642 YouBike2.0_Zhongji Park(Ln. 188, Songjiang Rd.) ## 643 YouBike2.0_Ln. 123, Jilin Rd. ## 644 YouBike2.0_Zhongyuan St. & Minsheng Rd. Intersection ## 645 YouBike2.0_National Taipei University(Taipei Canpus) ## 646 YouBike2.0_Jinzhou St. & Jilin Rd. Intersection ## 647 YouBike2.0_Ln. 59, Sec. 2, Zhongshan N. Rd. ## 648 YouBike2.0_Yongsheng Park(Ln. 23, Sec. 1, Minsheng E. Rd.) ## 649 YouBike2.0_Xinsheng Rd. & Jinzhou St. Intersection ## 650 YouBike2.0_Ln. 199, Binjiang St. ## 651 YouBike2.0_Dajia Community Park ## 652 YouBike2.0_Binjiang Fruit and Vegetable Wholesale Market ## 653 YouBike2.0_Xing'an St. & Hejiang St. Intersection ## 654 YouBike2.0_Fuxing Rd. & Longjiang Rd. Intersection ## 655 YouBike2.0_TCC Building ## 656 YouBike2.0_Zhifu Rd. & Lequn Rd. Intersection ## 657 YouBike2.0_Xinxing Park ## 658 YouBike2.0_Nanjing Rd. & Yitong St. Intersection ## 659 YouBike2.0_Nanjing Rd. & Longjiang Rd. Intersection ## 660 YouBike2.0_Ln. 41, Fushun St. (Chongde Temple) ## 661 YouBike2.0_Taipei Public Library Dazhi Branch ## 662 YouBike2.0_MRT Dazhi Sta. (Exit 1) ## 663 YouBike2.0_MRT Songjiang Nanjing Sta. (Exit 4) ## 664 YouBike2.0_hong 429 Park ## 665 YouBike2.0_Ln. 137, Changchun Rd. ## 666 YouBike2.0_Songjiang Rd. & Minsheng Rd. Intersection ## 667 YouBike2.0_Ln. 132, Songjiang Rd. ## 668 YouBike2.0_Changchun Rd. & Jilin Rd. Intersection ## 669 YouBike2.0_Changchun Rd. & Yijiang St. Intersection ## 670 YouBike2.0_MRT Songjiang Nanjing Sta. (Exit 8) ## 671 YouBike2.0_Nanjing Rd. & Yijiang St. Intersection ## 672 YouBike2.0_Songjiang Rd. & Changchun Rd. Intersection ## 673 YouBike2.0_Ching-kuo Chi-Hai Culture Park ## 674 YouBike2.0_Minzu Rd. & Yumen St. Intersection ## 675 YouBike2.0_Xinsheng Rd. & Nong'an St. Intersection ## 676 YouBike2.0_Daojiang Senior High School of Nursing and Home Economics ## 677 YouBike2.0_MRT Dazhi Sta.(Exit 3)_1 ## 678 YouBike2.0_Lequn 2nd Rd. & Mingshui Rd. Intersection ## 679 YouBike2.0_Minquan Rd. & Jilin Rd. Intersection ## 680 YouBike2.0_Changchun Rd. & Longjiang Rd. Intersection ## 681 YouBike2.0_Minquan Rd. & Xinsheng Rd. Intersection ## 682 YouBike2.0_Jianguo Rd. & Changchun Rd. Intersection ## 683 YouBike2.0_Zhongshan District Household Registration Office ## 684 YouBike2.0_Taipei Fine Arts Museum_1 ## 685 YouBike2.0_Jiantan Community_1 ## 686 YouBike2.0_Binjiang Elementary School Swimming Pool ## 687 YouBike2.0_Linsen Park ## 688 YouBike2.0_Zhong 428 Park ## 689 YouBike2.0_Fuhua Park ## 690 YouBike2.0_Xinsheng Rd. & Minzu Rd. Intersection ## 691 YouBike2.0_MRT Nanjing Fuxing Sta. (Exit.1) ## 692 YouBike2.0_Bade Market (North) ## 693 YouBike2.0_Longjiang Rd. & Zhulun St. Intersection ## 694 YouBike2.0_Ln. 94, Dazhi St. ## 695 YouBike2.0_MRT Nanjing Fuxing Sta. (Exit.8) ## 696 YouBike2.0_Minquan Rd. & Jianguo Rd. Intersection (South) ## 697 YouBike2.0_Linsen Rd. & Dehui St. Intersection ## 698 YouBike2.0_Xinsheng Rd. & Binjiang St. Intersection (Southeast) ## 699 YouBike2.0_Ln. 62, Sec. 1, Xinsheng N. Rd. ## 700 YouBike2.0_Xinsheng Rd. & Changchun Rd. Intersection (Northeast) ## 701 YouBike2.0_MRT Jiannan Rd. Sta. (Exit. 1) ## 702 YouBike2.0_Jingye 3rd Rd. & Lequn 3rd Rd. Intersection (Northwest) ## 703 YouBike2.0_Aly. 2, Ln. 258, Changchun Rd. ## 704 YouBike2.0_Zhangning Dasha Community (South) ## 705 YouBike2.0_Jianguo Rd. & Wuchang St. Intersection ## 706 YouBike2.0_Ln. 62, Sec. 2, Zhongshan N. Rd. ## 707 YouBike2.0_Civic Blvd. & Andong St. Intersection ## 708 YouBike2.0_Ln. 5, Sec. 2, Civic Blvd. ## 709 YouBike2.0_MRT Zhongshan Sta. (Exit 3) ## 710 YouBike2.0_Jianguo N. Rd. Parking Lot (G) ## 711 YouBike2.0_Zhulun Park ## 712 YouBike2.0_Zhulun St. & Fuxing N. Rd. Intersection ## 713 YouBike2.0_MRT Xingtian Temple Sta. (Exit 4) ## 714 YouBike2.0_Ln. 86, Sec. 3, JianGuo N. Rd. ## 715 YouBike2.0_ZhengShou Park ## 716 YouBike2.0_SiPing St. & SongJiang Rd. Intersection ## 717 YouBike2.0_JinTai Park ## 718 YouBike2.0_BeiAn Rd. & TongBei St. Intersection ## 719 YouBike2.0_MinQuan E. Rd. & FuXing N. Rd. Intersection (Northwest) ## 720 YouBike2.0_Taipei Municipal Datong High School ## 721 YouBike2.0_BeiAn Rd. & MingShui Rd. Intersection (ZiQiang Tunnel) ## 722 YouBike2.0_Aly. 118, Ln. 21, Wunhu St. ## 723 YouBike2.0_Beishi Lake Environmental Park ## 724 YouBike2.0_Jhouzih No.1 Park ## 725 YouBike2.0_Xikang Park ## 726 YouBike2.0_Wenhu Elementary School ## 727 YouBike2.0_No. 10, Ln. 81, Wenhu St ## 728 YouBike2.0_Takming University of Science and Technology ## 729 YouBike2.0_Lishan Elementary School ## 730 YouBike2.0_Lishan Senior High School ## 731 YouBike2.0_Ganghua 2nd Park ## 732 YouBike2.0_Dahu Elementary School ## 733 YouBike2.0_Anhu No.3 Park ## 734 YouBike2.0_Aly. 95, Ln. 113, Donghu Rd ## 735 YouBike2.0_Ruiguangjichengchefuwu Sta ## 736 YouBike2.0_Wende No. 3 Park ## 737 YouBike2.0_MRT Dahu Park Sta. (Exit 2) ## 738 YouBike2.0_Kangning Rd & Xingyun St Intersection ## 739 YouBike2.0_No. 47, Xingyun St ## 740 YouBike2.0_MRT Xihu Sta. (Exit 1) ## 741 YouBike2.0_MRT Xihu Sta. (Exit 2) ## 742 YouBike2.0_Zhouzi No. 2 Park ## 743 YouBike2.0_Gangdu Park ## 744 YouBike2.0_Ln. 26, Sec. 2, Huanshan Rd Intersection ## 745 YouBike2.0_Chenggong Rd & Jinlong Rd Intersection ## 746 YouBike2.0_Bishan Park ## 747 YouBike2.0_Jinrui Park ## 748 YouBike2.0_MRT Wende Sta. (Exit 2) ## 749 YouBike2.0_Yangguang Park ## 750 YouBike2.0_Wende No.2 Park (South) ## 751 YouBike2.0_Wende No.2 Park (North) ## 752 YouBike2.0_Ruiyang Park ## 753 YouBike2.0_Hu Guang Public House ## 754 YouBike2.0_No. 213, Tanmei St. ## 755 YouBike2.0_No. 180, Sec. 6, Nanjing E. Rd. ## 756 YouBike2.0_Tanmei Elementary School (Nanjing Rd. & Jiuzong Rd. Intersection ## 757 YouBike2.0_No. 343, Xinming Rd. ## 758 YouBike2.0_Zhoumei Community Center ## 759 YouBike2.0_Neihu District Office ## 760 YouBike2.0_Lekang Park ## 761 YouBike2.0_Aly. 24, Ln. 32, Ankang Rd. ## 762 YouBike2.0_Mingmei Park ## 763 YouBike2.0_Ln. 368, Sec. 6, Nanjing E. Rd. ## 764 YouBike2.0_Xinming Rd. & Chenggong Rd. Intersection ## 765 YouBike2.0_Minquan E. Rd. & Ruiguang Rd. Intersection ## 766 YouBike2.0_Ruiguang Public Housing (Ruiguang Rd) ## 767 YouBike2.0_Ln. 15, Sec. 6, Minquan E. Rd. ## 768 YouBike2.0_Rotary Park ## 769 YouBike2.0_Xinhu 3rd Rd & Minshan St Intersection ## 770 YouBike2.0_No.119 Neihu Greens ## 771 YouBike2.0_Xingshan Park ## 772 YouBike2.0_Tri-Service General Hospital ## 773 YouBike2.0_Fuhua Market ## 774 YouBike2.0_Taipei Tennis Center ## 775 YouBike2.0_MRT Huzhou Sta. (Exit 1) ## 776 YouBike2.0_Lihu Elementary School ## 777 YouBike2.0_Aly. 125, Ln. 347, Jinhu Rd. Intersection ## 778 YouBike2.0_Bihu Park ## 779 YouBike2.0_Bihu Park (Ln. 103, Sec. 2, Neihu Rd.) ## 780 YouBike2.0_Maoqi Community ## 781 YouBike2.0_Neihu District Farmers' Association ## 782 YouBike2.0_MRT Neihu Sta. (Exit 2) ## 783 YouBike2.0_Kangning Rd. & Jinhu Rd. Intersection ## 784 YouBike2.0_Aly. 20, Ln. 156, Sec. 1, Kangning Rd. Intersection ## 785 YouBike2.0_Ankang Park ## 786 YouBike2.0_Ln. 83, Antai St. ## 787 YouBike2.0_Neigousi Ecological Exhibition Hall ## 788 YouBike2.0_MRT Gangqian Sta. (Exit 2) ## 789 YouBike2.0_Dong Hu Junior High School ## 790 YouBike2.0_Shitan Park (Ankang Rd.) ## 791 YouBike2.0_Neihu Refuse Incineration Plant ## 792 YouBike2.0_Kangning Park (North) ## 793 YouBike2.0_Ln. 54, Sec. 3, Kangning Rd. Intersection ## 794 YouBike2.0_Ln. 25, Xingshan Rd. Intersection ## 795 YouBike2.0_Ln. 460, Xinming Rd. Intersection ## 796 YouBike2.0_Xiawan Park ## 797 YouBike2.0_Ln. 245, Sec. 6, Minquan E. Rd. Intersection ## 798 YouBike2.0_Donghu Elementary School ## 799 YouBike2.0_MRT Neihu Sta. (Exit.1) ## 800 YouBike2.0_Rueiguang Rd. & Gangcian Rd. Intersection ## 801 YouBike2.0_Rueihu St. & Yangguang St. Intersection ## 802 YouBike2.0_Jinlong Park ## 803 YouBike2.0_Aly. 1, Ln. 138, Xingyun St. ## 804 YouBike2.0_Donghu No. 1 Park ## 805 YouBike2.0_Donghu No. 2 Park ## 806 YouBike2.0_Kanghu No. 2 Park(Kang-Ning General Hospital) ## 807 YouBike2.0_Tiding Blvd. & Xinhu 1st Rd. Intersection ## 808 YouBike2.0_Xiawan Park ## 809 YouBike2.0_Jiuzong Rd. & Xingshan Rd. Intersection ## 810 YouBike2.0_Ln. 250, Xinhu 2nd Rd. ## 811 YouBike2.0_Ln. 41, Sec. 4, Chenggong Rd. ## 812 YouBike2.0_Jinhu Rd. & Xingyun St. Intersection ## 813 YouBike2.0_National Defense Medical Center ## 814 YouBike2.0_Aly. 117, Ln. 190, Sec. 6, Minquan E. Rd. ## 815 YouBike2.0_Taipei Neihu Sports Center ## 816 YouBike2.0_Jiuhua Park ## 817 YouBike2.0_Ln. 179, Sec. 2, Neihu Rd. ## 818 YouBike2.0_Xingshan Rd. & Xing'ai Rd. Intersection ## 819 YouBike2.0_Xinhu 2nd Rd. & Minshan St. Intersection (Carrefour) ## 820 YouBike2.0_Welldone Building ## 821 YouBike2.0_Ln. 161, Yangguang St. Intersection ## 822 YouBike2.0_Tanmei Park (Ln. 368, Sec. 6, Nanjing E. Rd.) ## 823 YouBike2.0_Xikang No. 2 Park ## 824 YouBike2.0_Sanmin Junior High School (Ln. 47, Sec. 6, Minquan E. Rd.) ## 825 YouBike2.0_Ln. 76, Ruiguang Rd. ## 826 YouBike2.0_MRT Donghu Sta. ## 827 YouBike2.0_XinHu Elementary School ## 828 YouBike2.0_Bishan Rd. & Neihu Rd. Intersection ## 829 YouBike2.0_Ln. 413, Sec. 6, Minquan E. Rd. ## 830 YouBike2.0_Honhui Ruiguang Plaza (Ruiguang Rd.) ## 831 YouBike2.0_Honhui Ruiguang Plaza (Gangqian Rd.) ## 832 YouBike2.0_Ln. 151, Kangle St. ## 833 YouBike2.0_Ln. 360, Sec. 1, Neihu Rd. ## 834 YouBike2.0_No. 83, Sec. 3, Chenggong Rd. ## 835 YouBike2.0_Ln. 47, Sec. 1, Neihu Rd. ## 836 YouBike2.0_Yangguang St. & Jiuzong Rd. Intersection ## 837 YouBike2.0_Anhu Park ## 838 YouBike2.0_Huxing Park ## 839 YouBike2.0_Antai St.(Kangle Bridge) ## 840 YouBike2.0_Kangle Greens ## 841 YouBike2.0_MRT Gangqian Sta. (Exit 1) ## 842 YouBike2.0_Mingmei Park (Ln. 333, Xingshan Rd.) ## 843 YouBike2.0_Ln. 383, Xingshan Rd. ## 844 YouBike2.0_Jiuzong Rd. & Xinhu 3rd Rd. Intersection ## 845 YouBike2.0_Neihu Sports Park ## 846 YouBike2.0_Ln. 326, Sec. 3, Neihu Rd. ## 847 YouBike2.0_Chengong Park ## 848 YouBike2.0_Aly. 93, Ln. 189, Sec. 3, Kangning Rd. ## 849 YouBike2.0_China Medical University Hospital (Taipei Branch) ## 850 YouBike2.0_Kangle Pumping Station ## 851 YouBike2.0_Ln. 16, Sec. 3, Huanshan Rd. ## 852 YouBike2.0_Wende Green No.1 ## 853 YouBike2.0_Taipei Flowers Auction ## 854 YouBike2.0_Xingshan Social Housing ## 855 YouBike2.0_Aly. 17, Ln. 99, Sec. 3, Kangning Rd. ## 856 YouBike2.0_Ln. 407, Sec. 2, Tiding Blvd. ## 857 YouBike2.0_Heidelberg Science & Technology Building ## 858 YouBike2.0_Primax Headquarters Building ## 859 YouBike2.0_Ln. 288, Sec. 1, Neihu Rd. ## 860 YouBike2.0_Mtc Bus (Neihu) ## 861 YouBike2.0_Ruihu Park ## 862 YouBike2.0_CECI Engineering Consultants, Inc. ## 863 YouBike2.0_Farglory Group ## 864 YouBike2.0_Ln. 358, Ruiguang Rd. ## 865 YouBike2.0_Dagangqian Park (Zhouzi St.) ## 866 YouBike2.0_Century Trade Building ## 867 YouBike2.0_Ln. 56, Sec. 6, Minquan E. Rd. ## 868 YouBike2.0_Xinhu 3rd Rd. & Ln. 146, Xinhu 2nd Rd. Intersection ## 869 YouBike2.0_Xinhu 3rd Rd. & Ln. 146, Xinhu 2nd Rd. Intersection ## 870 YouBike2.0_Jiuzong Rd. & Xinhu 2nd Rd. Intersection ## 871 YouBike2.0_Shinkong Jihu Building ## 872 YouBike2.0_Aly. 15, Ln. 120, Sec. 1, Neihu Rd. ## 873 YouBike2.0_Beishihu Environmental Protection Park ## 874 YouBike2.0_Darwin Building ## 875 YouBike2.0_Donghu Park No.4 ## 876 YouBike2.0_Gamma Technology center ## 877 YouBike2.0_Fushou Park ## 878 YouBike2.0_MRT Xihu Sta. (Exit 1) (Neihu Rd.) ## 879 YouBike2.0_ADATA Technology ## 880 YouBike2.0_Sun Technology Plaza ## 881 YouBike2.0_Ln. 316, Ruiguang Rd. ## 882 YouBike2.0_Ln. 220, WenDe Rd. ## 883 YouBike2.0_ChangShou Pumping Station ## 884 YouBike2.0_MRT Huzhou Sta. (Exit 2) ## 885 YouBike2.0_WuFenPi ## 886 YouBike2.0_Ln. 1, Sec. 3, HuanShan Rd. (Lishan Senior High School) ## 887 YouBike2.0_TanMei Park (No. 482, Sec. 6, NanJing E. Rd.) ## 888 YouBike2.0_Ln. 304, Sec. 7, Chengde Rd. ## 889 YouBike2.0_Zhoumei Sports Park ## 890 YouBike2.0_Ronghua 2nd & Mingde Rd. Intersection ## 891 YouBike2.0_MRT Mingde Station (Exit 1) ## 892 YouBike2.0_Wenlin & Jianmin Intersection ## 893 YouBike2.0_Yongxin Greens ## 894 YouBike2.0_Guandu Temple ## 895 YouBike2.0_Guandu Nature Park ## 896 YouBike2.0_Taipei Guandu hospital ## 897 YouBike2.0_MRT Zhongyi Sta. (Exit 1) ## 898 YouBike2.0_MRT Guandu Sta. (Exit 1) ## 899 YouBike2.0_MRT Guandu Sta. (Exit 2) ## 900 YouBike2.0_Ln. 540, Sec. 4, Zhongyang N. Rd. Intersection ## 901 YouBike2.0_Dadu & Lide Rd. Intersection ## 902 YouBike2.0_MRT Fuxinggang Sta. (Exit 1) ## 903 YouBike2.0_MRT Fuxinggang Sta Tourist Information Center ## 904 YouBike2.0_Fengnian Park ## 905 YouBike2.0_Daoxiang Chongshan Rd. Intersection ## 906 YouBike2.0_Fu Hsing Kang College ## 907 YouBike2.0_Xiushan Community Center ## 908 YouBike2.0_Daye Datong St. Intersection ## 909 YouBike2.0_MRT Xinbeitou Station ## 910 YouBike2.0_MRT Beitou Station ## 911 YouBike2.0_MRT Qiyan Station(Sanhe St.) ## 912 YouBike2.0_Baxian Village Office ## 913 YouBike2.0_Qingjiang Elementary School ## 914 YouBike2.0_Ln. 300, Daye Rd. Intersction ## 915 YouBike2.0_Linong Park ## 916 YouBike2.0_Beitou Qiyan Elderly Service Center ## 917 YouBike2.0_MRT Qilian Sta. (Exit 2) ## 918 YouBike2.0_Beitou Sports Center ## 919 YouBike2.0_National Yangming Jiaotong University ## 920 YouBike2.0_MRT Shipai Sta. (Exit 2) ## 921 YouBike2.0_National Taipei University of Nursing and Health Sciences ## 922 YouBike2.0_MRT Shipai Sta. (Exit 1) ## 923 YouBike2.0_Cheng Hsin General Hospital ## 924 YouBike2.0_Shipai Elementary School ## 925 YouBike2.0_Zhenxing Park ## 926 YouBike2.0_Linong Elementary School ## 927 YouBike2.0_No. 280, Sec. 7, Chengde Rd. Intersection ## 928 YouBike2.0_Ln. 11, Sec. 2, Zhiyuan 1st Rd. ## 929 YouBike2.0_Rongfu Park ## 930 YouBike2.0_Zhongzheng Senior High School ## 931 YouBike2.0_Ligong & Lide Rd. Intersection ## 932 YouBike2.0_Ln.40, Sec.4, Zhongyang N. Rd. ## 933 YouBike2.0_National Yang-Ming University Library ## 934 YouBike2.0_MRT Xinbeitou Sta. (Exit 2) ## 935 YouBike2.0_Fuxing Park ## 936 YouBike2.0_Chengde Rd. & Shipai Rd. Intersection ## 937 YouBike2.0_Ln. 188, Sec. 7, Chengde Rd. Intersection ## 938 YouBike2.0_MRT Mingde Sta.(Exit.3) ## 939 YouBike2.0_Dafeng Park ## 940 YouBike2.0_Zhoumei Park ## 941 YouBike2.0_Aly. 11, Ln. 455, Zhonghe St. ## 942 YouBike2.0_Zhoumei Xianzaigang Park ## 943 YouBike2.0_Wenhua 3rd Rd. & Xinglin 1st Rd. Intersection ## 944 YouBike2.0_Zhuhai Rd. & Fuxing 1st Rd. Intersection ## 945 YouBike2.0_Ln. 33, Yumin 2nd Rd. ## 946 YouBike2.0_Xinqiyan Social Housing ## 947 YouBike2.0_Quanyuan Park ## 948 YouBike2.0_Qiyan No4 Green Space ## 949 YouBike2.0_NTUNHS ## 950 YouBike2.0_Qiyan No.1 Park ## 951 YouBike2.0_Fuxing Park ## 952 YouBike2.0_Zhongyong Park ## 953 YouBike2.0_Fengnian Park_1 ## 954 YouBike2.0_Guangming Rd. & Wenquan Rd. Intersection ## 955 YouBike2.0_Koo Foundation Sun Yat-Sen Cancer Center ## 956 YouBike2.0_Zhiyuan New Village ## 957 YouBike2.0_Beitou Public Hotspring ## 958 YouBike2.0_Aly. 9, Ln. 493, Zhonghe St. ## 959 YouBike2.0_MRT Beitou Sta. (Exit 1) ## 960 YouBike2.0_Shipai Rd. & Linong St. Intersection ## 961 YouBike2.0_MRT Qilian Sta. (Exit 1) ## 962 YouBike2.0_No. 50, Daxing St. (Opposite) ## 963 YouBike2.0_MRT Zhongyi Sta. (Exit. 2) ## 964 YouBike2.0_Fuguo Rd. & Chengde Rd. Intersection ## 965 YouBike2.0_MRT Beitou Sta. (Exit 1) ( Beitou Rd.) ## 966 YouBike2.0_Innovation Fortune Center ## 967 YouBike2.0_Chongyang Park (Ln. 255, Gongguan Rd.) ## 968 YouBike2.0_Wenhua No.1 Park (North) ## 969 YouBike2.0_Zhonghe Green ## 970 YouBike2.0_Ln. 65, Daye Rd. ## 971 YouBike2.0_Gongguan Rd. & Chengde Rd. Intersection ## 972 YouBike2.0_Wenlin N. Rd. & Mingde Rd. Intersection (Northeast) ## 973 YouBike2.0_Ln. 32, Sec. 1, Yongxing Rd. ## 974 YouBike2.0_Guan Do Junior High School ## 975 YouBike2.0_Ln. 55, LiGong St. ## 976 YouBike2.0_Ln. 401, Sec. 7, ChengDe Rd. (ZhouMei Bridge) ## 977 YouBike2.0_DaYe Rd. (Nung Chan Monastery) ## 978 YouBike2.0_MRT Songshan Sta. (Exit 4) ## 979 YouBike2.0_Tayou Rd. & Bade Rd. Intersection ## 980 YouBike2.0_Pengcheng Park ## 981 YouBike2.0_Zhonglun Senior High School ## 982 YouBike2.0_MRT Nanjing Sanmin Sta. (Exit 2) ## 983 YouBike2.0_MRT Nanjing Sanmin Sta. (Exit 1) ## 984 YouBike2.0_Ln. 11, Guangfu N Rd. ## 985 YouBike2.0_MRT Nanjing Sanmin Sta. (Exit 4) ## 986 YouBike2.0_Xisong Senior High School ## 987 YouBike2.0_Minquan Rd. & Fuxing Rd. Intersection ## 988 YouBike2.0_Minfu No.3 Greens ## 989 YouBike2.0_Minyou No.1 Park ## 990 YouBike2.0_Minsheng Rd. & Dunhua Rd. Intersection ## 991 YouBike2.0_Song-Ji Park ## 992 YouBike2.0_Ln. 166, Sanmin Rd. Intersection ## 993 YouBike2.0_Minsheng Activity Center ## 994 YouBike2.0_MRT Taipei Arena Sta. (Exit.2) ## 995 YouBike2.0_Taipei City Arts Promotion Office ## 996 YouBike2.0_Minsheng Elementary School (Ln. 199, Dunhua N. Rd.) ## 997 YouBike2.0_Dunbei Park ## 998 YouBike2.0_Minquan Sports Park ## 999 YouBike2.0_Xindong Park ## 1000 YouBike2.0_Minsheng Rd. & Guangfu N. Rd. Intersection ## 1001 YouBike2.0_Sanmin Park ## 1002 YouBike2.0_Ln. 74, Sec. 3, Bade Rd. Intersection ## 1003 YouBike2.0_Ln. 8, Sec. 3, Bade Rd. Intersection ## 1004 YouBike2.0_Tri-Service General Hospital Songshan Branch ## 1005 YouBike2.0_Pingan New Town ## 1006 YouBike2.0_Jiankang Social Housing ## 1007 YouBike2.0_Minquan Rd. & Guangfu Rd. Intersection (Northeast) ## 1008 YouBike2.0_Civic Blvd. & Dongxing Rd. Intersection ## 1009 YouBike2.0_Ln. 22, Guangfu S. Rd. Intersection ## 1010 YouBike2.0_Ln. 58, Guangfu S. Rd. ## 1011 YouBike2.0_Songshan New Village ## 1012 YouBike2.0_Construction and Planning Agency ## 1013 YouBike2.0_Nanjing Rd. & Guangfu Rd. Intersection ## 1014 YouBike2.0_Minsheng Parking Lot ## 1015 YouBike2.0_Jiankang New Village ## 1016 YouBike2.0_Jianan Sincheng ## 1017 YouBike2.0_Fusheng Park ## 1018 YouBike2.0_Zhonglun Fucheng Temple ## 1019 YouBike2.0_MRT Nanjing Fuxing Sta.(Exit.7) ## 1020 YouBike2.0_MRT Nanjing Fuxing Sta.(Exit.5) ## 1021 YouBike2.0_Tayou Evacuation Gate ## 1022 YouBike2.0_Taipei Stadium ## 1023 YouBike2.0_MRT Taipei Arena Sta. (Exit.5) ## 1024 YouBike2.0_Dunhua Rd. & Changchun Rd. Intersection ## 1025 YouBike2.0_Raohe Evacuation Gate ## 1026 YouBike2.0_MRT Songshan Sta. (Exit 2) ## 1027 YouBike2.0_Ln. 106, Sec. 3, Minquan E. Rd. ## 1028 YouBike2.0_Ln. 59, Sec. 5, Nanjing E. Rd. ## 1029 YouBike2.0_Sanmin Park (Tayou Rd.) ## 1030 YouBike2.0_Baoqing Park ## 1031 YouBike2.0_Xisong Park ## 1032 YouBike2.0_Changshou Park ## 1033 YouBike2.0_Fuyuan Park ## 1034 YouBike2.0_Ln. 179, Sec. 4, Nanjing E. Rd. ## 1035 YouBike2.0_Taipei Stadium (Beining Rd.) ## 1036 YouBike2.0_Xisong Senior High School (Ln. 325, Jiankang Rd.) ## 1037 YouBike2.0_Nanjing Rd. & Dongxing Rd. Intersection ## 1038 YouBike2.0_MRT Songshan Sta. (Exit 3) ## 1039 YouBike2.0_Jieshou Junior High School ## 1040 YouBike2.0_Dunhua Rd. & Nanjing Rd. Intersection (Northeast) ## 1041 YouBike2.0_Dunhua Rd. & Bade Rd. Intersection ## 1042 YouBike2.0_Ln. 51, Xindong St. ## 1043 YouBike2.0_Bade Parking ## 1044 YouBike2.0_Changchun Rd. & Qingcheng St. Intersection ## 1045 YouBike2.0_Ln. 652, Sec. 4, Bade Rd. ## 1046 YouBike2.0_MRT Songshan Sta. (Exit 1) ## 1047 YouBike2.0_MRT Taipei Arena Sta. (Exit.3) ## 1048 YouBike2.0_MRT Taipei Arena Sta. (Exit.5)_1 ## 1049 YouBike2.0_Ln. 155, Dunhua N. Rd. ## 1050 YouBike2.0_Minsheng Rd. & Fuxing Rd. Intersection ## 1051 YouBike2.0_Civic Blvd. & Yanji St. Intersection ## 1052 YouBike2.0_Longcheng Market ## 1053 YouBike2.0_MRT Nanjing Sanmin Sta. (Exit 3) ## 1054 YouBike2.0_Tayou Rd. & Keelung Rd. Intersection (First MacArthur Bridge) ## 1055 YouBike2.0_Ln. 370, Wuchang St. ## 1056 YouBike2.0_Ln. 119, Yanshou St. ## 1057 YouBike2.0_Civic Blvd. & Dongning Rd. Intersection ## 1058 YouBike2.0_Minfu Green ## 1059 YouBike2.0_Sanmin Elementary School (Fuyuan St.) ## 1060 YouBike2.0_Minsheng Post Office ## 1061 YouBike2.0_MinQuan Rd. & DunHua Rd. Intersection (Northwest) ## 1062 YouBike2.0_Nangang Park (Dongxin St) ## 1063 YouBike2.0_Nangang Park (Fude St) ## 1064 YouBike2.0_MRT Kunyang Sta. (Exit 1) ## 1065 YouBike2.0_Ln. 225, Sec. 6, Zhongxiao E. Rd Intersection ## 1066 YouBike2.0_MRT Houshanpi Sta (Exit 1) ## 1067 YouBike2.0_Hele Park ## 1068 YouBike2.0_Hexing Square ## 1069 YouBike2.0_Chengde Junior High School ## 1070 YouBike2.0_Yucheng Park ## 1071 YouBike2.0_Academia Sinica (Jiuzhuang St. Intersection) ## 1072 YouBike2.0_Academia Sinica Gymnasium (East) ## 1073 YouBike2.0_National Biotechnology Research Park ## 1074 YouBike2.0_MRT Nangang Exhibition Center Sta. (Exit 5) ## 1075 YouBike2.0_Academia Park ## 1076 YouBike2.0_Fushan Park ## 1077 YouBike2.0_Jiuzhuang Recreation Center ## 1078 YouBike2.0_Lingyun Market ## 1079 YouBike2.0_No. 532, Sec. 8, Civic Blvd. ## 1080 YouBike2.0_MRT Nangang Software Park Sta. (Exit 2) ## 1081 YouBike2.0_Nangang Elementary School ## 1082 YouBike2.0_Xing Zhong Parking Lot (Xingzhong Rd.) ## 1083 YouBike2.0_Taipei Public Library Nangang Branch ## 1084 YouBike2.0_Dongyang Park ## 1085 YouBike2.0_Xiangyang Rd. & Nangang Rd. Intersection ## 1086 YouBike2.0_Nangang Sta. (Ln. 415, Sec. 7, Zhongxiao E. Rd.) ## 1087 YouBike2.0_MRT Nangang Sta. (Exit 2) ## 1088 YouBike2.0_MRT Nangang Sta. (Exit 1) ## 1089 YouBike2.0_Dongxin Elementary School ## 1090 YouBike2.0_China University of Science and Technology ## 1091 YouBike2.0_Liufu Park ## 1092 YouBike2.0_Nangangjiaya Sta. ## 1093 YouBike2.0_Taipei Pop Music Center ## 1094 YouBike2.0_Xingnan Park ## 1095 YouBike2.0_Taipei Pop Music Center (Civic Blvd) ## 1096 YouBike2.0_Nangang Train Sta. (Civic Blvd) ## 1097 YouBike2.0_Ln. 527, Sec. 7, Zhongxiao E Rd. Intersection ## 1098 YouBike2.0_NKSP (Xinmin St) ## 1099 YouBike2.0_World Trade Park ## 1100 YouBike2.0_Lingyun Village 5 (Ln. 8, Sec. 3, Yanjiuyuan Rd.) ## 1101 YouBike2.0_Xinxin Park (Ln. 60, Kunyang St.) ## 1102 YouBike2.0_Nangang Senior High School (Kunyang St.) ## 1103 YouBike2.0_Ln. 290, Sec. 3, Nangang Rd. Intersection ## 1104 YouBike2.0_Ln. 220, Sec. 3, Nangang Rd. Intersection ## 1105 YouBike2.0_Nangang Rd. & Dongxin St. Intersection ## 1106 YouBike2.0_Bade Rd. & Zhongpo Rd. Intersection ## 1107 YouBike2.0_MRT Houshanpi Sta. (Exit 3) ## 1108 YouBike2.0_Yucheng Park Sports Center ## 1109 YouBike2.0_Baifu Park ## 1110 YouBike2.0_Nanhu Bridge (Ln. 255, Jingmao 2nd Rd.) ## 1111 YouBike2.0_Park St. & Chongyang Rd. Intersection ## 1112 YouBike2.0_Nangang Station Building B (Civic Blvd.) ## 1113 YouBike2.0_Dr.Hu Shih Park ## 1114 YouBike2.0_Nangang Pumping Station ## 1115 YouBike2.0_Jingmao Park ## 1116 YouBike2.0_Yu Cheng Senior High School ## 1117 YouBike2.0_MRT Nangang Exhibition Center Sta. (Exit 7) ## 1118 YouBike2.0_Lixing Bridge (Nangang) ## 1119 YouBike2.0_JiuZhuang Elementary School(Sec. 1, Jiuzong Rd.) ## 1120 YouBike2.0_Siangyang Greens ## 1121 YouBike2.0_Xiaowan Social Housing ## 1122 YouBike2.0_MRT Nangang Exhibition Center Sta. (Exit 6) ## 1123 YouBike2.0_MRT Nangang Exhibition Center Sta. (Exit 4) ## 1124 YouBike2.0_Chengde Greens ## 1125 YouBike2.0_Nangang Park (Ln. 170, Dongxin St.) ## 1126 YouBike2.0_Zhongpo Rd. & Civic Blvd. Intersection (Northeast) ## 1127 YouBike2.0_Kunyang Park ## 1128 YouBike2.0_Ln. 178, Sec. 2, Nangang Rd. ## 1129 YouBike2.0_Nangang Train Sta. (Zhongxiao E. Rd.) ## 1130 YouBike2.0_Nangang Train Sta. (Xinghua Rd.) ## 1131 YouBike2.0_Yucheng Park (Ln. 178, Chengfu Rd.) ## 1132 YouBike2.0_Yudong Park (Dongxin St.) ## 1133 YouBike2.0_Nangang Community ## 1134 YouBike2.0_Ln. 197, Chengfu Rd. ## 1135 YouBike2.0_Nangang Evacuating Gate ## 1136 YouBike2.0_Cheng De Liti Parking ## 1137 YouBike2.0_Taipei Nangang Exhibition Center Hall 2 ## 1138 YouBike2.0_Jiuzhuang Police Station ## 1139 YouBike2.0_Ln. 80, Sec. 3, Nangang Rd. ## 1140 YouBike2.0_MRT Kunyang Sta. (Exit 4) ## 1141 YouBike2.0_Ln. 278, Sec. 6, Zhongxiao E. Rd. ## 1142 YouBike2.0_Humanities and Social Science Building ## 1143 YouBike2.0_Ln. 130, Sec. 3, Nangang Rd. ## 1144 YouBike2.0_Ln. 190, Sec. 3, Nangang Rd. ## 1145 YouBike2.0_Ln. 212, Sec. 6, Zhongxiao E. Rd. ## 1146 YouBike2.0_Xinfu Park ## 1147 YouBike2.0_Ln. 63, Dongxin St. ## 1148 YouBike2.0_Zhongxing Park ## 1149 YouBike2.0_XiangYang Rd. & Civic Blvd. Intersection (Northwest) ## 1150 YouBike2.0_XiangYang Rd. & NanGang Rd. Intersection (Northwest) ## 1151 YouBike2.0_Ln. 151, Sec. 1, Academia Rd. ## 1152 YouBike2.0_Taipei Metro Neihu Depot (Gangdong St.) ## 1153 YouBike2.0_Lizhong Community Center ## 1154 YouBike2.0_Ln. 159, Sec. 2, Keelung Rd. Intersection ## 1155 YouBike2.0_Ln. 175, Jiaxing St Intersection. ## 1156 YouBike2.0_Ln. 631, Sec. 3, Heping E. Rd Intersection ## 1157 YouBike2.0_Ln. 530, Sec. 3, Heping E. Rd Intersection ## 1158 YouBike2.0_Jingqin No. 2 Park ## 1159 YouBike2.0_Taipei Medical University ## 1160 YouBike2.0_Sanxing Park ## 1161 YouBike2.0_Songde Sta. ## 1162 YouBike2.0_MRT Xiangshan Sta. (Exit 2) ## 1163 YouBike2.0_Xiangshan Park ## 1164 YouBike2.0_Aly. 3, Ln. 253, Songren Rd ## 1165 YouBike2.0_Xingya Junior High School ## 1166 YouBike2.0_MRT Xiangshan Sta. (Exit 1) ## 1167 YouBike2.0_Ln. 200, Songde Rd ## 1168 YouBike2.0_Zhongquan Park ## 1169 YouBike2.0_Taipei Emergency Operation Center ## 1170 YouBike2.0_Taipei Xinyi Sports Center ## 1171 YouBike2.0_MRT Taipei 101/World Trade Center Sta. (Exit 3) ## 1172 YouBike2.0_Jingxin Park ## 1173 YouBike2.0_Guangfu S. Rd & Sec. 4, Xinyi Rd Intersection (Southeast) ## 1174 YouBike2.0_Sanzhangli ## 1175 YouBike2.0_Ln. 496, Sec. 4, Ren'ai Rd Intersection ## 1176 YouBike2.0_Songshan High School of Agriculture and Industry ## 1177 YouBike2.0_Songyou Park ## 1178 YouBike2.0_Linkou Park ## 1179 YouBike2.0_Songshan High School of Commerce and Home Economics ## 1180 YouBike2.0_Yong Chun Pi Wetland Park ## 1181 YouBike2.0_Taipei City Hall ## 1182 YouBike2.0_Songzhi Rd & Songshou Rd Intersection ## 1183 YouBike2.0_Shifu Rd & Songshou Rd Intersection ## 1184 YouBike2.0_Shifu Rd & Songgao Rd Intersection ## 1185 YouBike2.0_City Hall Square ## 1186 YouBike2.0_Xinyi Plaza (Taipei 101) ## 1187 YouBike2.0_MRT Taipei 101/World Trade Center Sta. (Exit 5) ## 1188 YouBike2.0_Chunguang Park ## 1189 YouBike2.0_Ln. 121, Songren Rd Intersection ## 1190 YouBike2.0_Fude Elementary School ## 1191 YouBike2.0_Fude Park ## 1192 YouBike2.0_Songgao Rd. (Xinyi Place A4) ## 1193 YouBike2.0_Xingya Rd. & Songren Rd. Intersection ## 1194 YouBike2.0_Fuxiang Park (Aly. 11, Ln. 127, Yongji Rd.) ## 1195 YouBike2.0_Bus Wuxing Sta. ## 1196 YouBike2.0_Taihe Park ## 1197 YouBike2.0_Xingya Elementary School (Ln. 37, Sec. 1, Jilong Rd.) ## 1198 YouBike2.0_Yaxiang Park (Ln. 50, Songxin Rd.) ## 1199 YouBike2.0_Songshan Sta. ## 1200 YouBike2.0_Wuchang Park ## 1201 YouBike2.0_Yongji Rd. & Songxin Rd. Intersection ## 1202 YouBike2.0_Sanxing Elementary School ## 1203 YouBike2.0_Civic Blvd. & Songxin Rd. Intersection ## 1204 YouBike2.0_Songshan Senior High School ## 1205 YouBike2.0_Keelung Rd. & Guangfu Rd. Intersection ## 1206 YouBike2.0_Keelung Rd. & Zhongxiao Rd. Intersection (Southwest) ## 1207 YouBike2.0_Taihe Activity Center ## 1208 YouBike2.0_MRT Houshanpi Sta. (Exit 2) ## 1209 YouBike2.0_Hulin St. & Yongji Rd. Intersection ## 1210 YouBike2.0_Yongji Park ## 1211 YouBike2.0_Ln. 321, Yongji Rd. Intersection ## 1212 YouBike2.0_Songshan Rd. & Yongji Rd. Intersection ## 1213 YouBike2.0_Ln. 292, Songshan Rd. Intersection ## 1214 YouBike2.0_MRT Xiangshan Sta.(Exit.3) ## 1215 YouBike2.0_Songde Park ## 1216 YouBike2.0_TWTC Exhibition Hall 3 ## 1217 YouBike2.0_Songde Rd. & Hulin St. Intersection ## 1218 YouBike2.0_Futai Park ## 1219 YouBike2.0_Ln. 101, Sec. 1,Keelung Rd. Intersection ## 1220 YouBike2.0_MRT Yongchun Sta.(Exit.2) ## 1221 YouBike2.0_Ln. 260, Wuxing St. Intersection ## 1222 YouBike2.0_Songshan Vocational High School (Linkou St.) ## 1223 YouBike2.0_Ren'ai Rd. & Yisian Rd. Intersection ## 1224 YouBike2.0_Anciang Park ## 1225 YouBike2.0_Xinyi & Keelung Intersection ## 1226 YouBike2.0_MRT Taipei 101 / World Trade Center Sta.(Exit.2) ## 1227 YouBike2.0_Aly. 36, Ln. 284, Wuxing St. ## 1228 YouBike2.0_Xiehe Youde High School ## 1229 YouBike2.0_Fude Elementary School Bus Station ## 1230 YouBike2.0_Ln. 95, Songren Rd. ## 1231 YouBike2.0_Nan Shan Plaza ## 1232 YouBike2.0_Jinglian Plaza ## 1233 YouBike2.0_Jingping Park ## 1234 YouBike2.0_MRT Taipei City Hall Sta. (Exit 3) ## 1235 YouBike2.0_Wufenpu Park ## 1236 YouBike2.0_No. 305, Songren Rd. ## 1237 YouBike2.0_Ln.394, Wuxing St. ## 1238 YouBike2.0_Ln. 215, Sec. 5, Zhongxiao E. Rd. ## 1239 YouBike2.0_Songqin St. & Zhuangjing Rd. Intersection ## 1240 YouBike2.0_Songren Rd & Songping Rd. Intersection ## 1241 YouBike2.0_Xinyi Rd. & Songde Rd. Intersection ## 1242 YouBike2.0_MRT Taipei City Hall Sta. (Exit 4) ## 1243 YouBike2.0_Ln. 284, Wuxing St. (Guangan Shrine) ## 1244 YouBike2.0_Jingqin No.2 Park (Southwest) ## 1245 YouBike2.0_Keqin New Village ## 1246 YouBike2.0_No. 291, Sec. 3, Heping E. Rd. ## 1247 YouBike2.0_Ln. 468, Yongji Rd. ## 1248 YouBike2.0_Guangci Social Housing (Zone D) ## 1249 YouBike2.0_Ln. 341, Sec. 3, Heping E. Rd. ## 1250 YouBike2.0_Gexin Park ## 1251 YouBike2.0_Lishuang Park ## 1252 YouBike2.0_Taipei Cultural & Sports Park ## 1253 YouBike2.0_MRT S.Y.S Memorial Hall Sta. (Exit 5) ## 1254 YouBike2.0_Guangfu S. Rd. & Yanchang Rd. Intersection ## 1255 YouBike2.0_Zhongpo N. Rd. & Yongji Rd. Intersection ## 1256 YouBike2.0_Aly. 66, Ln. 281, SongRen Rd. ## 1257 YouBike2.0_KeeLung Rd. & Civic Blvd. Intersection ## 1258 YouBike2.0_Dechang St & Baoxing St Intersection (Northwest) ## 1259 YouBike2.0_Baoxing St & Changtai St Intersection (Southwest) ## 1260 YouBike2.0_Ln. 486, Wanda Rd ## 1261 YouBike2.0_Guoxing Rd & Sec. 2, Zhonghua Rd Intersection ## 1262 YouBike2.0_Guting Junior High School ## 1263 YouBike2.0_Guoxing Rd & Shuiyuan Rd Intersection ## 1264 YouBike2.0_Youth Park Golf Driving Range ## 1265 YouBike2.0_Guoxing Rd & Qingnian Rd Intersection ## 1266 YouBike2.0_Youth Park Baseball Field ## 1267 YouBike2.0_Youth Park Basketball Courts ## 1268 YouBike2.0_Fuhua Garden Metro ## 1269 YouBike2.0_Xinhe Elementary School ## 1270 YouBike2.0_Taipei Juguang Post Office ## 1271 YouBike2.0_Juguang Car Park ## 1272 YouBike2.0_Ln. 146, Bangka Blvd Intersection ## 1273 YouBike2.0_Dongyuan Elementary School ## 1274 YouBike2.0_Huazhong Evacuation Gate ## 1275 YouBike2.0_Jinde Park ## 1276 YouBike2.0_Zhongde Park ## 1277 YouBike2.0_Hua Jiang Senior High School ## 1278 YouBike2.0_Sec. 2, Xiyuan Rd & Bangka Blvd Intersection ## 1279 YouBike2.0_Shuang Yuan Junior High School ## 1280 YouBike2.0_Changshun Community Center ## 1281 YouBike2.0_Hwa Chiang Elementary School ## 1282 YouBike2.0_Huajiang No.8 Park ## 1283 YouBike2.0_Sec. 2, Huanhe S. R & Shuangyuan St Intersection ## 1284 YouBike2.0_Dali Senior High School ## 1285 YouBike2.0_Tang bu Cultural Park ## 1286 YouBike2.0_Liangkeshu Park ## 1287 YouBike2.0_Wanhua Qingnian Public Housing ## 1288 YouBike2.0_Kaifeng St. & Xining Rd. Intersection ## 1289 YouBike2.0_Emei Parking Lots ## 1290 YouBike2.0_Changsha Park ## 1291 YouBike2.0_Cat Park (Zhongxing Bridgehead) ## 1292 YouBike2.0_Nishi Honganji Relics Plaza ## 1293 YouBike2.0_Zhonghua Rd. & Guilin Rd. Intersection ## 1294 YouBike2.0_MRT Longshan Temple Sta. (Exit 1) ## 1295 YouBike2.0_Longshan Elementary School ## 1296 YouBike2.0_Huaxi Park ## 1297 YouBike2.0_laosong Elementary School ## 1298 YouBike2.0_Wanhua Train Sta. ## 1299 YouBike2.0_Wanhua Train Sta. (D2 Plaza) ## 1300 YouBike2.0_MRT Longshan Temple Sta. (Exit 3) ## 1301 YouBike2.0_Taipei Cinema Park (Emei St.) ## 1302 YouBike2.0_Taipei Cinema Park (Kangding Rd.) ## 1303 YouBike2.0_Zhonghua Rd. & Emei St. Intersection ## 1304 YouBike2.0_wanhua greehs NO.266 ## 1305 YouBike2.0_Wanda Elementary School (Ln. 344, Wanda Rd.) ## 1306 YouBike2.0_Ln. 10, Dechang St. ## 1307 YouBike2.0_Huanhe S. Rd. & Heping W. Rd. Intersection ## 1308 YouBike2.0_Ln. 60, Changshun St. ## 1309 YouBike2.0_Xiyuan Park ## 1310 YouBike2.0_Huajiang Sewage Treatment Plant ## 1311 YouBike2.0_Liuxiang Park ## 1312 YouBike2.0_Luti Community Park ## 1313 YouBike2.0_Changshun St. & Bangka Blvd. Intersection ## 1314 YouBike2.0_Ln. 145, Fumin Rd. ## 1315 YouBike2.0_Huanhe Market ## 1316 YouBike2.0_LongShan Junior High School ## 1317 YouBike2.0_Luoyang Parking ## 1318 YouBike2.0_Guilin Rd. & Kunming St. Intersection ## 1319 YouBike2.0_Wanhuaguomin Junior High School ## 1320 YouBike2.0_Youth Park (Exit 3) ## 1321 YouBike2.0_MRT Longshan Temple Sta. (Exit 1)_1 ## 1322 YouBike2.0_Juguang Social Housing ## 1323 YouBike2.0_Bangka Blvd. & Xizang Rd. Intersection ## 1324 YouBike2.0_Ln. 493, Wanda Rd. ## 1325 YouBike2.0_Shuangyuan Car Park ## 1326 YouBike2.0_Ln. 152, Qingnian Rd. ## 1327 YouBike2.0_Ln. 190, Sec. 2, Heping W. Rd. ## 1328 YouBike2.0_Ln. 424, Wanda Rd. ## 1329 YouBike2.0_Ln. 52, ChangTai St. ## 1330 YouBike2.0_ShuiYuan Rd. & QingNian Rd. Intersection ## 1331 YouBike2.0_Youth Park (Exit 4) ## 1332 YouBike2.0_XiangAn Public Housing ## 1333 YouBike2.0_Dali High School (XiZang Rd.) ## 1334 YouBike2.0_BangKa Blvd. & ShuangYuan St. Intersection ## 1335 YouBike2.0_Ln. 125, DeChang St. ## 1336 YouBike2.0_NTU ShuiYuan Dorms(A) ## 1337 YouBike2.0_NTU Complex for Research Excellence ## 1338 YouBike2.0_NTU ShuiYuan HsiuChi House ## 1339 YouBike2.0_NTU Archives ## 1340 YouBike2.0_NTU ShuiYuan Dorms(B) ## 1341 YouBike2.0_NTU 8th Men's Dorm(East) ## 1342 YouBike2.0_NTU Courtesy House(Southeast) ## 1343 YouBike2.0_NTU Agricultural Exhibition Hall(North) ## 1344 YouBike2.0_NTU Building 2, College of Management(North) ## 1345 YouBike2.0_NTU Dept. of Civil Engineering ## 1346 YouBike2.0_NTU Freshman Women's Dorm(North) ## 1347 YouBike2.0_NTU 9th Women's Dorm(Southwest) ## 1348 YouBike2.0_NTU Xiao Fu Commissary(East) ## 1349 YouBike2.0_NTU Parking lot(Motorcycle) ## 1350 YouBike2.0_NTU College of Engineering Building(South) ## 1351 YouBike2.0_NTU Astronomy - Mathematics Building(South) ## 1352 YouBike2.0_NTU Dept. of Psychology (South Hall) ## 1353 YouBike2.0_NTU Lesyue Building(East) ## 1354 YouBike2.0_NTU New Agricultural Chemistry Building(West) ## 1355 YouBike2.0_NTU Building No.5(West) ## 1356 YouBike2.0_NTU Gymnasium(West) ## 1357 YouBike2.0_NTU Common Subjects Classroom Building(North) ## 1358 YouBike2.0_NTU Common Subjects Classroom Building(Southeast) ## 1359 YouBike2.0_NTU LuMing Hall(East) ## 1360 YouBike2.0_NTU Gongguan Car Park (Northwest) ## 1361 YouBike2.0_NTU 2nd Administration Building(South) ## 1362 YouBike2.0_NTU Ming - Da Hall Parking ## 1363 YouBike2.0_NTU Building No.2 ## 1364 YouBike2.0_NTU Center for Condensed Matter Sciences(South) ## 1365 YouBike2.0_NTU College of social Sciences Building(West) ## 1366 YouBike2.0_NTU Department of Sociology(South) ## 1367 YouBike2.0_NTU Shih - Liang Hall(Southeast) ## 1368 YouBike2.0_NTU Green Cabin ## 1369 YouBike2.0_NTU Computer and Information Networking Center(South) ## 1370 YouBike2.0_NTU Institute of Atomic and Molecular Sciences(North) ## 1371 YouBike2.0_NTU Life Science Building(Northwest) ## 1372 YouBike2.0_NTU 1st Student Activity Center(Southwest) ## 1373 YouBike2.0_NTU Barry Lam Hall(West) ## 1374 YouBike2.0_NTU Liberal Education Classroom Building(West) ## 1375 YouBike2.0_NTU Forestry Building(North) ## 1376 YouBike2.0_NTU Building No.1 ## 1377 YouBike2.0_NTU Xiao Xiao Fu Commissary(Southwest) ## 1378 YouBike2.0_NTU Teaching and Research Building(North) ## 1379 YouBike2.0_NTU Building No.4(Northeast) ## 1380 YouBike2.0_NTU Freshman Classroom Building(South) ## 1381 YouBike2.0_NTU Tseng Jiang Hall(North) ## 1382 YouBike2.0_NTU E. E. Building No. 2(Southeast) ## 1383 YouBike2.0_NTU Dept. of Library and Information Sciences(North) ## 1384 YouBike2.0_NTU Main Library(Southwest) ## 1385 YouBike2.0_NTU Black Forest(West) ## 1386 YouBike2.0_NTU Dept. of Veterinary Medicine(South) ## 1387 YouBike2.0_NTU Sports Center(Southeast) ## 1388 YouBike2.0_NTU Ming - Da Hall (Staff Dormitory) ## aren ## 1 No.235, Sec. 2, Fuxing S. Rd. ## 2 No.273, Sec. 2, Fuxing S. Rd. (West) ## 3 No. 7, Ln. 96, Sec. 2, Heping E. Rd ## 4 No. 33, Ln. 118, Sec. 2, Heping E. Rd ## 5 No. 368, Sec. 2, Fuxing S. Rd. ## 6 No. 280, Sec. 2, Fuxing S. Rd. ## 7 No. 342, Sec. 2, Fuxing S. Rd. ## 8 No. 52, Sec. 3, Xinsheng S. Rd. ## 9 No. 66, Sec. 3, Xinsheng S. Rd. (East) ## 10 No. 82, Sec. 3, Xinsheng S. Rd. ## 11 No. 30, Sec. 1, Xinhai Rd. ## 12 No. 236, Sec. 2, Fuxing S. Rd. ## 13 No. 311, Sec. 3, Roosevelt Rd. ## 14 No. 28, Ln. 76, Dunnan St. ## 15 No. 245, Sec. 3, Roosevelt Rd. ## 16 No. 11, Ln. 283, Sec. 3, Roosevelt Rd. ## 17 No. 1, Wolong St. ## 18 Ln. 54, Sec. 3, Xinsheng S. Rd. & Wenzhou St. Intersection ## 19 No. 21, Sec. 4, Roosevelt Rd. ## 20 MRT Gongguan Sta. (Exit 2) ## 21 No. 107, Sec. 4, Roosevelt Rd.(Southwest) ## 22 No. 43, Sec. 4, Keelung Rd. ## 23 Ln. 73, Sec. 4, Keelung Rd. Intersection ## 24 Ln. 113, Sec. 4, Roosevelt Rd. & Ln. 41, Sec. 4, Keelung Rd. Intersection ## 25 Aly. 68, Ln. 41, Sec. 4, Keelung Rd. ## 26 No. 57, Ln. 155, Sec. 3, Keelung Rd.(West) ## 27 Fanglan Rd & Ln. 155, Sec. 3, Keelung Rd. Intersection ## 28 No. 51, Fanglan Rd.(Northwest) ## 29 Ln. 80, Changxing St. Intersection(West) ## 30 No. 50, Changxing St.(Northwest) ## 31 No. 31, Changxing St. ## 32 Ln. 155, Sec. 3, Keelung Rd. Intersection ## 33 No. 188, Sec. 3, Xinhai Rd. ## 34 NTU Wan Tsai Research Hall ## 35 No. 30, Sec. 3, Xinhai Rd.(Northwest) ## 36 Xinhai Fuxing Rd. Intersection (Southwest) ## 37 NTU Language Training & Testing Center(North) ## 38 NTU Sports Center(North) ## 39 Xinhai Xinsheng Rd. Intersection (Southeast) ## 40 Keelung Changxing Rd. Intersection(East) ## 41 No. 51, Dunnan St. ## 42 No. 73, Dunnan St. ## 43 No. 15, Sec. 1, Xinhai Rd. ## 44 Xinhai Taishun St. Intersection (Southeast) ## 45 No. 170, Wolong St. ## 46 No. 234-2, Wolong St. ## 47 No. 223, Sec. 3, Xinhai Rd. (West) ## 48 No. 3, Ln. 101, Leye St. (Northwest) ## 49 No. 420, Sec. 3, Heping E. Rd. (Northeast) ## 50 No. 410, Sec. 3, Heping E. Rd. ## 51 No. 166, Sec. 2, Keelung Rd. ## 52 No. 189, Tonghua St. (West) ## 53 Sec. 1, Xinhai Rd & Sec. 3, Roosevelt Rd (North) ## 54 Sec. 1, Heping E. Rd & Sec. 2, Jinshan S. Rd Intersection (Southwest) ## 55 Sec. 1, Heping E. Rd & Longquan St. Intersection (Southwest) ## 56 Sec. 1, Heping E. Rd & Taishun St Intersection (Southeast) ## 57 No. 129, Sec. 1, Heping E. Rd. ## 58 No. 41, Sec. 2, Roosevelt Rd ## 59 No. 19, Sec. 1, Heping E. Rd ## 60 Sec. 2, Jianguo S. Rd & Ln. 151, Sec. 2, Jianguo S. Rd (Under Bridge) ## 61 Sec. 2, Xinsheng S. Rd & Sec. 2, Heping E. Rd (Northeast) ## 62 Sec. 2, Jianguo S. Rd & Sec. 2, Heping E. Rd. (Northwest) ## 63 No. 249, Jinhua St. (Opposite) ## 64 No. 128, Sec. 2, Xinyi Rd. ## 65 Sec. 2, Xinyi Rd. & Sec. 2, Hangzhou S. Rd. (Southeast) ## 66 Ln. 21, Aiguo E. Rd. & Ln. 25, Sec. 2, Hangzhou S. Rd. Intersection (Southeast) ## 67 Aiguo E. Rd. & Sec. 2, Hangzhou S. Rd. Intersection (Southwest) ## 68 Ln. 293, Sec. 2, Dunhua S. Rd. (South) ## 69 No. 218, Sec. 2, Dunhua S. Rd ## 70 No185, Sec. 2, Anhe Rd ## 71 No. 101, Tonghua St. ## 72 No. 108, Sec. 2, Keelung Rd. ## 73 No. 81, Sec. 3, Zhongxiao E. Rd. ## 74 No. 113, Ln. 119, Sec. 1, Xinsheng S. Rd. ## 75 No. 22, Sec. 3, Ren'ai Rd. ## 76 No. 45, Ln. 304, Sec. 1, Jianguo S. Rd. (South) ## 77 Sec. 1, Fuxing S. Rd & Aly. 45, Ln. 147, Sec. 3, Xinyi Rd Intersection. ## 78 Sec. 1, Jianguo S. Rd & Sec. 3, Jinan Rd Intersection. (Southeast) ## 79 Sec. 1, Fuxing S. R & Aly. 13, Ln. 123, Sec. 3, Ren'ai Rd. (Northwest) ## 80 No. 6, Sec. 4, Xinyi Rd. ## 81 No. 143, Sec. 3, Xinyi Rd. ## 82 No. 74, Sec. 4, Xinyi Rd. ## 83 Sec. 1, Dunhua S. Rd & Ln. 236, Sec. 1, Dunhua S. Rd Intersection. ## 84 No. 74, Sec. 4, Ren'ai Rd. ## 85 No. 155, Sec. 4, Xinyi Rd ## 86 No. 75, Sec. 1, Anhe Rd. ## 87 No. 188, Sec. 4, Xinyi Rd ## 88 No. 170, Sec. 3, Civic Blvd. ## 89 No. 206, Sec. 3, Civic Blvd. (West) ## 90 MRT Daan Park Sta. (Exit 2) (West) ## 91 No. 353, Sec. 4, Xinyi Rd. ## 92 No. 249, Yanji St. ## 93 No. 5, Ln. 290, Guangfu S. Rd ## 94 No. 275, Sec. 1, Jianguo S. Rd. ## 95 No. 101, Sec. 1, Xinsheng S. Rd. ## 96 Zhongxiao & Xinsheng S. Rd Intersection. (North) ## 97 No. 52, Sec. 2, Fuxing S. Rd. ## 98 Sec. 3, Zhongxiao E. Rd & Ln. 10, Sec. 3, Zhongxiao E. Rd Intersection ## 99 Aly. 4, Ln. 49, Sec. 4, Zhongxiao E. Rd./Da'an Rd. Intersection ## 100 No. 158, Sec. 1, Dunhua S. Rd. ## 101 MRT Daan Park Sta. (Exit 5) (East) ## 102 Sec. 2, Jianguo S Rd. & Sec. 3, Xinyi Rd. Intersection (Southwest) ## 103 No. 24, Dongfeng St. ## 104 No. 6, Ln. 66, Siwei Rd. ## 105 No. 3, Ln. 135, Sec. 1, Fuxing S. Rd. (Opposite) ## 106 No. 221, Sec. 4, Zhongxiao E. Rd. ## 107 No. 143, Sec. 4, Zhongxiao E. Rd. ## 108 No. 39, Ln. 208, Rui'an St. (Opposite) ## 109 No. 25, Leli Rd. ## 110 No. 134, Sec. 2, Heping E. Rd. ## 111 Sec. 4, Jhongsiao E. Rd. & Guangfu S. Rd. Intersection (Southwest) ## 112 Sec. 4, Ren'ai Rd. & Sec. 1, Da'an Rd. Intersection (Southwest) ## 113 No. 252, Sec. 4, Sinyi Rd. ## 114 Ln. 1, Sec. 3, Heping E. Rd. & Ln. 198, Sihwei Rd. Intersection (Northwest) ## 115 No. 376, Sec. 4, Ren'ai Rd. ## 116 No. 225, Sec. 4, Sinyi Rd. ## 117 No. 99, Sec. 2, Dunhua S. Rd. ## 118 No. 142-1, Sec. 2, Fusing S. Rd. ## 119 Heping E. Rd. & Jianguo S. Rd. Intersection (North) ## 120 No. 148, Ln. 155, Sec. 3, Keelung Rd. ## 121 No. 1, Ln. 126, Sec. 1, Fuxing S. Rd. ## 122 No. 178, Sec. 2, Xinyi Rd. ## 123 Ln. 48, Sec. 4, Ren'ai Rd. & Dongfeng St. Intersection (North) ## 124 MRT Gongguan Sta.(Exit.3)(West) ## 125 No. 100, Sec. 3, Zhongxiao E. Rd. (Opposite) ## 126 No. 229-1, Sec. 3, Zhongxiao E. Rd. ## 127 No. 94, Sec. 3, Xinsheng S. Rd. ## 128 Sec. 1, Xinhai Rd. & Sec. 3, Xinsheng S. Rd. Intersection (Northwest) ## 129 No. 303, Sec. 1, Fuxing S. Rd. ## 130 Wolong St. / Ln. 195, Wolong St. Intersection (South) ## 131 Sec. 3, Xinhai Rd. & Ln. 157, Sec. 3, Xinhai Rd. Intersection (Northwest) ## 132 Wolong St. & Sec. 2, Xinyi Rd. Intersection (Northeast) ## 133 No. 8-1, Ln. 96, Sec. 2, Heping E. Rd. ## 134 No. 55, Sec. 3, Xinhai Rd. ## 135 Sec. 3, Heping E. Rd. & Sec. 2, Dunhua S. Rd. Intersection (East) ## 136 Keelung Rd. & Changxing St. Intersection (Southeast) ## 137 No. 188, Sec. 4, Ren'ai Rd. ## 138 No. 111, Sec. 1, Dunhua S. Rd. ## 139 No. 55, Sec. 4, Zhongxiao E. Rd. ## 140 Sec. 4, Civic Blvd. & Sec. 1, Fuxing S. Rd. Intersection (Southeast) ## 141 No. 2, Sec. 3, Xinsheng S. Rd. ## 142 No. 16, Ln. 227, Sec. 2, Anhe Rd. (Opposite) ## 143 Sec. 3, Xinyi Rd. & Ln. 134, Sec. 3, Xinyi Rd. Intersection ## 144 No. 110, Sec. 4, Ren'ai Rd. ## 145 No. 201, Sec. 2, Dunhua S. Rd. ## 146 No. 280, Sec. 1, Dunhua S. Rd. ## 147 No. 92, Sec. 2, Dunhua S. Rd. (Opposite) ## 148 No. 184, Sec. 3, Xinyi Rd. ## 149 No. 201, Sec. 3, Roosevelt Rd. ## 150 Ln. 199, Sec. 4, Xinyi Rd. & Ln. 90, Sec. 1, Anhe Rd. Intersection ## 151 Sec. 2, Xinhai Rd.(NTU Language Center) ## 152 Sec. 2, Dunhua S. Rd. & Ln. 81, Sec. 2, Dunhua S. Rd. Intersection (Northwest) ## 153 No. 78, Jinhua St. (Opposite) ## 154 No. 26, Ln. 200, Guangfu S. Rd. (East) ## 155 No. 30, Ln. 248, Sec. 3, Zhongxiao E. Rd. ## 156 No. 85, Sec. 4, Ren'ai Rd ## 157 Sec. 2, Anhe Rd. & Ln. 81, Sec. 2, Dunhua S. Rd. Intersection (Southwest) ## 158 No. 43, Sec. 2, Xinhai Rd. ## 159 Sec. 2, Fuxing S. Rd. & Sec. 4, Xinyi Rd. Intersection (Southeast) ## 160 No. 33, Ln. 143, Tonghua St. (Opposite) ## 161 No. 84, Ln. 119, Sec. 4, Roosevelt Rd. (Opposite) ## 162 No. 230, Sec. 4, Zhongxiao E. Rd. ## 163 No. 363, Sec. 4, Ren'ai Rd. ## 164 No. 97, Leli Rd. ## 165 No. 117, Sec. 3, Roosevelt Rd. ## 166 No. 1, Ln. 295, Sec. 1, Dunhua S. Rd. ## 167 No. 129, Tong'an St. (Opposite) ## 168 No. 191, Sec. 1, Fuxing S. Rd. ## 169 No. 37, Sec. 4, Ren'ai Rd. ## 170 No. 1, Pucheng St. (Opposite) ## 171 Sec. 2, Anhe Rd. & Ln. 69, Sec. 2, Anhe Rd. Intersection ## 172 Aly. 11, Ln. 131, Wolong St. & Ln. 108, Leye St. Intersection ## 173 No. 81-1, Sec. 2, Roosevelt Rd. ## 174 No. 48, Sec. 4, ZhongXiao E. Rd. ## 175 Ln. 90, Sec. 2, HePing E. Rd. & Aly. 5, Ln. 76, Sec. 2, HePing E. Rd. Intersection ## 176 No. 438, GuangFu S. Rd. ## 177 No. 129, FuYang St. ## 178 No. 1, Sec. 4, RenAi Rd. ## 179 No. 121, Sec. 4, RenAi Rd. ## 180 No. 7, Ln. 93, LongQuan St. (Opposite) ## 181 No. 1-1, Sec. 5, Yanping N. Rd. (Opposite) ## 182 No. 318, Sec. 3, Chongqing N Rd. ## 183 No. 371, Sec. 2, Huanhe N. Rd. ## 184 No. 123, Sec. 3, Yanping N. Rd. (North) ## 185 No. 260, Sec. 3, Chongqing N. Rd. ## 186 No. 12, Ln. 85, Dalong St. (Opposite) ## 187 No. 112, Xining N. Rd. ## 188 No. 61, Hami St. Intersection (Opposite) ## 189 No. 235, Jiuquan St. ## 190 No. 235, Jiuquan St. ## 191 No. 19, Dunhuang Rd. ## 192 Dunhuang Rd. & Ln. 383, Sec. 3, Chongqing N Rd. Intersection ## 193 No. 287, Sec. 3, Chengde Rd. ## 194 No. 239, Minquan W. Rd. ## 195 Minquan W. Rd. & Sec. 1, Dihua St. Intersection (Under Bridge) ## 196 No. 7, Ln. 1, Anxi St. (Opposite) ## 197 No. 82, Minzu W. Rd. ## 198 No. 210, Sec. 3, Chengde Rd. ## 199 MRT Daqiaotou Sta. (Exit 2) (West) ## 200 No. 237, Minquan W Rd. ## 201 MRT Minquan W. Rd. Sta. (West) ## 202 No. 22, Wanquan St. (Opposite) ## 203 Tacheng St. & Zhengzhou Rd. Intersection (Southwest) ## 204 No. 62-1, Sec. 2, Chongqing N. Rd. ## 205 No. 103, Ln. 233, Nanjing W. Rd. ## 206 No. 217, Dalong St. (Opposite) ## 207 No. 180, Sec. 2, Chongcing N. Rd. ## 208 Minzu Rd. & Minzu W. Rd. Intersection (Northwest) ## 209 No. 128, Sec. 1, Chongcing N. Rd. ## 210 No. 162, Sec. 3, Chongcing N. Rd. ## 211 No. 14, Sec. 3, Chengde Rd. ## 212 No. 23, Zhengzhou Rd. ## 213 No. 117, Changji St. ## 214 No. 299, Chang'an W. Rd. (Opposite) ## 215 Jinxi St. & Xingcheng St. Intersection (Southwest) ## 216 No. 200, Sec. 4, Yanping N. (South) ## 217 No. 51, Dalong St. ## 218 No. 171, Sec. 2, Chongqing N. Rd. ## 219 Dadaocheng Evacuation Gate ## 220 Sec. 2, Chongqing N. Rd. & Guisui St. Intersection (South) ## 221 Minquan W. Rd. & Lanzhou St. Intersection (West) ## 222 No. 239, Sec. 2, Chengde Rd. ## 223 Nanjing W. Rd. & Taiyuan Rd. Intersection (East) ## 224 No. 137, Sec. 2, Chengde Rd. ## 225 Taiyuan Rd. & Wuyuan Rd. Intersection (Southeast) ## 226 No. 45, Huayin St. (Opposite) ## 227 No. 37, Ln. 70, Minquan W. Rd. (Opposite) ## 228 No. 57, Nanjing W. Rd. ## 229 No. 244, Chang'an W. Rd. (Sec. 1, Chongqing N. Rd.) ## 230 No. 83, Sec. 3, Chengde Rd. ## 231 Sec. 1, Huanhe N. Rd. & Minsheng W. Rd. Intersection (Southeast) ## 232 Sec. 3, Chengde Rd. & Kulun St. Intersection (Southeast) ## 233 Dalong St. & Ln. 85, Dalong St. Intersection (Northeast) ## 234 Sec. 1, Chengde Rd. & Zhengzhou Rd. (Under Elevated Bridge) ## 235 Jinxi St. & Ln. 52, Jinxi St. Intersection (Northeast) ## 236 No. 25, Aly. 4, Ln. 102, Minquan W. Rd. (Opposite) ## 237 No. 141, Ningxia Rd. (Opposite) ## 238 Sec. 2, Yanping N. Rd. & Liangzhou St. Intersection ## 239 No. 63, Changji St. ## 240 No. 13, Ln. 335, Sec. 3, Chongqing N. Rd. (Opposite) ## 241 No. 78, Dunhuang Rd. ## 242 Ln. 325, Tonghe St. Intersection ## 243 No. 192, Sec.1, Tonghe E. St. (Side) ## 244 No. 175, Hualing St. (Side) ## 245 No. 104, Qiangang St. (Opposite) ## 246 Ln. 165, Yusheng St. Intersection (Northwest) ## 247 No.30, Ln.69, Tianmu E. Rd. (Front) ## 248 No. 3-55, Tianmu W. Rd. (Front) ## 249 Ln. 207, Sec.2, Zhongcheng Rd. (Southeast) ## 250 No. 276-280, Shidong Rd. (Opposite) ## 251 No.7, Ln. 53, Sec. 2, Zhongcheng Rd. (Opposite) ## 252 No. 122, Sec. 2, Zhongcheng Rd. (Opposite) ## 253 No. 33, Tianmu N. Rd. ## 254 Sec. 6, Zhongshan N. Rd. & Shidong Rd. Intersection (Northwest) ## 255 No. 71, Ln. 6, Sec.4, Chengde Rd. (Opposite) ## 256 Sec. 4, Zhongshan N. Rd. & Tonghe St. Intersection ## 257 No. 177, Sec. 1, Zhongcheng Rd. ## 258 No. 127, Sec. 1, Zhongcheng Rd. ## 259 No. 18, Sec. 1, Zhongcheng Rd. ## 260 No. 47, Sec. 2, Zhicheng Rd. ## 261 No. 303, Sec. 1, Zhicheng Rd. ## 262 No. 76, Jiantan Rd. (Opposite) ## 263 Ln. 134, Hougang/Hougang St. Intersection ## 264 No. 188, Hualing St. ## 265 No. 48, Qiangang St. (Opposite) ## 266 Ln. 179, Sec. 4, Chengde Rd. Intersection ## 267 No. 151, Fuhua Rd. (Opposite) ## 268 No. 751, Wenlin Rd. (South) ## 269 No.18, Jihe Rd. (Opposite) ## 270 Jiantan Rd. & Jihe Rd. Intersection ## 271 Jhongjheng Rd & Yunong Rd. Intersection (Northwest) ## 272 No. 50, Fuzhi Rd. (Opposite) ## 273 No. 609, Sec. 5, Jhongshan N. Rd. ## 274 No. 1, Shishang Rd. ## 275 No. 510, Zhongzheng Rd. ## 276 No. 55, Sec. 5, Chengde Rd. ## 277 No. 363, Jihe Rd. ## 278 No. 17, Huasheng St. (South) ## 279 Sec. 5, Zhongshan N. Rd. (Northwest) ## 280 No. 2, Aly. 44, Ln. 505, Sec. 5, Zhongshan N. Rd. (Opposite) ## 281 No. 250, Sec. 5, Zhongshan N. Rd. ## 282 No. 150, Shishang Rd. ## 283 Ln. 40, Sec. 2, Zhongcheng Rd. Intersection (Southwest) ## 284 No. 105, Yusheng St. (South) ## 285 No. 114, Fuhua Rd. (Opposite) ## 286 No. 80, Sec. 1, Zhicheng Rd. (Opposite) ## 287 No. 280, Sec. 2, Zhishan Rd. (Opposite) ## 288 No. 5, Sec. 2, Tonghe E. St. (Opposite) ## 289 Sec. 1, Zhishan Rd & Ln. 138, Sec. 1, Zhishan Rd (North) ## 290 No. 403, Zhongzheng Rd ## 291 No. 198, Sec. 4, Chongqing N. Rd ## 292 No. 177, Sec. 4, Chongqing N. Rd. ## 293 Sec. 3, Huanhe N. Rd & Hulu St. (Northeast) ## 294 No. 81, Sec 6, Zhongshan N. Rd. ## 295 No. 39, Shezhong St. (Opposite) ## 296 No. 476, Shezhong St. (Opposite) ## 297 No. 194, Sec. 2, Tonghe W. St. (Opposite) ## 298 No. 138, Sec. 1, Zhongcheng Rd. (Diagonally across) ## 299 Aly. 37, Ln. 20, Yongping St & Aly. 11, Ln. 20, Yongping St Intersection. ## 300 No. 8, Lixing St. (Opposite) ## 301 No. 240, Fulin Rd. ## 302 No. 26, Sec. 2, Tonghe E. St. (Side) ## 303 No. 117, Sec. 4, Chongqing N. Rd. ## 304 No. 323, Sec. 9, Yanping N. Rd. (Back) ## 305 No. 67, Ln. 133, Sec. 8, Yanping N. Rd Intersection. (Opposite) ## 306 No. 15, Ln. 96, Sec. 8, Yanping N. Rd. ## 307 Shezidao Wetlands Service Center ## 308 No. 250, Sec. 7, Yanping N. Rd. ## 309 No. 42-7, Sec. 7, Yanping N. Rd. (Opposite) ## 310 No. 94, Zhongyi St. ## 311 No. 285, Dexing E. Rd. (Ln. 283, Dexing E. Rd) ## 312 No.325, Danan Rd. ## 313 Huangsi St. & Ln. 195, Sec. 6, Jhongshan N. Rd. Intersection ## 314 No. 420, Jhongjheng Rd. ## 315 Jhongjheng Rd. & Jhihcheng St. Intersection (South) ## 316 Sec. 1, Jhihshan Rd. & Linsi Rd. Intersection (Southwest) ## 317 No. 1, Ln. 136, Sec. 5, Yanping N. Rd. ## 318 No. 114, Dongshan Rd. (Opposite) ## 319 No. 2, Ln. 261, Sec. 3, Huanhe N. Rd. ## 320 No. 42, Ln. 14, Fuzhi Rd. (Opposite) ## 321 No. 37, Ln. 10, Sec. 4, Chengde Rd. ## 322 No. 90, Yusheng St. ## 323 Sec. 2, Zhicheng Rd. & Yusheng St. Intersection (Northeast) ## 324 No. 15, Hou St. ## 325 No. 30, Ln. 141, Sec. 7, Zhongshan N. Rd. (Opposite) ## 326 No. 3-1, Jihe Rd. (Opposite) ## 327 Wenlin Rd. & Fude Rd. Intersection (East) ## 328 Tonghe St. & Ln. 2, Tonghe St. ## 329 Sec. 6, Yanping N. Rd./Shezhong St. Intersection (South) ## 330 MRT Jianta Sta. (Exit 1) (North) ## 331 Dexing E. Rd. & Dongshan Rd. Intersection (Northwest) ## 332 No. 276, Sec. 4, Chongqing N. Rd. ## 333 Sec. 3, Huanhe N. Rd. & Ln. 285, Sec. 5, Yanping N. Rd. Intersection ## 334 No. 67, Sec. 6, Yanping N. Rd. ## 335 No. 162, Shezi St. ## 336 Sec. 4, Chengde Rd. & Jiantan Rd. Intersection (West) ## 337 No. 100, Wenlin Rd. ## 338 No. 184, Hulu St. ## 339 No. 17, Ln. 257, Sec. 5, Yanping N. Rd. ## 340 No. 200, Sec. 2, Zhongcheng Rd. (Opposite) ## 341 No. 837, Sec. 5, Zhongshan N. Rd. ## 342 No. 33, Dexing W. Rd. (Opposite) ## 343 Sec. 4, Chengde Rd & Hougang St. Intersection ## 344 No. 692, Sec. 5, Zhongshan N. Rd. ## 345 Ln. 236, Zhongzheng Rd. & Zhongzheng Rd. Intersection ## 346 Fuhua Rd. & Ln. 162, Fuhua Rd. Intersection (Southeast) ## 347 Ln. 280, Sec. 5, Zhongshan N. Rd. ## 348 No. 79, Hulu St. (Opposite) ## 349 No. 2, Ln. 40, Shishang Rd. ## 350 Jihe Rd. & Ln. 77, Sec. 4, Chengde Rd. Intersection (Under Bridge) ## 351 No. 3, Ln. 91, Shidong Rd. ## 352 No. 118, Meilun St. (Opposite) ## 353 Ln. 270, Sec. 2, Zhongcheng Rd. & Ln. 299, Shidong Rd. Intersection ## 354 No. 57, Ln. 8, Tianmu E. Rd. (Opposite) ## 355 No. 115, Ln. 587, Wenlin Rd. (Opposite) ## 356 No. 45, Ln. 145, Sec. 7, Yanping N. Rd. (Opposite) ## 357 No. 125, Sec. 1, Zhongcheng Rd. ## 358 No. 109, Sec. 1, Zhongcheng Rd. ## 359 Fude Rd. & Ln. 48, Fude Rd. Intersection ## 360 Ln. 69, TianMu E. Rd. & TianMu E. Rd. Intersection ## 361 No. 13, Ln. 178, Sec. 2, ZhongCheng Rd. (Opposite) ## 362 KeQiang Rd. & HuangXi St. Intersection (Southwest) ## 363 No. 75, Ln. 109, DeXing E. Rd. (East) ## 364 Ln. 100, FuLin Rd. & Aly. 77, Ln. 100, FuLin Rd. Intersection ## 365 Wancheng St. & Sec. 1, Xinrong Rd. (Northwest) ## 366 No. 210, Sec. 5, Roosevelt Rd. ## 367 No. 250, Sec. 5, Roosevelt Rd. ## 368 No. 255, Wanlong St. ## 369 Ln. 70, Sec. 1, Xinrong Rd. & Aly. 26, Ln. 211, Sec. 5, Roosevelt Rd. ## 370 No. 1, Ln. 142, Sec. 6, Roosevelt Rd. ## 371 No. 1, Jingwen St. (Opposite) ## 372 Sec. 6, Roosevelt Rd. & Jinglong St. Intersection (Southeast) ## 373 Jingfu St & Ln. 142, Sec. 6, Roosevelt Rd Intersection. ## 374 No. 96, Aly. 28, Ln. 106, Fuxing Rd. (Opposite) ## 375 Ln. 95, Fuxing Rd & Aly. 28, Ln. 63, Fuxing Rd. (Opposite) ## 376 No. 108, Ln. 203, Sec. 2, Xinglong Rd (Opposite) ## 377 No. 79, Jingfeng St. (Side) ## 378 No. 280, Sec. 6, Roosevelt Rd. ## 379 No. 77, Sec. 4, Tingzhou Rd. ## 380 No. 124, Jinghua St. ## 381 No. 239, Jingxing Rd. ## 382 No. 153, Sec. 2, Zhinan Rd. (Opposite) ## 383 No. 30, Sec. 2, Xinguang Rd. (Opposite) ## 384 No. 18, Ln. 82, Sec. 4, Muzha Rd. (Under The MRT Bridge) ## 385 No. 60, Wanfang Rd. (West) ## 386 Sec. 3, Xinglong Rd./Aly. 8, Ln. 192, Sec. 3, Xinglong Rd. ## 387 No. 114, Sec. 4, Xinhai Rd. ## 388 Ln. 123, Sec. 2, Xinglong Rd./Sec. 2, Xinglong Rd. (Northwest) ## 389 No. 290, Sec. 1, Muzha Rd. ## 390 Shiyuan Rd.(Double number)/ Sec. 1, Muzha Rd. (Northeast) ## 391 No. 44, Hexing St./No. 26, Hexing St. Intersection ## 392 No. 1, Ln. 17, Sec. 1, Muzha Rd. (West) ## 393 No. 64, Zhangxin St. ## 394 Sec. 3, Muxin Rd./Yishou St. (Northwest) ## 395 No. 156, Sec. 2, Muxin Rd. (Yongan Market) ## 396 No. 22, Sec. 2, Zhongshun St. ## 397 Baoyi Rd./Ln. 102, Sec. 3, Muxin Rd. Intersection (Southwest) ## 398 Ln. 26, Laoquan St. Intersection ## 399 No. 220, Sec. 3, Muzha Rd. ## 400 No. 50, Sec. 4, Xinglong Rd. ## 401 No. 49, Ln. 105, Sec. 4, Xinglong Rd. ## 402 No. 30, Ln. 95, Sec. 3, Muxin Rd. (Opposite) ## 403 No. 15, Ln. 299, Sec. 2, Muxin Rd. (Opposite) ## 404 No. 2, Sec. 1, Zhongshun St. ## 405 No. 4, Sec. 3, Zhinan Rd. ## 406 No. 29, Aly. 25, Ln. 87, Sec. 2, Zhongshun St. ## 407 No. 46, Ln. 24, Jiukang St. (Opposite) ## 408 Sec. 1, Xiuming Rd. & Ln. 185, Sec. 1, Xiuming Rd. Intersection ## 409 Ln. 129, Sec. 1, Xiuming Rd. & Sec. 1, Xiuming Rd. Intersection ## 410 Laoquan St. & Hengguang St. Intersection ## 411 No. 105, Jinglong St. (Opposite) ## 412 No. 2, Ln. 115, Sec. 3, Xinglong Rd. ## 413 No. 145, Ln. 304, Sec. 3, Xinglong Rd. ## 414 No. 199, Sec. 4, Xinhai Rd. ## 415 No. 16, Ln. 159, Sec. 4, Muzha Rd. ## 416 No.6, Ln. 16, Wanshou Rd. ## 417 No. 37, Ln. 16, Xianyan Rd. ## 418 No. 19, Zhengda 1st St. (Opposite) ## 419 No. 160-1, Sec. 2, Xinglong Rd. ## 420 No. 306, Sec. 3, Xinglong Rd. ## 421 No. 211, Sec. 3, Xinglong Rd. (Opposite) ## 422 No. 116, Ln. 109, Sec. 4, Muzha Rd. ## 423 Sec. 2, Muxin Rd. & Ln. 22, Yong'an St. Intersection ## 424 Sec. 1, Zhongshun St. & Ln. 310, Sec. 3, Muxin Rd. Intersection ## 425 National Taiwan Normal University Gongguan Campus (Tingzhou Rd.) ## 426 No. 28, Sec. 2, Xinguang Rd. ## 427 NCCU College of Waterfront Elevator ## 428 Aly. 16, Ln. 159, Sec. 4, Muzha Rd. ## 429 No. 10, Sec. 4, Tingzhou Rd. (North) ## 430 Ln. 107, Xizhou St. ## 431 Ln. 4, Sanfu St. & Ln. 46, Jingxing Rd. Intersection ## 432 Jingren St. & Ln. 142, Sec. 6, Roosevelt Rd. Intersection (North) ## 433 NTNU Gongguan Campus (Student Dorm 2) ## 434 Jingzhong St. & Ln. 30, Jingzhong St. Intersection ## 435 No. 114, Sec. 2, Xiuming Rd. ## 436 Ln. 77, Sec. 4, Xinhai Rd. ## 437 Ln. 42, Jingxing Rd. & Jingxing Rd. Intersection (Southwest) ## 438 Aly. 1, Ln. 48, Sec. 3, Muzha Rd. ## 439 No. 14, Ln. 109, Sec. 2, Muzha Rd. ## 440 No. 29, Ln. 59, Sec. 1, Muzha Rd. (Opposite) ## 441 No. 1, Aly. 30, Ln. 26, Sec. 1, Zhongshun St. (Opposite) ## 442 Sec. 1, Wanmei St. & Wan'an St. Intersection ## 443 No. 16, Ln. 203, Sec. 2, Xinglong Rd. ## 444 No. 145, Sec. 1, Xinguang Rd. ## 445 No. 140, Guanghui Rd. (Opposite) ## 446 No. 7, Guanghui Rd. (Opposite) ## 447 No. 11, Ln. 278, Sec. 3, Muxin Rd. (Opposite) ## 448 No. 2, Aly. 1, Ln. 275, Sec. 2, Xinglong Rd. ## 449 No. 56, Sec. 3, Xinglong Rd. ## 450 No. 9, Ln. 8, Zhangxin St. (Opposite) ## 451 No. 26, Xianyan Rd. ## 452 No.75,Sec.4,Muzha Rd. ## 453 Ln. 78, Fuxing Rd. & Aly. 10, Ln. 78, Fuxing Rd.Intersection ## 454 No. 24, Ln. 166, Sec. 4, XinHai Rd. (Opposite) ## 455 No. 88, Sec. 2, XingLong Rd. ## 456 Aly. 9, Ln. 22, Sec. 2, XingLong Rd. & Aly. 6, Ln. 23, JingXing Rd. Intersection ## 457 No.1, Siyuan St. (East) ## 458 Sec. 3, Tingzhou Rd./ Siyuan St. intersection (Southeast) ## 459 No.68, Sec. 4, Roosevelt Rd. ## 460 No.48, Sec. 4, Roosevelt Rd. ## 461 No. 100, Sec. 2, Roosevelt Rd ## 462 No. 168, Sec. 2, Roosevelt Rd ## 463 Sec. 1, Xinhai Rd & Sec. 3, Roosevelt Rd (South) ## 464 Shida Rd & Ln. 11, Jinmen St (Opposite) ## 465 No. 186, Ln. 182, Sec. 2, Tingzhou Rd ## 466 Shuiyuan Rd & Tong'an St Intersection (East) ## 467 No. 126, Sec. 3, Roosevelt Rd ## 468 Shida Rd & Sec. 3, Roosevelt Rd (West) ## 469 No. 2, Sec. 3, Roosevelt Rd Intersection ## 470 Ln. 113, Xiamen St & Guling St. Intersection (West) ## 471 No. 13-1, Sec. 1, Heping W. Rd. ## 472 No. 44, Sec. 2, Roosevelt Rd. ## 473 Sec. 1, Heping W. Rd. & Sec. 2, Nanchang Rd. Intersection (Northwest) ## 474 Sec. 1, Heping W. Rd. & Fuzhou St. Intersection (East) ## 475 No. 136, Nanchang Rd. ## 476 Ln. 6, Sec. 2, Roosevelt Rd. Intersection ## 477 Jinhua St. & Sec. 2, Hangzhou S. Rd. Intersection (Northwest)) ## 478 No. 17, Jinhua St. ## 479 No. 5, Sec. 1, Roosevelt Rd. ## 480 No. 32, Quanzhou St. (Opposite) ## 481 No. 45, Ln. 443, Sec. 2, Zhonghua Rd ## 482 No. 224, Zhao'an St. ## 483 No. 403, Sec. 2, Zhonghua Rd. ## 484 Ln. 305-307, Sec. 2, Zhonghua Rd ## 485 Nanhai Rd & Sec. 2, Heping W. Rd (Southwest) ## 486 No. 2, Juguang Rd. ## 487 No. 11-1, Shuiyuan Rd. ## 488 Ln. 8, Guangzhou St/Guangzhou St Intersection. (Southeast) ## 489 No. 30-2, Aiguo West Rd. ## 490 Guiyang St & Huaining St Intersection (Northeast) ## 491 No. 234-1, Sec. 1, Guiyang St. ## 492 No. 41, Sec. 2, Zhongxiao E. Rd. ## 493 No. 7, Sec. 1, Zhongxiao E. Rd. ## 494 Jinan Rd & Shaoxing S. St Intersection. (Southeast) ## 495 Linsen S. Rd & Section 1, Ren'ai Rd Intersection. (Northwest) ## 496 No. 1, Sec 1, Xinyi Rd. ## 497 No. 21, Sec 1, Xinyi Rd. ## 498 No. 21, Linsen S. Rd. (South) ## 499 Aiguo E. Rd. & Yanping S. Rd Intersection (Northwest) ## 500 No.162, Yanping S. Rd. (Opposite) ## 501 No. 59, Sec. 1, Zhonghua Rd. ## 502 No. 162, Bo'ai Rd. ## 503 No. 130, Sec. 1, Chongqing S. Rd. ## 504 No. 1, Aiguo W. Rd. ## 505 No. 20, Zhongshan S. Rd. ## 506 Jinshan N. Rd & Civic Blvd Intersection. (South) ## 507 No. 33, Sec. 2, Zhonghua Rd. ## 508 Sec. 1, Wuchang St & Yanping South Rd Intersection. ## 509 Sec. 1, Zhonghua Rd & Sec. 1, Hankou St Intersection ## 510 No. 11, Sec. 1, Zhonghua Rd. (Front right) ## 511 No. 1, Changde St. (Gongyuan Rd) ## 512 No. 23, Ln. 230, Sec. 3, Tingzhou Rd. ## 513 Shida Rd. & Shuiyuan Rd. Intersection (Southeast) ## 514 Zhongshan S. Rd. & Xuzhou Rd. (Southeast) ## 515 No. 213, Sec. 2, Sinyi Rd. ## 516 Sec. 1, Civic Blvd. & Sec. 1, Jhongshan N. Rd. Intersection (Northwest) ## 517 Jyuguang Rd. & Dapu St. Intersection (Northeast) ## 518 No. 132, Sec. 2, Jhongsiao E. Rd. (East) ## 519 Sec. 1, Sinsheng N. Rd. & Sec. 3, Civic Blvd. Intersection (West) ## 520 Zhongshan S. Rd & Qingdao E. Rd. Intersection (Northeast) ## 521 MRT C.K.S Memorial Hall Sta. (Exit.5) (West) ## 522 Beiping E. Rd. & Hangzhou N. Rd. Intersection (Northeast) ## 523 No. 265, Sec. 2, Tingzhou Rd. ## 524 No. 148, Sec. 1, Jinshan S. Rd. ## 525 Linsen S. Rd. & Xuzhou Rd. Intersection (Northwest) ## 526 Xuzhou Rd. Sec. 1, Hangzhou S. Rd. Intersection (Northwest) ## 527 MRT C.K.S Memorial Hall Sta.(Exit.6) (North) ## 528 No. 168, Sec. 1, Civic Blvd. ## 529 No. 46, Sec. 1, Zhongshan N. Rd. (North) ## 530 MRT Ximen Sta. (Exit 5) (South) ## 531 No. 21, Gongyuan Rd. (Northwest) ## 532 No. 165, Sec. 1, Chongqing S. Rd. ## 533 No. 8, Sec. 3, Tingzhou Rd. ## 534 Shaoxing S. St. & Xuzhou Rd. Intersection (Southeast) ## 535 Sec. 1, Roosevelt Rd. & Ningbo E. St. Intersection (Southeast) ## 536 No. 16, Siyuan St. (Opposite) ## 537 Sec. 1, Ren'ai Rd. & Linsen S. Rd. Intersection (Northeast) ## 538 Sec. 1, Zhonghua Rd. & Baoqing Rd. Intersection (Southeast) ## 539 No. 31, Sec. 2, Ren'ai Rd. ## 540 No. 72, Sec. 1, Jinshan S. Rd. ## 541 No. 59, Sec. 1, Ren'ai Rd. ## 542 No. 131, Sanyuan St. ## 543 No. 100, Sec. 2, Heping W. Rd. ## 544 No. 45, Sec. 2, Chongqing S. Rd. ## 545 Linsen N. Rd & Beiping E. Rd. Intersection (Northwest) ## 546 No. 30, Beiping E. Rd. (Opposite) ## 547 No. 1, Tianjin St. (Opposite) ## 548 MRT Zhongxiao Xinsheng Sta.(Exit.1) ## 549 No. 56, Sec. 1, Xinsheng S. Rd. ## 550 Gongyuan Rd. & Changde St. Intersection (West) ## 551 No. 8, Zhongshan S. Rd. (Qingdao W. Rd.) ## 552 Linsen S. Rd. & Sec. 1, Jinan Rd. Intersection (Northeast) ## 553 Sec. 1, Ren'ai Rd. & Shaoxing S. St. Intersection (South) ## 554 No. 343, Sec. 2, Zhonghua Rd. ## 555 No. 217, Bo'ai Rd. ## 556 Sec. 1, Zhongxiao E. Rd. & Linsen S. Rd. Intersection ## 557 Sec. 1, Xinyi Rd. (National Concert Hall Northwest) ## 558 No. 100, Sec. 1, Zhongxiao W. Rd. ## 559 No. 6-1, Ln. 8, Sec. 2, Jinan Rd. (Opposite) ## 560 No. 48-4, Sec. 2, Ren'ai Rd. ## 561 No. 10, Ln. 53, Qidong St. ## 562 Sec. 3, Chongqing S. Rd. & Zhao'an St. Intersection ## 563 No. 4, Ln. 65, Sec. 2, Ren'ai Rd. (Opposite) ## 564 No. 10, Sec. 1, Roosevelt Rd. ## 565 No. 135, Sec. 2, Tingzhou Rd. (Opposite) ## 566 No. 110, Sec. 1, Heping W. Rd. ## 567 No. 15, Quanzhou St. (Opposite) ## 568 No. 81, Sanyuan St. ## 569 No. 110, Sec. 2, Ren'ai Rd. ## 570 No. 55, Sec. 2, Jinan Rd. ## 571 No. 232, Sec. 1, Tingzhou Rd. (Opposite) ## 572 Tongbei /Ln. 65, Tongbei St. Intersection ## 573 Bei'an Rd./Ln. 77, Bei'an Rd. Intersection ## 574 No. 382, Tiding Blvd. ## 575 No. 2, Aly. 2, Ln. 146, Tongbei St. (Opposite) ## 576 Chongshi/Ln. 62, Dajhih St. Intersection ## 577 Lequn 2nd/Mingshui Rd. Intersection ## 578 No. 676, Bei'an Rd. ## 579 No. 11, Jingye 3rd Rd. (Opposite) ## 580 No. 155, Jingye 3rd Rd. ## 581 No. 186, Lecyun 2nd Rd. ## 582 No. 536, Bei'an Rd. ## 583 No. 36-9, Sec. 1, Fuxing S. Rd. ## 584 No. 189, Sec. 3, Nanjing E. Rd. (Opposite) ## 585 Yitong St. & Sec. 2, Chang'an E Rd. Intersection (Southwest) ## 586 Sec.1, Xinsheng N. Rd. & Sec. 2, Chang'an E Rd. Intersection (North) ## 587 Sec. 2, Civic Blvd. & Linsen N Rd. Intersection (NorthEast) ## 588 Sec.1, Xinsheng N. Rd. & Sec. 1, Nanjing E. Rd. Intersection (Under Bridge) ## 589 Yijiang St. & Ln. 132, Songjiang Rd. Intersection (Northwest) ## 590 Songjiang Rd. & Ln. 84, Songjiang Rd. Intersection (Northwest) ## 591 Sec. 2, Xinsheng N. Rd. & Ln. 68 Intersection (Under Bridge) ## 592 No. 18, Aly. 2, Ln. 410, Minzu E Rd. (East) ## 593 Sec. 3, Minsheng E Rd. & Sec. 2, Jianguo N Rd. Intersection ## 594 No. 53-4, Xing'an St. (Opposite) ## 595 No. 386, Fuxing N Rd. (South) ## 596 No. 287, Long Jiang Rd. ## 597 Jianguo N Rd. & Changchun Rd. Intersection (South) ## 598 Sec. 2, Nanjing E Rd. & Sec. 2, Jianguo N Rd. Intersection (North) ## 599 No. 119, Songjiang Rd. ## 600 No. 15, Long Jiang Rd. ## 601 No. 22, Ln. 170, Songjiang Rd, (Opposite) ## 602 Civic Blvd. & Ln. 52, Sec. 1, Chang'an E Rd. Intersection ## 603 Ln. 17, Sec. 1, Jianguo N. Rd. & Ln. 137, Sec. 2, Bade Rd. Intersection ## 604 No. 186, Hejiang St. (Opposite) ## 605 Sec. 3, Minquan E. Rd. & Long Jiang Rd. Intersection (Southeast) ## 606 MRT Zhongshan Elementary School Sta. (Exit 2) (Back) ## 607 No. 261, Songjiang Rd. ## 608 No. 582, Linsen N. Rd. ## 609 Sec. 1, Minquan E. Rd. & Ln. 71, Sec. 1, Minquan E. Rd. Intersection ## 610 No. 12-1, Nong'an St. ## 611 No. 76, Sec. 3, Xinsheng N. Rd. (Opposite) ## 612 No. 17, Minzu E. Rd. ## 613 Taipei EXPO Park Yuanshan Gate 5 ## 614 No. 54, Sec. 3, Zhongshan N. Rd. ## 615 Sec. 1, Xinsheng N. Rd. & Ln. 107, Linsen N. Rd. (Under Xinsheng Elevated Bridge) ## 616 No. 86, Sec. 1, Nanjing E. Rd. ## 617 Ln. 108, Jilin Rd. & Ln.21 , Sec. 2, Nanjing E. Rd. Intersection (Southeast) ## 618 Ln. 45, Sec. 2, Xinsheng N. Rd. (Zhongyuan Park West) ## 619 No. 4, Aly. 13, Ln. 512, Minzu E. Rd. ## 620 No. 5, Aly. 2, Ln. 488, Fuxing N. Rd. (Opposite) ## 621 No. 77, Wuchang St. (Opposite) ## 622 Sec. 3, Minquan E. Rd. & Sec. 3, Jianguo N. Rd. Intersection (Northeast) ## 623 No. 433, Songjiang Rd. ## 624 No. 22, Ln. 170, Dehuei St. (Opposite) ## 625 No. 401, Jilin Rd ## 626 Minzu E. Rd. & Songjiang Rd. Intersection (Northwest) ## 627 No. 5, Binjiang St. (Opposite) ## 628 Ln. 128, Sec. 2, Jhongshan N. Rd. ## 629 No. 54, Weishuei Rd. (Opposite) ## 630 No. 4, Nanjing W. Rd. ## 631 No. 2, Sec. 3, Jhongshan N. Rd. (Opposite) ## 632 Minzu E. Rd & Jilin Rd. Intersection (Northwest) ## 633 No. 230, Songjiang Rd. ## 634 No. 29, Changchun Rd. ## 635 Jianguo N. Rd. & Nong'an St. Intersection ## 636 Ln. 77, Songjiang Rd. ## 637 Sec. 1, Jianguo N. Rd. & Sec. 2, Chang'an E. Rd. Intersection (North) ## 638 No. 36, Sec. 1, Xinsheng N. Rd. ## 639 No. 51, Sec. 2, Minquan E. Rd. ## 640 No. 25, Sec. 3, Zhongshan N. Rd. ## 641 No. 7, Ln. 48, Sec. 2, Zhongshan N. Rd ## 642 No. 11, Ln. 188, Songjiang Rd. (Opposite) ## 643 No. 125, Jilin Rd. ## 644 No. 33, Sec. 2, Minsheng E. Rd. ## 645 No. 67, Sec. 3, Minsheng E. Rd. ## 646 No. 174, Jinzhou St. ## 647 No. 59-3, Sec. 2, Zhongshan N. Rd. ## 648 Ln. 23, Sec. 1, Minsheng E. Rd. & Ln. 27, Sec. 1, Minsheng E. Rd. Intersection ## 649 No. 100, Sec. 2, Xinsheng N. Rd. ## 650 Ln. 199, Binjiang St. ## 651 Ln. 154, Binjiang St. (Opposite) ## 652 No. 336, Minzu E. Rd. ## 653 No. 60, Xing'an St. (Opposite) ## 654 No. 66, Ln. 514, Fuxing N. Rd. ## 655 No. 113-133, Sec. 2, Zhongshan N. Rd. ## 656 Zhifu Rd. & Lequn 3rd Rd. Intersection (Northwest) ## 657 Ln. 13, Jinzhou St. & Ln. 137, Sec. 2, Zhongshan N. Rd. Intersection (Southeast) ## 658 No. 178-1, Sec. 2, Nanjing E. Rd. ## 659 No. 121, Sec. 3, Nanjing E. Rd. ## 660 No. 1-7, Ln. 41, Fushun St. ## 661 No. 28, Dazhi St. (Opposite) ## 662 No. 535-2, Bei'an Rd. ## 663 No.109, Songjiang Rd. ## 664 Ln. 177, Jingye 3rd Rd. (South) ## 665 No. 134, Sec. 2, Minquan E. Rd. ## 666 No. 208, Songjiang Rd. ## 667 No. 100, Jilin Rd. (Opposite) ## 668 No. 120, Changchun Rd. ## 669 No. 135, Changchun Rd. ## 670 No. 101, Sec. 2, Nanjing E. Rd. ## 671 No. 85, Sec. 2, Nanjing E. Rd. ## 672 No. 158, Songjiang Rd. ## 673 No. 301, Bei'an Rd. ## 674 Minzu W. Rd. & Yumen St. Intersection (Northeast) ## 675 Sec. 3, Xinsheng N. Rd. & Nong'an St. Intersection ## 676 Ln. 77, Nong'an St. & Aly. 1, Ln. 77, Nong'an St. Intersection ## 677 No. 52-1, Aly. 41, Ln. 458, Bei'an Rd. ## 678 Lequn 2nd Rd. & Mingshui Rd. Intersection (East) ## 679 No. 46, Sec. 2, Minquan E. Rd. ## 680 Changchun Rd. & Longjiang Rd. Intersection (Northwest) ## 681 Sec. 1, Minquan E. Rd. & Sec. 3, Xinsheng N. Rd. Intersection (North) ## 682 Jianguo N. Rd. & Changchun Rd. Intersection (North) ## 683 Songjiang Rd. & Nong'an St. Intersection ## 684 Sec. 3, Zhongshan N. Rd. (Pavilion of New Fashion) ## 685 No. 143, Tongbei St. ## 686 No. 99, Ln. 266, Lequn 2nd Rd. ## 687 Linsen N. Rd. & Sec. 1, Nanjing E. Rd. Intersection ## 688 Ln. 30, Lequn 2nd Rd. & Aly. 61, Ln. 116, Lequn 2nd Rd. Intersection ## 689 Ln. 109, Sec. 3, Nanjing E. Rd. & Ln. 120, Longjiang Rd. Intersection ## 690 Sec. 3, Xinsheng N. Rd. & Minzu E. Rd. Intersection (Southwest) ## 691 MRT Nanjing Fuxing Sta.(Exit.1) (Ln. 155, Liaoning St.) ## 692 Sec. 1, Jianguo S. Rd. & Civic Blvd. Intersection (North) ## 693 Longjiang Rd. & Zhulun St. Intersection (Northwest) ## 694 Ln. 94, Dazhi St. ## 695 No. 221, Sec. 3, Nanjing E. Rd. ## 696 Sec. 3, Minquan E. Rd. & Sec. 2, Jianguo N. Rd. (Under Elevated Bridge) ## 697 No. 11, Dehui St. (East) ## 698 Sec. 3, Xinsheng N. Rd. & Binjiang St. Intersection (Southeast) ## 699 No. 64, Sec. 1, Xinsheng N. Rd. (Opposite) ## 700 No. 39-2, Sec. 2, Xinsheng N. Rd. (Opposite) ## 701 Ln. 807, Bei'an Rd. ## 702 Jingye 3rd Rd. & Lequn 3rd Rd. Intersection ## 703 No. 6, Ln. 258, Changchun Rd. (North) ## 704 No. 13, Ln. 201, Liaoning St. ## 705 Sec. 3, Jianguo N. Rd. & Wuchang St. Intersection ## 706 No. 66, Sec. 2, Zhongshan N. Rd. ## 707 No. 179, Sec. 3, Civic Blvd. ## 708 Sec. 2, Civic Blvd. & Ln. 5, Sec. 2, Civic Blvd. Intersection ## 709 No. 1, Nanjing W. Rd. ## 710 Jianguo N. Rd. Parking Lot (G) ## 711 No. 42, Ln. 45, Longjiang Rd. ## 712 No. 56, Fuxing N. Rd. ## 713 No. 316, Songjiang Rd. ## 714 Sec. 3, Jianguo N. Rd. & Ln. 86, Sec. 3, Jianguo N. Rd. Intersection ## 715 Ln. 56, Sec. 1, Chang'an E. Rd. & Sec. 1, Chang'an E. Rd. Intersection ## 716 No. 148, Songjiang Rd. ## 717 No. 3, Ln. 246, Sec. 2, Tiding Blvd. ## 718 BeiAn Rd. & TongBei St. Intersection (Northeast) ## 719 No. 69, Sec. 3, MinQuan E. Rd. ## 720 No. 167, ChangChun Rd. ## 721 BeiAn Rd. & MingShui Rd. Intersection (Bus Station:ZiQiang Tunnel) ## 722 No. 6-10, Aly. 118, Ln. 21, Wunhu St. ## 723 No. 66-72, Sec. 1, Neihu Rd. ## 724 No. 37, Jihu Rd. ## 725 No. 225, Sec 1, Neihu Rd. ## 726 Ln. 21, Wunhu St. ## 727 No. 10, Ln. 81, Wenhu St.(West) ## 728 No. 56, Sec. 1, Huanshan Rd.(South) ## 729 Ln. 411, Sec. 1, Neihu Rd.(East) ## 730 No. 141, Sec. 2, Huanshan Rd.(North) ## 731 No. 81, Sec. 2, Huanshan Rd.(Northwest) ## 732 Dahu Shanzhuang St & Ln. 176, Dahu Shanzhuang St. (Southeast) ## 733 No. 3, Aly. 49, Ln. 113, Donghu Rd. (North) ## 734 No. 13, Aly. 95, Ln. 113, Donghu Rd. (West) ## 735 No. 2, Ln. 221, Gangqian Rd. ## 736 No. 271, Ruiguang Rd. (Southeast) ## 737 No. 5, Sec. 5, Chenggong Rd. (East) ## 738 No. 116, Sec. 1, Kangning Rd. ## 739 No. 47, Xingyun St. (South) ## 740 Ln. 9, Sec. 1, Huanshan Rd ## 741 No. 291, Sec. 1, Neihu Rd. (Opposite) ## 742 No. 500, Ruiguang Rd. (Opposite) ## 743 No. 57, Ganghua St. (Opposite) ## 744 Sec. 2, Huanshan Rd & Ln. 26, Sec. 2, Huanshan Rd (Southwest) ## 745 No. 188, Sec. 4, Chenggong Rd. ## 746 No. 28, Ln. 60, Sec. 3, Neihu Rd. (East) ## 747 No. 203-8, Jinlong Rd. (North) ## 748 No. 212, Wende Rd. ## 749 Yangguang St & Ln. 220, Wende Rd Intersection ## 750 Aly. 102, Ln. 68, Yangguang St & Yangguang St Intersection ## 751 No. 12, Ln. 210, Wende Rd. (Opposite) ## 752 No. 6, Ln. 22, Wende Rd. (Opposite) ## 753 Ln. 22, Wende Rd & No. 1, Aly. 74, Ln. 22, Wende Rd Intersection ## 754 No. 213, Tanmei St. (South) ## 755 No. 180, Sec. 6, Nanjing E. Rd. (North) ## 756 No. 179, Xingshan Rd. (South) ## 757 No. 343, Xinming Rd. (North) ## 758 No. 139, Tanmei St. ## 759 No. 99, Sec. 6, Minquan E. Rd. ## 760 No. 22-1, Aly. 73, Ln. 61, Kangle St. (South) ## 761 No. 22, Aly. 24, Ln. 32, Ankang Rd. ## 762 No. 27, Shitan Rd. (South) ## 763 No. 382, Sec. 6, Nanjing E. Rd. (Southwest) ## 764 No. 22, Xinming Rd. ## 765 No. 50, Sec. 6, Minquan E. Rd. ## 766 No. 160, Ruiguang Rd. ## 767 No. 29, Ln. 15, Sec. 6, Minquan E. Rd. ## 768 No. 30, Sec. 6, Minquan E. Rd. ## 769 No. 36, Xinhu 3rd Rd. ## 770 No. 125, Sec. 6, Nanjing E. Rd. (South) ## 771 No. 27, Tanmei St. (West) ## 772 No. 424, Sec. 2, Chenggong Rd. (Opposite) ## 773 Sec. 6, Minquan E. Rd. / Ln. 180, Sec. 6, Minquan E. Rd. (Southwest) ## 774 No. 208, Sec. 6, Minquan E. Rd. ## 775 No. 39, Sec. 3, Kangning Rd. (Opposite) ## 776 No. 11, Ln. 363, Jinhu Rd. (Opposite) ## 777 No. 1, Aly. 125, Ln. 347, Jinhu Rd. (Opposite) ## 778 Sec. 2, Neihu Rd. / Ln. 103, Sec. 2, Neihu Rd. (Northeast) ## 779 No. 76, Ln. 103, Sec. 2, Neihu Rd. (Opposite) ## 780 No. 17, Aly. 48, Ln. 179, Sec. 2, Neihu Rd. ## 781 No. 334, Sec. 2, Neihu Rd. ## 782 No. 2, Aly. 6, Ln. 167, Sec. 4, Chenggong Rd. ## 783 No. 273, Sec. 1, Kangning Rd. (Opposite) ## 784 Ln. 156, Sec. 1, Kangning Rd. / Aly. 20, Ln. 156, Sec. 1, Kangning Rd. (West) ## 785 No. 31, Ln. 14, Wufen St. (Opposite) ## 786 No. 3, Ln. 83, Antai St. (Opposite) ## 787 No. 236-3, Kangle St. ## 788 No. 520, Sec. 1, Neihu Rd. ## 789 No. 4, Ln. 125, Kangle St. (Opposite) ## 790 No. 28, Ankang Rd. (Northwest) ## 791 No. 290, Ankang Rd. (West) ## 792 No. 60, Sec. 3, Kangning Rd. (South) ## 793 No. 54-5, Sec. 3, Kangning Rd. (West) ## 794 No. 39, Xingshan Rd. ## 795 No. 122, Sec. 6, Nanjing E. Rd. ((Front right)) ## 796 Ln. 206, Sec. 6, Minquan E. Rd. & Aly. 75, Ln. 190, Sec. 6, Minquan E. Rd. (Northwest) ## 797 No. 247, Sec. 6, Minquan E. Rd. ## 798 Donghu Rd.& Ln. 113, Donghu Rd. Intersection (East) ## 799 Ln. 182, Sec. 4, Chenggong Rd. & Sec. 4, Chenggong Rd. Intersection (West) ## 800 No. 185, Gangcian Rd. ## 801 No. 101, Rueihu St. (Opposite) ## 802 Ln. 112, Jinlong Rd. ## 803 No. 12, Ln. 138, Xingyun St. ## 804 No. 13, Aly. 163, Ln. 189, Sec. 3, Kangning Rd. (Southeast) ## 805 No. 70, Aly. 39, Ln. 99, Sec. 3, Kangning Rd. (Southeast) ## 806 No. 17, Ln. 420, Sec. 5, Chenggong Rd. (East) ## 807 No. 215, Sec. 1, Tiding Blvd. ## 808 No. 189, Sec. 2, Chenggong Rd. (North) ## 809 No. 179, Xingshan Rd. ## 810 Xinhu 2nd Rd. & Ln. 250, Xinhu 2nd Rd. Intersection (Southwest) ## 811 No. 6, Ln. 41, Sec. 4, Chenggong Rd. ## 812 No. 83, Jinhu Rd. (Opposite) ## 813 No. 161, Sec. 6, Minquan E. Rd. ## 814 No. 15, Aly. 117, Ln. 190, Sec. 6, Minquan E. Rd. ## 815 No. 12, Zhouzi St. ## 816 No. 25-6, Aly. 68, Ln. 21, Wenhu St. (North) ## 817 No. 242, Ln. 179, Sec. 2, Neihu Rd. (Opposite) ## 818 No. 243, Xingshan Rd. ## 819 No. 88, Minshan St. ## 820 No. 181, Anmei St. ## 821 No. 14, Ln. 161, Yangguang St. (Opposite) ## 822 No. 366, Sec. 6, Nanjing E. Rd. (Opposite) ## 823 Ln. 60, Wenhu St. & Ln. 24, Sec. 1, Huanshan Rd. Intersection (North) ## 824 No. 6, Ln. 47, Sec. 6, Minquan E. Rd. (Opposite) ## 825 No. 102, Ruiguang Rd. ## 826 Ln. 315, Ankang Rd. & Ln. 14, Wufen St. Intersection (West) ## 827 Sec. 6, Minquan E. Rd. & Aly. 31, Ln. 320, Sec. 2, Chenggong Rd. Intersection (Southeast) ## 828 No. 15, Ln. 72, Sec. 3, Neihu Rd. (West) ## 829 No. 409, Sec. 6, Minquan E. Rd. ## 830 No. 353, Ruiguang Rd. (Ruiguang Rd.) ## 831 No. 353, Ruiguang Rd. (Gangqian Rd.) ## 832 Ln. 151, Kangle St. & Kangle St. Intersection ## 833 No. 358, Sec. 1, Neihu Rd. ## 834 No. 83, Sec. 3, Chenggong Rd. ## 835 Ln. 47, Sec. 1, Neihu Rd. & Aly. 22, Ln. 47, Sec. 1, Neihu Rd. Intersection ## 836 Yangguang St. & Sec. 2, Jiuzong Rd. Intersection ## 837 Aly. 95, Ln. 113, Donghu Rd. & Ln. 75, Sec. 3, Kangning Rd. Intersection ## 838 Aly. 23, Ln. 250, Sec. 2, Chenggong Rd. & Ln. 312, Sec. 2, Chenggong Rd. Intersection ## 839 Antai St.(Kangle Bridge) ## 840 Ln. 191, Kangle St. & Kangle St. Intersection ## 841 No. 663, Sec. 1, Neihu Rd. ## 842 No. 92, Ln. 333, Xingshan Rd. ## 843 No. 27, Ln. 383, Xingshan Rd. (Opposite) ## 844 Sec. 1, Jiuzong Rd. & Xinhu 3rd Rd. Intersection (South) ## 845 Sec. 2, Jiuzong Rd. & Ln. 11, Sec. 6, Minquan E. Rd. Intersection ## 846 Ln. 326, Sec. 3, Neihu Rd. & Sec. 3, Neihu Rd. Intersection ## 847 Ln. 223, Sec. 4, Chenggong Rd. & Aly. 6, Ln. 223, Sec. 4, Chenggong Rd. Intersection ## 848 Ln. 189, Sec. 3, Kangning Rd. & Aly. 93, Ln. 189, Sec. 3, Kangning Rd. Intersection ## 849 No. 368, Sec. 2, Neihu Rd. (Opposite) ## 850 No. 23, Ln. 160, Donghu Rd. ## 851 Sec. 3, Huanshan Rd. & Ln. 16, Sec. 3, Huanshan Rd. Intersection (Southeast) ## 852 No. 91, Wende Rd. ## 853 No. 28, Xinhu 3rd Rd. ## 854 Xing'ai Rd. & Xinhu 1st Rd. Intersection (Southwest) ## 855 No. 19, Ln. 99, Sec. 3, Kangning Rd. (Opposite) ## 856 No. 405, Sec. 2, Tiding Blvd. ## 857 No. 473, Sec. 2, Tiding Blvd. ## 858 No. 669, Ruiguang Rd. ## 859 No. 290, Sec. 1, Neihu Rd. ## 860 No. 25, Ln. 11, Sec. 6, Minquan E. Rd. (Opposite) ## 861 Aly. 15, Sec. 6, Minquan E. Rd. & Aly. 19, Sec. 6, Minquan E. Rd. Intersection ## 862 No. 323, Yangguang St. ## 863 No. 423, Yangguang St. ## 864 Ruiguang Rd. & Ln. 358, Ruiguang Rd. Intersection ## 865 Zhouzi St. & Ln. 393, Ruiguang Rd. Intersection ## 866 No. 396, Sec. 1, Neihu Rd. ## 867 No. 7, Ln. 56, Sec. 6, Minquan E. Rd. (Opposite) ## 868 No. 122、124, Xinhu 3rd Rd. (Opposite) ## 869 No. 122、124, Xinhu 3rd Rd. (Opposite) ## 870 Sec. 1, Jiuzong Rd. & Xinhu 2nd Rd. Intersection (South) ## 871 No. 12, Jihu Rd. ## 872 No. 8, Aly. 15, Ln. 120, Sec. 1, Neihu Rd. (Opposite) ## 873 No. 501, Sec. 2, Tiding Blvd. ## 874 No. 61, Zhouzi St. ## 875 No. 21, Ln. 110, Kangle St. (Opposite) ## 876 No. 17-19, Ln. 360, Sec. 1, Neihu Rd. ## 877 No. 156, Xingyun St. ## 878 No. 289, Sec. 1, Neihu Rd. ## 879 No. 537, Tanmei St. ## 880 No. 16, Ln. 91, Sec. 1, Neihu Rd. (Opposite) ## 881 No. 35, Ln. 316, Ruiguang Rd. ## 882 WenDe Rd. & Ln. 220, WenDe Rd. Intersection (Southwest) ## 883 No. 38, AnMei St. ## 884 No. 6, Ln. 16, Sec. 3, KangNing Rd. (Opposite) ## 885 No. 25-35, Ln. 201, KangLe St. ## 886 No. 15, Sec. 3, HuanShan Rd. (Opposite) ## 887 No. 482, Sec. 6, NanJing E. Rd. ## 888 No. 306-308, Chengde Rd. (Front) ## 889 No. 271, Zhoumei St. (Front) ## 890 No. 212, Mingde Rd. (Ronghua 2nd Rd. Side) ## 891 Sec.1, Xi'an St. & Mingde Rd. (Southeast) ## 892 No. 214-216, Wenlin N. Rd. (Front) ## 893 No, 2, Ln. 10, Xingyi Rd. (Side) ## 894 No. 360, Zhixing Rd. ## 895 No. 68, Guandu Rd. (Opposite) ## 896 No. 7, Ln. 235, Zhixing Rd. (Opposite) ## 897 No. 262, Sec. 4, Zhongyang N. Rd. (Opposite) ## 898 Ln. 270, Sec. 3, Dadu Rd. & Ln. 55, Ligong St. (Southwest) ## 899 Ln. 583, Sec. 4, Zhongyang N. Rd. Intersection ## 900 No. 529, Sec. 4, Zhongyang N. Rd. (Opposite) ## 901 Sec. 3, Dadu Rd. & Lide Rd. Intersection (Northwest) ## 902 No. 9-1, Sec. 3, Zhongyang N. Rd. (Opposite) ## 903 No. 185, Sec. 3, Zhongyang N. Rd. ## 904 No. 259, Daye Rd. (Opposite) ## 905 Daoxiang & Chongshan Rd. Intersection ## 906 No. 167, Sec. 2, Zhongyang N. Rd. (Opposite) ## 907 No. 50, Xiushan Rd. ## 908 No. 671, Daye Rd. (Opposite) ## 909 No. 10, Zhonghe St. (Opposite) ## 910 No. 3, Ln. 2, Guangming Rd. (Opposite) ## 911 No. 486, Sec. 2, Sanhe St. ## 912 No. 20, Sec. 1, Beitou Rd. ## 913 No. 198, Gongguan Rd. (Opposite) ## 914 No. 302, Daye Rd. ## 915 Sec. 7, Chengde Rd. & Jili St. (Northwest) ## 916 No. 119, Sec. 1, Sanhe St. ## 917 No. 345, Sec. 2, Xi'an St. (Opposite) ## 918 No. 100, Ln. 39, Sec. 1, Shipai Rd. ## 919 No. 136, Sec. 2, Donghua St. (Opposite) ## 920 No. 526, Sec. 1, Donghua St. (Opposite) ## 921 No. 100, Sec. 2, Shipai Rd. ## 922 No. 319, Sec. 1, Shipai Rd. (Opposite) ## 923 No. 365, Mingde Rd. ## 924 No. 142, Sec. 1, Shipai Rd. (Opposite) ## 925 No. 109, Tianmu W. Rd. (Opposite) ## 926 No. 201, Sec. 1, Linong St. (Opposite) ## 927 No. 260, Sec. 7, Chengde Rd. ## 928 No. 8, Ln. 61, Ziqiang St. ## 929 No. 2, Ronghua 3rd Rd. ## 930 No. 77, Wenlin N. Rd. ## 931 No.15, Lide Rd. (Front) ## 932 No. 32, Sec.4, Zhongyang Rd. (Side) ## 933 Parking lot at the back of the NYCU Library ## 934 No. 225, Guangming Rd. (Opposite) ## 935 No. 61, Zhonghe St. ## 936 Sec. 7, Chengde Rd. & Sec. 1, Shipai Rd. Intersection (North) ## 937 No. 192-198, Sec. 7, Chengde Rd. ## 938 No. 95, Mingde Rd. ## 939 No. 145, Dasing St. ## 940 No. 199, Fumei Rd. ## 941 No. 6-8, Aly. 11, Ln. 455, Zhonghe St. ## 942 Zhoumei Xianzaigang Park(Southwest) ## 943 No. 3, Xinglin 1st Rd. ## 944 Zhuhai Rd. & Fuxing 1st Rd. Intersection (East) ## 945 Ln. 33, Yumin 2nd Rd. & Yumin 6th Rd. Intersection (Northwest) ## 946 No. 269-271, Huanggang Rd. ## 947 No. 145, Zhuhai Rd. (Opposite) ## 948 No. 16, Ln. 79, Sec. 1, Sanhe St. (Opposite) ## 949 No. 185, Sec. 2, Shipai Rd. (Opposite) ## 950 Huanggang Rd. & Ln. 177, Qingjiang Rd. Intersection (East) ## 951 No. 280, Wenlin N. Rd. (Opposite) ## 952 No. 1, Zhuhai Rd. ## 953 No. 259, Daye Rd. (Opposite) ## 954 No. 148, Guangming Rd. (Opposite) ## 955 No. 125, Lide Rd. ## 956 No. 26, Xiushan Rd. ## 957 No. 6, Zhongshan Rd. ## 958 No. 2, Aly. 9, Ln. 493, Zhonghe St. (Opposite) ## 959 Ln. 2, Guangming Rd. & Guangming Rd. Intersection ## 960 Sec. 2, Shipai Rd. & Sec. 2, Linong St. Intersection ## 961 Qilian Station 1(Donghua). (Opposite) ## 962 Daxing St. & Ln. 2, Guangming Rd. Intersection ## 963 MRT Zhongyi Sta. (Exit. 2) ## 964 No. 80, Sec. 6, Chengde Rd. ## 965 MRT Beitou Sta. (Exit 1) ( Beitou Rd.) ## 966 No. 120, Sec. 6, Chengde Rd. ## 967 No. 43, Ln. 255, Gongguan Rd. (Opposite) ## 968 No. 2, Wenhua 3rd Rd. ## 969 No. 365, Zhonghe St. ## 970 Daye Rd. & Ln. 65, Daye Rd. Intersection ## 971 No. 390, Sec. 7, Chengde Rd. ## 972 No. 112, Wenlin N. Rd. ## 973 Ln. 32, Sec. 1, Yongxing Rd. & Sec. 1, Yongxing Rd. Intersection ## 974 No. 16, Ln. 210, ZhiXing Rd. (Opposite) ## 975 No. 76, LiGong St. (Opposite) ## 976 No. 200, Ln. 401, Sec. 7, ChengDe Rd. (Opposite) ## 977 No. 6, DaYe Rd. ## 978 No. 742, Sec. 4, Bade Rd. ## 979 No. 2, Tayou Rd. ## 980 No. 399, Jiankang Rd. (North) ## 981 No. 9, Ln. 91, Sec. 4, Bade Rd. (Opposite) ## 982 No. 156, Sec. 5, Nanjing E. Rd. ## 983 MRT Nanjing Sanmin Sta. (Exit 1) ## 984 No. 13, Guangfu N Rd. ## 985 No. 229, Sec. 5, Nanjing E. Rd. ## 986 No. 5, Aly. 5, Ln. 325, Jiankang Rd. ## 987 No. 119, Sec. 3, Minquan E. Rd. ## 988 No. 712, Minzu E. Rd. (Opposite) ## 989 No. 43, Ln. 244, Dunhua N. Rd. (Opposite) ## 990 No. 216, Dunhua N. Rd. (Opposite) ## 991 No. 432, Changchun Rd. (Opposite) ## 992 No. 1, Ln. 166, Sanmin Rd. (Opposite) ## 993 No.163-1, Sec. 5, Minsheng E. Rd. ## 994 No.6, Sec. 4, Nanjing E. Rd. ## 995 No. 25, Sec. 3, Bade Rd. ## 996 No. 15, Ln. 199, Dunhua N. Rd. ## 997 Dunhua N. Rd. & Ln. 77, Fujin St. (Southeast) ## 998 Sec. 4, Minquan E Rd. & Xinzhong St. Intersection (Southwest) ## 999 Sec. 5, Minsheng E Rd. & Tayou Rd. Intersection (Southwest) ## 1000 No. 266, Guangfu N. Rd. ## 1001 No. 339, Fuyuan St. ## 1002 No. 95, Ln. 74, Sec. 3, Bade Rd. (South) ## 1003 No. 123, Sec. 4, Civic Blvd. ## 1004 Guangfu N. Rd. & Ln. 190, Guangfu N. Rd. Intersection (Southeast) ## 1005 Ln. 356, Yanshou St. & Aly. 16, Ln. 330, Yanshou St. Intersection (Northeast) ## 1006 No. 305, Jiankang Rd. ## 1007 Sec. 4, Minquan E. Rd. & Guangfu N. Rd. Intersection (Northeast) ## 1008 No. 33, Dongxing Rd. (South) ## 1009 No. 19, Guangfu S. Rd. (West) ## 1010 No.11, Ln. 58, Guangfu S. Rd. (East) ## 1011 No. 78, Jiankang Rd. (Opposite) ## 1012 No.342, Sec. 2, Bade Rd. ## 1013 No. 186, Sec. 4, Nanjing E. Rd. ## 1014 No. 84, Sec. 5, Minsheng E. Rd. ## 1015 No. 179, Jiankang Rd. ## 1016 No. 1, Ln. 43, Sanmin Rd. ## 1017 Ln. 106, Sec. 4, Bade Rd. & Aly. 6, Ln. 106, Sec. 4, Bade Rd. Intersection (East) ## 1018 No. 73, Sec. 4, Civic Blvd. ## 1019 No. 1, Qingcheng St. (Southeast) ## 1020 No. 262, Sec. 3, Nanjing E. Rd. ## 1021 No. 41-1, Sec. 5, Minquan E. Rd. ## 1022 Dunhua N. Rd. & Sec. 3, Bade Rd. Intersection (Northeast) ## 1023 No. 75-1, Sec. 4, Nanjing E. Rd. ## 1024 No. 112, Dunhua N. Rd. ## 1025 No. 182, Songhe St. (Opposite) ## 1026 No. 685, Sec. 4, Bade Rd. ## 1027 No. 102, Sec. 3, Minquan E. Rd. ## 1028 No. 57, Sec. 5, Nanjing E. Rd. ## 1029 Tayou Rd. & Ln. 261, Fuyuan St. (West) ## 1030 Baoqing St. & Ln. 30, Baoqing St. Intersection (North) ## 1031 Jiankang Rd. & Aly. 50, Ln. 251, Sec. 5, Nanjing E. Rd. Intersection (West) ## 1032 No. 174, Jiankang Rd. ## 1033 No. 62, Ln. 106, Sec. 3, Bade Rd. (Opposite) ## 1034 No. 163, Sec. 4, Nanjing E. Rd. ## 1035 No. 25, Sec. 3, Bade Rd. ## 1036 Ln. 325, Jiankang Rd. & Aly. 12, Ln. 325, Jiankang Rd. Intersection (Northeast) ## 1037 Sec. 5, Nanjing E. Rd. & Dongxing Rd. Intersection (North) ## 1038 Songshan Rd. & Sec. 6, Civic Blvd. Intersection ## 1039 Ln. 36, Sec. 5, Minsheng E. Rd. & Ln. 165, Guangfu N. Rd. Intersection ## 1040 Dunhua N. Rd. & Sec. 4, Nanjing E. Rd. Intersection ## 1041 Sec. 1, Dunhua S. Rd. & Sec. 2, Bade Rd. Intersection (Southwest) ## 1042 Sanmin Rd. & Ln. 51, Xindong St. Intersection (East) ## 1043 Bade Rd. & Songxin Rd. Intersection (Southwest) ## 1044 No. 431, Changchun Rd. ## 1045 No. 650, Sec. 4, Bade Rd. (South) ## 1046 No. 711, Sec. 4, Bade Rd. ## 1047 No. 12, Sec. 4, Nanjing E. Rd. ## 1048 Sec. 4, Nanjing E. Rd. & Jiankang Rd. Intersection (Northwest) ## 1049 No. 151, Dunhua N. Rd. ## 1050 Sec. 3, Minsheng E. Rd. & Fuxing N. Rd. Intersection (Southeast) ## 1051 Civic Blvd. & Yanji St. Intersection (Under Bridge) ## 1052 No. 35, Ln. 190, Guangfu N. Rd. (Opposite) ## 1053 MRT Nanjing Sanmin Sta. (Exit 3) ## 1054 No. 386, Sec. 5, Nanjing E. Rd. ## 1055 No. 8, Ln. 370, Wuchang St. ## 1056 Ln. 119, Yanshou St. & Yanshou St. ## 1057 No. 111, Sec. 5, Civic Blvd. ## 1058 No. 630, Minzu E. Rd. (Opposite) ## 1059 No. 27, Ln. 390, Fuyuan St. (Opposite) ## 1060 No. 191, Sec. 5, Minsheng E. Rd. ## 1061 No. 211, Sec. 3, Minquan E. Rd. ## 1062 No. 1, Ln. 170, Dongxin St. Southwest) ## 1063 No. 383, Fude St. (North) ## 1064 No. 403, Sec. 6, Zhongxiao E. Rd. ## 1065 No. 219, Sec. 6, Zhongxiao E. Rd. ## 1066 No. 7, Zhongpo N. Rd. (East) ## 1067 No. 46, Yucheng St. (East) ## 1068 No. 17, Sec. 6, Zhongxiao E. Rd. (Northeast) ## 1069 No. 15, Ln. 118, Dongxin St. Southwest) ## 1070 No. 247, Yucheng St. (Opposite) ## 1071 No. 1, Sec. 1, Jiuzhuang St. (West) ## 1072 No. 128, Sec. 2, Academia Rd. (Gymnasium) ## 1073 No. 128, Sec. 2, Academia Rd. (NBRP) ## 1074 No. 1, Sec. 1, Academia Rd. (Exit 5) ## 1075 No. 9, Aly. 58, Ln. 12, Sec. 2, Academia Rd. (West) ## 1076 No. 27, Ln. 44, Fushan St. (Southeast) ## 1077 No. 11, Ln. 91, Sec. 1, Jiuzhuang St. Southwest) ## 1078 No. 9, Ln. 68, Sec. 3, Academia Rd. (North) ## 1079 No. 532, Sec. 8, Civic Blvd. (North) ## 1080 No. 183, Jingmao 2nd Rd. (Exit 2) ## 1081 No. 67, Huimin St. (Southeast) ## 1082 No. 1, Ln. 44, Xingzhong Rd. (East) ## 1083 No. 350, Sec. 1, Nangang Rd. ## 1084 No. 34, Ln. 125, Chongyang Rd. (East) ## 1085 No. 49, Xiangyang Rd. (North) ## 1086 No. 510, Sec. 7, Zhongxiao E. Rd. (Northwest) ## 1087 No. 380, Sec. 7, Zhongxiao E. Rd. (Exit 2) ## 1088 No. 380, Sec. 7, Zhongxiao E. Rd. (Exit 1) ## 1089 No. 68, Dongming St. (North) ## 1090 No. 246, Sec. 3, Yanjiuyuan Rd. (East) ## 1091 No. 25, Aly. 23, Ln. 35, Sec. 2, Academia Rd. (North) ## 1092 No. 1, Ln. 3, Sec. 2, Academia Rd. (West) ## 1093 No. 200-1, Sec. 2, Nangang Rd.(South) ## 1094 No. 269, Chongyang Rd. (South) ## 1095 No. 99, Sec. 8, Civic Blvd. ## 1096 No. 313, Sec. 1, Nangang Rd. ## 1097 No. 552, Sec. 7, Zhongxiao E Rd. ## 1098 No. 15, Xinmin St. (North) ## 1099 No. 188-1, Jingmao 2nd Rd. ## 1100 No. 1, Ln. 10, Sec. 3, Yanjiuyuan Rd. (East) ## 1101 No. 8, Ln. 47, Sec. 3, Nangang Rd. (South) ## 1102 No. 58, Kunyang St. (East) ## 1103 No.20, Ln. 314, Sec. 3, Nangang Rd. ## 1104 No. 133, Sec. 3, Nangang Rd. ## 1105 No. 4, Dongxin St. (East) ## 1106 No. 873, Sec. 4, Bade Rd. ## 1107 No. 150, Yucheng St. ## 1108 -No. 19, Zhongpo S. Rd. ## 1109 No. 7, Ln. 309, Fude St. (South) ## 1110 No. 1, Ln. 255, Jingmao 2nd Rd. ## 1111 No. 458, Chongyang Rd.(West) ## 1112 No. 359, Sec. 7, Zhongxiao E. Rd. ## 1113 No. 130, Sec. 2, Academia Rd. Intersection (East) ## 1114 No. 505, Chongyang Rd. ## 1115 No. 58, Jingyuan St. (North) ## 1116 No. 71, Huimin St. (West) ## 1117 No. 2, Aly. 16, Ln. 1, Fukang St. (East) ## 1118 No. 2, Aly. 16, Ln. 101, Sec. 1, Academia Rd. ## 1119 Sec. 1, Jiuzong Rd. & Ln. 145, Sec. 1, Jiuzong Rd. Intersection ## 1120 No. 76, Sec. 1, Chenggong Rd. (Opposite) ## 1121 Ln. 258, Xiangyang Rd. & Ln. 39, Chongyang Rd. Intersection (Southwest) ## 1122 No. 28, Sec. 1, Nangang Rd. ## 1123 No. 32, Sec. 1, Nangang Rd. ## 1124 No. 65, Dongxin St. (Southeast) ## 1125 No. 63, Ln. 170, Dongxin St. (Opposite) ## 1126 Zhongpo N. Rd. & Sec. 7, Civic Blvd. Intersection (Northeast) ## 1127 No. 173, Kunyang St. ## 1128 Sec. 2, Nangang Rd. & Ln. 178, Sec. 2, Nangang Rd. Intersection (North) ## 1129 Sec. 7, Zhongxiao E. Rd. & Ln. 415, Sec. 7, Zhongxiao E. Rd. Intersection ## 1130 Xinghua Rd. & Sec. 8, Civic Blvd. Intersection (Northwest) ## 1131 No. 8, Ln. 178, Chengfu Rd. (Opposite) ## 1132 Dongxin St. & Sec. 7, Civic Blvd. Intersection (North) ## 1133 No. 80, Ln. 373, Fude St. ## 1134 Ln. 197, Chengfu Rd. & Chengfu Rd. Intersection ## 1135 No. 398, Songhe St. (Opposite) ## 1136 Chengfu Rd. & Aly. 10, Ln. 80, Dongxin St. ## 1137 Jingmao 2nd Rd. & Sec. 1, Nangang Rd. Intersection (Northwest) ## 1138 Sec. 1, Jiuzhuang St. & Ln. 215, Sec. 1, Jiuzhuang St. Intersection ## 1139 Sec. 3, Nangang Rd. & Ln. 80, Sec. 3, Nangang Rd. Intersection ## 1140 No. 465, Sec. 6, Zhongxiao E. Rd. ## 1141 Zhongxiao E. Rd. & Ln. 278, Sec. 6, Zhongxiao E. Rd. Intersection ## 1142 No. 128, Sec. 2, Academia Rd. ## 1143 No. 380, Songhe St. (Opposite) ## 1144 No. 358, Songhe St. (Opposite) ## 1145 No. 226, Sec. 6, Zhongxiao E. Rd. ## 1146 No. 2, Ln. 47, Fukang St. (Opposite) ## 1147 Dongxin St. & Ln. 63, Dongxin St. Intersection ## 1148 Aly. 10, Ln. 70, Sec. 2, Academia Rd. & Ln. 98, Sec. 2, Academia Rd. Intersection ## 1149 XiangYang Rd. & Sec. 7, Civic Blvd. Intersection ## 1150 No. 312, Sec. 2, NanGang Rd. ## 1151 No. 18, Ln. 151, Sec. 1, Academia Rd. ## 1152 No. 77, Jingmao 1st Rd. (Gangdong St.) ## 1153 No. 16, Ln. 391, Sec. 3, Heping E. Rd. ## 1154 No. 155, Sec. 2, Keelung Rd. ## 1155 No. 131-4, Sec. 2, Keelung Rd. ## 1156 No. 633, Sec. 3, Heping E. Rd. ## 1157 Ln. 530, Sec. 3, Heping E. Rd Intersection (Northeast) ## 1158 No. 50, Xin'an St. (Opposite) ## 1159 Taipei Medical University (Aly. 59, Ln. 220, Wuxing St) ## 1160 No. 28, Aly. 35, Ln. 118, Wuxing St. (Sanxing Park) ## 1161 No. 300, Songde Rd. (South) ## 1162 No. 128, Sec. 5, Xinyi Rd. (East) ## 1163 No. 15, Ln. 153, Songren Rd. (East) ## 1164 No. 6, Ln. 215, Songren Rd. ## 1165 No. 101, Songren Rd. (East) ## 1166 No. 152, Sec. 5, Xinyi Rd. (Exit 1) ## 1167 No. 53, Ln. 200, Songde Rd. (North) ## 1168 No. 54, Ln. 164, Hulin St. (North) ## 1169 No. 2, Aly. 11, Ln. 391, Zhuangjing Rd. (Northeast) ## 1170 No. 100, Songqin St. ## 1171 No. 16, Sec. 5, Xinyi Rd. ## 1172 No. 12, Ln. 239, Zhuangjing Rd. (Opposite) ## 1173 No. 485, Guangfu S. Rd. ## 1174 No. 455, Guangfu S. Rd. ## 1175 Sec. 4, Ren'ai Rd & Ln. 496, Sec. 4, Ren'ai Rd Intersection.(Southwest) ## 1176 No. 15, Ln. 236, Sec. 5, Zhongxiao E. Rd. ## 1177 No. 22, Aly. 2, Ln. 76, Sec. 6, Xinyi Rd. (Opposite) ## 1178 No. 82, Linkou St. (Opposite) ## 1179 No. 655, Songshan Rd. ## 1180 No. 721, Songshan Rd. (Opposite) ## 1181 Taipei City Hall East Gate. (Songzhi Rd) ## 1182 Songzhi Rd & Songshou Rd Intersection. (Northwest) ## 1183 Shifu Rd & Songshou Rd Intersection. (Northeast) ## 1184 Shifu Rd & Songgao Rd Intersection. (Southeast) ## 1185 Shifu Rd & Songshou Rd Intersection. (Northwest) ## 1186 Songzhi Rd & Xinyi Rd Intersection. (Northeast) ## 1187 Shifu Rd & Xinyi Rd Intersection. (Northwest) ## 1188 No. 230, Linkou St. (Opposite) ## 1189 No. 123, Songren Rd. (North) ## 1190 No. 2, Ln. 251, Fude St. (Opposite) ## 1191 No. 135, Dadao Rd. (Opposite) ## 1192 No. 19, Songgao Rd. ## 1193 No. 28, Songren Rd. (North) ## 1194 No. 99, Songlong Rd. (Southwest) ## 1195 No. 277, Songren Rd. (South) ## 1196 No. 81, Ln. 600, Wuxing St. (West) ## 1197 No. 9, Ln. 83, Sec. 1, Jilong Rd. (West) ## 1198 No. 61, Songxin Rd. (West) ## 1199 No. 11, Songshan Rd. (South) ## 1200 No. 161, Songlong Rd. ## 1201 Songxin Rd./Yongji Rd. (Southwest) ## 1202 No. 99-1, Sec. 2, Keelung Rd. ## 1203 Sec. 6, Civic Blvd. & Songxin Rd. Intersection (West) ## 1204 No. 36, Ln. 599, Sec. 4, Zhongxiao E. Rd. (Opposite) ## 1205 Sec. 2, Keelung Rd. & Guangfu S. Rd. Intersection (Northeast) ## 1206 No. 550, Sec. 4, Zhongxiao E. Rd. ## 1207 No. 60, Ln. 308, Songren Rd. ## 1208 No. 800, Sec. 5, Zhongxiao E. Rd. ## 1209 No. 356, Yongji Rd. (East) ## 1210 No. 66, Ln. 326, Yongji Rd. (West) ## 1211 No. 323, Yongji Rd. (West) ## 1212 No. 166, Songshan Rd ## 1213 No. 279, Songshan Rd ## 1214 Sec. 5, Sinyi Rd. & Ln. 91, Sec. 5, Sinyi Rd. Intersection (Northwest) ## 1215 No. 20, Ln. 168, Songde Rd. ## 1216 Shihfu Rd. & Songshou Rd. Intersection (Southeast) ## 1217 No. 79, Songde Rd. ## 1218 No. 209, Songsin Rd. ## 1219 No. 109-6, Sec. 1, Keelung Rd. ## 1220 No. 44, Ln. 132, Hulin St. (West) ## 1221 Ln. 260, Wuxing St. & Aly. 21, Ln. 260, Wuxing St. Intersection (Southeast) ## 1222 Linkou St., Xinyi Dist. & Fude St. Intersection (Southeast) ## 1223 Sec. 4, Ren'ai Rd. & Yisian Rd. Intersection (Northwest) ## 1224 No. 55, Ln. 222, Hulin St. ## 1225 No. 393, Sec. 4, Sinyi Rd. ## 1226 MRT Taipei 101 & World Trade Center Sta. (Exit.2) (West) ## 1227 No. 24, Aly. 36, Ln. 284, Wuxing St. (West) ## 1228 No. 51, Zhongpo S. Rd. (Opposite) ## 1229 No. 308, Fude St. (Opposite) ## 1230 Songren Rd. & Ln. 95, Songren Rd. Intersection (Southeast) ## 1231 Songzhi Rd. & Songlian Rd. Intersection (Northeast) ## 1232 No. 8, Songqin St. (Opposite) ## 1233 No. 15, Ln. 50, Songping Rd. (Opposite) ## 1234 Zhongxiao E. Rd. & Songren Rd. Intersection (Southeast) ## 1235 No. 57, Zhongpo N. Rd. ## 1236 Songren Rd. & Aly. 3, Ln. 583, Wuxing St. Intersection ## 1237 Ln. 394, Wuxing St. & Wuxing St. Intersection ## 1238 Sec. 5, Zhongxiao E. Rd. & Ln. 215, Sec. 5, Zhongxiao E. Rd. Intersection ## 1239 Songqin St. & Zhuangjing Rd. Intersection ## 1240 Songren Rd & Songping Rd. Intersection ## 1241 No. 180, Sec. 5, Xinyi Rd. ## 1242 Ln. 71, Sec. 5, Zhongxiao E. Rd. & Aly. 18, Ln. 31, Sec. 5, Zhongxiao E. Rd. Intersection ## 1243 No. 23, Ln. 284, Wuxing St. (Opposite) ## 1244 Ln. 67, Xin'an St. & Xin'an St. Intersection (Southeast) ## 1245 No. 75, Ln. 67, Xin'an St. (Opposite) ## 1246 No. 291, Sec. 3, Heping E. Rd. ## 1247 No. 478, Yongji Rd. ## 1248 No. 15, Ln. 84, Fude St. (Opposite) ## 1249 No. 63, Ln. 341, Sec. 3, Heping E. Rd. (Opposite) ## 1250 No. 36, Songlong Rd. (Opposite) ## 1251 Ln. 103, Xin'an St. & Aly. 22, Ln. 284, Wuxing St. Intersection ## 1252 No. 545, Sec. 4, Zhongxiao E. Rd. ## 1253 No. 200, Guangfu S. Rd. (Opposite) ## 1254 No. 76, Guangfu S. Rd. (Opposite) ## 1255 No. 35, Zhongpo N. Rd. ## 1256 No. 14, Aly. 66, Ln. 281, Songren Rd. ## 1257 No. 3, Sec. 1, KeeLung Rd. ## 1258 No. 186, Baoxing St. ## 1259 Baoxing St & Changtai St Intersection. (Southwest) ## 1260 No. 482, Wanda Rd. ## 1261 No. 2, Guoxing Rd. ## 1262 No. 465, Sec. 2, Zhonghua Rd. (Opposite) ## 1263 No. 15, Ln 1, Guoxing Rd. (Opposite) ## 1264 No. 42, Guoxing Rd. (Opposite) ## 1265 Guoxing Rd & Qingnian Rd Intersection. (Southwest) ## 1266 No. 66, Qingnian Rd (Opposite) ## 1267 Youth Park Basketball Courts. (South) ## 1268 No. 123, Xizang Rd. ## 1269 No. 1, Aly. 37, Ln. 277, Wanda Rd. (East) ## 1270 No. 210, Juguang Rd. ## 1271 No. 137, Juguang Rd. ## 1272 No. 142, Bangka Blvd. ## 1273 No. 199, Dongyuan St. ## 1274 No. 371, Sec. 3, Huanhe S. Rd. ## 1275 No. 243, Dechang St. ## 1276 No. 27, Aly 20, Ln 66, Dongyuan St. ## 1277 No. 14, Ln 35, Dongyuan St. (Opposite) ## 1278 Sec. 2, Xiyuan Rd & Bangka Blvd Intersection. (Southwest) ## 1279 Sec. 2, Xiyuan Rd & Xingyi St Intersection ## 1280 No. 127, Changshun St. ## 1281 No. 2, Aly. 25, Ln. 250, Sec. 2, Huanhe S. R. (Opposite) ## 1282 No. 2, Aly. 25, Ln. 250, Sec. 2, Huanhe S. R ## 1283 No. 282, Sec. 2, Huanhe S. Rd. ## 1284 Sec. 2, Huanhe S. Rd & Xizang Rd (East) ## 1285 No. 177, Dali St. (Opposite) ## 1286 Bangka Blvd & Aly. 20, Ln. 160, Dali St Intersection. (East) ## 1287 No. 188, Qingnian Rd. ## 1288 No. 12, Xining Rd. (Opposite) ## 1289 No. 83, Emei St. (Side) ## 1290 No. 280-1, Sec. 1, Huanhe S Rd. (Opposite) ## 1291 No. 108, Chengdu Rd. (Opposite) ## 1292 No. 164-1, Sec. 1, Zhonghua Rd. ## 1293 Sec. 1, Zhonghua Rd. & Guilin Rd. (Northwest) ## 1294 Sec. 3, Heping W Rd. & Sec. 1, Xiyuan Rd. (Northeast) ## 1295 No. 235, Sec. 3, Heping W Rd. (Side) ## 1296 No. 134, Guilin Rd. (Opposite) ## 1297 No. 238, Kangding Rd. (Opposite) ## 1298 No. 83, Bangka Blvd. ## 1299 Kangding Rd. & Ln. 287, Kangding Rd. Intersection ## 1300 Sec. 3, Heping W Rd. & Ln. 88, Sec. 3, Heping W Rd. Intersection (Southwest) ## 1301 No. 100, Emei St. (Opposite) ## 1302 No. 18-2, Kangding Rd. ## 1303 No. 130, Sec. 1, Zhonghua Rd. ## 1304 No. 81, Kangding Rd. (Opposite) ## 1305 No. 346, Wanda Rd. ## 1306 No. 15, Dechang St. (Opposite) ## 1307 Sec. 1, Huanhe S. Rd. & Sec. 3, Heping W. Rd. Intersection (Southwest) ## 1308 No. 38, Ln. 60, Changshun St. (Opposite) ## 1309 Ln. 35, Dongyuan St. & Ln. 67, Dongyuan St. Intersection ## 1310 No. 66, Ln. 246, Guilin Rd. (South) ## 1311 No. 102, Sec. 2, Huanhe S. Rd. (Northwest) ## 1312 Ln. 170, Dali St. & Ln.159, Sec. 2, Huanhe S. Rd. Intersection ## 1313 Changshun St. & Ln. 106, Shuangyuan St. Intersection ## 1314 No. 151, Fumin Rd. (Opposite) ## 1315 No. 245, Sec. 2, Huanhe S. Rd. ## 1316 Nanning Rd. & Guangzhou St. Intersection (South) ## 1317 Kunming St. & Luoyang St. Intersection (West) ## 1318 Guilin Rd. & Kunming St. Intersection (Northwest) ## 1319 Xizang Rd. & Ln. 299, Juguang Rd. Intersection (Southeast) ## 1320 Qingnian Rd. & Ln. 106, Qingnian Rd. Intersection (East) ## 1321 Sec. 3, Heping W. Rd. & Ln. 109, Sec. 3, Heping W. Rd. Intersection (Northwest) ## 1322 Wanda Rd. & Aly. 22, Ln. 66, Xingning St. Intersection (Northwest) ## 1323 Bangka Blvd. & Xizang Rd. Intersection (Southwest) (Under Huacui Bridge) ## 1324 No. 44, Ln. 493, Wanda Rd. ## 1325 No. 10, Aly. 55, Ln. 320, Sec. 2, Xiyuan Rd. ## 1326 No. 59, Ln. 152, Qingnian Rd. (Opposite) ## 1327 No. 11, Ln. 190, Sec. 2, Heping W. Rd. ## 1328 Sec. 3, Huanhe S. Rd. & Ln. 424, Wanda Rd. Intersection ## 1329 No. 45, ChangTai St. (Opposite) ## 1330 ShuiYuan Rd. & QingNian Rd. Intersection (North) ## 1331 No. 162, QingNian Rd. ## 1332 No. 207-7, Shuiyuan Rd. ## 1333 Sec. 2, HuanHe S. Rd. & XiZang Rd. Intersection ## 1334 No. 404, BangKa Blvd. ## 1335 No. 142, DeChang St. ## 1336 Aly. 2, Ln. 60, Sec. 3, Tingzhou Rd. Dorms A(North) ## 1337 NTU Prince House Chang Hsing Dorms C(South) ## 1338 No.16-1, Siyuan St. ## 1339 NTU Archives(Northeast) ## 1340 Aly. 2, Ln. 60, Sec. 3, Tingzhou Rd. Dorms B(North) ## 1341 NTU 8th Men's Dorm(East) ## 1342 NTU The Apex Building(Southeast) ## 1343 NTU Agricultural Exhibition Hall(North) ## 1344 NTU Building 2, College of Management(North) ## 1345 NTU Dept. of Civil Engineering(South) ## 1346 NTU Freshman Women's Dorm(North) ## 1347 NTU 9th Women's Dorm(Southwest) ## 1348 NTU Xiao Fu Commissary(East) ## 1349 Ln. 156, Sec. 3, Keelung Rd. Intersection(North) ## 1350 NTU College of Engineering Building(Southeast) ## 1351 NTU Astronomy - Mathematics Building(Southwest) ## 1352 NTU Dept. of Psychology (South Hall) ## 1353 Liberal Arts Research Building(West) ## 1354 NTU Department of Biochemical Science and Technology(West) ## 1355 NTU Department of Bioenvironmental Systems Engineering(West) ## 1356 NTU Sports Field(East) ## 1357 NTU Common Subjects Classroom Building(Northeast) ## 1358 NTU Common Subjects Classroom Building(Southeast) ## 1359 NTU Lu Ming Square(Sidewalk) ## 1360 NTU Gongguan Car Park (Northwest) ## 1361 NTU Administration Building(West) ## 1362 NTU Ming - Da Hall(West) ## 1363 NTU Heritage Hall of Physics ## 1364 NTU Dept. of Physics Library ## 1365 NTU College of social Sciences Building(West) ## 1366 NTU Dept. of Sociology / Dept. of Social Work(South) ## 1367 NTU Shih - Liang Hall(Southeast) ## 1368 NTU Green Cabin ## 1369 NTU Computer and Information Networking Center(South) ## 1370 NTU Institute of Atomic and Molecular Sciences(Northeast) ## 1371 Museum of Zoology(West) ## 1372 NTU 1st Student Activity Center(Southeast) ## 1373 NTU Barry Lam Hall(West) ## 1374 NTU Liberal Education Classroom Building(West) ## 1375 NTU Forestry Building(North) ## 1376 NTU Building No.1(North) ## 1377 NTU Omnium Gatherum Building ## 1378 NTU The Odeum Square(Southeast) ## 1379 NTU Department of Horticulture(North) ## 1380 NTU Freshman Classroom Building(South) ## 1381 NTU Graduate Institute of Journalism(South) ## 1382 NTU E. E. Building No. 2(Southeast) ## 1383 NTU Dept. of Library and Information Sciences(North) ## 1384 NTU Main Library(Southwest) ## 1385 NTU Tsai Lecture Hall(South) ## 1386 NTU Dept. of Veterinary Medicine(South) ## 1387 NTU Sports Center(East) ## 1388 NTU Ming - Da Hall (North) ## bemp act srcUpdateTime updateTime infoTime ## 1 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 2 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 3 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 4 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14 ## 5 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 6 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 7 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:18 ## 8 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18 ## 9 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 10 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 11 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:53:13 ## 12 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 13 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 14 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 15 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 16 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 17 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:21 ## 18 5 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:17:15 ## 19 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 20 99 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35 ## 21 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 22 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 23 75 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 24 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:14 ## 25 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 26 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 27 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:17 ## 28 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 29 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 30 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 31 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 32 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31 ## 33 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:17 ## 34 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 35 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 36 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:14 ## 37 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:08 ## 38 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:45:18 ## 39 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 40 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14 ## 41 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 42 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:45:19 ## 43 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 44 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 45 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 46 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:14 ## 47 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 48 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 49 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 50 51 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 51 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 52 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 53 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 54 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 55 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 56 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 57 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 58 55 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 59 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 60 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14 ## 61 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 62 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 63 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 64 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 65 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 66 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 67 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 68 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:25:19 ## 69 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 70 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 71 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 72 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 73 46 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-02 02:25:18 ## 74 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 75 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 76 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 77 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 78 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 79 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 80 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 81 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:39:14 ## 82 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 83 64 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 84 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14 ## 85 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 86 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:19 ## 87 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 88 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 89 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 90 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 91 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 92 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:13 ## 93 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14 ## 94 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 95 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 96 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 97 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 98 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 99 20 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-30 08:59:14 ## 100 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 101 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 102 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 103 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 104 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19 ## 105 41 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:19:10 ## 106 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:14 ## 107 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:14 ## 108 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 109 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 110 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 111 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 112 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 113 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 114 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 115 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 116 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 117 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 118 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 119 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18 ## 120 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 121 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 122 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 123 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 124 89 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 125 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 126 34 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:19:10 ## 127 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 128 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 129 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 130 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19 ## 131 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:58:14 ## 132 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 133 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 134 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 135 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 136 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18 ## 137 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:03:18 ## 138 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 139 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:13 ## 140 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 141 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 142 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 143 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 144 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:19 ## 145 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 146 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 147 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 148 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 149 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:18 ## 150 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 151 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 152 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:18 ## 153 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:16 ## 154 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 155 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 156 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 157 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 158 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 159 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 160 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 161 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 162 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 163 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 164 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 165 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 166 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 167 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 168 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 169 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 170 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 171 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 172 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 173 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25 ## 174 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 175 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18 ## 176 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 177 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 178 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 179 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:14:18 ## 180 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:15:19 ## 181 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 182 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17 ## 183 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 184 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 185 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 186 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 187 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:14 ## 188 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:20 ## 189 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 190 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 191 43 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 192 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13 ## 193 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19 ## 194 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14 ## 195 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 196 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 197 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:18 ## 198 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 199 53 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 200 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 201 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:14 ## 202 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 203 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 204 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 205 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 206 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:24:19 ## 207 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 208 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 209 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 210 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 211 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 212 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 213 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 214 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 215 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 216 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19 ## 217 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19 ## 218 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 219 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 220 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 221 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 222 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 223 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 224 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 225 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 226 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 227 50 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14 ## 228 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 229 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 230 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 231 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 232 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:14 ## 233 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 234 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 235 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25 ## 236 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:14 ## 237 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 238 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 239 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 240 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:18:18 ## 241 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:01:57 ## 242 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 243 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:13:18 ## 244 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:14 ## 245 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 246 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 247 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 248 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18 ## 249 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 250 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 251 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 252 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17 ## 253 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:19 ## 254 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 255 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19 ## 256 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:14 ## 257 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 258 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:17 ## 259 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18 ## 260 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 261 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:17 ## 262 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 263 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 264 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 265 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 266 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 267 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17 ## 268 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:14 ## 269 35 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 270 65 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 271 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:45:18 ## 272 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:19 ## 273 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 274 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 275 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 276 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 277 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:18 ## 278 27 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:18:09 ## 279 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 280 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 281 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 282 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 283 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17 ## 284 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:57:26 ## 285 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 286 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 287 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:23:18 ## 288 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 289 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19 ## 290 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 291 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 292 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:39 ## 293 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:01:50 ## 294 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18 ## 295 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 296 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:08:18 ## 297 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:18 ## 298 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 299 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 300 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:16:19 ## 301 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:15:18 ## 302 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:04:19 ## 303 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 304 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:03:17 ## 305 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:18 ## 306 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 14:18:19 ## 307 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:19 ## 308 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:18 ## 309 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:43:17 ## 310 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 311 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 312 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 313 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 314 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 315 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 316 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19 ## 317 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 318 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18 ## 319 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:14:17 ## 320 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 321 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35 ## 322 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:28:18 ## 323 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14 ## 324 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 325 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:43:15 ## 326 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 327 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18 ## 328 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 329 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:21:19 ## 330 67 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 331 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:11:19 ## 332 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:22:18 ## 333 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 334 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 335 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:49:18 ## 336 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17 ## 337 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 338 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 339 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 340 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19 ## 341 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 342 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 343 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 344 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 345 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 346 58 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 347 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:19:18 ## 348 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:43:19 ## 349 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 350 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 351 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 352 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:14 ## 353 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 354 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 355 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 356 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:52:18 ## 357 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:37:18 ## 358 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 359 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 360 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18 ## 361 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:18 ## 362 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:19 ## 363 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 364 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:42:18 ## 365 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 366 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14 ## 367 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:13 ## 368 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 369 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:14 ## 370 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 371 61 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 372 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 373 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:30 ## 374 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14 ## 375 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 376 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 377 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 378 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 379 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 380 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 381 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 382 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 383 56 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:14 ## 384 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18 ## 385 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 386 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 387 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:24 ## 388 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 389 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 390 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 391 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 392 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 393 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 394 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:08:21 ## 395 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:17 ## 396 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 397 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:51:17 ## 398 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:50:26 ## 399 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:13 ## 400 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 401 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 402 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 403 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:14 ## 404 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 405 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:14 ## 406 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:03:18 ## 407 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 408 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:09:18 ## 409 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:05:19 ## 410 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:38:18 ## 411 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 412 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:03:20 ## 413 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 414 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 415 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:01:14 ## 416 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19 ## 417 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 418 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:18 ## 419 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35 ## 420 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:18 ## 421 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:06:19 ## 422 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 13:14:19 ## 423 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 424 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:02:18 ## 425 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 426 39 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:19:10 ## 427 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:48:18 ## 428 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:02:18 ## 429 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 430 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 431 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 432 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 433 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 434 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:14 ## 435 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:35:18 ## 436 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:05:21 ## 437 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 438 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:11:19 ## 439 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:20 ## 440 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18 ## 441 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 442 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:20 ## 443 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17 ## 444 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 445 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 446 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:58:14 ## 447 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 448 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 449 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 450 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:31:08 ## 451 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 452 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 453 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 454 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:45:19 ## 455 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18 ## 456 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:16:18 ## 457 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:43:19 ## 458 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 459 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 460 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 461 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 462 55 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:14 ## 463 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 464 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:14 ## 465 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 466 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 467 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 468 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 469 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 470 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 471 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:13 ## 472 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 473 35 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35 ## 474 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 475 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 476 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:44:18 ## 477 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 478 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 479 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 480 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 481 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:18 ## 482 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 483 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 484 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 485 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 486 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:43 ## 487 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 488 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 489 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 490 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 491 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 492 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 493 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 494 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 495 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 496 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 497 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 498 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13 ## 499 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 500 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 501 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 502 41 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 503 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 504 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 505 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:45:18 ## 506 35 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 507 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 508 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 509 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 510 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 511 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 512 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 513 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 514 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 515 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:17 ## 516 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 517 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:18 ## 518 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 519 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 520 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:06:14 ## 521 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 522 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:14 ## 523 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:42:13 ## 524 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18 ## 525 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:14 ## 526 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 527 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:13:18 ## 528 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 529 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 530 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 531 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:18 ## 532 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 533 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 534 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 535 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 536 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 537 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 538 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 539 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 540 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 541 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 542 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 543 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 544 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 545 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 546 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18 ## 547 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19 ## 548 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 549 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 550 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 551 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 552 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 553 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 554 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 555 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:24:19 ## 556 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14 ## 557 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 558 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 559 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25 ## 560 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 561 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 562 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 563 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 564 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 565 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 566 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 567 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:14:19 ## 568 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 569 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 570 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 571 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 572 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:52:18 ## 573 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 574 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:03:20 ## 575 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:11:18 ## 576 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 577 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 578 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 579 48 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 580 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19 ## 581 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 582 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 583 43 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 584 41 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 585 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 586 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 587 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 588 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 589 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:36 ## 590 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 591 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 592 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 593 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14 ## 594 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 595 62 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 596 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 597 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:18 ## 598 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 599 75 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14 ## 600 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 601 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19 ## 602 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 603 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 604 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 605 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 606 54 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 607 35 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 608 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 609 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 610 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 611 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:14 ## 612 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 613 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 614 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:14:19 ## 615 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 616 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 617 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:58:14 ## 618 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:14 ## 619 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 620 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:14 ## 621 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:14 ## 622 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 623 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 624 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 625 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 626 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 627 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 628 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 629 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 630 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:14 ## 631 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:18 ## 632 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 633 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:17 ## 634 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 635 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 636 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 637 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 638 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18 ## 639 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 640 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 641 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19 ## 642 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:21 ## 643 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 644 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 645 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 646 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 647 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 648 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14 ## 649 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18 ## 650 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 651 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:29:14 ## 652 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25 ## 653 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 654 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 655 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 656 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:15:19 ## 657 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 658 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 659 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18 ## 660 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 661 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:19 ## 662 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 663 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 664 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 665 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 666 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 667 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 668 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 669 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 670 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14 ## 671 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 672 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:15:14 ## 673 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 674 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:28:17 ## 675 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:13 ## 676 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 677 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 678 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:17 ## 679 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 680 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 681 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:18 ## 682 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 683 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 684 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17 ## 685 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 686 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:35:19 ## 687 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 688 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:18 ## 689 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 690 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 691 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 692 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 693 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:20 ## 694 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17 ## 695 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 696 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 697 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 698 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19 ## 699 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:19 ## 700 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 701 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 702 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 703 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 704 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 705 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 706 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 707 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 708 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:46:18 ## 709 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:14 ## 710 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 711 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19 ## 712 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:18 ## 713 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 714 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:32:18 ## 715 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 716 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:14 ## 717 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20 ## 718 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 719 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 720 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 721 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:16:18 ## 722 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 723 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:18:18 ## 724 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 725 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:31:08 ## 726 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 727 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 728 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 729 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19 ## 730 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:18 ## 731 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:33:18 ## 732 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 733 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 734 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 735 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 736 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 737 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 738 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:18 ## 739 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31 ## 740 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:14 ## 741 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35 ## 742 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 743 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17 ## 744 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:18 ## 745 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 746 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 747 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 748 48 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 749 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:12:17 ## 750 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 751 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 752 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 753 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 754 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31 ## 755 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:38:18 ## 756 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:18 ## 757 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 758 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 759 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:49:18 ## 760 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:21:18 ## 761 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 762 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:26:17 ## 763 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:18 ## 764 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:19 ## 765 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 766 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 767 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:29 ## 768 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 769 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 770 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 771 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 772 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 773 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 774 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 775 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 776 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17 ## 777 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:59:18 ## 778 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 779 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18 ## 780 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 781 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 782 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 783 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:29:17 ## 784 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 785 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 786 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 787 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:41:18 ## 788 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 789 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18 ## 790 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:56:19 ## 791 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31 ## 792 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 793 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:20 ## 794 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 795 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:03:18 ## 796 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:19 ## 797 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25 ## 798 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 799 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 800 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20 ## 801 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 802 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18 ## 803 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 804 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:04:21 ## 805 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 806 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:05:21 ## 807 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:54:18 ## 808 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:25:19 ## 809 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13 ## 810 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:39:18 ## 811 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 812 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:50:25 ## 813 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 814 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:57:02 ## 815 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:19 ## 816 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 817 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:26:17 ## 818 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:17:30 ## 819 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 820 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:44:18 ## 821 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:14 ## 822 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:17 ## 823 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:08:18 ## 824 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:01:49 ## 825 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:09:18 ## 826 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 827 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:25:19 ## 828 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:14 ## 829 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 13:46:18 ## 830 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 831 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:05:20 ## 832 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17 ## 833 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 834 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 835 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 836 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:34:18 ## 837 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:17:32 ## 838 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:08:18 ## 839 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:07:18 ## 840 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 841 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 842 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25 ## 843 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:18 ## 844 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19 ## 845 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:53:18 ## 846 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 847 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:35:19 ## 848 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 849 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 850 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 851 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 852 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:41:18 ## 853 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 854 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:50:25 ## 855 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:21:19 ## 856 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:19:18 ## 857 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:50:29 ## 858 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:46:17 ## 859 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17 ## 860 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:18 ## 861 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 862 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 863 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 864 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:10:25 ## 865 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 866 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:12:19 ## 867 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 868 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:04:19 ## 869 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:32:18 ## 870 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18 ## 871 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 872 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 13:29:18 ## 873 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:49:18 ## 874 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:29:18 ## 875 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:17 ## 876 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:19 ## 877 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 878 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18 ## 879 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:12:18 ## 880 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:14:18 ## 881 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:56:19 ## 882 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:13 ## 883 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-30 14:06:19 ## 884 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 885 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:12:20 ## 886 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20 ## 887 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 15:43:18 ## 888 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:17 ## 889 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 890 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 891 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31 ## 892 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 893 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:24:18 ## 894 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:29 ## 895 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:57:02 ## 896 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:18 ## 897 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:37:18 ## 898 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:03:19 ## 899 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:18:18 ## 900 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 901 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:46:17 ## 902 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 903 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:35:19 ## 904 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19 ## 905 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:02:18 ## 906 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 907 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:44:18 ## 908 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:23:19 ## 909 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 910 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:17 ## 911 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 912 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:27:18 ## 913 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 914 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:39 ## 915 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 916 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:04:21 ## 917 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 918 50 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 919 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19 ## 920 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 921 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 922 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 923 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 924 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 925 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 926 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:42:18 ## 927 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:25:19 ## 928 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 929 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 930 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:32:17 ## 931 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 932 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:53:18 ## 933 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20 ## 934 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 935 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:33:18 ## 936 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 937 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31 ## 938 45 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 939 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 940 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:58:17 ## 941 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:14:14 ## 942 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:10:25 ## 943 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 944 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:37:18 ## 945 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 946 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 947 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:15:15 ## 948 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 949 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 950 24 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:15:15 ## 951 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:50:25 ## 952 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19 ## 953 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18 ## 954 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 955 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 956 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:03:18 ## 957 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:31:18 ## 958 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 959 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 960 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:18 ## 961 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:17 ## 962 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:18:19 ## 963 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 964 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:42:18 ## 965 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:14 ## 966 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 18:45:19 ## 967 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:54:17 ## 968 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 969 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 970 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 971 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:18 ## 972 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 973 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:40:26 ## 974 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:28 ## 975 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:21:18 ## 976 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:57:02 ## 977 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:15:15 ## 978 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 979 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 980 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 981 37 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18 ## 982 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:39:14 ## 983 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 984 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 985 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 986 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 987 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 988 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 989 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 990 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 991 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 992 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:35:18 ## 993 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 994 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 995 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 996 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 997 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 998 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18 ## 999 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 1000 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1001 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 1002 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 1003 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14 ## 1004 44 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:19:10 ## 1005 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1006 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1007 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 1008 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18 ## 1009 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 1010 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1011 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1012 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:18 ## 1013 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1014 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1015 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 1016 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 1017 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1018 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1019 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1020 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1021 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1022 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 1023 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 1024 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 1025 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1026 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1027 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1028 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1029 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:24:17 ## 1030 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:14 ## 1031 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 1032 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1033 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:36 ## 1034 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1035 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1036 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1037 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 1038 46 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1039 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:14 ## 1040 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:14 ## 1041 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18 ## 1042 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1043 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1044 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:14 ## 1045 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 1046 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1047 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 1048 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 1049 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:20 ## 1050 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:18 ## 1051 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 1052 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14 ## 1053 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:52:14 ## 1054 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1055 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1056 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 1057 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1058 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:18 ## 1059 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:18 ## 1060 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 1061 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 1062 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 1063 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1064 57 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1065 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 1066 40 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 1067 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 1068 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1069 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1070 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 1071 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 1072 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:08 ## 1073 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:07:17 ## 1074 70 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1075 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1076 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:14 ## 1077 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1078 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1079 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19 ## 1080 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1081 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:49:18 ## 1082 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1083 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1084 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1085 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17 ## 1086 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1087 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 1088 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 1089 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17 ## 1090 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:18 ## 1091 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1092 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:02:19 ## 1093 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1094 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1095 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1096 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1097 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1098 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17 ## 1099 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1100 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 1101 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:50:25 ## 1102 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:07:20 ## 1103 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 1104 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 1105 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:57:02 ## 1106 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 1107 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:16 ## 1108 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 1109 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 1110 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 1111 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 1112 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:35 ## 1113 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:27:18 ## 1114 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:24:18 ## 1115 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:17:32 ## 1116 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 1117 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1118 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1119 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1120 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1121 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1122 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:19 ## 1123 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:40:26 ## 1124 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 1125 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:21 ## 1126 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1127 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 1128 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 1129 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1130 34 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 1131 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1132 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1133 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:11:19 ## 1134 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 1135 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 1136 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1137 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 1138 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:43 ## 1139 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:51:18 ## 1140 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 1141 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1142 20 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-15 13:02:36 ## 1143 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:21:16 ## 1144 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:13:19 ## 1145 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:03:14 ## 1146 13 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-18 00:17:22 ## 1147 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 1148 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1149 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1150 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:34:17 ## 1151 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:09:19 ## 1152 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 1153 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1154 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 1155 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1156 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:07:17 ## 1157 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 1158 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1159 57 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1160 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 1161 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 1162 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:21 ## 1163 48 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 1164 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 1165 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19 ## 1166 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18 ## 1167 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 1168 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1169 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1170 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 1171 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:13 ## 1172 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 1173 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1174 41 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 1175 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1176 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 1177 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1178 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1179 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:32:17 ## 1180 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:09 ## 1181 44 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1182 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1183 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17 ## 1184 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1185 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1186 69 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1187 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 1188 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1189 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1190 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 1191 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1192 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14 ## 1193 57 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1194 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1195 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1196 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:18 ## 1197 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:44:18 ## 1198 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:14 ## 1199 51 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1200 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1201 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 1202 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1203 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1204 42 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:13 ## 1205 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1206 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:25:14 ## 1207 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17 ## 1208 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 1209 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 1210 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1211 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1212 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1213 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:14 ## 1214 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 1215 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1216 43 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 1217 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1218 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1219 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1220 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 1221 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1222 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1223 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 1224 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1225 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1226 50 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:14 ## 1227 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13 ## 1228 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1229 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14 ## 1230 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 1231 53 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1232 13 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-26 12:18:17 ## 1233 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1234 90 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:14 ## 1235 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 1236 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1237 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1238 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 1239 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:49:14 ## 1240 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1241 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 1242 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 1243 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 1244 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1245 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:25 ## 1246 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1247 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1248 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1249 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17 ## 1250 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 1251 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1252 32 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1253 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:14 ## 1254 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:18 ## 1255 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:17 ## 1256 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:19 ## 1257 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:42:17 ## 1258 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:14 ## 1259 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1260 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:18 ## 1261 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:14 ## 1262 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1263 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 1264 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:15:19 ## 1265 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 1266 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:38:17 ## 1267 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 1268 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1269 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:18 ## 1270 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:18 ## 1271 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:18 ## 1272 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:35:19 ## 1273 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:17:32 ## 1274 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 1275 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:18 ## 1276 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:17 ## 1277 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:41 ## 1278 33 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1279 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1280 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:25:19 ## 1281 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 1282 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1283 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:10:31 ## 1284 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 1285 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1286 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1287 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 1288 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:40:26 ## 1289 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1290 25 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:37:18 ## 1291 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:14 ## 1292 86 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1293 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:17 ## 1294 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 1295 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 1296 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:17 ## 1297 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 1298 38 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 1299 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1300 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:31:04 ## 1301 13 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1302 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:18 ## 1303 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:04:18 ## 1304 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:19 ## 1305 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1306 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:32:18 ## 1307 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:24:19 ## 1308 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:19:18 ## 1309 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:16:19 ## 1310 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:08:14 ## 1311 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:36:13 ## 1312 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:50:25 ## 1313 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:01:20 ## 1314 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:19:19 ## 1315 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:47:17 ## 1316 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 1317 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 1318 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:46:18 ## 1319 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:07:18 ## 1320 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:17 ## 1321 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:58:18 ## 1322 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:19 ## 1323 15 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:27:19 ## 1324 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:37:14 ## 1325 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17 ## 1326 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1327 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:43:17 ## 1328 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:01:20 ## 1329 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:38:17 ## 1330 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:17 ## 1331 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:37:18 ## 1332 11 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:28 ## 1333 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:26:18 ## 1334 1 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:17 ## 1335 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1336 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1337 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1338 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:14 ## 1339 4 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 19:21:18 ## 1340 3 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:18 ## 1341 2 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:14 ## 1342 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1343 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:18 ## 1344 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1345 30 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:14 ## 1346 53 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1347 56 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1348 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:59:13 ## 1349 21 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1350 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1351 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:51:18 ## 1352 27 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:41:18 ## 1353 26 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:42:18 ## 1354 5 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:19 ## 1355 19 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:56:14 ## 1356 31 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:03:17 ## 1357 20 0 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-01-14 04:17:15 ## 1358 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:17:26 ## 1359 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1360 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:02:18 ## 1361 12 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1362 17 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17 ## 1363 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:29:14 ## 1364 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1365 39 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1366 23 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1367 7 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:05:19 ## 1368 47 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:08:19 ## 1369 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:18:18 ## 1370 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:01:19 ## 1371 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:18 ## 1372 29 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:45:19 ## 1373 20 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:54:18 ## 1374 45 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 16:07:17 ## 1375 6 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1376 18 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:09:17 ## 1377 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:46:17 ## 1378 9 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:05:18 ## 1379 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 17:59:18 ## 1380 14 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:27:18 ## 1381 10 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:57:36 ## 1382 8 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:28:18 ## 1383 24 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:53:18 ## 1384 28 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:17:29 ## 1385 0 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 23:06:13 ## 1386 22 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 22:48:17 ## 1387 36 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 21:56:19 ## 1388 16 1 2024-03-31 23:09:24 2024-03-31 23:09:51 2024-03-31 20:52:18 ## infoDate ## 1 2024-03-31 ## 2 2024-03-31 ## 3 2024-03-31 ## 4 2024-03-31 ## 5 2024-03-31 ## 6 2024-03-31 ## 7 2024-03-31 ## 8 2024-03-31 ## 9 2024-03-31 ## 10 2024-03-31 ## 11 2024-03-31 ## 12 2024-03-31 ## 13 2024-03-31 ## 14 2024-03-31 ## 15 2024-03-31 ## 16 2024-03-31 ## 17 2024-03-31 ## 18 2024-01-14 ## 19 2024-03-31 ## 20 2024-03-31 ## 21 2024-03-31 ## 22 2024-03-31 ## 23 2024-03-31 ## 24 2024-03-31 ## 25 2024-03-31 ## 26 2024-03-31 ## 27 2024-03-31 ## 28 2024-03-31 ## 29 2024-03-31 ## 30 2024-03-31 ## 31 2024-03-31 ## 32 2024-03-31 ## 33 2024-03-31 ## 34 2024-03-31 ## 35 2024-03-31 ## 36 2024-03-31 ## 37 2024-03-31 ## 38 2024-03-31 ## 39 2024-03-31 ## 40 2024-03-31 ## 41 2024-03-31 ## 42 2024-03-31 ## 43 2024-03-31 ## 44 2024-03-31 ## 45 2024-03-31 ## 46 2024-03-31 ## 47 2024-03-31 ## 48 2024-03-31 ## 49 2024-03-31 ## 50 2024-03-31 ## 51 2024-03-31 ## 52 2024-03-31 ## 53 2024-03-31 ## 54 2024-03-31 ## 55 2024-03-31 ## 56 2024-03-31 ## 57 2024-03-31 ## 58 2024-03-31 ## 59 2024-03-31 ## 60 2024-03-31 ## 61 2024-03-31 ## 62 2024-03-31 ## 63 2024-03-31 ## 64 2024-03-31 ## 65 2024-03-31 ## 66 2024-03-31 ## 67 2024-03-31 ## 68 2024-03-31 ## 69 2024-03-31 ## 70 2024-03-31 ## 71 2024-03-31 ## 72 2024-03-31 ## 73 2024-03-02 ## 74 2024-03-31 ## 75 2024-03-31 ## 76 2024-03-31 ## 77 2024-03-31 ## 78 2024-03-31 ## 79 2024-03-31 ## 80 2024-03-31 ## 81 2024-03-31 ## 82 2024-03-31 ## 83 2024-03-31 ## 84 2024-03-31 ## 85 2024-03-31 ## 86 2024-03-31 ## 87 2024-03-31 ## 88 2024-03-31 ## 89 2024-03-31 ## 90 2024-03-31 ## 91 2024-03-31 ## 92 2024-03-31 ## 93 2024-03-31 ## 94 2024-03-31 ## 95 2024-03-31 ## 96 2024-03-31 ## 97 2024-03-31 ## 98 2024-03-31 ## 99 2024-03-30 ## 100 2024-03-31 ## 101 2024-03-31 ## 102 2024-03-31 ## 103 2024-03-31 ## 104 2024-03-31 ## 105 2024-01-14 ## 106 2024-03-31 ## 107 2024-03-31 ## 108 2024-03-31 ## 109 2024-03-31 ## 110 2024-03-31 ## 111 2024-03-31 ## 112 2024-03-31 ## 113 2024-03-31 ## 114 2024-03-31 ## 115 2024-03-31 ## 116 2024-03-31 ## 117 2024-03-31 ## 118 2024-03-31 ## 119 2024-03-31 ## 120 2024-03-31 ## 121 2024-03-31 ## 122 2024-03-31 ## 123 2024-03-31 ## 124 2024-03-31 ## 125 2024-03-31 ## 126 2024-01-14 ## 127 2024-03-31 ## 128 2024-03-31 ## 129 2024-03-31 ## 130 2024-03-31 ## 131 2024-03-31 ## 132 2024-03-31 ## 133 2024-03-31 ## 134 2024-03-31 ## 135 2024-03-31 ## 136 2024-03-31 ## 137 2024-03-31 ## 138 2024-03-31 ## 139 2024-03-31 ## 140 2024-03-31 ## 141 2024-03-31 ## 142 2024-03-31 ## 143 2024-03-31 ## 144 2024-03-31 ## 145 2024-03-31 ## 146 2024-03-31 ## 147 2024-03-31 ## 148 2024-03-31 ## 149 2024-03-31 ## 150 2024-03-31 ## 151 2024-03-31 ## 152 2024-03-31 ## 153 2024-03-31 ## 154 2024-03-31 ## 155 2024-03-31 ## 156 2024-03-31 ## 157 2024-03-31 ## 158 2024-03-31 ## 159 2024-03-31 ## 160 2024-03-31 ## 161 2024-03-31 ## 162 2024-03-31 ## 163 2024-03-31 ## 164 2024-03-31 ## 165 2024-03-31 ## 166 2024-03-31 ## 167 2024-03-31 ## 168 2024-03-31 ## 169 2024-03-31 ## 170 2024-03-31 ## 171 2024-03-31 ## 172 2024-03-31 ## 173 2024-03-31 ## 174 2024-03-31 ## 175 2024-03-31 ## 176 2024-03-31 ## 177 2024-03-31 ## 178 2024-03-31 ## 179 2024-03-31 ## 180 2024-03-31 ## 181 2024-03-31 ## 182 2024-03-31 ## 183 2024-03-31 ## 184 2024-03-31 ## 185 2024-03-31 ## 186 2024-03-31 ## 187 2024-03-31 ## 188 2024-03-31 ## 189 2024-03-31 ## 190 2024-03-31 ## 191 2024-03-31 ## 192 2024-03-31 ## 193 2024-03-31 ## 194 2024-03-31 ## 195 2024-03-31 ## 196 2024-03-31 ## 197 2024-03-31 ## 198 2024-03-31 ## 199 2024-03-31 ## 200 2024-03-31 ## 201 2024-03-31 ## 202 2024-03-31 ## 203 2024-03-31 ## 204 2024-03-31 ## 205 2024-03-31 ## 206 2024-03-31 ## 207 2024-03-31 ## 208 2024-03-31 ## 209 2024-03-31 ## 210 2024-03-31 ## 211 2024-03-31 ## 212 2024-03-31 ## 213 2024-03-31 ## 214 2024-03-31 ## 215 2024-03-31 ## 216 2024-03-31 ## 217 2024-03-31 ## 218 2024-03-31 ## 219 2024-03-31 ## 220 2024-03-31 ## 221 2024-03-31 ## 222 2024-03-31 ## 223 2024-03-31 ## 224 2024-03-31 ## 225 2024-03-31 ## 226 2024-03-31 ## 227 2024-03-31 ## 228 2024-03-31 ## 229 2024-03-31 ## 230 2024-03-31 ## 231 2024-03-31 ## 232 2024-03-31 ## 233 2024-03-31 ## 234 2024-03-31 ## 235 2024-03-31 ## 236 2024-03-31 ## 237 2024-03-31 ## 238 2024-03-31 ## 239 2024-03-31 ## 240 2024-03-31 ## 241 2024-03-31 ## 242 2024-03-31 ## 243 2024-03-31 ## 244 2024-03-31 ## 245 2024-03-31 ## 246 2024-03-31 ## 247 2024-03-31 ## 248 2024-03-31 ## 249 2024-03-31 ## 250 2024-03-31 ## 251 2024-03-31 ## 252 2024-03-31 ## 253 2024-03-31 ## 254 2024-03-31 ## 255 2024-03-31 ## 256 2024-03-31 ## 257 2024-03-31 ## 258 2024-03-31 ## 259 2024-03-31 ## 260 2024-03-31 ## 261 2024-03-31 ## 262 2024-03-31 ## 263 2024-03-31 ## 264 2024-03-31 ## 265 2024-03-31 ## 266 2024-03-31 ## 267 2024-03-31 ## 268 2024-03-31 ## 269 2024-03-31 ## 270 2024-03-31 ## 271 2024-03-31 ## 272 2024-03-31 ## 273 2024-03-31 ## 274 2024-03-31 ## 275 2024-03-31 ## 276 2024-03-31 ## 277 2024-03-31 ## 278 2024-01-14 ## 279 2024-03-31 ## 280 2024-03-31 ## 281 2024-03-31 ## 282 2024-03-31 ## 283 2024-03-31 ## 284 2024-03-31 ## 285 2024-03-31 ## 286 2024-03-31 ## 287 2024-03-31 ## 288 2024-03-31 ## 289 2024-03-31 ## 290 2024-03-31 ## 291 2024-03-31 ## 292 2024-03-31 ## 293 2024-03-31 ## 294 2024-03-31 ## 295 2024-03-31 ## 296 2024-03-31 ## 297 2024-03-31 ## 298 2024-03-31 ## 299 2024-03-31 ## 300 2024-03-31 ## 301 2024-03-31 ## 302 2024-03-31 ## 303 2024-03-31 ## 304 2024-03-31 ## 305 2024-03-31 ## 306 2024-03-31 ## 307 2024-03-31 ## 308 2024-03-31 ## 309 2024-03-31 ## 310 2024-03-31 ## 311 2024-03-31 ## 312 2024-03-31 ## 313 2024-03-31 ## 314 2024-03-31 ## 315 2024-03-31 ## 316 2024-03-31 ## 317 2024-03-31 ## 318 2024-03-31 ## 319 2024-03-31 ## 320 2024-03-31 ## 321 2024-03-31 ## 322 2024-03-31 ## 323 2024-03-31 ## 324 2024-03-31 ## 325 2024-03-31 ## 326 2024-03-31 ## 327 2024-03-31 ## 328 2024-03-31 ## 329 2024-03-31 ## 330 2024-03-31 ## 331 2024-03-31 ## 332 2024-03-31 ## 333 2024-03-31 ## 334 2024-03-31 ## 335 2024-03-31 ## 336 2024-03-31 ## 337 2024-03-31 ## 338 2024-03-31 ## 339 2024-03-31 ## 340 2024-03-31 ## 341 2024-03-31 ## 342 2024-03-31 ## 343 2024-03-31 ## 344 2024-03-31 ## 345 2024-03-31 ## 346 2024-03-31 ## 347 2024-03-31 ## 348 2024-03-31 ## 349 2024-03-31 ## 350 2024-03-31 ## 351 2024-03-31 ## 352 2024-03-31 ## 353 2024-03-31 ## 354 2024-03-31 ## 355 2024-03-31 ## 356 2024-03-31 ## 357 2024-03-31 ## 358 2024-03-31 ## 359 2024-03-31 ## 360 2024-03-31 ## 361 2024-03-31 ## 362 2024-03-31 ## 363 2024-03-31 ## 364 2024-03-31 ## 365 2024-03-31 ## 366 2024-03-31 ## 367 2024-03-31 ## 368 2024-03-31 ## 369 2024-03-31 ## 370 2024-03-31 ## 371 2024-03-31 ## 372 2024-03-31 ## 373 2024-03-31 ## 374 2024-03-31 ## 375 2024-03-31 ## 376 2024-03-31 ## 377 2024-03-31 ## 378 2024-03-31 ## 379 2024-03-31 ## 380 2024-03-31 ## 381 2024-03-31 ## 382 2024-03-31 ## 383 2024-03-31 ## 384 2024-03-31 ## 385 2024-03-31 ## 386 2024-03-31 ## 387 2024-03-31 ## 388 2024-03-31 ## 389 2024-03-31 ## 390 2024-03-31 ## 391 2024-03-31 ## 392 2024-03-31 ## 393 2024-03-31 ## 394 2024-03-31 ## 395 2024-03-31 ## 396 2024-03-31 ## 397 2024-03-31 ## 398 2024-03-31 ## 399 2024-03-31 ## 400 2024-03-31 ## 401 2024-03-31 ## 402 2024-03-31 ## 403 2024-03-31 ## 404 2024-03-31 ## 405 2024-03-31 ## 406 2024-03-31 ## 407 2024-03-31 ## 408 2024-03-31 ## 409 2024-03-31 ## 410 2024-03-31 ## 411 2024-03-31 ## 412 2024-03-31 ## 413 2024-03-31 ## 414 2024-03-31 ## 415 2024-03-31 ## 416 2024-03-31 ## 417 2024-03-31 ## 418 2024-03-31 ## 419 2024-03-31 ## 420 2024-03-31 ## 421 2024-03-31 ## 422 2024-03-31 ## 423 2024-03-31 ## 424 2024-03-31 ## 425 2024-03-31 ## 426 2024-01-14 ## 427 2024-03-31 ## 428 2024-03-31 ## 429 2024-03-31 ## 430 2024-03-31 ## 431 2024-03-31 ## 432 2024-03-31 ## 433 2024-03-31 ## 434 2024-03-31 ## 435 2024-03-31 ## 436 2024-03-31 ## 437 2024-03-31 ## 438 2024-03-31 ## 439 2024-03-31 ## 440 2024-03-31 ## 441 2024-03-31 ## 442 2024-03-31 ## 443 2024-03-31 ## 444 2024-03-31 ## 445 2024-03-31 ## 446 2024-03-31 ## 447 2024-03-31 ## 448 2024-03-31 ## 449 2024-03-31 ## 450 2024-03-31 ## 451 2024-03-31 ## 452 2024-03-31 ## 453 2024-03-31 ## 454 2024-03-31 ## 455 2024-03-31 ## 456 2024-03-31 ## 457 2024-03-31 ## 458 2024-03-31 ## 459 2024-03-31 ## 460 2024-03-31 ## 461 2024-03-31 ## 462 2024-03-31 ## 463 2024-03-31 ## 464 2024-03-31 ## 465 2024-03-31 ## 466 2024-03-31 ## 467 2024-03-31 ## 468 2024-03-31 ## 469 2024-03-31 ## 470 2024-03-31 ## 471 2024-03-31 ## 472 2024-03-31 ## 473 2024-03-31 ## 474 2024-03-31 ## 475 2024-03-31 ## 476 2024-03-31 ## 477 2024-03-31 ## 478 2024-03-31 ## 479 2024-03-31 ## 480 2024-03-31 ## 481 2024-03-31 ## 482 2024-03-31 ## 483 2024-03-31 ## 484 2024-03-31 ## 485 2024-03-31 ## 486 2024-03-31 ## 487 2024-03-31 ## 488 2024-03-31 ## 489 2024-03-31 ## 490 2024-03-31 ## 491 2024-03-31 ## 492 2024-03-31 ## 493 2024-03-31 ## 494 2024-03-31 ## 495 2024-03-31 ## 496 2024-03-31 ## 497 2024-03-31 ## 498 2024-03-31 ## 499 2024-03-31 ## 500 2024-03-31 ## 501 2024-03-31 ## 502 2024-03-31 ## 503 2024-03-31 ## 504 2024-03-31 ## 505 2024-03-31 ## 506 2024-03-31 ## 507 2024-03-31 ## 508 2024-03-31 ## 509 2024-03-31 ## 510 2024-03-31 ## 511 2024-03-31 ## 512 2024-03-31 ## 513 2024-03-31 ## 514 2024-03-31 ## 515 2024-03-31 ## 516 2024-03-31 ## 517 2024-03-31 ## 518 2024-03-31 ## 519 2024-03-31 ## 520 2024-03-31 ## 521 2024-03-31 ## 522 2024-03-31 ## 523 2024-03-31 ## 524 2024-03-31 ## 525 2024-03-31 ## 526 2024-03-31 ## 527 2024-03-31 ## 528 2024-03-31 ## 529 2024-03-31 ## 530 2024-03-31 ## 531 2024-03-31 ## 532 2024-03-31 ## 533 2024-03-31 ## 534 2024-03-31 ## 535 2024-03-31 ## 536 2024-03-31 ## 537 2024-03-31 ## 538 2024-03-31 ## 539 2024-03-31 ## 540 2024-03-31 ## 541 2024-03-31 ## 542 2024-03-31 ## 543 2024-03-31 ## 544 2024-03-31 ## 545 2024-03-31 ## 546 2024-03-31 ## 547 2024-03-31 ## 548 2024-03-31 ## 549 2024-03-31 ## 550 2024-03-31 ## 551 2024-03-31 ## 552 2024-03-31 ## 553 2024-03-31 ## 554 2024-03-31 ## 555 2024-03-31 ## 556 2024-03-31 ## 557 2024-03-31 ## 558 2024-03-31 ## 559 2024-03-31 ## 560 2024-03-31 ## 561 2024-03-31 ## 562 2024-03-31 ## 563 2024-03-31 ## 564 2024-03-31 ## 565 2024-03-31 ## 566 2024-03-31 ## 567 2024-03-31 ## 568 2024-03-31 ## 569 2024-03-31 ## 570 2024-03-31 ## 571 2024-03-31 ## 572 2024-03-31 ## 573 2024-03-31 ## 574 2024-03-31 ## 575 2024-03-31 ## 576 2024-03-31 ## 577 2024-03-31 ## 578 2024-03-31 ## 579 2024-03-31 ## 580 2024-03-31 ## 581 2024-03-31 ## 582 2024-03-31 ## 583 2024-03-31 ## 584 2024-03-31 ## 585 2024-03-31 ## 586 2024-03-31 ## 587 2024-03-31 ## 588 2024-03-31 ## 589 2024-03-31 ## 590 2024-03-31 ## 591 2024-03-31 ## 592 2024-03-31 ## 593 2024-03-31 ## 594 2024-03-31 ## 595 2024-03-31 ## 596 2024-03-31 ## 597 2024-03-31 ## 598 2024-03-31 ## 599 2024-03-31 ## 600 2024-03-31 ## 601 2024-03-31 ## 602 2024-03-31 ## 603 2024-03-31 ## 604 2024-03-31 ## 605 2024-03-31 ## 606 2024-03-31 ## 607 2024-03-31 ## 608 2024-03-31 ## 609 2024-03-31 ## 610 2024-03-31 ## 611 2024-03-31 ## 612 2024-03-31 ## 613 2024-03-31 ## 614 2024-03-31 ## 615 2024-03-31 ## 616 2024-03-31 ## 617 2024-03-31 ## 618 2024-03-31 ## 619 2024-03-31 ## 620 2024-03-31 ## 621 2024-03-31 ## 622 2024-03-31 ## 623 2024-03-31 ## 624 2024-03-31 ## 625 2024-03-31 ## 626 2024-03-31 ## 627 2024-03-31 ## 628 2024-03-31 ## 629 2024-03-31 ## 630 2024-03-31 ## 631 2024-03-31 ## 632 2024-03-31 ## 633 2024-03-31 ## 634 2024-03-31 ## 635 2024-03-31 ## 636 2024-03-31 ## 637 2024-03-31 ## 638 2024-03-31 ## 639 2024-03-31 ## 640 2024-03-31 ## 641 2024-03-31 ## 642 2024-03-31 ## 643 2024-03-31 ## 644 2024-03-31 ## 645 2024-03-31 ## 646 2024-03-31 ## 647 2024-03-31 ## 648 2024-03-31 ## 649 2024-03-31 ## 650 2024-03-31 ## 651 2024-03-31 ## 652 2024-03-31 ## 653 2024-03-31 ## 654 2024-03-31 ## 655 2024-03-31 ## 656 2024-03-31 ## 657 2024-03-31 ## 658 2024-03-31 ## 659 2024-03-31 ## 660 2024-03-31 ## 661 2024-03-31 ## 662 2024-03-31 ## 663 2024-03-31 ## 664 2024-03-31 ## 665 2024-03-31 ## 666 2024-03-31 ## 667 2024-03-31 ## 668 2024-03-31 ## 669 2024-03-31 ## 670 2024-03-31 ## 671 2024-03-31 ## 672 2024-03-31 ## 673 2024-03-31 ## 674 2024-03-31 ## 675 2024-03-31 ## 676 2024-03-31 ## 677 2024-03-31 ## 678 2024-03-31 ## 679 2024-03-31 ## 680 2024-03-31 ## 681 2024-03-31 ## 682 2024-03-31 ## 683 2024-03-31 ## 684 2024-03-31 ## 685 2024-03-31 ## 686 2024-03-31 ## 687 2024-03-31 ## 688 2024-03-31 ## 689 2024-03-31 ## 690 2024-03-31 ## 691 2024-03-31 ## 692 2024-03-31 ## 693 2024-03-31 ## 694 2024-03-31 ## 695 2024-03-31 ## 696 2024-03-31 ## 697 2024-03-31 ## 698 2024-03-31 ## 699 2024-03-31 ## 700 2024-03-31 ## 701 2024-03-31 ## 702 2024-03-31 ## 703 2024-03-31 ## 704 2024-03-31 ## 705 2024-03-31 ## 706 2024-03-31 ## 707 2024-03-31 ## 708 2024-03-31 ## 709 2024-03-31 ## 710 2024-03-31 ## 711 2024-03-31 ## 712 2024-03-31 ## 713 2024-03-31 ## 714 2024-03-31 ## 715 2024-03-31 ## 716 2024-03-31 ## 717 2024-03-31 ## 718 2024-03-31 ## 719 2024-03-31 ## 720 2024-03-31 ## 721 2024-03-31 ## 722 2024-03-31 ## 723 2024-03-31 ## 724 2024-03-31 ## 725 2024-03-31 ## 726 2024-03-31 ## 727 2024-03-31 ## 728 2024-03-31 ## 729 2024-03-31 ## 730 2024-03-31 ## 731 2024-03-31 ## 732 2024-03-31 ## 733 2024-03-31 ## 734 2024-03-31 ## 735 2024-03-31 ## 736 2024-03-31 ## 737 2024-03-31 ## 738 2024-03-31 ## 739 2024-03-31 ## 740 2024-03-31 ## 741 2024-03-31 ## 742 2024-03-31 ## 743 2024-03-31 ## 744 2024-03-31 ## 745 2024-03-31 ## 746 2024-03-31 ## 747 2024-03-31 ## 748 2024-03-31 ## 749 2024-03-31 ## 750 2024-03-31 ## 751 2024-03-31 ## 752 2024-03-31 ## 753 2024-03-31 ## 754 2024-03-31 ## 755 2024-03-31 ## 756 2024-03-31 ## 757 2024-03-31 ## 758 2024-03-31 ## 759 2024-03-31 ## 760 2024-03-31 ## 761 2024-03-31 ## 762 2024-03-31 ## 763 2024-03-31 ## 764 2024-03-31 ## 765 2024-03-31 ## 766 2024-03-31 ## 767 2024-03-31 ## 768 2024-03-31 ## 769 2024-03-31 ## 770 2024-03-31 ## 771 2024-03-31 ## 772 2024-03-31 ## 773 2024-03-31 ## 774 2024-03-31 ## 775 2024-03-31 ## 776 2024-03-31 ## 777 2024-03-31 ## 778 2024-03-31 ## 779 2024-03-31 ## 780 2024-03-31 ## 781 2024-03-31 ## 782 2024-03-31 ## 783 2024-03-31 ## 784 2024-03-31 ## 785 2024-03-31 ## 786 2024-03-31 ## 787 2024-03-31 ## 788 2024-03-31 ## 789 2024-03-31 ## 790 2024-03-31 ## 791 2024-03-31 ## 792 2024-03-31 ## 793 2024-03-31 ## 794 2024-03-31 ## 795 2024-03-31 ## 796 2024-03-31 ## 797 2024-03-31 ## 798 2024-03-31 ## 799 2024-03-31 ## 800 2024-03-31 ## 801 2024-03-31 ## 802 2024-03-31 ## 803 2024-03-31 ## 804 2024-03-31 ## 805 2024-03-31 ## 806 2024-03-31 ## 807 2024-03-31 ## 808 2024-03-31 ## 809 2024-03-31 ## 810 2024-03-31 ## 811 2024-03-31 ## 812 2024-03-31 ## 813 2024-03-31 ## 814 2024-03-31 ## 815 2024-03-31 ## 816 2024-03-31 ## 817 2024-03-31 ## 818 2024-03-31 ## 819 2024-03-31 ## 820 2024-03-31 ## 821 2024-03-31 ## 822 2024-03-31 ## 823 2024-03-31 ## 824 2024-03-31 ## 825 2024-03-31 ## 826 2024-03-31 ## 827 2024-03-31 ## 828 2024-03-31 ## 829 2024-03-31 ## 830 2024-03-31 ## 831 2024-03-31 ## 832 2024-03-31 ## 833 2024-03-31 ## 834 2024-03-31 ## 835 2024-03-31 ## 836 2024-03-31 ## 837 2024-03-31 ## 838 2024-03-31 ## 839 2024-03-31 ## 840 2024-03-31 ## 841 2024-03-31 ## 842 2024-03-31 ## 843 2024-03-31 ## 844 2024-03-31 ## 845 2024-03-31 ## 846 2024-03-31 ## 847 2024-03-31 ## 848 2024-03-31 ## 849 2024-03-31 ## 850 2024-03-31 ## 851 2024-03-31 ## 852 2024-03-31 ## 853 2024-03-31 ## 854 2024-03-31 ## 855 2024-03-31 ## 856 2024-03-31 ## 857 2024-03-31 ## 858 2024-03-31 ## 859 2024-03-31 ## 860 2024-03-31 ## 861 2024-03-31 ## 862 2024-03-31 ## 863 2024-03-31 ## 864 2024-03-31 ## 865 2024-03-31 ## 866 2024-03-31 ## 867 2024-03-31 ## 868 2024-03-31 ## 869 2024-03-31 ## 870 2024-03-31 ## 871 2024-03-31 ## 872 2024-03-31 ## 873 2024-03-31 ## 874 2024-03-31 ## 875 2024-03-31 ## 876 2024-03-31 ## 877 2024-03-31 ## 878 2024-03-31 ## 879 2024-03-31 ## 880 2024-03-31 ## 881 2024-03-31 ## 882 2024-03-31 ## 883 2024-03-30 ## 884 2024-03-31 ## 885 2024-03-31 ## 886 2024-03-31 ## 887 2024-03-31 ## 888 2024-03-31 ## 889 2024-03-31 ## 890 2024-03-31 ## 891 2024-03-31 ## 892 2024-03-31 ## 893 2024-03-31 ## 894 2024-03-31 ## 895 2024-03-31 ## 896 2024-03-31 ## 897 2024-03-31 ## 898 2024-03-31 ## 899 2024-03-31 ## 900 2024-03-31 ## 901 2024-03-31 ## 902 2024-03-31 ## 903 2024-03-31 ## 904 2024-03-31 ## 905 2024-03-31 ## 906 2024-03-31 ## 907 2024-03-31 ## 908 2024-03-31 ## 909 2024-03-31 ## 910 2024-03-31 ## 911 2024-03-31 ## 912 2024-03-31 ## 913 2024-03-31 ## 914 2024-03-31 ## 915 2024-03-31 ## 916 2024-03-31 ## 917 2024-03-31 ## 918 2024-03-31 ## 919 2024-03-31 ## 920 2024-03-31 ## 921 2024-03-31 ## 922 2024-03-31 ## 923 2024-03-31 ## 924 2024-03-31 ## 925 2024-03-31 ## 926 2024-03-31 ## 927 2024-03-31 ## 928 2024-03-31 ## 929 2024-03-31 ## 930 2024-03-31 ## 931 2024-03-31 ## 932 2024-03-31 ## 933 2024-03-31 ## 934 2024-03-31 ## 935 2024-03-31 ## 936 2024-03-31 ## 937 2024-03-31 ## 938 2024-03-31 ## 939 2024-03-31 ## 940 2024-03-31 ## 941 2024-03-31 ## 942 2024-03-31 ## 943 2024-03-31 ## 944 2024-03-31 ## 945 2024-03-31 ## 946 2024-03-31 ## 947 2024-03-31 ## 948 2024-03-31 ## 949 2024-03-31 ## 950 2024-03-31 ## 951 2024-03-31 ## 952 2024-03-31 ## 953 2024-03-31 ## 954 2024-03-31 ## 955 2024-03-31 ## 956 2024-03-31 ## 957 2024-03-31 ## 958 2024-03-31 ## 959 2024-03-31 ## 960 2024-03-31 ## 961 2024-03-31 ## 962 2024-03-31 ## 963 2024-03-31 ## 964 2024-03-31 ## 965 2024-03-31 ## 966 2024-03-31 ## 967 2024-03-31 ## 968 2024-03-31 ## 969 2024-03-31 ## 970 2024-03-31 ## 971 2024-03-31 ## 972 2024-03-31 ## 973 2024-03-31 ## 974 2024-03-31 ## 975 2024-03-31 ## 976 2024-03-31 ## 977 2024-03-31 ## 978 2024-03-31 ## 979 2024-03-31 ## 980 2024-03-31 ## 981 2024-03-31 ## 982 2024-03-31 ## 983 2024-03-31 ## 984 2024-03-31 ## 985 2024-03-31 ## 986 2024-03-31 ## 987 2024-03-31 ## 988 2024-03-31 ## 989 2024-03-31 ## 990 2024-03-31 ## 991 2024-03-31 ## 992 2024-03-31 ## 993 2024-03-31 ## 994 2024-03-31 ## 995 2024-03-31 ## 996 2024-03-31 ## 997 2024-03-31 ## 998 2024-03-31 ## 999 2024-03-31 ## 1000 2024-03-31 ## 1001 2024-03-31 ## 1002 2024-03-31 ## 1003 2024-03-31 ## 1004 2024-01-14 ## 1005 2024-03-31 ## 1006 2024-03-31 ## 1007 2024-03-31 ## 1008 2024-03-31 ## 1009 2024-03-31 ## 1010 2024-03-31 ## 1011 2024-03-31 ## 1012 2024-03-31 ## 1013 2024-03-31 ## 1014 2024-03-31 ## 1015 2024-03-31 ## 1016 2024-03-31 ## 1017 2024-03-31 ## 1018 2024-03-31 ## 1019 2024-03-31 ## 1020 2024-03-31 ## 1021 2024-03-31 ## 1022 2024-03-31 ## 1023 2024-03-31 ## 1024 2024-03-31 ## 1025 2024-03-31 ## 1026 2024-03-31 ## 1027 2024-03-31 ## 1028 2024-03-31 ## 1029 2024-03-31 ## 1030 2024-03-31 ## 1031 2024-03-31 ## 1032 2024-03-31 ## 1033 2024-03-31 ## 1034 2024-03-31 ## 1035 2024-03-31 ## 1036 2024-03-31 ## 1037 2024-03-31 ## 1038 2024-03-31 ## 1039 2024-03-31 ## 1040 2024-03-31 ## 1041 2024-03-31 ## 1042 2024-03-31 ## 1043 2024-03-31 ## 1044 2024-03-31 ## 1045 2024-03-31 ## 1046 2024-03-31 ## 1047 2024-03-31 ## 1048 2024-03-31 ## 1049 2024-03-31 ## 1050 2024-03-31 ## 1051 2024-03-31 ## 1052 2024-03-31 ## 1053 2024-03-31 ## 1054 2024-03-31 ## 1055 2024-03-31 ## 1056 2024-03-31 ## 1057 2024-03-31 ## 1058 2024-03-31 ## 1059 2024-03-31 ## 1060 2024-03-31 ## 1061 2024-03-31 ## 1062 2024-03-31 ## 1063 2024-03-31 ## 1064 2024-03-31 ## 1065 2024-03-31 ## 1066 2024-03-31 ## 1067 2024-03-31 ## 1068 2024-03-31 ## 1069 2024-03-31 ## 1070 2024-03-31 ## 1071 2024-03-31 ## 1072 2024-03-31 ## 1073 2024-03-31 ## 1074 2024-03-31 ## 1075 2024-03-31 ## 1076 2024-03-31 ## 1077 2024-03-31 ## 1078 2024-03-31 ## 1079 2024-03-31 ## 1080 2024-03-31 ## 1081 2024-03-31 ## 1082 2024-03-31 ## 1083 2024-03-31 ## 1084 2024-03-31 ## 1085 2024-03-31 ## 1086 2024-03-31 ## 1087 2024-03-31 ## 1088 2024-03-31 ## 1089 2024-03-31 ## 1090 2024-03-31 ## 1091 2024-03-31 ## 1092 2024-03-31 ## 1093 2024-03-31 ## 1094 2024-03-31 ## 1095 2024-03-31 ## 1096 2024-03-31 ## 1097 2024-03-31 ## 1098 2024-03-31 ## 1099 2024-03-31 ## 1100 2024-03-31 ## 1101 2024-03-31 ## 1102 2024-03-31 ## 1103 2024-03-31 ## 1104 2024-03-31 ## 1105 2024-03-31 ## 1106 2024-03-31 ## 1107 2024-03-31 ## 1108 2024-03-31 ## 1109 2024-03-31 ## 1110 2024-03-31 ## 1111 2024-03-31 ## 1112 2024-03-31 ## 1113 2024-03-31 ## 1114 2024-03-31 ## 1115 2024-03-31 ## 1116 2024-03-31 ## 1117 2024-03-31 ## 1118 2024-03-31 ## 1119 2024-03-31 ## 1120 2024-03-31 ## 1121 2024-03-31 ## 1122 2024-03-31 ## 1123 2024-03-31 ## 1124 2024-03-31 ## 1125 2024-03-31 ## 1126 2024-03-31 ## 1127 2024-03-31 ## 1128 2024-03-31 ## 1129 2024-03-31 ## 1130 2024-03-31 ## 1131 2024-03-31 ## 1132 2024-03-31 ## 1133 2024-03-31 ## 1134 2024-03-31 ## 1135 2024-03-31 ## 1136 2024-03-31 ## 1137 2024-03-31 ## 1138 2024-03-31 ## 1139 2024-03-31 ## 1140 2024-03-31 ## 1141 2024-03-31 ## 1142 2024-03-15 ## 1143 2024-03-31 ## 1144 2024-03-31 ## 1145 2024-03-31 ## 1146 2024-03-18 ## 1147 2024-03-31 ## 1148 2024-03-31 ## 1149 2024-03-31 ## 1150 2024-03-31 ## 1151 2024-03-31 ## 1152 2024-03-31 ## 1153 2024-03-31 ## 1154 2024-03-31 ## 1155 2024-03-31 ## 1156 2024-03-31 ## 1157 2024-03-31 ## 1158 2024-03-31 ## 1159 2024-03-31 ## 1160 2024-03-31 ## 1161 2024-03-31 ## 1162 2024-03-31 ## 1163 2024-03-31 ## 1164 2024-03-31 ## 1165 2024-03-31 ## 1166 2024-03-31 ## 1167 2024-03-31 ## 1168 2024-03-31 ## 1169 2024-03-31 ## 1170 2024-03-31 ## 1171 2024-03-31 ## 1172 2024-03-31 ## 1173 2024-03-31 ## 1174 2024-03-31 ## 1175 2024-03-31 ## 1176 2024-03-31 ## 1177 2024-03-31 ## 1178 2024-03-31 ## 1179 2024-03-31 ## 1180 2024-03-31 ## 1181 2024-03-31 ## 1182 2024-03-31 ## 1183 2024-03-31 ## 1184 2024-03-31 ## 1185 2024-03-31 ## 1186 2024-03-31 ## 1187 2024-03-31 ## 1188 2024-03-31 ## 1189 2024-03-31 ## 1190 2024-03-31 ## 1191 2024-03-31 ## 1192 2024-03-31 ## 1193 2024-03-31 ## 1194 2024-03-31 ## 1195 2024-03-31 ## 1196 2024-03-31 ## 1197 2024-03-31 ## 1198 2024-03-31 ## 1199 2024-03-31 ## 1200 2024-03-31 ## 1201 2024-03-31 ## 1202 2024-03-31 ## 1203 2024-03-31 ## 1204 2024-03-31 ## 1205 2024-03-31 ## 1206 2024-03-31 ## 1207 2024-03-31 ## 1208 2024-03-31 ## 1209 2024-03-31 ## 1210 2024-03-31 ## 1211 2024-03-31 ## 1212 2024-03-31 ## 1213 2024-03-31 ## 1214 2024-03-31 ## 1215 2024-03-31 ## 1216 2024-03-31 ## 1217 2024-03-31 ## 1218 2024-03-31 ## 1219 2024-03-31 ## 1220 2024-03-31 ## 1221 2024-03-31 ## 1222 2024-03-31 ## 1223 2024-03-31 ## 1224 2024-03-31 ## 1225 2024-03-31 ## 1226 2024-03-31 ## 1227 2024-03-31 ## 1228 2024-03-31 ## 1229 2024-03-31 ## 1230 2024-03-31 ## 1231 2024-03-31 ## 1232 2024-03-26 ## 1233 2024-03-31 ## 1234 2024-03-31 ## 1235 2024-03-31 ## 1236 2024-03-31 ## 1237 2024-03-31 ## 1238 2024-03-31 ## 1239 2024-03-31 ## 1240 2024-03-31 ## 1241 2024-03-31 ## 1242 2024-03-31 ## 1243 2024-03-31 ## 1244 2024-03-31 ## 1245 2024-03-31 ## 1246 2024-03-31 ## 1247 2024-03-31 ## 1248 2024-03-31 ## 1249 2024-03-31 ## 1250 2024-03-31 ## 1251 2024-03-31 ## 1252 2024-03-31 ## 1253 2024-03-31 ## 1254 2024-03-31 ## 1255 2024-03-31 ## 1256 2024-03-31 ## 1257 2024-03-31 ## 1258 2024-03-31 ## 1259 2024-03-31 ## 1260 2024-03-31 ## 1261 2024-03-31 ## 1262 2024-03-31 ## 1263 2024-03-31 ## 1264 2024-03-31 ## 1265 2024-03-31 ## 1266 2024-03-31 ## 1267 2024-03-31 ## 1268 2024-03-31 ## 1269 2024-03-31 ## 1270 2024-03-31 ## 1271 2024-03-31 ## 1272 2024-03-31 ## 1273 2024-03-31 ## 1274 2024-03-31 ## 1275 2024-03-31 ## 1276 2024-03-31 ## 1277 2024-03-31 ## 1278 2024-03-31 ## 1279 2024-03-31 ## 1280 2024-03-31 ## 1281 2024-03-31 ## 1282 2024-03-31 ## 1283 2024-03-31 ## 1284 2024-03-31 ## 1285 2024-03-31 ## 1286 2024-03-31 ## 1287 2024-03-31 ## 1288 2024-03-31 ## 1289 2024-03-31 ## 1290 2024-03-31 ## 1291 2024-03-31 ## 1292 2024-03-31 ## 1293 2024-03-31 ## 1294 2024-03-31 ## 1295 2024-03-31 ## 1296 2024-03-31 ## 1297 2024-03-31 ## 1298 2024-03-31 ## 1299 2024-03-31 ## 1300 2024-03-31 ## 1301 2024-03-31 ## 1302 2024-03-31 ## 1303 2024-03-31 ## 1304 2024-03-31 ## 1305 2024-03-31 ## 1306 2024-03-31 ## 1307 2024-03-31 ## 1308 2024-03-31 ## 1309 2024-03-31 ## 1310 2024-03-31 ## 1311 2024-03-31 ## 1312 2024-03-31 ## 1313 2024-03-31 ## 1314 2024-03-31 ## 1315 2024-03-31 ## 1316 2024-03-31 ## 1317 2024-03-31 ## 1318 2024-03-31 ## 1319 2024-03-31 ## 1320 2024-03-31 ## 1321 2024-03-31 ## 1322 2024-03-31 ## 1323 2024-03-31 ## 1324 2024-03-31 ## 1325 2024-03-31 ## 1326 2024-03-31 ## 1327 2024-03-31 ## 1328 2024-03-31 ## 1329 2024-03-31 ## 1330 2024-03-31 ## 1331 2024-03-31 ## 1332 2024-03-31 ## 1333 2024-03-31 ## 1334 2024-03-31 ## 1335 2024-03-31 ## 1336 2024-03-31 ## 1337 2024-03-31 ## 1338 2024-03-31 ## 1339 2024-03-31 ## 1340 2024-03-31 ## 1341 2024-03-31 ## 1342 2024-03-31 ## 1343 2024-03-31 ## 1344 2024-03-31 ## 1345 2024-03-31 ## 1346 2024-03-31 ## 1347 2024-03-31 ## 1348 2024-03-31 ## 1349 2024-03-31 ## 1350 2024-03-31 ## 1351 2024-03-31 ## 1352 2024-03-31 ## 1353 2024-03-31 ## 1354 2024-03-31 ## 1355 2024-03-31 ## 1356 2024-03-31 ## 1357 2024-01-14 ## 1358 2024-03-31 ## 1359 2024-03-31 ## 1360 2024-03-31 ## 1361 2024-03-31 ## 1362 2024-03-31 ## 1363 2024-03-31 ## 1364 2024-03-31 ## 1365 2024-03-31 ## 1366 2024-03-31 ## 1367 2024-03-31 ## 1368 2024-03-31 ## 1369 2024-03-31 ## 1370 2024-03-31 ## 1371 2024-03-31 ## 1372 2024-03-31 ## 1373 2024-03-31 ## 1374 2024-03-31 ## 1375 2024-03-31 ## 1376 2024-03-31 ## 1377 2024-03-31 ## 1378 2024-03-31 ## 1379 2024-03-31 ## 1380 2024-03-31 ## 1381 2024-03-31 ## 1382 2024-03-31 ## 1383 2024-03-31 ## 1384 2024-03-31 ## 1385 2024-03-31 ## 1386 2024-03-31 ## 1387 2024-03-31 ## 1388 2024-03-31 2.2.3 Reading Taipei Residential Burglary Data 該資料網址可到臺北市資料大平臺 (data.taipei)上查詢「住宅竊盜點位資訊」後,點選「API」後複製取得。 url <- "https://data.taipei/api/v1/dataset/93d9bc2d-af08-4db7-a56b-9f0a49226fa3?scope=resourceAquire" res <- read_json(url, simplifyVector = T) df <- res$result$results head(df) dplyr::glimpse(df) 2.3 R Q&A 2.3.1 Encoding and Language Sys.setlocale(category = "LC_ALL", locale = "UTF-8") Sys.setlocale(category = "LC_ALL", locale = "cht") 如果讀取到資料有中文的話,此時,你只需要指定locale為cht,然後重開該data.frame就可以解決該問題。 Sys.setlocale(category = "LC_ALL", locale = "cht") 但你在寫程式剖析HTML時若使用了rvest這個套件,有可能在html_node()函式時會因為編碼而產生問題,此時你會需要把locale改為C。這個C指的是C語言的C。 Sys.setlocale(category = "LC_ALL", locale = "C") 參考連結:http://psmethods.postach.io/post/ru-he-geng-gai-rde-yu-she-yu-xi 參考連結:https://stat.ethz.ch/R-manual/R-devel/library/base/html/locales.html The locale describes aspects of the internationalization of a program. Initially most aspects of the locale of R are set to “C” (which is the default for the C language and reflects North-American usage) 2.3.2 RMD/R Notebook無法儲存 R Notebook 要存檔的時候檔名絕對不要有空白,若有空白就用底線_代替,否則Notebook寫到一半會無法預覽下半部的程式並出現錯誤訊息。若仍然無法儲存或出現錯誤訊息,應該只要開另外一個R Notebook檔案,複製程式碼即可。 "],["r-basic.html", "Chapter 3 R Basic 3.1 R Syntax 3.2 Vector 3.3 Calculating with vectors 3.4 Data types 3.5 Character operations", " Chapter 3 R Basic R base是R語言的基本程式庫和核心功能,提供了許多常用的指令和函數。以下是一些常見的R base指令: assignment operators(賦值運算符):<- 或 = 用來將數值、向量、函數等資料物件賦值給變數。 arithmetic operators(算術運算符):+、-、*、/、^、%/%和%%用於數值運算,如加、減、乘、除、指數、整除和取餘等。 relational operators(關係運算符):==、!=、>、>=、<和<=用於比較數值或字符型資料的大小關係,返回邏輯值(TRUE或FALSE)。 logical operators(邏輯運算符):&、|和!用於對邏輯值進行運算,如AND、OR和NOT等。 control flow statements(流程控制語句):if、else、for、while、repeat、break和next用於控制程式的執行流程。 functions(函數):R base提供了許多內置函數,如sum、mean、var、sd、cor、lm等,用於數值計算、統計分析、線性回歸等常見操作。 data structures(資料結構):R base提供了多種資料結構,如向量、矩陣、數組、列表、因子等,用於存儲和處理不同類型的資料。 data input/output(資料輸入輸出):R base提供了多種函數和工具,如read.table、write.table、read.csv、write.csv等,用於讀取和寫入資料。 3.1 R Syntax R可以做很複雜的加減乘除,例如直接在程式碼中打上(1+3)*2.01,總之,看你算式怎麼寫,他就會算出相對應的數值。但其實我們通常使用R語言是要餵給他資料,然後讓他來做運算。此時,要有一個容器來容納這些數值或資料,這個容器就是變數(Variable)。 3.1.1 Assignment <- 將右邊的算式或數值指(Assign)給左邊的變數。左側都是變數,右側則可能是數字或變數。你可以把他想像為把右側做完了以後,指(Assign)給左側的變數。 Assignment對變數型態(Variable Type)的影響:<-右側如果是numeric,那左側的變數就是numeric變數;右側如果是character,左側的變數就是character變數。 在幾乎所有程式語言中,單等號=指的是assignment,把右方的算式、值或物件指給左方的變數。而比較兩者相不相等,則用雙等號==,例如1==3-2。R當初在設計時可能是為了避免混淆,所以把assignment的符號設計為<-。 a <- 1 b <- c(1, 2, 3, 4) c <- c("1", "2", "3", "4") d <- c(b, a) e <- "abcd" 3.1.2 Comments 註解 註解:在程式碼區塊若前面有#字號後面跟著空白的話,那代表那行被標示為註解,程式執行時會自動跳過註解不執行。 快速鍵:當游標在某一行程式碼時打cmd(ctrl)-shift-c,就可以產生註解。 # df <- data.frame(a = c(1, 2, 3), b = c(3, 4, 5)) 3.2 Vector 但我如果要為所有我要運算的數字都產生一個與之對應的變數,這樣做不完。所以,我們會很常使用其他種序列或者對應的結構來儲存多筆資料。例如vector、list或Data.Frame。 在R語言中,vector是一種基本的資料類型,它是由相同類型的元素組成的序列,可以存儲數值、文字、邏輯值等不同類型的資料。例如,以下是一個由整數元素組成的vector:my_vector <- c(1, 2, 3, 4, 5)。而我如果要存取第一個數字,我便可用my_vector[1]的方式存取,分別代表my_vector中第一個位置的內容(第二個、第三個依此類推)。 在程式碼中,只要是文字必用成對的雙引號或單引號包含其中,以區隔「變數」和「數字」。例如如果看到沒有雙引號的「英文字母」必定是變數名稱,或函式名稱。如果看到有雙引號的數字,那也是文字。 以下資料來自各縣市平均每月薪資所得或各縣市人口數。 3.2.1 Creating vectors vector通常用c()函數創建,其中c表示”combine”或”concatenate”,可以將多個元素組合成一個vector。 income <- c(70100, 51300, 51100, 48400, 47600, 43000) county <- c("台北", "新北", "桃園", "高雄", "台中", "台南") population <- c(2.6, 3.9, 2.2, 2.7, 2.8, 1.8) area <- c(271.8, 2052.5, 1221, 2951.9, 2214.9, 2191.7) income ## [1] 70100 51300 51100 48400 47600 43000 county[c(5, 3, 1)] ## [1] "台中" "桃園" "台北" county <- county[c(5, 3, 1)] county ## [1] "台中" "桃園" "台北" area ## [1] 271.8 2052.5 1221.0 2951.9 2214.9 2191.7 population ## [1] 2.6 3.9 2.2 2.7 2.8 1.8 3.2.1.1 Creating a sequence a <- seq(11, 99, 11) a ## [1] 11 22 33 44 55 66 77 88 99 b <- 11:20 b ## [1] 11 12 13 14 15 16 17 18 19 20 3.2.1.2 Creating sequences by distribution x <- runif(10000000, 1, 10) # uniform dist, n=1000 plot(density(x)) x <- rnorm(1000, 1, 10) # uniform dist, n=1000 plot(density(x)) x <- rnorm(10000000, 1, 10) # normal dist, n=1000 plot(density(x)) 3.2.2 Creating a fake data with ChatGPT 你可以嘗試這麼問ChatGPT以獲得一些測試資料「可否幫我建立一個R語言的測試資料,為台北11個行政區的區名、人口數、地理面積。分別用vector來儲存,最後再把三個vector合併為一個dataframe」,觀察看看會有什麼樣的結果。 3.2.3 Viewing county ## [1] "台中" "桃園" "台北" income ## [1] 70100 51300 51100 48400 47600 43000 head(county) ## [1] "台中" "桃園" "台北" tail(county) ## [1] "台中" "桃園" "台北" length(county) ## [1] 3 mode(county) ## [1] "character" class(county) ## [1] "character" # View(county) length(county) ## [1] 3 length(income) ## [1] 6 3.2.4 Subsetting, filtering vector可以用中括號[]搭配數字來取用vector中的元素,下標從1開始。例如,要取用上述的vector中的第三個元素,可以使用my_vector[3]。 It is important to know how to neglect first n or last n elements. For example, a[1:(length(a)-2)] will neglect the last two elements. Thinking why I need parentheses for length(a)-2 here. county ## [1] "台中" "桃園" "台北" county[c(5, 3, 1)] # how about country[c(1, 3, 5)] ## [1] NA "台北" "台中" county[3:6] # is it equal to country[c(3, 4, 5, 6)] ## [1] "台北" NA NA NA a <- 11:19 a[3:length(a)] ## [1] 13 14 15 16 17 18 19 a[length(a):3] ## [1] 19 18 17 16 15 14 13 3.2.5 Deleting Without assignment, deletion won’t change original vectors b <- 11:20 b[-(3:5)] ## [1] 11 12 16 17 18 19 20 b[-c(1, 3, 5)] ## [1] 12 14 16 17 18 19 20 b ## [1] 11 12 13 14 15 16 17 18 19 20 Correct deleting operations with assignment to replace original vector b <- b[-(3:5)] b ## [1] 11 12 16 17 18 19 20 a <- seq(11, 99, 11) a <- a[-c(1, 3, 5)] a ## [1] 22 44 66 77 88 99 3.2.6 Concatenating Concatenating is quite useful for web crawling when you crawl article links page by page. You may be not sure the number of page you need to crawl. So you need to append entire new vector to old vector. It is concatenating. (“Appending” often means adding one new element at the end of data.) a <- 1:10 a <- c(a, 11) a ## [1] 1 2 3 4 5 6 7 8 9 10 11 b ## [1] 11 12 16 17 18 19 20 a <- c(a, b) a ## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20 a <- c(a, a, b) a ## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20 1 2 3 4 5 6 7 ## [26] 8 9 10 11 11 12 16 17 18 19 20 11 12 16 17 18 19 20 3.3 Calculating with vectors 3.3.1 Arithmetic operations a <- 11:19 a + 3 ## [1] 14 15 16 17 18 19 20 21 22 a / 2 ## [1] 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 a %% 2 ## [1] 1 0 1 0 1 0 1 0 1 a %/% 2 ## [1] 5 6 6 7 7 8 8 9 9 a %% 2== 0 ## [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE which(a %% 2== 0) ## [1] 2 4 6 8 a[which(a%% 2 == 0)] ## [1] 12 14 16 18 a[c(2, 4, 6, 8)] ## [1] 12 14 16 18 a %% 2 != 0 ## [1] TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE a[a%% 2 == 0] ## [1] 12 14 16 18 a[a%%2 != 0] ## [1] 11 13 15 17 19 a <- a %% 2 # modular arithmetic, get the reminder a <- a %/% 2 # Quotient 3.3.2 Logic comparisons a %% 2 == 0 # deteting odd/even number ## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE a %% 2 != 0 ## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE a[a%%2==0] ## [1] 0 0 0 0 0 0 0 0 0 a > b ## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE income > mean(income) ## [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE == T # == equal to, ## [1] TRUE TRUE != F # != Not equal to ## [1] TRUE any(a>11) # is there any element larger than 1 ## [1] FALSE all(a>11) # are all elements larger than 1 ## [1] FALSE 3.3.3 Subsetting by logic comparisons two methods to filter data from vectors, by index vector or a logical vector with equal length. a <- seq(11, 55, 11) a[c(T, F, T, F, T)] ## [1] 11 33 55 a[a%%2==1] ## [1] 11 33 55 a%%2 ## [1] 1 0 1 0 1 a%%2==1 ## [1] TRUE FALSE TRUE FALSE TRUE a <- c("你好","你好棒棒","你好棒","你真的好棒") a[nchar(a)>3] ## [1] "你好棒棒" "你真的好棒" # which will return "index-of" a <- seq(11, 55, 11) a[which(a%%2==1)] ## [1] 11 33 55 which(a%%2==1) ## [1] 1 3 5 3.3.4 Sorting and ordering sort(x)的結果必須用<-覆蓋原本的x,此時的x才算被排序的結果。 order(x)函式會傳回x數值由小到大的索引。這個例子的結果是5, 4, 3, 6, 1, 2,也就是5位置的那個數最小、4那個位置的數次小、接下來3, 6, 1, 2。 x[order(x)]把order(x)結果(也就是c(5, 4, 3, 6, 1, 2))傳給原本的x便會使得原本的x重新排序。通常order()的用途是,我們可以將兩個等長的variables例如var1和var2,依據var2來重新排序var1,例如var1[order(var2)]。 x <- c(33, 55, 22, 13, 4, 24) mode(x) ## [1] "numeric" class(x) ## [1] "numeric" sort(x) ## [1] 4 13 22 24 33 55 # x <- sort(x) # assign to replace original x order(x) ## [1] 5 4 3 6 1 2 x[order(x)] ## [1] 4 13 22 24 33 55 x[c(5, 4, 3, 6, 1, 2)] ## [1] 4 13 22 24 33 55 3.3.5 Built-in math functions a <- 11:19 min(a); max(a); mean(a); median(a); sd(a) ## [1] 11 ## [1] 19 ## [1] 15 ## [1] 15 ## [1] 2.738613 log2(a) ## [1] 3.459432 3.584963 3.700440 3.807355 3.906891 4.000000 4.087463 4.169925 ## [9] 4.247928 log1p(a) ## [1] 2.484907 2.564949 2.639057 2.708050 2.772589 2.833213 2.890372 2.944439 ## [9] 2.995732 ?log1p 3.4 Data types 3.4.1 Checking data type mode(county) # character ## [1] "character" mode(income) # numeric ## [1] "numeric" mode(income > mean(income)) # logical ## [1] "logical" testing <- c("26.142", "12.008", "7.032", "13.646", "4.589") mode(testing) # character ## [1] "character" 3.4.2 Converting data type numeric vector可以用as.character(x)轉成charcter;logical vector可以用as.numeric(x)轉為numeric。概念上可以說是character > numeric > logical。 如果硬是在logical vector後附加一個numeric element的話,那就會整個vector被轉為numeric vector;相仿地,如果numeric vector後附加一個character element的話那整個vector就會被轉為character vector。 可以用sum()函式來計算logical vector有幾個TRUE值。例如sum(a%%2==1)就是計算a中有幾個奇數。TRUE可視為1、FALSE可視為0,所以加總起來就是TRUE有幾個。 income.c <- as.character(income) population.c <- as.numeric(population) a <- seq(11, 99, 11) a <- c(a, "100") a <- seq(11, 99, 11) sum(a%%2==1) ## [1] 5 max(a) ## [1] 99 3.5 Character operations a <- seq(11, 55, 11) paste("A", a) # concatenate ## [1] "A 11" "A 22" "A 33" "A 44" "A 55" paste0("A", a) # concatenate ## [1] "A11" "A22" "A33" "A44" "A55" "],["dataframe.html", "Chapter 4 Dataframe 4.1 基本操作 4.2 簡易繪圖 4.3 延伸學習 4.4 Paid Maternity Leave", " Chapter 4 Dataframe 4.1 基本操作 4.1.1 產生新的Dataframe 4.1.1.1 建立資料並Assign給vector 用以下ChatGPT問句來產生測試資料「我現在正在準備R的教學範例, 請協助我產生台北市所有行政區的資料,包含行政區名、面積、人口數 分別指給town, area, population三個變數」。 town = c("松山區", "信義區", "大安區", "中山區", "中正區", "大同區", "萬華區", "文山區", "南港區", "內湖區", "士林區", "北投區") area = c(9.2878, 11.2077, 11.3614, 13.6821, 7.6071, 5.6815, 8.8522, 31.5090, 21.8424, 31.5787, 62.3682, 56.8216) # 單位:平方公里 population = c(206375, 225561, 309835, 203276, 159608, 132397, 194160, 275207, 122103, 287726, 288324, 255688) # 2023年的估計值 4.1.1.2 合併等長vector為dataframe df <- data.frame(town, population, area) df$density = df$population / df$area str(df) ## 'data.frame': 6 obs. of 4 variables: ## $ town : chr "中正" "大同" "中山" "松山" ... ## $ population: num 158228 126687 228075 204903 308383 ... ## $ area : num 7.61 5.68 13.68 9.29 11.36 ... ## $ density : num 20800 22298 16670 22062 27143 ... summary(df) ## town population area density ## Length:6 Min. :126687 Min. : 5.681 Min. :16670 ## Class :character 1st Qu.:165651 1st Qu.: 7.918 1st Qu.:20907 ## Mode :character Median :196412 Median : 9.070 Median :21645 ## Mean :202366 Mean : 9.412 Mean :21700 ## 3rd Qu.:222282 3rd Qu.:10.843 3rd Qu.:22239 ## Max. :308383 Max. :13.682 Max. :27143 # View(df) 4.1.1.3 存放台灣貿易各國進出口量 運用國際貿易署貿易統計系統 (trade.gov.tw)獲取臺灣進出口貿易資料。 country <- c("CN", "US", "JP", "HK", "KR", "SG", "DE", "MY", "VN", "PH", "TH", "AU", "NL", "SA", "ID", "GB", "IN", "FR", "IT", "AE") import <- c(26.142, 12.008, 7.032, 13.646, 4.589, 5.768, 2.131, 2.802, 3.428, 3.019, 1.976, 1.118, 1.624, 0.449, 0.983, 1.302, 1.027, 0.553, 0.670, 0.455) export <- c(22.987, 12.204, 11.837, 7.739, 5.381, 4.610, 2.866, 2.784, 2.414, 2.092, 1.839, 1.788, 1.665, 1.409, 1.391, 1.075, 0.974, 0.899, 0.800, 0.728) 4.1.1.4 合併vector為data.frame 當我們讀取或創建資料框架時,過去R預設會將字符串類型的變數轉換為因子(Factors),這對於統計分析而言是有益的,因為統計分析經常將文字型態的數據視為類別變數來處理。然而,隨著資料科學領域的快速發展,需要處理大量文字數據的情況日益增多,這時將文字資料預設為因子型態可能不再適合所有情境。因此,現在R的預設的處理方式已經改變,預設將文字型態的變數保持為字符型態(Character),而不是自動將其轉換為因子。這意味著,當我們使用read.csv等函數讀取數據時,除非明確指定,否則讀入的字符串不會自動轉換為Factors型態。 如果你在進行統計分析時希望將文字型態的變數作為類別變數(即因子)處理,你需要手動設定stringsAsFactors參數為TRUE。這可以在讀取數據時(如使用read.csv函數)或在數據處理過程中明確進行轉換。例如,當使用read.csv讀取CSV文件時,若想將所有的字符串變數自動轉為因子型態,可以這樣做:df <- read.csv(\"your_file.csv\", stringsAsFactors = TRUE)。若已經讀取數據且數據框架中的文字型態變數仍為Character型態,而你希望將其轉換為Factors,可以使用factor函數進行轉換:df$your_column <- factor(df$your_column)。 df <- data.frame(country, import, export, stringsAsFactors = TRUE) str(df) ## 'data.frame': 20 obs. of 3 variables: ## $ country: Factor w/ 20 levels "AE","AU","CN",..: 3 19 11 7 12 17 4 13 20 15 ... ## $ import : num 26.14 12.01 7.03 13.65 4.59 ... ## $ export : num 22.99 12.2 11.84 7.74 5.38 ... df <- data.frame(country, import, export) str(df) ## 'data.frame': 20 obs. of 3 variables: ## $ country: chr "CN" "US" "JP" "HK" ... ## $ import : num 26.14 12.01 7.03 13.65 4.59 ... ## $ export : num 22.99 12.2 11.84 7.74 5.38 ... 其他功能:建立一個新且空的data.frame。 df.test <- data.frame() 4.1.2 觀察dataframe 當我們處理數據框架(dataframe)時,有幾種常用的方法可以幫助我們更好地了解和觀察數據的結構和內容。 View(df): 使用RStudio提供的圖形使用者介面直接觀看dataframe。這個功能允許你直觀地瀏覽整個數據集,方便地查看不同行(變數)和列(觀測值)。這對於初步瞭解數據的分佈和檢查數據的格式特別有用。 head(df): 這個函數用於取出數據框架的前六筆資料(也就是前六列)。這可以讓我們快速概覽數據集的開頭部分,了解數據的基本結構和內容。如果需要查看更多或更少的列,可以向head函數傳遞一個額外的參數,如head(df, n = 10)來查看前十列。 class(df): 此函數返回該變數的類型。對於dataframe,它將返回”DataFrame”,表明該對象是一個dataframe。了解對象的類型是重要的基礎步驟,尤其是在R中,不同類型的變項能夠做的操作和應用的函數也不同。 str(df): str是結構(structure)的縮寫,這個函數提供了dataframe的詳細結構信息,包括變項的數量、變項名稱、變項數據類型以及每個變項前幾個值。這是一個非常強大的函數,用於深入了解數據集的內部結構,特別是當處理大型數據集時。 summary(df): 此函數提供了數據框架的摘要統計信息,包括數值變數的最小值、最大值、中位數、平均值、第一四分位數和第三四分位數,以及因子變數的水平計數。這對於快速獲取數據集的統計概述非常有用。 # View(df) head(df) # get first part of the data.frame ## country import export ## 1 CN 26.142 22.987 ## 2 US 12.008 12.204 ## 3 JP 7.032 11.837 ## 4 HK 13.646 7.739 ## 5 KR 4.589 5.381 ## 6 SG 5.768 4.610 class(df) ## [1] "data.frame" str(df) ## 'data.frame': 20 obs. of 3 variables: ## $ country: chr "CN" "US" "JP" "HK" ... ## $ import : num 26.14 12.01 7.03 13.65 4.59 ... ## $ export : num 22.99 12.2 11.84 7.74 5.38 ... summary(df) ## country import export ## Length:20 Min. : 0.449 Min. : 0.728 ## Class :character 1st Qu.: 1.016 1st Qu.: 1.312 ## Mode :character Median : 2.054 Median : 1.966 ## Mean : 4.536 Mean : 4.374 ## 3rd Qu.: 4.884 3rd Qu.: 4.803 ## Max. :26.142 Max. :22.987 # look up help help(summary) ?summary 4.1.2.1 觀察資料維度 dim(df) ## [1] 20 3 ncol(df) ## [1] 3 nrow(df) ## [1] 20 length(df) ## [1] 3 4.1.3 操作dataframe 4.1.3.1 取出一個變項 names(df) 列出變數名稱 df$發生.現.地點 顯示該變數內容 df$發生時段 顯示該變數內容 length(df$發生時段) 顯示該變數的長度(相當於有幾個) names(df) ## [1] "country" "import" "export" head(df$export) ## [1] 22.987 12.204 11.837 7.739 5.381 4.610 length(df$import) ## [1] 20 summary(df) ## country import export ## Length:20 Min. : 0.449 Min. : 0.728 ## Class :character 1st Qu.: 1.016 1st Qu.: 1.312 ## Mode :character Median : 2.054 Median : 1.966 ## Mean : 4.536 Mean : 4.374 ## 3rd Qu.: 4.884 3rd Qu.: 4.803 ## Max. :26.142 Max. :22.987 4.1.3.2 (mutate)透過運算產生新變數 這裡容易犯錯的是,要記得跟程式講說你要加總或四則運算的是哪個df的variable。 從下面的這個操作中,該data.frame會產生一個新的變數sub,這就相當於Excel中的某一行減去某一行,然後把資料放在新的一行。 df$sub <- df$import - df$export 4.1.3.3 (filter)篩選資料、選取變數 注意,要告訴程式import和export是哪個data.frame的。 df[,]為存取df中某個區段的數值或某個數值的方法。因此df[1, 1]會取出第一行第一列,也就是第一筆資料的第一個vector。df[2, 3]則會取出第二筆資料的第三個variable。 下面的例子nrow(df)為1894,有1894筆資料,所以自然df\\(import與df\\)export的長度都是1894。因此,比較這兩個變數的大小會得到一個長度為1894的boolean (logical) variable。因此把這個長度為1894、充滿TRUE和FALSE的logical vector丟進df的row之處,因為取自df,大小判斷式結果的長度自然和原本的df的列數相同。因此當這個TRUE/FALSE被丟在df的列之處,便會篩選出import大於p.xport的數值。 原本的df有五個variable,而上述的操作是篩選資料,所以被篩選的是列,因此行的數量、名稱都不會變。因此,我篩選完後,直接存取這個被篩選過的data.frame的country variable,自然是可以的。 df ## country import export sub ## 1 CN 26.142 22.987 3.155 ## 2 US 12.008 12.204 -0.196 ## 3 JP 7.032 11.837 -4.805 ## 4 HK 13.646 7.739 5.907 ## 5 KR 4.589 5.381 -0.792 ## 6 SG 5.768 4.610 1.158 ## 7 DE 2.131 2.866 -0.735 ## 8 MY 2.802 2.784 0.018 ## 9 VN 3.428 2.414 1.014 ## 10 PH 3.019 2.092 0.927 ## 11 TH 1.976 1.839 0.137 ## 12 AU 1.118 1.788 -0.670 ## 13 NL 1.624 1.665 -0.041 ## 14 SA 0.449 1.409 -0.960 ## 15 ID 0.983 1.391 -0.408 ## 16 GB 1.302 1.075 0.227 ## 17 IN 1.027 0.974 0.053 ## 18 FR 0.553 0.899 -0.346 ## 19 IT 0.670 0.800 -0.130 ## 20 AE 0.455 0.728 -0.273 names(df) ## [1] "country" "import" "export" "sub" nrow(df) ## [1] 20 # filter row data by column value df[df$import > df$export,] ## country import export sub ## 1 CN 26.142 22.987 3.155 ## 4 HK 13.646 7.739 5.907 ## 6 SG 5.768 4.610 1.158 ## 8 MY 2.802 2.784 0.018 ## 9 VN 3.428 2.414 1.014 ## 10 PH 3.019 2.092 0.927 ## 11 TH 1.976 1.839 0.137 ## 16 GB 1.302 1.075 0.227 ## 17 IN 1.027 0.974 0.053 df[df$import > df$export,]$country ## [1] "CN" "HK" "SG" "MY" "VN" "PH" "TH" "GB" "IN" df[df$import > df$export,1] ## [1] "CN" "HK" "SG" "MY" "VN" "PH" "TH" "GB" "IN" # 1 row == a data.frame with only one data entry class(df[df$import > df$export,1]) ## [1] "character" class(df[,1]) # character vector ## [1] "character" class(df[1,]) # data.frame ## [1] "data.frame" class(unlist(df[1, -1])) # filter the 1st row and select all columns except 1 ## [1] "numeric" 4.1.3.4 (arrange) 按某個變數排序 df.sorted <- df[order(df$import),]會使得整個df照import的大小排序重新做排列。因為order(df$import)會把資料照指定順序排列後的位置傳回來,所以把他丟給df的列的位置,便會使得df的資料照指定的順序排列。 預設是由小到大,加上decreasing = T這個參數後變成由大而小。 # sort rows by df$import column df.sorted <- df[order(df$import),] # View(df.sorted) # sort rows in decreasing order df.sorted <- df[order(df$import, decreasing = T),] # add - to column in order() can sort in decreasing order df.sorted <- df[order(-df$import),] head(df.sorted) ## country import export sub ## 1 CN 26.142 22.987 3.155 ## 4 HK 13.646 7.739 5.907 ## 2 US 12.008 12.204 -0.196 ## 3 JP 7.032 11.837 -4.805 ## 6 SG 5.768 4.610 1.158 ## 5 KR 4.589 5.381 -0.792 4.2 簡易繪圖 graphics::plot()為會預載入R的繪圖套件,如果希望繪圖的同時加上回歸線和資料點標籤的話,必須要三行一起執行。 # plot(df) # raise error, 1st column is a character vector plot(df[, 2:3]) plot(df[1:10, 2:3]) text(import, export, labels=country, cex= 0.5, pos=3) lines(1:25, 1:25, col='red') ?plot ## Help on topic 'plot' was found in the following packages: ## ## Package Library ## graphics /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library ## base /Library/Frameworks/R.framework/Resources/library ## ## ## Using the first match ... 4.3 延伸學習 4.3.1 使用dplyr library(dplyr) df <- data.frame(country, import, export, stringsAsFactors = F) df <- mutate(df, sub = import - export) filter(df, import > export) ## country import export sub ## 1 CN 26.142 22.987 3.155 ## 2 HK 13.646 7.739 5.907 ## 3 SG 5.768 4.610 1.158 ## 4 MY 2.802 2.784 0.018 ## 5 VN 3.428 2.414 1.014 ## 6 PH 3.019 2.092 0.927 ## 7 TH 1.976 1.839 0.137 ## 8 GB 1.302 1.075 0.227 ## 9 IN 1.027 0.974 0.053 select(df, c(1, 3)) ## country export ## 1 CN 22.987 ## 2 US 12.204 ## 3 JP 11.837 ## 4 HK 7.739 ## 5 KR 5.381 ## 6 SG 4.610 ## 7 DE 2.866 ## 8 MY 2.784 ## 9 VN 2.414 ## 10 PH 2.092 ## 11 TH 1.839 ## 12 AU 1.788 ## 13 NL 1.665 ## 14 SA 1.409 ## 15 ID 1.391 ## 16 GB 1.075 ## 17 IN 0.974 ## 18 FR 0.899 ## 19 IT 0.800 ## 20 AE 0.728 message(df$country) print(df$country) ## [1] "CN" "US" "JP" "HK" "KR" "SG" "DE" "MY" "VN" "PH" "TH" "AU" "NL" "SA" "ID" ## [16] "GB" "IN" "FR" "IT" "AE" 4.3.2 比較tibble, data_frame, data.frame 警告: \"data_frame()\" was deprecated in tibble 1.1.0. Please use \"tibble()\" instead. df <- data.frame(a=1:2, b=3:4, c=5:6) class(df) ## [1] "data.frame" df <- data_frame(a=1:2, b=3:4, c=5:6) class(df) ## [1] "tbl_df" "tbl" "data.frame" df <- tibble(a=1:2, b=3:4, c=5:6) class(df) ## [1] "tbl_df" "tbl" "data.frame" 4.4 Paid Maternity Leave 本案例將使用R重新製作華盛頓郵報2016年8月13日的一篇報導,該報導探討了美國婦女產假支薪情況。案例中將應用data.frame和基本的繪圖與資料摘要方法。 原始新聞來源:The world is getting better at paid maternity leave. The U.S. is not. - The Washington Post。該篇報導提及,美國因為目前的政策不保障帶薪產假,許多女性感到必須在工作和照顧家庭之間做出選擇,這種性別不平等破壞了她們在工作機會上的平等機會。同時,世界各地的婦女待遇正在逐漸改善。至少190個國家對嬰兒的母親規定了某種形式的帶薪假期,產假待遇在56個國家有所提高。專家表示,現在美國城市和州正通過不同形式的帶薪家庭假法案,這顯示美國雇主正在展示有競爭力的福利不會影響員工表現。特別是科技公司,如Twitter、Facebook和Google等,處於提供員工帶薪產假福利的前沿,美國可能有望追趕其他國家。 本案例主要呈現核心的視覺化概念,可以在Review Paid Maternity by dplyr找到更詳盡的案例說明與解析。 4.4.1 Reading .xlsx by readxl package 在進行產假支薪調查數據的分析與視覺化時,我們從該調查網站上所下載的資料是一個Excel文件。由於R語言本身不直接支援讀取Excel格式的文件,我們必須依靠外部的套件來實現這一功能,如readxl套件。它是專門設計來讀取.xls和.xlsx格式文件的強大工具。readxl套件是tidyverse套件集的一部分。tidyverse是一組旨在數據科學和數據處理領域提供便利的R套件集合,包括了ggplot2、dplyr、tidyr等多個流行的套件。如果你之前已經安裝了tidyverse,那麼readxl套件應該也已經安裝在你的系統上,無需進行重複安裝。 然而,即便readxl已經安裝,它並不會隨著tidyverse套件集的其他部分自動加載到R的執行環境中。這意味著,在你打算使用readxl套件來讀取Excel文件之前,需要先手動執行library(readxl)命令來加載它。 # Import readxl package # install.packages("tidyverse") library(readxl) 這段程式碼使用read_excel()函式從data資料夾中的WORLD-MACHE_Gender_6.8.15.xls檔案中的Sheet1工作表讀取資料。其中col_names=T為該函式的參數,表示第一列為欄位名稱。讀取後的資料會被Assign給變數df。 # Use read_excel() to convert excel sheet to data.frame df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) 4.4.2 Previewing data by View(), class(), dim(), str(), summary() and names() # View(df) class(df) # [1] "tbl_df" "tbl" "data.frame" ## [1] "tbl_df" "tbl" "data.frame" dim(df) ## [1] 197 156 # Show names of variables (vectors, columns) by names() names(df) ## [1] "country" "iso2" "iso3" ## [4] "region" "wb_econ" "matleave_95" ## [7] "matleave_96" "matleave_97" "matleave_98" ## [10] "matleave_99" "matleave_00" "matleave_01" ## [13] "matleave_02" "matleave_03" "matleave_04" ## [16] "matleave_05" "matleave_06" "matleave_07" ## [19] "matleave_08" "matleave_09" "matleave_10" ## [22] "matleave_11" "matleave_12" "matleave_13" ## [25] "matleave_wrr_95" "matleave_wrr_96" "matleave_wrr_97" ## [28] "matleave_wrr_98" "matleave_wrr_99" "matleave_wrr_00" ## [31] "matleave_wrr_01" "matleave_wrr_02" "matleave_wrr_03" ## [34] "matleave_wrr_04" "matleave_wrr_05" "matleave_wrr_06" ## [37] "matleave_wrr_07" "matleave_wrr_08" "matleave_wrr_09" ## [40] "matleave_wrr_10" "matleave_wrr_11" "matleave_wrr_12" ## [43] "matleave_wrr_13" "bf_dur_95" "bf_dur_96" ## [46] "bf_dur_97" "bf_dur_98" "bf_dur_99" ## [49] "bf_dur_00" "bf_dur_01" "bf_dur_02" ## [52] "bf_dur_03" "bf_dur_04" "bf_dur_05" ## [55] "bf_dur_06" "bf_dur_07" "bf_dur_08" ## [58] "bf_dur_09" "bf_dur_10" "bf_dur_11" ## [61] "bf_dur_12" "bf_dur_13" "mat_bfeed_6mon_95" ## [64] "mat_bfeed_6mon_96" "mat_bfeed_6mon_97" "mat_bfeed_6mon_98" ## [67] "mat_bfeed_6mon_99" "mat_bfeed_6mon_00" "mat_bfeed_6mon_01" ## [70] "mat_bfeed_6mon_02" "mat_bfeed_6mon_03" "mat_bfeed_6mon_04" ## [73] "mat_bfeed_6mon_05" "mat_bfeed_6mon_06" "mat_bfeed_6mon_07" ## [76] "mat_bfeed_6mon_08" "mat_bfeed_6mon_09" "mat_bfeed_6mon_10" ## [79] "mat_bfeed_6mon_11" "mat_bfeed_6mon_12" "mat_bfeed_6mon_13" ## [82] "minage_fem_leg_95" "minage_fem_leg_96" "minage_fem_leg_97" ## [85] "minage_fem_leg_98" "minage_fem_leg_99" "minage_fem_leg_00" ## [88] "minage_fem_leg_01" "minage_fem_leg_02" "minage_fem_leg_03" ## [91] "minage_fem_leg_04" "minage_fem_leg_05" "minage_fem_leg_06" ## [94] "minage_fem_leg_07" "minage_fem_leg_08" "minage_fem_leg_09" ## [97] "minage_fem_leg_10" "minage_fem_leg_11" "minage_fem_leg_12" ## [100] "legal_diff_leg_95" "legal_diff_leg_96" "legal_diff_leg_97" ## [103] "legal_diff_leg_98" "legal_diff_leg_99" "legal_diff_leg_00" ## [106] "legal_diff_leg_01" "legal_diff_leg_02" "legal_diff_leg_03" ## [109] "legal_diff_leg_04" "legal_diff_leg_05" "legal_diff_leg_06" ## [112] "legal_diff_leg_07" "legal_diff_leg_08" "legal_diff_leg_09" ## [115] "legal_diff_leg_10" "legal_diff_leg_11" "legal_diff_leg_12" ## [118] "minage_fem_pc_95" "minage_fem_pc_96" "minage_fem_pc_97" ## [121] "minage_fem_pc_98" "minage_fem_pc_99" "minage_fem_pc_00" ## [124] "minage_fem_pc_01" "minage_fem_pc_02" "minage_fem_pc_03" ## [127] "minage_fem_pc_04" "minage_fem_pc_05" "minage_fem_pc_06" ## [130] "minage_fem_pc_07" "minage_fem_pc_08" "minage_fem_pc_09" ## [133] "minage_fem_pc_10" "minage_fem_pc_11" "minage_fem_pc_12" ## [136] "legal_diff_pc_95" "legal_diff_pc_96" "legal_diff_pc_97" ## [139] "legal_diff_pc_98" "legal_diff_pc_99" "legal_diff_pc_00" ## [142] "legal_diff_pc_01" "legal_diff_pc_02" "legal_diff_pc_03" ## [145] "legal_diff_pc_04" "legal_diff_pc_05" "legal_diff_pc_06" ## [148] "legal_diff_pc_07" "legal_diff_pc_08" "legal_diff_pc_09" ## [151] "legal_diff_pc_10" "legal_diff_pc_11" "legal_diff_pc_12" ## [154] "minwage_ppp_2013" "mw_overtime" "oecd" 4.4.3 Select variables 由於所需要的資料為第三欄的變數iso3(為國家代碼)和第六至24欄的matleave95~matleave13共29年的資料,所以需要在df[ , ]中選出這幾欄。只要把所要取的欄以vector的型態放在df[row,col]之col的位置,便可以選出所要的欄。 # Select the 3rd and 6th to 24th columns matleave <- df[ , c(3, 6:24)] # Use class(), dim(), and str() to inspect the data class(matleave) ## [1] "tbl_df" "tbl" "data.frame" dim(matleave) ## [1] 197 20 str(matleave) ## tibble [197 × 20] (S3: tbl_df/tbl/data.frame) ## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ... ## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_96: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_97: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_98: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_99: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_00: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_01: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_02: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_03: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_04: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_05: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_06: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_07: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_08: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_09: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_10: num [1:197] 2 5 3 3 2 2 2 5 NA 5 ... ## $ matleave_11: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_12: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_13: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... 4.4.4 Check & Replace NAs 處理開放資料常常會遇到紀錄遺漏的情形,這些遺漏的值在R語言中通常以NA(Not Available)來表示。這種情況很常見,特別是當數據來自於廣泛的來源,如網絡調查或公開資料庫時。適當處理這些NA值對於維持分析的準確性和可靠性至關重要。 為了識別和處理這些NA值,R提供了一些有用的函數和技巧。例如,is.na(v)函數可以用來檢測向量v中的NA值。如果你想選擇所有的NA紀錄,可以使用v[is.na(v)]這樣的語法。這個表達式會傳回所有在向量v中為NA的元素,這對於進一步的分析和資料清洗非常有幫助。 在某些情況下,你可能會想要以某個特定值來取代NA值,以避免在繪圖或進行其他數據分析時產生錯誤。例如,你可以選擇以0來取代所有的NA值,這可以通過v[is.na(v)] <- 0來實現。這樣,所有原本為NA的資料格都會被賦予0值。 此外,sum(is.na(v))這個表達式可以用來檢測向量v中還有多少NA值。這個函數的運作機制是計算所有is.na(v)為TRUE的情況,即所有NA值的總數。如果這個結果不是0,那麼就表示在向量或dataframe中還存在NA值。這對於確保數據清理工作已經完成,並且數據集準備好進行分析是非常有用的。 # is.na() to indicate each element is NA or NOT(TRUE/FALSE) head(is.na(matleave), n=20) ## iso3 matleave_95 matleave_96 matleave_97 matleave_98 matleave_99 ## [1,] FALSE FALSE FALSE FALSE FALSE FALSE ## [2,] FALSE FALSE FALSE FALSE FALSE FALSE ## [3,] FALSE FALSE FALSE FALSE FALSE FALSE ## [4,] FALSE FALSE FALSE FALSE FALSE FALSE ## [5,] FALSE FALSE FALSE FALSE FALSE FALSE ## [6,] FALSE FALSE FALSE FALSE FALSE FALSE ## [7,] FALSE FALSE FALSE FALSE FALSE FALSE ## [8,] FALSE FALSE FALSE FALSE FALSE FALSE ## [9,] FALSE FALSE FALSE FALSE FALSE FALSE ## [10,] FALSE FALSE FALSE FALSE FALSE FALSE ## [11,] FALSE FALSE FALSE FALSE FALSE FALSE ## [12,] FALSE FALSE FALSE FALSE FALSE FALSE ## [13,] FALSE FALSE FALSE FALSE FALSE FALSE ## [14,] FALSE FALSE FALSE FALSE FALSE FALSE ## [15,] FALSE FALSE FALSE FALSE FALSE FALSE ## [16,] FALSE FALSE FALSE FALSE FALSE FALSE ## [17,] FALSE FALSE FALSE FALSE FALSE FALSE ## [18,] FALSE FALSE FALSE FALSE FALSE FALSE ## [19,] FALSE FALSE FALSE FALSE FALSE FALSE ## [20,] FALSE FALSE FALSE FALSE FALSE FALSE ## matleave_00 matleave_01 matleave_02 matleave_03 matleave_04 matleave_05 ## [1,] FALSE FALSE FALSE FALSE FALSE FALSE ## [2,] FALSE FALSE FALSE FALSE FALSE FALSE ## [3,] FALSE FALSE FALSE FALSE FALSE FALSE ## [4,] FALSE FALSE FALSE FALSE FALSE FALSE ## [5,] FALSE FALSE FALSE FALSE FALSE FALSE ## [6,] FALSE FALSE FALSE FALSE FALSE FALSE ## [7,] FALSE FALSE FALSE FALSE FALSE FALSE ## [8,] FALSE FALSE FALSE FALSE FALSE FALSE ## [9,] FALSE FALSE FALSE FALSE FALSE FALSE ## [10,] FALSE FALSE FALSE FALSE FALSE FALSE ## [11,] FALSE FALSE FALSE FALSE FALSE FALSE ## [12,] FALSE FALSE FALSE FALSE FALSE FALSE ## [13,] FALSE FALSE FALSE FALSE FALSE FALSE ## [14,] FALSE FALSE FALSE FALSE FALSE FALSE ## [15,] FALSE FALSE FALSE FALSE FALSE FALSE ## [16,] FALSE FALSE FALSE FALSE FALSE FALSE ## [17,] FALSE FALSE FALSE FALSE FALSE FALSE ## [18,] FALSE FALSE FALSE FALSE FALSE FALSE ## [19,] FALSE FALSE FALSE FALSE FALSE FALSE ## [20,] FALSE FALSE FALSE FALSE FALSE FALSE ## matleave_06 matleave_07 matleave_08 matleave_09 matleave_10 matleave_11 ## [1,] FALSE FALSE FALSE FALSE FALSE FALSE ## [2,] FALSE FALSE FALSE FALSE FALSE FALSE ## [3,] FALSE FALSE FALSE FALSE FALSE FALSE ## [4,] FALSE FALSE FALSE FALSE FALSE FALSE ## [5,] FALSE FALSE FALSE FALSE FALSE FALSE ## [6,] FALSE FALSE FALSE FALSE FALSE FALSE ## [7,] FALSE FALSE FALSE FALSE FALSE FALSE ## [8,] FALSE FALSE FALSE FALSE FALSE FALSE ## [9,] FALSE FALSE FALSE FALSE TRUE FALSE ## [10,] FALSE FALSE FALSE FALSE FALSE FALSE ## [11,] FALSE FALSE FALSE FALSE FALSE FALSE ## [12,] FALSE FALSE FALSE FALSE FALSE FALSE ## [13,] FALSE FALSE FALSE FALSE FALSE FALSE ## [14,] FALSE FALSE FALSE FALSE FALSE FALSE ## [15,] FALSE FALSE FALSE FALSE FALSE FALSE ## [16,] FALSE FALSE FALSE FALSE FALSE FALSE ## [17,] FALSE FALSE FALSE FALSE FALSE FALSE ## [18,] FALSE FALSE FALSE FALSE FALSE FALSE ## [19,] FALSE FALSE FALSE FALSE FALSE FALSE ## [20,] FALSE TRUE TRUE FALSE FALSE FALSE ## matleave_12 matleave_13 ## [1,] FALSE FALSE ## [2,] FALSE FALSE ## [3,] FALSE FALSE ## [4,] FALSE FALSE ## [5,] FALSE FALSE ## [6,] FALSE FALSE ## [7,] FALSE FALSE ## [8,] FALSE FALSE ## [9,] FALSE FALSE ## [10,] FALSE FALSE ## [11,] FALSE FALSE ## [12,] FALSE FALSE ## [13,] FALSE FALSE ## [14,] FALSE FALSE ## [15,] FALSE FALSE ## [16,] FALSE FALSE ## [17,] FALSE FALSE ## [18,] FALSE FALSE ## [19,] FALSE FALSE ## [20,] FALSE FALSE # Assign 0 to those NA data matleave[is.na(matleave)] <- 0 # anyNA() to check if there are still NA cells. anyNA(matleave) ## [1] FALSE # sum(is.na()) to count the number of NA sum(is.na(matleave)) ## [1] 0 4.4.5 Filtering data 4.4.5.1 Filtered by the last year value matleave[matleave$'matleave_13'==5, ]中的第一個matleave表示要篩選的資料集,中括號中的matleave$'matleave_13'==5是篩選條件,表示將篩選matleave資料集中的matleave_13變數值等於5的列;中括號中的逗號後方未有欄位名稱表示將保留所有欄位(變項),僅篩選出符合條件的列,並將篩選後所產生的dataframe指給變數m5。 # Use logical comparison to see if the last year equals to 5 # Assign matching data to var m5 m5 <- matleave[matleave$'matleave_13'==5, ] # nrow() to count matching data nrow(m5) ## [1] 34 # Is it possible to use length() to check the data length? # matleave$'matleave_13' # matleave$'matleave_13'==5 # length(matleave$'matleave_13'==5) 4.4.5.2 Filtered data by the first year value 接下來我們再做一次篩選,從m5中篩選出matleave_95這個欄位為5的資料,並指給m55;同時也從m5中篩選出matleave_95這個欄位不為5的資料,並指給m05。m5、m55和m05無特殊含義,只是變數名稱而已。 # filter rows whose 'matleave_95' is 5, and assign to var m55 m55<- m5[m5$'matleave_95'==5,] # filter rows whose 'matleave_95' is not 5, and assign to var m05 m05<- m5[m5$'matleave_95'!=5,] 4.4.6 Plotting 當我們在R中進行資料視覺化時,理解資料結構對於正確使用圖形化函數是非常重要的。以matleave資料集為例,如果我們想要繪製其第二列所有行(除了第一行)的條形圖,這裡有一段示範程式碼及相關的概念解釋。 首先,為何要除去第一行?因為第一行為國家名稱。所以我們利用class(matleave[2, -1])來查看matleave資料集第二行和除了第一列外所有列的資料類型。這個操作返回的是一個data.frame的資料類型,因為即使是單一行的選取,R仍然保持了資料的data.frame結構。 然而,當我們嘗試使用barplot()函數繪製長條圖時,就不能直接把data.frame給barplot()進行繪製。。這是因為barplot()函數期望的輸入是一個vector。因此,我們使用unlist(matleave[2, -1])將單行的data.frame轉換成vector。unlist()函數的作用是將一個列表(或在這個案例中是data.frame)中的所有元素合併成一個vector,這樣就可以用於barplot()。 為了進一步理解這種差異,我們可以使用class()或str()函數來觀察未經unlist()處理的資料。這將顯示出資料仍然保留在data.frame結構中,與unlist()後轉換為vector的結構有顯著的不同。這種轉換對於使用某些特定的繪圖函數,如barplot(),是必要的,因為它們需要一個vector作為輸入來正確地繪製圖形。 4.4.6.1 Plotting one row (one country) # barplot() the second row of m55 # barplot(m55[2, ]) # raise error # barplot() the second row when neglecting the first column # barplot(m55[2, -1]) # raise error # Take a look at the data type of matleave[2, ] class(matleave[2, -1]) ## [1] "tbl_df" "tbl" "data.frame" class(unlist(matleave[2, -1])) ## [1] "numeric" # unlist() to convert a single row data.frame to a vector for barplot() barplot(unlist(m55[2, -1])) Testing # View(matleave[1]) # select the 1st variable # View(matleave[ ,1]) # select the 1st column # View(matleave[1, ]) # select the 1st row class(m55[1]) # "tbl_df" "tbl" "data.frame" ## [1] "tbl_df" "tbl" "data.frame" class(m55[ ,1]) # "tbl_df" "tbl" "data.frame" ## [1] "tbl_df" "tbl" "data.frame" class(m55[1, ]) # "tbl_df" "tbl" "data.frame" ## [1] "tbl_df" "tbl" "data.frame" class(m55$iso3) # character (vector) ## [1] "character" 4.4.6.2 More arguments (args) 接下來我們要微調一下視覺化的結果。這行程式碼使用R中的barplot函數繪製一個長條圖,其中的參數說明如下: unlist(m55[2, -1]): 將m55資料集的第2行(不包括第1欄)轉換為一個向量,並作為長條圖的高度(即每個長條的高度)。 ylim=c(0, 5): 設置y軸的範圍為0到5,即長條圖的最大高度為5。 space=0: 設置相鄰兩個長條之間的距離為0,即長條緊密相連。 border=NA: 設置長條的邊框為透明,即不顯示邊框。 xaxt=\"n\": 不顯示x軸的標籤。 yaxt=\"n\": 不顯示y軸的標籤。 # barplot() the unlisted second row (neglecting the first col) barplot(unlist(m55[2, -1])) # use ?barplot to know more argument of the function. ?barplot # Add arguments ylim, space, border, and axat/yaxt one by one to barplot() barplot(unlist(m55[2, -1]), ylim=c(0, 5)) barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0) barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0, border=NA) barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") 4.4.6.3 Plotting multiple lines 我們已經成功繪製了一個國家的資料,接下來我們要繪出所有國家的資料。以m55這個篩選後的資料為例,我分別要繪製出第1列至第6列的國家。底下可以看見每一行非常相似且一致的特徵,僅有matleave內的索引由1被列出至6。對於這種重複的程式碼,最好的方法是用迴圈(for-loop)的方式將相同的程式碼,從1~6之間做六次。 # plot the first row barplot(unlist(m55[1, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") # plot the second to 6th rows barplot(unlist(m55[2, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") barplot(unlist(m55[3, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") barplot(unlist(m55[4, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") barplot(unlist(m55[5, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") barplot(unlist(m55[6, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") 4.4.6.4 for-loop to plot multiple lines 這段R語言程式碼使用for-loop來重複執行一個指定的程式區塊,將m55資料集的前六行資料分別繪製成長條圖。在這段程式碼中,變數i控制了for-loop的迭代次數,它從1到6依次取值,然後依次執行所指定的程式區塊。 一般的for-loop的結構如下:for (variable in sequence) {# code block to be executed}。其中,變數variable是用來控制for-loop的迭代次數的,它會從序列sequence中逐一取出元素,並將其賦值給變數variable,然後執行大括號{...}中所指定的程式區塊。 # use for loop and use i as index to barplot multiple subgraphs for(i in 1:6){ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") } 4.4.6.5 Subplots 但這樣一個國家就要畫成一個Plot,如果要將多個國家、也就是多個Plots繪製在同一張圖上的話,R也有支援Subplot的函式與設定。在R語言中,par(parameter的縮寫)是一個用於設置繪圖參數的函數,通過它可以控制繪圖的外觀、尺寸、排列等各方面,以便更好地展示數據和分析結果。par函數可以用來設置以下參數: mfrow:設置畫布的分割,即將畫布分為多少行和多少列,例如mfrow=c(3,2)代表三列二行。 mai:設置畫布的邊緣大小,包括上下左右四個邊緣的大小。 cex:設置字體大小的縮放比例。 col:設置線條、點和字體的顏色。 pch:設置散點圖中點的形狀。 lty:設置線條的類型。 在這段程式碼中,par函數被用來設置畫布的分割和邊緣大小,具體來說,par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2))表示將畫布分為3行2列的子圖,並設置邊緣大小為0.2,包括上下左右四個邊緣。這樣可以方便地在同一張畫布上顯示多個圖形,並控制它們之間的排列和間距。 # use ?par to get more plotting parameters ?par # use par() to set-up the layout of subgraphs # use the parameter main=c(0.2, 0.2, 0.2, 0.2) to thrink the padding of figures. par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2)) for(i in 1:6){ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") } 接下來我們用相同的for-loop來繪製10張子圖(十個國家)看看。會發現mfrow=c(3,2)可以容納六張子圖,多餘六張子圖時,會繪製至下一張。 # plot more rows to see what happens par(mfrow=c(3,2), mai= c(0.2, 0.2, 0.2, 0.2)) for(i in 1:10){ barplot(unlist(m55[i, -1]), ylim=c(0, 5), space=0, border=NA, xaxt="n", yaxt="n") } # plot all subplots in a figure 最後,我用nrow(m55)來取得m55這個data.frame共有多少個國家,然後,我讓for-loop從1:nrow(m55)相當於繪製完所有m55中的子圖。注意我已經修改了mfrow為mfrow=c(4, 6)。 # nrow() to check number of row of m55. nrow(m55) ## [1] 18 # use par() to set-up plotting parameters. par(mfrow=c(4, 6), mai= c(0.2, 0.2, 0.2, 0.2)) # use for-loop to plot all graph as subgraph for (i in 1:nrow(m55)){ barplot(unlist(m55[i, -1]), border=NA, space=0, xaxt="n", yaxt="n", ylim = c(0,5)) } 在每個子圖上,我要加上每個國家的國別代碼iso3,也就是m55的第一行,我用同樣的i來掃過每一列,繪製完barplot()後,便用title()函式來繪製文字。結果如下。注意我的設定title(m55[i,1], line = -4, cex.main=3)。line為繪製文字的基線,而cex.main是字型大小。 par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2)) for (i in 1:nrow(m55)){ barplot(unlist(m55[i, -1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5)) title(m55[i,1], line = -4, cex.main=3) } 4.4.7 Practice. Plotting more 請繪製m05的資料,也就是matleave_95!=5但matleave_13==5的資料。 請繪製m04的資料,也就是matleave_95!=4但matleave_13==4的資料。 請繪製m44的資料,也就是matleave_95==4但matleave_13==4的資料。 # plotting matleave_95 != 5 but matleave_13 == 5 # plotting for matleave_13 == 4 4.4.8 Practice. Selecting and filtering by dplyr I 請嘗試問問ChatGPT,如果將以下程式碼改為dplyr的寫法,要怎麼寫。 df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) # select columns by index # matleave <- df[ , c(3, 6:24)] # select all NA cells and assign 0 to them # matleave[is.na(matleave)] <- 0 # filter rows by condition # m5 <- matleave[matleave$'matleave_13' == 5, ] # filter rows by condition # m55<- m5[m5$'matleave_95' == 5,] # plot par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2)) for (i in c(1:nrow(m55))){ barplot(unlist(m55[i,-1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5)) title(m55[i,1], line = -4, cex.main=3) } 4.4.9 (More) Clean version # readxl::read_excel() to import the xls file df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) # select iso3, and matleave columns by index matleave <- df[ , c(3, 6:24)] # str() to inspect the data structure of str(matleave) ## tibble [197 × 20] (S3: tbl_df/tbl/data.frame) ## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ... ## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_96: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_97: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_98: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_99: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_00: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_01: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_02: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_03: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_04: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_05: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_06: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_07: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_08: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_09: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_10: num [1:197] 2 5 3 3 2 2 2 5 NA 5 ... ## $ matleave_11: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_12: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_13: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... # select all NA cells and assign 0 to them matleave[is.na(matleave)] <- 0 # filter rows by condition m5 <- matleave[matleave$'matleave_13' == 5, ] # filter rows by condition m55<- m5[m5$'matleave_95' == 5,] # plot par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2)) for (i in c(1:nrow(m55))){ barplot(unlist(m55[i,-1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5)) title(m55[i,1], line = -4, cex.main=3) } 4.4.10 (More) The fittest version to compute staySame # staySame version # staySame <- apply(m5[,2:20], 1, function(x) length(unique(x[!is.na(x)]))) # m55 <- m5[staySame, ] # m50 <- m5[!staySame, ] "],["crosstab.html", "Chapter 5 Counting and Cross-tabulation 5.1 Taipei Residential Burglary 5.2 Read online files 5.3 Counting Review 5.4 Pivoting long-wide tables 5.5 Residuals analysis", " Chapter 5 Counting and Cross-tabulation 交叉分析是一種對兩個或多個變數進行聯合分析的方法,通常用於研究不同類別或組別之間的關係和差異。交叉分析可以幫助我們發現變數之間的相互作用,以及不同類別或組別之間的異同點,進而進行更深入的分析和解釋。 在交叉分析中,通常會使用交叉表(cross tabulation)或稱為列聯表(contingency table)來對變數進行分析。交叉表是一種二維資料表格,其中一個變數作為行,另一個變數作為列,每個資料格中則表示兩個變數的交叉次數或百分比。交叉表可以幫助我們從不同角度瞭解變數之間的關係和差異,例如: 發現變數之間的相關性:可以通過交叉表計算兩個變數之間的相關係數或卡方檢定值,以評估它們之間的相關性程度。 比較不同類別或組別之間的差異:可以通過交叉表比較不同類別或組別之間的差異,例如不同性別、年齡、教育程度、地區等對某一變數的影響。 發現變數之間的交互作用:可以通過交叉表比較不同類別或組別之間的差異,並分析它們之間的交互作用,以進一步瞭解變數之間的關係和影響。 5.1 Taipei Residential Burglary 觀察值、點位資料:公部門所發布的開放資料通常會根據某些類別進行統計,例如年齡、性別、教育程度、地區等等,只有少部分的資料會用觀察值(Observation)的方式來記錄,也就是每一個案例紀錄一筆資料。例如疫情一開始人數還少的時候,會逐一記錄每個個案;地理資訊系統上面記錄某些機構或某些特定地點的時候也是點位資料;或在觀察輿情時,每筆發言或留言都是一筆觀察值。「臺北市住宅竊盜點位資訊」就是逐案紀錄的點位資料。而以下的例子也是點位資料,主要為主要為噪音、竊盜、交通事故等相關點位資料。 臺北市街頭隨機強盜案件點位資訊、 臺北市街頭隨機搶奪案件點位資訊、 臺北市汽車竊盜點位資訊、 臺北市機車竊盜點位資訊、 臺北市自行車竊盜點位資訊、 臺北市道路交通事故斑點圖、 臺北市娛樂營業場所噪音告發案件點位資訊、 臺北市非營業用卡拉OK噪音告發案件點位資訊、 臺北市營建工程噪音告發案件點位資訊等, 5.1.1 讀取檔案 規劃比較完善的開放資料平台會提供API給程式設計者存取,例如臺北資料大平台或內政部開放資料平台。但我們這邊用下載CSV(Common Separated Value)檔的方式來讀取這筆資料,以理解CSV這種檔案型態如何儲存資料。首先要至臺北資料大平台上查詢「住宅竊盜」,可以找到臺北市住宅竊盜點位資訊。將該CSV檔下載至個人本機端,置入data 資料夾中,便可以用read.csv()讀取該檔案。或可用tidyverse系列套件中的readr::read_csv()來直接讀取該網址所指到的檔案。 我習慣在Console視窗中用??read_csv()查詢到這些函式的用法。 read.csv() to read csv and convert it to a data.frame readr::read_csv() to read csv or read a csv by an url 如果知道這個套件是readr的話,也可以到右下方的工作區塊找到「Packages」工作視窗,裡面有列出現在載入的所有的套件,也有套件中的所有函式。偶而看一看會發現一些自己平常忽略的好用工具。 library(knitr) library(kableExtra) library(tidyverse) df <- read.csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv") head(df) ## 編號 案類 發生日期 發生時段 發生地點 ## 1 1 住宅竊盜 1030623 08~10 臺北市中正區廈門街91~120號 ## 2 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧街1~30號 ## 3 3 住宅竊盜 1040101 00~02 臺北市信義區富台里忠孝東路5段295巷6弄1~30號 ## 4 4 住宅竊盜 1040101 06~08 臺北市中山區新生北路1段91~120號 ## 5 5 住宅竊盜 1040101 10~12 臺北市文山區明興里興隆路4段1~30號 ## 6 6 住宅竊盜 1040102 00~02 臺北市士林區天福里1鄰忠誠路2段130巷1~30號 用read_csv()來讀取。除了 base套件的read.csv()外,也可使用readr套件的read_csv()函式來讀取,該套件屬於tidyverse套件系的其中一個套件,如果已經有用install.packages(\"tidyverse\")安裝過,只要用library(tidyverse)就可以使用read_csv()函式。在此鼓勵各位使用tidyverse系列套件。普遍來說,read_csv() 的功能和效果都會比read.csv()好,該函式還會自動猜測每個變數的變數型態並直接進行轉換(尤其是有時間欄位的時候,會非常方便)。 萬一遇到中文檔案會有讀檔編碼問題時,有可能該檔案是用big5來儲存的,可以在read_csv()中設定locale來指定讀取的編碼方法。如read_csv(url, locale = locale(encoding = \"Big5\")) library(readr) df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv") # df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv", locale = locale(encoding = "Big5")) head(df) ## # A tibble: 6 × 5 ## 編號 案類 發生日期 發生時段 發生地點 ## <dbl> <chr> <dbl> <chr> <chr> ## 1 1 住宅竊盜 1030623 08~10 臺北市中正區廈門街91~120號 ## 2 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧街1~30號 ## 3 3 住宅竊盜 1040101 00~02 臺北市信義區富台里忠孝東路5段295巷6弄1~30號 ## 4 4 住宅竊盜 1040101 06~08 臺北市中山區新生北路1段91~120號 ## 5 5 住宅竊盜 1040101 10~12 臺北市文山區明興里興隆路4段1~30號 ## 6 6 住宅竊盜 1040102 00~02 臺北市士林區天福里1鄰忠誠路2段130巷1~30號 5.1.1.1 觀察變數 names(df) 列出所有變數名稱 df$發生地點 顯示該變數內容 df$發生時段 顯示該變數內容 length(df$發生時段) 顯示該變數的長度(相當於有幾個) 5.1.2 萃取所需新變項 該data.frame包含編號、案類、發生日期、發生時段、發生地點五個變項。其中比較有意義的應該是發生日期、發生時段和發生地點。然而,發生地點幾乎是完整地址,除非要繪製發生的地圖點位地圖,才會需要近乎完整的地址。假設我們的目標是抽取出台北市的「行政區」,發生地點的格式還蠻一致的如「臺北市中正區廈門街91~120號」。因此,我們只要抽出發生地點的第4至6個字即可。 從一個字串中抽取出第n個字到第m個字,要用substr()或stringr套件的str_sub()。可以用?substr或?str_sub查詢help中的相關用法。在此 我將中文變數現在時間的資料指給一個新的英文變項time。 從變數發生地點,用substr()取出行政區(region) 或用stringr::str_sub() ?substr查詢其用法和意義。相當於getting sub string since x to y。 # Get substring of var "發生時段" and assign to a new time var df$time <- df$發生時段 # Get substring of var "發生地點" and assign to a new region var df$region <- substr(df$發生地點, 4, 5) head(df) ## # A tibble: 6 × 7 ## 編號 案類 發生日期 發生時段 發生地點 time region ## <dbl> <chr> <dbl> <chr> <chr> <chr> <chr> ## 1 1 住宅竊盜 1030623 08~10 臺北市中正區廈門街91~120號 08~10 中正 ## 2 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧街1~30號 00~02 文山 ## 3 3 住宅竊盜 1040101 00~02 臺北市信義區富台里忠孝東路5段29… 00~02 信義 ## 4 4 住宅竊盜 1040101 06~08 臺北市中山區新生北路1段91~120號 06~08 中山 ## 5 5 住宅竊盜 1040101 10~12 臺北市文山區明興里興隆路4段1~30… 10~12 文山 ## 6 6 住宅竊盜 1040102 00~02 臺北市士林區天福里1鄰忠誠路2段1… 00~02 士林 5.1.3 使用table()計數 清理完資料後,我們要回答的第一個數據問題通常是「那XXX的案例有幾個?」例如:大安區有多少竊盜案?10~12這個時段有多少案例。 table()函式可以對Vector中的值進行計數(Counting)。table(df$time) 相當於去計數不同的時間區間出現多少起案例;table(df$region) 相當於去計數不同地區各出現多少起案例。 提示:可以用class(tb_1) 觀察用table() 計數後所產生的資料型態(table)。 ## table # counting the frequency of region variable (table(df$region)) ## ## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華 ## 438 263 214 303 318 181 373 172 311 204 220 350 # counting the frequency of time variable (tb_1 <- table(df$time)) # %>% View ## ## 00~02 02~04 03~05 04~06 05~07 06~08 08~10 09~11 10~12 11~03 11~13 12~14 12~15 ## 272 214 8 156 23 191 305 6 338 1 26 338 2 ## 14~16 15~17 15~18 16~18 17~19 18~20 18~21 19~21 20~22 21~23 21~24 22~24 23~01 ## 342 3 1 246 21 314 1 4 303 5 1 206 20 class(tb_1) ## [1] "table" 5.1.4 依變數值篩選資料 該項竊盜案資料整理時經常不慎用不同的時間區間來標記,有時候也會不小心把新北市的資料給那進來,所以需要做資料篩選。從各個時間區間的竊盜案出現次數來觀察,有少數的案件出現在奇數的時間區間如09~11或12~15等等需要篩除;從各個行政區的竊盜案出現次數來觀察,確實都是台北市的竊盜案。 接下來要用base套件的R,根據某個變數值(例如上述的時間)來篩出符合條件的資料,或者篩去不符合條件的資料。其語法是要在df[ , ]逗號前加上篩選的條件,也就是對資料列進行篩選,篩出或篩除都是以整列為單位。在此的條件是df$time在00~02、02~04、…之間;或者是df$time不在03~05、05~07、…之間。表示法分別如下: df$time %in% c("00~02", "02~04", "04~6",...) !df$time %in% c("03~05", "05~07", ...) %in% 表示的是左方df$time的值是否是右方Vector中的其中一個 如果要表示不包含,就在df%time加一個NOT,也就是!。 依照各組時間的案例個數統計後,篩除資料未足100的時間區間如下,最後再用table(df$time) 計算一次,發現每個時段都兩三、百個案例,且涵蓋整日的時間。清理後沒有重疊的時間區間,做類別資料分析會比較準確。 # filter out irrelevant timestamp df <- df[!df$time %in% c("03~05", "05~07", "09~11", "11~13", "11~03", "12~15", "15~17", "15~18", "17~19", "18~21", "19~21", "21~23", "21~24", "23~01"), ] table(df$time) ## ## 00~02 02~04 04~06 06~08 08~10 10~12 12~14 14~16 16~18 18~20 20~22 22~24 ## 272 214 156 191 305 338 338 342 246 314 303 206 # filter out irrelevant region(area) # df <- df[!df$region %in% c("三重", "中和", "淡水", "板橋"), ] 5.1.5 做雙變數樞紐分析:table() 類別變項分析通常是要考驗兩個變項間的關係,從上述的計數中,我可以看見不同行政區或者不同時間的竊盜案數量,但我進一步想知道,那不同行政區的竊盜案常發生時間是否不同?這時後就要做時間和行政區的交叉分析。我們同樣可以用table()和tapply()來做兩個變項的交叉分析,寫法如下。 用table()來交叉分析的結果如下,所得到的結果之變數型態仍是table型態。 # Tabulating time and region variables (res_table <- table(df$time, df$region)) ## ## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華 ## 00~02 62 15 27 20 24 19 28 15 24 17 4 17 ## 02~04 26 22 12 15 17 12 29 10 15 14 13 29 ## 04~06 22 7 11 15 17 6 14 15 14 8 5 22 ## 06~08 20 19 13 16 24 13 17 9 19 9 11 21 ## 08~10 45 27 20 27 22 16 24 17 31 18 24 34 ## 10~12 38 20 18 33 35 19 35 12 34 18 35 41 ## 12~14 30 25 20 26 34 15 46 12 49 25 23 33 ## 14~16 43 19 18 39 32 20 40 26 32 19 22 32 ## 16~18 21 19 8 24 33 11 30 13 25 16 20 26 ## 18~20 39 42 23 22 40 18 31 13 23 23 17 23 ## 20~22 40 13 22 34 17 20 41 13 26 15 25 37 ## 22~24 33 20 16 18 15 9 23 9 12 17 14 20 # Checking it class and its content class(res_table) ## [1] "table" ## [1] "table" 5.1.6 繪圖 通常這種類別資料交叉分析最常用的圖表型態之一便是Mosaic Plot(但事實上Mosaic Plot不見能夠被一眼就了解)。我們可以把交叉分析後的變項res_table直接用MosaicPlot來繪圖。 # mosaicplot() to plot 2-dim categorical vars. mosaicplot(res_table) # Add argument main (figure title) mosaicplot(res_table, main="mosaic plot") 5.1.6.1 解決圖表無法顯示中文 大部分的視覺化套件都無法順利顯示中文,除非特別指定所要用的中文字型。這方面網路上可以找到很多的說明,但非常討厭的是,幾乎每換一套視覺化工具,換一套語言,就有不同的中文字體指定方式。例如用base的plot()來繪圖或用ggplot()的中文字型指定方法便不同,且軸上面有中文、圖標有中文、或者圖內有中文都要分開指定,非常討人厭。 Mosaic Plot屬於base R的plot(),其中文指定方法要指定在繪圖前的par()函式中(par為parameter的意思),指定方法為par(family=('Heiti TC Light')),Heiti TC Light為字體名稱,為OSX上在用的黑體細字,STKaiti則為標楷體。然後,par()和mosaicplot()兩個函式要「同時執行」,也就是請你直接用shift-cmd(ctrl)-Enter執行整個code-cell,或者將該兩個函式選起來一次執行。 par(family=('STKaiti')) # par(family=('Heiti TC Light')) mosaicplot(res_table, main="mosaic plot", color=T) 5.1.6.2 自訂顏色 目前顏色實在過醜,你可以自訂顏色指給mosaicplot()。例如我底下便產製了12種顏色後,將其作為mosaicplot()的參數 # Set up color by yourself. colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F', '#E79460', '#E98B2A', '#9B6E23', '#F7C242', '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8') # par(family=('STKaiti')) par(family=('Heiti TC Light')) mosaicplot(res_table, color=colors, border=0, off = 3, main="Theft rate of Taipei city (region by hour)") 5.1.7 Practices 5.1.7.1 萃取月份作為新變項month 除了時間和地區可能會有差別外,那月份會不會竊盜案的數量也有差異呢?會不會冬天小偷也都在家休息了,夏天多呢?請嘗試從發生日期萃取出竊盜案發生的月份,並儲存為一個新的變項month。 5.1.7.2 使用count()來計數 請練習看看如果用count()來計數單一變項,如前述的region、time或前面練習中新產生的month。 5.1.7.3 分週末與週間計算 使用lubridate套件可以將文字表示的日期轉換為R的時間物件,進而可以用lubridate的wday()函式求取該日期是週幾,便可以計算,週間和週末的竊盜率有何差別。可以先計算看看,週一到週日分別有什麼差別,再去計算週間與週末的平均會有什麼差別(要注意,週末和週間天數並不同) 5.2 Read online files 方法一:直接依資料網址讀取檔案。現在的程式語言所設計的讀取檔案函式通常會允許使用者直接讀取資料所在的URL。所以,我們可以直接從網路上載入台北市竊盜案資料。首先要至臺北資料大平台上查詢「住宅竊盜」,可以找到臺北市住宅竊盜點位資訊,點選後對右上方的下載按右鍵可取得鏈結到該資料的URL(如https://data.taipei/api/getDatasetInfo/downloadResource?id=68785231-d6c5-47a1-b001-77eec70bec02&rid=93d9bc2d-af08-4db7-a56b-9f0a49226fa3)。 由於該資料網址似非永久網址,故本範例並未執行以下程式碼,僅提供範例程式碼讓個人替換網址來做測試。 方法二:用R程式將該網址的檔案抓回本機端儲存。部分Mac電腦無法使用read.csv()從網路上取得資料又轉為data.frame,一個可行的辦法是先用GET(url,write_disk(\"data/tptheft.csv\"))將其取回並命名為data/tptheft.csv,之後再用df <- read.csv(\"data/tptheft.csv\")直接讀取該檔案。 {library(httr)} GET(url, write_disk(\"data/tptheft.csv\", overwrite = TRUE)) df <- read.csv(\"data/tptheft.csv\") 5.3 Counting Review 5.3.1 tapply() 我們也可用tapply() 函式來達到一樣的目的。Apply家族的函式都是,針對某個資料,將某個函式套用到某個物件上。tapply() 即是用來做計數的,tapply(df$編號, df$time, length)有三個輸入,第一個輸入為整體物件,第二個輸入為要據以彙整的變項,在此為df$time,第三個是要用來彙整的函式,因為這裡要做計數,所以要用length函式。 註:同樣用class()來觀察彙整後的資料型態為array,和前者的table資料型態不同。 5.3.2 tapply() two variables 用tapply()來做兩個變數交叉分析的語法如下,必須要把兩個Vector包在一個list()中。其他不變。兩個變項用tapply()交叉分析後的結果,變數型態會變成matrix。前者用table()來交叉分析的仍是table型態。 res_tapply ## 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華 ## 00~02 62 15 27 20 24 19 28 15 24 17 4 17 ## 02~04 26 22 12 15 17 12 29 10 15 14 13 29 ## 04~06 22 7 11 15 17 6 14 15 14 8 5 22 ## 06~08 20 19 13 16 24 13 17 9 19 9 11 21 ## 08~10 45 27 20 27 22 16 24 17 31 18 24 34 ## 10~12 38 20 18 33 35 19 35 12 34 18 35 41 ## 12~14 30 25 20 26 34 15 46 12 49 25 23 33 ## 14~16 43 19 18 39 32 20 40 26 32 19 22 32 ## 16~18 21 19 8 24 33 11 30 13 25 16 20 26 ## 18~20 39 42 23 22 40 18 31 13 23 23 17 23 ## 20~22 40 13 22 34 17 20 41 13 26 15 25 37 ## 22~24 33 20 16 18 15 9 23 9 12 17 14 20 # View(res) 5.3.3 dplyr::count() two variables 這邊多介紹一個用dplyr套件的count()函式來做交叉分析的方法(未來會常用這個方法,因為dplyr是tidyverse系列套件的核心套件。dplyr的函式第一個參數永遠是該data.frame, 例如count();後面time與region則是這個data.frame中的兩個變項。不像tapply()或table()的結果一樣,欄與列分別為time與region,count()出來的結果會有兩個變項分別是指定要計數的time與region ,且會新增一個變項n,代表這組數據(time x region)共有幾個。這種表達型態通常稱為long-table(長表)、而tapply()或table() 的結果通常稱為wide-table(寬表)為典型的交叉分析表。 目前大部分的類別資料分析還是會採用交叉分析表的型態,但未來我們要用tidyverse系列套件做大量的數據彙整或視覺化時,都會盡可能想辦法轉為Long-table型態,讓每一欄剛好就是一個變項。只要是tidyverse系列套件所計算出來的資料型態幾乎都是類似data.frame的型態,例如觀察count的結果便是\"tbl_df\" \"tbl\" \"data.frame\"。 5.4 Pivoting long-wide tables 5.4.1 long-to-wide 那長表列可以轉為寬表嗎?可以,tidyverse系列套件中的tidyr套件有個函式spread()可以接著把某個變項展開為欄。例如原本上述的列是時間與行政區的交叉組合,但我可以把行政區展開為欄、或者把時間展開為欄 。如下例,spread(res_count, region, n, fill = 0) 有四個參數,遵循tidyverse系列套件的規則,第一個位置為data.frame,第二個參數則是要被展開至欄的變項這裡為region,第三個參數則是因應region被展開後,那中間交叉分析的數值就是n,最後一個參數是避免spread時有些交叉組是沒有資料的,因此fill=0可以指定,如果某個time x region的交叉組別是沒資料的,就填上0,也有可能是用fill=NA填上NA。以下的例子中也提供了將time 展開至欄的寫法供參考。 現在spread()函式已經被新的函式取代,為pivot_wider()。spread(res_count, region, n, fill = 0) 在此需要改寫為pivot_wider(res_count, names_from = region, values_from = n, values_fill = 0)。大致上和spread()用法是一樣的,只是要寫清楚,哪個變數要給哪一個參數。 展開後的資料型態和前者計數後的資料型態一樣,都是\"tbl_df\" \"tbl\" \"data.frame\"。這是為什麼tidyverse系列的套件逐漸變成R的顯學的原因之一。 library(tidyr) # spreading the region into columns # (res_count_spread <- spread(res_count, region, n, fill = 0)) res_count_spread <- pivot_wider(res_count, names_from = region, values_from = n, values_fill = 0) class(res_count_spread) ## [1] "tbl_df" "tbl" "data.frame" # spreading the time into columns # res_count_spread <- spread(res_count, time, n, fill = 0) res_count_spread # %>% View ## # A tibble: 12 × 13 ## time 中山 中正 信義 內湖 北投 南港 士林 大同 大安 文山 松山 萬華 ## <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> ## 1 00~02 62 15 27 20 24 19 28 15 24 17 4 17 ## 2 02~04 26 22 12 15 17 12 29 10 15 14 13 29 ## 3 04~06 22 7 11 15 17 6 14 15 14 8 5 22 ## 4 06~08 20 19 13 16 24 13 17 9 19 9 11 21 ## 5 08~10 45 27 20 27 22 16 24 17 31 18 24 34 ## 6 10~12 38 20 18 33 35 19 35 12 34 18 35 41 ## 7 12~14 30 25 20 26 34 15 46 12 49 25 23 33 ## 8 14~16 43 19 18 39 32 20 40 26 32 19 22 32 ## 9 16~18 21 19 8 24 33 11 30 13 25 16 20 26 ## 10 18~20 39 42 23 22 40 18 31 13 23 23 17 23 ## 11 20~22 40 13 22 34 17 20 41 13 26 15 25 37 ## 12 22~24 33 20 16 18 15 9 23 9 12 17 14 20 # ??dplyr::count 5.4.2 Wide-to-long 寬表格亦可用tidyr的gather()函式轉回長表格型態。但gather()近期也已經被新的函式pivot_longer()取代。原先的gather(res_count_spread, region, n, -time)應取代為pivot_longer(res_count_spread, -time, names_to = \"region\", values_to = \"n\")。 # (long_table <- tidyr::gather(res_count_spread, region, n, -time)) long_table <- pivot_longer(res_count_spread, -time, names_to = "region", values_to = "n") 5.5 Residuals analysis mosaicplot()有幾個參數可以用,包含off與shade可用於呈現殘差分析。 off: vector of offsets to determine percentage spacing at each level of the mosaic (appropriate values are between 0 and 20, and the default is 20 times the number of splits for 2-dimensional tables, and 10 otherwise). Rescaled to maximally 50, and recycled if necessary. shade: a logical indicating whether to produce extended mosaic plots, or a numeric vector of at most 5 distinct positive numbers giving the absolute values of the cut points for the residuals. By default, shade is FALSE, and simple mosaics are created. Using shade = TRUE cuts absolute values at 2 and 4. # par(family=('STKaiti')) par(family=('Heiti TC Light')) mosaicplot(res_table, color=T, shade = T, border=0, off = 3, main="Theft rate of Taipei city (region by hour)") "],["base2dplyr.html", "Chapter 6 From base R to dplyr 6.1 dplyr 6.2 Taipie Theft Count (base to dplyr) 6.3 Paid Maternity Leave", " Chapter 6 From base R to dplyr From base to tidyverse style 相較於R base的較為傳統的R編程風格,tidyverse style的R programming具有以下幾個特點: 基於tidy data理念:tidyverse style的R programming基於tidy data理念,即資料應該以規律的方式組織,以方便分析和視覺化。tidyverse style的R程式庫提供了一些工具和函數,用於處理和轉換tidy data格式的資料,如dplyr、tidyr等。 使用管道操作符:tidyverse style的R programming通常使用管道操作符(%>%),將資料通過多個函數連接起來,形成一個清晰和易於理解的資料處理流程。使用管道操作符可以簡化程式碼並提高程式的可讀性。 強調函數庫的一致性:tidyverse style的R programming強調函數庫之間的一致性,即不同函數庫之間使用相似的函數名稱、參數名稱和返回值等,以方便使用者的學習和使用。 使用簡潔的命名方式:tidyverse style的R programming通常使用簡潔和易於理解的變數和函數命名方式,例如使用動詞表示操作,使用名詞表示資料,以方便使用者理解程式碼的含義。 提供高級的視覺化工具:tidyverse style的R programming提供了一些高級的視覺化工具,如ggplot2、gganimate等,可以幫助使用者更加輕鬆地進行資料視覺化和探索。 6.1 dplyr dplyr是一個tidyverse風格的R程式庫,用於對資料進行快速、一致、直觀的操作和轉換。dplyr提供了一些高效能的函數和工具,如filter、select、mutate、group_by和summarize等,用於對資料進行選擇、篩選、轉換、分組和摘要等操作。 以下是dplyr常用的函數: filter:用於選擇符合特定條件的資料列。 select:用於選擇特定的欄位。 mutate:用於新增或修改欄位。 group_by:用於按照特定欄位進行分組。 summarize:用於對分組後的資料進行摘要統計。 arrange:用於按照欄位的特定順序進行排序。 dplyr具有以下優點: 簡潔而直觀的語法:dplyr的函數名稱和語法都十分簡潔而直觀,易於使用和理解,尤其對於新手來說更加友好。 高效的運行速度:dplyr的設計考慮了資料處理的效率,使用C++實現了部分函數,因此dplyr在處理大型資料集時運行速度較快。 與tidyverse相容:dplyr與其他tidyverse程式庫,如ggplot2和tidyr,可以很好地相容,並且能夠與其他常用的R程式庫進行集成,提供更加全面和高效的資料分析和可視化工具。 6.2 Taipie Theft Count (base to dplyr) library(tidyverse) # options(stringsAsFactors = F) # default options in R ver.> 4.0 6.2.1 Reading data # Read by read_csv() # Will raise error # Error in make.names(x) : invalid multibyte string at '<bd>s<b8><b9>' # df <- read_csv("data/tp_theft.csv") # read_csv() with locale = locale(encoding = "Big5") library(readr) df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv") 6.2.2 Cleaning data I Renaming variables by select() Generating variable year by mutate() Generating variable month by mutate() Retrieving area by mutate() 6.2.2.1 (1) Without pipeline I df1 <- select(df, id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`) df2 <- mutate(df1, year = date %/% 10000) df3 <- mutate(df2, month = date %/% 100 %% 100) df4 <- mutate(df3, area = str_sub(location, 4, 6)) selected_df <- mutate(df4, county = str_sub(location, 1, 3)) 6.2.2.2 (2) Without pipeline II library(stringr) selected_df <- select(df, id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`) selected_df <- mutate(selected_df, year = date %/% 10000) selected_df <- mutate(selected_df, month = date %/% 100 %% 100) selected_df <- mutate(selected_df, area = str_sub(location, 4, 6)) selected_df <- mutate(selected_df, county = str_sub(location, 1, 3)) 6.2.2.3 (3) With pipeline library(stringr) selected_df <- df %>% select(id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`) %>% mutate(year = date %/% 10000) %>% mutate(month = date %/% 100 %% 100) %>% mutate(area = str_sub(location, 4, 6)) %>% mutate(county = str_sub(location, 1, 3)) 6.2.3 Cleaning data II Filtering out irrelevant data records # readr::guess_encoding("data/tp_theft.csv") filtered_df <- selected_df %>% # count(year) %>% View filter(county == "臺北市") %>% filter(year >= 104) %>% # count(time) %>% View # count(location) %>% filter(!area %in% c("中和市", "板橋市")) 6.2.4 Long to wide form count() two variables pivot_wider() spread one variable as columns to wide form # count() then pivot_wider() df.wide <- filtered_df %>% count(time, area) %>% pivot_wider(names_from = area, values_from = n, values_fill = 0) ??pivot_wider 6.2.5 Setting time as row.name for mosaicplot row.names(df.wide) <- df.wide$time df.wide$time <- NULL # Specify fonts for Chinese # par(family=('STKaiti')) par(family=('Heiti TC Light')) # for mac # Specify colors colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F', '#E79460', '#E98B2A', '#9B6E23', '#F7C242', '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8') # mosaicplot() mosaicplot(df.wide, color=colors, border=0, off = 3, main="Theft rate of Taipei city (region by hour)") 6.2.6 Clean version library(readr) # options(stringsAsFactors = F) df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv") selected_df <- df %>% select(id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`) %>% mutate(year = date %/% 10000) %>% mutate(month = date %/% 100 %% 100) %>% mutate(area = stringr::str_sub(location, 4, 6)) %>% mutate(county = stringr::str_sub(location, 1, 3)) selected_df %>% count(year) ## # A tibble: 9 × 2 ## year n ## <dbl> <int> ## 1 103 1 ## 2 104 687 ## 3 105 663 ## 4 106 560 ## 5 107 501 ## 6 108 411 ## 7 109 304 ## 8 110 189 ## 9 111 31 selected_df %>% count(time) %>% head(10) ## # A tibble: 10 × 2 ## time n ## <chr> <int> ## 1 00~02 272 ## 2 02~04 214 ## 3 03~05 8 ## 4 04~06 156 ## 5 05~07 23 ## 6 06~08 191 ## 7 08~10 305 ## 8 09~11 6 ## 9 10~12 338 ## 10 11~03 1 selected_df %>% arrange(time) %>% head(10) ## # A tibble: 10 × 9 ## id cat date time location year month area county ## <dbl> <chr> <dbl> <chr> <chr> <dbl> <dbl> <chr> <chr> ## 1 2 住宅竊盜 1040101 00~02 臺北市文山區萬美里萬寧… 104 1 文山… 臺北市 ## 2 3 住宅竊盜 1040101 00~02 臺北市信義區富台里忠孝… 104 1 信義… 臺北市 ## 3 6 住宅竊盜 1040102 00~02 臺北市士林區天福里1鄰… 104 1 士林… 臺北市 ## 4 12 住宅竊盜 1040105 00~02 臺北市中山區南京東路3… 104 1 中山… 臺北市 ## 5 33 住宅竊盜 1040115 00~02 臺北市松山區饒河街181~… 104 1 松山… 臺北市 ## 6 74 住宅竊盜 1040131 00~02 臺北市南港區重陽路57巷… 104 1 南港… 臺北市 ## 7 75 住宅竊盜 1040201 00~02 臺北市北投區中心里中和… 104 2 北投… 臺北市 ## 8 92 住宅竊盜 1040210 00~02 臺北市北投區大同路200… 104 2 北投… 臺北市 ## 9 95 住宅竊盜 1040212 00~02 臺北市萬華區萬大路493… 104 2 萬華… 臺北市 ## 10 106 住宅竊盜 1040216 00~02 臺北市信義區吳興街269… 104 2 信義… 臺北市 filtered_df <- selected_df %>% # count(year) %>% View filter(year >= 104) %>% filter(!time %in% c("03~05", "05~07", "09~11", "11~13", "15~17", "17~19", "18~21", "21~23", "23~01")) # count(time) %>% View # count(location) %>% # filter(!area %in% c("中和市", "板橋市")) df.wide <- filtered_df %>% count(time, area) %>% pivot_wider(names_from = area, values_from = n, values_fill = 0) %>% as.data.frame() row.names(df.wide) <- df.wide$time df.wide$time <- NULL par(family=('Heiti TC Light')) # for mac # Specify colors colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F', '#E79460', '#E98B2A', '#9B6E23', '#F7C242', '#BEC23F', '#90B44B', '#66BAB7', '#1E88A8') # mosaicplot() mosaicplot(df.wide, color=colors, border=0, off = 3, main="Theft rate of Taipei city (region by hour)") 6.3 Paid Maternity Leave 6.3.1 Visual Strategies 這個例子之所以有趣在於記者選定了「美國沒有產假支薪」作為新聞的賣點。在呈現的時候,就必須要盡可能地凸顯這樣的情形。一般來說,會繪製世界地圖來呈現美國是目前少數沒有產假支薪的國家之一(在本資料197個國家中僅有9國目前沒有給付產假薪水。其實該筆來自Word Policy Analysis Center資料含有自1995年至2003年共19年的資料(本案例即就是下載該中心所分享的調查資料,不用申請帳號)。於是該專題的作者便構思利用過去到現在的資料來凸顯美國在這方面一直沒有改變。 但要處理197個國家的在19年間的變化相當不易。例如若為每年繪製一張世界地圖,然後以動畫或動態卷軸來凸顯這19年間美國的變化,也會因為國家數過多而難以聚焦在作者想突顯的美國。 而這便是作者在視覺化上相當具有巧思的地方。由於產假給付程度在該調查中分為五個等級,包含0週、0-14週、14-25週、26-51週、52週以上等。作者便從給付程度最高的層級開始做長條圖,共五個階層的子圖。而每個階層的子圖,作者又將該層級的圖分為「保持不變(Stay Same)」和「持續增加(Increase)」兩組。經過這樣的分組,會得到9個子圖。分別為等級5(保持不變、持續增加)、等級4(保持不變、持續增加)、…、等級1(保持不變)。讀者在看的時候,會依次看到給付程度最高到最低的國家,也可以看到哪些國家在這19年間制度有所變化(通常是增加)。但看到最後的時候,便會看到美國的情形,即是無產假給付。 6.3.2 Code by base R library(readxl) # readxl::read_excel() to import the xls file df <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) # select iso3, and matleave columns by index matleave <- df[ , c(3, 6:24)] # str() to inspect the data structure of str(matleave) ## tibble [197 × 20] (S3: tbl_df/tbl/data.frame) ## $ iso3 : chr [1:197] "AFG" "ALB" "DZA" "AND" ... ## $ matleave_95: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_96: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_97: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_98: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_99: num [1:197] 2 5 3 2 2 2 2 3 1 5 ... ## $ matleave_00: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_01: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_02: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_03: num [1:197] 2 5 3 3 2 2 2 3 1 5 ... ## $ matleave_04: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_05: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_06: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_07: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_08: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_09: num [1:197] 2 5 3 3 2 2 2 5 1 5 ... ## $ matleave_10: num [1:197] 2 5 3 3 2 2 2 5 NA 5 ... ## $ matleave_11: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_12: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... ## $ matleave_13: num [1:197] 2 5 3 3 2 2 2 5 3 5 ... # select all NA cells and assign 0 to them matleave[is.na(matleave)] <- 0 # filter rows by condition m5 <- matleave[matleave$'matleave_13' == 5, ] # filter rows by condition m55<- m5[m5$'matleave_95' == 5,] # plot par(mfrow=c(4,6), mai= c(0.2, 0.2, 0.2, 0.2)) for (i in c(1:nrow(m55))){ barplot(unlist(m55[i,-1]), border=NA, space=0,xaxt="n", yaxt="n", ylim = c(0,5)) title(m55[i,1], line = -4, cex.main=3) } 6.3.3 Code by dplyr 首先,程式碼使用 filter() 函數篩選出符合條件的列,其中 matleave_13 和 matleave_95 兩欄都必須等於 5。接著,pivot_longer() 函數將資料框轉換成長格式(long format),將從第二欄到第二十欄的資料整合到兩個欄位 year 和 degree 中。這裡 names_to 參數指定新欄位 year 的名稱,values_to 參數指定新欄位 degree 的名稱,cols 參數指定要整合的欄位範圍。 接下來,replace_na() 函數將 degree 欄位中的 NA 值替換為 0。然後,mutate() 函數使用 as.POSIXct() 函數將 year 欄位中的字串轉換為日期時間格式,再使用 year() 函數從日期時間中提取年份,最終將年份資訊存儲回 year 欄位中。其中 “matleave_%y” 是日期時間格式字串,其中 “%y” 表示兩位數的年份(例如 “13”)。這樣就將 “matleave_13”、“matleave_14” 等字串轉換成了對應的日期時間。 ggplot() 函數創建了一個空的 ggplot2 圖形物件,使用 aes() 函數定義了 x 軸 year 和 y 軸 degree 的變數名稱。geom_col() 函數指定用長條圖呈現資料,設置了顏色和填充顏色。ylim() 函數限制了 y 軸的範圍,將其設置為 0 到 5,無論y軸資料有沒有到5或者是否超過5,都會限定在0到5之間。facet_wrap() 函數則根據 iso3 欄位生成多個子圖。最後,theme_void() 函數將圖形主題設置為空白,不帶任何邊框或背景。 library(tidyverse) ## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── ## ✔ dplyr 1.1.4 ✔ readr 2.1.5 ## ✔ forcats 1.0.0 ✔ stringr 1.5.1 ## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1 ## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1 ## ✔ purrr 1.0.2 ## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── ## ✖ dplyr::filter() masks stats::filter() ## ✖ dplyr::lag() masks stats::lag() ## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors options(scipen = 999) library(readxl) matleave <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>% select(iso3, 6:24) matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% pivot_longer(names_to = "year", values_to = "degree", cols = 2:20) %>% replace_na(list(degree = 0)) %>% mutate(year = year(as.POSIXct(strptime(year, "matleave_%y")))) %>% ggplot() + aes(year, degree) + geom_col(color = "royalblue", fill = "royalblue") + ylim(0, 5) + facet_wrap(~ iso3) + theme_void() 下圖為原始資料的截圖,matleave_95代表1995年的資料,每個變數的數據1至5分別代表產假時給付薪水的月數區間共有五個區間。區間大小通常需要查看編碼簿來獲取定義。 這類資料由於採用數字(其實是Factor)來替代類別,通常隨著數據會釋出該調查的編碼簿(Code Book),這個案例的編碼(1至5)如下: 6.3.4 Generating each 在 R 中,函式是一個可重複使用的程式碼塊,可以接受輸入參數,並返回計算結果。函式可以簡化程式碼,使其更易於維護和修改。為了不要重複相同的程式碼,以下程式碼將視覺化的部分改用「函式」來進行撰寫,再輸入不同子圖所要使用的資料來進行繪圖。 在這個程式碼中,generating_plot() 是一個自定義的函式,它接受一個資料框 df 作為輸入參數。成對大括號內部為該函式所執行的步驟,包含pivot_longer()、replace_na()等。輸出則是一個 ggplot2 圖形物件,其中包含了將這些資料轉換為長條圖的視覺化表示。 在 R 中,創建一個函式需要使用 function() 關鍵字。一個最簡單的函式可能只包含一個輸入參數和一個返回值,例如:my_function <- function(x) {return(x^2)}。在這個例子中,函式名稱是 my_function,它有一個輸入參數 x,函式主體是 x^2,表示將輸入的 x 參數平方。函式主體的執行結果通過 return() 函數返回,並可以存儲到變數中,例如:result <- my_function(3)。函式的定義亦可包含多個輸入參數,可以用數字、list、或Data.Frame等當成輸入參數。 library(tidyverse) options(scipen = 999) library(readxl) matleave <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>% select(iso3, 6:24) generating_plot <- function(df){ df %>% pivot_longer(names_to = "year", values_to = "degree", cols = 2:20) %>% replace_na(list(degree = 0)) %>% mutate(year = year(as.POSIXct(strptime(year, "matleave_%y")))) %>% ggplot() + aes(year, degree) + geom_col(color = "royalblue", fill = "royalblue") + ylim(0, 5) + facet_wrap(~ iso3) + theme_void() + theme(strip.text = element_text(size = 14, face = "bold", vjust=0.5), strip.placement = "inside" ) } matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% generating_plot() matleave %>% filter(matleave_13 == 5, matleave_95 != 5) %>% generating_plot() matleave %>% filter(matleave_13 == 4, matleave_95 == 4) %>% generating_plot() matleave %>% filter(matleave_13 == 4, matleave_95 != 4) %>% generating_plot() matleave %>% filter(matleave_13 == 3, matleave_95 == 3) %>% generating_plot() matleave %>% filter(matleave_13 == 3, matleave_95 != 3) %>% generating_plot() matleave %>% filter(matleave_13 == 2, matleave_95 == 2) %>% generating_plot() matleave %>% filter(matleave_13 == 2, matleave_95 != 2) %>% generating_plot() matleave %>% filter(matleave_13 == 1) %>% generating_plot() 6.3.5 Gathering subplots by cowplot 這段程式碼的作用是將多個 ggplot2 圖形物件組合成一個網格,然後將這個網格圖形儲存為一個圖像文件。首先,這段程式碼定義了多個變數,如 plot_row1、plot_row2、plot_row3 等,每個變數都是一個網格圖形。這些變數通過 plot_grid() 函數來創建,這個函數可以將多個 ggplot2 圖形物件組合成一個網格。在 plot_grid() 函數中,可以設置 labels 參數來為每個子圖添加標籤。 然後,這些變數通過 plot_grid() 函數再次組合,形成一個更大的網格圖形。這裡使用 ncol = 1 參數將多個網格排列成一列。最後,使用 ggsave() 函數將這個網格圖形儲存為一個圖像文件。在這個例子中,圖像文件的名稱是 “test.png”,大小為 10 英寸 x 30 英寸,分辨率為 300 DPI。 總的來說,這段程式碼的作用是將多個 ggplot2 圖形物件組合成一個網格,並將這個網格圖形儲存為一個圖像文件。這樣做可以方便地進行圖像導出和共享,並且可以將多個圖形合併在一起進行比較和分析。 library(cowplot) plot55 <- matleave %>% filter(matleave_13 == 5, matleave_95 == 5) %>% generating_plot() plot05 <- matleave %>% filter(matleave_13 == 5, matleave_95 != 5) %>% generating_plot() plot44 <- matleave %>% filter(matleave_13 == 4, matleave_95 == 4) %>% generating_plot() plot04 <- matleave %>% filter(matleave_13 == 4, matleave_95 != 4) %>% generating_plot() plot33 <- matleave %>% filter(matleave_13 == 3, matleave_95 == 3) %>% generating_plot() plot03 <- matleave %>% filter(matleave_13 == 3, matleave_95 != 3) %>% generating_plot() plot22 <- matleave %>% filter(matleave_13 == 2, matleave_95 == 2) %>% generating_plot() plot02 <- matleave %>% filter(matleave_13 == 2, matleave_95 != 2) %>% generating_plot() plot11 <- matleave %>% filter(matleave_13 == 1) %>% generating_plot() plot_row1 <- plot_grid(plot55, plot05, labels = c('STAY 5', 'INCREASE TO 5')) plot_row2 <- plot_grid(plot44, plot04, labels = c('STAY 4', 'INCREASE TO 4')) plot_row3 <- plot_grid(plot33, plot03, labels = c('STAY 3', 'INCREASE TO 3')) plot_row4 <- plot_grid(plot22, plot02, labels = c('STAY 2', 'INCREASE TO 2')) final_plot <- plot_grid( plot_row1, plot_row2, plot_row3, plot_row4, plot11, ncol = 1 ) ggsave("test.png", final_plot, width=10, height=30, dpi=300) "],["joindata.html", "Chapter 7 Data manipultaiton: Join data 7.1 讀取內政部人口統計資料 7.2 讀取公投資料", " Chapter 7 Data manipultaiton: Join data 7.1 讀取內政部人口統計資料 先使用slice(-1)減去第一行中文欄位名稱。再來,目前縣市鄉鎮市區(site_id)和村里(village)分別是兩個變項,由於不同的鄉鎮市可能會有相同的村里名,所以把site_id與village粘接起來成為完整的村里名vname。 這邊我多加了一行程式碼讓vname可以排到前面一點的變項欄,可以用select()達到這個目的,我之後的變項欄的還要寶劉,所以我多打一個everything()就可以把剩下的變項欄都擺放在後面。因此這個重排變項欄的完整程式碼為select(vname, everything())。 raw <- read_csv("data/opendata107Y030.csv") %>% slice(-1) %>% mutate(vname = str_c(site_id, village)) %>% select(vname, everything()) raw %>% head ## # A tibble: 6 × 157 ## vname statistic_yyy district_code site_id village single_age_15down_m ## <chr> <chr> <chr> <chr> <chr> <chr> ## 1 新北市板橋區… 107 65000010001 新北市… 留侯里 118 ## 2 新北市板橋區… 107 65000010002 新北市… 流芳里 119 ## 3 新北市板橋區… 107 65000010003 新北市… 赤松里 60 ## 4 新北市板橋區… 107 65000010004 新北市… 黃石里 113 ## 5 新北市板橋區… 107 65000010005 新北市… 挹秀里 123 ## 6 新北市板橋區… 107 65000010006 新北市… 湳興里 351 ## # ℹ 151 more variables: single_age_15_19_m <chr>, single_age_20_24_m <chr>, ## # single_age_25_29_m <chr>, single_age_30_34_m <chr>, ## # single_age_35_39_m <chr>, single_age_40_44_m <chr>, ## # single_age_45_49_m <chr>, single_age_50_54_m <chr>, ## # single_age_55_59_m <chr>, single_age_60_64_m <chr>, ## # single_age_65_69_m <chr>, single_age_70_74_m <chr>, ## # single_age_75_79_m <chr>, single_age_80_84_m <chr>, … # raw %>% glimpse() 7.1.1 分析規劃 建立各鄉鎮市區的老年人口比例 建立各鄉鎮市區的年齡中位數 讀取所有(某一)公投案的結果 視覺化年齡與公投結果間的相關性 7.1.2 清理資料 我們之前在談資料的「觀察、統計、和二維表格」三種型態時,曾經談到統計型態和二維表格型態間的差異。當時所提到的「統計型態」,也就是每個變項欄恰好是我們所認知的單一變項(如每一個變項欄恰是人口統計變項的年齡、性別、教育程度、數量),會有助於進行統計分析,也就是tidy型態的資料。相較之下,上述的表格是把資料攤成二維的型態,每一個變項是某個年齡層的某種性別的某種婚姻狀況,包含了三個人口統計變項,是方便一般大眾讀的,但不是適合進行統計的tidy型態。 這類的資料tidyverse的相關套件把它稱為tidy form。遵守tidy form形式的資料是,每一個欄恰好一個變項。例如在內政部開放資料「15歲以上現住人口按性別、年齡、婚姻狀況及教育程度分」中,每個變數(年齡、婚姻狀況、教育程度、人口數等等)均各自為一個欄上的變項。 15歲以上現住人口按性別、年齡、婚姻狀況及教育程度分 | 政府資料開放平臺 (data.gov.tw) 接下來,我要把表格型態的資料轉為tidy型態資料。原本的資料是這樣的型態。 我要將後方的數值變項欄(single_age_15down_m等)轉為單一變項key的值,再把其所對應到的資料值,也轉為單一變項value。請注意看上圖和程式碼後方結果圖的顏色區塊。南投縣中寮鄉中寮村(綠色)被複製且展開為多列。而原本多個年齡層和資料的變數項(紅色)變成一個變項欄的資料,分別對應到其原本對應的數值(藍色)。 tidy_data <- raw %>% pivot_longer(names_to = "key", values_to = "value", cols = 6:ncol(.)) 相對於pivot_wider()把變項展開成欄,pivot_longer()函式可以收合被展開的變項,在此將要收合的變數名稱統一稱為key,並將該變數所對應到的數值稱為value。並且我用6:ncol(.)來指定我要收合哪些變項欄。 ncol(.)的「.」代表從前面%>% pipe進來的那個data.frame。 pivot_longer()後資料列從7760增加至1,179,520列。(灰底部分用來觀察結果用) 由於每一列恰好是一種婚姻狀態、一個年齡層和一個性別,所以,我們可以把key中的婚姻狀態、年齡層和性別切割出來做為變數。觀察key欄位發現其格式有一些規律性,主要是婚姻狀態_年齡下界_年齡上界_性別的形式。標準的範例如married_15_10_m或widowed_25_29_f,但有一些並非這種形式,例如: single_age_15_19_m:其中single_age之間多了一個底線,所以把single_age取代為single就好。 married_15down_m:因為是15down少了一個底線,所以取代為0_14。 married_100up_f:因為100up少了一個底線,所以取代為100_105。 之後,我使用tidyr::separate()函式將key切成四個變項,分別為married、ageLower、ageUpper、gender。 separate()有一個參數是remove=T(預設值),意思是說,當把key變項切割為四個變項後,預設把key變項給丟棄;但如果未來你還會用到key變項的話,你可以把remove改為FALSE,代表切割完後,還保留key變項。 tidyr::separate():Given either regular expression or a vector of character positions, separate() turns a single character column into multiple columns. 此時我清理出來的資料大致如下: 最後就剩零星的操作,包含轉換資料為數值型態、或者你也可以在這裡建立新的指標(例如年齡平均)。最後加上一個arrange(vname)讓他按照村里的全名排序。 tidy_data <- raw %>% pivot_longer(names_to = "key", values_to = "value", cols = 6:ncol(.)) %>% mutate(key = str_replace(key, "_age", "")) %>% mutate(key = str_replace(key, "100up", "100_110")) %>% mutate(key = str_replace(key, "15down", "0_15")) %>% separate(key, c("married", "ageLower", "ageUpper", "gender")) %>% mutate(ageLower = as.numeric(ageLower), # age = str(ageLower, ageUpper), ageUpper = as.numeric(ageUpper), value = as.numeric(value)) %>% select(-statistic_yyy) %>% arrange(vname) 7.1.3 進階:運用rowwise() raw %>% mutate_at(vars(6:157), as.numeric) %>% replace(is.na(.), 0) %>% rowwise() %>% mutate(married = sum(c_across(matches("widowed|divorced|married")), na.rm = T)) %>% mutate(lt65 = sum(c_across(matches("65|70|75|80|85|90|95|100")), na.rm = T)) %>% select(vname, married, lt65) %>% head ## # A tibble: 6 × 3 ## # Rowwise: ## vname married lt65 ## <chr> <dbl> <dbl> ## 1 新北市板橋區留侯里 920 272 ## 2 新北市板橋區流芳里 826 280 ## 3 新北市板橋區赤松里 463 149 ## 4 新北市板橋區黃石里 632 210 ## 5 新北市板橋區挹秀里 1061 365 ## 6 新北市板橋區湳興里 3157 838 7.1.4 建立鄉鎮市區與村里指標 7.1.4.1 使用group_by()建立村里指標 將資料轉換為tidy型態後,接下來要做的事情是建立村里、鄉鎮市區、縣市的分級指標。針對每個村里,我希望計算出總人口數people(原本依據年齡與性別、婚姻情形分割)、老年人總數elderSum、曾結婚人口總數marriedSum。之後再分別除以該村里的總人口數people,老年人的人口比例elderPerc以及結婚的人口比例marriedPerc。 因為一個村里的資料會根據不同性別、不同婚姻情形、不同年齡層被切割為不同的資料列,共2X4X19個資料列。因此,如果我想知道一個村里的總人口數或相關統計資料,就不需彙整這些資料列。dplyr有非常強大的group_by()可以根據群組來進行運算,我用村里代號(district_code)來做群組運算,所以是group_by(district_code)或用我們所產生的vname作為群組基準來運算group_by(vname)。 語法上,通常group_by()之後經常會跟著summarise(),跟mutate()的語法有點像,都會產生新變數,但因為這邊用group_by()針對某個或某幾個變數做彙整,相當於base套件的apply()函式,因此會根據每個不同的群組做組內的數值彙整運算。比方說,在以下的程式碼中,我用sum(num)計算了該群組內的總人數,然後同樣累計了年齡大於等於65歲的總人數,以及婚姻狀態不為single的總人數。 簡單地說,相當於按照不同的村里(district_code)各別做value的加總(該村里的總人口數)、篩選出年齡65歲以上的人口組別進行加總、篩選出不是單身者的人口組別進行加總。之後會加一個ungroup()解開群組。 最後一行left_join(raw %>% select(vname, site_id), by = \"vname\")是由於group_by()後會讓其他變數消失(例如鄉鎮市區名site_id),所以我希望將原本資料raw中的site_id給併回來。我可以抽取出raw中的vname和site_id兩個變項,然後以vname為key,用left_join()將site_id給併回來。 筆記:當group_by()、summarize()後不參與的變項會消失,但可以透過left_join()的方式將原有的變項併回來。 village_stat <- tidy_data %>% filter(ageLower >= 20) %>% group_by(vname) %>% summarise(legalPopulation = sum(value), elderSum = sum(value[ageLower >= 65]), marriedSum = sum(value[married %in% c("married", "divorced", "widowed")]), womenSum = sum(value[gender == "f"])) %>% ungroup() %>% left_join(raw %>% select(vname, site_id), by = "vname") 測試 7.1.4.2 將村里指標匯總為鄉鎮市區指標 剛剛是根據村里(village)來建立指標,現在要根據鄉鎮市區來建立指標。走過前方的邏輯後,我們只需要把原本用來做group_by()的村里變項vname改為鄉鎮市區的變項site_id,就可以完成這件事,其他都一樣,你發現沒? 不過這邊我要多做一件事。因為三民區和鳳山區兩個區非常的大(我猜),所以內政資料中的鄉鎮市區資料有分「三民一」、「三民二」、「鳳山一」、「鳳山二」。我們只要在彙整資料前,將site_id的這四類值取代好,便可以在鄉鎮市區的指標中一併彙整。以下我一共彙整出四種資料,分別為該區人口數(legalPopulation)、老年人口數(elderSum)、曾婚人口數(marriedSum)、女性人口數(womenSum)。不難想像接下來可以計算出各鄉鎮市區的老年人口比例、曾婚比例、女性比例等。 town_stat <- village_stat %>% # mutate(site_id = str_sub(vname, 1, 6)) %>% mutate(site_id = str_replace(site_id, "三民一|三民二", "三民區")) %>% mutate(site_id = str_replace(site_id, "鳳山一|鳳山二", "鳳山區")) %>% group_by(site_id) %>% summarize(legalPopulation = sum(legalPopulation), elderSum = sum(elderSum), marriedSum = sum(marriedSum), womenSum = sum(womenSum) )%>% ungroup() 7.1.5 視覺化測試(老年人口數 x 曾婚人口數) th <- theme(title = element_text(family="Heiti TC Light"), text = element_text(family="Heiti TC Light"), axis.text.y = element_text(family="PingFang TC"), axis.text.x = element_text(family="Heiti TC Light"), legend.text = element_text(family="Heiti TC Light"), plot.title = element_text(family="Heiti TC Light") ) town_stat %>% mutate(marriedPerc = marriedSum / legalPopulation) %>% mutate(womenPerc = womenSum / legalPopulation) %>% mutate(elderPerc = elderSum / legalPopulation) %>% ggplot() + aes(womenPerc, elderPerc) + geom_point(alpha = 0.3) + geom_text(aes(label=site_id, vjust=1.3, size=4), family = "Heiti TC Light") + th # geom_jitter(alpha = 0.3) 7.2 讀取公投資料 首先,先讀取資料並重新命名每個變項。由於我們要連結公投資料和前面的內政部人口統計資料,所以要注意兩筆資料間是否有共通的key(資料庫稱為鍵值)。town_stat的是以site_id鄉鎮市區名為主鍵,所以公投資料這邊也產生一個同名的鄉鎮市區變項site_id。 ref10 <- read_csv("data/ref10.csv") %>% select(county = 縣市, town = 鄉鎮市區, agree = 同意票數, disagree = 不同意票數, legalVote = 有效票數, illegalVote = 無效票數, vote = 投票數, legalPopulation = 投票權人數) %>% mutate(site_id = str_c(county, town)) %>% drop_na(site_id) names(ref10) ## [1] "county" "town" "agree" "disagree" ## [5] "legalVote" "illegalVote" "vote" "legalPopulation" ## [9] "site_id" 合併資料測試,注意,由於兩邊都有legalPopulation,所以town_stat中的legalPopulation增生為legalPopulation.x,而ref10中的legalPopulation則重新命名為legalPopulation.y。 town_stat %>% left_join(ref10, by = "site_id") ## # A tibble: 368 × 13 ## site_id legalPopulation.x elderSum marriedSum womenSum county town agree ## <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl> ## 1 南投縣中寮… 12791 3272 9553 5824 南投縣 中寮… 5748 ## 2 南投縣仁愛… 12172 1713 9078 5899 南投縣 仁愛… 5702 ## 3 南投縣信義… 12860 1847 9050 5938 南投縣 信義… 6891 ## 4 南投縣南投… 81874 15855 57042 41343 南投縣 南投… 37547 ## 5 南投縣名間… 32388 7106 23375 15304 南投縣 名間… 14533 ## 6 南投縣國姓… 16196 3744 11826 7434 南投縣 國姓… 7089 ## 7 南投縣埔里… 66699 13411 46316 33718 南投縣 埔里… 29571 ## 8 南投縣水里… 15023 3644 10850 7106 南投縣 水里… 6392 ## 9 南投縣竹山… 45629 10154 33201 22244 南投縣 竹山… 19254 ## 10 南投縣草屯… 80426 15141 56384 40008 南投縣 草屯… 35215 ## # ℹ 358 more rows ## # ℹ 5 more variables: disagree <dbl>, legalVote <dbl>, illegalVote <dbl>, ## # vote <dbl>, legalPopulation.y <dbl> 7.2.1 合併公投資料並視覺化 由於人口統計資料中的鄉鎮市區若只有兩個字如「東區」中間有一全形空白「東 區」,但公投資料中並沒有這樣的空白,所以為了兩者要能夠正確合併,需要先做好取代。可以逐一取代,或者,直接取代掉該全形空白為空字串即可。 town_stat %>% mutate(site_id = str_replace(site_id, " ", "")) %>% # mutate(site_id = str_replace(site_id, "東 區", "東區"), # site_id = str_replace(site_id, "西 區", "西區"), # site_id = str_replace(site_id, "南 區", "南區"), # site_id = str_replace(site_id, "北 區", "北區"), # site_id = str_replace(site_id, "中 區", "中區")) %>% left_join(ref10, by = "site_id") %>% mutate(agreeRate = agree / legalVote, marriedPerc = marriedSum / legalPopulation.x) %>% # select(site_id, agree, legalVote, marriedSum, legalPopulation.x) %>% ggplot() + aes(agreeRate, marriedPerc) + geom_point(alpha = 0.5, color = "royalblue") + theme_light() "],["categorical.html", "Chapter 8 Categorical Data Analysis 8.1 Survey Analysis 8.2 The Case: Misinformation Perception 8.3 Factorizing data 8.4 Order-to-factor 8.5 Cross-tabulating", " Chapter 8 Categorical Data Analysis 8.1 Survey Analysis 國外不少媒體會用智庫或者學術單位所發佈的調查結果作為資料新聞素材,我們所曾經處理過的華盛頓郵報的產假支薪案例也是。以下為該案例資料的截圖。matleave_95代表1995年的資料,每個變數的數據1至5分別代表產假時給付薪水的月數區間共有五個區間。區間大小通常需要查看編碼簿來獲取定義。 這類資料由於採用數字(其實是Factor)來替代類別,通常隨著數據會釋出該調查的編碼簿(Code Book),這個案例的編碼(1至5)如下: 8.2 The Case: Misinformation Perception 這個範例涵括了在做問卷分析時常用的處理步驟。最核心的步驟是將文字陳述的類別資料轉換為便於後續運算的factor或數值資料。如果類別數量過多的時候,在這個過程會順便進行重新分組。例如依照年齡組把填答者分為老年、中壯年、青少年、兒童四組。 raw <- read_rds("data/tfc_survey.rds") raw ## # A tibble: 1,216 × 6 ## Q7 Q8 QAParty QASide QA3 QA4 ## <chr> <chr> <chr> <chr> <chr> <chr> ## 1 會 絕對會 民主進步黨 非常接近泛綠 25-29 研究所及以上 ## 2 會 絕對會 沒有政黨偏好 接近泛藍 35-39 研究所及以上 ## 3 不會 絕對會 沒有政黨偏好 接近泛綠 35-39 大專(專科與大學) ## 4 會 會 台灣民眾黨 接近泛綠 20-24 大專(專科與大學) ## 5 不會 不會 民主進步黨 非常接近泛綠 45-49 研究所及以上 ## 6 會 絕對會 沒有政黨偏好 非常接近泛藍 25-29 大專(專科與大學) ## 7 不會 絕對會 民主進步黨 接近泛綠 30-34 大專(專科與大學) ## 8 會 絕對會 台灣民眾黨 接近泛綠 20-24 大專(專科與大學) ## 9 會 絕對會 沒有政黨偏好 接近泛藍 20-24 大專(專科與大學) ## 10 會 會 民主進步黨 接近泛綠 55-59 高中、高職 ## # ℹ 1,206 more rows 8.3 Factorizing data 通常問卷會分為兩種類型的資料,一種是人口統計用的基本資料(如性別、年齡組、教育程度)、另一種是問卷本身要問的題項。以下是常見的問卷型態,包含把年齡從20歲開始每五年作為一組,70歲以上則歸類為一組,共會有十一組。而教育程度則常分為五至六組,但在問卷設計的時候,通常會需要增加「拒答」的選項。如果問卷中包含政黨意識形態,就必須要決定要以黨派作為類別變項,或者以意識形態做順序尺度。以下即為一個順序尺度的案例,從「非常接近泛綠」到「非常接近泛藍」共五個等第,但另增「拒答」選項。 dt <- raw %>% mutate(QA3 = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"))) %>% mutate(QA3_lv = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"), labels = c("青年", "青年", "壯年", "壯年", "壯年", "中年", "中年", "中年", "中年", "老年", "老年"))) %>% mutate(QA4 = ordered(QA4, levels=c("拒答", "國小及以下", "初中、國中", "高中、高職", "大專(專科與大學)", "研究所及以上"), labels=c("拒答", "國小以下", "國中", "高中職", "大專", "研究所以上"))) %>% mutate(QASide=ordered(QASide, exclude="拒答", levels=c("非常接近泛綠", "接近泛綠", "都不接近", "接近泛藍", "非常接近泛藍"))) 8.3.1 factor-to-order 在一開始清理資料的時候,會建議先把類別變數(通常是文字型態)轉為factor型態。常用的函式是用mutate()搭配ordered()來改變變數型態。ordered()會照類別順序來標定該factor所對應到的數字。可以用as.integer()將factor轉為整數後就可以看到各類別的順序。 mutate(QA3 = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"))) %>% dt$QA3[1:10] ## [1] 25-29 35-39 35-39 20-24 45-49 25-29 30-34 20-24 20-24 55-59 ## 11 Levels: 20-24 < 25-29 < 30-34 < 35-39 < 40-44 < 45-49 < 50-54 < ... < 70及以上 as.integer(dt$QA3[1:10]) ## [1] 2 4 4 1 6 2 3 1 1 8 8.3.2 Excluding 如果有某些類別變數的值(如「拒答」)不想被編入factor,可以在reorder()中加入exclude的參數指定不想被編入類別值。 mutate(QASide=ordered(QASide, exclude="拒答", levels=c("非常接近泛綠", "接近泛綠", "都不接近", "接近泛藍", "非常接近泛藍"))) dt$QASide[1:10] ## [1] 非常接近泛綠 接近泛藍 接近泛綠 接近泛綠 非常接近泛綠 ## [6] 非常接近泛藍 接近泛綠 接近泛綠 接近泛藍 接近泛綠 ## Levels: 非常接近泛綠 < 接近泛綠 < 都不接近 < 接近泛藍 < 非常接近泛藍 as.integer(dt$QASide[1:10]) ## [1] 1 4 2 2 1 5 2 2 4 2 8.3.3 Grouping-up 如果有某些類別變數的類別過多,希望再次群組化為較少的組別,如重新群組各年齡層為青年、壯年、中年與老年四個尺度。此時除了levels參數外,可以另外加入labels的參數,指定每個類別變數值所要對應到的群組。以下為群組後的結果,仔細觀察剩下多少個尺度。 mutate(QA3_lv = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"), labels = c("青年", "青年", "壯年", "壯年", "壯年", "中年", "中年", "中年", "中年", "老年", "老年"))) %>% dt$QA3[1:10] ## [1] 25-29 35-39 35-39 20-24 45-49 25-29 30-34 20-24 20-24 55-59 ## 11 Levels: 20-24 < 25-29 < 30-34 < 35-39 < 40-44 < 45-49 < 50-54 < ... < 70及以上 as.integer(dt$QA3[1:10]) ## [1] 2 4 4 1 6 2 3 1 1 8 dt$QA3_lv[1:10] ## [1] 青年 壯年 壯年 青年 中年 青年 壯年 青年 青年 中年 ## Levels: 青年 < 壯年 < 中年 < 老年 8.4 Order-to-factor Q7 請問您會不會受到假消息影響? Q8 請問您認為其他人會不會受到假消息的影響? 對於Q7、Q8的問題是詢問填答者認為自己或他人會不會受到假消息影響,並從「一點也不會」、「不會」、「會」到「絕對會」共分四個等第。Q7分別是「81, 446, 650, 39」、Q8分別是「5, 58, 803, 350」。相較於Q7,Q8的分佈略為左傾,亦即傾向於認為其他人較容易受影響。此時如果想要分析Q7和Q8間的關係,由於各有四個等第,其交叉分析表會有16個項目,相當難以分析。 dt2 <- dt %>% mutate(Q7 = ordered(Q7, levels=c("一點也不會", "不會", "會", "絕對會"))) %>% mutate(Q8 = ordered(Q8, levels=c("一點也不會", "不會", "會", "絕對會"))) %>% mutate(Q7_3rd = as.numeric(Q8)-as.numeric(Q7)) %>% mutate(Q7_3rd_lv = ifelse(Q7 %in% c("一點也不會", "不會") & Q8 %in% c("會", "絕對會"), "高", "低")) %>% mutate(Q7_3rd_lv = ordered(Q7_3rd_lv, levels=c("低", "高"))) 這時候一種策略是把這兩題視為順序尺度變數,然後把兩題的分數相減。相減後的分數從「-1, 0, 1, 2, 3」各有「12, 482, 600, 103, 19」,不難猜到會是一個較為集中的分佈,後續僅能當作順序尺度或連續變項來分析,不適合找一個閾值轉類別變項。 另一種策略是,分別先把Q7與Q8的「一點也不會」和「不會」群組為「不會」、再把「會」與「絕對會」群組為「會」,這樣Q7與Q8的交叉分析表會變成2X2的分析表,雖然群組數量比較少,但別忘記Q7的填答結果集中在會與不會、而Q8為一個較為偏右的分佈,集中在「會」和「絕對會」。Q8勢必會造成比例不均的分組。 dt2 %>% count(as.integer(Q8)-as.integer(Q7)) ## # A tibble: 5 × 2 ## `as.integer(Q8) - as.integer(Q7)` n ## <int> <int> ## 1 -1 12 ## 2 0 482 ## 3 1 600 ## 4 2 103 ## 5 3 19 最後這題所採行的策略是,做高、低第三人效果分組,也就是根據認為自己「一點也不會」、「不會」受影響,而他人「會」或「絕對會」受影響的重新群組為「高第三人效果組」,其他則為「低第三人效果組」。亦即,分組的一句是在對自己與他人的認知上,無模糊空間的分組方法(也就是認為自己至少不會,和認為別人應該會)。 dt2 %>% count(Q7_3rd_lv) ## # A tibble: 2 × 2 ## Q7_3rd_lv n ## <ord> <int> ## 1 低 746 ## 2 高 470 8.5 Cross-tabulating 在R語言中,xtabs()是一個用於建立交叉表(cross-tabulation)的函數。它可以將資料中的變數進行交叉分類,並計算每個交叉組合的頻次或其他統計量。 chisq.test(xtb)分析結果指出 X-squared(卡方值)等於10.017,df(自由度)等於3,p-value(p值)等於0.01842。 這個結果顯示在這個交叉表中,QA3_lv(年齡層)Q7_3rd_lv(第三人效應)間的分類狀態並非完全獨立,而是存在某種統計上的關聯性。 由於p值小於我們事先選定的顯著性水準(通常為0.05),我們可以拒絕虛無假設(兩個變數獨立),並認為這個關聯性是統計上顯著的。 對於vcd::assocstats(xtb)的分析結果: 這些統計量用於評估QA3_lv和Q7_3rd_lv之間的關聯性程度。 連續性係數(Contingency Coeff.)和克拉瑪爾V(Cramer’s V)的值,表示兩個變數之間的關聯性較弱,但仍存在一定程度的相關性。 (xtb <- xtabs(~QA3_lv + Q7_3rd_lv, data=dt2)) ## Q7_3rd_lv ## QA3_lv 低 高 ## 青年 178 110 ## 壯年 370 199 ## 中年 157 134 ## 老年 41 27 (chi2 <- chisq.test(xtb)) ## ## Pearson's Chi-squared test ## ## data: xtb ## X-squared = 10.017, df = 3, p-value = 0.01842 vcd::assocstats(xtb) ## X^2 df P(> X^2) ## Likelihood Ratio 9.9301 3 0.01917 ## Pearson 10.0173 3 0.01842 ## ## Phi-Coefficient : NA ## Contingency Coeff.: 0.09 ## Cramer's V : 0.091 print(round(chi2$observed, 2)) ## Q7_3rd_lv ## QA3_lv 低 高 ## 青年 178 110 ## 壯年 370 199 ## 中年 157 134 ## 老年 41 27 print(round(chi2$expected, 2)) ## Q7_3rd_lv ## QA3_lv 低 高 ## 青年 176.68 111.32 ## 壯年 349.07 219.93 ## 中年 178.52 112.48 ## 老年 41.72 26.28 print(round(chi2$residuals, 2)) ## Q7_3rd_lv ## QA3_lv 低 高 ## 青年 0.10 -0.12 ## 壯年 1.12 -1.41 ## 中年 -1.61 2.03 ## 老年 -0.11 0.14 par(family="Heiti TC Light") gplots::balloonplot(t(xtb), xlab="第三人效果", ylab="年齡組", main="", dotsize=4/max(strwidth(40),strheight(40)), text.size=1.5,label.size=2, rowmar=1, colmar=1) par(family="Heiti TC Light") corrplot::corrplot(chi2$residuals, is.corr = F) xtb %>% as_tibble() %>% group_by(QA3_lv) %>% mutate(fill = if_else(n == max(n), "orangered", "skyblue")) %>% ungroup() %>% mutate(QA3_lv = ordered(QA3_lv, levels=c("青年", "壯年", "中年", "老年"))) %>% arrange(desc(QA3_lv)) %>% ggplot() + aes(y = QA3_lv, x=Q7_3rd_lv, color = fill, size = n) + scale_size_area(max_size=70, guide = "none") + geom_point(alpha=0.7) + scale_color_manual(values = c("orangered", "skyblue"), guide = "none") + geom_text(aes( label=n, vjust=1.3, size=10 ), color="black",) + theme_minimal() + theme(text = element_text(family="Heiti TC Light"), title = element_text(family="Heiti TC Light")) "],["timeline.html", "Chapter 9 Processing Timeline 9.1 Time object 9.2 Example: Processing time object in social opinions", " Chapter 9 Processing Timeline 9.1 Time object 在當前的數位時代,網路上充斥著豐富的開放資料,許多其中包含著關鍵的時間資訊,如訂單成立的時間、氣象觀測的時刻以及股票的交易時間等。這些時間數據往往以字串形式存在,但若需進行時間計算或構建時間序列分析,在程式處理前必須將其轉化為專門的時間物件。 在R語言中,主要有兩種時間物件:POSIXct和POSIXlt,它們可通過as.POSIXct()和as.POSIXlt()函數將字串轉換成相應的時間物件形式。一旦轉換完成,各種時間相關的計算操作,如時間點之間的差異計算、時區轉換、時間序列的特定區間提取等,便可輕鬆進行。具體而言,POSIXct是以1970年1月1日00:00:00 UTC至當前的總秒數來表示時間點,適合於進行數學計算;而POSIXlt則採用結構化列表形式存儲,包括年、月、日、小時、分、秒等時間單位,更便於人工閱讀與理解。這兩種時間物件的主要差異在於,POSIXct較為適合於計算處理,POSIXlt則在時間元素的展示與處理上更為直觀。 此外,利用Sys.time()函數能夠獲取當前時刻的時間物件,這為時間數據的動態處理提供了便利。學習如何有效運用這些時間物件進行日期與時間的計算在許多領域,例如金融、氣象、交通等,都是非常關鍵的能力。 9.2 Example: Processing time object in social opinions 9.2.1 Char-to-Time 在 R 裡面,我們可以使用 strptime() 函數將字串轉換為時間物件,其中 %Y、%m、%d、%H、%M、%S 等是用來表示時間的格式碼。在這段程式碼中,我們使用 strptime() 函數將 ptime 這個字串轉換為一個時間物件,其中 %Y-%m-%dT%H:%M:%SZ 是該字串的時間格式,也就是說這個字串是以 ISO 8601 的格式表示的時間,例如 2022-03-31T14:30:00Z。tz = \"ASIA/Taipei\" 則是指定時間所在的時區,這裡指定的是台灣時間。轉換完成後,我們使用 as.POSIXct() 函數將 strptime() 轉換出來的時間物件再轉換為POSIXct時間物件,並將其存入 ptime 這個欄位中。這段程式碼的作用是將一個 ISO 8601 格式的字串轉換為 POSIXct 時間物件,並指定時區為台灣,方便之後進行時間相關的運算。 在 strptime() 函數中,可以使用不同的格式碼來指定時間的格式。以下是常用的幾種格式碼及其意義: %Y:四位數的年份,例如 2022。 %m:兩位數的月份,範圍是 01 到 12。 %d:兩位數的日期,範圍是 01 到 31。 %H:兩位數的小時,範圍是 00 到 23。 %M:兩位數的分鐘,範圍是 00 到 59。 %S:兩位數的秒數,範圍是 00 到 59。 %b:縮寫形式的月份名稱,例如 Jan。 %B:完整形式的月份名稱,例如 January。 %a:縮寫形式的星期幾名稱,例如 Mon。 %A:完整形式的星期幾名稱,例如 Monday。 %p:AM 或 PM,例如 AM。 在 strptime() 函數中,你可以使用這些格式碼來指定一個字串的時間格式,以便將其轉換為時間物件。例如,如果一個字串的格式是 2022-03-31 14:30:00,那麼可以使用 %Y-%m-%d %H:%M:%S 這個時間格式來將其轉換為一個時間物件。 # Reading from url # ptturl <- "https://github.com/P4CSS/R4CSSData/raw/main/ptt_hang_posts.csv" # raw <- read.csv(url(ptturl)) # read_csv() won't convert timestamp to POSIXct automatically # raw <- read.csv("data/ptt_hang_posts.csv") # clean <- raw %>% # mutate(ptime = as.POSIXct(strptime(ptime, "%Y-%m-%dT%H:%M:%SZ"))) # read_csv() will convert timestamp to POSIXct automatically clean <- read_csv("data/ptt_hang_posts.csv") t <- "2019-04-12T00:48:19Z" class(t) ## [1] "character" ?strptime t1 <- strptime(t, "%Y-%m-%dT%H:%M:%SZ") clean %>% head # %>% View ## # A tibble: 6 × 7 ## plink board pcontent poster ptitle ptime ipaddr ## <chr> <chr> <chr> <chr> <chr> <dttm> <chr> ## 1 https://www.ptt.cc/bb… Hate… "\\n\\n韓… loveb… Re: [… 2019-04-12 02:21:14 83.22… ## 2 https://www.ptt.cc/bb… Hate… "\\n\\n\\n… ikr36… Re: [… 2019-04-12 02:13:45 114.4… ## 3 https://www.ptt.cc/bb… Hate… "\\n\\n正… sunye… Re: [… 2019-04-12 02:10:18 118.1… ## 4 https://www.ptt.cc/bb… Hate… "\\n:\\n\\… rock7… Re: [… 2019-04-12 02:03:14 118.1… ## 5 https://www.ptt.cc/bb… Hate… "\\n\\n我… btm97… Re: [… 2019-04-12 02:01:12 101.1… ## 6 https://www.ptt.cc/bb… Hate… "\\n\\n\\n… cblade [討論… 2019-04-12 01:55:06 180.2… 9.2.2 Density plot along time 在資料分析的過程中,我們經常需要對資料進行分布分析,以了解資料的特性。ggplot2 套件提供了 geom_density() 函數,可以用來繪製密度圖(density plot)。密度圖顯示了一個連續變量的概率密度函數的近似值,可以用來了解該變量的分佈情況。密度圖與直方圖類似,但它是基於核密度估計方法繪製的,所以在某些情況下可以提供更好的分佈近似。它將一個連續變量區間劃分為若干個小區間,然後對每個小區間的密度進行估計,再將這些小區間的密度估計值連接起來,形成一條平滑曲線,用以描述變量的分佈情況。 在 ggplot2 中,使用 geom_density() 函數可以很方便地繪製密度圖。我們只需要指定變量名稱,即可繪製出該變量的密度圖。此外,我們也可以使用 stat_density() 函數來繪製密度圖,這個函數允許我們對密度圖進行更多的自定義設置,例如指定核函數、調整帶寬等。繪製密度圖可以讓我們更直觀地了解變量的分佈情況,進而對資料進行更深入的分析和探索。 clean %>% ggplot() + aes(ptime) + geom_density() 9.2.3 Freq by month 如果想要詳細觀察逐年逐月的變化,使用密度圖可能不夠直觀,此時可以考慮使用直方圖來呈現資料。直方圖可以將資料劃分為若干個等寬的區間,並計算每個區間內資料的頻率,然後將這些頻率顯示為長方形柱,以反映資料的分佈情況。對於時間序列資料,我們可以將其劃分為月、週等時間單位,然後計算每個時間單位內資料的出現次數,再使用 ggplot2 中的 geom_col() 函數繪製直方圖。 以上程式碼中,我們使用 mutate() 函數將 ptime 欄位轉換為月份 m,然後使用 count() 函數計算每個月份出現的次數。接著使用 ggplot() 函數初始化一個 ggplot 對象,指定 aes() 函數的 x 軸為月份 m,y 軸為出現次數 n,然後使用 geom_col() 函數繪製直方圖。這樣可以很直觀地看到每個月份資料的出現次數,進而觀察到逐年逐月的變化趨勢。如果需要更詳細的觀察,可以將資料劃分為更小的時間單位,例如週,然後使用類似的方法繪製直方圖。 ?lubridate clean %>% mutate(m = month(ptime)) %>% count(m) %>% ggplot() + aes(m, n) + geom_col() 9.2.4 Freq-by-date (good) 在處理時間序列資料時,我們常常需要將資料劃分為不同的時間單位,例如月、週、日等,以便進行更精細的分析和視覺化。然而,如果只是單純地提取出時間序列資料中的某一個時間單位,例如月份,就會失去時間軸在年的特性,因此需要採取一些方法來保留日期(如年)的特性。 以上程式碼中,我們使用 filter() 函數選取了時間範圍為 2019 年 3 月 18 日到 4 月 1 日的資料,然後使用 floor_date() 函數將每個時間點取整為當天的起始時間,以保留日期(如年)的特性。這樣可以確保同一天的資料都被歸到同一個時間單位中,進而保留時間軸在年的特性。接著使用 count() 函數計算每個時間單位內資料的出現次數,再使用 ggplot() 函數和 geom_col() 函數繪製直方圖,可以看到在時間軸上的年份特性被保留了下來。 總之,當我們需要從時間序列資料中提取某一個時間單位時,應該採用能夠保留日期(如年)特性的方法,例如使用 floor_date() 函數,以便進行更加精細的分析和視覺化。 clean %>% filter(ptime >= as_date("2019-03-18") & ptime < as_date("2019-04-01")) %>% mutate(m = floor_date(ptime, unit = "day")) %>% count(m) %>% ggplot() + aes(m, n) + geom_col() 9.2.5 Freq-by-hour 透過觀察資料在週末和週間的變化,可以幫助我們了解不同時間段的資料分佈情況。以下是一個範例程式碼,可以根據每天的時間點和文章數來觀察資料在週末和週間的變化。相較於將資料分為週間和週末,這個範例程式碼使用 X 軸作為 24 小時的時間點,而 Y 軸為不同日期的文章量,使用分組的方式,針對不同日期繪製折線圖,最後使用 facet_wrap() 函數將資料分成週末和週間兩個子圖來進行比較。 首先,我們使用 filter() 函數選取時間範圍為 2019 年 3 月 25 日到 4 月 1 日的資料。接著,使用 floor_date() 函數將每個時間點取整為當天的起始時間,以便進行統計。然後,使用 hour() 函數取出每個時間點的小時數,以及使用 count() 函數計算每個時間點和日期的文章數。接著,使用 wday() 函數取出每個日期的星期幾,並使用 ifelse() 函數將週末和週間的日期標記為不同的類別。最後,使用 ggplot() 函數初始化一個 ggplot 對象,指定 aes() 函數的 x 軸為小時數 h,y 軸為文章數 n,以及日期 d 的類別 color。然後,使用 geom_line() 函數繪製折線圖,並使用 facet_wrap() 函數將資料分為週末和週間兩個子圖。 透過這樣的方式,我們可以很清楚地看到週末和週間的文章量變化趨勢,從而對資料進行更深入的分析和探索。 clean %>% filter(ptime >= as_datetime("2019-03-25") & ptime < as_datetime("2019-04-01")) %>% mutate(d = floor_date(ptime, unit = "day")) %>% mutate(h = hour(ptime)) %>% count(d, h) %>% mutate(wd = wday(d, label = F, locale = Sys.getlocale("LC_TIME"))) %>% mutate(isweekend = ifelse(wd >= 6, "weekend", "weekday")) %>% ggplot() + aes(h, n, color = as.character(d)) + geom_line() + facet_wrap(~isweekend) ?ifelse "],["na.html", "Chapter 10 NA Processing 10.1 Cleaning Gov Annual Budget 10.2 Cleaning Covid Vaccinating data", " Chapter 10 NA Processing 許多統計資料都會有不同程度的NA(缺失值、遺漏值)。缺失值產生的原因不一,可能有以下原因: 資料運算的時候產生的填缺失值。例如spread()和pivot_wider()經常會產生NA,也經常會指定值(例如0)來取代可能產生的NA。 資料紀錄的時候遺漏某些時間點的資料。 開放資料在開放時已經被整理成階層化、易於展示、一般人易懂的表格型態。此時,若將其讀入也會產生非常大量的NA。例如本章節所要提到的政府各部會預算比例。 紀錄資料筆數非常龐大、來源眾多、紀錄時間不一時,雖然有很多紀錄,但這些紀錄必須要被對齊、刪減,才能夠獲得有意義的可計算資料。例如本章節會提到的世界各國疫苗注射資料。 10.1 Cleaning Gov Annual Budget 這個範例將清理中央政府111年度的歲出預算表。由於政府預算有款、科、目、節與機構,會呈現一個大部會到小布會的樹狀階層,因此非常適合用Treemap來做視覺化,預期視覺化的結果如下(視覺化的部分可參考章節26.3): 在讀入資料後,由於資料具有階層性、從最大的科款、項、目,由於是給一般讀者所閱讀的資料,在原本的EXCEL表格中,比較大的階層可能會合併數個資料格來表示,這會使得較大的階層會有相當多的缺失值。此時,我們會需要依據其他列的值,來回填這些NA值,所用的函式為zoo::na.locf()。 raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F) raw %>% head(10) ## # A tibble: 10 × 9 ## ...1 ...2 ...3 ...4 ...5 ...6 ...7 ...8 ...9 ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 科 … <NA> <NA> <NA> <NA> 本年… 上年… 前年… "本… ## 2 款 項 目 節 "名 … <NA> <NA> <NA> <NA> ## 3 <NA> <NA> <NA> <NA> "\\n… 2262… 2135… 2039… "126… ## 4 <NA> <NA> <NA> <NA> "\\n(… 2101… 2026… 1907… "750… ## 5 1 <NA> <NA> <NA> "310… 1210… 1186… 1176… "233… ## 6 <NA> 1 <NA> <NA> "310… 1004… 9789… 9973… "258… ## 7 <NA> <NA> 1 <NA> "310… 9205… 8963… 8821… "241… ## 8 <NA> <NA> 2 <NA> "310… 30000 30000 2999… "-" ## 9 <NA> <NA> 3 <NA> "310… 15760 15760 4557… "-" ## 10 <NA> <NA> 4 <NA> "310… 5332 5332 6720… "-" 10.1.1 Basic Cleaning 重新命名欄位名稱 刪去被當成表格標題的多於列(通常是前兩三列)slice(-(1:2))。 觀察資料,「款」可以說是支出大類的代號,例如總統府、行政支出、立法支出、軍事支出、教育支出等。「科」為該單位底下的部門或者項目,例如「行政支出」下有行政院、主計總處支出等。更底下的細類「目」並非本例的分析對象,所以可以刪除。所以,如果款、科均為缺失值的話,代表其為更細的「目」。因此篩去款科為缺失值的所有項目。filter(!is.na(款) | !is.na(科)) 將機構id和機構名稱切分開來,視覺化的時候只會用到機構名稱。separate(機構, c(\"oid\", \"org\"), sep=\"\\n\") names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差") cleaned <- raw %>% slice(-(1:2)) %>% filter(!is.na(款) | !is.na(科)) %>% select(-目, -節) %>% separate(機構, c("oid", "org"), sep="\\n") cleaned %>% head(10) ## # A tibble: 10 × 8 ## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差 ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 1 <NA> 3100000000 國務支出 1210301 1186955 1176955.12… 23346 ## 2 <NA> 1 3102010000 總統府 1004797 978916 997305.545… 25881 ## 3 <NA> 2 3102100000 國家安全會議 205504 208039 179649.579… -2535 ## 4 2 <NA> 3200000000 行政支出 6134276 5836481 5477154.58… 297795 ## 5 <NA> 1 3203010000 行政院 1256043 1286646 1268295.23 -30603 ## 6 <NA> 2 3203100000 主計總處 1604967 1478173 1578781.89… 126794 ## 7 <NA> 3 3203300000 人事行政總處 555363 573447 489516.177… -18084 ## 8 <NA> 4 3203340000 公務人力發展… 244346 239453 229852.261… 4893 ## 9 <NA> 5 3203420000 檔案管理局 787429 646081 443133.207… 141348 ## 10 <NA> 6 3203900000 大陸委員會 900896 900866 792491.221… 30 10.1.2 Processing NA 觀察一下現在的資料,發現,行政院、主計總處等均屬於行政支出,但行政支出卻自有一列。依照長表格的格式來說,應嘗試把「款」作為機構的變項。所以將款的數字取代為「行政支出」等支出類別的名稱。 cleaned %>% mutate(款 = ifelse(!is.na(款), org, 款)) %>% head(10) ## # A tibble: 10 × 8 ## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差 ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 國務支出 <NA> 3100000000 國務支出 1210301 1186955 1176955.1… 23346 ## 2 <NA> 1 3102010000 總統府 1004797 978916 997305.54… 25881 ## 3 <NA> 2 3102100000 國家安全會… 205504 208039 179649.57… -2535 ## 4 行政支出 <NA> 3200000000 行政支出 6134276 5836481 5477154.5… 297795 ## 5 <NA> 1 3203010000 行政院 1256043 1286646 1268295.23 -30603 ## 6 <NA> 2 3203100000 主計總處 1604967 1478173 1578781.8… 126794 ## 7 <NA> 3 3203300000 人事行政總… 555363 573447 489516.17… -18084 ## 8 <NA> 4 3203340000 公務人力發… 244346 239453 229852.26… 4893 ## 9 <NA> 5 3203420000 檔案管理局 787429 646081 443133.20… 141348 ## 10 <NA> 6 3203900000 大陸委員會 900896 900866 792491.22… 30 接下來,希望能夠在「款==NA」的地方填入該欄的「前一個值」例如行政支出。查詢一下(關鍵字如「Fill in NA column values with the last value that was not NA」)還真的有這樣的函式可以操作: zoo::na.locf():zoo::na.locf() 是 R 語言中 zoo 套件提供的函式,其作用是將缺失值(NA)用最後一個非缺失值(non-missing value)填充。具體而言,na.locf() 函式將會從第一個非缺失值開始向下填充,直到下一個非缺失值出現為止。這種方法稱為 “last observation carried forward”(LOCF),意思是最後觀測值向前填充。 library(zoo) cleaned %>% mutate(款 = ifelse(!is.na(款), org, 款)) %>% mutate(款 = zoo::na.locf(款)) %>% head(10) ## # A tibble: 10 × 8 ## 款 科 oid org 本年度預算 上年度預算 上年度決算 預算差 ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 國務支出 <NA> 3100000000 國務支出 1210301 1186955 1176955.1… 23346 ## 2 國務支出 1 3102010000 總統府 1004797 978916 997305.54… 25881 ## 3 國務支出 2 3102100000 國家安全會… 205504 208039 179649.57… -2535 ## 4 行政支出 <NA> 3200000000 行政支出 6134276 5836481 5477154.5… 297795 ## 5 行政支出 1 3203010000 行政院 1256043 1286646 1268295.23 -30603 ## 6 行政支出 2 3203100000 主計總處 1604967 1478173 1578781.8… 126794 ## 7 行政支出 3 3203300000 人事行政總… 555363 573447 489516.17… -18084 ## 8 行政支出 4 3203340000 公務人力發… 244346 239453 229852.26… 4893 ## 9 行政支出 5 3203420000 檔案管理局 787429 646081 443133.20… 141348 ## 10 行政支出 6 3203900000 大陸委員會 900896 900866 792491.22… 30 太神奇了!看見沒!接下來只要把「科 is NA」的那些該大類支出總數的紀錄給刪除,資料就乾淨了。最後就只會剩下一些資料清理的功伕。完整程式碼可以看下一節。 10.1.3 Complete Code library(zoo) # raw <- readxl::read_excel("data/111B歲出政事別預算總表.xls") raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F) names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差") # raw$款 <- na.locf(raw$款) cleaned <- raw %>% filter(!is.na(款) | !is.na(科)) %>% slice(-(1:2)) %>% select(-目, -節) %>% separate(機構, c("oid", "org"), sep="\\n") %>% mutate(款 = ifelse(!is.na(款), org, 款)) %>% mutate(款 = zoo::na.locf(款)) %>% filter(!is.na(科)) %>% select(-科) %>% type_convert() %>% mutate(上年度預算 = as.numeric(上年度預算), 上年度決算 = as.integer(上年度決算), 預算差 = as.numeric(預算差)) %>% replace_na(list(上年度預算 = 0, 上年度決算 = 0)) %>% mutate(預算差 = 本年度預算 - 上年度預算) cleaned %>% head() ## # A tibble: 6 × 7 ## 款 oid org 本年度預算 上年度預算 上年度決算 預算差 ## <chr> <dbl> <chr> <dbl> <dbl> <int> <dbl> ## 1 國務支出 3102010000 總統府 1004797 978916 997305 25881 ## 2 國務支出 3102100000 國家安全會議 205504 208039 179649 -2535 ## 3 行政支出 3203010000 行政院 1256043 1286646 1268295 -30603 ## 4 行政支出 3203100000 主計總處 1604967 1478173 1578781 126794 ## 5 行政支出 3203300000 人事行政總處 555363 573447 489516 -18084 ## 6 行政支出 3203340000 公務人力發展學院 244346 239453 229852 4893 10.2 Cleaning Covid Vaccinating data 這個案例是希望視覺化不同國家(Y)在不同時間點(X)的疫苗施打涵蓋率(將使用熱區圖,所以將用顏色來表示涵蓋率)。涵蓋率的表示法在該資料中為每百萬人施打疫苗數,但也可以轉為百分比,有多少比例的人已經施打過第一劑、第二劑或第三劑等。 資料來源為: https://ourworldindata.org/covid-vaccinations https://github.com/owid/covid-19-data/tree/master/public/data/vaccinations 預期希望看見的結果如下,如何將這份疫苗施打比例的資料做視覺化,請見視覺化的章節??: 10.2.1 觀察並評估資料概況 這是一份資料缺失相當多的資料。評估資料概況後可發現這個資料集每一列就是某一個國家某一天所上傳的紀錄。所以,一個國家會有很多列。乍聽之下不難處理,但事實上每個國家不會每天上傳、也不會固定某一天上傳、哪一週、哪一個月開始上傳也不一定,也有可能會漏掉一些月份或週次。所以,制定出一個時間單位(例如週、月)、然後延著時間軸將資料「對齊」,讓每個國家在每個時間單位都有資料。但每個國家疫情發展程度不一,所以也不可能有一個完美的對齊,所以通常會建議就所要觀察的國家進行對齊即可。至於想刪除的那些資料列,幾乎都可以當成是所謂的缺失值。 raw <- read_csv("data/vaccinations.csv") dim(raw) ## [1] 99442 16 raw %>% head(20) ## # A tibble: 20 × 16 ## location iso_code date total_vaccinations people_vaccinated ## <chr> <chr> <date> <dbl> <dbl> ## 1 Afghanistan AFG 2021-02-22 0 0 ## 2 Afghanistan AFG 2021-02-23 NA NA ## 3 Afghanistan AFG 2021-02-24 NA NA ## 4 Afghanistan AFG 2021-02-25 NA NA ## 5 Afghanistan AFG 2021-02-26 NA NA ## 6 Afghanistan AFG 2021-02-27 NA NA ## 7 Afghanistan AFG 2021-02-28 8200 8200 ## 8 Afghanistan AFG 2021-03-01 NA NA ## 9 Afghanistan AFG 2021-03-02 NA NA ## 10 Afghanistan AFG 2021-03-03 NA NA ## 11 Afghanistan AFG 2021-03-04 NA NA ## 12 Afghanistan AFG 2021-03-05 NA NA ## 13 Afghanistan AFG 2021-03-06 NA NA ## 14 Afghanistan AFG 2021-03-07 NA NA ## 15 Afghanistan AFG 2021-03-08 NA NA ## 16 Afghanistan AFG 2021-03-09 NA NA ## 17 Afghanistan AFG 2021-03-10 NA NA ## 18 Afghanistan AFG 2021-03-11 NA NA ## 19 Afghanistan AFG 2021-03-12 NA NA ## 20 Afghanistan AFG 2021-03-13 NA NA ## # ℹ 11 more variables: people_fully_vaccinated <dbl>, total_boosters <dbl>, ## # daily_vaccinations_raw <dbl>, daily_vaccinations <dbl>, ## # total_vaccinations_per_hundred <dbl>, people_vaccinated_per_hundred <dbl>, ## # people_fully_vaccinated_per_hundred <dbl>, ## # total_boosters_per_hundred <dbl>, daily_vaccinations_per_million <dbl>, ## # daily_people_vaccinated <dbl>, daily_people_vaccinated_per_hundred <dbl> 10.2.2 按月對齊資料 首先要挑選要拿來做視覺化的資料欄位。這邊所選擇的是people_fully_vaccinated_per_hundred,也就是每百人接種二劑疫苗的人數,相當於接種二劑疫苗的百分比。 接下來便是缺失值處理,如果這個欄位沒有數值的就直接用drop_na()篩除即可。 這個範例希望把該資料視覺化為Y軸為年、X軸為時間的熱區圖。但整個疫情資料橫亙二年多,如果以週為彙整單位的話,那勢必X軸會有近百個資料點。所以打算以「月」為單位來彙整這些資料,因為且資料中也有不少國家缺數週的資料,所以以月為彙整單位是一個權衡後的選擇(仍可以嘗試用週作為彙整單位試試看)。所以,運用了lubridate::floor_date()來將日期資料轉換為月,例如2022-03-12和2022-03-14都會被轉換為2022-03-01。 依照國家與時間群組彙整資料。接下來就依照各國的月份來做彙整(注意,此時會有不少資料同屬於某個月的資料)。彙整的方法是,經過對「日期」(不是對月)做排序後,僅留下第一筆資料,也就是僅留下最接近月份開頭的資料。經由這樣的操作,會使得各國在每個月剛好留下一筆資料,如下面程式的範例輸出。 library(lubridate) fullvaccinated <- raw %>% select(country = location, date, people_fully_vaccinated_per_hundred) %>% drop_na(people_fully_vaccinated_per_hundred) %>% mutate(m = floor_date(date, unit = "month")) %>% group_by(country, m) %>% arrange(date) %>% slice(1) %>% ungroup() %>% select(-date) fullvaccinated %>% head(10) ## # A tibble: 10 × 3 ## country people_fully_vaccinated_per_hundred m ## <chr> <dbl> <date> ## 1 Afghanistan 0.14 2021-05-01 ## 2 Afghanistan 0.36 2021-06-01 ## 3 Afghanistan 0.48 2021-07-01 ## 4 Afghanistan 1.08 2021-08-01 ## 5 Afghanistan 8 2021-11-01 ## 6 Afghanistan 9.42 2021-12-01 ## 7 Afghanistan 9.56 2022-01-01 ## 8 Afghanistan 9.82 2022-02-01 ## 9 Afghanistan 10.8 2022-03-01 ## 10 Afghanistan 11.4 2022-04-01 10.2.3 處理遺漏資料的月份 接下來要處理的是資料紀錄的缺漏值。每個國家登錄資料的時間是很不一致的,某些國家會缺某些月份,或者某些國家是在某年某月以後才開始登記,或者最近沒在登記。但這個範例所要視覺化的資料是接種疫苗的比例,所以即使是現在沒在登記了,但接種比例應列計最後一次資料紀錄的接種比例。 首先我要讓每個國家都有所有月份,這裡應會有某個函式可以做到這件事,但我沒查到這個函式。不過我可以很技巧性地用pivot_wider()(spread())和pivot_longer()(gather())來完成這件事。spread()在展開時對於缺少的資料項可以自動補NA。所以我就只要把資料的月份展開後再gather()回來後,就可以自動讓每個國家所擁有的月份資料一致。以下為spread()後的結果,可以觀察到每一列是一個國家,每一欄是個月份,如果當月都沒資料紀錄,那該月的值就會是缺失值。可以看見缺失值是相當多的,也就是在那段時間都沒有資料紀錄。 fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% head(10) ## # A tibble: 10 × 19 ## country `2020-12-01` `2021-01-01` `2021-02-01` `2021-03-01` `2021-04-01` ## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 Afghanistan NA NA NA NA NA ## 2 Africa NA NA 0 0.02 0.3 ## 3 Albania NA NA 0 NA NA ## 4 Algeria NA NA NA NA NA ## 5 Andorra NA NA NA 1.52 5.8 ## 6 Angola NA NA NA NA NA ## 7 Anguilla NA NA NA NA 5.18 ## 8 Antigua and… NA NA NA NA NA ## 9 Argentina 0 0 0.26 0.69 1.56 ## 10 Armenia NA NA NA NA NA ## # ℹ 13 more variables: `2021-05-01` <dbl>, `2021-06-01` <dbl>, ## # `2021-07-01` <dbl>, `2021-08-01` <dbl>, `2021-09-01` <dbl>, ## # `2021-10-01` <dbl>, `2021-11-01` <dbl>, `2021-12-01` <dbl>, ## # `2022-01-01` <dbl>, `2022-02-01` <dbl>, `2022-03-01` <dbl>, ## # `2022-04-01` <dbl>, `2022-05-01` <dbl> 在以下的範例輸出可以看到gather()後的結果。注意,需要照國家和月份來排序後才便於觀察。 fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% head(20) ## # A tibble: 20 × 3 ## country month perc ## <chr> <chr> <dbl> ## 1 Afghanistan 2020-12-01 NA ## 2 Afghanistan 2021-01-01 NA ## 3 Afghanistan 2021-02-01 NA ## 4 Afghanistan 2021-03-01 NA ## 5 Afghanistan 2021-04-01 NA ## 6 Afghanistan 2021-05-01 0.14 ## 7 Afghanistan 2021-06-01 0.36 ## 8 Afghanistan 2021-07-01 0.48 ## 9 Afghanistan 2021-08-01 1.08 ## 10 Afghanistan 2021-09-01 NA ## 11 Afghanistan 2021-10-01 NA ## 12 Afghanistan 2021-11-01 8 ## 13 Afghanistan 2021-12-01 9.42 ## 14 Afghanistan 2022-01-01 9.56 ## 15 Afghanistan 2022-02-01 9.82 ## 16 Afghanistan 2022-03-01 10.8 ## 17 Afghanistan 2022-04-01 11.4 ## 18 Afghanistan 2022-05-01 NA ## 19 Africa 2020-12-01 NA ## 20 Africa 2021-01-01 NA 接下來是最技巧性的部分。就接種比例而言是個遞增數列,所以如果這個月有紀錄,但下個月沒紀錄(NA),那下個月的資料應以這個月的資料來替代。此時可以用zoo套件的na.locf()來填NA值,其填NA值的規則是用最後一筆非NA值的資料來替代NA值。但要注意的是,因為資料紀錄可能到第六個月或第七個月才開始紀錄,但在前面的月份都沒資料紀錄,也就是說那些NA值沒有更早的資料紀錄權充填充值。原本na.locf()會把這些找不到參考對象的NA值直接刪除,但我們可以在裡面加一個參數使其不會被刪除(na.locf(perc, na.rm = F))。 最後,就把這些沒被刪除也沒得參考的早期資料項,用replace_na()填上0即可。 fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% group_by(country) %>% arrange(month) %>% mutate(perc = zoo::na.locf(perc, na.rm = F)) %>% ungroup() %>% arrange(country, month) %>% head(10) ## # A tibble: 10 × 3 ## country month perc ## <chr> <chr> <dbl> ## 1 Afghanistan 2020-12-01 NA ## 2 Afghanistan 2021-01-01 NA ## 3 Afghanistan 2021-02-01 NA ## 4 Afghanistan 2021-03-01 NA ## 5 Afghanistan 2021-04-01 NA ## 6 Afghanistan 2021-05-01 0.14 ## 7 Afghanistan 2021-06-01 0.36 ## 8 Afghanistan 2021-07-01 0.48 ## 9 Afghanistan 2021-08-01 1.08 ## 10 Afghanistan 2021-09-01 1.08 最後,就把這些沒被刪除也沒得參考的早期資料項,用replace_na()填上0即可。大功告成。 fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% group_by(country) %>% arrange(month) %>% mutate(perc = zoo::na.locf(perc, na.rm = F)) %>% ungroup() %>% arrange(country, month) %>% replace_na(list(perc=0)) %>% arrange(country, month) %>% head(10) ## # A tibble: 10 × 3 ## country month perc ## <chr> <chr> <dbl> ## 1 Afghanistan 2020-12-01 0 ## 2 Afghanistan 2021-01-01 0 ## 3 Afghanistan 2021-02-01 0 ## 4 Afghanistan 2021-03-01 0 ## 5 Afghanistan 2021-04-01 0 ## 6 Afghanistan 2021-05-01 0.14 ## 7 Afghanistan 2021-06-01 0.36 ## 8 Afghanistan 2021-07-01 0.48 ## 9 Afghanistan 2021-08-01 1.08 ## 10 Afghanistan 2021-09-01 1.08 10.2.4 完整程式碼 library(lubridate) raw <- read_csv("data/vaccinations.csv") fullvaccinated <- raw %>% select(country = location, date, people_fully_vaccinated_per_hundred) %>% drop_na(people_fully_vaccinated_per_hundred) %>% mutate(m = floor_date(date, unit = "month")) %>% group_by(country, m) %>% arrange(date) %>% slice(1) %>% ungroup() %>% select(-date) vperc_by_month <- fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% group_by(country) %>% arrange(month) %>% mutate(perc = zoo::na.locf(perc, na.rm = F)) %>% ungroup() %>% arrange(country, month) %>% replace_na(list(perc=0)) 如何將這份疫苗施打比例的資料做視覺化,請見視覺化的章節?? "],["tm.html", "Chapter 11 Text Processing", " Chapter 11 Text Processing "],["trump.html", "Chapter 12 Trump’s tweets 12.1 Loading data 12.2 Cleaning data 12.3 Visual Exploring 12.4 Keyness", " Chapter 12 Trump’s tweets 本範例取材自David Robinson的blog文章「Text analysis of Trump’s tweets confirms he writes only the (angrier) Android half」。David Robinson是「Text Mining with R」的共同作者, 可參考該書籍上的範例「7 Case study: comparing Twitter archives | Text Mining with R (tidytextmining.com)」。 這篇文章探討了美國前總統川普(Donald Trump)的推特帳號。有一個假設聲稱,當川普在推特上祝福奧運會選手好運時,他使用的是 iPhone ;當他侮辱競爭對手時,他通常是用 Android 來發推。文章作者想要透過數據分析來探討這個假設的真實性。 作者使用了文字探勘和情感分析等技術,從川普的推特內容入手,分析了不同時間和使用不同手機所發的推文。結果顯示,Android 和 iPhone 所發的推文顯然是由不同的人所發,他們在使用標籤、連結和轉推的方式上也不同。此外,Android 的推文更加憤怒和負面,而 iPhone 的推文則傾向於發佈善意的公告和圖片。整體而言,這些分析讓我們能夠區分出競選團隊所發佈的推文(iPhone)和川普自己所發佈的推文(Android)。 這個教學案例涵蓋了使用 R 語言進行社群輿論資料(tweets)的探索性分析的各種技術和工具。除了使用常見的資料處理套件 dplyr 和視覺化套件 ggplot 外,還使用了文字處理套件 stringr 和時間處理套件 lubridate,以及關鍵字分析技術 keyness。 透過這個教學案例,學習者可以掌握如何: 使用 dplyr 和 ggplot 進行資料處理和視覺化。 使用 stringr 和 extract() 進行文字處理,例如從文本中提取關鍵字。 使用 lubridate 進行時間處理,例如轉換時間格式和提取時間戳記。 學習關鍵字分析技術 keyness,以找出在不同文本之間對彼此相對突出的關鍵字。 這段程式碼是用來設計 ggplot2 的主題風格。作者首先定義了一個名為 th 的自訂主題,基於 ggplot2 的 theme_minimal() 主題,並設置了不同元素的字型、大小和樣式等屬性。接著,作者定義了一個名為 new_style() 的函數,用於更精細的主題風格設置,包括圖表標題、圖例、軸標籤和刻度標籤等。透過這些設置,可以讓 ggplot2 圖表更具有視覺吸引力,並強調重要的圖形元素,使圖表更加清晰易懂。這兩種方式都可以用來定義主題 library(tidyverse) # library(lubridate) # has been included in tidyverse options(scipen = 999) # Self-designed theme th <- theme_minimal() + theme(plot.title = element_text(size=24, face="bold"), legend.title = element_text(size=18, face="bold"), legend.text = element_text(size=18), axis.title = element_text(hjust=0.5, size=18, face="italic"), axis.text = element_text(size=18) ) # more settings new_style <- function() { font <- "Helvetica" theme( plot.title = element_text(family=font, size=28, face="bold"), plot.subtitle = element_text(family=font, size=22, margin=margin(9,0,9,0)), plot.caption = element_blank(), legend.position = "top", legend.text.align = 0, legend.background = element_blank(), # legend.title = element_blank(), legend.key = element_blank(), legend.text = element_text(family=font, size=18, color="#222222"), axis.text = element_text(family=font, size=18, color="#222222"), axis.text.x = element_text(margin=margin(5, b = 10)), axis.ticks = element_blank(), axis.line = element_blank(), panel.grid.minor = element_blank(), panel.grid.major.y = element_line(color="#cbcbcb"), panel.grid.major.x = element_blank(), panel.background = element_blank(), strip.background = element_rect(fill="white"), strip.text = element_text(size = 22, hjust = 0) ) } 12.1 Loading data load(url("http://varianceexplained.org/files/trump_tweets_df.rda")) dim(trump_tweets_df) ## [1] 1512 16 names(trump_tweets_df) ## [1] "text" "favorited" "favoriteCount" "replyToSN" ## [5] "created" "truncated" "replyToSID" "id" ## [9] "replyToUID" "statusSource" "screenName" "retweetCount" ## [13] "isRetweet" "retweeted" "longitude" "latitude" trump_tweets_df %>% select(id, text, created, favoriteCount, retweetCount, statusSource) %>% head(10) ## # A tibble: 10 × 6 ## id text created favoriteCount retweetCount statusSource ## <chr> <chr> <dttm> <dbl> <dbl> <chr> ## 1 7626698825… "My … 2016-08-08 15:20:44 9214 3107 "<a href=\\"… ## 2 7626415954… "Joi… 2016-08-08 13:28:20 6981 2390 "<a href=\\"… ## 3 7624396589… "#IC… 2016-08-08 00:05:54 15724 6691 "<a href=\\"… ## 4 7624253718… "Mic… 2016-08-07 23:09:08 19837 6402 "<a href=\\"… ## 5 7624008698… "The… 2016-08-07 21:31:46 34051 11717 "<a href=\\"… ## 6 7622845333… "I s… 2016-08-07 13:49:29 29831 9892 "<a href=\\"… ## 7 7621109187… "Tha… 2016-08-07 02:19:37 19223 5784 "<a href=\\"… ## 8 7621069044… ".@L… 2016-08-07 02:03:39 19543 7930 "<a href=\\"… ## 9 7621044117… "I a… 2016-08-07 01:53:45 75488 24663 "<a href=\\"… ## 10 7620164261… "#Cr… 2016-08-06 20:04:08 23661 7903 "<a href=\\"… 12.2 Cleaning data 這段程式碼的目的是從一個叫做trump_tweets_df的data.frame中,選擇幾個欄位並且進行過濾和轉換,最後將結果存儲在一個名為tweets的新data.frame中。 extract()函數用於從statusSource欄位中提取出一個新欄位source,該欄位包含了statusSource中的Twitter for iPhone和Twitter for Android這兩種可能的字串。這裡使用了一個正則表達式Twitter for (.*?)<,該表達式表示提取出以Twitter for開頭,且在<符號之前的任意字元序列,並將結果存儲在名為source的新欄位中。 最後,filter()函數用於過濾出source欄位中值為iPhone或Android的記錄,並將過濾結果存儲在tweets資料框中。 # tidyr::extract() # stringr::str_replace trump_tweets_df$statusSource[1] ## [1] "<a href=\\"http://twitter.com/download/android\\" rel=\\"nofollow\\">Twitter for Android</a>" tweets <- trump_tweets_df %>% select(id, statusSource, text, created) %>% # mutate(source = str_replace(statusSource, # ".*Twitter for (.*?)<.*", "\\\\1")) %>% # mutate(source = str_extract(statusSource, 'Twitter for (.*?)<')) %>% View extract(statusSource, "source", "Twitter for (.*?)<") %>% filter(source %in% c("iPhone", "Android")) # Using stringr::str_replace() to mutate a new source variable, replacing tidyr:: # str(tweets) Practice. 有時候我們會希望避免用太多種套件來寫程式,例如上面的extract()便屬於tidyr的函式。事實上我們可以用stringr::str_replace()來達到這個目的。嘗試寫寫看?或者嘗試問ChatGPT看看? Prompt. 我如果希望用stringr::str_replace來達到extract(statusSource, \"source\", \"Twitter for (.*?)<\") %>%的功能,我該怎麼寫? mutate(source = stringr::str_replace(statusSource, \".*Twitter for (.*?)<.*\", \"\\\\1\")) %>% 12.3 Visual Exploring 12.3.1 Productivity by time hour = hour(with_tz(created, \"EST\"))這段程式碼使用了with_tz()函數將created欄位的時區轉換為\"EST\"所對應的時區,然後使用hour()函數提取出該日期時間對應的小時數,並將結果存儲在hour變數中。該程式碼會將例如\"2023-04-12 12:30:00\"轉換為美國東部標準時間對應的小時數,即12(因為12點30分所在的小時是12點)。他所取出的並非某日的12時,他就只是取出是12時。 toplot1和toplot2的差異在於對source欄位的分組處理不同。具體來說,toplot1中沒有對source欄位進行分組,而是在後面使用mutate()函數將計數結果中的n列和sum(n)相除,得到了百分比列percent。這導致計算的是整個資料集中的hour和source的計數和百分比。相反,toplot2中使用了group_by()函數將source欄位進行分組處理,並在後面使用mutate()函數和ungroup()函數計算了每個source和hour的計數和百分比,即分別計算了iPhone和Android的計數和百分比。因此,toplot1和toplot2的計算結果是不同的,前者的計算結果中包含了整個資料集的計數和百分比,而後者的計算結果則分別對iPhone和Android進行了計數和百分比的計算。 程式碼使用了ggplot()函數創建了一個ggplot2物件,並使用aes()函數設置了hour和percent欄位作為X軸和Y軸的變數,並且設置color = source表示以source欄位的值作為不同群組(iPhone vs. Android)折線的顏色。接著,程式碼使用geom_line()函數添加折線到圖中,設置了折線的粗細為1。使用scale_color_manual()函數設置了圖例的名稱為Phone System,標籤依照分組指定為為Android和iPhone,顏色分別為royalblue和gold,並使用scale_y_continuous()函數設置了Y軸刻度標籤的格式為百分比形式,即0%到100%之間的數值。注意:percent_format()並非ggplot2既有的函式,要另外安裝並匯入library(scales)。 library(scales) # for percent_format() # lubridate::hour() # lubridate::with_tz() # scales::percent_format() toplot1 <- tweets %>% count(source, hour = hour(with_tz(created, "EST"))) %>% # group_by(source) %>% mutate(percent = n / sum(n)) # ungroup() %>% toplot2 <- tweets %>% count(source, hour = hour(with_tz(created, "EST"))) %>% group_by(source) %>% mutate(percent = n / sum(n)) %>% ungroup() p1 <- toplot1 %>% ggplot() + aes(hour, percent, color = source) + geom_line(linewidth = 1) + scale_color_manual(name = "Phone System", labels = c("Android", "iPhone"), values = c("royalblue", "gold")) + scale_y_continuous(labels = percent_format()) + labs(x = "Hour of day (EST)", y = "% of tweets", color = "") + theme_minimal() p2 <- toplot2 %>% ggplot() + aes(hour, percent, color = source) + geom_line(linewidth = 1) + scale_color_manual(name = "Phone System", labels = c("Android", "iPhone"), values = c("royalblue", "gold")) + scale_y_continuous(labels = percent_format()) + labs(x = "Hour of day (EST)", y = "% of tweets", color = "") + theme_minimal() cowplot::plot_grid( p1, NULL, p2, labels = c("(a) Normalized by all", "", "(b) Normalized in group"), nrow = 1, rel_widths = c(1, 0.1, 1) ) 12.3.2 Tweeting with figures 首先,filter()函數用於從tweets資料框中過濾出不以\"字符開頭的推文,即過濾掉引號開頭的推文。這裡使用了!str_detect(text, '^\"')表示將text欄位中以\"字符開頭的推文過濾掉,即保留那些不以引號開頭的推文。'^\"'是一個正規表示式(Regular Expression),'^'符號代表字串的開頭。 接著,mutate()函數用於在tweets資料框中添加一個新欄位picture,該欄位根據推文中是否包含t.co字串來判斷推文中是否包含圖片或者連結。具體來說,這裡使用了if_else()函數,如果text欄位中包含t.co字串,則將picture欄位設置為\"Picture/link\",否則設置為\"No picture/link\"。 最後,使用count()函數計算tweets資料框中每個source和picture的記錄數,並將結果存儲在toplot資料框中。最終的結果是一個展示tweets資料框中source和picture的記錄數的資料框,其中picture欄位表示推文中是否包含圖片或連結。 p1和p2的主要區別在於barplot的呈現方式不同。具體來說: p1中使用了position=\"stack\"的參數,表示將不同分組的bar疊加在一起,以展示每個source的總推文數量,並且bar的寬度設置為0.5(使用width參數),使得bar之間有一定的間隔。這種方式可以方便地比較不同source的總推文數量,並且可以看到每個source中有多少推文包含圖片或連結。 p2中使用了position=\"dodge\"的參數,表示將不同分組的bar並排放置,以便比較不同source中包含或不包含圖片或連結的推文數量。這種方式可以顯示出每個source中有多少推文包含或不包含圖片或連結,並且可以清楚地比較不同source之間的差異。 toplot <- tweets %>% filter(!str_detect(text, '^"')) %>% mutate(picture = if_else(str_detect(text, "t.co"), "Picture/link", "No picture/link")) %>% count(source, picture) p1 <- toplot %>% ggplot() + aes(source, n, fill = picture) + geom_col(position="stack", width = 0.5) + scale_fill_manual(name = "With Picture/link?", labels = c("No", "Yes"), values = c("gold", "royalblue")) + labs(x = "", y = "Number of tweets", fill = "") + theme_minimal() p2 <- toplot %>% ggplot() + aes(source, n, fill = picture) + geom_col(position="dodge") + scale_fill_manual(name = "With Picture/link?", labels = c("No", "Yes"), values = c("gold", "royalblue")) + labs(x = "", y = "Number of tweets", fill = "") + theme_minimal() cowplot::plot_grid( p1, NULL, p2, labels = c("(a) Stacked", "", "(b) Dodged"), nrow = 1, rel_widths = c(1, 0.1, 1) ) 12.4 Keyness Keyness是一種文本分析方法,用於比較兩個文本集合中某些詞彙的使用頻率(例如我們要比較用iPhone和Android兩支手機所發表的內容是否有文字上的差異),以評估這些詞彙在不同文本集合中的重要性或關鍵程度。Keyness分析通常用於比較兩個文本集合,其中一個是目標文本集合,另一個是參照文本集合,並且通常會將這些文本集合中的單詞或詞彙按照出現頻率排序。 使用filter()函數過濾出不以\"字符開頭的推文,即過濾掉引號開頭的推文,將結果存儲在tweets資料框中。 使用mutate()函數將推文中的URL和&字符替換為空白字符,即將推文中的網址和HTML實體轉換為正常的字符,方便後續的文本處理。 使用mutate()函數將tweets資料框中的text欄位拆分為單詞序列,存儲在word欄位中。這裡使用了str_split()函數將每個推文按照空格進行拆分,得到一個由單詞序列組成的列表,然後將這個列表存儲在word欄位中。 使用select()函數選擇需要的欄位,包括tweets資料框中的id、text和word欄位,以及tweets資料框中的所有其他欄位。 使用unnest()函數將word欄位中的單詞序列展開成一個單詞資料框,每個單詞對應一行記錄。 使用filter()函數過濾掉停用詞和非英文字符,其中停用詞(stop words)列表存儲在stop_words資料框中,通過!word %in% stop_words$word條件過濾掉停用詞,並且通過str_detect(word, \"[a-z]\")條件過濾掉不包含英文字母的單詞。最終,將結果存儲在tweets資料框中。 停用詞(stop words)指的是在文本中出現頻率非常高,但對於文本的內容和意義貢獻不大的詞彙。這些詞彙通常是一些常見的介詞、連詞、代詞、冠詞、助動詞等,例如”the”、“and”、“a”、“in”等。在文本分析中,停用詞通常被過濾掉,以便更好地捕捉文本中的主題和意義。在中文文本分析中,常見的停用詞包括一些虛詞、代詞、介詞、助詞等,例如”的”、“是”、“在”、“和”、“了”、“一”等。這些詞在中文文本中出現的頻率非常高,但對於文本的內容和意義貢獻不大,因此在文本分析中通常被過濾掉。 停用詞的列表通常是由人為構建的,根據具體的文本分析任務和文本的特徵來決定。在自然語言處理中,通常會使用預先定義好的停用詞列表,例如英文中的NLTK(Natural Language Toolkit)庫中就包含了一個預先定義好的停用詞列表。 在進行文本分析時,過濾掉停用詞可以幫助減少文本資料的雜訊和冗余訊息,提高分析的準確性和效率。但是,在某些特定的文本分析任務中,停用詞可能具有一定的重要性,例如情感分析中的否定詞(如”not”)可能對情感分析的結果產生重要的影響,因此需要特殊處理。如果進行的是網絡舆情分析,那麼一些特定的網絡用語和表情符號可能也需要被加入停用詞列表中,以避免對分析結果產生干擾。 unnest_tokens()和mutate()函數都可以用於將文本data.frame中的文本數據進行分詞處理,但它們的實現方式有所不同。mutate()函數使用str_split()函數將每個文本按照指定的分隔符(如上述程式碼即以空白\" \"做為分隔符號)進行拆分,得到一個由單詞序列組成的list。這樣做的缺點是無法同時將文本中的標點符號、空格、停用詞等過濾掉,因此在進行文本分析時需要額外進行過濾處理。 unnest_tokens()函數則使用更靈活的正則表達式(regex)來指定單詞的分割方式,可以將文本中的單詞、標點符號、空格等都分割開來,並且可以通過指定特定的正則表達式來過濾停用詞、非英文字符等。unnest_tokens()函數還可以將分割後的單詞list展開成一個單詞data.frame,每個單詞對應一行記錄,這樣更容易進行後續的文本分析和可視化。在unnest_tokens(word, text, token = \"regex\", pattern = \"[^A-Za-z\\\\d#@']\") %>%中,word表示新建的單詞欄位的名稱,text表示原始文本欄位的名稱,token表示使用的分割方式,這裡指定為正則表達式;pattern則是指定的正則表達式,其中[^A-Za-z\\\\d#@']表示匹配不屬於字母、數字、@、#、’的任意字符,即過濾掉非英文字符和一些標點符號。 library(tidytext) # unnest_tokens() library(stringr) # str_detect(), str_replace_all() # View(test) stop_words$word ## [1] "a" "a's" "able" "about" ## [5] "above" "according" "accordingly" "across" ## [9] "actually" "after" "afterwards" "again" ## [13] "against" "ain't" "all" "allow" ## [17] "allows" "almost" "alone" "along" ## [21] "already" "also" "although" "always" ## [25] "am" "among" "amongst" "an" ## [29] "and" "another" "any" "anybody" ## [33] "anyhow" "anyone" "anything" "anyway" ## [37] "anyways" "anywhere" "apart" "appear" ## [41] "appreciate" "appropriate" "are" "aren't" ## [45] "around" "as" "aside" "ask" ## [49] "asking" "associated" "at" "available" ## [53] "away" "awfully" "b" "be" ## [57] "became" "because" "become" "becomes" ## [61] "becoming" "been" "before" "beforehand" ## [65] "behind" "being" "believe" "below" ## [69] "beside" "besides" "best" "better" ## [73] "between" "beyond" "both" "brief" ## [77] "but" "by" "c" "c'mon" ## [81] "c's" "came" "can" "can't" ## [85] "cannot" "cant" "cause" "causes" ## [89] "certain" "certainly" "changes" "clearly" ## [93] "co" "com" "come" "comes" ## [97] "concerning" "consequently" "consider" "considering" ## [101] "contain" "containing" "contains" "corresponding" ## [105] "could" "couldn't" "course" "currently" ## [109] "d" "definitely" "described" "despite" ## [113] "did" "didn't" "different" "do" ## [117] "does" "doesn't" "doing" "don't" ## [121] "done" "down" "downwards" "during" ## [125] "e" "each" "edu" "eg" ## [129] "eight" "either" "else" "elsewhere" ## [133] "enough" "entirely" "especially" "et" ## [137] "etc" "even" "ever" "every" ## [141] "everybody" "everyone" "everything" "everywhere" ## [145] "ex" "exactly" "example" "except" ## [149] "f" "far" "few" "fifth" ## [153] "first" "five" "followed" "following" ## [157] "follows" "for" "former" "formerly" ## [161] "forth" "four" "from" "further" ## [165] "furthermore" "g" "get" "gets" ## [169] "getting" "given" "gives" "go" ## [173] "goes" "going" "gone" "got" ## [177] "gotten" "greetings" "h" "had" ## [181] "hadn't" "happens" "hardly" "has" ## [185] "hasn't" "have" "haven't" "having" ## [189] "he" "he's" "hello" "help" ## [193] "hence" "her" "here" "here's" ## [197] "hereafter" "hereby" "herein" "hereupon" ## [201] "hers" "herself" "hi" "him" ## [205] "himself" "his" "hither" "hopefully" ## [209] "how" "howbeit" "however" "i" ## [213] "i'd" "i'll" "i'm" "i've" ## [217] "ie" "if" "ignored" "immediate" ## [221] "in" "inasmuch" "inc" "indeed" ## [225] "indicate" "indicated" "indicates" "inner" ## [229] "insofar" "instead" "into" "inward" ## [233] "is" "isn't" "it" "it'd" ## [237] "it'll" "it's" "its" "itself" ## [241] "j" "just" "k" "keep" ## [245] "keeps" "kept" "know" "knows" ## [249] "known" "l" "last" "lately" ## [253] "later" "latter" "latterly" "least" ## [257] "less" "lest" "let" "let's" ## [261] "like" "liked" "likely" "little" ## [265] "look" "looking" "looks" "ltd" ## [269] "m" "mainly" "many" "may" ## [273] "maybe" "me" "mean" "meanwhile" ## [277] "merely" "might" "more" "moreover" ## [281] "most" "mostly" "much" "must" ## [285] "my" "myself" "n" "name" ## [289] "namely" "nd" "near" "nearly" ## [293] "necessary" "need" "needs" "neither" ## [297] "never" "nevertheless" "new" "next" ## [301] "nine" "no" "nobody" "non" ## [305] "none" "noone" "nor" "normally" ## [309] "not" "nothing" "novel" "now" ## [313] "nowhere" "o" "obviously" "of" ## [317] "off" "often" "oh" "ok" ## [321] "okay" "old" "on" "once" ## [325] "one" "ones" "only" "onto" ## [329] "or" "other" "others" "otherwise" ## [333] "ought" "our" "ours" "ourselves" ## [337] "out" "outside" "over" "overall" ## [341] "own" "p" "particular" "particularly" ## [345] "per" "perhaps" "placed" "please" ## [349] "plus" "possible" "presumably" "probably" ## [353] "provides" "q" "que" "quite" ## [357] "qv" "r" "rather" "rd" ## [361] "re" "really" "reasonably" "regarding" ## [365] "regardless" "regards" "relatively" "respectively" ## [369] "right" "s" "said" "same" ## [373] "saw" "say" "saying" "says" ## [377] "second" "secondly" "see" "seeing" ## [381] "seem" "seemed" "seeming" "seems" ## [385] "seen" "self" "selves" "sensible" ## [389] "sent" "serious" "seriously" "seven" ## [393] "several" "shall" "she" "should" ## [397] "shouldn't" "since" "six" "so" ## [401] "some" "somebody" "somehow" "someone" ## [405] "something" "sometime" "sometimes" "somewhat" ## [409] "somewhere" "soon" "sorry" "specified" ## [413] "specify" "specifying" "still" "sub" ## [417] "such" "sup" "sure" "t" ## [421] "t's" "take" "taken" "tell" ## [425] "tends" "th" "than" "thank" ## [429] "thanks" "thanx" "that" "that's" ## [433] "thats" "the" "their" "theirs" ## [437] "them" "themselves" "then" "thence" ## [441] "there" "there's" "thereafter" "thereby" ## [445] "therefore" "therein" "theres" "thereupon" ## [449] "these" "they" "they'd" "they'll" ## [453] "they're" "they've" "think" "third" ## [457] "this" "thorough" "thoroughly" "those" ## [461] "though" "three" "through" "throughout" ## [465] "thru" "thus" "to" "together" ## [469] "too" "took" "toward" "towards" ## [473] "tried" "tries" "truly" "try" ## [477] "trying" "twice" "two" "u" ## [481] "un" "under" "unfortunately" "unless" ## [485] "unlikely" "until" "unto" "up" ## [489] "upon" "us" "use" "used" ## [493] "useful" "uses" "using" "usually" ## [497] "uucp" "v" "value" "various" ## [501] "very" "via" "viz" "vs" ## [505] "w" "want" "wants" "was" ## [509] "wasn't" "way" "we" "we'd" ## [513] "we'll" "we're" "we've" "welcome" ## [517] "well" "went" "were" "weren't" ## [521] "what" "what's" "whatever" "when" ## [525] "whence" "whenever" "where" "where's" ## [529] "whereafter" "whereas" "whereby" "wherein" ## [533] "whereupon" "wherever" "whether" "which" ## [537] "while" "whither" "who" "who's" ## [541] "whoever" "whole" "whom" "whose" ## [545] "why" "will" "willing" "wish" ## [549] "with" "within" "without" "won't" ## [553] "wonder" "would" "would" "wouldn't" ## [557] "x" "y" "yes" "yet" ## [561] "you" "you'd" "you'll" "you're" ## [565] "you've" "your" "yours" "yourself" ## [569] "yourselves" "z" "zero" "i" ## [573] "me" "my" "myself" "we" ## [577] "our" "ours" "ourselves" "you" ## [581] "your" "yours" "yourself" "yourselves" ## [585] "he" "him" "his" "himself" ## [589] "she" "her" "hers" "herself" ## [593] "it" "its" "itself" "they" ## [597] "them" "their" "theirs" "themselves" ## [601] "what" "which" "who" "whom" ## [605] "this" "that" "these" "those" ## [609] "am" "is" "are" "was" ## [613] "were" "be" "been" "being" ## [617] "have" "has" "had" "having" ## [621] "do" "does" "did" "doing" ## [625] "would" "should" "could" "ought" ## [629] "i'm" "you're" "he's" "she's" ## [633] "it's" "we're" "they're" "i've" ## [637] "you've" "we've" "they've" "i'd" ## [641] "you'd" "he'd" "she'd" "we'd" ## [645] "they'd" "i'll" "you'll" "he'll" ## [649] "she'll" "we'll" "they'll" "isn't" ## [653] "aren't" "wasn't" "weren't" "hasn't" ## [657] "haven't" "hadn't" "doesn't" "don't" ## [661] "didn't" "won't" "wouldn't" "shan't" ## [665] "shouldn't" "can't" "cannot" "couldn't" ## [669] "mustn't" "let's" "that's" "who's" ## [673] "what's" "here's" "there's" "when's" ## [677] "where's" "why's" "how's" "a" ## [681] "an" "the" "and" "but" ## [685] "if" "or" "because" "as" ## [689] "until" "while" "of" "at" ## [693] "by" "for" "with" "about" ## [697] "against" "between" "into" "through" ## [701] "during" "before" "after" "above" ## [705] "below" "to" "from" "up" ## [709] "down" "in" "out" "on" ## [713] "off" "over" "under" "again" ## [717] "further" "then" "once" "here" ## [721] "there" "when" "where" "why" ## [725] "how" "all" "any" "both" ## [729] "each" "few" "more" "most" ## [733] "other" "some" "such" "no" ## [737] "nor" "not" "only" "own" ## [741] "same" "so" "than" "too" ## [745] "very" "a" "about" "above" ## [749] "across" "after" "again" "against" ## [753] "all" "almost" "alone" "along" ## [757] "already" "also" "although" "always" ## [761] "among" "an" "and" "another" ## [765] "any" "anybody" "anyone" "anything" ## [769] "anywhere" "are" "area" "areas" ## [773] "around" "as" "ask" "asked" ## [777] "asking" "asks" "at" "away" ## [781] "back" "backed" "backing" "backs" ## [785] "be" "became" "because" "become" ## [789] "becomes" "been" "before" "began" ## [793] "behind" "being" "beings" "best" ## [797] "better" "between" "big" "both" ## [801] "but" "by" "came" "can" ## [805] "cannot" "case" "cases" "certain" ## [809] "certainly" "clear" "clearly" "come" ## [813] "could" "did" "differ" "different" ## [817] "differently" "do" "does" "done" ## [821] "down" "down" "downed" "downing" ## [825] "downs" "during" "each" "early" ## [829] "either" "end" "ended" "ending" ## [833] "ends" "enough" "even" "evenly" ## [837] "ever" "every" "everybody" "everyone" ## [841] "everything" "everywhere" "face" "faces" ## [845] "fact" "facts" "far" "felt" ## [849] "few" "find" "finds" "first" ## [853] "for" "four" "from" "full" ## [857] "fully" "further" "furthered" "furthering" ## [861] "furthers" "gave" "general" "generally" ## [865] "get" "gets" "give" "given" ## [869] "gives" "go" "going" "good" ## [873] "goods" "got" "great" "greater" ## [877] "greatest" "group" "grouped" "grouping" ## [881] "groups" "had" "has" "have" ## [885] "having" "he" "her" "here" ## [889] "herself" "high" "high" "high" ## [893] "higher" "highest" "him" "himself" ## [897] "his" "how" "however" "i" ## [901] "if" "important" "in" "interest" ## [905] "interested" "interesting" "interests" "into" ## [909] "is" "it" "its" "itself" ## [913] "just" "keep" "keeps" "kind" ## [917] "knew" "know" "known" "knows" ## [921] "large" "largely" "last" "later" ## [925] "latest" "least" "less" "let" ## [929] "lets" "like" "likely" "long" ## [933] "longer" "longest" "made" "make" ## [937] "making" "man" "many" "may" ## [941] "me" "member" "members" "men" ## [945] "might" "more" "most" "mostly" ## [949] "mr" "mrs" "much" "must" ## [953] "my" "myself" "necessary" "need" ## [957] "needed" "needing" "needs" "never" ## [961] "new" "new" "newer" "newest" ## [965] "next" "no" "nobody" "non" ## [969] "noone" "not" "nothing" "now" ## [973] "nowhere" "number" "numbers" "of" ## [977] "off" "often" "old" "older" ## [981] "oldest" "on" "once" "one" ## [985] "only" "open" "opened" "opening" ## [989] "opens" "or" "order" "ordered" ## [993] "ordering" "orders" "other" "others" ## [997] "our" "out" "over" "part" ## [1001] "parted" "parting" "parts" "per" ## [1005] "perhaps" "place" "places" "point" ## [1009] "pointed" "pointing" "points" "possible" ## [1013] "present" "presented" "presenting" "presents" ## [1017] "problem" "problems" "put" "puts" ## [1021] "quite" "rather" "really" "right" ## [1025] "right" "room" "rooms" "said" ## [1029] "same" "saw" "say" "says" ## [1033] "second" "seconds" "see" "seem" ## [1037] "seemed" "seeming" "seems" "sees" ## [1041] "several" "shall" "she" "should" ## [1045] "show" "showed" "showing" "shows" ## [1049] "side" "sides" "since" "small" ## [1053] "smaller" "smallest" "some" "somebody" ## [1057] "someone" "something" "somewhere" "state" ## [1061] "states" "still" "still" "such" ## [1065] "sure" "take" "taken" "than" ## [1069] "that" "the" "their" "them" ## [1073] "then" "there" "therefore" "these" ## [1077] "they" "thing" "things" "think" ## [1081] "thinks" "this" "those" "though" ## [1085] "thought" "thoughts" "three" "through" ## [1089] "thus" "to" "today" "together" ## [1093] "too" "took" "toward" "turn" ## [1097] "turned" "turning" "turns" "two" ## [1101] "under" "until" "up" "upon" ## [1105] "us" "use" "used" "uses" ## [1109] "very" "want" "wanted" "wanting" ## [1113] "wants" "was" "way" "ways" ## [1117] "we" "well" "wells" "went" ## [1121] "were" "what" "when" "where" ## [1125] "whether" "which" "while" "who" ## [1129] "whole" "whose" "why" "will" ## [1133] "with" "within" "without" "work" ## [1137] "worked" "working" "works" "would" ## [1141] "year" "years" "yet" "you" ## [1145] "young" "younger" "youngest" "your" ## [1149] "yours" tweet_words <- tweets %>% filter(!str_detect(text, '^"')) %>% mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\\\d]+|&", "")) %>% # unnest_tokens(word, text) %>% # unnest_tokens(word, text, token = "regex", pattern = "[^A-Za-z\\\\d#@']") %>% mutate(word = str_split(text, " ")) %>% select(id, text, word, everything()) %>% unnest(word) %>% filter(!word %in% stop_words$word) %>% filter(str_detect(word, "[a-z]")) # View(tweet_words) 這段程式碼用於分析文本數據中出現頻率最高的單詞(word),並使用barplot進行視覺化呈現。具體來說,這段程式碼實現了以下幾個步驟: 使用count()函數對data.frame中的單詞word進行計數,得到每個單詞出現的次數,並按照次數降序排列。 使用head()函數選擇出現次數最高的前20個單詞,並用mutate()函數將這20個單詞按照出現次數重新排序(注意reorder()的寫法)。 geom_col()函數用於繪製barplot,coord_flip()函數用於將x軸和y軸互換,以便更好地顯示barplot。 tweet_words %>% count(word, sort = TRUE) %>% head(20) %>% mutate(word = reorder(word, n)) %>% ggplot(aes(word, n)) + geom_col(fill = "royalblue") + ylab("Occurrences") + coord_flip() + theme_minimal() + theme(axis.text = element_text(size=10)) 12.4.1 Log-likelihood ratio word_by_source的程式碼用於將單詞按照來源(source)進行分類,並統計每個來源中每個單詞出現的次數: 使用count()函數對單詞資料框中的單詞按照來源進行計數,並且將計數結果按照單詞和來源兩個變數進行分組。並使用filter()函數過濾掉在所有來源中出現次數少於5次的單詞。 使用pivot_wider()函數將分組後的資料框進行重構,將每個來源的單詞出現次數作為新欄(也就是把iPhone和Android展開成為欄位名稱),以便更方便地進行後續分析和可視化。這裡的names_from參數指定重構後的欄位名稱來自原來的source欄位,values_from參數指定要重構的值來自原來的count欄位,values_fill參數指定在重構後的資料框中缺失值的填充值,這裡設置為0。 android_iphone_ratios這段程式碼用於計算每個單詞在Android和iPhone兩個來源中的keyness的log likelihood ratio。具體來說,這段程式碼實現了以下幾個步驟: 從上一步驟得到的word_by_source資料框中,選擇了Android和iPhone兩個來源的單詞出現次數資訊。 對Android和iPhone兩個來源的單詞出現次數進行標準化處理,以便進行後續的keyness計算。具體來說,這裡使用了Laplace平滑處理(add-k smoothing),將每個來源的所有單詞出現次數都增加1,然後再將這些出現次數除以各自來源的總次數加1,得到每個單詞在Android和iPhone兩個來源中的出現概率。 對Android和iPhone兩個來源中的每個單詞,分別計算其在Android和iPhone兩個來源中的keyness log ratio。這裡使用了常見的對數比值(log ratio)方法,計算Android來源中單詞出現概率和iPhone來源中單詞出現概率的比值的對數,以此來衡量單詞在Android和iPhone兩個來源中的關鍵性差異。 將計算得到的log ratio值按照降序排列,以便進一步進行分析和可視化。 test <- tweet_words %>% count(word, source) %>% filter(n >= 5) %>% pivot_wider(names_from = source, values_from = n, values_fill = 0) # View(test) word_by_source <- tweet_words %>% count(word, source) %>% filter(n >= 5) %>% pivot_wider(names_from = source, values_from = n, values_fill = 0) %>% # spread(source, n, fill = 0) %>% ungroup() sum(word_by_source$iPhone) ## [1] 1383 sum(word_by_source$Android) ## [1] 2132 android_iphone_ratios <- word_by_source %>% mutate(iPhone = (iPhone+1)/sum(iPhone+1)) %>% mutate(Android = (Android+1)/sum(Android+1)) %>% # mutate_at(.cols = vars(iPhone, Android), # .funs = funs((. + 1) / sum(. + 1))) %>% mutate(logratio = log2(Android / iPhone)) %>% arrange(desc(logratio)) 這兩行分子分母加1的處理稱為拉普拉斯平滑。mutate(iPhone = (iPhone+1)/sum(iPhone+1)) %>% 拉普拉斯平滑(add-k smoothing)是一種用於處理計數資料中零值問題的技巧,其主要目的是將出現次數為零的類別在計算機率時賦予一個非零的機率值,以避免出現無限大的情況,從而影響後續的計算結果。 在這段程式碼中,拉普拉斯平滑的目的是對每個單詞在Android和iPhone兩個來源中的出現次數進行標準化處理,以便進行後續的keyness計算。這是因為在標準化的計算中,如果某個來源中出現次數為0的單詞,則計算出來的概率值會為0,而這樣的結果可能會產生一些問題,例如無法取log或分母為零的情形。因此,為了避免這種問題,需要對每個單詞在Android和iPhone兩個來源中的出現次數進行拉普拉斯平滑處理,使得每個單詞在Android和iPhone兩個來源中的出現概率都能夠有一個非零的值,從而進行後續的計算和分析。 12.4.2 Plotting keyness 這段程式碼是用來繪製Android和iPhone兩個來源中關鍵性差異最大的單詞的keyness log ratio的條形圖。在繪製條形圖時,使用了fill = logratio < 0的參數設置,這是一個布林值,當單詞在Android和iPhone兩個來源中的log ratio小於0時,填充的顏色是gold,否則填充的顏色是royalblue。 這種設計原理的目的是將Android和iPhone兩個來源中關鍵性不同的單詞進行區分,並用不同的填充顏色來表示。當單詞在Android來源中的出現概率高於在iPhone來源中的出現概率時,其log ratio值會為正,此時填充的顏色為royalblue;反之,當單詞在Android來源中的出現概率低於在iPhone來源中的出現概率時,其log ratio值會為負,此時填充的顏色為gold。 android_iphone_ratios %>% group_by(logratio > 0) %>% top_n(15, abs(logratio)) %>% ungroup() %>% mutate(word = reorder(word, logratio)) %>% ggplot(aes(word, logratio, fill = logratio < 0)) + geom_col() + coord_flip() + ylab("Android / iPhone log ratio") + scale_fill_manual(name = "", labels = c("Android", "iPhone"), values = c("royalblue", "gold")) + theme_minimal() + theme(axis.text = element_text(size=14)) "],["re.html", "Chapter 13 Regular expression 13.1 RE applications on string operations 13.2 RE Case studies 13.3 Useful cases", " Chapter 13 Regular expression library(tidyverse) 正規表達式(Regular Expression)是一種用來描述、搜尋和操作文本的強大工具。它是由一系列字元和特殊符號所組成的模式,用於匹配和處理符合特定模式的字串。 正規表達式提供了一種靈活且強大的方式來執行字串的模式匹配。這些模式可以包含字母、數字、特殊字符和控制字符等各種元素。使用正規表達式,可以進行字串的搜尋、替換、提取、驗證和分割等操作。 Online tools for detecting regular expression (RE) https://regex101.com/ http://regexr.com/ RE Patterns 在正規表達式中,一些特殊符號和字符具有特殊的含義。例如,\\d可以匹配任何一個數字,\\w可以匹配任何一個字母或數字,.可以匹配除換行符之外的任何一個字符,+表示前面的模式可以出現一次或多次,*表示前面的模式可以出現零次或多次,?表示前面的模式可以出現零次或一次,[]用於指定一組字符中的任意一個等等。較完整的表格如下。要注意到的是,如果是\\d的話,R中要以\\\\d雙斜線來表示。 pattern <- \"\\\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}\\\\b\"為一個用R來寫RE的範例:在R中,我們使用雙反斜線(\\)來表示正規表達式中的特殊字符。在這個示例中,使用的正規表達式模式包括以下幾個部分: \\\\b:匹配單詞的邊界,確保郵件地址不是部分字詞的一部分。 [A-Za-z0-9._%+-]+:匹配郵件地址的用戶名部分,它可以包含字母、數字、點(.)、下劃線(_)、百分比(%)、加號(+)和減號(-)。注意這個在中括號中的點(.)並非用來匹配任意字。後面的+號意思是代表至少要有一個字以上。 @:匹配郵件地址中的「@」符號。 [A-Za-z0-9.-]+:匹配郵件地址的域名部分,它可以包含字母、數字、點(.)和減號(-)。 \\\\.:匹配郵件地址中的點(.),需要使用反斜線進行轉義。 [A-Za-z]{2,}:匹配郵件地址的頂級域名部分,它可以是由至少兩個字母組成的字詞。 Pattern Description ^ Matches beginning of line. $ Matches end of line. . Matches any single character except newline. Using m option allows it to match newline as well. [...] Matches any single character in brackets. [^...] Matches any single character not in brackets re* Matches 0 or more occurrences of preceding expression. re+ Matches 1 or more occurrence of preceding expression. re? Matches 0 or 1 occurrence of preceding expression. *?, +?, ?? *, +和?預設是greedy的,如果要匹配’<H1>title</H1>‘時,會匹配整個句子。如果不希望它是greedy的,就要在上述符號後面加一個?。Using .*? in the previous expression will match only ’<H1>’. re{ n} Matches exactly n number of occurrences of preceding expression. re{ n,} Matches n or more occurrences of preceding expression. re{n, m} Matches at least n and at most m occurrences of preceding expression. a| b Matches either a or b. (re) 問號括住的部分就是match要留下來的部分。Groups regular expressions and remembers matched text. (?imx) Temporarily toggles on i, m, or x options within a regular expression. If in parentheses, only that area is affected. (?-imx) Temporarily toggles off i, m, or x options within a regular expression. If in parentheses, only that area is affected. (?: re) Groups regular expressions without remembering matched text. (?imx: re) Temporarily toggles on i, m, or x options within parentheses. (?-imx: re) Temporarily toggles off i, m, or x options within parentheses. (?#...) Comment. (?= re) Specifies position using a pattern. Doesn’t have a range. (?! re) Specifies position using pattern negation. Doesn’t have a range. (?> re) Matches independent pattern without backtracking. \\w Matches word characters. \\W Matches nonword characters. \\s Matches whitespace. Equivalent to [\\t\\n\\r\\f]. \\S Matches nonwhitespace. \\d Matches digits. Equivalent to [0-9]. \\D Matches nondigits. \\A Matches beginning of string. \\Z Matches end of string. If a newline exists, it matches just before newline. \\z Matches end of string. \\G Matches point where last match finished. \\b Matches word boundaries when outside brackets. Matches backspace (0x08) when inside brackets. \\B Matches nonword boundaries. \\n, \\t, etc. Matches newlines, carriage returns, tabs, etc. \\1...\\9 Matches nth grouped subexpression. \\10 Matches nth grouped subexpression if it matched already. Otherwise refers to the octal representation of a character code. 13.1 RE applications on string operations Replacing specific pattern Replacing all space or new line character to one space or empty string Deleting all number and alphabetic by empty string Deleting all HTML tags Detecting if it exists some specific pattern Fitering if one sentence starting with “. Extracting some words by specific pattern Extracting hashtags in text Extracting timestamp, email, hyperlink, or url in text Extracting number after some specific patterns Splitting Splitting string into several parts when detecting some specific pattern successfully. Replacing \\s matching any whitespace character including space, tabs, and line breaks R uses \\\\s, instead of \\s. \\\\d digit, \\\\D not digit \\\\s whitepsace, \\\\S not whitespace \\\\w word, \\\\W not word . matches any [A-Z0-9a-z] range [ABC] character set [^ABC] neglect set (Leadning ^ in [] means neglecting) s <- " 123 456 789 " str_replace_all(s, "\\\\s", "") ## [1] "123456789" 13.1.1 Extracting + means matching word occurring at least one time, matching longer is better * means matching word occurring any time, matching longer is better {1,3} means matching at least one time, but at most 3 times {3} means matching 3 times exactly. 13.1.1.1 by str_extract() 以下這個例子是在爬取PTT資料後,嘗試能夠取出每則貼文的ID與暱稱。 pname <- c("pttid111(kefan)", "pid2(hangfan)") # extracting at least one words until not word str_extract(pname, "\\\\w") ## [1] "p" "p" str_extract(pname, "\\\\w+") ## [1] "pttid111" "pid2" str_extract(pname, "[A-Za-z0-9]+") ## [1] "pttid111" "pid2" str_extract(pname, "[A-Za-z0-9]*") ## [1] "pttid111" "pid2" str_extract(pname, "[A-Za-z0-9]{8}") ## [1] "pttid111" NA str_extract(pname, "[A-Za-z0-9]{1,8}") ## [1] "pttid111" "pid2" # extracting word between () # () is controlled vocabulary in regular expression, needing \\\\( and \\\\) to specify the character themself str_extract(pname, "\\\\(\\\\w+\\\\)") %>% str_replace_all("[\\\\(\\\\)]", "") ## [1] "kefan" "hangfan" str_extract(pname, "\\\\(.+\\\\)") ## [1] "(kefan)" "(hangfan)" 13.1.1.2 by str_extract for data frame data_frame(pname) %>% mutate(nickname = str_extract(pname, "\\\\(\\\\w+\\\\)") %>% str_replace_all("[\\\\(\\\\)]", "")) %>% mutate(id = str_extract(pname, "\\\\w+")) ## Warning: `data_frame()` was deprecated in tibble 1.1.0. ## ℹ Please use `tibble()` instead. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated. ## # A tibble: 2 × 3 ## pname nickname id ## <chr> <chr> <chr> ## 1 pttid111(kefan) kefan pttid111 ## 2 pid2(hangfan) hangfan pid2 13.1.1.3 by str_replace() (\\\\w+)的括號代表,我等一下要抽取出這個pattern的字 \\\\(.+\\\\)則是把剩下的pattern matching 完 \\\\1代表我要抽取前面第一組抽取出來的pattern,也就是(\\\\w+)中間的\\\\w+。 data_frame(pname) %>% mutate(id = str_replace(pname, "(\\\\w+)\\\\(.+\\\\)", "\\\\1")) ## # A tibble: 2 × 2 ## pname id ## <chr> <chr> ## 1 pttid111(kefan) pttid111 ## 2 pid2(hangfan) pid2 13.1.1.4 by tidyr::extract() for data frame data_frame(pname) %>% tidyr::extract(pname, c("id", "nickname"), "(\\\\w+)\\\\((.+)\\\\)", remove = F) ## # A tibble: 2 × 3 ## pname id nickname ## <chr> <chr> <chr> ## 1 pttid111(kefan) pttid111 kefan ## 2 pid2(hangfan) pid2 hangfan ?tidyr::extract 13.1.2 Detecting with non-greedy 這段程式碼使用R中的tidyverse套件中的extract()函數,從source向量中的每個元素中提取出「device」的資訊。假設我們希望從<p>和</p>之間提取「Twitter for iPhone」這個資訊。 此時我們會需要理解正規表示式的寫法預設是貪婪(greedy)的概念。當我們談到正規表達式的「貪婪」(greedy)和「非貪婪」(non-greedy)時,我們指的是模式匹配時的行為。 「貪婪」指的是匹配器在尋找模式時傾向於匹配盡可能多的字符。換句話說,它會儘可能地擴展匹配範圍。在正規表達式中,默認情況下,量詞(如*和+)是貪婪的。這意味著它們會匹配盡可能長的字串。 「非貪婪」(或稱「勉強」)則相反,它傾向於匹配最短的可能字串。在正規表達式中,可以在量詞後面加上「?」來表示非貪婪匹配。這樣一來,量詞就會儘可能少地匹配字符。 回到我們的例子,當使用默認的貪婪模式時,我們的正則表達式\"Twitter for (.*)<\"會從第一個<p>開始匹配,直到找到最後一個<之前的所有字符。這意味著它會將整個<p>Twitter for iphone</p><div><p>作為匹配結果,而不僅僅是<p>Twitter for iphone</p>。 但如果我們想要只匹配第一個<p>和之後的字符,而不是將整個<p>標籤內容都包括在內,我們可以使用「非貪婪」模式,將正則表達式修改為\"Twitter for (.*?)<\",在量詞*後面加上「?」。這樣,它會匹配到第一個<之前的最短字串,即只匹配到<p>Twitter for iphone。 source <- c("<p>Twitter for iphone</p>", "<div><p>Twitter for iphone</p></div>") data_frame(source) %>% extract(source, "device", "Twitter for (.*)<") # Greedy ## # A tibble: 2 × 1 ## device ## <chr> ## 1 iphone ## 2 iphone</p> data_frame(source) %>% extract(source, "device", "Twitter for (.*?)<") # Non-Greedy ## # A tibble: 2 × 1 ## device ## <chr> ## 1 iphone ## 2 iphone 13.1.3 Detecting multiple patterns https://stackoverflow.com/questions/8020848/how-is-the-and-or-operator-represented-as-in-regular-expressions 以下練習重點是讓學生理解如何使用 str_detect() 函數和正則表達式進行模式匹配,以及如何進行邏輯操作來組合和篩選符合特定模式的句子。 str_detect(teststr, re1) & str_detect(teststr, re2) 通過 & 進行邏輯「與」操作,將兩個邏輯向量進行元素級別的「與」運算,得到一個新的邏輯向量。該向量指示哪些句子同時符合 re1 和 re2 的模式。 str_detect(teststr, re1) | str_detect(teststr, re2) 通過 | 進行邏輯「或」操作,將兩個邏輯向量進行元素級別的「或」運算,得到一個新的邏輯向量。該向量指示哪些句子符合 re1 或 re2 的模式。 teststr <- c("B和A是不是男女朋友呢", "C與B是不是在一起呢", "A就是B。") re1 <- "(.*B.*呢$)" re2 <- "(.*A.*)" str_detect(teststr, re1) ## [1] TRUE TRUE FALSE str_detect(teststr, re2) ## [1] TRUE FALSE TRUE str_detect(teststr, re1) & str_detect(teststr, re2) ## [1] TRUE FALSE FALSE str_detect(teststr, re1) | str_detect(teststr, re2) ## [1] TRUE TRUE TRUE 13.1.4 Extracting nearby words 13.1.4.1 Extracting nearby 3 English words string2 <- "..., compelled to defend as never before the hard-charging progressivism and ...." data_frame(string2) %>% mutate(string2 = str_extract(string2, "(\\\\S+\\\\s){3}before(\\\\s\\\\S+){3}")) %>% extract(string2, c("prefix","hit", "tail"), "(.+)(before)(.+)") ## # A tibble: 1 × 3 ## prefix hit tail ## <chr> <chr> <chr> ## 1 "defend as never " before " the hard-charging progressivism" 13.1.4.2 Extracting nearby 3 Chinese words string3 <- c("呵呵呵呵呵呵呵我家就住在台灣,那是個美麗的地方", "臺灣真是個美麗的地方齁齁齁", "呵呵呵呵呵呵呵我愛台灣臺灣") str_extract(string3, ".{5}台灣.{5}|.{5}臺灣.{5}") ## [1] "我家就住在台灣,那是個美" NA ## [3] NA str_extract(string3, ".{1,5}台灣.{1,5}|.{1,5}臺灣.{1,5}") ## [1] "我家就住在台灣,那是個美" NA ## [3] "呵呵呵我愛台灣臺灣" 13.1.4.3 Extracting nearby 3 Chinese words df <- data_frame(string3) df %>% extract(string3, c("pre", "hit", "tail"), "(.{0,5})(台灣|臺灣)(.{0,5})") ## # A tibble: 3 × 3 ## pre hit tail ## <chr> <chr> <chr> ## 1 "我家就住在" 台灣 ,那是個美 ## 2 "" 臺灣 真是個美麗 ## 3 "呵呵呵我愛" 台灣 臺灣 13.2 RE Case studies 13.2.1 Getting the last page of PTT HatePolitics 這段程式碼的目的是從URL中提取出頁數或特定的部分,並進行一些後續處理和轉換。這些操作可用於從URL中獲取有用的訊息,例如網頁索引、頁數等。 urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html", "https://www.ptt.cc/bbs/HatePolitics/index348.html") df <- tibble(urls) str_extract(urls, "index(\\\\d+)\\\\.html") ## [1] "index4086.html" "index348.html" str_replace(urls, ".*index(\\\\d+)\\\\.html", "\\\\1") %>% as.numeric() ## [1] 4086 348 data_frame(urls) %>% extract(urls, "last_page", "index(\\\\d+)\\\\.html", remove = F) ## # A tibble: 2 × 2 ## urls last_page ## <chr> <chr> ## 1 https://www.ptt.cc/bbs/HatePolitics/index4086.html 4086 ## 2 https://www.ptt.cc/bbs/HatePolitics/index348.html 348 13.2.2 Practice. Ask CHATGPT 我現在有一程式碼如下 ``` urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html", "https://www.ptt.cc/bbs/HatePolitics/index348.html") df <- tibble(urls) ``` 我希望來抽取出頁面的編號,新增一個page_num的變項,使得 ``` ...index4086.html: 4086 ...index348.html: 348 ``` 請以tidyverse pipeline的方式寫,並使用stringr的函式 以下為chatgpt的回答。 您可以使用tidyverse和stringr的函式來實現這個目標。以下是一個使用tidyverse pipeline和stringr的範例程式碼: library(tidyverse) urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html", "https://www.ptt.cc/bbs/HatePolitics/index348.html") df <- tibble(urls) %>% mutate(page_num = str_extract(urls, "(?<=index)\\\\d+(?=.html)")) PROMPT:請解釋(?<=index)\\\\d+(?=.html) (?<=index): 是一個Positive Lookbehind。它表示匹配位置之前必須出現”index”字串。在這種情況下,我們希望匹配的數字出現在”index”之後,所以使用正向肯定後願式來確定位置。 \\\\d+: 這是一個數字的匹配模式。\\\\d表示匹配一個數字字符(0-9),而+表示匹配一個或多個連續的數字字符。這樣可以確保我們匹配到的是一個或多個數字。 (?=.html): 是一個Positive Lookahead。它表示匹配位置之後必須出現”.html”字串。在這種情況下,我們希望匹配的數字出現在”.html”之前,所以使用正向肯定前願式來確定位置。 index:匹配字串中的”index”字串。 (\\\\d+):這是一個捕獲組(Capture Group),用於捕獲一個或多個連續的數字字符。\\\\d表示匹配一個數字字符(0-9),而+表示匹配一個或多個連續的數字字符。 \\\\.html:匹配字串中的”.html”字串。由於”.”在正則表達式中具有特殊意義,所以需要使用\\\\進行轉義。 urls <- c("https://www.ptt.cc/bbs/HatePolitics/index4086.html", "https://www.ptt.cc/bbs/HatePolitics/index348.html") df <- tibble(urls) %>% mutate(page_num = str_extract(urls, "(?<=index)\\\\d+(?=.html)")) df ## # A tibble: 2 × 2 ## urls page_num ## <chr> <chr> ## 1 https://www.ptt.cc/bbs/HatePolitics/index4086.html 4086 ## 2 https://www.ptt.cc/bbs/HatePolitics/index348.html 348 13.3 Useful cases 13.3.1 Matching URL 這個正規表達式用於檢測是否符合超連結的格式。它可以匹配包含 http://、https://、ftp://、www. 或 ftp. 前綴的URL,並確保後續的部分符合網址的正確格式,例如域名、路徑和查詢參數等。 ^ 表示匹配字符串的開頭。 ((https?|ftp)://|(www|ftp)\\\\.)? 是一個可選的前綴,它匹配以 http://、https://、ftp://、www. 或 ftp. 開頭的部分。其中 ? 表示前綴部分是可選的。 [a-z0-9-]+ 匹配一個或多個小寫字母、數字或破折號字符。 (\\\\.[a-z0-9-]+)+ 是一個重複組,它匹配一個或多個點(.)後跟一個或多個小寫字母、數字或破折號字符。 ([/?].*)? 是另一個可選的後綴,它匹配以 / 或 ? 開頭的部分,並跟隨著任意字符。 $ 表示匹配字符串的結尾。 根據需求和特定的使用情境,可以有不同的寫法。以下是一些可能的替代寫法: 捕獲更多的URL前綴:當前的正規表達式只捕獲了 http://、https://、ftp://、www. 和 ftp. 這些前綴。如果需要捕獲更多的前綴,可以擴展前綴部分,例如 ((https?|ftp|file)://|(www|ftp)\\\\.)?,這樣可以捕獲 file:// 這樣的前綴。 更精確的域名部分:當前的正規表達式使用 [a-z0-9-]+(\\\\.[a-z0-9-]+)+ 匹配域名部分,這允許了字母、數字和破折號字符。如果需要更精確的域名匹配,可以使用更複雜的正規表達式,例如 (?!-)[A-Za-z0-9-]{1,63}(?<!-)\\\\.(?!-)[A-Za-z0-9-]{1,63}(?<!-),這樣可以確保符合域名規範。 pattern <- "^((https?|ftp)://|(www|ftp)\\\\.)?[a-z0-9-]+(\\\\.[a-z0-9-]+)+([/?].*)?$" str_detect("http://www.yahoo.com.tw", pattern) ## [1] TRUE str_detect("https://m.facebook.com/story.php?story_fbid=1483357095305703&id=1435979486710131", pattern) ## [1] TRUE str_detect("https://www.facebook.com/groups/335691256571414/permalink/774316322708903/", pattern) ## [1] TRUE 13.3.2 Removing all html tags but keeping comment content ANS: \"推 ya870801: 推 218.166.12.10 10/16 15:56\" comment <- '<div class="push"><span class="hl push-tag">推 </span><span class="f3 hl push-userid">ya870801</span><span class="f3 push-content">: 推</span><span class="push-ipdatetime"> 218.166.12.10 10/16 15:56</span></div>' str_replace_all(comment, "<.+?>", "") ## [1] "推 ya870801: 推 218.166.12.10 10/16 15:56" str_replace_all(comment, "<.*?>", "") ## [1] "推 ya870801: 推 218.166.12.10 10/16 15:56" 13.3.3 Removing space # Removing space in Chinese sentence sentence <- c(' 噓 wwHui: 這批安好純 \\n 辛苦了 \\n 噓 ', '噓 wwHui: 這批安好純 ', '辛苦了 ') # Removing all space characters str_replace_all(sentence, "\\\\s", "") ## [1] "噓wwHui:這批安好純辛苦了噓" "噓wwHui:這批安好純" ## [3] "辛苦了" # Removing leading and ending space by str_replace_all() # You cannot use trimws() str_replace_all(sentence, "^\\\\s+|\\\\s+$", "") ## [1] "噓 wwHui: 這批安好純 \\n 辛苦了 \\n 噓" ## [2] "噓 wwHui: 這批安好純" ## [3] "辛苦了" 13.3.4 Testing teststr1 <- c("我最近過的挺爽", "最近我過的不是很好。", "我最近過得不太好。") re1 <- "(^我.+)" re2 <- "(.*。)" str_detect(teststr1, str_c(re1,re2, sep = "")) ## [1] FALSE FALSE TRUE str_detect(teststr1, str_c(re1,re2, sep = "|")) ## [1] TRUE TRUE TRUE "],["tmchi.html", "Chapter 14 Text processing in Chinese 14.1 Preprocessing 14.2 Tokenization 14.3 Exploring wording features 14.4 TF-IDF", " Chapter 14 Text processing in Chinese tidyverse內涵繪圖和操作資料所需要的ggplot2和dplyr stringr雖然隨著tidyverse被安裝了,但不會隨著tidyverse被載入,要另外載入。 在中文斷詞的時候要用到tidytext和jiebaR。 處理時間時要用到lubridate。 14.1 Preprocessing 14.1.1 Assigning unique id to each doc 為了便於後續建立Document-Term-Matrix,這時候若Document自身沒有編號的話,就得把整個Document內容當成該篇文章的id,但也有(極小)可能有兩篇Document內容相同,那就會被視為同一篇文章或發生錯誤。所以必須要編id。 row_number()產生每列的編號,所以這邊就直接把每列的編號視為每篇文章的id,可以保持該id的唯一性。當你在進行文本探勘或資料分析時,為每篇文章分配一個唯一的ID是非常重要的。唯一的ID確保每篇文章都有獨一無二的標識符號。這對於跟踪和識別特定文章非常重要,特別是當你處理大量的文本資料時。在進行資料合併時,唯一的ID可用於將不同來源的資料準確地匹配和合併在一起。這是非常實用的,尤其當你需要整合來自多個來源的文本資料時,例如合併多個資料集或者在不同時間點上進行的數據採集。 news.df <- readRDS("data/typhoon.rds") %>% mutate(doc_id = row_number()) %>% drop_na(title) 14.2 Tokenization 14.2.1 Initializer tokenizer cutter <- worker()這行程式碼使用worker()函式來初始化jieba分詞器,將其指派給名為cutter的變數。jieba是一個常用的中文分詞套件,用於將漢字序列分割成詞彙。初始化分詞器後,可以使用它來對中文文本進行分詞操作。 斷詞的時候不見能把我們要的字詞斷出來,比方說你可能希望台北市不會被斷開,偏偏被斷成台北+市。最簡單的辦法就是把他窮舉舉完。new_user_word(cutter, segment_not)這行程式碼使用new_user_word()函式將segment_not這個vector中的詞彙加入使用者自定義詞典。這樣做的目的是防止該詞彙被分詞器切分成不同的部分。使用者可以根據需要將自定義詞彙加入詞典,以確保這些詞彙在分詞過程中被正確處理。 載入中文停用詞:stopWords <- readRDS(\"data/stopWords.rds\") 這行程式碼載入中文停用詞(stop words)的資料,並將其讀取到名為stopWords的變數中。停用詞是在文本分析中被視為無意義或不重要的詞彙,例如連接詞、介詞、助詞等。載入停用詞列表後,可以在文本處理過程中使用它來過濾掉這些不需要的詞彙,以提高分析的效果。常見的中文停用詞包含 助詞:的、了、着、地、得、之等。 連詞:和、與、或、及、還、而等。 代詞:我、你、他、她、它、們、這、那等。 冠詞:一、個、些、這、那等。 介詞:在、從、到、以、為、因、應、對等。 虛詞:的、地、得、過、過去等。 數詞:一、二、三、十、百、千、萬等。 副詞:很、非常、太、真、已經、還、就等。 連接詞:而、並、所以、因此、然而、只是等。 感嘆詞:嗯、哦、啊、呀、吧、喔等。 # segment_not to avoid to be segmented by jeiba cutter segment_not <- c("第卅六條", "第卅八條", "蘇南成", "災前", "災後", "莫拉克", "颱風", "應變中心", "停班停課", "停課", "停班", "停駛", "路樹", "里長", "賀伯", "採收", "菜價", "蘇迪", "受災戶", "颱風警報", "韋恩", "台東縣", "馬總統", "豪大雨", "梅姬", "台東", "台北市政府", "工務段", "漂流木", "陳菊", "台南縣", "卡玫基", "魚塭", "救助金", "陳情", "全省", "強颱", "中颱", "輕颱", "小林村", "野溪", "蚵民", "農委會", "來襲", "中油公司", "蔣總統經國", "颱風天", "土石流", "蘇迪勒", "水利署", "陳說", "颱風假", "颱風地區", "台灣", "臺灣", "柯羅莎", "八八風災", "紓困","傅崑萁", "傅崐萁","台中", "文旦柚", "鄉鎮市公所", "鄉鎮市", "房屋稅", "高雄", "未達", "台灣省", "台北市") # Initialize jieba cutter cutter <- worker() # Add segment_not into user defined dictionary to avoid being cutted new_user_word(cutter, segment_not) ## [1] TRUE # loading Chinese stop words stopWords <- readRDS("data/stopWords.rds") # load("../segment_not.R") 14.2.2 Tokenization Tokenization(分詞)在文本探勘的過程中是將文本轉換為更小單位的步驟。它將連續的文本序列(例如句子或段落)分割成一系列被稱為「詞彙」或「tokens」的個別單位。在文本探勘中,進行分詞的目的是將文本轉換為可以進一步處理和分析的基本單位。每個詞彙代表著文本中的一個有意義的單詞、詞組或符號,例如一個英文單詞、一個漢字、一個數字等等。這些詞彙可以作為後續分析的基礎,用於進行文本處理、特徵提取、語義分析、情感分析等各種任務。 分詞的過程可以包括以下步驟: 斷句:如果文本是一個段落或一個文檔,首先需要將其分成句子。這可以使用標點符號(如句號、問號、驚嘆號等)作為分隔符號來實現。 分詞:將每個句子進一步分成詞彙或tokens。具體的分詞方法取決於文本的語言和特定的工具或套件。對於中文,常用的分詞工具包括jieba、SnowNLP等;而對於英文,常用的分詞方法是基於空格或標點符號進行切分。 去除停用詞:在分詞過程中,通常會過濾掉停用詞,這些詞彙被認為對文本分析沒有太大的意義。停用詞可以是常用的連接詞、介詞、助詞、冠詞等。 正規化:進行詞彙的正規化,例如將詞彙轉換成小寫,移除標點符號,處理詞彙的變體形式(如單數、複數、時態等)。 建立詞彙表:將所有詞彙收集到一個詞彙表或詞彙索引中,該詞彙表可以用於後續的文本處理和分析。 例如一個句子「今天天氣真好,我打算去公園散步。」可以被斷成「今天 天氣 真好 , 我 打算 去 公園 散步 。」 實際上中文斷詞相當不容易,常見的問題包括: 歧義詞彙:中文中存在許多具有歧義性的詞彙,例如「打開」可以是「開啟」的意思,也可以是「打碎」的意思。在分詞時,選擇正確的分詞方式對於確定詞彙的真正含義非常重要。 新詞辨識:中文是一個活躍的語言,新詞彙的產生非常頻繁。在分詞過程中,如果遇到未在詞典中出現的新詞彙,可能會無法正確切分,導致語義的失真或信息的丟失。 縮略詞和缺詞:中文中常使用縮略詞,例如「國際象棋」可以縮寫為「國象」。在分詞時,需要考慮這些縮略詞的存在,並確保正確切分。另外,有些中文詞彙存在缺詞現象,例如「下雨了」可以簡化為「下雨」,需要根據上下文來識別和處理這些情況。 斷詞歧異:「台北市/長」或「台北/市長」 外文詞彙和混合語言:中文文本中常包含外文詞彙或混合語言的情況。在分詞時,需要考慮如何處理這些詞彙,例如是否將其當作一個整體進行切分,或者保留其原有的形式。 未知詞彙和低頻詞彙:分詞工具常基於詞典來進行切分,因此對於一些罕見或專有名詞、專術詞彙可能無法進行正確的切分。這些未知詞彙和低頻詞彙的處理需要特殊的處理策略,例如使用統計方法或自定義詞彙表。 在segment(x, cutter)後會產生一個多詞的向量。亦即每一格就是一個向量,你可以把它印出來看看。可以用unnest()將word列中的字詞向量展開,使每個單詞成為一列。這樣可以將每個單詞視為一個觀察值,方便後續的處理。 # news.df$time %>% summary tokenized.df <- news.df %>% slice(-3069) %>% mutate(timestamp=ymd(time)) %>% # filter(timestamp > as.Date("2009-01-01")) %>% select(-time) %>% select(title, text, cat, timestamp, everything()) %>% mutate(word = purrr::map(text, function(x)segment(x, cutter))) tokenized.df %>% select(title, word) %>% head() ## # A tibble: 6 × 2 ## title word ## <chr> <list> ## 1 "昨天上班的人沒加班費也不補假\\n依法 員工無權利要求•體恤 雇主可酌情嘉惠" <chr> ## 2 "走過桑梓千田\\n東台水保之旅" <chr> ## 3 "走過桑梓千田\\n東台水保之旅" <chr> ## 4 "總統祝福大家新春如意\\n期勉迎接挑戰贏得勝利" <chr> ## 5 "總統至為關切颱風災害\\n電囑儘速展開救災重建" <chr> ## 6 "總統關懷澎湖災情 俞揆冒雨巡視災區\\n指示搶修道路•優先供應水電 復建資金… <chr> # unnest() to spread character into a new word variable # filter out stop words # filter out alphabetical and numeric characters unnested.df <- tokenized.df %>% select(doc_id, text, word) %>% unnest(word) %>% filter(!(word %in% stopWords$word)) %>% filter(!str_detect(word, "[a-zA-Z0-9]+")) unnested.df %>% head ## # A tibble: 6 × 3 ## doc_id text word ## <int> <chr> <chr> ## 1 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 昨天 ## 2 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 颱風… ## 3 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 北部 ## 4 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 地區 ## 5 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 機關 ## 6 1 昨天颱風天,北部各地區機關、學校經主管機關宣佈放假一天。民營事業… 學校 14.3 Exploring wording features 14.3.1 Word frequency distribution 這兩個函式是用於對X軸和Y軸進行對數轉換。對數轉換可以將原始數據的數值範圍較大的部分進行壓縮,使其在視覺化時更易於比較和理解。對數尺度的使用有助於呈現數據的相對變化和細節,尤其是當數據範圍跨度較大時。 對X軸和Y軸進行對數轉換的目的是為了更好地觀察數據的分佈特徵,尤其是在存在長尾分佈(power-law distribution)或Zipf’s law的情況下。 長尾分佈(Power-law distribution): 在長尾分佈中,少數的頻繁發生事件和大量的不太頻繁發生事件形成了一個長尾(即數量較小但頻率較高的事件非常稀有)。對於長尾分佈的數據,採取對數轉換可以將較大的數值範圍縮小,使得長尾部分的細節更容易被觀察和比較。這樣做可以更好地呈現數據的細微變化和分佈的特性。 Zipf’s law: Zipf’s law是一種描述詞彙頻率與詞彙排名之間關係的統計定律。根據Zipf’s law,詞彙的頻率與其在排序中的排名成反比。當觀察和分析詞彙頻率時,對X軸和Y軸進行對數轉換有助於更好地呈現Zipf’s law的特性。對數尺度轉換使我們能夠更清楚地觀察到詞彙頻率的排名和分佈情況。 在power-law distribution的情況下,如果對X軸和Y軸進行對數轉換,我們通常會看到以下情形: 直線關係:在對數尺度下,如果數據符合power-law distribution,我們會看到一條近似線性的直線關係。這表示在對數尺度下,數據點的分佈大致呈現線性趨勢,表示一種指數衰減或增長的規律。 長尾尾部:power-law distribution的特點是長尾尾部的存在,即少數極端值或稀有事件的出現頻率相對較高。在對數尺度下,我們能夠更清楚地看到這些極端值或稀有事件在數據分佈中的位置,因為它們在對數尺度下會呈現較為明顯的特徵。 分佈斜率:對數尺度下的power-law distribution,通常可以通過斜率來描述分佈的特性。斜率表示每個X單位變化對應的Y單位變化,或者說在對數尺度下,表示對數Y值相對於對數X值的變化率。如果數據點遵循power-law distribution,斜率會呈現相對恆定的特性。 word.count <- tokenized.df %>% unnest(word) %>% count(word, sort=T) %>% filter(!(word %in% stopWords$word)) %>% filter(nchar(word) > 1) %>% filter(!str_detect(word, "[a-zA-Z0-9]+")) %>% filter(n > 3) word.count %>% count(n, sort=T) %>% ggplot(aes(n, nn)) + geom_point(alpha=0.5, size = 1, color="#333333") word.count %>% count(n, sort=T) %>% ggplot(aes(n, nn)) + geom_point(alpha=0.5, size = 1, color="#333333") + scale_x_log10() + scale_y_log10() 14.3.2 Keyness by logratio 早、近期用字差異 cat_word.tf <- tokenized.df %>% unnest(word) %>% count(cat, word) %>% ungroup() %>% filter(!str_detect(word, "[a-zA-Z0-9]+")) %>% filter(!(word %in% stopWords$word)) %>% filter(nchar(word)>1) early_lat_ratio <- cat_word.tf %>% filter(n>1) %>% pivot_wider(names_from = cat, values_from = n, values_fill = 0) %>% # spread(cat, n, fill = 0) %>% ungroup() %>% mutate_if(is.numeric, funs((. + 1) / sum(. + 1))) %>% mutate(logratio = log2(early / lat)) %>% arrange(desc(logratio)) early_lat_ratio %>% group_by(logratio > 0) %>% top_n(20, abs(logratio)) %>% ungroup() %>% mutate(word = reorder(word, logratio)) %>% ggplot(aes(word, logratio, fill = logratio < 0)) + geom_bar(stat = "identity") + coord_flip() + ylab("early / recent log ratio") + scale_fill_manual(name = "", labels = c("early", "recent"), values = c("tomato", "lightblue")) + theme(axis.text.y=element_text(colour="black", family="Heiti TC Light")) 14.3.3 Keyness by scatter frequency <- cat_word.tf %>% filter(n>3) %>% group_by(cat) %>% mutate(proportion = n/sum(n)) %>% select(-n) %>% spread(cat, proportion) %>% na.omit() # datatable(frequency) library(scales) frequency %>% ggplot(aes(x = early, y = lat, color = abs(early - lat))) + geom_abline(color = "gray40", lty = 2) + geom_point(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) + geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5, family="Heiti TC Light", size = 3) + scale_x_log10(labels = percent_format()) + scale_y_log10(labels = percent_format()) + theme(legend.position="none") + coord_fixed(1) 14.4 TF-IDF TF-IDF (Term Frequency-Inverse Document Frequency) 是一種用於衡量一個詞彙在文本集合中重要性的統計方法。它結合了詞頻 (Term Frequency, TF) 和逆文檔頻率 (Inverse Document Frequency, IDF) 兩個指標。 詞頻 (Term Frequency, TF):衡量一個詞彙在單篇文檔中出現的頻率。詞頻可以通過計算詞彙在文檔中出現的次數,或者使用歸一化的詞頻計算公式來得到。 逆文檔頻率 (Inverse Document Frequency, IDF):衡量一個詞彙在整個文本集合中的普遍重要性。逆文檔頻率通過計算詞彙在文本集合中出現的文檔數量的倒數,並取對數來得到。這樣做的目的是對常見詞彙的重要性進行降低,並提高罕見詞彙的重要性。 TF-IDF 的計算公式如下:TF-IDF = TF * IDF 其中,TF表示詞頻,IDF表示逆文檔頻率。 TF-IDF 的應用主要有兩個方面: 文本檢索 (Information Retrieval):在文本檢索中,使用TF-IDF來計算詞彙對於給定查詢的相關性。詞彙的TF-IDF值越高,表示該詞彙在文檔中的重要性越高,並且與查詢的相關性越大。 文本特徵表示 (Text Feature Representation):在文本分析和機器學習中,使用TF-IDF來表示文本的特徵向量。將文本轉換為TF-IDF向量表示可以捕捉詞彙在文本中的重要性,並且有助於機器學習模型更好地理解和區分不同的文本。 14.4.1 Term-frequency word.tf <- tokenized.df %>% unnest(word) %>% count(cat, word, sort=T) %>% # mutate(total_words=sum(n)) %>% mutate(rank=row_number(), tf= n/sum(n)) 如果是跑histrogram因為不是常態分佈而是power-law分佈,通常會看不出什麼來 ggplot(word.tf, aes(tf, fill=cat)) + geom_histogram(show.legend = F) + xlim(NA, 0.0009) + scale_x_log10() + scale_y_log10() + facet_wrap(~cat, ncol=2, scales="free_y") 加上rank後可以看出最高rank到最後的差異,中段差不多,但是,相較於晚近的文章,早期文章用過很少次的字比較多,但用過很多次的字比較少。(是否可推論用字越來越貧乏?) word.tf %>% ggplot(aes(rank, tf, color=cat)) + geom_line(size=1.1, alpha=0.5) + scale_x_log10() + scale_y_log10() rank_subset <- word.tf %>% filter(rank < 500, rank > 10) lm_result <- lm(log10(tf) ~ log10(rank), data = rank_subset) lm_result$coefficients[[1]] ## [1] -1.739581 word.tf %>% ggplot(aes(rank, tf, color = cat)) + geom_abline(intercept = lm_result$coefficients[[1]], slope = lm_result$coefficients[[2]], color = "gray50", linetype = 2) + geom_line(size = 1.1, alpha = 0.8, show.legend = FALSE) + scale_x_log10() + scale_y_log10() 14.4.2 TF-IDF to filter significant words TF-IDF計算結果可以將原本的詞頻(TF)分布從一個長尾分佈轉變為一個呈現鐘形曲線的分佈。這種轉變使得我們能夠去除尾部,即刪除TF-IDF值很低的詞彙,從而重新優化我們要處理的詞彙集合。這樣的處理方式有兩個主要目的。 首先,透過刪除TF-IDF值很低的詞彙,我們可以去除那些在文本中出現頻率較低且普遍性較高的詞彙,這些詞彙對於區分不同文本的能力相對較低,因此可以忽略不計。 其次,我們可以僅保留大於平均值加上一個或兩個標準差的TF-IDF值較高的詞彙,這些詞彙可以作為有效辨識文章的關鍵字。這是因為這些詞彙在文本中出現的頻率較高,同時其與該文本的關聯性也相對較強。 透過這樣的過濾和選擇,我們可以得到一個更精簡且具有代表性的詞彙集合,這些詞彙能夠更好地描述和區分不同的文章。因此,使用TF-IDF計算結果進行這樣的處理,可以在文本分析和信息檢索等領域中提供更有價值的結果。 news_count <- tokenized.df %>% unnest(word) %>% count(doc_id, word) %>% bind_tf_idf(word, doc_id, n) %>% arrange(desc(tf_idf)) news_count %>% ggplot(aes(tf_idf)) + geom_histogram(bins = 100) + scale_x_log10() news_count %>% left_join(news.df, by="doc_id") %>% filter(!(word %in% c("NA"))) %>% group_by(cat) %>% arrange(desc(tf_idf)) %>% top_n(30, tf_idf) %>% ungroup() %>% mutate(word = reorder(word, tf_idf)) %>% ggplot(aes(word, tf_idf, fill = cat)) + geom_col(show.legend = FALSE) + labs(x = NULL, y = "tf-idf") + facet_wrap(~cat, ncol = 2, scales = "free") + coord_flip() + theme(axis.text.y=element_text(family="Heiti TC Light")) 14.4.3 Practice. Understanding TF-IDF TF-IDF也並非沒缺點,首先是會受到詞頻影響:TF-IDF主要依賴於詞頻作為計算的一部分,詞頻較高的詞彙往往具有較高的權重。這可能會導致在辨識關鍵字時,偏向於選擇出現頻率高的常見詞彙作為關鍵字,而忽略了一些在文本中出現頻率較低但具有重要性的詞彙。其次是長文本帶來的影響,在長文本中,由於詞彙的多樣性和詞彙數量的增加,TF-IDF計算可能導致高度稀疏的向量表示。這可能導致計算效率降低,並且在後續的處理和分析中增加了計算和存儲的負擔。 請就我們給的上述資料,選幾篇文章來觀察TF-IDF所抽出來的關鍵字,有哪一些真的是關鍵字?有哪一些不是呢?從TF和TF-IDF的數值來看,明明不是關鍵詞,但TF-IDF卻很高的誤判原因為何呢? "],["crawler-overview.html", "Chapter 15 Introduction to Web Scraping 15.1 Using Web API 15.2 Webpage Scraping 15.3 Using Chrome DevTools", " Chapter 15 Introduction to Web Scraping 爬蟲主要分為兩大類:一類是使用網站所提供的 API,另一類則是需要寫網頁爬蟲來剖析網頁。 第一類是使用網站所提供的 API,API 是指應用程式介面,是網站提供的一種接口,用戶可以通過 API 向網站發送請求,獲取網站數據。API 可以是 RESTful API、SOAP API、XML-RPC API 等等,使用 API 的好處是可以直接獲取需要的數據,且數據格式結構化,易於處理。不過使用 API 需要瞭解 API 的參數格式,而且不是所有網站都提供 API。常見且提供API讓客戶端來取用資料的社群網站服務包含: Google Maps API:提供地圖、地理位置等相關的 API。 Twitter API:提供關於 Twitter 的相關數據,包括推文、用戶資訊等。 Facebook API:提供關於 Facebook 的相關數據,包括用戶資訊、頁面資訊等。 GitHub API:提供關於 GitHub 的相關數據,包括存儲庫資訊、用戶資訊等。 OpenWeatherMap API:提供天氣資訊的 API。 YouTube API:提供關於 YouTube 的相關數據,包括影片、頻道等。 Spotify API:提供關於音樂的相關數據,包括歌曲、歌手等。 第二類是需要寫網頁爬蟲來剖析網頁,這種方法通常使用一些開源的爬蟲框架,如 Python 的 Scrapy 和 Beautiful Soup、R 的 rvest 等等。網頁爬蟲是通過模擬瀏覽器的方式,向網站發送請求,獲取網頁的 HTML 源代碼,然後使用相應的庫對 HTML 進行解析和剖析,獲取需要的數據。網頁爬蟲需要考慮很多因素,如網站的反爬機制、網頁的動態載入、網頁的解析方式等等,需要編寫複雜的代碼來處理這些問題。例如爬取國內外報紙的搜尋結果大多需要直接剖析網頁來找到所需要的資料。 15.1 Using Web API 使用 Web API 需要瞭解 JSON 檔案格式,JSON 是一種輕量級的數據交換格式,可以被多種語言解析和生成,是目前 Web API 應用中使用最廣泛的數據格式之一。JSON 的全稱是 JavaScript Object Notation,為基於 JavaScript 語言的一種文本格式,可以被解析為不同的資料型態,如數字、布林代數、字串、數值組和物件等。JSON 與 XML 相比,具有更輕量級、更容易讀寫和解析等優勢,也因此在 Web API 中被廣泛應用。 JSON 格式的基本結構是一個鍵-值對應(Key-Value)集合,其中每個鍵都是一個字串,每個值可以是數字、布爾值、字串、數組或對象等類型。例如,以下是一個簡單的 JSON 。在 JSON 中,可以使用大括號 {} 表示鍵值對應(Key-Value),使用中括號 [] 表示序列(類似R中的List),鍵和值之間用冒號 : 分隔以對應,不同的鍵值對之間用逗號 , 分隔。JSON可以是樹狀多階層的,即一個鍵的值可以是另一個 JSON物件的鍵值對應。 在 R 語言中讀取 JSON 檔案需要先將其轉換為 R 的物件。這可以使用 R 的 jsonlite 套件中的 fromJSON() 函數來實現。jsonlite 套件是一個方便解析 JSON 的工具,它提供了從 JSON 字符串到 R 物件之間的轉換功能。 { "name": "John", "age": 30, "isMarried": false, "hobbies": ["reading", "music", "movies"], "address": { "street": "123 Main St", "city": "Anytown", "state": "CA" } } 15.2 Webpage Scraping 網頁爬蟲是一種自動化工具,可用於收集網頁上的資料。想要寫出高效能、穩定的爬蟲程式,需要掌握以下基礎知識: HTML 和 CSS:這些是用於設計和呈現網頁的標準技術。HTML 是網頁的基礎架構,而 CSS 用於設計和美化網頁的外觀。例如了解了解 HTML 標籤和屬性的基本語法和用法,以及網頁的基本結構,例如 head、body、div、span、table、a 等等。並瞭解了解 CSS 的基本語法和用法,包括如何設置元素的樣式、顏色、字體、大小、邊框等等,以及常用的選擇器和屬性。 XPath 和 CSS 選擇器:XPath 和 CSS 選擇器是用於定位 HTML 元素的語言。XPath 是 XML 語言的一部分,而 CSS 選擇器是 CSS 的一部分。Chrome 瀏覽器的 Inspector 是一個強大的工具,可以幫助我們查找 HTML 元素的 XPath 和 CSS 選擇器。 HTTP 協議:HTTP 協議是網絡通信協議,用於網頁服務器和瀏覽器之間的通信。理解 HTTP 協議可以幫助理解網頁如何工作。例如最常見的HTTP回應代碼有「401 Unauthorized:未經授權,無法訪問所需內容」以及「404 Not Found:所請求的內容不存在」。 防止反爬:由於網站經常會採取反爬蟲措施,因此開發者需要學習如何繞過這些措施,例如使用代理服務器、設置間隔時間、更換用戶代理等。 15.2.1 HTTP Status Code 回應代碼用於向客戶端通報伺服器對請求的處理狀態,以便客戶端根據不同的回應代碼進行相應的處理。例如,當客戶端發送一個請求到服務器時,如果服務器返回的回應代碼是 200 OK,這意味著該請求已經成功處理,服務器已經返回所需的內容,客戶端可以根據返回的內容進行下一步操作;如果服務器返回的是 404 Not Found,這意味著客戶端所請求的內容不存在,客戶端需要提示用戶請求的資源不存在。以下是 HTTP 協議中常見的一些代碼: 1xx(Informational):這些代碼表示服務器已經接收到請求,但仍在處理中。 2xx(Successful):這些代碼表示請求已經成功處理。 3xx(Redirection):這些代碼表示客戶端需要採取進一步的操作才能完成請求。 4xx(Client Error):這些代碼表示客戶端發生了錯誤,請求無法完成。 5xx(Server Error):這些代碼表示服務器發生了錯誤,無法完成請求。 以下是常見的 HTTP 協議代碼: 200 OK:請求已經成功處理,並返回所需的內容。 301 Moved Permanently:請求的網頁已經永久轉移到新位置。 302 Found:請求的網頁暫時轉移到新位置。 400 Bad Request:請求的語法不正確。 401 Unauthorized:未經授權,無法訪問所需內容。 403 Forbidden:已經獲得授權,但仍無法訪問所需內容。 404 Not Found:所請求的內容不存在。 500 Internal Server Error:服務器內部錯誤,無法處理請求。 15.3 Using Chrome DevTools Chrome DevTools是一款由Google開發的網頁開發工具,可以幫助開發人員進行網頁測試、網頁性能分析、網頁設計等工作。DevTools提供了豐富的功能,包括元素查看器、Console、網絡監測器、源代碼編輯器等,可讓開發人員在開發過程中快速找到和解決問題。此外,DevTools還可以幫助開發人員模擬不同設備、網速,以及對網站進行性能分析和優化,提高網站的速度和使用體驗。 15.3.1 Observing web request 在開始網頁爬蟲之前,我們需要找到網頁中的JSON數據,以便進行後續的數據提取和處理。使用Chrome DevTools可以很容易地找到網頁背後的JSON檔案。以下是一些步驟: 打開Chrome瀏覽器,進入要爬取的網站。 按下F12鍵或右鍵點擊網頁上的任意位置並選擇「檢查」來開啟DevTools。 在DevTools中,選擇「Network」分頁。 在瀏覽器中執行您要查找JSON數據的操作,例如點擊一個按鈕或輸入一個查詢。 在DevTools的網絡監測器中,您可以看到所有網頁請求(Request)和回應(Response),包括我們感興趣的JSON檔案。如果您只想查看JSON請求,可以在過濾器中輸入「json」。 點選JSON請求,您可以查看Request和Response中的的詳細信息,包括URL、Headers、Request Payload和Response等。 在Response分頁中,您可以看到JSON數據的內容。如果JSON數據很大,您可以右鍵點擊JSON數據,然後選擇「Save Response As...」將其保存到本地檔案中。 "],["scraping-104.html", "Chapter 16 Scraping 104.com 16.1 Complete Code 16.2 Step-by-Step", " Chapter 16 Scraping 104.com 16.1 Complete Code 撰寫爬蟲時需要載入許多不同的函式庫,其中包括用於 HTTP 請求的httr,以及用於解析 JSON 數據的jsonlite。 httr:httr 庫是 R 語言中用於發送 HTTP 請求和處理 HTTP 響應的函式庫,它提供了一組簡單易用的函數,可以讓使用者方便地設置 HTTP 請求的各種參數,如 URL、HTTP 方法、HTTP 頭、HTTP 主體等,並處理 HTTP 響應的內容和狀態碼等。 jsonlite:jsonlite 庫是 R 語言中用於解析和生成 JSON 數據的函式庫,它提供了 fromJSON() 函數,可以將 JSON 字符串轉換為 R 物件,並提供 toJSON() 函數,可以將 R 物件轉換為 JSON 字符串。這個函式庫通常用於處理 API 回應數據中的 JSON 格式數據。 library(tidyverse) library(httr) library(jsonlite) # options(stringsAsFactors = F) all.df <- tibble() refer_url <- "https://www.104.com.tw" for(p in 1:10){ url <- str_c('https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&order=12&asc=0&page=', p, "&mode=s&jobsource=2018indexpoc") print(p) res <- GET(url, add_headers("referer"=refer_url)) %>% content("text") %>% fromJSON() res$data$list$tags <- NULL res$data$list$link <- NULL all.df <- bind_rows(all.df, res$data$list) } all.df$jobNo %>% unique %>% length 16.2 Step-by-Step 16.2.1 Get the first pages 這段程式碼是用於爬取104人力銀行網站上與「資料科學」相關的職缺資訊,並將其存儲到名為df2的Data.Frame中。首先,我們嘗試點選104人力銀行網站上的第1頁、第2頁和第3頁的職缺搜尋結果,並將這三個網址儲存為三個URL變量,應該不難觀察到,這三個網址有何差別?僅有page=1、page=2、page=3有所差別。接下來,我們使用R語言中的httr套件中的GET()函數,將URL作為參數傳入,從網站中獲取對應的數據,並使用fromJSON()函數將該JSON格式的內容轉換為R中的Data.Frame格式。下面程式在獲取第2頁數據時,使用了add_headers()函數設置了一個HTTP header,用於識別HTTP請求的來源。 這段程式碼使用了add_headers函數添加了一個名為「Referer」的HTTP header。這個header的作用是告訴104人力銀行網站,訪問這個頁面的用戶是從哪個網頁轉跳過來的,也就是告訴網站當前HTTP請求的來源。具體來說,這裡設置的「Referer」值為https://www.104.com.tw/,代表我們偽裝這個請求是來自於104人力銀行首頁。如果沒有這個Referer,該網站會認為你是一個可疑的爬取,從沒根據和不當的頁面或用不當的方式(例如爬蟲)連過來。 對的!人家網站不歡迎你爬它,所以我們應止於測試。 url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc" # Assigning the 2nd page data url to url2 url2 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&order=14&asc=0&page=2&mode=s&jobsource=2018indexpoc" # Assigning the 3rd page data url to url3 url3 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=3&mode=s&jobsource=2018indexpoc" # Getting back the url1 data, assigning to result1 res <- GET(url2, config = add_headers("Referer" = "https://www.104.com.tw/")) res1 <- content(res, "text") %>% fromJSON() result2 <- fromJSON(content(GET(url2), "text")) # Tracing variable result2 and finding the data.frame, assigning to df2 df2 <- res1$data$list 16.2.2 Get the first page by modifying url # Guessing the 1st page data url to url1 url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc" # Getting back the 1st page data url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc" result1 <- fromJSON(content(GET(url1), "text")) df1 <- result1$data$list 16.2.3 Combine two data with the same variables # all.df <- bind_rows(df1, df2) # will raise error # Error in bind_rows_(x, .id) : # Argument 31 can't be a list containing data frames 16.2.4 Drop out hierarchical variables Preserving numeric or character, dropping list of data.frame by assigning NULL to the variable # Drop list and data.frame inside the data.frame df1$link <- NULL df1$tags <- NULL df2$link <- NULL df2$tags <- NULL # Re-binding two data.frame df1 and df2 all.df <- bind_rows(df1, df2) 16.2.5 Dropping hierarchical variables by dplyr way # Getting the 1st page data and dropping variable tags and link # Assigning to df1 df1 <- result1$data$list %>% select(-tags, -link) # Getting the 2nd page data and dropping variable tags and link # Assigning to df2 df2 <- result2$data$list %>% select(-tags, -link) # binding df1 and df2 all.df <- bind_rows(df1, df2) 16.2.6 Finding out the last page number # Tracing the number of pages in result1 last_page_num <- result1$data$totalPage # Checking the availability of the last page # Examining if the last page data available by re-composing URL with paste0() url.last_page <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", last_page_num, "&mode=s&jobsource=2018indexpoc") # Getting back and parsing the last page data result.last_page <- fromJSON(content(GET(url.last_page), "text")) 16.2.7 Using for-loop to get all pages for(p in 1:last_page_num){ url <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", p, "&mode=s&jobsource=2018indexpoc") result <- fromJSON(content(GET(url), "text")) temp.df <- select(result$data$list) print(paste(p, nrow(temp.df))) } 16.2.8 combine all data.frame # The 1st url of the query url1 <- "https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=1&mode=s&jobsource=2018indexpoc" # Getting back the 1st page data result1 <- fromJSON(content(GET(url1), "text")) # Tracing and getting total number of page last_page_num <- result1$data$totalPage # Truncating hierarchical variables: link and tags all.df <- select(result1$data$list, -link, -tags) # for-loop to getting back data and joining them for(p in 1:last_page_num){ url <- paste0("https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=%E7%88%AC%E8%9F%B2&order=1&asc=0&page=", p, "&mode=s&jobsource=2018indexpoc") result <- fromJSON(content(GET(url), "text")) temp.df <- select(result$data$list) all.df <- bind_rows(all.df, temp.df) print(paste(p, nrow(all.df))) } "],["read_json.html", "Chapter 17 Read JSON 17.1 Reading JSON 17.2 Case 1: Air-Quality (well-formatted ) 17.3 Practices: traversing json data 17.4 Case 2: cnyes news (well-formatted) 17.5 Case 3: footRumor (ill-formatted) 17.6 Reviewing JSON 17.7 ", " Chapter 17 Read JSON jsonlite套件提供了處理 JSON 格式資料的功能。 # loading jsonlite package to parse a textual json file to an R object library(jsonlite) 17.1 Reading JSON 17.1.1 JSON as a string fromJSON('{\"a\":1, \"b\":2}')。 這是一個 JSON 物件,由一對大括號 {} 包圍。 該物件中有兩個鍵值對,用逗號 , 分隔。 第一個鍵值對中,鍵 a 對應的值為數字 1。 第二個鍵值對中,鍵 b 對應的值為數字 2。 fromJSON('[{\"a\":1, \"b\":2}, {\"a\":1, \"b\":3}]') 這是一個 JSON 陣列,由一對中括號 [] 包圍。 該陣列中有兩個元素,用逗號 , 分隔。 每個元素都是一個 JSON 物件,由一對大括號 {} 包圍。 第一個元素的 JSON 物件中,鍵 a 對應的值為數字 1,鍵 b 對應的值為數字 2。 第二個元素的 JSON 物件中,鍵 a 對應的值為數字 1,鍵 b 對應的值為數字 3。 library(jsonlite) lst <- fromJSON('{"a":1, "b":2}') class(lst) #list ## [1] "list" lst$a ## [1] 1 fromJSON('[{"a":1, "b":2}, {"a":1, "b":3}]') ## a b ## 1 1 2 ## 2 1 3 tbl <- fromJSON('[{"a":1, "b":2}, {"a":1, "b":3}, {"a":5, "b":7}]') class(tbl) # a data.frame ## [1] "data.frame" tbl$a[1] ## [1] 1 17.1.2 JSON as a local file 有時候JSON在編製的過程會記錄很多詮釋資料,所以不見得會把資料放在第一層,因此要嘗試去「trace」它才會知道資料在哪裡。例如以下範例是爬蟲爬回來的104職缺查詢結果,可猜想資料應放在如下結構中: { "data": { "list": [ ... ] } } library(jsonlite) raw <- read_json("data/url_104.json") raw$data$list[[1]] ## $jobType ## [1] "2" ## ## $jobNo ## [1] "10788904" ## ## $jobName ## [1] "約聘資料分析師(T45駐點食藥署)" ## ## $jobNameSnippet ## [1] "約聘<em class='b-txt--highlight'>資料分析</em>師(T45駐點食藥署)" ## ## $jobRole ## [1] "1" ## ## $jobRo ## [1] "1" ## ## $jobAddrNoDesc ## [1] "台北市南港區" ## ## $jobAddress ## [1] "" ## ## $description ## [1] "1.負責資料標準化、探勘及分析工作\\r\\n2.依客戶需求產出[[[資料分析]]]報告\\r\\n3.其他交辦工作" ## ## $optionEdu ## [1] "大學" ## ## $period ## [1] "00" ## ## $periodDesc ## [1] "經歷不拘" ## ## $applyCnt ## [1] "00005" ## ## $applyDesc ## [1] "0~5人應徵" ## ## $custNo ## [1] "97162640000" ## ## $custName ## [1] "關貿網路股份有限公司" ## ## $coIndustry ## [1] "1001001001" ## ## $coIndustryDesc ## [1] "電腦系統整合服務業" ## ## $salaryLow ## [1] "0033000" ## ## $salaryHigh ## [1] "0050000" ## ## $salaryDesc ## [1] "月薪 33,000~50,000元" ## ## $s10 ## [1] "50" ## ## $appearDate ## [1] "20191004" ## ## $appearDateDesc ## [1] "10/04" ## ## $optionZone ## [1] "9703424" ## ## $isApply ## [1] "0" ## ## $applyDate ## [1] "" ## ## $isSave ## [1] "0" ## ## $descSnippet ## [1] "1.負責資料標準化、探勘及分析工作\\r\\n2.依客戶需求產出<em class='b-txt--highlight'>資料分析</em>報告\\r\\n3.其他交辦工作" ## ## $tags ## $tags[[1]] ## [1] "上市上櫃" ## ## $tags[[2]] ## [1] "員工560人" ## ## ## $link ## $link$applyAnalyze ## [1] "//www.104.com.tw/jobs/apply/analysis?j=64404a2d3a4c445c3738406932343d208466649725c4c4627272727273e34402b826j52&channel=104rpt&jobsource=apply_analyze" ## ## $link$job ## [1] "//www.104.com.tw/job/6f8rs?jobsource=jolist_c_relevance" ## ## $link$cust ## [1] "//www.104.com.tw/company/18mw4ku8?jobsource=jolist_c_relevance" ## ## ## $jobsource ## [1] "jolist_c_relevance" ## ## $jobNameRaw ## [1] "約聘資料分析師(T45駐點食藥署)" ## ## $custNameRaw ## [1] "關貿網路股份有限公司" 17.1.3 JSON as a web file 當你使用手機上的 App 查看天氣、查詢公車路線、搜尋商品資訊時,你會注意到這些 App 看起來很不同,但它們都可以透過 Web API 來存取相同的資訊來源。簡單來說,Web API 就像是一種「資訊櫃檯」,提供存取資料的服務,它允許不同的應用程式通訊,以存取、分享、更新或刪除資料。透過 Web API,其他應用程式可以查詢、存取、下載、上傳、更新等操作資料,而不需要直接與資料庫或其他應用程式進行通訊。 舉例來說,一個網站可能有一個 Web API,它可以提供網站上所有文章的標題和內容。當其他網站或 App 需要獲取這些文章時,它們可以向該 Web API 發送請求,獲取所需資料。這樣就可以在不同的應用程式之間分享資料,提高效率和便利性。 Web API 和 JSON 之間的關係在於,Web API 通常會將回應資料以 JSON 的格式返回,以便接收方應用程式可以方便地解析和使用該資料。當一個應用程式需要從另一個應用程式獲取資料時,它可以透過 Web API 發送請求,並期望以 JSON 格式獲取回應。 如果該JSON是網頁伺服器所提供的Web API,以下程式碼示範了如何使用 R 語言中的 httr 和 jsonlite 套件,透過 HTTP GET() 請求獲取 Web API 所提供的 JSON 資料。以下是程式碼的解釋: GET(\"https://tcgbusfs.blob.core.windows.net/blobyoubike/YouBikeTP.json\") :使用 httr 套件中的 GET 函數來發送 HTTP GET 請求,並取得 Web API 所提供的 JSON 資料。 %>% content(\"text\") :content(\"text\") 表示將 HTTP 回應的資料轉換為純文字格式,便於後續處理。當我們把該純文字格式打開後,會發現他以JSON格式書寫。 %>% fromJSON() :一旦確認回傳的訊息以JSON格式書寫,那麼就可以用jsonlite套件的fromJSON()將該文字字串轉為R的物件。 library(httr) library(jsonlite) url <- "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json" ubike.df <- fromJSON(content(GET(url),"text", encoding = "utf-8")) head(ubike.df) %>% select(1:6) # write_json(ubike.df, "data/opendata_ubike_202304261243.json") 你可以讀取本書預先爬取好的json檔來觀察前述程式所爬回的json檔轉成R物件後的結果。 raw <- fromJSON("data/opendata_ubike_202304261243.json") raw$retVal[["0001"]] ## $sno ## [1] "0001" ## ## $sna ## [1] "捷運市政府站(3號出口)" ## ## $tot ## [1] "84" ## ## $sbi ## [1] "72" ## ## $sarea ## [1] "信義區" ## ## $mday ## [1] "20221030161036" ## ## $lat ## [1] "25.0408578889" ## ## $lng ## [1] "121.567904444" ## ## $ar ## [1] "忠孝東路/松仁路(東南側)" ## ## $sareaen ## [1] "Xinyi Dist." ## ## $snaen ## [1] "MRT Taipei City Hall Stataion(Exit 3)-2" ## ## $aren ## [1] "The S.W. side of Road Zhongxiao East Road & Road Chung Yan." ## ## $bemp ## [1] "12" ## ## $act ## [1] "1" 17.1.4 Practice. Convert ubike json to data.frame 當你把ubike的資料給載回來並轉為R的物件後,你會發現該物件是一層又一層的named list,也就是每個list或每個值都有他的名字(name)。這是因為原本ubike的JSON格式是一層又一層的dict(Dictionary),全部是key-to-value的對應。這也是一種常見的Web API編法。 本練習希望你做的便是,希望你把這個好幾個階層的list,轉為一個以列(Rows)為每筆資料,欄(Columns)為變項的data.frame。 17.2 Case 1: Air-Quality (well-formatted ) 前往 https://data.gov.tw/dataset/40448對JSON 檔案按右鍵,然後複製連結,例如 “https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON”。 (但是,連結地址,特別是 api_key=9be7b239-557b-4c10-9775-78cadfc555e9,每次都會更改。所以你必須要自己嘗試)。 url <- "https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON" df <- fromJSON(content(GET(url), "text", encoding = "utf-8")) df %>% glimpse() df$records %>% head() %>% knitr::kable(format = "html") 17.2.1 Using knitr::kable() for better printing df$records %>% head() %>% knitr::kable(format = "html") 17.2.2 Step-by-step: Parse JSON format string to R objects fromJSON(content(GET(url), \"text\", encoding = \"utf-8\"))由內到外有三個函式。 * httr::GET()按照指定的url發出GET request把網頁抓回來,如果是個合乎規定存取,就會順利取回該伺服器發的response。 * hrrt::content(response, \"text\", encoding = \"utf-8\") 用?content查詢看看content(response, \"text\")的用途。其是把抓回來的檔案,轉為純文字的字串。content()是把抓回來的response解成純文字(JSON本身就是以純文字儲存,只是格式特別而已)。 jsonlite::fromJSON() 因為我們用眼睛看就知道他是個JSON格式的檔案,所以用fromJSON()這個函式,把用JSON格式編成的字串轉為R的物件,有可能是data.frame或list。fromJSON()預期會把JSON中[]的每一個項目轉為一筆筆的資料,然後把{}的pair當成column的變數名稱 17.2.2.1 Step 1. GET() 發送請求 向該URL的伺服器發送GET() request以取得該檔案。若成功取得,他會回覆一個HTML status code(你可上網查詢看看有哪些Status code)。如果成功的話就是2開頭的數字例如200 OK代表該伺服器接受該請求並開始傳回檔案。 # Getting url back by GET() response <- GET(url) # Inspecting returned data response class(response) (Tips) Using ?httr::GET to inspect the function 17.2.2.2 Step 2. httr::content() 將回應資料的轉純文字 回應的資料看他的class是一個response,但如果看Global Environment看來是個list,裡面裝載很多資料,而主要核心的內容在content這個欄位,但看來是用binary code裝起來的,而不是純文字。 因此,對於這個抓回來的檔案,我需要用httr::content()幫忙把純文字給解出來。經查詢help可得知content()後面的參數有三類,其中可以要轉為純文字的就是content(response, \"text\")。因此偵測轉出來的變數會是長度為1的character。 # Parsing to textual data by content() text <- content(response, "text", encoding = "utf-8") nchar(text) cat(text) class(text) length(text) (Tips) using ??httr::content to inspect the function 17.2.2.3 Step 3. fromJSON(): 將JSON格式文字轉為R物件 最後是將這個character轉為R的物件,也就是data.frame或list。注意,此時text是一個character,那是我們知道他是用JSON格式編寫的文字檔,就像我們知道.csv檔是用逗號分隔表示法依樣,JSON就是用層層疊疊的[]{}記號來表述資料的結構。 並要提醒初學者,.json或.csv都只是幫助程式初步篩選檔案的副檔名罷了,這兩種類型的檔案跟.txt檔一樣,都被歸屬為Win系統所謂的「純文字文件檔案」(就打開以後看得到文字的意思)。裡面的究竟是不是個完整的json檔這都要去看、去測。我自然也可以在.json的檔案裡偷偷亂用逗號分隔模式撰寫。 df <- fromJSON(text) dim(df) glimpse(df) ?fromJSON 17.2.3 Combining all UVI Open data: https://data.gov.tw/dataset/6076 https://data.epa.gov.tw/api/v2/uv_s_01?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=publishtime desc&format=JSON 17.2.3.1 Get from web api # specify data url url <- "https://data.epa.gov.tw/api/v2/uv_s_01?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=publishtime%20desc&format=JSON" # GET(), content(), then converting to R object by fromJSON() raw <- fromJSON(content(GET(url), "text", encoding = "utf-8")) 17.2.3.2 Read from pre-saved JSON 你可以讀取本書預先爬取好的json檔來觀察前述程式所爬回的json檔轉成R物件後的結果。 # You can read the pre-crawled JSON file to observe the R object. raw <- fromJSON("data/opendata_uvi_202304261215.json") raw$records %>% head %>% knitr::kable() sitename uvi publishagency county wgs84lon wgs84lat publishtime 宜蘭 0.00 中央氣象局 宜蘭縣 121,45,24 24,45,50 2023-04-26 00:00 大武 0.00 中央氣象局 臺東縣 120,54,14 22,21,20 2023-04-26 00:00 玉山 0.00 中央氣象局 南投縣 120,57,34 23,29,15 2023-04-26 00:00 臺南 0.00 中央氣象局 臺南市 120,12,17 22,59,36 2023-04-26 00:00 新竹 0.01 中央氣象局 新竹縣 121,00,51 24,49,40 2023-04-26 00:00 日月潭 0.00 中央氣象局 南投縣 120,54,29 23,52,53 2023-04-26 00:00 預期結果 sitename uvi publishagency county wgs84lon wgs84lat publishtime 宜蘭 0.00 中央氣象局 宜蘭縣 121,45,24 24,45,50 2023-04-26 00:00 大武 0.00 中央氣象局 臺東縣 120,54,14 22,21,20 2023-04-26 00:00 玉山 0.00 中央氣象局 南投縣 120,57,34 23,29,15 2023-04-26 00:00 臺南 0.00 中央氣象局 臺南市 120,12,17 22,59,36 2023-04-26 00:00 新竹 0.01 中央氣象局 新竹縣 121,00,51 24,49,40 2023-04-26 00:00 日月潭 0.00 中央氣象局 南投縣 120,54,29 23,52,53 2023-04-26 00:00 17.3 Practices: traversing json data 下列這些網路文件應該都是json檔,請在以下的練習中,一個一個把他帶入把他抓回來看看。並用str()或dplyr::glimpse()觀察資料的內容。注意,如果你用了View()會沒辦法knit成html檔。又,每個不同的Web API存放的核心資料階層都不一樣,你必須要嘗試找到該多筆資料所在的data.frame。例如url_cnyes的資料便放在raw$items$data這樣的階層底下。 如果你無法順利撈取,你可以運用本書所預備的url_cnyes.json來做觀察json結構的練習。 url_pchome <- "https://ecshweb.pchome.com.tw/search/v3.3/all/results?q=iphone&page=1&sort=rnk/dc" url_ubike <- "https://tcgbusfs.blob.core.windows.net/blobyoubike/YouBikeTP.json" url_cnyes <- "https://news.cnyes.com/api/v3/news/category/headline?startAt=1588262400&endAt=1589212799&limit=30" raw <- fromJSON(content(GET(url_cnyes), "text", encoding = "utf-8")) # raw <- fromJSON("data/url_cnyes.json") raw$items$data 17.4 Case 2: cnyes news (well-formatted) 第二類是最常會見到的例子,解出來的資料是個很多階層的list,通常一筆資料傳回來時多會附加一些metadata,比方說,一共幾筆資料、下一個資料區塊在哪裡,好讓使用者或者本地端的瀏覽器能夠繼續取得下一筆資料。因此,資料通常會在樹狀節點的某一個子節點。 url_cnyes <- "https://news.cnyes.com/api/v3/news/category/headline?startAt=1588262400&endAt=1589212799&limit=30" res <- fromJSON(content(GET(url_cnyes), "text", encoding = "utf-8")) glimpse(res) raw <- fromJSON("data/url_cnyes.json") df <- raw$items$data head(df) ## newsId title ## 1 4475846 〈財報〉疫情衝擊 Under Armour Q1營收大減23% ## 2 4475874 若一年內疫情未控制 避險基金大佬:美國將面臨第2次經濟大蕭條 ## 3 4475873 〈美股早盤〉市場憂經濟重啟條件不成熟 道瓊早盤跌逾200點 ## 4 4475465 挽救國家財政危機 沙烏地撙節支出266億美元 ## 5 4475875 長榮攜手海大開輪機工程專班 實習後正職月薪15萬元 ## 6 4475855 泰鼎-KY首季每股純益 1.5元 僅次健鼎 ## content ## 1 <p>美國運動用品大廠 Under Armour (UAA-US) 於週一 (11 日) 盤前公佈 2020 財年第一季財報,受到新冠肺炎 (COVID-19) 疫情影響,導致零售業者被迫關閉店面,該公司於 Q1 營收及獲利雙雙不如市場預期。</p>\\n\\n<p>受到財報表現不佳的影響,Under Armour 股價應聲下跌,於週一 (11 日) 台北時間晚上 10 時許,該公司股價下跌 10.97%,報每股 8.85 美元。自今年以來,Under Armour 股價已下跌了 54%。</p>\\n\\n\\n\\n<p><em>基於 non GAAP 財報關鍵數據:</em></p>\\n\\n<ul>\\n<li>營收:9.302 億美元,較去年同期的 12 億美元衰退,且低於市場預估值 9.49 億美元</li>\\n<li>稅後淨損:5.897 億美元,去年同期報稅後淨利 2250 萬美元</li>\\n<li>每股虧損:0.34 美元,低於市場預估值每股虧損 0.19 美元,去年同期每股盈餘報 0.05 美元</li>\\n</ul>\\n\\n<p>由於疫情重創買氣,導致零售產業受到嚴重打擊,Under Armour CEO Patrik Frisk 表示,自 3 月中旬開始,疫情於北美地區快速蔓延,導致零售店面被迫關閉,並造成 Q1 營收大幅衰退 23%。</p>\\n\\n<p>根據不同產品類別來看,Q1 服裝銷售下滑了 23%,報 5.98 億美元,鞋類銷售下滑 28%,報 2.1 億美元,配件銷售則下滑 17%,報 6800 萬美元。</p>\\n\\n<p>根據不同銷售市場來看,Q1 北美營收下滑 28%,報 6.09 億美元,北美以外其他地區銷售則下滑 12%,報 2.87 億美元。北美地區的營收佔了 Under Armour 總營收的 65%。</p>\\n\\n<p>此外,該公司表示,截至第一季為止,該公司帳上現金為 9.59 億美元。另外,預估今年的資本支出金額將達 1 億美元,低於較先前所預估的 1.6 億美元。</p>\\n\\n<p>Under Armour 的營收成長,相當仰賴百貨公司等通路的銷售表現,但受到封鎖措施的影響,導致百貨公司被迫關閉。</p>\\n\\n<p><em>公司展望:</em></p>\\n\\n<p>隨著美國宣佈實施經濟重啟計劃,包括梅西百貨 (M-US) 及 GAP(GPS-US) 皆規劃逐步重新恢復營業,但 Under Armour 卻於週一 (11 日) 表示,對於營業恢復的時程尚不確定。</p>\\n\\n<p>此外,為了減輕疫情的衝擊,該公司計劃於 2020 年削減 3.25 億美元營運成本,包括暫時裁員部份零售店面的員工。由於疫情導致營運不確定性高,該公司已於上個月撤回了對於 2020 全年的財務預測。</p>\\n ## 2 <p>美國知名避險基金經理人、Tudor Investment Corp. 創辦人 Paul Tudor Jones 週一 (11 日) 警告,若疫情在一年之內無法獲得控制,美國經濟將會陷入「第二次」經濟大蕭條。</p>\\n\\n<p>Tudor Jones 表示:「若一年後我們依舊處於相同狀況,這將會形成第二次經濟大蕭條,這一切取決於封鎖措施是否解除。」</p>\\n\\n<p>相較於中國、南韓等國在疫情控制及追蹤方面的努力,美國人對於自由的重視,正可能成為防疫過程中的一大阻礙,美國公衛專家即警告,若疫情尚未明顯趨緩即解封經濟,那麼可能帶來第二波的疫情蔓延。</p>\\n\\n<p>Tudor Jones 說道:「與其他國家不同,我認為美國最大優勢在於個人主義,也就是對自由的熱愛,然而這在疫情之下卻是我們最大的弱點,看看在這方面取得成功的亞洲國家,他們的選擇顯示比起個人權利,他們更加重視社會價值觀。」</p>\\n\\n<p>由於投資人認為經濟終將重啟,美股在今年 3 月創下史上最快步入熊市的紀錄後,正自低點迅速反彈,標普 500 指數已自疫情爆發後的底點反彈 30% 以上,且和紀錄高點僅相差 13.6%。</p>\\n\\n\\n\\n<p>Tudor Jones 認為這波反彈相當容易預測,並強調未來走勢在很大程度上取決於疫情防控作業,重點將從流動性轉移到償債能力。</p>\\n\\n<p>「若還是無法找到疫苗或治療方法,或者是更適合的大規模檢測方案,市場將會面臨更加艱難的時刻。」Tudor Jones 表示。</p>\\n ## 3 <p>自上週以來,由於各國政府開始逐步放寬封鎖措施,並重新開放經濟活動,帶動美股呈現上揚的趨勢。但是,近日來部份國家傳出新冠疫情再度惡化的消息,除了南韓新增確診病例快速攀升之外,日本及新加坡的新增病例亦呈增加趨勢,顯示疫情的狀況仍不穩定,導致投資人不安情緒升溫,並衝擊了市場對於經濟重啟的信心。</p>\\n\\n<p>由於擔憂若過早重啟經濟,將可能冒著第二波疫情感染的風險,美股於週一 (11 日) 開盤 4 大指數皆下跌,另外,與疫情關聯性較高的產業,包括航空、零售、郵輪及賭場等,股價亦呈現下跌的趨勢,道瓊早盤下跌超過 200 點。</p>\\n\\n<p><em>新冠肺炎疫情</em></p>\\n\\n<p>英國首相強生 (Boris Johnson) 於上週日 (10) 宣佈了解除英國封鎖並重啟經濟的「首批謹慎步驟」,呼籲英國各地的人們重返工作崗位。強生強調,不會立即結束封鎖,但自週三 (13 日) 起,將放鬆對人們行動的限制,從戶外體育運動時間不再設限開始,例如高爾夫和網球,並允許人們開車前往公園和海灘。</p>\\n\\n<p>新冠疫情於西歐國家呈現放緩的跡象,但於俄羅斯卻日益嚴重,不僅連續數日的單日新增確診病例皆突破 1 萬例,且累計確診病例數已突破 20 萬例,並超越德國及法國,成為全球疫情第五嚴重的國家。</p>\\n\\n<p><em>中美貿易協議</em></p>\\n\\n<p>美國智庫戰略及國際研究中心 (CSIS) 上週五 (8 日) 發佈報告預計,新冠疫情將導致今年中國對美採購量遠低第一階段貿易協議的要求。</p>\\n\\n<p>美中矛盾因疫情衝擊而逐漸加劇,使外界對於第一階段貿易協議的現況感到疑慮,儘管兩國最高官員上週同意持續落實貿易協議,同時保持溝通協調,美國總統川普仍在上週五 (8 日) 表示,疫情衝擊大大改變他對於協議的觀感,對於是否終止協議感到相當掙扎。</p>\\n\\n<p><em>截至台北時間週一 (11 日)22 時許:&nbsp;</em></p>\\n\\n<ul>\\n<li>道瓊指數下跌 241.98 點或 -0.99%,暫報 24089.34 點</li>\\n<li>那斯達克下跌 44.12 點或 -0.48%,暫報 9077.20 點</li>\\n<li>標普 500 下跌 24 點或 -0.82%,暫報 2905.80 點</li>\\n<li>費半下跌 15.59 點或 -0.88%,暫報 1760.02 點</li>\\n<li>台積電 ADR 下跌 0.64% 至每股 52.53 美元</li>\\n<li>十年期美債殖利率上漲至 0.686%</li>\\n<li> 紐約輕原油上漲 0.97% 至每桶 24.98 美元</li>\\n<li>布蘭特原油下跌 0.16% 至每桶 30.92 美元</li>\\n<li>黃金下跌 0.41% 至每盎司 1706.85 美元</li>\\n<li>美元指數上漲 0.31% 至 100.078 點 &nbsp;</li>\\n</ul>\\n\\n\\n\\n<p><em>焦點個股:</em></p>\\n\\n<p><em>特斯拉 (TSLA-US)</em></p>\\n\\n<p>特斯拉早盤下跌 3.46%,達 790.68 美元。</p>\\n\\n<p>根據中國乘用車市場信息聯席會於週一 (11 日) 報告指出,儘管 4 月份中國整體電動車市場呈現成長的趨勢,但特斯拉平價車款 Model 3 的銷售,卻較 3 月份暴跌了 64%,由 10160 輛減少至 3635 輛。此外,特斯拉在今年 1 月至 4 月,於中國的 Model 3 車款累計銷售量則達 19705 輛。</p>\\n\\n<p>特斯拉執行長馬斯克 (Elon Musk) 於日前表示,為了使中國消費者能夠獲得電動車補貼的資格,已調降了 Model 3 於中國的銷售價格。此外,特斯拉亦致力於降低生產成本,因此,即使調降了銷售價格,該公司仍舊可以維持穩定的毛利率。</p>\\n\\n<p><em>蘋果 (AAPL-US)</em></p>\\n\\n<p>蘋果早盤下跌 0.80%,達 307.61 美元。&nbsp;</p>\\n\\n<p>據報導指出,蘋果正計劃將該公司近五分之一的產能從中國轉移到印度,並通過富士康和緯創資通等合作製造商,擴大印度當地的生產業務,未來五年內投資規模可能升至 400 億美元,也可能使印度成為蘋果商品最大出口國。</p>\\n\\n<p>數據顯示,蘋果的產品中有 90% 以上的產能來自中國。其中,iPhone 的代工生產很大一部分來自富士康與和碩。在 2015 年時,蘋果代工廠富士康就曾與印度達成備忘錄,同意加大對印度製造業的投資,並有計劃於 2020 年在印度建立 10 至 12 家製造消費電子產品的工廠。</p>\\n\\n<p><em>Under Armour (UAA-US)</em></p>\\n\\n<p>Under Armour 早盤下跌 7.95%,達 9.15 美元。</p>\\n\\n<p>美國運動用品大廠 Under Armour 於週一 (11 日) 盤前公佈 2020 財年第一季財報,受到疫情影響,導致零售業者被迫關閉店面,該公司於 Q1 營收衰退 23% 至 9.3 億美元。其中,服裝銷售下跌了 23%,鞋類銷售下滑 28%,配件銷售則下滑 17%。</p>\\n\\n<p>此外,疫情亦造成 Under Armour 獲利能力大幅下降,Q1 稅後淨損報 5.89 億美元,每股損失 0.34 美元。去年同期稅後淨利則為 2250 萬美元,每股盈餘為 0.05 美元。</p>\\n\\n<p><em>今日關鍵經濟數據:</em></p>\\n\\n<p><em>無</em></p>\\n\\n<p><em>華爾街分析:</em></p>\\n\\n<p>Vital Knowledge 創辦人 Adam Crisafulli 表示,全球經濟呈現逐步重啟的態勢,預期在接下來幾週,開放的速度將會加速,但儘管如此,目前 S&amp;P 500 的估值仍屬被高估的狀態。</p>\\n\\n<p>Principal Global Investors 經濟學家 Bob Baur 亦表示,全球疫情逐漸好轉的消息、以及對於經濟成長的預期,目前皆已被反映在股價的估值上。</p>\\n\\n<p>穆迪首席經濟學家 Mark Zandi 警告,各州過早重新開放企業是一次豪賭,如果因此出現第二波感染潮,將引發經濟蕭條。Zandi 表示,市場認為 V 型復甦的可能性很高,而隨著美國企業重新開放,就業有望從 5 月最後一週開始反彈,如果不出現第二波感染,就業增長將從夏季持續至秋季初。</p>\\n ## 4 <p>為挽救低油價及疫情帶來的國家財政危機,沙烏地阿拉伯週一 (11 日) 宣布自 6 月起停發生活津貼,同時將加值稅上調三倍,撙節支出總計 266 億美元。</p>\\n\\n<p>受外在因素衝擊,財政部長賈丹 (Mohammed Al-Jadaan) 認為沙國正處於財政危機邊緣,宣布縮減「願景 2030」(Vision 2030) 經濟改革計劃內的部分措施,國家將自 6 月 1 日起停發生活津貼,並自 7 月 1 日起將加值稅上調三倍至 15%,總計削減規模達 266 億美元。</p>\\n\\n<p>賈丹稱道:「肺炎疫情導致政府收入下滑,對公共財政形成的壓力來到難以應付的水平,將衝擊國家中長期宏觀經濟及公共財政,因此我們必須削減開支,並採取相關措施來支撐非石油收入的穩定。」</p>\\n\\n<p>賈丹上週警告,沙國已數十年沒有經歷這種嚴重危機,強調該國必須大幅削減支出。根據統計,今年第一季沙國預算赤字約達 91 億美元,光是石油收入就減少 350 億美元,非石油收入則減少 170 億美元。</p>\\n\\n<p>由於各國政府相繼頒布旅遊及封鎖禁令,沙國已受到油價暴跌和原油減產的深刻影響。今年 3 月,國際原油基準布蘭特原油暴跌逾 50%,導致沙國央行的淨海外資產每月損失 270 億美元,創下歷史紀錄,3 月外匯存底以 20 年幾年來最快速度下滑。</p>\\n\\n\\n\\n<p>儘管高盛預計第二季石油收入將持續下滑,高盛經濟學家 Farouk Soussa 仍表示,預計沙國外匯存底損耗速度將逐漸放緩。</p>\\n ## 5 <p>為擴大培育國籍海事專業人才,長榮海運 (2603-TW) 今 (11) 日宣布,與國立台灣海洋大學再度合作開辦學士後多元專長培力方案(輪機工程學系專班),希望透過產業與學術密切合作,培養有志投身海勤工作的學員,並可在畢業後隨即就業,長榮指出,一旦正式成為長榮的海勤人員,月薪約 15 萬元。</p>\\n\\n<p>長榮說明,此專班的招生對象為非輪機科系畢業的學員,只要具備學士資格,役畢或免服兵役者皆可報考,通過遴選後開始就讀,修業時間為三學期,長榮海運將全額補助學雜費和部分住宿費用,自 5 月 12 日起開放報名,預計 9 月正式開學。</p>\\n\\n<p>而此方案是為配合長榮永續發展的專業人才需求,透過不同的管道來擴大培育優秀的國籍海事尖兵,並不影響海事科系學生到長榮實習和工作的機會。</p>\\n\\n<p>長榮於 2017 年開始與海洋大學開辦第一期學士後輪機技術人才專班,該期學員已於去年畢業,並有超過 90% 的學員通過交通部的航海人員一等管輪測驗,陸續上船實習;部分學員已依規定累積一年的實習資歷,取得管輪適任證書,正式成為長榮的海勤人員,月薪約 15 萬元,未來隨著海勤年資與經驗增加,並通過相關測驗,可逐級晉升為輪機長,月薪將達 28-30 萬元的水準。</p>\\n\\n<p>除了優渥的薪資外,長榮強調,貨櫃船隊提供舒適的住艙環境,並有圖書室、健身房、三溫暖及影音娛樂等設施,以及無線網路。</p>\\n ## 6 <p>PCB 廠泰鼎 - KY(4927-TW) 今 (11) 日公布日首季稅後純益達 2.85 億元,每股純益為 1.5 元,在已公布 2020 年第一季財報的 PCB 廠中,僅次健鼎 (3044-TW) 的每股純益 1.86 元,第三名則是臻鼎 (4958-TW) 的 0.97 元。</p>\\n\\n<p>泰鼎 2020 年首季營收 26.05 億元,毛利率 21%,季增 6 個百分點,年增 2 個百分點,稅後純益 2.85 億元,季增 5.06 倍、年增 11.8%,為單季次高,每股純益&nbsp;1.5 元,也優於去年同期&nbsp;1.43 元。</p>\\n\\n<p>泰鼎 4 月營收 10.14 億元,月增 23.2%、年增 28.4%,為 9 個月新高,也創單月歷年同期新高; 累計今年前 4 月營收 36.19 億元,年減 0.5%。</p>\\n\\n<p>展望第二季,泰鼎在 PC、家電、汽車、通訊四大區塊接單順利,預估營收相對第一季 26.05 億元,將雙位數成長。</p>\\n\\n<p>泰鼎目前在泰國擁有每月 500 萬平方呎 PCB 產能,第 3 廠已經動工,全部完工後每月將再增加 180 萬平方呎新產能。</p>\\n ## hasCoverPhoto isIndex ## 1 0 1 ## 2 0 1 ## 3 0 1 ## 4 0 1 ## 5 1 1 ## 6 1 1 ## summary ## 1 Under Armour (UAA-US) 於週一 (11 日) 盤前公佈 2020 財年第一季財報,受到新冠肺炎 (COVID-19) 疫情影響,導致零售業者被迫關閉店面,該公司於 Q1 營收及獲利雙雙不如市場預期。 ## 2 美國知名避險基金經理人、Tudor Investment Corp. 創辦人 Paul Tudor Jones 週一 (11 日) 警告,若疫情在一年之內無法獲得控制,美國經濟將陷入「第二次」經濟大蕭條。 ## 3 由於擔憂若過早重啟經濟,將可能冒著第二波感染的風險,美股於週一 (11 日) 開盤 4 大指數皆下跌,另外,與疫情關聯性較高的產業,包括航空、零售、郵輪及賭場等,股價亦呈現下跌的趨勢。道瓊指數下跌超過 200 點。 ## 4 為挽救低油價及疫情帶來的國家財政危機,沙烏地阿拉伯週一 (11 日) 宣布自 6 月起停發生活津貼,同時將加值稅上調三倍,撙節支出總計 266 億美元。 ## 5 長榮攜手海大開輪機工程專班 實習後正職月薪 15 萬元 ## 6 PCB 廠泰鼎 - KY(4927-TW) 今 (11) 日公布日首季稅後純益達 2.85 億元,每股純益為 1.5 元,在已公布 2020 年第一季財報的 PCB 廠中,僅次於健鼎 (3044-TW) 的每股純益 1.86 元,而第三為臻鼎。 ## isCategoryHeadline video payment ## 1 1 0 ## 2 1 0 ## 3 1 0 ## 4 1 0 ## 5 1 0 ## 6 1 0 ## otherProduct ## 1 USS:UAA:STOCK:COMMON, USS:M:STOCK:COMMON, USS:GPS:STOCK:COMMON ## 2 ## 3 TWS:2330:STOCK:COMMON, USS:TSLA:STOCK:COMMON, USS:AAPL:STOCK:COMMON, USS:UAA:STOCK:COMMON, USS:TSM:STOCK:COMMON ## 4 ## 5 TWS:2603:STOCK:COMMON ## 6 TWS:4927:STOCK:COMMON, TWS:3044:STOCK:COMMON, TWS:4958:STOCK:COMMON ## isOutsource publishAt ## 1 0 1589211902 ## 2 0 1589209204 ## 3 0 1589205268 ## 4 0 1589204403 ## 5 0 1589203838 ## 6 0 1589203802 ## coverSrc.xs.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/xs/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/xs/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.xs.width coverSrc.xs.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 100 56 ## 6 100 56 ## coverSrc.s.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/s/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/s/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.s.width coverSrc.s.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 180 101 ## 6 180 101 ## coverSrc.m.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/m/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/m/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.m.width coverSrc.m.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 380 214 ## 6 380 214 ## coverSrc.l.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/l/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/l/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.l.width coverSrc.l.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 640 360 ## 6 640 360 ## coverSrc.xl.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/xl/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/xl/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.xl.width coverSrc.xl.height ## 1 NA NA ## 2 NA NA ## 3 NA NA ## 4 NA NA ## 5 960 539 ## 6 960 540 ## coverSrc.xxl.src ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 https://cimg.cnyes.cool/prod/news/4475875/xxl/8602ccaee38d54e5bb148e1cca3eb4bf.jpg ## 6 https://cimg.cnyes.cool/prod/news/4475855/xl/0e09778efa0a69a77710b8986c0d958a.jpg ## coverSrc.xxl.width coverSrc.xxl.height categoryId fundCategoryAbbr etf ## 1 NA NA 831 NULL NULL ## 2 NA NA 831 NULL NULL ## 3 NA NA 831 NULL NULL ## 4 NA NA 833 NULL NULL ## 5 1080 607 827 NULL NULL ## 6 960 540 827 NULL NULL ## fbShare fbComment fbCommentPluginCount ## 1 0 0 0 ## 2 0 0 0 ## 3 0 0 0 ## 4 0 0 0 ## 5 0 0 0 ## 6 0 0 0 ## market ## 1 NULL ## 2 NULL ## 3 2330, 台積電, TWS:2330:STOCK ## 4 NULL ## 5 2603, 長榮, TWS:2603:STOCK ## 6 4927, 3044, 4958, 泰鼎-KY, 健鼎, 臻鼎-KY, TWS:4927:STOCK, TWS:3044:STOCK, TWS:4958:STOCK ## source ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 ## 6 17.4.1 (option) 取回資料並寫在硬碟 有時候寫爬蟲尤其是在爬會即時更新的資料時,會需要反覆定時地抓資料,這時候通常會先通通抓回來再慢慢合併整理。此時要特別注意如何保持每次抓回來的資料都是獨特的一個資料。以下面的例子來講,因為每次檔名都是一樣的,他會一直覆蓋過去,所以再怎麼抓,都不會是歷時性資料。通常會自動讀取當下時間當成檔名的一部分,這樣就不會重複了。這將在日後youbike的例子中用到。 response <- GET(url_cnyes, write_disk("data/url_cnyes.json", overwrite=TRUE)) 17.5 Case 3: footRumor (ill-formatted) 食品闢謠的例子可能是個沒好好編過JSON的單位所編出來的案子,資料很簡單,但卻是一個list裡面有329個data.frame,且每個data.frame只有對腳現有資料,然後每一筆資料就一個data.frame。 url <- 'http://data.fda.gov.tw/cacheData/159_3.json' safefood <- fromJSON(content(GET(url),'text')) # write_json(safefood, "data/opendata_safefood_202304261256.json") 為了避免產製本書時出錯,本程式採用預備好的資料來練習。但仍建議你用前述方式自網路上爬取資料下來練習。 safefood <- fromJSON("data/opendata_safefood_202304261256.json") # str(safefood) class(safefood) ## [1] "list" class(safefood[[1]]) ## [1] "data.frame" dim(safefood[[1]]) ## [1] 5 5 # View(safefood[[1]]) # View(safefood) # print(content(GET(url), "text")) 17.5.1 處理非典型的JSON檔 但這時候也不難觀察到其規律性。既然每個data.frame是一筆資料,且資料都是照順序出現在對角線,那我就把data.frame給unlist()拆成vector後,把NA給移除了,那剩下的就是我們要的資料了。 但,由於對整筆資料unlist(),那整筆資料會變成一個很長的vector,不過我們知道每五個元素就是一筆資料。所以我可以嘗試用matrix()的指令,讓資料每五個就折成一筆資料。 程序大致上是 safefood.v <- unlist(safefood) 把資料unlist()。 safefood.v <- safefood.v[!is.na(safefood.v)]剔除NA值 safefood.m <- matrix(safefood.v, byrow = T, ncol = 5)照列來折,因為每五個就一筆資料,所以是照列折,然後用ncol = 5來指定五個一折。 # unlist data structure to a list safefood.v <- unlist(safefood) head(safefood.v) ## 分類1 分類2 分類3 分類4 分類5 標題1 ## "" NA NA NA NA NA # anyNA() to check if NAs still exist anyNA(safefood.v) ## [1] TRUE # (option) check if NAs exist sum(is.na(safefood.v)) ## [1] 10720 # remove NAs safefood.v <- safefood.v[!is.na(safefood.v)] # length(safefood.v) # double-check NAs anyNA(safefood.v) ## [1] FALSE # head(safefood.v) # convert vector to matrix safefood.m <- matrix(safefood.v, byrow = T, ncol = 5) # ?matrix # convert matrix to dataframe safefood.df <- as.data.frame(safefood.m) # delete the 4th column safefood.df <- safefood.df[-4] # naming the data.frame names(safefood.df) <- c('category', 'question', 'answer', 'timestamp') head(safefood.df) ## category question ## 1 使用含有acetaminophen成分藥品會傷腎,是真的嗎? ## 2 使用退燒藥會延誤治療,是真的嗎? ## 3 美國全面禁止2歲以下幼兒使用感冒藥及退燒藥嗎? ## 4 凡士林(Petrolatum)會致癌,請問是真的嗎? ## 5 市售護唇膏多含石蠟,長期使用可能致癌,是真的嗎? ## 6 含藥化粧品比一般化粧品效果更好嗎? ## answer ## 1 解答: Acetaminophen 是一種中樞作用型解熱鎮痛藥品,在正常健康狀況下,使用正常的建議劑量(成人每日不超過4000 毫克,兒童每日每公斤不超過50 毫克,分多次服用,每次至少間隔4 小時),並不會引起腎毒性。有少數報告顯示當急性過量使用時,會導致腎功能不良,但多為可逆性,如果慢性大量使用,才有嚴重腎臟傷害的可能性。 根據國外報告,成人長期持續使用1 年以上,而且累積劑量超過1 公斤(以一般每顆500 毫克的成人劑型而言,相當於2000 顆)時,可能導致嚴重腎臟傷害。此外,過量使用acetaminophen 或併服酒精性飲料時,具有肝臟損傷之風險。因此使用該成分藥品,應依照仿單或醫師指示使用,且避免長期持續使用或同時飲用酒精。 本文案為食藥署與臺灣兒科醫學會共同撰文 ## 2 解答: (1)發燒為一種症狀,並非病因,瞭解引起發燒之原因遠比退燒重要。因此,出現發燒症狀時,應立即就醫治療,以瞭解導致發燒的原因,切勿自行購買退燒藥使用,以免延誤疾病之治療。 (2)退燒藥之使用,主要目的是減緩因發燒出現之不適感。當發燒超過38.5° C且有不舒服的感覺,可適當給予退燒藥,但不一定要讓體溫降到正常範圍。 本文案為食藥署與臺灣兒科醫學會共同撰文 ## 3 解答: 美國食品藥物管理局並未完全禁止2 歲以下幼兒使用退燒藥或感冒藥,而是強調應在醫師指示下使用。美國分析兒童使用感冒藥產生的嚴重不良反應,主要是因為美國民眾可於藥局自行購買成藥,家長因為沒有劑量觀念,可能導致藥物過量而使幼兒發生危險。我國對於該類藥品之使用建議與國外一致,且中文仿單已註明「幼兒應洽醫師診治,不宜自行使用」,強調感冒藥必須經由專業醫師診治後,方能用於2 歲以下幼兒。 幼兒的生理發展尚未健全,必須特別注意藥物劑量。因此,無論中藥或西藥,幼兒使用藥品一定要經熟悉兒科專業的醫師評估其臨床效益及風險,並依幼兒之體重年齡處方適當劑量。家長依循專業醫師處方使用藥物,比較不會發生腎毒性等不良反應。 本文案為食藥署與臺灣兒科醫學會共同撰文 ## 4 解答: 凡士林(Petrolatum) 成分常被用於髮蠟、髮乳、潤膚霜、冷霜、唇膏、乳液等化粧品中,該成分安定性佳且歐盟、美國、日本等國的化粧品均未禁止使用凡士林成分,更可用於食品及口服藥品中,做為油性鎖水保濕劑使用。 提醒大家不要被謠言所誤導,選擇適合自己的產品,瞭解成分的用途與使用方式,才是保養身體的關鍵。 ## 5 解答: 石蠟是護唇膏、各種保濕保養化粧品的常見的成分,目前國際間均允許該成分可添加於化粧品中。化粧品中使用之石蠟已經精製,而精製過後的石蠟安定性佳,更可用於食品及口服藥品中。 食藥署提醒大家,不要被謠言所誤導,選擇標示完整及適合自己的產品,瞭解成分的用途與使用方式,才是保障自身權益的關鍵。 ## 6 解答: (1)我國所謂的「含藥化粧品」,實際上為含有衛生福利部公告的「化粧品含有醫療或毒劇藥品基準」成分之化粧品,主要針對添加前述基準成分之染髮劑、燙髮劑、止汗制臭劑等產品加強安全性管理,與化粧品的效果無關。 (2)目前含藥化粧品依規定需於進口或上市前辦理查驗登記,取得許可證後始得輸入、製造及販售。 (3)民眾在選購含藥化粧品前,可先上食藥署首頁>業務專區>化粧品>含藥化粧品許可證查詢作業,查詢該含藥化粧品是否已取得許可證,才可安心購買。 相關連結: 西藥、醫療器材、含藥化粧品許可證查詢作業http://www.fda.gov.tw/mlms/H0001.aspx (另開視窗) ## timestamp ## 1 06 25 2015 12:00AM ## 2 06 25 2015 12:00AM ## 3 06 25 2015 12:00AM ## 4 06 25 2015 12:00AM ## 5 06 25 2015 12:00AM ## 6 06 25 2015 12:00AM 17.6 Reviewing JSON 17.6.1 Type I: Well-formatted JSON: UVI, AQI, Hospital_revisits 這類的資料以典型的[{}, {}, {}]形式儲存,以以下方式就可直接轉為data.frame df <- fromJSON(content(GET(url), \"text\")) 17.6.2 Type II: hierarchical JSON: rent591, facebook graph api, google map 這類的json資料為well-formatted,但要的資料儲存在比較深的階層中,代表其並非簡單地二維表格,還有其他更多的詮釋資料被擺在同一個JSON檔案中。解決策略:通常fromJSON()轉完後為list,逐一就variable names查看資料在哪裡。View(res$data$data) 17.6.3 Type III: Ill-formatted JSON: food_rumors, ubike 這類的資料並非以典型的[{}, {}, {}]形式儲存,但仍是有序的二維數據。可將資料unlist()攤開,然後去除不必要的NA後,按欄位數目重建Matrix再轉回data.frame 解決策略:用as.data.frame()或unlist()硬轉成data.frame或vector來看資料的出現是否有所規律。 17.7 "],["html-parser.html", "Chapter 18 HTML Parser 18.1 HTML 18.2 Detecting Element Path", " Chapter 18 HTML Parser 本章已經介紹了如何讀取XLSX、CSV、JSON檔等常見的開放資料,也可以讀取來自各種網站的資料,例如104、信義房屋、Dcard、facebook、Google Map API、Flickr API、Twitter Rest API等等。但是有些網站不是以資料檔案的方式提供資料,而是直接由伺服器端傳回整個網頁,例如PTT網頁版、不動產實價登錄網站、政府標案決標資訊等等。對於這些網頁,我們需要使用HTML剖析器來解析網頁並獲取其中的資料。 大多數網頁都是由多個<div>、<table>或<li>等標籤層層巢套組成,包括導覽元件、廣告、標題、分類等等各種資訊,而我們需要的資料僅佔其中的一小部分,因此必須要撰寫HTML剖析器,找到目標的HTML標籤,將其獲取回來。 這些網站的HTML標籤通常會巢套很多層,甚至會動態更改巢套的階層以防止被爬取。但是如果仔細觀察,就會發現其中有一些規律性,例如新聞搜尋結果通常包括標題、簡要內文、時間和圖片等元素。瀏覽器發出搜尋請求後,伺服器會傳回一個HTML檔案,並且會傳回一些CSS或JavaScript來指示瀏覽器如何視覺化這個HTML檔案。因此,這個HTML和CSS是在傳回你的瀏覽器後視覺化成網頁的模樣,如果看起來有規律性,那就意味著有一套規律性是設計來讓程式知道如何視覺化這些標題或內容,以便使它們看起來具有一定的規則性。這套規則主要由HTML標籤和屬性組成,使我們可以使用CSS選取相同規則的元件,將之視覺化為相同的樣子。 因此,在進行網頁爬蟲時,我們需要了解HTML和CSS,並學習如何使用CSS Selector和XPath這兩種方法選取HTML元素。CSS Selector和XPath是兩種定義路徑的方法,它們可以通過選擇器(selector)定位HTML元素,以便選取一個或多個條件相同的元素。 CSS Selector是CSS中的一個語法,可以根據HTML元素的標籤名稱、屬性、類別、ID等條件選取對應的元素。舉例來說,可以使用以下CSS Selector選取所有標籤名稱為div的元素:div,或選取所有class屬性為test的元素: .test。 XPath則是XML Path Language的縮寫,是一種用於選擇XML文件中元素的語言,同樣可以用於HTML文件的選擇。XPath使用路徑表達式來定位元素,可以根據標籤名稱、屬性、位置等多種條件進行選擇。例如,以下XPath可以選擇所有標籤名稱為div的元素://div,或選取所有class屬性為test的元素://*[@class='test']。 掌握CSS Selector和XPath的使用,可以讓我們更加靈活地獲取網頁上的元素,並且能夠解析複雜的HTML結構,提取出需要的資料。 18.1 HTML HTML檔案的結構大致如下: 首先會有一個檔案類別的宣告<!DOCTYPE html>,用以告訴第三方瀏覽器或應用程式說這是一個HTML5檔案; 再來是成對標籤所組成的巢套結構,下例即有一對<html></html>包著一對<head></head>和一對<body></body>。 另外<!---->包著的內容為註解,瀏覽器或程式遇到該區段的內容會略過不處理。 下圖可用以說明HTML檔案的巢套(一層包一層)結構(圖片來源https://www.w3schools.com/html/html_intro.asp)。 18.2 Detecting Element Path Chrome DevTools的使用如下: 打開Chrome瀏覽器,進入要爬取的網站。 按下F12鍵或「右鍵」點擊網頁上的任意你感興趣的內容並選擇「檢查(Inspector)」來開啟DevTools。 在DevTools中,選擇「Elements」分頁。Elements分頁用於查看和修改網頁的HTML和CSS,以及網頁中的DOM元素。在Elements分頁中可以看到網頁中所有的HTML標籤和屬性,以及網頁中的DOM樹狀結構。程式寫作者可使用此功能來檢查和修改網頁元素,例如更改元素的文本、樣式或屬性,或者添加、刪除或重新排列元素。Elements分頁還提供了選擇元素和檢查元素屬性的工具,便於快速找到和解決網頁問題。此外,Elements分頁還具有許多有用的功能,例如網頁渲染性能分析、Box-Model、色彩選擇器等,可幫助使用者更好地理解和設計網頁。 在「Elements」分頁中找到你要查找的元素,例如一個按鈕或一個超連結。你可以輕點一下Elements中的任意元素,然後按「Ctrl/Cmd+F」就可以搜尋在Elements分頁中的內容。例如你感興趣的是網頁上的「下一頁」三個字,那你搜尋「下一頁」就可以找到相對應的元素。或者,你可以在「Elements」分頁開啟的狀況下,用右鍵輕點左側原始網頁中你感興趣的內容或元素,然後再次選擇「檢查(Inspector)」,此時「Elements」分頁就會自動跳到你感興趣的內容或元素。 在DevTools的選擇元素面板中,右鍵點擊選擇的元素,然後選擇「Copy」>「Copy XPath」或「Copy」>「Copy selector」。 將複製的XPath或CSS Selector粘貼到您的爬蟲程式中,以查找和提取相應的數據。 18.2.1 XPath XPath是一種用於定位和選擇XML文檔中元素的語言,也可以應用於HTML文檔。XPath使用路徑表達式來選擇文檔中的節點或節點集,這些路徑表達式可以是絕對的或相對的,可以根據元素名、屬性、節點位置等進行篩選。XPath提供了一種簡單而強大的方式來編寫網頁爬蟲,使得開發者能夠精確地定位需要提取的數據,進而進行數據清洗和分析。 以下是一個XPath的例子:考慮一個HTML文檔,其中有一個表格,表格中包含多個行和列,每一個單元格包含一些數據。如果我們想要提取表格中第一行第一列的數據,可使用//table/tr[1]/td[1]。這個XPath表達式由以下幾個部分組成: //table: 選擇文檔中的所有表格元素。 /tr[1]: 選擇表格中的第一行。 /td[1]: 選擇第一行中的第一列。 18.2.2 CSS Selector CSS Selector是一種用於定位和選擇HTML元素的語言,它可以根據元素的屬性、標籤名稱、類名稱等進行篩選和定位。CSS Selector同樣也是網頁爬蟲中經常使用的一種定位方式。和XPath相比,CSS Selector的寫法更加簡潔和直觀,因此在一些簡單的定位場景中,使用CSS Selector可以更加方便和快捷。但是,在一些複雜的定位場景中,XPath可能更加適合,因為它可以根據節點的位置等進行更加精確的篩選。 用CSS Selector如前面XPath的例子來選擇表格中第一行第一列:table tr:first-child td:first-child。這個CSS Selector由以下幾個部分組成: table: 選擇文檔中的所有表格元素。 tr:first-child: 選擇表格中的第一行。 td:first-child: 選擇第一行中的第一列。 "],["ptt-scrape.html", "Chapter 19 Scraping PTT 19.1 Step 1. 載入所需套件 19.2 Step 2. 取回並剖析HTML檔案 19.3 Step 3. 用for迴圈打撈多頁的連結 19.4 Step 4. 根據連結取回所有貼文 19.5 補充(1) 較好的寫法 19.6 補充(2) 最佳的寫法", " Chapter 19 Scraping PTT 在爬取HTML之前,你要先知道的是,資料如何被放在巢套元素的HTML檔案中,而Attribute(尤其是id和class和<a>的href)又如何提供線索給CSS Selector或XPath來選取我們所要的元素,最後要知道XPath和CSS Selector的用途是用來選取你所需要的HTML中的資料。 以下以ptt boy-girl版為例,展示如何以爬蟲擷取網頁上的資料,並整理成DataFrame。PTT的網頁分為兩種主要類型, 其一稱為鏈結頁或索引頁,為文章的超鏈結,例如https://www.ptt.cc/bbs/Boy-Girl/index.html。 其二為每一篇文章的內容頁https://www.ptt.cc/bbs/Boy-Girl/M.1523994970.A.71C.html。 對於這種網頁,要設計兩階段的爬蟲,第一階段是把所有所需鏈結撈回來,第二階段是根據撈回來的鏈結去打撈文章,並把裡面的內文整理出來。對於第一階段而言,概念大概如下面的示意圖,其實爬取HTML的概念都差不多是這樣,但以下示意圖說明了用XPath或CSS Selector「分別」選取出整個頁面中的標題、超鏈結、時間、和作者,然後用data.frame()組合成一個DataFrame;Page 2也如此炮製,然後把Page 2的DataFrame用bind_rows()附加在Page 1的DataFrame後面。 19.1 Step 1. 載入所需套件 在這個例子中,不僅要用httr來取得網頁頁面,還要用rvest套件(其實是呼叫xml2)來剖析網頁。網頁內容並不像json一樣可以直接轉為DataFrame或list。網頁內容可以是資料、視覺化元素、也可以是架構元素,相對於json而言複雜也冗贅許多。因此需要一個套件能夠剖析HTML標籤例如xml2,而rvest內則應用了xml2套件的內容來剖析網頁,另外,我會用bind_rows()將過程中所抓取的資料進行合併。 library(tidyverse) library(rvest) library(httr) 19.2 Step 2. 取回並剖析HTML檔案 在從HTML檔案中打撈出我們所要的資料有三個重要的rvest函式(步驟),分別為: read_html()依照網址將網頁取回並轉為xml_document。 html_nodes() 用CSS Selector或XPath選擇所需的資料節點,另外html_node()是只取滿足條件的第一個節點。 html_text()或html_attr()或html_table()、html_tags()取出所要抓的節點的目標資料,可能是一個表格、一個標籤內容、或者是一個屬性值。 19.2.1 Step 2-1. read_html() 將網頁取回並轉為xml_document read_html()內部包含了GET()與content()等的實作,其主要的功能是將取回來的回應(response)轉為xml_document。若以class(doc)觀察其型態,會是xml_document xml_node。 使用browseURL(url)可以用瀏覽器打開該網址並瀏覽。 url <- "https://www.ptt.cc/bbs/Boy-Girl/index.html" doc <- read_html(url) class(doc) ## [1] "xml_document" "xml_node" browseURL(url) 19.2.2 Step 2-2 以html_nodes() 以選擇所需的資料節點 html的檔案還包含了相當多其他視覺、互動、排版的標籤,因此通常只有少部分是資料,且存在層層的html元素中。因此,獲取到該網頁並轉為xml_document後,便要用html_nodes()或html_node()根據所給的CSS Selector或XPath來選擇所要取出的節點中的資料。要獲取該元素的CSS Selector可以利用Chrome DevTool或者是Firefox。用法是對著該網頁空白處按右鍵選擇檢查(insepect)。 以下用CSS Selector抽取: #指的是id、.指的是class。 #main-container意思是,某個id為main-container的元素。 .title指的是某個class為title的元素。 div.title指的是class為title的div(排版元素)。 Div.r-list-container.action-bar-margin.bbs-screen指的是同時具有r-list-container、action-bar-margin、bbs-scree三個class的div元素。 css <- "#main-container > div.r-list-container.action-bar-margin.bbs-screen > div > div.title > a" node.a <- html_nodes(doc, css) class(node.a) # "xml_nodeset" length(node.a) 用XPath抽取: path <- '//*[@id="main-container"]/div[2]//div/div[3]/a' node.a <- html_nodes(doc, xpath = path) links <- html_attr(node.a, "href") 19.2.3 Step 2-2 補充說明與XPath、CSS Selector的最佳化 用CSS Selector和XPath抽取有一些經驗法則,以PTT為案例來說的話,原本複製得來的CSS Selector和XPath分別為 CSS Selector:#main-container > div.r-list-container.action-bar-margin.bbs-screen > div:nth-child(3) > div.title > a XPath://*[@id=\"main-container\"]/div[2]/div[3]/div[2]/a PTT貼文目錄頁面的HTML結構。 到html之間,有一個id為#main-container的div。所以從div#main-container開始取即可。通常確定有id後,我就會開始找重複項,這邊的重複項是class為r-ent的div,找到重複項後,我就會去找重複項後面到我要的資料的路徑,而我們要的<a>就在class為title的div中。所以一個簡化的路徑是div#main-container div.r-ent div.title a。 但在這邊,既然有id,就不在乎是什麼元素會有id,所以可以只寫#main-container,而也只有資料在的div才有.r-ent的class,所以也不用強調前面的div,至於.title前面一定是搭div的元素,所以我可以簡化到寫為#main-container .r-ent .title a。甚至,由於.r-ent一定在#main-container裡面,所以連前面的id我都可以省略掉。 如果用XPath來寫的話,照上面的邏輯應該要寫成//*[@id=\"main-container\"]//div[@class=\"r-ent\"]/div[@class=\"title\"]/a。注意到第二個div前有兩個斜線//,原因是#main-container和.r-ent之間還有一層div,兩個斜線代表前後兩者間還有其他層,如果沒有兩個斜線而只有一個斜線的話,那就是代表#main-container下面一層馬上就要是.r-ent,若你把它改成單斜線的話,就會發現取不到資料。 以政府招標為範例來解釋 最終要抓的資料節點為何?主要為<a href=\"...\">的href屬性值和<a>底下<div>中的內容。 觀察資料在哪個節點「逐筆」出現?這邊是<tr>(table row),<td>則是資料欄位 利用id和class來辨識:遇到有id就從id開始取就好,例如#searchResult。 中間的節點多可以忽略:例如這個CSS selector可省略寫為#searchResult tr a 政府招標網站的HTML結構 19.2.4 Step 2-3 html_text()或html_attr()轉出所要的資料 我們所要的資料為<a href=\"/bbs/Boy-Girl/M.1523983903.A.71E.html\">[心情] 看到自己喜歡女生跟別的男生走很近好難過</a>中的超鏈結和標題文字。 html_text(): 在<a>與</a>之間的[心情] 看到自己喜歡女生跟別的男生走很近好難過稱為<a>的元素內容,要用html_text(node.a)來抽取。 html_attr(): 在<a>內的href=\"/bbs/Boy-Girl/M.1523983903.A.71E.html\"稱為<a>的屬性,該屬性名稱為href(Hyper Reference的意思),屬性值為/bbs/Boy-Girl/M.1523983903.A.71E.html。要用html_attr(node.a, \"href\")來抽取(相當於指定某個元素的href屬性的內容)。 取出元素節點的內容,相當於取出<a></a>間所夾的內容。 texts <- html_text(node.a) length(texts) 取出元素節點某個屬性的值,這邊是取出href這個屬性的值,也就是超鏈結。 links <- html_attr(node.a, "href") class(links) # character links[1] # "/bbs/Boy-Girl/M.1555188846.A.D5F.html" 但這些超鏈結只有後半段,點開一篇文章觀察其網址,發現我們所抓到的網址少了前面那一段,因此用paste0()黏上前綴的網址前段,便可得到完整網址,可用browseURL(links[1])觀察。 pre <- "https://www.ptt.cc" links <- paste0(pre, links) links[1] # [1] "https://www.ptt.cc/bbs/Boy-Girl/M.1555188846.A.D5F.html" 重組上列程式碼如下: pre <- "https://www.ptt.cc" url <- "https://www.ptt.cc/bbs/Boy-Girl/index.html" doc <- read_html(url) css <- "#main-container div.r-ent div.title a" node.a <- html_nodes(doc, css) 題外話,因為rvest與httr均支援tidyverse的程式寫作,因此可改為以下pipeline的形式。但我不見得會這麼寫,比如說<a>這個元素我可能不僅會取出其超鏈結,還打算取出標題文字,為了避免重複操作,我不見得會用tidyverse來寫。 pre <- "https://www.ptt.cc" url <- "https://www.ptt.cc/bbs/Boy-Girl/index.html" links <- url %>% read_html %>% html_nodes("#main-container div.r-ent div.title a") %>% html_attr("href") %>% paste0(pre, .) 19.3 Step 3. 用for迴圈打撈多頁的連結 我們可以觀察到PTT該版的鏈結頁的網址規則如下 最新頁:https://www.ptt.cc/bbs/Boy-Girl/index.html 倒數第二頁:https://www.ptt.cc/bbs/Boy-Girl/index3902.html 倒數第三頁:https://www.ptt.cc/bbs/Boy-Girl/index3901.html 倒數第四頁:https://www.ptt.cc/bbs/Boy-Girl/index3900.html 最新一頁因此可類推出為https://www.ptt.cc/bbs/Boy-Girl/index3903.html 因此,我打算寫一個for迴圈,讓他幫我(先)抓最後10頁,那就是3894到3903頁。並且,把頁數當成網址的參數,用sprintf()或paste0()組合出網址,以下分別提供兩種版本。你可以把它印出來且點選看看是否是你所要的網頁。 for(p in 3894:3903){ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p) # url <- paste0("https://www.ptt.cc/bbs/Boy-Girl/index", p, ".html") } 接下來,我要用一個all_links變數來存放所有的網址,並且把每一個頁面抓到的網址們都用vector的concatenation,也就是c()黏在一起 all_links <- c(all_links, links)。 all_links <- c() for(p in 3894:3903){ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p) all_links <- c(all_links, links) } 最後,我就將上述抓到網址的方法填入這個for迴圈中,並把抓到的網址存為links,就會隨著每回合的for迴圈逐漸把抓到的網址整理在一起。 pre <- "https://www.ptt.cc" all_links <- c() for(p in 3894:3903){ url <- sprintf("https://www.ptt.cc/bbs/Boy-Girl/index%s.html", p) print(url) doc <- read_html(url) # Get and parse the url css <- "#main-container div.r-ent div.title a" node.a <- html_nodes(doc, css) links <- html_attr(node.a, "href") links <- paste0(pre, links) # Recover links all_links <- c(all_links, links) } length(all_links) 19.4 Step 4. 根據連結取回所有貼文 前面是針對每一個頁面的網址取回該頁面中所有的貼文鏈結,所以我現在all_links中是所有的貼文鏈結。我可以仿照前面的做法,就每一個貼文鏈結,取回貼文內容,貼文內容可能包含作者、時間、標題、版別、內文等資料欄位 不失一般性地,用第一篇貼文的鏈結來做資料抓取實驗,之後再抓第二篇、第三篇即可。 首先,對於這每篇文章,我要爬取作者(author)、標題(title)、時間(time)、看板(board)和內容(content)五個欄位,包含原本文章的連結url一共六個欄位。 從以下的圖發現,每篇文章的內容放置在div#main-content中,之後一連跟著四個div.article-metaline,裡面分別有作者、看板、標題與時間,但從class名稱看不出來哪個,但我們要的值會是在span.article-meta-value中。所以我的規劃是,一次把所有的.article-meta-value給抓回來,然後再去分別指定哪個是作者、看板、標題或時間。所以我用 link <- all_links[1] doc <- read_html(link) meta.css <- "#main-content div.article-metaline span.article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) PTT貼文的HTML結構 另外,從上面的文字中可發現,主文的部分被包含在div#main-content中,但在上述的作者、標題等後面,若這時候我們用CSS Selector搭配html_node()和html_text()把div#main-content的內容都給取出來,會連上述的作者、標題等都一起取出來。最好的方法是用XPath的text()來只取出文字的部分,而不取出有tag的部分。 而且這樣取出來會是每個paragraph都是一個character vector中的值,所以要把他們合併成一篇文章,此時要用paste()指令,paste()指令可以指定把一個character vector給串接成一個string,輸入的變數是一個character vector,然後設定參數collapse = ““,代表串接起這些character時中間不要有空白。 post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") 最後,我們知道metadata變數的第一個是作者、第二個是標題、第三個是時間、便依序指派給個別的變數後,組成DataFrame如下,這樣所組成的DataFrame是為只有一筆資料的DataFrame,但有五個變項。 link <- all_links[1] doc <- read_html(link) meta.css <- "#main-content div.article-metaline span.article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") post.df <- data.frame(post, uid = metadata[1], title = metadata[2], timestamp = metadata[3], url = link ) 這樣我們取得的第一篇文章存放在post.df中,之後,我稍微修改一下上述的程式,就可以用for迴圈抓取第2至n篇文章,每一篇都存在名為temp.df的DataFrame中,然後用bind_rows()依序和post.df銜接在一起,除了黃色的部分是新增的之外,都跟前面的程式幾乎一模一樣。 for(link in all_links[2:10]){ doc <- read_html(link) meta.css <- "#main-content .article-metaline .article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") temp.df <- data.frame(post, uid = metadata[1], title = metadata[2], timestamp = metadata[3], url = link ) post.df <- bind_rows(post.df, temp.df) } 打撈回來的HTTP資料 19.5 補充(1) 較好的寫法 一個比較好的寫法是,不用先讀第一篇文章,而是用data.frame()初始化一個空的DataFrame,之後可以利用bind_rows()可自動增添缺少的變數的特性,自然就會補上所需要的變數。因此,只要改寫黃色的部分。 但這樣的寫法仍會有一個缺點,也就是當文章數越來越多時會越跑越慢。原因是,假設現在你已經抓了9999篇文章,你這次的for迴圈要抓第10000篇,然後用bind_rows()合併第10000篇,此時,post.df已經有9999篇非常肥大,等號右邊的bind_rows()跑完後會變成10000篇,此時又要把原本很肥大的post.df覆蓋掉,所以會非常費時。 post.df <- data.frame() for(link in all_links[1:10]){ doc <- read_html(link) meta.css <- "#main-content .article-metaline .article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") temp.df <- data.frame(post, uid = metadata[1], title = metadata[2], timestamp = metadata[3], url = link ) post.df <- bind_rows(post.df, temp.df) } 19.6 補充(2) 最佳的寫法 採用list先將每一個DataFrame存放起來,然後跑完所有的for迴圈後才用bind_rows()將所有資料合併為DataFrame。此時,p指的是第幾個連結,而前例的link就相當於下方的all_link[p]。 post.list <- list() for(p in 1:length(all_links)){ doc <- read_html(all_links[p]) meta.css <- "#main-content .article-metaline .article-meta-value" metadata <- html_text(html_nodes(doc, meta.css)) post.xpath <- '//*[@id="main-content"]/text()' post.paragraph <- html_text(html_nodes(doc, xpath = post.xpath)) post <- paste(post.paragraph, collapse = "") post.list[[p]] <- data.frame(post, uid = metadata[1], title = metadata[2], timestamp = metadata[3], url = all_links[p] ) } post.df <- bind_rows(post.list) "],["lebron.html", "Chapter 20 NYT: LeBron James Achievement 20.1 Get top250 players 20.2 Scraping live scores 20.3 Cleaning data 20.4 Visualization 20.5 Scraping and cleaning 20.6 (More) Scraping all players", " Chapter 20 NYT: LeBron James Achievement 這個案例的靈感來自於紐約時報於2023年2月7日所發布的一篇新聞「How LeBron James Outscored Kareem Abdul-Jabbar and All the N.B.A. Greats」。該篇新聞的破題點在於LeBron James 打破 Kareem Abdul-Jabbar 的紀錄,成為 NBA 歷史上得分王,這是許多人認為無法達成的成就。今年 38 歲的 James,本季平均每場比賽可以攻下 30.2 分,以 38,390 分超越了 Abdul-Jabbar 的 38,387 分。Abdul-Jabbar 以 sky hook 聞名,而 James 則透過多種得分方式積累分數,包括近年來在聯盟中日益盛行的三分球。James 的長壽、創意、天賦和能力讓他達成了這個成就。但實際上,這篇新聞同時也凸顯了 NBA 在過去50年的演變。 這篇新聞中運用了NBA球員與球賽資料庫中250名頂尖球員的資料來繪製視覺圖表,頂尖球員援引該網站的定義,為歷年的每場平均得分(PTS)。其用了折線圖、長條圖、散佈圖等多種視覺呈現方法,並採用了多項指標來凸顯LeBron James的成就,包含年齡、累積得分數、場均得分數、三分球與二分球的比例等。 除了資料視覺化外,這個案例也是相當好的爬蟲練習,可用R語言的rvest套件來爬取https://www.basketball-reference.com/網站的球員資料,包含每個球季的比分,甚至著名球員每場的得分和進球數等等。該網站的網頁多為具有id的HTML表格,相對來說爬取難度較低,但如果要仿照該篇新聞來製作視覺圖表,需要爬取多個頁面的資料,反而是訓練學生從篩檢資料到產生新聞的一個好範例。 20.1 Get top250 players 事實上我是知道有NBA球員比分網站的,看到這則新聞時我就去線上查找了相關的網站https://www.basketball-reference.com。而且該網站的球員資料是表格形式,代表我們可以用一些比較方便的函式(html_table())直接將該表格的內容轉為data.frame。 但目前(2023/04/01)的球員數共有五千多人,我們不可能將所有的球員通通繪製在圖上,反而會影響我們看到重要的訊息,因此要有效且有意義地減少要視覺化的資料量。這有幾種策略,一種是根據目的取出想要比較的球員、一種是直接設一個閥值(例如職涯超過15年的約90人),一種是看看該資料網站上有沒有列出一些頂尖球員名單。(猜想)紐約時報用的是該網站上的Top 250,因此第一個步驟要做的就是先把要分析的這250名球員的名冊爬取下來,之後再逐一爬取每個球員的資料紀錄。 這段程式碼的目的是從網站 “https://www.basketball-reference.com%22 中提取出排名前幾位的籃球員生涯表現數據,以及每個球員的個人資料頁面連結。Top 250球員的頁面網址為https://www.basketball-reference.com/leaders/per_career.html。 現在,我們可以使用rvest套件中的read_html()函數讀取網頁的 HTML 內容,該。接著傳遞給下一個函數html_node(),並指定要選取的 HTML 元素 ID 為nba。這個 ID 代表了包含球員表現數據的表格。最後,使用html_table() 函數提取表格資料並將結果存入top_players變數中。 read_html(url) 函數是 rvest 套件中的一個函數,它可讀取指定網址的 HTML 內容,以轉換為R的物件。 html_node() 函數則可用於選擇 HTML 內容中的指定元素。指定元素的方法是使用XPath或CSS Selector,本範例採用的是CSS Selector。若所要選取的同類型元素大於一個,那就要使用html_nodes(),所取得的結果會存入一個由1開始編號的List。 如果前一個步驟所指定的元素恰巧是一個表格的話,那我們就可以使用html_table()直接將表格轉換為一個R的data.frame,但如果不是表格的話,就必須要搭配使用html_text()或html_attr()來取出指定元素中的所需內容。 做完html_table()後的dataframe存於top_players,該dataframe共有三個變項:Rk(Rank)、PER(每場平均得分)、Player(球員名)。但該dataframe中缺少球員資料頁面的連結,所以需要另外再爬取一次球員名中的連結。取得的方式還是那三個步驟 read_html():取得該url的網頁內容並轉為R的物件。 html_node()/html_nodes():選取所需的HTML元素。此時我們要娶的是#nba這個表格中每一列<tr>的第二欄<td>中的超鏈結<a>。 html_text()/html_attr()/html_table():抽取所選取的HTML元素內容。此時要抽取的是<a>中的超鏈結,也就是<a>的href屬性(Attribute),所以要用html_attr(\"href\")。 抽取出來的連結往往是相對於主要連結的後半段,因此,最後要將所取得的連結黏接在主頁連結的後方,如str_c(url.base, .)。 url.base <- "https://www.basketball-reference.com" url <- "https://www.basketball-reference.com/leaders/per_career.html" top_players <- read_html(url) %>% html_node("#nba") %>% html_table() top_players$plink <- read_html(url) %>% html_node("#nba") %>% html_nodes("tr td:nth-child(2) a") %>% html_attr("href") %>% str_c(url.base, .) top_players 20.2 Scraping live scores https://www.basketball-reference.com/players/c/chambto01.html 20.2.1 Testing: Scrape one url <- "https://www.basketball-reference.com/players/c/chambto01.html" table2 <- read_html(url) %>% html_node("#per_game") %>% html_table(convert=T) 20.2.2 Scrape life time scores of all top-250 players # pinks <- long_players$plink plinks <- top_players$plink totals <- tibble() for(i in 1:length(plinks)){ plink <- plinks[i] message(sprintf("[%s] ", i), plink) table <- read_html(plink) %>% html_node("#totals") %>% html_table() table$plink <- plink totals <- bind_rows(totals, table) Sys.sleep(sample(1:2, 1)) } 20.3 Cleaning data top250 <- totals %>% filter(str_detect(Season, "\\\\d{4}-\\\\d{2}")) %>% left_join(top_players, by="plink") %>% select(-(34:53)) %>% select(-31) %>% mutate(year = year(paste0(str_sub(Season, 1, 4), "-01-01"))) %>% mutate(PERyear = PTS/G) %>% group_by(plink) %>% arrange(Age) %>% mutate(cumPTS = cumsum(PTS)) %>% ungroup() 20.4 Visualization Load pre-save data load("data/nba_players.rda") 20.4.1 Line: Age x cumPTS library(gghighlight) selected_players <- c("Michael Jordan*", "LeBron James", "Kobe Bryant*", "Wilt Chamberlain*", "Kareem Abdul-Jabbar*", "Stephen Curry") top250 %>% ggplot() + aes(Age, cumPTS, group=Player) + geom_line() + gghighlight(Player %in% selected_players) + theme_bw() + theme(legend.position = "none") 20.4.2 Line: year x cumPTS top250 %>% ggplot() + aes(year, cumPTS, group=Player) + geom_line() + gghighlight(Player %in% selected_players) + theme_bw() + theme(legend.position = "none") 20.4.3 Line: Age x PER_by_year top250 %>% ggplot() + aes(Age, PERyear, group=Player) + geom_line() + gghighlight(Player %in% selected_players) + theme_bw() + theme(legend.position = "none") 20.4.4 Comparing LeBron James and Jabbar 20.5 Scraping and cleaning # plink <- "https://www.basketball-reference.com/players/j/jamesle01.html" plink <- "https://www.basketball-reference.com/players/a/abdulka01.html" loglinks <- read_html(plink) %>% html_node("#totals") %>% html_nodes("tr th a") %>% html_attr("href") %>% paste0(url.base, .) logtable <- tibble() for(link in loglinks){ table <- read_html(link) %>% html_node("#pgl_basic") %>% html_table() logtable <- bind_rows(logtable, table) message(nrow(logtable), link) } jabbar.log <- logtable %>% select(Rk, G, Date, FG, `3P`, FT, PTS) %>% mutate(Rk = as.numeric(Rk), FG = as.numeric(FG), `3P` = as.numeric(`3P`), FT = as.numeric(FT), PTS = as.numeric(PTS)) %>% filter(!is.na(PTS)) %>% replace(is.na(.), 0) %>% mutate(try = FG + `3P` + FT) %>% mutate(FGperc = FG/try, P3perc = `3P`/try, FTperc = FT/try) %>% mutate(gid = row_number()) 20.5.1 VIS LJames and jabbar james.log %>% pivot_longer(names_to = "type", cols = c("FGperc", "P3perc", "FTperc"), values_to = "perc") %>% ggplot() + aes(gid, perc, fill = type) + geom_area() + theme_bw() jabbar.log %>% pivot_longer(names_to = "type", cols = c("FGperc", "P3perc", "FTperc"), values_to = "perc") %>% ggplot() + aes(gid, perc, fill = type) + geom_area() + theme_bw() top250 %>% group_by(Player) %>% summarize(FGsum = sum(FG), FTsum = sum(FT), P3sum = sum(`3P`)) %>% ungroup() %>% replace(is.na(.), 0) %>% mutate(trials = FGsum + FTsum + P3sum) %>% mutate(FGperc = FGsum/trials, FTperc = FTsum/trials, P3perc = P3sum/trials) %>% ggplot() + aes(FGperc, P3perc) + geom_point() + geom_text(aes(label = Player), hjust = -0.1) + gghighlight(Player %in% selected_players) + theme_bw() + theme(aspect.ratio = 2/3) save(jabbar.log, james.log, top_players, top250, totals, file="../data/nba_players.rda") 20.6 (More) Scraping all players 20.6.1 Testing url <- "https://www.basketball-reference.com/players/x/" table.path <- read_html(url) %>% html_node("#players") table <- table.path %>% html_table() table$pid <- table.path %>% html_nodes("tbody th") %>% html_attr("data-append-csv") table$plink <- table.path %>% html_nodes("tbody th a") %>% html_attr("href") %>% str_c("https://www.basketball-reference.com",.) 20.6.2 Scrape from a-z except x(no x) # letters[c(1:23, 25:26)] players <- tibble() for(letter in letters[c(1:23, 25:26)]){ url <- str_c("https://www.basketball-reference.com/players/", letter, "/") print(url) table.path <- read_html(url) %>% html_node("#players") table <- table.path %>% html_table() table$pid <- table.path %>% html_nodes("tbody th") %>% html_attr("data-append-csv") table$plink <- table.path %>% html_nodes("tbody th a") %>% html_attr("href") %>% str_c("https://www.basketball-reference.com",.) players <- bind_rows(players, table) } "],["visualization-1.html", "Chapter 21 Visualization 21.1 ggplot2 21.2 VIS packages 21.3 Case Gallery", " Chapter 21 Visualization 21.1 ggplot2 ggplot2和Python的matplotlib都是常用的視覺化套件,但在設計上有一些主要的差異。首先,ggplot2是基於grammar of graphics的設計原則,而matplotlib則是基於pyplot-style的設計風格。這意味著ggplot2更加著重於資料和視覺化之間的關係,並且提供了一個統一的語法來描述這些關係,而matplotlib則更加注重對於底層圖形物件的控制。其次,ggplot2支持更多的圖形屬性,例如數值變數、類別變數、時間序列等等,並且可以輕鬆地進行層疊圖、面積圖等高級視覺化技巧,而matplotlib則需要手動設置較多的屬性來達到類似的效果。此外,ggplot2在設計上更加注重美學和可讀性,因此預設的圖形風格更加美觀且易於閱讀,而matplotlib的預設風格則比較簡單,需要進行額外的設置才能達到類似的效果。 21.2 VIS packages 除了ggplot2本身之外,尚有相當多基於ggplot或tidyverse風格的視覺化套件,如: ggraph:ggraph是一個基於ggplot2的視覺化套件,專門用於網絡和關係圖的繪製,提供了多種佈局和美學風格的選擇。 ggmap:ggmap是一個基於ggplot2的地圖繪製套件,可以將Google Maps、OpenStreetMap等地圖數據與ggplot2圖形整合起來,方便進行地理位置相關的資料視覺化。 ggridge:ggridge是一個基於ggplot2的視覺化套件,專門用於繪製ridge plots,也就是密度圖的一種變形。它可以幫助使用者更好地展示數據的分佈和趨勢。Introduction to ggridges (r-project.org) ggthemes:ggthemes是一個基於ggplot2的視覺化套件,提供了多種高質量的主題風格和顏色調色板,可以讓使用者快速改善圖表的外觀和可讀性。 ggnatimate:ggnatimate用於將ggplot所產製的圖表多增加一個變量以轉製為動態圖表,支持多種動畫效果。 ggally:ggally是一個基於ggplot2的視覺化套件,提供了多種高級散點圖和數據矩陣的繪製方式,方便使用者進行多變量分析和資料探索。 ggrepel:ggrepel是一個基於ggplot2的視覺化套件,用於解決文字標籤重疊的問題,可以自動調整文字標籤的位置,使其更加易讀和美觀。 21.3 Case Gallery 21.3.1 WP: Paid Maternity Leave (產假支薪): barplot 原始新聞來源:The world is getting better at paid maternity leave. The U.S. is not. - The Washington Post。該篇報導提及,美國因為目前的政策不保障帶薪產假,許多女性感到必須在工作和照顧家庭之間做出選擇,這種性別不平等破壞了她們在工作機會上的平等機會。同時,世界各地的婦女待遇正在逐漸改善。至少190個國家對嬰兒的母親規定了某種形式的帶薪假期,產假待遇在56個國家有所提高。專家表示,現在美國城市和州正通過不同形式的帶薪家庭假法案,這顯示美國雇主正在展示有競爭力的福利不會影響員工表現。特別是科技公司,如Twitter、Facebook和Google等,處於提供員工帶薪產假福利的前沿,美國可能有望追趕其他國家。 21.3.2 NYT: Population Changes Over More Than 20,000 Years: Coordinate, lineplot 紐時這篇報導「When Did the Anthropocene Start? Scientists Closer to Saying When. - The New York Times (nytimes.com)」討論了人類活動對地球所產生的深遠影響,並探討人類是否已經進入了一個新的地質時期,被稱為「人新世」。報導指出,人類的經濟活動、能源消耗和人口增長是人新世的主要因素,並且這些因素已經在地球上留下了不可磨滅的痕跡。報導也提到,地質學家已經發現了人新世的證據,包括核爆炸中的鈽同位素、肥料中的氮和發電廠的灰燼等。然而,報導也問道,人新世是否真的已經開始,以及它的開始點是否應該是農業革命、工業革命、核彈(77年前)或其他發展。 21.3.3 NYT: LeBron James’ Achievement: Coordinate, lineplot 這個案例的靈感來自於紐約時報於2023年2月7日所發布的一篇新聞「How LeBron James Outscored Kareem Abdul-Jabbar and All the N.B.A. Greats」。該篇新聞的破題點在於LeBron James 打破 Kareem Abdul-Jabbar 的紀錄,成為 NBA 歷史上得分王,這是許多人認為無法達成的成就。今年 38 歲的 James,本季平均每場比賽可以攻下 30.2 分,以 38,390 分超越了 Abdul-Jabbar 的 38,387 分。Abdul-Jabbar 以 sky hook 聞名,而 James 則透過多種得分方式積累分數,包括近年來在聯盟中日益盛行的三分球。James 的長壽、創意、天賦和能力讓他達成了這個成就。但實際上,這篇新聞同時也凸顯了 NBA 在過去50年的演變。 21.3.4 Taiwan Village Population Distribution: Coordinate, lineplot 以下我打算繪製出每個村里在15歲以上的人口數,來呈現台灣有些村里人口相當稀少,尤其是花蓮縣、澎湖縣、南投縣和宜蘭縣的幾個聚落。並標記出幾個人口數最高的里。如果我的目的是呈現村里人口數的統計分佈,我會用geom_density()來繪圖(如下),但實際上沒辦法從這樣的密度函式圖來說故事,指出那些人口數過高或過低的村里。 21.3.5 NYT: Net Worth by Age Group: Coordinate, barplot 這個教學案例來自紐約時報的「What’s going on in this gragh」系列資料視覺化教學之Teach About Inequality With These 28 New York Times Graphs - The New York Times (nytimes.com) 。該圖表呈現在不同年代、不同年齡層的人所擁有的淨資產(包含土地、存款、投資等減去債務)。該圖表的結果指出,在不同年代的老年人是越來越有錢,但年輕人卻越來越窮 21.3.6 NYT: Optimistic of different generation: Association, scatter 這個練習為紐約時報的一則報導「Where Are Young People Most Optimistic? In Poorer Nations. - The New York Times (nytimes.com)」。該報導乃根據一項涵蓋 21 個國家的大型調查,這項調查比較了不同國家和年齡層(年輕人對成年人)對於下一代的生活是否會比現在更好的看法。該調查還比較了不同國家(富裕與貧窮)和年齡層(年輕人對成年人)對於當今兒童在基本方面的狀況,以及對於社會和環境問題的看法。此外,調查還比較了不同國家和年齡層對於現代科技對年輕人生活的影響看法,以及對於焦慮和壓力等方面的看法。 21.3.7 Vaccinating Proportion by countries: Amount, heatmap 這個例子參考(Wilke 2019)在視覺化數量(Amount)時的熱圖範例(Heatmap),但改用為視覺化各國每百人完整注射COVID-19疫苗人數歷時資料。 21.3.8 Taiwan salary distribution: Distribution, boxmap 箱形圖(Box plot)是一種用於展示數據分佈情況的統計圖表。它通常顯示數據的中位數、四分位數、極值和異常值等統計量。箱形圖的中間線表示數據的中位數,箱子的上下邊界則分別表示數據的上四分位數和下四分位數。箱子的高度表示數據的變異程度,而箱子外的線段則表示數據的最大值和最小值。如果數據中存在異常值,則通常使用圓圈或星號等符號來標記。箱形圖可以用來比較不同數據集之間的分佈情況,以及檢查數據是否存在異常值。 Inspired by Six Myths About Choosing a College Major - The New York Times (nytimes.com) and What’s Going On in This Graph? | Jan. 9, 2018 - The New York Times (nytimes.com) 21.3.9 Taiwan income distribution by each town: Distribution, boxmap 本案例用BoxPlot來呈現某個行政區(鄉鎮市區)各村里的所得中位數、平均數、四分位數的分佈。如果在箱型圖中,平均數高於第三分位數,這代表數據集呈現右偏分佈。也就是說,數據中的大部分觀測值都分佈在第一、二分位數之間,但存在一些較大的極端值,使平均值被往右偏移。從這樣的分佈中可以察覺某些里因為有少數極端高收入住戶,而使得平均高於四分位數。 21.3.10 NYT: Carbon by countries: Proportion, Treemap 本案例取自紐時所報導之Who Has The Most Historical Responsibility for Climate Change? - The New York Times (nytimes.com)。該新聞報導了聯合國氣候峰會在格拉斯哥舉行期間的一個重要議題:世界上最富裕的國家,即那些對全球暖化負責任的不成比例的國家,應如何賠償因全球氣溫上升所造成的貧困國家的損失。報導指出,現今全球人口中,包括美國、加拿大、日本以及西歐大部分國家在內的富裕國家僅佔12%,但是在過去的170年中,這些國家卻負責了50%的溫室氣體排放。 21.3.11 Taiwan Annual Expenditure: Proportion, Treemap 本案例將就台灣中央預算的資料,以TreeMap階層化地顯示不同機構層級(大類、一級部會)等的預算佔比。例如衛福部、財政部與勞動部的預算均屬於社會福利支出。 References "],["ggplot.html", "Chapter 22 ggplot 22.1 Essentials of ggplot 22.2 NYT: Inequality 22.3 Adjusting Chart 22.4 Highlighting & Storytelling", " Chapter 22 ggplot 本節著重在介紹ggplot的基本概念與設定。 小訣竅:可在一開始便透過knitr::opts_chunk$set(echo = TRUE, fig.width = 2, fig.asp = 0.4)來一次設定所有圖片。fig.width = 8與fig.height = 6 是以英吋(inches)為單位,或用fig.dim = c(8, 6)一次設定長寬1。echo = TRUE是設定knit出輸出格式(如html)時,也要包含程式碼。如果echo = FALSE的話,就只會輸出文字和圖形。 22.1 Essentials of ggplot 用ggplot來繪製圖形有三個基本函式ggplot() + aes() + geom_圖表類型。 指定要進行繪圖ggplot():用%>%將資料(dataframe)pipe給ggplot()後,底下各增添的繪圖選項都用+的符號,類似不斷修正繪圖結果的意思。 指定X/Y軸與群組因子aes():指定圖表的X/Y軸分別是什麼變數,有些圖表只需要單一個變數(例如Density-chart和Histogram),有些需要X/Y兩個變數(例如Scatter-chart)什麼的變數要做視覺化,Boxplot甚至可以直接指定最大、最小、Q1、Q3和Median等多個變數。 指定要繪製的圖表類型。例如Line-chart為geom_line()、Scatter-chart為geom_point()、Bar-chart為geom_col()或geom_bar()。查閱ggplot cheat sheet可以快速翻閱有哪些圖表類型(如截圖)。 ggplot-cheat-sheet 22.1.1 (1) ggplot() 秀出預備要繪製的繪圖區 tibble(a=1:5, b=5:1) %>% ggplot() 22.1.2 (2) aes() 指定X/Y軸與群組因子 aes()會在繪圖區上繪製X與Y軸 tibble(a=1:5, b=5:1) %>% ggplot() + aes(x=a, y=b) 22.1.3 (3) geom_???() 指定要繪製的圖表類型。 例如折線圖為為geom_line()、X/Y散佈圖為geom_point()、長條圖我多會使用geom_col()。ggplot繪圖種類除了可以參照前面的ggplot cheat sheet之外,可以詢問ChatGPT有哪些常見的類別,甚至可以請他舉例給你測試該繪圖方法。 tibble(a=1:5, b=5:1) %>% ggplot() + aes(x=a, y=b) + geom_line() 亦可同時繪製兩種類型的圖表於同一張圖上。例如以下同時繪製了geom_line()與geom_plot()。 tibble(a=1:5, b=5:1) %>% ggplot() + aes(x=a, y=b) + geom_line() + geom_point() 注意:ggplot是以變數為基礎的視覺化套件,也就是說,當準備好dataframe後,就可以在ggplot中指定要用哪些變數來繪圖。也因此,務必把dataframe整理為tidy型態,也就是長表格(long-form)的型態。整理完資料後,我會習慣地用names(plot)或glimpse(plot)來看一下該資料所有的變項,好可以在下一階段的繪圖做參考。 22.2 NYT: Inequality 以下將以紐時的這個Teach About Inequality With These 28 New York Times Graphs 案例來做繪圖教學。該教學引用了Opinion | America Will Struggle After Coronavirus. These Charts Show Why.這篇新聞中的圖表,我們拿來做範例的這張圖,主要是在說財富趨勢對年輕人而言尤其艱難。35歲以下美國人的凈資產中位數 - 他們平均比年長的美國人差得多 - 比2004年35歲以下美國人的凈資產低40%。相比之下,65歲以上美國人的凈資產在同一時期增長了9%。簡而言之,嬰兒潮一代比他們的前輩更富有,而千禧一代和X世代比他們的前輩更窮;或者說,年輕人拿自己和10年前的年輕人相比,現在的年輕人更窮;而現在的老年人拿自己和10年前的老年人比,現在的老年人更富有。 22.2.1 (1) Loading data 仔細觀察一下資料,你會怎樣描述這個資料? 這個Dataframe包含三個變數(Category, year, Net_Worth),共66個觀測值。變數「Category」描述的是年齡範圍,包含六個類別(Level)。變數「year」代表年份,從1989年到2019年,以三年為一個週期觀察,共有11個Levels。變數「Net_Worth」則表示在該年齡範圍內的淨資產。從資料可以觀察到,在不同的時間點,不同年齡範圍的人群的財富狀況看似有明顯差異。例如,比較1989年和2019年,45-54歲的年齡組在這段期間內的淨值似乎較35-44歲組要高,這可能反映了隨著年齡增長,個人或家庭的財富累積增加的趨勢。 NW <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(Category, year, Net_Worth) %>% group_by(Category) %>% arrange(year) %>% ungroup() ## Rows: 66 Columns: 37 ## ── Column specification ──────────────────────────────────────────────────────── ## Delimiter: "," ## chr (1): Category ## dbl (36): year, Before_Tax_Income, Net_Worth, Assets, Financial_Assets, Tran... ## ## ℹ Use `spec()` to retrieve the full column specification for this data. ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. NW %>% head(12) ## # A tibble: 12 × 3 ## Category year Net_Worth ## <chr> <dbl> <dbl> ## 1 Less than 35 1989 16.2 ## 2 35-44 1989 112. ## 3 45-54 1989 195. ## 4 55-64 1989 195. ## 5 65-74 1989 154. ## 6 75 or older 1989 144. ## 7 Less than 35 1992 16.6 ## 8 35-44 1992 79.9 ## 9 45-54 1992 140. ## 10 55-64 1992 203. ## 11 65-74 1992 176. ## 12 75 or older 1992 155. 22.2.1.1 (1.1) group_by()的概念 在提供的程式碼中,group_by(Category)是一個關鍵步驟,它影響了數據處理的方式,尤其是在隨後的操作中。以下是有和沒有group_by(Category)時的主要差異: 有group_by(Category):當在程式碼中使用group_by(Category)時,這意味著接下來的操作將在每個Category類別的子集上單獨進行。這對於需要按類別分析或操作數據時非常有用。在此程式碼中,arrange(year)將會在每個Category內部對year進行排序。這意味著每個類別內的年份會從最小到最大排序,但這種排序是獨立於其他類別的。 沒有group_by(Category):如果省略group_by(Category),則後續的操作將考慮所有的數據作為一個整體來進行。 省略group_by(Category)後,arrange(year)會對整個數據集按year進行全局排序,而不會考慮Category的界限。由於year是一個類別變項,出現在多個Category組中,因此,會有多個相同year的列排在一起。 22.2.2 (2) Visualizing 這是預期視覺化的結果。 22.2.2.1 (2.1) Plot without group 先將year和Net_worth分別繪製在X與Y軸上,並用geom_line()繪製為折線圖。結果圖表中呈現鋸齒狀的折線,看似有問題,但其實是合理的。因為year是一個離散變數,而我們希望每個年齡層一條線的話,那就要照年齡層來分組。也因此,每一年都有有每個年齡層的資料,當我們把「年」作為X軸時,自然同一年就會有數筆不同年齡層的資料,因此才會是鋸齒狀的。 NW %>% ggplot() + aes(x=year, y=Net_Worth) + geom_line() 不同的圖表類型是可以疊加在同一張圖上的。我們也可以把geom_point() 另一種圖表型態加入,也是可以的,兩者的X與Y不相衝突。geom_line()、geom_point()、geom_text()三者會經常伴隨出現。 NW %>% ggplot() + aes(x=year, y=Net_Worth) + geom_line() + geom_point() 22.2.2.2 (2.2) Grouping 上圖是我們把多個年齡層的逐年資料畫在同一條折線上,所以會呈現鋸齒狀折現的狀況。但這些年齡層並非在同一條線上呀?因此,我們要根據Category這個變數來做分組。 NW %>% ggplot() + aes(x=year, y=Net_Worth, group=Category) + geom_line() + geom_point(stat="identity") 如希望不同線條上不一樣的色彩,應指定color=Category。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() 用color、fill或group來做分組? 在使用geom_line()函數時,顏色的設定是針對線條本身,而非填充面積。當我們希望指定點(透過geom_point())或線條(使用geom_line())的顏色時,我們會使用color參數來定義顏色。 相對地,當使用`geom_area()`函數進行視覺化時,由於它涉及的是面積的填充,因此我們應該使用`fill`參數來指定填充色。在某些情況下,我們可能會同時使用`color=Category`和`fill=Category`來對`geom_area()`進行設定,這樣做能夠同時定義邊線顏色和填充顏色。然而,當利用`geom_area()`來展示折線圖時,建議限制使用的顏色種類不超過兩種,以避免顏色層疊導致的視覺混淆,即便是設定了`alpha=0.2`以降低透明度。 `geom_area()`函數默認展示的是累積分佈圖,即不同群組的數值會在Y軸方向上疊加。若目的是比較兩個群組之間的差異,而非觀察整體趨勢,則可以通過添加`position="dodge"`參數來調整分佈方式,並將`alpha`設定為小於1的值以增加圖形的透明度,從而更清晰地分辨不同群組之間的差異。 NW %>% ggplot() + aes(year, Net_Worth, color=Category, fill=Category) + geom_area(position="dodge", alpha=0.2) 22.3 Adjusting Chart 22.3.1 Type of Points and Lines 下面的例子同時用了geom_line()和geom_point(),且分別設定了線寬(size=1)、點的大小(size=2),折線型態(linetype=\"dashed\")、半透明程度(alpha)。 ggplot2 line types : How to change line types of a graph in R software? - Easy Guides - Wiki - STHDA NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line(size=1, linetype = "dashed", alpha=0.5) + geom_point(size=2, color="dimgrey", alpha=0.5) ## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. ## ℹ Please use `linewidth` instead. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated. 22.3.2 Line Types See more from ggthemes https://github.com/BTJ01/ggthemes/tree/master/inst/examples library(ggthemes) rescale01 <- function(x) { (x - min(x)) / diff(range(x)) } gather(economics, variable, value, -date) %>% group_by(variable) %>% mutate(value = rescale01(value)) %>% ggplot(aes(x = date, y = value, linetype = variable)) + geom_line() + scale_linetype_stata() + theme_minimal() 22.3.3 Title, Labels and Legends Titles, labels, and legend 設定標題與X/Y軸標題(法一):以下設定了圖表的圖表標題、和X軸與Y軸的軸標題(xlab與ylab)。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + xlab("Year") + ylab("Net Worth") + ggtitle("Net Worth by year grouped by age groups") 設定標題與X/Y軸標題(法二):這是一次設定圖表標題(title)、次標題(suttitle)、X軸與Y軸標題的方法。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", subtitle = "Source from: ...", x = "Year", y = "Net Worth") 調整X軸與Y軸標題位置的:必須要透過theme()來設定axis.title.x = element_text(hjust=1)。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + theme(axis.title.x = element_text(hjust=1), axis.title.y = element_text(hjust=1)) 去除X/Y軸標題(不佳):直接將空字串Assign給title、x、與y即可。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "", x = "", y = "") 去除X/Y軸標題(較佳):透過設定theme()來調整。可發現透過這種設定方法,原本標題和X/Y軸標題的邊界空間就會被釋放出來。 # No extra space for xlab, ylab and title NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line(show.legend = F) + theme_minimal() + theme(plot.title = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank()) 22.3.4 Font 調整字型會建議都從theme()來做調整,所有圖面上看得到的字都有相對應的變數可以調整字型。例如以下的例子中,把標題的字型大小調整為14粗體、X與Y軸的字型則調整了向右對齊、10粗斜體、顏色為dimgrey。 NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + theme(plot.title = element_text(size=14, face="bold"), axis.title.x = element_text(hjust=1, size=10, color="dimgrey", face="bold.italic"), axis.title.y = element_text(hjust=1, size=10, color="dimgrey", face="bold.italic") ) 22.3.5 Color Themes ggplot也有其圖表主題色調。之前範例的灰色圖表背景就是預設的主題,ggplot中還有好幾個預設圖表主題可以選,例如theme_minimal()或theme_tw()等等。 Modify components of a theme — theme • ggplot2 (tidyverse.org) bbplot/bbc_style.R at master · bbc/bbplot (github.com) NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() 22.3.6 Set-up Default Theme 如果希望所有的圖表都有一致的顏色和排版的調性,可以在一開始編輯Rmd的時候就設計好一套theme()並指給一個變數(例如以下的th)。 th <- theme(plot.title = element_text(size=14, face="bold"), axis.title.x = element_text(hjust=1, size=10, color="dimgrey", face="bold.italic"), axis.title.y = element_text(hjust=1, size=10, color="dimgrey", face="bold.italic") ) NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line(linetype = "dashed", alpha=0.5) + geom_point(size=2, color="dimgrey", alpha=0.5) + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + th 22.3.7 Show Chinese Text Python和R這些程式語言的預設視覺化套件都沒辦法顯示中文,所以如果要顯示中文的話,就要指定圖表標題、X、Y軸標籤、圖說和各個部件的字型。因為我在Mac上繪圖,所以我將字型指定為Heiti TC Light。如果想知道自己的電腦上有什麼可以用,可以到電腦的字體簿上查找中文字體名稱,或者上網google「ggplot 中文字型選擇」。 county <- read_csv("data/tw_population_opendata110N010.csv") %>% slice(-1, -(370:375)) %>% type_convert() %>% mutate(county = str_sub(site_id, 1, 3)) %>% group_by(county) %>% summarize( area = sum(area), people_total = sum(people_total) ) %>% ungroup() ## Rows: 375 Columns: 5 ## ── Column specification ──────────────────────────────────────────────────────── ## Delimiter: "," ## chr (5): statistic_yyy, site_id, people_total, area, population_density ## ## ℹ Use `spec()` to retrieve the full column specification for this data. ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. ## ## ── Column specification ──────────────────────────────────────────────────────── ## cols( ## statistic_yyy = col_double(), ## site_id = col_character(), ## people_total = col_double(), ## area = col_double(), ## population_density = col_double() ## ) 下面這是一個長條圖的範例(barplot,不是histogram)。Barplot可以直接指定X軸為縣市(county)和Y軸為總人口數(people_total),但是要用geom_col()而非geom_bar()。除此之外,Bar的顏色有「面」的特徵,所以若要自訂整條bar的顏色,要用fill而非color,color只會是每條Bar的外框。 county %>% arrange(desc(people_total)) %>% ggplot() + aes(county, people_total) %>% geom_col(fill="lightgrey", color="black") + theme_minimal() + theme(axis.text.x = element_text(family="Heiti TC Light")) 舉例來說,中文字型可以是標楷體(BiauKai)、宋體(Songti TC)、黑體(Heiti TC Light)、蘋方(PingFang TC)、Noto(Noto Sans CJK TC) th <- theme(title = element_text(family="Heiti TC Light"), text = element_text(family="Heiti TC Light"), axis.text.y = element_text(family="PingFang TC"), axis.text.x = element_text(family="Heiti TC Light"), legend.text = element_text(family="Heiti TC Light"), plot.title = element_text(family="Heiti TC Light") ) county %>% ggplot() + aes(county, people_total) %>% geom_col(fill="skyblue") + theme_minimal() + th + theme(axis.text.x = element_text(angle = 45)) 22.3.8 X/Y axis 調整圖表方向 county %>% ggplot() + aes(county, people_total) %>% geom_col(fill="skyblue") + coord_flip() + theme_minimal() + th + theme(axis.text.x = element_text(angle = 45)) 通常coord_flip()後往往會希望這些bar會是由上而下排序好的,但用arrange(desc(people_total)是無法解決問題的,因為Y軸原本會是照Y軸的刻度排列,而不是Y軸的數值。所以,要被排序的應該是Y軸的「文字」也就是那些縣市。因此,我們需要將該縣市轉為factor(1~n),並且讓這些縣市被安排的factor數值照people_total排列,因此要用mutate(county = reorder(county, people_total))。reorder()是一個將文字轉factor的函式,但在此特別指定照people_total的編排。 county %>% # arrange(desc(people_total) %>% mutate(county = reorder(county, people_total)) %>% ggplot() + aes(county, people_total) %>% geom_col(fill="skyblue") + coord_flip() + theme_minimal() + th 22.4 Highlighting & Storytelling 「說故事」才是整則資料新聞的核心,在運用圖表來輔助敘事時,應搭配說理說服的內容來突顯(highlight)圖面上的特徵,而不是留待讀者自己觀察。以下有三種highlight圖表部分資料的方法。第一個方法是在繪圖時用+ scale_color_manual()或+ scale_fill_manual()指定顏色給不同群組;方法二是利用gghighlight這個套件來指定要上色的群組,而且gghighlight可以和fill與color相互搭配,仍然可以用scale_fill_manual和scale_color_manual來指定顏色。但會有個狀況是,如果原本沒群組那怎麼辦?就自己用mutate()打造群組就好。方法各有利弊與使用時機。 22.4.1 依群組指定顏色 scale_color_manual() 與scale_fill_manual() NW %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line() + scale_color_manual( limits=c("65-74", "35-44"), # original chart group values=c("gold", "skyblue"), # map to color name="Age group", # legend title breaks=c("65-74", "35-44"), # original legend group labels labels=c("elder(65-74)","younger(35-44)"), # map to new labels na.value = "lightgrey" # color for other groups ) + theme_minimal() 22.4.2 使用gghighlight套件 library(gghighlight) NW %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line() + gghighlight(Category %in% c("65-74", "35-44")) + theme_minimal() + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "whitesmoke", colour = "whitesmoke", size = 0.5, linetype = "solid")) 使用gghighlight仍能自己使用scale_color_manual()來指定顏色 NW %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line() + gghighlight(Category %in% c("65-74", "35-44")) + scale_color_manual( limits=c("65-74", "35-44"), # original chart group values=c("gold", "skyblue")) + # map to color theme_minimal() ## Warning: Tried to calculate with group_by(), but the calculation failed. ## Falling back to ungrouped filter operation... ## label_key: Category 22.4.3 為視覺化建立群組 這個方法是在原本的資料並沒有可以作為color或fill的因子,所以自行創建一個要突顯的群組。 county %>% mutate(group = if_else(county %in% c("新竹縣", "新竹市"), "highlight", "other")) %>% mutate(county = reorder(county, people_total)) %>% ggplot() + aes(county, people_total, fill=group) %>% geom_col() + scale_fill_manual(values=c("highlight"="Khaki", "other"="lightgrey")) + guides(fill="none") + coord_flip() + theme_minimal() + th 但事實上也可以用gghighlight直接達成 county %>% mutate(county = reorder(county, people_total)) %>% ggplot() + aes(county, people_total) %>% geom_col(fill="deeppink") + gghighlight(county %in% c("新竹縣", "新竹市")) + guides(fill="none") + coord_flip() + theme_minimal() + th 參考資料:5.4 Control the size of plots/images | R Markdown Cookbook (bookdown.org)↩︎ "],["coordinate.html", "Chapter 23 Coordinate 23.1 NYT: Population Growth 23.2 Order as axis 23.3 Log-scale 23.4 23.5 Square-root scale 23.6 Increasing percentage as Y 23.7 X/Y aspect ratio", " Chapter 23 Coordinate 本章節談論的是視覺化圖表的座標軸,本章節所涵蓋的概念可參考Claus O. Wilke所著之Fundamentals of Data Visualization的Chap3 Coordination & Axis與Chapter 8 Visualizing distributions: Empirical cumulative distribution functions and q-q plots。 23.1 NYT: Population Growth 紐時這篇報導「When Did the Anthropocene Start? Scientists Closer to Saying When. - The New York Times (nytimes.com)」討論了人類活動對地球所產生的深遠影響,並探討人類是否已經進入了一個新的地質時期,被稱為「人新世」。報導指出,人類的經濟活動、能源消耗和人口增長是人新世的主要因素,並且這些因素已經在地球上留下了不可磨滅的痕跡。報導也提到,地質學家已經發現了人新世的證據,包括核爆炸中的鈽同位素、肥料中的氮和發電廠的灰燼等。然而,報導也問道,人新世是否真的已經開始,以及它的開始點是否應該是農業革命、工業革命、核彈(77年前)或其他發展。 23.1.1 Parsing table from pdf 至R4CSS/data可以下載到本範例所用的資料(是一個pdf檔案)https://github.com/p4css/R4CSS/raw/master/data/world_population_change.pdf。 我們可使用tabulizer這個套件來萃取PDF文件中的表格,官方雖然提供cran可以直接安裝,但有可能會遇到R的版本不符要求而安裝不起來的情形。此時可用第二種方法,直接從github上安裝該套件。 程式碼使用 extract_tables() 函數從指定的PDF文件中提取表格數據,並將其存儲在 tables 變量中。在這個函數中,我們指定了要從第1頁中提取表格數據。 # Method 1 # install.packages("tabulizer") # Method 2 # if (!require("remotes")) { # install.packages("remotes") # } # remotes::install_github(c("ropensci/tabulizerjars", "ropensci/tabulizer")) library(tidyverse) library(tabulizer) # Extract the table tables <- extract_tables('data/world_population_change.pdf', pages = 1) # Extract the first element of the variable raw <- as.data.frame(tables[[1]]) population_by_year <- raw %>% select(1, 2) %>% slice(-c(1:4)) %>% rename(years_to_2020 = V1, population = V2) # select(years_to_2020 = v1, population = v2) # mutate(years_to_2020 = v1, population = v2) 23.1.2 X and Y with log-scale 通常情況下,當數據範圍很大,且存在極端值或者偏離值時,使用對數轉換可以更好地展示數據的分佈情況。在這種情況下,你可以使用 scale_x_log10() 或 scale_y_log10() 函數將 x 軸或 y 軸轉換為對數刻度。 例如,如果你有一個數據集,其中一個變量的數值範圍從1到100000,且大多數數據會集中在較小的值上,那麼使用線性刻度將導致數據在圖形中的分佈不平衡,而較大的值會集中在圖形的邊緣或者消失在圖形之外。在這種情況下,使用對數刻度可以更好地展示數據的分佈情況,並且可以更好地顯示較大值之間的差異。而上述資料便有這樣的特色,尤其是在Y軸方向,一開始人口增加量不多,後來指數成長,此時若使用線性尺度,會看不清楚一開始的人口增加量。 library(cowplot) load("data/world_population_change.rda") population_by_year ## years_to_2020 population ## 1 11,720 4 ## 2 10,020 5 ## 3 8220 8 ## 4 7020 11 ## 5 6020 7 ## 6 5020 14 ## 7 4220 27 ## 8 3020 50 ## 9 2520 100 ## 10 2020 268 ## 11 1020 289 ## 12 720 397 ## 13 520 471 ## 14 420 561 ## 15 320 629 ## 16 270 772 ## 17 220 951 ## 18 170 1247 ## 19 120 1643 ## 20 70 2499 ## 21 65 2769 ## 22 60 3042 ## 23 55 3333 ## 24 50 3691 ## 25 45 4071 ## 26 40 4440 ## 27 35 4838 ## 28 30 5269 ## 29 25 5735 ## 30 20 6076 ## 31 15 6463 ## 32 10 6930 ## 33 5 7349 ## 34 0 7717 toplot <- population_by_year %>% mutate(years_to_2020 = map(years_to_2020, ~(str_remove(., ",")))) %>% mutate(years_to_2020 = as.numeric(years_to_2020), population = as.numeric(population)) toplot %>% head ## years_to_2020 population ## 1 11720 4 ## 2 10020 5 ## 3 8220 8 ## 4 7020 11 ## 5 6020 7 ## 6 5020 14 p1 <- toplot %>% ggplot() + aes(x=years_to_2020, y=population) + geom_point() + theme_bw() p2 <- toplot %>% ggplot() + aes(x=years_to_2020, y=population) + geom_point() + scale_x_log10() + scale_y_log10() + scale_x_reverse() + theme_bw() cowplot::plot_grid( p1, NULL, p2, labels = c("(a) Original Scale", "", "(b) Low-Scale"), nrow = 1, rel_widths = c(1, 0.1, 1) ) 23.2 Order as axis 學術論文若要呈現一群數據的分佈時,最常用的是密度(分佈)函數、累積分佈函數,最常視覺化的方法是密度分佈圖(geom_density())或直方圖(geom_histogram())。然而,對新聞等強調「說故事」的文體而言,說故事的技巧往往不是「那一群資源多或資源少的對象」,而經常要直指「那個對象」,要能夠看得見所敘述的對象在圖中的位置。此時,用密度分佈來呈現的話,只能看出,該對象在分佈的某個位置;但可以改用將資料對象根據某個數據來排序後,繪製折現圖的方式來表現。例如,若要繪製一個班級的成績分佈,通常X軸是分數(組),Y軸是獲得該分數(組)的人數;但其實可以將個體依照分數來做排序,Y軸不是某個分數(組)的個數,而是每個排序後的個體,而且以排序後的序號(Ranking)來表示。用折線圖繪製後,一樣可以看出分數的分佈,但卻能夠直接標記敘事中的某個對象是Y軸中得哪個點。 Figure 3.5: Population numbers of Texas counties relative to their median value. Select counties are highlighted by name. The dashed line indicates a ratio of 1, corresponding to a county with median population number. The most populous counties have approximately 100 times more inhabitants than the median county, and the least populous counties have approximately 100 times fewer inhabitants than the median county. Data source: 2010 Decennial U.S. Census. See What’s Going On in This Graph? | Vaccination by Country fromWhat Data Shows About Vaccine Supply and Demand in the Most Vulnerable Places - The New York Times (nytimes.com) The original chart is animated along the timeline.What Data Shows About Vaccine Supply and Demand in the Most Vulnerable Places - The New York Times (nytimes.com) 23.3 Log-scale 以下我打算繪製出每個村里在15歲以上的人口數,來呈現台灣有些村里人口相當稀少,尤其是花蓮縣、澎湖縣、南投縣和宜蘭縣的幾個聚落。並標記出幾個人口數最高的里。如果我的目的是呈現村里人口數的統計分佈,我會用geom_density()來繪圖(如下),但實際上沒辦法從這樣的密度函式圖來說故事,指出那些人口數過高或過低的村里。 raw <- read_csv("data/opendata107Y020.csv", show_col_types = FALSE) %>% slice(-1) %>% type_convert() raw %>% ggplot() + aes(edu_age_15up_total) + geom_density() 因此,一個比較好的策略是,把各村里的人口數由小到大或由大到小排序好,編好Rank比序的代號,然後讓X軸做為比序,逐一在Y軸打出每一個村里的數據。 但這邊值得注意的是,如果沒有放大尾端(也就是村里人口數最少的那部分),實際上也很難繪圖。所以對Y軸取log,就可以看清楚Y軸的資料點。 toplot <- raw %>% select(site_id, village, edu_age_15up_total) %>% arrange(desc(edu_age_15up_total)) %>% mutate(index = row_number()) %>% mutate(label = ifelse(index <= 5 | index > n()-5, paste0(site_id, village), "")) library(ggrepel) p2 <- toplot %>% ggplot() + aes(index, edu_age_15up_total) + geom_point(alpha=0.5, color="royalblue") + geom_text_repel(aes(label = label), point.padding = .4, color = "black", min.segment.length = 0, family = "Heiti TC Light") + theme(axis.text.x=element_blank()) + scale_y_log10(breaks = c(0, 1, 10, 100, 1000, 10000)) + theme_minimal() p1 <- toplot %>% ggplot() + aes(index, edu_age_15up_total) + geom_point(alpha=0.5, color="royalblue") + theme(axis.text.x=element_blank()) + theme_minimal() cowplot::plot_grid( p2, NULL, p1, labels = c("a", "", "b"), nrow = 1, rel_widths = c(1, 0.1, 1) ) library(tidyverse) library(gghighlight) 23.4 23.5 Square-root scale Chap3 Coordination & Axis Fundamentals of Data Visualization (clauswilke.com) Figure 3.8: Areas of Northeastern U.S. states. (a) Areas shown on a linear scale. (b) Areas shown on a square-root scale. Data source: Google. 前面是視覺化了各村里大於十五歲以上人口的人口數分佈,採用對數尺度(log-scale)可以觀察到比較小的村里。那有什麼是適合用平方根尺度(sqrt-scale)的呢?是土地嗎?密度嗎?還是人口數?是村里等級嗎?鄉鎮市區等級嗎?還是縣市等級? town <- read_csv("data/tw_population_opendata110N010.csv") %>% slice(-1, -(370:375)) %>% type_convert() town %>% arrange(desc(area)) %>% mutate(index = row_number()) %>% ggplot() + aes(index, area) %>% geom_col(fill="skyblue") + scale_y_sqrt() + theme_minimal() Figure 23.1: (ref:population-area) county <- town %>% mutate(county = str_sub(site_id, 1, 3)) %>% group_by(county) %>% summarize( area = sum(area), people_total = sum(people_total) ) %>% ungroup() p1 <- county %>% arrange(desc(people_total)) %>% mutate(index = row_number()) %>% ggplot() + aes(index, people_total) %>% geom_col(fill="lightgrey") + # scale_y_sqrt() + theme_minimal() p2 <- county %>% arrange(desc(people_total)) %>% mutate(index = row_number()) %>% ggplot() + aes(index, people_total) %>% geom_col(fill="khaki") + scale_y_sqrt(breaks=c(0, 250000, 500000, 1000000, 2000000, 4000000)) + theme_minimal() cowplot::plot_grid( p1, p2, labels = c("a", "b"), nrow = 1 ) Figure 23.2: (ref:population-area) 23.6 Increasing percentage as Y 23.6.1 NYT: Net Worth by Age Group LEARNING NOTES Median for Inequality 這個教學案例來自紐約時報的「What’s going on in this gragh」系列資料視覺化教學之Teach About Inequality With These 28 New York Times Graphs - The New York Times (nytimes.com) 。該圖表呈現在不同年代、不同年齡層的人所擁有的淨資產(包含土地、存款、投資等減去債務)。該圖表的結果指出,在不同年代的老年人是越來越有錢,但年輕人卻越來越窮(該曲線為減去1989年 23.6.2 Read and sort data Sorted by arrange() function. p1 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(year, Category, Net_Worth) %>% group_by(Category) %>% arrange(year) %>% ungroup() p1 %>% filter(year <= 1992) %>% knitr::kable() year Category Net_Worth 1989 Less than 35 16.17019 1989 35-44 112.47530 1989 45-54 195.11630 1989 55-64 195.25554 1989 65-74 154.34277 1989 75 or older 144.29855 1992 Less than 35 16.60780 1992 35-44 79.91050 1992 45-54 139.97745 1992 55-64 203.44104 1992 65-74 176.44667 1992 75 or older 155.35173 library(gghighlight) p1 %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line() + geom_point() + gghighlight(Category %in% c("65-74", "35-44")) + theme_minimal() + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) p2 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(year, Category, NW = Net_Worth) %>% group_by(Category) %>% arrange(year) %>% mutate(increase = (NW-first(NW))/first(NW)) %>% ungroup() p2 %>% filter(year <= 1992) %>% knitr::kable() year Category NW increase 1989 Less than 35 16.17019 0.0000000 1989 35-44 112.47530 0.0000000 1989 45-54 195.11630 0.0000000 1989 55-64 195.25554 0.0000000 1989 65-74 154.34277 0.0000000 1989 75 or older 144.29855 0.0000000 1992 Less than 35 16.60780 0.0270627 1992 35-44 79.91050 -0.2895285 1992 45-54 139.97745 -0.2825948 1992 55-64 203.44104 0.0419220 1992 65-74 176.44667 0.1432131 1992 75 or older 155.35173 0.0765994 美國35歲以下的年輕人的中位淨資產比起年長的美國人來說,一開始平均貧窮得多。從「Less than 35」這條線看來,現在的年輕世代比起2004年的年輕世代所擁有的淨資產低了40%。相比之下,65歲以上的美國人現在的淨資產,相較於2004年增加了9%。隨著時代變化,可想像會有一群人的淨資產越來越多,只是現在從這個圖表看來,年輕人所擁有的淨資產相較於過去是越來越低的,多半流入了成年人和老年人手中。 p2 %>% ggplot() + aes(year, increase, color = Category) + geom_line() + geom_point() + gghighlight(Category %in% c("65-74", "Less than 35")) + theme_minimal() + scale_y_continuous(labels=scales::parse_format()) + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) 23.7 X/Y aspect ratio 23.7.1 UNICEF-Optimistic (WGOITH) https://www.nytimes.com/2021/11/17/upshot/global-survey-optimism.html https://changingchildhood.unicef.org/about plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>% select(country = WP5, age = WP22140, bw = WP22092) %>% mutate(country = ordered(country, levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17, 29, 31, 33, 35, 36, 60, 61, 77, 79, 81, 87, 165), labels=c("USA", "Morocco", "Lebanon", "Indonesia", "Bangladesh", "UK", "France", "Germany", "Spain", "Japan", "India", "Brazil", "Nigeria", "Kenya", "Ethiopia", "Mali", "Ukraine", "Cameroon", "Zimbabwe", "Argentina", "Peru"))) %>% count(country, age, bw) %>% group_by(country, age) %>% mutate(perc = n/sum(n)) %>% ungroup() %>% filter(bw == 1) %>% select(country, age, perc) %>% spread(age, perc) %>% rename(`15-24y` = `1`, `40+y` = `2`) plot.opt %>% head(10) %>% knitr::kable() country 15-24y 40+y USA 0.6679842 0.4611465 Morocco 0.4365079 0.4735812 Lebanon 0.5467197 0.4435798 Indonesia 0.7920605 0.8027344 Bangladesh 0.4624506 0.4319527 UK 0.5040000 0.4140000 France 0.3900000 0.2640000 Germany 0.5900000 0.3860000 Spain 0.5160000 0.3340000 Japan 0.6367265 0.2586873 plot.opt %>% ggplot() + aes(`40+y`, `15-24y`, label = country) + geom_point(color = "skyblue", size = 2) + xlim(0, 1) + ylim(0,1) + geom_text(hjust = -0.1, vjust = -0.5) + geom_abline(intercept = 0, slop = 1, color="lightgrey", alpha=0.5, linetype="dashed") + theme_minimal() + theme(aspect.ratio=1) "],["amount.html", "Chapter 24 AMOUNT 24.1 Bar chart 24.2 Heatmap: Vaccination", " Chapter 24 AMOUNT 24.1 Bar chart 24.2 Heatmap: Vaccination 這個例子參考(Wilke 2019)在視覺化數量(Amount)時的熱圖範例(Heatmap),但改用為視覺化各國每百人完整注射COVID-19疫苗人數歷時資料。 - https://ourworldindata.org/covid-vaccinations - https://github.com/owid/covid-19-data/tree/master/public/data/vaccinations 在R語言中,我們可以使用ggplot2套件來創建熱圖。熱圖通常使用顏色來表示數據的強度或值,通常是從淺色到深色或從冷色到暖色的漸變。ggplot2套件提供了geom_tile()函數來繪製熱圖。熱圖主要有以下幾個作用: 顯示數據的分布情況:熱圖可以將數據的分布情況一目了然地呈現出來,讓觀察者可以快速了解數據的分布情況。 發現數據之間的相關性:熱圖可以將數據之間的相關性直觀地呈現出來,這對於探索數據之間的關係非常有用。 篩選數據:熱圖可以幫助我們快速地篩選出數據中的關鍵部分,從而更好地理解數據。 使用ggplot2繪製熱圖的過程中,我們可以使用scale_fill_gradient()函數設置顏色的漸變方式和範圍,使用coord_equal()函數使x和y軸的尺度相同,從而保持正方形。 24.2.1 The case: Vaccinating coverage by month 本例子的資料前處理難度較高(OS:惡魔級)。困難來自於每個國家登記資料的時間不同,因此會產生大量NA值。但在這樣的狀況下,又要找到以月為時間單位的共同數值,就會更挑戰程式編寫者的資料清理技術。除此之外,如何偵測「每個國家超過每百人有二十人完整注射疫苗的時間點」,更是技巧中的技巧。是個磨練NA值處理和高難度資料前處理的好例子。這個例子同時也是大量在長表格、寬表格間轉換,多次運用spread()/pivot_wider()與gather()/pivot_longer(),搭配group_by()來達到資料整理目的的困難例子。 24.2.2 Data cleaning library(lubridate) raw <- read_csv("data/vaccinations.csv") fullvaccinated <- raw %>% select(country = location, date, people_fully_vaccinated_per_hundred) %>% drop_na(people_fully_vaccinated_per_hundred) %>% mutate(m = floor_date(date, unit = "month")) %>% group_by(country, m) %>% arrange(date) %>% slice(1) %>% ungroup() %>% select(-date) vperc_by_month <- fullvaccinated %>% spread(m, people_fully_vaccinated_per_hundred, fill=NA) %>% gather(month, perc, -country) %>% arrange(country, month) %>% group_by(country) %>% arrange(month) %>% mutate(perc = zoo::na.locf(perc, na.rm = F)) %>% ungroup() %>% arrange(country, month) %>% replace_na(list(perc=0)) 24.2.3 Visualization https://clauswilke.com/dataviz/visualizing-amounts.html 這個案例使用了三個維度的資料,分別為X軸的時間(月)、Y軸的國家、以及用顏色來呈現各國疫苗注射量(每百人)。並使用geom_tile()來製作熱圖。然而,Y軸的排序卻會影響讀圖。例如,在第一個例子中,Y軸的順序是用最後一個時間點的疫苗注射比例來排序。但每個國家政策和疫苗可獲量均不同,故開始注射和覆蓋速度也差很多,最終覆蓋量也會差很多。所以如果以最終覆蓋量來排序的話,反而不易觀察過程的變化,且「顏色」並不容易用來比較最終覆蓋量的大小,因而會產生很多讀圖上的困擾。 另一種繪圖策略是該書上的做法,其Y軸的排序是依照疫苗覆蓋率達到某個數值(例如每百人中有20人完整注射二劑疫苗)的時間早晚來排序。有此作為基準,每個國家在後續時間點的覆蓋速度的比較便比較容易。 另外需要注意到,顏色的取捨、以及相對於尺度的漸層設計也會影響讀圖。 24.2.3.1 Heatmap 01: Sorted by coverage of the last month watched <- c("United Arab Emirates", "Japan", "Singapore", "South Korea", "Taiwan", "Malaysia", "Hong Kong", "New Zealand", "Thailand", "Netherlands", "United States", "Israel", "United Kingdom", "Indonesia", "Thailand", "Philippines") vperc_by_month %>% spread(month, perc) %>% filter(country %in% watched) %>% mutate(country = reorder(country, -`2022-05-01`)) %>% gather(month, perc, -country) %>% ggplot() + aes(month, country, fill=perc) + geom_tile() + theme_minimal() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) 24.2.3.2 Heatmap 02: Sorted by the time of specific coverage rate Sort by the time when the vaccine coverage rate exceeds 20% for all countries on the Y-axis. https://clauswilke.com/dataviz/visualizing-amounts.html vperc_by_month %>% filter(country %in% watched) %>% mutate(month = lubridate::as_date(month)) %>% group_by(country) %>% mutate(month1 = min((month[perc > 20]))) %>% ungroup() %>% spread(month, perc) %>% mutate(country = reorder(country, -as.numeric(month1))) %>% select(-month1) %>% gather(month, perc, -country) %>% ggplot() + aes(month, country, fill=perc) + geom_tile() + theme_minimal() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) References "],["distribution-histogram-density.html", "Chapter 25 DISTRIBUTION: Histogram & Density 25.1 Density plot 25.2 Histogram 25.3 Pyramid Plot 25.4 Box plot: Muitiple Distrubution 25.5 Likert plot", " Chapter 25 DISTRIBUTION: Histogram & Density 本章節將介紹與資料分布相關的視覺化方法。資料分布是指數據中每個值出現的頻率或概率。在統計學中,了解資料分布是非常重要的,因為它可以幫助我們判斷數據是否為正態分佈,或者是否存在異常值或極端值。本章節將涵蓋常見的資料分布視覺化方法,包括直方圖、密度圖、箱形圖和金字塔圖等。 以下是R語言ggplot2套件中,用於資料分布視覺化的一些常用函式: geom_histogram():用於創建直方圖。 geom_density():用於創建密度圖。 geom_boxplot():用於創建箱形圖。 geom_bar():用於創建柱狀圖。 geom_freqpoly():用於創建頻率多邊形圖。 註:本節的設計概念不少是參考 Claus O. Wilke 所著的「Foundations of Data Visualization」一書的章節,同時也參考臺灣和資料新聞的案例進行了改編。 接下來我們將使用Histogram和Density Plot這兩種資料視覺化方法來探索台灣村里長的年齡和性別分布情況。我們所使用的資料來源包括內政部和中選會的投票資料,這些資料能夠提供具有代表性的統計樣本,幫助我們更好地了解村里長的整體特徵。在進行資料視覺化的過程中,我們將會運用R語言中的ggplot2套件,並根據不同的視覺化需求進行相應的設置和調整。 https://www.moi.gov.tw/LocalOfficial.aspx?n=577&TYP=KND0007。 vilmaster <- readr::read_csv("data/tw_vil2018_elccand.csv") %>% drop_na(當選註記) 25.1 Density plot 密度圖(Density Plot)是一種展示數據集分佈情況的圖表,它可以幫助我們更好地理解數據集中數值出現的概率。圖表的 X 軸代表數據集的數值範圍,Y 軸則代表每個數值的出現概率。與直方圖不同,密度圖的曲線是光滑的,因為它是通過連續的數值範圍估算出的概率密度函數。通過比較不同數據集的密度圖,我們可以更好地了解它們之間的差異。在ggplot2中,可以用geom_density()函數來創建密度圖。 p1 <- vilmaster %>% ggplot() + aes(年齡) + geom_density() + th p2 <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_density(alpha=0.5) + th + scale_fill_manual( limits=c('1', '2'), # original chart group values=c("gold", "skyblue"), # map to color name="性別", # legend title breaks=c(1, 2), # original legend group labels labels=c("Male","Female"), # map to new labels na.value = "lightgrey" # color for other groups ) cowplot::plot_grid( p1, p2, labels = c("(a) Overall", "(b) Group by gender"), nrow = 1, rel_widths = c(1, 1) ) 25.1.1 Density with different bandwidth 參數bw指的是bnadwidth,為繪製histogram時的bar所涵蓋的資料寬度。以step-plot來說,bw越大,則梯距越寬;以density-plot來說,若bw越大則越是平滑。 library(ggridges) # for geom_density_line() p.b05 <- vilmaster %>% ggplot() + aes(年齡) + geom_density_line(fill='gold', bw=0.5, kernel='gaussian') + th p.b1 <- vilmaster %>% ggplot() + aes(年齡) + geom_density_line(fill='gold', bw=1, kernel='gaussian') + th p.b5 <- vilmaster %>% ggplot() + aes(年齡) + geom_density_line(fill='gold', bw=5, kernel='gaussian') + th p.rect <- vilmaster %>% ggplot() + aes(年齡) + geom_density_line(fill='gold', bw=10, kernel='rectangular') + th cowplot::plot_grid( p.b05, p.b1, p.b5, p.rect, labels = c("(a) bw=.5", "(b) bw=1", "(c) bw=2", "(b) rect"), nrow = 2, rel_widths = c(1, 1) ) 25.2 Histogram 直方圖(Histogram)是一種用於展示數據集分佈的圖表。它通過將數據範圍分成若干個區間(稱為 “bins” 或 “buckets”),然後計算落在每個區間內的數據的數量(稱為 “frequency”),來展示數據集的分佈情況。直方圖的 X 軸表示數據範圍,Y 軸表示每個區間中的頻數。直方圖可以幫助我們快速了解數據的分佈情況,特別是數據的中心趨勢、數據的離散程度和是否存在異常值等。 25.2.1 Histogram with different number of bins p10 <- vilmaster %>% ggplot() + aes(年齡) + geom_histogram(bins=10, fill='royalblue') + th p20 <- vilmaster %>% ggplot() + aes(年齡) + geom_histogram(bins=20, fill='royalblue') + th p30 <- vilmaster %>% ggplot() + aes(年齡) + geom_histogram(bins=30, fill='royalblue') + th p40 <- vilmaster %>% ggplot() + aes(年齡) + geom_histogram(bins=40, fill='royalblue') + th cowplot::plot_grid( p10, p20, p30, p40, labels = c("(a) bins=10", "(b) bins=20", "(c) bins=30", "(b) bins=40"), nrow = 2, rel_widths = c(1, 1) ) 25.2.2 Density vs histogram Histogram通常用來顯示數據的分佈情況,它會把數據區間分成若干個等寬的區間,然後計算每個區間內數據的頻率,再將這些頻率表示在y軸上。因此,histogram顯示的是數據的頻率,而不是數據的密度。 Density plot則是用來顯示數據的概率密度函數,它會通過核密度估計(Kernel Density Estimation, KDE)方法,將數據點周圍的密度估計出來,然後將這些估計值表示在y軸上。因此,density plot顯示的是數據的密度,而不是數據的頻率。 pd <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_density(alpha=0.5) + th + scale_fill_manual( values=c("1"='gold', '2'="skyblue"), labels=c('1'="Male",'2'="Female"), name='Sex' ) ph <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_histogram(bins=20, position="dodge") + th + scale_fill_manual(values=c("1"='gold', '2'="skyblue ")) + theme(legend.position="none") cowplot::plot_grid( pd, ph, labels = c("(a) geom_density()", "(b) geom_histogram()"), nrow = 1, rel_widths = c(6, 4) ) 25.2.3 Positions of bar chart p.hist.dodge <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_histogram(bins=20, position="dodge") + th + scale_fill_manual( values=c("1"='gold', '2'="skyblue "), labels=c('1'="Male",'2'="Female"), name='Sex' ) p.hist.stack <- vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_histogram(bins=20, position="stack") + th + scale_fill_manual(values=c("1"='gold', '2'="skyblue ")) + theme(legend.position="none") cowplot::plot_grid( p.hist.dodge, p.hist.stack, labels = c("(a) position:dodge", "(b) position:stack"), nrow = 1, rel_widths = c(6, 4) ) 25.2.4 Display two groups histogram by facet_wrap() geom_histogram(bins=20, position=\"dodge\") 用於繪製直方圖, bins=20表示將數據分成20個區間, position=\"dodge\"表示將不同性別的數據分開顯示。 th 是本範例在最早先所建立的ggplot主題,用於設置圖表的樣式(例如背景顏色、字體等)。 scale_fill_manual() 用於手動設置填充顏色, values=c(\"1\"='gold', '2'=\"skyblue\") 表示性別為1時填充金色,性別為2時填充天藍色。 labels=c('1'=\"Male\",'2'=\"Female\") 表示將性別1標記為Male,性別2標記為Female。 name='Sex' 表示設置顏色圖例的標題為Sex。 facet_wrap(.~性別, nrow=1) 表示將不同性別的數據分開顯示,每直行顯示一個性別。.~性別 表示將數據按性別分組。 vilmaster %>% ggplot() + aes(年齡, fill=factor(性別)) + geom_histogram(bins=20, position="dodge") + th + scale_fill_manual( values=c("1"='gold', '2'="skyblue "), labels=c('1'="Male",'2'="Female"), name='Sex' ) + facet_wrap(.~性別, nrow=1) 25.3 Pyramid Plot 金字塔圖(Pyramid plot)是一種用於比較兩個群體的統計圖表。它的形狀像一座金字塔,通常用於展示男女或年齡分佈等相關的數據。金字塔圖以垂直線為軸線,其中一側代表一個群體(如男性),另一側代表另一個群體(如女性)。圖表的左右兩側是對稱的,並以一條中心線分開。圖表中的每一行表示一個年齡段,而每一列則表示一個群體的比例或頻數。金字塔圖的高度表示總人數或總比例,並且可以用不同的顏色區分不同的群體。金字塔圖可以直觀地顯示兩個群體之間的差異,特別是在不同年齡段之間。 25.3.1 Modify geom_col() to pyramid plot vilmaster %>% group_by(性別) %>% mutate(age_group = cut(年齡, 0:20*5+.01)) %>% count(age_group) %>% ungroup() %>% ggplot() + aes(x=age_group, y=ifelse(性別=='1', -1, 1)*n, fill=factor(性別)) + geom_col() + scale_y_continuous(name = "Count", breaks = 250*(-6:2), labels = c("1500", "1250", "1000", "750", "500", "250", "0", "250", "500")) + coord_flip() + scale_fill_manual( values=c("1"='gold', '2'="skyblue "), labels=c('1'="Male",'2'="Female"), name='Sex' ) + th + labs(y="Count", x="Age Group") 25.4 Box plot: Muitiple Distrubution 箱形圖(Box plot)是一種用於展示數據分佈情況的統計圖表。它通常顯示數據的中位數、四分位數、極值和異常值等統計量。箱形圖的中間線表示數據的中位數,箱子的上下邊界則分別表示數據的上四分位數和下四分位數。箱子的高度表示數據的變異程度,而箱子外的線段則表示數據的最大值和最小值。如果數據中存在異常值,則通常使用圓圈或星號等符號來標記。箱形圖可以用來比較不同數據集之間的分佈情況,以及檢查數據是否存在異常值。 25.4.1 TW-Salary (boxplot) Inspired by Six Myths About Choosing a College Major - The New York Times (nytimes.com) and What’s Going On in This Graph? | Jan. 9, 2018 - The New York Times (nytimes.com) library(readxl) raw <- read_excel("data/tw_salary109.xlsx", sheet=1, trim_ws = T) raw Category Q1 Median Q3 Mean 男 39.0 53.2 82.3 70.7 女 35.1 46.8 67.6 58.6 未滿25歲 28.1 35.8 45.1 37.7 25-29歲 36.6 47.8 61.7 53.0 30-39歲 39.2 53.3 77.0 64.1 40-49歲 39.9 56.9 91.8 74.8 50-64歲 37.8 53.3 88.4 75.5 65歲以上 30.6 40.9 63.1 62.6 國中及以下 32.7 40.5 52.0 45.4 高中(職) 34.5 44.7 59.8 51.9 大專 38.6 53.7 80.2 67.0 研究所 60.9 96.0 139.3 116.4 礦業及土石採取業 34.2 57.2 91.7 68.5 製造業 38.7 50.4 73.2 64.8 電力及燃氣供應業 73.9 110.7 139.9 113.2 用水供應及污染整治業 31.9 45.7 63.9 54.6 營建工程業 34.1 46.1 64.0 54.7 批發及零售業 36.6 49.5 71.7 62.7 運輸及倉儲業 40.3 58.3 81.4 66.1 住宿及餐飲業 30.1 36.7 49.3 42.0 出版﹑影音製作﹑傳播及 資通訊服務業 53.0 71.5 111.2 88.8 金融及保險業 65.6 96.9 140.1 113.4 不動產業 36.8 52.2 76.6 65.0 專業科學及技術服務業 41.9 61.3 95.0 77.5 支援服務業 33.1 42.1 49.3 45.3 教育業-不含小學以上各級 學校 28.4 33.7 42.7 37.2 醫療保健及社會工作服務業 41.3 60.1 88.1 77.1 藝術娛樂及休閒服務業 28.8 39.2 57.2 48.8 其他服務業 30.6 35.8 49.1 43.6 raw %>% slice(-(1:12)) %>% mutate(Category = reorder(Category, desc(Median))) %>% ggplot() + aes(y = Category, xlower=Q1, xmiddle=Median, xupper=Q3, xmin=0, xmax=150) + geom_boxplot(stat = "identity", color="white", fill="skyblue") + geom_point(aes(x = Mean)) + th + theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank()) 25.4.2 TW-Income (boxplot) 本案例用BoxPlot來呈現某個行政區(鄉鎮市區)各村里的所得中位數、平均數、四分位數的分佈。如果在箱型圖中,平均數高於第三分位數,這代表數據集呈現右偏分佈。也就是說,數據中的大部分觀測值都分佈在第一、二分位數之間,但存在一些較大的極端值,使平均值被往右偏移。從這樣的分佈中可以察覺某些里因為有少數極端高收入住戶,而使得平均高於四分位數。 library(gghighlight) toplot <- read_csv("data/tw_income_107.csv", ) %>% filter(!`村里` %in% c("合計", "其他", "福住里")) %>% filter(鄉鎮市區 %in% c("信義區")) %>% mutate(村里 = reorder(村里, desc(中位數))) toplot %>% mutate(group = if_else((平均數>第三分位數), "highlight", "none")) %>% ggplot() + aes(y = 村里, xlower=第一分位數, xmiddle=中位數, xupper=第三分位數, xmin= min(第一分位數), xmax=max(第三分位數), fill=group) + geom_boxplot(stat = "identity", color="white") + scale_fill_manual(values = c("highlight"="orangered", "none"="skyblue")) + guides(fill=FALSE) + geom_point(aes(x = 平均數)) + xlab("年所得(單位:千元)") + th + theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank()) 25.5 Likert plot raw <- read_rds("data/tfc_survey.rds") dt <- raw %>% mutate(QA3_lv = ordered(QA3, levels=c("20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70及以上"), labels = c("青年", "青年", "壯年", "壯年", "壯年", "中年", "中年", "中年", "中年", "老年", "老年"))) %>% mutate(Q7 = ordered(Q7, levels=c("一點也不會", "不會", "會", "絕對會"))) %>% mutate(Q8 = ordered(Q8, levels=c("一點也不會", "不會", "會", "絕對會"))) 25.5.1 Stacked or dodged bar 要比較不同年齡層在某個題項的填答結果時,最常見的是用Stacked或Dodged長條圖。Stacked是便於看到各組的總數大小但難以比較各組之間回應的比例,而Dodged是便於比較各組之間每個項目的比例,而不容易觀察總數大小。但這兩種呈現方法,以上面這個例子來說,從視覺化上均難以閱讀出來,哪個年齡層的填答比較靠近「會或絕對會」,又哪個年齡層比較靠近「絕對不會或不會」。 這時候我們可以用一種繪製方法來表達這類Likert問卷的結果,這種圖表稱為Likert Plot(Graph)。 p1 <- dt %>% count(QA3_lv, Q7) %>% ggplot() + aes(QA3_lv, n, fill=Q7) + geom_col(position = position_stack(reverse = TRUE)) + coord_flip() + th p2 <- dt %>% count(QA3_lv, Q7) %>% ggplot() + aes(QA3_lv, n, fill=Q7) + geom_col(position="dodge") + th cowplot::plot_grid( p1, NULL, p2, labels = c("(a) Stacked", "", "(b) Dodged"), ncol = 1, rel_heights = c(1, 0.1, 1) ) 25.5.2 Likert Graph Likert Graph繪製重點有幾個: 要轉用比例來繪製。例如下圖就是用絕對的數值來繪製,因為年齡層人數的不同,例如壯年人數比較多,而老年人數少非常多,反而難以跨組比較。 ggstats的套件有gglikert()可以用(請見Plot Likert-type items with `gglikert()` • ggstats (larmarange.github.io))的說明,但也可以用geom_segment()來自己刻。 用geom_segment()時在aes()多了幾個參數,為該資料在X軸的起始點與終點(x, xend)與Y軸的起始點與終點(y, yend)。要自己運算。 color <- c("#9393C6", "#A8A8A8","#FFA166", "#FF6200") dt %>% count(QA3_lv, Q7) %>% mutate(y_acc = cumsum(n)) %>% group_by(QA3_lv) %>% mutate(y_end = y_acc - min(y_acc) - n[[2]]) %>% mutate(y_start = y_end - n) %>% ungroup() %>% ggplot() + aes(x = QA3_lv, xend = QA3_lv, y = y_start, yend = y_end, , color=Q7) + geom_segment(linewidth = 18) + coord_flip() + theme_bw() + scale_color_manual("", labels = c("一點也不會", "不會", "會", "絕對會"), values = color, guide = "legend") + th 正確用比例繪製的結果如下。Likert Graph和本節所提到的Pyramid Graph在數位敘事上的效果很類似,都是對應到一般的Stacked或Dodged長條圖不易做組間比較。Pyramid Graph適於做兩組間的數值左右對照,Likert Graph則有助於快速看出不同題項或不同組別間的填答差異。 library(scales) dt %>% count(QA3_lv, Q7) %>% group_by(QA3_lv) %>% mutate(perc = n/sum(n)) %>% mutate(y_acc = cumsum(perc)) %>% mutate(y_end = y_acc - y_acc[[2]]) %>% # mutate(y_end = y_acc - perc[[1]] - perc[[2]]) %>% # mutate(y_end = y_acc - min(y_acc) - perc[[2]]) %>% mutate(y_start = y_end - perc) %>% ungroup() %>% ggplot() + aes(x = QA3_lv, xend = QA3_lv, y = y_start, yend = y_end, , color=Q7) + geom_segment(linewidth = 18) + scale_y_continuous(labels = percent_format()) + coord_flip() + scale_color_manual("", labels = c("一點也不會", "不會", "會", "絕對會"), values = color, guide = "legend") + ylab("Perc(%)") + xlab("Age group") + th "],["proportion.html", "Chapter 26 PROPORTION 26.1 Pie Chart 26.2 Dodged Bar Chart 26.3 Treemap: Nested Proportion", " Chapter 26 PROPORTION 26.1 Pie Chart 26.2 Dodged Bar Chart 26.3 Treemap: Nested Proportion Treemap是一種資料視覺化工具,用於呈現層級式結構的數據。它通常使用矩形或正方形區域來表示不同的數據單元,並將它們分層排列以形成層次樹狀結構。Treemap的特點包括: 易於理解:Treemap以直觀的方式呈現數據,讓使用者能夠輕鬆地了解各個數據單元之間的比例關係。 節省空間:Treemap使用矩形或正方形區域排列數據,能夠更有效地利用空間,呈現更多的數據。 可互動性:Treemap通常支持互動式操作,使用者可以通過縮放、懸停等方式,進一步了解數據。 Treemap適用於以下情況: 層級式數據:Treemap適用於層級式數據,例如組織架構、檔案系統等。 大量數據:Treemap能夠有效地呈現大量數據,並在縮放時保持清晰度。 比例關係:Treemap適用於呈現不同數據單元之間的比例關係,例如市場份額、支出等。 26.3.1 NYT: Carbon by countries 本案例取自紐時所報導之Who Has The Most Historical Responsibility for Climate Change? - The New York Times (nytimes.com)。該新聞報導了聯合國氣候峰會在格拉斯哥舉行期間的一個重要議題:世界上最富裕的國家,即那些對全球暖化負責任的不成比例的國家,應如何賠償因全球氣溫上升所造成的貧困國家的損失。報導指出,現今全球人口中,包括美國、加拿大、日本以及西歐大部分國家在內的富裕國家僅佔12%,但是在過去的170年中,這些國家卻負責了50%的溫室氣體排放。貧困國家要求富裕國家提供更多資金以應對全球暖化所帶來的風險。在峰會上,來自最不發達國家聯盟的Sonam P. Wangdi指出,他的祖國不丹對全球暖化的責任較小,因為該國目前吸收的二氧化碳比汽車和房屋排放的少。然而,不丹仍然面臨著由氣溫上升所帶來的嚴重風險,喜馬拉雅山脈融化的冰川已經導致了洪水和泥石流,摧毀了村莊。報導指出,最不發達國家需要更多的資金和支持,以應對全球暖化所帶來的影響。 本案例的Treemap以面積顯示了各國的碳排放所佔比例,並用顏色視覺化各國的人均GDP。Per Capita是拉丁語,通常用來表示某種統計數據與人口數量之間的關係。它是指將某一特定數量的總量除以人口數目,以得出每個人所擁有的平均數量。例如,國家的人均GDP(Gross Domestic Product,國內生產總值)是指該國的總GDP除以該國的人口數,以反映一個人在該國經濟中所創造的平均貢獻。Per Capita常用於比較不同國家或地區之間的平均水平,以及分析人均收入、人均支出、人均消費等數據。 totreemap <- read_csv("data/GCB2021v34_MtCO2_flat.csv") %>% drop_na(`Total`) %>% filter(!Country %in% c("Global", "International Transport")) %>% filter(Year==2020) %>% arrange(desc(`Total`)) %>% mutate(perc = Total/sum(Total)) %>% slice(1:20) library(treemapify) totreemap %>% ggplot() + aes(area = perc, fill=`Per Capita`, label=Country) + geom_treemap() + geom_treemap_text(color="white", place="centre", grow=TRUE ) 26.3.2 TW: Taiwan Annual Expenditure 上述案例未能突顯出Treemap能夠呈現階層式資料的特色。因此本案例將使用台灣中央預算,階層化地顯示不同機構層級(大類、一級部會)等的預算佔比。例如衛福部、財政部與勞動部的預算均屬於社會福利支出。 這段程式碼中,使用了 zoo 套件中的 na.locf() 函數。此函數用於將 raw 資料框中的 款 欄位的缺失值 (NA) 以最近已知的值 (向前填補) 進行填補。 library(zoo) # raw <- readxl::read_excel("data/111B歲出政事別預算總表.xls") raw <- readxl::read_excel("data/111B歲出政事別預算表.xls", skip=3, col_names = F) names(raw) <- c("款", "科", "目", "節", "機構", "本年度預算", "上年度預算", "上年度決算", "預算差") # raw$款 <- na.locf(raw$款) cleand <- raw %>% filter(!is.na(款) | !is.na(科)) %>% slice(-(1:2)) %>% select(-目, -節) %>% mutate(org = purrr::map(機構, function(x){str_split(x, "\\n")[[1]][2]})) %>% mutate(款 = ifelse(!is.na(款), unlist(org), unlist(款))) %>% mutate(款 = zoo::na.locf(款)) %>% filter(!is.na(科)) %>% select(-科) %>% type_convert() %>% mutate(上年度預算 = as.numeric(上年度預算), 上年度決算 = as.integer(上年度決算), 預算差 = as.numeric(預算差)) %>% replace_na(list(上年度預算 = 0, 上年度決算 = 0)) %>% mutate(預算差 = 本年度預算 - 上年度預算) cleand %>% filter(款 %in% c("科學支出")) %>% ggplot() + aes(area = 本年度預算, fill=`本年度預算`, label=org) + geom_treemap() + geom_treemap_text(color="white", place="centre", grow=TRUE, family = "Heiti TC Light" ) + theme(title = element_text(family = "Heiti TC Light"), text = element_text(family = "Heiti TC Light")) library(treemapify) cleand %>% # filter(款 %in% c("科學支出", "教育支出", "國防支出", "司法支出")) %>% ggplot() + aes(area = 本年度預算, fill=`本年度預算`, label=org, subgroup = 款) + geom_treemap() + geom_treemap_subgroup_border(color="gold") + geom_treemap_subgroup_text(place = "centre", grow = T, alpha = 0.5, colour = "gold", min.size = 0, family = "Heiti TC Light") + geom_treemap_text(color="white", place="centre", grow=F, family = "Heiti TC Light" ) + theme(title = element_text(family = "Heiti TC Light"), text = element_text(family = "Heiti TC Light"), legend.position = "none") "],["association.html", "Chapter 27 ASSOCIATION 27.1 等比例座標軸", " Chapter 27 ASSOCIATION 27.1 等比例座標軸 27.1.1 UNICEF-Optimistic (WGOITH) https://www.nytimes.com/2021/11/17/upshot/global-survey-optimism.html https://changingchildhood.unicef.org/about plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>% select(country = WP5, age = WP22140, bw = WP22092) %>% mutate(country = ordered(country, levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17, 29, 31, 33, 35, 36, 60, 61, 77, 79, 81, 87, 165), labels=c("USA", "Morocco", "Lebanon", "Indonesia", "Bangladesh", "UK", "France", "Germany", "Spain", "Japan", "India", "Brazil", "Nigeria", "Kenya", "Ethiopia", "Mali", "Ukraine", "Cameroon", "Zimbabwe", "Argentina", "Peru"))) %>% count(country, age, bw) %>% group_by(country, age) %>% mutate(perc = n/sum(n)) %>% ungroup() %>% filter(bw == 1) %>% select(country, age, perc) %>% spread(age, perc) %>% rename(`15-24y` = `1`, `40+y` = `2`) plot.opt %>% head(10) %>% knitr::kable() country 15-24y 40+y USA 0.6679842 0.4611465 Morocco 0.4365079 0.4735812 Lebanon 0.5467197 0.4435798 Indonesia 0.7920605 0.8027344 Bangladesh 0.4624506 0.4319527 UK 0.5040000 0.4140000 France 0.3900000 0.2640000 Germany 0.5900000 0.3860000 Spain 0.5160000 0.3340000 Japan 0.6367265 0.2586873 plot.opt %>% ggplot() + aes(`40+y`, `15-24y`, label = country) + geom_point(color = "skyblue", size = 2) + xlim(0, 1) + ylim(0,1) + geom_text(hjust = -0.1, vjust = -0.5) + geom_abline(intercept = 0, slop = 1, color="lightgrey", alpha=0.5, linetype="dashed") + theme_minimal() + theme(aspect.ratio=1) "],["time-trends.html", "Chapter 28 TIME & TRENDS 28.1 Highlighting: Unemployed Population 28.2 Smoothing: Unemployed", " Chapter 28 TIME & TRENDS 28.1 Highlighting: Unemployed Population This example is referenced from Datacamp’s Introduction to data visualization with ggplot2。 28.1.1 The econimics data 這是一個包含美國經濟時間序列資料的資料集,資料來源為https://fred.stlouisfed.org/。economics是以「寬」表格方式儲存,而economics_long 資料框則以「長」表格方式儲存。每一列之date為資料收集的月份。 pce:個人消費支出,以十億美元為單位,資料來源為 https://fred.stlouisfed.org/series/PCE pop:總人口數,以千人為單位,資料來源為 https://fred.stlouisfed.org/series/POP psavert:個人儲蓄率,資料來源為 https://fred.stlouisfed.org/series/PSAVERT/ uempmed:失業中位數持續時間,以週為單位,資料來源為 https://fred.stlouisfed.org/series/UEMPMED unemploy:失業人數,以千人為單位,資料來源為 https://fred.stlouisfed.org/series/UNEMPLOY economics %>% head() ## # A tibble: 6 × 6 ## date pce pop psavert uempmed unemploy ## <date> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1967-07-01 507. 198712 12.6 4.5 2944 ## 2 1967-08-01 510. 198911 12.6 4.7 2945 ## 3 1967-09-01 516. 199113 11.9 4.6 2958 ## 4 1967-10-01 512. 199311 12.9 4.9 3143 ## 5 1967-11-01 517. 199498 12.8 4.7 3066 ## 6 1967-12-01 525. 199657 11.8 4.8 3018 28.1.2 Setting marking area recess <- data.frame( begin = c("1969-12-01","1973-11-01","1980-01-01","1981-07-01","1990-07-01","2001-03-01", "2007-12-01"), end = c("1970-11-01","1975-03-01","1980-07-01","1982-11-01","1991-03-01","2001-11-01", "2009-07-30"), event = c("Fiscal & Monetary\\ntightening", "1973 Oil crisis", "Double dip I","Double dip II", "Oil price shock", "Dot-com bubble", "Sub-prime\\nmortgage crisis"), y = c(.01415981, 0.02067402, 0.02951190, 0.03419201, 0.02767339, 0.02159662, 0.02520715) ) library(lubridate) recess <- recess %>% mutate(begin = ymd(begin), end = ymd(end)) economics %>% ggplot() + aes(x = date, y = unemploy/pop) + ggtitle(c("The percentage of unemployed Americans \\n increases sharply during recessions")) + geom_line() + geom_rect(data = recess, aes(xmin = begin, xmax = end, ymin = -Inf, ymax = +Inf, fill = "Recession"), inherit.aes = FALSE, alpha = 0.2) + geom_label(data = recess, aes(x = end, y = y, label=event), size = 3) + scale_fill_manual(name = "", values="red", label="Recessions") 28.2 Smoothing: Unemployed Smooth by bin smoothing fit <- with(economics, ksmooth(date, unemploy, kernel = "box", bandwidth=210)) economics %>% mutate(smooth = fit$y) %>% ggplot() + aes(date, unemploy) + geom_point(alpha = 5, color = "skyblue") + geom_line(aes(date, smooth), color="red") + theme_minimal() 28.2.1 Polls_2008 Second Example comes from Rafael’s online book library(dslabs) span <- 7 polls_2008 ## # A tibble: 131 × 2 ## day margin ## <dbl> <dbl> ## 1 -155 0.0200 ## 2 -153 0.0300 ## 3 -152 0.065 ## 4 -151 0.06 ## 5 -150 0.07 ## 6 -149 0.05 ## 7 -147 0.035 ## 8 -146 0.06 ## 9 -145 0.0267 ## 10 -144 0.0300 ## # ℹ 121 more rows fit <- with(polls_2008, ksmooth(day, margin, kernel = "box", bandwidth = span)) polls_2008 %>% mutate(smooth = fit$y) %>% ggplot(aes(day, margin)) + geom_point(size = 3, alpha = .5, color = "grey") + geom_line(aes(day, smooth), color="red") + theme_minimal() "],["geospatial.html", "Chapter 29 GEOSPATIAL 29.1 World Map 29.2 Read Spatial Data from SEGIS 29.3 Town-level: Taipei income 29.4 Voting map - County level 29.5 Mapping data with grid 29.6 Mapping Youbike Location", " Chapter 29 GEOSPATIAL 地圖是一種用來展示地理空間信息的視覺化工具,可以幫助我們更好地了解和分析地理現象。常見的地圖種類通常可以分為兩類:區域圖和點位圖。 區域圖(Choropleth Map)是通過將地理區域劃分為幾個區域,然後用不同的顏色、陰影或圖案等方式來表示這些區域的某種屬性或數量。這種地圖通常用於展示國家、省份、城市等區域的人口、經濟、地形、氣候等相關數據。區域圖能夠直觀地展示地理現象在不同區域之間的差異和變化,並有助於我們進行比較和分析。 點位圖(Dot Density Map)則是通過在地圖上用點或符號來表示某種地理空間現象的分布或密度。例如,可以用紅點表示城市、綠點表示森林、藍點表示湖泊等等。這種地圖通常用於展示地理現象在空間上的分布和密度,並能夠直觀地展示相對密度和稀疏程度。 區域圖的數據形式:有兩種基本數據模型:向量(Vector)和網格(Raster)。 向量數據模型使用點、線、多邊形等基本要素來描述地理空間現象。例如,可以用一個線段來表示一條河流,用一個多邊形來表示一個國家或城市的邊界等。向量數據模型具有比較強的邏輯性和表達能力,特別適合描述較簡單的地理現象。 網格數據模型則是將地理空間區域劃分為一個個大小相等的格子,每個格子都有一個固定的數值,用來表示這個區域的某種屬性,例如溫度、濕度、高程等等。網格數據模型適合描述分布比較連續和具有變化的地理現象。 通常繪製地理資訊地圖的時候,會需要因應你要繪製的地域去下載地圖空間數據檔案(例如.shape或geojson檔等)。如台灣的就可以去社會經濟資料服務平台 (moi.gov.tw)下載。但也有一些套件內部就包含這些地理空間數據,例如下一節的例子rworldmap套件本身就有世界地圖。或者可以嘗試ggmap或rgooglemap等第三方服務(參考簡介:Map Visualization in R · Data Science and R) 29.1 World Map library(readxl) library(rworldmap) # for drawing rworldmap rawdata <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) mapdata <- rawdata[,c(3, 6:24)] 29.1.1 Bind data to map data 這段程式碼是在將自己的數據mapdata與rworldmap世界地圖數據進行結合。 首先,使用 joinCountryData2Map() 函數,將自己的數據和世界地圖數據按照國家的 ISO3 代碼進行連接,生成一張新的地圖。其中, mapdata 是指世界地圖數據, joinCode 參數指定連接時使用的 ISO3 代碼(亦即你預先知道你自己的資料中有ISO3國家代碼)。 nameJoinColumn 參數則用於指定自己數據中與國家對應的欄位名稱為iso3。 還有其他的joinCode如「“ISO2”,“ISO3”,“FIPS”,“NAME”, “UN” = numeric codes」等可參見該套件的說明rworldmap package - RDocumentation。 # join your data with the world map data myMap <- joinCountryData2Map(mapdata, joinCode = "ISO3", nameJoinColumn = "iso3") ## 196 codes from your data successfully matched countries in the map ## 1 codes from your data failed to match with a country code in the map ## 47 codes from the map weren't represented in your data myMap$matleave_13 ## [1] 2 2 5 2 2 5 NA NA 3 5 5 2 4 3 3 3 5 2 5 5 3 2 3 3 2 ## [26] 2 3 4 3 4 3 3 3 3 3 3 3 5 NA 3 5 5 3 5 2 3 2 2 2 3 ## [51] 5 2 5 2 NA 4 3 4 3 2 3 4 2 2 4 NA 2 2 2 5 2 5 2 2 4 ## [76] 4 2 4 3 4 2 2 5 3 2 3 2 5 NA 2 2 2 2 3 2 2 5 4 5 3 ## [101] 5 3 2 4 3 2 5 5 2 3 2 2 2 NA 3 2 2 3 4 2 3 2 2 3 2 ## [126] 2 1 5 NA 2 4 2 2 5 5 2 NA 2 2 2 3 2 2 2 3 5 1 5 5 5 ## [151] 2 3 3 3 2 5 3 2 3 2 3 NA 2 2 5 2 1 5 4 4 2 NA 2 3 3 ## [176] 3 NA NA NA 3 NA NA 2 2 NA NA 2 2 3 2 NA NA 2 NA 1 NA NA 2 NA NA ## [201] NA NA NA NA NA NA 2 2 2 3 NA NA 3 2 1 3 NA NA 2 NA 1 1 NA 1 NA ## [226] 3 NA NA 5 NA 2 NA 3 NA 1 5 2 NA NA NA 2 2 NA 29.1.2 Drawing Map mapCountryData() 函數用於將數據繪製在地圖上。其中, myMap 是已經連接過的世界地圖數據和自己的數據,包含了各國的地理空間信息和相關的數據資訊。 nameColumnToPlot 指定要顯示在地圖上的數據欄位為matleave_13,也就是 2013 年的產假長度。 catMethod 參數是決定視覺化時的數據分類是類別或連續,categorical表示將數據分成幾個等級來展示在地圖上。 mapCountryData(myMap , nameColumnToPlot="matleave_13" , catMethod = "categorical" ) 29.1.3 Drawing map by specific colors # self-defined colors colors <- c("#FF8000", "#A9D0F5", "#58ACFA", "#0080FF", "#084B8A") mapCountryData(myMap , nameColumnToPlot="matleave_13" , catMethod = "categorical" , colourPalette = colors , addLegend="FALSE" ) 29.1.4 Practice. Drawing map for every years 繪製自1995至2013年每年的地圖並觀察其上的變化。 繪製的時候請嘗試使用par()來把每年的地圖繪製在同一張圖上,怎麼做? 你能觀察出變化來嗎?可否透過顏色的調整來凸顯變化?你的策略是什麼? 29.2 Read Spatial Data from SEGIS 要繪製地理地圖會要先下載地圖檔,可以查詢「直轄市、縣市界線(TWD97經緯度)」和鄉鎮市區界線(TWD97經緯度) | 政府資料開放平臺 (data.gov.tw)。 接下來是取得要繪製在地圖上的資料。前面的rworldmap是已知地圖檔和資料檔中都有每個國家的ISO3代碼,所以可以用ISO3代碼來連結地圖檔和資料檔。如果是臺灣的資料,可能就要用縣市名稱來做連結。或者,某些圖資本身就有經緯度,甚至它並非區域圖,而是有經緯度的點位圖。這類的圖資檔案可以到社會經濟資料服務平台 (moi.gov.tw)查找並下載。 通常地理圖資檔有兩種格式:一種是geojson,一種是shapefile。 shapefile 是一種老舊的地理圖資檔案格式,通常由 shp, shx, dbf, prj 等檔案組成。其中,shp 檔案包含了地理空間範圍和形狀的點與邊(邊通常是由點依序所構成,不會特別把邊標出來),shx 檔案是其索引文件,dbf 檔案則儲存了相關的屬性資訊,例如幾何特徵的名稱或變數,prj 檔案則是儲存了投影信息。shapefile 格式的優點是廣泛的應用性和支援程式豐富,可以在許多地理信息系統(GIS)和軟件中使用,是許多組織和機構最常用的地理圖資格式之一。 geojson 則是一種基於 JSON 格式的地理圖資檔案格式,內容包含了地理空間範圍和屬性。geojson 的優點是格式簡單、容易理解和易於編輯,支援性也比較好。由於 geojson 使用的是文本格式,因此可以直接在許多文本編輯器中編輯和查看,也可以輕易地轉換成其他格式的地理圖資檔案。 這邊我們所要用的套件是sf,sf 是一個在 R 環境下進行地理圖資處理和分析的套件,他不僅支援多種檔案格式,包括 shapefile、GeoJSON、KML 等,並且可以直接將這些檔案轉換為 R 中的空間資料框架,方便進行進一步的處理和分析。更方便的特色是在於,它可以用tidyverse的風格來寫作,方便對地理圖資和其他數據進行整合和分析,甚至在使用View()的時候,把圖資當成一個變項。 library(sf) 29.2.1 The case: Population and Density of Taipei 這個資料下載自社會經濟資料服務平台 (moi.gov.tw)的111年9月行政區人口統計_鄉鎮市區_臺北市,實際上內部的資料包含368個鄉鎮的依性別分人口數、家戶數等。 資料變項包含每個區的家戶數(H_CNT)、總人口數(P_CNT)、男性人口數(M_CNT)、女性人口數(F_CNT)。等一下要計算每平方公里的家戶數或人口數時,你會疑惑為何沒有面積資料。 sf_tpe <- st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/", layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>% mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>% # mutate(across(where(is.double), ~if_else(is.na(.),as.double(0),.))) %>% # st_set_crs(3826) %>% st_transform(4326) %>% # filter(COUNTY == "臺北市") filter(str_detect(COUNTY, "臺北市")) sf_tpe %>% head() ## Simple feature collection with 6 features and 9 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 300874.7 ymin: 2766756 xmax: 309745.8 ymax: 2776127 ## CRS: NA ## TOWN_ID TOWN COUNTY_ID COUNTY H_CNT P_CNT M_CNT F_CNT INFO_TIME ## 1 63000010 松山區 63000 臺北市 78977 187552 87625 99927 111Y09M ## 2 63000020 信義區 63000 臺北市 87407 201951 95884 106067 111Y09M ## 3 63000030 大安區 63000 臺北市 117243 280332 130596 149736 111Y09M ## 4 63000040 中山區 63000 臺北市 98825 210156 97114 113042 111Y09M ## 5 63000050 中正區 63000 臺北市 64491 146628 69663 76965 111Y09M ## 6 63000060 大同區 63000 臺北市 51988 118065 57003 61062 111Y09M ## geometry ## 1 MULTIPOLYGON (((307703.1 27... ## 2 MULTIPOLYGON (((307788.7 27... ## 3 MULTIPOLYGON (((304591.5 27... ## 4 MULTIPOLYGON (((305699 2776... ## 5 MULTIPOLYGON (((302203.6 27... ## 6 MULTIPOLYGON (((302217.9 27... 試著畫畫看。你會發現它的座標系是一個我們看不懂的數字,而不是想像中的經緯度。 sf_tpe %>% ggplot() + geom_sf() 29.2.2 Projection 投影的概念 投影是指將地球表面的三維空間坐標轉換為二維平面坐標的過程,這是因為在實際應用中需要將地球表面的訊息表示在平面上,方便分析和可視化。然而,由於地球是一個球體,不同的投影方式會導致在不同位置和距離上的形狀、面積和方向出現差異,因此在使用地理空間數據進行分析和視覺化時需要注意投影的選擇和轉換。 除了投影之外,每個地理區域還有適合的參考橢球體和大地基準面。橢球體是指地球表面的形狀,大地基準面則是指地球表面的平均高程面。這些概念的選擇取決於具體的地理區域和應用場景,並且可能會對數據分析結果產生影響。基準點(Datum)則是用來定義地球表面上的某個點,從而將地球表面的形狀和大小轉換為平面坐標系中的數值。基準點分為區域性的(local)和全球的(global)。區域性的基準點通常是針對某個特定的地理區域進行定義,而全球的基準點則是針對整個地球進行定義。全球最常用的基準點是WGS84,它以地球質心為中心;而台灣常用的區域性基準點是TWD97,舊版則是用TWD67。基準點的選擇也可能會對數據分析結果產生影響。 投影法有對應的代號稱為 EPSG(歐洲石油探勘組織),他們制定了空間參考識別系統(SRID)。可以記兩個重要的: WGS84 = 4326 TWD97 = 3826 參考:https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet Google Earth採用WGS84坐標系統的地理坐標系統。(EPSG:4326) Google Maps採用以WGS84為基礎的投影坐標系統。(EPSG 3857) Open Street Map數據庫中的數據以WGS84坐標系統的十進制度為單位進行儲存。(EPSG:4326) Open Street Map瓦片和WMS服務採用以WGS84為基礎的投影坐標系統。(EPSG 3857) https://epsg.io/3825 是台灣的坐標系統(3826、3827等也是,你可以打開看看) 用得到投影的情境 研究區域,想轉換座標(changing projections):修改 EPSG code 或是改掉 proj4string 的內容 原始資料缺投影方法:加上 EPSG code 或是加上 proj4string 的內容 如果需要進行投影轉換,可以使用 R 中的相關函數和方法。例如, 使用 st_crs() 函數可以取得地理空間數據的投影系統; 使用 st_transform() 函數可以進行地理空間數據的投影變換; 使用 st_set_crs() 函數可以設定地理空間數據的投影系統等等。 就下載的這個資料來說,他並沒有設定他的投影座標。 st_crs(sf_tpe)$proj4string ## [1] NA st_crs(sf_tpe) ## Coordinate Reference System: NA 我們會希望在讀取資料的時候,設定他的投影座標。例如以下的例子是設定為TWD96(3826)然後轉換為全球座標WGS84(4326)。 sf_tpe <- st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/", layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>% mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>% st_set_crs(3826) %>% # st_transform(4326) %>% filter(str_detect(COUNTY, "臺北市")) st_crs(sf_tpe)$proj4string ## [1] "+proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs" st_crs(sf_tpe) ## Coordinate Reference System: ## User input: EPSG:3826 ## wkt: ## PROJCRS["TWD97 / TM2 zone 121", ## BASEGEOGCRS["TWD97", ## DATUM["Taiwan Datum 1997", ## ELLIPSOID["GRS 1980",6378137,298.257222101, ## LENGTHUNIT["metre",1]]], ## PRIMEM["Greenwich",0, ## ANGLEUNIT["degree",0.0174532925199433]], ## ID["EPSG",3824]], ## CONVERSION["Taiwan 2-degree TM zone 121", ## METHOD["Transverse Mercator", ## ID["EPSG",9807]], ## PARAMETER["Latitude of natural origin",0, ## ANGLEUNIT["degree",0.0174532925199433], ## ID["EPSG",8801]], ## PARAMETER["Longitude of natural origin",121, ## ANGLEUNIT["degree",0.0174532925199433], ## ID["EPSG",8802]], ## PARAMETER["Scale factor at natural origin",0.9999, ## SCALEUNIT["unity",1], ## ID["EPSG",8805]], ## PARAMETER["False easting",250000, ## LENGTHUNIT["metre",1], ## ID["EPSG",8806]], ## PARAMETER["False northing",0, ## LENGTHUNIT["metre",1], ## ID["EPSG",8807]]], ## CS[Cartesian,2], ## AXIS["easting (X)",east, ## ORDER[1], ## LENGTHUNIT["metre",1]], ## AXIS["northing (Y)",north, ## ORDER[2], ## LENGTHUNIT["metre",1]], ## USAGE[ ## SCOPE["Engineering survey, topographic mapping."], ## AREA["Taiwan, Republic of China - between 120°E and 122°E, onshore and offshore - Taiwan Island."], ## BBOX[20.41,119.99,26.72,122.06]], ## ID["EPSG",3826]] sf_tpe %>% ggplot() + geom_sf() sf_tpe %>% ggplot() + aes(fill = P_CNT) + geom_sf(color = NA) + scale_fill_gradient(low = "white", high = "purple") 面積資料可以用st_area()這個函式求得。st_area() 是 R 中一個與地理空間數據相關的函數,用於計算地理多邊形的面積。具體而言,st_area() 函數接受一個 Spatial* 或是 sf 的資料物件,可以計算其包含的每個多邊形的面積,並以相應的單位返回結果。其中 as.double(st_area(.))/1000000 的作用是將地理多邊形的面積從平方公尺轉換為平方公里。因為面積的單位是平方公尺,而人口密度的常用單位是人口數/平方公里,因此需要進行單位換算,將面積轉換為平方公里。 st_area() 函數的計算方式基於多邊形的投影,因此在使用該函數時需要注意地理空間數據的投影選擇和轉換。通常情況下,st_area() 函數可以自動識別多邊形的投影系統,並返回相應的面積值。如果需要在不同的投影系統間進行面積的轉換,則需要使用 st_transform() 函數進行投影變換。 需要注意的是,由於地球是一個球體,因此在計算面積時需要考慮到地球的曲率效應。st_area() 函數默認使用的是橢球面積計算公式(ellipsoidal area formula),可以更準確地計算地理多邊形的面積。如果需要更精確的面積計算結果,也可以使用球面面積計算公式(spherical area formula)或是進行局部的面積校正。 sf_tpe %>% mutate(p_density = P_CNT/(as.double(st_area(.))/1000000)) %>% ggplot() + aes(fill = p_density) + geom_sf(color = NA) + scale_fill_gradient(low = "white", high = "purple") 29.3 Town-level: Taipei income 有時候我們所希望繪製的資料並非來自SEGIS這類有圖資的平台(例如下面所用的台北各區每人平均所得),那我們就會需要先取得另一份圖資資料(例如下例的鄉鎮市區界圖資),再透過一些索引(Index)來結合這兩方的資料。而下面這個例子,還為了要將鄉鎮市區名稱打在各區的中央,結合了另一份資料,一共結合了三方的資料。 29.3.1 Reading income data taipei_income <- readxl::read_xlsx('data/台北各區每人所得.xlsx') taipei_income %>% head() ## # A tibble: 6 × 2 ## district income ## <chr> <dbl> ## 1 松山區 1012678 ## 2 信義區 909336 ## 3 大安區 1038921 ## 4 中山區 861415 ## 5 中正區 1022438 ## 6 大同區 814439 29.3.2 Read Taipei zip code 等一下我打算把每區的名稱打在各區上,但是我沒有各區的名稱應該打在哪裡的經緯度,恰好Zip Code這份資料裡面有台北市各區的經緯度中心,因此先把它讀進來合併用。 library(jsonlite) twzipcode_json <- fromJSON("data/twzipcode.json")[[1]] taipei_zipcode <- twzipcode_json %>% filter(city == "台北市") taipei_zipcode %>% head() ## zip_code district city lat lng ## 1 100 中正區 台北市 25.0324 121.520 ## 2 103 大同區 台北市 25.0634 121.513 ## 3 104 中山區 台北市 25.0697 121.538 ## 4 105 松山區 台北市 25.0600 121.558 ## 5 106 大安區 台北市 25.0268 121.543 ## 6 108 萬華區 台北市 25.0286 121.498 # install.packages("rmapshaper") st_read("data/shapefiles/TOWN_MOI_1100415.shp") %>% filter(COUNTYNAME == "臺北市") %>% # st_transform(3825) %>% #3857 # rmapshaper::ms_simplify(keep=0.05) %>% left_join(taipei_income, by = c("TOWNNAME" = "district")) %>% left_join(taipei_zipcode, by= c("TOWNNAME" = "district")) %>% ggplot() + aes(fill = income) + geom_sf() + scale_fill_gradient2(low = "#FF8888", high = "#0000AA", midpoint = median(taipei_income$income)) + geom_text(aes(x = lng, y = lat, label = TOWNNAME), family = "Heiti TC Light", color = "black", size = 2.5) ## Reading layer `TOWN_MOI_1100415' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/TOWN_MOI_1100415.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 368 features and 7 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 29.4 Voting map - County level 本練習將以2016年總統選舉為例,比較朱立倫、宋楚瑜、蔡英文在不同縣市的得票率,並繪製為地圖。該地圖比較有趣的是,因為台灣的地圖實際上是由很多點連成的,在這麼大的規模如果把全部的點全部繪製上去,會繪製非常久,而讀者也不盡然能夠看清楚這個差別,所以可以降低點的數量。 29.4.1 Loading county-level president voting rate president_vote <- readxl::read_xlsx('data/president.xlsx') %>% mutate(total = chu + tsai + song) %>% mutate(chu_ratio = chu / total, tsai_ratio = tsai / total, song_ratio = song / total, tsai_chu_ratio = tsai / chu) 29.4.2 sf to load county level shp https://fidanalytics.co.uk/blog/simplifying-polygons-r county_sf <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") ## Reading layer `COUNTY_MOI_1090820' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 22 features and 4 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 # plot(county_sf) # Taking very long time 29.4.3 Simplfying map polygon county_ms_simp <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>% # rmapshaper::ms_simplify(county_sf, keep=0.001) st_simplify(dTolerance = 100) ## Reading layer `COUNTY_MOI_1090820' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 22 features and 4 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 plot(county_ms_simp) # install.packages("rmapshaper") plot_chu <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>% # st_transform(3825) %>% #3857 st_simplify(dTolerance = 10) %>% # rmapshaper::ms_simplify(keep=0.01) %>% right_join(president_vote, by=c("COUNTYNAME"="county")) ## Reading layer `COUNTY_MOI_1090820' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 22 features and 4 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 plot_chu %>% ggplot(aes(fill = chu_ratio)) + geom_sf(color="white", size=0.2) + scale_fill_gradient(low = "#FFFFFF", high = "#0000FF") 29.4.4 Practice. Drawing Taiwan county-scale map from SEGIS data 這個練習希望你從SEGIS下載一個縣市層級的資料,並測試以下函式的結果: 運用st_transform()和st_set_crs()等函式測試用3826或4326座標系有何不同? 在用st_area()計算面積時會不會有何不同? 在視覺化的時候可否看出來有何不同?請寫程式測試看看。 st_simplify()這個函式可以降低點的數量,但運用st_simplify(dTolerance = 100),dTolerance的設定是如何影響點的數量?100所指的是什麼?公尺嗎? 用st_bbox()可以得知上下界為何,請試用這個函式看看? 如何運用st_crop()切出台灣本島(不包含澎湖、金門、馬祖)得地圖? 29.5 Mapping data with grid library(sf) 29.5.1 Loading Taiwan map TW.island <- st_read("data/shapefiles/COUNTY_MOI_1090820.shp") %>% st_transform(3826) %>% mutate(id = row_number()) ## Reading layer `COUNTY_MOI_1090820' from data source ## `/Users/jirlong/Library/CloudStorage/Dropbox/Programming/JOUR5014/data/shapefiles/COUNTY_MOI_1090820.shp' ## using driver `ESRI Shapefile' ## Simple feature collection with 22 features and 4 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 114.3593 ymin: 10.37135 xmax: 124.5611 ymax: 26.38528 ## Geodetic CRS: TWD97 29.5.2 Building grid # Defining grid size grid.extent <- matrix(c(-50000, 2920000, # (Xmin, Ymax) 610000, 2920000, # (Xmax, Ymax) 610000, 2420000, # (Xmax, Ymin) -50000, 2420000, # (Xmin, Ymin) -50000, 2920000), # (Xmin, Ymax) byrow = TRUE, ncol = 2) %>% list() %>% # convert to list for st_polygon() st_polygon() %>% # generate polygon st_sfc(crs = 3826) # convert format and crs # plot(grid.extent) # Generating grid Grid.sys <- st_make_grid(grid.extent, n = c(132, 100), # Resolution of grids crs = 3826, # crs: TWD97 121 what = 'polygons') %>% # output format: polygon st_sf('geometry' = ., data.frame('ID' = 1:length(.))) # convert to sf with id # st_transform(3826) # assigning crs again ? plot(Grid.sys) Grid.TW <- Grid.sys[subset(TW.island),] plot(Grid.TW) 29.5.3 loading data president_vote <- readxl::read_xlsx('data/president.xlsx') %>% mutate(total = chu + tsai + song) %>% mutate(chu_ratio = chu / total, tsai_ratio = tsai / total, song_ratio = song / total, tsai_chu_ratio = tsai / chu) 29.5.4 Merging data tw_info <- TW.island %>% st_set_geometry(NULL) %>% left_join(president_vote, by=c("COUNTYNAME"="county")) # TW_info <- sf::st_intersects(Grid.TW, TW.island) # creat a data.frame of IDs in IBA for 1km grid grid_id <- sapply(st_intersects(Grid.TW, TW.island), function(z) if (length(z)==0) NA_integer_ else z[1]) Grid.TW <- Grid.TW %>% mutate(grid_id = grid_id) %>% left_join(tw_info, by=c("grid_id"="id")) Grid.TW %>% ggplot(aes(fill = tsai_ratio)) + geom_sf(lwd = 0.1, color="black") + scale_fill_continuous(high="#2EFF71", low="blue") + theme_void() 29.6 Mapping Youbike Location 這個練習的目標是讀取台北市Youbike2.0的站台資料,並繪製點位圖來標記站台滿車或缺車的情形。 以下這段程式碼是用於從台北市政府提供的YouBike實時數據API取得資料,並將其轉換為R語言中的資料框架(data frame)格式,最後選擇資料框架的前六個變數來展示。步驟如下: 載入httr和jsonlite套件:這兩個套件在R中常用於處理HTTP請求和JSON資料。httr套件用於發送網路請求,而jsonlite套件則用於解析JSON格式的資料。 設定URL:將url變數設為指向台北市政府提供的YouBike實時數據API的網址。 使用GET函數發送請求:透過httr套件的GET函數向設定的URL發送HTTP GET請求,以取得YouBike的實時數據。 解析JSON資料:使用jsonlite套件的fromJSON函數,將從API獲取到的JSON格式資料解析成R的資料框架。content函數用於獲取HTTP回傳的內容,並指定內容格式為”text”,編碼方式為”utf-8”,以確保中文等非ASCII字符能正確顯示。 要注意的欄位名稱包含sna(站台名稱)、tot(總車格數)、sbi(現有車數)與lat-lng的經緯度資料。 library(httr) library(jsonlite) url <- "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json" ubike.df <- fromJSON(content(GET(url),"text", encoding = "utf-8")) head(ubike.df) %>% select(1:6) ## sno sna tot sbi sarea mday ## 1 500101001 YouBike2.0_捷運科技大樓站 28 1 大安區 2024-03-31 23:09:14 ## 2 500101002 YouBike2.0_復興南路二段273號前 21 1 大安區 2024-03-31 23:02:18 ## 3 500101003 YouBike2.0_國北教大實小東側門 16 14 大安區 2024-03-31 22:26:18 ## 4 500101004 YouBike2.0_和平公園東側 11 11 大安區 2024-03-31 23:01:14 ## 5 500101005 YouBike2.0_辛亥復興路口西北側 16 11 大安區 2024-03-31 22:50:25 ## 6 500101006 YouBike2.0_復興南路二段280號前 11 8 大安區 2024-03-31 22:46:18 29.6.1 Creating a new variable 為每個站產生一個sbi除以tot的新變數,來作為ubike站滿不滿的計量單位。 這段程式碼是在前一步的基礎上進一步創建新的 Fullness 欄位。該欄位的值根據 ratio 欄位的數值判斷,若 ratio 大於等於 0.9,則將 Fullness 設置為 “Full”;若 ratio 小於 0.3,則設置為 “Empty”;否則設置為 “Available”。 if_else 函數的用法如下: if_else(condition, true_value, false_value) condition:一個邏輯向量,用於指定條件判斷。 true_value:當 condition 為真時,返回的值。 false_value:當 condition 為假時,返回的值。 if_else 函數與 R 原生的 ifelse 函數相似,但有一些重要區別。if_else 函數在處理缺失值時更加嚴格,要求 true_value 和 false_value 具有相同的長度和類型,這有助於避免一些潛在的錯誤。 # ratio <- sbi/tot ubike.df <- ubike.df %>% mutate(ratio = sbi/tot) %>% mutate(Fullness = if_else(ratio >= 0.9, "Full", if_else(ratio < 0.3, "Empty", "Available"))) 29.6.2 Mapping with sf library(ggplot2) library(sf) sf_tpe <- st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/", layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>% mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>% mutate(across(where(is.double), ~if_else(is.na(.),as.double(0),.))) %>% st_set_crs(3826) %>% st_transform(4326) %>% filter(COUNTY == "臺北市") sf_tpe %>% head() ## Simple feature collection with 6 features and 9 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: 121.5041 ymin: 25.00776 xmax: 121.592 ymax: 25.09241 ## Geodetic CRS: WGS 84 ## TOWN_ID TOWN COUNTY_ID COUNTY H_CNT P_CNT M_CNT F_CNT INFO_TIME ## 1 63000010 松山區 63000 臺北市 78977 187552 87625 99927 111Y09M ## 2 63000020 信義區 63000 臺北市 87407 201951 95884 106067 111Y09M ## 3 63000030 大安區 63000 臺北市 117243 280332 130596 149736 111Y09M ## 4 63000040 中山區 63000 臺北市 98825 210156 97114 113042 111Y09M ## 5 63000050 中正區 63000 臺北市 64491 146628 69663 76965 111Y09M ## 6 63000060 大同區 63000 臺北市 51988 118065 57003 61062 111Y09M ## geometry ## 1 MULTIPOLYGON (((121.572 25.... ## 2 MULTIPOLYGON (((121.5727 25... ## 3 MULTIPOLYGON (((121.541 25.... ## 4 MULTIPOLYGON (((121.5522 25... ## 5 MULTIPOLYGON (((121.5174 25... ## 6 MULTIPOLYGON (((121.5176 25... library(sf) library(ggplot2) library(dplyr) # 你已經有ubike.sf,這是一個sf物件 ubike.sf <- st_as_sf(ubike.df, coords = c("lng", "lat"), crs = 4326) # 使用ggplot繪製地圖和位置點,並根據fullness的值上色 ggplot() + geom_sf(data = sf_tpe) + # 繪製sf_tpe區域 geom_sf(data = ubike.sf, aes(color = Fullness, size=tot), alpha=0.3) + scale_color_manual(values = c("Full" = "black", "Empty" = "red", "Available" = "blue")) + theme_void() 29.6.3 Using ggmap (Deprecated) 首先要設定google map的參數,先打開google map,縮放到你等一下希望看到的地圖底圖範圍後,複製新的網址列如https://www.google.com.tw/maps/@25.0353215,121.4916909,12.62z。這個網址後面的參數包含著經緯度(25.0353215,121.4916909)和地圖的縮放程度(12.62z)。因此你可以把他貼到get_googlemap()的函式中。除此之外,尚可以指定地圖種類,自行查詢help(maptype can be terrain, roadmap, satellite, hybrid, or toner-lite)。 接下來要用geom_point()這個ggplot2的函式繪製點圖,一共包含四個參數,用data指定資料集、用aes()指定x、y軸、用colour指定顏色、用size指定圓圈的大小。這邊我用圓圈的大小來表示總車格數,所以是ubike.df$tot,但如果是原始的tot數值可能畫起來會太大,這時後就必須要自行反覆嘗試,看看要取log()或者取sqrt()或者除以某個數值,好讓畫出來的點為適合觀看的大小。最後我多加了一個參數alpha讓圈圈半透明。 "],["network-vis.html", "Chapter 30 NETWORK VIS 30.1 Generating networks 30.2 Retrieve Top3 Components 30.3 Motif visualization and analysis", " Chapter 30 NETWORK VIS 網絡視覺化其實已經有非常好的簡介和指南。但在此補充一些常用的網絡視覺化參數 library(igraph) 30.1 Generating networks 30.1.1 Random network g <- barabasi.game(500, directed = T) message("\\n(V, E, Reciprocity, nComponent)\\n", length(V(g)), "\\t", length(E(g)), "\\t", sprintf("%.3f\\t", reciprocity(g)), count_components(g, mode = "weak") ) l <- layout.fruchterman.reingold(g) # l <- layout_with_kk(g) # l <- layout_in_circle(g) par(mar = c(0,0,0,0) + 0.1) plot(g, layout = l, vertex.color = rgb(1, 1, 0, 0.2), # vertex.color = factor(V(g)$blocked), vertex.size = 3, # vertex.size = sqrt(V(g)$degree)*3, vertex.frame.color= rgb(0, 0, 0, 0.5), # vertex.label = V(g)$display, # vertex.label = str_sub(V(g)$name, 1, 10), vertex.label.cex = 0.6, vertex.label.color = rgb(0, 0, 0, 0.7), vertex.label.family = 'Heiti TC Light', edge.curved = 0.1, edge.arrow.size = 0.1, # edge.width = sqrt(E(g)$weight), # edge.color = E(g)$year, # edge.color = E(g)$weight, edge.color = "#4169E1", # edge.color = E(g)$color, # edge.label = E(g)$weight, # edge.label = E(g)$year, edge.label.cex = 0.4, edge.label.color = rgb(1, 0, 0) ) 30.1.2 Random network rg <- sample_gnm(length(V(g)), length(E(g)), directed=T) message("\\n(V, E, Reciprocity, nComponent)\\n", length(V(rg)), "\\t", length(E(rg)), "\\t", sprintf("%.3f\\t", reciprocity(rg)), count_components(rg, mode = "weak") ) l <- layout.fruchterman.reingold(rg) par(mar = c(0,0,0,0) + 0.1) plot(rg, layout = l, vertex.color = rgb(1, 1, 0, 0.2), vertex.size = 3, vertex.frame.color= rgb(0, 0, 0, 0.5), vertex.label.cex = 0.6, vertex.label.color = rgb(0, 0, 0, 0.7), vertex.label.family = 'Heiti TC Light', edge.curved = 0.1, edge.arrow.size = 0.1, edge.color = "#4169E1", edge.label.cex = 0.4, edge.label.color = rgb(1, 0, 0) ) 30.2 Retrieve Top3 Components components <- igraph::clusters(rg, mode="weak") biggest_cluster_id <- which.max(components$csize) # which.max(components$csize) # components$csize # biggest_cluster_id top3_break <- sort(unique(components$csize), decreasing = T)[3] biggest_cluster_id <- which(components$csize >= top3_break) vert_ids <- V(rg)[components$membership %in% biggest_cluster_id] rg <- igraph::induced_subgraph(rg, vert_ids) message("\\n(V, E, Reciprocity, nComponent)\\n", length(V(rg)), "\\t", length(E(rg)), "\\t", sprintf("%.3f", reciprocity(rg)) ) 30.2.1 Visualize again l <- layout.fruchterman.reingold(rg) par(mar = c(0,0,0,0) + 0.1) plot(rg, layout = l, vertex.color = rgb(1, 1, 0, 0.2), vertex.size = 3, vertex.frame.color= rgb(0, 0, 0, 0.5), vertex.label.cex = 0.6, vertex.label.color = rgb(0, 0, 0, 0.7), vertex.label.family = 'Heiti TC Light', edge.curved = 0.1, edge.arrow.size = 0.1, edge.color = "#4169E1", edge.label.cex = 0.4, edge.label.color = rgb(1, 0, 0) ) 30.3 Motif visualization and analysis 30.3.1 Motif type library(igraph) par(mfrow=c(4,4), mai= rep(0.2, 4)) for(i in 0:15){ g1 <- graph_from_isomorphism_class(3, i) plot(g1, vertex.color = "gold", vertex.size = 20, # vertex.size = (V(g)$nTweets)^(1/3)+1, vertex.frame.color= "black", vertex.label = NA, edge.color = "black", edge.arrow.size = 0.5) title(i, line=-3, adj=0.4 ,col.main="royalblue") } 30.3.2 Motif analysis 30.3.2.1 Generate network res <- motifs(g, 3) res ## [1] NA NA 4085 NA 419 0 0 0 0 0 0 0 0 0 0 ## [16] 0 writeLines(as.character(res), sep = "\\t") ## NA NA 4085 NA 419 0 0 0 0 0 0 0 0 0 0 0 30.3.3 Generate motives barabas_motif <- function(e){ g <- barabasi.game(e, directed = T) vec <- motifs(g, 3) %>% replace_na(0) for(i in 1:99){ g <- barabasi.game(e, directed = T) tmp <- motifs(g, 3) %>% replace_na(0) vec <- vec + tmp } vec <- vec / 100 writeLines(as.character(vec), sep = "\\t") } random_net_motif <- function(v, e){ g <- sample_gnm(v, e, directed=T) vec <- motifs(g, 3) %>% replace_na(0) for(i in 1:99){ g <- sample_gnm(v, e, directed=T) tmp <- motifs(g, 3) %>% replace_na(0) vec <- vec + tmp } vec <- vec / 100 writeLines(as.character(vec), sep = "\\t") } random_net_motif(length(V(g)), length(E(g))) ## 0 0 245.78 0 490.12 0.87 247.04 0.77 0 0.78 0 0.36 0.01 0 0 0 barabas_motif(length(E(g))) ## 0 0 2517.01 0 459.54 0 0 0 0 0 0 0 0 0 0 0 "],["interactivity.html", "Chapter 31 Interactivity 31.1 ggplotly 31.2 產製圖表動畫", " Chapter 31 Interactivity 31.1 ggplotly Scatter plots with ggplot2 (plotly.com) 31.1.1 LINE CHART Line plots with R (plotly.com) NW <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(Category, year, Net_Worth) %>% group_by(Category) %>% arrange(year) %>% ungroup() 如果希望滑鼠在移到折線上時就會有浮出的資訊(tips)顯示該資料點的屬性特徵,可以採用plotly()這個套件。這個套件原本就是做線上互動圖表的,但他開發了R client讓R的使用者可以很輕易地把ggplot2的結果轉為互動圖表。但這所謂的互動也僅限於滑鼠移過去所浮出的資訊罷了,不過已經能夠達到吸引部分讀者目光、提供訊息的效果。 而plotly的設計非常簡單,就是把ggplot的結果指給一個變數後,然後用ggplotly(NW.plot)將其轉為plotly即可。但要注意的是,並不是每一個圖都可以順利轉換。例如本節最後一個例子Treemap便無法成功轉換。 設定:原本plotly會帶一個操控列,可以在ggplotly()指令後加入config()便可將其隱藏。 NW.plot <- NW %>% ggplot() + aes(year, Net_Worth, color=Category) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + th library(plotly) ggplotly(NW.plot) %>% config(displayModeBar = FALSE) 可以在aes()設定要帶入圖的變數時,新增一個text變數,手動設定要呈現的動態呈現方塊。但要注意的是,要多加入一個group=1才能夠作用(WHY?)。但前例浮出視窗的原始內容所顯示的是原本的變數名稱和值,往往不易觀察。比較好的方式是在下ggplot() + aes()指令時,在aes()中指定text來作為後續浮出視窗內容。指定方法如下。要注意的是,該浮出視窗的語法是HTML,所以如果要改寫浮出視窗內容,要用paste0()將變數和HTML的標籤給銜接起來。以下例子中的<b>代表粗體的意思,<br>則是換行符號。 NW.plot <- NW %>% ggplot() + aes(year, Net_Worth, color=Category, text = paste0("<b>年(X): </b>", year, "<br>", "<b>淨資產(Y): </b>", Net_Worth,"<br>", "<b>年齡組: </b>", Category), group=1) + geom_line() + theme_minimal() + labs(title = "Net Worth by year grouped by age groups", x = "Year", y = "Net Worth") + th ggplotly(NW.plot, tooltip = "text") %>% config(displayModeBar = FALSE) 其他例子中使用ggplotly()都是直接照前面的方法套用即可。唯獨在Treemap中無法用這樣的方法來做互動的視覺化。想想這也正常,畢竟Treemap是用非ggplot的第三方套件(library(treemapify))。 除此之外,可以把R Markdown中Code Cell的的設定加入include=FALSE,這樣可以讓RMD在編製為HTML檔時,不要顯示程式碼,而直接顯示互動的視覺化介面。 31.1.2 SCATTER bw <- read_csv("data/unicef-changing-childhood-data.csv") %>% select(country = WP5, age = WP22140, bw = WP22092) %>% mutate(country = ordered(country, levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17, 29, 31, 33, 35, 36, 60, 61, 77, 79, 81, 87, 165), labels=c("USA", "Morocco", "Lebanon", "Indonesia","Bangladesh", "UK", "France", "Germany", "Spain", "Japan", "India", "Brazil", "Nigeria", "Kenya", "Ethiopia", "Mali", "Ukraine", "Cameroon", "Zimbabwe","Argentina", "Peru"))) %>% count(country, age, bw) %>% group_by(country, age) %>% mutate(perc = n/sum(n)) %>% ungroup() %>% filter(bw == 1) %>% select(country, age, perc) %>% spread(age, perc) %>% rename(`15-24y` = `1`, `40+y` = `2`) bw.p <- bw %>% ggplot() + aes(`40+y`, `15-24y`, label = country) + geom_point(color = "skyblue", size = 2) + xlim(0.2, 0.85) + ylim(0.2, 0.85) + geom_text(hjust = -0.1, vjust = -0.5) + geom_abline(intercept = 0, slop = 1, color="lightgrey", alpha=0.5, linetype="dashed") + th + theme(aspect.ratio=1) bw.p %>% ggplotly() 31.1.3 Barplot Bar charts with R (plotly.com) county <- read_csv("data/tw_population_opendata110N010.csv") %>% slice(-1, -(370:375)) %>% type_convert() %>% mutate(county = str_sub(site_id, 1, 3)) %>% group_by(county) %>% summarize( area = sum(area), people_total = sum(people_total) ) %>% ungroup() population.p <- county %>% mutate(county = reorder(county, people_total)) %>% ggplot() + aes(county, people_total) %>% geom_col(fill="skyblue") + coord_flip() + th population.p %>% ggplotly() 31.1.4 Boxplot Box plots with ggplot2 (plotly.com) aqi.toplot <- read_rds("https://github.com/p4css/R4CSS/raw/master/data/AQI_Chaozhou.rds") %>% arrange(日期)%>% filter(測項=="PM2.5") %>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% filter(month %in% c(11, 12, 1, 2, 3)) aqi.plot <- aqi.toplot %>% mutate(year = as.character(year)) %>% ggplot() + aes(x=year, y=PM25) + geom_boxplot(fill="skyblue", alpha=0.2) + ylim(0, 200) + coord_flip() + theme_minimal() aqi.plot %>% ggplotly 31.1.5 Treemap (Global Carbon) 其他例子中使用ggplotly()都是直接照前面的方法套用即可。唯獨在Treemap中無法用這樣的方法來做互動的視覺化。想想這也正常,畢竟Treemap是用非ggplot的第三方套件(library(treemapify))。 totreemap <- read_csv("data/GCB2021v34_MtCO2_flat.csv") %>% drop_na(`Total`) %>% filter(!Country %in% c("Global", "International Transport")) %>% filter(Year==2020) %>% arrange(desc(`Total`)) %>% mutate(perc = Total/sum(Total)) %>% slice(1:20) library(treemapify) carbon.p <- totreemap %>% ggplot() + aes(area = perc, fill=`Per Capita`, label=Country) + geom_treemap() + geom_treemap_text(color="white", place="centre", grow=TRUE ) # carbon.p %>% ggplotly 31.2 產製圖表動畫 https://gist.github.com/rafapereirabr/0d68f7ccfc3af1680c4c8353cf9ab345 R也有套工具可以產製圖表動畫,概念上就是沿著一條資料維度,把多張圖給疊在一起變成一個gif動畫。本例子即是把產假之薪的範例沿著時間軸做動畫。每個時間點都是當年各國產假支薪給付程度的地圖,但由於有19年的資料,所以可以把年代當成動畫的時間軸。 以下是清理資料的步驟,會彙整出國名、國家代碼(ISO3)、年、和給付等級四個變項。預期利用國名、國家代碼和給付等級就可以畫出每年的圖。然後將年作為動畫的時間軸,便可產生地圖動畫。 pml <- read_excel("data/WORLD-MACHE_Gender_6.8.15.xls", "Sheet1", col_names=T) %>% select(country, iso3, contains("matleave"), -contains("wrr")) %>% gather("year", "degree", 3:21) %>% replace_na(list(degree=0)) %>% mutate(year2=as.POSIXct(strptime(year, "matleave_%y"))) %>% mutate(year3 = strftime(year2, "%Y")) %>% select(country, ISO3=iso3, year=year3, degree) 31.2.1 地圖下載與轉換投影方法 此為下載地圖並處理地圖成為可以用geom_polygom()繪圖的多邊形資料點。 library(rworldmap) wmap <- getMap(resolution="low") wmap <- spTransform(wmap, CRS("+proj=robin")) # reproject wmap <- fortify(wmap) wmap %>% filter(!duplicated(id)) %>% head(10) ## long lat order hole piece id ## 1 -6558139.1 1331765.9 1 FALSE 1 Aruba ## 2 6607120.5 3981587.8 1 FALSE 1 Afghanistan ## 3 1357824.3 -630231.6 1 FALSE 1 Angola ## 4 -5863722.7 1948851.8 1 FALSE 1 Anguilla ## 5 1723246.7 4546403.9 1 FALSE 1 Albania ## 6 1506389.0 6371182.0 1 FALSE 1 Aland ## 7 146562.7 4541753.0 1 FALSE 1 Andorra ## 8 5174600.6 2734691.9 1 FALSE 1 United Arab Emirates ## 9 -6057672.4 -2363055.4 1 FALSE 1 Argentina ## 10 3911094.7 4398155.0 1 FALSE 1 Armenia ## group ## 1 Aruba.1 ## 2 Afghanistan.1 ## 3 Angola.1 ## 4 Anguilla.1 ## 5 Albania.1 ## 6 Aland.1 ## 7 Andorra.1 ## 8 United Arab Emirates.1 ## 9 Argentina.1 ## 10 Armenia.1 pml_map <- wmap %>% left_join(pml, by=c("id"="country")) %>% filter(!is.na(ISO3)) %>% mutate(year = as.integer(year)) # devtools::install_github("thomasp85/transformr") pml_map %>% select(id) %>% filter(!duplicated(.)) %>% head(10) ## id ## 1 Afghanistan ## 2 Angola ## 3 Albania ## 4 Andorra ## 5 United Arab Emirates ## 6 Argentina ## 7 Armenia ## 8 Antigua and Barbuda ## 9 Australia ## 10 Austria 31.2.2 靜態繪圖測試 pml_map %>% filter(year==1995) %>% ggplot() + aes(x = long, y = lat, group=group, fill=factor(degree)) + geom_polygon(color="grey") + theme_void() + scale_fill_manual(values=c("1"="red", "2"="LightCyan", "3"="lightskyblue", "4"="DodgerBlue", "5"="MediumBlue")) + coord_cartesian(xlim = c(-11807982, 14807978)) 在採用gganimate繪圖時,僅需要多加一個動畫繪圖函式+ transition_time(year)即可,其他繪圖部分並無修改。最後才用animate()函式把這整個繪圖指令轉製為動畫,包含指定fps(frame per second)和長寬等參數。 library(gganimate) pml.ani <- pml_map %>% ggplot() + aes(x = long, y = lat, group=group, fill=factor(degree)) + geom_polygon(color="grey") + theme_void() + scale_fill_manual(values=c("1"="red", "2"="LightCyan", "3"="lightskyblue", "4"="DodgerBlue", "5"="MediumBlue")) + coord_cartesian(xlim = c(-11807982, 14807978)) + transition_time(year) # + # ease_aes("linear") + # enter_fade() + # exit_fade() animate(pml.ani, fps = 10, end_pause = 30, width = 750, height = 450, renderer = gifski_renderer()) anim_save("jour5014/pml2.gif", animation = last_animation()) knitr::include_graphics("jour5014/pml2.gif") "],["wgoitg.html", "Chapter 32 WGOITG of NyTimes", " Chapter 32 WGOITG of NyTimes 紐約時報提供的what’s going on in the graph 系列教學旨在幫助讀者更好地理解和解讀圖表,特別是在時事和政治等敏感領域中的圖表。這些教學以實際的新聞圖表為例,介紹了如何分析和評估圖表的質量、有效性和可靠性,並提供了一些技巧和策略,幫助讀者從圖表中獲取準確和全面的資訊。 具體來說,what’s going on in the graph系列教學的目的包括以下幾點: 提高讀者對圖表的識讀能力和分析能力,讓讀者能夠更加自信和準確地理解和評估圖表。 幫助讀者識別和處理常見的資訊偏差和誤導,如選擇性展示數據、扭曲比例、誤導標籤等。 強調圖表應該為讀者服務,而不是為了強調某個立場或觀點而有意歪曲事實。 提供了一些有效的技巧和策略,如注意圖表的標題、軸標籤和單位、比較數據的趨勢和範圍、理解圖表的背景和上下文等。 "],["inequality-net-worth-by-age-group.html", "Chapter 33 Inequality: Net Worth by Age Group", " Chapter 33 Inequality: Net Worth by Age Group LEARNING NOTES 座標軸從數值到增加值 這個教學案例來自紐約時報的「What’s going on in this gragh」系列資料視覺化教學之Teach About Inequality With These 28 New York Times Graphs - The New York Times (nytimes.com) 。該圖表呈現在不同年代、不同年齡層的人所擁有的淨資產(包含土地、存款、投資等減去債務)。該圖表的結果指出,在不同年代的老年人是越來越有錢,但年輕人卻越來越窮(該曲線為減去1989年 淨資產(Net worth)是一個財務術語,指的是一個人或機構的總資產減去總負債後剩餘的價值。換言之,Net worth是一個人或機構在財務上的價值或實力。如果一個人或機構的總資產超過了總負債,那麼其net worth為正值,反之則為負值。在個人財務上,Net worth通常用來評估一個人的財務健康狀況。一個人的Net worth越高,通常代表其擁有更多的財富和投資,並能夠更好地應對突發事件和生活變數。因此,許多投資者和財務顧問都會建議人們注重提高自己的net worth。 Sorted by arrange() function. p1 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(year, Category, Net_Worth) %>% group_by(Category) %>% arrange(year) %>% ungroup() p1 %>% filter(year <= 1992) %>% knitr::kable() year Category Net_Worth 1989 Less than 35 16.17019 1989 35-44 112.47530 1989 45-54 195.11630 1989 55-64 195.25554 1989 65-74 154.34277 1989 75 or older 144.29855 1992 Less than 35 16.60780 1992 35-44 79.91050 1992 45-54 139.97745 1992 55-64 203.44104 1992 65-74 176.44667 1992 75 or older 155.35173 library(gghighlight) p1 %>% ggplot() + aes(year, Net_Worth, color = Category) + geom_line(linetype="dotted") + geom_point() + gghighlight(Category %in% c("65-74", "35-44")) + theme_minimal() + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) p2 <- read_csv("data/interactive_bulletin_charts_agecl_median.csv") %>% select(year, Category, NW = Net_Worth) %>% group_by(Category) %>% arrange(year) %>% mutate(increase = (NW-first(NW))/first(NW)) %>% ungroup() p2 %>% filter(year <= 1992) %>% knitr::kable() year Category NW increase 1989 Less than 35 16.17019 0.0000000 1989 35-44 112.47530 0.0000000 1989 45-54 195.11630 0.0000000 1989 55-64 195.25554 0.0000000 1989 65-74 154.34277 0.0000000 1989 75 or older 144.29855 0.0000000 1992 Less than 35 16.60780 0.0270627 1992 35-44 79.91050 -0.2895285 1992 45-54 139.97745 -0.2825948 1992 55-64 203.44104 0.0419220 1992 65-74 176.44667 0.1432131 1992 75 or older 155.35173 0.0765994 p2 %>% ggplot() + aes(year, increase, color = Category) + geom_line(linetype="dotted") + geom_point() + gghighlight(Category %in% c("65-74", "35-44")) + theme_minimal() + scale_y_continuous(labels=scales::parse_format()) + scale_x_continuous(breaks = NULL) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) "],["optimism-survey-by-countries.html", "Chapter 34 Optimism Survey by Countries", " Chapter 34 Optimism Survey by Countries 這個練習為紐約時報的一則報導「Where Are Young People Most Optimistic? In Poorer Nations. - The New York Times (nytimes.com)」。該報導乃根據一項涵蓋 21 個國家的大型調查,這項調查比較了不同國家和年齡層(年輕人對成年人)對於下一代的生活是否會比現在更好的看法。該調查還比較了不同國家(富裕與貧窮)和年齡層(年輕人對成年人)對於當今兒童在基本方面的狀況,以及對於社會和環境問題的看法。此外,調查還比較了不同國家和年齡層對於現代科技對年輕人生活的影響看法,以及對於焦慮和壓力等方面的看法。 聯合國兒童基金會與 Gallup 共同進行了這項調查,該調查共有 21,000 名受訪者,分為兩個年齡組別——15 至 24 歲和 40 歲以上,並包括來自世界各地的代表性樣本。年輕組表示,當今兒童在教育、醫療保健和身體安全等基本方面都比他們的父母更好。在中位數國家中,有 57% 的年輕人表示,隨著每一代的到來,世界正在變得越來越美好,而這一比例在老年人中僅有 39%。然而,在富裕國家,56% 的年輕人和 64% 的老年人表示,當今兒童在經濟方面將比他們的父母更加困難——這種觀點與近年來許多人的經濟現實相符。 視覺化的重點是等比例之座標軸的運用 plot.opt <- read_csv("data/unicef-changing-childhood-data.csv") %>% select(country = WP5, age = WP22140, bw = WP22092) %>% mutate(country = ordered(country, levels=c(1, 3, 4, 10, 11, 12, 13, 14, 17, 29, 31, 33, 35, 36, 60, 61, 77, 79, 81, 87, 165), labels=c("USA", "Morocco", "Lebanon", "Indonesia", "Bangladesh", "UK", "France", "Germany", "Spain", "Japan", "India", "Brazil", "Nigeria", "Kenya", "Ethiopia", "Mali", "Ukraine", "Cameroon", "Zimbabwe", "Argentina", "Peru"))) %>% count(country, age, bw) %>% group_by(country, age) %>% mutate(perc = n/sum(n)) %>% ungroup() %>% filter(bw == 1) %>% select(country, age, perc) %>% spread(age, perc) %>% rename(`15-24y` = `1`, `40+y` = `2`) plot.opt %>% head(10) %>% knitr::kable() country 15-24y 40+y USA 0.6679842 0.4611465 Morocco 0.4365079 0.4735812 Lebanon 0.5467197 0.4435798 Indonesia 0.7920605 0.8027344 Bangladesh 0.4624506 0.4319527 UK 0.5040000 0.4140000 France 0.3900000 0.2640000 Germany 0.5900000 0.3860000 Spain 0.5160000 0.3340000 Japan 0.6367265 0.2586873 plot.opt %>% ggplot() + aes(`40+y`, `15-24y`, label = country) + geom_point(color = "skyblue", size = 2) + xlim(0, 1) + ylim(0,1) + geom_text(hjust = -0.1, vjust = -0.5) + geom_abline(intercept = 0, slop = 1, color="lightgrey", alpha=0.5, linetype="dashed") + theme_minimal() + theme(aspect.ratio=1) "],["taiwan.html", "Chapter 35 Case Studies (Taiwan) 35.1 TW AQI Visual Studies", " Chapter 35 Case Studies (Taiwan) 35.1 TW AQI Visual Studies library(tidyverse) ## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── ## ✔ dplyr 1.1.4 ✔ readr 2.1.5 ## ✔ forcats 1.0.0 ✔ stringr 1.5.1 ## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1 ## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1 ## ✔ purrr 1.0.2 ## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── ## ✖ dplyr::filter() masks stats::filter() ## ✖ dplyr::lag() masks stats::lag() ## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors library(readxl) # options(stringsAsFactors = F) 35.1.1 eda-load-data-from-github # aqi_data <- read_rds("https://github.com/p4css/R4CSS/raw/master/data/AQI_Chaozhou.rds") aqi_data <- read_rds("data/AQI_Chaozhou.rds") 35.1.2 Trending: Central tendency toplot <- aqi_data %>% arrange(日期)%>% filter(測項=="PM2.5") %>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% group_by(日期) %>% summarize(avg = mean(PM25)) %>% ungroup() %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% group_by(year, month) %>% summarize(avg = mean(avg)) %>% ungroup() ## Warning: There was 1 warning in `mutate()`. ## ℹ In argument: `PM25 = as.numeric(PM25)`. ## Caused by warning: ## ! NAs introduced by coercion ## `summarise()` has grouped output by 'year'. You can override using the ## `.groups` argument. Counting data by month and plotting to ensure the degree of data loss. aqi_data %>% filter(測項=="PM2.5") %>% arrange(日期)%>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% group_by(日期) %>% summarize(avg = mean(PM25)) %>% ungroup() %>% arrange(日期) %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% count(year, month) %>% mutate(rn = row_number()) %>% ggplot() + aes(rn, n) + geom_line() + theme_minimal() ## Warning: There was 1 warning in `mutate()`. ## ℹ In argument: `PM25 = as.numeric(PM25)`. ## Caused by warning: ## ! NAs introduced by coercion 科普小學堂-空氣中的懸浮粒子 台灣PM2.5三大面向:空汙現況多嚴重?要怪中國還是怪自己? - 第 1 頁 - The News Lens 關鍵評論網 library(gghighlight) toplot %>% mutate(month = as.character(month)) %>% group_by(month) %>% arrange(year) %>% # mutate(diff = avg -first(avg), # month = as.character(month)) %>% # ungroup() %>% ggplot() + aes(year, avg, color = month) + geom_line() + # geom_point() + gghighlight(month %in% c("11", "12", "1", "2", "3")) + theme_minimal() ## Warning: Tried to calculate with group_by(), but the calculation failed. ## Falling back to ungrouped filter operation... ## label_key: month 35.1.3 Trending: Extreme value toplot2 <- aqi_data %>% arrange(日期)%>% filter(測項=="PM2.5") %>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% group_by(日期) %>% summarize(avg = sum(PM25)/24) %>% ungroup() %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% group_by(year, month) %>% summarize(purple = sum(avg>150), red = sum(avg>54), orange = sum(avg>35)) %>% ungroup() ## Warning: There was 1 warning in `mutate()`. ## ℹ In argument: `PM25 = as.numeric(PM25)`. ## Caused by warning: ## ! NAs introduced by coercion ## `summarise()` has grouped output by 'year'. You can override using the ## `.groups` argument. toplot2 %>% mutate(month = as.character(month)) %>% group_by(month) %>% arrange(year) %>% ggplot() + aes(year, orange, color = month) + geom_line() + # geom_point() + gghighlight(month %in% c("11", "12", "1", "2", "3")) + ylab("Days (PM25 > 35) in one month") + theme_minimal() ## Warning: Tried to calculate with group_by(), but the calculation failed. ## Falling back to ungrouped filter operation... ## label_key: month toplot3 <- aqi_data %>% arrange(日期)%>% filter(測項=="PM2.5") %>% gather("hour", "PM25", 4:28) %>% mutate(PM25 = as.numeric(PM25)) %>% drop_na() %>% mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>% filter(month %in% c(11, 12, 1, 2, 3)) ## Warning: There was 1 warning in `mutate()`. ## ℹ In argument: `PM25 = as.numeric(PM25)`. ## Caused by warning: ## ! NAs introduced by coercion toplot3 %>% mutate(year = as.character(year)) %>% ggplot() + aes(y=year, x=PM25) + geom_boxplot(fill="skyblue", alpha=0.2) + xlim(0, 200) + theme_minimal() "],["appendix.html", "Chapter 36 Appendix 36.1 Dataset", " Chapter 36 Appendix 36.1 Dataset 111B歲出政事別預算表.xls - 111B歲出政事別預算總表.xls 臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv opendata107Y020.csv opendata110Y060.csv tptheft.csv tw_income_107.csv tw_population_opendata110N010.csv tw_salary109.xlsx villmast_excel.xls WORLD-MACHE_Gender_6.8.15.xls "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]]
diff --git a/taiwan.html b/taiwan.html
index b666194..babc0fb 100644
--- a/taiwan.html
+++ b/taiwan.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
@@ -785,7 +791,7 @@
Chapter 35 Case Studies (Taiwan)
35.1 TW AQI Visual Studies
-
+
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
@@ -796,29 +802,29 @@ 35.1 TW AQI Visual Studies
-
+
35.1.1 eda-load-data-from-github
-
+
35.1.2 Trending: Central tendency
-toplot <- aqi_data %>%
- arrange(日期)%>%
- filter(測項=="PM2.5") %>%
- gather("hour", "PM25", 4:28) %>%
- mutate(PM25 = as.numeric(PM25)) %>%
- drop_na() %>%
- group_by(日期) %>%
- summarize(avg = mean(PM25)) %>%
- ungroup() %>%
- mutate(year = lubridate::year(日期),
- month = lubridate::month(日期)) %>%
- group_by(year, month) %>%
- summarize(avg = mean(avg)) %>%
- ungroup()
+toplot <- aqi_data %>%
+ arrange(日期)%>%
+ filter(測項=="PM2.5") %>%
+ gather("hour", "PM25", 4:28) %>%
+ mutate(PM25 = as.numeric(PM25)) %>%
+ drop_na() %>%
+ group_by(日期) %>%
+ summarize(avg = mean(PM25)) %>%
+ ungroup() %>%
+ mutate(year = lubridate::year(日期),
+ month = lubridate::month(日期)) %>%
+ group_by(year, month) %>%
+ summarize(avg = mean(avg)) %>%
+ ungroup()
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `PM25 = as.numeric(PM25)`.
## Caused by warning:
@@ -826,22 +832,22 @@ 35.1.2 Trending: Central tendency
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
Counting data by month and plotting to ensure the degree of data loss.
-aqi_data %>%
- filter(測項=="PM2.5") %>%
- arrange(日期)%>%
- gather("hour", "PM25", 4:28) %>%
- mutate(PM25 = as.numeric(PM25)) %>%
- drop_na() %>%
- group_by(日期) %>%
- summarize(avg = mean(PM25)) %>%
- ungroup() %>%
- arrange(日期) %>%
- mutate(year = lubridate::year(日期),
- month = lubridate::month(日期)) %>%
- count(year, month) %>%
- mutate(rn = row_number()) %>%
- ggplot() + aes(rn, n) +
- geom_line() + theme_minimal()
+aqi_data %>%
+ filter(測項=="PM2.5") %>%
+ arrange(日期)%>%
+ gather("hour", "PM25", 4:28) %>%
+ mutate(PM25 = as.numeric(PM25)) %>%
+ drop_na() %>%
+ group_by(日期) %>%
+ summarize(avg = mean(PM25)) %>%
+ ungroup() %>%
+ arrange(日期) %>%
+ mutate(year = lubridate::year(日期),
+ month = lubridate::month(日期)) %>%
+ count(year, month) %>%
+ mutate(rn = row_number()) %>%
+ ggplot() + aes(rn, n) +
+ geom_line() + theme_minimal()
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `PM25 = as.numeric(PM25)`.
## Caused by warning:
@@ -851,19 +857,19 @@ 35.1.2 Trending: Central tendency
- 科普小學堂-空氣中的懸浮粒子
- 台灣PM2.5三大面向:空汙現況多嚴重?要怪中國還是怪自己? - 第 1 頁 - The News Lens 關鍵評論網
-library(gghighlight)
-toplot %>%
- mutate(month = as.character(month)) %>%
- group_by(month) %>%
- arrange(year) %>%
- # mutate(diff = avg -first(avg),
- # month = as.character(month)) %>%
- # ungroup() %>%
- ggplot() + aes(year, avg, color = month) +
- geom_line() +
- # geom_point() +
- gghighlight(month %in% c("11", "12", "1", "2", "3")) +
- theme_minimal()
+library(gghighlight)
+toplot %>%
+ mutate(month = as.character(month)) %>%
+ group_by(month) %>%
+ arrange(year) %>%
+ # mutate(diff = avg -first(avg),
+ # month = as.character(month)) %>%
+ # ungroup() %>%
+ ggplot() + aes(year, avg, color = month) +
+ geom_line() +
+ # geom_point() +
+ gghighlight(month %in% c("11", "12", "1", "2", "3")) +
+ theme_minimal()
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...
## label_key: month
@@ -871,59 +877,59 @@ 35.1.2 Trending: Central tendency
35.1.3 Trending: Extreme value
-toplot2 <- aqi_data %>%
- arrange(日期)%>%
- filter(測項=="PM2.5") %>%
- gather("hour", "PM25", 4:28) %>%
- mutate(PM25 = as.numeric(PM25)) %>%
- drop_na() %>%
- group_by(日期) %>%
- summarize(avg = sum(PM25)/24) %>%
- ungroup() %>%
- mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>%
- group_by(year, month) %>%
- summarize(purple = sum(avg>150),
- red = sum(avg>54),
- orange = sum(avg>35)) %>%
- ungroup()
+toplot2 <- aqi_data %>%
+ arrange(日期)%>%
+ filter(測項=="PM2.5") %>%
+ gather("hour", "PM25", 4:28) %>%
+ mutate(PM25 = as.numeric(PM25)) %>%
+ drop_na() %>%
+ group_by(日期) %>%
+ summarize(avg = sum(PM25)/24) %>%
+ ungroup() %>%
+ mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>%
+ group_by(year, month) %>%
+ summarize(purple = sum(avg>150),
+ red = sum(avg>54),
+ orange = sum(avg>35)) %>%
+ ungroup()
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `PM25 = as.numeric(PM25)`.
## Caused by warning:
## ! NAs introduced by coercion
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
-toplot2 %>%
- mutate(month = as.character(month)) %>%
- group_by(month) %>%
- arrange(year) %>%
- ggplot() + aes(year, orange, color = month) +
- geom_line() +
- # geom_point() +
- gghighlight(month %in% c("11", "12", "1", "2", "3")) +
- ylab("Days (PM25 > 35) in one month") +
- theme_minimal()
+toplot2 %>%
+ mutate(month = as.character(month)) %>%
+ group_by(month) %>%
+ arrange(year) %>%
+ ggplot() + aes(year, orange, color = month) +
+ geom_line() +
+ # geom_point() +
+ gghighlight(month %in% c("11", "12", "1", "2", "3")) +
+ ylab("Days (PM25 > 35) in one month") +
+ theme_minimal()
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...
## label_key: month
![](Z2_Exploring_data_Visually_files/figure-html/eda-boxplot-1.png)
-toplot3 <- aqi_data %>%
- arrange(日期)%>%
- filter(測項=="PM2.5") %>%
- gather("hour", "PM25", 4:28) %>%
- mutate(PM25 = as.numeric(PM25)) %>%
- drop_na() %>%
- mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>%
- filter(month %in% c(11, 12, 1, 2, 3))
+toplot3 <- aqi_data %>%
+ arrange(日期)%>%
+ filter(測項=="PM2.5") %>%
+ gather("hour", "PM25", 4:28) %>%
+ mutate(PM25 = as.numeric(PM25)) %>%
+ drop_na() %>%
+ mutate(year = lubridate::year(日期), month = lubridate::month(日期)) %>%
+ filter(month %in% c(11, 12, 1, 2, 3))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `PM25 = as.numeric(PM25)`.
## Caused by warning:
## ! NAs introduced by coercion
-toplot3 %>%
- mutate(year = as.character(year)) %>%
- ggplot() + aes(y=year, x=PM25) +
- geom_boxplot(fill="skyblue", alpha=0.2) +
- xlim(0, 200) +
- theme_minimal()
+toplot3 %>%
+ mutate(year = as.character(year)) %>%
+ ggplot() + aes(y=year, x=PM25) +
+ geom_boxplot(fill="skyblue", alpha=0.2) +
+ xlim(0, 200) +
+ theme_minimal()
![](Z2_Exploring_data_Visually_files/figure-html/unnamed-chunk-6-1.png)
diff --git a/time-trends.html b/time-trends.html
index 6b1ff35..cebbacf 100644
--- a/time-trends.html
+++ b/time-trends.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
@@ -796,7 +802,7 @@ 28.1.1 The econimics datauempmed
:失業中位數持續時間,以週為單位,資料來源為 https://fred.stlouisfed.org/series/UEMPMED
unemploy
:失業人數,以千人為單位,資料來源為 https://fred.stlouisfed.org/series/UNEMPLOY
-
+
## # A tibble: 6 × 6
## date pce pop psavert uempmed unemploy
## <date> <dbl> <dbl> <dbl> <dbl> <dbl>
@@ -809,28 +815,28 @@ 28.1.1 The econimics data
28.1.2 Setting marking area
-recess <- data.frame(
- begin = c("1969-12-01","1973-11-01","1980-01-01","1981-07-01","1990-07-01","2001-03-01", "2007-12-01"),
- end = c("1970-11-01","1975-03-01","1980-07-01","1982-11-01","1991-03-01","2001-11-01", "2009-07-30"),
- event = c("Fiscal & Monetary\ntightening", "1973 Oil crisis", "Double dip I","Double dip II", "Oil price shock", "Dot-com bubble", "Sub-prime\nmortgage crisis"),
- y = c(.01415981, 0.02067402, 0.02951190, 0.03419201, 0.02767339, 0.02159662, 0.02520715)
- )
-
-library(lubridate)
-recess <- recess %>%
- mutate(begin = ymd(begin),
- end = ymd(end))
-
-economics %>%
- ggplot() +
- aes(x = date, y = unemploy/pop) +
- ggtitle(c("The percentage of unemployed Americans \n increases sharply during recessions")) +
- geom_line() +
- geom_rect(data = recess,
- aes(xmin = begin, xmax = end, ymin = -Inf, ymax = +Inf, fill = "Recession"),
- inherit.aes = FALSE, alpha = 0.2) +
- geom_label(data = recess, aes(x = end, y = y, label=event), size = 3) +
- scale_fill_manual(name = "", values="red", label="Recessions")
+recess <- data.frame(
+ begin = c("1969-12-01","1973-11-01","1980-01-01","1981-07-01","1990-07-01","2001-03-01", "2007-12-01"),
+ end = c("1970-11-01","1975-03-01","1980-07-01","1982-11-01","1991-03-01","2001-11-01", "2009-07-30"),
+ event = c("Fiscal & Monetary\ntightening", "1973 Oil crisis", "Double dip I","Double dip II", "Oil price shock", "Dot-com bubble", "Sub-prime\nmortgage crisis"),
+ y = c(.01415981, 0.02067402, 0.02951190, 0.03419201, 0.02767339, 0.02159662, 0.02520715)
+ )
+
+library(lubridate)
+recess <- recess %>%
+ mutate(begin = ymd(begin),
+ end = ymd(end))
+
+economics %>%
+ ggplot() +
+ aes(x = date, y = unemploy/pop) +
+ ggtitle(c("The percentage of unemployed Americans \n increases sharply during recessions")) +
+ geom_line() +
+ geom_rect(data = recess,
+ aes(xmin = begin, xmax = end, ymin = -Inf, ymax = +Inf, fill = "Recession"),
+ inherit.aes = FALSE, alpha = 0.2) +
+ geom_label(data = recess, aes(x = end, y = y, label=event), size = 3) +
+ scale_fill_manual(name = "", values="red", label="Recessions")
![](V11_Time_and_Trends_files/figure-html/unnamed-chunk-3-1.png)
@@ -839,21 +845,21 @@ 28.2 Smoothing: Unemployed
- Smooth by bin smoothing
-fit <- with(economics,
- ksmooth(date, unemploy, kernel = "box", bandwidth=210))
-
-economics %>%
- mutate(smooth = fit$y) %>%
- ggplot() + aes(date, unemploy) +
- geom_point(alpha = 5, color = "skyblue") +
- geom_line(aes(date, smooth), color="red") + theme_minimal()
+fit <- with(economics,
+ ksmooth(date, unemploy, kernel = "box", bandwidth=210))
+
+economics %>%
+ mutate(smooth = fit$y) %>%
+ ggplot() + aes(date, unemploy) +
+ geom_point(alpha = 5, color = "skyblue") +
+ geom_line(aes(date, smooth), color="red") + theme_minimal()
![](V11_Time_and_Trends_files/figure-html/unnamed-chunk-4-1.png)
28.2.1 Polls_2008
Second Example comes from Rafael’s online book
-
+
## # A tibble: 131 × 2
## day margin
## <dbl> <dbl>
@@ -868,14 +874,14 @@ 28.2.1 Polls_2008fit <- with(polls_2008,
- ksmooth(day, margin, kernel = "box", bandwidth = span))
-
-polls_2008 %>%
- mutate(smooth = fit$y) %>%
- ggplot(aes(day, margin)) +
- geom_point(size = 3, alpha = .5, color = "grey") +
- geom_line(aes(day, smooth), color="red") + theme_minimal()
+fit <- with(polls_2008,
+ ksmooth(day, margin, kernel = "box", bandwidth = span))
+
+polls_2008 %>%
+ mutate(smooth = fit$y) %>%
+ ggplot(aes(day, margin)) +
+ geom_point(size = 3, alpha = .5, color = "grey") +
+ geom_line(aes(day, smooth), color="red") + theme_minimal()
![](V11_Time_and_Trends_files/figure-html/unnamed-chunk-5-1.png)
diff --git a/timeline.html b/timeline.html
index c53bac5..9b4fc78 100644
--- a/timeline.html
+++ b/timeline.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
@@ -809,25 +815,25 @@ 9.2.1 Char-to-Time# Reading from url
-# ptturl <- "https://github.com/P4CSS/R4CSSData/raw/main/ptt_hang_posts.csv"
-# raw <- read.csv(url(ptturl))
-
-
-# read_csv() won't convert timestamp to POSIXct automatically
-# raw <- read.csv("data/ptt_hang_posts.csv")
-# clean <- raw %>%
-# mutate(ptime = as.POSIXct(strptime(ptime, "%Y-%m-%dT%H:%M:%SZ")))
-
-
-# read_csv() will convert timestamp to POSIXct automatically
-clean <- read_csv("data/ptt_hang_posts.csv")
-
+# Reading from url
+# ptturl <- "https://github.com/P4CSS/R4CSSData/raw/main/ptt_hang_posts.csv"
+# raw <- read.csv(url(ptturl))
+
+
+# read_csv() won't convert timestamp to POSIXct automatically
+# raw <- read.csv("data/ptt_hang_posts.csv")
+# clean <- raw %>%
+# mutate(ptime = as.POSIXct(strptime(ptime, "%Y-%m-%dT%H:%M:%SZ")))
+
+
+# read_csv() will convert timestamp to POSIXct automatically
+clean <- read_csv("data/ptt_hang_posts.csv")
+
## [1] "character"
-
+
## # A tibble: 6 × 7
## plink board pcontent poster ptitle ptime ipaddr
## <chr> <chr> <chr> <chr> <chr> <dttm> <chr>
@@ -842,21 +848,21 @@ 9.2.1 Char-to-Time9.2.2 Density plot along time
在資料分析的過程中,我們經常需要對資料進行分布分析,以了解資料的特性。ggplot2
套件提供了 geom_density()
函數,可以用來繪製密度圖(density plot)。密度圖顯示了一個連續變量的概率密度函數的近似值,可以用來了解該變量的分佈情況。密度圖與直方圖類似,但它是基於核密度估計方法繪製的,所以在某些情況下可以提供更好的分佈近似。它將一個連續變量區間劃分為若干個小區間,然後對每個小區間的密度進行估計,再將這些小區間的密度估計值連接起來,形成一條平滑曲線,用以描述變量的分佈情況。
在 ggplot2
中,使用 geom_density()
函數可以很方便地繪製密度圖。我們只需要指定變量名稱,即可繪製出該變量的密度圖。此外,我們也可以使用 stat_density()
函數來繪製密度圖,這個函數允許我們對密度圖進行更多的自定義設置,例如指定核函數、調整帶寬等。繪製密度圖可以讓我們更直觀地了解變量的分佈情況,進而對資料進行更深入的分析和探索。
-
+
![](R25_tidy_temoral_features_files/figure-html/unnamed-chunk-4-1.png)
9.2.3 Freq by month
如果想要詳細觀察逐年逐月的變化,使用密度圖可能不夠直觀,此時可以考慮使用直方圖來呈現資料。直方圖可以將資料劃分為若干個等寬的區間,並計算每個區間內資料的頻率,然後將這些頻率顯示為長方形柱,以反映資料的分佈情況。對於時間序列資料,我們可以將其劃分為月、週等時間單位,然後計算每個時間單位內資料的出現次數,再使用 ggplot2
中的 geom_col()
函數繪製直方圖。
以上程式碼中,我們使用 mutate()
函數將 ptime
欄位轉換為月份 m
,然後使用 count()
函數計算每個月份出現的次數。接著使用 ggplot()
函數初始化一個 ggplot
對象,指定 aes()
函數的 x
軸為月份 m
,y
軸為出現次數 n
,然後使用 geom_col()
函數繪製直方圖。這樣可以很直觀地看到每個月份資料的出現次數,進而觀察到逐年逐月的變化趨勢。如果需要更詳細的觀察,可以將資料劃分為更小的時間單位,例如週,然後使用類似的方法繪製直方圖。
-?lubridate
-clean %>%
- mutate(m = month(ptime)) %>%
- count(m) %>%
- ggplot() + aes(m, n) +
- geom_col()
+?lubridate
+clean %>%
+ mutate(m = month(ptime)) %>%
+ count(m) %>%
+ ggplot() + aes(m, n) +
+ geom_col()
![](R25_tidy_temoral_features_files/figure-html/unnamed-chunk-5-1.png)
@@ -864,12 +870,12 @@ 9.2.4 Freq-by-date (good)在處理時間序列資料時,我們常常需要將資料劃分為不同的時間單位,例如月、週、日等,以便進行更精細的分析和視覺化。然而,如果只是單純地提取出時間序列資料中的某一個時間單位,例如月份,就會失去時間軸在年的特性,因此需要採取一些方法來保留日期(如年)的特性。
以上程式碼中,我們使用 filter()
函數選取了時間範圍為 2019 年 3 月 18 日到 4 月 1 日的資料,然後使用 floor_date()
函數將每個時間點取整為當天的起始時間,以保留日期(如年)的特性。這樣可以確保同一天的資料都被歸到同一個時間單位中,進而保留時間軸在年的特性。接著使用 count()
函數計算每個時間單位內資料的出現次數,再使用 ggplot()
函數和 geom_col()
函數繪製直方圖,可以看到在時間軸上的年份特性被保留了下來。
總之,當我們需要從時間序列資料中提取某一個時間單位時,應該採用能夠保留日期(如年)特性的方法,例如使用 floor_date()
函數,以便進行更加精細的分析和視覺化。
-clean %>%
- filter(ptime >= as_date("2019-03-18") & ptime < as_date("2019-04-01")) %>%
- mutate(m = floor_date(ptime, unit = "day")) %>%
- count(m) %>%
- ggplot() + aes(m, n) +
- geom_col()
+clean %>%
+ filter(ptime >= as_date("2019-03-18") & ptime < as_date("2019-04-01")) %>%
+ mutate(m = floor_date(ptime, unit = "day")) %>%
+ count(m) %>%
+ ggplot() + aes(m, n) +
+ geom_col()
![](R25_tidy_temoral_features_files/figure-html/unnamed-chunk-6-1.png)
@@ -877,18 +883,18 @@ 9.2.5 Freq-by-hourclean %>%
- filter(ptime >= as_datetime("2019-03-25") & ptime < as_datetime("2019-04-01")) %>%
- mutate(d = floor_date(ptime, unit = "day")) %>%
- mutate(h = hour(ptime)) %>%
- count(d, h) %>%
- mutate(wd = wday(d, label = F, locale = Sys.getlocale("LC_TIME"))) %>%
- mutate(isweekend = ifelse(wd >= 6, "weekend", "weekday")) %>%
- ggplot() + aes(h, n, color = as.character(d)) +
- geom_line() +
- facet_wrap(~isweekend)
+clean %>%
+ filter(ptime >= as_datetime("2019-03-25") & ptime < as_datetime("2019-04-01")) %>%
+ mutate(d = floor_date(ptime, unit = "day")) %>%
+ mutate(h = hour(ptime)) %>%
+ count(d, h) %>%
+ mutate(wd = wday(d, label = F, locale = Sys.getlocale("LC_TIME"))) %>%
+ mutate(isweekend = ifelse(wd >= 6, "weekend", "weekday")) %>%
+ ggplot() + aes(h, n, color = as.character(d)) +
+ geom_line() +
+ facet_wrap(~isweekend)
![](R25_tidy_temoral_features_files/figure-html/unnamed-chunk-7-1.png)
-
+
diff --git a/tm.html b/tm.html
index 3345221..a0c4c11 100644
--- a/tm.html
+++ b/tm.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
diff --git a/tmchi.html b/tmchi.html
index 0acbd22..54fd322 100644
--- a/tmchi.html
+++ b/tmchi.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
@@ -797,9 +803,9 @@ 14.1.1 Assigning unique id to eac
- 為了便於後續建立Document-Term-Matrix,這時候若Document自身沒有編號的話,就得把整個Document內容當成該篇文章的id,但也有(極小)可能有兩篇Document內容相同,那就會被視為同一篇文章或發生錯誤。所以必須要編id。
row_number()
產生每列的編號,所以這邊就直接把每列的編號視為每篇文章的id,可以保持該id的唯一性。當你在進行文本探勘或資料分析時,為每篇文章分配一個唯一的ID是非常重要的。唯一的ID確保每篇文章都有獨一無二的標識符號。這對於跟踪和識別特定文章非常重要,特別是當你處理大量的文本資料時。在進行資料合併時,唯一的ID可用於將不同來源的資料準確地匹配和合併在一起。這是非常實用的,尤其當你需要整合來自多個來源的文本資料時,例如合併多個資料集或者在不同時間點上進行的數據採集。
-
+
@@ -823,19 +829,19 @@ 14.2.1 Initializer tokenizer感嘆詞:嗯、哦、啊、呀、吧、喔等。
-# segment_not to avoid to be segmented by jeiba cutter
-segment_not <- c("第卅六條", "第卅八條", "蘇南成", "災前", "災後", "莫拉克", "颱風", "應變中心", "停班停課", "停課", "停班", "停駛", "路樹", "里長", "賀伯", "採收", "菜價", "蘇迪", "受災戶", "颱風警報", "韋恩", "台東縣", "馬總統", "豪大雨", "梅姬", "台東", "台北市政府", "工務段", "漂流木", "陳菊", "台南縣", "卡玫基", "魚塭", "救助金", "陳情", "全省", "強颱", "中颱", "輕颱", "小林村", "野溪", "蚵民", "農委會", "來襲", "中油公司", "蔣總統經國", "颱風天", "土石流", "蘇迪勒", "水利署", "陳說", "颱風假", "颱風地區", "台灣", "臺灣", "柯羅莎", "八八風災", "紓困","傅崑萁", "傅崐萁","台中", "文旦柚", "鄉鎮市公所", "鄉鎮市", "房屋稅", "高雄", "未達", "台灣省", "台北市")
-
-# Initialize jieba cutter
-cutter <- worker()
-
-# Add segment_not into user defined dictionary to avoid being cutted
-new_user_word(cutter, segment_not)
-## [1] TRUE
-# loading Chinese stop words
-stopWords <- readRDS("data/stopWords.rds")
+# segment_not to avoid to be segmented by jeiba cutter
+segment_not <- c("第卅六條", "第卅八條", "蘇南成", "災前", "災後", "莫拉克", "颱風", "應變中心", "停班停課", "停課", "停班", "停駛", "路樹", "里長", "賀伯", "採收", "菜價", "蘇迪", "受災戶", "颱風警報", "韋恩", "台東縣", "馬總統", "豪大雨", "梅姬", "台東", "台北市政府", "工務段", "漂流木", "陳菊", "台南縣", "卡玫基", "魚塭", "救助金", "陳情", "全省", "強颱", "中颱", "輕颱", "小林村", "野溪", "蚵民", "農委會", "來襲", "中油公司", "蔣總統經國", "颱風天", "土石流", "蘇迪勒", "水利署", "陳說", "颱風假", "颱風地區", "台灣", "臺灣", "柯羅莎", "八八風災", "紓困","傅崑萁", "傅崐萁","台中", "文旦柚", "鄉鎮市公所", "鄉鎮市", "房屋稅", "高雄", "未達", "台灣省", "台北市")
-# load("../segment_not.R")
+# Initialize jieba cutter
+cutter <- worker()
+
+# Add segment_not into user defined dictionary to avoid being cutted
+new_user_word(cutter, segment_not)
+## [1] TRUE
+
14.2.2 Tokenization
@@ -859,17 +865,17 @@ 14.2.2 Tokenization# news.df$time %>% summary
-
-tokenized.df <- news.df %>%
- slice(-3069) %>%
- mutate(timestamp=ymd(time)) %>%
- # filter(timestamp > as.Date("2009-01-01")) %>%
- select(-time) %>%
- select(title, text, cat, timestamp, everything()) %>%
- mutate(word = purrr::map(text, function(x)segment(x, cutter)))
-
-tokenized.df %>% select(title, word) %>% head()
+# news.df$time %>% summary
+
+tokenized.df <- news.df %>%
+ slice(-3069) %>%
+ mutate(timestamp=ymd(time)) %>%
+ # filter(timestamp > as.Date("2009-01-01")) %>%
+ select(-time) %>%
+ select(title, text, cat, timestamp, everything()) %>%
+ mutate(word = purrr::map(text, function(x)segment(x, cutter)))
+
+tokenized.df %>% select(title, word) %>% head()
## # A tibble: 6 × 2
## title word
## <chr> <list>
@@ -879,17 +885,17 @@ 14.2.2 Tokenization# unnest() to spread character into a new word variable
-# filter out stop words
-# filter out alphabetical and numeric characters
-
-unnested.df <- tokenized.df %>%
- select(doc_id, text, word) %>%
- unnest(word) %>%
- filter(!(word %in% stopWords$word)) %>%
- filter(!str_detect(word, "[a-zA-Z0-9]+"))
-
-unnested.df %>% head
+# unnest() to spread character into a new word variable
+# filter out stop words
+# filter out alphabetical and numeric characters
+
+unnested.df <- tokenized.df %>%
+ select(doc_id, text, word) %>%
+ unnest(word) %>%
+ filter(!(word %in% stopWords$word)) %>%
+ filter(!str_detect(word, "[a-zA-Z0-9]+"))
+
+unnested.df %>% head
## # A tibble: 6 × 3
## doc_id text word
## <int> <chr> <chr>
@@ -917,81 +923,81 @@ 14.3.1 Word frequency distributio
長尾尾部:power-law distribution的特點是長尾尾部的存在,即少數極端值或稀有事件的出現頻率相對較高。在對數尺度下,我們能夠更清楚地看到這些極端值或稀有事件在數據分佈中的位置,因為它們在對數尺度下會呈現較為明顯的特徵。
分佈斜率:對數尺度下的power-law distribution,通常可以通過斜率來描述分佈的特性。斜率表示每個X單位變化對應的Y單位變化,或者說在對數尺度下,表示對數Y值相對於對數X值的變化率。如果數據點遵循power-law distribution,斜率會呈現相對恆定的特性。
-word.count <- tokenized.df %>%
- unnest(word) %>%
- count(word, sort=T) %>%
- filter(!(word %in% stopWords$word)) %>%
- filter(nchar(word) > 1) %>%
- filter(!str_detect(word, "[a-zA-Z0-9]+")) %>%
- filter(n > 3)
-
-
-word.count %>%
- count(n, sort=T) %>%
- ggplot(aes(n, nn)) +
- geom_point(alpha=0.5, size = 1, color="#333333")
+word.count <- tokenized.df %>%
+ unnest(word) %>%
+ count(word, sort=T) %>%
+ filter(!(word %in% stopWords$word)) %>%
+ filter(nchar(word) > 1) %>%
+ filter(!str_detect(word, "[a-zA-Z0-9]+")) %>%
+ filter(n > 3)
+
+
+word.count %>%
+ count(n, sort=T) %>%
+ ggplot(aes(n, nn)) +
+ geom_point(alpha=0.5, size = 1, color="#333333")
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-5-1.png)
-word.count %>%
- count(n, sort=T) %>%
- ggplot(aes(n, nn)) +
- geom_point(alpha=0.5, size = 1, color="#333333") +
- scale_x_log10() +
- scale_y_log10()
+word.count %>%
+ count(n, sort=T) %>%
+ ggplot(aes(n, nn)) +
+ geom_point(alpha=0.5, size = 1, color="#333333") +
+ scale_x_log10() +
+ scale_y_log10()
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-5-2.png)
14.3.2 Keyness by logratio
早、近期用字差異
-cat_word.tf <- tokenized.df %>%
- unnest(word) %>%
- count(cat, word) %>%
- ungroup() %>%
- filter(!str_detect(word, "[a-zA-Z0-9]+")) %>%
- filter(!(word %in% stopWords$word)) %>%
- filter(nchar(word)>1)
-early_lat_ratio <- cat_word.tf %>%
- filter(n>1) %>%
- pivot_wider(names_from = cat, values_from = n, values_fill = 0) %>%
- # spread(cat, n, fill = 0) %>%
- ungroup() %>%
- mutate_if(is.numeric, funs((. + 1) / sum(. + 1))) %>%
- mutate(logratio = log2(early / lat)) %>%
- arrange(desc(logratio))
-early_lat_ratio %>%
- group_by(logratio > 0) %>%
- top_n(20, abs(logratio)) %>%
- ungroup() %>%
- mutate(word = reorder(word, logratio)) %>%
- ggplot(aes(word, logratio, fill = logratio < 0)) +
- geom_bar(stat = "identity") +
- coord_flip() +
- ylab("early / recent log ratio") +
- scale_fill_manual(name = "", labels = c("early", "recent"),
- values = c("tomato", "lightblue")) +
- theme(axis.text.y=element_text(colour="black", family="Heiti TC Light"))
+cat_word.tf <- tokenized.df %>%
+ unnest(word) %>%
+ count(cat, word) %>%
+ ungroup() %>%
+ filter(!str_detect(word, "[a-zA-Z0-9]+")) %>%
+ filter(!(word %in% stopWords$word)) %>%
+ filter(nchar(word)>1)
+early_lat_ratio <- cat_word.tf %>%
+ filter(n>1) %>%
+ pivot_wider(names_from = cat, values_from = n, values_fill = 0) %>%
+ # spread(cat, n, fill = 0) %>%
+ ungroup() %>%
+ mutate_if(is.numeric, funs((. + 1) / sum(. + 1))) %>%
+ mutate(logratio = log2(early / lat)) %>%
+ arrange(desc(logratio))
+early_lat_ratio %>%
+ group_by(logratio > 0) %>%
+ top_n(20, abs(logratio)) %>%
+ ungroup() %>%
+ mutate(word = reorder(word, logratio)) %>%
+ ggplot(aes(word, logratio, fill = logratio < 0)) +
+ geom_bar(stat = "identity") +
+ coord_flip() +
+ ylab("early / recent log ratio") +
+ scale_fill_manual(name = "", labels = c("early", "recent"),
+ values = c("tomato", "lightblue")) +
+ theme(axis.text.y=element_text(colour="black", family="Heiti TC Light"))
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-8-1.png)
14.3.3 Keyness by scatter
-frequency <- cat_word.tf %>%
- filter(n>3) %>%
- group_by(cat) %>%
- mutate(proportion = n/sum(n)) %>%
- select(-n) %>%
- spread(cat, proportion) %>%
- na.omit()
-
-# datatable(frequency)
-library(scales)
-frequency %>%
-ggplot(aes(x = early, y = lat, color = abs(early - lat))) +
- geom_abline(color = "gray40", lty = 2) +
- geom_point(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
- geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5, family="Heiti TC Light", size = 3) +
- scale_x_log10(labels = percent_format()) +
- scale_y_log10(labels = percent_format()) +
- theme(legend.position="none") +
- coord_fixed(1)
+frequency <- cat_word.tf %>%
+ filter(n>3) %>%
+ group_by(cat) %>%
+ mutate(proportion = n/sum(n)) %>%
+ select(-n) %>%
+ spread(cat, proportion) %>%
+ na.omit()
+
+# datatable(frequency)
+library(scales)
+frequency %>%
+ggplot(aes(x = early, y = lat, color = abs(early - lat))) +
+ geom_abline(color = "gray40", lty = 2) +
+ geom_point(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
+ geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5, family="Heiti TC Light", size = 3) +
+ scale_x_log10(labels = percent_format()) +
+ scale_y_log10(labels = percent_format()) +
+ theme(legend.position="none") +
+ coord_fixed(1)
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-10-1.png)
@@ -1011,45 +1017,45 @@ 14.4 TF-IDF
14.4.1 Term-frequency
-word.tf <- tokenized.df %>%
- unnest(word) %>%
- count(cat, word, sort=T) %>%
- # mutate(total_words=sum(n)) %>%
- mutate(rank=row_number(), tf= n/sum(n))
+word.tf <- tokenized.df %>%
+ unnest(word) %>%
+ count(cat, word, sort=T) %>%
+ # mutate(total_words=sum(n)) %>%
+ mutate(rank=row_number(), tf= n/sum(n))
- 如果是跑histrogram因為不是常態分佈而是power-law分佈,通常會看不出什麼來
-ggplot(word.tf, aes(tf, fill=cat)) +
- geom_histogram(show.legend = F) +
- xlim(NA, 0.0009) +
- scale_x_log10() +
- scale_y_log10() +
- facet_wrap(~cat, ncol=2, scales="free_y")
+ggplot(word.tf, aes(tf, fill=cat)) +
+ geom_histogram(show.legend = F) +
+ xlim(NA, 0.0009) +
+ scale_x_log10() +
+ scale_y_log10() +
+ facet_wrap(~cat, ncol=2, scales="free_y")
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-12-1.png)
- 加上rank後可以看出最高rank到最後的差異,中段差不多,但是,相較於晚近的文章,早期文章用過很少次的字比較多,但用過很多次的字比較少。(是否可推論用字越來越貧乏?)
-word.tf %>%
- ggplot(aes(rank, tf, color=cat)) +
- geom_line(size=1.1, alpha=0.5) +
- scale_x_log10() +
- scale_y_log10()
+word.tf %>%
+ ggplot(aes(rank, tf, color=cat)) +
+ geom_line(size=1.1, alpha=0.5) +
+ scale_x_log10() +
+ scale_y_log10()
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-13-1.png)
-rank_subset <- word.tf %>%
- filter(rank < 500,
- rank > 10)
-
-lm_result <- lm(log10(tf) ~ log10(rank), data = rank_subset)
-lm_result$coefficients[[1]]
+rank_subset <- word.tf %>%
+ filter(rank < 500,
+ rank > 10)
+
+lm_result <- lm(log10(tf) ~ log10(rank), data = rank_subset)
+lm_result$coefficients[[1]]
## [1] -1.739581
-word.tf %>%
- ggplot(aes(rank, tf, color = cat)) +
- geom_abline(intercept = lm_result$coefficients[[1]],
- slope = lm_result$coefficients[[2]],
- color = "gray50", linetype = 2) +
- geom_line(size = 1.1, alpha = 0.8, show.legend = FALSE) +
- scale_x_log10() +
- scale_y_log10()
+word.tf %>%
+ ggplot(aes(rank, tf, color = cat)) +
+ geom_abline(intercept = lm_result$coefficients[[1]],
+ slope = lm_result$coefficients[[2]],
+ color = "gray50", linetype = 2) +
+ geom_line(size = 1.1, alpha = 0.8, show.legend = FALSE) +
+ scale_x_log10() +
+ scale_y_log10()
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-15-1.png)
@@ -1058,31 +1064,31 @@ 14.4.2 TF-IDF to filter significa
首先,透過刪除TF-IDF值很低的詞彙,我們可以去除那些在文本中出現頻率較低且普遍性較高的詞彙,這些詞彙對於區分不同文本的能力相對較低,因此可以忽略不計。
其次,我們可以僅保留大於平均值加上一個或兩個標準差的TF-IDF值較高的詞彙,這些詞彙可以作為有效辨識文章的關鍵字。這是因為這些詞彙在文本中出現的頻率較高,同時其與該文本的關聯性也相對較強。
透過這樣的過濾和選擇,我們可以得到一個更精簡且具有代表性的詞彙集合,這些詞彙能夠更好地描述和區分不同的文章。因此,使用TF-IDF計算結果進行這樣的處理,可以在文本分析和信息檢索等領域中提供更有價值的結果。
-news_count <- tokenized.df %>%
- unnest(word) %>%
- count(doc_id, word) %>%
- bind_tf_idf(word, doc_id, n) %>%
- arrange(desc(tf_idf))
-
-news_count %>%
- ggplot(aes(tf_idf)) +
- geom_histogram(bins = 100) +
- scale_x_log10()
+news_count <- tokenized.df %>%
+ unnest(word) %>%
+ count(doc_id, word) %>%
+ bind_tf_idf(word, doc_id, n) %>%
+ arrange(desc(tf_idf))
+
+news_count %>%
+ ggplot(aes(tf_idf)) +
+ geom_histogram(bins = 100) +
+ scale_x_log10()
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-16-1.png)
-news_count %>%
- left_join(news.df, by="doc_id") %>%
- filter(!(word %in% c("NA"))) %>%
- group_by(cat) %>%
- arrange(desc(tf_idf)) %>%
- top_n(30, tf_idf) %>%
- ungroup() %>%
- mutate(word = reorder(word, tf_idf)) %>%
- ggplot(aes(word, tf_idf, fill = cat)) +
- geom_col(show.legend = FALSE) +
- labs(x = NULL, y = "tf-idf") +
- facet_wrap(~cat, ncol = 2, scales = "free") +
- coord_flip() +
- theme(axis.text.y=element_text(family="Heiti TC Light"))
+news_count %>%
+ left_join(news.df, by="doc_id") %>%
+ filter(!(word %in% c("NA"))) %>%
+ group_by(cat) %>%
+ arrange(desc(tf_idf)) %>%
+ top_n(30, tf_idf) %>%
+ ungroup() %>%
+ mutate(word = reorder(word, tf_idf)) %>%
+ ggplot(aes(word, tf_idf, fill = cat)) +
+ geom_col(show.legend = FALSE) +
+ labs(x = NULL, y = "tf-idf") +
+ facet_wrap(~cat, ncol = 2, scales = "free") +
+ coord_flip() +
+ theme(axis.text.y=element_text(family="Heiti TC Light"))
![](R35_tm_typhoon_files/figure-html/unnamed-chunk-17-1.png)
diff --git a/trump.html b/trump.html
index 17410ee..607e70f 100644
--- a/trump.html
+++ b/trump.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
@@ -795,58 +801,58 @@ Chapter 12 Trump’s tweets學習關鍵字分析技術 keyness,以找出在不同文本之間對彼此相對突出的關鍵字。
這段程式碼是用來設計 ggplot2 的主題風格。作者首先定義了一個名為 th
的自訂主題,基於 ggplot2 的 theme_minimal()
主題,並設置了不同元素的字型、大小和樣式等屬性。接著,作者定義了一個名為 new_style()
的函數,用於更精細的主題風格設置,包括圖表標題、圖例、軸標籤和刻度標籤等。透過這些設置,可以讓 ggplot2 圖表更具有視覺吸引力,並強調重要的圖形元素,使圖表更加清晰易懂。這兩種方式都可以用來定義主題
-library(tidyverse)
-# library(lubridate) # has been included in tidyverse
-options(scipen = 999)
-
-# Self-designed theme
-th <- theme_minimal() +
- theme(plot.title = element_text(size=24, face="bold"),
- legend.title = element_text(size=18, face="bold"),
- legend.text = element_text(size=18),
- axis.title = element_text(hjust=0.5, size=18, face="italic"),
- axis.text = element_text(size=18)
- )
-
-# more settings
-new_style <- function() {
- font <- "Helvetica"
- theme(
- plot.title = element_text(family=font, size=28, face="bold"),
- plot.subtitle = element_text(family=font, size=22,
- margin=margin(9,0,9,0)),
- plot.caption = element_blank(),
- legend.position = "top",
- legend.text.align = 0,
- legend.background = element_blank(),
- # legend.title = element_blank(),
- legend.key = element_blank(),
- legend.text = element_text(family=font, size=18, color="#222222"),
- axis.text = element_text(family=font, size=18, color="#222222"),
- axis.text.x = element_text(margin=margin(5, b = 10)),
- axis.ticks = element_blank(),
- axis.line = element_blank(),
- panel.grid.minor = element_blank(),
- panel.grid.major.y = element_line(color="#cbcbcb"),
- panel.grid.major.x = element_blank(),
- panel.background = element_blank(),
- strip.background = element_rect(fill="white"),
- strip.text = element_text(size = 22, hjust = 0)
- )
- }
+library(tidyverse)
+# library(lubridate) # has been included in tidyverse
+options(scipen = 999)
+
+# Self-designed theme
+th <- theme_minimal() +
+ theme(plot.title = element_text(size=24, face="bold"),
+ legend.title = element_text(size=18, face="bold"),
+ legend.text = element_text(size=18),
+ axis.title = element_text(hjust=0.5, size=18, face="italic"),
+ axis.text = element_text(size=18)
+ )
+
+# more settings
+new_style <- function() {
+ font <- "Helvetica"
+ theme(
+ plot.title = element_text(family=font, size=28, face="bold"),
+ plot.subtitle = element_text(family=font, size=22,
+ margin=margin(9,0,9,0)),
+ plot.caption = element_blank(),
+ legend.position = "top",
+ legend.text.align = 0,
+ legend.background = element_blank(),
+ # legend.title = element_blank(),
+ legend.key = element_blank(),
+ legend.text = element_text(family=font, size=18, color="#222222"),
+ axis.text = element_text(family=font, size=18, color="#222222"),
+ axis.text.x = element_text(margin=margin(5, b = 10)),
+ axis.ticks = element_blank(),
+ axis.line = element_blank(),
+ panel.grid.minor = element_blank(),
+ panel.grid.major.y = element_line(color="#cbcbcb"),
+ panel.grid.major.x = element_blank(),
+ panel.background = element_blank(),
+ strip.background = element_rect(fill="white"),
+ strip.text = element_text(size = 22, hjust = 0)
+ )
+ }
12.1 Loading data
-
+
## [1] 1512 16
-
+
## [1] "text" "favorited" "favoriteCount" "replyToSN"
## [5] "created" "truncated" "replyToSID" "id"
## [9] "replyToUID" "statusSource" "screenName" "retweetCount"
## [13] "isRetweet" "retweeted" "longitude" "latitude"
-trump_tweets_df %>%
- select(id, text, created, favoriteCount, retweetCount, statusSource) %>%
- head(10)
+trump_tweets_df %>%
+ select(id, text, created, favoriteCount, retweetCount, statusSource) %>%
+ head(10)
## # A tibble: 10 × 6
## id text created favoriteCount retweetCount statusSource
## <chr> <chr> <dttm> <dbl> <dbl> <chr>
@@ -866,22 +872,22 @@ 12.2 Cleaning data# tidyr::extract()
-# stringr::str_replace
-
-trump_tweets_df$statusSource[1]
+
## [1] "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>"
-tweets <- trump_tweets_df %>%
- select(id, statusSource, text, created) %>%
- # mutate(source = str_replace(statusSource,
- # ".*Twitter for (.*?)<.*", "\\1")) %>%
- # mutate(source = str_extract(statusSource, 'Twitter for (.*?)<')) %>% View
- extract(statusSource, "source", "Twitter for (.*?)<") %>%
- filter(source %in% c("iPhone", "Android"))
-
-# Using stringr::str_replace() to mutate a new source variable, replacing tidyr::
-
-# str(tweets)
+tweets <- trump_tweets_df %>%
+ select(id, statusSource, text, created) %>%
+ # mutate(source = str_replace(statusSource,
+ # ".*Twitter for (.*?)<.*", "\\1")) %>%
+ # mutate(source = str_extract(statusSource, 'Twitter for (.*?)<')) %>% View
+ extract(statusSource, "source", "Twitter for (.*?)<") %>%
+ filter(source %in% c("iPhone", "Android"))
+
+# Using stringr::str_replace() to mutate a new source variable, replacing tidyr::
+
+# str(tweets)
Practice. 有時候我們會希望避免用太多種套件來寫程式,例如上面的extract()
便屬於tidyr
的函式。事實上我們可以用stringr::str_replace()
來達到這個目的。嘗試寫寫看?或者嘗試問ChatGPT看看?
Prompt. 我如果希望用stringr::str_replace
來達到extract(statusSource, "source", "Twitter for (.*?)<") %>%
的功能,我該怎麼寫?
@@ -895,51 +901,51 @@ 12.3.1 Productivity by timehour = hour(with_tz(created, "EST"))
這段程式碼使用了with_tz()
函數將created
欄位的時區轉換為"EST"
所對應的時區,然後使用hour()
函數提取出該日期時間對應的小時數,並將結果存儲在hour
變數中。該程式碼會將例如"2023-04-12 12:30:00"
轉換為美國東部標準時間對應的小時數,即12
(因為12點30分所在的小時是12點)。他所取出的並非某日的12時,他就只是取出是12時。
toplot1
和toplot2
的差異在於對source
欄位的分組處理不同。具體來說,toplot1
中沒有對source
欄位進行分組,而是在後面使用mutate()
函數將計數結果中的n
列和sum(n)
相除,得到了百分比列percent
。這導致計算的是整個資料集中的hour
和source
的計數和百分比。相反,toplot2
中使用了group_by()
函數將source
欄位進行分組處理,並在後面使用mutate()
函數和ungroup()
函數計算了每個source
和hour
的計數和百分比,即分別計算了iPhone
和Android
的計數和百分比。因此,toplot1
和toplot2
的計算結果是不同的,前者的計算結果中包含了整個資料集的計數和百分比,而後者的計算結果則分別對iPhone
和Android
進行了計數和百分比的計算。
程式碼使用了ggplot()
函數創建了一個ggplot2
物件,並使用aes()
函數設置了hour
和percent
欄位作為X軸和Y軸的變數,並且設置color = source
表示以source
欄位的值作為不同群組(iPhone
vs. Android
)折線的顏色。接著,程式碼使用geom_line()
函數添加折線到圖中,設置了折線的粗細為1。使用scale_color_manual()
函數設置了圖例的名稱為Phone System
,標籤依照分組指定為為Android
和iPhone
,顏色分別為royalblue
和gold
,並使用scale_y_continuous()
函數設置了Y軸刻度標籤的格式為百分比形式,即0%到100%之間的數值。注意:percent_format()
並非ggplot2既有的函式,要另外安裝並匯入library(scales)
。
-library(scales) # for percent_format()
-# lubridate::hour()
-# lubridate::with_tz()
-# scales::percent_format()
-
-toplot1 <- tweets %>%
- count(source, hour = hour(with_tz(created, "EST"))) %>%
- # group_by(source) %>%
- mutate(percent = n / sum(n))
- # ungroup() %>%
-
-toplot2 <- tweets %>%
- count(source, hour = hour(with_tz(created, "EST"))) %>%
- group_by(source) %>%
- mutate(percent = n / sum(n)) %>%
- ungroup()
-
-p1 <- toplot1 %>%
- ggplot() +
- aes(hour, percent, color = source) +
- geom_line(linewidth = 1) +
- scale_color_manual(name = "Phone System",
- labels = c("Android", "iPhone"),
- values = c("royalblue", "gold")) +
- scale_y_continuous(labels = percent_format()) +
- labs(x = "Hour of day (EST)",
- y = "% of tweets",
- color = "") + theme_minimal()
-
-p2 <- toplot2 %>%
- ggplot() +
- aes(hour, percent, color = source) +
- geom_line(linewidth = 1) +
- scale_color_manual(name = "Phone System",
- labels = c("Android", "iPhone"),
- values = c("royalblue", "gold")) +
- scale_y_continuous(labels = percent_format()) +
- labs(x = "Hour of day (EST)",
- y = "% of tweets",
- color = "") + theme_minimal()
-cowplot::plot_grid(
- p1, NULL, p2,
- labels = c("(a) Normalized by all", "", "(b) Normalized in group"),
- nrow = 1, rel_widths = c(1, 0.1, 1)
-)
+library(scales) # for percent_format()
+# lubridate::hour()
+# lubridate::with_tz()
+# scales::percent_format()
+
+toplot1 <- tweets %>%
+ count(source, hour = hour(with_tz(created, "EST"))) %>%
+ # group_by(source) %>%
+ mutate(percent = n / sum(n))
+ # ungroup() %>%
+
+toplot2 <- tweets %>%
+ count(source, hour = hour(with_tz(created, "EST"))) %>%
+ group_by(source) %>%
+ mutate(percent = n / sum(n)) %>%
+ ungroup()
+
+p1 <- toplot1 %>%
+ ggplot() +
+ aes(hour, percent, color = source) +
+ geom_line(linewidth = 1) +
+ scale_color_manual(name = "Phone System",
+ labels = c("Android", "iPhone"),
+ values = c("royalblue", "gold")) +
+ scale_y_continuous(labels = percent_format()) +
+ labs(x = "Hour of day (EST)",
+ y = "% of tweets",
+ color = "") + theme_minimal()
+
+p2 <- toplot2 %>%
+ ggplot() +
+ aes(hour, percent, color = source) +
+ geom_line(linewidth = 1) +
+ scale_color_manual(name = "Phone System",
+ labels = c("Android", "iPhone"),
+ values = c("royalblue", "gold")) +
+ scale_y_continuous(labels = percent_format()) +
+ labs(x = "Hour of day (EST)",
+ y = "% of tweets",
+ color = "") + theme_minimal()
+cowplot::plot_grid(
+ p1, NULL, p2,
+ labels = c("(a) Normalized by all", "", "(b) Normalized in group"),
+ nrow = 1, rel_widths = c(1, 0.1, 1)
+)
![](R32_trump_tweet_dplyr_files/figure-html/tweets-by-hour-1.png)
@@ -952,34 +958,34 @@ 12.3.2 Tweeting with figuresp1
中使用了position="stack"
的參數,表示將不同分組的bar疊加在一起,以展示每個source
的總推文數量,並且bar的寬度設置為0.5(使用width
參數),使得bar之間有一定的間隔。這種方式可以方便地比較不同source
的總推文數量,並且可以看到每個source
中有多少推文包含圖片或連結。
p2
中使用了position="dodge"
的參數,表示將不同分組的bar並排放置,以便比較不同source
中包含或不包含圖片或連結的推文數量。這種方式可以顯示出每個source
中有多少推文包含或不包含圖片或連結,並且可以清楚地比較不同source
之間的差異。
-toplot <- tweets %>%
- filter(!str_detect(text, '^"')) %>%
- mutate(picture = if_else(str_detect(text, "t.co"),
- "Picture/link", "No picture/link")) %>%
- count(source, picture)
-
-p1 <- toplot %>%
- ggplot() +
- aes(source, n, fill = picture) +
- geom_col(position="stack", width = 0.5) +
- scale_fill_manual(name = "With Picture/link?",
- labels = c("No", "Yes"),
- values = c("gold", "royalblue")) +
- labs(x = "", y = "Number of tweets", fill = "") + theme_minimal()
-
-p2 <- toplot %>%
- ggplot() +
- aes(source, n, fill = picture) +
- geom_col(position="dodge") +
- scale_fill_manual(name = "With Picture/link?",
- labels = c("No", "Yes"),
- values = c("gold", "royalblue")) +
- labs(x = "", y = "Number of tweets", fill = "") + theme_minimal()
-
-cowplot::plot_grid(
- p1, NULL, p2,
- labels = c("(a) Stacked", "", "(b) Dodged"), nrow = 1, rel_widths = c(1, 0.1, 1)
-)
+toplot <- tweets %>%
+ filter(!str_detect(text, '^"')) %>%
+ mutate(picture = if_else(str_detect(text, "t.co"),
+ "Picture/link", "No picture/link")) %>%
+ count(source, picture)
+
+p1 <- toplot %>%
+ ggplot() +
+ aes(source, n, fill = picture) +
+ geom_col(position="stack", width = 0.5) +
+ scale_fill_manual(name = "With Picture/link?",
+ labels = c("No", "Yes"),
+ values = c("gold", "royalblue")) +
+ labs(x = "", y = "Number of tweets", fill = "") + theme_minimal()
+
+p2 <- toplot %>%
+ ggplot() +
+ aes(source, n, fill = picture) +
+ geom_col(position="dodge") +
+ scale_fill_manual(name = "With Picture/link?",
+ labels = c("No", "Yes"),
+ values = c("gold", "royalblue")) +
+ labs(x = "", y = "Number of tweets", fill = "") + theme_minimal()
+
+cowplot::plot_grid(
+ p1, NULL, p2,
+ labels = c("(a) Stacked", "", "(b) Dodged"), nrow = 1, rel_widths = c(1, 0.1, 1)
+)
![](R32_trump_tweet_dplyr_files/figure-html/unnamed-chunk-2-1.png)
@@ -1003,12 +1009,12 @@ 12.4 Keyness做為分隔符號)進行拆分,得到一個由單詞序列組成的list。這樣做的缺點是無法同時將文本中的標點符號、空格、停用詞等過濾掉,因此在進行文本分析時需要額外進行過濾處理。
unnest_tokens()
函數則使用更靈活的正則表達式(regex)來指定單詞的分割方式,可以將文本中的單詞、標點符號、空格等都分割開來,並且可以通過指定特定的正則表達式來過濾停用詞、非英文字符等。unnest_tokens()
函數還可以將分割後的單詞list展開成一個單詞data.frame,每個單詞對應一行記錄,這樣更容易進行後續的文本分析和可視化。在unnest_tokens(word, text, token = "regex", pattern = "[^A-Za-z\\d#@']") %>%
中,word
表示新建的單詞欄位的名稱,text
表示原始文本欄位的名稱,token
表示使用的分割方式,這裡指定為正則表達式;pattern
則是指定的正則表達式,其中[^A-Za-z\\d#@']
表示匹配不屬於字母、數字、@、#、’的任意字符,即過濾掉非英文字符和一些標點符號。
-library(tidytext) # unnest_tokens()
-library(stringr) # str_detect(), str_replace_all()
-
-# View(test)
-
-stop_words$word
+library(tidytext) # unnest_tokens()
+library(stringr) # str_detect(), str_replace_all()
+
+# View(test)
+
+stop_words$word
## [1] "a" "a's" "able" "about"
## [5] "above" "according" "accordingly" "across"
## [9] "actually" "after" "afterwards" "again"
@@ -1297,32 +1303,32 @@ 12.4 Keynesstweet_words <- tweets %>%
- filter(!str_detect(text, '^"')) %>%
- mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&", "")) %>%
- # unnest_tokens(word, text) %>%
- # unnest_tokens(word, text, token = "regex", pattern = "[^A-Za-z\\d#@']") %>%
- mutate(word = str_split(text, " ")) %>%
- select(id, text, word, everything()) %>%
- unnest(word) %>%
- filter(!word %in% stop_words$word) %>%
- filter(str_detect(word, "[a-z]"))
-# View(tweet_words)
+tweet_words <- tweets %>%
+ filter(!str_detect(text, '^"')) %>%
+ mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&", "")) %>%
+ # unnest_tokens(word, text) %>%
+ # unnest_tokens(word, text, token = "regex", pattern = "[^A-Za-z\\d#@']") %>%
+ mutate(word = str_split(text, " ")) %>%
+ select(id, text, word, everything()) %>%
+ unnest(word) %>%
+ filter(!word %in% stop_words$word) %>%
+ filter(str_detect(word, "[a-z]"))
+# View(tweet_words)
這段程式碼用於分析文本數據中出現頻率最高的單詞(word),並使用barplot進行視覺化呈現。具體來說,這段程式碼實現了以下幾個步驟:
使用count()
函數對data.frame中的單詞word
進行計數,得到每個單詞出現的次數,並按照次數降序排列。
使用head()
函數選擇出現次數最高的前20個單詞,並用mutate()
函數將這20個單詞按照出現次數重新排序(注意reorder()
的寫法)。
geom_col()
函數用於繪製barplot,coord_flip()
函數用於將x軸和y軸互換,以便更好地顯示barplot。
-tweet_words %>%
- count(word, sort = TRUE) %>%
- head(20) %>%
- mutate(word = reorder(word, n)) %>%
- ggplot(aes(word, n)) +
- geom_col(fill = "royalblue") +
- ylab("Occurrences") +
- coord_flip() + theme_minimal() +
- theme(axis.text = element_text(size=10))
+tweet_words %>%
+ count(word, sort = TRUE) %>%
+ head(20) %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col(fill = "royalblue") +
+ ylab("Occurrences") +
+ coord_flip() + theme_minimal() +
+ theme(axis.text = element_text(size=10))
![](R32_trump_tweet_dplyr_files/figure-html/unnamed-chunk-4-1.png)
12.4.1 Log-likelihood ratio
@@ -1338,34 +1344,34 @@ 12.4.1 Log-likelihood ratio對Android和iPhone兩個來源中的每個單詞,分別計算其在Android和iPhone兩個來源中的keyness log ratio。這裡使用了常見的對數比值(log ratio)方法,計算Android來源中單詞出現概率和iPhone來源中單詞出現概率的比值的對數,以此來衡量單詞在Android和iPhone兩個來源中的關鍵性差異。
將計算得到的log ratio值按照降序排列,以便進一步進行分析和可視化。
-test <- tweet_words %>%
- count(word, source) %>%
- filter(n >= 5) %>%
- pivot_wider(names_from = source,
- values_from = n,
- values_fill = 0)
-# View(test)
-
-word_by_source <- tweet_words %>%
- count(word, source) %>%
- filter(n >= 5) %>%
- pivot_wider(names_from = source,
- values_from = n,
- values_fill = 0) %>%
- # spread(source, n, fill = 0) %>%
- ungroup()
-
-sum(word_by_source$iPhone)
+test <- tweet_words %>%
+ count(word, source) %>%
+ filter(n >= 5) %>%
+ pivot_wider(names_from = source,
+ values_from = n,
+ values_fill = 0)
+# View(test)
+
+word_by_source <- tweet_words %>%
+ count(word, source) %>%
+ filter(n >= 5) %>%
+ pivot_wider(names_from = source,
+ values_from = n,
+ values_fill = 0) %>%
+ # spread(source, n, fill = 0) %>%
+ ungroup()
+
+sum(word_by_source$iPhone)
## [1] 1383
-
+
## [1] 2132
-android_iphone_ratios <- word_by_source %>%
- mutate(iPhone = (iPhone+1)/sum(iPhone+1)) %>%
- mutate(Android = (Android+1)/sum(Android+1)) %>%
- # mutate_at(.cols = vars(iPhone, Android),
- # .funs = funs((. + 1) / sum(. + 1))) %>%
- mutate(logratio = log2(Android / iPhone)) %>%
- arrange(desc(logratio))
+android_iphone_ratios <- word_by_source %>%
+ mutate(iPhone = (iPhone+1)/sum(iPhone+1)) %>%
+ mutate(Android = (Android+1)/sum(Android+1)) %>%
+ # mutate_at(.cols = vars(iPhone, Android),
+ # .funs = funs((. + 1) / sum(. + 1))) %>%
+ mutate(logratio = log2(Android / iPhone)) %>%
+ arrange(desc(logratio))
這兩行分子分母加1的處理稱為拉普拉斯平滑。mutate(iPhone = (iPhone+1)/sum(iPhone+1)) %>%
拉普拉斯平滑(add-k smoothing)是一種用於處理計數資料中零值問題的技巧,其主要目的是將出現次數為零的類別在計算機率時賦予一個非零的機率值,以避免出現無限大的情況,從而影響後續的計算結果。
@@ -1376,19 +1382,19 @@ 12.4.1 Log-likelihood ratio12.4.2 Plotting keyness
這段程式碼是用來繪製Android和iPhone兩個來源中關鍵性差異最大的單詞的keyness log ratio的條形圖。在繪製條形圖時,使用了fill = logratio < 0
的參數設置,這是一個布林值,當單詞在Android和iPhone兩個來源中的log ratio小於0時,填充的顏色是gold,否則填充的顏色是royalblue。
這種設計原理的目的是將Android和iPhone兩個來源中關鍵性不同的單詞進行區分,並用不同的填充顏色來表示。當單詞在Android來源中的出現概率高於在iPhone來源中的出現概率時,其log ratio值會為正,此時填充的顏色為royalblue;反之,當單詞在Android來源中的出現概率低於在iPhone來源中的出現概率時,其log ratio值會為負,此時填充的顏色為gold。
-android_iphone_ratios %>%
- group_by(logratio > 0) %>%
- top_n(15, abs(logratio)) %>%
- ungroup() %>%
- mutate(word = reorder(word, logratio)) %>%
- ggplot(aes(word, logratio, fill = logratio < 0)) +
- geom_col() +
- coord_flip() +
- ylab("Android / iPhone log ratio") +
- scale_fill_manual(name = "", labels = c("Android", "iPhone"),
- values = c("royalblue", "gold")) +
- theme_minimal() +
- theme(axis.text = element_text(size=14))
+android_iphone_ratios %>%
+ group_by(logratio > 0) %>%
+ top_n(15, abs(logratio)) %>%
+ ungroup() %>%
+ mutate(word = reorder(word, logratio)) %>%
+ ggplot(aes(word, logratio, fill = logratio < 0)) +
+ geom_col() +
+ coord_flip() +
+ ylab("Android / iPhone log ratio") +
+ scale_fill_manual(name = "", labels = c("Android", "iPhone"),
+ values = c("royalblue", "gold")) +
+ theme_minimal() +
+ theme(axis.text = element_text(size=14))
![](R32_trump_tweet_dplyr_files/figure-html/unnamed-chunk-6-1.png)
diff --git a/visualization-1.html b/visualization-1.html
index b6a0244..ef88dc8 100644
--- a/visualization-1.html
+++ b/visualization-1.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
diff --git a/wgoitg.html b/wgoitg.html
index 4790b57..9a16cca 100644
--- a/wgoitg.html
+++ b/wgoitg.html
@@ -23,7 +23,7 @@
-
+
@@ -709,6 +709,12 @@
- 29.5.3 loading data
- 29.5.4 Merging data
+- 29.6 Mapping Youbike Location
+
- 30 NETWORK VIS
3.1.2 Comments 註解
@@ -816,7 +822,7 @@3.1.2 Comments 註解