初心者でもPythonを使ってみよう

趣味と実益を兼ねたPython学習記



4半期ごとの実質GDP成長率と上陸した台風の数を並べてみた

西村経済再生担当大臣が、2019年10月から12月までのGDPについて前の3カ月と比べてマイナスになる見通しを発表した際、その原因の一つとして台風の影響をあげていた。

「消費税率引き上げに伴う駆け込み需要はそんなに大きくはなかったし、その後の落ち込みもそんなに大きくないと見ていたが、10月から12月の期間は台風や暖冬の影響がある。海外経済の下方リスクに対する全体としての不安感もある中で、百貨店や自動車の販売なども、数字としては低い数字が出てきている」

2019年10~12月期の実質GDP成長率(1時速報値)は-1.6%であった。この原因の一つが台風によるものなら、過去の台風の数とGDP成長率の相関をとれば、何か関係性が見える可能性がある。単純な比較のため厳密な議論は不可能だが、Pythonによる生データ処理とグラフ化の訓練のためにデータを並べて何か見えてこないか確認してみた。

【スポンサーリンク】

分析結果

四半期ごとのGDP成長率のデータは内閣府のHPから、台風数のデータは気象庁のHPから取得した。また、台風の数は日本への上陸数とした。

1994年以降の上陸した台風の数とGDP成長率を4半期ごとにプロットしたグラフを以下に示す。

f:id:vigilantPotato:20200223204725p:plain

GDP成長率のトレンドを見ると、今回の-1.6%と同等以上の落ち込みが発生したのは、2008~2009年のリーマンショック、2011年の東日本大震災、2014年の消費増税だろうか。

次に、台風上陸数とGDP成長率の相関を見るために、横軸を上陸した台風の数、縦軸をGDP成長率にしてプロットしたグラフを以下に示す。台風の影響でGDP成長率が低くなるなら、台風の上陸数に対してGDP成長率が逆相関になると考えられる。

f:id:vigilantPotato:20200223204752p:plain

ぱっと見た感じでは台風の上陸数とGDP成長率には相関関係はない。最初は線形近似して相関関係を評価するつもりだったが、明らかに相関はないので省略する。また、過去のデータでは台風の上陸数が6個でもGDPはプラス成長しているし、台風が上陸した期間のGDP成長率は、最悪で-1.0%程度であり今回の-1.6%には及ばない。残念ながら、単純に上陸した台風の数とGDP成長率を比べても意味はなさそうである。

今回の台風の影響でGDP成長率が落ち込んだということだったので、台風の上陸数とGDP成長率の関係を調べてみたが、両者に相関は見られなかった。今回の台風は過去のものと比べて規模が大きく、影響が広範囲だったため、特別に影響が大きく出たということだろうか。2014年の消費増税の際の成長率よりも少し良い程度なので、消費増税の影響としたほうが説得力がありそうである。

[↑ 目次へ]

コード

使用したモジュール

  • pandas:データ処理用
  • matplotlib.pyplot:グラフ化用
  • japanize_matplotlib:グラフの日本語化用
  • tkinter:グラフ表示用

使用した生データ

  • 上陸した台風の数:こちらから、「landing.csv」を取得
  • 実質GDP成長率:こちらから、「ritu-jk1932.csv」を取得

コード全文

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import tkinter


def quarterly_index():
    index = []
    start_year = 1994
    for year in range(start_year, 2020):
        for q in range(1, 5):
            index.append(str(year) + "-" + str(q) + "Q")
    
    return index


class TyhoonData():
    def __init__(self, filename):
        self.tyhoon_raw_data = pd.read_csv(
            filename,
            encoding="Shift_jis"
            )
        
    def n_tyhoon_quarterly(self):
        data = self.tyhoon_raw_data[self.tyhoon_raw_data.loc[:, "年"]>=1994].fillna(0)
        data = data.drop(["年", "年間"], axis=1)
        data.index = list(range(1994, 2020))
        data.columns = list(range(1,13))
        quarterly_tyhoon_data = []
        count = 0
        for year in list(data.index):
            for month in list(data.columns):
                count += data.at[year, month]
                if month % 3 == 0:
                    quarterly_tyhoon_data.append(count)
                    count = 0
        
        index = quarterly_index()

        return pd.DataFrame(
            data=quarterly_tyhoon_data,
            index=index,
            columns=["tyhoon"],
        )


class GdpData():
    def __init__(self):
        GDP_raw_data_csv = "ritu-jk1932.csv"
        self.GDP_raw_data = pd.read_csv(
            GDP_raw_data_csv,
            header=None,
            encoding="Shift_jis"
            )
        
    
    def gdp_expenditure(self):
        data = self.GDP_raw_data.loc[7:, 1].fillna(0)
        index = quarterly_index()

        return pd.DataFrame(
            data=data.values,
            index=index,
            columns=["GDP"]
            )


if __name__ == "__main__":
    x=quarterly_index()
    xtick = range(0, len(x), 4)
    t = range(1994, 2020)

    tyhoon_raw_data_csv = "landing.csv"
    tyhoon = TyhoonData(tyhoon_raw_data_csv)
    y1 = tyhoon.n_tyhoon_quarterly()
    
    gdp = GdpData()
    y2 = gdp.gdp_expenditure()
    
    fig, ax = plt.subplots(nrows=2, sharex=True)
    ax[0].bar(x, y1.tyhoon)
    ax[1].plot(x, y2.GDP, "-o")
    ax[0].set(ylabel="上陸した台風の数")
    ax[1].set(ylabel="GDP成長率(%)")
    ax[1].grid()
    plt.xticks(xtick, t)
    plt.xticks(rotation=90)
    plt.tight_layout()

    fig2, ax2 = plt.subplots()
    ax2.scatter(y1.tyhoon, y2.GDP)
    ax2.set(
        xlabel="上陸した台風の数",
        ylabel="GDP成長率(%)"
        )
    ax2.grid()

    root = tkinter.Tk()
    fig.show()
    fig2.show()
    root.mainloop()

[↑ 目次へ]