Playground 시리즈는 프로젝트나 실패에 대한 부담 없이, 자유롭게 하고 싶은 데이터 분석을 해본 일지입니다.
상세 코드 :
https://github.com/swtaktak/playground/blob/main/chess_play/chess_game_analysis.ipynb
도입
이번 Playground는 하나의 영상에서 시작됩니다.
https://youtu.be/c7J4-t1-J0Y?si=lM_oqj3dEcoWslIQ
최근에 저는 체스를 배우기 시작했습니다. 아직 대인전을 해본 적은 없지만 쉬운 봇 몇 개 정도 도움 없이 이길 수 있는 정도의 실력입니다. 즉, 아직 체린이일 뿐이지만 새로운 취미로 즐기고 있습니다.
그런데, 굉장히 흥미로운 영상을 보았습니다. 경기만 보고, "두 플레이어의 평균 레이팅"을 맞히는 게임을 진행하는 영상입니다. 체스에 대해서 잘 모르지만 그냥 굉장히 과정 하나하나가 흥미로웠습니다.
그런데, 저는 데이터 분석가입니다. 과연 수많은 체스 경기를 학습시켜 모델을 만든다면 저의 모델은 체린이인 저 대신에 이 문제를 해결할 수 있을까요? 일단 도전해봅시다!
추가 질문들
저는 체린이입니다. 하지만 체스계에는 수많은 고수들, 그리고 중수들도 있습니다. 일단 저는 중수라도 되고 싶은 다음으로 추가 몇 가지 질문을 던져볼 수 있겠습니다.
- 내가 플레이하게 될 체스닷컴에서 플레이어들의 레이팅 분포는 어떻게 될까?
- 레이팅별로 선호하는 오프닝에 차이가 있을까? 고수는 정말 어려운 오프닝을 사용할까?
- 레이팅별로 선호하는 첫 수가 있을까? 고수는 정말로 특이한 수를 두고 초보는 이상한 수를 둘까?
데이터 확인하기
chess.com api도 존재합니다. 물론 이거로 데이터를 받아올 수 있지만, Kaggle에 정리된 데이터가 있어서 편하게 사용하도록 히겠습니다. (과연 편할까)
Link : https://www.kaggle.com/datasets/adityajha1504/chesscom-user-games-60000-games
우선 데이터가 복잡한데, 기본 컬럼들을 살펴보겠습니다.
- white/black username, white/black id -> 유저의 닉네임, 아이디 입니다.
- white_rating, black_rating -> 두 선수의 레이팅입니다. ELO 방식으로 레이팅을 매깁니다.
- white_result, black_result -> 두 선수의 경기 결과입니다. 추가 설명 부분에서 자세한 설명이 있습니다.
- time_class, time_control -> 시간 관련 규칙입니다. 역시 추가 설명 부분에서 설명드리겠습니다.
- rules : 체스의 규칙입니다. 체스에 특수 규칙이 있나요?
- rated : 레이팅에 반영되는 경기인지, 아닌지 입니다. 사실 분석에는 큰 의미 없어 보입니다.
- fen : 체스 경기가 끝난 시점에서 판의 상황을 나타내는 코드입니다. 최종 지점만 보고는 레이팅을 알 수 없겠네요.
- pgn : 체스 경기 로그 그 자체입니다. 수도 담겨있고, 오프닝도 담겨 있고 각종 정보가 많습니다.
몇몇 변수들을 살펴보겠습니다.
rules
체스닷컴에는 변형 체스가 존재합니다. 가장 아실법한 기본 체스 외에 다양한 변형 체스가 제공되고 있습니다.
몇 가지만 살펴보겠습니다.
chess960은, 일반적인 체스와 다르게 기물의 시작 위치가 달라집니다.
king of the hill은 왕이 가운데 4칸중 1개에 올라가면 승리하는 규칙입니다.
이러한 특수 규칙 체스들은 데이터에서 제외시키겠습니다. 애초에 플레이 양상이 달리지니까요.
time 관련
시간에 대해 살펴보겠습니다. 체스는 시간을 매우 짧게 두고 하는 문화가 존재합니다. 심하면 한 판의 제한시간이 1,2분인 경우도 존재하고 더 짧을수도 있습니다.
https://www.youtube.com/watch?v=GL-uWmw4YMA
이벤트 대국이지만, 이렇게 극단적으로 시간이 다를 수도 있습니다. 물론 3분 vs 30초로 양쪽 모두 다 짧습니다.
그럼 체스닷컴에서는 어떤 모드가 많이 플레이 되었을까요? 위의 데이터에서 차지하는 양을 살펴보죠.
6만건이 넘는데이터 중, 약 3만건에 가까운 경기는 blitz로 진행되었습니다. 그 뒤로는 bullet, rapid, daily 순서입니다.
체스의 경기 시간에 따른 구분
Standard : 제한시간 1시간 이상의 경기를 말합니다.
Rapid : 10분 초과 60분 미만의 경기입니다. 주로 15분 + 10초가 많이 사용됩니다.
Blitz : 제한 시간 10분 이하입니다. 주로 3분 + 2초가 많이 사용됩니다.
Bullet : 제한 시간 3분 미만의 매우 짧은 체스입니다. 보통 1분이 가장 많이 사용됩니다.
혹시라도 궁금하신 분은
https://www.chess.com/ko/blog/chessinside/cecaegpeu-1-sigane-ddareun-gyeonggi-bunryu
글을 읽어보시기 바랍니다.
그럼, 유저들의 실력대는 어느정도일까요? 같은 사람이 중복될 수도 있지만 그들의 레이팅은 계속 변하므로 한 사람의 데이터가 여러 개 있어도 모두 다 세서 분포를 확인해 보았습니다.
대부분 플레이어들의 레이팅은 1000~1500 근처에 있습니다. 2000 이상만 되도 극상위권 같네요, 1500만 돌파해도 상위 25%에 가깝습니다. 2000을 넘어버리는 순간 outlier네요. 반면 심해도 존재하네요.
그런데, 솔직히 1단위로 레이팅을 맞히는 것은 너무 무리 같습니다. 일정 구간을 두고 그 구간의 플레이어들이 게임을 했다는 것을 예측해보기로 합시다.
진짜 도전 과제
https://rankdle.com/games/chess
이 링크에서는 매일 3개의 체스 게임이 주어집니다. 각 경기 결과를 보고 두 선수의 평균 레이팅을 맞추는 것입니다. 단, 두 선수의 레이팅 차이는 200이상 나지 않습니다. 여기서는 평균 레이팅의 구간만 맞히면 정답처리 됩니다.
다음과 같이 총 11개의 구간으로 나눌 수 있습니다. 혹시 모를 100 미만의 심해 오브 심해가 있을 수 있으므로 이를 고려하여 레이팅을 등급으로 변형해서 예측에 사용하겠습니다.
저는 이번 예측 문제에서는 두 사람의 평균 레이팅을 넘어 "백과 흑 각각의 레이팅 구간"을 맞히는 문제로 진행하겠습니다.
유저의 등급 분포를 살펴보겠습니다.
자체적으로 100점 밑으로는 안떨어지게 보정이 있나 봅니다. 그리고 2500 이상은 거의 발견되지 않네요. 10등급 이상은 너무적어 예측에 어려울 수 있다는 부분을 인지해두고 넘어가봅시다.
레이팅별로 주로 사용하는 오프닝이 다르다면 쉬울텐데
그렇다면 오프닝만 보고 백의 레이팅은 맞출 수 있을 것입니다. 그리고 백의 선택에 따라 흑이 오프닝을 결정하는 경우들도 있습니다. 즉 오프닝만 보고 흑,백을 맞힐 수 있겠죠. 근데 무슨 오프닝이죠? 전 체스 오프닝을 잘 몰라요. 하지만 정보가 있습니다.!
pgn 파일 살펴보기
pgn은 다음과 같이 생겼습니다. 우리가 주목해야할 부분은 다음과 같습니다.
1) ECO : 오프닝의 코드입니다. 체스닷컴에서는 플레이에 따라서 무슨 오프닝인지 확인 후 이렇게 코드를 붙여줍니다.
ECO는 오프닝 대백과사전 기준의 코드로, 인터넷에 파일이 있어 해당 파일을 사용하여 오프닝 이름을 알아낼 수 있습니다.
2) 마지막 공백 제외 가장 뒤에 있는 것은 수순입니다. 해당 이벤트는 라이브 체스라서 위와 같은 형태를 띄지만 그게 아닐 경우 시간이 찍히지 않고 수만 표시됩니다. 이를 고려하여 전처리를 진행하겠습니다.
전처리를 위한 사전 지식, 대수기보표기법
체스는 기본적으로 대수 기보 표기법이라는 것을 사용합니다.
기본 아이디어는 기물이 어느 좌표로 움직였는지를 표현하는 방식입니다.
정확한 내용이 궁금하시면 https://ko.wikipedia.org/wiki/%EB%8C%80%EC%88%98%EA%B8%B0%EB%B3%B4%EB%B2%95
몇 가지 기본 사항들만 정리해봅시다.
- 폰을 제외하고 나머지 말들은 대문자로 말의 이니셜을 표시합니다.
- 다른 말을 잡을 경우 (움직인말)x(좌표) 형태로 표현됩니다.
- 체크를 걸 경우, 맨 마지막에 +, 체크메이트 승리일 경우 맨 마지막에 #가 들어갑니다.
- 프로모션 성공시 맨 끝에 =와 승급한 말의 이니셜이 들어갑니다.
- 킹사이드 캐슬링은 O-O로, 퀸사이드 캐슬링은 O-O-O 입니다.
그 외 다양한 경우가 있지만 대표적으로 고려해야 할 사항은 위 정도입니다.
아무튼, 위에서 들어가는 몇몇 특수문자 제외 쓰일 일이 없습니다. 특히, 마침표, %, : 는 쓰일 일이 없습니다.
이 점을 고려하면 쉽게 수순만 가져올 수 있겠네요.
그러면 첫 수도 가져왔고, 오프닝도 가져왔습니다. 정말 첫 수가 잘 담겼을까요?
무언가 이상합니다. 캐슬링이나 체크 등을 처음부터 할 일도 없고 1-0 이런거는 승리 표시입니다. 심지어 첫 수로 불가능한게 너무 많이 보여요. 이거는 데이터의 오류는 아닙니다. 체스 닷컴에서는 이벤트 대국이 있는데, 이는 중간 특정 지점부터 시작하여 최종 지점까지 대국만 가는 일종의 엔드게임 컴페티션도 존재하고, 다양한 예외 상황이 존재합니다. 이를 어떻게 처리할까요?
체스에서는, 첫 수로 가능한 수는 20개입니다. 그 20개가 아니면 모두 예측 및 EDA 대상에서 제외하겠습니다.
이 중 정말 첫수로 많이 채택되는 것은 뒤의 5개 입니다. 나머지 중 일부는 특수 오프닝으로 사용되지만 정말 특수고, 기타로 취급해도 무방합니다.
'e4', 'd4', 'Nf3', 'c4', 'g3'
이 다섯가지와 나머지 기타 6가지 첫 수를 기준으로 백의 레이팅 등급에 따른 사용률을 보겠습니다.
아무튼 시각화 결과나 보여줘
의외로 큰 차이가 없습니다. 뚜렷한 차이가 있을 줄 알았지만, class 10을 빼고는 e4의 채택 비율이 시각적으로만 봐도 거의 비슷합니다. 4의 비중이 높은 class에서 조금 더 커보이지만 유의미해보이지는 않습니다. 시각적으로만 봐도 첫 수로 class를 판단하는 것은 말이 안된다는 것을 알 수 있겠습니다. 실제로도 당연히 그렇고요.
그럼 첫 수보다 조금 더 진행된 오프닝으로는 판단이 가능할까요? 우선 오프닝은 전체 통계를 보겠습니다.
체린이인 저는 각각이 무슨 오프닝인지는 잘 모르겠습니다. 하지만 하나의 오프닝이 차지하는 비중이 굉장히 높습니다.
(제 경험상 e4 - e5로 시작할 때 저런 라벨링이 붙는 경우가 많았습니다.)
한가지 놀라웠던 점은 퀸즈 캠빗이 넷플릭스 이런거 때문에 비중이 높을 줄 알았는데, 생각보다 비중이 낮아서 놀라웠습니다. 그러면, 등급에 따른 오프닝 차이가 심할까요? 스크린샷의 압박이 커서 결과 사진은 생략하겠으나 이 역시 유의미한 차이를 볼 수는 없었습니다. 다만 몇 가지 얻은 인사이트만을 공개하겠습니다.
- Grade 1에서는 Uncommon Opening의 비중이 높습니다. 이는 아마 그정도 낮은 레이팅이면 오프닝의 기본 원칙도 잘 몰라 이상한 수를 둔다는 의미겠죠. 좋은 판단 기준이 될 수도 있겠습니다.
- 매우 높은 레이팅에서는 알래칸 디펜스 등의 이름도 매우 생소한 오프닝이 등장하였습니다. 오프닝의 난이도와 관련된 정보가 있었다면 추가 정보를 보고 싶었지만 아쉽게 그런 정보는 없었습니다.
자세한 정보가 궁금하신 분은 상단에 제가 올린 jupyter notebook을 통해 확인 가능합니다. 해당 노트북에서는 오프닝에 대한 비교 뿐만 아니라 e4 vs d4 등의 다른 비교 자료도 존재합니다. 여기서는 너무 체스 이야기로 빠질까봐 생략합니다.
아무튼, 원래 문제로 돌아오자.
아무튼 우리는 이런 시각화 정보도 중요하지만 결국 레이팅 맞추는게 문제입니다. 오프닝 몇 수나 첫 수 만으로는 레이팅 예측을 불가능해보입니다. 따라서 우리는 좀 더 많은 수를 보고 레이팅을 생각해야 겠습니다. 이후의 예측 과정은 실제 예측 모델링 및 적용이 완료되는 대로 뵙겠습니다.
스포일러를 하나 하자면, 다른 어딘가에서 자주 사용하는 방법론으로 이 문제를 해석할 수 있을 것입니다. 저는 그걸 사용해 볼 것입니다.
2편에서 뵙겠습니다.
'Archive > Playground' 카테고리의 다른 글
[Playground] 이직 예측 모델 만들기 (2) (1) | 2024.02.16 |
---|---|
[Playground] 이직 예측 모델 만들기 (1) (1) | 2024.02.14 |
[Playground] 너의 레이팅이 보여 (2) 레이팅 예측에 도 전 (1) | 2024.02.02 |