본문 바로가기

코딩으로 익히는 Python/통계

[Python] 6. 표준정규분포(z검정,t검정)

728x90
반응형
SMALL
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

정규분포

 

출처 : 데이터 사이언스 스쿨

 

확률분포함수

 

  • pmf 확률질량함수(probability mass function)
  • pdf 확률밀도함수(probability density function)
  • cdf 누적분포함수(cumulative distribution function)
  • ppf 누적분포함수의 역함수(inverse cumulative distribution function)
  • sf 생존함수(survival function) = 1 - 누적분포함수
  • isf 생존함수의 역함수(inverse survival function)
  • rvs 랜덤 표본 생성(random variable sampling)

x = np.linspace(-5,5,100) # 동일 간격으로 -5부터 5까지 100개 생성
y = (1/np.sqrt(2*np.pi))*np.exp(-x**2/2) # math.e , np.pi
plt.plot(x,y)
plt.show()

 

rv = stats.norm(0,1) # 평균0, 표준편차1
x = np.linspace(-5,5,100) # 동일 간격으로 -5부터 5까지 100개 생성
y1 = rv.pdf(x) # pdf : 확률밀도함수
plt.plot(x,y1)
plt.show()

 

 

rv = stats.norm(0,2) # 평균0, 표준편차2
x = np.linspace(-5,5,100) # 동일 간격으로 -5부터 5까지 100개 생성
y1 = rv.pdf(x) # pdf : 확률밀도함수
plt.plot(x,y)
plt.show()

 

rv = stats.norm(0, 1)
y1 =rv.pdf(x)        
plt.figure(figsize=(10, 6))          # 플롯 사이즈 지정
plt.plot(x, y1, color="red")         # 선을 빨강색으로 지정하여 plot 작성          
plt.xlabel("x")                      # x축 레이블 지정
plt.ylabel("y")                      # y축 레이블 지정
plt.grid()                           # 플롯에 격자 보이기
plt.title("Normal Distribution with scipy.stats")     # 타이틀 표시
plt.legend(["N(0, 1)"])              # 범례 표시
plt.show() 


cdf : 누적분포함수

 

rv.cdf(0) # 0까지 누적분포
[OUT] :

0.5

 

rv.cdf(1) # 1까지 누적분포
[OUT] :

0.8413447460685429

 

rv.cdf(4) # 4까지 누적분포
[OUT] :

0.9999683287581669

 

rv.cdf(10) # 10까지 누적분포
[OUT] :

1.0

ppf : 누적분포함수의 역함수

 

rv.ppf(0.5) # 누적분포가 0.5인 x값
[OUT] :

0.0

 

rv.ppf(0.8413447460685429) # 누적분포가 0.8413447460685429인 x값
[OUT] :

1.0

 

rv.cdf(1) - rv.cdf(0) # 0~1까지 누적확률분포
[OUT] :

0.3413447460685429

연습문제

 

1. (-2<x<2) 확률을 구하시오

2. 상위 5%의 값을 구하시오

 


Solution

 

1. (-2<x<2) 확률을 구하시오

rv.cdf(2) - rv.cdf(-2)
# (rv.cdf(2) - rv.cdf(0))*2
[OUT] :

0.9544997361036416

 

2. 상위 5%의 값을 구하시오

rv.ppf(0.95)
[OUT] :

1.6448536269514722

표준화

 

data = np.random.randint(30,size=(6,5))
data
[OUT] :

array([[23, 14, 22, 24, 16],
       [ 3, 14, 21, 27, 20],
       [ 6,  3,  4,  6,  4],
       [16, 19,  7,  0, 27],
       [15, 29, 25, 27, 24],
       [22, 28,  1, 29, 12]])

 

datastd = (data - np.mean(data, axis=0))/np.std(data,axis=0)
datastd
[OUT] :

array([[ 1.18245848, -0.42910149,  0.90575292,  0.45232586, -0.15213797],
       [-1.49480601, -0.42910149,  0.80124297,  0.71496668,  0.36947792],
       [-1.09321633, -1.6604362 , -0.97542622, -1.12351906, -1.71698564],
       [ 0.24541591,  0.13059611, -0.66189636, -1.6488007 ,  1.28230573],
       [ 0.11155269,  1.2499913 ,  1.21928278,  0.71496668,  0.89109381],
       [ 1.04859526,  1.13805178, -1.28895608,  0.89006056, -0.67375386]])

 

stats.zscore(data) # datastd와 같음 즉, 평균0이고 편차1로 표준화 시켜줌
[OUT] :

array([[ 1.18245848, -0.42910149,  0.90575292,  0.45232586, -0.15213797],
       [-1.49480601, -0.42910149,  0.80124297,  0.71496668,  0.36947792],
       [-1.09321633, -1.6604362 , -0.97542622, -1.12351906, -1.71698564],
       [ 0.24541591,  0.13059611, -0.66189636, -1.6488007 ,  1.28230573],
       [ 0.11155269,  1.2499913 ,  1.21928278,  0.71496668,  0.89109381],
       [ 1.04859526,  1.13805178, -1.28895608,  0.89006056, -0.67375386]])

 

