59doit

[ R ] Covid-19 본문

portfolio

[ R ] Covid-19

yul_S2 2022. 12. 5. 14:32
반응형

12-31-2020.csv
0.54MB
12-31-2021.csv
0.53MB

 

 

 

 [문1] 

일별 국가별 코로나 발생자수와 사망자 수를 기준으로 전처리 하시오.
일부가는 지역별로 코로나 발생자수와 사망자 수가 분리되어 있으니 국가별로 집계하고

국가, 총발생자수, 총사망자수, 일평균 발생자수, 일평균 사망자수 리스트를 제시하시오.

 (누적데이터인 경우 누적데이터로 해당 결과를 제시하고, 

일별 데이터 를 산출하여 총합과 일평균값을 산출하여 결과 비교)

 

< 누적데이터인 경우 누적데이터로 해당 결과 제시 >

#1. 데이터 불러오기

data2021 <- read.csv('12-31-2021.csv')
data2020 <- read.csv('12-31-2020.csv')

library('dplyr')

group1 <- data2021 %>% 
  select(Country_Region,Confirmed,Deaths) %>% 
  group_by(Country_Region) %>% 
  summarise(sum(Confirmed),sum(Deaths))

group2 <- data2020 %>% 
  select(Country_Region,Confirmed,Deaths) %>% 
  group_by(Country_Region) %>% 
  summarise(sum(Confirmed),sum(Deaths))

 

 

#2.  group1,group2 데이터 프레임 합치기

acc_result <- merge(group1,group2,by='Country_Region',all=TRUE)
  • merge 함수 사용

 

 

#3.  국가별로 집계 하고 국가, 총발생자수, 총사망자수 구하기

acc_result$tot_con <- acc_result$'sum(Confirmed).x'-acc_result$'sum(Confirmed).y'
acc_result$tot_dea <- acc_result$'sum(Deaths).x'-acc_result$'sum(Deaths).y'
acc_result
  • $ 사용 : 데이터 프레임의 특정 변수를 가리킬때 사용
  • $표시 앞에 명시된 데이터프레임에서 $ 표시 뒤에 나오는 변수를 가리키는것을 의미

 

#4.  총발생자수, 총사망자수(tot_con,tot_dea)

tot_result <- select(acc_result,Country_Region,tot_con,tot_dea)
tot_result
head(tot_result)
  Country_Region  tot_con   tot_dea
1    Afghanistan      105754    5167
2           Albania      151908    2036
3            Algeria      118822    3520
4          Andorra       15691        56
5            Angola       64040    1365
6       Antarctica              11        0

 

 

#5. 일평균 발생자수, 일평균사망자수(daily_con,daily_dea)

#5-1)

options(scipen=100) 
  • 지수표기법 -> 일반표기법으로 바꾸기 : options 함수의 scipen 옵션을 사용

 

#5-2)

acc_final <- tot_result %>% mutate(daily_con = (tot_con/365)) %>% mutate(daily_dea = (tot_dea/365))
acc_final
head(acc_final)
  Country_Region  tot_con   tot_dea       daily_con        daily_dea
1       Afghanistan  105754    5167    289.73698630   14.1561644
2              Albania  151908    2036    416.18630137     5.5780822
3               Algeria  118822    3520    325.53972603     9.6438356
4             Andorra   15691      56         42.98904110      0.1534247
5               Angola   64040    1365     175.45205479     3.7397260
6          Antarctica      11          0             0.03013699     0.0000000

 

  • mutate(dataframe, 새로운 column명 = 기존 columns을 조합한 수식)
  • mutate() 기본적으로 데이터 프레임 자료형에 새로운 파생 column을 만드는 함수임
  • tot_result 데이터 프레임에 일평균 발생자수, 일평균사망자수 포함시키기위해 mutate() 함수 사용

 

 

 

< 일별 데이터 를 산출하여 총합과 일평균값을 산출하여 결과 비교>

# csv 파일들 들어있는 폴더 경로 설정

setwd('C:/covid-19')
  • 폴더명 : covid-19

 

#1. 전데 데이터 파일 불러오기

temp = list.files(pattern = "*2021.csv")    # 파일이름
  • list.files pattern : 특정 폴더에 특정 이름(2021)으로 된 모든 파일들 불러오기
  • 2021로 끝나는 파일들 모두 temp에 담긴다.

 

