8  時系列のグラフ

今回は2つの変数の間の相関の特殊ケースとして時系列 (time-series) 変化を見るグラフを作りたいと思います。つまり、時間が経過するにつれて、ある変数がどのように変化するのかを可視化します。

8.1 折れ線グラフ

8.1.1 単体の折れ線グラフ

例えば、前章で見た棒グラフや箱ひげ図を使っても構いませんが、折れ線グラフ (line plot) を使うことが多いと思います。ここでは、各年の平均寿命の平均値の折れ線グラフを描きたいと思います。

R (ggplot2)
df_year_life <- df_gap |> 
    group_by(year) |> 
    summarise(mean_lifeExp = mean(lifeExp))

ggplot(df_year_life) + 
    geom_line(aes(x = year, y = mean_lifeExp))

Python (matplotlib)
df_year_life = df_gap.groupby("year", as_index=False)["lifeExp"].mean()

plt.plot(df_year_life["year"], df_year_life["lifeExp"])

Python (pandas)
df_year_life.plot(x="year", y="lifeExp")

Python (seaborn)
sns.lineplot(df_gap, x="year", y="lifeExp", errorbar=None)

  • lineplot()
  • errorbar=Noneはおまじないです。

8.1.2 複数の折れ線グラフ

折れ線グラフは必ずしも一本である必要はありません。例えば全ての国の平均寿命の変化を折れ線グラフにすることも可能です。

R (ggplot2)
ggplot(df_gap) + 
    geom_line(aes(x = year, y = lifeExp))

ただ、素朴にデータからそのまま折れ線グラフを作図すると、不可思議なグラフが出来上がります。なぜなら、R/Pythonは全てのデータを「一筆書き」で繋げようとしているからです。したがって、ここでは国ごとに折れ線グラフを描くように指示する必要があります。

R (ggplot2)
ggplot(df_gap) + 
    geom_line(aes(x = year, y = lifeExp, group = country))

Python (seaborn)
sns.lineplot(df_gap, x="year", y="lifeExp", units="country", estimator=None)

  • それぞれgroupunitsによって、どの変数ごとに折れ線グラフを描くかを指定します。
  • seabornの場合、おまじないとしてestimator=Noneも追記します。
  • matplotlibでの作図は面倒なので割愛します。

全ての国の折れ線グラフを作図することで散らばりや、逸脱例などが分かります。

8.1.3 線の太さ・透過度

一方で、線が多いと見にくい気もします。この場合、線を少し細くしたり、透明にすると見やすくなるかもしれません。

R (ggplot2)
ggplot(df_gap) + 
    geom_line(aes(x = year, y = lifeExp, group = country), linewidth = 0.25, alpha = 0.5)

  • linewidthで線の太さ、alphaで透過度を指定します。
  • ところで、aes()の中と外のどっちで指定するんや、と疑問に思うかもしれません。データの変数を使う場合はaes()の中、特定の値を指定する場合は外になります。
  • seabornでのやり方は分かりませんでした。

8.1.4 グループごとの折れ線グラフ

これまでと同様に、折れ線グラフもグループごとに作図できます。

R (ggplot2)
ggplot(df_gap) + 
    geom_line(aes(x = year, y = lifeExp, group = country, color = continent))

Python (seaborn)
sns.lineplot(df_gap, x="year", y="lifeExp", units="country", hue="continent", estimator=None)

8.2 ヒートマップ(再訪)

前章で触れたヒートマップを使って時系列の変化を見ることもできます。

R (ggplot2)
ggplot(df_gap) + 
    geom_tile(aes(x = year, y = country, fill = lifeExp))

8.3 二変数の折れ線グラフ

これまで、ある1つの変数が時系列でどのように変化するかを可視化してきました。次は、ある2つの変数の時系列変化を可視化したいと思います。試しに、各年の平均寿命の平均値と一人あたりGDPの平均値の変動を見たいと思います。

R (ggplot2)
df_gap_sum <- df_gap |> 
    group_by(year) |> 
    summarise(mean_lifeExp = mean(lifeExp), 
              mean_gdpPercap = mean(gdpPercap))

ggplot(df_gap_sum) + 
    geom_path(aes(x = mean_gdpPercap, y = mean_lifeExp))

  • geom_path()によって、データの上から順に線を繋げます。
Python (seaborn)
df_gap_sum = df_gap.groupby("year")[["lifeExp", "gdpPercap"]].mean()

sns.lineplot(df_gap_sum, x="gdpPercap", y="lifeExp", sort=False)

  • sort=Falseとすることで、データの上から順に線を繋げます。

ただし、このままでは時間の順序が分かりにくいので、年で色分けします。

R (ggplot2)
ggplot(df_gap_sum) + 
    geom_line(aes(x = mean_gdpPercap, y = mean_lifeExp, color = year))

  • seabornではやり方が分からなかったです。