[전처리/시각화] 0925 시각화 세션 - 😎 데이터 시각화 한 번에 끝내기! (matplotlib, seaborn)

🎯 이것으로 시각화는 마스터 해보자!! 

1. 용어정리

수치형 

  • 이산형 : 셀 수 있는 정수 예) **의 수
  • 연속형 : 두 값 사이에 또 다른 값, 실수(소수) 예) 나이, 요금 등
📌 평균/표준편차 계산이 의미가 있음. 보통 크기 비교!!!

 

범주형

  • 명목형 : 순서 없음 예) 성별, 탑승항
  • 순서형 : 순서 있음 예) 객실등급 같은...
📌 평균보다는 빈도/비율 비교!!

 

분석 차원(변수 개수)

  • 단변량 : 변수 1개 (분포/요약)
  • 이변량 : 변수 2개 (관계/차이)
  • 다변량 : 3개 이상 (층화 비교, 상호작용)

2. 그래프 선택 가이드

no. 질문(목적) 변수 타입 추천 그래프(seaborn 중심) 왜 이껄 쓰지??!!
1 범주 빈도/비율 단변량 범주형 countplot(개수), barplot(평균/비율) 막대 길이로 비교가 가장 직관적
2 수치 분포 모양 단변량 수치형 histplot(+kde=True) 몰림·꼬리·다봉성 파악(나이?)
3 중앙값/이상치 단변량 수치형 boxplot 중앙값·사분위·이상치 요약
4 범주별 수치 분포 이변량 범주×수치 boxplot / violinplot 그룹 간 분포·변동 차이 한 번에
5 범주별 평균/비율 이변량 범주×수치(0/1) barplot 0/1 평균=비율
6 수치×수치 관계 이변량 수치×수치 scatterplot 점 구름으로 상관·패턴·이상치
7 범주×범주 연관 이변량 범주×범주 heatmap 색으로 비율/연관 강도 직관적
8 여러 수치 쌍관계 다변량 수치 다수 pairplot 전체 구조·이상치 빠르게 파악
9 여러 범주 쌍관계 다변량 범주 다수 FacetGrid 여러 범주 조건으로 잘라서 비교

3. 간단 의사결정트리

▶ 비교가 목적이야? 🔍 평균/비율 ➡️ barplot | 분포 ➡️ box/violinplot 

▶ 분포가 궁금해? 🔍 연속 1개 ➡️ histplot(+kde)

▶ 관계가 있는지 궁금해! 🔍 연속x연속 ➡️ scatter | 범주x범주 ➡️ heatmap

▶ 변수 3개 이상은 어떻게 비교해? 🔍 수치 ➡️ pairplot | 범주 ➡️ FacetGrid


4. Matplotlib  vs  Seaborn

Matplotlib : 가장 기본인 시각화 라이브러리 | 많은 커스터마이징 가능

Seaborn : 조금 더 쉬운 시각화 라이브러리 | 데이터프레임과 호환성 good, 깔끔한 디자인, 적은 코드 가능

둘은 서로 보완 관계임!
처음에 Seaborn으로 시작하고, 더 깊은 커스터마이징 필요할 때 Matplotlib 사용

 

▶ 준비하기 → 라이브러리 설치


5. 주요 그래프 유형

그래프 언제/목적 변수 타입 Seaborn 권장 함수 Matplotlib 대안 왜 이걸 쓰지? 🍯 TIP!
선형
(Line)
시간/순서에 따른 변화 추적 순서형/시계열 vs 수치 sns.lineplot plt.plot 추세·증감 확인에 최적 x축 순서(날짜/월) 정렬 필수
막대
(빈도)
범주 개수 비교 범주 sns.countplot plt.bar
(집계치로)
막대 길이가 개수를 직관적으로 표현 범주 많으면 상위 N만, 정렬
막대
(평균/비율)
그룹 평균/비율 비교 범주×수치(0/1 포함) sns.barplot plt.bar
(집계 결과로)
0/1 평균=비율 → 막대 = 비율/평균 % 포맷, 오차막대는 상황에 따라
산점도 두 수치 간 관계/상관/이상치 수치×수치 sns.scatterplot plt.scatter 점 구름으로 패턴·상관·클러스터 파악 과포개 시 alpha, 로그 스케일 고려
히스토그램 수치의 분포 모양 수치(연속) sns.histplot(kde=True) plt.hist 몰림·꼬리·다봉성 파악 bin 수 적절히
(데이터 크기별 조정)
박스
/바이올린
그룹별 분포·중앙값·이상치 범주×수치 sns.boxplot / sns.violinplot plt.boxplot 평균 막대가 감추는 분포/이상치 확인 꼬리 길면 로그 스케일 고려

6. Titanic 실습 문제

▶ 공통 준비

더보기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "Malgun Gothic"  # 또는 "AppleGothic", "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False
%matplotlib inline
titanic = pd.read_csv("train.csv")

 

🤔🥸 접은글 펼치기 전,,, 닝겐!  생각은 했나요?

문제1: 성별별 생존률 비교

  • 질문? 성별(Sex)에 따른 생존률(Survived)이 달랐을까? 
  • 그래프 ? 범주 x 연속(0/1) ?
