AX 노트 · 측정

퍼즐 게임 첫날 이탈 분석: 기기별 이벤트 순서와 판별 계산으로 찾은 첫 장의 벽 4판

GA4 이벤트를 기기별·분 단위로 줄 세워 멈춘 판을 찾고, 그 판들을 줄부터 지우는 플레이어 모델로 끝까지 계산했습니다. 첫 장 10판 중 4판이 벽이었습니다.

작성 SugarMount 게임 개발 읽는 시간 13분 최종 업데이트

블록 퍼즐 한판블록의 한국 광고 유입 기기 16대 중 7대는 튜토리얼 3판을 마치고 네 번째 판 R004에서 한 판도 풀지 못한 채 기록이 끊겼고, 그중 5대에는 앱 삭제가 찍혔습니다. R013을 넘긴 기록은 1대뿐이었습니다. 판 300개를 "줄이 보이면 지우는" 플레이어 모델로 정확히 계산하자, 첫 장(R004~R013)의 R006·R011·R013은 성공률 0%였고 R012는 끝까지 둘 수 있는 수순 198개 중 이기는 수순이 1개였습니다. 2026-10-17 제출한 1.1.3은 이 네 판을 37~40번째로 옮겼습니다. 다만 가장 큰 무리가 멈춘 R004는 네 판에 들지 않습니다. 그 7대가 난이도 때문에 떠났는지는 이 데이터로 가를 수 없었습니다.

근거: GA4 Data API로 뽑은 한국 광고 유입(2026-10-11~10-16)의 기기별 이벤트 시간표, 게임 저장소의 이탈 분석 문서(2026-10-17)와 커밋 d1f6de1·cc4e860, 단위 테스트 PlayOrderTest. 판별 성공률은 2026-10-23에 같은 팩 파일로 다시 계산해 기록과 대조했습니다.

목차 (11)
  1. 첫 장 10판 중 3판은 줄부터 지우면 이길 수 없었다
  2. 광고 유입 기기 16대의 이벤트를 분 단위로 다시 줄 세웠다
  3. 처음 의심한 광고와 첫 수 힌트는 둘 다 빗나갔다
  4. 등급이 '쉬움'인 판이 벽이 된 이유
  5. 판 순서만 바꾸고 진행 기록은 퍼즐 id로 남겼다
  6. 평균 퍼널 대신 사람별로 다시 읽은 이유
  7. 이 방법이 통하지 않는 조건
  8. 따라 하는 순서
  9. 2026-10-24 추가: 재시험 기준 3개 중 2개 미달
  10. 다음에 확인할 것
  11. 자주 묻는 질문

첫 장 10판 중 3판은 줄부터 지우면 이길 수 없었다

3수 역전은 정해진 판에 조각 3개를 모두 놓아 목표 줄 수 이상을 지우는 퍼즐입니다. 판마다 가능한 모든 순서와 위치를 끝까지 놓아 보고, 플레이어 모델 두 개로 성공 확률을 정확히 냈습니다(표본 추출 없음). "줄우선"은 줄을 지우는 수가 있으면 그중에서, 없으면 아무 수나 고르는 사람입니다. "힌트 뒤"는 첫 수를 정답으로 고정하고 나머지를 줄우선으로 둔 값입니다.

등급 · 판이기는 수순 / 전체줄우선힌트 뒤
쉬움 · R00410 / 21533%100%
쉬움 · R00527 / 43175%100%
쉬움 · R0062 / 1190%0%
쉬움 · R00721 / 45340%67%
쉬움 · R0084 / 60614%100%
쉬움 · R0098 / 7505.5%100%
보통 · R0101 / 19100%100%
보통 · R0114 / 1,7880%67%
보통 · R0121 / 19825%50%
보통 · R0132 / 3120%0%
막대그래프: 첫 장 R004~R013의 줄우선 성공률. R006·R011·R013은 0%, R012는 25%, R009는 5.5%이고 R010은 100%다.
바꾸기 전 첫 장 10판의 줄우선 성공률. 진한 막대 네 개가 37~40번째로 옮긴 판입니다.

