私が欲しいテーブルは「ヴィンテージ分析フォーマット」と呼ばれるものだと思います。
以下は再現可能なデータセットです。
library(BTYDplus)
txn <- head(BTYDplus::groceryElog,100)
custFirstTxn <- BTYDplus::groceryElog %>% group_by(cust) %>% arrange(cust, date) %>%
filter(row_number()==1) #%>%
#mutate(cohort = tsibble::yearmonth(date))
custFirstTxn$cohort <- tsibble::yearmonth(custFirstTxn$date)
custFirstTxn %>% group_by(cohort) %>% summarise(n()) %>% ungroup()
custFirstTxn <- custFirstTxn %>% ungroup()
mycust <- custFirstTxn %>% group_by(cohort) %>% top_n(n = 6, wt = cust) %>% dplyr::select(-date)
monthlytxn <- BTYDplus::groceryElog %>%
mutate(date = date %>% tsibble::yearmonth()) %>%
group_by(cust, date) %>% tally() %>%
filter(cust %in% mycust$cust & date <= tsibble::yearmonth('2006 Jun')) %>% arrange(date)
monthlytxn %>% pivot_wider(names_from = date, values_from = n)
# A tibble: 18 x 7
# Groups: cust [18]
cust 2006 Jan 2006 Feb 2006 Mar 2006 Apr 2006 May 2006 Jun
<fct> <int> <int> <int> <int> <int> <int>
1 534 1 1 NA NA NA 1
2 535 1 NA NA NA NA 2
3 536 1 NA 1 1 1 1
4 537 1 NA 1 NA NA 1
5 538 1 2 1 1 2 1
6 539 1 1 NA NA NA NA
7 1018 NA 1 NA NA NA NA
8 1019 NA 1 NA 1 1 NA
9 1020 NA 1 2 3 2 3
10 1021 NA 1 2 1 1 1
11 1022 NA 1 1 2 1 NA
12 1023 NA 1 1 1 NA NA
13 1520 NA NA 1 NA NA NA
14 1521 NA NA 1 NA 1 NA
15 1522 NA NA 1 1 NA NA
16 1523 NA NA 1 NA NA NA
17 1524 NA NA 1 1 NA NA
18 1525 NA NA 1 2 1 1
私たちが気付いたのは、顧客のコホートが異なれば、コホートの日付も異なるということです。2006 年 1 月、2006 年 2 月、2006 年 3 月にそれぞれ最初の取引を行った企業もあります。
私が欲しいのは、これらのより広いテーブルを以下に変換することです。日付は月ごとの日付ではなく、各顧客の最初の月のトランザクションに正規化されていることに注意してください。
# MOB refers to MonthOnBook
# I truncate the other MOB to simplify the view.
cust MOB1 MOB2 MOB3 MOB4
<fct> <int> <int> <int> <int>
1 534 1 1 NA NA
2 535 1 NA NA NA
3 536 1 NA 1 1
4 537 1 NA 1 NA
5 538 1 2 1 1
6 539 1 1 NA NA
7 1018 1 NA NA NA
8 1019 1 NA 1 1
9 1020 1 2 3 2
10 1021 1 2 1 1
11 1022 1 1 2 1
12 1023 1 1 1 NA
13 1520 1 NA NA NA
14 1521 1 NA 1 NA
15 1522 1 1 NA NA
16 1523 1 NA NA NA
17 1524 1 1 NA NA
18 1525 1 2 1 1
``