DUICUO

Pythonを使ってCOVID-19の世界的感染拡大をマッピングする方法


[[358773]]

これらのオープンソース フレームワークを使用して、ウイルスの可能性のある伝染経路を示すカラー マップを作成します。


世界的な旅行が当たり前になった現代において、病気の蔓延は真に憂慮すべき問題です。一部の組織は、主要な感染症(そして現在流行しているすべての感染症)を追跡し、その追跡から得られたデータを公開しています。しかし、これらの生のデータは人間が処理するのが難しい場合があり、だからこそデータサイエンスが非常に重要です。例えば、PythonとPandasを用いてCOVID-19の世界的な蔓延を視覚化することは、このデータの分析に役立ちます。

最初は、膨大な量の生データに直面するのは気が遠くなるような作業かもしれません。しかし、データ処理を始めると、徐々に処理方法がわかってくるでしょう。以下は、COVID-19データの処理における一般的なシナリオです。

  1. GitHubから国別のCOVID-19感染者数データを毎日ダウンロードし、Pandas DataFrameオブジェクトとして保存します。PythonではPandasライブラリを使用する必要があります。
  2. ダウンロードしたデータを処理してクリーンアップし、視覚化の入力形式に適合させます。ダウンロードしたデータは良好な状態(整理された状態)です。1つの問題は、国名で国を識別していることですが、国を識別するには3桁のISO 3コード(国コード表)を使用する方が適切です。ISO 3コードを生成するには、Pythonライブラリ​pycountry​を使用します。これらのコードを生成したら、既存のDataFrameに列を追加して、これらのコードを入力できます。
  3. 最後に、視覚化のためにPlotlyライブラリの​express​モジュールを使用しました。この記事では、コロプレスと呼ばれる地図(Plotlyライブラリで利用可能)を使用して、この病気の世界的蔓延を視覚化しています。

ステップ1:コロナデータ

最新のコロナウイルスデータを以下のウェブサイトからダウンロードしてください(LCTT翻訳者注:2020年12月14日現在、まだアクセス可能ですが、グレートファイアウォールによってブロックされています)。

  • https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv

ダウンロードしたデータをPandas DataFrameに読み込みます。Pandasには、URLから直接データを読み取り、DataFrameオブジェクトを返す関数​read_csv()​が用意されています(以下を参照)。

 pycountryをインポートする

plotly.expressをpxとしてインポートする

pandasをpdとしてインポートする

URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv'

df1 = pd.read_csv(URL_DATASET)

print(df1.head(3)) # データフレームの最初の3つのエントリを取得する

print(df1.tail(3)) # データフレームの最後の3つのエントリを取得する

Jupyter の出力のスクリーンショット:


​​

Jupyterのスクリーンショット

この出力は、DataFrame ( ​df1​ ) に次のデータ列が含まれていることを示しています。

  1. ​Date​
  2. ​Country​
  3. ​Confirmed​
  4. ​Recovered​
  5. ​Dead​

すると、1月22日から3月31日までのエントリを含む​Date​列が表示されます。このデータは毎日更新されるため、現在の日付の値が表示されます。

ステップ2: DataFrameをクリーンアップして変更する

このDataFrameにデータ列を追加する必要があります。具体的には、ISO 3エンコーディングを含む列です。これは以下の3つの手順で実行できます。

  1. すべての国を含むリストを作成します。df1 ​df1​ ​Country​列では日付ごとに国が重複するため、実際には​Country​列には国ごとに複数のエントリが含まれます。これを実現するために​unique().tolist()​関数を使用しました。
  2. ​d_country_code​辞書オブジェクト (最初は空) を使用し、そのキーを国の名前に設定し、その値を対応する ISO 3 コードに設定しました。
  3. 各国のISO 3コードを生成するために、 ​pycountry.countries.search_fuzzy(country)​を使用します。この関数は​Country​オブジェクトのリストを返すことに注意してください。この関数の戻り値を​country_data​オブジェクトに代入します。このオブジェクトの最初の要素(インデックス​0​ )を例に挙げましょう。この​\​​alpha_3​属性があります。したがって、 ​country_data[0].alpha_3​を使用して最初の要素のISO 3コードを「取得」できます。ただし、このDataFrame内の一部の国名には、対応するISO 3コードがない場合があります(紛争地域など)。これらの「国/地域」については、ISO 3コードを空文字列に置き換えます。この部分は​try-except​ブロックに置き換えることもできます。`except` ​except​内の文は、 ​print('could not add ISO 3 code for ->', country)​と記述できます。これらの「国/地域」に対応するISO 3コードが見つからない場合、出力候補が表示されます。実際、最終出力ではこれらの「国/地域」が白色で表示されます。
  4. 各国のISO 3コード(一部は空白文字列)を取得した後、国名(キー)とそれに対応するISO 3コード(値)を、先ほど作成した辞書​d_country_code​に追加しました。この作業は、Pythonの辞書オブジェクトの​update()​メソッドを使用して実行できます。
  5. 国名とそれに対応する ISO 3 コードを含む辞書を作成した後、簡単なループを使用してそれらを DataFrame に追加しました。

