3. 지도에서 코로나 19 선별진료소 위치 확인하기

1) 데이터 가공 : 필요한 데이터 추출하기

  • 엑셀파일 가져오기
library(readxl)

xlsdata <- read_excel("C:/Users/DaBin/Desktop/R/DATA/혼자 공부하는 R 데이터 분석/선별진료소.xls")
View(xlsdata)
  • 데이터 컬럼 추출 및 열 이름 변경하기
data_raw <- xlsdata[,c(2:5)] #2-5열의 모든 행 선책
names(data_raw) <- c('state','city','name','addr')
names(data_raw)
## [1] "state" "city"  "name"  "addr"

2) 데이터 분석 (1) : 빈도분석하기

  • state 칼럼 빈도 확인하기
table(data_raw$state)
## 
## 강원 경기 경남 경북 광주 대구 대전 부산 서울 세종 울산 인천 전남 전북 제주 충남 
##   34   88   55   41    9   17   10   30   45    1    7   26   50   25   13   30 
## 충북 
##   25
barplot(table(data_raw$state))

  • count 함수로 범주형 데이터 level 확인하기
library(dplyr)
## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data_raw %>% count(city)
## # A tibble: 208 × 2
##    city       n
##    <chr>  <int>
##  1 가평군     2
##  2 강남구     4
##  3 강동구     1
##  4 강릉시     5
##  5 강북구     1
##  6 강서구     3
##  7 강진군     1
##  8 강화군     2
##  9 거제시     4
## 10 거창군     2
## # ℹ 198 more rows
  • 대전시 선별진료소 데이터 추출하기
daejeon_data <- data_raw[data_raw$state == '대전',]
head(daejeon_data)
## # A tibble: 6 × 4
##   state city   name                                addr                         
##   <chr> <chr>  <chr>                               <chr>                        
## 1 대전  대덕구 대덕구보건소                        대전 대덕구 석봉로38번길55 (…
## 2 대전  대덕구 근로복지공단 대전병원               대덕구 계족로 637            
## 3 대전  동구   대전광역시 동구보건소               대전광역시 동구 가오동 425   
## 4 대전  동구   대전한국병원                        대전광역시 동구 동서대로 1672
## 5 대전  서구   대전광역시 서구보건소(관저보건지소) 대전 서구 구봉산북로 300     
## 6 대전  서구   건양대학교병원                      대전 서구 관저동로 158
nrow(daejeon_data)
## [1] 10

3) 데이터 분석 (2) : 지도 시각화하기

  • 데이터 세트에서 선별진료소 위도와 경도 데이터 가져오기
    • mutate_geocode : 데이터 프레임에서 주소가 있는 열 전체를 가져와야 할 때
mutate_geocode(data = 데이터 프레임명, location = 주소가 적힌 열의 이름, source = 'google')
library(ggmap)
## 필요한 패키지를 로딩중입니다: ggplot2
## ℹ Google's Terms of Service: ]8;;https://mapsplatform.google.com<https://mapsplatform.google.com>]8;;
## ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
ggmap_key <- "AIzaSyAAM29AgTHbBUJC1kw1IF4RJQcKxYprJBs"

register_google(ggmap_key)

