K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

スパイラルプロットで年内の周期を描き出す

上級

06.7.15

スパイラルプロットで年内の周期を描き出す

最終更新 2020-08-12 読了時間 2 分
まとめ
スパイラルプロットは、時系列を極座標に置き、一定の日数で一周する角度と時間とともに少しずつ伸びる半径で螺旋状に描いて、周期パターンを「同じ角度に繰り返し現れる形」として見せる図です。一周を 7 日にすれば曜日、30 日にすれば月内の周期が角度方向に揃い、折れ線では見落とす繰り返しが円の上で重なって見えます。実装は 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 等分の位置に月のラベルを置きます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
import matplotlib.pyplot as plt

days = np.arange(365)
theta = 2 * np.pi * days / 30  # 30日ごとに一周
r = 5 + 0.01 * days + 1.2 * np.sin(2 * np.pi * days / 7)
rng = np.random.default_rng(12)
r += rng.normal(0, 0.3, size=days.size)

fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111, projection="polar")
ax.plot(theta, r, color="#38bdf8", linewidth=1.2)
ax.fill_between(theta, 0, r, color="#bae6fd", alpha=0.5)

ax.set_theta_zero_location("N")
ax.set_theta_direction(-1)
ax.set_rticks([5, 7, 9])
ax.set_title("2024年 日次ユーザー滞在時間のスパイラルプロット", pad=16)

month_ticks = np.linspace(0, 2 * np.pi, 12, endpoint=False)
for idx, ang in enumerate(month_ticks):
    ax.text(ang, r.max() + 0.6, f"{idx + 1}月", ha="center", va="center")

fig.tight_layout()

plt.show()

極座標に変換するだけでユニークな可視化ができますの図

実行結果の読み方 #

中心から外に向かって約 12 周する螺旋で、内側が年初、外側が年末です。半径が外へ膨らんでいる方向が値の大きい期間で、0.01 * days のトレンドによって外周ほど全体に太くなります。周期 7 日の波は、一周 30 日の螺旋上では約 4.3 個の山として現れ、周ごとに少し回転するので放射状の縞模様がわずかにねじれて見えます。実データで一周の日数を周期候補(7、30、365)に変えて描き、縞が最もきれいに放射状に揃う日数が、そのデータの支配的な周期です。

使いどころと落とし穴 #

スパイラルプロットは、年単位や月単位の周期性を螺旋の重なりとして見せ、「毎年同じ時期に起きるか」を 1 枚で確かめる探索用の図です。螺旋の内側と外側では同じ角度幅でも弧の長さが違うため、内周の 1 日は短く外周の 1 日は長く描かれ、面積による値の比較は歪みます。正確な比較が必要なら年ごとに ax.plot の折れ線を重ねる方が確実です。螺旋という形に馴染みのない読者が多いので、「真上が 1 日目、時計回りに 30 日で一周、外側が新しい」という読み方を凡例か注釈で必ず添えてください。