인공지능관련/인공지능(AI)

여론조사와 몬테카를로

학위논문통계 2016. 5. 2. 12:18




세일즈 맨 문제 푸는 방법을 더 자세히 알고 싶으면

    

 

Emile Aarts & Kan Korst의 Simulated Annealing and Boltzmann Machines: A Stochastic Approach to Combinatorial Optimization and Neural Computing

  

  

SUN에서 만든 java가 처음 나왔을 때 제가 신기해서 제 개인 홈페이지에 이 simulated annealing 알고리즘을 적용하여 java로 짠 적이 있습니다. 클릭하면 임의의 50개 도시의 좌표가 찍어지고 또 클릭하면 가장 짧은 경로를 찾는 단계를 웹에서 보여 줍니다. 순식간에 기가 막히게 잘 찾아 갑니다.

  

  

  


  

말 많은 여론조사 문제를 한번 살펴보죠. 새누리와 더 민주 2개 정당만 있다고 가정하죠.

  

  

여론조사시 1000명 조사하였다고 하고 새누리 지지를 h라 하면 더 민주 지지는 1-h가 되겠죠. 정확하게 h를 정의하면 선거날 투표장에 나가서 새누리를 지지할 확률이 되겠죠. 여론조사시 1000명 중 새누리 지지한 사람 수를 X라 하면 더 민주 지지하는 사람 Y=1000-X가 되겠고요.

  

  

그럼 X, Y가 나올 가능성은 일반적으로 여론 조사 대상자 수가 n이라 하면

  

  

f(x;h)=nCx*(h)^x*(1-h)^(n-x)

  

  


가 됩니다. 여론조사 대상자가 1000명이고 새누리 지지한 사람이 600명이면

  

  

f(600;h)=1000C600*(h)^600*(1-h)^400

  

  

이 됩니다, 여기서 우리가 모르는 진짜 새누리 지지율 h를 추정한다는 것이죠. 이건 통계 주류중의 주류인 UMVE 주장하는 사람이나 아니면 주류 중 비주류인 MLE 주장하는 사람이나 h=X/n 이라 나옵니다. 즉 h를 추정한 값이 600/1000=0.6 즉 새누리당 지지가 60%라 이야기하고 이 값은 우리 일반인의 상식과 부합됩니다. 그래서 이론적으로 큰 문제가 없다는 것이죠.

  

  

그런데 왜 문제가 생기는 것인가? 여론조사시 집전화로 하고 집전화 받는 사람들이 새누리당 지지자가 더 민주 지지자 보다 훨씬 많다는 것이죠. 그래서 여론조사 데이터 X, Y가 원래 지지율 h와 (1-h)에서 온 것이 아니라 (h+c), (1-h-c)에서 왔다는 것이죠. 저는 이 c가 약 5%와 10% 사이에 있다고 봅니다. 제가 선거 관련된 일을 한 적이 없어 어느 정도 확신을 가지고 이야기는 못하겠지만 느낌에 그 정도 될 것이라 보입니다.

  

  

베이지안 방법은 모수, 즉 이 문제에서는 진짜 새누리 지지율 h에 대한 사전 지식을 활용하는 것입니다. 이게 논리적으로 맞습니다. MLE의 문제가 어디 있는지 이제부터 이야기를 하겠습니다.

  

  

앞의 X, Y가 나올 확률분포를


f(x;h)=nCx*(h)^x*(1-h)^(n-x)

  

  

이고 주류통계학에서 쓰는 표시입니다. 제가 주장하는 것은 f(x;h)로 쓰면 안되고 f(x|h)로 써야 한다는 것이죠. 즉 베이지안에서는

  

  

f(x;h)=f(x|h)

 


이렇게 생각해야지 베이지안 이론을 이해할 수 있습니다. 주류 통계학에서는 이런 사실을 숨기기 때문에 베이지안을 전혀 이해를 못하는 것이죠. 이 f(x;h)=f(x|h)는 데이터 x가 관찰되기 전에 주어진 h 값에서 x가 관찰된 확률이고 우리가 해야 하는 추론은 데이터 x가 관찰되었을 때 모르는 수 h의 확률입니다. 즉 f(h|x)입니다. 그러나 MLE에서는 f(x|h)=f(h|x)라 생각하고 사용한다는 것이죠. 이건 논리적으로 황당한 이야기입니다.

  

  

