Why Not SW CAMP 5기/수업 기록

[2월 1주차-2/6(3)]📊 히스토그램 & 박스플롯 시각화 정리

rubii 2025. 2. 6. 12:53

데이터를 분석할 때 자료의 분포를 파악하는 것은 매우 중요합니다.
이번 포스팅에서는 히스토그램(hist)과 박스플롯(boxplot)을 사용하여 데이터를 효과적으로 시각화하는 방법을 정리해보겠습니다.


1️⃣ 히스토그램 (Histogram)

📌 히스토그램이란?

히스토그램은 데이터의 빈도를 막대 그래프 형태로 나타낸 그래프입니다.
특정 구간에 해당하는 데이터의 개수를 막대의 높이로 표현하므로, 데이터의 분포 상태를 한눈에 파악할 수 있습니다.

📍 기본 히스토그램 예제

아래 코드는 간단한 데이터를 사용하여 Matplotlib의 hist() 함수를 이용한 히스토그램을 그리는 예제입니다.

import matplotlib.pyplot as plt

# 데이터 리스트
hist_data = [1, 1, 2, 3, 4, 5, 6, 6, 7, 8, 10]

# 히스토그램 그리기
plt.hist(hist_data)
plt.show()

설명

  • plt.hist(hist_data) → 리스트 데이터를 히스토그램 형태로 출력
  • plt.show() → 그래프 표시

📍 기온 데이터(서울) 활용한 히스토그램

CSV 파일에서 1월과 8월의 최고 기온 데이터를 추출하여 히스토그램으로 표현해보겠습니다.

import matplotlib.pyplot as plt
import csv

# CSV 파일 열기
f = open('./data/seoul.csv')
data = csv.reader(f)
next(data)  # 헤더 제거

aug = []  # 8월 최고 기온 리스트
jan = []  # 1월 최고 기온 리스트

for row in data:
    month = row[0].split('-')[1]  # 날짜에서 월 정보 추출
    if row[-1] != '':  # 결측치 제거
        if month == '08':  
            aug.append(float(row[-1]))  # 8월 데이터 추가
        elif month == '01':
            jan.append(float(row[-1]))  # 1월 데이터 추가

# 히스토그램 시각화
plt.hist(aug, bins=100, color='r', label='8월')  # 빨간색 (8월)
plt.hist(jan, bins=100, color='b', label='1월')  # 파란색 (1월)
plt.legend()  # 범례 추가
plt.show()

설명

  • split('-') → 날짜 데이터를 ['YYYY', 'MM', 'DD'] 형태로 분리하여 월 정보 추출
  • bins=100 → 구간을 100개로 나누어 더 세밀하게 표현
  • color='r' / color='b' → 빨간색(8월), 파란색(1월)
  • plt.legend() → 범례 추가

🔎 해석

  • 8월(빨간색): 대부분 20~40도 범위
  • 1월(파란색): 대부분 -10~10도 범위
  • 특정 온도에서 피크(빈도 높음) → 해당 온도에서 많이 발생

2️⃣ 박스플롯 (Boxplot)

📌 박스플롯이란?

박스플롯(Boxplot)은 데이터의 분포를 한눈에 보여주는 그래프입니다.
최댓값, 최솟값, 중앙값(2/4 분위), 1/4 분위, 3/4 분위를 보여주며, 이상치(outlier)도 함께 시각화할 수 있습니다.


📍 기본 박스플롯 예제

아래 코드는 랜덤 데이터를 생성하여 박스플롯을 그리는 예제입니다.

import matplotlib.pyplot as plt
import random

# 랜덤 데이터 생성
result = []
for i in range(13):
    result.append(random.randint(1, 1000))  # 1~1000 사이 난수 생성

# 박스플롯 시각화
plt.boxplot(result)
plt.show()

설명

  • random.randint(1, 1000) → 1~1000 사이 랜덤 정수 생성
  • plt.boxplot(result) → 박스플롯 출력

📍 기온 데이터 활용한 박스플롯

이번에는 1월과 8월의 최고 기온 데이터를 박스플롯으로 비교해보겠습니다.

import matplotlib.pyplot as plt
import csv

# CSV 파일 열기
f = open('./data/seoul.csv')
data = csv.reader(f)
next(data)

aug = []  # 8월 데이터
jan = []  # 1월 데이터

for row in data:
    month = row[0].split('-')[1]  # 월 정보 추출
    if row[-1] != '':  # 결측치 제거
        if month == '08':  
            aug.append(float(row[-1]))  # 8월 최고 기온
        elif month == '01':  
            jan.append(float(row[-1]))  # 1월 최고 기온

# 박스플롯 시각화
plt.boxplot([aug, jan])
plt.show()

설명

  • 1월(추운 겨울)과 8월(더운 여름)의 기온 데이터를 한눈에 비교 가능
  • 박스 안에 **데이터의 중심값(중앙값)**과 분포의 범위 표시
  • 이상치(outlier)도 점으로 나타남

📍 월별 최고 기온 박스플롯

이번에는 월별 최고 기온 분포를 박스플롯으로 표현해보겠습니다.

import matplotlib.pyplot as plt
import csv

# CSV 파일 열기
f = open('./data/seoul.csv')
data = csv.reader(f)
next(data)

# 월별 데이터 저장 리스트 (12개월)
months = [[] for _ in range(12)]

for row in data:
    if row[-1] != '':  # 결측치 제거
        month = int(row[0].split('-')[1]) - 1  # 월 정보 추출 (0~11)
        months[month].append(float(row[-1]))  # 해당 월에 데이터 추가

# 박스플롯 시각화
plt.boxplot(months)
plt.show()

설명

  • 12개의 리스트(months = [[] for _ in range(12)])를 생성해 월별 데이터를 저장
  • months[int(row[0].split('-')[1])-1] → 해당 월(0~11)에 데이터 추가
  • plt.boxplot(months) → 월별 최고 기온을 한눈에 비교 가능

🔎 해석

  • 여름(6~8월)은 기온이 높고 분포가 넓음
  • 겨울(12~2월)은 기온이 낮고 분포가 좁음
  • 이상치(outlier) → 여름철 갑작스러운 폭염, 겨울철 한파 가능성

🎯 결론

시각화 기법 활용 목적

히스토그램 특정 값의 빈도를 나타내어 데이터의 분포를 확인
박스플롯 데이터의 최댓값, 최솟값, 중앙값, 이상치를 확인하여 분포 비교

📌 히스토그램은 데이터의 **빈도(분포 모양)**를 시각화하는 데 유용하며,
📌 박스플롯은 데이터의 **중앙값과 이상치(outlier)**를 파악하는 데 적합합니다.

👉 앞으로 데이터 분석할 때 적절한 시각화 기법을 활용해 보세요! 🚀
궁금한 점이 있다면 댓글로 남겨 주세요. 😊