본문 바로가기
  • 블랜더 거실
IT인터넷/Python

[디지털 문해력]Python으로 배우는 데이터 분석_확률과 통계 배우기 2일차(210928)

by bandiburi 2021. 9. 18.

○ 베르누이 분포: 베르누이 시행
- 앞면/뒷면, 성공/실패
- 각 시행이 성공할 확률 p, 실패할 확률 1-p
- 각 시행은 서로 독립으로 각 시행의 결과가 다른 시행의 결과에 영향을 미치지 않음

○ 이항분포: 베르누이 시행을 반복했을 때, 성공하는 횟수의 확률분포
- 이항 실험 : 성공확률이 동일한 베르누이 시행을 독립적으로 반복하는 실험
- 이항 분포 : 이항 확률변수 X의 확률질량함수
 ㄴ 동전 앞면(성공), 뒷면(실패) : 10번 던질 때, P(성공) = n, P(실패) = 1-P(성공)
     3번 F, 7번 B 확률 :  10C3 (1/2)^3(1/2)^7
 ㄴ 파스칼의 삼각형: (x+y)^0 = 1, (x+y)^1=x+y, (x+y)^2=x2+2xy+y2, (x+y)3=x3+3x~~
 ㄴ X ~ B(n,p) 시행횟수가 n , 성공확률이 p인 이항분포
 ㄴ 이항분포에서 평균은 m = n*P, 분산 s^2 = np(1-p)
 ㄴ 이항분포는 평균과 분산을 구하기가 쉽다.


[실습1] 이항 분포

from elice_utils import EliceUtils
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy import stats
elice_utils = EliceUtils()    

# Q1. 이항분포pmf 그리기
# 이항분포 생성
n, p = 10, 0.3
stat_bin = sp.stats.binom(n,p)

# 그리기
fig, ax = plt.subplots()
## pmf를 만드는 코드를 작성해 주세요
x_axis = np.arange(n + 1)
plt.bar(x_axis, stat_bin.pmf(x_axis))

##
plt.show()
fig.savefig("pmf_plot.png")
elice_utils.send_image("pmf_plot.png")

# Q2. 이항분포cdf 그리기
## cdf 만드는 코드를 작성해 주세요
x_axis = np.arange(n + 1)
plt.bar(x_axis, stat_bin.cdf(x_axis))

##
plt.show()
fig.savefig("cdf_plot.png")
elice_utils.send_image("cdf_plot.png")

# Q3. 랜덤표본 추출
## seed 설정 seed = 0
np.random.seed(seed = 0)

## 랜덤 샘플 추출
random_bin = np.random.binomial(n=10, p=0.3, size = 50)
print(random_bin)
## 평균계산
bin_mean = np.mean(random_bin)
print(bin_mean)


○ 초기하분포
- 유한한 모집단에서 비복원추출 시, 성공의 횟수의 분포
- X ~ Hyper(M, n, N), 모집단의 크기 M이고, 표본의 크기가 n, 관심이 있는 범주(예: 불량품 개수)에 속하는 구성원소의 수가 N인 초기하분포
- 초기하 확률변수 X의 확률질량함수 p(X=x) =
   N: 모집단 크기, n 표본, D 불량갯수
예) 상자 안에 흰색 공 6개와 검은색 공 4개가 있을 때 5개의 공을 꺼낸 결과 흰 공이 3개인 확률은?
  p(X=3) = (6 3) x (4 2) / (10 5) = 10/21


[실습2] 초기하 분포

from elice_utils import EliceUtils
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy import stats
elice_utils = EliceUtils()

# 초기하분포
[M, n, N] = [30, 5, 10]
stat_hyp = sp.stats.hypergeom(M, n, N)

# 그리기
fig, ax = plt.subplots()
## pmf를 만드는 코드를 작성해 주세요
x_axis = np.arange(n + 1)
plt.bar(x_axis, stat_hyp.pmf(x_axis))

##
plt.show()
fig.savefig("pmf_plot.png")
elice_utils.send_image("pmf_plot.png")

# Q2. 초기하분포 cdf 그리기
## cdf 만드는 코드를 작성해 주세요
x_axis = np.arange(n + 1)
plt.bar(x_axis, stat_hyp.cdf(x_axis))

##
plt.show()
fig.savefig("cdf_plot.png")
elice_utils.send_image("cdf_plot.png")

# Q3. 랜덤표본 추출
## seed 설정 seed = 0
np.random.seed(seed = 0)

## 랜덤 샘플 추출
random_hyp = np.random.hypergeometric(ngood = 5, nbad = 25, nsample = 10, size = 50)
print(random_hyp)
## 평균계산
hyp_mean = np.mean(random_hyp)
print(hyp_mean)


