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

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

言語 JA

サークルマトリクスで指標推移を一望する

05.2.2

サークルマトリクスで指標推移を一望する

最終更新 2020-02-12 読了時間 3 分
まとめ
サークルマトリクスは、行に銘柄、列に四半期を並べ、各マスに「前期比の値を色にした円」を置く図です。このページでは AAA・BBB・CCC の 3 銘柄について 2023Q1〜Q8 の EPS 前期比と売上前期比を用意し、ax.scatter に TwoSlopeNorm(vmin=-0.15, vcenter=0.0, vmax=0.25) と cmap="RdYlGn" を渡して、プラス成長を緑、マイナス成長を赤に塗り分けます。EPS と売上を同じ行の上下に 0.3 ずらして重ねるので、「利益だけ伸びて売上は横ばい」のような組み合わせも円 2 つの色の差として見えます。読み終えると、24 マス × 2 指標 = 48 個の数値を表で追う代わりに、赤い円が続く銘柄を 1 秒で見つけられるようになります。

直感 #

四半期ごとに変化するEPSや売上の伸び率は、表形式よりも色と配置で見せるとトレンドがつかみやすくなります。3 銘柄 × 8 四半期 × 2 指標の 48 個の前期比を表にすると、どこで成長が鈍ったかを見つけるには 1 つずつ読むしかありません。ここでは銘柄×指標×四半期の3軸をサークルマトリクスで描き、どこで成長が加速・減速したのかを直感的に把握できるグラフを作ります。色の境目を 0 に固定することで、円が赤ならマイナス、緑ならプラスという読み方が全マスで共通になります。

Python で描く #

次のコードは、人工的に作った 3 銘柄 × 8 四半期の前期比データから、EPS と売上を 2 段重ねにしたサークルマトリクスを描き、SVG として保存します。

 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import TwoSlopeNorm
from pathlib import Path

plt.style.use("scripts/k_dm.mplstyle")

data = pd.DataFrame(
    {
        "company": ["AAA"] * 8 + ["BBB"] * 8 + ["CCC"] * 8,
        "quarter": list(range(1, 9)) * 3,
        "eps_growth": [
            0.12, 0.18, 0.05, -0.08, 0.03, 0.11, 0.16, 0.21,
            0.04, -0.12, 0.08, 0.15, 0.02, 0.05, 0.09, 0.12,
            0.20, 0.24, 0.18, 0.12, 0.08, 0.05, 0.04, 0.06,
        ],
        "revenue_growth": [
            -0.05, 0.08, 0.12, 0.20, 0.06, 0.09, 0.14, 0.19,
            0.02, -0.06, 0.04, 0.11, 0.05, 0.07, -0.03, 0.02,
            0.18, 0.14, 0.10, 0.07, 0.12, 0.16, 0.09, 0.05,
        ],
    }
)

norm = TwoSlopeNorm(vmin=-0.15, vcenter=0.0, vmax=0.25)
companies = data["company"].unique()
metrics = [("eps_growth", "EPS"), ("revenue_growth", "Revenue")]

fig, ax = plt.subplots(figsize=(10, 5.5))

for idx, company in enumerate(companies):
    subset = data[data["company"] == company]
    for offset, (metric, label) in enumerate(metrics):
        y_position = idx + (offset - 0.5) * 0.3
        sc = ax.scatter(
            subset["quarter"],
            np.full(len(subset), y_position),
            c=subset[metric],
            cmap="RdYlGn",
            s=420,
            norm=norm,
            edgecolor="#1f2937",
            linewidth=0.5,
        )
        for q, val in zip(subset["quarter"], subset[metric]):
            ax.text(
                q + 0.12,
                y_position,
                f"{val:+.1%}",
                fontsize=10,
                va="center",
                ha="left",
            )
        ax.text(
            0.3,
            y_position,
            label,
            fontsize=11,
            color="#475569",
            va="center",
        )

ax.set_yticks(range(len(companies)))
ax.set_yticklabels(companies, fontsize=12)
ax.set_xticks(range(1, 9))
ax.set_xticklabels([f"2023Q{q}" for q in range(1, 9)], rotation=30, ha="right")
ax.set_xlim(0.4, 8.6)
ax.set_title("四半期ごとの EPS / 売上 前期比", fontsize=14, pad=12)
ax.set_xlabel("四半期")
ax.grid(axis="x", color="#cbd5f5", alpha=0.4)

cbar = fig.colorbar(sc, ax=ax, shrink=0.75, pad=0.02)
cbar.ax.set_ylabel("前期比", rotation=90)

output = Path("static/images/finance/visualize/eps_revenue_circle.svg")
output.parent.mkdir(parents=True, exist_ok=True)
fig.tight_layout()
fig.savefig(output)

ここでは銘柄 × 指標 × 四半期の 3 軸をサークルマトリクスで描き、どこで成長が加速・減速したのかを直感的に把握でき…の図

読み方のポイント #

行が銘柄、列が四半期、円の色が伸び率、円の右のラベルが具体的なパーセンテージです。緑が濃いほどプラス成長、赤が濃いほどマイナス成長です。AAA の 2023Q4(EPS −8.0%)と BBB の 2023Q2(EPS −12.0%)が赤い円として浮かび上がります。EPS と売上を上下に 2 レイヤーで並べているため、AAA の Q1 のように EPS は +12% なのに売上が −5% という「利益率だけが改善した四半期」を、上下の円の色の差として読めます。CCC は 8 四半期すべて緑ですが Q2 の +24% から Q7 の +4% へ色が薄くなっており、「成長は続いているが減速している」ことが左から右への色の変化で分かります。四半期を通じてマイナスが続いている銘柄は早期に検知できるため、決算シーズンの速報ダッシュボードとしても便利です。