이항분포, 푸아송분포,정규분포 기억하기★cdf, pdf 사용법!★정규근사★파스칼★이항분포의 정규근사★기초통계학-[Chapter06 - 연속확률분포-05]
1.이항분포의 정규근사
==> 매회 성공률인 P인 이항 실험을 n번 독립적으로 반복하여 시행할 때 성공의 횟수 ==> 이항분포
https://knowallworld.tistory.com/241
==> 이항분포
==>시행횟수 n이 충분히 크면 누적이항확률표 이용
==> np<= 5인 경우 푸아송분포 이용하여 근사적으로 이항확률 구함.
https://knowallworld.tistory.com/242
==> 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
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
출처 : [쉽게 배우는 생활속의 통계학] [북스힐 , 이재원]
※혼자 공부 정리용