본문 바로가기

R

[R] 데이터 전처리 및 시각화 (1)

Kaggle에 있는 Global Video Game Sales and Reviews 데이터셋으로 전처리 및 시각화를 해보겠습니다.

 

EDA 주제는 다음과 같습니다

① 각 플랫폼 별 발매 게임 수
② 평점 TOP 10 게임
③ 지역별 인기 장르 TOP 3 게임 ( North.America, Europe, Japan)
④ 각 지역의 연도별 판매량 변화 추이
⑤ 지역별 총 판매량 비율

 

https://www.kaggle.com/datasets/thedevastator/global-video-game-sales-and-reviews?resource=download

 

Global Video Game Sales and Reviews

Global Video Game Performance: Sales, Reviews, and Rankings

www.kaggle.com

 

먼저 위 주소에서 데이터를 다운로드한 후 Rstudio에서 csv 파일을 읽습니다.

 

# 데이터 불러오기

setwd('C:\\Users\\32217778\\Downloads\\archive')
ds = read.csv('C:\\Users\\32217778\\Downloads\\archive\\Video_Games_Sales.csv')

sum(is.na(ds))            # 결측치 확인
ds = na.omit(ds)[,c(-1)]  # 결측치, 'index' 열 제거

head(ds)
str(ds)
 
각 칼럼의 이름과 데이터 타입 확인
① 각 플랫폼 별 발매 게임 수
Platform = as.factor(ds$Platform)  # 각 범주를 정수로 인코딩

install.packages('ggplot2')        # ggplot 사용을 위해 ggplot2 패키지 설치
library(ggplot2)

ggplot(ds, aes(x = Platform, fill = Platform)) +  
  geom_bar() +                     
  labs(x = '', y = '',
       title = 'Number of Games Released by Platform') +
  theme(legend.position = "none", 
        axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=1))

 

ggplot : 데이터 프레임 'ds'를 기반으로 ggplot 객체를 생성한 후, x 축은 Paltform 열을 나타내도록 하고, Platform 열을 이용하여 그래프 색을 채우도록 설정합니다.

 

geom_bar : 각 플랫폼에 대한 막대그래프를 생성합니다.

 

labs : x 축, y 축, 그래프 제목을 지정합니다.

 

theme : 그래프의 테마를 설정하는 함수입니다.

범례를 표시하지 않도록 legend.position = "none"으로 설정하고, x 축 레이블을 45도 각도로 회전시키고,

수직 정렬을 조절하여 가독성을 높입니다.

 

- 실행 결과

플랫폼 별 발매 게임 수를 시각화한 막대그래프

② 평점 TOP 10 게임
install.packages('dplyr')    # 파이프 연산자 사용을 위해 'dplyr' 패키지 설치
library(dplyr)

top_10_review = ds %>%       # 데이터프레임 'ds'에서
  arrange(desc(Review)) %>%  # Review 열을 내림차순으로 정렬하고,
  head(10)                   # 상위 10개의 행만 선택

top_10_review[,2]            # Game.Title열만 선택

 

- 실행 결과

 


③ 지역별 인기 장르 TOP 3 게임 ( North.America, Europe, Japan)
install.packages("tidyr")     # 데이터 형태를 재구성하고 정돈하는 패키지
library(tidyr)

# TOP 3 데이터프레임 만들기

#---# [ds 데이터프레임을 장르를 기준으로 그룹화]
top_3_genre = ds %>% group_by(Genre) %>%
  
  #---# [각 장르의 지역 별 판매량 총계 계산]
  summarise(North.America = sum(North.America), Europe = sum(Europe),
            Japan = sum(Japan)) %>% 
  
  #---# [tidy 데이터 형식으로 변환 (넓은 형태 -> 긴 형태)]
  pivot_longer(cols = c('North.America', 'Europe', 'Japan'),
               names_to = 'Region', values_to = 'Sales') %>%
  
  #---# [장르별 판매량을 내림차순으로 정렬]
  arrange(Genre, desc(Sales)) %>%
  
  #---# [다시 한 번 Genre 열을 기준으로 그룹화]
  group_by(Genre) %>%
  
  #---# [각 그룹에서 상위 3개의 행 선택]
  slice_head(n = 3)

#---# [각 지역별 TOP3 추출]

top_3_genre = top_3_genre[1:9,]
 

만든 데이터 프레임을 ggplot을 사용하여 시각화합니다.

ggplot(top_3_genre, aes(x = Genre, y = Sales, fill = Region)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Top 3 Genres by Sales in Each Region",
       x = "", y = "") +
  theme_minimal() +
  facet_wrap(~ Region, scales = "free_y", nrow = 1) +
  theme(legend.position = "none", 
        axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=1))

 

