広告 統計学基礎

時系列解析の基礎と応用|データの変動パターンを理解し予測に活かす方法

2025年1月18日

時系列データは、時間の経過とともに変化するデータのことであり、売上・株価・気象データ・センサーデータ など、さまざまな分野で活用されています。

時系列解析とは?
時系列解析は、データの傾向やパターンを分析し、将来の予測や異常検知を行うための手法 です。

✅ 時系列解析の主な目的

  • 過去のデータをもとに将来を予測する(売上予測・需要予測)
  • 季節性やトレンドを把握する(消費行動のパターン分析)
  • 異常値を検出し、異常なイベントを特定する(センサーデータの監視)

例えば、以下のようなデータを時系列解析で分析できます。

時間 売上(円)
2024-01-01 120,000
2024-01-02 125,000
2024-01-03 110,000
2024-01-04 130,000

このようなデータを解析することで、売上の増減パターンや将来の売上予測が可能になります

本記事では、時系列解析の基礎から応用まで詳しく解説し、Rを使った実装方法を紹介 します。

目次[非表示]

1. 時系列解析の基礎知識

時系列解析を行うには、まず時系列データの基本的な特性を理解し、適切な前処理を施すことが重要です。本章では、時系列データの定義、解析の目的、特徴(トレンド・季節性・ランダム変動)、および前処理の方法 について解説します。


1-1 時系列データとは?

時系列データとは、時間の経過とともに観測されたデータ のことです。

✅ 代表的な時系列データの例

  • 経済・金融データ:株価、為替レート、GDP
  • マーケティングデータ:売上、アクセス数、広告効果
  • 気象データ:気温、降水量、湿度
  • 医療・センサーデータ:心拍数、血圧、IoTデバイスの測定値

時系列データは、時間順に並んでいることが重要 であり、通常のデータ分析とは異なる手法が必要になります。


1-2 時系列解析の目的と活用例

時系列解析には、主に以下の3つの目的があります。

✅ ① 予測(Forecasting)

  • 過去のデータを基に未来の値を予測する
  • 例:来月の売上予測、株価の変動予測

✅ ② トレンド・季節性の分析

  • データの長期的な傾向や周期的なパターンを解析する
  • 例:夏場のエアコン販売の増加傾向

✅ ③ 異常値検出(Anomaly Detection)

  • データの中に通常とは異なる異常な変動がないかを調べる
  • 例:異常気象の検出、センサーデータの異常検知

1-3 時系列データの特徴(トレンド・季節性・ランダム変動)

時系列データには、以下の3つの主要な特徴があります。

✅ ① トレンド(Trend)

  • データが長期的に上昇・下降する傾向
  • 例:人口の増加、インフレによる価格上昇

✅ ② 季節性(Seasonality)

  • 一定の周期でパターンが繰り返される特性
  • 例:冬場の暖房需要の増加、週末の売上増加

✅ ③ ランダム変動(Noise)

  • 予測が困難な偶発的な変動
  • 例:災害や突発的な市場の変動

時系列データの分解(R)

# サンプル時系列データの作成
install.packages("ggplot2")
library(ggplot2)

# トレンドと季節性を含むデータをシミュレーション
time <- 1:100
trend <- time * 0.5  # 上昇トレンド
seasonality <- 10 * sin(time * 2 * pi / 12)  # 12周期の季節性
noise <- rnorm(100, mean = 0, sd = 3)  # ランダム変動
data <- trend + seasonality + noise

# 時系列データの可視化
df <- data.frame(time = time, value = data)
ggplot(df, aes(x = time, y = value)) +
  geom_line(color = "blue") +
  labs(title = "時系列データの特徴(トレンド+季節性+ランダム変動)",
       x = "時間", y = "値")

📌 このプロットを見ると、時系列データの中に「トレンド」「季節性」「ランダム変動」が含まれていることが分かる。

1-4 時系列データの前処理(欠損値処理・平滑化)

時系列データを分析する前に、データの品質を向上させる前処理 が必要になります。

✅ ① 欠損値の処理(補完・除去)
時系列データには欠損値が含まれることが多いため、適切に補完する必要があります。

Rでの欠損値処理

