728x90
반응형

1.이항분포의 정규근사

 

==> 매회 성공률인 P인 이항 실험을 n번 독립적으로 반복하여 시행할 때 성공의 횟수 ==> 이항분포

 

https://knowallworld.tistory.com/241

 

이항분포식★이항실험★이항분포의 평균,분산★베르누이시행★기초통계학-[Chapter05 - 이산확률

1. 이항분포 ==> 많이 사용하는 확률 모형 : 이항분포, 푸아송분포 , 초기하분포 1. 이항실험(Bionomial Experiment) ==> 실험은 N번의 시행 ==> 실험 결과는 성공(S) , 실패(F) ==> 성공 확률 : p , 실패 확률 : q

knowallworld.tistory.com

==> 이항분포

 

==>시행횟수 n이 충분히 크면 누적이항확률표 이용

 

==> np<= 5인 경우 푸아송분포 이용하여 근사적으로 이항확률 구함.

https://knowallworld.tistory.com/242

 

푸아송분포★기초통계학-[Chapter05 - 이산확률분포-04]

1.푸아송 분포 ==> 이항분포에 대한 확률을 계산하기 위하여 누적이항확률표 사용 ==> but. 시행(n)이 30보다 큰 경우의 확률표 X ==> 시행(n)이 30보다 클 경우의 확률 근사값 구할 수 있다. 1> 확률 실

knowallworld.tistory.com

 

==> n이 충분히 크면서도 성공률 p가 충분히 작지 않은 경우, 푸아송 분포 사용이 어렵다.

 

 

==> 이항분포

from scipy.stats import binom



data_binom = binom(n=50 , p=0.7)
sample_binom=data_binom.rvs(1000) ## 생성된 분포 기반 1000개의 Sample 생성

## Counter 함수를 활용하여 성공횟수(x)별 횟수 도출 및 데이터 프레임 변환
count = collections.Counter(sample_binom)
count

Counter({32: 75, 34: 110, 31: 59,36: 118, 35: 126, 33: 91, ············

 

count_data = pd.DataFrame.from_dict(count, orient="index").reset_index()
count_data =count_data.rename(columns={"index":"number", 0:"count"})
count_data

이항분포표

fig = plt.figure(figsize= (15,8))
## 시각화
ax = sns.barplot(x = count_data["number"], y= count_data["count"])
ax.set_xlabel("number of success")
ax.set_ylabel("x")
ax.set_title("Simulation Result")
plt.show()

바 그래프

fig = plt.figure(figsize= (15,8))
## 시각화
ax = sns.histplot(sample_binom) #sample_binom으로 히스토그램 그리기
ax.set_xlabel("number of success")
ax.set_ylabel("x")
ax.set_title("Simulation Result")
plt.show()

히스토그램

==> 근데 왜 비어있지?

 

fig = plt.figure(figsize= (15,8))
## 시각화
ax = sns.distplot(sample_binom)
ax.set_xlabel("number of success")
ax.set_ylabel("x")
ax.set_title("Simulation Result")
plt.show()

확률분포그래프

fig ,ax = plt.subplots(figsize=(15, 8))
## 시각화
ax = sns.lineplot(x= count_data['number'] , y=count_data['count'])
ax.set_xlabel("number of success")
ax.set_ylabel("x" , fontsize = 13 , rotation = 0)
ax.set_title("Simulation Result")

ax2 = ax.twinx() #한 그래프에 두번째 plot 넣기
ax2 = sns.histplot(sample_binom)
ax2.axes.yaxis.set_visible(False) #y축 없애기
plt.show()

정규분포 근사

EX-01) 확률변수 X가 모수 n=50 , p = 0.7인 이항분포

 

1> 이항확률 P(33<=X<=39) 

 

평균 : np = 35

분산 : npq = 10.5

 

㉠ 이항분포 : P(X<=39) - P(X<=32)  = 50C39 * (0.7 ** 39) * (0.3 ** 11) - 50C32 * (0.7 ** 32) * (0.3 ** 18) = 

 

==> 파스칼의 삼각형 참고!!

https://knowallworld.tistory.com/256

 

[PYTHON]_코테에서도 쓰일_조합_계산_파스칼의 삼각형(이항정리) 사용하기!!

1. itertools.combination 사용하기 https://knowallworld.tistory.com/146 [Python] 순열, 조합, 중복순열, 중복조합(itertools이용한 백트래킹) https://knowallworld.tistory.com/228 Permutations()★순열,조합,중복순열,중복조합★

knowallworld.tistory.com

result = 1
N = 50
K = [39 , 32]
P_X =[]

for t in K:
    p_x = 0
    for p in range(t+1):
        result  = 1
        N = 50

        for i in range(p):
            result *= N
            N -= 1
        divisor = 1
        for i in range(2, p+1):
            divisor *= i
        p_x += (result // divisor) * math.pow(0.7 , p) * math.pow(0.3 , 50-p)
    P_X.append(p_x)
    print("p_x : {}".format(p_x))
print(P_X[0] - P_X[1])

==> 이항분포 정리는 P(X=1) + P(X=2) = P(X<=2) 이런식으로 가야한다!

p_x : 0.9211493751769412
p_x : 0.2178069383895617
0.7033424367873795

 

 

㉡ 푸아송분포 : P(X=39) =  (평균(뮤) ** 39) * e **(-평균) / 39!

P(X=32)  =  (평균(뮤) ** 32) * e **(-평균) / 32!

f_x=0
for x in range(40):
    f_x += math.pow(means,x) * math.exp(-means) / math.factorial(x)
print(f_x) # ==> 푸아송 분포

0.7801904451746821

 

㉢ 정규분포(정규근사)

print(stats.norm.cdf(0.3809))
print(stats.norm.cdf(-0.2857))

P(X<=39) = P(Z <= (39 - 35)/ 루트(10.5) )  = P (Z<= 1.2344) = 0.8914

P(X<=33) = P(Z <= (33 -35) / 루트(10.5) ) =  P(Z<= -0.61721) = 0.2685

 

0.8914 - 0.2685 = 0.6229

 

 

 

EX-02) X ~B(15 , 0.4)

 

1> 확률 P(7<= X <=9) 

 

㉠ 이항분포 : P(X<=9) - P(X<=7) ==> 이산확률분포

P(X=9) + P(X=8) + P(X=7) = 15C9 * (0.4 ** 9) * (0.6 ** 6) + ·········· = 0.3563

 

result = 1

K = [9,8,7]
res= []
for p in K:
    result = 1
    N = 15
    for i in range(p):
        result *= N
        N -= 1

    print('result : {}'.format(result))
    print('N : {}'.format(N))
    divisor = 1
    for i in range(2, p+1):
        divisor *= i
    res.append(result//divisor * math.pow(0.4 ,p) * math.pow(0.6 ,15-p))
    print(res)
print(sum(res))

p_x : 0.2783785597956358
p_x : 0.05001254005377596
0.22836601974185985

 

 

㉡ 푸아송분포 : P(X=9) =  (평균(뮤) ** 9) * e **(-평균) / 9!

P(X=7)  =  (평균(뮤) ** 7) * e **(-평균) / 7!

 

평균(뮤) = 15*0.4 = 6

분산 = 15 * 0.4 * 0.6 = 3.6

f_x=0
f_x_2 = 0
means = 6
vars = 3.6
for x in range(9+1):
    f_x += math.pow(means,x) * math.exp(-means) / math.factorial(x)
for x in range(7+1):
    f_x_2 += math.pow(means,x) * math.exp(-means) / math.factorial(x)
print(f_x) # ==> 푸아송 분포
print(f_x_2)
print(f_x - f_x_2)

P(X<=9) = 0.916

P(X<=7) = 0.7439

 

P(7<=X<=9) = 0.1720

 

㉢ 정규분포(정규근사) ==> 연속확률분포

 

P( (7-6)/루트(3.6) <= Z <= (9-6)/루트(3.6) ) = P(0.527 <=Z <= 1.5811) 

 

print(stats.norm.cdf(1.5811))
print(stats.norm.cdf(0.527))
print(0.943 - 0.7009)

 

P(Z<=1.5811) - P(Z<=0.527) = 0.9430 - 0.7009 = 0.2420

 

 

 

2. 정규근사에 의한 근사확률 ==> 연속성 수정 정규근사

 

==> 정규근사에 의한 근사 확률을 계산할때 , 누락된 부분을 없애기 위해 P(a-0.5 <= X <= b+0.5)를 구한다. ==> 오차를 줄일 수 있다.

 

EX-01)n = 50 , p = 0.7  , 연속성 수정한 정규근사에 의한 P(33<=X<=39)의 근사확률

 

P(33 - 0.5 <= X <= 39 +0.5) = P( Z<= (39.5 - 50) / 루트(50*0.7*0.3) )   - P( Z<=(32.5 - 50) / 루트(50*0.7*0.3) ) 

print(stats.norm.cdf(1.388))
print(stats.norm.cdf(-0.7715))
print(0.9174 - 0.2202)

 

P(Z<=1.388) - P(Z<= (-0.7715)) = 0.9174 - 0.2202 =  0.6972

 

 

EX-02)n = 15 , p = 0.4  , 연속성 수정한 정규근사에 의한 P(7<=X<=9)의 근사확률

 

P(7 - 0.5 <= X <= 9 +0.5) = P( Z<= (6.5 - 6) / 루트(15*0.4*0.6) )   - P( Z<=(9.5 - 6) / 루트(15*0.4*0.6) ) 

==>P(Z<=0.2635) - P(Z<=1.844) = 0.9674 - 0.6039 = 0.3635

 

출처 :  [쉽게 배우는 생활속의 통계학]  [북스힐 , 이재원] 

※혼자 공부 정리용

728x90
반응형

+ Recent posts