Nerdy

[Matplotlib] 코로나 사망자 주간 발생 추이 막대 그래프 그리기 본문

Python/[Matplotlib]

[Matplotlib] 코로나 사망자 주간 발생 추이 막대 그래프 그리기

뚱인데요? 2022. 6. 24. 15:32
728x90

코로나 공식 홈페이지에 있는 주간 발생 추이 막대 그래프가 있다.

이전에 사용한 데이터를 활용하여 파이썬 Pandas와 Matplotlib 라이브러리를 사용해 비슷하게 만들어보도록 하겠다.

 

http://ncov.mohw.go.kr/

 

코로나바이러스감염증-19

코로나바이러스감염증-19 정식 홈페이지로 발생현황, 국내발생현황, 국외발생현황, 시도별발생현황, 대상별 유의사항, 생활 속 거리 두기, 공적마스크 공급현황, 피해지원정책, 홍보자료, FAQ, 관

ncov.mohw.go.kr

 

출처 : 코로나 공식홈페이지

 

코로나 19 누적 데이터 대상으로 pd.read_csv 함수를 사용해 데이터를 불러온다.

한글깨짐을 방지하기 위해 encoding = UTF-8로 설정을 해준다.

 

corona19.csv
0.03MB

 

# 사용할 라이브러리 import
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager, rc

# 데이터프레임 출력
df = pd.read_csv('corona19.csv', encoding = 'UTF-8')

 

가져온 데이터프레임을 df 객체 변수에 담고 컬럼만 출력을 위해 .columns를 사용했으며 현재 불필요한 컬럼들이 생성되어 있어 사용할 컬럼들만 추출을 위해 .loc 함수를 사용했다.

csv 파일에 컬럼별 누적 합계 행이 있는데 이번 시간에는 사용을 하지 않으니 .drop 함수를 사용해 해당 행을 삭제 했다.

# 데이터프레임 컬럼 보기
df.columns

# Index(['일자', '계(명)', '국내발생(명)', '해외유입(명)', '사망(명)', 'Unnamed: 5', 'Unnamed: 6',
       'Unnamed: 7', 'Unnamed: 8', 'Unnamed: 9', 'Unnamed: 10', 'Unnamed: 11',
       'Unnamed: 12'],
      dtype='object')


# 사용할 컬럼만 추출
df_sample = df.loc[:, ['일자', '계(명)', '국내발생(명)', '해외유입(명)', '사망(명)']]
df_sample = df_sample.drop(0, axis = 0) # 누적 합계 행 삭제

# 데이터프레임 첫 행 5줄과 마지막 행 5줄 확인
df_sample.head()
df_sample.tail()

 

결측치 유무 파악을 위해 .isnull()과 .sum() 함수를 사용하고 결측치 확인 결과 0개로 나온다.

그리고 사용할 csv 파일 데이터는 숫자가 int형이 아닌 특수기호 문자가 포함된 문자형 데이터로 구성이 되어 있어 이를 전처리 작업을 해준 뒤 숫자형으로 변환을 해줘야 한다.

# 결측치 확인하기
df_sample.isnull().sum()

# 데이터 전처리
df_sample['계(명)'] = df_sample['계(명)'].str.replace(',', repl = '')

df_sample['국내발생(명)'] = df_sample['국내발생(명)'].str.replace(',', repl = '')
df_sample['국내발생(명)'] = df_sample['국내발생(명)'].replace('-', 0)

df_sample['해외유입(명)'] = df_sample['해외유입(명)'].str.replace(',', repl = '')
df_sample['해외유입(명)'] = df_sample['해외유입(명)'].replace('-', 0)

df_sample['사망(명)'] = df_sample['사망(명)'].str.replace(',', repl = '')
df_sample['사망(명)'] = df_sample['사망(명)'].replace('-', 0)

df_sample.head()

컬럼별 포함된 특수기호 문자를 제거 또는 0으로 대체 해준 뒤 다시 한번 확인을 해준다.

 