# NA(欠損値)の補完(線形補間)
install.packages("zoo")
library(zoo)
dataset$売上 <- na.approx(dataset$売上)

📌 線形補間(na.approx)を使うと、前後の値をもとに欠損値を補完できる。

✅ ② 異常値の処理
外れ値(異常値)があると、解析結果が大きく影響を受けるため、中央値や移動平均を用いた補正 を行う。

外れ値の補正(中央値ベース)

# 外れ値を中央値で置き換える
median_value <- median(dataset$売上, na.rm = TRUE)
dataset$売上[dataset$売上 > 1.5 * median_value] <- median_value

📌 異常に大きい値を中央値で置き換えることで、データの安定性を確保する。

✅ ③ 平滑化(移動平均)
移動平均を使うことで、短期的な変動を抑え、データの傾向を明確にすることができる。

移動平均の適用(R)

install.packages("TTR")
library(TTR)

# 移動平均(7日間)
dataset$売上_MA <- SMA(dataset$売上, n = 7)

📌 短期間のランダム変動を平滑化し、トレンドを明確にするために移動平均を適用する。

2. 代表的な時系列解析手法

時系列解析にはさまざまな手法があり、データの特性に応じて適切な手法を選択することが重要 です。本章では、移動平均法・指数平滑法・ARIMAモデル・SARIMAモデル・ホルト・ウィンターズ法 について解説します。

2-1 移動平均法と指数平滑法

✅ 移動平均法(Moving Average, MA)
移動平均法は、過去のデータを平均して値を滑らかにする手法 です。短期的な変動を抑え、トレンドを把握しやすくすることができます。

移動平均の計算(R)

install.packages("TTR")
library(TTR)

# 移動平均(7日間)
dataset$売上_MA <- SMA(dataset$売上, n = 7)

📌 短期間のランダム変動を平滑化し、トレンドを明確にするために移動平均を適用。

✅ 指数平滑法(Exponential Smoothing)
指数平滑法は、直近のデータにより大きな重みを与えることで、古いデータの影響を減らし、より適切な予測を行う手法 です。

指数平滑法の実装(R)

install.packages("forecast")
library(forecast)

# 単純指数平滑法
model_exp <- ses(dataset$売上, alpha = 0.2)

# 予測値を取得
forecast(model_exp, h = 10)

📌 指数平滑法は短期的なトレンドを捉えるのに適している。

2-2 AR(自己回帰)・MA(移動平均)・ARIMAモデル

✅ AR(自己回帰, Autoregressive)モデル

  • 現在の値が過去のデータの値をもとに決まるモデル
  • 例:今日の気温が昨日や一昨日の気温に影響される

✅ MA(移動平均, Moving Average)モデル

  • 過去の誤差項(ランダム変動)の影響を考慮するモデル
  • 例:売上データが過去の予測誤差の影響を受ける

✅ ARIMA(自己回帰和分移動平均)モデル

  • ARモデル + MAモデル + 差分(Differencing)を組み合わせた時系列モデル
  • データにトレンドがある場合、差分をとることで定常化し、適切なモデルを構築できる

ARIMAモデルの実装(R)

install.packages("forecast")
library(forecast)

# 時系列データを作成
ts_data <- ts(dataset$売上, frequency = 12)

# 最適なARIMAモデルを自動選択
model_arima <- auto.arima(ts_data)

# モデルの概要を確認
summary(model_arima)

# 未来10期間の予測
forecast_arima <- forecast(model_arima, h = 10)
plot(forecast_arima)

📌 auto.arima() を使うことで、最適なARIMAモデルを自動的に選択可能。

2-3 SARIMA(季節調整付きARIMA)とSARIMAXモデル

✅ SARIMA(Seasonal ARIMA)
SARIMAは、季節性(Seasonality)を考慮したARIMAモデル です。例えば、毎年同じ時期に売上が上がる場合(クリスマス商戦など)に適用 します。

✅ SARIMAX(SARIMA with Exogenous Variables)
SARIMAXは、外部説明変数(X)を考慮して時系列を予測するモデル です。例えば、経済指標や広告費が売上に与える影響をモデルに組み込むことが可能 です。

SARIMAの実装(R)

# SARIMAモデルの適用
model_sarima <- auto.arima(ts_data, seasonal = TRUE)

# 未来予測
forecast_sarima <- forecast(model_sarima, h = 12)
plot(forecast_sarima)

📌 SARIMAを使用すると、季節変動を考慮した予測が可能になる。

2-4 ホルト・ウィンターズ法(Holt-Winters)

✅ ホルト・ウィンターズ法とは?

  • トレンドと季節性を考慮した指数平滑法
  • ARIMAよりも計算が軽量で、短期予測に適している

ホルト・ウィンターズ法の実装(R)

# ホルト・ウィンターズ法の適用
model_hw <- HoltWinters(ts_data)

# 未来予測
forecast_hw <- forecast(model_hw, h = 12)
plot(forecast_hw)

📌 ホルト・ウィンターズ法は、短期的な予測に有効であり、リアルタイムの意思決定にも活用可能。

3. Rを使った時系列解析の実装

ここでは、Rを用いて時系列データの解析を実践していきます。時系列データの可視化、トレンドと季節性の分解、ARIMAモデルによる予測、異常値検出 の手法を詳しく解説します。

3-1 時系列データの可視化(ggplot2・ts.plot)

時系列データの解析を始める前に、まずデータの可視化を行い、トレンドや季節性を視覚的に確認することが重要です。

時系列データのプロット(R)

# 必要なライブラリ
install.packages("ggplot2")
library(ggplot2)

# サンプル時系列データの作成
set.seed(123)
time <- 1:100
trend <- time * 0.5  # 上昇トレンド
seasonality <- 10 * sin(time * 2 * pi / 12)  # 12周期の季節性
noise <- rnorm(100, mean = 0, sd = 3)  # ランダム変動
data <- trend + seasonality + noise

# データフレームに変換
df <- data.frame(time = time, value = data)

# 時系列データのプロット
ggplot(df, aes(x = time, y = value)) +
  geom_line(color = "blue") +
  labs(title = "時系列データの可視化",
       x = "時間", y = "値")

📌 このプロットを確認することで、時系列データの基本的な構造(トレンド・季節性・ノイズ)を視覚的に把握できる。

3-2 トレンドと季節性の分解(STL分解)

時系列データをトレンド成分・季節成分・残差成分(ノイズ) に分解することで、それぞれの要素の影響を明確にすることができます。

STL分解(R)

install.packages("forecast")
library(forecast)

# 時系列データの作成
ts_data <- ts(data, frequency = 12)

# STL分解の実施
stl_decomp <- stl(ts_data, s.window = "periodic")

# 分解結果のプロット
plot(stl_decomp)

✅ STL分解を行うと、データの長期的なトレンドと周期的なパターンを分けて解析できる
✅ 「周期性が強いのか?」「トレンドの影響が大きいのか?」を評価し、適切なモデルを選択するのに役立つ

3-3 ARIMAモデルの適用と予測(auto.arima)

ARIMAモデルを使って、過去のデータをもとに将来の値を予測します。auto.arima() 関数を利用すると、最適なARIMAモデルを自動選択 できます。

ARIMAモデルの実装(R)

# ARIMAモデルの適用
model_arima <- auto.arima(ts_data)

# モデルの概要を確認
summary(model_arima)

# 未来10期間の予測
forecast_arima <- forecast(model_arima, h = 10)
plot(forecast_arima)

📌 ARIMAモデルを使用すると、将来のデータの推定値を確率的に予測できる。
📌 時系列データがトレンドやランダム変動を含む場合に有効な手法。

3-4 異常値検出と時系列異常解析

時系列データでは、異常な値(例外的なイベントや異常な変動)を検出することが重要 です。異常値を見つけることで、異常な出来事(不正検出、異常気象など)を特定 できます。

異常値検出(R)

install.packages("anomalize")
library(anomalize)

# データフレームの作成
df <- data.frame(date = seq(as.Date("2023-01-01"), by = "day", length.out = length(data)),
                 value = data)

# 異常値検出の実施
df_anomalized <- df %>%
  as_tibble() %>%
  time_decompose(value, method = "stl") %>%
  anomalize(remainder, method = "iqr") %>%
  time_recompose()

# 異常値を可視化
plot_anomalies(df_anomalized, time_recomposed = TRUE)

