Programming language/R

[ggplot2/gganimate] 한국콘텐츠진흥원 통계자료 시각화

data_start_ 2024. 12. 27. 17:19

 

1.데이터 로드

# 구분자가 "|"인 텍스트 파일 읽기
df <- read.table("2022_conts_industry.txt", sep = "|", header = TRUE 
                 ,stringsAsFactors = FALSE)

# 데이터 확인
str(df)
## 'data.frame':    55 obs. of  5 variables:
##  $ 산업          : chr  "출판" "출판" "출판" "출판" ...
##  $ 연도          : int  2018 2019 2020 2021 2022 2018 2019 2020 2021 2022 ...
##  $ 사업체수      : int  24995 25220 25244 34011 34652 6628 6607 6144 4919 5004 ...
##  $ 매출액.백만원.: int  20953772 21341176 21648849 24697753 25191702 1178613 1337248 1534444 2132149 2624004 ...
##  $ 수출액.천달러.: int  248991 214732 345960 428379 375083 40501 46010 62715 81980 107635 ...
head(df)

2. 데이터 정제

# 데이터 변환
df$산업 <- as.factor(df$산업)  # 지역을 factor로 변환
df$연도 <- as.numeric(df$연도)  # 연도를 numeric으로 변환
# 산업 카테고리 칼럼 생성
categorize_industry <- function(industry) {
  if (industry %in% c("출판", "만화", "음악")) {
    return("미디어 및 출판")
  } else if (industry %in% c("영화", "애니메이션", "방송")) {
    return("영상 콘텐츠")
  } else if (industry %in% c("게임", "지식정보", "콘텐츠솔루션")) {
    return("디지털 및 IT 기반 콘텐츠")
  } else if (industry %in% c("광고", "캐릭터")) {
    return("마케팅 및 상업 콘텐츠")
  } else {
    return("기타")
  }
}

df$`산업(대분류)` <- sapply(df$산업, categorize_industry)

3. 데이터 요약

summary(df)
##          산업         연도         사업체수     매출액.백만원.    
##  게임      : 5   Min.   :2018   Min.   :  480   Min.   :  553290  
##  광고      : 5   1st Qu.:2019   1st Qu.: 1696   1st Qu.: 5227953  
##  만화      : 5   Median :2020   Median : 6337   Median :12207043  
##  방송      : 5   Mean   :2020   Mean   : 9680   Mean   :12058021  
##  애니메이션: 5   3rd Qu.:2021   3rd Qu.:10632   3rd Qu.:19714174  
##  영화      : 5   Max.   :2022   Max.   :35670   Max.   :26104717  
##  (Other)   :25                                                    
##  수출액.천달러.    산업(대분류)      
##  Min.   :  37877   Length:55         
##  1st Qu.: 147959   Class :character  
##  Median : 345960   Mode  :character  
##  Mean   :1045256                     
##  3rd Qu.: 697095                     
##  Max.   :8981751                     
## 
unique(df$`산업(대분류)`)
## [1] "미디어 및 출판"           "영상 콘텐츠"             
## [3] "디지털 및 IT 기반 콘텐츠" "마케팅 및 상업 콘텐츠"

4. 연도별 콘텐츠 산업의 매출액, 수출액 시각화

