今週も特にありません

進捗どうですか?

lubridateのweekとisoweekの違い

日次データを週次データとして売り上げなどをまとめて集計したいということはよくあります。今まで特に何も気にすることなく、lubridateisoweekを使って週番号を付けて集計していましたが、年を跨いだ場合にどのような週番号が付くのかを確認したのでメモします。

ここでは、年を跨いだ16日分の日次データがあったとします。

> library(tidyverse)
> library(lubridate)

> sample_tbl <- tibble(
+   date = seq(as.Date("2018-12-23"), as.Date("2019-01-07"), by = 1),
+   sales = sample(1:100, 16)
+ )
> sample_tbl
# A tibble: 16 x 2
   date       sales
   <date>     <int>
 1 2018-12-23    19
 2 2018-12-24    68
 3 2018-12-25    37
 4 2018-12-26    36
 5 2018-12-27    84
 6 2018-12-28    86
 7 2018-12-29    59
 8 2018-12-30    13
 9 2018-12-31    72
10 2019-01-01    40
11 2019-01-02    96
12 2019-01-03    69
13 2019-01-04    23
14 2019-01-05    28
15 2019-01-06     6
16 2019-01-07     4

これに対して、それぞれの週番号と曜日を追加します。

> sample_tbl %>%
+     mutate(week = week(date)) %>%
+     mutate(isoweek = isoweek(date)) %>%
+     mutate(epiweek = epiweek(date)) %>%
+     mutate(weekdays = weekdays(date))
# A tibble: 16 x 6
   date       sales  week isoweek epiweek weekdays
   <date>     <int> <dbl>   <dbl>   <dbl> <chr>   
 1 2018-12-23    73    51      51      52 日曜日  
 2 2018-12-24    87    52      52      52 月曜日  
 3 2018-12-25    75    52      52      52 火曜日  
 4 2018-12-26    86    52      52      52 水曜日  
 5 2018-12-27    44    52      52      52 木曜日  
 6 2018-12-28    16    52      52      52 金曜日  
 7 2018-12-29    31    52      52      52 土曜日  
 8 2018-12-30    48    52      52       1 日曜日  
 9 2018-12-31    67    53       1       1 月曜日  
10 2019-01-01    91     1       1       1 火曜日  
11 2019-01-02     4     1       1       1 水曜日  
12 2019-01-03    14     1       1       1 木曜日  
13 2019-01-04    65     1       1       1 金曜日  
14 2019-01-05     1     1       1       1 土曜日  
15 2019-01-06    34     1       1       2 日曜日  
16 2019-01-07    40     1       2       2 月曜日 

つまり、weekは1月1日からスタートで週番号を付けるので、53週目が存在します。一方、isoweekはISO 8601規格で「年の最初の木曜日を含む週が、その年の第1週」として週番号を付けるので、2018年12月31日も1週目となります(2017年などは年を越しても1月1日は52週目となります)。

大抵のビジネスシーンでは、月曜始まりの7日間の売り上げを週次データとして集計するので、isoweekを使うことになると思います。

おまけとして、epiweekというものもあり、こちらは日曜日を週の始まりとした週番号になります。