생키 다이어그램 그리기로 비즈니스 흐름 시각화하기 – 하이브 수익 구조 분석 예제

1812년 나폴레옹의 러시아 원정에서 수십만 병사가 사라졌고, 이를 시각적으로 잘 표현한 것이 바로 생키 다이어그램(Sankey Diagram)입니다. 데이터 흐름의 시작과 끝을 선의 두께로 보여줘 각 비율을 직관적으로 전달하는 이 다이어그램은, 비즈니스의 수익과 비용 구조를 시각화하는 데 매우 유용해요.

생키 다이어그램 그리기 - 나폴레옹 예시 그림
( 출처: thoughtbot )

이번 포스트에서는 생키 다이어그램 그리기를 위해 생키네트워크(SankeyNetwork) 패키지의 옵션과 사용법을 쉽게 설명하고, 하이브의 2024년 3분기 수익 구조를 생키 다이어그램으로 표현해 보겠습니다. 자, 생키 다이어그램 그리기 한번 시작해 보실까요?

생키네트워크란 무엇인가요?

생키네트워크(SankeyNetwork)는 데이터의 흐름과 비율을 시각적으로 표현하는 R의 networkD3 패키지 함수입니다. 생키 다이어그램 그리기에서 각 흐름의 시작과 끝, 그리고 연결선의 두께는 데이터를 구성하는 비율을 의미해요. 각 흐름의 두께로 데이터의 양과 방향을 직관적으로 이해할 수 있어서 비즈니스 수익 및 비용 흐름 분석에 탁월합니다.

생키네트워크의 기본 골격과 주요 옵션 소개

생키 다이어그램 그리기를 위해 알아야 할 몇 가지 주요 요소와 옵션이 있습니다. 초보자도 쉽게 이해할 수 있도록 설명해 드릴게요.

  1. Nodes (노드): 데이터의 출발점과 도착점을 정의합니다. 각 노드는 특정 지점을 의미하며, 텍스트나 이름으로 표시할 수 있습니다.
  2. Links (링크): 각 노드를 연결하는 선으로, 데이터의 흐름을 나타냅니다. 예를 들어, “총 매출”에서 “음반/음원”으로 연결된 링크는 해당 매출의 일부를 의미해요.
  3. source와 target: 링크가 어디에서 어디로 향하는지를 지정합니다. source는 시작 노드를, target은 도착 노드를 의미합니다.
  4. value (값): 링크의 두께를 결정하는 값으로, 이 값이 클수록 연결선이 두꺼워집니다. 이를 통해 흐름의 크기를 시각적으로 강조할 수 있어요.
  5. NodeID: 각 노드에 표시할 텍스트를 정의하는 옵션입니다.
  6. units (단위): 표시되는 단위를 정의하여 데이터를 더욱 직관적으로 이해할 수 있도록 합니다.
  7. 기타 스타일 옵션:
    • fontSize: 노드와 링크의 글자 크기를 지정합니다.
    • nodeWidth: 노드의 너비를 조정해 가독성을 높일 수 있습니다.

하이브의 2024년 3분기 수익 및 비용 구조 데이터

하이브의 수익과 비용 흐름을 샹키 다이어그램으로 표현하기 위해, 다음과 같은 데이터를 사용하겠습니다:

1. 총 매출: 5,278억 원

  • 음반/음원: 2,144억 원
  • 공연: 739억 원
  • 광고/출연료: 344억 원
  • MD 및 라이선싱: 991억 원
  • 콘텐츠: 797억 원
  • 팬클럽: 259억 원

2. 매출총이익: 2,404억 원 (총 매출의 45.5%)

3. 영업이익: 541억 원 (총 매출의 10.2%)

4. 영업비용: 1,862억 원

  • 인건비: 956억 원
  • 영업외손실: 527억 원
  • 운반비: 122억 원
  • 상각비: 197억 원
  • 저작권료 및 기타 수수료: 144억 원

5. 순이익: 14억 원 (총 매출의 0.2%)

생키네트워크 패키지 설치 및 데이터 준비

이제 생키 다이어그램 그리기를 해보겠습니다. networkD3 패키지와 SankeyNetwork 함수를 사용해 데이터를 준비해 보겠습니다.

