d0 <- read.csv('https://stats.dip.jp/01_ds/data/e-stat_expenditure.csv', skip = 11)

# タイムスタンプと支出金額のカラムを探しデータを抽出
j.time <- grep('時間軸.月次..コード', colnames(d0))
j.ice  <- grep('アイスクリーム',      colnames(d0))

d1 <- d0[, c(j.time, j.ice)]

# 時間コード(10桁)からPOSIX準拠時間を作成
yyyy <- substr(paste(d1[, 1]), 1, 4)
mm   <- substr(paste(d1[, 1]), 7, 8)
px <- as.POSIXlt(paste(yyyy, mm, '01 12:00:00'), format = '%Y%m%d %H:%M:%S')

d0 <- data.frame(px, date = format(px, '%Y-%m-%d'), y = d1[, 2])
d.ca     <- read.csv('https://stats.dip.jp/01_ds/data/calendar/calendar.csv')
d.amedas <- read.csv('https://stats.dip.jp/01_ds/data/amedas/amedas_Tokyo_1h.csv')
d.amedas$date <- format(as.POSIXct(d.amedas$HS), "%Y-%m-%d") # カラムdateを作成

# 暦,気象とマージ
d0 |> merge(d.ca, by = "date") |> merge(d.amedas, by = "date") -> d
head(d)
##         date                  px   y dow         name             event    md
## 1 2014-01-01 2014-01-01 12:00:00 396  水 祝日(元日) 年末年始(01-01) 01-01
## 2 2014-01-01 2014-01-01 12:00:00 396  水 祝日(元日) 年末年始(01-01) 01-01
## 3 2014-01-01 2014-01-01 12:00:00 396  水 祝日(元日) 年末年始(01-01) 01-01
## 4 2014-01-01 2014-01-01 12:00:00 396  水 祝日(元日) 年末年始(01-01) 01-01
## 5 2014-01-01 2014-01-01 12:00:00 396  水 祝日(元日) 年末年始(01-01) 01-01
## 6 2014-01-01 2014-01-01 12:00:00 396  水 祝日(元日) 年末年始(01-01) 01-01
##   gr year month day wk su mo tu we th fr sa wd.x ho bw af sp ab
## 1  6 2014     1   1  1  0  0  0  1  0  0  0    0  1  0  0  1  0
## 2  6 2014     1   1  1  0  0  0  1  0  0  0    0  1  0  0  1  0
## 3  6 2014     1   1  1  0  0  0  1  0  0  0    0  1  0  0  1  0
## 4  6 2014     1   1  1  0  0  0  1  0  0  0    0  1  0  0  1  0
## 5  6 2014     1   1  1  0  0  0  1  0  0  0    0  1  0  0  1  0
## 6  6 2014     1   1  1  0  0  0  1  0  0  0    0  1  0  0  1  0
##                    HS                  HE    hpa   hpa0 pr hm  hm1h  ws ws1h
## 1 2014-01-01 13:00:00 2014-01-01 14:00:00  997.8 1002.1  0 36 36.50 3.9 3.97
## 2 2014-01-01 23:00:00 2014-01-02 00:00:00 1002.5 1006.9  0 47 46.00 1.0 1.35
## 3 2014-01-01 15:00:00 2014-01-01 16:00:00  998.8 1003.1  0 36 35.50 3.9 3.88
## 4 2014-01-01 21:00:00 2014-01-01 22:00:00 1002.1 1006.6  0 58 54.83 0.6 0.73
## 5 2014-01-01 00:00:00 2014-01-01 01:00:00 1003.5 1008.0  0 68 67.17 1.0 1.83
## 6 2014-01-01 05:00:00 2014-01-01 06:00:00 1001.9 1006.3  0 48 50.33 3.4 3.00
##   ws_max rm  rm1h   tp  tp1h  tp5h tp3d tp7d   wd.y wd_max              missing
## 1    8.1 10 60.00 15.4 15.02 13.20 6.68 6.40 南南西 南南西                     
## 2    2.3  0  0.00  8.0  8.43  8.09 7.29 6.54     北   北東                     
## 3    6.3 10 55.98 14.3 14.53 14.60 6.85 6.47     南     南                     
## 4    1.0  0  0.00  6.4  7.17  9.89 7.16 6.55   北西     西                     
## 5    1.9  0  0.00  5.3  4.82  6.27 5.81 6.13 北北西   北西                     
## 6    4.8  0  0.00  7.2  7.03  5.20 6.03 6.16     南 南南西
tail(d)
##            date                  px   y dow name event    md gr year month day
## 2563 2022-11-01 2022-11-01 12:00:00 660  火 平日       11-01  3 2022    11   1
## 2564 2022-11-01 2022-11-01 12:00:00 660  火 平日       11-01  3 2022    11   1
## 2565 2022-11-01 2022-11-01 12:00:00 660  火 平日       11-01  3 2022    11   1
## 2566 2022-11-01 2022-11-01 12:00:00 660  火 平日       11-01  3 2022    11   1
## 2567 2022-11-01 2022-11-01 12:00:00 660  火 平日       11-01  3 2022    11   1
## 2568 2022-11-01 2022-11-01 12:00:00 660  火 平日       11-01  3 2022    11   1
##      wk su mo tu we th fr sa wd.x ho bw af sp ab                  HS
## 2563 45  0  0  1  0  0  0  0    1  0  0  0  0  0 2022-11-01 23:00:00
## 2564 45  0  0  1  0  0  0  0    1  0  0  0  0  0 2022-11-01 11:00:00
## 2565 45  0  0  1  0  0  0  0    1  0  0  0  0  0 2022-11-01 12:00:00
## 2566 45  0  0  1  0  0  0  0    1  0  0  0  0  0 2022-11-01 13:00:00
## 2567 45  0  0  1  0  0  0  0    1  0  0  0  0  0 2022-11-01 00:00:00
## 2568 45  0  0  1  0  0  0  0    1  0  0  0  0  0 2022-11-01 01:00:00
##                       HE    hpa   hpa0 pr hm  hm1h  ws ws1h ws_max rm rm1h   tp
## 2563 2022-11-02 00:00:00 1015.9 1018.8  0 84 81.33 0.4 1.68    1.9  0    0 13.9
## 2564 2022-11-01 12:00:00 1019.7 1022.6  0 60 60.17 2.1 2.20    4.4  0    0 16.6
## 2565 2022-11-01 13:00:00 1018.5 1021.4  0 60 61.50 2.4 2.98    4.4  0    0 17.1
## 2566 2022-11-01 14:00:00 1018.0 1020.9  0 62 62.17 1.7 2.02    4.0  0    0 17.3
## 2567 2022-11-01 01:00:00 1023.1 1026.0  0 74 76.83 2.3 2.72    3.5  0    0 12.8
## 2568 2022-11-01 02:00:00 1023.2 1026.2  0 74 74.83 2.2 2.10    4.7  0    0 12.2
##       tp1h  tp5h  tp3d  tp7d   wd.y wd_max              missing
## 2563 14.32 14.83 14.41 14.15 東南東 北北西                     
## 2564 16.55 14.85 14.60 13.96     北   北東                     
## 2565 16.83 15.60 14.54 13.98 北北西 北北西                     
## 2566 17.33 16.32 14.49 14.00     北     北                     
## 2567 12.73 13.51 14.75 13.88   北西   北西                     
## 2568 12.37 13.19 14.76 13.88 北北西     北
#View(d)

