방송대 오픈소스기반데이터분석 11강: 고급 시각화 선택과 그래프 스타일링
좋은 시각화는 복잡한 차트를 많이 쓰는 것이 아니라, 데이터가 가진 계층·공간·연결·분포·표면 구조 중 하나를 정확히 드러내는 일이다. 트리맵부터 등고선까지 선택 기준을 세우고, 색·축·마커·서브플롯·인터랙션을 메시지와 접근성에 맞게 설계한다.
차트 이름보다 먼저 보여 줄 관계를 한 문장으로 쓴다
고급 시각화는 화려한 효과를 추가하는 단계가 아니다. “전체 안에서 각 범주의 비중을 비교한다”, “지역별 차이를 찾는다”, “사람 사이 연결을 추적한다”, “집단별 분포 모양을 비교한다”처럼 독자가 발견해야 할 관계를 먼저 정해야 한다.
| 보여 줄 구조 | 우선 검토할 시각화 | 핵심 읽기 단서 | 주의점 |
|---|---|---|---|
| 계층과 구성비 | 트리맵 | 사각형의 포함 관계와 면적 | 정확한 값 비교는 어려움 |
| 공간 위치와 지역 차이 | 지도 시각화 | 위치, 영역, 이동 경로 | 면적이 큰 지역의 시각적 과장 |
| 개체 간 연결 | 네트워크 그래프 | 노드, 간선, 군집과 중심성 | 연결이 많으면 털뭉치처럼 보임 |
| 분포의 모양과 밀도 | 바이올린 플롯 | 폭, 중앙값, 사분위 범위 | 작은 표본의 밀도 모양 과해석 |
| 두 입력에 따른 연속 표면 | 등고선 그래프 | 같은 값의 선과 간격 | 색상 범례와 축 단위 필수 |
차트 선택 4문항: 무엇을 비교하는가? 위치·순서·연결·계층 중 어떤 구조가 있는가? 독자가 내려야 할 판단은 무엇인가? 정확한 값 읽기와 전체 패턴 파악 중 어느 쪽이 더 중요한가?
트리맵은 계층과 구성비를 한 화면에 압축한다
트리맵(treemap)은 전체 영역을 계층에 따라 중첩된 사각형으로 나누고, 각 항목의 크기를 면적으로 나타낸다. 매출 전체 안에서 대분류와 하위 제품군의 비중을 동시에 보고 싶을 때 유용하다.
사각형의 면적은 값에 비례하지만 길이처럼 한 축에서 정렬되지 않으므로 비슷한 두 값의 정확한 비교는 어렵다. 항목이 많으면 작은 사각형의 레이블이 사라지고, 계층이 깊으면 중첩 구조를 따라가기 힘들다. 정확한 순위가 핵심이면 정렬된 막대그래프가 더 적합할 수 있다.
트리맵 오개념: 색과 면적에 같은 변수를 중복 배정하면 정보가 늘지 않는다. 면적은 매출, 색은 성장률처럼 서로 다른 의미를 줄 때는 반드시 색상 범례와 기준점을 제시한다.
지도는 값뿐 아니라 공간 단위의 정의를 보여 줘야 한다
지도 시각화는 좌표, 지역 경계, 경로 같은 공간 정보를 바탕으로 지역 간 차이와 이동을 표현한다. 점 지도는 개별 위치, 단계구분도는 행정구역별 비율이나 지표, 선 지도는 이동 경로를 보여 주는 데 알맞다.
지역별 ‘매장 수’를 색으로 칠하면 인구가 많은 지역이 자연히 높아질 수 있다. 지역 특성을 비교하려면 인구 1만 명당 매장 수처럼 적절한 분모로 표준화할 필요가 있다. 총량과 비율은 서로 다른 질문에 답한다.
| 표현 | 적합한 값 | 대표 오독 | 교정 |
|---|---|---|---|
| 지역 색 채우기 | 비율·밀도·지수 | 넓은 지역이 더 중요해 보임 | 단위와 분모를 제목·범례에 표시 |
| 크기 다른 점 | 지점별 총량 | 점 면적과 반지름 혼동 | 면적이 값에 비례하도록 설정 |
| 이동 선 | 출발지-도착지 흐름 | 선 겹침으로 경로 과잉 | 필터·집계·투명도 사용 |
또한 지도는 좌표계, 경계 기준 연도, 누락 지역, 개인정보를 확인해야 한다. 개인의 정밀 위치를 표시할 필요가 없다면 집계하거나 공간 해상도를 낮춘다.
네트워크 그래프는 노드와 간선의 정의가 절반이다
네트워크 그래프에서 개체는 노드, 개체 사이 관계는 간선으로 표현한다. 사람과 팔로우 관계, 상품과 동시구매 관계, 역과 노선 연결을 나타낼 수 있다. 방향이 있는지, 가중치가 있는지에 따라 간선의 의미가 달라진다.
그래프에서 가운데 보인다고 반드시 중요한 노드는 아니다. 배치 알고리즘은 보기 좋게 위치를 정할 뿐 업무적 중심성을 자동으로 증명하지 않는다. 연결 수, 매개 역할, 도달 거리 같은 지표를 따로 계산하고 노드 크기·색과 연결해야 한다.
네트워크 정의표: 노드는 무엇인가? 간선은 어떤 사건을 뜻하는가? 방향과 가중치는 있는가? 관측 기간은 언제인가? 연결이 없다는 것이 실제 무관계인지 미수집인지 먼저 기록한다.
노드와 간선이 많아지면 선이 겹쳐 구조를 읽기 어렵다. 중요한 관계만 필터링하고, 군집별로 색을 나누며, 세부 연결은 인터랙션으로 확인하는 방식이 더 낫다.
바이올린 플롯은 상자 요약 뒤에 숨은 분포 모양을 보여 준다
바이올린 플롯은 대칭 밀도 곡선과 중앙값·사분위수 같은 요약 통계를 결합한다. 같은 중앙값을 가진 두 집단이라도 한 집단은 중앙에 몰리고 다른 집단은 두 봉우리로 나뉘는 차이를 볼 수 있다.
폭은 그 높이에서 값이 얼마나 밀집했는지를 추정한 결과다. 관측 빈도 막대가 아니며, 전체 표본 수를 그대로 보여 주지도 않는다. 표본이 작거나 밀도 평활화 설정이 다르면 모양이 크게 달라질 수 있으므로 점 플롯이나 표본 수를 함께 제시한다.
import seaborn as sns
sns.violinplot(
data=scores,
x="class",
y="score",
inner="quart",
cut=0,
)
inner="quart"는 내부에 사분위 정보를 표시하고, cut=0은 밀도 곡선이 관측 범위를 넘어 연장되지 않게 한다. 옵션이 바뀌면 같은 데이터도 모양이 달라질 수 있으므로 시각화 설정을 분석 기록에 남긴다.
등고선은 높이를 선과 색으로 번역한다
등고선 그래프는 두 입력 좌표 x, y에 따른 함수값 z를 2차원 평면에 표현한다. 같은 z 값을 가진 점을 연결한 선이 등고선이다. 선 간격이 좁으면 값이 빠르게 변하고, 넓으면 완만하게 변한다.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
xx, yy = np.meshgrid(x, y)
zz = xx**2 + yy**2
fig, ax = plt.subplots()
contour = ax.contourf(xx, yy, zz, levels=12, cmap="viridis")
fig.colorbar(contour, ax=ax, label="z = x² + y²")
ax.set(xlabel="x", ylabel="y", title="함수값의 등고선")
이 함수는 원점에서 값이 가장 작고 바깥으로 갈수록 커지므로 동심원 모양이 나타난다. 컬러바가 없으면 색이 어떤 값에 대응하는지 알 수 없다. 3D 표면은 높이를 직접 보여 주지만 원근 때문에 뒤쪽이 가려질 수 있어, 정확한 위치 비교에는 등고선이 더 명확할 때가 많다.
색은 값의 척도와 중심점에 맞춰 고른다
Matplotlib은 한 글자 색상 코드, 이름, RGB·RGBA 값을 지원한다. 하지만 개별 색을 고르는 일과 컬러맵을 고르는 일은 다르다. 컬러맵은 데이터 값의 연속적인 범위를 색으로 대응시킨다.
| 컬러맵 유형 | 데이터 의미 | 예 | 선택 원칙 |
|---|---|---|---|
| 연속형 | 낮음에서 높음으로 한 방향 순서 | viridis, Blues | 밝기가 단조롭게 변하는 팔레트 |
| 발산형 | 의미 있는 중심에서 양쪽으로 벗어남 | 음수-0-양수 변화 | 중립 중심색과 대칭 범위 검토 |
| 정성형 | 순서 없는 범주 구분 | 지역·제품 범주 | 서로 구별되며 범주 수를 제한 |
| 주기형 | 끝과 시작이 이어지는 값 | 방향, 시각, 위상 | 양 끝 색이 자연스럽게 연결 |
무지개색처럼 색조가 불규칙하게 바뀌는 팔레트는 실제로 없는 경계를 강조할 수 있다. 색각 특성이 다른 독자와 흑백 출력도 고려해 색만으로 범주를 구분하지 말고 마커, 선 스타일, 직접 레이블을 함께 사용한다.
색상 범례 점검: 최소·최대값과 단위가 있는가? 비교하는 여러 패널이 같은 범위를 쓰는가? 발산형 중심이 실제 기준값과 맞는가? 결측값 색이 최솟값과 구분되는가?
축과 제목은 그래프의 주장과 범위를 명시한다
xlabel(), ylabel(), title()은 각각 축의 의미와 그래프의 메시지를 알려 준다. 레이블에는 변수명만 쓰지 말고 단위를 포함한다. “월별 매출”보다 “2025년 월별 순매출(백만원)”이 더 검증 가능한 제목이다.
fig, ax = plt.subplots()
ax.plot(months, sales, marker="o", linestyle="-")
ax.set(
xlabel="월",
ylabel="순매출(백만원)",
title="2025년 월별 순매출 추이",
)
ax.grid(alpha=0.25)
xlim()과 ylim()은 관찰 범위를 조정하지만 데이터를 잘라 인상을 바꿀 수도 있다. 막대그래프의 세로축을 중간값에서 시작하면 작은 차이가 크게 보이므로 특별한 이유가 없다면 0 기준을 우선한다. 선그래프는 변화 패턴이 핵심이므로 좁은 축이 가능하지만, 잘린 축임을 독자가 알아볼 수 있게 해야 한다.
제목 작성 공식: 대상 + 비교·변화 + 기간·범위 + 단위. 결론형 제목을 쓸 때는 데이터가 실제로 지지하는 범위를 넘지 않는다.
마커와 선 스타일은 색이 사라져도 구분돼야 한다
마커는 관측 지점을, 선은 연결과 변화 흐름을 보여 준다. o는 원, ^는 위쪽 삼각형, s는 사각형, D는 마름모, x는 x 모양이다. 선 스타일 -, --, -., :은 각각 실선, 파선, 점-대시선, 점선이다.
범주가 두세 개라면 색뿐 아니라 마커와 선 스타일을 함께 달리해 흑백 인쇄와 색각 다양성에 대비한다. 범주가 많으면 조합을 계속 늘리기보다 작은 다중 그래프나 직접 레이블을 고려한다.
| 잘못된 스타일링 | 왜 문제인가 | 교정 |
|---|---|---|
| 빨강·초록 색만으로 두 선 구분 | 일부 독자가 구분하기 어려움 | 실선·파선과 마커 병행 |
| 모든 관측에 큰 마커 | 점이 겹쳐 밀도와 추세를 가림 | 크기·투명도 조정 또는 표본 집계 |
| 범례가 그래프를 덮음 | 데이터와 레이블을 가림 | 여백 배치 또는 선 끝 직접 레이블 |
글자 크기와 글꼴은 정보 계층과 한글 표시를 책임진다
제목, 축 레이블, 눈금, 범례의 글자 크기를 모두 같게 만들면 중요도 계층이 사라진다. 제목은 가장 크되 과도하게 강조하지 않고, 축 레이블과 범례는 실제 게시 크기에서 읽을 수 있어야 한다.
한글이 네모 상자로 깨지는 경우 시스템에 설치된 한글 글꼴을 Matplotlib에 지정한다. 강의 예시의 NanumGothic은 해당 환경에 실제 설치되어 있을 때만 작동한다. 배포 환경마다 글꼴이 다를 수 있으므로 사용 가능한 글꼴 목록을 확인하고, 음수 기호 표시도 함께 검증한다.
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "NanumGothic" # 설치 여부 확인
plt.rcParams["axes.unicode_minus"] = False
글꼴 설정은 전체 그래프의 일관성을 위해 전역으로 적용할 수 있지만, 다른 노트북과 공유할 때는 설정 코드를 함께 남겨야 재현된다.
Figure와 Axes를 구분하면 서브플롯 제어가 쉬워진다
Matplotlib에서 Figure는 전체 캔버스이고, Axes는 실제 데이터가 그려지는 개별 패널이다. plt.subplots()는 Figure와 여러 Axes를 한 번에 만든다. subplot()은 패널을 하나씩 추가할 때 쓰지만, 복수 패널은 subplots()의 객체지향 방식이 구조를 읽기 쉽다.
fig, axes = plt.subplots(
2,
2,
figsize=(10, 7),
layout="constrained",
)
axes[0, 0].plot(monthly_sales)
axes[0, 0].set_title("월별 판매 추이")
axes[0, 1].bar(regions, region_sales)
axes[0, 1].set_title("지역별 판매")
axes[1, 0].imshow(hourly_matrix, cmap="viridis", aspect="auto")
axes[1, 0].set_title("요일·시간대 패턴")
axes[1, 1].axis("off")
fig.suptitle("온라인 판매 대시보드")
layout="constrained"는 제목·레이블·컬러바가 겹치는 문제를 줄인다. 공유 축은 같은 척도의 패널을 비교할 때 유용하지만, 단위가 다른 그래프에 강제로 공유하면 오해를 만든다. 빈 패널은 숨기고 각 패널 제목의 문법을 통일한다.
대시보드 원칙: 패널을 많이 넣는 것이 통찰을 늘리지는 않는다. 한 화면의 질문을 하나로 정하고, 각 패널이 현황·원인·세부 확인 중 어떤 역할을 맡는지 구분한다.
인터랙티브 그래프는 탐색 경로와 기본 화면을 함께 설계한다
인터랙티브 시각화는 마우스 오버, 클릭, 확대·축소, 필터로 세부 정보를 탐색하게 한다. Plotly는 웹 기반 인터랙티브 그래프를 만들고, Bokeh는 브라우저 시각화와 웹 애플리케이션 연동에 활용할 수 있다.
상호작용이 있다고 메시지가 자동으로 명확해지지는 않는다. 처음 열린 화면만으로 핵심 결론을 읽을 수 있어야 하며, 호버 없이는 값이 전혀 보이지 않는 구조를 피한다. 키보드 탐색, 터치 환경, 작은 화면, 정적 출력과 데이터 다운로드 경로도 고려한다.
| 목적 | 정적 시각화 | 인터랙티브 시각화 |
|---|---|---|
| 핵심 메시지 전달 | 한눈에 고정된 비교에 강함 | 기본 상태를 잘 설계해야 함 |
| 세부 탐색 | 표·주석으로 제한적 제공 | 호버·필터·확대에 강함 |
| 공유 환경 | 문서·인쇄에 안정적 | 브라우저와 실행 환경 필요 |
| 재현성 | 출력 이미지와 코드 보존 | 코드·데이터·상태·버전 보존 |
온라인 판매 대시보드는 질문별 패널로 설계한다
강의의 Online Retail 데이터 실습을 설계해 보자. “언제, 어디서, 어떤 고객군에서 판매가 달라지는가?”를 대시보드의 중심 질문으로 정한다. 데이터 전처리에서는 취소·반품, 결측 고객 ID, 수량·가격 오류와 날짜 형식을 확인한다.
- 시간 질문: 월별 판매 추이는 선그래프로 표현하고 기간과 통화 단위를 표시한다.
- 지역 질문: 국가별 총액은 정렬 막대그래프로 먼저 비교하고, 공간 패턴이 실제로 필요할 때 지도를 추가한다.
- 시간대 질문: 요일×시간대 매출은 히트맵으로 표현하고 컬러바를 붙인다.
- 고객군 질문: 고객 세그먼트 구성비는 트리맵, 집단별 구매 분포는 바이올린 플롯을 검토한다.
- 통합: 서브플롯에서 축·색·기간을 일관되게 맞추고 세부 탐색은 별도 인터랙션으로 제공한다.
최종 시각 검수: 5초 안에 중심 메시지가 보이는가? 제목·축·단위·범례가 있는가? 색 없이도 구분되는가? 축 범위가 차이를 왜곡하지 않는가? 작은 화면과 흑백 출력에서도 읽히는가? 원자료와 필터 조건을 추적할 수 있는가?
핵심 개념 정리
- 트리맵·지도·네트워크·바이올린·등고선은 각각 계층·공간·연결·분포·표면 구조에 맞춰 선택한다.
- 고급 차트가 기본 차트보다 언제나 좋은 것은 아니며 정확한 비교에는 막대·선·산점도가 더 나을 수 있다.
- 연속형·발산형·정성형·주기형 컬러맵은 데이터 척도와 중심점에 맞춰 사용한다.
- 제목·축·단위·범례·컬러바는 그래프 해석에 필요한 메타데이터다.
- 색뿐 아니라 마커와 선 스타일을 함께 사용해 접근성과 흑백 재현성을 높인다.
- Figure는 전체 캔버스, Axes는 개별 패널이며 인터랙션은 기본 화면의 명확성을 대신하지 못한다.
시각화 설계 순서: 독자가 답해야 할 질문과 데이터 관계를 한 문장으로 정의한다. 가장 단순한 적합 차트를 선택하고 축·색·레이블의 의미를 고정한 뒤, 필요한 경우에만 서브플롯과 인터랙션을 추가한다. 마지막에는 접근성·왜곡·출처·필터 조건을 검수한다.
예상문제 10선
1. 시각화와 데이터 구조의 연결이 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 시간 변화의 기울기는 선그래프가 더 직접적이다.
- ② 오답: 네트워크는 노드와 간선의 연결 관계를 표현한다.
- ③ 정답: 밀도 폭과 내부 요약으로 집단별 분포를 비교한다.
- ④ 오답: 등고선은 두 좌표에 따른 연속 함수값의 표면을 표현한다.
2. 트리맵에 대한 설명 중 틀린 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 트리맵의 대표적 구조 표현 방식이다.
- ② 정답: 면적 비교는 길이 비교보다 부정확해 비슷한 값에는 막대가 유리하다.
- ③ 오답: 사각형 면적을 값에 대응시키는 설명이 맞다.
- ④ 오답: 트리맵의 실제 가독성 한계를 정확히 설명한다.
3. 지역별 질병 발생 위험을 공정하게 비교하려 할 때 우선 사용할 값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 질병 위험의 노출 인구 차이를 반영하지 못한다.
- ② 오답: 지명 길이는 발생 위험과 관련된 분모가 아니다.
- ③ 오답: 전국 합계로는 지역 간 위험 차이를 비교할 수 없다.
- ④ 정답: 인구 규모가 다른 지역을 같은 기준에서 비교할 수 있다.
4. 네트워크 그래프에서 개체와 관계를 뜻하는 용어는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 네트워크를 구성하는 두 기본 요소를 올바르게 연결했다.
- ② 오답: 축과 눈금은 좌표 기반 그래프의 척도를 구성한다.
- ③ 오답: 컬러맵과 범례는 색의 데이터 의미를 설명한다.
- ④ 오답: Figure와 Axes는 Matplotlib의 캔버스와 패널 개념이다.
5. 의미 있는 0을 중심으로 음수와 양수 편차를 표현할 컬러맵 유형은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 정성형은 순서가 없는 범주 구분에 적합하다.
- ② 오답: 주기형은 방향이나 시각처럼 양 끝이 이어지는 값에 적합하다.
- ③ 정답: 중립 중심에서 서로 다른 두 방향으로 벗어나는 값을 표현한다.
- ④ 오답: 음수와 양수의 연속적인 편차를 표현할 수 없다.
6. 그래프 축 범위에 대한 설명으로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 막대 길이를 비교할 때 기준선이 잘리면 시각적 비율이 왜곡된다.
- ② 오답: 같은 값도 범위에 따라 변화가 크거나 작게 보인다.
- ③ 오답: 선그래프는 변화 패턴이 핵심이면 좁은 범위를 쓸 수 있으나 잘림을 밝혀야 한다.
- ④ 오답: 축 단위는 수치를 해석하는 필수 정보다.
7. 빨강과 초록 두 선을 더 접근성 있게 구분하는 방법은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 색을 구별하지 못할 때 두 선을 식별할 단서가 없다.
- ② 정답: 색 외의 모양 단서를 중복 제공해 흑백 출력에서도 구분된다.
- ③ 오답: 선의 의미를 설명할 정보가 사라진다.
- ④ 오답: 대비를 낮춰 두 선 모두 읽기 어렵게 만든다.
8. Matplotlib의 Figure와 Axes 관계를 올바르게 설명한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 객체의 범위와 역할을 모두 잘못 연결했다.
- ② 오답: 한 Figure 안에 여러 Axes를 둘 수 있는 별도 객체다.
- ③ 오답: 범례와 마커는 Axes 안에 배치되는 시각 요소다.
- ④ 정답: 서브플롯을 구성하는 컨테이너와 패널 관계를 정확히 설명한다.
9. 시각화 설계의 순서로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 질문과 데이터 관계에서 출발해 표현과 최종 검수로 이어진다.
- ② 오답: 효과를 먼저 넣고 축을 숨기면 해석 근거가 사라진다.
- ③ 오답: 데이터와 단위를 확인하기 전에 색부터 정할 수 없다.
- ④ 오답: 패널 수를 늘리는 것이 중심 메시지를 대신하지 않는다.
10. 온라인 판매 대시보드의 설계로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 원근과 겹침이 서로 다른 관계를 가려 비교를 어렵게 한다.
- ② 오답: 지역 비교의 분모와 수치 해석에 필요한 단위가 빠졌다.
- ③ 오답: 패널 간 색과 축의 의미가 달라 독자가 잘못 비교할 수 있다.
- ④ 정답: 중심 질문, 표현 일관성, 재현 조건과 독자 접근성을 함께 관리한다.
참고 자료와 작성 기준
이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 개념 관계, 예제와 문제 해설은 학습자의 이해를 돕도록 구성하고 검토했습니다.
- 작성·편집: 올에이클래스 학습연구팀
- 주요 근거: 한국방송통신대학교 컴퓨터과학과 「오픈소스 기반 데이터분석」 제11강 강의자료(2025)
- 보충 자료: Matplotlib 공식 문서의 컬러맵 선택 안내와 Axes·서브플롯 안내, Plotly Python 공식 문서(2026-08-30 확인)
- 편집 원칙: 올에이클래스 편집 정책
- 최종 내용 검토: 2026-08-30
댓글
댓글 쓰기