야구 AI 만드는법, 기록 덕후가 직접 굴려봤더니 보인 진짜 이야기

얼마 전 경기 중계를 보다가 7회 무사 1루에서 번트를 댈지 강공으로 갈지 두 해설위원의 의견이 갈리는 장면을 봤다. 그때 문득 이런 생각이 들었다. 내가 가진 기록표와 경기 로그만으로도 비슷한 판단을 해주는 야구 AI를 만들 수 있지 않을까. 승패를 맞히는 점쟁이 같은 도구가 아니라, 상황별 확률과 선수 흐름을 같이 읽어주는 기록 파트너 말이다.
야구 AI는 거창한 기계보다 좋은 질문에서 시작된다
야구 AI 만드는법을 이야기할 때 가장 먼저 정해야 할 건 모델 이름이 아니라 질문이다. “누가 이길까”보다 “이 타자는 지금 좌완 변화구에 얼마나 흔들리는가”, “이 투수는 80구 이후 장타 허용 위험이 얼마나 커지는가” 같은 질문이 훨씬 쓸모 있다. 야구는 한 경기 안에 수십 번의 작은 선택이 쌓이는 종목이라, AI도 그 작은 선택을 읽는 쪽으로 설계해야 재미가 살아난다.
예를 들어 승부 예측 AI를 만든다면 입력값은 단순 승률표로 끝나지 않는다. 선발투수 최근 5경기 이닝, 불펜 소모량, 팀의 최근 7경기 득점권 타율, 홈과 원정 성적, 상대 전적, 수비 실책 흐름까지 붙어야 한다. 반대로 타자 분석 AI라면 타구 속도, 발사각, 스트라이크존별 헛스윙률, 초구 스윙 비율, 병살 위험 같은 변수가 더 중요해진다. 같은 야구 AI라도 목적이 다르면 필요한 기록이 완전히 달라진다.
데이터는 많을수록 좋지만, 아무 숫자나 넣으면 흔들린다
야구 기록은 겉으로 보면 숫자의 천국이다. 타율, 출루율, 장타율, OPS, ERA, WHIP, K/BB, WPA처럼 볼 게 끝도 없다. 그런데 AI에 넣을 때는 숫자의 성격을 나눠야 한다. 시즌 누적 기록은 안정적이지만 최근 컨디션을 늦게 반영하고, 최근 5경기 기록은 생생하지만 표본이 작아 요동친다. 그래서 둘을 같이 쓰는 방식이 좋다.
- 기본 데이터: 날짜, 팀, 구장, 선발 라인업, 투수, 타순
- 선수 데이터: 타율, 출루율, 장타율, 삼진률, 볼넷률, 좌우 상대 성적
- 상황 데이터: 이닝, 점수 차, 주자 위치, 아웃카운트, 투구 수
- 흐름 데이터: 최근 7일 타격감, 불펜 등판 간격, 연승·연패, 이동 거리
여기서 중요한 건 기록을 그대로 믿지 않는 태도다. 어떤 타자가 최근 10타수 5안타라면 좋아 보이지만, 그 안타가 모두 빗맞은 내야안타라면 이야기가 달라진다. 반대로 12타수 1안타라도 강한 타구가 계속 야수 정면으로 갔다면 다음 경기 기대치는 나쁘지 않을 수 있다. 야구 AI가 팬보다 나아지려면 결과 기록과 과정 기록을 같이 봐야 한다.
처음 만드는 모델은 승부 예측보다 상황 판단이 쉽다
처음부터 경기 승패를 맞히려 들면 금방 답답해진다. 야구는 1경기 단위 변수가 너무 크다. 에이스가 6이닝 1실점으로 버텨도 8회 불펜이 무너질 수 있고, 잘 맞은 타구 3개가 모두 잡히면 타선 평가는 삐끗한다. 그래서 초보자에게는 작은 상황 예측 모델이 더 적합하다.
가장 만들기 좋은 건 득점 확률 모델이다. 예를 들어 무사 1루, 1사 2루, 2사 만루 같은 base-out 상황마다 그 이닝에 몇 점이 날 가능성이 있는지 계산한다. 데이터가 충분하다면 무사 1루에서 평균 0.8점, 1사 2루에서 평균 0.7점처럼 기대득점을 만들 수 있다. 그러면 번트가 정말 득점 확률을 올렸는지, 아니면 한 점 승부라는 말에 가려진 손해였는지 숫자로 따져볼 수 있다.
그다음 단계는 선수별 보정이다. 같은 무사 1루라도 타석에 장타형 4번 타자가 서 있는지, 병살 위험이 높은 땅볼형 타자가 서 있는지에 따라 선택은 달라진다. 여기서 AI는 감독의 감을 대체한다기보다, 감이 놓치기 쉬운 과거 패턴을 옆에서 보여주는 역할을 한다. 솔직히 이 부분이 제일 재밌다. 중계를 보며 “왜 번트지?”라고 말하던 순간에, 내 모델은 “득점 기대값은 조금 내려가지만 1점 이상 낼 확률은 올라간다”처럼 더 입체적인 답을 줄 수 있다.
실전 제작 흐름은 수집, 가공, 학습, 검증이다
야구 AI 만드는법을 작업 순서로 풀면 꽤 명확하다. 먼저 경기 로그를 모은다. 최소 단위는 경기 결과가 아니라 타석 결과다. 누가 던졌고, 누가 쳤고, 몇 회였고, 주자는 어디 있었고, 결과가 무엇이었는지가 한 줄에 들어가야 한다. 그다음 선수 기록과 팀 기록을 붙인다. 이 과정을 제대로 해두면 모델은 절반쯤 만들어진 셈이다.
1단계: 예측할 목표를 하나로 좁히기
처음에는 “다음 타석 출루 여부”, “해당 이닝 득점 여부”, “선발투수 6이닝 이상 소화 여부”처럼 답이 분명한 목표가 좋다. 목표가 흐리면 데이터도 흐려지고, 결과 해석도 흔들린다.
2단계: 기록을 경기 언어로 바꾸기
AI는 OPS라는 숫자만 보고 맥락을 자동으로 이해하지 않는다. 최근 30타석 OPS, 좌완 상대 OPS, 득점권 OPS처럼 나눠줘야 한다. 투수도 마찬가지다. 시즌 ERA 하나보다 최근 3경기 평균 투구 수, 초구 스트라이크 비율, 볼넷 이후 피장타율 같은 값이 특정 상황에서는 더 날카롭다.
3단계: 단순한 모델로 먼저 비교하기
처음부터 복잡한 딥러닝으로 갈 필요는 없다. 로지스틱 회귀, 랜덤포레스트, 그래디언트 부스팅 같은 모델로도 충분히 출발할 수 있다. 중요한 건 예측률 숫자 하나에 취하지 않는 것이다. 예측 정확도가 62%라도 인기 팀 경기만 잘 맞히고 접전 상황을 계속 놓친다면 블로그 글감으로는 오히려 약하다. 어디서 맞고 어디서 틀렸는지를 보는 게 기록 팬에게 더 맛있는 부분이다.
검증은 냉정하게, 해석은 야구답게 해야 한다
모델이 잘 돌아가는지 보려면 과거 데이터로 시험해야 한다. 예를 들어 2024년까지의 기록으로 학습하고 2025년 경기 일부를 맞혀보는 식이다. 학습한 경기와 평가할 경기를 섞어버리면 AI가 야구를 이해한 게 아니라 답안지를 본 셈이 된다. 스포츠 데이터에서 이 실수는 생각보다 흔하다.
검증할 때는 단순 적중률만 보면 부족하다. 승률 55% 팀을 매번 이긴다고 찍으면 꽤 맞아 보이지만, 그건 AI라기보다 인기 예상표에 가깝다. 그래서 확률 보정이 중요하다. AI가 70%라고 말한 경기 100개 중 실제로 70개 안팎이 맞는지 봐야 한다. 90%라고 자신 있게 말했는데 절반만 맞으면, 그 모델은 분석가가 아니라 허세가 센 계산기다.
블로그에 쓸 때도 이 지점이 매력적이다. “AI가 맞혔다”보다 “AI는 왜 이 장면에서 강공을 골랐나”가 더 좋은 이야기다. 예를 들어 8회 1점 뒤진 무사 1루에서 희생번트보다 강공을 추천했다면, 타자의 최근 20타석 장타율, 상대 불펜의 볼넷률, 다음 타자의 병살 확률까지 이어서 설명할 수 있다. 숫자가 장면을 설명하고, 장면이 다시 숫자를 살린다.
팬이 만드는 야구 AI의 재미는 완벽함보다 관찰력에 있다
전문 구단 수준의 시스템을 개인이 똑같이 만들기는 어렵다. 구단은 트래킹 데이터, 선수 컨디션, 내부 리포트까지 가진다. 하지만 팬이 만드는 야구 AI도 충분히 가치가 있다. 공개 기록만으로도 경기 전 프리뷰, 선발 매치업 비교, 불펜 피로도 차트, 타자별 약점 리포트 정도는 만들 수 있다. 오히려 팬 블로그에서는 이런 접근이 더 잘 먹힌다. 너무 거창한 예측보다 “이 팀이 왜 6회 이후 약해졌는지”를 숫자로 풀어내는 글이 오래 읽힌다.
내가 추천하는 첫 프로젝트는 팀별 불펜 피로도 지표다. 최근 3일 등판 투수 수, 연투 여부, 전날 투구 수 20개 이상 투수, 마무리 투수 휴식일을 점수화하면 경기 후반 흐름을 읽는 데 꽤 도움이 된다. 여기에 상대 타선의 7회 이후 OPS를 붙이면, 단순히 “불펜이 불안하다”가 아니라 “오늘은 8회가 승부처일 가능성이 크다”는 식의 문장이 나온다.
야구 AI는 결국 야구를 덜 보게 만드는 도구가 아니라 더 자세히 보게 만드는 도구에 가깝다. 숫자가 모든 걸 말해주지는 않지만, 그냥 지나쳤던 장면을 다시 보게 만든다. 2구째 파울 하나, 80구 이후 직구 구속 1.5km 하락, 전날 28구를 던진 셋업맨의 몸짓 같은 것들이 경기의 언어로 들리기 시작한다. 그 순간부터 AI는 차가운 예측기가 아니라, 기록지를 옆에서 같이 넘겨주는 꽤 든든한 동료가 된다.