○ 포아송분포
- 연속된 시간 상에서 발생하는 사건은 매 순간 발생 가능
  ㄴ 시행 횟수가 많고 순간의 성공확률은 작기 때문에 이항분포로 설명하기 어려움
- 단위시간/공간에 드물게 나타나는 사건의 횟수에 대한 확률분포
  ㄴ 연속적인 시간에서 매 순간에 발생할 것으로 기대되는 평균 발생 횟수를 이용해 주어진 시간에 실제로 발생하는 사건의 횟수 분포
 예) 일정 시간동안 발생하는 불량품의 수 / 일정 시간동안 톨게이트를 지나는 차량의 수 / 일정 페이지의 문장을 완성했을 때 발생하는 오타의 수
- 이항분포 B(n,p)에서 n이 매우 크고 p가 매우 작은 경우 람다 = np인 포아송 분포로 근사 가능
   ㄴ 이항분포에서 np는 평균m임

○ 연속확률분포

균일분포 : 주사위의 한 면이 나오는 분포

[실습3] 균일 분포

from elice_utils import EliceUtils
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy import stats
elice_utils = EliceUtils()

# 균일분포
stat_uni = sp.stats.uniform()

# 그리기
fig, ax = plt.subplots()
## pdf를 만드는 코드를 작성해 주세요
x_axis = np.linspace(0, 1, 100)
plt.bar(x_axis, stat_uni.pdf(x_axis))

##
plt.show()
fig.savefig("pdf_plot.png")
elice_utils.send_image("pdf_plot.png")

# Q2. 균일분포 cdf 그리기
## cdf 만드는 코드를 작성해 주세요
x_axis = np.linspace(0, 1, 100)
plt.bar(x_axis, stat_uni.cdf(x_axis))

##
plt.show()
fig.savefig("cdf_plot.png")
elice_utils.send_image("cdf_plot.png")

# Q3. 균일분포 샘플링
## seed 설정
np.random.seed(seed = 0)

## 샘플 추출
random_uni = np.random.uniform(0, 1, 100)
print(random_uni)

## 평균 계산
uni_mean = np.mean(random_uni)
print(uni_mean)


○ 정규 분포
-가장 많이 사용되고 유명한 분포, 평균 mu와 표준편차 sigma 두 모수로 정의
- N(m, sigma^2)로 표시   * 이항분포를 정규분포화해서 간소화해서 풀수도 있다.
- 표준 정규분포 N(0, 1) : 평균을 0, 표준편차를 1로
- 표준정규분포의 확률밀도함수 Z = (X-mu) / sigma


[실습4] 정규 분포

from elice_utils import EliceUtils
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy import stats
elice_utils = EliceUtils()

# 정규분포
stat_nor = sp.stats.norm(0, 1)

# Q1. 정규분포 pdf 그리기
fig, ax = plt.subplots()
## pdf를 만드는 코드를 작성해 주세요
x_axis = np.linspace(-3, 3, 100)
plt.bar(x_axis, stat_nor.pdf(x_axis))

##
plt.show()
fig.savefig("pdf_plot.png")
elice_utils.send_image("pdf_plot.png")

# Q2. 정규분포 cdf 그리기
## cdf 만드는 코드를 작성해 주세요
x_axis = np.linspace(-3, 3, 100)
plt.bar(x_axis, stat_nor.cdf(x_axis))

np.random.seed(seed = 0)

##
plt.show()
fig.savefig("cdf_plot.png")
elice_utils.send_image("cdf_plot.png")

# Q3. 정규분포 샘플링
## seed 설정

## 샘플 추출
random_nor = np.random.normal(0,1,100)
print(random_nor)

## 평균 계산
nor_mean = np.mean(random_nor)
print(nor_mean)


○ 모집단과 표본

- 정보를 얻고자 하는 관심 대상의 전체집합, 모집단을 통째로 조사하는 것은 어렵다
- 모집단의 일부를 표본으로 추출, 표본으로 모집단의 정보를 추론함
- 모수(평균m, 표준편차 sigma) -> sampline -> 표본(xbar, s) -> inference
예) 출구조사 : 전체 유권자 중 출구조상 대상자 결과가 유사
예) 3벌의 셔츠와 2벌의 바지로 옷을 입을 수 있는 경우의 수는?
  ㄴ 상의와 하의는 같이 입으므로 곱의 법칙: 3 * 2 = 6개의 경우의 수
예) 3벌의 바지와 2벌의 치마로 하의를 입을 수 있는 경우의 수는?
  ㄴ 서로 다른 하의는 같이 입을 수 없으므로 합의 법칙: 3+2 =5개의 경우의 수


○ 통계적 추론

