お肉の検査員の統計解析日記

非エンジニアのお肉の検査員が日々の業務で発見した統計解析(主にRを使った)について情報発信します

お肉の検査員でもできる!!積み上げ棒グラフを使った時系列データの可視化方法

 どうもお肉の検査員です(5回目)。

 今回は、備忘録を兼ねてggplot2で、時系列データを積み上げ棒グラフを使って可視化をする方法を紹介したいと思います。

 最終的に、このような図を書くためのコードを以下で紹介します。

f:id:purerazz:20200222232213p:plain
R020220時点の国内居住者のコロナウイルス届出数

 今回の題材は、新型コロナウイルスの国内居住者の患者数と確定日の情報を積み上げ棒グラフを使って描画する方法です。


最初に、ggplot2の使い方に慣れてない方は、Unadonさんのホームページの記事を見られることをお勧めします。
mrunadon.github.io

mrunadon.github.io

 これらの記事は本当に分かりやすく、私のような非エンジニアの人でも分かるように説明されています。慣れていない方は、一度見てください。

 さて、新型コロナウイルスが国内でも発生しており、日本は中国韓国に次ぐ患者数となっております(2020/2/20時点)。1月15日に初発の方で届出された後、2月19日までに54名の方の届出が出されています(調査中含む)。

 この届出の推移を図示してみようと思います。この記事は備忘録を兼ねているので、分かりにくいところがあると思いますが、ご容赦ください。

可視化に必要なパッケージ

~
library(scales)
library(tidyverse)
library(ggrepel)
~

 もし、この3つのパッケージがない方はインストールをしてください。

データの入手と表示

まず、1月15日から2月19日までの国内居住者の方の都道府県別と確定日を厚生労働省のホームページから入手します。
www.mhlw.go.jp

 このデータをcsvファイルで保存して、Rで読み込みます(今回の記事ではcoronaという名前の変数に格納しています)。データはこのような感じで、確定日と国内居住者の都道府県名となっています。

~
> head(corona)
     確定日   居住地
1 2020/1/15 神奈川県
2 2020/1/28   奈良県
3 2020/1/29   大阪府
4 2020/1/30   三重県
5 2020/1/30   京都府
6 2020/1/31   千葉県
~

 今回は、横軸に確定日を縦軸に届出された人数を記載したいと思います。

 ただ、このデータをこのままの形で可視化するには、ヒストグラムを書くことになります(geom_histogram)が、ヒストグラムでは発生の無かった日にもなぜか都道府県名が記載されてしまい見にくいので、積み上げ棒グラフを書くことにします。

データの整形

積み上げ棒グラフを書くのにあたり、届出件数の数値が入った列が必要になります。そのため、dplyrパッケージ(最初に紹介した必要なパッケージのtidyverseパッケージの中に入っています)の関数(group_by, summarise)を使いデータの整形を行います。

~
corona_zushi = corona %>% dplyr::group_by(確定日, 居住地) %>% dplyr::summarise(n_kanja = n()) #corona_zushiという変数に格納する
~

 こうすることで、日付と都道府県名ごとの届出数が表示される列(今回の列名はn_kanjaです)が作られます。

~
> head(corona_zushi)
# A tibble: 6 x 3
# Groups:   確定日 [5]
  確定日    居住地   n_kanja
  <fct>     <fct>      <int>
1 2020/1/15 神奈川県       1
2 2020/1/28 奈良県         1
3 2020/1/29 大阪府         1
4 2020/1/30 京都府         1
5 2020/1/30 三重県         1
6 2020/1/31 千葉県         1
~

 この3つの列のデータを用いて、可視化していきます。

可視化する

 いよいよ可視化です。可視化するために、使ったコードのポイントをまず列挙します。

  • 日付の列(今回は確定日)を時系列データに変換するためにas.Date関数で変換します。
  • 積み上げ棒グラフを書くので、geom_barの引数をstat = "identity"としています。
  • ラベルである都道府県名を図に記載するために、ggrepel::geom_label_repelの引数にposition = "stack"と指定しました。
  • 今回は横軸に月日が分かれば良く、毎日日付を書くと見にくくなるので、scalesパッケージのscale_x_date関数の引数に、date_breaks = "2 day"として2日おきに日付を書くこと、および、labels = date_format("%m/%d")の引数を指定することで、月日の情報のみ記載することにしました。もし年月日で表示したい場合は、labels = date_format(“%y/%m/%d)とするとそのように表示されます。

 では、実際のコードを記載します。なお、geom_label_repelの引数のstackがないとラベルが中央に集まり見にくくなるので注意してください。

~
p = ggplot(corona_zushi, aes(x = as.Date(確定日), y = n_kanja, fill= 居住地, group = 居住地, label = 居住地)) #横軸は日時、縦軸は届出数、居住地ごとに色を付ける
p = p + geom_bar(stat = "identity") #積み上げ棒グラフにする
p = p + ggrepel::geom_label_repel(position = "stack")  # labelも積み上げる。
p = p + scale_x_date(date_breaks = "2 day", labels = date_format("%m/%d")) #2日ごとに日付を入れ、月日のみ表示する
p
~

 これを実行すると、このような積み上げ棒グラフを使った時系列データの可視化ができます。

f:id:purerazz:20200222232213p:plain
R020219時点の新型コロナウイルス都道府県別届出数の推移

 これを見る限り、国内感染者が現状増えていそうなことがより分かりやすくなりますね。

 以上です!

次回は、住所データの可視化について書いていきたいと考えています。