はじめに
前回に引き続き、東京都のコロナウィルスの感染者数のデータを扱います。今回もpandasを使わずに扱う場合と、pandasを使って扱う場合の2通りでやってみましょう。前回は日々の新規感染者数の変化をプロットしましたが、これでは傾向がわかりにくいときもあります。そこで、「移動平均」を算出してぷろっとしてみましょう。
データは東京都のWebサイトからダウンロードしています。取得方法がわからない場合は、前回の投稿を参考にしてください。
pandasを使わずに移動平均をプロット
では、さっそく移動平均を計算していきましょう。まずは移動平均データを入れるリストを用意しましょう。移動平均は、前後のいくつかを合わせた平均のことです。前後のいくつ合わせるか、というのも変数にしておくと便利ですね。
# 移動平均
ma_list=[]
# 前後2個を合わせた5個の平均
# 先頭は先頭から5個、末尾は末尾から5個のように必ず5個で平均をとる
default_previous=2
default_forward=2
for index,value in enumerate(values):
previous=default_previous
forward=default_forward
if default_previous-index>0:
previous=default_previous-(default_previous-index)
forward+=default_previous-index
if index + forward>(len(values)-1):
previous += (index + forward) - (len(values)-1)
forward = default_forward-((index+forward)-(len(values)-1))
print(previous,forward)
これを実行すると、日付ごとのprevious,forwardの値が表示されます。先頭をみてみると、
1つめのデータは、前にデータがないのでpreviousの値は0で、その分forwardが4となり全部で5個のデータの平均をとることになります。2つめのデータは、前にデータが1つあるので、これと後ろのデータ3つを合わせた5個のデータの平均をとることになります。意図したとおりにできてますね。
末尾のデータもみてみましょう。
最後尾のデータは、これ以上後ろにデータがないのでforwardの値は0で、その分、previousが4となっており合計で5個のデータの平均をとることになります。
これで準備ができたので、移動平均のリストを作っていきましょう。移動平均を求めて、用意していたma_listにいれていけばよいですね。
# 移動平均の算出
tmplist=values[index-previous:index+forward+1]
ma=sum(tmplist)/(previous+forward+1)
ma_list.append(ma)
これをもとに、先の日別の感染者数の棒グラフに移動平均をプロットします。
plt.figure(figsize=(10,10))
plt.bar(dates,values)
plt.plot(dates,ma_list,color='red')
plt.xticks(rotation=90)
plt.grid()
plt.show()
これでだいぶ傾向が見やすくなりましたね。実際は土日や祭日の影響などもあるので、これだけで解釈するのは難しいですが、移動平均は日別の変動ではつかみにくい傾向を見るときに便利です。次は、pandasを使って同じことをやってみましょう。
pandasを使って移動平均をプロット
pandasのデータフレームやシリーズに窓関数を適用するにはrolling( )を使います。
rolling関数を使うと、移動平均を瞬時に求めることができます。
# 移動平均値の算出
data_sum_paticient=data_sum['感染者数']
rolling=data_sum_paticient.rolling(5,center=True)
rolling_data=pd.DataFrame({'感染者数':data_sum_paticient,
'移動平均値':rolling.mean()})
Windowの幅は第一引数に指定します。ここでは窓を5に指定しています。次のcenterという引数は、TrueにするとWindowの中心位置に算出されたデータを格納します。※defaultではWindowの最後の一になる。
先頭と末尾のデータが足りない部分は欠損値NaNとなります。
# 描画
plt.figure(figsize=(15,6))
plt.bar(data_sum['公表日'],data_sum['感染者数'],label='感染者数')
plt.plot(rolling_data.index,rolling_data['移動平均値'],color='red',label='5日間移動平均')
plt.ylabel('感染者数(人)')
plt.title('東京都の感染者数の推移',fontsize=18)
plt.xticks(rotation=90)
plt.legend()
新規感染者数は減少傾向にあるとはいえるものの、まだ多いようですね。休みの影響などもあるかもしれないので、GW明けのデータを早く確認したいですね。
まとめ
今回、あえてpandasを使わずに算出してみましたが、やはりpandasを使う方が圧倒的に楽ですね。次回は、pandasのみを使ってその他のカラムの情報も整理してみましょう。
コメント