🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Seaborn 통계 시각화 완벽 가이드 - 슬라이드 1/8
A

AI Generated

2025. 12. 16. · 5 Views

Seaborn 통계 시각화 완벽 가이드

데이터 분석의 필수 도구 Seaborn으로 아름답고 실용적인 통계 그래프를 그리는 방법을 배웁니다. 실무에서 자주 사용하는 7가지 핵심 차트를 실전 예제와 함께 쉽게 익힐 수 있습니다.


목차

  1. Seaborn 라이브러리 소개
  2. histplot()으로 분포 확인
  3. boxplot()으로 이상치 탐지
  4. countplot()으로 빈도 시각화
  5. heatmap()으로 상관관계 표시
  6. pairplot()으로 변수 관계 탐색
  7. Seaborn 스타일 설정

1. Seaborn 라이브러리 소개

이제 막 데이터 분석 팀에 합류한 김개발 씨는 첫 프로젝트에서 고객 데이터를 시각화하라는 과제를 받았습니다. Matplotlib로 그래프를 그리다가 스타일 설정에만 한 시간을 허비한 뒤, 선배 박시니어 씨가 다가와 말했습니다.

"Seaborn을 쓰면 5분이면 끝나는데요?"

Seaborn은 Matplotlib 기반의 파이썬 시각화 라이브러리입니다. 마치 자동차에 내비게이션을 장착한 것처럼, 복잡한 통계 그래프를 간단한 코드로 아름답게 만들어줍니다.

데이터 분석가라면 반드시 알아야 할 필수 도구입니다.

다음 코드를 살펴봅시다.

# Seaborn 설치 및 기본 사용법
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 샘플 데이터셋 로드
tips = sns.load_dataset('tips')

# 기본 산점도 그리기
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day')
plt.title('요일별 팁 분포')
plt.show()

# 이렇게 간단하게 통계 그래프 완성!

김개발 씨는 회사 입사 후 첫 주간 회의에서 팀장님의 요청을 받았습니다. "고객 데이터를 시각화해서 금요일까지 보고서로 만들어주세요." 신입이라 긴장된 마음으로 작업을 시작했습니다.

처음에는 익숙한 Matplotlib을 사용했습니다. 하지만 그래프 하나를 그리려면 색상 설정, 축 레이블, 범례 위치까지 일일이 코드로 지정해야 했습니다.

간단한 막대 그래프 하나에 코드가 30줄이 넘어갔습니다. 박시니어 씨가 김개발 씨의 모니터를 보고 미소를 지었습니다.

"아직 Seaborn을 모르시는군요. 데이터 분석에서는 필수인데." Seaborn이란 무엇일까요? 쉽게 비유하자면, Seaborn은 마치 스마트폰의 자동 보정 카메라 같습니다.

일반 카메라로 사진을 찍으면 밝기, 대비, 채도를 직접 조정해야 하지만, 스마트폰은 '찰칵' 한 번이면 자동으로 예쁜 사진이 나옵니다. Seaborn도 마찬가지로 복잡한 스타일 설정 없이 아름다운 통계 그래프를 자동으로 만들어줍니다.

왜 Matplotlib만으로는 부족할까요? Matplotlib은 강력한 도구이지만 통계 그래프를 그리기에는 코드가 너무 길어집니다. 색상 팔레트를 직접 선택하고, 범례 위치를 조정하고, 그리드 스타일을 설정하는 등 시각적 요소에 많은 시간을 소비해야 합니다.

더 큰 문제는 통계 분석에 특화된 기능이 부족하다는 점입니다. 예를 들어 상자 그림에 평균선을 추가하거나, 회귀선이 포함된 산점도를 그리려면 수식을 직접 계산하고 그려야 합니다.

데이터 분석보다 그래프 그리기에 더 많은 시간을 쓰게 되는 셈입니다. Seaborn의 등장 바로 이런 불편함을 해결하기 위해 Seaborn이 만들어졌습니다.

Seaborn을 사용하면 단 한 줄의 코드로 통계 그래프를 그릴 수 있습니다. 색상 테마는 자동으로 아름답게 설정되고, 범례와 레이블도 데이터에 맞춰 자동 배치됩니다.

무엇보다 통계 분석 기능이 내장되어 있어 신뢰구간, 회귀선, 분포 곡선을 자동으로 그려줍니다. 코드 살펴보기 위 코드의 2-4번째 줄에서 필요한 라이브러리를 불러옵니다.

Seaborn은 보통 sns라는 약어로 사용합니다. 7번째 줄에서는 Seaborn에 내장된 샘플 데이터셋인 tips를 로드합니다.

이것은 레스토랑 팁 데이터로, 실습용으로 자주 사용됩니다. 10번째 줄이 핵심입니다.

scatterplot 함수 하나로 산점도를 그립니다. data 파라미터에 데이터프레임을 넣고, x와 y축에 표시할 컬럼을 지정하면 끝입니다.

hue 파라미터는 요일별로 색상을 다르게 표시하라는 의미입니다. Matplotlib이었다면 반복문으로 요일별 데이터를 필터링하고 색상을 지정하는 복잡한 코드가 필요했을 것입니다.

실무에서는 어떻게 활용할까요? 실제 마케팅 부서에서는 고객 세그먼트별 구매 패턴을 분석할 때 Seaborn을 사용합니다. 나이대별 구매액, 지역별 재구매율, 시간대별 접속자 수 등을 한눈에 파악할 수 있는 대시보드를 만들 때 특히 유용합니다.

네이버, 카카오 같은 대기업의 데이터 분석팀에서도 Seaborn을 표준 도구로 사용하고 있습니다. 초보자가 주의할 점 Seaborn을 처음 사용할 때 흔히 하는 실수는 **plt.show()**를 빼먹는 것입니다.

Seaborn은 그래프를 그리기만 할 뿐, 화면에 표시하는 것은 Matplotlib의 역할입니다. 따라서 반드시 마지막에 plt.show()를 호출해야 그래프가 나타납니다.