# 패키지 설치 및 로드
if (!require("networkD3")) {
    install.packages("networkD3")
}
library(networkD3)

# 하이브 수익 구조 데이터 생성
nodes <- data.frame(name = c("Total Revenue", "Album/Digital", "Concert", "Advertisement", "MD & Licensing", 
                             "Content", "Fan Club", "Gross Profit", "Operating Profit", "Operating Expenses", "Net Profit", 
                             "Non-operating Loss", "Labor Cost", "Transportation", "Depreciation", "Rent/Management", 
                             "Commission", "Other Admin"))

# links의 source와 target을 0부터 시작하는 인덱스로 수정
links <- data.frame(
    source = c(0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8),
    target = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),
    value = c(2144, 739, 344, 991, 797, 259, 2404, 1862, 541, 14, 527, 956, 122, 197, 144, 363, 78)
)

코드 설명:

  • 패키지 설치 및 로드:
    • networkD3 패키지가 설치되어 있는지 확인하고, 없다면 설치를 진행합니다.
    • library(networkD3) 명령어를 통해 패키지를 로드합니다.
  • 데이터 프레임 생성:
    • nodes 데이터프레임: 생키 다이어그램에 사용될 노드(구성요소) 이름을 정의
      • 총 매출, 각 수익/비용 항목 등 18개의 노드로 구성되어 있습니다.
  • 링크 데이터프레임 생성:
    • links 데이터프레임: 노드 간의 연결과 금액 정보를 정의합니다.

SankeyNetwork 함수로 생키 다이어그램 그리기

이제 준비한 데이터를 SankeyNetwork 함수로 시각화해 보겠습니다.

# 샹키 다이어그램 생성
sankey <- sankeyNetwork(Links = links, 
                        Nodes = nodes, 
                        Source = "source",
                        Target = "target",
                        Value = "value", 
                        NodeID = "name",
                        units = "billion KRW",
                        fontSize = 12,
                        nodeWidth = 30)

# 다이어그램 표시
print(sankey)

코드 설명:

  • 샹키 다이어그램 생성:
    • sankeyNetwork() 함수를 사용하여 샹키 다이어그램을 생성합니다.
    • 이때 다음과 같은 인수를 전달합니다:
      • Links = links: 앞서 준비한 링크 데이터프레임을 전달합니다.
      • Nodes = nodes: 앞서 준비한 노드 데이터프레임을 전달합니다.
      • Source = "source": links 데이터프레임의 source 열을 사용하겠다는 의미입니다.
      • Target = "target": links 데이터프레임의 target 열을 사용하겠다는 의미입니다.
      • Value = "value": links 데이터프레임의 value 열을 사용하겠다는 의미입니다.
      • NodeID = "name": nodes 데이터프레임의 name 열을 노드 이름으로 사용하겠다는 의미입니다.
      • units = "billion KRW": 금액 단위를 “억 KRW”로 표시하겠다는 의미입니다.
      • fontSize = 12: 노드와 링크의 글자 크기를 12로 설정합니다.
      • nodeWidth = 30: 노드의 너비를 30으로 설정합니다.
  • 다이어그램 표시:
    • print(sankey) 명령어를 통해 생성된 샹키 다이어그램을 출력/표시합니다.
생키 다이어그램 그리기 결과
( 생키 다이어그램 그리기 결과 )

마무리: 생키 다이어그램을 통한 직관적인 비즈니스 분석

하이브의 수익 구조를 샹키 다이어그램으로 시각화하니 복잡한 수익 흐름이 한눈에 보이네요. 생키네트워크(SankeyNetwork)는 비즈니스 수익 및 비용 흐름을 직관적으로 표현하는 데 큰 도움이 됩니다. 여러분도 복잡한 데이터를 쉽게 표현하고 싶다면, 이 패키지를 사용해 보세요.

참고로, 생키 다이어그램보다는 신기하지 않지만 요즘 신경망 이야기를 많이 들어 보셨을 텐데 그 신경망을 한번 그림으로 구현해보고 싶은 생각 드시지 않으셨나요? 저만 그런가요? R로 신경망 그리기: 라인별 설명으로 이해하는 신경망 구조 그리기(feat. neuralnet) 포스트 한번 봐보실래요? 생키 다이어그램 그리기 못지 않게 재미가 있습니다.

유사한 게시물