コード
library(tidyverse)
library(DT)
rugby_data <- read_csv("rugby-archive-filtered.csv")ラグビーのパシフィックネーションズカップ2026は、日本代表(世界ランク12位)が格上のフィジー代表(世界ランク9位)に20–15の僅差で勝利し、7年ぶりの日本の優勝で幕を閉じました。
ラグビーは、番狂わせが最も起きにくいスポーツと評されることもあるほど、格上の相手に勝つことが難しい競技とされています。その理由としては、フィジカルの差が試合結果に表れやすいことなどがよく挙げられます。日本では、2015年のワールドカップで日本代表が優勝候補の南アフリカ代表に勝利した試合が、「史上最大の番狂わせ」と評されることもありますね。
では実際、どのくらい「番狂わせ」が起きているのでしょうか。Rugby Archiveというサイトでは、1871年から現在に至るまで、9月20日現在で11,259試合の結果が記録されています。このデータを用いて調べてみましょう。1
1 2026年9月20日現在では、9月19日の日本 vs フィジーの結果は残念ながら含まれていません。
上記サイトからデータをダウンロードし、Rで読み込みます。
library(tidyverse)
library(DT)
rugby_data <- read_csv("rugby-archive-filtered.csv")Rugby Archiveにはさまざまな国際試合が収録されていますが、今回は同サイトのランキング計算の対象となっている試合(Counts for rankings がTRUEの試合)のみに限定します。
rugby_data %>% filter(`Counts for rankings`==TRUE) -> rugby_data_filtered
rugby_data_filtered %>% nrow()[1] 9827
9827試合のようですね。最近の10試合を確認すると、以下のようになっています。
rugby_data_filtered %>% head(10) %>% datatable()データには、対戦日・対戦チーム・スコアのほか、両チームの対戦前の世界ランキング、およびレートが含まれています。レートはランキングを決めるための数であり、値が大きいほどそのチームの実力が高いことを表します。ランキングが単にチームの順位を表すのに対し、レートを見ることで、対戦する2チームの実力にどの程度の差があるのかを数値として捉えることができます。
では、このデータを使って「番狂せ」がどの程度起きているかを調べてみましょう。まず、ランクが上位のチームの勝率を調べると、以下のようになります。
rugby_data_filtered %>%
filter(`Home rank before` != `Away rank before`) %>%
mutate(
higher_win = (`Home rank before` < `Away rank before` & `Result (home)`=="W") |
(`Home rank before` > `Away rank before` & `Result (home)`=="L") ,
draw = `Result (home)`=="D"
) %>%
summarise(
n = n(),
higher_win_rate = mean(higher_win, na.rm = TRUE),
lower_win_rate = 1 - higher_win_rate - mean(draw),
draw_rate = mean(draw)
)# A tibble: 1 × 4
n higher_win_rate lower_win_rate draw_rate
<int> <dbl> <dbl> <dbl>
1 9827 0.685 0.288 0.0275
格上の勝率が68%、格下が29%、引き分けが3%ほどでした。「ラグビーは番狂わせが起きにくい」というほど、格下勝率が低いわけでもなさそうです。
ただし、ランキングが1つ違うだけでも「格下の勝利」として数えています。これをすべて番狂せと呼ぶのは少し無理がありそうです。そこで、両チームの実力差をもう少し詳しく見てみましょう。
各チームのランキングは、レートの値をもとに決められています。現在の公式ランキングおよびレートは World Rugby2 が算出しています。一方、先ほどの Rugby Archive では、World Rugby のランキング算出方式を過去の試合結果にも適用することで、1871年以降の各時点におけるランキングとレートを独自に算出しています。
2 World Rugby はラグビーユニオンの国際競技連盟で、ワールドカップの主催や競技規則の制定、世界ランキングの公表などを行っています。
Rugby Archive のRanking Time Machineでは、ある時点での各チームのランキングとレートが確認できます。例えば、2026年9月12日の段階では、1位の南アフリカが76.71、2位のニュージーランドが72.85となっており、9位のフィジーが60.25、10位(どうも公式ランキングとは違うみたいですね)の日本は59.58となっており、20位のサモア以下が50を下回り、一番下のエストニアが20.97となっています。
先ほども述べたように、レートの差が大きいほど、両チームの実力差が大きいことを表します。そこで、レート差に応じて、レートが高いチームの勝率がどのように変化するのかを調べてみることにしましょう。
rating_win <- rugby_data_filtered %>%
mutate(
rating_diff = abs(`Home rating before` - `Away rating before`),
higher_win = (`Home rating before` > `Away rating before` &
`Result (home)` == "W") |
(`Home rating before` < `Away rating before` &
`Result (home)` == "L")
)
rating_win_summary <- rating_win %>%
mutate(
rating_diff_group = floor(rating_diff + 0.5)
) %>%
group_by(rating_diff_group) %>%
summarise(
n = n(),
win_rate = mean(higher_win)
)
ggplot(rating_win_summary,
aes(x = rating_diff_group, y = win_rate)) +
geom_point() +
scale_y_continuous(
labels = scales::percent
) +
labs(
x = "レート差",
y = "レートが高いチームの勝率"
) +
theme_minimal()レート差が0以上0.5未満のものを「0」とし、以降、0.5以上1.5未満のものを「1」、1.5以上2.5未満のものを「2」、…としています。これを横軸に、レートが高いチームの勝率を縦軸にとったものが上のグラフです。
このグラフから見ると、レート差が10だと格下の勝率は20%未満。そして、レート差が15あると格下が勝利する確率はほぼ0であることがわかりますね。ちなみに、2015年の日本対南アフリカ戦のときは、日本のレートが 55.3495 、南アフリカが 64.4438 でしたのでその差は9ほどでした。同程度のレート差がある試合では、格下が勝利した割合は15〜20%程度です。もちろん低い数字ではありますが、「ほとんど起こり得ない」というほどではなかったことがわかります。
先ほどのグラフを見てみましょう。横軸が0のところでは勝率が約45%と50%を少し下回っていますが、それ以降は50%を上回り、横軸の値が1増えるごとに勝率が概ね5ポイントずつ上昇しているように見えます。
実は、このレートは、レート差が試合結果の期待値に対応するように作られています。勝ちを1、引き分けを0.5、負けを0とすると、その期待値は次の式で表されます。 \[ \text{チームAの期待値} = 0.5 + 0.05 \times (\text{チームAのレート} - \text{チームBのレート}) \] 「レート差が1増えると勝率が概ね5ポイントずつ上昇する」というデータ上で見られた傾向は、レート差1が期待値5ポイントの差に対応するというレーティングの仕組みと、よく整合しています。
では、どのようにしてこれを実現しているのでしょうか?
ある試合において、レートが高いチームをA、低いチームをBとし、そのレート差を \(D>0\) とします。World Rugby のレーティングシステムでは、試合後のレートが以下のように変化します。
| 結果 | Aのレート | Bのレート |
|---|---|---|
| Aの勝利 | \(1-D/10\) 増加 | \(1-D/10\) 減少 |
| 引き分け | \(D/10\) 減少 | \(D/10\) 増加 |
| Bの勝利 | \(1+D/10\) 減少 | \(1+D/10\) 増加 |
例えば、\(D=4\) のときは以下の通りです。
| 結果 | Aのレート | Bのレート |
|---|---|---|
| Aの勝利 | \(+0.6\) | \(-0.6\) |
| 引き分け | \(-0.4\) | \(+0.4\) |
| Bの勝利 | \(-1.4\) | \(+1.4\) |
この表から、順当な結果ほどレートの変化は小さく、意外な結果ほどレートの変化が大きくなることがわかります。例えばレート差が4の場合、格上のAが勝っても0.6しか変化しませんが、格下のBが勝つと1.4も変化します。
この更新式に従ってレートを変化させていくと、長期的にはどのような状態に落ち着くでしょうか。例えば \(D=4\) のとき、Aが勝つとAのレートは0.6増え、Bが勝つと1.4減ります。引き分けをひとまず考えないことにすると、Aが勝つ確率を \(p\) としたとき、Aのレート変化の期待値は \[ 0.6p-1.4(1-p)=2p-1.4 \] となります。これが0となるのは \(p=0.7\) のときです。 つまり、引き分けを考えなければ、レート差4は「Aが70%程度勝つ」という状態と釣り合うようにできているわけです。
この考え方は、ラグビーに特有のものではありません。World Rugby のレーティングシステムは、もともとチェスのレーティングのために考案された「Eloレーティング」とよく似た仕組みになっています。
Eloレーティングでは、チームAの試合前のレートを \(R_A\)、試合後を \(R_A'\) とすると、基本的な更新式は
\[ R_A'=R_A+K(S_A-E_A) \]
と表されます。ここで、\(S_A\) は実際の試合結果で、勝利なら1、引き分けなら0.5、敗北なら0です。一方、\(E_A\) はレートから計算される「期待される試合結果」、\(K\) は1試合の結果によってレートをどの程度動かすかを決める定数です。
つまり、実際の結果 \(S_A\) が期待 \(E_A\) を上回ればレートは上昇し、下回れば低下します。予想外の結果であるほど \(S_A-E_A\) の絶対値が大きくなるため、レートも大きく変化します。
そして、先ほど見た World Rugby の更新方法も、実はこれと同じ形に書くことができます。レート差を \(D\) として
\[ E_A=0.5+\frac{D}{20},\qquad K=2 \]
とおけば、
\[ R_A'=R_A+2(S_A-E_A) \]
となり、先ほどの表の更新式と一致します。
つまり World Rugby のレーティングも、Eloレーティングと同じように、「予想どおりの結果なら少しだけ動かし、予想外の結果なら大きく動かす」という考え方で作られているのです。3
3 World Rugbyのレーティングでは \[ E_A=0.5+\frac{D}{20} \] という直線的な関係なのに対して、古典的なEloでは \[ E_A= \frac{1}{1+10^{(R_B-R_A)/400}} \] というロジスティック型の関係を使います。ここが違いですね。
今回は、「ラグビーでは番狂わせが起きにくい」という話をきっかけに、過去の試合データを使って、格上・格下と試合結果の関係を調べてみました。
単純にランキングだけを見ると、格下のチームが勝利した試合は決して珍しくありません。しかし、レート差まで考慮すると、両チームの差が大きくなるにつれて格下の勝利は急速に少なくなり、レート差と勝率の間にはかなり明瞭な関係が見られました。
そして、その関係を追いかけていくと、そもそもレーティングが「予想された結果」と「実際の結果」のずれを利用して更新される仕組みになっていることがわかりました。番狂わせが起きればレートは大きく動き、順当な結果ならそれほど動かない。この仕組みを繰り返すことで、各チームの実力を表すレートが作られていきます。
データを眺めていて見つけた「レート差が1増えると勝率が5ポイントほど上がる」という単純な傾向から、その背後にあるレーティングの仕組みにまで話がつながりました。データを分析するときには、結果として現れた数字だけでなく、「なぜそのような数字になっているのか」を考えてみることも大切ですね。
この記事はいかがでしたか?
0人が「面白かった」と評価しています。