🎯 이것으로 시각화는 마스터 해보자!!
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()

문제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()


문제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()

끝.
