호기심 많은 분석가

[BoostCamp] Data_Viz_1. Data Visualization Introduction 본문

Coding/BoostCamp

[BoostCamp] Data_Viz_1. Data Visualization Introduction

DA Hun 2021. 8. 15. 23:12
 

부스트캠프

개발자의 지속 가능한 성장을 위한 학습 커뮤니티

boostcamp.connect.or.kr

개요

정말 이 부스트캠프의 가장 큰 장점은 어디에서도 뵙기 힘든 분들을 강사님으로 만나 뵙게된다는 것이다. Kaggle KR 오픈채팅방에 들어간 지 1년하고 조금 지났는데, 거기에서 자주 뵙던 안수빈님께 시각화를 배울 수 있다니 영광이 아닐 수 없다.


(1-1) Welcome to Visualization (OT)

  • 강사 소개

  • 서울대학교 컴퓨터공학과 석박통합과정
    • Human Computer Interaction Lab.
    • 고려대학교 사이버국방학과 졸업
  • Kaggle Notebook 국내 1위 / 세계 41위
    • Notebook : 데이터 시각화 및 데이터 분석 및 코드
  • Kaggle Korea, Data Visualization KR 커뮤니티 운영

데이터 시각화란 무엇일까

  • 데이터 시각화란 데이터를 그래픽 요소로 매핑하여 시각적으로 표현하는 것
  • 시각화는 다양한 요소가 포함된 Task
    • 목적 : 왜 시각화 하나요?
    • 독자 : 시각화 결과는 누구를 대상으로 하나요?
    • 데이터 : 어떤 데이터를 시각화할 것인가요?
    • 스토리 : 어떤 흐름으로 인사이트를 전달할 것인가요?
    • 방법 : 전달하고자 하는 내용에 맞게 효과적인 방법을 사용하고 있나요?
    • 디자인 : UI에서 만족스러운 디자인을 가지고 있나요?

강의 목표

  1. 목적에 따라 시각화를 선택하고 사용할 수 있다.
  2. 시각화 결과를 효과적으로 수용할 수 있다.


(1-2) 시각화의 요소

데이터 이해하기

  • 데이터 시각화를 위해서는 데이터가 우선적으로 필요
  • 시각화를 진행할 데이터
    • 데이터셋 관점 (global)
    • 개별 데이터의 관점 (local)
  • 어떤 데이터들이 있는지, 어떤 내용을 전달할 수 있을지 살펴보자

데이터셋의 종류

  • 수많은 데이터셋, 가볍게만 살펴보자
    • 정형 데이터
    • 시계열 데이터
    • 지리 데이터
    • 관계형(네트워크) 데이터
    • 계층적 데이터
    • 다양한 비정형 데이터

1. 정형 데이터

  • 일반적으로 csv 형태로 제공되는 데이터, 테이블 형태로 제공되는 데이터
    • Row가 데이터 1개 item
    • Column은 attribute(feature)
  • 가장 쉽게 시각화할 수 있는 데이터셋
    • 통계적 특성과 feature 사이 관계
    • 데이터 간 관계, 비교

2. 시계열 데이터

  • 시간 흐름에 따른 데이터, Time-Series
  • 기온, 주가 등 정형 데이터와 음성, 비디오와 같은 비정형 데이터가 존재
  • 시간 흐름에 따른 추세(Trend), 계절성(Seasonality), 주기성(Cycle) 등을 살핌

3. 지리/지도 데이터

  • 지도 정보와 보고자하는 정보 간의 조화 중요 + 지도 정보를 단순화시키는 경우도 존재
    • 나와 가까운 진료소는 어딘지, 어디에 진료소가 많은 지
  • 거리, 경로, 분포 등 다양한 실사용
    • 실제로 어떻게 사용할 수 있을 지가 중요하고, 거리 정보가 중요하기 때문에 이 지도를 표현하는 방식 이외에도 위도, 경도들도 학습해야한다.

4. 관계 데이터

세익스피어 작품 인물 관계도

  • 객체와 객체 간의 관계를 시각화
    • Graph Visualization / Network Visualization
  • 객체는 Node로, 관계는 Link로
  • 크기, 색, 수 등으로 객체와 관계의 가중치를 표현
  • 휴리스틱하게 노드 배치를 구성

5. 계층적 데이터

한국 수출의 세부 관계를 보여주는 계층적 시각화

  • 관계 중에서도 포함관계가 분명한 데이터. Ex) 회사 조직도, 집안 가계도
    • 네트워크 시각화로도 표현 가능
  • Tree, Treemap, Sunburst 등이 대표적이다.

데이터의 종류

  • 데이터의 종류는 다양하게 분류 가능
  • 대표적으로 4가지로 분류
    • 수치형(numerical)
      • 연속형(continuous) : 길이, 무게, 온도 등
      • 이산형(discrete) : 주사위 눈금, 사람 수 등
    • 범주형(categorical)
      • 명목형(nominal) : 혈액형, 종교 등
      • 순서형(ordinal) : 학년, 별점, 등급 등

