プログラミング
Rでの柔道コンボの可視化
Visualizing Combos in Judo in R (r-bloggers.com)
要約
この記事では、R言語を使用して柔道の攻撃コンビネーションをネットワークとしてモデル化し、攻撃戦略の隠れたパターンを明らかにします。個々の技をノード、技間の遷移をエッジとして扱い、どの技がコンビネーションの開始や終了に頻繁に使われるか、またどの技が戦略的に重要かを分析します。
全文翻訳
[この記事はR Code – Geekcologistで最初に公開され、R-bloggersに寄稿されました。(このページの内容に関する問題はここで報告できます)ブログをお持ちの場合はこちら、お持ちでない場合はこちらをクリックして、R-bloggersでコンテンツを共有してください。]
6月にブダペストで開催される柔道世界選手権が近づくにつれて、柔道(およびブラジリアン柔術)への情熱と複雑なネットワーク分析への熱意を組み合わせるのに最適な時期だと感じています。これは長年温めてきた融合です!私の投稿は通常、生物多様性関連のトピックや統計モデリングに焦点を当てていますが、私は長年、最も大切にしている興味の一つである柔道について共有することを考えてきました。この武道は、豊かな歴史と複雑な技術で、子供の頃から私を魅了してきました。柔道、つまり「柔らかな道」は、競技の中心では、投げ技、抑え技、関節技、そして戦略的なコンビネーションのダイナミックな「チェスゲーム」です。個々の技(技)が基礎となりますが、真の芸術性は、それらがどのように連鎖するか、つまり連鎖技(連絡技)や連続技(連続技)によって構成されるかにあります。したがって、柔道の試合では、これらの個々の技は通常、一連の動きとして展開され、しばしば得点につながる可能性のある決定的なアクションに向けて構築されます。しかし、どの攻撃コンビネーションが最も効果的に連携するかを客観的に分析するにはどうすればよいでしょうか?どの技が重要なセットアップとして機能し、どの技が信頼できる「決め技」でしょうか?ここでネットワーク分析が洞察を提供してくれます。
この記事では、Rを使用して柔道の投げ技のコンビネーションをネットワークとしてモデル化し、攻撃戦略における隠れたパターンを明らかにします。具体的には、個々の投げ技をネットワークのノードとして扱い、ある技が攻撃シーケンスの一部として別の技を自然にセットアップしたり遷移したりする場合に、2つのノードをエッジ(またはリンク)で接続します。私たちの柔道攻撃コンビネーションネットワークでは、次のことを検出できるはずです:i)どの技が最も頻繁に成功したコンビネーションを開始するために使用されるか;ii)どの技が一般的なフィニッシャー、「決め技」であるか;iii)どの技が全体的な戦略的攻撃システムにおいて最も「影響力がある」 — または重要であるか?
この投稿は、柔道攻撃コンビネーションの包括的なレビューを意図したものではないことに注意することが重要です。むしろ、古典的な文献(柏崎克彦、中西健二 1995、川石源助 1963、van Haesendonck 1968)から引用しています。私は、講道館が現在認識している技のみを使用した2ムーブ攻撃シーケンスに限定します。より網羅的な分析 — 特にハイパフォーマンスアスリートに関連するもの — は、競技からの経験的データ、技術的バリエーションのより広範な包含などを必要とするでしょう。いずれにせよ、この投稿は武道愛好家とネットワーク分析に関心のある科学者の両方に響く洞察を提供すると信じています。生態学者の読者の皆さん、心配しないでください!これらのネットワーク分析の生態学的応用(EA)の例へのリンクを提供します。また、以前のネットワーク関連の投稿でさらに詳しい情報を見つけることができます。
必要なパッケージをロードし、コンパイルされたデータからネットワークを構築し、インタラクティブなネットワークとして可視化することから始めましょう。これにより、ノード、つまり技を選択して、そのすべての関係を表示できます。
require(igraph)
require(ggplot2)
require(dplyr)
require(tidyr)
require(RColorBrewer)
require(bipartite)
require(bbmle)
require(influential)
require(visNetwork)
# -----------------------------
# 1. グラフの構築(有向)
# -----------------------------
cat("
--- 1. Creating Directed Graph of Judo Attack Combinations ---
")
# 柔道技間の攻撃遷移を定義する
# 各行はコンビネーションにおける有効な遷移(左から右への方向)を示す
attack_combinations_igraph =graph.formula(
Seoi.nage-+Seoi.otoshi, Seoi.nage-+O.uchi.gari, Seoi.nage-+Ko.uchi.gari,
Ippon.seoi.nage-+Seoi.otoshi, Ippon.seoi.nage-+Ko.uchi.gari, Ippon.seoi.nage-+Osoto.gari,
Harai.goshi-+Osoto.gari, Harai.goshi-+Uchi.mata, Harai.goshi-+Soto.makikomi,
Uchi.mata-+O.uchi.gari, Uchi.mata-+Ko.uchi.gari,
O.goshi-+O.uchi.gari, O.goshi-+Ko.uchi.gari, O.goshi-+Harai.goshi,
O.uchi.gari-+Uchi.mata, O.uchi.gari-+Ko.uchi.gari, O.uchi.gari-+Osoto.gari, O.uchi.gari-+Tai.otoshi, O.uchi.gari-+Harai.goshi,
Ko.uchi.gari-+O.uchi.gari, Ko.uchi.gari-+Seoi.nage, Ko.uchi.gari-+Ippon.seoi.nage, Ko.uchi.gari-+Hane.goshi,
Osoto.gari-+Harai.goshi, Osoto.gari-+O.uchi.gari, Osoto.gari-+Ko.soto.gake, Osoto.gari-+Sasae.tsurikomi.ashi, Osoto.gari-+Okuri.ashi.harai, Osoto.gari-+Hiza.guruma,
Ko.soto.gari-+Osoto.gari, Ko.soto.gari-+Tai.otoshi, Ko.soto.gari-+Harai.goshi,
Hiza.guruma-+Harai.goshi, Hiza.guruma-+Sasae.tsurikomi.ashi, Hiza.guruma-+Osoto.gari, Hiza.guruma-+De.ashi.harai,
Okuri.ashi.harai-+Sode.tsuri.komi.goshi, Okuri.ashi.harai-+Tai.otoshi, Okuri.ashi.harai-+Harai.goshi, Okuri.ashi.harai-+Ippon.seoi.nage, Okuri.ashi.harai-+Seoi.nage,
Tai.otoshi-+Ko.uchi.gari, Tai.otoshi-+O.uchi.gari,
Hikikomi.gaeshi-+O.uchi.gari, Hikikomi.gaeshi-+Ko.uchi.gari, Hikikomi.gaeshi-+Harai.goshi, Hikikomi.gaeshi-+Ko.soto.gari, Hikikomi.gaeshi-+Sukui.nage,
Tsuri.komi.goshi-+O.uchi.gari, Tsuri.komi.goshi-+Sode.tsuri.komi.goshi,
Hane.goshi-+O.uchi.gari,
Sasae.tsurikomi.ashi-+Uchi.mata, Sasae.tsurikomi.ashi-+Tai.otoshi,
De.ashi.harai-+Tai.otoshi, De.ashi.harai-+Yoko.gake,
Hiza.guruma-+Ko.soto.gake, Hiza.guruma-+Hane.goshi,
Ko.soto.gake-+Hane.goshi, Ko.soto.gake-+Ko.uchi.gari,
Ko.uchi.gari-+Ko.uchi.makikomi,
Uki.goshi-+O.uchi.gari, Uki.goshi-+Tsuri.goshi,
Tsuri.goshi-+O.uchi.gari,
Koshi.guruma-+Ashi.guruma,
Harai.goshi-+O.uchi.gari,
Hane.goshi-+Harai.goshi, Hane.goshi-+Hane.makikomi,
Ushiro.goshi-+Tai.otoshi, Ushiro.goshi-+Ura.nage,
Tsuri.komi.goshi-+Harai.goshi, Tsuri.komi.goshi-+Ko.uchi.gari,
Uchi.mata-+Harai.goshi,
Tai.otoshi-+Seoi.otoshi,
Uki.otoshi-+O.uchi.gari, Uki.otoshi-+Tomoe.nage
#Koshi.guruma-+Kani.bassami# since this is an illegl movement, I'm excluding it )
# 自己ループ、つまり技がそれ自身に続くことができる移動を手動で追加します
self_loops <- c(
"Osoto.gari", "Osoto.gari",
"Ippon.seoi.nage", "Ippon.seoi.nage",
"Ko.soto.gari", "Ko.soto.gari",
"Hiza.guruma", "Hiza.guruma",
"Tai.otoshi", "Tai.otoshi",
"Tsuri.komi.goshi", "Tsuri.komi.goshi"
)
attack_combinations_igraph <- add_edges(attack_combinations_igraph, self_loops)
# visNetworkで使用するためのノードデータフレームを作成します
nodes <- data.frame(
id = V(attack_combinations_igraph)$name,
label = V(attack_combinations_igraph)$name,
value = 15, # すべてのノードは同じ視覚的なサイズ
color = "lightblue",
font = list(color = "black")
)
# igraphオブジェクトからエッジリストを抽出します
edges <- igraph::as_data_frame(attack_combinations_igraph, what = "edges")
# -----------------------------
# 2. インタラクティブネットワークプロット
# -----------------------------
cat("
--- 2. Interactive Network Plot using visNetwork ---
")
# 有向矢印と物理レイアウトでインタラクティブなグラフを構築します
visNetwork(nodes, edges, main = "🥋 Judo Attack Combination Network") %>%
visNodes(font = list(size = 18)) %>%
visEdges(arrows = "to", # 矢印を表示
color = list(color = "black", highlight = "black", hover = "black")
) %>%
visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE) %>%
visPhysics(solver = "forceAtlas2Based",
forceAtlas2Based = list(gravitationalConstant = -50),
stabilization = TRUE
)
インタラクティブな柔道攻撃コンビネーションネットワークに移動する
分析を開始するために、度中心性(EA1、EA2)を調べます。これは、技が他の技をセットアップするか、または先行されるかのいずれかによって、攻撃コンビネーション内での技の直接的な重要性を定量化するノードレベルのメトリックです(アウト度数およびイン度数)(EA3、EA4)。具体的には、イン度数は、特定の攻撃にどのくらいの異なる技が一般的に先行するかを定量化し、それを頻繁なフォローアップムーブ、「フィニッシャー」攻撃としてマークします。一方、アウト度数は、ある技がどのくらいの連続する技に先行するかを測定します。