빅데이터 분석결과 해석 및 활용 - 분포 시각화

반응형

 

분포 시각화 정의

  • 데이터의 분포를 시각적으로 표현하는 기법
  • 특정 변수의 값들이 어떻게 분포되어 있는지를 파악하기 위해 사용
  • 비율로 영역을 표현하는 경우(원 그래프 등), 각 영역을 모두 합치면 1 또는 100%가 되는 특징을 가짐
  • 분포 데이터의 시각화는 최대, 최소, 전체분포를 나타내는 그래프로 표현
    • 전체의 관점에서 각 부분이 차지하는 정보를 시각화
    • 히스토그램, 파이차트, 도넛차트, 누적연속그래프, 트리맵 등

히스토그램(Histogram)

  • 막대 그래프의 일종
  • 세로축(y축)
    • 데이터의 분포 정도를 표현
  • 가로축(x축)
    • 특정 변수의 구간 폭을 표현
  • 데이터셋 안에서 특정 변수의 값이 어떻게 분포되어 있는지를 파악해야 하는 경우(도수분포) 주로 사용
    • 도수분포표 : 데이터 값의 다양한 산출 분포를 보여주는 목록이나 표, 일정한 범위를 기준으로 데이터 값의 발생 건수를 요약해서 표현하는 것

<도푸분포표 예시>
<히스토그램 예시>

import matplotlib.pyplot as plt

ages = ['11-20', '21-30', '31-40', '41-50', '51-60', '61-70']
counts = [35, 54, 98, 129, 77, 43]

plt.bar(ages, counts)
plt.title('Age Distribution')
plt.xlabel('Age Range')
plt.ylabel('Number of People')
plt.show()
  • 적절한 구간 폭을 선택하고 각각의 막대가 동일한 폭을 갖도록 설정해야 시각적으로 정확하게 표현 됨
    • 구간을 설정해서 데이터를 표현하기 때문
    • 구간폭을 좁게 할 경우 : 데이터 분포 차이를 잘 표현할 수 있지만 전체적인 흐름 파악 어려움
    • 구간폭을 넓게 할 경우 : 데이터 분포의 급격한 변화를 표현하기가 어려움
  • 히스토그램의 치우침에 대한 설명
    • 왼쪽으로 치우침 : 데이터의 값이 낮은 구간에 몰려 있음을 의미
    • 오른쪽으로 치우침 : 데이터의 값이 높은 구간에 몰려 있음을 의미
  • 누적히스토그램(Cumulative Histogram)
    • 히스토그램의 각 구간의 값을 누적하여 표현한 것
    • 데이터의 출현 빈도를 오른쪽으로 누적하면서 표시
    • 마지막 막대는 전체 데이터의 총 수를 의미

<누적 히스토그램 예시, 출처 위키독스>

import matplotlib.pyplot as plt
weight = [68, 81, 64, 56, 78, 74, 61, 77, 66, 68, 59, 71,
          80, 59, 67, 81, 69, 73, 69, 74, 70, 65]
# cumulative : 누적 히스토그램 표현, 기본값은 False
plt.hist(weight, cumulative=True, label='cumulative=True')
plt.hist(weight, cumulative=False, label='cumulative=False')
plt.legend(loc='upper left')
plt.show()

원 그래프(파이 차트, Pie Chart)

  • 하나의 원을 구성하는 데이터의 비율에 따라 조각으로 나누어서 데이터의 분포를 표현
  • 데이터의 값을 비율(%)로 환산하여 표현, 각 비율을 합하면 100%가 됨
  • 장점
    • 원을 구성하는 각각의 요소의 비율을 한눈에 표시
  • 단점
    • 막대그래프와 같이 데이터의 값을 정확하게 표현하기 어려움
  • 여러 분류에 대한 값을 표현하기 위해서는 각각의 차트 필요
    • 하나의 분류에 대한 값의 분포를 표현하기 때문

<파이 차트 예시, 출처 위키독스>

import matplotlib.pyplot as plt

