0
0

More than 3 years have passed since last update.

pandasで東京都感染者数のグラフを書く2

Posted at

前回のあらすじ

この記事は、 pandasで東京都感染者数のグラフを書く の続きです。前作を読んでない^^;という人は前の記事から読んでもらえるとわかりやすいと思います。

おさらい

前回は、pandasにて東京都の感染者数と発表日のグラフを書きました。
pythonにはライブラリが豊富でスバラシイと感じていましたが、型が乱立しすぎててんやわんや…。

今回は、pandasとnumpyを使って、日中平均温度と感染者数の相関係数をもとめます。

まずは、復習

相関係数とは?

関係数(そうかんけいすう、英: correlation coefficient)は、2つの確率変数の間にある線形な関係の強弱を測る指標である[1][2]。相関係数は無次元量で、−1以上1以下の実数に値をとる。相関係数が正のとき確率変数には正の相関が、負のとき確率変数には負の相関があるという。また相関係数が0のとき確率変数は無相関であるという[3][4] 。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

wikipediaは定義に厳格ですね…
高校生向けにかかれているwebサイトがありましたのでそちらの引用の方が
わかりやすいかと思います。

相関係数が大きい(1に近い)→ X が大きいとき Y も大きい傾向がある
相関係数が0に近い→ X と Y にあまり関係はない
相関係数が小さい(-1に近い)→ X が大きいとき Y は小さい傾向がある

高校数学の美しい物語 相関係数の数学的性質とその証明

基礎知識はこのくらいにしておきましょう。
実際は、x,y,rをそれぞれ変量x,変量y,求める相関係数rとすると以下のように表せます。(ただし、x̄,ȳは変量x,変量yの平均値を示す)

r=\frac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y)}}{\sqrt{\sum_{j=1}^{n}(x_j-\bar{x})^2}\sqrt{\sum_{k=1}^{n}(y_k-\bar{y})^2}}\\

(-1\leq r \leq1)

私が高校生のときにはデータ分析等は入試の範囲でしたが、今はどうなんですかね?
私は、大学の講義を受けてやっと理解できた記憶があります。

今回やりたいこと

仮説

夏になるとコロナウイルスは気温が上がってウイルスが生きて行きにくい環境になり、終息に近づくだろうというネット記事が出回っていたので本当にそうなのか調べようと思いました。

日中の平均気温と、感染者数の相関係数を調べて、相関係数が-1に近い、つまり気温が上がるほど感染者数が減るというデータが得られればこの仮設は承認されるわけです。

お断り

今回はプログラミング学習をメインに進めたいため、統計学が結構おざなりとなっております。大変も仕分け有りません。

統計学を専門的に学んでおられる方からすると、こんなふざけた統計のとり方があるのか!とツッコミを入れたくなるでしょう。

統計について詳しく学びたい方は、
専門家の先生が書かれた教材を参考にされると良いと思います。
高校生でも理解できる内容となっているだけではなく、Excelの使い方も学べます。

ハンバーガー統計学

データ等は、執筆当時のものです。当記事では、プログラミング学習を目的として書いているものです。
専門的な知見が必要な場合や、人命などに関わる場合は関係機関に問い合わせください。
本記事は医学的・統計学的に正しいということを示すものでは有りません。

プログラミング

環境

OS:macOS Mojave
Pythonバージョン:Python 3.7.5rc1
実行環境:Atom ruuner

コード

import pandas as pd
import numpy
import requests
from datetime import datetime as dt
import datetime
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import japanize_matplotlib


