【バレーボール】SVリーグ優勝決定戦データ分析🏐サントリーサンバーズ大阪 vs ジェイテクトSTINGS愛知

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/b1ef0b72-a84f-48bd-b485-8f9f9944b9f0.png)
>引用 https://www.svleague.jp/ja/sv_men/

本日はSVリーグ男子の優勝決定戦、サントリーサンバーズ大阪とジェイテクトSTINGS愛知の対決が行われます。
バレーボールファンでありエンジニアの皆さんに向けて、得点データから見る両チームの特徴と見どころをPythonで分析してみました！

# 1. データ準備
[こちらのサイト](https://www.svleague.jp/ja/sv_men/recordn/player_ranking_by_season?season=751&round=384&leg=%E9%80%9A%E7%AE%97&ranking_type=11)からSVリーグ男子の個人得点記録データを取得します。

csvに変換しておきます。

<details>
<summary>CSVデータ（コピペ用）</summary>
```csv:svleague_data.csv
順位,氏名,チーム名,総得点,試合数,セット数,アタック,ブロック,サーブ
1,ニミル・アブデルアジズ,ウルフドッグス名古屋,1181,44,171,1003,61,117
2,ドミトリー・ムセルスキー,サントリーサンバーズ大阪,942,43,157,776,97,69
3,トリー・デファルコ,ジェイテクトSTINGS愛知,852,43,160,729,71,52
4,フェリペ・モレイラ・ロケ,広島サンダーズ,848,41,159,724,79,45
5,シャロン・バーノン＝エバンズ,日本製鉄堺ブレイザーズ,820,42,150,702,79,39
6,張 育陞,ヴォレアス北海道,807,44,168,727,55,25
6,ウルリック・ダール,VC長野トライデンツ,807,40,142,725,42,40
8,ミゲル・ロペス,大阪ブルテオン,757,43,156,659,49,49
9,西田 有志,大阪ブルテオン,750,44,161,603,70,77
10,宮浦 健人,ジェイテクトSTINGS愛知,680,33,127,569,50,61
11,アラン・ソウザ,東レアローズ静岡,666,35,136,584,47,35
12,マチェイ・ムザイ,東京グレートベアーズ,602,34,137,511,76,15
13,後藤 陸翔,東京グレートベアーズ,600,44,174,534,44,22
14,新井 雄大,広島サンダーズ,587,44,165,512,44,31
15,アレックス・フェレイラ,東京グレートベアーズ,563,42,154,463,54,46
16,髙橋 藍,サントリーサンバーズ大阪,546,40,142,467,44,35
17,オレオル・カメホ・ドルーシー,広島サンダーズ,544,37,136,450,57,37
18,デアルマス アライン,サントリーサンバーズ大阪,516,44,140,429,33,54
19,ルチアーノ・パロンスキー,日本製鉄堺ブレイザーズ,498,41,138,441,32,25
20,工藤 有史,VC長野トライデンツ,490,42,147,419,35,36
21,トーマス・ジェスキー,大阪ブルテオン,426,37,122,360,25,41
22,安井 恒介,日本製鉄堺ブレイザーズ,424,44,141,361,33,30
23,水町 泰杜,ウルフドッグス名古屋,413,43,157,340,20,53
24,フランチェスコ・レチネ,東レアローズ静岡,408,38,126,344,34,30
25,リカルド・ルカレッリ・ソウザ,ジェイテクトSTINGS愛知,388,44,137,318,30,40
25,ティモ・タンメマー,ヴォレアス北海道,388,43,165,273,82,33
27,池田 幸太,ヴォレアス北海道,377,42,126,320,29,28
28,三輪 大将,広島サンダーズ,352,44,170,264,71,17
28,西本 圭吾,東レアローズ静岡,352,42,165,236,102,14
30,ティネ・ウルナウト,ウルフドッグス名古屋,332,44,134,294,24,14
31,重藤 トビアス赳,東レアローズ静岡,331,44,119,272,37,22
32,大竹 壱青,東京グレートベアーズ,323,44,173,190,78,55
33,伊藤 吏玖,東京グレートベアーズ,309,44,174,234,56,19
34,エバデダン ラリー,大阪ブルテオン,308,44,160,204,91,13
35,村山 豪,ジェイテクトSTINGS愛知,296,44,176,188,87,21
36,山崎 彰都,ウルフドッグス名古屋,286,42,131,226,34,26
37,陳 建禎,ヴォレアス北海道,283,44,126,241,37,5
38,トレント・オデイ,VC長野トライデンツ,282,44,150,203,67,12
39,迫田 郭志,VC長野トライデンツ,279,44,126,233,26,20
40,蔡 沛彰,日本製鉄堺ブレイザーズ,277,44,151,205,58,14
41,三好 佳介,ヴォレアス北海道,253,44,149,179,61,13
41,鍬田 憲伸,ヴォレアス北海道,253,40,118,207,24,22
43,藤原 直也,ジェイテクトSTINGS愛知,251,44,141,216,25,10
44,傳田 亮太,ウルフドッグス名古屋,229,39,139,156,65,8
45,山内 晶大,大阪ブルテオン,185,42,124,140,37,8
46,鬼木 錬,サントリーサンバーズ大阪,157,44,139,124,32,1
47,坂下 純也,広島サンダーズ,130,42,119,112,8,10
48,竹元 裕太郎,日本製鉄堺ブレイザーズ,129,43,135,79,48,2
49,上村 琉乃介,日本製鉄堺ブレイザーズ,118,44,142,94,8,16
50,渡邉 晃瑠,日本製鉄堺ブレイザーズ,115,41,114,80,34,1
51,永露 元稀,大阪ブルテオン,75,44,165,34,22,19
52,金子 聖輝,広島サンダーズ,68,44,156,31,30,7
53,深津 英臣,ウルフドッグス名古屋,54,44,171,13,19,22
54,山岸 隼,ヴォレアス北海道,47,44,160,9,20,18
55,今橋 祐希,東京グレートベアーズ,45,44,159,25,14,6
55,新 貴裕,東レアローズ静岡,45,42,158,21,15,9
57,大宅 真樹,サントリーサンバーズ大阪,42,41,150,18,20,4
58,関田 誠大,ジェイテクトSTINGS愛知,36,39,143,8,17,11
59,深津 旭弘,東京グレートベアーズ,21,44,153,6,8,7
59,早坂 心之介,VC長野トライデンツ,21,44,116,9,8,4
```
</details>

次に両チームの得点データをPythonで分析できる形にします。
今回は選手別の得点データ（総得点、アタック、ブロック、サーブ）を使用しています。
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib  # 日本語表示に必須
import seaborn as sns

# CSVファイルの読み込み
df = pd.read_csv('svleague_data.csv', encoding='utf-8')

# サントリーとジェイテクトの選手データを抽出
suntory = df[df['チーム名'] == 'サントリーサンバーズ大阪']
jtekt = df[df['チーム名'] == 'ジェイテクトSTINGS愛知']

# 得点効率と構成比の計算
for team_df in [suntory, jtekt]:
    team_df['試合あたり得点'] = team_df['総得点'] / team_df['試合数']
    team_df['セットあたり得点'] = team_df['総得点'] / team_df['セット数']
    team_df['アタック割合'] = team_df['アタック'] / team_df['総得点'] * 100
    team_df['ブロック割合'] = team_df['ブロック'] / team_df['総得点'] * 100
    team_df['サーブ割合'] = team_df['サーブ'] / team_df['総得点'] * 100
```

# 2. 両チームの主力選手比較
両チームの主力選手を見てみましょう。それぞれのチームから上位選手のデータを確認します。
```python
# 各チームのトップ選手を表示
print("サントリーサンバーズ 主力選手:")
print(suntory[['氏名', '総得点', 'アタック', 'ブロック', 'サーブ', 'セットあたり得点']].head().to_string(index=False))

print("\nジェイテクトSTINGS 主力選手:")
print(jtekt[['氏名', '総得点', 'アタック', 'ブロック', 'サーブ', 'セットあたり得点']].head().to_string(index=False))
```


### サントリーサンバーズ大阪の主力陣
主力選手の得点構成をチェックすると、サントリーの絶対的エースは**ドミトリー・ムセルスキー**選手(身長218cm、最高到達点375cm)です。彼は942点を獲得し、リーグ全体でも2位の得点力を持っています。特にブロックの得点が97点とかなり高いのが特徴です。
**髙橋藍**選手(身長188cm、最高到達点350cm)と**デアルマス・アライン**選手(身長189cm、最高到達点355cm)も500点以上を獲得しており、攻撃の選択肢が複数あります。特に**デアルマス**選手はサーブでの得点力が高く、ジャンプサーブから直接ポイントを奪う能力に優れています。
### ジェイテクトSTINGS愛知の主力陣
ジェイテクトは**トリー・デファルコ**選手(身長195cm、最高到達点340cm)と**宮浦健人**選手(身長190cm、最高到達点350cm)の二枚看板が強力です。特に日本人選手の宮浦選手がチーム2番手の得点源として機能している点が大きな強みです。サーブからの得点も61点と高い数値を記録しています。
また**村山豪**選手(身長192cm、最高到達点340cm)のブロック得点（87点）も見逃せません。これはブロック専門選手としての役割を果たしていることを示しています。

# 3. チーム全体の得点構成分析
両チームの得点構成を可視化してみましょう。

```python
# チーム全体の得点構成を計算
team_stats = []
for name, team in [("サントリー", suntory), ("ジェイテクト", jtekt)]:
    attack_sum = team['アタック'].sum()
    block_sum = team['ブロック'].sum()
    serve_sum = team['サーブ'].sum()
    total = team['総得点'].sum()
    
    team_stats.append({
        'チーム': name,
        'アタック': attack_sum,
        'ブロック': block_sum,
        'サーブ': serve_sum,
        '総得点': total,
        'アタック割合': attack_sum / total * 100,
        'ブロック割合': block_sum / total * 100,
        'サーブ割合': serve_sum / total * 100
    })

team_df = pd.DataFrame(team_stats)

# 可視化コード（実際の記事では図として表示）
fig, ax = plt.subplots(figsize=(10, 6))
sns.barplot(x='チーム', y='総得点', data=team_df, ax=ax)
plt.title('両チームの総得点比較')
plt.ylabel('総得点')
plt.tight_layout()
```
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/86278384-22c7-4075-a3e7-fd9e8f116fe3.jpeg)
>引用 https://ameblo.jp/yukigame/entry-12840909242.html

### 得点構成から見えるチームの特徴
データから両チームの特性を比較すると、以下のような興味深い違いが見えてきます。

- 総得点
    -  ジェイテクトの総得点は約2,410点、サントリーは約2,161点とジェイテクトに分があります
- 得点構成:
    - サントリー：アタック83.7%、ブロック10.4%、サーブ7.5%
    - ジェイテクト：アタック83.4%、ブロック10.9%、サーブ5.7%
- 得点分散:
    - サントリーは**ムセルスキー**選手への依存度が高い
    - ジェイテクトは**デファルコ**選手と**宮浦**選手の二枚看板+αで得点が分散している

特筆すべきはサントリーのサーブ得点の高さです。全体得点の7.5%がサーブからの直接得点というのはかなりの高水準です。一方、ジェイテクトはブロックからの得点比率が若干高く、ネット際での高さを活かした戦術を展開していることがうかがえます。

# 4. 攻撃パターンの詳細分析
各チームの主力選手の得点パターンをレーダーチャートで可視化してみましょう。
```python
# レーダーチャートでの可視化（主力選手比較）
def plot_player_radar(ax, player1, player2, categories):
    angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False).tolist()
    angles += angles[:1]  # 閉じるために最初の点を追加
    
    stats1 = player1[categories].values.flatten().tolist()
    stats1 += stats1[:1]
    stats2 = player2[categories].values.flatten().tolist()
    stats2 += stats2[:1]
    
    ax.plot(angles, stats1, 'b-', linewidth=2, label=player1['氏名'])
    ax.plot(angles, stats2, 'r-', linewidth=2, label=player2['氏名'])
    ax.fill(angles, stats1, 'b', alpha=0.1)
    ax.fill(angles, stats2, 'r', alpha=0.1)
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(categories)
    ax.legend(loc='upper right')