- 표본이 가지고 있는 정보를 분석하여 모수를 추론
- 모수에 대한 가설의 옳고 그름을 판단
- 표본으로 전체 모집단의 성질을 추론하므로 오류 존재(이 부정확도를 반드시 언급해야 함)
- 구간에 대한 부분과 신뢰도에 대한 부분을 언급해야
- 모수 추정 : 모수에 대한 추론 혹은 추론치 제시 / 수치화 된 정확도 제시
- 가설검정 : 모수에 대한 여러 가설들이 적합한지 표본으로 판단


○ 모수 추정

- 모수 (m, sigma)
- 점추정 : 추출된 표본으로부터 모수의 값에 가까울 것이 예상되는 하나의 값을 제시
- 구간추정 : 하나의 값 대신 모수를 포함할 것이 예상되는 적절한 구간을 제시 (일반적으로 많이 사용됨)
- 모평균 점추정 : 모집단의 모수인 평균 mu의 추정
  ㄴ 모집단에서 크기가 n인 표본을 n개의 확률변수 X1, X2....Xn로 표현했을 때, 모평균의 추정량 중, 직관적으로 타당한 것은 표본평균
     Xbar = 1/n(X1 + X2 ...+Xn)
- 구간추정
  ㄴ 신뢰구간 : 추정량의 분포를 이용하여 표본으로부터 모수의 값을 포함하리라 예상되는 구간, (작은 값(하한), 큰 값(상한))의 형태
  ㄴ 신뢰수준 : 신뢰구간이 모수를 포함할 확률을 1보단 작은 일정한 수준에서 유지할 때 확률이 신뢰수준, 신뢰수준은 90% 95%, 99% 등으로 정함


○ 모평균의 구간추정

- 모평균 mu의 신뢰구간
- mu의 분포 : 모집단의 정규분포, 표준편차(sigma)가 주어짐
- 추정량 Xbar의 분포 : 평균이 mu, 표준편차가 sigma/root(n)인 분포 N(0,1), P = 1 - 알파
- 신뢰도가 커진다는 것은 구간값을 키운다는 의미임, 정보로서의 의미는 작아짐
예) N(100, 10^2) 인 분포로부터 크기가 15인 표본을 추출해 표본평균 xbar=105일때, 모평균에 대한 95% 신뢰구간:
  (xbar - 1.96 10 / root15, xbar + 1.96 10 / root15) = (99.94, 110,06)


○ 가설검정

- 모집단의 특성이나 모수에 대한 주장이 있을 때, 이 주장의 옳고 그름을 표본자료를 이용하여 판단하는 방법
- 통계적 가설검정 : 주어진 가설을 표본자료로부터 얻은 정보를 통해 검토하는 과정
- 귀무가설 & 대립가설
 ㄴ 귀무가설 : 기본적인 가설, 이미 알려진 가설  예) 기존 감기약
 ㄴ 대립가설 : 자료를 통하여 입증하고자 하는 가설, 비교하고 싶은 가설 예) 새로운 감기약 ( 더 좋다는 것을 증명해야)
예) 하나의 동전을 던지면 앞면이 나올 확률이 1/2이라 가정할 때, 진짜 앞면이 1/2의 확률로 나올지에 대한 검정
  대립가설은 1/2로 나오지 않는다


○ 양측가설 & 단측가설

- 양측가설 : 분포곡선의 양쪽
- 단측가설 : 분포곡선의 한쪽만을  


○ 통게적 가설검정

- 설정한 가설에 대한 옳고 그름을 표본자료를 통하여 검정, 두 가설 중 옳다고 판단할 수 있는 하나의 가설을 선택
 ㄴ 표본자료가 대립가설을 지지하면 대립가설 채택
- 대립가설을 채택하는 경우 : 귀무가설 H0을 기각한다
- 귀무가설을 채택하는 경우 : 귀무가설 H0을 기각할 수 없다 or 귀무가설 H0을 채택한다. -> 귀무가설을 기준으로 한 표현 사용


[실습5] 이항 검정

이항 검정에 대한 가설을 설정하고, 검정을 해보겠습니다.
후라이드 치킨 종류를 선호하는 후라이드 파(0)와 양념 치킨 종류를 선호하는 양념파(1)가 있습니다. 이 치킨 선호 유형을 베르누이 확률분포로 결정되는 값이라고 가정하겠습니다.
새로 출시한 치킨을 선호하는 비율은 양념파와 후라이드파가 같다고 가정하므로 베르누이 확률분포의 모수는 0.5 입니다.

새로 출시한 치킨을 선호하는 사람 50명 중 30명이 양념파였을 때, “새로 출시된 치킨을 선호하는 사람은 양념파이다” 라고 주장할 수 있을까요? 이를 표본을 추출하여 유의수준 0.05를 기준으로 확인해보겠습니다.