R006과 R013은 첫 수를 알려 줘도 0%입니다. 마지막 수 바로 앞에서 지울 수 있는 줄을 일부러 남겨 두었다가 마지막 수로 한꺼번에 지워야 목표를 채우는 판이라서죠. R012는 줄우선 25%지만 이기는 수순이 198개 중 1개뿐이라 함께 옮겼습니다. R008·R009도 줄우선은 낮지만 첫 수 힌트 뒤 100%라 힌트로 풀리는 판으로 봤습니다.

광고 유입 기기 16대의 이벤트를 분 단위로 다시 줄 세웠다

GA4 화면의 퍼널은 단계별 인원만 보여 줍니다. 그래서 Data API 보고서를 한 번 더 뽑았습니다. 측정기준은 deviceModel·dateHourMinute·eventName, 측정항목은 eventCount이고, 국가는 한국, firstUserMedium은 cpc로 걸렀습니다. user_engagement·screen_view·session_start는 빼고, 행을 기기별로 묶어 시간순으로 정렬하면 한 사람의 하루가 한 줄로 읽힙니다. 10-17 아침에 보낸 요청 본문은 이렇습니다(속성 번호는 지웠습니다).

{
  "dateRanges": [{"startDate": "2026-10-11", "endDate": "today"}],
  "dimensions": [{"name": "deviceModel"}, {"name": "dateHourMinute"}, {"name": "eventName"}],
  "metrics": [{"name": "eventCount"}],
  "dimensionFilter": {"andGroup": {"expressions": [
    {"filter": {"fieldName": "country", "stringFilter": {"value": "South Korea"}}},
    {"filter": {"fieldName": "firstUserMedium", "stringFilter": {"value": "cpc"}}},
    {"notExpression": {"filter": {"fieldName": "eventName",
      "inListFilter": {"values": ["user_engagement", "screen_view", "session_start"]}}}}
  ]}},
  "limit": 2000
}

tutorial_complete 뒤에 level_up이 한 번도 없으면 "R004에서 0판"입니다. 이렇게 센 7대 중 5대는 같은 시간표에 app_remove가 찍혀 있었습니다. 배너와 전면 광고는 튜토리얼을 뺀 판을 3개 끝내야 처음 나옵니다(코드 상수 BANNER_FROM_RUN = 3). 이 7대는 그런 판을 하나도 끝내지 않았으니 둘 다 만날 수 없었죠. 광고가 전혀 없었다고까지는 말할 수 없습니다. 앱으로 돌아올 때 뜨는 앱 오프닝 광고는 조건이 다르고, 7대 중 4대는 광고 노출 이벤트를 걸러 낸 표로만 읽었습니다.

평균이 왜 틀렸는지도 시간표에서 보였습니다. 기기 16대의 참여 시간 합계 7,471초 가운데 4,505초(60%)가 한 기기에서 나왔습니다. 중앙값은 148초, 3분이 안 됐습니다. R013을 넘긴 기록도 이 기기 하나뿐이었습니다.

처음 의심한 광고와 첫 수 힌트는 둘 다 빗나갔다

2026-10-15에 AI 코딩 에이전트가 쓴 집계 보고서는 한국 광고 유입을 "충분히 해 보고 지운 사람들"로 읽고 광고 밀도를 의심했습니다. 근거는 1인당 평균 사용 시간과, 광고 노출이 많았던 기기 한 대였습니다. 이틀 뒤 운영자가 더 깊이 분석하라고 요구했고, 사람별 복원은 그 요구에서 나왔습니다. 평균을 끌어올린 사람은 가장 멀리 간 한 명이었고, 떠난 사람들은 배너와 전면 광고가 나오기 전에 떠났습니다.

