더북(TheBook)

2.5.1 가중 평균

여러분은 단순 평균에 대해서는 잘 알고 있을 것입니다. 그렇다면 가중 평균은 무엇일까요? 평균이라고도 하는 단순 평균은 값들에 동일한 가중치를 부여하여 구한 평균입니다. 예를 들어 (10, 20, 30)이라는 값이 있다고 하겠습니다. 총합이 1인 가중치를 세 개의 값에 동일하게 배분하여 곱하면 10 + 20 + 30이 됩니다. 조금 낯설어 보이나요? 그럼 은 어떤가요? 훨씬 익숙한 표현입니다. sum(values)/3으로 값을 모두 더한 후 전체 개수로 나누어 줍니다. 코드로 살펴보겠습니다.

 

In [14]:

values = np.array([10.0, 20.0, 30.0])
weights = np.full_like(values, 1/3) # (1/3)을 반복합니다

print("weights:", weights)
print("via mean:", np.mean(values))
print("via weights and dot:", np.dot(weights, values))
weights: [0.3333 0.3333 0.3333]
via mean: 20.0
via weights and dot: 20.0

 

평균은 가중 합(값과 가중치 곱의 총합)으로 표현할 수 있습니다. 가중치에 변형을 가하면 가중 평균이라는 개념이 됩니다. 동일한 가중치 대신에 가중 평균의 가중치는 우리가 설정할 수 있습니다. 가중치의 합이 1이 되는 경우를 생각해 봅시다. 예제의 세 가지 값에 , , 이라는 가중치를 매겼다고 하겠습니다. 무슨 의미일까요? 이 가중치들은 첫 번째 옵션이 두 번째와 세 번째보다 두 배 중요하다는 것, 그리고 두 번째와 세 번째의 가치는 동일하다는 것을 의미합니다. 또는 확률적 시나리오에서는 첫 번째 옵션의 발생 가능성이 다른 두 가지 옵션보다 두 배 높다는 것을 의미할 수도 있습니다. 이 두 가지 해석은 이러한 가중치들을 단가나 수량에 적용했을 때와 결과가 비슷합니다.

 

In [15]:

values = np.array([10, 20, 30])
weights = np.array([.5, .25, .25])

np.dot(weights, values)

Out [15]:

17.5

한 가지 특별한 가중 평균은 결괏값들이 확률적 시나리오의 결과고, 가중치가 이 결괏값들의 확률인 경우입니다. 이 경우 가중 평균은 결과의 기댓값(expected value)이라고 합니다. 간단한 게임을 예로 들어 보겠습니다. 제가 일반적인 육면체 주사위를 굴려 홀수가 나오면 $1.00를 벌고 짝수가 나오면 $.50를 잃는다고 하겠습니다. 게임의 승패와 승패 확률의 점곱을 구해 봅시다. 제 기대 결과는 다음과 같습니다.

 

In [16]:

# 홀, 짝
payoffs = np.array([1.0, -.5])
probs = np.array([ .5, .5])
np.dot(payoffs, probs)

Out [16]:

0.25

수식으로는 게임의 기댓값을 E(게임) = Σipivi로 표현합니다. 여기에서 p는 사건들의 확률이며 v는 사건들의 결과입니다. 자, 게임을 한 판하면 저는 $1.00를 벌거나 $.50를 잃습니다. 제가 게임을 100판 하면, 약 $25.00(게임당 기대 수익 × 게임 횟수)를 벌 것이라고 기대할 수 있습니다. 실제로 이 게임의 결과는 무작위입니다. 어떤 때는 기댓값보다 수익이 더 높을 수도 있고, 그보다 낮을 수도 있습니다. 그러나 주사위를 100번 던지기 전이라면 $25.00는 제가 할 수 있는 최선의 추측입니다. 100번보다 훨씬 더 많이 게임을 하면, 실제 값은 기댓값에 매우 가까워질 것입니다.

다음은 1만 번을 플레이하는 시뮬레이션 코드입니다. np.dot(payoffs, probs) * 10000으로 결과를 비교해 봅시다.

 

In [17]:

def is_even(n):
    # 2로 나눈 나머지가 0이면 짝수입니다
    return n % 2 = = 0
winnings = 0.0
for toss_ct in range(10000):
    die_toss = np.random.randint(1,7)
    winnings += 1.0 if is_even(die_toss) else -0.5
print(winnings)
2542.0
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.