그런 다음 '일자' 컬럼을 제외한 모든 컬럼을 정수형으로 변환 작업을 한다.

# 정수형 변환
df_sample['계(명)'] = df_sample['계(명)'].astype(int)
df_sample['국내발생(명)'] = df_sample['국내발생(명)'].astype(int)
df_sample['해외유입(명)'] = df_sample['해외유입(명)'].astype(int)
df_sample['사망(명)'] = df_sample['사망(명)'].astype(int)

 

코로나 공식 사이트 그래프에는 주차별로 데이터가 나눠져 있으니 이 작업을 해줘야 한다.

컬럼별 데이터 타입을 확인해주고 일자 컬럼을 기준으로 분류를 해줘야하므로 일자 컬럼을 datetime으로 변환을 해서 저장해준다.

df_sample.dtypes

# 일자         object
# 계(명)        int32
# 국내발생(명)     int32
# 해외유입(명)     int32
# 사망(명)       int32
# dtype: object

# 일자 컬럼 자료형으로 변환
df_sample['일자'] = pd.to_datetime(df_sample['일자'])
df_sample.dtypes

# 일자         datetime64[ns]
# 계(명)                int32
# 국내발생(명)             int32
# 해외유입(명)             int32
# 사망(명)               int32
# dtype: object

 

datetime으로 변환이 잘 됐으면 주자별 날짜들을 뽑아서 객체에 담아준다.

 

■ 5월 4주차 : 5/22 ~ 5/28

6월 1주차 : 5/29 ~ 6/4

6월 2주차 : 6/5 ~ 6/11

6월 3주차 : 6/12 ~ 6/18

a = df_sample[(df_sample['일자'] >= '2022-05-22') & (df_sample['일자'] <= '2022-05-28')]
a_value = a['사망(명)'].sum() # 228

# 6월 1주 5/29 ~ 6/4
b = df_sample[(df_sample['일자'] >= '2022-05-29') & (df_sample['일자'] <= '2022-06-04')]
b_value = b['사망(명)'].sum() # 99

# 6월 2주 6/5 ~ 6/11
c = df_sample[(df_sample['일자'] >= '2022-06-05') & (df_sample['일자'] <= '2022-06-11')]
c_value = c['사망(명)'].sum() # 113

# 6월 3주 6/12 ~ 6/18
d = df_sample[(df_sample['일자'] >= '2022-06-12') & (df_sample['일자'] <= '2022-06-18')]
d_value = d['사망(명)'].sum() # 76

 

주자별 사망자 합산 수를 얻었으니 이를 활용해 시각화를 그려본다.

# 주별 사망자 수 시각화
# 한글깨짐 방지 설정
font_path = "C:/Windows/Fonts/malgun.ttf"
font = font_manager.FontProperties(fname = font_path).get_name()
rc('font', family = font)

x = np.arange(4)
year = ['05월 04주', '06월 01주', '06월 02주', '06월 03주'] # x축 표시
value = [a_value, b_value, c_value, d_value]

plt.figure(figsize=(12, 8)) # 시각화 사이즈 설정 : 가로 12인치 세로 8인치
ax = plt.gca()
plt.bar(x, value, width = 0.2, color = 'slategrey') # width : 막대 폭 지정
plt.xticks(x, year, fontsize = 13)
plt.ylim([0, 250]) # y축 범위 지정
plt.grid(True, axis = 'y', alpha = 0.1) # 격자 y축 지정
ax.tick_params(bottom = False) # x축 눈금 숨기기
ax.tick_params(axis = 'y', color = 'whitesmoke')

ax.spines['right'].set_color('white')
ax.spines['top'].set_color('whitesmoke')
ax.spines['bottom'].set_color('whitesmoke')
ax.spines['left'].set_color('whitesmoke')
plt.title('사망', loc = 'left', fontsize = 20, fontweight = 'bold')
plt.show()

 

■ 결과

728x90