일지 - (6) 경기 진행 알고리즘 짜기 - 타자 vs 투수

가장 핵심이 되는 타자와 투수의 맞대결 알고리즘을 짜기에 나섰다.
약 40년을 아우를 수 있는 대결이기에 통계학적 기법인 oz를 사용해야 했다.

필요한 것은 타자와 투수의 개인 출루율과 피출루율, 타자와 투수의 해당연도 리그 평균 출루율, 약 40년의 kbo 통산 리그 평균 출루율이다.

먼저 비교 하려는 투수와 타자의 개인 출루율의 oz를 구했다

batter_oz = batter_obp / (1 - batter_obp)
pitcher_oz = (1 - pitcher_obp) / pitcher_obp

그 후 타자와 투수의 해당 연도 리그 평균 출루율의 oz를 구한다.

batter_league_obp_oz = batter_league_obp / (1 - batter_league_obp)
pitcher_league_obp_oz = (1 - pitcher_league_obp) / pitcher_league_obp

마지막으로, 리그 통산 평균 출루율 oz와 함께 계산하여 두 선수의 출루율(피출루율)을 도출했다.

vs = ((batter_oz / batter_league_obp_oz) / (pitcher_oz / pitcher_league_obp_oz))
* total_league_obp_oz

vs_obp = vs / (1 + vs)

가장 기본적인 알고리즘이 완성되었다. 다음으로는 각 타자의 데이터로 안타, 2루타, 3루타, 홈런, 볼넷을 각 확률로 뽑아내었다.
투수도 땅볼, 뜬공, 삼진을 뽑아내고 싶었지만 특정연도 이전부터는 자세한 데이터가 없기에 33.333확률로 도출할 수 밖에 없었다.

파이썬 random 모듈의 choices를 사용하였다.

hit_kind = ['안타', '2루타', '3루타', '홈런', '볼넷']
run_rate = [hit_one / hit, hit_two / hit, hit_three / hit, home_run / hit, BB / hit]
hit_def = choices(hit_kind, run_rate)

마지막으로 투수를 투구 수에 따른 교체를 위해 한 타석 당 투구 수를 랜덤으로 출력했다. 최대 10개를 던진다고 가정하였고, 볼넷일 시에는 4~10개, 삼진일 시 3~10개, 나머지는 1~10개를 랜덤으로 나오게 하였다.

이제 가장 복잡할 것같고 오랜시간이 걸릴 것 같은 베이스러닝과 스코어링의 알고리즘을 짜야겠다...

좋은 웹페이지 즐겨찾기