Python SciPy로 배우는 기술 통계 (평균, 중앙값, 표준편차 등)
1. 기술 통계란?
기술 통계(Descriptive Statistics)는 데이터의 특성을 요약하고 설명하는 통계 방법입니다. 일반적으로 평균, 중앙값, 표준편차, 분산과 같은 수치를 통해 데이터의 중심 경향과 변동성을 파악합니다. 이는 데이터 분석의 첫 단계로, 데이터의 기본적인 분포와 특성을 이해하는 데 필수적입니다.
Python에서는 SciPy의 stats 모듈을 이용해 이러한 기술 통계를 손쉽게 계산할 수 있습니다. 이 글에서는 SciPy를 활용해 다양한 기술 통계 지표를 계산하고, 이를 실제 예제와 함께 설명하겠습니다.
2. 데이터 준비 및 기본 설정
먼저, Python과 SciPy 환경이 준비되어 있어야 합니다. 다음과 같이 SciPy와 함께 필요한 패키지를 설치하고, 기본적인 데이터를 준비하겠습니다.
# SciPy와 NumPy, Matplotlib 불러오기
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
# 예제 데이터 생성
data = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
3. 중심 경향성 측정
3.1 평균 (Mean)
평균은 데이터의 중심을 나타내는 대표적인 지표입니다. SciPy에서는 stats.tmean() 함수를 사용해 평균을 구할 수 있습니다.
# 평균 계산
mean = stats.tmean(data)
print(f"평균: {mean}")
출력 결과는 다음과 같습니다.
평균: 55.03.2 중앙값 (Median)
중앙값은 데이터를 크기순으로 정렬했을 때, 중앙에 위치하는 값을 의미합니다. np.median() 또는 stats.median()을 통해 계산할 수 있습니다.
# 중앙값 계산
median = np.median(data)
print(f"중앙값: {median}")
출력 결과는 다음과 같습니다.
중앙값: 55.03.3 최빈값 (Mode)
최빈값은 가장 자주 등장하는 값을 의미합니다. SciPy에서는 stats.mode() 함수를 사용해 최빈값과 그 빈도를 확인할 수 있습니다.
# 최빈값 계산
mode_result = stats.mode(data, keepdims=True)
print(f"최빈값: {mode_result.mode[0]}, 빈도: {mode_result.count[0]}")
출력 결과는 다음과 같습니다.
최빈값: 10, 빈도: 14. 변동성 측정
4.1 표준편차 (Standard Deviation)
표준편차는 데이터가 평균에서 얼마나 떨어져 있는지를 나타내는 지표입니다. stats.tstd() 또는 np.std()로 계산할 수 있습니다.
# 표준편차 계산
std_dev = stats.tstd(data)
print(f"표준편차: {std_dev}")
출력 결과는 다음과 같습니다.
표준편차: 30.2765035409749154.2 분산 (Variance)
분산은 표준편차의 제곱으로, 데이터의 분포 정도를 나타냅니다. stats.tvar() 또는 np.var()로 계산할 수 있습니다.
# 분산 계산
variance = stats.tvar(data)
print(f"분산: {variance}")
출력 결과는 다음과 같습니다.
분산: 916.66666666666665. 데이터 분포 특성
5.1 왜도 (Skewness)
왜도는 데이터 분포의 비대칭성을 측정하는 지표입니다. 양수이면 오른쪽으로 치우친 분포, 음수이면 왼쪽으로 치우친 분포를 의미합니다.
# 왜도 계산
skewness = stats.skew(data)
print(f"왜도: {skewness}")
출력 결과는 다음과 같습니다.
왜도: 0.05.2 첨도 (Kurtosis)
첨도는 분포의 뾰족함을 측정하는 지표입니다. 값이 크면 중심에 데이터가 몰려 있고, 작으면 평평한 분포를 나타냅니다.
# 첨도 계산
kurtosis = stats.kurtosis(data)
print(f"첨도: {kurtosis}")
출력 결과는 다음과 같습니다.
첨도: -1.26. 사분위수 및 범위
6.1 사분위수 (Quartiles)
사분위수는 데이터를 4등분한 지점을 의미하며, 주로 25%, 50%, 75% 위치의 값을 확인합니다.
# 사분위수 계산
quartiles = np.percentile(data, [25, 50, 75])
print(f"사분위수: 25%={quartiles[0]}, 50%={quartiles[1]}, 75%={quartiles[2]}")
출력 결과는 다음과 같습니다.
사분위수: 25%=32.5, 50%=55.0, 75%=77.56.2 범위 (Range)
범위는 최대값과 최소값의 차이를 의미합니다.
# 범위 계산
range_value = np.ptp(data)
print(f"범위: {range_value}")
출력 결과는 다음과 같습니다.
범위: 907. 기술 통계 요약
stats.describe()를 사용하면 데이터의 기본 통계를 한 번에 요약할 수 있습니다.
# 데이터 요약
summary = stats.describe(data)
print(f"요약 통계: {summary}")
출력 결과는 다음과 같습니다.
요약 통계: DescribeResult(nobs=10, minmax=(10, 100), mean=55.0, variance=916.6666666666666, skewness=0.0, kurtosis=-1.2)8. 시각화를 통한 데이터 이해
데이터의 분포를 시각화하면 통계 지표를 더 쉽게 이해할 수 있습니다.
# 히스토그램과 평균, 중앙값 시각화
plt.figure(figsize=(10, 6))
plt.hist(data, bins=10, color='skyblue', edgecolor='black', alpha=0.7)
plt.axvline(mean, color='red', linestyle='dashed', linewidth=2, label=f'평균: {mean}')
plt.axvline(median, color='green', linestyle='dashed', linewidth=2, label=f'중앙값: {median}')
plt.xlabel('값')
plt.ylabel('빈도')
plt.legend()
plt.title('데이터 분포와 평균, 중앙값')
plt.show()
9. 결론
이 글에서는 Python의 SciPy 라이브러리를 활용해 기술 통계 지표를 계산하는 방법을 살펴보았습니다. 평균, 중앙값, 표준편차와 같은 지표는 데이터를 이해하고 분석하는 데 기본이 되는 중요한 요소입니다. 데이터 분석을 진행할 때 이러한 통계값을 활용하면 보다 정확하고 의미 있는 결론을 도출할 수 있습니다.
'Python for AI, Embedded > Data Science: NumPy, Pandas, SciPy' 카테고리의 다른 글
| SciPy 가설 검정 (t-test, chi-square) (0) | 2025.12.02 |
|---|---|
| SciPy 확률 분포와 난수 생성 (SciPy.stats) (0) | 2025.12.01 |
| SciPy 신호 간 상관 분석 (0) | 2025.11.29 |
| SciPy 주파수 분석과 스펙트로그램 (0) | 2025.11.28 |
| SciPy 푸리에 변환 (FFT) (0) | 2025.11.27 |