ステップ3: Plotlyを使用して伝播経路を視覚化する

コロプレスマップは、色付きのポリゴンで構成された地図です。変数の空間的な変化を表すためによく使用されます。コロプレスマップを作成するには、Plotlyの​px​モジュールを使用します。具体的な関数は​px.choropleth​です。

この関数に含まれるパラメータは次のとおりです。

 plotly.express.choropleth(data_frame=なし、lat=なし、lon=なし、locations=なし、locationmode=なし、geojson=なし、featureidkey=なし、color=なし、hover_name=なし、hover_data=なし、custom_data=なし、animation_frame=なし、animation_group=なし、category_orders={}、labels={}、color_discrete_sequence=なし、color_discrete_map={}、color_continuous_scale=なし、range_color=なし、color_continuous_midpoint=なし、projection=なし、scope=なし、center=なし、title=なし、template=なし、width=なし、height=なし)

​choropleth()​関数に関して注意すべき点がいくつかあります。

  1. ​geojson​​geometry​オブジェクトです(上記の関数の6番目のパラメータ)。このオブジェクト​geojson​関数​geojson​ドキュメントに明示的に記載されていないため、少し分かりにくいかもしれません。`geojson` オブジェクトは指定してもしなくても構いません。`geojson` オブジェクトを指定した場合、地球の地物をプロットするのに使用されます。 ​geojson​しない場合は、関数はデフォルトで組み込みの​geometry​オブジェクトを使用します。(今回の実験では組み込みの​geometry​オブジェクトを使用しているため、 ​geojson​パラメータには値を指定しません。)
  2. DataFrame オブジェクトには​data_frame​プロパティがあり、先ほど作成した​df1​がすでに提供されています。
  3. 各国のポリゴンの色は​Confirmed​症例数に基づいて決定されます。
  4. 最後に、 ​Date​​animation_frame​を作成します。これにより、データを日付ごとに分割し、 ​Confirmed​列の変化に応じて国の色を変えることができます。

完全なコードは次のとおりです。

 pycountryをインポートする

plotly.expressをpxとしてインポートする

pandasをpdとしてインポートする

# ---------- ステップ 1 ----------

URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv'

df1 = pd.read_csv(URL_DATASET)

# print(df1.head) # コメントを解除してデータフレームの内容を確認します

# ---------- ステップ 2 ----------

list_countries = df1['国'].unique().tolist()

# print(list_countries) # コメントを解除して国の一覧を表示

d_country_code = {} # 国名とISOコードを保持する

list_countries内の国について:

試す:

country_data = pycountry.countries.search_fuzzy(国)

# country_data は pycountry.db.Country クラスのオブジェクトのリストです

# リストの最初の項目、つまりインデックス0が最も適しています

# Countryクラスのオブジェクトにはalpha_3属性があります

国コード = 国データ[0].alpha_3

d_country_code.update({国: 国コード})

を除外する:

print('ISO 3コードを->に追加できませんでした', country)

# 国が見つからない場合は、ISOコード ' ' を作成します

d_country_code.update({国: ' '})


# print(d_country_code) # 辞書をチェックするためにコメントを解除する


# dfに新しい列iso_alphaを作成します

# 適切な ISO 3 コードを入力します

d_country_code.items() の k、v について:

df1.loc[(df1.Country == k), 'iso_alpha'] = v


# print(df1.head) # コメントを解除してISOコードが追加されたことを確認する

# ---------- ステップ3 ----------

fig = px.choropleth(データフレーム = df1,

場所 = "iso_alpha",

color= "確認済み"、# 列「確認済み」の値によって色が決定されます

hover_name="国",

color_continuous_scale= 'RdYlGn', # カラースケール 赤、黄、緑

animation_frame="日付")


図.show()

地図

完全なコードはここからダウンロードして実行できます。

最後に、Plotly を使用してコロプレス プロットを描くための優れたリソースをいくつか紹介します。