또 다른 실수는 데이터 형식을 확인하지 않는 것입니다. Seaborn은 주로 Pandas DataFrame 형식을 사용합니다.

리스트나 넘파이 배열을 직접 넣으면 에러가 발생할 수 있으니 먼저 DataFrame으로 변환해야 합니다. 김개발 씨의 깨달음 박시니어 씨의 설명을 들은 김개발 씨는 즉시 코드를 Seaborn으로 바꿔봤습니다.

30줄이던 코드가 단 3줄로 줄어들었고, 그래프는 오히려 더 깔끔하고 전문적으로 보였습니다. "이렇게 쉬운 방법이 있었다니!" Seaborn은 데이터 분석의 필수 도구입니다.

복잡한 설정 없이 아름다운 통계 그래프를 빠르게 만들 수 있어, 분석 결과를 효과적으로 전달할 수 있습니다. 여러분도 다음 프로젝트에서 Seaborn을 사용해보세요.

실전 팁

💡 - Seaborn은 Matplotlib 위에서 작동하므로 plt.show()를 잊지 마세요

  • 항상 Pandas DataFrame 형식으로 데이터를 준비하세요
  • 내장 데이터셋(tips, iris, penguins 등)으로 먼저 연습해보세요

2. histplot()으로 분포 확인

김개발 씨는 고객 나이 데이터를 분석하던 중, 데이터가 어떻게 분포되어 있는지 확인하고 싶었습니다. 평균과 중앙값만 보면 전체 그림을 파악하기 어렵다는 사실을 알았기 때문입니다.

박시니어 씨가 조언했습니다. "분포를 보려면 히스토그램이 최고죠.

Seaborn의 histplot을 써보세요."

**histplot()**은 데이터의 분포를 막대 그래프로 보여주는 함수입니다. 마치 학교에서 시험 점수대별 학생 수를 표시하는 것처럼, 값의 범위를 구간으로 나누고 각 구간에 속하는 데이터 개수를 시각화합니다.

데이터가 어떤 패턴을 가지는지 한눈에 파악할 수 있습니다.

다음 코드를 살펴봅시다.

import seaborn as sns
import matplotlib.pyplot as plt

# 샘플 데이터 로드
tips = sns.load_dataset('tips')

# 기본 히스토그램: 계산서 금액 분포
sns.histplot(data=tips, x='total_bill', bins=20, kde=True)
plt.title('계산서 금액 분포')
plt.xlabel('금액 (달러)')
plt.ylabel('빈도수')
plt.show()

# kde=True는 밀도 곡선을 함께 표시합니다

김개발 씨는 쇼핑몰 고객 데이터를 분석하면서 이상한 점을 발견했습니다. 평균 구매 금액은 50만 원인데, 실제 고객들을 보면 10만 원대가 대부분이었습니다.

어떻게 된 걸까요? 박시니어 씨가 설명했습니다.

"평균만 보면 전체 그림을 놓칠 수 있어요. 소수의 VIP 고객이 수백만 원을 쓰면 평균이 올라가거든요.

분포를 직접 보는 게 중요합니다." 히스토그램이란 무엇일까요? 쉽게 비유하자면, 히스토그램은 마치 빌딩의 층별 거주자 수를 보여주는 막대 그래프 같습니다. 1-5층에 몇 명, 6-10층에 몇 명, 이런 식으로 구간별로 나눠서 표시합니다.

데이터도 마찬가지로 0-10 구간에 몇 개, 10-20 구간에 몇 개 하는 식으로 나타냅니다. 왜 평균과 중앙값만으로는 부족할까요? 숫자로만 보면 데이터의 모양을 알 수 없습니다.

평균이 50이어도 대부분이 50 근처에 몰려 있을 수도 있고, 0과 100에 양극화되어 있을 수도 있습니다. 이런 차이는 비즈니스 전략을 완전히 바꿀 수 있는 중요한 정보입니다.

예를 들어 쇼핑몰에서 고객 구매 금액이 10만 원과 100만 원에 양극화되어 있다면, 중간 가격대 상품을 줄이고 저가와 고가 전략을 분리해야 합니다. 하지만 평균만 보면 이런 인사이트를 얻을 수 없습니다.

histplot의 등장 바로 이런 문제를 해결하기 위해 **histplot()**이 필요합니다. histplot을 사용하면 데이터의 분포를 시각적으로 즉시 파악할 수 있습니다.

어느 구간에 데이터가 집중되어 있는지, 이상값은 없는지, 분포가 대칭인지 비대칭인지 한눈에 알 수 있습니다. kde=True 옵션을 추가하면 부드러운 곡선까지 그려져서 전체적인 형태가 더 명확해집니다.

코드 단계별 분석 8번째 줄이 핵심입니다. histplot 함수에 데이터와 x축 컬럼을 지정합니다.

bins=20은 구간을 20개로 나눈다는 의미입니다. 구간이 많으면 세밀하지만 지저분해 보이고, 적으면 깔끔하지만 디테일을 놓칠 수 있습니다.

보통 20-30개가 적당합니다. kde=True는 매우 중요한 옵션입니다.

KDE는 Kernel Density Estimation의 약자로, 막대 그래프 위에 부드러운 곡선을 그려줍니다. 이 곡선을 보면 전체적인 분포의 형태를 더 쉽게 이해할 수 있습니다.

마치 계단 모양의 산을 부드러운 능선으로 바꿔주는 것과 같습니다. 9-11번째 줄은 그래프를 더 읽기 쉽게 만드는 레이블 설정입니다.

제목과 축 이름을 명확하게 표시하면 보고서에 바로 사용할 수 있는 수준의 그래프가 완성됩니다. 실무 활용 사례 실제 이커머스 회사에서는 상품별 판매량 분포를 histplot으로 확인합니다.

