59doit
[ R ] Covid-19 본문
[문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’ 일치하는 값을 추출하기 위해 사용
'portfolio' 카테고리의 다른 글
[ R ] R과 python을 활용한 데이터 분석 시각화 #3 (1) (0) | 2022.12.30 |
---|---|
[ python ] R과 python을 활용한 데이터 분석 시각화 #2 (2) (0) | 2022.12.29 |
[ R ] R과 python을 활용한 데이터 분석 시각화 #2 (1) (0) | 2022.12.29 |
[ R ] R과 python을 활용한 데이터 분석 시각화 #1 (0) | 2022.12.29 |
[Python] Covid-19 (0) | 2022.11.14 |