캐나다 NHL 선수, 출생 날짜가 여전히 운명을 좌우하는가?

R-Blogger · 블로그·해설 · 2023-12-18

R-Blogger블로그·해설한국어2023-12-18

캐나다 NHL 선수, 출생 날짜가 여전히 운명을 좌우하는가?

서론 Malcolm Gladwell의 Outliers 첫 장에서는 캐나다 주니어 하키에서 선수들이 연초에 태어날 확률이 높다고 설명합니다. 그의 말에 따르면, 이 아이들은 같은 해 내에서 상대적으로 나이가 많아 중요한 팀에 빨리 진입하며, 그로 인해 기술 개발에 더 많은 자원을 할당받는다는 것이 핵심입니다. 분명히 연초 몇 달에 태어난 선수가 더 많다는 것은 명백하지만, 그 현상이 예측 가능한 것인지 여부는 탐구되지 않았습니다. 혹시 캐나다 전체에서 사람들이 연초에 태어나는 편인가요? 본 분석에서는 Gladwell의 결과가 기대되는지, 그리고 오늘날 NHL에서도 캐나다 출생 선수에게 동일한 현상이 나타나는지를 살펴보려 합니다. 이를 위해 Statistics Canada의 출생률 데이터와 NHL API의 선수 명단 데이터를 다운로드합니다. 데이터 다운로드는 httr 패키지, 조작은 tidyverse, 시각화는 ggtext, ggimage, scales 를 사용합니다. library(tidyverse) library(httr) library(scales) library(ggimage) library(ggtext) Section 1: 캐나다의 월별 출생 분포는? Gladwell의 주장은 청소년 하키의 기준이 연초에 태어난 주니어 하키 선수들을 유리하게 만든다는 점에 기초합니다. 저 역시 그 주장이 맞다고 생각하지만, 만약 캐나다 전체에서 연초에 태어나는 편이라면 이는 특이 현상이 아니라 인구 통계상 대표적인 현상이 될 수 있습니다. 월별 출생 데이터는 Statistics Canada에서 찾을 수 있습니다. 처음에는 rvest 로 표를 웹 스크래핑하려 했지만, “Number” 행을 처리하는 방법을 찾지 못했습니다. CSV 파일로 다운로드 가능했으므로 httr 로 다운로드 링크에 호출을 보내 파일을 가져오는 방식을 사용했습니다. URL은 Firefox의 inspect 옵션에서 다운로드 링크를 클릭해 찾았습니다. canada_raw %% content() GET() 명령은 서버에 요청을 보내고 content() 함수는 결과를 반환합니다. content() 함수를 쓰지 않으면 호출에 대한 헤더, 요청 URL 등 많은 추가 정보가 나타납니다. 원시 데이터는 분석에 불필요하거나 중복된 열이 많습니다: REF_DATE, GEO, DGUID, Month of birth, Characteristics, UOM, UOM_ID, SCALAR_FACTOR, SCALAR_ID, VECTOR, COORDINATE, VALUE, STATUS, SYMBOL, TERMINATED, DECIMALS 등입니다. 1991년부터 2022년까지의 데이터를 가져왔으며, 각 연도마다 합계 행과 월별 행이 있습니다. 데이터를 정리하려면 str_detect() 로 합계 행을 제외하고, REF_DATE 를 연도로 유지하며, Month of birth 에서 월을 추출하고 VALUE 를 실제 출생 수로 사용합니다. canada_births %>% filter(!str_detect(`Month of birth`, 'Total')) %>% transmute(REF_DATE, MONTH = str_extract(`Month of birth`, 'Month of birth, (\\w+)', 1), VALUE) %>% group_by(MONTH) %>% summarize(country_births = sum(VALUE)) %>% mutate(country_pct = country_births/sum(country_births)) 이제 dplyr 함수를 이용해 분포를 계산할 수 있습니다. 캐나다 월별 실제 분포와, 매일이 같은 확률을 가정했을 때의 기대 분포를 비교하면 다음과 같습니다. canada_births %>% transmute(`Canada %` = country_pct, `Expected % from Days in Month` = case_when( MONTH %in% c('April', 'June', 'September', 'November') ~ 30/365, MONTH == 'February' ~ 28/365, TRUE ~ 31/365), `Difference` = `Canada %` - `Expected % from Days in Month`, month_id = factor(MONTH, levels = c('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'))) %>% gather(lbl, value, -month_id) %>% spread(month_id, value) %>% mutate(lbl = factor(lbl, levels = c('Canada %', 'Expected % from Days in Month', 'Difference')), across(January:December, ~percent(.x, accuracy = .1))) %>% arrange(lbl) %>% kable(col.names = c("", names(.)[-1])) 표 결과는 다음과 같습니다. January 2.0% February 1.5% March 2.5% April 2.4% May 2.8% June 2.5% July 2.9% August 2.7% September 2.7% October 2.4% November 1.8% December 1.8% 첫눈에 보면 캐나다인은 연초(특히 1월과 2월)보다 무작위 분포보다 덜 태어나며, 연말에도 덜 태어납니다. 다음으로 캐나다 NHL 선수들의 월별 출생 분포를 살펴보겠습니다. Section 2: 캐나다 NHL 선수들의 월별 출생 분포는? NHL 선수 정보를 가져오기 위해 httr 을 사용해 NHL API를 쿼리합니다. 원본 분석은 CRAN에 있는 nhlapi 패키지를 사용했지만, NHL이 최근 몇 달에 API를 변경해 이 패키지가 더 이상 작동하지 않습니다. 2023-2024 시즌 팀 명단은 https://api-web.nhle.com/v1/roster/{team}/20232024 엔드포인트를 통해 가져올 수 있습니다. {team} 은 세 글자 코드입니다. 각 팀 코드를 얻기 위해서는 https://api.nhle.com/stats/rest/en/team 엔
원문 URL
전체 글은 원문 페이지에서 이어서 읽을 수 있습니다.
원문에서 전체 글 읽기
작성자
R-Blogger
출처
R-Blogger
플랫폼
R-Blogger
분류
블로그·해설
언어
한국어
발행일
2023-12-18