귀무가설 : “새로 출시한 치킨을 선호하는 사람은 치킨 선호 유형과 연관이 없다 : p= 0.5” vs. 대립가설 : “새로 출시한 치킨을 선호하는 사람은 치킨 선호 유형과 연관이 있다 : p != 0.5”

import numpy as np
import scipy as sp
from scipy import stats

# 이항 검정
## 1) seed 설정 seed = 0
np.random.seed(seed = 0)

## 2) 샘플 추출
random_ber = np.random.binomial(n = 1, p = 0.5, size = 50)
print(random_ber)

n_ber = np.count_nonzero(random_ber)
print(n_ber)

## 3) 가설 검정
binom_test = sp.stats.binom_test(n_ber, 50)
print(binom_test)


[실습6] 모평균 가설검증

모평균 가설검정에 대한 가설을 설정하고, 검정을 해보겠습니다.
표준편차의 값을 알고 있는 정규분포의 표본에 대한 기댓값을 검정하는 방법이다. 단일 표본 z- 검정이라고도 하는데, 따로 함수ztest가 준비되어 있지 않으므로 직접 ztest 를 만들어보겠습니다.

“고양이”를 주인공으로 동영상을 촬영하여 올렸을 때, 한 달 동안 구독자 수를 100명 으로 늘릴 수 있다고 합니다. 이 때, 표준편차는 5임을 알고 있다고 가정합니다. 10명을 대상으로 고양이 주인공 동영상의 한 달 구독자 수를 조사하였더니, 평균이 “103.69” 이었다고 합니다.

고양이 주인공 동영상의 구독자 수의 모평균을 mu라고 하자. 위의 주장은 mu = 100 이므로 가설은
귀무가설 : “ mu = 100” vs. 대립가설 : “ mu != 100”

import numpy as np
import scipy as sp
from scipy import stats

# 모평균 가설검정
## 1) seed 설정 seed = 0
np.random.seed(seed=0)
## 2) 샘플 추출
random_nor = np.random.normal(100,10,10)
print(random_nor)

# 평균 계산
nor_mean = np.mean(random_nor)
print(nor_mean)

## 3) 모평균 가설 검정 함수 정의
def ztest(stat, mu, sigma):
    z = (stat.mean() - mu) / (sigma/np.sqrt(len(stat)))
    return(2 * (1-sp.stats.norm.cdf(z)))

## 4) 모평균 가설 검정
mu_test = ztest(random_nor, 100, 10)
print(mu_test)


○  오류의 종류

- 1종의 오류(알파) : 귀무가설이 참일 때 귀무가설을 기각하는 경우
- 2종의 오류(베타) : 귀무가설이 거짓일 때 귀무가설을 채택하는 경우
- 두 개를 동시에 최소화할 수 없다. 1종 오류가 더 치명적이다. (손실이나 비용이 발생하는 경우가 많다)
- 우선 1종 오류를 줄이고 2종 오류를 줄여간다.


○ 유의수준 Significance Level, alpha

- 제1종의 오류를 범할 확률에 대한 최대 허용한계 고정값
- 일반적으로 유의수준 알파의 값으로 0.01 ~ 0.10 사이의 작은 값을 사용


○ 가설검정 과정

- 가설 설정 > 표분자료의 관측 > 가설검정에 사용할 통계량 선택(검정 통계량) > 관측값 계산 > 기각역, 유의확률 계산     > 검정 결과 해석 및 가설 채택


○ 검정 통계량

- Xbar를 관측하여 그 값으로부터 mu에 대한 가설 검정을 결정할 때 검정통계량으로 사용


○ 검정을 위한 기준

- 기각역 : Xbar가 취하는 구간 중에서 H0를 기각하는 구간
- 유의확률 : 표분자료가 대립가설을 지지하는 정도를 0과 1사이의 숫자로 나타낸 최소의 유의수준 값/ P-value라고도 함


○ 가설검정의 종류

- 이항 검정 : 이항분포를 이용하여 베르누이 확률변수의 모수 p에 대한 가설 조사
    ㄴ scipy.stats.binom_test(x, n, p, alternative='') * 이항검정의 유의확률을 구해주는 함수


○ 모평균의 가설검정

- 표본의 크기가 클 때, 모평균 mu이 정규분포를 따른다는 가정하에 중심극한정리에 의해 정규분포에 근사함
- np>5이고 n(1-0)>5이면 정규분포에 근사해서 사용가능 Z =(xbar-mu0)/(sigma/root(n)) ~ N(0,1)
- 단측검정 & 양측검정

728x90
반응형

댓글