두 번째로 틀린 것은 첫 해결책입니다. 에이전트는 이탈을 "점선 경로가 있는 튜토리얼에서 경로 없는 판으로 넘어가는 절벽"으로 보고, R004~R013에서 한 번 실패하면 첫 수 힌트를 무료로 주고 두 번 실패하면 풀이를 여는 1.1.2를 만들었습니다(커밋 d1f6de1). 10-17 오전 8시 54분, 그 빌드를 Play에 올린 바로 그 분에 판별 정확 계산 결과가 도착했습니다. R006과 R013은 힌트를 줘도 0%였습니다. 34분 뒤 순서를 바꾼 1.1.3(커밋 cc4e860)을 올려 1.1.2를 대체했습니다.

기록에도 과장이 있었습니다. 커밋 메시지와 분석 문서는 네 판을 모두 "줄우선 0%"로 묶었지만, 다시 계산하면 R012는 25%, R011은 힌트 뒤 67%입니다.

등급이 '쉬움'인 판이 벽이 된 이유

벽 4판이 첫 장에 들어간 이유는 팩 순서를 등급 라벨로 정했고, 등급은 "이길 수 있는 첫 수의 비율"로 매겼기 때문입니다.

이 비율은 사람의 손버릇을 모릅니다. R006은 첫 수 10개 중 2개(20%)가 이길 수 있어 쉬움 등급을 받았지만 줄우선으로는 0%입니다. R010은 첫 수 11개 중 1개뿐이라 보통 등급인데 줄우선으로는 100%죠. 무작위 성공률도 구분하지 못했습니다. 빈칸이 많은 첫 튜토리얼 R001이 2.58%, R004와 R006이 똑같이 2.75%였습니다.

R004 이탈은 절반만 설명됩니다. R004는 줄우선 33%로 낮지만 첫 수 힌트 뒤 100%라 벽으로 세지 않았습니다. 그래도 점선 안내가 있는 튜토리얼 3판(이길 수 있는 첫 수 59~99%) 바로 다음에 오는 첫 일반 판이었고, 이길 수 있는 첫 수는 13개 중 4개였습니다. 새 순서는 7대가 멈춘 4번째 자리에 줄우선 100%인 R294를 두고 R004를 11번째로 보냈습니다. 다만 실패 이벤트가 없던 때라, 7대가 R004에서 막혀서 떠났는지 판을 열어 보지도 않고 떠났는지는 모릅니다. 벽 4판은 첫 장에 대한 발견이지, 7대가 떠난 원인을 증명한 것은 아닙니다.

판 순서만 바꾸고 진행 기록은 퍼즐 id로 남겼다

판을 새로 만들지 않았습니다. 진행 기록은 퍼즐 id로 저장되고 화면 이동은 목록 위치로 하기 때문에, 불러온 목록만 재정렬하면 기존 기록이 깨지지 않습니다. PLAY_ORDER는 튜토리얼 3판 다음에 줄우선 계산으로 잘 풀리는 판들을 놓고, 네 판을 37~40번째로 보냅니다. PlayOrderTest는 빠짐·중복과 37~40번째 자리를 확인합니다. 새 4번째 판의 팩 id가 R294라서 화면 번호도 위치 기준으로 바꾸었습니다.

막대그래프: 첫 장 평균 성공률이 줄우선 기준 29%에서 89%로, 힌트 뒤 기준 68%에서 98%로 올랐다.
순서 변경 전후 첫 장(4~13번째)의 평균 성공률. 모델로 계산한 값입니다.

4~13번째 판 10개의 줄우선 평균은 계산상 29%에서 89%가 되고, 첫 수 힌트를 받은 경우의 평균은 68%에서 98%가 됩니다. 사람의 플레이로는 아직 확인하지 않았습니다.

계측도 함께 넣었습니다. level_start, 실패 횟수와 막힘 여부를 담은 level_fail, hint_free, solution_shown이고, 판 이벤트마다 위치와 별도로 퍼즐 id(pid)를 붙였습니다. 릴리스(R8) 빌드는 실기기 E2E를 통과했고, 네 번째 판을 일부러 실패해 무료 힌트와 pid가 찍히는 것을 봤습니다. 몽키 테스트 3시드 × 800회에서 크래시와 ANR은 0이었습니다.