daejeon_data <- mutate_geocode(data = daejeon_data, location = addr, source = 'google')
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EB%8C%80%EB%8D%95%EA%B5%AC+%EC%84%9D%EB%B4%89%EB%A1%9C38%EB%B2%88%EA%B8%B855+(%EC%84%9D%EB%B4%89%EB%8F%99)&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EB%8C%80%EB%8D%95%EA%B5%AC+%EC%84%9D%EB%B4%89%EB%A1%9C38%EB%B2%88%EA%B8%B855+(%EC%84%9D%EB%B4%89%EB%8F%99)&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EB%8D%95%EA%B5%AC+%EA%B3%84%EC%A1%B1%EB%A1%9C+637&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EB%8D%95%EA%B5%AC+%EA%B3%84%EC%A1%B1%EB%A1%9C+637&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84%EA%B4%91%EC%97%AD%EC%8B%9C+%EB%8F%99%EA%B5%AC+%EA%B0%80%EC%98%A4%EB%8F%99+425&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84%EA%B4%91%EC%97%AD%EC%8B%9C+%EB%8F%99%EA%B5%AC+%EA%B0%80%EC%98%A4%EB%8F%99+425&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84%EA%B4%91%EC%97%AD%EC%8B%9C+%EB%8F%99%EA%B5%AC+%EB%8F%99%EC%84%9C%EB%8C%80%EB%A1%9C+1672&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84%EA%B4%91%EC%97%AD%EC%8B%9C+%EB%8F%99%EA%B5%AC+%EB%8F%99%EC%84%9C%EB%8C%80%EB%A1%9C+1672&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EC%84%9C%EA%B5%AC+%EA%B5%AC%EB%B4%89%EC%82%B0%EB%B6%81%EB%A1%9C+300&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EC%84%9C%EA%B5%AC+%EA%B5%AC%EB%B4%89%EC%82%B0%EB%B6%81%EB%A1%9C+300&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EC%84%9C%EA%B5%AC+%EA%B4%80%EC%A0%80%EB%8F%99%EB%A1%9C+158&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EC%84%9C%EA%B5%AC+%EA%B4%80%EC%A0%80%EB%8F%99%EB%A1%9C+158&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EC%A4%91%EA%B5%AC+%EB%BF%8C%EB%A6%AC%EA%B3%B5%EC%9B%90%EB%A1%9C+47(%EC%95%88%EC%98%81%EB%8F%99)&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EC%A4%91%EA%B5%AC+%EB%BF%8C%EB%A6%AC%EA%B3%B5%EC%9B%90%EB%A1%9C+47(%EC%95%88%EC%98%81%EB%8F%99)&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84%EA%B4%91%EC%97%AD%EC%8B%9C+%EC%A4%91%EA%B5%AC+%EB%AA%A9%EC%A4%91%EB%A1%9C+29+%EB%8C%80%EC%A0%84%EC%84%A0%EB%B3%91%EC%9B%90&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84%EA%B4%91%EC%97%AD%EC%8B%9C+%EC%A4%91%EA%B5%AC+%EB%AA%A9%EC%A4%91%EB%A1%9C+29+%EB%8C%80%EC%A0%84%EC%84%A0%EB%B3%91%EC%9B%90&key=xxx]8;;>
## Warning: "대전광역시 중구 목중로 29 대..." not uniquely geocoded, using "29 mokjung-ro,
## jung-gu, daejeon, south korea"
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EC%9C%A0%EC%84%B1%EA%B5%AC+%EB%85%B8%EC%9D%80%EB%8F%99+270+%EC%9B%94%EB%93%9C%EC%BB%B5%EB%B3%B4%EC%A1%B0%EA%B2%BD%EA%B8%B0%EC%9E%A5+P2%EC%A3%BC%EC%B0%A8%EC%9E%A5&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84+%EC%9C%A0%EC%84%B1%EA%B5%AC+%EB%85%B8%EC%9D%80%EB%8F%99+270+%EC%9B%94%EB%93%9C%EC%BB%B5%EB%B3%B4%EC%A1%B0%EA%B2%BD%EA%B8%B0%EC%9E%A5+P2%EC%A3%BC%EC%B0%A8%EC%9E%A5&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%B6%81%EC%9C%A0%EC%84%B1%EB%8C%80%EB%A1%9C93&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%B6%81%EC%9C%A0%EC%84%B1%EB%8C%80%EB%A1%9C93&key=xxx]8;;>
head(daejeon_data)
## # A tibble: 6 × 6
##   state city   name                                addr                lon   lat
##   <chr> <chr>  <chr>                               <chr>             <dbl> <dbl>
## 1 대전  대덕구 대덕구보건소                        대전 대덕구 석봉…  127.  36.4
## 2 대전  대덕구 근로복지공단 대전병원               대덕구 계족로 637  127.  36.4
## 3 대전  동구   대전광역시 동구보건소               대전광역시 동구 …  127.  36.3
## 4 대전  동구   대전한국병원                        대전광역시 동구 …  127.  36.3
## 5 대전  서구   대전광역시 서구보건소(관저보건지소) 대전 서구 구봉산…  127.  36.3
## 6 대전  서구   건양대학교병원                      대전 서구 관저동…  127.  36.3
head(daejeon_data$lon)
## [1] 127.4263 127.4285 127.4548 127.4358 127.3449 127.3432
  • 대전시 지도 시각화하기
