Python으로 트리맵 만들기(feat. GNI 데이터 분석)

많은 사람들이 데이터 시각화를 통해 복잡한 정보를 직관적으로 이해하는 것을 좋아합니다. 특히, 트리맵(treemap)은 이러한 요구를 충족시키는 좋은 도구입니다.

파이썬 이용한 트리맵 그림

이번 포스트에서는 Python으로 트리맵을 만드는 방법을 설명하고, 이를 통해 2014년 국가별 국민총소득(GNI)을 분석해보겠습니다.

트리맵이란?

트리맵은 계층적 데이터를 직사각형 형태로 시각화하는 방법입니다. 각 직사각형의 크기는 해당 데이터의 값을 나타내며, 서로 다른 색상으로 그룹을 구분할 수 있습니다.

Python 코드 설명

1. 필요한 패키지 설치 및 로드

Python에서는 pandas, matplotlib, squarify, 그리고 rpy2 패키지를 사용합니다. 먼저 필요한 패키지를 설치하고 로드합니다.

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
import squarify
import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri

# MacOS에서 한글 폰트 설정
font_path = '/Library/Fonts/Arial Unicode.ttf'  # 실제 폰트 파일 경로로 변경
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)

# 필요한 패키지 설치 (만약 설치가 필요한 경우)
# !pip install pandas matplotlib squarify rpy2

# Rpy2를 이용한 R 패키지 설치 및 로드
robjects.r('install.packages("treemap", repos="http://cran.us.r-project.org")')
robjects.r('library(treemap)')
  • Pandas: Python에서 데이터 분석을 위한 고성능 데이터 구조와 데이터 분석 도구를 제공하는 라이브러리입니다. DataFrame 객체를 통해 데이터를 쉽게 조작하고 분석할 수 있습니다.
  • Matplotlib: Python에서 데이터를 다양한 형태로 시각화할 수 있게 해주는 라이브러리입니다. 플롯, 그래프, 히스토그램 등을 생성할 수 있습니다.
  • Squarify: 트리맵을 생성하는 Python 라이브러리입니다. 데이터의 상대적인 크기를 직사각형 형태로 시각화할 수 있습니다.
  • Rpy2: R과 Python을 연결해주는 인터페이스로, R의 데이터셋을 Python으로 불러올 수 있습니다.

2. 데이터 불러오기 및 전처리

rpy2를 이용해 R의 treemap 패키지에서 제공하는 GNI2014 데이터셋을 불러와서 전처리합니다. 파이썬 패키지 중에 사용할 만한 데이터를 찾지 못해서 R 패키지에서 데이터를 빌려왔습니다.

# R 데이터를 pandas DataFrame으로 변환
pandas2ri.activate()

# R의 treemap 패키지에서 GNI2014 데이터셋 불러오기
robjects.r('data("GNI2014")')
GNI2014 = robjects.r('as.data.frame(GNI2014)')
GNI2014 = pandas2ri.rpy2py(GNI2014)

# 상위 25% GNI 국가에 레이블 추가
GNI2014['label'] = GNI2014.apply(lambda x: x['country'] if x['GNI'] > GNI2014['GNI'].quantile(0.75) else '', axis=1)

3. 트리맵 생성

이제 squarifymatplotlib를 사용하여 트리맵을 생성합니다.

# 트리맵 생성
plt.figure(figsize=(12, 8))
colors = plt.cm.viridis(GNI2014['GNI'] / max(GNI2014['GNI']))
squarify.plot(sizes=GNI2014['GNI'], label=GNI2014['label'], color=colors, alpha=.8)
plt.axis('off')
plt.title('GNI 2014 데이터셋 트리맵', fontsize=20)
plt.suptitle('국가별 국민총소득(GNI) 비교', fontsize=16)
plt.show()

결과물 해석

위의 코드를 실행하면 포스트 상단에서와 같이 국가별 GNI를 직관적으로 비교할 수 있는 트리맵을 얻을 수 있습니다. 각 직사각형의 크기는 해당 국가의 GNI를 나타내며, 색상은 GNI 값에 따라 달라집니다.