📌 異常値(急激な変動)が発生したポイントを特定できる。
📌 センサーデータの異常検出、金融データの異常取引の検出などに応用可能。

4. 時系列解析の応用と実例

時系列解析は、ビジネス・金融・気象・IoTデータ など幅広い分野で活用されています。本章では、具体的な応用例として、売上予測・経済・金融データの分析・気象データの解析・IoTセンサーデータの時系列解析 について解説します。


4-1 売上予測と在庫管理への応用

✅ 問題設定

  • 小売業やECサイトでは、売上データのパターンを把握し、将来の売上を予測することが重要
  • 売上の増減を予測することで、適切な在庫管理・仕入れ計画の立案が可能

✅ 適用手法

  • ARIMAモデル:過去の売上データをもとに将来の売上を予測
  • ホルト・ウィンターズ法:トレンドと季節性を考慮して売上を予測

売上予測の実装(R)

install.packages("forecast")
library(forecast)

# 売上データの時系列オブジェクト作成
sales_ts <- ts(dataset$売上, frequency = 12)

# ARIMAモデルを適用
sales_model <- auto.arima(sales_ts)

# 6ヶ月先までの売上予測
sales_forecast <- forecast(sales_model, h = 6)
plot(sales_forecast)

📌 予測結果をもとに、仕入れやマーケティング戦略を調整できる。


4-2 経済・金融データの分析(株価・為替レート予測)

✅ 問題設定

  • 株価や為替レートはランダムウォークに近いため、短期的な予測は難しい
  • トレンドや異常値を検出することで、市場の動向を把握することが重要

✅ 適用手法

  • 移動平均法(SMA):価格変動のトレンドを確認
  • GARCHモデル:ボラティリティ(変動性)の解析

株価の移動平均の計算(R)

install.packages("quantmod")
library(quantmod)

# 株価データを取得(例:Appleの株価)
getSymbols("AAPL", src = "yahoo")

# 株価の移動平均を計算
AAPL$SMA_50 <- SMA(Cl(AAPL), n = 50)
AAPL$SMA_200 <- SMA(Cl(AAPL), n = 200)

# 移動平均を可視化
chartSeries(AAPL, theme = chartTheme("white"))
addSMA(n = 50, col = "blue")
addSMA(n = 200, col = "red")

📌 株価の短期トレンド(50日移動平均)と長期トレンド(200日移動平均)を比較し、売買戦略を考察できる。


4-3 気象データの解析と予測(気温・降水量予測)

✅ 問題設定

  • 気象データ(気温・降水量・風速など)は時間とともに変化するため、時系列解析が有効
  • 気象予測を通じて、農業・観光業・エネルギー業界に貢献

✅ 適用手法

  • SARIMAモデル:季節性を考慮した気温予測
  • LSTM(長短期記憶ニューラルネットワーク):深層学習による予測

気温の予測(R)

# 気温データの作成(例)
temperature_ts <- ts(dataset$気温, frequency = 365)

# SARIMAモデルを適用
temp_model <- auto.arima(temperature_ts, seasonal = TRUE)

# 30日先の気温予測
temp_forecast <- forecast(temp_model, h = 30)
plot(temp_forecast)

📌 SARIMAを使うことで、気温データの周期性を考慮した予測が可能。


4-4 IoT・センサーデータの時系列解析

✅ 問題設定

  • IoTセンサーデータ(温度・湿度・振動・電力消費量など)は、リアルタイムでデータが蓄積される
  • 異常値を検出することで、機器の故障や異常を早期発見できる

✅ 適用手法

  • 異常値検出(IQR・STL分解):通常とは異なる異常なデータポイントを特定
  • 自己回帰モデル(AR):センサーデータの傾向を解析

IoTセンサーデータの異常値検出(R)

install.packages("anomalize")
library(anomalize)

# データフレームの作成
df <- data.frame(time = seq(1, 100), value = data)

# 異常値検出の実施
df_anomalized <- df %>%
  as_tibble() %>%
  time_decompose(value, method = "stl") %>%
  anomalize(remainder, method = "iqr") %>%
  time_recompose()

# 異常値を可視化
plot_anomalies(df_anomalized, time_recomposed = TRUE)

