SW
우한 코로나 바이러스 데이터 분석 본문
In [2]:
from IPython.core.display import display, HTML
display(HTML("<style> .container{width:90% !important;}</style>"))
In [46]:
# 쓸모 없는 경고 메시지 숨기기
import warnings
# 경고 메시지가 뜨지 않도록 코드 입력
warnings.filterwarnings('ignore')
In [47]:
# 필요한 모듈 설치
In [48]:
# 1. 데이터 분석에 필요한 기본 모듈
# 2. 시각화 모듈
# 3. 데이터 수집 모듈
# 4. 자연어 처리 모듈
# 5. 워드 클라우드 모듈
In [49]:
!pip3 install numpy
!pip3 install pandas
!pip3 install lxml
!pip3 install matplotlib
!pip3 install seaborn
!pip install folium
!pip install geopandas
!pip install pycountry
!pip install pillow
!pip install konlpy
!pip install wordcloud
In [50]:
!pip3 install html5lib
In [51]:
# 필수 라이브러리를 임포트 하세요
# numpy, pandas, matplotlib
import numpy as np
import pandas as pd
import matplotlib, matplotlib.pyplot as plt
# 데이터 크롤링을 위한 기본 모듈
import requests
from bs4 import BeautifulSoup
# 자연어 처리
from konlpy.tag import Hannanum, Twitter
# json 형태의 데이터 처리
import json
# 좌표 데이터를 표시
import geopandas as gpd
# 국가 정보를 얻기 위해
import pycountry
# 이미지를 다루기 위해서
from PIL import Image
# 지도 표시
import folium
# 워드클라우드 만들기 위해
from wordcloud import WordCloud
우한 폐렴(신종 코로나 바이러스) 통계 자료 구하기¶
In [66]:
# 데이터를 가져올 url을 설정 합니다.
data_url = "https://en.wikipedia.org/wiki/2019–20_Wuhan_coronavirus_outbreak_by_country_and_territory"
req = requests.get(data_url)
# 해당 url에서 데이터를 읽어 옵니다.
# read_html에 매개변수로 원하는 페이지 주소를 넣는다.
data = pd.read_html(req.text, encoding='utf-8')
countries = data[1]
In [53]:
countries.head()
Out[53]:
데이터 전처리¶
In [67]:
# 컬럼명 변경
# 컬럼명은 기존 컬럼명 : 바꿀 컬럼명을 딕셔너리 형태로 입력합니다.
# Country/Region -> country
countries.rename(columns={'Country/Region':'country'}, inplace=True)
In [68]:
countries.head()
Out[68]:
In [69]:
# 불필요한 열 지우기
# 열 지우기는 drop으로 합니다.
# 열 이름을 선택합니다.
# df.drop(열이름, 축번호, 추가 옵션)
# References, Unnamed: 4
countries.drop('References', axis=1, inplace=True)
countries.drop('Unnamed: 4', axis=1, inplace=True)
In [ ]:
In [70]:
countries.head()
Out[70]:
In [36]:
countries.head()
Out[36]:
In [58]:
test_list = ['a','b','c','d']
In [ ]:
In [59]:
# 숫자 하나만 쓰는 것 indexing
test_list[-2]
# slicing : 범위 선택
test_list[1:]
Out[59]:
In [60]:
countries.index[-2:]
Out[60]:
In [1]:
# 불필요한 열 지우기
# 열 지우기는 drop으로 합니다.
# 열 이름을 선택합니다.
# df.drop(열이름, 축번호, 추가 옵션)
# References, Unnamed: 4
#countries.drop('References', axis=1, inplace=True)
In [72]:
# 불필요한 행 지우기
# df.drop(행선택, 추가 옵션)
countries.drop(countries.index[-2:], inplace=True)
In [73]:
countries
Out[73]:
In [74]:
countries.info()
In [75]:
# 데이터의 형변환
#countries['Confirmedcases']
countries.Confirmedcases = countries.Confirmedcases.astype('int')
In [76]:
countries.info()
In [77]:
countries.Deaths = countries.Deaths.astype('int')
In [78]:
countries.info()
In [79]:
countries['country']
Out[79]:
In [ ]:
# 국가 코드를 찾아서 같이 저장
# 중국은 -> China
# 한국은 -> Korea, Republic of
In [80]:
# 국가명 변경(다음에 사용할 데이터의 국가명이 아래와 같이 되어있기 때문)
# 중국은 -> China
# 한국은 -> Korea, Republic of
countries.loc[countries['country']=="China (mainland)",'country'] = "China"
countries.loc[countries['country']=="South Korea",'country'] = "Korea, Republic of"
In [81]:
countries['country']
Out[81]:
In [82]:
# index 변경하기 country 열이 index가 되도록 설정
# df.set_index(열제목)
countries.set_index('country', inplace=True)
In [83]:
countries
Out[83]:
In [86]:
# 국가가 아닌 데이터 합치기
# Macau의 확진자 수를 China의 확진자 수에 더하세요.
# China의 확진자 수 구하기
# Macau의 확진자 수 구하기
countries['Confirmedcases']['China'] += countries['Confirmedcases']['Macau']
In [87]:
# Macau의 사망자 수를 China의 사망자 수에 더하세요.
countries['Deaths']['China'] += countries['Deaths']['Macau']
In [88]:
countries
Out[88]:
In [89]:
# 불필요한 데이터 제거
# Macau 행을 지우세요.
countries.drop('Macau', inplace=True)
In [90]:
countries
Out[90]:
In [93]:
pycountry.countries.search_fuzzy("China")[0].alpha_3
Out[93]:
In [106]:
# 지도에 표시하기 위해 국가 코드 매칭하기
# 국가 코드를 찾아서 code열 만들기
countries["code"] = countries.index.map(lambda x:pycountry.countries.search_fuzzy(x)[0].alpha_3)
In [107]:
countries
Out[107]:
In [ ]:
# map -> 여러 데이터가 들어있는 변수에서 하나씩 꺼내서 처리를 마치고
# 원래의 데이터 형으로 돌려주는 기능
# map함수는 Series의 값(value)을 하나씩 꺼내서 lambda 함수의 인자로 넘기는 커스텀 함수를 각 value별로 실행시키는 것이다.
In [94]:
# 람다식이란?
# 무명 함수 : 이름이 없는 함수 -> 임시 함수
lambda x:pycountry.countries.search_fuzzy(x)[0].alpha_3
Out[94]:
In [96]:
# 좌표 데이터 불러오기
geo_data = json.load(open("./data/world-countries.json"))
In [98]:
# 국가별 폴리곤 데이터 불러오기
shapefile = './data/ne_110m_admin_0_countries.shp'
gdf = gpd.read_file(shapefile)[['ADMIN', 'ADM0_A3', 'geometry']]
gdf.columns = ['country', 'country_code', 'geometry']
gdf.head()
Out[98]:
In [111]:
# 지도 표시용 모듈 folium
map = folium.Map(location=[20, 3], zoom_start=2, tiles='stamenwatercolor')
# 생존 사망자 표시하기
map.choropleth(geo_data=geo_data, data=countries,
columns=['code', 'Confirmedcases'],
key_on='feature.id',
name='감염자',
fill_color='PuRd', fill_opacity=0.7, line_opacity=0.2,
legend_name="감염자", nan_fill_color="#9bff4d")
# 국가 표시하기
folium.GeoJson(data=gdf,
name='country',smooth_factor=2,
style_function=lambda x: {'color':'black','fillColor':'transparent','weight':2},
tooltip=folium.GeoJsonTooltip(fields=['country'],
labels=False,
sticky=False),
highlight_function=lambda x: {'weight':3,'fillColor':'grey','opacity':0.1}
).add_to(map)
Out[111]:
In [115]:
# 사망자를 표시하세요.
map.choropleth(geo_data=geo_data, data=countries,
columns=['code', 'Deaths'],
key_on='feature.id',
name='사망자',
fill_color='PuRd', fill_opacity=0.7, line_opacity=0.2,
legend_name="사망자", nan_fill_color="#9bff4d")
# 국가 표시하기
folium.GeoJson(data=gdf,
name='country',smooth_factor=2,
style_function=lambda x: {'color':'black','fillColor':'transparent','weight':2},
tooltip=folium.GeoJsonTooltip(fields=['country'],
labels=False,
sticky=False),
highlight_function=lambda x: {'weight':3,'fillColor':'grey','opacity':0.1}
).add_to(map)
Out[115]:
In [113]:
# 국가 표시하기
folium.GeoJson(data=gdf,
name='country',smooth_factor=2,
style_function=lambda x: {'color':'black','fillColor':'transparent','weight':2},
tooltip=folium.GeoJsonTooltip(fields=['country'],
labels=False,
sticky=False),
highlight_function=lambda x: {'weight':3,'fillColor':'grey','opacity':0.1}
).add_to(map)
Out[113]:
In [118]:
# 레이어 컨트롤러 추가하기
folium.LayerControl().add_to(map)
Out[118]:
In [110]:
# 지도 보여주기
In [ ]:
map # 실행시키면 지도 뜸
In [ ]:
# 기사 수집하기
In [ ]:
In [ ]:
# 댓글 수집하기
In [ ]:
In [120]:
# 우한 폐렴에 관련된 글 분석하기
han = Hannanum()
text = han.nouns("이번 위한 폐렴 바이러스는 위험합니다.") # 명사들만 뽑아줌
In [121]:
text
Out[121]:
In [122]:
# 텍스트 분석 결과 하나로 합치기
text = " ".join(text)
In [123]:
text
Out[123]:
In [124]:
mask = np.array(Image.open('./data/back.png'))
In [125]:
mask
Out[125]:
In [ ]:
# 폰트 경로 찾기 찾은다음 밑에 넣을 것 아직 안됨.
from matplotlib import font_manager
[(f.name, f.fname) for f in font_manager]
In [ ]:
# 폰트 목록 불러오기
In [ ]:
In [ ]:
# 폰트 찾아서 설정하기
In [ ]:
wordcloud = WordCloud(font_path='폰트파일 경로 넣기',
max_font_size=100,background_color='white',
mask=mask).generate(text)
fig = plt.figure()
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.savefig('cloud.png')
In [ ]:
wordcloud.words_
In [ ]:
In [ ]:
In [ ]:
# 그래프 폰트 한글로 설정
plt.rc('font', family='AppleGothic')
In [ ]:
'대학교 > Data' 카테고리의 다른 글
conda (0) | 2020.02.02 |
---|---|
우한 코로나 바이러스 데이터 분석 (지도 출력) (0) | 2020.02.01 |
selenium (0) | 2020.02.01 |
matplotlib (0) | 2020.02.01 |
Kaggle [Titanic Data Analysis] (0) | 2020.02.01 |
Comments