-
데이터 분석을 할 때, 확률 분포를 이해하는 것은 매우 중요하다. 이번 글에서는 정규 분포를 이용하여 데이터를 모델링하는 방법과 Z-Score를 활용한 이상값 탐지를 다룬다.
특히, 특정 데이터가 정규 분포를 따르는지 확인하고, 경험적 법칙(Empirical Rule)을 통해 데이터를 해석하는 방법을 설명할 것이다. 마지막으로, Z-Score를 활용하여 이상값을 찾는 방법을 알아본다.
라이브러리 불러오기
먼저 필요한 라이브러리를 불러온다.
- pandas: 데이터프레임 처리
- numpy: 수학 연산
- matplotlib.pyplot: 시각화
- scipy.stats: 통계 분석
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import stats
데이터 불러오기 및 정리
이번 분석에서는 국가별 평균 소득(average income by country) 데이터를 사용한다.
결측값을 제거(dropna)하여 정리한다.# CSV 파일 불러오기 df = pd.read_csv('average_income.csv') # 결측값 제거 df = df.dropna() # 데이터 샘플 출력 print(df.head())
REGION AVERAGE_INCOME 0 Region A 52000 1 Region B 48000 2 Region C 55000 3 Region D 60000 4 Region E 47000
데이터 분포 시각화: 히스토그램
데이터의 분포를 확인하기 위해 히스토그램(histogram)을 그려보자.
# 소득 분포 히스토그램 그리기 plt.hist(df['AVERAGE_INCOME'], bins=10, edgecolor='black', alpha=0.7) plt.xlabel('Average Income') plt.ylabel('Frequency') plt.title('Histogram of Average Income') plt.show()
해석:
히스토그램을 보면 데이터가 종 모양(Bell Shape)을 이루며 대칭적인 모습을 보인다. 이는 정규 분포(Normal Distribution)와 유사한 형태이다.평균 및 표준편차 계산
# 평균 및 표준편차 계산 mean_income = df['AVERAGE_INCOME'].mean() std_income = df['AVERAGE_INCOME'].std() print("평균 소득:", mean_income) print("표준편차:", std_income)
평균 소득: 53200.0 표준편차: 5000.0
경험적 법칙(Empirical Rule, 68-95-99.7 규칙) 적용
정규 분포를 따른다면, 경험적 법칙에 의해 다음과 같은 패턴을 보인다.
- 68%의 값이 평균 ± 1 표준편차(SD) 내에 존재
- 95%의 값이 평균 ± 2 표준편차 내에 존재
- 99.7%의 값이 평균 ± 3 표준편차 내에 존재
# 1 표준편차 범위 내 비율 계산 lower_limit_1 = mean_income - std_income upper_limit_1 = mean_income + std_income within_1_std = ((df['AVERAGE_INCOME'] >= lower_limit_1) & (df['AVERAGE_INCOME'] <= upper_limit_1)).mean() # 2 표준편차 범위 내 비율 계산 lower_limit_2 = mean_income - 2 * std_income upper_limit_2 = mean_income + 2 * std_income within_2_std = ((df['AVERAGE_INCOME'] >= lower_limit_2) & (df['AVERAGE_INCOME'] <= upper_limit_2)).mean() # 3 표준편차 범위 내 비율 계산 lower_limit_3 = mean_income - 3 * std_income upper_limit_3 = mean_income + 3 * std_income within_3_std = ((df['AVERAGE_INCOME'] >= lower_limit_3) & (df['AVERAGE_INCOME'] <= upper_limit_3)).mean() print("1 표준편차 범위 내 데이터 비율:", within_1_std) print("2 표준편차 범위 내 데이터 비율:", within_2_std) print("3 표준편차 범위 내 데이터 비율:", within_3_std)
1 표준편차 범위 내 데이터 비율: 0.68 2 표준편차 범위 내 데이터 비율: 0.95 3 표준편차 범위 내 데이터 비율: 0.997
결과 해석:
- 1 SD 내: 약 68%
- 2 SD 내: 약 95%
- 3 SD 내: 약 99.7%
이 값들은 경험적 법칙(68-95-99.7 Rule)과 잘 맞아떨어진다.
Z-Score 계산 및 이상값 탐지
Z-Score란?
Z-Score는 데이터가 평균에서 몇 개의 표준편차(SD)만큼 떨어져 있는지를 나타내는 값이다.
- Z-score > 3 또는 Z-score < -3 인 경우 이상값(outlier)으로 간주한다.
Z-Score를 계산해보자.
# Z-score 계산 df['Z_SCORE'] = stats.zscore(df['AVERAGE_INCOME']) # Z-score 값 출력 (상위 5개) print(df[['AVERAGE_INCOME', 'Z_SCORE']].head())
AVERAGE_INCOME Z_SCORE 0 52000 -0.24 1 48000 -1.04 2 55000 0.36 3 60000 1.36 4 47000 -1.24
이제 이상값(Z-score 기준 ±3 초과 데이터)을 찾아보자.
# 이상치 탐지 outliers = df[(df['Z_SCORE'] > 3) | (df['Z_SCORE'] < -3)] print("이상치 데이터:") print(outliers)
이상치 데이터: Empty DataFrame Columns: [AVERAGE_INCOME, Z_SCORE] Index: []
이 결과는 데이터에서 이상치가 발견되지 않았음을 의미합니다. 즉, Z-Score가 ±3을 초과하는 값이 없었다는 뜻이다.
결론
- 평균 소득은 53,200 달러, 표준편차는 5,000 달러이다.
- 데이터는 정규 분포를 따르며, 경험적 법칙(68-95-99.7%)과 일치한다.
- Z-score를 활용한 이상치 탐지 결과, 특별한 이상치는 발견되지 않았다.
'Machine Learning > Statistics' 카테고리의 다른 글
The relationship between sample and population: 표본과 모집단의 관계 (0) 2025.04.06 Introduction to sampling: 샘플링 (0) 2025.04.05 Z-Score: 표준 점수 (0) 2025.04.03 Model data with the normal distribution: 정규 분포를 활용한 데이터 모델링 (1) 2025.04.02 Normal Distribution: 정규 분포 (0) 2025.04.01