통계 - 범위, 분산, 표준편차, 사분위수
04 Aug 2025 | Statistics개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
범위(Range)
데이터 중 가장 큰 값과 가장 작은 값의 차이
- 데이터가 얼마나 퍼져있는지(흩어져 있는 지)를 확인하는 가장 단순한 방법
범위 = 최댓값 - 최솟값
delivery_days = [2, 1, 3, 2, 4, 1, 5]
max_val = max(delivery_days)
min_val = min(delivery_days)
range_val = max_val - min_val
print("최댓값:", max_val) # 5
print("최솟값:", min_val) # 1
print("범위:", range_val) # 4
범위는 계산이 매우 간단하며 전체 데이터의 퍼짐 정도를 빠르게 알수 있다는 장점이 있지만, 극단적인 값(이상치)에 매우 민감하다. 대부분의 값이 비슷해도 한두개의 극단 값 때문에 범위가 크게 부풀려질 수 있고 이러한 데이터들 중간에 어떤 값들이 어떻게 분포되어 있는지는 알수 없다는 단점이 있다.
delivery_days_outlier = [2, 1, 3, 2, 4, 1, 30] # 마지막 값이 이상치
range_outlier = max(delivery_days_outlier) - min(delivery_days_outlier)
print("이상치 포함 범위:", range_outlier) # 30 - 1 > 29
분산(Variance)
데이터들이 평균으로부터 얼마나 떨어져있는 지를 나타내는 값
- 데이터 전체가 평균 근처에 몰려있는지, 아니면 흩어져 있는지를 수치로 표현
- 산포도를 측정하는 가장 기본적이고 중요한 지표
계산 방법
- 각 데이터에서 평균을 뺀다.
- → 얼마나 떨어져 있는지 확인
- 그 차이를 제곱한다.
- → 음수 제거 및 큰 차이에 더 민감하게
- 제곱한 값들의 평균을 구한다.
- $\bar{x}$: 평균
- $x_i$: i번째 데이터 값
- $n$: 데이터의 개수
data = [30, 40, 20, 50, 60]
# 평균 계산
mean_val = sum(data) / len(data)
# 분산 계산
squared_diffs = [(x - mean_val)**2 for x in data]
variance = sum(squared_diffs) / len(data)
print("평균:", mean_val) # 40.0
print("분산:", variance) # 200.0
분산은 데이터의 전체적인 퍼짐 정도를 수치로 나타낼 수 잇으며, 평균을 중심으로 얼마나 퍼져있는지(변동이 있는지)를 나타낼 수 있다. 그러나 단위가 원래 데이터보다 커지고(제곱), 해석이 직관적이지 않다는 단점이 존재한다. 이 문제점때문에 ‘표준편차’라는 개념이 등장하게 된다.
표준편차(Standard Deviation)
분산의 제곱근
- 데이터를 평균 기준으로 얼마나 흩어져 있는지를 원래 단위로 해석할 수 있게 해주는 값
- 분산은 단위를 제곱해서 해석이 어렵지만
- 표준편차는 다시 제곱근을 씌우므로 실제 데이터 단위와 동일한 해석이 가능
- $\sigma$: 표준편차
- $x_i$: i번째 데이터
- $\bar{x}$: 평균
- $n$: 데이터 개수
import math
data = [30, 40, 20, 50, 60]
# 평균
mean_val = sum(data) / len(data)
# 분산
squared_diffs = [(x - mean_val)**2 for x in data]
variance = sum(squared_diffs) / len(data)
# 표준편차
std_dev = math.sqrt(variance)
print("분산:", variance) # 200.0
print("표준편차:", std_dev) # 14.142135623730951
# 40에서 약 ±14 떨어져 있다는 의미
# 데이터의 흩어짐 정도(산포)를 실제 단위로 보여주는 값
표준편차의 의미
- 표준편차가 작다 > 대부분의 데이터가 평균근처에 모여있다
- 표준편차가 크다 > 대부분의 데이터가 평균으로부터 많이 흩어져 있다
이러한 표준편차는 단위가 원래 데이터와 같아서 해석이 직관적이며, 실제 통계분석에서도 널리 사용된다는 장점이 있다. 하지만 이러한 표준편차도 평균과 마찬가지로 극단값에 예민하며, 모든 데이터와 평균간의 거리 계산이 필요해 계산 비용이 존재한다는 단점도 존재한다.
사분위수와 IQR(Interquartile Range)
사분위수
데이터를 작은값부터 큰 값까지 정렬한 후, 이를 4등분한 위치에 있는 값을 의미
기호 | 이름 | 설명 |
---|---|---|
Q1 | 제1사분위수 | 하위 25% 지점 (데이터의 25%가 이 값보다 작음) |
Q2 | 제2사분위수 | 중앙값 (50% 지점) |
Q3 | 제3사분위수 | 상위 25% 경계 (데이터의 75%가 이 값보다 작음) |
IQR
사분위범위 데이터의 중간 50%가 어느범위에 분포해 있는지를 나타냄
\[\text{IQR} = Q3 - Q1\]극단값(이상치)의 영향을 받지않고 데이터의 중간분포 폭을 파악할 수 있다.
data = [2, 4, 5, 6, 9, 10, 10, 12, 14]
data.sort()
n = len(data)
# Q2: 중앙값
if n % 2 == 1:
q2 = data[n // 2]
else:
q2 = (data[n//2 - 1] + data[n//2]) / 2
# Q1
lower_half = data[:n//2]
q1 = (lower_half[len(lower_half)//2 - 1] + lower_half[len(lower_half)//2]) / 2
# Q3
upper_half = data[(n+1)//2:]
q3 = (upper_half[len(upper_half)//2 - 1] + upper_half[len(upper_half)//2]) / 2
iqr = q3 - q1
print("Q1:", q1) # 4.5
print("Q2 (중앙값):", q2) # 9
print("Q3:", q3) # 11.0
print("IQR:", iqr) # 6.5
IQR은 이상치에 강하고 데이터의 중심 구간의 폭을 잘 설명해줄 수 있다. 그러나 평균이나 표준편차처럼 전체 데이터를 모두 반영하지는 않고, 정규분포에서 설명력이 다소 떨어질 수 있다는 단점이 존재한다.
구분 | 정의 | 계산 방식 | 장점 | 단점 | 이상치 영향 |
---|---|---|---|---|---|
범위 | 최댓값과 최솟값의 차이 | $\text{최댓값} - \text{최솟값}$ | 계산이 간단함 | 중간값이나 분포 형태는 반영하지 못함 | 매우 큼 |
분산 | 각 값이 평균에서 얼마나 떨어졌는지의 평균 | $\frac{1}{n} \sum (x_i - \bar{x})^2$ | 전체 데이터의 흩어짐을 정량적으로 파악 가능 | 단위가 제곱이라 직관성이 낮음 | 큼 |
표준편차 | 분산의 제곱근 | $\sqrt{ \frac{1}{n} \sum (x_i - \bar{x})^2 }$ | 분산보다 해석이 쉬움 (단위 동일) | 이상치에 취약함 | 큼 |
IQR | 중앙 50% 데이터 범위 | $Q3 - Q1$ | 이상치의 영향을 거의 받지 않음, 데이터 중심 설명 가능 | 전체 데이터를 다 반영하지 않음 | 작음 |
요약 정리
- 빠르게 퍼짐 정도를 보고 싶을 땐 범위
- 전체 흩어짐을 정확히 측정하고 싶을 땐 분산이나 표준편차
- 이상치가 있을 가능성이 높다면 IQR을 사용하는 것이 좋다