daejeon_map <- get_googlemap('대전', maptype = 'roadmap', zoom = 11)
## ℹ <]8;;https://maps.googleapis.com/maps/api/staticmap?center=%EB%8C%80%EC%A0%84&zoom=11&size=640x640&scale=2&maptype=roadmap&key=xxxhttps://maps.googleapis.com/maps/api/staticmap?center=%EB%8C%80%EC%A0%84&zoom=11&size=640x640&scale=2&maptype=roadmap&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84&key=xxx]8;;>
ggmap(daejeon_map) + geom_point(data = daejeon_data, aes(x = lon, y = lat,color = factor(name)),size = 3)

  • 마커로 위치 표시하고 위치 이름 넣기
daejeon_data_marker <- data.frame(daejeon_data$lon, daejeon_data$lat)

daejeon_map <- get_googlemap('대전', maptype = 'roadmap', zoom = 11, markers = daejeon_data_marker)
## ℹ <]8;;https://maps.googleapis.com/maps/api/staticmap?center=%EB%8C%80%EC%A0%84&zoom=11&size=640x640&scale=2&maptype=roadmap&markers=36.444898,127.426283|36.368576,127.4285|36.311876,127.454828|36.348317,127.435754|36.301099,127.344941|36.306927,127.343156|36.285379,127.383095|36.335997,127.410148|36.364563,127.324194|36.375126,127.3249&key=xxxhttps://maps.googleapis.com/maps/api/staticmap?center=%EB%8C%80%EC%A0%84&zoom=11&size=640x640&scale=2&maptype=roadmap&markers=36.444898,127.426283|36.368576,127.4285|36.311876,127.454828|36.348317,127.435754|36.301099,127.344941|36.306927,127.343156|36.285379,127.383095|36.335997,127.410148|36.364563,127.324194|36.375126,127.3249&key=xxx]8;;>
## ℹ <]8;;https://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84&key=xxxhttps://maps.googleapis.com/maps/api/geocode/json?address=%EB%8C%80%EC%A0%84&key=xxx]8;;>
ggmap(daejeon_map) + geom_text(data = daejeon_data, aes(x = lon, y = lat), size = 3, label = daejeon_data$name)


4. 서울시 지역별 미세먼지 농도 차이 비교하기

1) 데이터 가공 (2) : 필요한 데이터 추출하기

  • 엑셀 파일 가져오기
library(readxl)
dustdata <- read_excel("C:/Users/DaBin/Desktop/R/DATA/혼자 공부하는 R 데이터 분석/dustdata.xlsx")