if __name__ == "__main__":

    #【 東京オープンデータ処理 】
    #url_patients = "130001_tokyo_covid19_patients.csv"
    #urlから直リンクは推奨しません

    csv_patients_data = pd.read_csv(url_patients)
    pd.set_option('display.max_columns',100)
    pd.set_option('display.max_rows',10000)
    num_p_patients = csv_patients_data["No"].count()
    num_p_age = csv_patients_data["患者_年代"].value_counts()
    num_p_sex = csv_patients_data["患者_性別"].value_counts()

    #---------------感染者数と日付の管理ココから---------------#
    num_p_date = csv_patients_data["公表_年月日"].value_counts()
    #日付順ソート
    num_p_date = num_p_date.sort_index()
    #日付加工
    num_p_date_fig = num_p_date #グラフ表示用と分離
    num_p_date = num_p_date.rename(index = lambda s:(dt.strptime(s,"%Y-%m-%d")))    #indexをdatetime型へ
    num_p_date_fig = num_p_date_fig.rename(index = lambda s:(dt.strptime(s,"%Y-%m-%d")).strftime("%m/%d"))  #indexをdatetime型へstr型へ(指定形式へ日付のフォーマットを変えるため)
    num_p_date_fig = num_p_date_fig.rename(index = {"01/24":"2020/01/24"})

    #---------------感染者数と日付の管理ココまで---------------#


    #---------------補完データフレーム作成ココから---------------#
    #https://qiita.com/hanon/items/29cf5ed9acb4f731538f参考

    dates_df = pd.DataFrame(index=pd.date_range("20200124","20200330"))
    print((pd.DataFrame(num_p_date)).merge(dates_df, how="outer", left_index=True, right_index=True))


    #---------------補完データフレーム作成ココまで--------------#


    #---------------出力(試験)ココから---------------#
    #print("感染者数={0}".format(num_p_patients))
    print("公表日頻度=\n{0} \n{1}".format(num_p_date_fig,num_p_age))
    #print("性別=\n{0}".format(num_p_sex))
    #---------------出力(試験)ココまで---------------#



    #【気象庁 csv処理】

    #---------------天気(入力)ココから---------------#
    url_weather="data.csv" #気象庁のcsvデータ(加工必須)
    csv_weather = pd.read_csv(url_weather,encoding="shift-jis",index_col=0)#*1
    csv_weather=csv_weather["平均気温(℃)"]
    print(csv_weather) #出力テスと
    #---------------天気(入力)ココまで---------------#




    #---------------グラフプロットココから---------------#
    plt.figure(tight_layout=True)
    num_p_date_fig.plot(rot=90,legend='reverse')
    plt.savefig('fig.png')
    plt.close("all")

    #---------------グラフプロットココまで---------------#

    print(num_p_date.corr(csv_weather)) #相関係数導出

気象庁のcsvファイルについては、https://www.data.jma.go.jp/gmd/risk/obsdl/index.php
を参考にした。
このデータは、csv形式であるが、ダウンロードの際にダウンロード日時が強制的にファイル内に書き込まれカンマの関係が破壊される。さらに、使用されている文字コードがSHIFT-JISのため*1では、shift-jisを指定した。
また、感染者数が毎日記録されていない期間が存在するため、Nanでデータの穴埋めを行った。

結果

2020/1/24〜2020/3/30までの日毎平均気温とコロナウイルス感染者数の関係には、約0.3の正の相関があった。

考えられること

データは正確性を欠いているということ
感染者数と日付の関係は、感染が疑われPCR検査で陽性となった後に発表されたデータを基にしているため実際に感染した日と、日毎平均気温との関係が一致していないということが考えられる。

現実世界では、複数の要因が絡んでるということ
単純に日毎平均気温と感染者数の関係を比較したが、同時に考えられる複数の条件の影響を排除しきれていないということである。
例えば、気温が高いか日でも湿度が高い日、低い日が考えられる。一般的に湿度が低い場合は、ウイルスの質量が湿度の高い場合と比較して軽くなるため空気中を浮遊するようになる。このような理由から湿度に関するデータを無視して単純に感染者数と日毎平均気温を比較するには合理性を欠くと「僕は思います」

つまり、この相関係数の算出方法には無理があるってこと!

感想

途中から大学のレポート書いてるモードになってました。すいません。
単純に温度と感染者数を比較しても、湿度などさまざまな要因が絡みあっているため正しい相関がつかめないということですね。
ただ、湿度があれば広がらないというのも北海道の例を見ると疑問ですが。
(雪が降る→少なくとも外の湿度は高い?)

結論

統計学の勉強をもう少ししないと正確な値は出ない。

参考

ハンバーガーショップで学ぶ楽しい統計学──平均から分散分析まで──
統計用語集
冬になると、風邪やインフルエンザが流行するのはなぜですか?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0