サイトアイコン アマチュア無線局JS2IIU

【Streamlit】時系列データの分析:トレンドラインの表示

こんにちは、JS2IIUです。

今回は時系列データの分析に役立つテクニックを紹介していきます。今回もよろしくお願いします。

はじめに

データを扱う上で「時系列データ」はとても重要なテーマです。日ごとの売上や月ごとのアクセス数など、時間の流れとともに変化するデータは、傾向を読み取ることで意思決定に役立てることができます。

本記事では、PythonとStreamlitを使って、時系列データをグラフに表示し、さらにトレンドライン(傾向線)を追加する方法を、初心者向けにわかりやすく解説します。

時系列データとは?

「時系列データ」とは、時間の経過とともに観測されたデータのことです。たとえば、以下のようなデータが当てはまります:

こうしたデータに対してトレンドラインを引くことで、全体として上昇傾向にあるのか、下降傾向にあるのかを視覚的に確認することができます。

開発環境の準備

まず、必要なPythonライブラリをインストールしましょう。以下のコマンドをターミナル(またはコマンドプロンプト)で実行してください:

Bash
pip install streamlit pandas numpy plotly scipy

これで、データ処理に使うpandasnumpy、グラフ描画に使うplotly、回帰分析に使うscipyなどが使えるようになります。

サンプルデータの作成

次に、時系列データのサンプルを作成します。今回は、ランダムな値を累積した「架空の売上データ」のようなデータを使います。

Python
import pandas as pd
import numpy as np

# 乱数のシードを固定(毎回同じ結果が出るように)
np.random.seed(0)

# 30日分の日付データを作成
dates = pd.date_range(start="2025-04-30", periods=30)

# ランダムな数値を累積して値を生成
values = np.random.normal(loc=100, scale=10, size=30)

# DataFrameにまとめる
df = pd.DataFrame({'Date': dates, 'Value': values})

これで、日付と数値からなる時系列データが作成できました。

出力例:

Plaintext
         Date       Value
0  2025-04-30  117.640523
1  2025-05-01  104.001572
2  2025-05-02  109.787380
3  2025-05-03  122.408932
4  2025-05-04  118.675580
5  2025-05-05   90.227221
6  2025-05-06  109.500884
7  2025-05-07   98.486428
8  2025-05-08   98.967811
9  2025-05-09  104.105985
10 2025-05-10  101.440436
11 2025-05-11  114.542735
12 2025-05-12  107.610377
13 2025-05-13  101.216750
14 2025-05-14  104.438632
15 2025-05-15  103.336743
16 2025-05-16  114.940791
17 2025-05-17   97.948417
18 2025-05-18  103.130677
19 2025-05-19   91.459043
20 2025-05-20   74.470102
21 2025-05-21  106.536186
22 2025-05-22  108.644362
23 2025-05-23   92.578350
24 2025-05-24  122.697546
25 2025-05-25   85.456343
26 2025-05-26  100.457585
27 2025-05-27   98.128161
28 2025-05-28  115.327792
29 2025-05-29  114.693588

Streamlitで時系列グラフを表示

次に、このデータをStreamlitを使って表示してみましょう。Streamlitのファイル(たとえば app.py)を以下のように作成します。

Python
import streamlit as st
import pandas as pd
import numpy as np
import plotly.graph_objects as go

# サンプルデータの生成(前のステップと同じ)
np.random.seed(0)
dates = pd.date_range(start="2025-04-30", periods=30)
values = np.random.normal(loc=100, scale=10, size=30)
df = pd.DataFrame({'Date': dates, 'Value': values})

st.title("時系列データの可視化")

# 折れ線グラフの表示
st.line_chart(df.set_index("Date"))

このコードを保存して、以下のコマンドで実行します:

Bash
streamlit run app.py

ブラウザが開き、30日分の時系列データが折れ線グラフとして表示されます。

トレンドラインを追加する

次に、このグラフに「トレンドライン」を追加してみましょう。トレンドラインは、データの傾向(上昇・下降)を線形回帰によって求めることができます。

ステップ1:トレンドラインの計算

scipy.statslinregress を使って、線形回帰を計算します。

Python
from scipy.stats import linregress

# x軸に使う数値(0, 1, 2, ..., 29)
x = np.arange(len(df))

# 線形回帰の実行
slope, intercept, _, _, _ = linregress(x, df["Value"])

# 回帰直線の値を計算
trend = intercept + slope * x

# DataFrameに追加
df["Trend"] = trend

ステップ2:グラフにトレンドラインを追加

plotly.graph_objects を使うと、複数の線を重ねたグラフを作成できます。

Python
fig = go.Figure()

# 実データの折れ線グラフ
fig.add_trace(go.Scatter(x=df["Date"], y=df["Value"], mode="lines", name=""))

# トレンドライン
fig.add_trace(go.Scatter(x=df["Date"], y=df["Trend"], mode="lines", name="トレンドライン", line=dict(dash='dash')))

# タイトルとレイアウトの設定
fig.update_layout(title="時系列データとトレンドライン", xaxis_title="日付", yaxis_title="")

# Streamlitで表示
st.plotly_chart(fig)

完成したStreamlitアプリの全コード

以下は、トレンドライン付きの時系列グラフを表示するStreamlitアプリの全体コードです。

Python
# app.py

import streamlit as st
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from scipy.stats import linregress

# データ生成
np.random.seed(0)
dates = pd.date_range(start="2025-04-30", periods=30)
values = np.random.normal(loc=100, scale=10, size=30)
df = pd.DataFrame({'Date': dates, 'Value': values})

# トレンドラインの計算
x = np.arange(len(df))
slope, intercept, _, _, _ = linregress(x, df["Value"])
df["Trend"] = intercept + slope * x

# グラフ作成
fig = go.Figure()
fig.add_trace(go.Scatter(x=df["Date"], y=df["Value"], mode="lines", name=""))
fig.add_trace(go.Scatter(x=df["Date"], y=df["Trend"], mode="lines", name="トレンドライン", line=dict(dash='dash')))
fig.update_layout(title="時系列データとトレンドライン", xaxis_title="日付", yaxis_title="")

# Streamlitアプリ表示
st.title("時系列データの分析:トレンドラインの表示")
st.plotly_chart(fig)

実行コマンド:

Bash
streamlit run app.py

応用ポイント(おまけ)

このアプリはさらに発展させることも可能です:

まとめ

この記事では、Streamlitを使って時系列データを可視化し、トレンドラインを表示する方法を解説しました。

トレンドラインは、データの傾向を視覚的に理解するうえでとても有用な手法です。Streamlitと組み合わせれば、Pythonの知識だけで簡単にインタラクティブな分析ツールを作成できます。

参考リンク

最後に書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。Poetryについても詳しく説明されています。ぜひ手に取ってみてください。

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

モバイルバージョンを終了