더보기

막대그래프 → barplot

WHY? 이진변수 평균이 곧 비율! 이므로 막대 높이가 바로 생존률을 의미

ax = sns.barplot(data=titanic, x="Sex", y="Survived", errorbar=None)
ax.set_title("성별별 생존률")
ax.set_xlabel("성별")
ax.set_ylabel("생존률")
plt.ylim(0, 1)
plt.show()
바 플랏

 

 

문제2: 객실 등급별 요금 분포

  • 질문? 객실 등급(Pclass)에 따라 요금(Fare) 분포는 어떻게 나타나지?
  • 그래프? 범주 x 연속?
더보기

박스플롯 또는 바이올린플롯

WHY? 평균 막대만 보이면 outlier 영향이 큼. 중앙값/사분위/이상치 까지 한 번에 확인 가능.

# botplot
sns.boxplot(data=titanic, x="Pclass", y="Fare")
plt.title("객실 등급별 요금 분포 (Box)")
plt.xlabel("객실 등급")
plt.ylabel("요금")
plt.show()

# violinplot
sns.violinplot(data=titanic, x="Pclass", y="Fare", inner="quartile")
plt.title("객실 등급별 요금 분포 (Violin)")
plt.show()
박스플랏과 바이올린플랏

 

 

문제3: 나이 분포 파악

  • 질문? 승객 나이(Age)는 분포가 어떨까?
  • 그래프? 연속 단변량?
더보기

히스토그램 (+kde=True)

WHY? 연속형 1개 변수의 분포 모양(봉우리, 꼬리, 다봉성) 파악에 최적.

sns.histplot(data=titanic, x="Age", bins=20, kde=True)
plt.title("나이 분포")
plt.xlabel("나이")
plt.ylabel("빈도")
plt.show()
히스토그램 + kde(선)

 

 

문제4: 나이 vs 요금 관계

  • 질문? 나이(Age)와 요금(Fare) 사이에 어떤 패턴이 있지?
  • 그래프? 연속 x 연속
더보기

산점도 scatterplot (+ hue='Survived')

WHY? 두 연속형의 상관/클러스트/이상치 를 점 구름으로 쉽게 확인 가능.

sns.scatterplot(data=titanic, x="Age", y="Fare", hue="Survived")
plt.title("나이 vs 요금 (생존 여부 색상)")
plt.xlabel("나이")
plt.ylabel("요금")
plt.show()
scatterplot

 

 

문제5: 등급 vs 생존 비율

  • 질문? 객실 등급(Pclass)에 따라 생존률이 혹시 다를까?
  • 그래프? 범주 x 범주
더보기

히트맵! 교차표(crosstab) 행 기준 비율 → heatmap

WHY? 비율을 색으로 표시하면 등급 간 차이를 한눈에 비교 가능.

cross_tab = pd.crosstab(titanic["Pclass"], titanic["Survived"], normalize="index") * 100
sns.heatmap(cross_tab, annot=True, fmt=".1f", cmap="Blues")
plt.title("객실 등급별 생존 비율(%)")
plt.xlabel("생존(0=사망, 1=생존)"); plt.ylabel("객실 등급")
plt.show()

 

 

문제6: 탑승항별 인원 & 생존률

  • 질문? 탑승항(Embarked)별 승객 수와 생존률은 각각 어떨까?
  • 그래프? 두 시각화 비교?
더보기

countplot(개수) + barplot(y='Survived')(비율)

WHY? 개수와 비율은 다른 질문. 각각 최적 그래프가 다름.

# (1) 인원
sns.countplot(data=titanic, x="Embarked")
plt.title("탑승항별 승객 수")
plt.show()

# (2) 생존률
ax = sns.barplot(data=titanic, x="Embarked", y="Survived", errorbar=None)
plt.title("탑승항별 생존률")
plt.ylim(0,1)
plt.show()

# (3) 항구별 등급
ax = sns.barplot(data=titanic, x="Embarked", y="Pclass", errorbar=None)
plt.title("탑승항별 객실등급(평균)")
plt.show()

🔍 C 항구의 생존률이 비교적 높네?  항구별 객실등급이 궁금해!!

💡 오!! 그래프 뽑아보니, C 항구의 객실등급 평균이 높네?!!

 

 

문제7: 수치형 컬럼만 골라 피어슨 상관행렬 계산 후 히트맵으로 시각화

  • 질문? titanic의 수치형 변수들끼리 관계(상관)를 한눈에 파악하려면 어떻게 해야하지?
  • 그래프? 상관행렬 
더보기

heatmap

WHY? 여러 수치 변수의 쌍별 상관(-1 과 1사이)을 색과 수치로 직관적으로 비교 가능.

# 피어슨 상관관계 뽑기
num = titanic.select_dtypes(include="number")
corr = num.corr()   # 기본: Pearson -> 스피어만 : num.corr(method="spearman")

# 히트맵
plt.figure(figsize=(5.6,4.6))
sns.heatmap(corr, annot=True, fmt=".2f", vmin=-1, vmax=1, center=0, cmap="coolwarm")
plt.title("Pearson Correlation (numeric only)")
plt.tight_layout()
plt.show()

끝.