만약 소수의 인기 상품에 판매가 집중되어 있다면 재고 관리 전략을 바꿔야 합니다. 금융권에서는 고객 신용 점수 분포를 분석해서 대출 상품을 설계합니다.

김개발 씨도 고객 나이 분포를 그려본 결과, 20대 후반과 40대 초반에 두 개의 봉우리가 있다는 걸 발견했습니다. 이는 타겟 마케팅을 두 그룹으로 나눠서 진행해야 한다는 중요한 인사이트였습니다.

주의할 점 초보자들이 흔히 하는 실수는 bins 값을 너무 크거나 작게 설정하는 것입니다. bins=5로 하면 구간이 너무 넓어서 세밀한 패턴을 놓치고, bins=100으로 하면 너무 지저분해서 오히려 보기 어렵습니다.

데이터 크기에 따라 다르지만 보통 20-30 정도가 적당합니다. 또 다른 주의점은 이상값의 영향입니다.

극단적으로 큰 값이 하나라도 있으면 전체 히스토그램이 한쪽으로 치우쳐 보입니다. 이럴 때는 먼저 이상값을 제거하거나, x축 범위를 제한해야 합니다.

다시 김개발 씨의 이야기로 김개발 씨는 histplot으로 데이터 분포를 확인한 덕분에 평균에 속지 않고 실제 고객 패턴을 파악할 수 있었습니다. "숫자보다 그래프가 훨씬 많은 걸 말해주네요!" 데이터 분석의 첫걸음은 분포 확인입니다.

histplot을 활용하면 데이터의 숨겨진 패턴을 발견하고, 더 정확한 의사결정을 할 수 있습니다.

실전 팁

💡 - bins 값은 20-30 정도가 적당하며, 데이터 특성에 맞게 조정하세요

  • kde=True로 밀도 곡선을 함께 표시하면 전체 형태를 쉽게 파악할 수 있습니다
  • 이상값이 있으면 xlim()으로 x축 범위를 제한해서 보기 좋게 만드세요

3. boxplot()으로 이상치 탐지

어느 날 김개발 씨는 매출 데이터를 분석하다가 갑자기 튀는 값을 발견했습니다. 대부분 100만 원대인데 한 건이 1억 원이었습니다.

오류일까요, 진짜 데이터일까요? 박시니어 씨가 말했습니다.

"이럴 때 상자 그림을 그려보면 이상치가 한눈에 보입니다."

**boxplot()**은 데이터의 분포를 상자와 선으로 표현하는 함수입니다. 마치 시험 성적표에서 상위 25%, 중간값, 하위 25%를 한 번에 보여주는 것처럼, 데이터의 핵심 통계량과 이상치를 직관적으로 파악할 수 있습니다.

데이터 품질 검사의 필수 도구입니다.

다음 코드를 살펴봅시다.

import seaborn as sns
import matplotlib.pyplot as plt

# 샘플 데이터 로드
tips = sns.load_dataset('tips')

# 요일별 팁 금액 상자 그림
sns.boxplot(data=tips, x='day', y='tip', palette='Set2')
plt.title('요일별 팁 분포 및 이상치')
plt.xlabel('요일')
plt.ylabel('팁 금액 (달러)')
plt.show()

# 점으로 표시된 값들이 이상치입니다

김개발 씨는 월별 매출 보고서를 작성하던 중 이상한 데이터를 발견했습니다. 6월 한 주의 매출이 갑자기 평소의 100배였습니다.

시스템 오류일까요, 아니면 정말 대박 난 주일까요? 잘못된 데이터를 보고서에 넣으면 큰일입니다.

박시니어 씨에게 물어보니 "이상치 탐지가 필요하네요"라는 답이 돌아왔습니다. 이상치는 나머지 데이터와 확연히 다른 값으로, 오류이거나 특별한 의미가 있는 데이터입니다.

상자 그림이란 무엇일까요? 쉽게 비유하자면, 상자 그림은 마치 사람의 키를 표시하는 그림 같습니다. 상자의 아래쪽은 하위 25%, 가운데 선은 중간값(50%), 위쪽은 상위 25%를 나타냅니다.

그리고 상자 밖으로 삐죽 나온 점들이 바로 이상치입니다. 마치 평균 키가 170cm인 그룹에서 190cm가 넘는 사람을 찾는 것과 같습니다.

왜 이상치를 찾아야 할까요? 이상치는 두 가지 의미를 가질 수 있습니다. 첫째는 데이터 입력 오류입니다.

실수로 0을 하나 더 붙이거나, 단위를 잘못 입력한 경우입니다. 둘째는 실제로 특별한 사건이 발생한 경우입니다.

예를 들어 유명 연예인이 SNS에 언급해서 주문이 폭주했을 수 있습니다. 문제는 이상치를 그냥 두면 평균이나 합계 같은 통계량이 왜곡된다는 점입니다.

월 평균 매출이 1000만 원인데, 한 주의 이상치 때문에 2000만 원으로 계산되면 잘못된 의사결정을 하게 됩니다. boxplot의 강력함 바로 이런 문제를 해결하는 게 **boxplot()**입니다.

boxplot을 그리면 데이터의 전체적인 분포와 함께 이상치가 점으로 명확하게 표시됩니다. 어떤 그룹에 이상치가 많은지, 이상치가 위쪽인지 아래쪽인지도 즉시 파악할 수 있습니다.

숫자로 일일이 확인하는 것보다 수백 배 빠릅니다. 코드 상세 분석 8번째 줄의 boxplot 함수가 핵심입니다.

x축에 범주형 변수(요일), y축에 연속형 변수(팁 금액)를 지정하면 요일별로 상자 그림이 그려집니다. **palette='Set2'**는 색상 테마를 지정하는 옵션으로, Seaborn에 내장된 아름다운 색상 조합을 사용합니다.

상자의 의미를 정확히 이해해야 합니다. 상자의 아래쪽 경계는 1사분위수(Q1), 가운데 선은 중앙값(Q2), 위쪽 경계는 **3사분위수(Q3)**입니다.

