군더더기 없는 기계학습 백과사전

조건부 확률을 파이썬에서 사용해보자 본문

Machine Learning/통계이론 훑어보기

조건부 확률을 파이썬에서 사용해보자

Jay김 2020. 5. 2. 23:37

필자는 여러분이 조건부 확률 관련 수학 문제는 굉장히 많이 풀어봤을 것이라고 생각한다. 그러나 실생활에서 당장 사용하는 예는 많이 접해보지 못했을 것이다. 해당 글에서는 단순한 가짜 데이터를 만들어 온라인 웹사이트에서 연령층 별로 구매한 수 데이터에서 조건부 확률을 도출해내는 예를 다뤄보도록 하겠다.

일단 10,000명의 데이터를 생성하도록 하겠다. 이를 연령층 별로 저장하기 위해서 딕셔너리(dictionary)를 이용한다. 랜덤 기능을 사용하기 위해서 Numpy 패키지에서 random을 가져온 뒤 고정된 결과를 보기 위해 seed를 0으로 설정하겠다. 

from numpy import random
random.seed(0)

연령층인구수 = {20:0, 30:0, 40:0, 50:0, 60:0, 70:0} 
구매량 = {20:0, 30:0, 40:0, 50:0, 60:0, 70:0}
전체구매량 = 0 

다음 코드 블록에서는 for 반복문을 이용해 10,000명의 데이터를 생성한다. 여기서 임의로 각 연령층 별 구매 확률을 연령층의 나이 구간으로 정하도록 한다. 예를 들어 20대라면 구매 확률이 20%다.

for _ in range(100000):
    연령층 = random.choice([20, 30, 40, 50, 60, 70])
    구매확률 = float(연령층) / 100.0
    연령층인구수[연령층] += 1
    if (random.random() < 구매확률):
        전체구매량 += 1
        구매량[연령층] += 1

알고리즘은 다음과 같다.

  1. 랜덤으로 소비자의 20대 와 70대 사이의 연령을 선택한다.
  2. 구매 확률을 구한다.
  3. 연령층인구수 딕셔너리에 소비자 카운트를 1 올린다.
  4. random.random()으로 0과 1 사이의 값을 생성해 구매 확률보다 작은지 확인한다.
  5. 만약 4. 에서 확인한 사실이 참이라면 소비자가 웹사이트에서 물건을 구매한 것으로 판단하고 전체구매량 카운트와 해당 연령층의 구매량 카운트를 1 올린다.

이렇게 10,000명의 소비자 데이터를 임의로 생성했다. '연령층', '구매확률', '연령층인구수' 변수들을 직접 명령 프롬트에 써서 내용물을 확인해보도록 하자. 각 연령층은 동일한 확률로 생성되었으므로 수가 비슷하고, 연령대가 높을수록 구매 확률이 올라가므로 자연스럽게 연령층이 높을수록 구매량이 더 높을 것이다.

이제 데이터를 이용해 여러가지 확률들을 계산해보도록 하자. 당신이 30대라는 사실이 주어졌을 때 웹사이트에서 물건을 구매할 확률은 무엇일까?

일단 당신이 30대일 확률부터 구해보자. 이는 단순히 10,000명 중 30대의 인구수다.

P30대 = float(연령층인구수[30])/10000.0

당신이 30대이고 물건을 구매할 확률은 얼마일까? 30대의 구매량을 전체 인구수로 나눈다.

P30대및구매 = float(구매량[30])/ 100000.0

자 이제 조건부 확률을 구하도록 한다. P(30대 및 구매)를 P(30대)로 나누면 코드 블록 두 번째 줄의 코드와 동일한 수치가 나오는 것을 확인할 수 있다. 두 번째 줄의 코드도 당신이 30대라는 사실이 주어졌을 때 물건을 구매할 조건부 확률을 구하고 있다. 그렇다. 이는 30대 중에서 물건을 구매한 사람 비율과 동일하다.

print(P30대및구매 / P30대)
print(float(구매량[30])/float(연령층인구수[30]))

여기에 더해 당신이 30대일 확률과 당신이 물건을 구매할 확률이 독립 사건인지 확인할 수도 있다. 우리는 이미 두 번째 코드 블록에서 연령층 소속에 의해 소비자의 구매 확률이 정해지도록 설정했기 때문에 두 사건이 독립 사건이 아니라는 것을 알고 있다. 그러나 만약 그런 사실을 모르고 있고 데이터가 우리가 생성한 것이 아니라면 우리는 다음 코드 블록에서 나오는 수치를 통해 독립 사건 여부를 확인해 볼 수 있다. 만약 당신이 30대일 확률과 당신이 물건을 구매할 확률이 독립 사건이라면 해당 수치는 P30대및구매 변수와 동일한 수치로 나올 것이다. 

P구매확률 = float(전체구매량)/10000.0
print(P30대*P구매확률)

이 뿐만 아니라 두 사건이 독립 사건이라면 당신이 30대라는 사실이 주어졌을때 물건을 구매하는 조건부 확률도 P(30대)*P(구매확률)/P(30대)라는 정의에 의해 약분을 하면 P(구매확률)과 동일하므로 당신이 물건을 구매할 확률과 동일해야 할 것이다. 

[Copyright ⓒ 블로그채널 무단전재 및 재배포 금지]

Comments