평균 퍼널 대신 사람별로 다시 읽은 이유

평균 퍼널은 이미 한 번 틀린 답을 냈습니다. 표본이 기기 16대면 한 대가 평균을 정합니다. 화면 녹화나 설문은 그날 검토하지 않았는데, 제 판단으로는 둘 다 이미 떠난 사람에게는 쓸 수 없습니다.

난이도 쪽 대안으로는 무작위 플레이어와 탐욕 봇이 있었습니다. 무작위 성공률은 R001과 R004를 구분하지 못했고, 탐욕 봇은 동점을 깨는 규칙에 따라 결과가 바뀌는 판이 있었습니다. 판을 끝까지 계획하는 봇은 블록 퍼즐 난이도 설계: 지지 않는 게임을 시뮬레이션 봇으로 고친 과정에서 클래식 모드를 맞출 때 썼지만, 첫 장 문제는 계획하지 않는 사람의 손버릇이라 줄우선 모델이 맞았습니다.

첫 장 순서는 등급 라벨이나 무작위 성공률로 정하지 마십시오. 사람처럼 두는 모델로 판마다 정확히 계산한 값으로 정하십시오.

이 방법이 통하지 않는 조건

따라 하는 순서

  1. 유입 한 덩어리(국가 + 첫 유입 매체)만 필터로 고릅니다. 테스트 기기 모델은 목록을 만들어 제외합니다.
  2. deviceModel × dateHourMinute × eventName으로 eventCount를 뽑고, 자동 수집 이벤트 세 개는 제외합니다. 기기별로 묶어 시간순 정렬합니다.
  3. 사람마다 마지막 진행 이벤트, 삭제 여부, 그 전에 광고 노출이 있었는지를 표 한 장에 적습니다.
  4. 멈춘 지점의 콘텐츠를 사람처럼 두는 모델로 정확히 계산합니다. 무작위 성공률과 등급 라벨은 참고만 합니다. 줄우선 확률은 아래 재귀 평균으로 냈고, 같은 판 상태는 메모해 다시 풀지 않았습니다. Python 3.12 한 프로세스로 300판의 줄우선·힌트 뒤 확률은 0.4초, 모든 수순 열거는 2.3초 걸렸습니다.
    win(board, left, lines):
      if left 비었음: return 1 if lines >= target else 0
      moves = left의 조각 종류마다 놓을 수 있는 모든 위치
      if moves 비었음: return 0              # 못 놓으면 실패
      clear = moves 중 줄을 1개 이상 지우는 수
      pool = clear if clear else moves
      return 평균(win(놓은 뒤 판, left - 그 조각, lines + 지운 줄) for 수 in pool)
    
    줄우선  = win(시작 판, 조각 3개, 0)
    힌트 뒤 = 정답 첫 수를 놓은 판에서 win(그 판, 남은 2개, 첫 수로 지운 줄)
  5. 다음 버전 전에 시작·실패(막힘 여부 포함)·도움 사용 이벤트를 넣고, 위치와 별개로 콘텐츠 id를 붙인 뒤 같은 날 맞춤 측정기준으로 등록합니다.
  6. 순서를 바꿀 때는 저장 키가 콘텐츠 id인지 먼저 확인하고, 빠짐·중복·위치 고정을 단위 테스트로 묶습니다.

2026-10-24 추가: 재시험 기준 3개 중 2개 미달

1.1.3 이후 7일(2026-10-17~10-23)의 한국 광고 유입을 2026-10-24에 판정했습니다. 설치는 25명이고, 테스트 기기와 에뮬레이터는 제외했습니다. 세 기준 중 통과한 것은 설치 당일 삭제 하나였습니다.