상자에서 위아래로 뻗은 선(수염)은 Q1 - 1.5 × IQR부터 Q3 + 1.5 × IQR까지의 범위를 나타냅니다. 여기서 IQR은 Q3 - Q1입니다.

이 범위를 벗어난 점들이 바로 이상치로 표시됩니다. Seaborn은 자동으로 이 계산을 수행하고 시각화해줍니다.

실무 활용 사례 실제 제조업에서는 불량품 검사에 boxplot을 사용합니다. 제품의 무게나 길이를 측정했을 때 이상치가 나오면 생산 라인에 문제가 있다는 신호입니다.

금융권에서는 거래 금액의 이상치를 탐지해서 이상 거래를 찾아냅니다. 김개발 씨도 boxplot을 그려본 결과, 1억 원짜리 주문은 명백한 이상치로 표시되었습니다.

확인해보니 실제로 단위 입력 오류였습니다. 만약 발견하지 못했다면 잘못된 보고서가 경영진에게 올라갔을 것입니다.

주의할 점 boxplot을 볼 때 주의할 점은 모든 이상치가 오류는 아니다는 것입니다. 때로는 중요한 비즈니스 인사이트를 담고 있을 수 있습니다.

예를 들어 특정 고객의 구매액이 매우 크다면, 그 고객을 VIP로 관리해야 한다는 신호일 수 있습니다. 또 다른 주의점은 데이터가 너무 적으면 boxplot이 의미 없다는 것입니다.

각 그룹에 최소 10-20개 이상의 데이터가 있어야 신뢰할 수 있는 상자 그림이 그려집니다. 김개발 씨의 교훈 김개발 씨는 boxplot 덕분에 큰 실수를 막았습니다.

"데이터를 그냥 믿으면 안 되는군요. 항상 시각화로 확인해야겠어요." **boxplot()**은 데이터 품질 검사의 필수 도구입니다.

이상치를 빠르게 찾아내고, 데이터의 신뢰성을 높일 수 있습니다. 분석 전 반드시 boxplot으로 데이터를 점검하세요.

실전 팁

💡 - 이상치가 발견되면 오류인지 실제 특이 케이스인지 반드시 확인하세요

  • 그룹별 비교 시 boxplot을 사용하면 분포 차이를 한눈에 볼 수 있습니다
  • palette 옵션으로 색상을 변경하면 더 보기 좋은 그래프를 만들 수 있습니다

4. countplot()으로 빈도 시각화

김개발 씨는 고객 설문 데이터를 정리하던 중, 각 선택지를 고른 사람이 몇 명인지 세어야 했습니다. 엑셀로 일일이 카운트하려니 시간이 너무 오래 걸렸습니다.

박시니어 씨가 말했습니다. "범주형 데이터 빈도는 countplot이 최고죠."

**countplot()**은 범주형 데이터의 개수를 막대 그래프로 표시하는 함수입니다. 마치 투표 결과를 보여주는 막대 그래프처럼, 각 카테고리에 속하는 데이터가 몇 개인지 자동으로 세어서 시각화합니다.

설문 조사나 분류 데이터 분석에 필수적인 도구입니다.

다음 코드를 살펴봅시다.

import seaborn as sns
import matplotlib.pyplot as plt

# 샘플 데이터 로드
tips = sns.load_dataset('tips')

# 요일별 고객 수 막대 그래프
sns.countplot(data=tips, x='day', palette='pastel', order=['Thur', 'Fri', 'Sat', 'Sun'])
plt.title('요일별 방문 고객 수')
plt.xlabel('요일')
plt.ylabel('고객 수')
plt.show()

# order로 막대 순서를 원하는 대로 지정할 수 있습니다

김개발 씨는 신제품 출시를 위한 고객 선호도 조사 데이터를 분석하고 있었습니다. "색상은 빨강, 파랑, 노랑 중 무엇을 선호하십니까?"라는 질문에 500명이 응답했습니다.

각 색상을 선택한 사람이 몇 명인지 파악해야 했습니다. 엑셀에서 COUNTIF 함수를 쓰려니 귀찮았습니다.

카테고리가 10개라면 10번을 반복해야 합니다. 게다가 그래프까지 그리려면 또 다른 작업이 필요했습니다.

countplot이란 무엇일까요? 쉽게 비유하자면, countplot은 마치 반 학생들의 혈액형을 조사해서 막대 그래프로 그려주는 것과 같습니다. A형 몇 명, B형 몇 명, O형 몇 명...

자동으로 세어서 막대로 표시해줍니다. 수동으로 셀 필요가 전혀 없습니다.

왜 수동 카운트는 비효율적일까요? 데이터가 적으면 직접 세는 게 빠를 수 있습니다. 하지만 카테고리가 많거나 데이터가 수천 개라면 이야기가 달라집니다.

실수하기도 쉽고, 시간도 오래 걸립니다. 무엇보다 시각화까지 하려면 이중 작업이 됩니다.

게다가 범주형 데이터는 분석의 시작점입니다. 어느 카테고리가 많은지 파악해야 다음 분석 방향을 정할 수 있습니다.

예를 들어 불만 유형 중 배송 지연이 압도적으로 많다면, 배송 프로세스 개선에 집중해야 합니다. countplot의 편리함 바로 이런 번거로움을 **countplot()**이 한 줄로 해결합니다.

데이터프레임과 카테고리 컬럼만 지정하면 자동으로 개수를 세고, 막대 그래프로 그려줍니다. 색상도 자동으로 예쁘게 설정되고, 레이블도 알아서 붙습니다.

더 중요한 것은 order 파라미터로 막대 순서를 원하는 대로 조정할 수 있다는 점입니다. 코드 세부 설명 8번째 줄의 countplot 함수가 모든 일을 합니다.

data에 데이터프레임을, x에 범주형 컬럼을 지정하면 끝입니다. Seaborn이 자동으로 각 카테고리의 개수를 세어 y축에 표시합니다.

