★ 시작에 앞서 ★
해당 내용은 '<현대통계학-제6판>, 다산출판사, 2024' 에 나와있는 챕터별 연습문제를 교재를 응용하여 풀이하고, 수학적인 문제에 대한 답변을 파이썬으로 구현해보기 위해 작성하는 글이다.
해당 답변을 구현하는 방식은 답안지 없이 필자가 스스로 구현하는 것이므로, 정확한 (혹은 가장 효과적인) 답변이 아닐 수 있다. 이 글의 목적은 통계학 공부와 파이썬 프로그래밍 언어 공부를 동시에 하고자 함이며, 통계학을 공부하고 싶으신 분들은 해당 교재를 구매하는 것을 추천한다.
또한, 연습문제 번호 및 문제 내용은 필자가 임의대로 작성하였으며, 교재와는 다를 수 있다.
잘못된 부분이 있다면 언제든 피드백 부탁 드립니다! 감사합니다
챕터 5 주요 개념
- 확률변수(random variable): 일정한 확률을 가지고 발생하는 사건에 수치를 부여한 것. (보통 X로 표시)
- 확률분포(probability distribution): 어떤 확률변수가 취할 수 있는 모든 값들과, 이에 대응하는 각각의 확률을 정의해 놓은 것.
<동전을 두 번 던질 때의 앞면이 나올 확률분포>
확률변수(Xi) | P(Xi) |
0 | 1/4 |
1 | 1/2 |
2 | 1/4 |
- 이산확률변수(discrete random variable): 확률변수가 취할 수 있는 값의 수가 유한하거나 무한하더라도 셀 수 있는 확률변수
▶ 이산확률변수의 확률분포: 이산확률분포 (주로 사용되는 분포: 이항분포)
- 연속확률변수(continous random variable): 확률변수가 취할 수 있는 값이 일정한 구간 내의 실수로서 그 수가 무한한 확률변수 ▶ 연속확률변수의 확률분포: 연속확률분포 (주로 사용되는 분포: 정규분포)
- 확률함수(probability function): 확률변수가 취할 수 있는 수치에 대해 그 수치에 해당하는 확률값이 얼마인지를 알려주는 함수 (또는 확률밀도함수(probability density function))
▶ 연속확률분포의 양상을 나타내는 곡선을 식으로 표현한 것.
[연속확률분포의 특징]
- 연속확률분포에서 어느 한 특정값 Xi가 발생할 확률 P(Xi)=0 이다.
- 연속확률분포에서의 확률은 어떤 특정한 두 값, 즉 일정가군 사이의 값을 취할 확률로 계산된다.
- 확률밀도함수는 언제나 음이 아닌 값을 갖는다.
- 확률밀도함수 아래에 있는 전체의 면적은 언제나 1이다.
- 기댓값(expected value): 확률변수가 취할 수 있는 모든 값들의 평균이라는 의미를 가진다.
ex) 어느 회사의 하루 매출액이 1000만 원이 될 확률: 50%, 500만 원이 될 확률 50% > 기댓값: 750만 원
[기댓값의 연산]
- 확률변수 X에 일정한 상수 a를 곱한 확률변수의 기댓값은 확률변수 X의 기댓값에 a를 곱한 것과 같다.
- 확률변수 X에 일정한 상수 b만큼을 가감한 확률변수의 기댓값은 확률변수 X의 기댓값에 b를 가감한 것과 같다.
- 위의 두 가지 결과를 결합하면 다음 식이 성립된다. E(aX ± b) = a * E(X) ± b
- 결합확률분포(joint probability distribution): 두 개 이상의 확률변수가 관련된 확률분포
- 주변확률분포(marginal probability distribution): X와 Y의 결합분포에서 X 또는 Y의 어느 하나만의 확률분포. 결합확률분포의 주변(margin)에 표시된다.
- 공분산(covariance): 두 확률변수의 분포가 결합될 때 그 결합확률분포의 분산을 측정하는 것. Cov(X, Y)로 표시.
계산식▶ Cov(X, Y) = E[[X-E(X)][Y-E(Y)]] = E(XY)-E(X)*E(Y)
챕터5 연습문제1
Q. 어느 기업에서 포장용 원두커피를 생산하고 있는데, 그 원두커피의 용량을 조사하여 본 결과 그 비율이 아래와 같다. 이를 토대로 포장용 원두커피(X)의 기댓값, 분산, 표준편차를 각각 구하라
용량(Xi) (단위: ml) | P(Xi) |
340 | 0.2 |
360 | 0.6 |
380 | 0.2 |
기댓값 E(X): 사건에 대한 값과 사건이 일어날 확률을 곱한 것을 모두 더한 값
분산(Var): 확률변수 X의 단위에 제곱을 한 값
표준편차: 분산의 제곱근
# 포장용 원두커피
import numpy as np
x = np.array([340, 360, 380]) # 값
p = np.array([0.2, 0.6, 0.2]) # 확률
# 기댓값
e_x = np.sum(p*x)
# 분산:각 값에서 기댓값을 뺀 제곱에 확률을 곱한 값들을 모두 더한 값
var = ((340 - e_x)**2 * 0.2) + ((360 - e_x)**2 * 0.6) + ((380 - e_x) **2 * 0.2)
# 표준편차
std = var **0.5
print('기댓값:', e_x) # 기댓값
print('분산:', var)
print('표준편차:', std)
해당 코드를 통하여 답을 얻어냈으나, 위와 같이 X의 값이 더 많아질 경우를 생각해보면 분산을 구하는 코드에 개선이 필요해보인다. 이러한 경우, for 문을 이용하여 보다 효율성을 높이는 게 좋다고 보여져 코드를 개선한다.
import numpy as np
# 값과 확률 배열
x = np.array([340, 360, 380]) # 값
p = np.array([0.2, 0.6, 0.2]) # 확률
# 기댓값 계산
e_x = 0 # 기댓값 초기화
for i in range(len(x)):
e_x += p[i] * x[i]
# 분산 계산
var = 0 # 분산 초기화
for i in range(len(x)):
var += p[i] * (x[i] - e_x) ** 2
# 표준편차 계산
std = var ** 0.5
# 출력
print('기댓값:', e_x)
print('분산:', var)
print('표준편차: {:.4f}'.format(std))
챕터5 연습문제2
다음 표는 논술시험점수(X)와 수능시험점수(Y)에 따라 모 대학에 합격할 확률이 어느 정도인가를 결합확률분포로 작성한 것이다.
Xi(논술) | Yi(수능) | 280 | 300 | 320 | 340 |
70 | .00 | .00 | .02 | .08 | |
80 | .00 | .03 | .03 | .10 | |
90 | .02 | .05 | .06 | .15 | |
100 | .05 | .06 | .10 | .25 |
1) X와 Y의 주변확률은?
# 대학 합격 결합확률분포
import numpy as np
import pandas as pd
# 논술 점수 (X_i)와 수능 점수 (Y_i)
Xi = [70, 80, 90, 100]
Yi = [280, 300, 320, 340]
# 결합확률 분포 테이블
joint_prob = np.array([[0.00, 0.00, 0.02, 0.08],
[0.00, 0.03, 0.03, 0.10],
[0.02, 0.05, 0.06, 0.15],
[0.05, 0.06, 0.10, 0.25]])
# DataFrame으로 변환
df_joint_prob = pd.DataFrame(joint_prob, index=Xi, columns=Yi)
# 논술 점수(X)의 주변확률 구하기 (열 합계)
marginal_X = df_joint_prob.sum(axis=1) # axis=1은 열방향
# 수능 점수(Y)의 주변확률 구하기 (행 합계)
marginal_Y = df_joint_prob.sum(axis=0) # axis=0은 행방향
# 출력
print("논술 점수의 주변확률 (P(X)):")
print(marginal_X)
print("수능 점수의 주변확률 (P(Y)):")
print(marginal_Y)
위의 이미지를 통해 주변확률의 계산법을 이해하면 된다.
논술점수 70점의 주변확률은 해당 행의 모든 확률을 더해주면 되고,
수능점수 280점의 주변확률은 해당 열의 모든 확률을 더해주면 된다.
2) X와 Y의 기댓값과 분산은?
# 기댓값 계산
e_X = 0 # 논술 점수 기댓값
e_Y = 0 # 수능 점수 기댓값
# 논술 점수의 기댓값 계산 (iloc 사용)
for i in range(len(Xi)):
e_X += marginal_X.iloc[i] * Xi[i]
# 수능 점수의 기댓값 계산 (iloc 사용)
for i in range(len(Yi)):
e_Y += marginal_Y.iloc[i] * Yi[i]
# 출력
print('논술 점수의 기댓값:', e_X)
print('수능 점수의 기댓값:', e_Y)
기댓값: 각 논술(또는 수능) 점수에 그 주변확률을 곱한 후, 모두 더해 기댓값을 구한다.
분산:
# 분산 계산
var_X = 0 # 분산 초기화
var_Y = 0 # 분산 초기화
# 논술 점수의 분산
for i in range(len(Xi)):
var_X += marginal_X.iloc[i] * (Xi[i] - e_X) **2
# 수능 점수의 분산
for i in range(len(Yi)):
var_Y += marginal_Y.iloc[i] * (Yi[i] - e_Y) **2
print('논술 점수의 분산:', var_X)
print('수능 점수의 분산:', var_Y)
[전체 코드]
import numpy as np
import pandas as pd
# 논술 점수 (X_i)와 수능 점수 (Y_i)
Xi = [70, 80, 90, 100]
Yi = [280, 300, 320, 340]
# 결합확률 분포 테이블
joint_prob = np.array([[0.00, 0.00, 0.02, 0.08],
[0.00, 0.03, 0.03, 0.10],
[0.02, 0.05, 0.06, 0.15],
[0.05, 0.06, 0.10, 0.25]])
# DataFrame으로 변환
df_joint_prob = pd.DataFrame(joint_prob, index=Xi, columns=Yi)
# 논술 점수(X)의 주변확률 구하기 (행 합계)
marginal_X = df_joint_prob.sum(axis=1) # 행의 합계 (P(X))
# 수능 점수(Y)의 주변확률 구하기 (열 합계)
marginal_Y = df_joint_prob.sum(axis=0) # 열의 합계 (P(Y))
# 기댓값 계산
e_X = 0 # 논술 점수 기댓값 초기화
e_Y = 0 # 수능 점수 기댓값 초기화
# 논술 점수의 기댓값 계산 (iloc 사용)
for i in range(len(Xi)):
e_X += marginal_X.iloc[i] * Xi[i]
# 수능 점수의 기댓값 계산 (iloc 사용)
for i in range(len(Yi)):
e_Y += marginal_Y.iloc[i] * Yi[i]
# 분산 계산
var_X = 0 # 분산 초기화
var_Y = 0 # 분산 초기화
# 논술 점수의 분산
for i in range(len(Xi)):
var_X += marginal_X.iloc[i] * (Xi[i] - e_X) **2
# 수능 점수의 분산
for i in range(len(Yi)):
var_Y += marginal_Y.iloc[i] * (Yi[i] - e_Y) **2
# 출력
print("논술 점수의 주변확률 (P(X)):")
print(marginal_X)
print("\n수능 점수의 주변확률 (P(Y)):")
print(marginal_Y)
print('\n논술 점수의 기댓값:', e_X)
print('수능 점수의 기댓값:', e_Y)
print('\n논술 점수의 분산:', var_X)
print('수능 점수의 분산:', var_Y)
챕터5 연습문제3
Q. 어느 기업에서는 A와 B의 두 가지 기술개발 방안을 검토하고 있다. A 방안에 대해 투자한 경우의 예상 수익을 X, B 방안에 대해 투자한 경우의 예상 수익을 Y라고 할 때, 각 경우의 확률이 아래와 같이 추정된다면, 두 방안 중 어느 쪽이 더 수익이 높을 것으로 기대되는가?
X | P(X) | Y | P(Y) |
-100 | 0.4 | -100 | 0.5 |
100 | 0.4 | 200 | 0.3 |
200 | 0.2 | 400 | 0.2 |
import numpy as np
import pandas as pd
# A 방안의 수익과 확률
x = [-100, 100, 200]
p_x = [0.4, 0.4, 0.2]
# B 방안의 수익과 확률
y = [-100, 200, 400]
p_y = [0.5, 0.3, 0.2]
# A 방안의 기댓값 계산
e_x = 0 # 기댓값 초기화
for i in range(len(x)):
e_x += p_x[i] * x[i]
# B 방안의 기댓값 계산
e_y = 0 # 기댓값 초기화
for i in range(len(y)):
e_y += p_y[i] * y[i]
# 출력
print('A 방안의 기댓값:', e_x)
print('B 방안의 기댓값:', e_y)
# 수익 비교
if e_x > e_y:
print('A 방안이 더 수익이 좋다')
else:
print('B 방안이 더 수익이 좋다')
다음 내용
'[파이썬 Projects] > <파이썬 - 수학 | 통계학>' 카테고리의 다른 글
[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.6)-2 (0) | 2024.10.11 |
---|---|
[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.6)-1 (5) | 2024.10.10 |
[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.4) -2 (3) | 2024.10.08 |
[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.4) -1 (0) | 2024.10.08 |
[개발자를 위한 수학] 선형대수학: 고유 벡터와 고윳값 (2) | 2024.10.07 |