# グラフ
MAIN <- 'アイスクリーム月間世帯支出'
matplot(d$px, d$y, type = 'o', pch = 16, lty =1, col = 2,
        main = MAIN, xlab = '年', ylab = '円')

d$gwfit <- NA
d$gwlwr <- NA
d$gwupr <- NA


# 訓練データの取得期間フラグ(ここでは予測日の前後1ヶ月間をとった)
is.67 <- '06-01' <= d$md & d$md <= '07-31'

# 訓練期間フラグ
is.tr <- '2014-01-01' <= d$date & d$date <= '2021-12-31'

# テスト期間フラグ
is.te <- '2022-01-01' <= d$date & d$date <= '2022-11-01'

# グラフ表示期間フラグ
is.plot <- '2022-06-28' <= d$date & d$date <= '2022-11-01'
d.plot <- d[is.plot, ] # グラフ表用データ
d$yfit <- NA
d$ylwr <- NA
d$yupr <- NA

is.tr <- '2014-06-01' <= d$date & d$date <= '2021-12-31'

is.te <- '2022-01-01' <= d$date & d$date <= '2022-11-30'

is.plot <- '2014-06-01' <= d$date & d$date <= '2022-11-30'
d.plot <- d0[is.plot, ]

for (mon in 1:11)
  
{
is.mon <- d$month == mon

d.tr <- d[is.mon & is.tr, ]
d.te <- d[is.mon & is.te, ]

fit <- lm(y ~ year, data = d.tr)
summary(fit)

pred <- predict(fit, newdata = d.te, interval = 'prediction')

d$yfit[d.te$px %in% d.te$px] <- pred[, 'fit']
d$ylwr[d.te$px %in% d.te$px] <- pred[, 'lwr']
d$yupr[d.te$px %in% d.te$px] <- pred[, 'upr']

matplot(d$px[is.mon & is.plot], d$y[is.mon & is.plot],
        main = paste(MAIN, ' (',mon, '月) '), xlab = '年', ylab = '円',
        type = 'o', pch = 16, col = 2, ylim = c(300, 2000))

abline(v = as.POSIXct('2022-01-01'), col = 3, lty = 2)

matlines(d.te$px, pred[, 'fit'], type = 'o', pch = 1, lty = 2, col = 4)
matlines(d.te$px, pred[, 'lwr'], lty = 3, col = 'lightgray')
matlines(d.te$px, pred[, 'upr'], lty = 3, col = 'lightgray')


legend('topleft', bg = 0,
       lty = c(1, 2, 3), pch = c(16, 1, NA), col = c(2, 4, 'lightgray'),
       legend = c('原系列', '予測値', '95%予測区間'))
legend('topright', bg = 0,
       legend = sprintf('MAPE: %2.1f%%', 
                        mean(abs((pred[, 'fit'] - d.te$y)/d.te$y))*100))
}