**palette='pastel'**은 부드러운 파스텔 색상을 사용하라는 의미입니다. 'deep', 'muted', 'bright', 'dark' 등 다양한 색상 테마를 선택할 수 있습니다.

보고서나 발표 자료의 분위기에 맞춰 선택하면 됩니다. order 파라미터는 매우 유용합니다.

기본적으로 countplot은 알파벳 순서로 막대를 배치하지만, 실제로는 시간순이나 논리적 순서가 더 자연스러울 때가 많습니다. 요일이라면 월화수목금토일 순서가 맞겠죠.

order에 원하는 순서대로 리스트를 넣으면 그대로 표시됩니다. 실무에서 어떻게 쓰일까요? 마케팅 부서에서는 고객 연령대별 분포를 countplot으로 확인합니다.

20대가 가장 많다면 광고 타겟을 20대에 맞추고, 40대가 많다면 메시지를 바꿉니다. 고객 센터에서는 문의 유형별 빈도를 분석해서 자주 묻는 질문을 FAQ로 만듭니다.

김개발 씨도 색상 선호도를 countplot으로 그려본 결과, 파랑이 압도적으로 많았습니다. 회의에서 이 그래프를 보여주자 모두가 즉시 이해했고, 파랑을 주력 색상으로 결정했습니다.

주의할 점 countplot을 사용할 때 주의할 점은 결측값(NaN) 처리입니다. Pandas 데이터프레임에 NaN이 있으면 countplot에 표시되지 않습니다.

분석 전에 dropna()로 제거하거나, fillna()로 채워야 합니다. 또 다른 주의사항은 카테고리가 너무 많을 때입니다.

카테고리가 50개라면 막대가 너무 많아서 그래프가 지저분해 보입니다. 이럴 때는 상위 10개만 표시하거나, 가로 막대 그래프(y 파라미터 사용)로 바꾸는 게 좋습니다.

김개발 씨의 효율성 김개발 씨는 countplot을 배운 뒤 범주형 데이터 분석이 10배 빨라졌습니다. "이제 엑셀로 일일이 세는 시대는 끝났어요!" **countplot()**은 범주형 데이터의 빈도를 즉시 파악하게 해주는 강력한 도구입니다.

설문 분석, 분류 결과 확인, 카테고리별 비교 등 다양한 상황에서 활용해보세요.

실전 팁

💡 - order 파라미터로 막대 순서를 논리적으로 배치하세요

  • 카테고리가 많으면 y 파라미터를 사용해 가로 막대 그래프로 만드세요
  • 결측값은 미리 제거하거나 채워서 정확한 카운트를 얻으세요

5. heatmap()으로 상관관계 표시

김개발 씨는 여러 변수 간의 관계를 분석하던 중 막막함을 느꼈습니다. 10개 변수가 있는데 서로 어떤 관계인지 하나씩 확인하려면 45개 조합을 봐야 했습니다.

박시니어 씨가 웃으며 말했습니다. "히트맵 하나면 모든 상관관계를 한눈에 볼 수 있어요."

**heatmap()**은 숫자 데이터를 색상으로 표현하는 함수입니다. 마치 날씨 지도에서 온도를 빨강-파랑 색으로 보여주듯, 변수 간 상관계수를 색깔로 시각화합니다.

어떤 변수끼리 강하게 연관되어 있는지 직관적으로 파악할 수 있습니다.

다음 코드를 살펴봅시다.

import seaborn as sns
import matplotlib.pyplot as plt

# 샘플 데이터 로드
tips = sns.load_dataset('tips')

# 상관계수 행렬 계산
corr_matrix = tips[['total_bill', 'tip', 'size']].corr()

# 히트맵으로 시각화
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0, fmt='.2f')
plt.title('변수 간 상관관계 히트맵')
plt.show()

# annot=True는 각 셀에 숫자를 표시합니다

김개발 씨는 쇼핑몰 데이터를 분석하면서 고민에 빠졌습니다. 구매 금액에 영향을 주는 요인이 무엇일까요?

방문 시간, 체류 시간, 조회 페이지 수, 이전 구매 횟수... 변수가 10개나 되었습니다.

각 변수 쌍의 상관관계를 일일이 계산해서 표로 정리했지만, 숫자가 너무 많아서 패턴을 찾기 어려웠습니다. 어떤 변수끼리 강하게 연관되어 있는지 한눈에 알 수 있는 방법이 없을까요?

히트맵이란 무엇일까요? 쉽게 비유하자면, 히트맵은 마치 시험 성적표를 색깔로 표시하는 것과 같습니다. 90점 이상은 빨강, 70-90점은 노랑, 70점 미만은 파랑으로 칠하면 누가 잘했는지 한눈에 보입니다.

히트맵도 마찬가지로 높은 값은 진한 색, 낮은 값은 옅은 색으로 표시해서 패턴을 쉽게 파악하게 합니다. 왜 숫자 표보다 히트맵이 나을까요? 사람의 뇌는 숫자보다 색상을 훨씬 빠르게 처리합니다.

10×10 표에 100개 숫자가 있으면 하나씩 읽어야 하지만, 색상으로 표시하면 1초 만에 패턴을 찾을 수 있습니다. 특히 상관관계 분석에서는 어떤 변수 쌍이 강하게 연관되어 있는지 즉시 알아보는 게 중요합니다.

예를 들어 마케팅 데이터에서 광고 비용과 매출이 강한 양의 상관관계를 보인다면, 광고 투자를 늘려야 한다는 인사이트를 얻을 수 있습니다. 반대로 두 변수가 음의 상관관계라면 하나가 증가할 때 다른 하나는 감소한다는 의미입니다.

heatmap의 강력함 바로 이런 분석을 **heatmap()**이 가능하게 합니다. 상관계수 행렬을 heatmap으로 그리면 강한 상관관계는 진한 빨강이나 파랑으로, 약한 상관관계는 하얀색에 가깝게 표시됩니다.

