스토리텔링 형식으로 업데이트되었습니다! 실무 사례와 함께 더 쉽게 이해할 수 있어요.
이미지 로딩 중...
AI Generated
2025. 11. 25. · 8 Views
단변량 분석 분포 시각화 완벽 가이드
데이터 분석의 첫걸음인 단변량 분석과 분포 시각화를 배웁니다. 히스토그램, 박스플롯, 밀도 그래프 등 다양한 시각화 방법을 초보자도 쉽게 이해할 수 있도록 설명합니다.
목차
- 단변량_분석이란
- 히스토그램으로_분포_보기
- KDE_밀도_그래프
- 박스플롯으로_이상치_찾기
- 바이올린_플롯
- 종합_분포_시각화_대시보드
- Seaborn_displot_활용
- 실전_분포_분석_함수
1. 단변량_분석이란
여러분이 학교에서 시험 점수 데이터를 받았다고 상상해보세요. "우리 반 평균은 몇 점일까?", "대부분의 학생들은 몇 점대에 모여 있을까?", "혹시 너무 높거나 낮은 점수는 없을까?" 이런 궁금증이 생기지 않나요?
이런 질문들에 답하려면 데이터를 하나하나 들여다봐야 합니다. 하지만 100명, 1000명의 데이터를 눈으로만 보면 아무것도 알 수 없어요.
숫자의 바다에서 허우적대다가 포기하게 되죠. 바로 이럴 때 필요한 것이 단변량 분석입니다.
하나의 변수(예: 시험 점수)만 집중해서 분석하면, 데이터가 어떤 모양으로 퍼져 있는지, 중심이 어디인지, 특이한 값은 없는지 한눈에 파악할 수 있어요.
간단히 말해서, 단변량 분석은 "하나의 변수를 깊이 있게 이해하는 분석 방법"입니다. 마치 한 명의 친구를 깊이 알아가는 것처럼, 하나의 데이터 항목에 집중하는 거예요.
왜 이게 중요할까요? 데이터 분석의 세계에서 단변량 분석은 모든 분석의 시작점이에요.
집을 지을 때 기초 공사가 중요하듯이, 데이터를 제대로 이해하려면 각 변수를 먼저 하나씩 살펴봐야 합니다. 예를 들어, 쇼핑몰의 고객 나이 데이터를 분석할 때, 먼저 "고객들의 나이가 어떻게 분포되어 있는지"부터 파악해야 맞춤형 마케팅 전략을 세울 수 있죠.
기존에는 엑셀에서 수동으로 평균, 최대값, 최소값을 계산했다면, 이제는 Python으로 몇 줄의 코드만으로 모든 통계량을 한 번에 확인하고, 아름다운 그래프까지 그릴 수 있습니다. 단변량 분석의 핵심 특징은 세 가지예요.
첫째, 중심 경향(평균, 중앙값)을 파악합니다. 둘째, 산포도(데이터가 얼마나 퍼져 있는지)를 측정합니다.
셋째, 분포의 형태(정규분포인지, 한쪽으로 치우쳤는지)를 확인합니다. 이 세 가지를 알면 데이터의 전체적인 성격을 파악할 수 있어요.
다음 코드를 살펴봅시다.
import pandas as pd
import numpy as np
# 샘플 데이터 생성: 100명 학생의 시험 점수
np.random.seed(42)
scores = np.random.normal(loc=75, scale=10, size=100)
scores = np.clip(scores, 0, 100) # 0~100 사이로 제한
# 기본 통계량 확인
data = pd.Series(scores, name='시험점수')
print("=== 단변량 분석 결과 ===")
print(f"평균: {data.mean():.2f}점")
print(f"중앙값: {data.median():.2f}점")
print(f"표준편차: {data.std():.2f}")
print(f"최소값: {data.min():.2f}점")
print(f"최대값: {data.max():.2f}점")
👨🏫 자, 이제 이 코드가 어떻게 동작하는지 함께 살펴볼까요? 👦 네!
선생님, 단변량 분석이 뭔지 아직 잘 모르겠어요. 👨🏫 좋은 질문이에요!
쉽게 설명해줄게요. "단변량"에서 "단"은 "하나"를 의미해요.
즉, 하나의 항목만 분석한다는 뜻이에요. 예를 들어, 반 친구들의 "키"만 분석하거나, "몸무게"만 분석하는 거죠.
마트에서 과일을 살 때 사과만 골라서 크기를 비교하는 것과 비슷해요! 👦 아~ 그러면 np.random.normal은 뭘 하는 거예요?
👨🏫 np.random.normal은 "가짜 데이터를 만들어주는 마법 도구"예요. loc=75는 평균이 75점이 되게, scale=10은 점수들이 평균에서 대략 10점 정도씩 떨어져 있게 만들어요.
size=100은 100명의 점수를 만들라는 뜻이고요. 진짜 시험 점수가 없으니까 연습용 데이터를 만든 거예요!
👦 그 다음에 np.clip은 왜 사용하나요? 👨🏫 아주 좋은 관찰이에요!
시험 점수는 0점보다 낮거나 100점보다 높을 수 없잖아요? 그런데 random.normal은 가끔 -5점이나 105점 같은 이상한 값을 만들 수 있어요.
np.clip은 "가위로 잘라내듯이" 범위를 벗어나는 값을 경계값으로 바꿔줘요. 👦 오~ 신기하네요!
pd.Series는 뭐예요? 👨🏫 pd.Series는 데이터를 예쁘게 정리해주는 "데이터 상자"라고 생각하면 돼요.
그냥 숫자 리스트보다 .mean(), .median() 같은 편리한 기능을 바로 사용할 수 있어서 분석할 때 정말 유용해요. 👦 결과를 보면 평균이랑 중앙값이 나오는데, 둘이 뭐가 달라요?
👨🏫 좋은 질문이에요! 평균은 모든 점수를 더해서 인원수로 나눈 거예요.
중앙값은 점수를 순서대로 나열했을 때 딱 가운데 있는 값이에요. 만약 한 명이 0점을 받으면 평균은 확 떨어지지만, 중앙값은 거의 안 변해요.
그래서 둘을 같이 보면 데이터에 극단적인 값이 있는지 알 수 있어요! 👦 다음에는 뭘 배우나요?
👨🏫 다음 섹션에서는 이 숫자들을 "눈으로 볼 수 있게" 히스토그램이라는 그래프로 그려볼 거예요. 숫자보다 그림이 훨씬 이해하기 쉽거든요!
실전 팁
💡 분석 전에 항상 data.describe()로 전체 통계량을 먼저 확인하세요
💡 평균과 중앙값의 차이가 크면 데이터에 극단값(이상치)이 있다는 신호예요
2. 히스토그램으로_분포_보기
숫자로만 "평균 75점, 표준편차 10"이라고 들으면 어떤 느낌이 드시나요? 솔직히 잘 와닿지 않죠?
75점 근처에 학생들이 얼마나 모여 있는지, 90점 이상의 우수한 학생은 몇 명인지 상상하기 어려워요. 이런 문제는 데이터 분석가들이 매일 겪는 고민이에요.
숫자만으로는 데이터의 "모양"을 알 수 없거든요. 마치 친구의 얼굴을 설명할 때 "눈 크기 3cm, 코 높이 2cm"라고 하면 얼굴이 상상이 안 되는 것처럼요.
바로 이럴 때 히스토그램이 등장합니다! 히스토그램은 데이터를 막대 그래프로 그려서, 어디에 데이터가 많이 몰려 있는지 한눈에 보여줘요.
숫자의 세계를 그림의 세계로 바꿔주는 마법 같은 도구예요.
간단히 말해서, 히스토그램은 "데이터를 구간별로 나눠서 각 구간에 몇 개의 데이터가 있는지 막대로 보여주는 그래프"입니다. 마치 학생들을 키 순서대로 줄 세우고, 150cm대, 160cm대, 170cm대로 그룹을 나눠서 각 그룹에 몇 명이 있는지 세는 것과 같아요.
왜 히스토그램이 중요할까요? 데이터의 분포를 이해하는 것은 올바른 분석 방법을 선택하는 데 필수적이에요.
예를 들어, 고객의 구매 금액 분포를 보고 "대부분의 고객이 5만원 이하를 쓰는구나"라는 것을 알면, 5만원 쿠폰이 효과적일지 판단할 수 있죠. 기존에는 데이터를 정렬하고, 구간을 나누고, 하나하나 세어야 했다면, 이제는 Python의 Matplotlib이나 Seaborn 라이브러리로 단 몇 줄의 코드로 아름다운 히스토그램을 그릴 수 있습니다.
히스토그램의 핵심 요소는 세 가지예요. 첫째, bins(구간 수)로 막대를 몇 개로 나눌지 결정해요.
둘째, 막대의 높이는 해당 구간에 속한 데이터의 개수를 나타내요. 셋째, 막대들의 전체적인 모양을 보면 데이터가 정규분포인지, 한쪽으로 치우쳤는지 알 수 있어요.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 시험 점수 데이터 생성
np.random.seed(42)
scores = np.random.normal(loc=75, scale=10, size=100)
scores = np.clip(scores, 0, 100)
# 히스토그램 그리기
plt.figure(figsize=(10, 6))
plt.hist(scores, bins=15, color='skyblue', edgecolor='navy', alpha=0.7)
plt.xlabel('시험 점수', fontsize=12)
plt.ylabel('학생 수', fontsize=12)
plt.title('시험 점수 분포 히스토그램', fontsize=14)
plt.axvline(np.mean(scores), color='red', linestyle='--', label=f'평균: {np.mean(scores):.1f}')
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.show()
👨🏫 자, 이제 히스토그램 코드를 하나씩 살펴볼까요? 이 그래프가 그려지면 데이터가 어떻게 생겼는지 바로 알 수 있어요!
👦 네! 선생님, plt.figure(figsize=(10, 6))는 뭐예요?
👨🏫 이건 "도화지 크기를 정하는 것"이에요! figsize=(10, 6)은 가로 10인치, 세로 6인치 크기의 그림을 그리겠다는 뜻이에요.
작은 스케치북에 그릴지, 큰 전지에 그릴지 먼저 정하는 거죠. 👦 아~ 그러면 plt.hist가 히스토그램을 그리는 거예요?
👨🏫 맞아요! plt.hist가 바로 히스토그램을 그려주는 핵심 함수예요.
scores는 우리가 그릴 데이터, bins=15는 막대를 15개로 나누겠다는 뜻이에요. 0점부터 100점까지를 15개 구간으로 나눈다고 생각하면 돼요.
👦 bins 숫자를 바꾸면 어떻게 되나요? 👨🏫 아주 중요한 질문이에요!
bins가 너무 적으면(예: 3개) 그래프가 너무 뭉뚱그려져서 세부 정보를 놓쳐요. 반대로 너무 많으면(예: 50개) 막대가 너무 얇아서 패턴을 보기 어려워요.
보통 데이터 개수의 제곱근 정도가 적당해요. 100개 데이터면 10~15개가 좋아요!
👦 color랑 edgecolor는 뭐예요? 👨🏫 color='skyblue'는 막대 안쪽 색깔, edgecolor='navy'는 막대 테두리 색깔이에요.
alpha=0.7은 투명도인데, 0에 가까울수록 투명하고 1이면 완전 불투명해요. 0.7이면 살짝 비치는 느낌이 나서 예뻐요!
👦 빨간 점선은 뭐예요? 👨🏫 plt.axvline은 세로 선을 그어주는 함수예요!
여기서는 평균값 위치에 빨간 점선을 그어서 "평균이 여기에요!"라고 표시해준 거예요. 이러면 데이터가 평균을 기준으로 어떻게 퍼져 있는지 더 잘 보여요.
👦 실제로 이걸 어디에 쓸 수 있어요? 👨🏫 실무에서는 정말 많이 써요!
예를 들어, 쇼핑몰에서 고객들의 구매 금액 분포를 보고 "아, 대부분 3만원 이하를 쓰는구나. 그럼 3만원 이상 구매 시 무료 배송을 하면 매출이 늘겠다!"라고 전략을 세울 수 있어요.
👦 다음에는 뭘 배우나요? 👨🏫 다음 섹션에서는 Seaborn 라이브러리로 더 예쁘고 정보가 풍부한 분포 그래프를 그려볼 거예요.
KDE라는 부드러운 곡선도 추가해볼 거예요!
실전 팁
💡 bins 수는 보통 데이터 개수의 제곱근 정도로 시작해보세요
💡 평균선을 함께 그리면 데이터의 중심을 한눈에 파악할 수 있어요
💡 edgecolor로 막대 테두리를 넣으면 구간 경계가 더 잘 보여요
3. KDE_밀도_그래프
히스토그램을 그려봤는데, 막대 모양이 좀 딱딱하게 느껴지지 않았나요? bins 수를 바꿀 때마다 그래프 모양이 달라지는 것도 좀 불편하고요.
"데이터의 진짜 모양을 부드럽게 볼 수 없을까?"라는 생각이 드시죠? 이런 고민은 통계학자들도 오랫동안 해왔어요.
히스토그램은 구간을 어떻게 나누느냐에 따라 모양이 많이 달라지거든요. 똑같은 데이터인데 다르게 보이면 분석 결과도 달라질 수 있어요.
바로 이럴 때 KDE(Kernel Density Estimation)가 등장합니다! KDE는 히스토그램의 뾰족뾰족한 막대들을 부드러운 곡선으로 바꿔줘요.
마치 레고 블록으로 만든 산을 점토로 매끄럽게 다듬는 것처럼요!
간단히 말해서, KDE는 "데이터의 분포를 부드러운 곡선으로 추정하는 방법"입니다. 히스토그램이 막대 그래프라면, KDE는 그 막대들 위를 부드럽게 이은 곡선이에요.
KDE가 필요한 이유는 뭘까요? 히스토그램은 bins 설정에 따라 모양이 크게 달라져요.
하지만 KDE는 데이터 자체의 특성을 반영해서 일관된 곡선을 그려줘요. 그래서 서로 다른 데이터 분포를 비교할 때 KDE가 훨씬 유용해요.
기존 히스토그램만으로는 "이 데이터가 정규분포에 가까운가?"를 판단하기 어려웠다면, KDE 곡선을 보면 데이터의 전체적인 형태를 직관적으로 파악할 수 있습니다. KDE의 핵심 특징을 알려드릴게요.
첫째, 곡선 아래 면적의 합이 항상 1이에요(확률 밀도). 둘째, bandwidth 파라미터로 곡선의 부드러움을 조절할 수 있어요.
셋째, 여러 데이터셋의 분포를 한 그래프에서 쉽게 비교할 수 있어요.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 두 그룹의 시험 점수 데이터
np.random.seed(42)
class_a = np.random.normal(loc=70, scale=8, size=100) # A반: 평균 70점
class_b = np.random.normal(loc=80, scale=12, size=100) # B반: 평균 80점
# KDE 그래프 그리기
plt.figure(figsize=(10, 6))
sns.kdeplot(data=class_a, label='A반', color='blue', fill=True, alpha=0.3)
sns.kdeplot(data=class_b, label='B반', color='orange', fill=True, alpha=0.3)
plt.xlabel('시험 점수', fontsize=12)
plt.ylabel('밀도 (Density)', fontsize=12)
plt.title('A반과 B반의 점수 분포 비교', fontsize=14)
plt.legend()
plt.grid(alpha=0.3)
plt.show()
👨🏫 자, 이번에는 KDE 그래프를 배워볼 거예요. 두 반의 점수를 비교하는 예제를 만들어봤어요!
👦 선생님, KDE가 뭐예요? 이름이 어려워요.
👨🏫 KDE는 Kernel Density Estimation의 약자인데, 쉽게 말하면 "데이터를 부드러운 산 모양으로 그려주는 방법"이에요. 히스토그램이 계단처럼 생겼다면, KDE는 부드러운 언덕처럼 생겼어요.
레고 블록으로 산을 만들면 울퉁불퉁하지만, 찰흙으로 만들면 매끄럽잖아요? KDE가 바로 찰흙 버전이에요!
👦 sns.kdeplot이 뭐예요? 👨🏫 sns는 Seaborn이라는 그래프 라이브러리예요.
Matplotlib보다 더 예쁜 그래프를 쉽게 그릴 수 있어요. kdeplot은 KDE 그래프를 그려주는 함수고요.
data=class_a는 그릴 데이터, fill=True는 곡선 아래를 색칠하라는 뜻이에요. 👦 alpha=0.3은 또 뭐예요?
👨🏫 alpha는 투명도예요! 0.3이면 30% 불투명, 70% 투명한 거예요.
이렇게 하면 두 그래프가 겹쳐도 둘 다 잘 보여요. 만약 alpha=1이면 앞에 있는 그래프가 뒤를 완전히 가려버리거든요.
👦 그래프를 보면 A반이랑 B반이 확실히 다르게 보이네요! 👨🏫 맞아요!
이게 KDE의 가장 큰 장점이에요. A반은 70점 근처에 봉우리가 있고, B반은 80점 근처에 봉우리가 있죠?
그리고 B반의 곡선이 더 넓게 퍼져 있는데, 이건 B반 점수의 편차가 더 크다는 뜻이에요. 히스토그램으로는 이렇게 직관적으로 비교하기 어려워요.
👦 밀도(Density)가 뭐예요? 학생 수 아니에요?
👨🏫 좋은 질문이에요! 밀도는 "그 점수가 나올 확률"이라고 생각하면 돼요.
곡선이 높은 곳은 그 점수대의 학생이 많다는 뜻이고, 낮은 곳은 적다는 뜻이에요. 그리고 전체 곡선 아래 면적을 합하면 항상 1이 돼요.
👦 실제로 어디에 쓰나요? 👨🏫 실무에서는 A/B 테스트 결과 비교에 많이 써요!
예를 들어, 새 디자인(B)과 기존 디자인(A)의 사용자 체류 시간을 비교할 때, KDE로 그려보면 "새 디자인이 확실히 체류 시간이 길구나!"를 한눈에 확인할 수 있어요. 👦 다음에는 뭘 배우나요?
👨🏫 다음 섹션에서는 박스플롯(Box Plot)을 배울 거예요. 박스플롯은 이상치(아주 특이한 값)를 찾아내는 데 최고의 도구예요!
실전 팁
💡 여러 그룹을 비교할 때는 KDE가 히스토그램보다 훨씬 깔끔해요
💡 fill=True와 낮은 alpha 값을 함께 쓰면 겹치는 부분도 잘 보여요
💡 Seaborn의 displot을 쓰면 히스토그램과 KDE를 한 번에 그릴 수 있어요
4. 박스플롯으로_이상치_찾기
데이터를 분석하다 보면 가끔 이상한 값이 나와요. 학생들의 시험 점수가 대부분 60~90점인데, 한 명이 5점을 받았다면?
혹은 쇼핑몰에서 평균 구매 금액이 5만원인데 한 고객이 500만원을 썼다면? 이런 값들을 "이상치(Outlier)"라고 불러요.
이상치는 분석을 망칠 수도 있고, 반대로 중요한 발견의 단서가 될 수도 있어요. 500만원 쓴 고객이 사기범인지, 아니면 VIP 고객인지 알아야 하잖아요?
그래서 이상치를 찾는 게 정말 중요해요. 바로 이럴 때 박스플롯(Box Plot)이 빛을 발합니다!
박스플롯은 데이터의 분포를 상자 모양으로 보여주면서, 이상치를 점으로 따로 표시해줘요. 덕분에 "어?
저 점은 뭐지?" 하고 이상치를 바로 발견할 수 있어요.
간단히 말해서, 박스플롯은 "데이터의 분포를 상자와 수염으로 요약해서 보여주는 그래프"입니다. 상자 안에는 데이터의 절반이 들어있고, 상자 밖으로 삐져나온 점들이 이상치예요.
박스플롯이 특별한 이유가 뭘까요? 히스토그램이나 KDE는 전체 모양을 보여주지만, 이상치가 어디 있는지 콕 집어서 보여주지는 않아요.
하지만 박스플롯은 이상치를 자동으로 계산해서 점으로 표시해줘요. 데이터 품질 검사에 완벽한 도구예요!
박스플롯의 구성 요소를 알려드릴게요. 상자의 아래쪽 선은 25% 지점(1사분위수), 상자 안의 선은 50% 지점(중앙값), 상자의 위쪽 선은 75% 지점(3사분위수)이에요.
수염은 정상 범위를 나타내고, 수염 밖의 점들이 이상치예요. 실무에서 박스플롯은 데이터 전처리의 필수 도구예요.
머신러닝 모델을 학습시키기 전에 이상치를 찾아서 처리해야 모델이 제대로 학습하거든요.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
# 이상치가 포함된 데이터 생성
np.random.seed(42)
normal_data = np.random.normal(loc=50, scale=10, size=95)
outliers = np.array([5, 10, 95, 100, 105]) # 의도적인 이상치
data = np.concatenate([normal_data, outliers])
# 박스플롯 그리기
plt.figure(figsize=(10, 6))
box = plt.boxplot(data, patch_artist=True,
boxprops=dict(facecolor='lightblue', color='navy'),
medianprops=dict(color='red', linewidth=2),
flierprops=dict(marker='o', markerfacecolor='red', markersize=10))
plt.ylabel('값', fontsize=12)
plt.title('박스플롯으로 이상치 확인하기', fontsize=14)
plt.grid(axis='y', alpha=0.3)
# 이상치 개수 표시
plt.text(1.15, 100, f'이상치 발견!', fontsize=11, color='red')
plt.show()
👨🏫 자, 박스플롯은 정말 유용한 그래프예요. 이상치를 찾는 데 최고거든요!
👦 선생님, 박스플롯이 왜 상자처럼 생겼어요? 👨🏫 좋은 질문이에요!
박스플롯의 상자는 데이터의 "가운데 절반"을 담고 있어요. 데이터를 작은 것부터 큰 것까지 줄 세웠을 때, 25%~75% 사이에 있는 데이터가 상자 안에 들어가요.
마치 100명의 학생 중 25등부터 75등까지를 상자 안에 넣는 것처럼요! 👦 상자 안의 빨간 선은 뭐예요?
👨🏫 그건 중앙값(median)이에요! 데이터를 줄 세웠을 때 딱 가운데에 있는 값이죠.
50등 학생의 점수라고 생각하면 돼요. 평균과는 다른 거예요.
평균은 모든 값을 더해서 나누지만, 중앙값은 순서상 가운데 값이에요. 👦 상자 밖으로 나온 선은 뭐예요?
수염이라고요? 👨🏫 맞아요, 수염(whisker)이라고 불러요!
수염은 "정상적인 범위"를 나타내요. 보통 상자 높이(IQR: 사분위 범위)의 1.5배까지를 정상 범위로 봐요.
그 밖에 있는 값들은 "너무 크거나 작은 이상한 값"으로 판단하고 점으로 따로 표시해요. 👦 빨간 점들이 이상치예요?
👨🏫 정확해요! flierprops에서 설정한 빨간 점들이 이상치예요.
우리가 일부러 5, 10, 95, 100, 105라는 극단적인 값을 넣었거든요. 대부분의 데이터는 40~60 사이인데, 이 값들은 너무 멀리 떨어져 있어서 이상치로 표시된 거예요.
👦 이상치를 발견하면 어떻게 해요? 👨🏫 좋은 질문이에요!
이상치를 발견하면 세 가지 선택지가 있어요. 첫째, 진짜 오류라면 삭제해요(입력 실수 등).
둘째, 의미 있는 데이터라면 따로 분석해요(VIP 고객 등). 셋째, 이상치에 강한 분석 방법을 사용해요(중앙값 사용 등).
무조건 삭제하면 안 돼요! 👦 실무에서는 어떻게 사용해요?
👨🏫 데이터 분석의 첫 단계에서 거의 항상 사용해요! 예를 들어, 센서 데이터를 분석할 때 고장난 센서의 비정상 값을 찾거나, 금융 데이터에서 사기 거래를 탐지하는 데 박스플롯이 첫 번째 도구로 쓰여요.
👦 다음에는 뭘 배우나요? 👨🏫 다음 섹션에서는 여러 그룹의 데이터를 한 번에 비교하는 바이올린 플롯을 배워볼 거예요.
박스플롯과 KDE의 장점을 합친 그래프예요!
실전 팁
💡 박스플롯의 이상치 기준은 IQR의 1.5배가 기본이지만, 상황에 따라 조절할 수 있어요
💡 이상치를 무조건 삭제하지 말고, 왜 그런 값이 나왔는지 먼저 확인하세요
💡 seaborn.boxplot을 쓰면 여러 그룹을 쉽게 비교할 수 있어요
5. 바이올린_플롯
박스플롯은 이상치를 찾기엔 좋은데, 데이터가 어떤 모양으로 분포되어 있는지는 잘 안 보여요. 반대로 KDE는 분포 모양은 잘 보여주는데, 사분위수나 이상치 정보는 안 보여주고요.
"둘 다 한 번에 볼 수 없을까?"라는 생각이 드시죠? 이런 고민을 해결하기 위해 통계학자들이 만든 것이 바이올린 플롯(Violin Plot)이에요.
박스플롯의 중앙에 KDE를 양쪽으로 붙인 모양인데, 마치 바이올린처럼 생겼다고 해서 바이올린 플롯이라고 불러요. 바이올린 플롯을 쓰면 분포의 모양과 중요한 통계값을 동시에 볼 수 있어서, 여러 그룹을 비교할 때 특히 유용해요.
정보의 두 마리 토끼를 한 번에 잡는 거죠!
간단히 말해서, 바이올린 플롯은 "KDE의 분포 곡선과 박스플롯의 통계 정보를 결합한 시각화"입니다. 바깥의 넓이는 데이터 밀도를 나타내고, 안쪽에는 박스플롯 정보가 들어있어요.
왜 바이올린 플롯이 유용할까요? 박스플롯만 보면 두 데이터가 비슷해 보여도, 바이올린 플롯으로 보면 분포 모양이 완전히 다를 수 있어요.
예를 들어, 둘 다 평균이 50이지만, 하나는 정규분포이고 다른 하나는 양봉분포(봉우리가 두 개)일 수 있거든요. 바이올린 플롯의 특징을 정리하면요.
첫째, 폭이 넓은 부분은 그 값에 데이터가 많다는 뜻이에요. 둘째, 중앙의 흰 점이나 선은 중앙값을 나타내요.
셋째, 여러 그룹을 나란히 놓으면 분포 차이가 한눈에 들어와요. 실무에서 바이올린 플롯은 A/B 테스트 결과 분석이나 여러 모델의 성능 비교에 자주 사용돼요.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
# 세 그룹의 다양한 분포 데이터 생성
np.random.seed(42)
group_a = np.random.normal(loc=50, scale=10, size=100) # 정규분포
group_b = np.concatenate([np.random.normal(40, 5, 50),
np.random.normal(60, 5, 50)]) # 양봉분포
group_c = np.random.exponential(scale=20, size=100) + 20 # 오른쪽 꼬리
# 데이터프레임 생성
df = pd.DataFrame({
'점수': np.concatenate([group_a, group_b, group_c]),
'그룹': ['A반']*100 + ['B반']*100 + ['C반']*100
})
# 바이올린 플롯 그리기
plt.figure(figsize=(10, 6))
sns.violinplot(x='그룹', y='점수', data=df, palette='Set2', inner='box')
plt.title('세 반의 점수 분포 비교 (바이올린 플롯)', fontsize=14)
plt.xlabel('반', fontsize=12)
plt.ylabel('점수', fontsize=12)
plt.show()
👨🏫 자, 바이올린 플롯을 배워볼까요? 이름처럼 정말 바이올린처럼 생겼어요!
👦 선생님, 왜 바이올린 모양이에요? 👨🏫 KDE 곡선을 세로로 세우고 양쪽에 대칭으로 붙여서 그래요.
데이터가 많은 곳은 통통하고, 적은 곳은 홀쭉해서 바이올린처럼 보이는 거예요. 재밌죠?
👦 코드에서 inner='box'는 뭐예요? 👨🏫 바이올린 안쪽에 뭘 넣을지 정하는 거예요.
'box'를 넣으면 작은 박스플롯이 들어가요. 그래서 KDE 정보와 박스플롯 정보를 동시에 볼 수 있어요!
'point'를 넣으면 점들이 보이고, None을 넣으면 아무것도 안 보여요. 👦 그룹 B의 바이올린이 좀 이상하게 생겼어요.
가운데가 들어갔어요! 👨🏫 아주 좋은 관찰이에요!
B반 데이터는 일부러 "양봉분포"로 만들었어요. 40점대 그룹과 60점대 그룹이 따로 있어서 봉우리가 두 개예요.
바이올린 플롯에서는 이게 잘록한 허리처럼 보이죠. 박스플롯으로는 이런 특징을 절대 발견할 수 없어요!
👦 C반은 왜 위로 삐죽삐죽해요? 👨🏫 C반은 "오른쪽 꼬리 분포"예요.
대부분 낮은 점수지만, 가끔 아주 높은 점수가 있는 거죠. 실제 세계에서 소득 분포가 이래요.
대부분 평범한 소득이지만, 소수의 부자가 아주 높은 소득을 올리거든요. 👦 palette='Set2'는 뭐예요?
👨🏫 색상 팔레트를 정하는 거예요! Seaborn에는 미리 만들어진 예쁜 색 조합이 많아요.
'Set2', 'Set1', 'pastel', 'deep' 등 여러 가지가 있어요. 취향에 맞게 골라서 쓰면 돼요!
👦 실무에서는 어떻게 쓰나요? 👨🏫 예를 들어, 세 가지 추천 알고리즘의 성능을 비교할 때 사용해요.
단순히 평균 정확도만 보면 비슷해 보여도, 바이올린 플롯을 그리면 "A 알고리즘은 안정적이고, B는 편차가 크고, C는 가끔 최고 성능을 내는구나"를 한눈에 알 수 있어요. 👦 다음에는 뭘 배우나요?
👨🏫 다음 섹션에서는 지금까지 배운 것들을 한 그래프에 모두 넣어서 종합적인 분포 분석을 해볼 거예요. 실전 대시보드처럼요!
실전 팁
💡 inner='box'로 박스플롯 정보를 함께 표시하면 정보량이 극대화돼요
💡 그룹이 많으면 바이올린이 너무 얇아지니까 5개 이하로 유지하세요
💡 데이터가 적으면 KDE가 부정확할 수 있어서, 최소 30개 이상의 데이터를 권장해요
6. 종합_분포_시각화_대시보드
지금까지 히스토그램, KDE, 박스플롯, 바이올린 플롯을 각각 배웠어요. 그런데 실무에서는 이것들을 하나씩만 보지 않아요.
"이 데이터의 전체적인 모습을 한 화면에서 다 보고 싶다!"라는 요구가 항상 있거든요. 보고서를 작성하거나 프레젠테이션을 할 때, 여러 그래프를 왔다 갔다 보여주면 청중이 헷갈려해요.
한 화면에 다양한 시각에서 본 데이터를 보여주면 훨씬 설득력이 있죠. 바로 이럴 때 서브플롯(subplot)을 활용해서 종합 대시보드를 만들 수 있어요!
Python의 Matplotlib과 Seaborn을 조합하면 여러 그래프를 한 그림에 깔끔하게 배치할 수 있습니다.
간단히 말해서, 종합 대시보드는 "하나의 데이터에 대해 여러 시각화를 한 화면에 모아놓은 것"입니다. 마치 자동차 계기판처럼, 속도계, 연료계, RPM계를 한눈에 보는 것과 같아요.
왜 종합 대시보드가 필요할까요? 각 시각화는 데이터의 다른 측면을 보여줘요.
히스토그램은 구간별 빈도, KDE는 부드러운 분포 형태, 박스플롯은 사분위수와 이상치를 보여주죠. 이것들을 한 번에 보면 데이터에 대한 완전한 그림을 얻을 수 있어요.
실무에서 데이터 탐색적 분석(EDA)의 첫 단계로 이런 종합 대시보드를 만들어요. 데이터를 받자마자 "어떤 데이터인지" 빠르게 파악하는 데 필수적이에요.
plt.subplot()이나 fig.add_subplot()을 사용하면 원하는 배치로 여러 그래프를 조합할 수 있어요. 2x2, 1x4, 3x2 등 자유롭게 배치 가능해요.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy import stats
# 분석할 데이터 생성
np.random.seed(42)
data = np.random.normal(loc=100, scale=15, size=200)
data = np.append(data, [40, 160, 170]) # 이상치 추가
# 2x2 대시보드 생성
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('데이터 분포 종합 분석 대시보드', fontsize=16, fontweight='bold')
# 1. 히스토그램 + KDE
sns.histplot(data, kde=True, ax=axes[0, 0], color='steelblue', edgecolor='white')
axes[0, 0].set_title('히스토그램 + KDE')
axes[0, 0].axvline(np.mean(data), color='red', linestyle='--', label=f'평균: {np.mean(data):.1f}')
axes[0, 0].legend()
# 2. 박스플롯
sns.boxplot(y=data, ax=axes[0, 1], color='lightgreen')
axes[0, 1].set_title('박스플롯 (이상치 확인)')
# 3. 바이올린 플롯
sns.violinplot(y=data, ax=axes[1, 0], color='salmon', inner='box')
axes[1, 0].set_title('바이올린 플롯')
# 4. 통계 요약 텍스트
axes[1, 1].axis('off')
stats_text = f"""
📊 기초 통계량
평균 (Mean): {np.mean(data):.2f}
중앙값 (Median): {np.median(data):.2f}
표준편차 (Std): {np.std(data):.2f}
최소값: {np.min(data):.2f}
최대값: {np.max(data):.2f}
첨도: {stats.kurtosis(data):.2f}
왜도: {stats.skew(data):.2f}
"""
axes[1, 1].text(0.1, 0.5, stats_text, fontsize=14, verticalalignment='center',
fontfamily='monospace', bbox=dict(boxstyle='round', facecolor='wheat'))
axes[1, 1].set_title('통계 요약')
plt.tight_layout()
plt.show()
👨🏫 자, 드디어 모든 것을 합쳐서 대시보드를 만들어볼 거예요! 실무에서 정말 많이 쓰는 기술이에요.
👦 선생님, plt.subplots(2, 2)가 뭐예요? 👨🏫 도화지를 2행 2열, 총 4칸으로 나누는 거예요!
마치 종이를 접어서 4등분하는 것처럼요. fig는 전체 그림, axes는 각 칸을 담은 배열이에요.
axes[0, 0]은 왼쪽 위, axes[0, 1]은 오른쪽 위 이런 식이죠. 👦 각 칸에 다른 그래프를 넣는 거예요?
👨🏫 맞아요! 첫 번째 칸에는 히스토그램과 KDE를 함께 넣었어요.
sns.histplot에 kde=True만 추가하면 히스토그램 위에 KDE 곡선이 자동으로 그려져요. 두 번째 칸에는 박스플롯, 세 번째 칸에는 바이올린 플롯을 넣었고요.
👦 네 번째 칸은 그래프가 아니라 글자가 있어요! 👨🏫 맞아요!
axes[1, 1].axis('off')로 축을 끄고, .text()로 통계 요약을 텍스트로 넣었어요. 그래프만으로는 정확한 숫자를 알기 어려우니까, 핵심 통계량을 함께 보여주는 거예요.
실무에서 보고서 만들 때 이렇게 하면 정말 멋져 보여요! 👦 첨도랑 왜도는 뭐예요?
👨🏫 좋은 질문이에요! 왜도(skewness)는 데이터가 한쪽으로 치우친 정도예요.
0이면 좌우 대칭, 양수면 오른쪽 꼬리가 길어요. 첨도(kurtosis)는 분포가 얼마나 뾰족한지를 나타내요.
정규분포는 첨도가 0이에요. 이 값들을 보면 데이터가 정규분포에서 얼마나 벗어났는지 알 수 있어요.
👦 plt.tight_layout()은 뭐예요? 👨🏫 이건 마법 같은 함수예요!
4개의 그래프가 서로 겹치지 않게 자동으로 간격을 조절해줘요. 이거 안 쓰면 제목이랑 축 라벨이 겹치는 경우가 많거든요.
👦 이걸 실무에서 어떻게 쓰나요? 👨🏫 새 데이터셋을 받으면 가장 먼저 이런 대시보드를 만들어요!
5분 만에 데이터의 전체적인 특성을 파악할 수 있거든요. "데이터에 이상치가 있네", "왼쪽으로 치우쳐 있네", "평균과 중앙값 차이가 크네" 이런 인사이트를 바로 얻을 수 있어요.
👦 다음에는 뭘 배우나요? 👨🏫 다음 섹션에서는 Seaborn의 displot을 배워서 더 쉽고 예쁘게 분포를 시각화하는 방법을 알아볼 거예요!
실전 팁
💡 fig.suptitle()로 전체 제목을, 각 ax.set_title()로 개별 제목을 설정하세요
💡 tight_layout()은 항상 plt.show() 직전에 호출하세요
💡 통계 요약 텍스트를 함께 넣으면 보고서로 바로 활용할 수 있어요
7. Seaborn_displot_활용
지금까지 히스토그램, KDE, 박스플롯을 따로따로 그려봤어요. 그런데 매번 plt.figure(), plt.hist(), plt.xlabel() 이렇게 여러 줄을 써야 해서 좀 귀찮지 않았나요?
Seaborn 라이브러리에는 displot이라는 강력한 함수가 있어요. 이 하나의 함수로 히스토그램, KDE, ECDF(누적분포) 등을 간단하게 그릴 수 있고, 스타일도 자동으로 예쁘게 설정돼요.
displot은 "distribution plot"의 줄임말로, 분포 시각화를 위한 올인원 도구예요. 코드를 훨씬 간결하게 작성할 수 있어서 실무에서 많이 사용해요.
간단히 말해서, displot은 "Seaborn의 분포 시각화 통합 함수"입니다. kind 파라미터 하나만 바꾸면 히스토그램, KDE, ECDF를 모두 그릴 수 있어요.
왜 displot이 좋을까요? 첫째, 코드가 짧아져요.
둘째, 자동으로 예쁜 스타일이 적용돼요. 셋째, 그룹별 비교가 hue 파라미터 하나로 가능해요.
넷째, col이나 row 파라미터로 여러 그래프를 쉽게 나눌 수 있어요. displot의 주요 옵션을 알려드릴게요.
kind='hist'는 히스토그램, kind='kde'는 KDE, kind='ecdf'는 누적분포 그래프예요. hue는 그룹별로 색을 다르게, col은 그룹별로 그래프를 나눠서 보여줘요.
실무에서 빠른 EDA(탐색적 데이터 분석)를 할 때 displot을 사용하면 시간을 크게 절약할 수 있어요.
다음 코드를 살펴봅시다.
import seaborn as sns
import numpy as np
import pandas as pd
# 여러 그룹의 데이터 생성
np.random.seed(42)
df = pd.DataFrame({
'점수': np.concatenate([
np.random.normal(70, 10, 100),
np.random.normal(75, 8, 100),
np.random.normal(80, 12, 100)
]),
'학년': ['1학년']*100 + ['2학년']*100 + ['3학년']*100
})
# displot으로 히스토그램 + KDE 그리기 (그룹별 비교)
g = sns.displot(data=df, x='점수', hue='학년', kind='kde', fill=True,
height=5, aspect=1.5, palette='husl')
g.fig.suptitle('학년별 점수 분포 비교', y=1.02, fontsize=14)
# 또는 그룹별로 나눠서 보기
g2 = sns.displot(data=df, x='점수', col='학년', kind='hist', kde=True,
height=4, aspect=1, color='steelblue')
g2.fig.suptitle('학년별 점수 분포 (개별 히스토그램)', y=1.02)
👨🏫 자, 이번에는 Seaborn의 displot을 배워볼 거예요. 정말 편리한 함수예요!
👦 선생님, displot이 왜 좋아요? 👨🏫 한마디로 "올인원"이에요!
이전에는 히스토그램 그릴 때 plt.hist(), KDE 그릴 때 sns.kdeplot() 이렇게 다른 함수를 썼잖아요? displot은 kind 파라미터만 바꾸면 다 돼요.
kind='hist', kind='kde', kind='ecdf' 이렇게요! 👦 hue='학년'은 뭐예요?
👨🏫 hue는 색깔을 의미해요. hue='학년'이라고 하면 학년별로 다른 색을 자동으로 칠해줘요.
덕분에 한 그래프에서 1학년, 2학년, 3학년의 분포를 동시에 비교할 수 있어요. 정말 편리하죠?
👦 col='학년'이랑은 뭐가 달라요? 👨🏫 좋은 질문이에요!
hue는 한 그래프 안에서 색으로 구분하고, col은 그래프 자체를 나눠서 옆으로 배치해요. 그래서 두 번째 그래프를 보면 학년별로 개별 히스토그램이 3개 나란히 있죠?
데이터가 많이 겹치면 col로 나누는 게 더 보기 좋아요. 👦 height랑 aspect는 뭐예요?
👨🏫 height는 그래프의 세로 길이, aspect는 가로세로 비율이에요. height=5, aspect=1.5면 세로 5인치, 가로는 5×1.5=7.5인치가 돼요.
발표용 슬라이드에는 aspect=1.5 정도가 보기 좋아요! 👦 palette='husl'은 뭐예요?
👨🏫 색상 팔레트를 정하는 거예요! 'husl'은 밝고 선명한 색상이 나와서 여러 그룹을 구분하기 좋아요.
'Set2'는 파스텔톤, 'dark'는 진한 색, 'muted'는 차분한 색이에요. 발표 상황에 맞게 골라 쓰면 돼요.
👦 실무에서는 어떻게 쓰나요? 👨🏫 빠른 데이터 탐색에 최고예요!
예를 들어, 마케팅 캠페인의 A/B/C 세 그룹의 전환율을 비교할 때, displot으로 한 줄에 비교 그래프를 그리고, 바로 "B 그룹이 좀 더 높네요"라고 인사이트를 얻을 수 있어요. 👦 다음에는 뭘 배우나요?
👨🏫 마지막으로 실전에서 바로 쓸 수 있는 분포 분석 템플릿 함수를 만들어볼 거예요. 한 번 만들어 두면 어떤 데이터에도 바로 적용할 수 있어요!
실전 팁
💡 그룹이 많이 겹치면 hue 대신 col로 나눠서 보세요
💡 kde=True 옵션을 히스토그램에 추가하면 KDE 곡선도 함께 그려져요
💡 facet_kws={'sharey': False}로 각 그래프의 y축을 독립적으로 설정할 수 있어요
8. 실전_분포_분석_함수
지금까지 배운 모든 것을 매번 처음부터 코딩하면 시간이 많이 걸리죠. 실무에서는 자주 쓰는 분석 코드를 함수로 만들어두고, 필요할 때 바로 호출해서 사용해요.
"새 데이터가 들어올 때마다 같은 분석을 반복해야 하는데, 코드를 복사 붙여넣기 하기 귀찮아요..."라는 고민, 모든 데이터 분석가가 해봤을 거예요. 바로 이럴 때 재사용 가능한 분석 함수를 만들어두면, 데이터 이름만 바꿔서 호출하면 자동으로 종합 분석이 완료돼요.
이런 함수를 "유틸리티 함수" 또는 "헬퍼 함수"라고 불러요.
간단히 말해서, 실전 분포 분석 함수는 "데이터를 넣으면 자동으로 종합 분석 결과를 보여주는 나만의 도구"입니다. 한 번 잘 만들어두면 평생 써먹을 수 있어요.
왜 함수로 만들어야 할까요? 첫째, 시간을 절약해요.
새 데이터가 올 때마다 함수 호출 한 줄이면 돼요. 둘째, 실수를 줄여요.
매번 코딩하면 오타나 실수가 생기지만, 검증된 함수를 쓰면 안전해요. 셋째, 일관성을 유지해요.
모든 분석 결과의 형식이 같아서 비교하기 좋아요. 좋은 분석 함수의 특징을 알려드릴게요.
첫째, 파라미터로 커스터마이징이 가능해야 해요. 둘째, 적절한 기본값이 설정되어 있어야 해요.
셋째, 결과를 반환해서 추가 분석에 사용할 수 있어야 해요.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from scipy import stats
def analyze_distribution(data, name="데이터", bins=20, figsize=(14, 10)):
"""
단변량 분포 종합 분석 함수
Parameters:
- data: 분석할 1차원 데이터 (array 또는 Series)
- name: 데이터 이름 (그래프 제목에 사용)
- bins: 히스토그램 구간 수
- figsize: 그래프 크기
Returns:
- stats_dict: 기초 통계량 딕셔너리
"""
data = np.array(data)
# 통계량 계산
stats_dict = {
'평균': np.mean(data),
'중앙값': np.median(data),
'표준편차': np.std(data),
'최소값': np.min(data),
'최대값': np.max(data),
'왜도': stats.skew(data),
'첨도': stats.kurtosis(data),
'데이터수': len(data)
}
# 시각화
fig, axes = plt.subplots(2, 2, figsize=figsize)
fig.suptitle(f'{name} 분포 종합 분석', fontsize=16, fontweight='bold')
# 히스토그램 + KDE
sns.histplot(data, kde=True, ax=axes[0, 0], bins=bins, color='steelblue')
axes[0, 0].axvline(stats_dict['평균'], color='red', linestyle='--', label='평균')
axes[0, 0].axvline(stats_dict['중앙값'], color='green', linestyle=':', label='중앙값')
axes[0, 0].legend()
axes[0, 0].set_title('히스토그램 + KDE')
# 박스플롯
sns.boxplot(y=data, ax=axes[0, 1], color='lightgreen')
axes[0, 1].set_title('박스플롯')
# 바이올린 플롯
sns.violinplot(y=data, ax=axes[1, 0], color='salmon', inner='box')
axes[1, 0].set_title('바이올린 플롯')
# 통계 요약
axes[1, 1].axis('off')
text = '\n'.join([f'{k}: {v:.2f}' if isinstance(v, float) else f'{k}: {v}'
for k, v in stats_dict.items()])
axes[1, 1].text(0.1, 0.5, text, fontsize=12, verticalalignment='center',
fontfamily='monospace', bbox=dict(boxstyle='round', facecolor='wheat'))
axes[1, 1].set_title('통계 요약')
plt.tight_layout()
plt.show()
return stats_dict
# 사용 예시
sample_data = np.random.normal(100, 15, 500)
result = analyze_distribution(sample_data, name="테스트 점수")
print(f"\n평균: {result['평균']:.2f}, 표준편차: {result['표준편차']:.2f}")
👨🏫 자, 마지막으로 실전에서 쓸 수 있는 분석 함수를 만들어볼 거예요. 이건 정말 유용해요!
👦 선생님, 왜 함수로 만들어야 해요? 그냥 코드 복사하면 안 돼요?
👨🏫 좋은 질문이에요! 복사 붙여넣기를 하면 세 가지 문제가 생겨요.
첫째, 오타나 실수가 생기기 쉬워요. 둘째, 코드를 수정하고 싶을 때 복사한 곳을 다 찾아서 바꿔야 해요.
셋째, 코드가 점점 길어지고 지저분해져요. 함수를 한 번 잘 만들어두면 이런 문제가 다 해결돼요!
👦 def analyze_distribution이 함수를 만드는 거예요? 👨🏫 맞아요!
def는 "define(정의하다)"의 줄임말이에요. analyze_distribution은 함수 이름이고, 괄호 안의 data, name, bins, figsize는 함수에 전달할 값들이에요.
name="데이터"처럼 기본값을 지정해두면, 사용할 때 생략해도 돼요. 👦 """ 안에 있는 설명은 뭐예요?
👨🏫 그건 "독스트링(docstring)"이라고 해요. 함수가 뭘 하는지, 어떤 값을 받고, 뭘 반환하는지 설명해두는 거예요.
나중에 help(analyze_distribution)을 치면 이 설명이 나와요. 다른 사람이 쓸 때도 이해하기 쉽고요!
👦 return stats_dict는 뭐예요? 👨🏫 함수가 끝나고 "결과물"을 돌려주는 거예요!
이 함수는 그래프를 그리고, 추가로 통계량을 담은 딕셔너리도 반환해요. 그래서 result = analyze_distribution(data)로 받으면, result['평균']처럼 나중에 통계값을 또 사용할 수 있어요.
👦 사용하는 건 되게 간단하네요! 👨🏫 그게 핵심이에요!
analyze_distribution(sample_data, name="테스트 점수") 딱 한 줄이면 4개 그래프와 모든 통계량이 나와요. 새 데이터가 올 때마다 데이터 이름만 바꿔서 호출하면 돼요.
👦 실무에서는 어떻게 쓰나요? 👨🏫 보통 utils.py나 analysis_tools.py 같은 파일에 자주 쓰는 함수들을 모아둬요.
그리고 새 프로젝트에서 from analysis_tools import analyze_distribution 이렇게 불러와서 써요. 팀원들과 공유하면 모두가 같은 형식으로 분석할 수 있어서 협업에도 좋아요!
👦 와, 오늘 정말 많이 배웠어요! 👨🏫 맞아요!
오늘 단변량 분석의 기초부터 실전 함수까지 모두 배웠어요. 이제 어떤 데이터가 와도 분포를 분석할 수 있을 거예요.
열심히 연습해보세요!
실전 팁
💡 함수에 적절한 기본값을 설정해두면 사용이 훨씬 편해요
💡 독스트링을 꼭 작성해서 나중에 봐도 이해할 수 있게 하세요
💡 반환값을 딕셔너리로 만들면 필요한 값만 골라 쓸 수 있어요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
범주형 변수 시각화 완벽 가이드 Bar Chart와 Count Plot
데이터 분석에서 가장 기본이 되는 범주형 변수 시각화 방법을 알아봅니다. Matplotlib의 Bar Chart부터 Seaborn의 Count Plot까지, 실무에서 바로 활용할 수 있는 시각화 기법을 배워봅니다.
이변량 분석 완벽 가이드: 변수 간 관계 탐색
두 변수 사이의 관계를 분석하는 이변량 분석의 핵심 개념과 기법을 배웁니다. 상관관계, 산점도, 교차분석 등 데이터 분석의 필수 도구들을 실습과 함께 익혀봅시다.
데이터 타입 변환 및 정규화 완벽 가이드
데이터 분석과 머신러닝에서 가장 기초가 되는 데이터 타입 변환과 정규화 기법을 배워봅니다. 실무에서 자주 마주치는 데이터 전처리 문제를 Python으로 쉽게 해결하는 방법을 알려드립니다.
이상치 탐지 및 처리 완벽 가이드
데이터 속에 숨어있는 이상한 값들을 찾아내고 처리하는 방법을 배워봅니다. 실무에서 자주 마주치는 이상치 문제를 Python으로 해결하는 다양한 기법을 소개합니다.
결측치 처리 전략 완벽 가이드
데이터 분석에서 가장 먼저 만나는 문제, 결측치! 삭제부터 고급 대체 기법까지, 실무에서 바로 쓸 수 있는 결측치 처리 전략을 초급자도 이해하기 쉽게 알려드립니다. 데이터의 품질을 높이고 정확한 분석 결과를 얻어보세요.