본문 바로가기

수학/확률론

확률분포 정리(1) : 베르누이분포, 이항분포, 카테고리분포, 다항분포

확률분포 : 베르누이분포, 이항분포, 카테고리분포, 다항분포


미래에 또 이해를 못할 수 있을 나를 위해 확률분포를 정리한다...★




1. 베르누이 분포 (Bernoulli Distribution)


a) 베르누이 시행 (Bernoulli Trial)?


결과가 두 가지 중 하나로만 나오는 실험이나 시도를 베르누이 시도(Bernoulli trial)라고 한다. 

: 예를 들어 동전을 한 번 던져 앞면(Head)이 나오거나 뒷면(Tail)이 나오게 하는 것은 베르누이 시행의 일종이다.


b) 베르누이 확률변수(Random Variable)?


: 베르누이 시행 결과를 0 또는 1의 숫자로 바꾼 것을 베르누이 확률변수(Bernoulli variable)이라 하고, 

: 두 값 중 하나를 같는 discrete(딱딱 떨어지는)한 경우다. 
: 즉, 이산확률변수(Discrete random variable)다. --> 확률질량함수(pmf)


c) 베르누이 확률변수의 pmf?

bernoulli distribution (pmf)

 이걸 좀 간단하게 표현하면...

bernoulli distribution (pmf)

d) 베르누이 확률분포의 모멘트


bernoulli distribution (pmf) moment




# 코드로 확인하자 theta = 0.6 # 1이 나올 확률 rv = sp.stats.bernoulli(theta) # 확률변수 생성 type(rv)

scipy.stats._distn_infrastructure.rv_frozen


rv.pmf([0,1])
array([0.4, 0.6])


xx = [0, 1]
plt.bar(xx, rv.pmf(xx), color='g')
plt.xlim(-1, 2)
plt.ylim(0, 1)
plt.xticks([0, 1], ["x=0", "x=1"])
plt.xlabel("표본값")
plt.ylabel("P(x)")
plt.title("베르누이 확률변수의 pmf")
plt.show()


bernoulli distribution (pmf) graph


x = rv.rvs(100, random_state=0) # rvs : 무작위 sampling
x
array([1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0,
       1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1,
       0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1,
       0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
       1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1])



sns.countplot(x) # 각 요소의 갯수를 count해주는 plot plt.title("베르누이 확률변수의 시뮬레이션 결과") plt.xlabel("표본값") plt.show()


bernoulli distribution (pmf) graph in simulation


100개 sampling밖에 안해서 완전히 theta와 동일하지는 않지만,

얼추 비스무리하게 나온다.




2. 이항분포 (Binomial Distribution)



a) 이항분포?


: 베르누이 시행을 N번 시행하는 것이라고 보면 된다. 
: 동전 던지기를 10번 던져서 앞면(1)이 나온 횟수를 확률변수(Random variable)로 둔다.


b) 이항확률변수의 pmf?


: 베르누이 확률변수와 마찬가지로 discrete하기 때문에 pmf로 나타낸다. 


binomial distribution (pmf)


c) 이항확률분포의 모멘트

binomial distribution (pmf) moment


# 코드로 보자 N = 10 # 시행횟수 theta = 0.6 # 앞면이 나올 확률 rv = sp.stats.binom(N, theta) # Random Variable(확률변수) 생성


rv.pmf(np.arange(11)) # 0~10
array([1.04857600e-04, 1.57286400e-03, 1.06168320e-02, 4.24673280e-02,
       1.11476736e-01, 2.00658125e-01, 2.50822656e-01, 2.14990848e-01,
       1.20932352e-01, 4.03107840e-02, 6.04661760e-03])



xx = np.arange(N + 1)
plt.bar(xx, rv.pmf(xx), align="center")
plt.xlabel("표본값")
plt.ylabel("$P(x)$")
plt.title("이항 분포의 pmf")
plt.show()


binomial distribution (pmf) graph

6번이 가장 잘 나온다고 하겠지...theta를 0.6으로 잡았으니까


np.random.seed(0)
x = rv.rvs(100) # 동전 10번 던지기를 100번 해보자
x
array([ 6,  5,  6,  6,  6,  5,  6,  4,  3,  6,  5,  6,  6,  4,  8,  8,  9,
        5,  5,  4,  3,  5,  6,  5,  8,  5,  8,  4,  6,  6,  7,  5,  6,  6,
        9,  6,  6,  6,  4,  5,  7,  6,  5,  8,  5,  5,  7,  8,  7,  7,  6,
        6,  2,  8,  7,  8,  5,  7,  6,  7,  8,  8,  5,  8,  7,  7,  5,  8,
        4,  8,  3,  6,  3,  6,  5,  9,  7,  8,  7,  8,  7,  6,  8,  5,  6,
        7,  6,  8,  6,  4,  7,  5,  8,  5,  7,  7,  6,  9,  5, 10])


sns.countplot(x)
plt.title("이항 분포의 시뮬레이션 결과")
plt.xlabel("표본값")
plt.show()


binomial distribution (pmf) graph in simulation

6번이 제일 많이 나왔다...




3. 카테고리분포 (Categorical Distribution)


a) 카테고리 확률변수?


: one-hot vector로 표현할 수 있다. 
: 예를 들어, 눈이 2인 주사위면이 나왓다고 할때, 이때 카테고리 RV = [0,1,0,0,0,0]이 된다. 
: RV안의 각 원소들은 베르누이 분포를 따르고, 각각 자신들만의 모수를 갖는다는 점을 유의하자.


b) 카테고리 확률변수의 pmf?


categorical distribution (pmf)




c) 카테고리 확률분포의 모멘트?


categorical distribution (pmf) moment



# 코드로 보자
theta = np.array([1/6]*6) # 각각의 모수를 정해준다 : 1/6
rv = sp.stats.multinomial(1, theta)


rv.pmf(np.arange(1,7)) # one-hot으로 넣어줘야한다.
0.0


xx = pd.get_dummies(np.arange(1,7))
rv.pmf(xx.values)
array([0.16666667, 0.16666667, 0.16666667, 0.16666667, 0.16666667,
       0.16666667])



plt.bar(np.arange(1,7), rv.pmf(xx.values), color='orange')
plt.ylabel("P(x)")
plt.xlabel("표본값")
plt.title("카테고리 분포의 pmf")
plt.show()


categorical distribution (pmf) graph



np.random.seed(1)
X = rv.rvs(100)
X[:5]
array([[0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 1],
       [0, 1, 0, 0, 0, 0]])


y = X.sum(axis=0) / float(len(X)) # 위에서 아래로 쭉 더함
plt.bar(np.arange(1, 7), y, color='purple')
plt.title("카테고리 분포의 시뮬레이션 결과")
plt.xlabel("표본값")
plt.ylabel("비율")
plt.show()


categorical distribution (pmf) graph in simulation




4. 다항분포 (Multinomial Distribution)


a) 다항분포?


: 독립적인 카테고리 분포를 여러번 시도하여 나온 횟수 
: 주사위의 각 면이 나온 횟수 
: 두 번 던졌는데, 두 번 모두 눈2가 나왔다 = (0,2,0,0,0,0)


b) 다항분포의 pmf?


$x$는 (0,2,0,0,0,0)와 같은 Vector가 된다.


multinomial distribution (pmf)



c) 다항분포의 모멘트?


: 각 주사위 눈금마다의 평균과 분산, 꼴이 이항분포의 모멘트와 유사하다.


multinomial distribution moment



N = 30
theta = [0.1, 0.1, 0.1, 0.1, 0.3, 0.3] # 각 눈이 나올 확률 지정
rv = sp.stats.multinomial(N, theta) # 다항분포의 확률변수 생성


np.random.seed(0)
X = rv.rvs(100) # 100개의 sampling
X[:5] # 그 중 5개만 보자
array([[ 3,  4,  3,  3,  8,  9],
       [ 3,  3,  5,  6,  6,  7],
       [ 4,  3,  3,  5,  5, 10],
       [ 1,  0,  5,  5, 12,  7],
       [ 7,  4,  2,  3,  5,  9]])


plt.boxplot(X) # 각 눈마다 나온 횟수의 분포를 보기위해 boxplot
plt.title("다항 분포의 시뮬레이션 결과")
plt.xlabel("class")
plt.ylabel("binomial")
plt.show()


multinomial distribution (pmf) graph in simulation