통계

스파르타 통계학 기초 강의 정리 2 <데이터의 분포>

골드인생 2024. 8. 5. 16:40

■ 모집단(관심의 대상이 되는 전체 집단) - 전수조사

■  표본(모집단에서 추출한 일부)              - 표본조사

import numpy as np
import matplotlib.pyplot as plt

# 모집단 생성 (예: 국가의 모든 성인의 키 데이터)
population = np.random.normal(170, 10, 1000)

# 표본 추출
sample = np.random.choice(population, 100)

plt.hist(population, bins=50, alpha=0.5, label='population', color='blue')
plt.hist(sample, bins=50, alpha=0.5, label='sample', color='red')
plt.legend()
plt.title('population and sample distribution')
plt.show()

numpy.random.normal(loc=0.0, scale=1.0, size=None)

np.random.normal             정규분포(가우시안 분포)를 따르는 난수를 생성

loc(float)                            정규분포의 평균(기본값 : 0.0)

scale(float)                        정규분포의 표준편차(기본값 : 1.0)

size(int 또는 tuple of ints)  출력 배열의 크기(기본값 : None, 즉 스칼라 값 반)

numpy.random.choice(a, size=None, replace=True, p=None)

np.random.choice              주어진 배열에서 임의로 샘플링하여 요소를 선택

a(1-D array-like or int)       샘플링할 원본 배열. 정수인 경우 np.arange(a)와 동일하게 간주됨

size(int 또는 tuple of ints)  출력 배열의 크기(기본값 : None, 즉 단일 값 반환)

replace(boolean)               복원 추출 여부를 나타냄. True면 동일한 요소가 여러 번 선택될 수 있음(기본값 : True)

p(1-D array-like, optional)  각 요소가 선택될 확률. 배열의 합은 1이어야 함

plt.hist(population, bins=50, alpha=0.5, label='population', color='blue')

bins                                    데이터를 몇 개의 구간으로 나눌 것인가, 리스트(경계를 지정하고 싶을때) 입력 가능

alpha                                  막대의 투명도 지정(0 : 투명, 1 : 불투명)

 

■  표본오차 : 표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이

■  신뢰구간 : 모집단의 특정 파라미터(ex 평균, 비율)에 대해 추정된 값이 포함될 것으로 기대되는 범위

  - 신뢰구간 = (표본평균 ± z) * 표준오차

  - 95% 신뢰수준의 z 값은 1.96

import scipy.stats as stats

# 표본 평균과 표본 표준편차 계산
sample_mean = np.mean(sample)
sample_std = np.std(sample)

# 95% 신뢰구간 계산
conf_interval = stats.t.interval(0.95, len(sample)-1, loc=sample_mean, scale=sample_std/np.sqrt(len(sample)))

print(f"표본 평균: {sample_mean}")
print(f"95% 신뢰구간: {conf_interval}")

표본 평균: 170.89367120396076 95%

신뢰구간: (168.88138826498627, 172.90595414293526)

 

scipy.stats                  Scipy 라이브러리의 일부, 통계 분석을 위한 다양한 함수와 클래스들을 제공하는 모듈

scipy.stats.t.interval   함수는 주어진 신뢰 수준에서 t-분포를 사용하여 신뢰 구간(confidence interval)을 계산하는데 사용됨

scipy.stats.t.interval(alpha, df, loc=0, scale=1)

alpha       신뢰 수준(confidence level)을 의미함. ex 신뢰 구간을 원하면 alpha를 0.95로 설정함

df             자유도(degrees of freedom)를 나타냄. 일반적으로 표본 크기에서 1을 뺀 값으로 설정함(df = n - 1)

loc           위치(parameter of location). 일반적으로 표본 평균을 설정함

scale       스케일(parameter of scale). 일반적으로 표본 표준 오차(standard error)를 설정함

               표본 표준 오차는 표본 표준편차를 표본 크기의 제곱근으로 나눈 값(scale = sample_std / sqrt(n))

 

■  표준 정규분포 : 평균(뮤) 0, 분산(시그마 제곱) 1

■  정규분포 - 데이터 수가 많을수록 정규분포화 된다.

# 정규분포 생성
normal_dist = np.random.normal(170, 10, 1000)

# 히스토그램으로 시각화
plt.hist(normal_dist, bins=30, density=True, alpha=0.6, color='g')

# 정규분포 곡선 추가
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, 170, 10)
plt.plot(x, p, 'k', linewidth=2)
plt.title('normal distribution histogram')
plt.show()

 

