if (!require(plotly))   install.packages("plotly")
##  要求されたパッケージ plotly をロード中です
## Warning: パッケージ 'plotly' はバージョン 4.3.3 の R の下で造られました
##  要求されたパッケージ ggplot2 をロード中です
## Warning: パッケージ 'ggplot2' はバージョン 4.3.3 の R の下で造られました
## 
##  次のパッケージを付け加えます: 'plotly'
##  以下のオブジェクトは 'package:ggplot2' からマスクされています:
## 
##     last_plot
##  以下のオブジェクトは 'package:stats' からマスクされています:
## 
##     filter
##  以下のオブジェクトは 'package:graphics' からマスクされています:
## 
##     layout
if (!require(quantmod)) install.packages("quantmod")
##  要求されたパッケージ quantmod をロード中です
## Warning: パッケージ 'quantmod' はバージョン 4.3.3 の R の下で造られました
##  要求されたパッケージ xts をロード中です
## Warning: パッケージ 'xts' はバージョン 4.3.3 の R の下で造られました
##  要求されたパッケージ zoo をロード中です
## Warning: パッケージ 'zoo' はバージョン 4.3.3 の R の下で造られました
## 
##  次のパッケージを付け加えます: 'zoo'
##  以下のオブジェクトは 'package:base' からマスクされています:
## 
##     as.Date, as.Date.numeric
##  要求されたパッケージ TTR をロード中です
## Warning: パッケージ 'TTR' はバージョン 4.3.3 の R の下で造られました
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
year  <- 2011:2017
sales <- c(1, 3, 2, 7, 3, 8, 7)
n <- length(year)
d <- data.frame(year, sales)
d
plot_ly(x = d$year, y = d$sales, type = "scatter", mode = "markers+lines") |>
  layout(title = "ロボット販売",
         xaxis = list(title = "会計年"),
         yaxis = list(title = "台数"))
cairo_pdf('robot_sales.pdf')
matplot(x = year, y = sales, type = 'o', pch = 1, col = 4,
        main = 'ロボット販売',
        xlab = '会計年',
        ylab = '台数')
grid()
dev.off()
## png 
##   2
d$ma3 <- NA # 値がNAの移動平均のカラム(ma3)を追加

for (i in 2:(n-1))
{
  d$ma3[i] <- (sales[i-1] + sales[i] + sales[i+1]) / 3
}

d$ma3
## [1] NA  2  4  4  6  6 NA
# filter関数を使用した(中心化)移動平均
ma3 <- stats::filter(sales, rep(1/3, 3))
ma3
## Time Series:
## Start = 1 
## End = 7 
## Frequency = 1 
## [1] NA  2  4  4  6  6 NA
# quantmodパッケージのrollmean関数を使用する場合
ma3 <- rollmean(sales, 3, na.pad = T)
ma3
## [1] NA  2  4  4  6  6 NA
# パッケージをロード
library(quantmod)  # rollmean の依存パッケージ
library(zoo)       # rollmean が含まれるパッケージ

# データ例
sales <- c(100, 150, 200, 250, 300, 350)

# 移動平均の計算
ma3 <- rollmean(sales, 3, na.pad = TRUE)

# 結果を表示
print(ma3)
## [1]  NA 150 200 250 300  NA
# filter関数を使用する場合
  ma4 <- stats::filter(sales, c(0.5/4, 1/4, 1/4, 1/4, 0.5/4))
  ma4
## Time Series:
## Start = 1 
## End = 6 
## Frequency = 1 
## [1]  NA  NA 200 250  NA  NA
# quantmodパッケージのrollmean関数を使用する場合
# 計算方法が異なり単純な4項の平均であるため中心が1つずれるので注意
  ma4 <- rollmean(sales, k = 4, na.pad = T)
  ma4
## [1]  NA 175 225 275  NA  NA
options(digits = 2)
d
plot_ly(type = "scatter", mode = "markers+lines") |>
  add_trace(x = d$year, y = d$sales, name = "台数") |>
  add_trace(x = d$year, y = d$ma3,   name = "3項移動平均") |>
  add_trace(x = d$year, y = d$ma4,   name = "4項移動平均") |>
  layout(title = "ロボット販売",
         xaxis = list(title = "会計年"),
         yaxis = list(title = "台数"))
library(zoo)

# データ例
year <- 2015:2020
sales <- c(100, 150, 200, 250, 300, 350)

# 移動平均を計算
d <- data.frame(
  year = year,
  sales = sales,
  ma3 = rollmean(sales, 3, na.pad = TRUE),
  ma4 = rollmean(sales, 4, na.pad = TRUE)
)

# cairo_pdf によるプロット
cairo_pdf('robot_sales_moving_average.pdf')

# プロット
matplot(x = d$year, y = cbind(d$sales), type = 'o', pch = 1,
        main = 'ロボット販売', xlab = '会計年', ylab = '台数')
grid()

# 移動平均をプロット
matlines(x = d$year, y = d$ma3, type = 'o', pch = 2, col = 2)
matlines(x = d$year, y = d$ma4, type = 'o', pch = 4, col = 4)

# 凡例
legend('topleft', col = c(1, 2, 4), pch = c(1, 2, 4), lty = 1,
       legend = c('台数', '3項移動平均', '4項移動平均'))

dev.off()
## png 
##   2