06.7.12
ウィンロスチャートで連勝・連敗を瞬時に把握
results の +1 / −1 を np.where(results > 0, 1, -1) で棒の高さに、np.where(results > 0, "#22c55e", "#ef4444") で色にして ax.bar を 1 回呼ぶだけで描け、np.cumsum の累積勝敗を数試合ごとに文字で添えます。読み終えると、16 試合の中で 4〜6 戦目の 3 連勝と 14〜16 戦目の 3 連敗を緑と赤の塊として読み取り、営業の受注・失注や目標の達成・未達の履歴を同じ形で描けるようになります。直感 #
直近 16 試合の勝敗を「○×○○○×××○×○○○×××」のように文字で並べると、連勝がどこで途切れたかを数えるのに目が疲れます。ウィンロスチャートは勝ちを上向きの緑の棒、負けを下向きの赤の棒にして横に並べます。緑 #22c55e が続く区間が連勝、赤 #ef4444 が続く区間が連敗で、色が切り替わる位置が流れの転換点です。棒の高さはすべて 1 で揃えるので、大勝も僅差も同じ棒になり、「どれだけ」ではなく「勝ったか負けたか」の並びだけに注目させます。4 試合ごとに累積の勝敗差(+2、+2、+1、−1 など)を添えれば、勢いが数値でも追えます。
Python で描く #
次のコードは 16 試合の結果を +1 / −1 で持ち、正なら高さ +1 の緑、負なら高さ −1 の赤の棒を描きます。0 ラインを引き、4 試合ごとに累積勝敗差をラベルで添えます。
| |

実行結果の読み方 #
上向きの緑が勝ち(+1)、下向きの赤が負け(−1)で、同じ色が続く区間が連勝・連敗です。この例では 4〜6 戦目に 3 連勝、7〜8 戦目に 2 連敗、11〜13 戦目に 3 連勝、14〜16 戦目に 3 連敗があり、終盤に流れが悪化していると読めます。棒の上の累積は 4 戦目 +2、8 戦目 +2、12 戦目 +4、16 戦目 +2 で、12 戦目をピークに勝ち越し幅が縮んだことを数値で裏付けます。棒の高さがすべて同じなので、「大勝だったか」は読めない点を意識して使います。
使いどころと落とし穴 #
ウィンロスチャートは、スポーツの戦績、営業の受注・失注、日次目標の達成・未達のように二値の結果が時系列で並ぶデータで、ストリークと転換点を見せる場面に向いています。勝ち幅や負け幅の大きさを表せないので、スコア差が重要なら棒の高さに差分を使うダイバージングバーに切り替えてください。数百試合を 1 行に詰めると個々の棒が 1 ピクセル以下になって読めないため、シーズンや四半期ごとに plt.subplots(nrows=...) で行を分けます。二値だけでは「大勝と僅差の勝ち」の区別がつかないことを読者に伝えるため、必要なら得点差の折れ線を別図で併記します。
- ダイバージングバー — 正負を中央線の左右に振り分け
- 積み上げ棒グラフ — 全体量と内訳を同時に表示
- バーコードタイムライン — 縦線でイベント頻度を瞬時に把握