정규점수, 정규확률그림

2020. 7. 30. 22:50데이터 분석 기본

반응형

우리가 표본을 추출하였을 때, 정규분포를 따른다고 가정이 맞는지 잘 못 됐는지 어떻게 판단 할 수 있을까요? 해당 가정을 쉽게 추정해 볼 수 있는 방법으로 정규점수그림 또는 정규확률그림이란 것이 있습니다.

[정규점수]

정규점수라는 것은 표준정규분포(평균 0, 표준편차 1)에서의 이상적인 표본을 말합니다. 다시 말하면, 표준정규분포의 확률밀도함수를 등확률 구간으로 나누어 주는 경계값(z값)을 의미합니다. 만약 우리가 표본이 있다고 가정한다면, 평균 근처에 값들의 빈도가 높아야 정규분포에 가깝다고 판단 할 수 있을 것입니다. 


위에 그림을 보시면 초록색 줄 사이에 값들은 등확률입니다. 즉 줄 사이에 넓이들이 같습니다. 만약 우리가 9개의 표본을 가지고 있다면, 초록색 줄과 x축이 만나는 점(여기가 정규점수 입니다)에 9개의 표본을 정규화 한 값이 위치해있으면, 우리의 표본 9개가 정규분포를 따른다고 볼 수 있겠습니다.

[정규확률그림]

정규확률그림은 위의 정규점수와 실제 표본을 보기 쉽게 표현한 그래프입니다. 정규확률그림을 그리는 순서는 아래와 같습니다.

(1) 표본을 작은 것부터 크기순으로 나열합니다.

(2) 각 자료에(순서)에 해당하는 정규점수를 계산합니다.

(3) 같은 순선의 자료와 정규점수를 2차원 그래프로 나타냅니다.

예를 들어 1,2,7,15,40,84,86,89,91 의 표본을 가지고 있다고 가정해보겠습니다. 그렇다면 확률을 10등분하는 기준점, 정규점수 9개는 아래와 같습니다. -1.28, -0.84, -0.52, -0.25, 0, 0.25, 0.52, 0.82, 1.28 이를 이용해서 Plot을 해보겠습니다.

Sample 9개

그림을 확인하시면 직선 형태가 이루어 지지 않는 다는 것을 확인 하 실 수 있습니다. 저 점들의 형태가 직선에 가까울 수록 정규성을 만족한다고 판단합니다. 사실 9개 정도의 데이터로 정규성을 만족하는 것은 쉽지 않기 때문에, 약 1000개정도의 Sample을 생성하여, 정규확률그림을 그려보겠습니다.

Random Sample 999개

위에 그림은 Random으로 생성하여 그려본 것입니

다. 극단값에 갈 수록 곡선의 모양을 보이면서 정규분포와 멀어지는 것 같습니다.

이제 표준정규분포를 가정하고 Sample을 생성하여 그림을 그려 보겠습니다.

표준정규분포따르는 Sample 999개

거의 직선에 가까운 것을 확인 할 수 있습니다. 해당 표본 자료는 정규성을 만족한다고 볼 수 있을 것입니다.

아래는 정규 확률 그림을 그리기 위한 Python 코드 입니다.

# module 
from scipy.stats import norm
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 표준정규분포 생성
mu = 0
std = 1
norm_ =norm(mu,std)

## Sample이 9개일때 정규점수 계산
x_list =[]
for i in range(9):
    a = (i+1)/10
    x_list.append(norm_.ppf(a))
    
## 정규점수 시각화   
x = np.linspace(norm_.ppf(0.01), norm_.ppf(0.99),1000) 
plt.plot(x, norm_.pdf(x),'r-', lw=1, alpha=0.6, label='norm pdf')
plt.vlines(x_list, 0, norm_.pdf(x_list),colors='g', lw=1, alpha=0.5)
plt.legend()
plt.show()

## Sample이 9개 일때 정규확률 그림
data = np.random.randint(100, size = 9)
data=np.sort(data)
print(data)
plt.plot(data, x_list, "bo")

## Random Sample 999개일때 정규확률 그림
x_list =[]
for i in range(999):
    a = (i+1)/999
    x_list.append(norm_.ppf(a))
    
data = np.random.randint(100, size = 999)
data=np.sort(data)
plt.plot(data,x_list, "ro" ,alpha=0.5, ms= 3)
plt.title("normal probability plot")
plt.ylabel("normal score")
plt.xlabel("sample value")
plt.show()


## 표준정규분포로 Sample 999개 생성후 정규확률 그림
data_norm = norm_.rvs(999)
data_norm = np.sort(data_norm)
plt.plot(data_norm, x_list, "bo" ,alpha=0.5, ms= 3)
plt.xlim(-3,3)
plt.title("normal probability plot")
plt.ylabel("normal score")
plt.xlabel("sample value")
plt.show()


## Scipy 모듈을 활용한 정규확률 그림
from scipy import stats

x= norm_.rvs(999)
res=stats.probplot(x, plot=plt)
plt.xlim(-3,3)
plt.show()

## Scipy 모듈을 경유 x축이 이론적인 값(normal score) y축이 sample value


출처: 

https://leedakyeong.tistory.com/entry/기초통계-정규확률그림-그리는-방법원리-qqplot-in-R

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.probplot.html

반응형