매일공부

[데이터 시각화] 차트 종류부터 seaborn 함수까지 — 수업 필기 정리 본문

Programming/Python

[데이터 시각화] 차트 종류부터 seaborn 함수까지 — 수업 필기 정리

julian 2022. 11. 1. 09:43

시각화의 중요성 — 앤스콤 4분할 그래프

앤스콤 4분할 그래프(Anscombe's quartet)는 데이터를 시각화하지 않고 수치만 확인해서 분석하면 잘못된 판단을 할 수 있다는 걸 보여주는 대표적인 예시다.

  • 4개 데이터 그룹의 평균, 분산이 각각 같고, 상관관계와 회귀선도 같다
  • 수치만 보면 "4개 그룹의 데이터가 동일하다"고 착각하기 쉽지만, 실제로 시각화해보면 데이터 패턴이 서로 완전히 다르다

수치 요약만 믿지 말고 반드시 그려봐야 하는 이유를 보여주는 예시.

시각화 단계 (matplotlib 기준)

  1. 전체 그래프가 위치할 기본 틀(figure) 생성
  2. 그래프를 그려 넣을 격자(subplot) 구성
  3. 각 격자 위치에 그래프 추가
axes1 = fig.add_subplot(2, 2, 1)
print(type(axes1))  # 실제 데이터가 그려지는 곳을 의미하는 객체

차트 종류별 정리

차트 특징 예시

Bar (막대그래프) 여러 항목을 비교할 때, 수량의 많고 적음을 정확하게 비교하기 좋음. 시간 순·매출 순 등 규칙을 부여해서 정렬하면 좋음 시간 순에 따라 랭킹이 바뀌는 애니메이션, 범주별 빈도/비율 표현
누적 막대그래프 여러 항목을 비교하면서 세부 항목의 비율까지 함께 표현 매출을 국내/해외로 나눠 다른 색상으로 누적 표시
Line (선그래프) 하나의 항목이 시간에 따라 어떻게 변화하는지 확인할 때 좋음 월별 매출 추이 확인 (전체 트렌드, 급격한 변곡점 파악)
Pie / Donut 여러 항목의 비율 비교. 비율 높은 순으로 정렬해서 표현. 6개 항목을 넘지 않는 게 좋음 범주별 빈도/비율을 부채꼴로 표현
Area chart 선그래프를 여러 개 누적시켜 색으로 영역 표현. 도형의 면적으로 수치 크기를 나타냄. 채우는 색은 일정한 투명도로 설정 신제품이 전체 매출에 기여한 정도 확인
피라미드 차트 두 항목으로 명확히 나뉘는 대상을 세부 비교하며 전체 분포를 보여줄 때 연령대별 남/여 인구 분포
산점도(Scatterplot) 성격이 다른 두 항목의 관계성(상관성) 파악. 연관성이 있으면 특정 방향으로 밀집되어 나타남 결제 금액과 만족도의 관계, 접속 횟수와 결제 빈도의 관계
히트맵 관계성의 높고 낮음을 색상으로 표현 요일/디바이스별 웹사이트 체류시간
버블차트 산점도와 비슷하지만 크기까지 표시해서 비교. 데이터 흐름을 평가하는 시스템 분석에 사용 여러 속성을 좌표 축에 투영해 항목별 특징 대비
방사형 그래프(Radar chart) 한 사이클의 수치 변화, 주요 변수의 상대적 관계를 나타낼 때 재무분석(부채능력·운영능력·수익성 등 지표)
프레임 다이어그램 계층 구조 시각화 계층적 관계 표현
간트 차트(Gantt chart) 프로젝트 작업 프로세스 파악 프로젝트 관리
Map chart 색상으로 특정 범위 값의 분포 표현 구역지도, 포인트 맵, 플로 맵
워드클라우드 데이터 속 키워드·개념을 직관적으로 파악 빅데이터 분석에서 특징 도출
상자그림(Boxplot) 데이터 분산을 쉽게 시각화. 이산형·연속형 변수를 함께 사용 가능

분포 관련 그래프

  • 도수분포표(frequency table): 값 범위를 동일한 크기의 구간으로 나눠 각 구간의 빈도를 보여주는 표
  • 히스토그램(histogram): x축은 구간, y축은 빈도수를 나타내는 도수 그래프
  • 밀도그림(density plot): 히스토그램을 연속된 부드러운 곡선으로 표현 (커널 밀도 추정으로 계산)
  • 분할표(contingency table): 두 개 이상의 범주형 변수의 빈도수를 기록한 표
  • 육각형 구간(hexagonal binning): 두 변수를 육각형 모양의 구간으로 나눔
  • 등고 도표(contour plot): 지도의 등고선처럼 두 변수의 밀도를 등고선으로 표시
  • 바이올린 도표(violin plot): 상자그림과 비슷하지만 밀도 추정까지 함께 보여줌

시각화 가이드라인

  • 색상은 무지개색보다 단일 색상 계열을 권장 (중요한 부분일수록 진하게)
  • 밝은 배경 + 진한 텍스트(검정 계열) 조합이 가장 읽기 편함
  • x축, y축 label은 반드시 지정할 것
  • 의미 없는 요소는 제거 — 단순할수록 보기 편하다
  • 관련 있는 대상엔 관련된 색상을 사용 (예: 비교 대상 A는 파란색, B는 빨간색으로 통일)
  • 3D 그래프는 가독성이 떨어지므로 꼭 필요한 경우만 사용
  • 하나의 그래프에 모든 내용을 다 담으려 하지 말 것

matplotlib — 히스토그램 예시

데이터의 분포와 빈도를 살펴보는 용도. (일변량 그래프)

axes1.hist(['total_bill'], bins=10)  # x축 간격(구간 수) 조정

seaborn — 자주 쓰는 함수 정리

histplot(hue=, multiple=) — 히스토그램. count(절대량) 기반으로 시각화. multiple 파라미터는 hue로 분류된 count가 중첩되어 그려지도록 함.

sns.histplot(data=iris, x="sepal_length", y="sepal_width", hue="species")  # 이변량 그래프

kdeplot() — 커널 밀도 추정 그래프. 비율(상대량) 기반으로 시각화.

displot() — 히스토그램 + 밀도 + rugplot + ecdfplot(누적분포)을 아우르는 함수. kind 파라미터로 hist/kde/ecdf 선택.

ax = sns.displot(tips['total_bill'], kde=False)  # kde 인자로 밀도선 표시 여부 설정

rugplot() — 다른 그래프를 보완하는 용도. 축에 동일한 길이의 직선을 붙여서 데이터의 밀집 정도를 표현.

countplot() — 이산값(범주형) 표현.

regplot() — 산점도 + 회귀선. fit_reg=False로 회귀선 제거 가능.

jointplot() — 산점도 + 히스토그램을 함께 표현.

ax = sns.jointplot(x='total_bill', y='tip', data=tips, kind="hex")  # 육각형 구간으로 표현

pairplot() — 변수 간 관계를 한 번에 보여주는 관계 그래프. map_upper()/map_lower()로 대각선 기준 위/아래에 그릴 그래프를 따로 지정할 수 있다.

ax = sns.pairplot(tips, hue='sex')  # hue로 색상 구분할 열 지정

seaborn의 장점

  • 다양한 색상과 예쁜 기본 디자인
  • 통계 계산과 그래프 그리기를 동시에 처리
  • 사용이 쉬움

(seaborn 공식 문서 Gallery 탭에서 더 많은 예시를 볼 수 있다: seaborn.pydata.org/examples)

목적별 seaborn 함수 분류

  • 두 변수(x, y)의 관계: relplot, scatterplot, lineplot
  • 변수 하나 혹은 두 개의 값 분포: displot, histplot, kdeplot, ecdfplot, rugplot
  • 범주형 변수 ↔ 연속형 변수 관계: catplot, stripplot, swarmplot, boxplot, violinplot, boxenplot, pointplot, barplot, countplot
  • 회귀 분석 결과를 관계 그래프와 함께: lmplot, regplot, residplot
  • 연속형 변수 간 관계 비율을 색으로 표현: heatmap, clustermap
  • 여러 그래프를 한눈에 비교: FacetGrid, pairplot, PairGrid, jointplot, JointGrid

워드클라우드 예시 (한국어 텍스트)

konlpy로 명사를 추출하고, 불용어를 걸러낸 뒤 빈도수를 세어 워드클라우드로 시각화하는 흐름.

from konlpy.tag import Okt
from collections import Counter
from wordcloud import WordCloud
from PIL import Image
import numpy as np

with open('텍스트파일.txt', 'r', encoding='utf-8') as f:
    text = f.read()

okt = Okt()
nouns = okt.nouns(text)  # 명사만 추출
words = [word for word in nouns if len(word) > 1]  # 두 글자 이상만 추출

# 제외할 단어는 불용어 리스트로 관리
stop_words = set("불용어1 불용어2 불용어3".split(" "))
words = [word for word in words if word not in stop_words]

c = Counter(words)  # 단어별 빈도수 (딕셔너리 형태)

# 마스크 이미지를 씌워서 워드클라우드 모양 지정
img_file = Image.open('마스크이미지.png')
mask = np.array(img_file)  # ndarray(수치 배열)로 변환

folium — 지도 시각화 (Choropleth 예시)

folium.Choropleth(
    geo_data=지도데이터_파일_경로,
    data=시각화할_데이터프레임,
    columns=(지도데이터와_매핑할_값, 시각화할_변수),  # tuple 형태
    key_on='feature.데이터파일과_매핑할_값',
    fill_color='시각화에_사용할_색상',
    legend_name='컬러 범주 이름'
).add_to(m)
Comments