✏️ 데이터 사이언스 스쿨에서 공부한 내용입니다.
공집합인 사건의 확률은 0이다.
어떤 사건의 여집합인 사건의 확률은 (1 - 원래 사건의 확률)과 같다.
두 사건의 합집합의 확률은 각 사건의 확률의 합에서 두 사건의 교집합의 확률을 뺀 것과 같다.
복수의 사건 가 다음을 만족하는 사건들이라고 가정한다.
사건 의 확률은 사건 와 사건 가 동시에 발생할 사건들의 확률의 합과 같다.
확률은 사건(event)이라는 표본의 집합에 대해 숫자를 할당하는 함수다. 어떤 사건에 어느 정도의 확률이 할당되었는지 묘사한 정보를 확률분포(probability distribution) 라고 한다. 확률분포를 묘사하려면 모든 사건들을 일일히 제시하고 거기에 할당된 숫자를 보여주어야 한다. 표본의 개수가 유한하다면 가능할 수 있지만 만약 표본의 개수가 무한하다면 현실적으로 모든 사건을 하나 하나 기술하는 것은 불가능하다. 이 절에서는 확률분포함수(probability distribution function) 라는 것을 이용하여 이 문제를 해결하는 방법을 설명한다. 확률분포함수로는 다음과 같은 세 종류가 있다.
확률질량함수
누적분포함수
확률밀도함수
콜로고로프의 정리를 사용하면 어떤 사건의 확률값을 이용하여 다른 사건의 확률값을 계산할 수 있다. 예를 들어 표본이 하나인 사건을 단순사건(elementary event, atomic event) 이라고 한다. 단순사건끼리는 서로 교집합을 가지지 않으므로 유한 개의 사건만 있는 경우, 모든 단순사건의 확률값을 알면 콜모고로프의 세 번째 공리에 의해 다른 모든 사건의 확률값을 계산할 수 있다. 단 모든 단순사건의 확률의 합은 1이어야 한다.
유한 개의 사건이 존재하는 경우 각 단순사건에 대한 확률만 정의하는 함수를 확률질량함수(probability mass function) 라고 한다. 확률질량함수는 소문자 로 표시한다. 확률과 확률질량함수는 다른 개념이라는 점을 주의한다.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 7)
y = np.array([0.1, 0.1, 0.1, 0.1, 0.1, 0.5])
plt.stem(x, y)
plt.title("조작된 주사위의 확률질량함수")
plt.xlabel("숫자면")
plt.ylabel("확률")
plt.xlim(0, 7)
plt.ylim(-0.01, 0.6)
plt.xticks(np.arange(6) + 1)
plt.show()
확률질량함수가 위와 같은 주사위에서 다음 사건에 대한 확률을 구하라.
(1) ✏️ 0.1 + 0.1 = 0.2
(2) ✏️ 0.1 + 0.1 + 0.5 = 0.7
확률질량함수에서 표본공간에 있는 표본 수가 유한할 때 하나하나의 표본에 대해서만 확률을 정의하면 어떠한 사건에 대해서도 확률을 정의할 수 있다는 것을 알았다. 그렇다면 왜 굳이 확률을 정의할 때 입력을 표본이 아닌 사건으로 정의했을까? 그 이유는 표본공간에 있는 표본 수가 무한한 경우를 다루기 위해서다. 표본 수가 무한하면 확률질량함수를 사용하여 확률을 정의할 수 없다. 다음 예제를 통해 그 이유를 알아보자.
회전하는 원반에 화살을 쏘고 화살이 박힌 위치의 각도를 결정하는 문제를 생각해보자. 각도가 정확하게 0도가 될 확률은 얼마일까? 만약 모든 각도에 대해 가능성이 똑같다면 각도가 정확하게 0이 될 확률은 0이다.
각도가 0이 아닌 어떤 경우도 마찬가지로 확률이 0이다. 예를 들어 각도가 30도가 되는 경우도 확률은 0이다.
왜 그럴까? 모든 각도에 대해 가능성이 똑같으므로 그 확률을 라는 값이라고 하자. 그런데 각도가 나올 수 있는 경우는 무한대의 경우가 있으므로 만약 가 0이 아니라면 로 전체 표본 집합의 확률이 무한대가 된다. 즉, 1이 아니다. 따라서 표본 수가 무한하고 모든 표본에 대해 표본 하나만을 가진 사건의 확률이 동일하다면, 표본 하나에 대한 사건의 확률은 언제나 0이다. 이번에는 같은 원반에 대해 다음 사건의 확률은 얼마일까?
이 경우에는 동일한 가능성을 지닌 사건이 개 있으므로 전체집합의 확률 을 로 나누면 주어진 사건에 대한 확률은 가 된다.
위 예제의 원반을 이용하여 복권 번호를 결정하는 경우를 생각하자. 결과를 조작하려고 0도에서 180도 사이에 화살이 2배 더 잘 박히도록 원반을 조작했다. 이 결과를 확률을 사용하여 공범에게 전달해야 한다. 가능한 모든 사건에 대해 확률을 알려주는 확률함수를 기술하는 방법은 무엇인가?
✏️
라 하면
에서
따라서 확률함수를 다음과 같이 기술하면 된다.
,
표본공간이 실수의 집합이라면 대부분의 사건(부분집합)은 시작점과 끝점이라는 두 숫자로 이루어진 구간(interval)으로 표현된다.
구간을 입력받아 확률값을 출력하는 함수는 다음처럼 이차원 함수 로 표현할 수 있다.
구간의 확률만 표현할 수 있다면 여러 구간으로 이루어진 복잡한 사건은 콜모고로프의 공리에 따라 각 구간의 확률값의 더하기나 빼기로 표현할 수 있다.
0도에서 180도 사이에 화살이 2배 더 잘 박히도록 조작된 원반을 이용하여 복권 번호를 결정하는 문제에서 구간의 시작점과 끝점을 입력받아서 확률을 출력하는 함수 를 구하고 이를 파이썬으로 구현하라.
✏️
def P(a,b):
if b < 180 :
return (2/3)*(b-a)/180
elif a > 180 :
return (1/3)*(b-a)/180
else:
return ((2/3)*(180-a)/180 + (1/3)*(b-180)/180)
그러나 사건(event) 즉, 구간(interval) 하나를 정의하기 위해 숫자가 하나가 아닌 두 개가 필요하다는 점은 아무래도 불편하다. 숫자 하나만으로 사건 즉, 구간을 정의할 수 있는 방법은 없을까? 이를 해결하기 위한 아이디어는 시작점을 모두 똑같이 음의 무한대()로 통일한 특수한 구간 을 사용하는 것이다.
이러한 사건의 확률분포를 묘사하는 함수를 누적분포함수(cumulative distribution function) 라고 하고 약자로 cdf 라고 쓴다. 함수 기호로는 등 대문자 기호로 표시한다. 독립변수 는 구간의 끝점을 뜻한다.
누적분포함수와 콜모고로프의 세 번째 공리에 의해 다음과 같이 쓸 수 있다.
누적분포함수 cdf는 다음과 같은 특징이 있다.
이 세 가지 특성에 따라 누적분포함수는 0에서 시작하여 천천히 증가하면서 1로 다가가는 형태를 가진다. 단조증가 성질에 의해 절대로 내려가지는 않는다.
원반의 각도 문제에서 누적분포함수는 다음과 같다. 이 경우에는 각도가 0도부터 360까지이지만 음의 무한대를 시작점으로 해도 상관없다.
이를 NumPy와 matplotlib를 사용하여 그래프로 그리면 다음과 같다.
t = np.linspace(-100, 500, 100)
F = t / 360
F[t < 0] = 0
F[t > 360] = 1
plt.plot(t, F)
plt.ylim(-0.1, 1.1)
plt.xticks([0, 180, 360])
plt.title("누적분포함수")
plt.xlabel("$x$ (도)")
plt.ylabel("$F(x)$")
plt.show()
0도에서 180도 사이에 화살이 2배 더 잘 박히도록 조작된 원반을 이용하여 복권 번호를 결정하는 문제에서 누적분포함수 를 구하라.
✏️
x<0 에서 y=0
x>360 y=1
0<x<180 에서 y=2mx
180<x<360 y=mx+b
모든 실수에서 함수가 연속이므로
x=180에서 360m = 180m + b
x=360에서 360m +b = 1
연립방정식을 풀면, b = 1/3, m = 1/540
import matplotlib.pyplot as plt
import numpy as np
# Define the x-axis values
x = np.linspace(-10, 370, 400) # Range extended for better visualization
# Define the y-axis values based on the conditions
y = np.piecewise(x,
[x < 0, (0 <= x) & (x < 180), (180 <= x) & (x <= 360), x > 360],
[0, lambda x: 2*x/540, lambda x: (x+180)/540, 1])
# Create the plot
plt.plot(x, y)
plt.title("Piecewise Linear Function")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
# Display the plot
plt.show()
누적분포함수를 미분하여 구한 도함수를 확률밀도함수(probability density function) 라고 한다. 확률질량함수와 마찬가지로 로 표기한다.
확률밀도함수는 특정한 구간의 확률이 다른 구간에 비해 상대적으로 얼마나 높은가를 나타내는 것이며 그 값 자체가 확률은 아니다
미적분학의 기본 원리에 의하면 부터 사이에서 도함수인 확률밀도함수의 면적(정적분)은 적분함수인 누적분포함수의 값을 이용하여 구할 수 있다.
따라서 누적분포함수와 확률밀도함수의 관계를 적분으로 나타내면 다음과 같다.
확률밀도함수는 다음과 같은 특징을 가진다.
앞의 원반 예제의 확률밀도함수를 구하면 다음과 같다.
t = np.linspace(-100, 500, 1000)
F = t / 360
F[t < 0] = 0
F[t > 360] = 1
p = np.gradient(F, 600/1000) # 수치미분
plt.plot(t, p)
plt.ylim(-0.0001, p.max()*1.1)
plt.xticks([0, 180, 360])
plt.title("확률밀도함수")
plt.xlabel("$x$ (도)")
plt.ylabel("$p(x)$")
plt.show()
0도에서 180도 사이에 더 화살이 2배 더 잘 박히도록 조작된 원반을 이용하여 복권 번호를 결정하는 문제에서 확률밀도함수 를 구하라.
✏️
미분하면
~0 에서 0
0~180에서 2/540
180~360에서 1/540
360~에서 0
import numpy as np
import matplotlib.pyplot as plt
# Define the x-axis values
x = np.linspace(-10, 370, 400)
# Define the piecewise function
def piecewise_func(x):
if x < 0:
return 0
elif x < 180:
return 2/540
elif x <= 360:
return 1/540
else:
return 0
# Apply the function to the x-axis values
y = [piecewise_func(val) for val in x]
# Create the plot
plt.plot(x, y)
plt.title("Piecewise Function")
plt.xlabel("x")
plt.ylabel("p(x)") # Assuming it's a probability density function
plt.grid(True)
# Display the plot
plt.show()