Google Colaboratory で複数の Csv ファイルを整形して Plotly で可視化する方法

8 min
広告_零号機

こんなお困りごとないですか?

大学生

大学生

最近は気象データやコロナに関するオープンデータがネット上で簡単に取得可能だけど、csv形式のデータだけでは得られる知見が無い。

何か加工してデータから情報を得たいな。

だけど方法が解らない。

※本記事はChrombookを使用して執筆しました

解決方法は?

あるよ。

忠犬SE

忠犬SE

Pandasというフレームワークを使えば、csvファイルの操作が簡単に行えるよ。複数のファイルを条件に合わせて抽出したり結合したりできるよ。

また、Plotlyというフレームワークを使えば簡単に可視化出来るよ。

つまり、Google Colaboratoryを使えばすぐに可視化出来るよ。

忠犬SE

忠犬SE

複数のcsvファイルを整形して可視化する方法

流れ

  • 全体概要を理解する
  • csvファイルを用意する
  • Colabのノートブックを作成する
  • 実際に動かしてみる
  1. STEP

    全体概要を理解する

    1. Google ドライブにcsvファイルを格納する
    2. Pandasを使用してcsvファイルを読み込みデータフレームに格納する
      この時点では、データフレームはcsvファイル毎に作成する
    3. データフレームを加工する
      1. カラム名をリネームする
      2. データフレームを横に結合する
      3. データフレームを縦に結合する
      4. データフレームに新たな列を追加し計算した値を格納する
    4. Plotlyを使用してデータフレームを可視化する
      1. 統計情報を可視化する
      2. アニメーションのあるグラフを表示する
      3. 複数グラフを並べて表示する

  2. STEP

    csvファイルを用意する

    過去の気象データを取得する

    下記サイトから気象データをCSVダウンロードして、加工します。

    東京・大阪・北海道の2021/1/1-2021/9/1の1日あたりの平均気温と平均室温のデータを用意しました。
    pandasによる加工を容易にするためcsvファイルの時点で一部加工している。加工前のデータについては実際にサイトからデータをダウンロードしてご確認頂きたい。

    新型コロナウイルス感染症情報を取得する

    下記サイトから新型コロナウイルスの感染症情報をダウンロードします。

    新規陽性者数の推移(日別)

    人口10万人当たり新規陽性者数

    重症者数の推移

    のオープンデータをクリックすることでダウンロードできます。

    Google ドライブにアップロードします

    Google ドライブのColba Notebooksフォルダの配下にcsvフォルダを作成し、先ほど用意したcsvファイルをアップロードします。

  3. STEP

    Colabのノートブックを作成する

    下記記事などを参考に、Colabで新しいノートブックを作成します。

  4. STEP

    実際に動かしてみる

    下記流れで実行します。

    1. Google ドライブのマウント

    下記コードをコピーして実行してGoogle ドライブをマウントします。

    # Googleドライブのマウント
    from google.colab import drive
    drive.mount('/content/drive')

    2. csvファイルの読み込みデータフレームに格納

    ここでは、pandasパッケージのread_csvという関数を使用します。

    Google ドライブをマウント後、下記コードを実行してcsvファイルを読み込みデータフレームに格納します。

    import pandas as pd
    
    df = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/csv/newly_confirmed_cases_daily.csv")
    df_100 = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/csv/newly_confirmed_cases_per_100_thousand_population_daily.csv")
    df_severe_cases_daily = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/csv/severe_cases_daily.csv")
    df_Tokyo_data = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/csv/Tokyo_data.csv")
    df_Hokkaido_data = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/csv/Hokkaido_data.csv")
    df_Osaka_data = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/csv/Osaka_data.csv")

    3. データフレームの加工

    csvファイルをそのまま読み込んだだけでは可視化出来ないので、データフレームを加工します。

    3-1. カラム名のリネーム

    データフレームのカラム名のリネームにはrenameというメソッドを使用します。

    下記コードを実行してカラム名をリネームします。

    # カラム名が長いのでリネーム
    df_100 = df_100.rename(columns={"Newly confirmed cases (per 100,000 population)":"Newly confirmed cases(100)"})

    3-2. 横に結合

    データフレームを横に結合するには、pandasパッケージのmergeという関数を使用します。

    下記コードを実行してデータフレームを横に結合します。

    ここでは、東京・大阪・北海道のそれぞれの平均気温と湿度のデータフレームに対しコロナウイルスの感染症情報を横に結合しています。各csvファイルは、DateカラムとPrefectureカラムを共通で保持しており、両カラムが等しいレコードを横に結合しています。

    # 横に結合
    # 東京
    df_new_Tokyo = pd.merge(df_Tokyo_data,df, on=["Date","Prefecture"])
    df_new_Tokyo = pd.merge(df_new_Tokyo,df_100, on=["Date","Prefecture"])
    df_new_Tokyo = pd.merge(df_new_Tokyo,df_severe_cases_daily, on=["Date","Prefecture"])
    df_new_Tokyo.head()
    
    # 大阪
    df_new_Osaka_data = pd.merge(df_Osaka_data,df, on=["Date","Prefecture"])
    df_new_Osaka_data = pd.merge(df_new_Osaka_data,df_100, on=["Date","Prefecture"])
    df_new_Osaka_data = pd.merge(df_new_Osaka_data,df_severe_cases_daily, on=["Date","Prefecture"])
    df_new_Osaka_data.head()
    
    # 北海道
    df_new_Hokkaido_data = pd.merge(df_Hokkaido_data,df, on=["Date","Prefecture"])
    df_new_Hokkaido_data = pd.merge(df_new_Hokkaido_data,df_100, on=["Date","Prefecture"])
    df_new_Hokkaido_data = pd.merge(df_new_Hokkaido_data,df_severe_cases_daily, on=["Date","Prefecture"])
    df_new_Hokkaido_data.head()

    3-3. 縦に結合

    データフレームを縦に結合するにはpandasパッケージのconcatという関数を使用します。

    下記コードを実行してデータフレームを縦に結合します。

    ここでは、各データフレームのカラムが同一なのでそのまま縦方向にデータが追加されます。

    # データフレームを立てに結合
    df_new = pd.concat([df_new_Tokyo, df_new_Hokkaido_data, df_new_Osaka_data])

    3-4. データフレームに新たな列を追加し計算した値を格納

    下記コードを実行して、日単位の不快指数を計算します。

    ここでは、新たにhukaiというカラムを追加し、そこに計算結果を格納しています。

    # 不快指数を計算。
    df_new["hukai"]=0.81*df_new["kion"]+0.01*df_new["situdo"]*(0.99**df_new["kion"]-14.3)+46.3

    また、可視化パラメータを指定するようにsizeというカラムを追加して数値の2を格納します。

    # 可視パラメータ
    df_new["size"]=2

  5. 4. Plotlyを使用してデータフレームを可視化する
  6. 4-1. データフレームに格納されている値の統計情報を可視化する

    下記コードを使用して、データフレームに格納されている統計情報を可視化します。

    df_new.describe()

    4-2. Plotlyを使用してデータフレームを可視化する(アニメーション)

    下記コードを使用して、データフレーム可視化します。

    ここではアニメーションを指定しており、日ごとのデータでアニメーションをします。

    import plotly.express as px
    
    animation_fig = px.scatter(
        df_new,
        x="hukai",
        range_x=[20, 70], # hukaiの最小と最大が含まれるように指定
        y="Newly confirmed cases(100)",
        range_y=[0, 50], # Newly confirmed cases(100)の最小と最大が含まれるように指定
        log_x=True,
        size="size",
        size_max=40,
        color="Prefecture",
        width=800,
        animation_frame="Date",  # 日ごとのデータでアニメーション
    )
    animation_fig.update_xaxes(tickfont={"size": 8})
    animation_fig.show()

    4-3. Plotlyを使用してデータフレームを可視化する(複数グラフ)

    下記コードを実行して、関数を定義します。

    ここでは、複数のグラフを立てに並べて可視化するグラフを定義しています。

    import plotly.graph_objects as go
    from plotly.subplots import make_subplots
    
    def draw_subplot(p_df, p_prefecture_list, p_days, p_draw_data_list):
      _fig = make_subplots(rows=len(p_draw_data_list), cols=1, subplot_titles=tuple(p_draw_data_list))
      _col_idx = 0
      for p_draw_data in p_draw_data_list:
        _col_idx += 1
        for p_Prefecture in p_prefecture_list:
          # データ抽出
          _df =  p_df[p_df["Prefecture"] == p_Prefecture]
          # 移動平均
          _df.loc[:, p_draw_data] = _df.rolling(p_days).mean()
          _fig.add_trace(go.Scatter(x=_df["Date"], y=_df[p_draw_data], name=p_Prefecture), row=_col_idx, col=1)
      _fig['layout'].update(height=300*_col_idx)
      _fig.show()

    下記コードを実行してグラフを描画します。

    draw_subplot(df_new, ["Tokyo","Hokkaido","Osaka"], 7, ["hukai", "Newly confirmed cases","Severe cases"])

