티스토리 뷰
프로젝트 동기
평소처럼 왁굳형의 유튜브를 봤는데 한 팬치가 몬티홀의 역설을 우왁끼에 올려서 왁굳형과 팬치들이 이 문제에 대해 열심히 토론하는 영상이 올라왔다. 영상에서 열심히 토론한 몬티홀의 역설은 다음과 같다.
세 개의 문 중에 하나를 선택하여 문 뒤에 있는 선물을 가질 수 있는 게임쇼에 참가했다. 한 문 뒤에는 자동차가 있고, 나머지 두 문 뒤에는 염소가 있다. 이때 어떤 사람이 예를 들어 1번 문을 선택했을 때, 게임쇼 진행자는 3번 문을 열어 문 뒤에 염소가 있음을 보여주면서 1번 대신 2번을 선택하겠냐고 물었다. 참가자가 자동차를 가지려 할 때 원래 선택했던 번호를 바꾸는 것이 유리할까?
작성자는 이 역설 문제의 답이 2/3라고 했는데 정말 답이 맞는지 구글링해 본 결과 위키백과에 조건부 확률과 베이즈 정리를 이용하면 문 뒤에 자동차가 있을 확률을 구할 수 있다고 한다. 하지만 확통을 배우지 않은 평범한 고2인 나로선 이해할 수가 없고(시간 날 때 꼭 공부해야겠다. 인공지능을 위해서라도!) 왁굳형도 이해하는데 꽤나 큰 시간을 소모하였다. 그래서 내 부족한 머리를 위해서 "만약 저게 진짜로 자동차를 고를 확률이 2/3이라면 컴퓨터에게 위와 같은 전제의 상황을 매우 많이 실행하도록 하면 큰 수의 법칙에 의해 자동차를 고를 확률이 2/3으로 수렴하지 않을까?"와 같은 생각을 하였다. 그래서 바로 Visual Studio Code를 켜고 코드를 써 내려갔다.
프로젝트 진행
프로젝트는 다음과 같은 전제 상황을 가정했다.
- 세 개의 중 한 문에는 자동차가, 나머지 문에는 염소가 있다.
- 참가자가 문 하나를 골랐을 때, 진행자는 나머지 문 중 염소가 있는 문 하나를 보여준다.
- 참가자는 무조건 보여진 문을 제외한 나머지 문으로 선택을 번복한다.
따라서 다음과 같은 순서로 코드를 짰다.
- 문 뒤에 자동차와 염소 초기화
- 참가자가 세 문중 하나 선택
- 염소 하나 공개
- 선택을 나머지 하나로 교체
다음은 시각화를 했다. 몬티홀 문제는 쉽게 빨리 짰는데, 시각화에서 막혀서 밤을 새우게 되었다. 중간 과정들이 너무나 영양가 없고 매우 지루하며 짜증 났기 때문에 결론만 얘기하자면 celluloid 모듈에서 Camera를 가져와 매 반복마다 matplotlib 그래프의 그래프를 그리고 camera.snap()으로 스크린샷을 찍었다. 그리고 camera.animation()으로 그 스크린샷을 다 이어 붙이고 plt.show()로 plot을 띄운 후 직접 촬영을 하였다. 정말 열 받는 게 camera.animation()까지는 알아보고 10분 만에 다 짰었는데, animation.save('파일명') 명령어가 계속 오류를 내서 계속 돌고 돌았었다. 그래도 비록 문제를 우회해서 해결했지만 해결한건 해결한거기 때문에 뿌듯하다.
프로젝트 결과
다음의 GIF는 플롯을 500번 반복했을 때 다음과 같은 막대그래프가 그려졌다. 500번만 반복했는데도 확률이 2/3에 수렴하는 것을 확인할 수 있다.
큰 수의 법칙을 위해 더 많이 반복할 때 위와 같이 플롯을 계속 그리면 프로그램이 느려지기 때문에 플롯을 그리지 않고 1,000,000번 반복한 결과 참가자가 차를 고를 확률은 0.66695로 거의 2/3으로 확률이 수렴한 것을 볼 수 있다.
진행한 프로젝트의 코드는 내 깃허브에서 볼 수 있다.
https://github.com/ProWiseman/Monty-Hall-Problem
얻은 점
matplotlib으로 애니메이션 만들기
아쉬웠던 점
이번에 GIF를 처음 그려봤는데 문제의 본질을 해결하지 못하고 우회해서 풀었기 때문에 그 점이 아쉬웠다.
Reference
https://www.youtube.com/watch?v=9ZJf2M6ZoGU (몬티홀의 역설을 아십니까? - 왁굳의 노가리)
https://ko.wikipedia.org/wiki/%EB%AA%AC%ED%8B%B0_%ED%99%80_%EB%AC%B8%EC%A0%9C (몬티홀 문제 - 위키백과)
https://cafe.naver.com/steamindiegame ([펌글과 유머] 몬티홀 확률 역설 - 우왁끼)