Pr(A|B)와 Pr(B|A)와는 전혀 다른 것이죠. 기초통계학에서도 나오는 것을 이 주류 통계학에서는 계속 이런 황당무계한 방법론이 옳다고 지금까지 우기고 있는 것이죠. 예를 들어 비가 올 때 우산을 가지고 나갈 확률과 우산을 가지고 나왔을 때 비가 올 확률은 느낌상 매우 비슷합니다. 그래서 사람들이 많이 착각을 하는 것이고요.

  

  

그러나 이런 예를 들어 보죠. 핸드폰을 사용하였을 때 사람이 사망할 확률하고 사람이 사망하였을 때 핸드폰을 사용하였을 확률하고는 완전히 다른 것이죠. 이건 이미 개콘에서 유머로 사용한 적이 있습니다. 전에 방송에서 게임하는 사람의 폭력성을 실험한다고 PC방에서 들어가 갑자기 불을 끈 적이 있는데 이런 코메디 같은 방송을 한 것도 이 조건부 확률을 제대로 이해를 못해서인 것이죠.

 

  

  

즉, 우리가 해야 하는 것은 모수 h가 주어질 때 데이터 x가 관찰될 확률이 아니라 데이터 x가 관찰하였을 때 h가 나올 확률분포를 알아야 한다는 것이죠.

  

  

그럼

  

  

f(h|x)=f(x,h)/f(x)=f(x|h)*f(h)/f(x)

  

  

가 되고 앞의 nCx와 맨 마지막에 있는 f(x)는 별 의미가 없습니다. 오르지 n와 x만의 함수이기 때문에 실제로는 n과 x 값이 들어가 실제는 어떤 숫자에 불과하고 우리가 알고자 하는 h의 확률분포와는 아무런 관계가 없습니다. 따라서 위 식을 간단히 하면


 

f(h|x)=f(x|h)*f(h)=(h)^x*(1-h)^(n-x)*f(h)=h^600*(1-h)^400*f(h)

  

  ==> 위의 수식 수정했습니다.

뒤에 붙이는 f(h)를 prior라 하고 모수 h에 대한 사전확률분포라 합니다. 또 f(h|x)를 사후확률 분포라 하고요. 통상 이 이항분포에서는 사전확률분포에는 베타 분포를 사용합니다. 이를 B(a, b)라 하죠. 이 베타 분포는 두 개의 모수 a, b를 가지고 있고 실제 계산할 때 이 a와 b를 또 추정해야 합니다. 베타분포의 수식은 복잡하지만 이 a, b의 값을 추정하면 문제는 수학적으로 쉽게 풀어집니다. 베이지안 책이나 수리통계책에 다 나옵니다.

  

  

앞에서 이야기한 스탠포드 정치학과 교수인 jackman이라는 교수가 한 예를 들어 보겠습니다. 이 교수가 쓴 책이 있는데 여기에 나오는 예입니다. 2000년도 미국 대선시 플로리다 주에 부시와 고어의 지지율을 조사한 여론조사 내용입니다. n=509에 부시 지지자 x=207명으로 나왔습니다(실제조사를 약간 변형한 것입니다. 부시와 고어와 기타 지지자들도 있거든요). 그리고 h에 대한 사전확률분포에 베타분포 B(a, b)를 적용하였습니다. 아래 그림은 베타 분포입니다 그런데 a, b를 어떻게 추측한 것일까요?





  

  

이전에 플로리다 주 대선에서 나온 공화당 민주당 지지율 정보가 있을 거라는 것이죠. 공화당 지지율 r에 대해서 시간 t별로 회귀분석을 하여 2000년도 대선에서 공화당 지지율을 예측하였습니다. 이건 회귀분석 이론에 나오는 것입니다. 그래서 다음과 같은 수식을 세워서 a와 b를 풀어내었습니다.





 

 

 

 그럼

   

 