最後に

本日は、複数のCSVファイルを整形してグラフに表示してみました。ご参考になりましたらtwitterをフォローしてSNSでシェアして頂ければ幸いです。

さらに、理解を深めたいというかたは、↓も見てね。

忠犬SE

忠犬SE

【付録】さらに理解を深めたいという方たちへ①

理解を深めるためには、実際に動かしてみるのが一番です。

下記テーマを参考に、色々と動かしてみてはいかがでしょうか?

  1. 14日移動平均のグラフを作成する
  2. 愛知県をグラフに追加する
  3. 2020/4~2021/9のグラフを作成する

【付録】さらに理解を深めたいという方たちへ②

  • 今回はデータの前処理を行っていいます。データ処理の基礎については下記がおすすめです。
  • データの前処理にPandasを使用しています。Pandasについて理解を深めたい方には下記がおすすめです。
  • 今回可視化で使用したPlotlyへの理解を深める方には下記がおすすめです。
  • 今回はデータの可視化止まりでしたが、可視化のその先に興味がある方には下記がおすすめです。

Next Step

ご参考

ちなみに今回は下記 Chromebook を使用しました。
14.0型フルHD × Core i3 × メモリ8GB を満たす数少ない端末です。
軽くて持ち運びしやすく開発に耐えうるスペックなのでおすすめです。

富士通|FUJITSU ノートパソコン FMV Chromebook 14F(タッチパネル) ダーククロム FCB143FB [14.0型 /Chrome OS /intel Core i3 /メモリ:8GB /SSD:128GB /タッチパネル対応 /2021年12月モデル]【point_rb】

価格:70,510円
(2022/2/23 18:35時点)
感想(1件)

Chromebook でプログラミングを始める方法については下記記事をご参考下さい。

広告_零号機-エリア2
kewton

kewton

大学院卒業後、某大手SIerで10年以上SEとして従事。
社会人3年目までに基本情報・応用情報技術者、データベーススペシャリスト、簿記3級・2級を取得。
基幹系システム・IoTシステム開発のプロジェクト経験多数。AI活用システムの企画・プロト開発経験あり。
強みは、プロマネだけでなく自身で開発も実施してきたこと。
【扱える言語】
C#、java、python、javascript、Excel VBA
【扱えるDB】
oracle、sql server、postgreSQL、mongoDB

FOLLOW

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA