티스토리 뷰

반응형

지난 시간에 데이터 분포가 시각적으로 어떻게 통계 그래프를 박스플롯으로 보여주는지 설명 했었는데요, 사실 정확하게 이해가 안가실 수 있습니다. 실제 데이터를 통해서 박스플롯이 어떻게 시각화하여 보여주는지 한번 해보도록 하겠습니다. 박스 플롯이 무엇인지 기억이 나지 않으신다면 아래 글을 다시한번 보고오실계요!

2023.03.15 - [Technology/AI, ML, Data] - 박스플롯(Box plot) 데이터 분석

 

박스플롯(Box plot) 데이터 분석

데이터 분석이 굉장히 중요한 시대인데요, 데이터 분석하는 방법도 굉장히 다양하게 진화되어오고 있습니다. 저는 하나의 카테고리를 잡아서 앞으로 데이터 분석에 관련된 내용을 연재하고자

hero-space.tistory.com

데이터

분석을 하기 위해서는 데이터가 필요합니다. 그런데 어떤 데이터가 필요할까요? 위에서 데이터의 분포를 시각적으로 표현한다는 이야기를 제가 했었는데요. 그렇다면 데이터가 분포되어 있는 것이 필요할 것입니다. 쉽게 날짜 기반으로 지속적인 데이터가 그런 것이죠. 이런 데이터의 항목이 여러개 일 수 있지만 각각의 항목이 분포가 잘 되어 분석하기에 용이한지 확인할 수 있습니다. 물론 데이터가 갯수가 적다면 엑셀에서 간단한 계산식을 통해서도 할 수 있지만 데이터가 많다면 계산식의 한계도 있고 데이터가 너무 많아지면 시각화하는데 한계점이 있습니다. 다만 박스플롯이 꼭 분석하기 용이하게 보여지는 것은 아닐 수 있습니다. 데이터 분석이란 목적에 맞게, 데이터를 분석하는 방법에 따라 데이터간의 연관관계를 사람이 아닌 다양한 방법으로 하는 것이기 때문에, 파이썬으로 통해 쉽게 구현해서 데이터의 분포를 시각적으로 확인해보고 인사이트를 얻어야 다음 스텝으로 나갈 수 있을 것입니다.

그렇다면 또 중요한 것이 데이터 가공이겠지요. 데이터가 쌓이는 방식이 각각 다를 수 있는데 모든 데이터가 규격화 되어 있지 않을 것입니다. 따라서 데이터 분포 시각화를 한다고 하면 그러한 포맷을 잡고, 쌓은 데이터가 그 포맷에 맞게 트랜스폼 해주면 스무스한 분석이 자동화 되겠죠? 이미 이런 서비스들은 AWS에서 나와있습니다. 다만 우리는 한달 정도 되는 데이터를 가지고 데이터 분석을 하는 방법적인 것을 할 것이기 때문에, 데이터를 가공하고 포맷팅 하는 부분은 생략 하도록 하겠습니다. 이부분은 굉장히 공수가 많이 드는 부분이고 아이디어가 필요한 부분입니다.

 

데이터 정의 및 가공

실제 자세하게 다루지 않더라도 한가지 예시를 통해 어떻게 가공해야할지 생각해보도록 하겠습니다. 사용할 데이터는 수면기록에 관한 것이고 자동으로 측정되는 다양한 방법들이 있지만 사람이 주관으로 매일 작성하는 기록으로 항목은 다음과 같습니다.

  • 언제 잠자러 갔는지
  • 잠드는데 까지 얼마나 걸렸는지
  • 잠 자고 있는 사이에 몇 번이나 깼는지
  • 깬 이유는 무엇인지
  • 깨고 나서 다시 잠들기 위한 시간은 얼마나 걸렸는지
  • 언제 일어났는지
  • 일어나서 잠자리에서 나오기 까지 걸린 시간은 얼마인지
  • 주관적인 수면의 질은 몇점인지

위 데이터는 수면에 대한 주관평가를 할 때 사용하는 것이고, 이 요소를 데이터 분석하기 위해서는 다음과 같이 할 수 있을 것입니다.

  • 잠자러 간 시각
  • 전체 수면 시간(잠자러 들어간 시간 ~ 일어나서 잠자리에서 나온 시간)
  • 실제 수면 시간(잠자러 들어간 시간 - 실제 잠들때 까지 걸린사간) ~ 일어난 시간)
  • 일어난 시각
  • 중간에 깬 횟수
  • 중간에 깬 이유
  • 수면의 질 주관 점수

이렇게 하면 날짜마다 각각의 시간이라던지, 몇 분이라던지, 횟수라던지, 몇 점이던지 하는 고정적인 숫자가 나올 것입니다. 각 요소마다 단위가 다른건 어쩔 수 없고, 또 각각의 요소마다 박스플롯으로 시각화를 할 것인지라 이렇게 해도 괜찮습니다. 그러면 엑셀에서 각 요소의 값을 날짜별로 리스트할 수 있게 만들면 데이터 정의와 가공은 다 된 것이죠.

 

파이썬으로 구현

자 이제 구현해보겠습니다. 사실, 박스 플롯 말고도 다양한 데이터 분석방법이 있기 때문에 만드는 김에 박스플롯과 대동소이한 데이터 분석기법이 돌아갈 수 있도록 구조를 잡는 것이 좋겠습니다. 다만, 이번 글에서는 박스플롯에 관한 코드 관련에 대해서만 간략하게 설명하도록 하겠습니다.

from config import *
from matplotlib import font_manager
import matplotlib.pyplot as plt
import seaborn as sns
from copy import deepcopy
import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))


def draw(log, org_data):
    log.info("Box Plot Analysis start")
    font_files = font_manager.findSystemFonts(
        fontpaths='./data/font', fontext="ttf")
    for font_file in font_files:
        font_manager.fontManager.addfont(font_file)
    font_name = font_manager.FontProperties(fname=font_files[0]).get_name()
    plt.rc('font', family=font_name)
    plt.rc('axes', unicode_minus=False)

    data = deepcopy(org_data)

    for user in data.index:
        for item in CORE_CRITERIA:
            log.info("Current Criteria: <" + item + ">")
            sns.boxplot(x=data.query("index == " + "'" + str(user) + "'").index.values,
                        y=data.query("index == " + "'" +
                                     str(user) + "'")[item].values,
                        palette='coolwarm')
            sns.set(rc={'figure.figsize': (20, 10)})
            plt.rc('font', family=font_name)
            plt.rc('axes', unicode_minus=False)

            curr_at = 'box_plot'
            username = user
            output_filename = username+'/'+curr_at+'/'+DATE+'_'+item

            # check for directory
            if not os.path.isdir(os.getcwd()+'/output/'+username):
                os.mkdir(os.getcwd()+'/output/'+username)
            if not os.path.isdir(os.getcwd()+'/output/'+username+'/'+curr_at):
                os.mkdir(os.getcwd()+'/output/'+username+'/'+curr_at)

            plt.title(username+' - '+curr_at+'_'+item)
            plt.xlabel(username)
            plt.ylabel(item)
            # plt.xticks(rotation=45)
            plt.savefig(os.getcwd()+'/output/'+output_filename+'.png')

            plt.clf()

    # Integrated Graph
    for item in CORE_CRITERIA:
        log.info("Current Criteria: <" + item + ">")
        sns.boxplot(x=data.index.values,
                    y=data[item].values,
                    palette='coolwarm')
        sns.set(rc={'figure.figsize': (20, 10)})
        plt.rc('font', family=font_name)
        plt.rc('axes', unicode_minus=False)

        curr_at = 'box_plot'
        username = 'All'
        output_filename = username+'/'+curr_at+'/'+DATE+'_'+item

        # check for directory
        if not os.path.isdir(os.getcwd()+'/output/'+username):
            os.mkdir(os.getcwd()+'/output/'+username)
        if not os.path.isdir(os.getcwd()+'/output/'+username+'/'+curr_at):
            os.mkdir(os.getcwd()+'/output/'+username+'/'+curr_at)

        plt.title(username+' - '+curr_at+'_'+item)
        plt.xlabel('User')
        plt.ylabel(item)
        plt.xticks(rotation=90)
        plt.savefig(os.getcwd()+'/output/'+output_filename+'.png')

        plt.clf()

    return

