06.7.15
スパイラルプロットで年内の周期を描き出す
theta = 2 * np.pi * days / 30 で角度、r = 5 + 0.01 * days + ... で外へ広がる半径を作り、projection="polar" の軸に ax.plot(theta, r) と fill_between で描くだけです。読み終えると、周期 7 日の波が一周 30 日の螺旋上でどう見えるかを理解し、一周の日数を自分のデータの周期候補に合わせて変えながら季節性を探せるようになります。直感 #
1 年分の日次データを折れ線にすると 365 点が横に並び、「毎週末に落ち込む」「月末に跳ねる」のような繰り返しは細かいギザギザに埋もれます。スパイラルプロットは時計の針のように時間を角度で回し、1 日経つごとに針を少し進め、同時に半径もわずかに伸ばします。一周を 30 日にすれば、各月の 1 日はいつも同じ方向(真上)に来るので、月初に毎回起きることは同じ角度に線の膨らみとして重なって見えます。半径が外に向かって広がるので、12 周した螺旋の内側が年初、外側が年末で、長期のトレンドは螺旋全体の太り方として読めます。
Python で描く #
次のコードは、1 日 0.01 ずつ増える上昇トレンドと周期 7 日の正弦波とノイズを合わせた 365 日分の値を作り、30 日で一周する螺旋として極座標に描きます。真上を 0 度、時計回りに進むよう向きを設定し、12 等分の位置に月のラベルを置きます。
| |

実行結果の読み方 #
中心から外に向かって約 12 周する螺旋で、内側が年初、外側が年末です。半径が外へ膨らんでいる方向が値の大きい期間で、0.01 * days のトレンドによって外周ほど全体に太くなります。周期 7 日の波は、一周 30 日の螺旋上では約 4.3 個の山として現れ、周ごとに少し回転するので放射状の縞模様がわずかにねじれて見えます。実データで一周の日数を周期候補(7、30、365)に変えて描き、縞が最もきれいに放射状に揃う日数が、そのデータの支配的な周期です。
使いどころと落とし穴 #
スパイラルプロットは、年単位や月単位の周期性を螺旋の重なりとして見せ、「毎年同じ時期に起きるか」を 1 枚で確かめる探索用の図です。螺旋の内側と外側では同じ角度幅でも弧の長さが違うため、内周の 1 日は短く外周の 1 日は長く描かれ、面積による値の比較は歪みます。正確な比較が必要なら年ごとに ax.plot の折れ線を重ねる方が確実です。螺旋という形に馴染みのない読者が多いので、「真上が 1 日目、時計回りに 30 日で一周、外側が新しい」という読み方を凡例か注釈で必ず添えてください。
- カレンダーヒートマップ — 年間の日別指標を曜日×週で俯瞰
- 極座標の面積チャート — 円形配置で季節性や周期を俯瞰
- ストリームグラフ — 構成比の推移を上下対称の波で表現