【Python】신형 코로나 바이러스 감염증의 데이터를 7일간 이동 평균으로 본다

소개



지난 트위터에서 7일간 이동 평균으로 신형 코로나 바이러스의 감염자 수를 보고 있다는 트윗을 몇 건 봤습니다.
스스로 오픈 데이터 등에서 가시화까지 해보고 싶었기 때문에 해 보았습니다.
이번에 사용한 데이터는 도쿄도가 공개하고 있는 데이터입니다.

그래프



우선 그래프를 보는 것이 빠르다고 생각합니다.
청축의 막대 그래프가 그 날 밝혀진 양성 환자의 수, 핑크의 꺾은선 그래프가 7일간 이동 평균을 취한 양성 환자의 수입니다.
방심은 물론이지 않고, 이것만을 보고 일괄적으로 코로나의 봉쇄에 성공하고 있다고는 말할 수 없습니다만, 꺾은 선 그래프는 오른쪽 어깨 내려가 있는 것처럼 보입니다.



이동 평균



통계학에서 사용되는 것으로,

시계열 데이터에 있어서, 어느 일정 구간마다의 평균치를 구간을 어긋나면서 구한 것입니다.

인용 대상 : htps : // 벨 r ゔぇ. jp/s 들 scs/b㎉g/15528. HTML

즉, 이하와 같은 데이터가 있었을 때, 3항의 이동 평균은 각각 전후 1개씩의 값의 평균을 계산하므로,


1
2
3
4
5
6
7



다음과 같습니다.


1
2
3
4
5
6
7


X
2
3
4
5
6
X


이번에는 ±3일간의 7일간 이동 평균을 취했기 때문에, 전후 3일간의 평균을 취하고 있습니다.

numpy를 사용하여 이동 평균 얻기



여기 의 사이트를 참고로 했습니다.
numpy.convolve 를 사용합니다.
numpy.convolve(ndaaray, karnel, mode)


인수
내용


ndaaray
시계열 데이터의 numpy 배열

카넬
커널 함수 (몇 점에서 이동 평균을 구할지 결정)

mode
same : 시계열 데이터와 동일한 요소 수로 결과 출력, valid : 시계열 데이터보다 짧은 요소 수로 결과 출력


데이터 시각화



가라게 씨의 기사 에서 공개된 Google Colab 을 전체적으로 사용했습니다. 감사합니다.
이야기는 그렇습니다만 가라아게씨라고 하는 분은 자신의 연구 분야이기도 한 로봇 관계의 분이라도 자주 기사를 참고로 하고 있습니다. 항상 감사합니다. (갑자기 신자)

가라게 씨의 것으로부터의 변경 부분만 발췌해 이하에 기재합니다.
첫째, 완전히 개인적인 취향으로 seaborn을 가져 왔습니다.

【변경】 날짜 데이터 읽기



여기는 x축의 라벨을 청소하고 싶었기 때문에 datetime형으로 했습니다.
date_data = np.array([])
for i in range(len(data['inspection_persons']['labels'])):
    date_data = np.append(date_data, pd.to_datetime(data['inspection_persons']['labels'][i][0:10]))
print(date_data)

【추가】7일간 이동 평균의 계산



원래 있던 양성 환자의 배열을 numpy 배열로 하여 상기의 이동 평균을 계산하고 있습니다.
또한 ±3일분을 np.nan
# 7日間の移動平均
n=7
patients_data_np_array = np.array(patients_data)
patients_data_move_ave = np.convolve(patients_data_np_array, np.ones(n)/float(n), 'valid')

nan_array = np.array([np.nan,np.nan,np.nan])
patients_data_move_ave = np.insert(patients_data_move_ave,0,nan_array)
patients_data_move_ave = np.insert(patients_data_move_ave,len(patients_data_move_ave),nan_array)

【변경】데이터 시각화 부분



상기 7일간 이동 평균을 꺾은선형 그래프로 넣었다.
plt.figure(figsize=(9,6))
plt.bar(date_data, patients_data,label='number of patients')
plt.plot(date_data, patients_data_move_ave,color='salmon', linewidth = 3.0,label='moving average of number of patients')
plt.legend()

모든 프로그램



이하, 이번 프로그램입니다.
환경은 Google Colabratory이므로 최초의 bash는 매직 커멘드(!)를 붙여 실행하는 것입니다.
보통 wget하고 있을 뿐이므로 Google Colabratory가 아니어도 사용할 수 있습니다.
!wget --no-check-certificate --output-document=covid19_tokyo.json 'https://raw.githubusercontent.com/tokyo-metropolitan-gov/covid19/development/data/data.json'

다음은 파이썬 프로그램입니다.
# ライブラリのとデータの読み込み
import pandas as pd
import numpy as np
data = pd.read_json('covid19_tokyo.json')
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

# 日付データ
date_data = np.array([])
for i in range(len(data['inspection_persons']['labels'])):
    date_data = np.append(date_data, pd.to_datetime(data['inspection_persons']['labels'][i][0:10]))

# 陽性患者データ
patients_data = []
for i in range(len(data['inspection_persons']['labels'])):
    patients_data.append(data['patients_summary']['data'][i]['小計'])

# 7日間移動平均の計算
n=7
patients_data_np_array = np.array(patients_data)
patients_data_move_ave = np.convolve(patients_data_np_array, np.ones(n)/float(n), 'valid')
# nanで埋める
nan_array = np.array([np.nan,np.nan,np.nan])
patients_data_move_ave = np.insert(patients_data_move_ave,0,nan_array)
patients_data_move_ave = np.insert(patients_data_move_ave,len(patients_data_move_ave),nan_array)

# 可視化
plt.figure(figsize=(9,6))
plt.bar(date_data, patients_data,label='number of patients')
plt.plot(date_data, patients_data_move_ave,color='salmon', linewidth = 3.0,label='moving average of number of patients')
plt.legend()


결과는 다음 그래프입니다.



결론



twitter에서 보인 것을 바로 스스로 가시화할 수 있었던 것도 데이터를 공개해 주시고 있는 도쿄도 덕분이거나, 데이터의 수집 방법이나 이동 평균의 방법을 공개해 주시는 여러분의 덕분이라고 느낀다 수있었습니다.
앞으로도 해보자! 라고 생각하면 바로 할 수 있도록 다양한 지식을 붙여 가고 싶습니다.

참고로 한 사이트



이동 평균



이동 평균 통계 웹 통계 시간
이동 평균 계산 방법 통계 웹 블로그

시각화



신형 코로나 바이러스 감염(COVID-19)의 오픈 데이터를 Google Colaboratory에서 간편하게 시각화·분석하는 방법
위 기사의 GoogleClobratory

좋은 웹페이지 즐겨찾기