데이터 시각화를 위해서는 데이터 가 우선적으로 필요
시각화를 진행할 데이터
데이터셋의 종류
정형 데이터
시계열 데이터
지리 데이터
관계형(네트워크) 데이터
계층적 데이터
비정형 데이터
데이터의 종류
수치형 (numerical)
범주형 (categorical)
마크와 채널
전주의적 속성
Pre-attentive Attribute
주의를 주지 않아도 인지하게 되는 요소
동시에 사용하면 인지하기 어려움
Matplotlib은 Python에서 사용할 수 있는 시각화 라이브러리.
현재 사용되고 있는 다양한 데이터 분석 및 머신러닝/딥러닝은 Python에서 이뤄지고 있다.
numpy와 scipy를 베이스로 하여 다양한 라이브러리와 호환성이 좋다.
다양한 시각화 방법론을 제공한다.
그 외에도 Seaborn, Plotly, Bokeh, Altair 등의 시각화 라이브러리가 존재
fig = plt.figure(figsize=(12,7)) ax = fig.add_subplot() plt.show()
fig = plt.figure(figsize=(12,7)) ax1 = fig.add_subplot(121) ax2 = fig.add_subplot(122) plt.show()
fig, axes = plt.subplots(2,1, figsize=(6,4)) # axes[0].plot() # axes[1].plot() plt.show()
[1,2,3]
데이터를 ax
에 그려보자.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()
동시에 그래프를 그리게 되면 색상이 자동적으로 구분된다.
✍입력
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()
💻출력
색을 직접 명시할 수 있고, 일반적으로 color
파라미터를 통해 전달.
✍🏻입력
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()
💻출력
✍🏻 label
과 범례(legend
)
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.legend() plt.show()
💻 출력
✍🏻 제목 title
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.legend() plt.show()
💻 출력
✍🏻 subplot title 과 figure title
fig = plt.figure() ax1 = fig.add_subplot(1,2,1) ax2 = fig.add_subplot(1,2,2) ax1.set_title("ax1") # subplot 제목 ax2.set_title("ax2") fig.suptitle("fig") # figure 제목 plt.show()
💻
✍🏻 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()
💻
✍🏻 ticklabels
은 축에 적히는 텍스트를 수정
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()
💻
✍🏻텍스트 추가 .text
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.legend() plt.show()
💻
✍🏻텍스트 추가 .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.annotate(s='This is Annotate', xy=(1, 2)) ax.legend() plt.show()
💻
.bar()
,.barh()
.bar()
에서는 bottom 파라미터를 사용.barh()
에서는 left 파라미터를 사용 2개 그룹만 비교한다면 겹쳐서 만드는 것도 하나의 선택지
같은 축을 사용하니 비교가 쉬움
그룹별 범주에 따른 bar를 이웃되게 배치하는 방법
Matplotlib으로는 비교적 구현이 까다로움 (후에 seaborn에서 다룰 예정)
.set_xticks()
, .set_xticklabels()
)앞서 소개한 내용 모두 그룹이 5개~7개 이하일 때 효과적
실제 값과 그에 표현되는 그래픽으로 표현되는 잉크 양은 비례 해야 함
반드시 x축의 시작은 zero(0)!!
막대 그래프에만 한정되는 원칙은 아니다!
더 정확한 정보를 전달하기 위해서는 정렬이 필수.
sort_values()
, sort_index()
를 사용하여 정렬데이터의 종류에 따라 다음 기준으로
여러 가지 기준으로 정렬을 하여 패턴을 발견
대시보드에서는 Interactive로 제공하는 것이 유용
.set_xlim()
, .set_ylime()
).spines[spine]
, .set_visible()
).legend()
).margins()
)필요 없는 복잡함은 NO!!!
무엇을 보고 싶은가? (시각화를 보는 대상이 누구인가?)
축과 디테일 등의 복잡함
오차 막대를 추가하여 Uncertainty 정보를 추가 가능 (errorbar)
Bar 사이 Gap이 0이라면 -> 히스토그램(Histogram)
.hist()
를 사용하여 가능다양한 Text 정보 활용하기
.set_title()
).set_xlabel()
, .set_ylabel()
)Line Plot은 연속적으로 변화하는 값을 순서대로 점으로 나타내고, 이를 선으로 연결한 그래프
꺾은선 그래프, 선 그래프, line chart, line graph 등의 이름으로 사용됨
시간/순서에 대한 변화에 적합하여 추세를 살피기 위해 사용
.line
이 아니라 .plot()
5개 이하의 선을 사용하는 것을 추천
요소는 어떤 것이 있을까?
Bar plot과 다르게 꼭 축을 0에 초점을 둘 필요는 없음
너무 구체적인 line plot보다는 생략된 line plot이 더 나을 수 있다.
생략되지 않는 선에서 범위를 조정하여 변화율 관찰 (.set_ylim()
)
규칙적인 간격이 아니라면 오해를 줄 수 있다.
규칙적인 간격의 데이터가 아니라면 각 관측 값에 점으로 표시하여 오해를 줄이자
Line은 점을 이어 만드는 요소. -> 점과 점 사이에 데이터가 없기에 이를 잇는 방법(보간)
데이터의 error나 noise가 포함되어 있는 경우, 데이터의 이해를 돕는 방법
Presentation에는 좋은 방법일 수 있으나
한 plot에 대해 2개의 축을 이중 축(dual axis)라고 함
같은 시간 축에 대해 서로 다른 종류의 데이터를 표현하기 위해서는 축이 2개가 필요
.twinx()
를 사용한 데이터에 대해 다른 단위 (ex. radian과 degree)
.secondary_xaxis()
, .secondary_yaxis()
사용2개의 plot을 그리는 것 >>>> 이중 축 사용
.scatter()
를 사용색
마커
크기
인과 관계 (causal relation)과 상관 관계 (correlation)은 다름!
인과 관계는 항상 사전 정보와 함께 가정으로 제시할 것.
Grid는 지양. 사용한다면 최소한으로
범주형이 포함된 관계에서는 heatmap 또는 bubble chart를 추천