25.05.19 코딩 공부 시작

코딩 척척석박사 분들 피드백 환영합니다.

공대생이 코딩에서 살아남기

특강/전처리 & 시각화

[전처리&시각화] 4일차(06.02)

코딩 아가 2025. 6. 2. 20:22

데이터 시각화(Data Visualization)란?

숫자와 텍스트로 이루어진 데이터를 차트, 그래프, 지도 등의 시각적 요소로 표현하는 과정

탐색적 데이터 분석(EDA)이란?

새로운 데이터셋을 본격적인 분석 및 모델링 전, 데이터의 생김새, 특징, 문제를 파악하는 과정

  • 데이터의 분포를 파악 (히스토그램, 박스플롯)
  • 변수 간의 관계를 발견 (산점도, 상관관계 히트맵)
  • 이상치(Outlier)를 탐지
  • 결측치 패턴을 확인
  • 가설 생성과 검증을 지원

1. Matplotlib 

  • 세밀한 제어 가능, 모든 요소를 직접 조정
  • 학습 곡선이 높은 편
  • 정적(static) 시각화에 특화

2. Seaborn 

  • 통계 시각화에 특화
  • Matplotlib을 기반으로 하지만 더 간단한 문법
  • 아름다운 기본 스타일

3. Plotly, Altair, Bokeh 

  • 인터랙티브 시각화 지원
  • 웹 기반 시각화
  • 복잡한 시각화를 간단한 코드로 구현

matplotlib의 문법 2가지

2가지 인터페이스 1. pyplot 2. 객체 지향
사용 목적 간단하고 빠른 시각화 여러 개의 서브플롯 및 정교한 제어에 적합
사용 방식 전역 상태에서 명령어로 작업 (plt.plot()) 명시적으로 **캔버스(fig)**와 축(ax) 생성
서브플롯 제어 서브플롯 생성 및 제어가 제한적 서브플롯을 명확히 제어 가능
플롯 제어 범위 전역으로 전체에 영향을 미침 개별 축(ax) 단위로 제어 가능
레이블 추가 방식 plt.xlabel('X축') ax.set_xlabel('X축')
범례 추가 방식 plt.legend() ax.legend()
복잡한 레이아웃 복잡한 플롯 생성이 어려움 여러 축을 명확히 제어 가능
코드의 명확성 코드가 간단하고 직관적 더 많은 코드가 필요하지만 명확함
커스터마이징 자동 스타일에 의존 세부적인 스타일 제어 가능
복잡한 플롯 단순한 단일 플롯에 적합 복잡한 레이아웃 및 서브플롯에 적합
사용 난이도 초보자에게 쉬움 더 많은 학습이 필요
장점 빠르고 간단한 코드로 플롯 생성 가능 서브플롯, 축, 스타일 등 세부 제어 가능
단점 복잡한 레이아웃 제어에 한계 코드가 길어지고 학습 곡선이 존재

종류

1. Line Plot: 시간에 따른 데이터의 변화

import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]

plt.plot(x, y)
plt.show()
fig, ax = plt.subplots()  # Figure와 Axes 객체 생성
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]

ax.plot(x, y)
plt.show()

2. Bar Chart: 카테고리별 데이터 값을 비교(수직, 수평horizontal)

categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 30]

plt.bar(categories, values)
plt.show()
ax.bar(categories, values)

3. Scatter Plot: 두 변수 간의 관계를 탐색

  • 오버플로팅 조심>>점 크기 축소, 투명도 적용, 2D밀도 활용, 일부샘플링
x = [5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6]
y = [99, 86, 87, 88, 100, 86, 103, 87, 94, 78, 77, 85, 86]

plt.scatter(x, y, marker='v')
plt.show()
ax.scatter(x, y, marker='v' )

4. Histogram: 데이터의 분포를 파악

import numpy as np
import matplotlib as mpl
mpl.rcParams['axes.unicode_minus'] = False     #마이너스 깨짐 방지
data = np.random.randn(1000)

plt.hist(data, bins=30)                                         #bins: 그래프 분할 수 !!중요!!
plt.show()
ax.hist(data, bins=30)

5. Pie Chart: 전체에 대한 각 부분의 비율(신중하게 사용)

sizes = [10, 20, 25, 30]
labels = ['A', 'B', 'C', 'D']

plt.pie(sizes , labels=labels)
plt.show()
ax.pie(sizes , labels=labels)

6. Stack Plot: 시간에 따라 여러 그룹의 변화를 함께 보여줄 때

x = [1, 2, 3, 4, 5]
y1 = [1, 1, 2, 3, 5]
y2 = [0, 4, 2, 6, 8]
y3 = [1, 3, 5, 7, 9]

plt.stackplot(x, y1, y2, y3, labels=['Y1', 'Y2', 'Y3'])
plt.legend(loc='upper left')                                     #loc(범례)를 좌측 상단에 표시
plt.show()
         
plt.show()
ax.stackplot(x, y1, y2, y3, labels=['Y1', 'Y2', 'Y3'])
ax.legend(loc='upper left')

7. Box Plot: 데이터의 분포와 이상치를 파악할 때 사용

data = np.random.rand(10, 4)       #np.random.rand:시간마다 다른 랜덤 데이터
plt.boxplot(data)
plt.show()
ax.boxplot(data)

8. Violin Plot: box와 비슷 but, 데이터 분포의 밀도도 함께 보여줌

data = np.random.rand(10, 4)
plt.violinplot(data)
plt.show()
ax.violinplot(data)

좋은 시각화란?

  • 명확성(Clarity)
  • 단순성(Simplicity)
  • 목적성(Purpose)
  • 일관성(Consistency)