[251211] 내배캠 D+38

최다빈·2025년 12월 11일

판다스

목록 보기
1/1

🚀 TIL

Matplotlib · Seaborn · Figure Engineering · Accessibility · Robustness


🧭 개요

데이터를 설득력 있게 전달하는 시각적 구조를 어떻게 설계할 것인가?

1. 색상·형태·축·스케일을 포함한 시각적 표현의 정확성(Accuracy)
2. Matplotlib의 Figure/Axes 구조를 통한 통제력(Control)
3. 접근성·해석력·강건성을 모두 만족하는 실무형 그래프 설계 기법(Engineering)


1. 🎨 색상·팔레트·인코딩의 과학

그래프는 크게 세 가지 유형의 데이터에 대해 서로 다른 팔레트를 요구한다:

1.1. 데이터 유형별 팔레트 전략 👨🏻‍💻

데이터 유형적합한 팔레트예시목적
순차형(Sequential)하나의 색에서 명도·채도 변화viridis, Blues, Reds크기·순위 변화 시각화
발산형(Diverging)중심값(0)을 기준으로 양극단 대비coolwarm, vlag, RdBu양수/음수·차이·편차 표현
범주형(Qualitative)독립적이고 대비가 강한 색상Set1, tab10그룹 구분, 순서 X

1.2. 🎨 색각보정(Color-blind safe) 시각화

실무에서 가장 많이 발생하는 실수는 색상 하나만으로 정보를 구분하는 것이다.
색각 유형에 따라 특정 색상(빨강–초록, 파랑–보라 등)을 구분하지 못할 수 있다.

➡️ 해결: 색 + 형태(Style) 이중 인코딩

sns.lineplot(
    data=df, x='Time', y='Metric',
    hue='Group',
    style='Group',   # 선 스타일/마커 스타일로 추가 인코딩
    markers=True,
    dashes=False
)

장점 ☝🏻

  • 색상을 구분하기 어려워도 마커 모양으로 식별 가능
  • 인지적 부하 감소 → 그래프 해석 속도 향상
  • 출판·보고서·대시보드 어디에서도 안정적

2. 👨🏻‍🔬 Matplotlib의 엔지니어링적 활용

Matplotlib은 “그림을 그리는 도구”가 아니라,
그래프를 구성하는 객체들을 조립하는 도구이다.

☝🏻 핵심:

  • Figure: 전체 공간
  • Axes: 실제 그래프가 그려지는 영역

2.1. 📊 이중축(Twin Axes) 설계

서로 다른 스케일(예: 온도 vs 습도)을 하나의 타임라인에 담아야 하는 상황이 많다.

fig, ax1 = plt.subplots(figsize=(10, 6))

ax1.plot(time, temp, 'r-')
ax1.set_ylabel("Temperature (°C)", color='red')
ax1.tick_params(axis='y', labelcolor='red')

ax2 = ax1.twinx()
ax2.plot(time, humidity, 'b-')
ax2.set_ylabel("Humidity", color='blue')
ax2.tick_params(axis='y', labelcolor='blue')

☝🏻 실무 해석 경고 ⚠️

이중축 그래프는 상관관계 환상을 만들기 매우 쉽다.

  • 서로 상관 없는 데이터라도
  • 축 스케일만 조작하면
  • 두 선이 같은 패턴처럼 보인다.

그래서 실무에서는 이중축 그래프를 사용할 때 다음 중 1개 이상을 함께 제시해야 한다:

  • 실제 상관계수
  • 개별 변수의 히스토그램
  • 패턴이 스케일 영향인지 확인하는 보조 차트

🏷️ 2.2. 틱(Tick)과 라벨의 정밀 제어

시각화의 품질은 축에서 결정된다 해도 과언 X

자동 틱은 대부분 다음과 같은 문제를 만든다:

  • 날짜가 너무 촘촘하게 표시됨
  • 범주형 데이터인데 숫자로 표시됨
  • 의미 없는 0,2,4,… 같은 틱

따라서 항상 Axes 객체에서 직접 제어해야 한다.

ax.set_xticks(x_positions)
ax.set_xticklabels(months, rotation=45, ha='right')
ax.set_yticks(np.arange(0, 110, 25))

가독성과 해석력이 극적으로 상승한다.


⌚ 3. 시계열(Date) 포맷 제어