str(dustdata)
## tibble [31 × 27] (S3: tbl_df/tbl/data.frame)
##  $ 날짜       : POSIXct[1:31], format: "2021-01-01" "2021-01-02" ...
##  $ 서울시 평균: num [1:31] 25 31 36 37 27 23 33 19 24 31 ...
##  $ 강남구     : num [1:31] 22 27 30 33 22 20 31 16 21 27 ...
##  $ 강동구     : num [1:31] 30 36 42 45 29 29 34 23 29 35 ...
##  $ 강북구     : num [1:31] 33 40 45 44 30 28 32 25 33 41 ...
##  $ 강서구     : num [1:31] 25 22 38 42 26 26 29 20 25 32 ...
##  $ 관악구     : num [1:31] 21 27 31 27 26 18 25 16 20 25 ...
##  $ 광진구     : num [1:31] 25 29 35 34 23 23 29 17 24 31 ...
##  $ 구로구     : num [1:31] 24 33 37 39 30 NA 26 16 21 31 ...
##  $ 금천구     : num [1:31] 28 34 41 35 29 24 30 21 26 34 ...
##  $ 노원구     : num [1:31] 29 35 40 40 32 27 35 22 30 35 ...
##  $ 도봉구     : num [1:31] 22 29 30 33 20 9 25 13 20 26 ...
##  $ 동대문구   : num [1:31] 23 27 30 33 27 20 31 16 21 29 ...
##  $ 동작구     : num [1:31] 26 35 39 36 29 26 32 23 28 35 ...
##  $ 마포구     : num [1:31] 22 27 31 32 22 20 33 19 22 28 ...
##  $ 서대문구   : num [1:31] 25 26 36 28 19 17 30 13 NA 26 ...
##  $ 서초구     : num [1:31] 22 32 30 35 32 26 30 18 23 30 ...
##  $ 성동구     : num [1:31] 22 27 30 34 23 21 33 17 22 28 ...
##  $ 성북구     : num [1:31] 24 28 31 35 36 17 41 12 21 27 ...
##  $ 송파구     : num [1:31] 21 30 34 37 22 22 33 NA 21 26 ...
##  $ 양천구     : num [1:31] 27 22 38 41 29 26 30 22 27 34 ...
##  $ 영등포구   : num [1:31] 23 26 30 32 25 20 23 17 21 27 ...
##  $ 용산구     : num [1:31] 32 44 46 47 33 33 46 30 34 43 ...
##  $ 은평구     : num [1:31] 22 32 31 31 32 21 43 17 21 25 ...
##  $ 종로구     : num [1:31] 30 36 38 41 38 26 49 20 26 35 ...
##  $ 중구       : num [1:31] 30 36 41 44 28 29 38 23 27 40 ...
##  $ 중랑구     : num [1:31] 26 31 36 37 25 23 28 18 24 31 ...
  • 성북구중구 데이터만 추출하기
library(dplyr)

dustdata_anal <- dustdata[, c("날짜","성북구","중구")]
  • 결측치 확인하기
is.na(dustdata_anal)
##        날짜 성북구  중구
##  [1,] FALSE  FALSE FALSE
##  [2,] FALSE  FALSE FALSE
##  [3,] FALSE  FALSE FALSE
##  [4,] FALSE  FALSE FALSE
##  [5,] FALSE  FALSE FALSE
##  [6,] FALSE  FALSE FALSE
##  [7,] FALSE  FALSE FALSE
##  [8,] FALSE  FALSE FALSE
##  [9,] FALSE  FALSE FALSE
## [10,] FALSE  FALSE FALSE
## [11,] FALSE  FALSE FALSE
## [12,] FALSE  FALSE FALSE
## [13,] FALSE  FALSE FALSE
## [14,] FALSE  FALSE FALSE
## [15,] FALSE  FALSE FALSE
## [16,] FALSE  FALSE FALSE
## [17,] FALSE  FALSE FALSE
## [18,] FALSE  FALSE FALSE
## [19,] FALSE  FALSE FALSE
## [20,] FALSE  FALSE FALSE
## [21,] FALSE  FALSE FALSE
## [22,] FALSE  FALSE FALSE
## [23,] FALSE  FALSE FALSE
## [24,] FALSE  FALSE FALSE
## [25,] FALSE  FALSE FALSE
## [26,] FALSE  FALSE FALSE
## [27,] FALSE  FALSE FALSE
## [28,] FALSE  FALSE FALSE
## [29,] FALSE  FALSE FALSE
## [30,] FALSE  FALSE FALSE
## [31,] FALSE  FALSE FALSE
sum(is.na(dustdata_anal))
## [1] 0