시각화 이해하기

1. 마크와 채널

  • A mark is a basic graphical element in an image
    • mark : 점, 선, 면으로 이루어진 데이터 시각화
  • A visual channel is a way to control the appearance of marks, independent of the dimensionality of the geometric primitive
    • 점,선,면에서 변형을 줄 수 있는 것을 channel이라 한다.
    • 각 마크를 변경할 수 있는 요소들

2. 전주의적 속성

  • Pre-attentive Attribute
  • 주의를 주지 않아도 인지하게 되는 요소
    • 시각적으로 다양한 전주의적 속성이 존재
    • 위의 그림만 봐도 각 그림 별로 어떤 객체가 다른 지 바로 인식 가능함
  • 동시에 사용하면 인지하기 어려움
    • 적절하게 사용할 때, 시각적 분리(Visual pop-out)

(1-3) Python과 Matplotlib

왜 Matplotlib일까?

  • Matplotlib은 Python에서 사용할 수 있는 시각화 라이브러리.
  • 현재 사용되고 있는 다양한 데이터 분석 및 머신러닝/딥러닝은 Python에서 이뤄지고 있다.
  • numpyscipy를 베이스로 하여 다양한 라이브러리와 호환성이 좋다.
    • Scikit-Learn, PyTorch, Tensorflow
    • Pandas
  • 다양한 시각화 방법론을 제공한다.
    • 막대그래프
    • 선그래프
    • 산점도
    • ETC
  • 그 외에도 Seaborn, Plotly, Bokeh, Altair 등의 시각화 라이브러리가 존재
    • Matplotlib가 범용성이 제일 넓고, base가 되는 라이브러리

기본 Plot

1. Figure와 Axes

  • matplotlib에서 그리는 시각화는 Figure라는 큰 틀에 Ax라는 서브플롯을 추가해서 만든다.
fig = plt.figure()
plt.show()
# <Figure size 432x288 with 0 Axes>
# jupyter나 iPython에서는 plt.show()가 없어도 실행되지만, 다른 곳에서는 필수
# 아무것도 출력되지 않음
flg = plt.figure(figsize=(12, 7)) # figsize를 통해 figure의 크기 조정
ax = fig.add_subplot()
plt.show()
# 아래처럼 그래프가 추가된다.

fig = plt.figure()
ax1 = fig.add_subplot(121) 
# ax = fig.add_subplot(1, 2, 1)로 사용가능
ax2 = fig.add_subplot(122) 
plt.show()
# 이렇게 사용하면 그래프를 2개로 나눌 수 있음

fig = plt.figure(figsize=(12, 7))
fig.set_facecolor('black')
ax = fig.add_subplot()
plt.figure()
# 아래 그림을 통해 figure에 black 색상을 set_facecolor 명령어를 통해 씌워주고
# subplot을 추가해준 것을 확인할 수 있다. 

2. 서브플롯 객체 ax에 그리기

  • ax 객체에 직접 그린다. 이렇게 Matplotlib은 그릴 때 두 가지 API를 따로 지원한다.
    • Pyplot API : 순차적 방법
    • 객체지향(Obejct-Oriented) API : 그래프에서 각 객체에 대해 직접적으로 수정하는 방법
      • 두 개의 문법이 살짝 다르다.
편한 커스텀을 위해 강의 및 자료에서는 가능한 객체지향 API를 사용한다.
plt로 그리다 plt.gcf().get_axes()로 다시 서브플롯 객체를 받아서 사용할 수도 있음
fig = plt.figure()

x1 = [1, 2, 3]
x2 = [3, 2, 1]

ax1 = fig.add_subplot(211) 
ax2 = fig.add_subplot(212) 

ax1.plot(x1) 
ax2.plot(x2)
plt.show()

Plot의 요소들 알아보기

1. 한 서브플롯에서 여러 개 그리기

  • ax에는 동시에 다양한 그래프를 그릴 수 있다.
  • 동시에 그래프를 그리게 되면 색상이 자동적으로 구분됩니다.
fig = plt.figure()
ax = fig.add_subplot(111) 
# 3개의 그래프 동시에 그리기
ax.plot([1, 1, 1]) # 파랑
ax.plot([1, 2, 3]) # 주황
ax.plot([3, 3, 3]) # 초록

plt.show()

fig = plt.figure()
ax = fig.add_subplot(111) 

# 선그래프와 막대그래프 동시에 그리기
ax.plot([1, 2, 3], [1, 2, 3]) 
ax.bar([1, 2, 3], [1, 2, 3]) 

plt.show()
# 다른 종류의 그래프가 추가된다면 다시 파란색으로 시작하기에
# 색을 명시해주는 게 좋다.