annot=True 옵션을 추가하면 각 셀에 정확한 숫자까지 표시되어 시각적 정보와 정량적 정보를 동시에 얻을 수 있습니다. 코드 단계별 이해 8번째 줄에서 상관계수 행렬을 먼저 계산합니다.

corr() 함수는 Pandas 데이터프레임의 모든 숫자 컬럼 간 상관계수를 계산해줍니다. 상관계수는 -1부터 1 사이의 값으로, 1에 가까우면 강한 양의 상관관계, -1에 가까우면 강한 음의 상관관계를 의미합니다.

11번째 줄이 핵심입니다. heatmap 함수에 상관계수 행렬을 넣고, annot=True로 숫자를 표시하고, **cmap='coolwarm'**으로 빨강-파랑 색상 조합을 사용합니다.

center=0은 0을 중심으로 색상을 배치하라는 의미로, 양의 상관관계와 음의 상관관계를 명확하게 구분할 수 있습니다. **fmt='.2f'**는 숫자를 소수점 둘째 자리까지 표시하라는 의미입니다.

상관계수는 보통 0.XX 형태이므로 두 자리면 충분합니다. 실무 활용 사례 금융권에서는 자산 간 상관관계를 heatmap으로 분석해서 포트폴리오를 구성합니다.

상관관계가 낮은 자산을 조합하면 리스크를 분산할 수 있기 때문입니다. 제조업에서는 공정 변수 간 상관관계를 파악해서 품질에 영향을 주는 핵심 요인을 찾습니다.

김개발 씨도 히트맵을 그려본 결과, 체류 시간과 구매 금액이 강한 양의 상관관계(0.78)를 보인다는 걸 발견했습니다. 이는 고객이 오래 머물수록 많이 구매한다는 의미로, 체류 시간을 늘리는 UX 개선이 매출 증대로 이어질 수 있다는 인사이트였습니다.

주의할 점 히트맵을 볼 때 주의할 점은 상관관계가 인과관계가 아니라는 것입니다. A와 B가 상관관계를 보인다고 해서 A가 B의 원인이라고 단정할 수 없습니다.

숨겨진 제3의 변수가 둘 다에 영향을 줄 수 있습니다. 또 다른 주의사항은 변수가 너무 많으면 히트맵이 복잡해진다는 점입니다.

20개 이상의 변수가 있으면 그래프가 작아져서 보기 어렵습니다. 이럴 때는 중요한 변수만 선택하거나, 그래프 크기를 키워야 합니다.

김개발 씨의 인사이트 김개발 씨는 히트맵 하나로 수십 개 변수의 관계를 한눈에 파악했습니다. "색깔 하나로 이렇게 많은 정보를 전달할 수 있다니 놀랍네요!" **heatmap()**은 다변량 분석의 필수 도구입니다.

변수 간 관계를 빠르게 파악하고, 숨겨진 패턴을 발견하세요. 데이터 분석의 첫 단계로 꼭 활용해보시길 권장합니다.

실전 팁

💡 - annot=True로 정확한 수치를 함께 표시하세요

  • cmap은 'coolwarm', 'RdBu_r', 'viridis' 등 데이터 특성에 맞게 선택하세요
  • 변수가 많으면 figsize로 그래프 크기를 키워서 보기 좋게 만드세요

6. pairplot()으로 변수 관계 탐색

김개발 씨는 여러 변수를 동시에 탐색하고 싶었지만, 그래프를 하나씩 그리려니 너무 번거로웠습니다. 변수가 5개라면 그래프도 5개 이상 그려야 했습니다.

박시니어 씨가 말했습니다. "pairplot 하나면 모든 변수 쌍의 관계를 한 번에 볼 수 있어요."

**pairplot()**은 데이터셋의 모든 변수 쌍에 대해 산점도와 분포 그래프를 자동으로 그려주는 함수입니다. 마치 학급 학생들의 키, 몸무게, 시력을 서로 비교하는 모든 그래프를 한 장에 보여주는 것처럼, 변수 간 관계를 종합적으로 탐색할 수 있습니다.

다음 코드를 살펴봅시다.

import seaborn as sns
import matplotlib.pyplot as plt

# 샘플 데이터 로드
tips = sns.load_dataset('tips')

# 주요 변수들의 pairplot 생성
sns.pairplot(tips, vars=['total_bill', 'tip', 'size'], hue='time', palette='husl')
plt.suptitle('식사 데이터 변수 관계 탐색', y=1.02)
plt.show()

# 대각선은 분포, 나머지는 산점도로 표시됩니다
# hue로 그룹별 색상을 다르게 할 수 있습니다

김개발 씨는 신제품 개발을 위한 고객 데이터를 분석하고 있었습니다. 나이, 소득, 가족 수, 구매 빈도, 평균 구매액 등 5개 변수가 있었습니다.

이 변수들이 서로 어떤 관계인지 파악해야 했습니다. 산점도를 하나씩 그리기 시작했습니다.

나이-소득, 나이-가족 수, 나이-구매 빈도... 5개 변수라면 10개 조합을 그려야 했습니다.

게다가 각 변수의 분포도 따로 확인해야 했습니다. 이렇게 하나씩 하려니 오후 내내 걸릴 것 같았습니다.

pairplot이란 무엇일까요? 쉽게 비유하자면, pairplot은 마치 종합 건강검진 결과지 같습니다. 키, 몸무게, 혈압, 혈당, 콜레스테롤...

각 지표 간 관계를 모두 그래프로 보여줍니다. 한 장의 종이에 모든 정보가 정리되어 있어서 전체적인 건강 상태를 한눈에 파악할 수 있습니다.

왜 개별 그래프로는 부족할까요? 데이터 탐색의 핵심은 전체적인 패턴을 파악하는 것입니다. 개별 그래프를 하나씩 보면 나무만 보고 숲을 놓치기 쉽습니다.

