sympy INTEGRAL,Symbol,pprint★scipy.stats.UDF_균등분포★stats.PDF_확률밀도함수★기초통계학-[Chapter06 - 연속확률분포-01]
1. 연속확률변수(Continous Random Variable)
==> 확률변수가 취할 수 있는 모든 값, 상태공간이 어떤 구간으로 나타나는 확률변수 의미
==> 확률변수 X가 취할 수 있는 모든 값이 유한구간 [a,b] or [(0, 무한대)] 일 경우 확률변수 X를 연속확률변수라 한다.
EX-01)
1>X는 오차가 2mL 이고 용량이 245mL로 표시된 음료수의 양
==> 연속확률변수
2>X는 시험시간이 1시간인 시험에서 각각의 학생들이 답안지를 제출한 시간
==> 연속확률변수
3> X는 교체된 형광등의 수명
==> 연속확률변수
4> X는 카드 외판원이 3장의 카드를 판매할 때까지 만난 고객의 수
==> 이산확률변수
5> 교환대에 걸려온 전화 횟수
==> 이산확률변수
6> X는 교환대에 걸려온 전화 사이의 대기 시간
==> 연속확률변수
7> 강수량
==> 연속확률변수
2. 확률밀도함수(Probability Density Function , PDF)
==> 모든 실수 x에 대하여 f(x) >= 0
==> 모든 실수 구간과 함수 f(x)로 둘러싸인 부분의 넓이는 1이다.
==> 자료 값의 갯수가 늘어날 수록 계급간격이 조밀해지고, 상대도수히스토그램은 곡선에 가까워진다.
EX-01) 중심부에 있는 가장 작은 원의 반지름 : 5mm , 2번째 작은 원의 반지름 1cm , 1칸당 1cm씩 커진다.
P(X<=x) = (반지름의 길이가 x인 원의 넓이) / (전체 원의 넓이)
1> 중심부에 있는 가장 작은 원에 맞힐 확률:
r = 0.5cm
s = 0.25ㅠ cm**2
S = 100ㅠ cm**2
P(X=0.5) = 0.25 / 100 = 1/400 = 0.0025
2> 반지름의 길이가 a보다 작은 원에 맞힐 확률:
P(X<=a) = a**2 / 100
3> 반지름의 길이가 3cm와 4cm 원안에 맞힐 확률:
P(X=3) + P(X=4) =P(X<=4) - P(X<=2) = 16/100 - 4/100 = 12/100 = 0.12 (WHY??!)
P(X=3) + P(X=4) =P(X<=4) - P(X<=3) = 16/100 - 9/100 = 12/100 = 0.07
4> 반지름의 길이가 4cm 원 밖에 맞힐 확률:
P(X>=4) = 1 - P(X<=4) = 1 - 16/100 = 84/100 = 0.84
EX-02) 연속확률변수 X의 확률밀도함수 f(x) 가 삼각형 모양
import matplotlib.tri as mtri
fig = plt.figure(figsize=(15,8))
x = np.array([0,2,4]) #삼각형의 x좌표
y = np.array([0,0.5 , 0]) #삼각형의 y좌표
triangles = [[0,1,2]] #삼각형의 점 개수
triang = mtri.Triangulation(x,y , triangles)
plt.title("삼각 그리드")
plt.triplot(triang , 'ko-')
plt.xlim(-0.1 , 4.1)
plt.ylim(-0.1 , 0.6)
plt.show()
==> Matplotlib.tri 활용하여 삼각형 그리드 시각화
1> 상수 k를 구하라.
k = 0.5
y = (1/4)x ____ 0<=x<2
y = (-1/4)x + (1) _____ 2<=x<=4
2> P(X<=1) = 1/8
3> P(1<=X<=2) = 1/2 - 1/8 = 3/8
4> P(X>=2.5) = (- (25/40) + (40/40) ) * (3/2) * (1/2) = 15/40 * (3/2) *(1/2) = 3/8 * 3/4 = 9/32 = 0.28125
==> 추후 시각화 자료 첨부할 예정
3. 균등분포(Uniform Distribution , PDF)
==> 구간 a<=x <= b
==> f(x) = 1 / (b-a)
==> X ~ U(a,b)
==> P(X<=c) = (c-a) / (b-a)
※균등분포 그래프 그리기!!!!!!
min , max = 270, 300
# x_2 = linspace(min-1 , max+1 , 100)
x_2 = np.arange(min-30 , max+30 , 1)
print(x)
print(x_2)
[240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329]
y = uniform.pdf( x = x_2 , loc = min , scale = max-min)
# f(x, loc, scale) = {1/scale-loc for loc <= x <= scale
# {0 otherwise}
print(y)
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0.033 0.033 0.033 0.033 0.033 0.033
0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033
0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033
0.033 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. ]
fig = plt.figure(figsize=(12, 8))
ax = sns.lineplot(x = x_2 , y= y) #왜 uniform이 안되는거죵
ax.set_title('균등분포(Uniform Distribution)')
ax.set_xlabel('X' , fontsize= 15)
ax.set_ylabel('Y' , fontsize= 15 , rotation = 0 , labelpad = 12)
★★★★★https://github.com/scipy/scipy/blob/main/scipy/stats/_continuous_distns.py
==> Scipy 링크 참조!!!!
1> P(X<= x) ==> [1,5] 구간에서 P(X<=3)
stats.uniform.cdf(loc=1 , scale= 4 , x=3)
2> P(X> x) ==> [1,5] 구간에서 P(X>2)
stats.uniform.sf(loc=1 , scale = 4 , x =2)
3> f(x) ==> [1,5] 구간에서 확률밀도함수
for i in range(1,6):
print(stats.uniform.pdf(loc=i , scale = 4 , x =5))
f(1) = P(X=1) = 0.2
4> f(x) ==> [1,5] 구간에서 넓이 값(백분위수)
5> number 개수만큼 난수 발생
print(stats.uniform.rvs(loc = 1, scale = 5.0 , size = 10))
[5.84 2.235 4.449 2.765 5.692 1.512 4.586 4.765 2.102 3.478]
==> scale은 6미만?!
EX-01) X ~ U(1, 5) ==> Y축 1/4 , X축 (1,5)
1> X의 확률밀도함수
f(x) = 1/4 ( 1<=x <= 5) , 0 ( x<1 , x>5)
for i in range(1,6):
print(stats.uniform.pdf(loc=i , scale = 4 , x =6))
==>0.0 ,0.25 , 0.25 ,0.25 , 0.25
==> scale 4로 설정!!! ==> 갯수의미!
2> P(X<=3)
print(stats.uniform.cdf(loc=1 , scale= 4 , x=3))
==> scale 4로 설정!!! ==> 갯수의미!
=> 2 * 1/4 = 1/2
3> P(2<=X<=3.5)
stats.uniform.cdf(loc=1 , scale = 4 , x=3.5) - stats.uniform.cdf(loc=1 , scale = 4 , x =2)
==> scale 4로 설정!!! ==> 갯수의미!
==> 1.5 * 1/4 = 15/10 * 1/4 = 3/8 = 0.375
EX-02) X ~ U(0,4)
1> X의 확률밀도함수
for i in range(0,5):
print(stats.uniform.pdf(loc=i , scale = 4 , x=5))
==> 0.0 , 0.25 , 0.25 , 0.25, 0.25
f(x) = 1/4 , 0<=x<=4 , x<0 or x>4
2> P(X<=3)
print(stats.uniform.cdf(loc=0 , scale = 4 , x=3))
3* 1/4 = 3/4 = 0.75
4. 연속확률변수의 평균과 분산
EX-01) 확률밀도함수가 0<=x<=1 에서 f(x) = 2x
1> X의 평균
from sympy import Integral, Symbol , pprint
x = Symbol('x')
f = 2 * x**2
pprint(Integral(f, x).doit()) #이쁘게 출력
print(Integral(f, (x, 0, 1)).doit()) #적분변수 , 아래끝 , 위끝
3
2⋅x
──── ==> 적분한 값
3
E(X) = 2/3
2> X의 분산
f = f *x
print(Integral(f, (x, 0, 1)).doit() - a**2) #적분변수 , 아래끝 , 위끝
1/18
3> P(0<=X<=0.5)
f = 2*x
print(Integral(f, (x, 0, 0.5)).doit())
==> 0.25
EX-02) 연속확률벼수 X의 확률밀도함수가 -1<=x<=1 에서 f(x) = (x+1) / 2
x = Symbol('x')
f_x = (x+1) /2
f_x_m = f_x * x
print(f_x_m)
mean_1 = Integral(f_x_m, (x,-1 , 1)).doit()
print("평균 : {}".format(mean_1))
f_x_v = f_x_m * x
print(f_x_v)
vars_1 = Integral(f_x_v , (x,-1,1)).doit() - mean_1**2
print("분산 : {}".format(vars_1))
ratio = Integral(f_x , (x,0,0.5)).doit()
print("확률 0이상 0.5 이하는 {}이다.".format(ratio))
X의 평균 : 1/3
X의 분산 : 2/9
P(0<= X <= 0.5) : 확률 0이상 0.5 이하는 0.3125이다.
EX-03) X ~ U(1,5)에 대하여 X의 평균과 분산을 구하라
f = 1/ (5-1)
x = Symbol('x')
f_x_m = f*x
mean_x = Integral(f_x_m , (x,(1,5))).doit()
print("평균 : {}".format(mean_x))
f_x_v = f_x_m*x
var_x = Integral(f_x_v , (x,(1,5))).doit() - mean_x**2
print("분산 : {}".format(var_x))
mean_x = (1+5) / 2
var_x = (5-1)**2 / 12
print("평균 : {}".format(mean_x))
print("분산 : {}".format(var_x))
평균 : 3.00000000000000
분산 : 1.33333333333333
평균 : 3.0
분산 : 1.3333333333333333
EX-04) X ~ U(0,4)에 대하여 X의 평균과 분산을 구하라
f = 1/ (4-0)
x = Symbol('x')
f_x_m = f*x
mean_x = Integral(f_x_m , (x,(0,4))).doit()
print("평균 : {}".format(mean_x))
f_x_v = f_x_m*x
var_x = Integral(f_x_v , (x,(0,4))).doit() - mean_x**2
print("분산 : {}".format(var_x))
mean_x = (0+4) / 2
var_x = (4-0)**2 / 12
print("평균 : {}".format(mean_x))
print("분산 : {}".format(var_x))
평균 : 2.00000000000000
분산 : 1.33333333333333
평균 : 2.0
분산 : 1.3333333333333333
출처 : [쉽게 배우는 생활속의 통계학] [북스힐 , 이재원]
※혼자 공부 정리용