여기서 config 패키지와 같은 것은 커스텀하게 제작한 것이기 때문에 제외하고, draw 하는 부분을 보면 여러명의 사용자 각각 데이터를 가져와서 CORE_CRITERIA 즉, 위에서 설정한 요인별로 박스플롯을 이용한 분석을 통해 시각화를 하게 됩니다. 실제 파이썬에서 사용할 주요 라이브러리에 대해서 알아보고 가도록 하겠습니다.

Matplotlib 라이브러리

Matplotlib는 파이썬에서 데이터 시각화를 위한 라이브러리입니다. Matplotlib는 높은 수준의 인터페이스를 제공하여 다양한 유형의 그래프를 그릴 수 있습니다. Matplotlib은 그래프, 히스토그램, 산점도, 3D 플롯, 막대 그래프, 파이 차트 등 다양한 시각화를 지원합니다.

Seaborn 라이브러리

Seaborn은 파이썬에서 데이터 시각화를 위한 라이브러리입니다. Matplotlib 라이브러리를 기반으로 만들어졌으며, Matplotlib에 비해 더욱 간결하고 편리한 인터페이스를 제공합니다. Seaborn은 Matplotlib와 달리, 복잡한 그래프를 더욱 쉽게 그릴 수 있는 기능들을 제공합니다. Seaborn은 히트맵, 클러스터링, 시계열, 산점도 행렬, 회귀선과 같은 고급 시각화 기능을 제공합니다. 또한, 데이터셋의 분포, 이상치 등을 시각화 하는데도 유용합니다. Seaborn은 Matplotlib와 함께 사용되기 때문에 데이터 분석, 머신러닝, 딥러닝 등 드양한 분야에서 데이터 시각화를 위해 사용합니다.

https://seaborn.pydata.org/generated/seaborn.boxplot.html?highlight=boxplot

 

seaborn.boxplot — seaborn 0.12.2 documentation

seaborn.boxplot seaborn.boxplot(data=None, *, x=None, y=None, hue=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, ax=None, **kwargs) Draw a box plot to

seaborn.pydata.org

코드는 비교적 간단하지만, 데이터를 어떻게 정이하고 가공하냐가 더 큰 관건입니다. 저는 제가 가지고 있는 데이터를 가지고 가공해서 seaborn 라이브러리를 통해 boxplot을 수행했고 Matplotlib 와 함께 아래와 같은 시각화 그래프를 그릴 수 있었습니다.

박스플롯 데이터 시각화 결과

위 그림은 2가지 결과만 표시한 것인데요, 왼쪽은 수면의 질에 대한 주관 점수에 대한 전체 사용자별 분석이고, 오른쪽은 수면 중 깬 횟수에 대해서 나타낸 것입니다. 코드에서도 있지만 개인별로도 뽑을 수 있고 전체 인원을 한번에 그래프로 그려볼 수 도 있습니다. 데이터의 모수가 많진 않으니, 일부 인원만 유효한 결과가 나오는 분석보다는 전반적인 경향성을 볼 수 있는 형태가 좋을 것 같은데요, 아무래도 박스플롯 형태의 데이터 분석만을 보고는 이것을 통해 수면이 좋아졌다고 말 할 수는 없어 보입니다. 아무래도 각각의 요인이 결합되서 판단을 해야할 것 같은데요. 이번 것은 개개인별로 기록한 수면 평가의 요인들이 유효한 분포가 박스안에서 보여짐으로써 전체적인 형태를 한눈에 볼 수 있다는 점이 될 것 같습니다. 아직도 조금은 난해할 수 있지만 다음 데이터 분석을 해보며 비교해보도록 하겠습니다.

반응형
댓글