본문 바로가기
  • "You can't manage what you can't measure" Peter Drucker
데이터 분석 (with Rstudio)

Rstudio 데이터 분석 with FIFA 월드컵 데이터 #4 (시각화)

by Vitaminymc 2023. 8. 11.
반응형

국가별 우승횟수

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 = Var1no_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))

Step 1 : country_cumulative_wins

colnames(country_cumulative_wins) <- winning_countries  #열 이름을 우승 국가명으로 변경

Step 2 : country_cumulative_wins

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]
  }
}

Step 3 : country_cumulative_wins

# 데이터프레임 생성
cumulative_df <- data.frame(year = wc_rank_by_year$year, country_cumulative_wins)

cumulative_df

  • 우르과이는 통산 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))

아르헨티나 월드컵 우승 Step Plot

# 독일 데이터 추출
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))

독일 월드컵 우승 Step Plot

# 브라질 데이터 추출
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))

브라질 월드컵 우승 Step Plot

728x90