ratio = [34, 32, 16, 18]
labels = ['Apple', 'Banana', 'Melon', 'Grapes']
explode = [0.05, 0.05, 0.05, 0.05]
colors = ['#ff9999', '#ffc000', '#8fd9b6', '#d395d0']

plt.pie(ratio, labels=labels, autopct='%.1f%%', startangle=260, counterclock=False, explode=explode, shadow=True, colors=colors)
plt.show()

도넛 차트(Donut chart, Nested donut chart)

  • 막대 그래프를 누적하고 도넛 모양으로 만든 형태
  • 도넛 차트와 파이 차트의 차이
    • 파이 차트 : 면적으로 분포비율을 표현
    • 도넛 차트 : 면적이 아닌 길이로 데이터 값의 정도를 표현
  • 같은 성격의 데이터인 경우 여러 개의 차트를 겹쳐서 표현 가능
    • 중첩 도넛 차트 : 도넛 차트 여러 개를 겹쳐서 표현한 것, 여러 분류에 대한 값을 하나의 차트로 표현

<도넛 차트의 예시, 출처 matplotlib>

 

<중첩 도넛 차트의 예시, 출처 matplotlib>

fig, ax = plt.subplots()

size = 0.3
vals = [60, 32, 37, 40, 29, 10]
vals2 = [50, 40, 35, 55, 10, 30]
labels = ['a','b','c','d','e','f']

cmap = plt.colormaps["tab20c"]
colors = cmap([1, 2, 5, 6, 9, 10])

ax.pie(vals2, labels=labels, colors=colors, radius=1, autopct='%.1f%%', wedgeprops=dict(width=size, edgecolor='w'))
ax.pie(vals, labels=labels, colors=colors, radius=1-size, autopct='%.1f%%', wedgeprops=dict(width=size, edgecolor='w'))

plt.show()

트리맵(Tree Map)

  • 전체 데이터를 표현하는 하나의 사각형 영역에 세부 사각형들의 크기로 데이터의 분포를 시각화하여 표현
  • 하나의 대분류에 속한 세부 분류 데이터들의 분포를 영역의 크기를 이용하여 효과적으로 표현
  • 계층형/트리 구조를 가진 데이터 표현에 유용
    • 내부의 사각형도 하위 분류를 적용해서 다시 맵을 구성할 수 있기 때문

<트리맵의 예시, 출처 codetutorial>

import matplotlib.pyplot as plt
import squarify

plt.style.use('default')
plt.rcParams['figure.figsize'] = (4, 4)
plt.rcParams['font.size'] = 12

sizes = [40, 30, 5, 25]
labels = ['A', 'B', 'C', 'D']
colors = ['lightgreen', 'cornflowerblue', 'mediumpurple', 'lightcoral']

squarify.plot(sizes, label=labels, color=colors, value=sizes)
plt.axis('off')
plt.show()

누적 연속 그래프(누적 영역 차트, Stacked area chart)

  • 시간 변화에 따른 값의 변화를 선 그래프의 영역으로 표현
    • 가로축(x축) : 시간 표현
    • 세로축(y축) : 데이터 값을 표현
  • 누적 막대 그래프와 유사하지만, 시간에 따라 변화하는 값의 흐름을 더 잘 표현
    • 세로 영역의 한 단면만 봐도 그 시점의 분포 확인 가능
  • 장점
    • 아래 부분의 데이터 값이 윗부분의 위치에 영향을 줌(값 누적)
    • 즉, 값의 분포를 표현하는데 적합
  • 단점
    • 한 집단의 경향성을 알아보기 어려움

<누석 연속 그래프의 예시, 출처 python-graph-gallery>

# library
import numpy as np
import matplotlib.pyplot as plt

# Create data
x=range(1,6)
y1=[1,4,6,8,9]
y2=[2,2,7,10,12]
y3=[2,8,5,10,6]

# Basic stacked area chart.
plt.stackplot(x,y1, y2, y3, labels=['A','B','C'])
plt.legend(loc='upper left')

참고

반응형