#2.  시작값

start <- read.csv('12-31-2020.csv') 
  • 2020년 12월 31일 데이터 값
  •  read.csv : 특정 csv파일 불러오기

 

 

#3.  저장공간 나라별로 합치기 및 총 확진자 수와 총 사망자 수 데이터 정리

data_arr <- start %>% 
  group_by(Country_Region) %>% 
  summarise(sum_confirmed=sum(Confirmed),sum_Deaths=sum(Deaths))
# A tibble: 198 x 3
   Country_Region    sum_confirmed   sum_Deaths
   <fct>                                 <int>           <int>
 1 Afghanistan                   52330             2189
 2 Albania                          58316            1181
 3 Algeria                           99610            2756
 4 Andorra                           8049                84
 5 Angola                           17553              405
 6 Antarctica                              0                  0
 7 Antigua and Barbuda         159                 5
 8 Argentina                    1625514         43245
 9 Armenia                        159409           2823
10 Australia                        28425             909
# ... with 188 more rows
# i Use `print(n = ...)` to see more rows
  • 파이프 연산자(%>%) : 앞서 연산된 결과값을 다음단계로으로 전달
  •  select() : select 함수를 통해 함수를 적용할 특정 열 선택
  •  group_by() : 특정 열 기준으로 집단별로 합치기
  •  summarise(), sum() : 통계함수 sum()과 함께 사용하여, 데이터 셋에 특정 컬럼을 대상으로 기술통계량을 계산
  • data_arr : 다음날 데이터의 저장 공간이므로 For문이 실행될 때마다 매번 업데이트되는 저장 공간
  • Country_region을 기준으로 Confirmed, Deaths 를 합하여 각각 새로운 컬럼sum_confirmed, sum_Deaths 생성 후 data_arr 에 저장함

 

 

#4. 일일 확진자 수 & 일일 사망자 수 저장공간

con_Space <- data_arr[,-c(2,3)]
dea_Space <- data_arr[,-c(2,3)]
  • 2,3 컬럼 뺀 Country_Region  나라만 담기 : 불필요한 컬럼 제외
  • For문을 사용할 때 저장공간이 필요함으로 con_Space, dea_Space에 미리 저장

 

 

#5. 일별CSV파일 불러오기 (for 문)

for ( i in 1:365 ) {
  start <- read.csv(temp[i])
  #나라별로 합치기 및 총 확진자 수와 총 사망자 수 데이터 정리
  arr_country_con_dea <- start %>% 
    group_by(Country_Region) %>% 
    summarise(sum_confirmed = sum(Confirmed), sum_Deaths = sum(Deaths)) 
  #merge함수로 합쳐 계산할 수 있는 상태로 만들기
  calcul <- merge(arr_country_con_dea,data_arr, by='Country_Region', all=TRUE)
  #일일 확진자 데이터 추출
  calcul$daily <- calcul$sum_confirmed.x - calcul$sum_confirmed.y 
  #일일 사망자 데이터 추출
  calcul$daily2 <- calcul$sum_Deaths.x - calcul$sum_Deaths.y
  # con_Space 에 일일 확진자 수 저장
  con_Space <- merge(con_Space,calcul[c(1,6)], by = 'Country_Region', all=TRUE) 
  # dea_Space 에 일일 사망자 수 저장
  dea_Space <- merge(dea_Space,calcul[c(1,7)], by = 'Country_Region', all=TRUE) 
  # be_mines에 다음날 데이터 저장
  data_arr <- arr_country_con_dea    
}
  • For문 : 입력된 벡터의 길이만큼 반복하는 함수
  • 1년은 365일 이므로 for문의 범위를 365로 지정
  • for문을 활용해 일별 데이터 파일 불러오기
  • for문을 활용해 일별 데이터 나라별로 합치기 & 총 발생자 수와 총 사망자 수 데이터 정리
  • merge() : 일일 발생자 데이터와 사망자 데이터를 공통의 컬럼값 ‘Country_Region’을 통해 하나로 병합 및 ‘calcul’에 담기 
  • calcul : merge함수로 불러온 값을 합쳐 계산할 수 있는 상태로 만듬
  •  $ 연산자 사용 : 데이터 프레임의 특정 변수를 가리킬 때 사용, (데이터프레임)$(변수) 
  •  $ 표시 앞에 명시된 데이터프레임에서 $ 표시 뒤에 나오는 변수를 가리키는 것   
  •  merge() : 일일 발생자 데이터와 사망자 데이터를 공통 컬럼 값  ‘Country_Region’을 통해 하나로 병합 및 ‘calcul’에 담기
  •  [c( , )] : 특정 컬럼을 지정해서 나타내기 위해 사용 
  • calcul$daily : 총 발생자와 하루 전 총 발생자를 뺀 값
  • calcul$daily2 : 총 사망자와 하루 전 총 사망자를 뺀 값
  • calcul에서 Country_region와 daily,daily2값을 [c( , )]함수로 각각 지정 후 Country_region을 기준으로 con_Space, dea_Space값에 저장함
  • data_arr 에 다음날 데이터 저장

 

