본문 바로가기
학습노트/통계

[학습노트] 통계2. 데이터와 표본분포 (1)

by kime2 2024. 4. 1.

표본분포

 

표본통계량 : 더 큰 모집단에서 추출된 표본데이터들로부터 얻은 측정지표

데이터분포 : 어떤 데이터 집합에서의 각 개별 값의 도수분포표

표본분포 : 어려 표본들 혹은 재표본들로부터 얻은 표본통계량의 도수분포

중심극한정리 : 표본크기가 커질수록 표본평균의 분포가 정규분포를 따르는 경향

-> 추론을 위한 표본분포에(신뢰구간이나 가설검정을 계산하는데) t분포같은 정규근사 공식을 사용할 수 있게 함

-> 표본평균의 분포

표분오차(SE) : 여러 표본들로부터 얻은 표본통계량의 변량(분산, 표본분포의 변동성)

-> 표본값들의 표준편차 s를 표본크기n의 제곱근으로 나눈 값

-> 공식에 따라서 표분오차를 줄이기 위해선 n,표본의 크기를 키우면 된다

-> cf. 표준편차 : 개별 표본들의 분산,  표본조사로 얻은 각 관측값과 표본평균의 차이

 

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

loans_income = pd.read_csv('https://raw.githubusercontent.com/gedeck/practical-statistics-for-data-scientists/master/data/loans_income.csv').reset_index()

sample_data = pd.DataFrame({
     'income' : loans_income['x'].sample(100),
     'type' : 'Data'})

sample_means_05 = pd.DataFrame({
    'income':[loans_income['x'].sample(5).mean() for _ in range(1000)],
     'type' : 'mean of 5'})

sample_means_20 = pd.DataFrame({
    'income':[loans_income['x'].sample(5).mean() for _ in range(1000)],
     'type' : 'mean of 20'})

result = pd.concat([sample_data, sample_means_05, sample_means_20])


g = sns.FacetGrid(result , col ='type', col_wrap= 1, height = 2, aspect =2)
g.map(plt.hist, 'income', range = [0,200000], bins = 40)
g.set_axis_labels('income', 'count')
g.set_titles('{col_name}')

데이터의 개수가 많을 수록 정규분포를 따른다 -> 중심극한정리

 

표본통계량의 도수분포표는 그 해당 지표가 표본마다 다르게 나타낼 수 있음

부트스트랩 방식 혹은 중심극한정리에 의존하는 공식을 통해 표본분포를 추정 가능

표준오차는 표본통계량의 변동성을 요약해주는 지표

 

부트스트랩

 

부트스트랩 표본 : 관측 데이터 집합으로부터 얻은 복원 추출

재표본추출(리샘플링) : 관측 데이터로부터 반복해서 표본추출하는 과정

1. 샘플값을 하나 뽑아서 기록하고 제자리에 놓는다

2. n번 반복한다

3. 재표본추출된 값의 평균을 R번 반복한다

-> 표분편차, 히스토그램, 신뢰구간 등에 활용

from sklearn.utils import resample
results = []
for nrepeat in range(1000):
    sample =  resample(loans_income)
    results.append(sample.median())
results = pd.Series(results)

print('Boostrap Statistics:')
print(f'original: {loans_income.median()}')
print(f'bias: {results.mean()-loans_income.median()}')
print(f'std.error: {results.std()}')

Boostrap Statistics:

original: (x    62000.0, x    32872.03537)

bias: x   -70.6805

std.error: 221.51749969793002

원본데이터보다 표준오차가 줄어들었다

 

부트스트랩은 모집단에서 추가적으로 표본을 뽑을 때 그 표본이 얼마나 원래표본과 비슷할지를 알려주는 것

예측 모델을 적용할 때 여러 부스트랩 표본들로부터 얻은 예측값을 모아서 결론을 만드는것(배깅)이 단일 보델을 사용하는 것보다 좋다

 

신뢰구간-> t분포를 통해 추정

신뢰수준 : 같은 모집단으로부터 같은 방식으로 얻은, 관심 통계량을 포함할 것으로 예상되는 신뢰구간의 백분율

신뢰구간 : 특정 범위 내에 모수의 참값이 존재할 것으로 예측되는 영역

1. 데이터에서 복원추출 방식으로 크기 n인 표본을 추출한다

2. 재표본추출한 표본에 대해 원하는 통계량을 기록한다

3. 1~2번을 R번 반복한다

4. x%신뢰구간을 구하기 위해 R개의 재표본의 결과의 분포 양쪽 끝에서 [(100-x)/2]%만큼 잘라낸다

5. 절단잔 점들은 x% 부트스트랩 신뢰구간의 양 끝점이다

정규분포

오차 : error, 데이터 포인트와 예측값 혹은 평균 사이의 차이

정규화(표준화)하다 : 평균을 빼고 표준편차로 나눈 값

Z-score : 개별 포인트를 정규화한 결과

-> 정규화한다고 해서 데이터가 정규분포를 따르는 것은 아니고, 비교목적을 위해 표준정규분포와 같은 척도로 만든 것