■ 긴 꼬리 분포

 - 대부분의 데이터가 분포의 한쪽 끝에 몰려 있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포(비대칭적)

 - 파레토 분포, 지프의 법칙, 멱함수 등 여러 종류의 분포를 포함할 수 있음

 - 데이터가 많아져도 정규분포가 안된다.

# 긴 꼬리 분포 생성 (예: 소득 데이터)
long_tail = np.random.exponential(1, 1000)

# 히스토그램으로 시각화
plt.hist(long_tail, bins=30, density=True, alpha=0.6, color='b')
plt.title('long tail distribution histogram')
plt.show()

 

■ 스튜던트 t분포

 - 모집단의 표준편차를 알 수 없고 표본이 작을 때 정규분포 대신 사용한다. (일반적으로 30미만)

 - 자유도가 커질수록 정규분포에 가까워진다. (자유도란 표본의 크기와 관련이 있는 값)

 - 즉, 자유도가 작으면 꼬리부분이 두꺼워진다.

# 스튜던트 t 분포 생성
t_dist = np.random.standard_t(df=10, size=1000)

# 히스토그램으로 시각화
plt.hist(t_dist, bins=30, density=True, alpha=0.6, color='r')

# 스튜던트 t 분포 곡선 추가
x = np.linspace(-4, 4, 100)
p = stats.t.pdf(x, df=10)
plt.plot(x, p, 'k', linewidth=2)
plt.title('student t distribution histogram')
plt.show()

 

■ 카이제곱분포

 - 범주형 데이터의 독립성 검정, 적합도 검정에 사용

 - 상관관계나 인과관계를 판별하고자 하는 원인의 독립변수가 '완벽하게 서로 다른 질적 자료'일 때 사용

 - 독립성 검정 : 두 범주형 변수 간의 관계가 있는지 확인할 때 사용

 - 적합도 검정 : 관측한 값들이 특정 분포에 해당하는지 검정할 때 사용

k 값은 자유도

# 카이제곱분포 생성
chi2_dist = np.random.chisquare(df=2, size=1000)

# 히스토그램으로 시각화
plt.hist(chi2_dist, bins=30, density=True, alpha=0.6, color='m')

# 카이제곱분포 곡선 추가
x = np.linspace(0, 10, 100)
p = stats.chi2.pdf(x, df=2)
plt.plot(x, p, 'k', linewidth=2)
plt.title('카이제곱 분포 히스토그램')
plt.show()

df 값은 자유도

 

■ 이항분포

 - 앞 / 뒤, 성공 / 실패와 같은 두 가지 결과를 가지는 실험을 여러 번 반복했을 때 성공 횟수의 분포

 - 이산형 분포(연속된 값을 가지지 않는 분포)

 - 데이터 개수가 많을수록 정규분포 형태(p : 확률, n : 데이터 개수)

# 이항분포 생성 (예: 동전 던지기 10번 중 앞면이 나오는 횟수)
binom_dist = np.random.binomial(n=10, p=0.5, size=1000)

# 히스토그램으로 시각화
plt.hist(binom_dist, bins=10, density=True, alpha=0.6, color='y')
plt.title('이항 분포 히스토그램')
plt.show()

 

■ 푸아송 분포

 - 희귀한 사건이 발생할 때 사용

 - 단위 시간 또는 단위 면적 당 발생하는 사건의 수를 모델링할 때 사용

람다 값은 평균 발생률(주어진 시간이나 공간에서 사건이 몇번 발생했는지)

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import poisson

# 푸아송 분포 파라미터 설정
lambda_value = 4  # 평균 발생률
x = np.arange(0, 15)  # 사건 발생 횟수 범위

# 푸아송 분포 확률 질량 함수 계산
poisson_pmf = poisson.pmf(x, lambda_value)

# 그래프 그리기
plt.figure(figsize=(10, 6))
plt.bar(x, poisson_pmf, alpha=0.6, color='b', label=f'Poisson PMF (lambda={lambda_value})')
plt.xlabel('Number of Events')
plt.ylabel('Probability')
plt.title('Poisson Distribution')
plt.legend()
plt.grid(True)
plt.show()

 

대략적으로 정리해보면

데이터 수가 충분하다 → (무조건) 정규분포

☑️ 데이터 수가 작다 → 스튜던트 t 분포

☑️ 일부 데이터가 전체적으로 큰 영향을 미친다 → 롱 테일 분포 (파레토 분포)

☑️ 범주형 데이터의 독립성 검정이나 적합도 검정 → 카이 제곱 분포

☑️ 결과가 두 개(성공 or 실패)만 나오는 상황 → 이항 분포

☑️ 특정 시간, 공간에서 발생하는 사건 → 푸아송 분포