#6. 최종값 저장공간

result <- data_arr[,-c(2,3)]
  • 2,3 컬럼 뺀 Country_Region  나라만 담기

 

#7.  일일 데이터 누적값 데이터 프레임으로 변환

con_Space_df <- rowSums(con_Space[,-1]) %>% 
  as.data.frame()

dea_Space_df <- rowSums(dea_Space[,-1]) %>% 
  as.data.frame()
  • con_Space_df : 일일 발생자 수 데이터 누적
  • dea_Space_df : 일일 사망자 수 데이터 누적
  • 일일 발생자, 사망자 데이터 con_Space, dea_Space 에서 국가 이름을 제외한 ([,-1])값들을 rowSum()함수로 합침
  • as.data.frame()함수로 백터화 된 자료들을 다시 데이터프레임으로 변환함
  • 변환된 값을 con_Space_df, dea_Space_df 값에 각각 저장함

 

 

#8.  일일 확진자와 일일 사망자 데이터들을 하나의 데이터프레임으로 결합

result$tot_con2 <- con_Space_df[,1] 
result$tot_dea2 <- dea_Space_df[,1]

con_Space_df, dea_Space_df 값에 저장된 데이터를 result 의 tot_con2, tot_dea2에 저장함

 

#9.  문제 최종 값 

result 
# A tibble: 199 x 3
   Country_Region       tot_con2   tot_dea2
   <fct>                             <dbl>         <dbl>
 1 Afghanistan               105754         5167
 2 Albania                      151908         2036
 3 Algeria                       118822         3520
 4 Andorra                        15691            56
 5 Angola                         64040         1365
 6 Antarctica                           11              0
 7 Antigua and Barbuda     4124          114
 8 Argentina                 4028894       73924
 9 Armenia                     185521        5149
10 Australia                   397071         1344
# ... with 189 more rows

 

#10.  누적 데이터 결과값과 일별 데이터 결과값 비교 및 확인

result$compare_con <- result$tot_con2 - acc_final$tot_con 
result$compare_dea <- result$tot_dea2 - acc_final$tot_dea
result[c(1,4,5)]
# A tibble: 199 x 3
   Country_Region      compare_con    compare_dea
   <fct>                                    <dbl>          <dbl>
 1 Afghanistan                                0             0
 2 Albania                                       0             0
 3 Algeria                                        0             0
 4 Andorra                                      0             0
 5 Angola                                        0             0
 6 Antarctica                                   0             0
 7 Antigua and Barbuda                  0            0
 8 Argentina                                    0             0
 9 Armenia                                      0             0
10 Australia                                     0            0
# ... with 189 more rows

 

  • 누적결과(acc_final)데이터에서 구한 총 발생자 수에서 일별결과데이터(result)에서 구한 총 발생자 수를 빼서  result 의 compare_con에 저장함
  • 누적결과(acc_final)데이터에서 구한 총 사망자 수에서 일별결과데이터(result)에서 구한 총 사망자 수를 빼서  result  의 compare_dea에 저장함
  • result 의 데이터에서 Country_Region, compare_con, compare_dea를 선택 후 출력한다 ⇒ result [c(1,4,5)]
  • 결과값의 차가 0임을 확인  ⇒ 누적결과 데이터와 일별결과 데이터의 데이터가 같다고 할 수 있음

 

 

 [문2] 