# 산업별 alpha 값을 설정한 벡터 생성
alpha_values <- c(
  "출판" = 0.7,
  "만화" = 0.5,
  "음악" = 1,
  "영화" = 0.7,
  "게임" = 1.0,
  "애니메이션" = 0.5,
  "방송" = 1,
  "광고" = 1.0,
  "캐릭터" = 0.7,
  "지식정보" = 0.7,
  "콘텐츠솔루션" = 0.5
)
# 필요한 라이브러리 불러오기
library(ggplot2)
library(gganimate)
library(dplyr)
## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# ggplot 기반의 애니메이션 생성
p <- ggplot(df, 
            aes(x = `매출액.백만원.`, 
                y = `수출액.천달러.`, 
                size = `사업체수`, 
                color = `산업(대분류)`,
                alpha = `산업`)) +
  geom_point(show.legend = TRUE) +
  geom_text(aes(label = `산업`), vjust = -2, size = 5, check_overlap = TRUE, color = "black") + # 텍스트 검정색으로 설정
  facet_wrap(~ `산업(대분류)`, scales = "free") +  # 산업(대분류)별 서브플롯 생성
  scale_size(range = c(5, 12)) +  # 점 크기 범위 설정
  scale_alpha_manual(values = alpha_values) +  # 산업별 alpha 설정  
  scale_color_manual(
    values = c(
      "미디어 및 출판" = "#FF9999",    # 빨강 계열
      "영상 콘텐츠" = "#FFCC66",  # 주황 계열
      "디지털 및 IT 기반 콘텐츠" = "#9999FF",      # 파랑 계열
      "마케팅 및 상업 콘텐츠" = "#66CC66"    # 초록 계열
    )
  ) +
  labs(title = 'Year: {closest_state}',  # 타이틀 포맷 수정 (4글자 연도 출력)
       x = '매출액(백만원)', 
       y = '수출액(천달러)',
       size = '사업체수',
       alpha = '산업') +
  theme(
    panel.background = element_rect(fill = "gray90", color = NA),  # 바탕색 설정
    panel.grid.major = element_line(color = "white"),  # 주요 그리드 선 색상
    panel.grid.minor = element_line(color = "white"),  # 부 그리드 선 색상
    strip.background = element_rect(fill = "gray80", color = "gray50"), # 서브플롯 제목 배경
    strip.text = element_text(color = "black"),  # 서브플롯 제목 텍스트 색상
        plot.title = element_text(face = "bold", size = 20, hjust = 0.5),  # 제목 텍스트 설정
    axis.title.x = element_text(face = "bold", size = 16),  # x축 제목 텍스트 설정
    axis.title.y = element_text(face = "bold", size = 16)   # y축 제목 텍스트 설정
  ) +
  transition_states(`연도`, transition_length = 2, state_length = 1) +  # 연도별 애니메이션 생성
  ease_aes('linear')  # 부드러운 전환


# 애니메이션 출력
#animate(
#  p,
#  width = 1200,              # 가로 길이를 1200 픽셀로 설정
#  height = 600,              # 세로 길이를 600 픽셀로 설정
#  renderer = gifski_renderer()
#  )

# GIF 생성 및 저장
#gif_file <- "animation.gif"
#animate(
#  p,
#  width = 1200,              # 가로 길이를 1200 픽셀로 설정
#  height = 600,              # 세로 길이를 600 픽셀로 설정
#  renderer = gifski_renderer(gif_file)
#  )

5. 결과물

# HTML에 GIF 포함
htmltools::tags$img(src = "animation.gif", alt = "Animated GIF", style = "width:100%;")
Animated GIF

6.결과 해석

1) 산업별 특징

  • 게임
    • 매출액과 수출액이 매년 높음
    • 매출액에서 해외 서비스의 영향이 높음
  • 음악
    • 2022년으로 갈수록 수출액의 증가폭이 높음
    • K팝 시장이 해외 팬으로 확산되는 속도가 빠름을 알 수 있다
  • 캐릭터
    • 2021년부터 매출액 및 수출액 규모가 급격히 줄어듦

2) 코로나 전/후 영향

  • 2019년에서 2020년도 변화
    • 영화 산업 : 매출액 감소하는 방향으로 이동
    • 게임 산업 : 매출액 증가폭이 큼
  • 2020년에서 2021년도 변화
    • 캐릭터 산업 : 매출액과 수출액 감소량이 큼
  • 2021년에서 2022년도 변화
    • 영화 산업 : 2020년 이전 수준으로 매출, 수출 회복세를 보임