예를 들어 A와 B는 상관관계가 있고, B와 C도 상관관계가 있다면, A와 C도 간접적으로 연관되어 있을 가능성이 높습니다. 이런 복합적인 관계는 개별 그래프로는 파악하기 어렵습니다.

또한 시간도 문제입니다. 변수가 10개라면 45개 조합을 그려야 합니다.

하나에 5분씩만 걸려도 4시간 가까이 소요됩니다. 이건 비효율적입니다.

pairplot의 놀라운 효율성 바로 이런 문제를 **pairplot()**이 단 한 줄로 해결합니다. pairplot은 지정한 모든 변수에 대해 자동으로 산점도 행렬을 생성합니다.

대각선에는 각 변수의 분포 그래프(히스토그램 또는 KDE)가, 나머지 칸에는 두 변수 간 산점도가 그려집니다. hue 파라미터를 추가하면 카테고리별로 색상을 다르게 표시해서 그룹 간 차이까지 한눈에 볼 수 있습니다.

코드 상세 분석 8번째 줄의 pairplot 함수가 모든 마법을 부립니다. vars 파라미터에 분석하고 싶은 변수들을 리스트로 지정합니다.

지정하지 않으면 데이터프레임의 모든 숫자 컬럼이 포함됩니다. **hue='time'**은 매우 중요한 옵션입니다.

점심과 저녁 시간대를 다른 색으로 표시해서, 시간대에 따라 패턴이 어떻게 달라지는지 비교할 수 있습니다. 마치 남녀를 파랑-빨강으로 구분하는 것처럼 말이죠.

**palette='husl'**은 색상 조합을 지정합니다. husl은 색상 대비가 명확해서 그룹을 구분하기 좋습니다.

다른 옵션으로는 'Set1', 'Set2', 'Paired' 등이 있습니다. 대각선의 그래프는 기본적으로 히스토그램이지만, **diag_kind='kde'**로 밀도 곡선으로 바꿀 수도 있습니다.

보고서 스타일에 맞춰 선택하면 됩니다. 실무 활용 사례 실제 데이터 사이언스 프로젝트에서는 탐색적 데이터 분석(EDA)의 첫 단계로 pairplot을 사용합니다.

머신러닝 모델을 만들기 전에 변수 간 관계를 파악해서 어떤 피처가 중요한지 미리 파악할 수 있습니다. 부동산 분석에서는 면적, 층수, 방 개수, 가격 등을 pairplot으로 그려서 가격에 영향을 주는 요인을 찾습니다.

의료 데이터에서는 혈압, 혈당, 콜레스테롤, BMI 등의 관계를 탐색해서 질병 위험 요인을 분석합니다. 김개발 씨도 pairplot을 그려본 결과, 소득과 평균 구매액이 강한 선형 관계를 보인다는 걸 즉시 발견했습니다.

또한 가족 수가 많은 그룹은 구매 빈도도 높다는 패턴도 눈에 띄었습니다. 이런 인사이트는 개별 그래프로는 발견하기 어려웠을 것입니다.

주의할 점 pairplot을 사용할 때 가장 큰 주의사항은 변수가 너무 많으면 안 된다는 것입니다. 변수가 10개라면 10×10 = 100개 그래프가 그려지면서 화면이 너무 복잡해집니다.

보통 3-7개 정도의 핵심 변수만 선택하는 게 좋습니다. 또 다른 주의점은 생성 시간입니다.

데이터가 수만 개라면 pairplot을 그리는 데 몇 분이 걸릴 수 있습니다. 샘플링으로 데이터를 줄이거나, 주요 변수만 선택해서 시간을 절약하세요.

김개발 씨의 효율성 향상 김개발 씨는 pairplot 한 번으로 오후 내내 걸릴 작업을 10초 만에 끝냈습니다. "이제 데이터 탐색이 즐거워요!" **pairplot()**은 데이터 탐색의 가장 강력한 도구입니다.

변수 간 숨겨진 관계를 빠르게 발견하고, 분석 방향을 설정하세요. 모든 데이터 분석 프로젝트의 시작점으로 추천합니다.

실전 팁

💡 - 변수는 3-7개 정도로 제한해서 보기 좋게 만드세요

  • hue로 그룹별 색상을 다르게 하면 패턴 비교가 쉬워집니다
  • 데이터가 크면 sample()로 일부만 추출해서 빠르게 확인하세요

7. Seaborn 스타일 설정

김개발 씨는 Seaborn 그래프를 여러 개 만들었지만, 모두 다른 스타일이어서 통일감이 없었습니다. 보고서에 넣으려니 일관성이 부족해 보였습니다.

박시니어 씨가 말했습니다. "스타일을 한 번만 설정하면 모든 그래프가 같은 테마로 나와요."

Seaborn 스타일 설정은 그래프의 전체적인 디자인을 제어하는 기능입니다. 마치 워드 문서에서 테마를 선택하면 제목, 본문, 표가 모두 같은 스타일로 바뀌는 것처럼, 한 번의 설정으로 모든 그래프를 일관되게 만들 수 있습니다.

다음 코드를 살펴봅시다.

import seaborn as sns
import matplotlib.pyplot as plt

# Seaborn 스타일 설정
sns.set_style('whitegrid')  # 배경 스타일
sns.set_palette('deep')  # 색상 팔레트
sns.set_context('talk')  # 그래프 크기와 폰트

# 이제 그리는 모든 그래프에 스타일이 적용됩니다
tips = sns.load_dataset('tips')
sns.scatterplot(data=tips, x='total_bill', y='tip')
plt.title('스타일이 적용된 그래프')
plt.show()

김개발 씨는 주간 보고서에 넣을 그래프 10개를 만들었습니다. 하지만 문제가 있었습니다.

어떤 그래프는 배경이 회색이고, 어떤 것은 흰색이었습니다. 색상도 제각각이어서 전문성이 떨어져 보였습니다.