데이터가 0인 경우(코로나 환자 0)와 데이터가 없는 경우를 구분하여 전처리 
하고 전처리 시 data가 없는 국가는 제외하고 제외된 국가 리스트를 제시하시오.

 

#1 데이터가 NA인 경우 제시(=코로나환자 NA)

acc_final %>% 
  subset(is.na(tot_dea)|is.na(tot_con)) %>%
  select(Country_Region)
        Country_Region
118           Micronesia
  • 1번 문제의 최종 결과인 acc_final 에서 앞에있는 출력결과를 뒤에 있는함수에 보내주는 역할을 하는 %>% (파이프 연산자) 를 사용
  • 하나라도 NA을 가지고 있으면 보여주기 위해 "|" 사용
  • tot_con & tot_dea 컬럼에 결측값이 포함되어 있는지 확인하기 위해 is.na()사용

 

#2 데이터가 0인 경우 제시(=코로나환자0)

acc_final %>% 
  filter(tot_con ==0 & tot_dea ==0) %>% 
  select(Country_Region)
             Country_Region
1        Diamond Princess
2                       Holy See
3                 Korea, North
4            Marshall Islands
5                MS Zaandam
6   Winter Olympics 2022
  • tot_con & tot_dea 컬럼이 0을 가지고 있는지 확인 “==0” 사용
  • 하나라도 0을 가지고 있으면 보여주기 위해 “&” 사용

 

#3 데이터가 NA인 경우 제외

acc_final %>%
  filter(tot_con >=0 | tot_dea >=0) %>% 
  select(Country_Region)
  • tot_con & tot_dea 행 추출 하기 위해 flter() 사용 
  • Country_Region 에서 추출하기 위해 select() 함수 사용
  • 하나라도 NA인 값을 가지고 있으면 제외 하기 위해 "|"사용

 

  • %>% (파이프연산자)는 앞에있는 출력결과를 뒤에 있는 함수한테 보내주는 역할을 한다.
  • 파이프를 이용해서 함수를 계속 연결 할 수 있다.
  • 행을 추출할 때는 filter(), 열을 추출할 때는 select()

 

 

 [문3] 

2021년 1년동안 코로나 총 발생자수, 총 사망자수, 일평균 발생자수, 일평균 사망자 수를 기준으로 가장 많은 20개 국가를 내림차순으로 정렬하고 총 발생자 수, 총 사망자수, 일평균 발생자수, 일평균 사망자 수를 리포트 하시오.

 (4가지 기준 각각 sorting).

 

 

 

#1 총 발생자수

arr1 <- acc_final %>% 
  arrange(desc(tot_con)) %>%
  head(20) ;arr1

 

#2 총 사망자수

arr2 <- acc_final %>% 
  arrange(desc(tot_dea)) %>% 
  head(20) ;arr2

 

 

#3 일평균 발생자수

arr3 <- acc_final %>% 
  arrange(desc(daily_con)) %>% 
  head(20) ;arr3

 

 

#4 일평균 사망자 수

arr4 <- acc_final %>% 
  arrange(desc(daily_dea)) %>%
  head(20) ;arr4

 

 

  • 데이터 셋의 특정 컬럼을 기준으로 오름차순 또는 내림차순으로 정렬하는 arrange()함수 사용
  • desc()함수로 지정하는 경우 내림차순으로 정렬한다.
  • head(n)은 n = 6이 디폴트 값이기 때문에 n을 별도로 지정하지 않을 경우 자동으로 상위 6개 행이 불러와 지기때문에 n 지정

 

 

 

 [문4] 

2021년 1년동안 대한민국에서 발생한 총 코로나 발생자수와 총 사망자 수와 일평균 발생자수와 일평균 사망자 수를 리포트 하시오.

acc_final %>% filter(Country_Region == 'Korea, South')
  Country_Region  tot_con   tot_dea   daily_con   daily_dea
1     Korea, South  573484       4708   1571.189    12.89863
  • filter() : 행 추출 하기 위한 방법
  •  == : Country_Region 에서 대한민국에서 발생 ‘Korea, South’ 일치하는 값을 추출하기 위해 사용

 

반응형
Comments