# レーダーチャート表示コード...
```

### エース比較：ムセルスキー vs デファルコ
両チームのエースを比較すると、**ムセルスキー**選手はよりバランスの取れた得点パターンを持っています。特にブロックでの得点割合が高く、オールラウンダーとしての価値が高いです。
一方、**デファルコ**選手はアタック主体のスコアリングパターンです。トータル得点では**ムセルスキー**選手に劣りますが、アタックの効率性に関しては非常に高いレベルにあります。
### サーブ力の比較
サーブ得点に注目すると、サントリーの**デアルマス**選手（54点）とジェイテクトの**宮浦**選手（61点）が突出しています。このサーブの威力は試合展開を左右する可能性が高く、特に**宮浦**選手のサーブはリズムに乗ると連続ポイントにつながることが期待できます。

# 5. Pythonによる勝敗予測モデル
少し遊び心を加えて、過去の得点データから今日の優勝決定戦の結果を予測するモデルを作ってみましょう。
```python
# 注：これは概念実証のためのシンプルなモデルです
from sklearn.ensemble import RandomForestClassifier

# 仮想的な特徴量を作成（実際の予測には不十分ですが、アイデアとして）
def predict_match_outcome(team1, team2):
    # 各チームの特徴量を抽出
    t1_features = [
        team1['総得点'].sum(),
        team1['アタック'].sum() / team1['総得点'].sum(),
        team1['ブロック'].sum() / team1['総得点'].sum(),
        team1['サーブ'].sum() / team1['総得点'].sum(),
        team1.iloc[0]['総得点'] / team1['総得点'].sum(),  # エース依存度
    ]
    
    t2_features = [
        team2['総得点'].sum(),
        team2['アタック'].sum() / team2['総得点'].sum(),
        team2['ブロック'].sum() / team2['総得点'].sum(),
        team2['サーブ'].sum() / team2['総得点'].sum(),
        team2.iloc[0]['総得点'] / team2['総得点'].sum(),  # エース依存度
    ]
    
    # 特徴量を統合（チーム間の差分を取る）
    match_features = [t1_features[i] - t2_features[i] for i in range(len(t1_features))]
    
    # ここで実際には学習済みモデルで予測を行うが、今回はエース依存度と総得点のシンプルな比較で代用
    team1_win_prob = 0.5  # デフォルトは50%
    
    # エース依存度が低いほうが有利（0.1ポイント）
    if t1_features[4] < t2_features[4]:
        team1_win_prob += 0.1
    else:
        team1_win_prob -= 0.1
    
    # 総得点が高いほうが有利（0.15ポイント）
    if t1_features[0] > t2_features[0]:
        team1_win_prob += 0.15
    else:
        team1_win_prob -= 0.15
    
    # サーブ割合が高いほうが有利（0.05ポイント）
    if t1_features[3] > t2_features[3]:
        team1_win_prob += 0.05
    else:
        team1_win_prob -= 0.05
    
    return team1_win_prob, 1 - team1_win_prob