각 그래프마다 스타일을 일일이 지정하려니 코드가 길어지고 실수하기도 쉬웠습니다. 프로젝트 전체에 일관된 디자인 테마를 적용하는 방법이 없을까요?

Seaborn 스타일이란 무엇일까요? 쉽게 비유하자면, Seaborn 스타일은 마치 회사 CI(Corporate Identity) 같습니다. 회사의 모든 문서, 프레젠테이션, 홈페이지가 같은 색상과 폰트를 사용하면 브랜드 정체성이 강해집니다.

Seaborn 스타일도 마찬가지로 모든 그래프를 같은 디자인 규칙으로 통일해서 전문적으로 보이게 만듭니다. 왜 스타일 통일이 중요할까요? 데이터 분석 결과를 발표할 때 시각적 일관성은 매우 중요합니다.

그래프마다 디자인이 다르면 보는 사람이 집중하기 어렵고, 아마추어처럼 보입니다. 반대로 모든 그래프가 같은 스타일이면 프로페셔널한 인상을 줍니다.

또한 스타일을 한 번만 설정하면 이후 모든 그래프에 자동으로 적용되어 효율적입니다. 그래프 10개를 그리더라도 스타일 설정은 코드 3줄이면 충분합니다.

Seaborn 스타일의 세 가지 축 Seaborn의 스타일 설정은 크게 세 가지로 나뉩니다. 첫째, **set_style()**은 배경과 격자선 스타일을 제어합니다.

'whitegrid'는 흰 배경에 회색 격자선, 'darkgrid'는 회색 배경에 흰 격자선, 'white'는 격자선 없는 흰 배경, 'dark'는 격자선 없는 회색 배경, 'ticks'는 축에만 눈금이 있는 스타일입니다. 과학 논문에는 'whitegrid'나 'white'가 적합하고, 프레젠테이션에는 'darkgrid'가 잘 어울립니다.

둘째, **set_palette()**는 색상 조합을 설정합니다. 'deep'는 선명한 색상, 'muted'는 부드러운 색상, 'pastel'은 파스텔 톤, 'bright'는 밝은 색상, 'dark'는 어두운 색상입니다.

발표 자료는 'deep'이나 'bright'로 선명하게, 보고서는 'muted'로 차분하게 만드는 게 좋습니다. 셋째, **set_context()**는 그래프의 크기와 폰트 크기를 조절합니다.

'paper'는 논문용 작은 크기, 'notebook'은 주피터 노트북용 기본 크기, 'talk'는 발표용 큰 크기, 'poster'는 포스터용 매우 큰 크기입니다. 용도에 맞게 선택하면 됩니다.

코드 세부 설명 5-7번째 줄이 핵심입니다. 이 세 줄로 모든 그래프의 스타일이 결정됩니다.

중요한 점은 이 설정이 전역적으로 적용된다는 것입니다. 한 번 설정하면 이후에 그리는 모든 그래프가 같은 스타일을 따릅니다.

10-13번째 줄에서는 평범하게 그래프를 그리지만, 앞에서 설정한 스타일이 자동으로 적용됩니다. 배경은 'whitegrid', 색상은 'deep', 크기는 'talk'로 나타납니다.

스타일을 일일이 지정할 필요가 없습니다. 실무 활용 사례 실제 기업에서는 데이터 분석팀이 표준 스타일 가이드를 만듭니다.

예를 들어 회사 CI 컬러를 Seaborn 팔레트로 등록하고, 모든 보고서에 같은 스타일을 사용합니다. 이렇게 하면 브랜드 정체성이 강화되고, 외부 발표 자료의 품질도 높아집니다.

김개발 씨도 팀 표준 스타일을 설정한 뒤 모든 그래프를 다시 그렸습니다. 이번에는 완벽하게 통일된 디자인으로 나왔고, 팀장님께 칭찬을 받았습니다.

"이제 진짜 프로처럼 보이네요!" 고급 활용: 커스텀 팔레트 기본 팔레트 외에 직접 색상을 지정할 수도 있습니다. **sns.set_palette(['#FF0000', '#00FF00', '#0000FF'])**처럼 HEX 코드로 색상 리스트를 만들면 회사 CI 컬러를 정확하게 적용할 수 있습니다.

브랜드 아이덴티티가 중요한 기업에서는 이 방법을 자주 사용합니다. 주의할 점 스타일 설정의 주의사항은 한 번 설정하면 계속 유지된다는 점입니다.

주피터 노트북에서 스타일을 바꾸고 싶다면 다시 set_style()을 호출해야 합니다. 원래대로 돌아가려면 **sns.reset_defaults()**를 사용하세요.

또 다른 주의점은 Matplotlib 설정과 충돌할 수 있다는 것입니다. Seaborn 스타일을 설정한 뒤 plt.style.use()로 Matplotlib 스타일을 적용하면 Seaborn 설정이 무시될 수 있습니다.

둘 중 하나만 사용하는 게 안전합니다. 김개발 씨의 완성 김개발 씨는 이제 모든 그래프를 일관된 스타일로 만들 수 있게 되었습니다.

보고서를 보는 사람들도 "그래프가 정말 깔끔하고 전문적이네요"라고 칭찬했습니다. Seaborn 스타일 설정은 작은 노력으로 큰 효과를 얻는 방법입니다.

프로젝트 초반에 스타일을 정해두면 이후 모든 그래프가 자동으로 아름답고 일관되게 나옵니다. 여러분도 팀이나 프로젝트 표준 스타일을 만들어보세요.

실전 팁

💡 - 용도에 맞게 context를 선택하세요 (발표는 'talk', 논문은 'paper')

  • 회사 CI 컬러를 HEX 코드로 팔레트에 등록하면 브랜드 일관성을 유지할 수 있습니다
  • 원래대로 돌아가려면 sns.reset_defaults()를 사용하세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#Seaborn#DataVisualization#Statistics#Matplotlib

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.