호기심 많은 분석가
[BoostCamp] Data_Viz_1. Data Visualization Introduction 본문
부스트캠프
개발자의 지속 가능한 성장을 위한 학습 커뮤니티
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) 시각화의 요소
데이터 이해하기
- 데이터 시각화를 위해서는 데이터가 우선적으로 필요
- 시각화를 진행할 데이터
- 데이터셋 관점 (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) : 학년, 별점, 등급 등
- 수치형(numerical)
시각화 이해하기
1. 마크와 채널
- A mark is a basic graphical element in an image
- mark : 점, 선, 면으로 이루어진 데이터 시각화
- 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에서 이뤄지고 있다.
numpy
와scipy
를 베이스로 하여 다양한 라이브러리와 호환성이 좋다.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()

- 축은
ticks
와ticklabels
로 구분된다.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
'Coding > BoostCamp' 카테고리의 다른 글
[BoostCamp] Data_Viz_1. Line Plot & Scatter Plot (0) | 2021.08.17 |
---|---|
[BoostCamp] Data_Viz_1. 시각화의 기본, Bar Plot (0) | 2021.08.15 |
[BoostCamp] Week2_Day10. 딥러닝의 기본을 알다. (0) | 2021.08.15 |
[BoostCamp] Week2_Day9. "Key"word. Transformer (0) | 2021.08.14 |
[BoostCamp] Week2_Day8. 피어세션 때 발표를 하다. (0) | 2021.08.12 |