2. 색상 지정하기

  • 색을 직접 명시할 수 있고, 일반적으로 color 파라미터를 통해 전달한다.
  • color를 명시하는 3가지 방법을 알아보자
    • 색에 대한 다양한 조합은 직접하면 제일 좋겠지만 rgb hex값을 검색하는 걸 추천!
fig = plt.figure()
ax = fig.add_subplot(111) 
# 3개의 그래프 동시에 그리기
ax.plot([1, 1, 1], color='r') # 한 글자로 정하는 색상
ax.plot([2, 2, 2], color='forestgreen') # color name
ax.plot([3, 3, 3], color='#000000') # hex code (BLACK)
plt.show()

3. 텍스트 사용하기

  • 정보를 추가하기 위해 텍스트를 사용할 수도 있다
  • ax에서 특정 데이터를 변경하는 경우, .set_{}() 형태의 메서드가 많다.
    • set 으로 세팅하는 정보들을 반대로 받아오고 싶을 때는 .get_{}() 형태의 메서드를 사용한다.
fig = plt.figure()
ax = fig.add_subplot(111) 
ax.plot([1, 1, 1], label='1') 
ax.plot([2, 2, 2], label='2') 
ax.plot([3, 3, 3], label='3') # label만 사용할 경우 시각화에서 드러나지 않는다
ax.legend() # 범례(legend)를 추가해줘야 함 -> 해당 그래프와 매칭되는 텍스트 정보 추가
ax.set_title('Basic Plot') # 제목(title) 추가

print(ax.get_title())
plt.show()

# 아래의 코드를 통해, subplot별로 제목을 지어줄 수도 있음
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)

ax1.set_title('ax1')
ax2.set_title('ax2')
# 여기서 figure에 전체 제목을 부여하고 싶을 때
fig.suptitle('fig') # sup는 super을 의미
plt.show()

  • 축은 ticksticklabels로 구분된다.
    • ticks은 축에 적히는 수 위치를 지정한다. (scale)
      • 쓸데없는 소숫점들을 없앨 수 있음
    • ticklabels 은 축에 적히는 텍스트를 수정한다.
      • ticks에 해당하는 축 값을 텍스트로 변환
      fig = plt.figure()
      ax = fig.add_subplot(111) 
      ax.plot([1, 1, 1], label='1') 
      ax.plot([2, 2, 2], label='2') 
      ax.plot([3, 3, 3], label='3')
      
      ax.set_title('Basic Plot')
      ax.set_xticks([0, 1, 2])
      ax.legend()
      plt.show()
      fig = plt.figure()
      ax = fig.add_subplot(111) 
      ax.plot([1, 1, 1], label='1') 
      ax.plot([2, 2, 2], label='2') 
      ax.plot([3, 3, 3], label='3')
      
      ax.set_title('Basic Plot')
      ax.set_xticks([0, 1, 2])
      ax.set_xticklabels(['zero', 'one', 'two'])
      ax.legend()
      plt.show()
  • 일반적으로 텍스트를 추가하는 2가지 방법이 있다
    • 위치가 주어지면 왼쪽 하단부를 중심으로 텍스트를 적어줌
    • ax.text
      • 원하는 위치에 텍스트를 적어준 느낌
    • ax.annotate : 얘는 화살표 등을 추가할 수 있다.
      • 원하는 포인트를 지정
fig = plt.figure()
ax = fig.add_subplot(111) 
ax.plot([1, 1, 1], label='1') 
ax.plot([2, 2, 2], label='2') 
ax.plot([3, 3, 3], label='3')

ax.set_title('Basic Plot')
ax.set_xticks([0, 1, 2])
ax.set_xticklabels(['zero', 'one', 'two'])

ax.text(x=1, y=2, s='This is Text')
ax.annotate(text='This is Annotate', xy=(1, 3),
           xytext=(1.2, 3.2), 
            arrowprops=dict(facecolor='black'),
           )

ax.legend()

plt.show()


 알고 있던 개념들이지만, 한 번 다시 짚으면서 명확히 알게되어 좋은 시간이었다. 보통은 기본 개념을 잡지 않고 구글에서 사용법들만 찾아서 쓸텐데, 이 기회에 기초부터 알아가는 것이 좋아보인다. 데이터 시각화의 종류도 저렇게 많은 줄 몰랐고, 특히 전주의적 속성이 굉장히 흥미롭다. 심리적으로도 연관성이 높아보이는데 저 분야를 잘 배워두면 나중에 회사를 가서도 꽤 도움이 될 것 같다.

 시각화를 배우다가 data.sample(), data.describe(include='all') 등 데이터 다루는 측면에서의 새로운 것도 배워서 즐겁다. :)

 

[AI Tech]Daily Report

Naver AI Tech BoostCamp 2기 캠퍼 허정훈 2021.08.03 - 2021.12.27 https://bit.ly/3oC70G9

www.notion.so