Pandas DatetimeIndex는 자동으로 Matplotlib 날짜로 변환되지만,

  • 너무 긴 라벨
  • 틱 겹침
  • 포맷 불일치

등의 문제가 생긴다.

import matplotlib.dates as mdates

ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
ax.xaxis.set_major_locator(mdates.DayLocator(interval=10))
ax.xaxis.set_minor_locator(mdates.DayLocator(interval=5))

⁉️ 왜 중요한가

잘못된 날짜 라벨은 시계열 그래프 전체 의미를 왜곡시킨다.
날짜는 “순차적 맥락”을 주기 때문에 틱이 엉키면 흐름 자체가 무너진다.


🆚 4. Seaborn: Figure-Level vs Axes-Level

Seaborn은 두 레이어로 나뉜다.

구분Axes LevelFigure Level
대표 함수scatterplot, boxplot, heatmaplmplot, catplot, relplot
반환AxesFacetGrid
장점세밀한 커스터마이징여러 서브플롯 자동 구성
단점단일 플롯만축 제어가 간접적

✅ 실무 핵심

**- 원하는 레이아웃을 정확히 통제해야 한다 → Axes Level

  • 여러 그룹을 비교해야 한다 → Figure Level(FacetGrid)**

🌐 4.1 FacetGrid 축 공유 해제

서브플롯별로 데이터 범위가 매우 다를 때 중요한 기능이다.

g = sns.FacetGrid(df, col="Category", sharex=False, sharey=False)
g.map(sns.histplot, "Value")
g.set_titles(col_template="Category: {col_name}")

공유 축을 해제하면:

  • 작은 값 범위도 선명하게 보임
  • 그룹 간 패턴 차이가 더 잘 드러남
  • 지나친 스케일 통합으로 인한 정보 손실 방지

5. Heatmap과 ColorBar 엔지니어링 👩🏻‍🔬

히트맵은 행렬 데이터의 구조적 인사이트를 보여주는 도구다.

핵심 파라미터:

  • center=0: 발산형 팔레트의 기준
  • vmin vmax: 색상 스케일 고정
  • cbar: 색상 막대 표시 제어
sns.heatmap(
    corr, center=0, cmap="coolwarm",
    cbar=False, annot=True, fmt=".2f"
)

6. 🔑 로그 스케일(Log Scale)의 실무 중요성

데이터가 아래와 같은 형태라면:

  • 1, 10, 100, 10,000, 1,000,000
  • 소득, 트래픽, 판매량처럼 극단적인 편차
    선형 스케일은 그래프를 완전히 망가뜨린다.
ax.set_yscale("log")

로그 스케일은 다음을 해결한다:

  • 작은 값도 패턴이 보임
  • 큰 값도 압축되어 구조가 드러남
  • 전체 분포를 한눈에 비교 가능

Heatmap에서는 LogNorm()으로 색상 스케일도 로그화할 수 있다.


✅ 7. 백터 기반 그래픽(SVG)의 필요성

PNG는 확대하면 깨지고, 인쇄 시 품질 저하가 있다.

SVG는 다음 장점을 가진다:

  • 확대해도 안 깨짐
  • 출판·보고서에서 선명함
  • 웹/모바일에서 반응형도 가능
fig.savefig("plot.svg", format="svg", transparent=True, bbox_inches="tight")

8. 👨🏻‍🔬 실무에서의 ‘해석력(Interpretability)’ 설계

데이터를 보여주는 것과
데이터가 무엇을 의미하는지 전달하는 것은 완전히 다른 문제다.

실무 그래프는 다음 요소를 포함해야 한다:

요소역할
annotate()맥락 제공
색상–축–선 스타일 통일인지적 부하 감소
의미 있는 제목그래프의 ‘결론’을 한 문장으로 표현
축 라벨 정교화해석 오류 방지

9. 오늘 학습한 개념 정리

범주핵심 개념실제 효과
강건성(Robustness)Figure/Axes 분리, OO 방식에러 감소, 구조적 그래프
정확성(Accuracy)팔레트 전략, 정규화, 로그 스케일데이터 왜곡 최소화
접근성(Accessibility)hue + style, 색각보정모두가 읽을 수 있는 그래프
해석력(Interpretability)Annotation, 틱 제어, 축 디자인메시지가 명확하게 전달됨
품질(Quality)SVG 출력, 투명 배경인쇄·웹·대시보드 최고의 품질

끝~@@~@!@~!#

profile
Running on hopes and tiny skills...

0개의 댓글