FAQ

  1. Pandas를 사용하면 무엇을 할 수 있나요?
    • Pandas는 데이터프레임을 통해 데이터를 읽고, 쓰고, 조작하고, 분석할 수 있습니다. CSV 파일을 불러오거나 데이터의 특정 열을 선택하는 등의 작업을 쉽게 할 수 있습니다.
  2. Matplotlib와 다른 시각화 라이브러리의 차이점은 무엇인가요?
    • Matplotlib는 매우 유연하고 다양한 유형의 플롯을 생성할 수 있습니다. 그러나 초보자에게는 사용법이 복잡할 수 있습니다. Seaborn은 Matplotlib를 기반으로 하여 더 간단하게 시각화를 제공하며, Plotly는 대화형 그래프를 쉽게 만들 수 있습니다.
  3. Squarify는 어떤 경우에 유용한가요?
    • Squarify는 트리맵을 생성할 때 유용합니다. 트리맵은 데이터를 직관적으로 비교하는 데 도움이 되며, 특히 계층적 데이터나 비교를 시각적으로 명확하게 표현할 때 유용합니다.
  4. Treemap 라이브러리는 무엇을 제공하나요?
    • Treemap 라이브러리는 트리맵 시각화를 위한 데이터셋을 제공하며, 예제 데이터로 연습할 수 있도록 도와줍니다. 여기서는 load_gni2014 함수를 사용하여 2014년 GNI 데이터를 로드했습니다.
  5. 트리맵을 생성할 때 각 직사각형의 색상을 다르게 설정하려면 어떻게 해야 하나요?
    • Squarify와 Matplotlib를 함께 사용하여 색상을 설정할 수 있습니다. plt.cm.viridis와 같은 colormap을 사용하여 데이터 값에 따라 색상을 지정할 수 있습니다.
  6. 데이터 전처리에서 apply 함수는 무엇을 하나요?
    • apply 함수는 데이터프레임의 각 행 또는 열에 함수를 적용할 수 있게 해줍니다. 여기서는 각 국가의 GNI가 상위 25%에 해당하는 경우 국가 이름을 레이블로 추가하는 데 사용되었습니다.

전체 코드 및 마무리

마지막으로, 전체 코드를 정리해보겠습니다.

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
import squarify
import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri

# MacOS에서 한글 폰트 설정
font_path = '/Library/Fonts/Arial Unicode.ttf'  # 실제 폰트 파일 경로로 변경
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)

# 필요한 패키지 설치 (만약 설치가 필요한 경우)
# !pip install pandas matplotlib squarify rpy2

# Rpy2를 이용한 R 패키지 설치 및 로드
robjects.r('install.packages("treemap", repos="http://cran.us.r-project.org")')
robjects.r('library(treemap)')

# R 데이터를 pandas DataFrame으로 변환
pandas2ri.activate()

# R의 treemap 패키지에서 GNI2014 데이터셋 불러오기
robjects.r('data("GNI2014")')
GNI2014 = robjects.r('as.data.frame(GNI2014)')
GNI2014 = pandas2ri.rpy2py(GNI2014)

# 상위 25% GNI 국가에 레이블 추가
GNI2014['label'] = GNI2014.apply(lambda x: x['country'] if x['GNI'] > GNI2014['GNI'].quantile(0.75) else '', axis=1)

# 트리맵 생성
plt.figure(figsize=(12, 8))
colors = plt.cm.viridis(GNI2014['GNI'] / max(GNI2014['GNI']))
squarify.plot(sizes=GNI2014['GNI'], label=GNI2014['label'], color=colors, alpha=.8)
plt.axis('off')
plt.title('GNI 2014 데이터셋 트리맵', fontsize=20)
plt.suptitle('국가별 국민총소득(GNI) 비교', fontsize=16)
plt.show()

이 포스트에서는 Python을 사용하여 트리맵을 생성하는 방법을 배웠습니다. 이러한 시각화 기법을 활용하면 데이터를 더욱 효율적으로 분석하고 전달할 수 있습니다. 앞으로 더 많은 데이터 시각화 기술을 탐구해 보세요!

혹시 파이썬이 아니고 R을 이용해서 동일하게 시각화를 한 과정과 결과가 궁금하시면 R로 treemap 시각화하기: GNI 2014 데이터셋을 활용한 국가별 국민총소득(GNI) 비교 포스트를 확인해 보시기 바랍니다.

유사한 게시물