ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Probability Distributions in Python: 파이썬으로 확률 분포 분석하기
    Machine Learning/Statistics 2025. 4. 4. 19:00

    데이터 분석을 할 때, 확률 분포를 이해하는 것은 매우 중요하다. 이번 글에서는 정규 분포를 이용하여 데이터를 모델링하는 방법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를 활용한 이상치 탐지 결과, 특별한 이상치는 발견되지 않았다.

    댓글

Designed by Tistory.