기준목표기준선7일 결과판정
4번째 자리 해결률80% 이상17명 중 10명16명 중 10명, 62%미달
D1 재방문30% 이상23%20%미달
설치 당일 삭제40% 미만58%25명 중 5명, 20%통과

7일 안에 지운 사람까지 세면 25명 중 10명(40%)입니다. 표본도 작습니다. 4번째 자리를 시작한 사람이 16명이라 1명 차이로 비율이 6%p쯤 움직입니다.

기준 이름은 "R004 해결률"이었지만 판정은 4번째 자리에서 했습니다. 1.1.3부터 그 자리에는 R294가 오고 R004는 11번째로 갔기 때문입니다(cc4e860의 PLAY_ORDER). 기준선 17명 중 10명은 바꾸기 전 4번째 판이던 R004의 값이고, 62%는 같은 자리에 놓인 R294의 값입니다. 판정 기간에 1.1.4와 1.1.5가 나갔지만 둘 다 판 순서는 바꾸지 않았습니다.

플레이 순서판(pid)시작해결
1R0012116
2R0021616
3R0031614
4R2941610
5R085107
6R06577

사람이 빠지는 곳은 두 군데였습니다. 하나는 첫 튜토리얼 R001입니다. 시작한 21명 중 16명만 풀었는데, 기준선 기간(10-11~10-16)에는 level_start가 없어서 보이지 않던 구간이죠. 나머지 하나가 4번째 자리입니다.

본문은 벽 4판이 7대가 떠난 원인이라고 증명하지 못했다고 적었습니다. 벽 4판을 37~40번째로 치운 뒤에도 4번째 자리에서 16명 중 6명이 풀지 못했고, 판을 R004에서 R294로 바꾼 뒤에도 해결한 사람 수는 기준선과 같은 10명이었습니다. 기준선은 기기 모델로 묶고 level_up 개수로 추정한 값이고 이번은 pid가 붙은 사용자 수라서, 1명 차이를 개선이나 악화로 읽지는 않습니다.

모델도 여기서 빗나갔습니다. 줄우선 모델은 R294를 100%로 계산했지만 사람은 62%였습니다. 첫 일반 판의 난이도는 실제 플레이어의 해결률로 판정하십시오. 이 글의 모델 값은 그 판정을 대신하지 못했습니다.

약속한 두 번째 숫자는 아직 없습니다. 판정 퍼널은 6번째 판(R065, 시작 7명)까지만 집계했고, 11번째로 간 R004와 37~40번째 네 판의 level_fail은 판별로 집계하지 않았습니다. 같은 기간(10-17~10-22)의 분석 기록에는 한국 광고 유입 1명이 팩 id 기준 R001~R282를 푼 것이 남아 있으니, 적어도 1명은 R004와 네 판을 모두 넘었습니다.

다음에 확인할 것

다음 수정 후보는 4번째 자리의 판입니다. level_fail의 pid로 R004(지금 11번째)와 37~40번째 네 판에서 실제로 몇 명이 막히는지는 아직 집계하지 않았습니다. 설치 링크는 한판블록 페이지에 있습니다.

자주 묻는 질문

GA4에서 사용자 한 명의 이벤트 순서를 볼 수 있나요?

Data API 보고서에 기기 모델, 분 단위 시각, 이벤트 이름을 함께 넣으면 순서가 거의 복원됩니다. 같은 모델의 다른 사람이 섞일 수 있으니 표본이 작을 때만 쓰고, 재설치는 따로 확인하십시오.

첫 수 힌트를 무료로 주면 이탈이 줄지 않나요?

힌트로 풀리는 판에서만 줄어듭니다. R008·R009는 힌트 뒤 100%가 됐지만 R006·R013은 힌트를 줘도 0%였습니다. 그런 판은 순서를 바꿔야 합니다. 힌트로는 풀리지 않습니다.

이 글은 SugarMount가 직접 측정한 값으로 쓰고, 초안 작성에 AI 코딩 에이전트를 썼습니다.

게임 개발 글 전체 보기 · AX 노트 전체 보기