표준정규분포: 평균이 0, 표준편차가 1인 정규분포

QQ-plot: 표본분포가 특정분포(정규분포)에 얼마나 가까운지 보여주는 그림

-> Z-score을 오름차순으로 정렬하고 각 값의 z점수를 y축에 표시, x축-정규분포에서 해당 분위수

fig,ax = plt.subplots(figsize = (4,4))
norm_sample = stats.norm.rvs(size=100)
stats.probplot(norm_sample,plot=ax)

 

대각선 위에 놓이면 표본분포가 정규분포에 가까운 것으로 간주 

 

긴꼬리 분포

꼬리 : 적은 수의 극단값이 주로 존재하는 도수분포의 길고 좁은 부분

왜도 : 분포의 한쪽 꼬리가 반대쪽 다른꼬리보다 긴 정도

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


# 넷플릭스의 일일 주식 수일률
nflx = sp500_px['NFLX']
nflx = np.diff(np.log(nflx[nflx>0]))
fig, ax = plt.subplots(figsize = (4,4))
stats.probplot(nflx, plot = ax)

 

낮은 값의 점들은 대각선보다 낮고, 높은 값들은 대각선보다 높기때문에 정뷰분포를 따른다고 할때 예상되는것보다 더 많은 극단값 관찰가능하다

 

T분포

정규분포와 생김새가 비슷하지만, 꼬리부분이 약간 더 두껍고 길다

표본통계량의 일반적인 모양으로, 표본이 클수록 정규분포를 닮아간다

n: 표본크기

df: 자유도, 다른 표본크기, 통계량, 그룹수에 따라 t분포를 조절하는 변수

 

이항분포

시행 : 독립된 결과를 가져오는 하나의 사건

성공: 시행에 대한 관심의 결과(=1)

이항식 : 두가지 결과를 갖는다

이항시행 : 두가지 결과를 가져오는 시행(베르누이 시행)

이항분포 : n번 시행에서 성공한 회수에 대한 분포

-> 각 시행마다 성공확률(P)이 정해져 있을 때, 주어진 시행횟수(n) 중에서 성공한 횟수(x)의 도수분포표

stats.binom.pmf(2, n=2, p=0.1)
stats.binom.cdf(2, n=2, p=0.1)

n=5인 시행에서 각 시행의 성공확률이 0.1일때 x=2인 성공이 나올 확률

 

이항 결과는 무엇보다 중요한 결정사항들(구매/비구매)을 나타내므로 모델을 만드는데 중요

n이 크고 p가 0.5에 가까울때 정규분포로 근사할 수 있다

 

 

카이제곱분포

카이제곱통계량 : 관측값과 기댓값의 차이를 기댓값의 제곱근으로 나눈 값을 다시 제곱하고 모든 범주에 대해 합산한 값

-> 통계량을 표준화하여 참고분포와 비교가 가능

-> 관측데이터가 특정 분포에 적합한 정도를 나타냄

카이제곱분포는 일반적으로 범주에 속하는 주제 또는 항목의 수와 관련

카이제곱통계는 귀무 모델의 기댓값에서 벗어난 정도

 

F분포

그룹 평균간 차이가 정규 무작위 변동에서 예상할 수 있는 것보다 얼마나 큰지 관심있을경우 사용

F통계량 분포 : 모든 그룹의 평균이 동일한 경우 무작위순열 데이터에 의해 생성되는 모든 값의 빈도 분포

 

기타 분포들

람다 : 단위 시간이나 단위 면적당 사건이 발생하는 비율

-> 가정 : 해당 기간동안 일정하게 유지됨

포아송 분포 : 표집된 단위 시간 및 단위공간에서 발생하는 도수분포

-> 예: 5초동안 서버에 도착한 인터넷 트래픽을 95%의 확률오 완벽하게 처리하는데 필요한 용량은 얼마일까?

stats.poisson.rvs(2, size=100)

지수분포 : 한 사건에서 그 다음 사건까지의 시간이나 거리에 대한 도수분포

-> 예: 웹사이트 방문이 일어나는 시간사이

stats.expon.rvs(scale =5, size =100)

베이블분포 : 사건 발생률이 시간에 따라 변화하는 지수분포의 일반화된 버전

stats.weibull_min.rvs(1.5, scale = 5000, size=100)

일정 비율로 발생하는 사건의 경우, 시간 단위 또는 공간단위당 발생하는 사건의 수를 포아송분포로 모델링할 수 있ㄷ다

또한 한 사건과 다음 사던의 시간/거리를 지수분포로 모델링할 수 있다

시간에 따라 변화하는 사건 발생률은 베이불분포로 모델링 할 수 있다

 

 

궁금점

신뢰구간과 t분포의 이해

t분포는 어떻게 계산하지?

->표준정규분포와  카이제곱분포의 결합

확률변수 T = 표준정규확률변수 X /  (k자유도의 카이제곱확률변수.Y / 자유도k)의 제곱근

출처 - 나무위키

 

각 분포들의 활용방안