06.7.6
カレンダーヒートマップで季節リズムを俯瞰
(weekday, week_of_month) の座標に変換して np.full((7, 6), np.nan) の行列に書き込み、ax.imshow で塗る処理です。読み終えると、12 枚のパネルから「夏に明るく、週末だけ暗い」というパターンを読み取り、自分の日次データを同じ座標変換で描けるようになります。直感 #
サイトの平均滞在時間を 1 日ごとに 1 年分記録したとします。366 点の折れ線にすると、季節の大きなうねりと曜日ごとの小さな上下が混ざって、どちらも読みづらくなります。カレンダーヒートマップは、壁掛けカレンダーのように月ごとに 7 行(月〜日)× 6 列(第 1〜6 週)のマスを作り、各日のマスを値の大きさで色付けします。すると「土日の行だけ暗い」という曜日パターンは横縞に、「6 月と 7 月のパネル全体が明るい」という季節パターンは月ごとの色調の差として、別々の形で見えてきます。
Python で描く #
次のコードは、季節成分(振幅 25 の正弦波)と曜日成分(平日 +8、週末 −10)とノイズを混ぜた架空の滞在時間を作り、日付を「曜日 × 月内の週番号」の座標に変換して、12 か月分のヒートマップを 3 × 4 のグリッドに並べます。カラーバーの範囲を全パネルで共通にして、月をまたいだ色の比較ができるようにしています。
| |

実行結果の読み方 #
各パネルの上 5 行(月〜金)が明るく、下 2 行(土・日)が暗い横縞が全月に出ていれば、平日偏重の利用パターンが曜日効果として読めます。パネルどうしを見比べると、6 月や 7 月のパネルが全体に黄色寄り、12 月や 1 月が紫寄りになっており、これが季節成分です。特定の週だけ突出して明るいマスがあれば、その週にキャンペーンや障害があったかを calendar_df の日付と照らし合わせて確認できます。
何が起きているか(ステップで見る) #
コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。
見るポイント:曜日ごとに色分け・平均すると、ノイズに隠れた週のパターンが取り出せる。
使いどころと落とし穴 #
カレンダーヒートマップは、1 年前後の日次データで曜日効果と季節効果を同時に確認したいときの図です。2 年以上を描くと 24 枚以上のパネルが並んで比較しにくくなるので、その場合は月や週で resample して折れ線に切り替えるか、年ごとに図を分けます。極端な外れ値があると vmax に引っ張られて他の日がすべて暗くなるため、np.percentile で上下 2% をクリップしてから色を割り当ててください。欠損日を 0 で埋めると「値が極端に低い日」と区別できないので、この例のように NaN のままにして透明(または cmap.set_bad("#e5e7eb") でグレー)にするのが正しい扱いです。
- 相関ヒートマップ — 変数間の相関を色で一覧
- コホートヒートマップ — 獲得月×経過月の継続率を色で表示
- タイルマップ — 地域スコアを正方形グリッドで比較