- 코딩테스트
- 부스트코스
- Django
- AI 플랫폼을 활용한 데이터 분석
- 데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 빅데이터분석기사
- 빅분기
- 이것이 취업을 위한 코딩테스트다 with 파이썬
- 이기적
- 오라클
- 빅데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- PY4E
- 데이터베이스
- Ai
- DB
- [멀티잇]데이터 시각화&분석 취업캠프(Python)
- 코딩테스트 python
- SQL
- 인공지능기초다지기
- boostcoures
- unsub
- r
- 기초다지기
- 프로그래머스
- 파이썬
- 정보처리기사
- boostcourse
- python
- 네이버부스트캠프
- Oracle
- Today
- Total
매일공부
[데이터 시각화] 차트 종류부터 seaborn 함수까지 — 수업 필기 정리 본문
시각화의 중요성 — 앤스콤 4분할 그래프
앤스콤 4분할 그래프(Anscombe's quartet)는 데이터를 시각화하지 않고 수치만 확인해서 분석하면 잘못된 판단을 할 수 있다는 걸 보여주는 대표적인 예시다.
- 4개 데이터 그룹의 평균, 분산이 각각 같고, 상관관계와 회귀선도 같다
- 수치만 보면 "4개 그룹의 데이터가 동일하다"고 착각하기 쉽지만, 실제로 시각화해보면 데이터 패턴이 서로 완전히 다르다
수치 요약만 믿지 말고 반드시 그려봐야 하는 이유를 보여주는 예시.
시각화 단계 (matplotlib 기준)
- 전체 그래프가 위치할 기본 틀(figure) 생성
- 그래프를 그려 넣을 격자(subplot) 구성
- 각 격자 위치에 그래프 추가
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)
'Programming > Python' 카테고리의 다른 글
| [python] 문자열인 숫자 판단 (0) | 2023.06.20 |
|---|---|
| [python] 진법&자료형 변환 Casting 함수 (0) | 2023.06.19 |
| [Pandas] 데이터 재구조화 — pivot, pivot_table, melt, groupby 정리 (0) | 2022.10.13 |
| [Python Pandas] Dataframe 다중 인덱스 & 병합, 연결 (0) | 2022.09.14 |
| [Python] Pandas를 활용한 데이터 수집 (0) | 2022.09.02 |