The Dynamics of the “Gentle Way”: Exploring Judo Attack Combinations as Networks in R | R-bloggers
Pangram verdict · v3.3
We believe that this text is a mix of AI and human-written content.
AI likelihood · overall
MixedArticle text · 754 words · 1 segments analyzed
[This article was first published on R Code – Geekcologist, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here) Want to share your content on R-bloggers? click here if you have a blog, or here if you don't. As the Judo World Championship draws near this June in Budapest, it feels like the perfect time to bring together my passion for Judo (and Brazilian Jiu-Jitsu) with my gusto for complex network analyses — a fusion that’s been a long time in the making! While my posts typically focus on biodiversity-related topics and statistical modeling, I’ve long considered sharing some thoughts on one of my most cherished interests: Judo. This martial art, with its rich history and intricate techniques, has fascinated me since my childhood. Judo, which means the gentle way in Japanese, is at its competitive heart a dynamic “chess match” of throws, holds, submission techniques, and strategic combinations. While individual techniques (called waza) are foundational, the real artistry lies in how they are chained together — through renraku-waza (combination techniques) and renzoku-waza (continuous combination techniques). Thus, in a Judo match, these individual techniques usually unfold as sequences of moves, often building toward a decisive action that is likely to result in a score. But how can we objectively analyze which attack combinations work best together? Which techniques serve as crucial setups, and which are reliable “killer moves”? This is where network analysis can offer us some insights. In this post, we’ll explore how to model combinations of Judo throwing techniques as a network using R, trying to uncover hidden patterns in attacking strategies. So, what we will be doing is treating each individual throwing technique as a node in a network, with an edge (or link) connecting two nodes when one technique naturally sets up or transitions into another as part of an attack sequence. In our Judo attack combination network we should be able to detect: i) which techniques are most frequently used to initiate successful combinations; ii) which techniques are common finishers, “killer moves”; iii) which techniques are most “influential” —or important— in the overall strategic attacking system? It is important to note that, this post is not intended as a comprehensive review of judo attack combinations; rather, it draws from some classic literature (Kashiwazaki and Nakanishi 1995, Kawaishi 1963, van Haesendonck 1968). I will focus exclusively on two-move attack sequences using only techniques currently recognized by the Kodokan, the temple of Judo. A more exhaustive analysis—particularly relevant for high-performance athletes—would require empirical data from competitions, a broader inclusion of technical variations, etc. In any case, I believe this post offers insights that will resonate with both martial arts enthusiasts and scientists interested in network analysis. For our ecologist readers, do not worry! I will provide links to some examples of ecological applications (EA) of these network analyses. You can also find more info in older network-related pots here. Let’s start by loading the necessary packages, building the network from the compiled data, and visualizing it as an interactive network, where you can choose one node, i.e., technique, and see all its relationships. ## Packages require(igraph) require(ggplot2) require(dplyr) require(tidyr) require(RColorBrewer) require(bipartite) require(bbmle) require(influential) require(visNetwork) # ----------------------------- # 1. Build the Graph (directed) # ----------------------------- cat("\n--- 1. Creating Directed Graph of Judo Attack Combinations ---\n") # Define attack transitions between judo techniques # Each line indicates a valid transition in a combination (directed from left to right) 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 ) # We will now manually add the self-loops, that is, moves that can follow themselves 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) # Create a node data frame for use with visNetwork nodes <- data.frame( id = V(attack_combinations_igraph)$name, label = V(attack_combinations_igraph)$name, value = 15, # All nodes same visual size color = "lightblue", font = list(color = "black") ) # Extract edge list from the igraph object edges <- igraph::as_data_frame(attack_combinations_igraph, what = "edges") # ----------------------------- # 2.