Rstudio 데이터 분석 with FIFA 월드컵 데이터 #4 (시각화)
국가별 우승횟수
worldcups_to_2022.csv 데이터 분석
library(tidyverse) wc_rank_by_year <- read.csv('worldcups_to_2022.csv') str(wc_rank_by_year) |
'data.frame': 22 obs. of 10 variables: $ year : int 1930 1934 1938 1950 1954 1958 1962 1966 1970 1974 ... $ host : chr "Uruguay" "Italy" "France" "Brazil" ... $ winner : Factor w/ 8 levels "Argentina","Brazil",..: 8 6 6 8 5 2 2 3 2 5 ... $ second : chr "Argentina" "Czechoslovakia" "Hungary" "Brazil" ... $ third : chr "USA" "Germany" "Brazil" "Sweden" ... $ fourth : chr "Yugoslavia" "Austria" "Sweden" "Spain" ... $ goals_scored: int 70 70 84 88 140 126 89 89 95 97 ... $ teams : int 13 16 15 13 16 16 16 16 16 16 ... $ games : int 18 17 18 22 26 35 32 32 32 38 ... $ attendance : int 434000 395000 483000 1337000 943000 868000 776000 1614677 1673975 1774022 ... |
table(wc_rank_by_year$winner) |
Argentina Brazil England France Germany Italy Spain Uruguay 3 5 1 2 4 4 1 2 |
- worldcups_to_2022.csv는 대회별 우승국가가 정리된 데이터 세트로,
- table 함수를 통해서 간단하게 국가별 우승 횟수를 알 수 있음
- 우승을 경험한 국가는 8개국
wc_rank_by_year <- wc_rank_by_year %>% mutate (winner = fct_collapse(winner, "Germany" = c("Germany", "West Germany", "East Germany"), "Czech" = c("Czechoslovakia","Czech Republic"), "Russia" = c("Soviet Union", "Russia"), "Serbia" = c("Serbia", "Yugoslavia", "FR Yugoslavia") )) |
- 동일한 국가로 분석하기 위해서 국가별 통일, 해체, 국가명 변경에 따라, 국가명이 변경된 것을 반영
- 사실, 위에 국가별 우승횟수를 고려할 때, Germany만 적용해도 됨 (나머지 국가는 우승 경험 없음)
국가별 우승횟수 막대 그래프 (Col Plot)
# 우승 횟수를 table 함수를 사용하여 산출하여, Data Frame으로 변환 no_winner_by_country <- as.data.frame(table(wc_rank_by_year$winner)) str(no_winner_by_country) |
'data.frame': 8 obs. of 2 variables: $ Var1: Factor w/ 8 levels "Argentina","Brazil",..: 1 2 3 4 5 6 7 8 $ Freq: int 3 5 1 2 4 4 1 2 |
# 변수(열) 명을 변경 no_winner_by_country <- no_winner_by_country %>% rename(country = Var1, no_champ = Freq ) str(no_winner_by_country) |
'data.frame': 8 obs. of 2 variables: $ country : Factor w/ 8 levels "Argentina","Brazil",..: 1 2 3 4 5 6 7 8 $ no_champ: int 3 5 1 2 4 4 1 2 |
# ggimage 패키지 불러오기 library(ggimage) # 국가명과 국기 이미지 파일 경로를 데이터프레임으로 생성 (같은 WD 기준) country_data <- data.frame( country = c("Argentina", "Brazil", "England", "France", "Germany", "Italy", "Spain", "Uruguay"), image_filename = c( "Argentina.png", "Brazil.png", "England.png", "France.png", "Germany.png", "Italy.png", "Spain.png", "Uruguay.png" ) ) # 국가명을 기준으로 두 데이터프레임을 병합 combined_data <- merge(country_data, no_winner_by_country, by = "country") # 막대 그래프 생성 ggplot(combined_data, aes(x = country, y = no_champ)) + geom_col(fill = "steelblue") + geom_image(image = combined_data$image_filename, size = .2) + geom_text(aes(label = no_champ), vjust = -1.5 ) + theme_minimal() + labs(title = "Population by Country", x = "Country", y = "Population") + coord_cartesian(ylim = c(0, max(combined_data$no_champ) * 1.2)) |
국가별 우승횟수 Step Plot
Step Plot (또는 Step Chart)
꺾은 선 그래프는 데이터의 변화를 이해하기 쉽게 보여주는 시각화 방법
데이터의 변화가 점진적으로 혹은 갑자기 발생하는 모습을 보여주기 때문에 주로 이산적인 변화를 나타내는 데 적합
주로 시간에 따른 데이터의 변화를 보여주거나 이벤트의 발생과정을 시각적으로 표현하는 데 사용
1) 이벤트 발생 시점을 표현할 때: 어떤 사건이 특정 시점에 갑자기 발생하는 경우,
해당 시점을 중심으로 각 이벤트를 나타낼 때 유용.
예) 제품 출시일, 사건 발생일 등을 Step Plot으로 표현하면 시점 간의 간격을 잘 보여 줌
2) 카테고리별 빈도수를 보여줄 때: 다양한 카테고리 간의 빈도수를 시각화할 때도 Step Plot을 활용 가능
3) 프로세스나 단계별 진행 상황을 보여줄 때: 어떤 프로세스나 단계가 순차적으로 진행될 때,
각 단계의 변화를 Step Plot으로 나타내면 프로세스의 진행 상황을 시각적으로 확인 가능
4) 이산적인 변화를 강조할 때: 데이터의 변화가 갑작스럽게 일어나는 경우,
해당 변화점을 Step Plot으로 표현하여 이러한 변화를 강조
예) 사고나 이벤트의 발생 횟수 등을 시각화할 때 유용
국가별로 연도별 우승횟수를 나타내는 데이터를 Step Plot으로 표현해 봄
각 국가의 우승횟수는 연속적인 변화가 아니라 각 연도별로 딱 한 번씩 증가하는 이산적인 값이기 때문에 Step Plot을 선택
이를 통해 어떤 국가가 어떤 시기에 우승했는지, 각 국가의 우승 횟수 차이 등을 시각적으로 파악 가능
# 우승 국가 목록 winning_countries <- unique(wc_rank_by_year$winner) winning_countries |
[1] Uruguay Italy Germany Brazil England Argentina France Spain Levels: Argentina Brazil England France Germany Italy Spain Uruguay |
# 행은 대회 횟수(22회, 연도, 데이터 행 수), 열은 우승 국가(8개국) 매트릭스(matrix) 생성 # 즉, 국가별 연도별 누적 우승 횟수를 기록하기 위한 매트릭스 생성 country_cumulative_wins <- matrix(0, nrow = nrow(wc_rank_by_year), ncol = length(winning_countries)) |
colnames(country_cumulative_wins) <- winning_countries #열 이름을 우승 국가명으로 변경 |
prev_cumulative <- rep(0, length(winning_countries)) #누적 횟수를 계산하기 전에 0으로 초기화 prev_cumulative |
[1] 0 0 0 0 0 0 0 0 |
# 국가별 연도별 누적 우승 횟수 계산 for (i in 1:nrow(data)) { for (j in 1:length(winning_countries)) { if (data$winner[i] == winning_countries[j]) { prev_cumulative[j] <- prev_cumulative[j] + 1 } country_cumulative_wins[i, j] <- prev_cumulative[j] } } |
# 데이터프레임 생성 cumulative_df <- data.frame(year = wc_rank_by_year$year, country_cumulative_wins) |
- 우르과이는 통산 2회 우승했으나, 1회대회(1930년, 우르과이 개최) 우승, 1950년 2번째 우승 후 우승 없음
- 이탈리아는 통산 4회 우승, 1934년, 1938년 연속 우승했으나, 1982년이 되어서야 3번째 우승하게 됨
- 1934년은 이탈리아 개최, 1938년 프랑스, 1983년 스페인, 2006년 독일 대회 우승
- 독일은 통산 4회 우승, 마직막 우승은 2014년 대회 (브라질 월드컵)
- 서독 : 1954년 스위스, 1974년 독일, 1990년 이탈리아 대회 우승
- 통일 독일 : 2014년 브라질 대회 우승
- 아메리카와 아시아(한일 월드컵) 대회는 아메리카 국가가 우승하고, 유럽 대회는 유럽 국각가 대부분 우승하나, 1958년 스웨덴 대회(브라질 우승)과 2014년 브라질 대회(독일 우승)는 이러한 징크스가 깨진 대회
- 브라질은 통산 5회 우승, 1958년 1962년 연속 우승, 2002년 대회 (한일 월드컵)이후 우승 없음
- 1958년 스웨덴, 1962년 칠레, 1970년 멕시코, 1994년 미국, 2002년 한일월드컵 우승
- 잉글랜드는 통산 1회 우승 1966년(잉글랜드에서 개최되고, 잉글랜드가 우승)
- 월드컵에서는 "잉글랜드"와 "영국"을 구분하기 때문에 잉글랜드로 기입함
- "잉글랜드의 여름"으로 알려져 있는 잉글랜드의 선전이 있었고, 이후로는 우승이 없음
- 아르헨티나는 통산 3회 우승 (1978년, 1986년 그리고 2022년)
- 1978년 아르헨티나, 1986년 멕시코, 2022년 카타르 대회
- 프랑스는 통산 2회 우승 (1998년, 프랑스에서 개최되고, 프랑스가 우승, 그리고 2018년 러시아 대회)
- 스페인은 통산 1회 우승 (2010년 남아공월드컵)
Step Plot
# 각 국가별로 생성된 ggplot 그래프 객체를 저장하기 위한 리스트를 초기화 # 각 국가별 그래프를 생성하여, 배열 형태로 보여주기 위해 필요 plot_list <- list() # 국가별 Step Plot 그리기 ## cale_y_continuous : # y축 레이블 정수로 표시 ## scale_x_continuous : 홀수 번째 연도만 표시 for (country in winning_countries) { plot <- ggplot(cumulative_df, aes(x = year)) + geom_step(aes(y = .data[[country]], color = country), direction = "hv") + labs(x = "Year", y = "Cumulative Wins", title = paste("Cumulative World Cup Wins -", country)) + theme_minimal() + theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1)) + scale_y_continuous(breaks = seq(0, max(country_cumulative_wins[, country], na.rm = TRUE), by = 1)) + scale_x_continuous(breaks = cumulative_df$year[c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE)]) plot_list[[country]] <- plot } library(gridExtra) # grid.arrange 함수를 사용하기 위해서 gridExtra 패키지 호출 # 그래프를 3x3 형태로 배열하고 출력 grid.arrange(grobs = plot_list, ncol = 3) |
- for (country in winning_countries) 구문은 winning_countries라는 변수에 저장된 국가들을 순차적으로 하나씩 가져와 반복적으로 코드 블록을 실행하는 역할
- winning_countries에 저장된 각 국가 이름을 순차적으로 country 변수에 할당
- 할당된 country 변수를 사용하여 해당 국가에 대한 그래프를 생성
- 생성된 그래프를 plot_list 리스트에 추가
- 다음 국가로 넘어가서 위의 과정을 반복
- 모든 국가에 대한 그래프 생성과 저장이 완료되면, plot_list에는 각 국가별로 생성된 그래프 객체들이 저장
grid.arrange 함수
grid.arrange 함수는 R의 gridExtra 패키지에 속하는 함수로, 여러 개의 그래프나 플롯을 하나의 레이아웃으로 배열하여
하나의 그림으로 표시할 때 사용
# 두 개의 그래프 생성 plot1 <- ggplot(mtcars, aes(x = mpg, y = disp)) + geom_point() plot2 <- ggplot(mtcars, aes(x = wt, y = hp)) + geom_point() # 그래프를 나란히 1x2로 배열하여 표시 grid.arrange(plot1, plot2, ncol = 2) |
- ggplot2 패키지의 두 개의 그래프를 grid.arrange 함수를 사용하여 나란히 배열
- 하나의 그림으로 두 개의 그래프가 표시
# 두 개의 그래프 생성 plot1 <- ggplot(mtcars, aes(x = mpg, y = disp)) + geom_point() plot2 <- ggplot(mtcars, aes(x = wt, y = hp)) + geom_point() # 그래프를 1x2로 배열하여 표시하고, 열 너비와 행 높이 지정 grid.arrange(plot1, plot2, ncol = 2, widths = c(2, 1), heights = c(1, 2)) |
- grid.arrange 함수로 두 개의 그래프를 1x2 행렬로 배열
- widths와 heights를 사용하여 첫 번째 그래프의 열 너비를 두 번째 그래프의 2배로,
첫 번째 그래프의 행 높이를 두 번째 그래프의 2배로 지정 - 첫 번째 그래프가 더 넓고, 두 번째 그래프가 더 높게 표시
# 아르헨티나 데이터 추출 argentina_data <- cumulative_df %>% select(year, Argentina) # 아르헨티나 우승한 연도 자동 추출 argentina_wins <- filter(argentina_data, Argentina > lag(Argentina, default = 0)) # Step Plot 그리기 ggplot(argentina_data, aes(x = year, y = Argentina)) + geom_step() + geom_text(data = argentina_wins, aes(label = year), hjust = -0.2, vjust = -0.2, color = "red") + labs(title = "아르헨티나 월드컵 누적 우승 횟수", x = "년도", y = "누적 우승 횟수") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) |
# 독일 데이터 추출 germany_data <- cumulative_df %>% select(year, Germany) # 독 우승한 연도 자동 추출 germany_wins <- filter(germany_data, Germany > lag(Germany, default = 0)) # Step Plot 그리기 ggplot(germany_data, aes(x = year, y = Germany)) + geom_step() + geom_text(data = germany_wins, aes(label = year), hjust = -0.2, vjust = -0.2, color = "red") + labs(title = "독일 월드컵 누적 우승 횟수", x = "년도", y = "누적 우승 횟수") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) |
# 브라질 데이터 추출 brazil_data <- cumulative_df %>% select(year, Brazil) # 브라질 우승한 연도 자동 추출 brazil_wins <- filter(brazil_data, Brazil > lag(Brazil, default = 0)) # Step Plot 그리기 ggplot(brazil_data, aes(x = year, y = Brazil)) + geom_step() + geom_text(data = brazil_wins, aes(label = year), hjust = -0.2, vjust = -0.2, color = "red") + labs(title = "브라질 월드컵 누적 우승 횟수", x = "년도", y = "누적 우승 횟수") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) |