완벽해 보였던 계획은 왜 실패했나
클로드와 며칠간 대화를 나누며 첫 번째 모델의 구조를 잡았다. 목표는 단순했다. "성공한 외국인 투수들의 공통점이 무엇일까." 구단에서 일할 때도 비슷한 시도를 해본 적이 있다. 내가 구단에 가기전, 본사에서는 이것을 굉장히 심도있게 연구해었다고 한다. Baseball Lab이라는 조직이 있었고, 현재 엔씨 다이노스의 근간이 되는 다양한 연구를 했었다고만 들었다.(현재 그 조직 출신으로 야구단에 남아있는 사람은 단장님 한분 뿐이고, 본사 내에서도 극소수만이 남아있다.) 박사님들께서 해두셨던 그 모델을, 나도 한번 만들어보고 싶었다. 비록 박사는 아니지만 나에겐 클로드라는 박사님이 옆에 있으니까.
16개 특성을 정의했다. 1편에서 간략히 언급했지만, 구체적으로는 다음과 같다.
직구 관련 지표—평균 구속, 최고 구속, 구속 편차, 직구 비율.
전체 구속 통계—평균, 최고, 표준편차.
구종 다양성—구종 개수, 다양성 지수.
로케이션—존 비율, 수평/수직 분포.
무브먼트—수평/수직 움직임의 평균과 편차.
구단 시절에 리포트를 쓸 때 자주 썼던 지표들이다. 9년간 봐온 데이터들을 정리하니 16개로 압축됐다. 여기서 피처를 더 늘릴 경우 모델 자체가 과적합의 오류에 빠질 가능성이 높다고 판단했다.
다음으로 학습 데이터를 구성했다. KBO에서 뛰었던 18명의 성공한 외국인 투수 - 후라도, 페디, 폰세 같은 에이스들 - 들을 선정했다. 방법은 코사인 유사도(Cosine Similarity)였다. MLB 후보와 KBO 투수들 사이의 거리를 계산하고, 가장 가까운 투수를 "가장 비슷한 스타일"로 매칭하는 구조다. 클로드에게 설명하니 금방 코드를 짜줬다. 이론적으로는 완벽해 보였다. 9년 경력이 녹아든 설계라고 자부했다.
1편에서 봤듯이, 첫 번째 테스트 결과는 충격적이었다. 152km/h 강속구 투수 Matt Manning이 146km/h 기교파 후라도와 82.6% 유사하다니. 대체 왜 이런 결과가 나온 걸까? 클로드에게 물었다. "이 결과는 신뢰할 수 없을 것 같다. 매닝은 구속대역에서 후라도와는 상당한 차이를 보일 것이다." 클로드도 데이터를 다시 확인해보겠다고 했다. 뭔가 잘못됐다. 어디서부터 꼬인 건지 찾아야 했다.
유사도 계산 과정을 뜯어보기 시작했다. 16개 특성 각각이 유사도에 얼마나 기여했는지 확인했다. 그리고 문제를 발견했다.
Manning과 후라도가 비슷하다고 판정된 항목을 보니, 구종 개수가 둘 다 6개로 동일했다. 구종 다양성 지수도 0.78과 0.81로 거의 같았다. 존 비율도 45%와 46%로 비슷했다. 반면 직구 구속은 152km/h 대 146km/h로 6km/h 차이가 났고, 삼진율은 22% 대 16%로 6%p나 달랐다. 스타일 자체가 완전히 다른 투수들이었다.
문제가 보였다. 모든 특성에 동일한 가중치를 적용했던 것이다. 구종 개수가 같다는 것과 직구 구속이 6km/h 차이난다는 것이 같은 무게로 취급됐다. 16개 특성 중 2개(구종 개수, 다양성 지수)만 비슷해도 전체 유사도가 크게 올라갔다. 결과적으로 많은 후보군에 대해서 "구종 6개인 투수는 무조건 후라도와 비슷하다"는 웃지 못할 상황이 벌어졌다.
구단에서 일할 때 팀장님이 하시던 말씀이 있었다. "데이터는 우리 팀에 매우 중요합니다. 하지만 최대한 현장을 많이 가 보세요. 우리가 하는 일은 결국 팀이 이기는 방법을 찾는 일입니다." 데이터 팀이 숫자를 보지 않고 현장을 나가보라니. 하지만 실제로 현장에 답이 있는 경우가 많았고, 많은 선수들 코치님들의 인사이트는 결국 개인의 데이터가 경험으로 축적된 것들이라는 점을 다시한번 확인했다. 숫자로 발견하지 못한게 무엇이었을까. 구종 개수가 같다는 건 투수의 핵심 특성이 아니다. 직구 구속이 6km/h 차이나면 그건 완전히 다른 투수다. 하지만 내 모델은 그걸 구분하지 못했던 것이다.
가중치 문제를 고치면 해결될까? 클로드와 함께 가중치를 조정해봤다. 구속에 더 높은 가중치를 주고, 구종 개수는 낮췄다. 결과가 조금 나아졌지만, 여전히 이상한 매칭이 나왔다. 더 근본적인 문제가 있다는 느낌이 들었다. 학습 데이터를 다시 들여다봤다. 18명의 "성공한" 투수. 이게 함정이었다.
1편에서 언급했던 생존자 편향(Survivorship Bias)이 바로 내 모델에서 일어나고 있었다. 성공한 18명만 분석하면 "직구 146km/h 이상이면 성공한다", "구종 다양성이 높으면 성공한다"는 결론이 나온다. 하지만 실패한 투수들도 직구 146km/h 이상이었고, 구종도 다양했을 수 있다. 그 데이터가 없으니 실패 요인을 알 수 없었다. 성공 투수와 80% 유사하다고 해서 80% 확률로 성공하는 게 아니다. 실패한 투수 중에도 80% 유사한 사람이 있을 수 있다.
가중치 문제를 고치면 해결될까? 클로드와 함께 가중치를 조정해봤다. 구속에 더 높은 가중치를 주고, 구종 개수는 낮췄다. 결과가 조금 나아졌지만, 여전히 이상한 매칭이 나왔다. 더 근본적인 문제가 있다는 느낌이 들었다.
문제를 인식하고 접근 방식을 바꿨다. 1편에서 언급한 128 pitcher-seasons 데이터는 이미 수집해뒀지만, 첫 번째 모델에서는 성공한 18명만 학습에 사용했던 것이 문제였다. 이제 전체 데이터를 활용하기로 했다.
128 pitcher-seasons의 구성을 다시 보면, WAR 4.0 이상의 성공한 투수가 36명, WAR 1.0에서 4.0 사이의 "그럭저럭" 투수가 65명, WAR 1.0 미만의 실패한 투수가 27명이었다. 이제 성공과 실패를 모두 학습에 포함시켰다. WAR 9.38의 폰세(2025)부터 WAR -0.9의 맥키니까지.
에이스부터 시즌 중 방출까지, 모든 스펙트럼을 모델에 넣었다.
16개 특성도 문제가 있었다. 클로드와 데이터를 정리하다 보니 명확해졌다.
첫 번째 문제는 구종 분류 불일치였다. MLB에서는 스위퍼라는 구종이 이미 몇년 전부터 구분되어 기록되어 왔지만, KBO에서는 대부분 "슬라이더"로 분류되어 왔다. 그나마 25시즌 어느 순간부터인가 스위퍼라는 구종 분류가 생기기 시작했다. 같은 공인데 이름이 다르다. 커터, 투심, 싱커도 마찬가지. 리그마다 구종 분류 기준이 달랐다. 게다가 내가 문자중계를 통해 가져올수 있는 데이터는 구종, 구속, 릴리스포인트, 그리고 릴리스포인트에서의 속도 가속도값 정도 뿐이었다. Baseball Savant의 데이터와 100%일치하는 데이터를 한국에서는 찾을수 없다는 이야기.
완벽히 들어맞지는 않아도, 물리학적 특성을 활용해서 로케이션, 무브먼트 등에 대해서 어느정도의 근사치를 구할수는 있었다. 이것을 활용해보기로 했다. 그렇다고 해도, 구종의 분류는 너무나도 힘든 일이었다.
해결책은 4개 그룹으로 통합하는 것이었다. Fastball(직구, 투심, 커터, 싱커), Slider(슬라이더, 스위퍼), Curve(커브, 너클커브, 슬러브), Offspeed(체인지업, 스플리터, 포크). 세부 구종 대신 큰 그룹으로 묶어서 비교해 보기로 했다. 물론 세부적인 구종 프로파일이 모두 다르기는 하나, 당장 중요한 것은 '전체적인 특성을 파악하는 것'이지, 선수의 개별 특성까지 파고들어가는 것이 아니었기 때문이다. 데이터 정합성을 맞추려면 추상화 수준을 높여야 한다는 사실은, 본사에 근무하던 시절 많은 도움을 주신 박사님들께 배운 것이었다.
두 번째 문제는 특성 부족이었다. 구속과 무브먼트만으로는 투수를 설명할 수 없었다. 좌타자/우타자별 구종 사용률, 카운트별 전략 같은 투구 패턴이 빠져 있었다. 이것도 구단에서 일할 때 느꼈던 부분이다. 숫자만 보면 비슷해 보이는 투수가 실제로는 완전히 다른 경우가 많다. 모든 투수는 직구와 변화구를 던진다. 단지 상황별로 어떤 공을 던졌느냐가 중요했다.
모델 학습을 위한 피쳐를 16개에서 68개로 확장했다. 구종별 15개 특성을 4그룹에 적용하면 60개, 여기에 좌타자/우타자 상대 구종별 비율 8개를 더했다. 투수를 설명하고자 하는 해상도를 4배 정도 높인 것이다.
데이터를 7배로 늘렸다. 18명에서 128명으로. 특성을 4배로 늘렸다. 16개에서 68개로. 클로드와 함께 코드를 다시 짜고, 모델을 다시 학습시켰다. 결과물을 보는 순간은 항상 기대가 된다.
기대에 차서 예측 모델을 돌렸다. 결과가 나왔다. "Cross-Validation R² = 0.07, RMSE = 1.7 WAR."
R² = 0.07. 모델이 WAR 변동의 7%만 설명한다는 뜻이다. 나머지 93%는 설명하지 못한다. 사실상 랜덤 수준의 예측력이다. 더 많은 데이터, 더 많은 특성을 넣었는데 왜 예측이 안 될까? 그래도 내가 이바닥 20년 짬바의 경력직인데...
일단은 제일 만만한 클로드에게 되물었다. "뭐가 문제지? 모델을 위한 준비는 충분히 했잖아. 데이터도 늘렸고, 특성도 늘렸는데." 클로드도 명확한 답을 주지 못했다. "특성 간 상관관계를 확인해보시겠어요?" "과적합 가능성도 있습니다." 이런 일반적인 제안만 나왔다. 결국 내가 직접 데이터를 들여다봐야 했다.
바이브 코딩을 한지 어언 1년차. AI는 나에게 그동안 신세계를 열어주었지만, 그만큼의 함정도 많이 선사했다.
시키는 일은 기가막히게 잘해준다
전문가적 인사이트도 도움이 많이 된다
창조적인 무언가를 시켰을 때 "진짜 세상이 없는 것"을 "있는 것처럼" 내놓는다.
3번째가 치명적이었다. 중간에 AI가 맥락을 잃고 세상모를 할루시네이션의 세계로 들어섰을 가능성도 충분했다. 어쩔수 없었다. 직접 데이터를 들여다봤다. 구단에서 일할 때처럼. AI센터에서 서비스 기획할 때처럼. 손으로 데이터를 만지다 보면 보이는 게 있다. 때로는 기본으로 돌아가야 한다. 데이터 분석의 기본은 Garbage In, Garbage Out. 내가 고성능 AI에 쓰레기를 집어넣은건 아닐까. 아니면 AI가 중간에 미쳐서 멀쩡한 데이터를 쓰레기로 만든것은 아닐까. 체크해야 했다. 다른 세션을 열어서, csv파일들만 모아두고 공통점을 찾아보고 다른점도 찾아보면서, 결과를 매 단계마다 보고서로 작성해두었다.
그러다 흥미로운 패턴을 발견했다. 구속과 무브먼트가 비슷한데 성적이 완전히 다른 투수들이 있었다.
예를 들어보자. 투수 A와 투수 B가 있다. 둘 다 직구 150km/h, 슬라이더 135km/h. 무브먼트도 비슷하다. 68개 특성으로 보면 거의 쌍둥이처럼 보인다. 그런데 투수 A는 WAR 5.0, 투수 B는 WAR 1.5. 세 배 이상 차이가 난다.
뭐가 다를까? 데이터를 더 뜯어봤다. 투수 A는 초구에 스트라이크를 잘 잡았다. 타자를 몰아붙이는 빈도가 높았다. 2스트라이크 후 결정구 성공률이 높았다. 반면 투수 B는 초구에 볼이 많았다. 유리한 카운트를 만들지 못했다. 2스트라이크 후에도 볼넷을 허용했다.
같은 "무기"를 가지고도 어떻게 사용하느냐에 따라 결과가 완전히 달랐다. 68개 특성은 "무엇을 가졌는가"를 측정했다. 하지만 "어떻게 사용하는가"는 측정하지 못했다. 이게 문제였다. 귤 과육의 크기, 껍질의 색깔, 표면의 상태 등을 체크했지만, 브릭스(당도)는 보지 않은 것이다.
문득 이런 생각이 스쳐갔다. 구속, 무브먼트, 구종. 이건 투수의 "무기"다. 하지만 야구는 무기만으로 이기는 게임이 아니다. 그 무기를 언제, 어떻게 쓰느냐가 중요하다. 구단에서 일할 때 항상 듣던 말들이다. "초구가 중요하다." "2스트라이크 후 결정구가 중요하다." "타자를 몰아붙여야 한다."
이걸 데이터로 잡을 수 있을까? 딥리서치 기능을 활용해 보기로 했다. 구글의 Gemini, Claude, Perplexity까지 내가 활용할수 있는 모든 딥리서치 기능을 이용해서 "투수의 '투구 운용 능력'을 측정할 수 있는 지표가 있을까?" 에 대한 조사를 지시했다. 그중에 가장 유의미했던 것들은 결국 아래 4가지였다.
초구 스트라이크율.
2스트라이크 헛스윙률.
투수유리카운트 비율.
체이스율.
투구의 순서와 상황별 선택을 측정하는 지표들이었다. 나는 이것을
시퀀싱 피처(Sequencing Features)
라고 부르기로 했다. 이걸 추가하면 어떻게 될까? 다음 단계의 실마리가 보이기 시작했다.
"어떻게 던지느냐"를 측정할 수 있는 특성을 찾기 시작했다. 클로드와 함께 시퀀싱 피처를 정의하고, 모델에 추가했다.
그리고 놀라운 일이 벌어졌다.
WAR 예측 모델 성능
━━━━━━━━━━━━━━━━━━
v4 (68개 특성): R² = 0.07
v5.1 (26개 최적화): R² = 0.33-0.39 ← +371% 개선!
특성 개수는 68개에서 26개로 줄었는데, 예측력은 5배 뛰었다. 핵심만 남기니까 오히려 성능이 올랐다. 과적합을 줄이고, 정말 중요한 것만 측정하니까.
그리고 발견한 사실. 구속은 WAR 예측에서 8위에 불과했다. 1위부터 3위까지를 차지한 건 모두 시퀀싱 관련 피처였다. "어떻게 던지느냐"가 "얼마나 빠르냐"보다 2배 이상 중요했다.
**[3편: 핵심 발견 - 시퀀싱의 비밀에서 계속]**