StandardScaler

 

from sklearn.preprocessing import StandardScaler

 

st = StandardScaler()
result = st.fit_transform( data )
result
[OUT] :

array([[ 1.18245848, -0.42910149,  0.90575292,  0.45232586, -0.15213797],
       [-1.49480601, -0.42910149,  0.80124297,  0.71496668,  0.36947792],
       [-1.09321633, -1.6604362 , -0.97542622, -1.12351906, -1.71698564],
       [ 0.24541591,  0.13059611, -0.66189636, -1.6488007 ,  1.28230573],
       [ 0.11155269,  1.2499913 ,  1.21928278,  0.71496668,  0.89109381],
       [ 1.04859526,  1.13805178, -1.28895608,  0.89006056, -0.67375386]])

 

표준정규분포표

 


연습문제

 

1. 어느 회사에서 종업원들의 근무기간을 조사하였는데, 종업원들의 근무기간은 평균이 11년이고 표준편차가 4년인 정규분포를 따른다고 한다. 그럼 이 회사에서 14년 이상 근무한 종업원의 비율을 구하시오

 

2. 어느 전구회사의 전구의 수명은 평균 800일, 표준편차 30일인 정규분포를 따른다. 전구의 수명이 760일 이하일 확률 구하시오

 

3. 어느 고등학교 3학년 학생들의 수학 성적은 평균이 70점이고 분산이 64점인 정규분포를 따른다고 한다. 그럼 점수가 80점 이상이고 90점 이하일 확률을 구하시오


Solution

 

1. 어느 회사에서 종업원들의 근무기간을 조사하였는데, 종업원들의 근무기간은 평균이 11년이고 표준편차가 4년인 정규분포를 따른다고 한다. 그럼 이 회사에서 14년 이상 근무한 종업원의 비율을 구하시오

 

 

rv = stats.norm(11, 4)
1-rv.cdf(14)
# rv = stats.norm(0,1)
# 1-rv.cdf((14-11)/4)
[OUT] :

0.22662735237686826

 

2. 어느 전구회사의 전구의 수명은 평균 800일, 표준편차 30일인 정규분포를 따른다. 전구의 수명이 760일 이하일 확률 구하시오

 

rv = stats.norm(800,30)
rv.cdf(760)
[OUT] :

0.09121121972586788

 

3. 어느 고등학교 3학년 학생들의 수학 성적은 평균이 70점이고 분산이 64점인 정규분포를 따른다고 한다. 그럼 점수가 80점 이상이고 90점 이하일 확률을 구하시오

 

# 방법1
rv = stats.norm(70,math.sqrt(64)) # math.sqrt() = np.sqrt()
rv.cdf(90)-rv.cdf(80)
[OUT] :

0.09944010834107919

 

# 방법2
rv = stats.norm(0,1)
rv.cdf((90-70)/np.sqrt(64))-rv.cdf((80-70)/np.sqrt(64))
[OUT] :

0.09944010834107919

z 검정

  • 귀무가설: 표본평균의 평균은 모평균과 같다 E(x) = m
  • 대립가설: 아니다 𝐸(𝑥)≠𝑚E(x)≠m (양측검정)
  • 대립가설: 아니다 𝐸(𝑥)>𝑚E(x)>m (단측검정)
  • 모집단 정보가 있다
  1. 0.02라는 낮은 확률로 표본이 뽑혔다
  2. 가설이 틀렸다
  3. 이중 2번째 를 가지고 판별하는 것이 통계의 기본입장
  4. 귀무가설 기각(reject)
  5. 몇 % 까지를? 통계학에서 일반적인 으로 5%(0.05) 입장을 취한다
  6. 양측검정이면 (0.025), 단측검정( 0.05)

p-value( 유의확률:significant probability)

  • probability value(확률값)
  • 샘플데이터를 이용하여 모집단을 추론할때 사용한다
  • p값이 0.05 보다 작다: 어떤 사건이 우연히 발생할 확률이 5% 보다 작다(유의하다:원인과 결과가 있다 즉 우연이 아니다)
  • 왜 5% 인가 :경험
  • 0.05보다 작다 == 95% 보다 높다
  • 0.01보다 작다 == 99% 보다 높다

연습문제

 

  • 여학생 전체평균(모평균) : 600
  • 표본 크기 : 20
  • 표본 평균 : 641
  • 모집단 편차 : 100
  • pvalue?

Solution

 

# 방법1
rv = stats.norm( 0,1 )
p_value = 1 - rv.cdf((641-600)/(100/math.sqrt(20)))
p_value # 귀무가설 기각,대립가설 채택 (표본평균과 모평균은 차이가있다)
[OUT] :

0.033358497950542465

 

# 방법2
zscore = (641-600)/(100/math.sqrt(20))
rv = stats.norm(0,1)
z_stat = rv.cdf(zscore) # 차이가 있을 확률 : 0.9666415020494575
p_value = 1 - z_stat
print('p_value :',p_value)
[OUT] :

p_value : 0.033358497950542465

review
- cdf, ppf, scaler 
728x90
반응형
LIST