【Streamlit】時系列データ予測アプリ:Prophetの活用

Streamlit
この記事は約8分で読めます。

こんにちは、JS2IIUです。
今回はStreamlit上で時系列データ予測ができるアプリを構築していきます。MetaのProphetライブラリを活用した予測です。今回もよろしくお願いします。

1. はじめに

本記事は、Pythonで時系列データを予測するためのライブラリ「Prophet」を使って、デーモアプリをStreamlitで作成する手順を解説します。

時系列データは「時間の流れとともに変化するデータ」で、売上や気温、Webアクセス数など、実生活の認識にも関わる重要なデータの一種です。

2. Prophetとは?

ProphetはMeta (Facebook)が開発した、時系列データを簡単に予測できるライブラリです。特徴は以下のとおりです。

  • Python、Rで利用可
  • データはds(日付), y(値)の2列だけで使用可
  • 簡単なAPIで使える
  • トレンド、季節性、休日などをモデルに反映可
  • 簡易なティューニングなしでも使いやすい

本格的な予測機能を持つため、ビジネスでも中角の分析ツールとして使われています。

Quick Start | Prophet

3. 必要なライブラリのインストール

Python環境を用意したら、以下のコマンドでライブラリをインストールします:

Bash
pip install streamlit prophet pandas matplotlib

注意:Prophetは背後でpystancmdstanpyなどを使用しているため、環境によっては設定エラーになる場合があります。conda環境などを使うと広範囲に対応できます。

4. データの準備

Prophetで使うデータは、日付ds (はDateTime型)と値yの2列だけを持つ細長いテーブルのイメージです。

例:CSVファイルにdatevalueの列がある場合

Python
import pandas as pd

df = pd.read_csv("sample.csv")
df.rename(columns={"date": "ds", "value": "y"}, inplace=True)
df['ds'] = pd.to_datetime(df['ds'])  # 日付はdatetime型に

5. Prophetによる基本的な予測

ステップ 1:モデルの作成

Python
from prophet import Prophet

model = Prophet()
model.fit(df)

ステップ 2:未来日のデータを生成

Python
future = model.make_future_dataframe(periods=30)  # 30日分を予測

ステップ 3:予測の実行

Python
forecast = model.predict(future)

ステップ 4:予測結果の表示

Python
model.plot(forecast)

6. Prophetの主な機能

季節性の組み込み

  • Prophetは自動的に年次、月次の季節性を検出
  • 例:
Python
model = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=False)

Seasonality, Holiday Effects, And Regressors | Prophet

休日の指定

  • 国ごとの休日カレンダーを追加可
Python
model.add_country_holidays(country_name='JP')

Seasonality, Holiday Effects, And Regressors | Prophet

追加の季節性を自作

Python
model.add_seasonality(name='monthly', period=30.5, fourier_order=5)

要素分解プロット

Python
fig2 = model.plot_components(forecast)

7. Streamlitで時系列予測アプリを作成

Streamlitを使うと、ライブラリの内部処理を技術者でなくても操作できるようになります。

以下にベーシックなアプリの例を示します:

Python
import streamlit as st
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

st.title("時系列予測アプリ")
uploaded_file = st.file_uploader("CSVファイルをアップロード", type="csv")

if uploaded_file is not None:
    df = pd.read_csv(uploaded_file)
    df.rename(columns={"date": "ds", "value": "y"}, inplace=True)
    df['ds'] = pd.to_datetime(df['ds'])

    period = st.slider("予測期間(日)", min_value=1, max_value=365, value=30)

    model = Prophet()
    model.add_country_holidays(country_name='JP')
    model.fit(df)

    future = model.make_future_dataframe(periods=period)
    forecast = model.predict(future)

    fig1 = model.plot(forecast)
    st.pyplot(fig1)

    fig2 = model.plot_components(forecast)
    st.pyplot(fig2)

入力させるサンプルCSVデータ

こちらにCSVデータのサンプルをおきます。名前をつけて保存してください。

Plaintext
ds,y
2025-01-01,158
2025-01-02,138
2025-01-03,154
2025-01-04,124
2025-01-05,129
2025-01-06,130
2025-01-07,131
2025-01-08,141
2025-01-09,134
2025-01-10,154
2025-01-11,149
2025-01-12,170
2025-01-13,159
2025-01-14,150
2025-01-15,172
2025-01-16,144
2025-01-17,151
2025-01-18,133
2025-01-19,133
2025-01-20,141
2025-01-21,178
2025-01-22,179
2025-01-23,158
2025-01-24,148
2025-01-25,156
2025-01-26,132
2025-01-27,167
2025-01-28,157
2025-01-29,125
2025-01-30,137

このデータを生成するためのPythonコードも示します。

Python
import pandas as pd
import numpy as np

# 日付を生成
date_range = pd.date_range(start="2025-01-01", periods=30, freq="D")

# 適当な変動を加えた数値データを生成
values = np.random.randint(120, 180, size=30)

# DataFrame作成
df = pd.DataFrame({
    "ds": date_range,
    "y": values
})

# CSVとして保存
df.to_csv("sample_timeseries.csv", index=False)

8. まとめ

  • Prophetは、データの予測を簡単に行うことができる元Facebook製の強力なライブラリ
  • Streamlitを使うことで、実用的な予測Webアプリをコード少なめで完成できる
  • 少しのコード修正で、多様なビジネスに応用可能

9. 参考リンク

最後に書籍のPRです。
24年11月に第3版が発行された「scikit-learn、Keras、TensorFlowによる実践機械学習 第3版」、Aurélien Géron 著。下田、牧、長尾訳。機械学習のトピックスについて手を動かしながら網羅的に学べる書籍です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました