TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 - 수학 | 통계학>

[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.4) -1

by 기록자_Recordian 2024. 10. 8.
728x90
반응형
★ 시작에 앞서 

 

해당 내용은 '<현대통계학-제6판>, 다산출판사, 2024' 에 나와있는 챕터별 연습문제를 교재를 응용하여 풀이하고, 수학적인 문제에 대한 답변을 파이썬으로 구현해보기 위해 작성하는 글이다.

해당 답변을 구현하는 방식은 답안지 없이 필자가 스스로 구현하는 것이므로, 정확한 (혹은 가장 효과적인) 답변이 아닐 수 있다. 이 글의 목적은 통계학 공부와 파이썬 프로그래밍 언어 공부를 동시에 하고자 함이며, 통계학을 공부하고 싶으신 분들은 해당 교재를 구매하는 것을 추천한다.

또한, 연습문제 번호 및 문제 내용은 필자가 임의대로 작성하였으며, 교재와는 다를 수 있다.

 

잘못된 부분이 있다면 언제든 피드백 부탁 드립니다! 감사합니다


챕터4 주요 개념: 확률, 집합이론, 독립사건과 종속사건, 베이즈정리

 

챕터4 연습문제1

 

Q1. 확률의 정의

 

1) 확률의 개념

▶ 확률의 개념은 오래전부터 사용되어 왔으며, '가능성'이라는 말로 일상생활에 적용되고 있다.

일상 생활에서의 확률의 예: 동전을 던졌을 때 앞면이 나올 가능성, 비가 올 확률 등.

 

개인의 일상생활이나 기업, 기관 등에서도 불확실한 상황 속에서 의사결정을 해야 하는 경우가 많은데,, 확률이론을 이해함으로써 미래의 불확실성을 과학적으로 분석하여 의사결정의 오류를 줄일 수 있다.

또한, 확률은 학문적인 정의로는 미흡하여 과학적으로 확률을 정의하기 위해 상대빈도정의와 동등발생정의의 두 방법을 사용하고 있다.

 

2) 상대빈도정의

어떤 사건이 나타날 확률은 실험을 무한에 가깝게 계속적으로 시행했을 때, 전체 시행횟수에서 그 사건이 나타나는 빈도수를 상대적으로 나타낸 것.

[상대빈도정의에 입각한 확률의 정의 공식]

 

 

3) 동등발생정의

▶ 상대빈도정의에 의해 확률을 정의하면 어떤 사건의 확률을 알기 위해 실험을 무한에 가깝게 반복적으로 시행해야 한다는 문제가 발생한다. 이러한 문제점 때문에 다른 방법으로 확률을 정의할 필요가 있는데, 동등발생정의에 입각한 확률의 정의가 바로 그것이다.

동등발생정의는 어떤 실험이나 관찰의 결과로 나타날 수 있는 모든 경우들이 각각 동일한 가능성을 가지고 발생할 것이라는 가정하에서 특정 사건 A가 일어날 확률을 정의한 것이다.

동등발생정의에 입각한 확률은 나타날 수 있는 모든 경우 중에서 어떤 특정 경우가 차지하는 비율과 같은 의미를 갖는다. (확률=비율)

[동등발생정의에 입각한 확률의 정의 공식]

 

Q2. 확률 용어

 

1) 조건부확률(conditional probability)

▶ 어떤 사건이 일어난 또는 일어날 조건하(변화된 표본공간)에서 어떤 사건이 일어날 확률.

 

2) 독립사건(independent event)

처음에 어떤 결과가 나왔느냐 하는 것이 다음에 어떤 사건이 발생할 확률에 아무 영향을 주지 않을 경우, 이때 이 두 사건을 독립사건이라고 한다.

그와 반대로 조건부확률처럼 한 사건의 발생이 다음에 발생할 사건에 영향을 주는 경우를 종속사건(dependent event)라고 한다.

[종속사건의 곱셈법칙]

[독립사건의 곱셈법칙]

 

 

3) 배타적 사건

한 사건이 발생하면 다른 사건이 일어날 수 없을 때 이 두 사건을 상호배타적이라고 한다. 한 사건이 발생하면 다른 사건이 일어날 수 없을 때 이 두 사건을 상호배타적이라고 한다.

 

배타적 사건의 예.

주사위의 점이 1 또는 2가 나올 확률을 구할 때, 주사위의 점이 1이 나온다는 것은 2가 나오지 않는다는 것이며, 2가 나온다는 것은 1이 나오지 않는다는 것을 의미한다.

 

4) 베이즈정리(Bayes' theorem)

▶ 사전에 알고 있는 정보에 기준을 두고 어떤 사건이 일어나게 될 확률을 계산하는 이론. 확률법칙을 응용하는 대표적인 방법.

 

5) 곱셈법칙

▶ 사건 A와 B가 동시에 일어날 확률은 사건 A가 일어날 확률과 사건 A가 일어난 다음 사건 B가 일어날 확률을 곱한 것과 같다는 의미. 집합이론에서 교집합의 개념에 대응되는 확률.

 

6) 덧셈법칙

▶ 상호 배타적이고 독립적인 두 개 이상의 사건이 결합될 확률을 계산하는 데 사용.

 

확률의 덧셈법칙의 일반식

그러나, 두 사건이 서로 배타적 사건일 때는 

 

두 사건이 동시에 일어나면 곱하고, 동시에 일어나지 않으면 더한다.


챕터4 연습문제2

 

Q. 다음의 확률을 계산하라

1) 1개의 주사위를 2회 던졌을 때 1이 계속해서 나올 확률

#1개의 주사위를 2회 던졌을 때 1이 계속해서 나올 확률
import random

# 보다 정확한 확률을 위해 시뮬레이션 횟수를 늘린다
trials = 1000000
successes = 0

for _ in range(trials):
    # 주사위를 두 번 굴린다
    roll1 = random.randint(1, 6)
    roll2 = random.randint(1, 6)
    
    # 두 주사위가 1일 확률
    if roll1 == 1 and roll2 == 1:
        successes += 1

# 확률 계산 및 출력
probability = successes / trials
print(f"확률: {probability:.4f}")

 

2) 2개의 주사위를 동시에 던졌을 때 나온 수가 같을 확률

# 2개의 주사위를 동시에 던졌을 때 나온 수가 같을 확률
import random

# 보다 정확한 확률을 위해 시뮬레이션 횟수를 늘린다
trials = 1000000
successes = 0

for _ in range(trials):
    # 주사위를 두 번 굴린다
    roll1 = random.randint(1, 6)
    roll2 = random.randint(1, 6)
    
    # 두 주사위가 같은 숫자일 확률
    if roll1 == roll2 :
        successes += 1

# 확률 계산 및 출력
probability = successes / trials
print(f"확률: {probability:.4f}")

 

3)  1개의 주사위를 3회 던졌을 때 1이 한 번만 나올 확률

# 1개의 주사위를 3회 던졌을 때 1이 한 번만 나올 확률
import random

# 보다 정확한 확률을 위해 시뮬레이션 횟수를 늘린다
trials = 1000000
successes = 0

for _ in range(trials):
    rolls = [random.randint(1, 6) for _ in range(3)]
    if rolls.count(1) == 1:
        successes += 1

# 확률 계산 및 출력
probability = successes / trials
print(f"확률: {probability:.4f}")

 

4) 2개의 주사위를 동시에 던졌을 때 나온 수의 합이 6이하가 될 확률

# 2개의 주사위를 동시에 던졌을 때 나온 수의 합이 6이하가 될 확률
import random

# 보다 정확한 확률을 위해 시뮬레이션 횟수를 늘린다
trials = 1000000
successes = 0

for _ in range(trials):
    # 두 개의 주사위
    roll1 = random.randint(1, 6)
    roll2 = random.randint(1, 6)
    
    # 두 주사위의 합이 6이하일 확률
    if roll1 + roll2 <=6 :
        successes += 1

# 확률 계산 및 출력
probability = successes / trials
print(f"확률: {probability:.4f}")

 

5) 3개의 주사위를 동시에 던졌을 때 1, 2, 3의 수가 나올 확률

# 3개의 주사위를 동시에 던졌을 때 1, 2, 3의 수가 나올 확률
import random

# 보다 정확한 확률을 위해 시뮬레이션 횟수를 늘린다
trials = 1000000
successes = 0

    # 세 개의 주사위
for _ in range(trials):
    rolls = [random.randint(1, 6) for _ in range(3)]
    if sorted(rolls) == [1, 2, 3]:
        successes += 1

# 확률 계산 및 출력
probability = successes / trials
print(f"확률: {probability:.4f}")

챕터4 연습문제3

 

Q. 항아리 안에 15개의 바둑돌이 들어 있는데, 이 중 10개가 하얀 돌이고 5개가 검은 돌이다. 다시 넣지 않고 바둑돌을 하나씩 꺼낼 때 세 번째에 처음으로 검은 돌이 나올 확률은?

 

[조건]

첫 번째, 두 번째는 무조건 흰돌이 뽑혀야 한다.

세 번째는 무조건 검은돌이 뽑혀야 한다.

각 회차가 진행될수록 돌은 하나씩 줄어든다.

# 항아리에서 세번째에 검은 돌이 나올 확률
import random

white = 10 #white는 1
black = 5 #black은 2

# 돌의 총 개수(리스트로 생성, 1: 흰색돌, 2:검은돌)
stones = [1] * white + [2] * black

# 보다 정확한 확률을 위해 시뮬레이션 횟수를 늘린다
trials = 1000000
successes = 0

for _ in range(trials):
    # 각 시도의 돌 개수 목록 복사
    available_stones = stones.copy()

    # 3개 돌 뽑기 시뮬레이션 : 하나씩 뽑을 때마다 남은 개수는 1씩 감소
    picks = [available_stones.pop(random.randint(0, len(available_stones) - 1)) for _ in range(3)]

    # 세번째 돌이 검은돌인지 체크
    if picks[2] == 2 and picks[0] == 1 and picks[1] == 1:
        successes += 1

# 확률 계산 및 출력
probability = successes / trials
print(f"확률: {probability:.4f}")

 

- 돌 목록: 흰 돌 10개(1)와 검은 돌 5개(2)로 15개의 돌 목록을 생성.
- 팝 기능: pop()을 사용하여 돌을 당기는 시뮬레이션을 수행 시, 선택한 돌이 목록에서 제거된다.
- 무작위 선택: 세 번의 추첨에서 각각 무작위 인덱스를 선택하여 나머지 스톤에서 스톤을 제거.


챕터4 연습문제4

 

Q. 시험을 치른 전체 학생 중에서 국어합격자는 50%, 영어합격자는 60%며, 두 과목 모두 합격한 학생은 15%라고 한다. 이때 임의로 한 학생을 뽑았을 경우, 이 학생이 국어시험에 합격한 학생이라면 영어시험에도 합격했을 확률은?

P(A)=0.50 (50% 국어합격자)
P(B)=0.60 (60% 영어합격자)
P(A∩B)=0.15 (15% 두 과목 모두 합격자)

# 어떤 학생이 국어시험에 합격했을 경우, 영어시험에도 합격했을 확률

P_A = 0.5 #국어 시험 합격 확률
P_B = 0.6 #영어 시험 합격 확률
P_A_and_B = 0.15 # 두 과목 모두 합격 확률

#결과 출력
P_A_given_B = bayes_theorem(P_A, P_A_and_B, P_B)

print(f"국어 시험에 합격했을 때 영어시험에도 합격했을 확률: {P_A_given_B:.4f}")


챕터4 연습문제5

 

Q. 밤중에 머리가 아파서 불을 켜지 않은 채 서랍에서 상비약을 꺼내 먹었다. 얼마 후 심한 두통 때문에 병원에 갔더니 의사가 약물중독이라고 한다. 서랍에서는 아스피린이 든 병이 2개, 페니실린이 든 병이 1개 있었는데, 일반적으로 아스피린으로 약물중독이 일어날 확률은 5%고, 페니실린으로 인한 약물중독은 80% 라고 한다. 그러면 그가 페니실린을 먹었을 확률은?

  • 사전확률- 아스피린: 2/3, 페니실린: 1/3
  • P(A): 약물 중독 확률
  • P(B): 페니실린 복용 확률
  • P(B∣A): 약물 중독이 발생했다고 가정할 때 페니실린을 복용했을 확률
  • P(A∣B): 페니실린을 복용한 경우 약물 중독 확률 (80% or 0.80).
  • P(A∣aspirin): 아스피린을 복용한 경우 약물 중독 확률 (5% or 0.05).
# 페니실린을 먹었을 확률

A = 2 # 아스피린
B = 1 # 페니실린
medicine = A + B

P_A = A / medicine # 아스피린 복용 사전 확률
P_B = B / medicine # 페니실린 복용 사전 확률
P_A_B = 0.8 # 페니실린 복용으로 인한 약물 중독 확률
P_A_A = 0.05 # 아스피린 복용으로 인한 약물 중독 확률

P_B_A = (P_A_B * P_B) / ((P_A_B * P_B) + (P_A_A * P_A))


print(P_B_A)

필자가 만든 코드는 위의 베이즈 정리 공식을 비교적 직관적으로 정리하여 만들었다.

 

위 코드와 챗GPT를 활용해, 베이즈 정리를 함수 형식으로 사용하여 약물 중독 시 페니실린을 복용할 확률을 계산하는 코드를 생성하였다.

# 페니실린을 먹었을 확률(보완)

def bayes_theorem(P_A_B, P_B, P_A_A, P_A):
    # 페니실린 복용이 약물 중독에 영향을 끼쳤을 확률 계산
    P_B_A = (P_A_B * P_B) / ((P_A_B * P_B) + (P_A_A * P_A))
    return P_B_A

# 데이터
A = 2  # 아스피린 약병
B = 1  # 페니실린 약병
medicine = A + B  # 약병의 총합

P_A = A / medicine  # 아스피린 복용 사전 확률
P_B = B / medicine  # 페니실린 복용 사전 확률
P_A_B = 0.8  # 페니실린 복용으로 인한 약물 중독 확률
P_A_A = 0.05  # 아스피린 복용으로 인한 약물 중독 확률

# 함수를 사용하여 확률 계산
result = bayes_theorem(P_A_B, P_B, P_A_A, P_A)
print(f"페니실린 복용이 약물 중독에 영향을 끼쳤을 확률: {result:.4f}")


다음 내용

 

[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.4) -2

★ 시작에 앞서 ★ 해당 내용은 ', 다산출판사, 2024' 에 나와있는 챕터별 연습문제를 교재를 응용하여 풀이하고, 수학적인 문제에 대한 답변을 파이썬으로 구현해보기 위해 작성하는 글이다.해

puppy-foot-it.tistory.com

 

 

728x90
반응형