今週も特にありません

進捗どうですか?

lubridate::rollbackの使い所

日次データが存在して、その日次データとそれを月ごとにまとめ上げた月次データの可視化を行いたい場合があります。

library(tidyverse)
library(lubridate)

set.seed(12345)
order_tbl <- tibble(
  order_date = seq(ymd("2018-01-01"), ymd("2018-12-31"), by = "1 day"),
  order_num = rpois(365, 5)
)

日次データとしてプロットしたい場合は、以下のようにできます。

order_tbl %>%
  ggplot(aes(x = order_date, y = order_num)) +
  geom_point(size = 2, colour = "blue") +
  geom_line(size = 1, colour = "blue", alpha = 0.5) +
  scale_x_date(date_breaks = "3 months", date_minor_breaks = "1 months", date_labels = "%Y-%m") +
  scale_y_continuous(breaks = seq(0, 20, by = 2), minor_breaks = 1:20) +
  theme(axis.text = element_text(size = 15),
        axis.title = element_text(size = 20))

f:id:masaqol:20190305010115p:plain

次に、月ごとにまとめ上げたデータは以下のように計算できます (年と月のまとめ上げでも可能)。

order_tbl %>%
  mutate(y = year(order_date),
         m = month(order_date),
         ym = str_c(y, "-", sprintf("%02d", m))) %>%
  group_by(ym) %>%
  summarise(monthly_order_sum = sum(order_num))
#> # A tibble: 12 x 2
#>    ym      monthly_order_sum
#>    <chr>               <int>
#>  1 2018-01               161
#>  2 2018-02               133
#>  3 2018-03               161
#>  4 2018-04               163
#>  5 2018-05               176
#>  6 2018-06               171
#>  7 2018-07               156
#>  8 2018-08               169
#>  9 2018-09               161
#> 10 2018-10               144
#> 11 2018-11               146
#> 12 2018-12               170

しかし、これだと年月を表すカラムがcharactor型のため、上記の日次データを可視化した際に利用したscale_x_dateの部分を流用して同じスケールで可視化できません。

そこで、lubridate::rollbackを利用すれば、以下のようにできます。

order_tbl %>%
  mutate(first_date = rollback(order_date, roll_to_first = TRUE)) %>%
  group_by(first_date) %>%
  summarise(monthly_order_sum = sum(order_num)) %>%
  ggplot(aes(x = first_date, y = monthly_order_sum)) +
  geom_point(size = 2, colour = "blue") +
  geom_line(size = 1, colour = "blue", alpha = 0.5) +
  scale_x_date(date_breaks = "3 months", date_minor_breaks = "1 months", date_labels = "%Y-%m") +
  scale_y_continuous(breaks = seq(0, 200, by = 10), minor_breaks = seq(0, 200, by = 5)) +
  theme(axis.text = element_text(size = 15),
        axis.title = element_text(size = 20))

f:id:masaqol:20190305010155p:plain

ここでは、その月の最初の日のカラムを追加して、その日で月次にまとめ上げて可視化しています。こうすることで、日次データで利用したscale_x_dateの部分も流用できます。

rollback関数の中身自体は、day関数を使って、日付部分に1を入れるというシンプルな操作を行う便利関数になっています。 github.com