f(h|x)=f(x|h)*Beta(a,b)

  

   여기서


f(x|h)=h^207*(1-h)^(509-207)

f(h)=Beta(a,b)

=(Gamma(a+b)/Gamma(a)*Gamma(b))*h^(a-1)*(1-h)^^(b-1)

=(Gamma(253+262)/Gamma(253)*Gamma(262))*h^(253-1)*(1-h)^(262-1)

    

 

그래서

  

  

f(h|x)=f(x|h)*f(h)=h^(207+253-1)*(1-h)^(509-207+263-1)

  

  

이 되고 이 함수가 최대가 되는 h 값을 찾으면 이 값이 베이지안이 추정하는 2000년 미국 대선에서 플로리다에서 부시의 지지율입니다.

  

  

이 내용은 jackman 책에 자세히 있는데 구글 검색하면 전반부 밖에 내용이 없고 후반부는 MCMC 같은 것을 설명한 것 같은데 이 부분은 없네요. 자세히 알고 싶은 분은 교보에 검색해서 사시면 됩니다. 저는 방학때 구입해서 뒷 부분을 볼까 합니다.

 

  

  

어럽게 생각할 필요없이 이번 대선에서 새누리 대선 후보와 더 민주 대선후보 둘 만 있다고 하죠. 그래서 현재 서울지역에서 여론조사를 한다는 것이죠. 그럼 이 여론조사 결과만 갖고 다음 대선 지지율을 추정하기는 좀 그렇죠. 그럼 우리가 어떻게 하는가? 기존에 서울지역에서 새누리당 대선 후보 지지율이 변하는 것을 쭉 본다는 것이죠. 그래서 이번 대선에서 새누리당 대선 후보 지지율을 어느 정도 예상을 한다는 것이죠. 거기에 이번에 조사한 여론조사 결과와 결합해서 이번 대선 서울에서 새누리당 대선 후보의 지지율을 추정한다는 것입니다.

  

  

이쪽에서는 사전확률분포가 중요하고 여론조사는 사전확률분포을 업데이트하는 과정으로 봅니다. 즉 인공지능의 학습이랑 마찬가지입니다. 알파고 때문에 학습한다는 것이 굉장한 것처럼 이야기하는데 별 것 아닙니다. 여론조사가 계속 되면 계속 업데이트 되는 단계로 보고 우리의 인식도 그렇게 변하잖아요. 학습이라는게 별 것 아니라는 것이죠.

 

  

  

이 Jackman 이라는 스탠포드 정치학과 교수가 한 방법을 한국에 그대로 적용할 수 있을까요? 저는 아니라고 보고요. 일단 Jackman 방법은 여론조사 데이터 X가 원래 모집단의 공화당 지지율 h에서 왔다고 보는 것이거든요. 즉 여론조사 방법론에서는 큰 문제가 없다고 보는 것이죠. 그런데 이상한게 미국이나 다른 나라에서는 여론조사에서 별 문제가 없나요. 우리만 왜 이렇게 시끄럽죠.

  

  

그러나 우리의 경우 여론조사시 데이터 X가 새누리당 진짜 지지 h에서 온 것이 아니라 h+c, 즉 5%이나 10% 이상 과잉 평가된 지지율에서 온 것이라는 것이죠. 그래서 여론조사 데이터는


 

f(x|h)=(h+c)^x*(1-h-c)^(n-x)

 

  

  

에서 왔다고 보는 것이 맞다고 봅니다. 따라서 h에 대한 사전확률뿐 아니라 c에 대한 사전확률 분포도 고려해야 한다고 봅니다. 심플하게 하면

  

  

 

f(h|x)= (h+c)^x*(1-h-c)^(n-x)*Beta(a,b)*Uniform[0.05, 0.10]

  

  

이런 모양이 우리나라 현실에서는 더 타당하다고 봅니다. 여기서 저는 c의 사전확률분포를 Uniform[0.05, 0.01]이라 봤습니다. 평균이 0.075인 정규분포로 가정해도 되고요.

  

  

그럼 여론조사에서 n이 정해지고, x가 정해지면 jackman이 한 것 처럼 a, b를 추정하여 위 f(h|x)에 집어 넣습니다. 그런데도 수학적으로 f(h|x)가 최대가 되는 점이 잘 풀어지지 않는다면 이 분포에서 표본을 만 개나 십만개를 뽑아내 극빈값이나 평균 값을 구해내면 됩니다. 우리가 하고자 하는 작업의 종류가 이런 종류의 일입니다.

 

  

  

그럼 지난번 이야기한 몬테카를로 이야기를 계속 해 나가죠.

 

  

  

지난번의 이야기를 조금 더 진행해보죠. 로또가 공정하게 진행되었다는 이야기는 0부터 9까지 숫자로 무작위로 잘 나왔다는 이야기입니다. 완벽하지는 않지만 로또가 공정하지 알려면 지금까지 나온 숫자의 분포를 알아보면 됩니다. 지금까지 나온 숫자의 확률이 0.1에 가깝다면 로또가 공정하고 특정 숫자가 나올 확률이 0.1보다 크면 뭔가 조작이나 아니면 로또 숫자 뽑는 과정에서 뭔가 문제가 있다는 것이죠. 만약 숫자가 0,1,2,3 네 개밖에 없다고 생각하죠. 그럼 지금까지 나온 숫자의 확률이 0.3, 0.2. 0.4, 0.1이라 하죠. 0이 나올 확률이 0.3, 1이 나올 확률이 0.2, 2가 나올 확률이 0.4, 3이 나올 확률이 0.1 이렇다는 것이죠.

  

  

그럼 이렇게 무작위로 나오지 않고 특정 수가 선호되어 나올 확률이 높을 경우 로또의 당첨 확률을 올리는 방법이 있을가요? 예 있습니다. 위의 분포에서 숫자를 뽑아내면 됩니다. 그런데 어떻게 뽑아낼 수 있을까요? 바로 역함수 개념을 사용하면 됩니다. 먼저 누적확률분포를 구합니다. 즉 확률값을 계속 누적하여 더해 갑니다. 그럼 아래 표 처럼 되겠죠.


 

 

0

1

2

3

확률분포

0.3

0.2

0.4

0.1

누적확률분포

0.3

0.5

0.9

1.0



이걸 그래프로 그립니다. 그럼 아래처럼 계단형 그래프가 됩니다. 그리고 0과 1 사이에서 무작위 수를 뽑아냅니다. 예를 들어 랜덤 넘버 Y=0.721로 나왔다고 하죠. 그럼 역함수처럼 반대로 x 값을 찾아가면 됩니다. 이를 inverse 방법이라 이야기 합니다. 아래 그림을 참조하시고요




 그래서 처음 몬테카를로 정의에서 균둥한 분포에서 값을 뽑아내는 것이라 했는데 이젠 그 정의가 좀 확대되어 꼭 균등분포가 아니라도 어떤 확률적 룰을 가지고 컴퓨터를 데이터를 뽑아내어 뭔가를 했다면 몬테카를로 방법으로 했다고 합니다. 통상 어떤 확률분포에서 표본추출했다고 하죠. 

 

  

  

그럼 이 쉬운 방법이 있는데 왜 자꾸 골치 아픈 방법을 사용할까요? 앞에서 이야기 했지만 우리의 생각과 달리 우리의 수학 해결 능력이 떨어집니다. 예를 들어 국민 분포라고 이야기할 수 있는 정규분포를 생각해보죠. 위의 방법을 적용하려면 정규분포식을 적분해야 누적확률분포를 만들어야 합니다. 그러나 아직도 이 정규분포를 적분하는 방법을 모릅니다. 이 정규분포를 -무한대에서 +무한대까지 적분하면 확률 1이 되어야 하는데 이것 증명조차도 쉽지 않습니다. 좌표 전환하여 트릭을 씁니다. 수리 통계 시험문제에 잘 나오죠.

  

  

그래서 이 분포에서 데이터를 뽑아내는 이야기를 조금 더 하겠습니다.

 

  

  

  아래는 위 로또의 정확한 누적확률분포 그림입니다.


 

   

Y 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

0

1

2

3

X