2) 데이터 분석 (1) : 데이터 탐색하고 시각화하기

  • 지역별 미세먼지 농도의 기술통계량 구하기
library(psych)
## 
## 다음의 패키지를 부착합니다: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
describe(dustdata_anal$성북구)
##    vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
## X1    1 31 36.97 20.98     35   34.64 17.79   5 111   106  1.4     2.89 3.77
describe(dustdata_anal$중구)
##    vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
## X1    1 31 43.68 22.72     40   40.56 17.79  13 118   105 1.36     1.95 4.08
  • 성북구와 중구 미세먼지 농도 상자 그림 그리기
boxplot(dustdata_anal$성북구, dustdata_anal$중구, main = 'finedust_compare', xlab = 'AREA', names = c('성북구','중구'), ylab = 'FINEDUST_PM', col = c("blue",'green'))

3) 데이터 분석 (2) : 가설 검정하기

  1. 귀무가설 : 기존에 알려진 사실을 기존으로 설정하는 가설
  2. 대립가설 : 귀무가설과 반대로 새롭게 주장하려는 가설, 즉 입증하려는 가설입니다.

var.test(데이터1, 데이터2)

  • f 검정으로 지역별 미세먼지 농도의 분산 차이를 검정하기
var.test(dustdata_anal$중구, dustdata_anal$성북구)
## 
##  F test to compare two variances
## 
## data:  dustdata_anal$중구 and dustdata_anal$성북구
## F = 1.1728, num df = 30, denom df = 30, p-value = 0.6653
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.5654796 2.4322651
## sample estimates:
## ratio of variances 
##           1.172773

t.test(data = 테이블명, 변수2 ~ 변수1, var.equal = T)

  • t 검정으로 지역별 미세먼지 농도의 평균 차이를 검정하기
t.test(dustdata_anal$중구, dustdata_anal$성북구, var.equal = T)
## 
##  Two Sample t-test
## 
## data:  dustdata_anal$중구 and dustdata_anal$성북구
## t = 1.2079, df = 60, p-value = 0.2318
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.401547 17.820902
## sample estimates:
## mean of x mean of y 
##  43.67742  36.96774

4) 세 개 이상의 집단 간 평균 차이 검정하기 : 분산분석

(1) anova(lm())

anova(lm(변수2 ~ 변수 1, data = 테이블명))
  • 엑셀 파일 가져오기
library(readxl)
exdata1 <- read_excel("C:/Users/DaBin/Desktop/R/DATA/혼자 공부하는 R 데이터 분석/Sample1.xlsx")
  • 경기, 서울, 제주 지역 Y20_CNT를 상자 그림으로 그리기
boxplot(formula = Y20_CNT ~ AREA, data = exdata1)

  • 분산분석으로 세 집단 간 평균 차이 검정하기 (1)

: p-value값이 0.05보다 큰 값이라 세 집단 간 차이가 통계적으로 유의하다고 해석할 수 없음음

anova(lm(Y20_CNT ~ AREA, data = exdata1))
## Analysis of Variance Table
## 
## Response: Y20_CNT
##           Df Sum Sq Mean Sq F value Pr(>F)
## AREA       2  245.6  122.81  0.5545 0.5844
## Residuals 17 3765.3  221.49

(2) oneway.test

oneway.test(data = 테이블명, 변수2 ~ 변수1 , var.equal = T)
  • 분산분석으로 세 집단 간 평균 차이 검정하기 (2)
oneway.test(data = exdata1, Y20_CNT ~ AREA, var.equal = T)
## 
##  One-way analysis of means
## 
## data:  Y20_CNT and AREA
## F = 0.55446, num df = 2, denom df = 17, p-value = 0.5844