📌 機械の異常検知や設備の保守点検に活用できる。

5. Q&A(よくある質問)

時系列解析に関するよくある質問とその回答をまとめました。


Q1. 時系列データに外れ値がある場合、どのように対処すべきか?

A. 外れ値は解析結果に大きな影響を与えるため、適切に処理する必要があります。
以下の方法が一般的です。

✅ 外れ値の特定方法(R)

install.packages("tsoutliers")
library(tsoutliers)

# ARIMAモデルを用いた外れ値の検出
outlier_detection <- tso(ts_data)
plot(outlier_detection)

📌 ARIMAモデルを用いて外れ値を検出し、適切な補正を行うことが可能。

✅ 外れ値の処理方法

  1. 削除(特定の基準で除外)
  2. 補完(前後の値を利用して線形補間)
  3. ロバスト統計(中央値や四分位範囲を利用)

Q2. 時系列解析を行う際に、データを定常化する必要があるのはなぜか?

A. 時系列データが非定常(トレンドや季節性を含む) の場合、そのままでは適切な回帰分析ができません。
定常化することで、時系列データの分布が時間によって変わらないように調整 できます。

✅ データの定常化方法

  1. 差分(Differencing) をとる
diff_ts <- diff(ts_data)
plot(diff_ts)

対数変換(Log Transformation) を行う

log_ts <- log(ts_data)

3.Box-Cox変換を適用

lambda <- BoxCox.lambda(ts_data)
bc_ts <- BoxCox(ts_data, lambda)

📌 非定常データを定常化することで、ARIMAなどの時系列モデルが適用しやすくなる。


Q3. ARIMAとSARIMAの違いは?

A. ARIMAとSARIMAの違いは、季節性(Seasonality)を考慮するかどうか にあります。

モデル 特徴 適用例
ARIMA トレンドとランダム変動を考慮 売上予測、経済データ
SARIMA ARIMA + 季節性を考慮 気温・降水量、消費動向

✅ SARIMAモデルの実装(R)

sarima_model <- auto.arima(ts_data, seasonal = TRUE)
forecast(sarima_model, h = 12) %>% plot()

📌 季節性のあるデータにはSARIMAを使用することで、より精度の高い予測が可能。


Q4. 時系列解析は機械学習と組み合わせることはできるか?

A. はい、機械学習と組み合わせることで、より高度な時系列予測が可能です。

✅ 機械学習を活用した時系列予測

  1. LSTM(長短期記憶ネットワーク)
    • 深層学習を用いた時系列データの予測
  2. ランダムフォレスト(Random Forest)
    • 外部要因を加味した時系列回帰
  3. XGBoost
    • 勾配ブースティングを用いた時系列回帰

📌 機械学習の適用には、特徴量エンジニアリングが重要!


Q5. RとPythonのどちらで時系列解析を行うべきか?

A. RとPythonのどちらでも時系列解析は可能ですが、用途に応じて選択 するとよいでしょう。

言語 強み 適用例
R 統計解析が強い、ARIMAやSARIMAが簡単に使える 統計解析、金融データ分析
Python 機械学習との相性が良い、LSTMやXGBoostが使える AI時系列予測、IoT解析

📌 統計モデルが中心ならR、機械学習と組み合わせるならPythonが適している。


6. まとめ

本記事では、時系列解析の基礎から応用、Rでの実装方法 まで詳しく解説しました。

✅ 時系列解析のポイント

  • 時系列データには、トレンド・季節性・ランダム変動がある
  • ARIMA・SARIMA・指数平滑法などの手法を適用し、将来の予測を行う
  • 異常値検出やデータの定常化を適切に行うことで、解析精度を向上できる

✅ 時系列解析の応用

  • 売上予測:ARIMAを用いた売上のトレンド分析
  • 株価分析:移動平均やGARCHモデルによるボラティリティ解析
  • 気象データ解析:SARIMAを用いた気温・降水量の予測
  • IoT解析:異常検知アルゴリズムによるセンサーデータ解析

📌 時系列解析を活用することで、より精度の高い予測やデータ分析が可能になります。本記事を参考に、ぜひRで時系列解析を実践してみてください!

-統計学基礎

S