ggplot : 데이터 프레임 'top_3_genre'을 기반으로 ggplot 객체 생성 후, x 축은 장르, y 축은 총 판매량, 막대 색은 지역 별로 설정합니다.

 

geom_bar : 데이터 셋에 있는 변수의 값이 막대의 높이가 되도록 stat = "identity"으로 설정하고, 막대를 나란히 그리도록 position = "dodge"으로 설정합니다.

 

facet_wrap : Region 변수를 기준으로 패널을 생성하고, 각 패널마다 y 축의 스케일을 자유롭게 설정하기 위해 free_y으로 설정하고, 행의 개수를 1로 설정하여 패널이 한 행에만 나타나도록 nrow = 1으로 합니다.

 

- 실행 결과

 
지역별 인기 장르 상위 3

 

지역에 상관없이 액션 장르의 인기가 가장 많은 것을 알 수 있습니다.


④ 각 지역의 연도별 판매량 변화 추이
#---# [ds 데이터프레임을 연도별로 그룹화]
year_data = ds %>% group_by(Year) %>% 
  
  #---# [각 그룹에서 지역별 합계 계산]
  summarize(North.America = sum(North.America), Japan = sum(Japan),
            Europe = sum(Europe), Rest.of.World = sum(Rest.of.World)) %>%
  
  #---# [각 지역의 판매량을 Region 열에, 해당 판매량을 Sales 열에 저장]
  pivot_longer(cols = c('North.America', 'Japan', 'Europe', 'Rest.of.World'),
               names_to = 'Region', values_to = 'Sales') %>%
  
  #---# [연도별로 판매량을 내림차순 정렬]
  arrange(Year, desc(Sales)) %>%
  
  #---# [다시 한 번 연도별로 그룹화]
  group_by(Year)

# Region 변수를 factor로 변환하고 원하는 순서로 지정 (범례 순서 지정)
year_data$Region = factor(year_data$Region,
                          levels = c("North.America", "Europe", "Japan", "Rest.of.World"))

year_data

 

- 실행 결과

 
# ggplot으로 시각화

ggplot(year_data, aes(x = Year, y = Sales)) +
  geom_line(aes(color = Region), lwd = 1) +
  scale_x_continuous(breaks = seq(1985, 2010, 5)) +
  scale_y_continuous(breaks = seq(0, 175, 25)) +
  labs(x = '', y = 'Total Sales (M)', title = "Regional Sales by Year") +
  scale_color_manual(values = c("North.America" = "skyblue", 
                                "Europe" = "yellowgreen", 
                                "Japan" = "pink",
                                "Rest.of.World" = 'grey'))
.

- 실행 결과

 

 

1980년부터 2000년대 후반까지 꾸준히 상승하다가 2010년 이후로 급감하는 것으로 보이는데,

이는 온라인 컴퓨터 게임 시장 활성화의 영향이 컸을 것으로 예상됩니다.


⑤ 지역별 총 판매량 비율
Region = ds[,c(7,8,9,10)]

tot_sales = apply(Region, 2, sum)  # 지역별 총합 구하기

ratio_data = data.frame(Region = c("North.America", "Europe", "Japan", "Rest.of.World"),
                   tot_Sales = apply(Region, 2, sum),
                   ratio = round(tot_sales / sum(tot_sales) * 100, 1))

# Region 변수를 factor로 변환하고 원하는 순서로 지정 (범례 순서 지정)
ratio_data$Region = factor(ratio_data$Region,
                          levels = c("North.America", "Europe", "Japan", "Rest.of.World"))

ggplot(ratio_data, aes(x = '', y = tot_Sales, fill = Region)) +
  geom_bar(width = 5, stat = "identity") +
  coord_polar("y") + 
  theme_void() +
  geom_text(aes(label = paste0(ratio, "%")), 
            position = position_stack(vjust = 0.5)) +
  labs(title = "Ratio of Sales by Region") +
  scale_fill_manual(values = c("North.America" = "skyblue", 
                                "Europe" = "yellowgreen", 
                                "Japan" = "pink",
                                "Rest.of.World" = 'grey'))

 

ggplot : ggplot 객체를 생성하고, fill = Region_name으로 지역에 따라 색을 지정합니다.

 

geom_bar : 막대를 그리는데, width 옵션으로 막대의 넓이를 조절하고, stat = "identity" 으로 실제 데이터 값을 사용합니다.

 

coord_polar("y") : 극 좌표계를 사용하여 파이 차트를 생성합니다

 

theme_void : 배경을 투명하게 만들어 전체적인 디자인을 설정합니다.

 

geom_text : 그래프 위에 비율을 나타내는 텍스트를 추가하고, vjust를 통해 텍스트의 세로 위치를 조절합니다.

 

- 실행 결과

 

데이터 제공

Andy Bramwell in Kaggle (@bramwax)