# 勝敗予測の実行
suntory_win_prob, jtekt_win_prob = predict_match_outcome(suntory, jtekt)
print(f"サントリーの勝率: {suntory_win_prob:.1%}")
print(f"ジェイテクトの勝率: {jtekt_win_prob:.1%}")
```
もちろんこれは過去データだけに基づく非常にシンプルなモデルで、実際の試合は当日の調子やコンディション、戦術など多くの要素が絡み合います。それでも、データから見る限りはジェイテクトに若干有利な展開が予想されます。

# 6. 優勝決定戦の見どころ
データ分析の結果から、今日の決定戦の見どころを挙げてみましょう。
- **エース対決**: ムセルスキー vs デファルコの得点バトル
- **サーブ合戦**: サントリーの高いサーブ得点率 vs 宮浦選手の強烈サーブ
- **ブロック戦略**: ジェイテクトの村山選手とサントリーのムセルスキー選手のネット際の攻防
- **得点の分散度**: ジェイテクトの複数アタッカー vs サントリーのムセルスキー中心戦術

# 7. エンジニア視点でのまとめ
SVリーグ男子の得点データを分析することで、両チームの戦術やプレースタイルが数値として見えてくるのは面白いですね。エンジニアとしてデータを読み解くスキルは、スポーツ観戦の楽しみ方をさらに広げてくれます。

今回の分析はシンプルな集計とビジュアライズがメインでしたが、さらに時系列データを加えたり、選手間の連携パターンを掘り下げたりすることも可能です。例えば機械学習を使った選手のコンビネーション効果の分析や、試合の流れを可視化するヒートマップなども面白そうですね。

今日の優勝決定戦、データから見えてくる両チームの強みと弱みがどう試合に反映されるか、ぜひ注目してみてください！結果がどうなるか、データ予測と実際の結果を比較するのも楽しみのひとつです。

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/8cd94b27-3a6b-4dad-bcad-57854d7b5758.jpeg)
>引用 https://news.nifty.com/article/entame/showbizd/12270-2851316/


# あとがき
Abemaで中継放送されます。11:30〜（試合開始は12:10予定）
![2abema.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/ae12aa98-8d52-4a1b-aa4d-611f5e399e5f.png)
>引用 https://abema.tv/video/episode/js_vb00001_s52_p201