본문 바로가기
문송충의 코딩하기/파이썬 데이터 분석

파이썬으로 국내 성, 연령별 코로나 확진자 수 크롤링

by 동장군님 2020. 7. 27.
728x90

저번 네이버 증권 크롤링에 이어 두 번째 크롤링 시간이다. 이번 시간도 저번과 같이 굉장히 쉽다. 코드 몇 줄이면 우리가 원하는 데이터를 바로 가져올 수 있다. 어떤 데이터를 가져올까라고 고민하던 중 아무래도 관심을 많이 가질만한 주제가 코로나이기 때문에 코로나 상황을 파이썬으로 가져와 간단히 분석하는 코드를 작성해보고자 한다.

 

데이터를 가져올 소스는 바로 질병관리본부에서 운용하는 "코로나바이러스감염증-19" 사이트이다. 네이버에 코로나 검색할 경우 가장 먼저 나오는 사이트이다.(아래 첫 번째 이미지 참고) 사이트 상단 메뉴바에서 발생동향 -> 국내  발생 동향으로 들어가면 우리가 필요로 하는 다양한 국내 발생 코로나 현황이 나온다.(두 번째 이미지 참고)

 


1. 코로나 데이터 크롤링

 

파이썬에서 가장 많이 사용하는 패키지가 Pandas라고 볼 수 있는데 여기 패키지 내에는 웹 페이지에 있는 테이블 구조의 데이터를 가져올 수 있게 하는 read_html 함수가 있다. 해당 함수를 통해 코로나 현황 사이트에 있는 테이블 구조의 데이타를 가져와 보도록 하겠다.

 

read_html 내 파라미터를 url 링크만 넣을 경우 한글이 깨지는 이슈가 발생하여 utf-8로 인코딩을 해줘야 한다. 아래 코드를 돌리면 페이지 내에 있는 테이블을 리스트 형식으로 Table이라는 변수에 다 담기게 된다. len(table)를 돌리면 총 6개의 테이블에 담겨 있는데 여기서 우리는 사용할 table[4], table[5] 를 가져올 것이다. 출력하면 아래와 같은 결과물을 볼 수 있을 것이다.

import pandas as pd
url ='http://ncov.mohw.go.kr/bdBoardList_Real.do?brdId=1&brdGubun=11&ncvContSeq=&contSeq=&board_id=&gubun='
table=pd.read_html(url,encoding='utf-8')

성별 코로나 확진자/사망자 수

 

연령별 코로나 확진자/사망자 수

 

2. 데이터 시각화

성별 코로나 확진자 수는 파이 차트로, 연령별 코로나 확진자 수는 바 그래프로 시각화해보겠다.

 

  • 성별 코로나 확진자 수 파이 차트 시각화

우선 확진자 칼럼 안에 있는 퍼센트 비중만 따로 뽑아서 시각화를 해야 되는데 이는 문자열에 있는 find 함수를 사용하면 굉장히 쉬워진다. 아래 코드를 돌리면 딱 괄호 안에 있는 수치만 뽑아서 새로운 비중이라는 칼럼에 저장하게 된다.

sex_corona=table[4]
sex_corona2=sex_corona.iloc[:,:2]
sex_corona2['비중']=sex_corona2['확진자(%)'].apply(lambda x: x[x.find("(")+1:x.find(")")])

아래 matplotlib에 있는 Pie 함수로 파이 차트를 그려보겠다.  남성보다는 여성이 더 코로나에 취약한 점을 확인할 수 있다.

import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from matplotlib import style

plt.figure(figsize=(10,7))
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
style.use('ggplot')

plt.pie(sex_corona2['비중'],labels=sex_corona2['구분'],autopct='%0.1f%%')
plt.show()

 

  • 연령별 코로나 확진자 수 바 차트로 시각화

위 파이차트와 동일한 프로세스로 진행하면 된다. 이태원 클럽 사건 때문에 그런지 코로나 확진자 중 25%가 20대인 것으로 나타났다.

age_corona2=age_corona.iloc[:,:2]
age_corona2['비중']=age_corona2['확진자(%)'].apply(lambda x: float(x[x.find("(")+1:x.find(")")]))

plt.figure(figsize=(12,8))
style.use('ggplot')

plt.bar(age_corona2['구분'], age_corona2['비중'])

plt.show()

다음에 더 유의미한 코딩으로 찾아 뵙겠다.

728x90
반응형

댓글