コンテンツにスキップ

第11回: インタラクティブ時系列チャート

資料のダウンロード

ファイル 内容
exercise.py ハンズオン演習スクリプト

ヒントの使い方

python exercise.py --hint 1            # 方向性ヒント
python exercise.py --hint 1 --level 2  # より具体的なヒント
python exercise.py --hint 1 --level 3  # コード例
python exercise.py --check             # 提出前の自己チェック

演習問題への取り組み方

  1. 下の講義ノートを読む(事前学習・2時間目安)
  2. exercise.py を実行してグラフを確認する
  3. 演習問題(5問)に取り組む
  4. python exercise.py --check で確認する
  5. exercise.py を提出する(締切は授業後1週間)

詰まったとき

# ヒントを見る
python exercise.py --hint N --level 1

# AIに質問する
python ../../ask.py "質問内容"

解決しない場合は Q&A ページの投稿フォームを使ってください。


講義ノート

1. 時系列データとは何か

時系列データとは、ある量が時間の経過とともにどのように変化するかを記録したデータである。本講義のデータセットでは、50の都市地点それぞれについて週次で収集された幸福感スコア・ストレススコア・感情極性スコアが該当する。

時系列データを分析するうえで注目すべき要素は大きく三つある。

トレンド(trend)は長期的な増減方向を指す。気温が春から夏にかけて上昇する、あるいは特定地点の来訪者数が月を追うごとに増加するといった動きがこれにあたる。トレンドの把握には移動平均や折れ線グラフが有効である。

季節性(seasonality)は一定周期で繰り返すパターンを指す。春・夏・秋・冬の気候変動や、週末と平日の人流差などが典型例である。本データでは2024年4月から9月の6ヶ月分を扱うため、春から夏にかけての緩やかな季節変動が観察できる。

外れ値・異常値(outlier / anomaly)は周囲のデータ点から大きく外れた観測値である。測定エラーの場合もあるが、何らかの特異なイベント(祭り、大規模工事、悪天候など)を反映していることも多く、それ自体が重要な知見になりえる。本演習では平均±2σを超えた週を異常値として赤丸でマークする。


2. 静的グラフ vs インタラクティブグラフ

静的グラフ(matplotlib / seaborn)

静的グラフはPNG・PDFとして書き出せるため、論文・レポートへの埋め込みに適している。コードがシンプルで再現性が高く、ファイルサイズも小さい。ただし、ズームやフィルタリングを行うには毎回コードを書き直す必要があり、探索的分析の効率が低い。

インタラクティブグラフ(Plotly)

Plotlyが生成するHTMLファイルはブラウザ単体で動作し、以下の操作がコードなしで行える。

  • マウスホバーで数値を確認する
  • ドラッグでズームイン・ズームアウトする
  • 凡例クリックで特定のトレースを表示/非表示にする
  • ボタンやドロップダウンでグラフの内容を切り替える

探索的データ分析(EDA)の段階では、インタラクティブグラフを使って「どこに興味深いパターンがあるか」を素早く把握し、重要な発見を静的グラフで丁寧に仕上げる、という流れが実務でも一般的である。


3. Plotlyのインタラクティブ機能一覧

3.1 基本操作(自動で付与される機能)

操作 内容
ホバー データ点の値をツールチップ表示
ドラッグ 矩形領域を指定してズーム
ダブルクリック ズームのリセット
凡例クリック トレースの表示/非表示切り替え
右上のモードバー 保存・ズーム・パンなどのモード切替

3.2 コードで追加できる機能

rangeselector(範囲選択ボタン)は「1ヶ月」「3ヶ月」「全期間」などのボタンをX軸の上部に表示し、クリックするだけで表示期間を変更できる。

xaxis=dict(
    rangeselector=dict(
        buttons=[
            dict(count=1, label="1ヶ月", step="month", stepmode="backward"),
            dict(step="all", label="全期間"),
        ]
    ),
    rangeslider=dict(visible=True),  # X軸下部のミニマップ
)

updatemenus(ボタン/ドロップダウン)はグラフの内容を動的に切り替える。"update" メソッドを使うと、トレースの可視性(visible)とレイアウトのプロパティを同時に変更できる。

updatemenus=[dict(
    buttons=[
        dict(label="公園", method="update",
             args=[{"visible": [True, False, ...]}, {"title": "公園の推移"}]),
        dict(label="駅前", method="update",
             args=[{"visible": [False, True, ...]}, {"title": "駅前の推移"}]),
    ],
    direction="down",
)]

fill="toself"(信頼帯)は上限・下限の座標を結んで塗りつぶし領域を作成し、±2σの帯を表現できる。


4. 探索的データ分析(EDA)のアプローチ

EDAとは、仮説を持たない状態でデータを多角的に眺め、興味深いパターンや問いを発見するプロセスである。時系列データに対するEDAの典型的な手順を示す。

ステップ1: 全体像の把握 まず全地点・全指標を合算した週次平均を折れ線で描く。期間全体でのトレンドと、大きな変動があった週を確認する。

ステップ2: グループ別の比較 場所種別(公園・駅前など)でグループを分け、グループ間の差異を比較する。ここでドロップダウンフィルタリングが有効になる。

ステップ3: 異常値の特定と解釈 平均±2σを超えた週をマークし、「なぜその週だけ値が大きく外れているか」を考察する。外れ値の発生時期とイベント(連休、気象異常など)を照合することで、因果関係の仮説が生まれる。

ステップ4: 指標間の関係性の確認 happiness_scoreが高い週にsentiment_scoreも高いか、stress_scoreとはどのような関係にあるかを確認する。相関が強い指標は冗長である可能性があり、弱い相関は独立した情報を持つことを示唆する。

ステップ5: 仮説の言語化 EDAで発見したパターンを「○○が高い地点では△△も高い傾向がある」という形で言語化する。この仮説が次の統計的検定や機械学習モデルの出発点になる。


5. 本日の演習の目的

本演習では exercise.py を実行し、生成された output.html をブラウザで操作しながら以下を体験する。

  1. ドロップダウンで場所種別を切り替え、グループ間の差異を観察する
  2. rangeselectorで期間を絞り込み、季節変動の細部を確認する
  3. 赤丸(異常値マーカー)が現れる週に注目し、どの種別で多いかを比較する
  4. 指標を切り替え、happiness/stress/sentimentの連動性を確かめる
  5. 演習問題Q5で自らコードを書き、グラフを拡張する

インタラクティブ可視化の「すぐ動かして試せる」という強みを最大限に活かし、コードの微修正とグラフの観察を繰り返す習慣を身につけてほしい。