The Age Gap: Female vs Male Chess Players Worldwide
The global chess landscape shows women competing at younger ages than men universally, while India stands out as having the youngest average age among all major chess federations.
#TidyTuesday
Author
Aditya Dahiya
Published
September 26, 2025
About the Data
This dataset features chess player ratings from the FIDE (International Chess Federation) for August and September 2025, sourced from FIDE’s monthly rating publications available on their official website. Chess ratings, based on the Elo rating system, provide a numerical estimate of a player’s strength relative to other competitors, with ratings increasing or decreasing based on performance against expected outcomes. The September 2025 rating list reflects results from major tournaments including the Sinquefield Cup, Quantbox Chennai Grand Masters, 61st International Akiba Rubinstein Chess Festival, and the Spanish League Honor Division 2025 held in Linares. Each player record includes their unique FIDE identification number, federation code (similar to IOC country codes), various titles ranging from Grandmaster (GM) to Candidate Master (CM), current Elo rating, number of games played, and birth year. The dataset was curated by Jessica Moore as part of the #TidyTuesday weekly data project, providing researchers and chess enthusiasts with comprehensive rating data to analyze player improvements, federation distributions, ranking changes, and youth player performance trends.
Figure 1: This population pyramid visualization displays the average age and player count distribution across the top 20 chess federations by total registered players from FIDE’s August 2025 ratings. Each horizontal bar represents a federation, with blue bars extending rightward showing male players and pink bars extending leftward representing female players. The length of each bar corresponds to the average age of players in that gender group, while the numbers displayed indicate the total count of registered players. Country flags appear at the center dividing line between male and female demographics. The x-axis represents average age in years, with the scale showing absolute values for both directions. The data illustrates a consistent pattern where female players maintain younger average ages than their male counterparts across all federations.
How I Made This Graphic
Loading required libraries
Code
pacman::p_load( tidyverse, # All things tidy scales, # Nice Scales for ggplot2 fontawesome, # Icons display in ggplot2 ggtext, # Markdown text support for ggplot2 showtext, # Display fonts in ggplot2 colorspace, # Lighten and Darken colours patchwork # Composing Plots)fide_ratings_august <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-09-23/fide_ratings_august.csv')# fide_ratings_september <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-09-23/fide_ratings_september.csv')
Visualization Parameters
Code
# Font for titlesfont_add_google("Saira",family ="title_font")# Font for the captionfont_add_google("Saira Condensed",family ="body_font")# Font for plot textfont_add_google("Saira Extra Condensed",family ="caption_font")showtext_auto()# A base Colourbg_col <-"white"seecolor::print_color(bg_col)# Colour for highlighted texttext_hil <-"grey40"seecolor::print_color(text_hil)# Colour for the texttext_col <-"grey30"seecolor::print_color(text_col)line_col <-"grey30"# Define Base Text Sizebts <-80# Caption stuff for the plotsysfonts::font_add(family ="Font Awesome 6 Brands",regular = here::here("docs", "Font Awesome 6 Brands-Regular-400.otf"))github <-""github_username <-"aditya-dahiya"xtwitter <-""xtwitter_username <-"@adityadahiyaias"social_caption_1 <- glue::glue("<span style='font-family:\"Font Awesome 6 Brands\";'>{github};</span> <span style='color: {text_hil}'>{github_username} </span>")social_caption_2 <- glue::glue("<span style='font-family:\"Font Awesome 6 Brands\";'>{xtwitter};</span> <span style='color: {text_hil}'>{xtwitter_username}</span>")plot_caption <-paste0("**Data:** FIDE (International Chess Federation)"," | **Code:** ", social_caption_1," | **Graphics:** ", social_caption_2)rm( github, github_username, xtwitter, xtwitter_username, social_caption_1, social_caption_2)# Add text to plot-------------------------------------------------plot_title <-"Gender and Age Patterns in Chess players"plot_subtitle <-"International chess reveals a striking pattern where <span style='color:#9E0C5BFF'>**female**</span> players are consistently younger than <span style='color:#003DA5FF'>**males**</span><br>across all federations, with India demonstrating the most youthful chess community globally."str_view(plot_subtitle)
# Saving a thumbnaillibrary(magick)# Saving a thumbnail for the webpageimage_read(here::here("data_vizs","tidy_fide_chess_ratings.png")) |>image_resize(geometry ="x400") |>image_write( here::here("data_vizs","thumbnails","tidy_fide_chess_ratings.png" ) )