0. 시작하며

‘PK (Player Killing)’ 는 말 그대로 온라인 게임 (특히, MMORPG) 에서 다른 캐릭터를 공격하여 죽이는 행위를 의미합니다 (PK에 대한 좀 더 자세한 내용이 궁금하신 분은 https://namu.wiki/w/PK 를 참고하시기 바랍니다). 그동안 ‘PK’와 관련해서 다양한 찬반 논란이 있어왔습니다. ‘Killing’ 이란 행위 자체가 갖는 폭력성 때문에, PK를 게임에서 허용하는 것은 바람직하지 않다고 비난하는 의견도 많은 반면, 다른 한편에서는 공격을 당한 캐릭터는 일정 정도의 페널티만 받을 뿐 실제 죽는 것은 아니니 ‘PK’를 그저 게임이 주는 하나의 흥미로운 컨텐츠로 받아들이고 즐기면 된다는 주장도 있습니다.

이런 논란은 게임 개발사 내부에서도 있습니다. PK를 허용하면 소수의 강한 캐릭터가 다수의 약한 저레벨 캐릭터들을 학살하고 다닐 수 있기 때문에, 다수 유저의 이탈을 야기할 뿐만 아니라 신규 유저의 유입에도 부정적인 영향을 끼칠 것이라는 의견도 있는 반면, 유저들의 경쟁심이나 성장 욕구를 자극하여 게임을 활성화하는데 긍정적이라는 의견도 있죠.

어쨌든 이런 숱한 논란에도 불구하고 PK가 유저의 게임 활동에 어떤 영향을 미치는지 정량적이고 인과적으로 분석한 자료는 거의 찾기 힘듭니다. 제 생각에 가장 큰 이유는 이 주제가 (분석을 수행할 가장 좋은 조건을 갖춘) 게임 회사 입장에서는 공개적으로 논의되기에 다소 불편한 주제라는 점 때문입니다. 하지만 자극적인 논쟁을 걷어내고 분석적인 관점으로만 본다면 그 자체로도 흥미로울 뿐 아니라 실제 사회에서는 분석하기 힘든 사회학적인 현상을 풍부한 데이터를 통해 확인해 볼 수 있는 좋은 주제라 생각합니다.

한편, PK의 인과 효과를 정량적으로 추정하는 것은 전형적인 인과 추론의 영역입니다. 인과 추론은 주로 경제학이나 심리학 등의 사회 과학 분야에서 많이 사용하는 분석 기법인데, 도메인 지식과 통계적 지식 그리고 분석적 사고력을 고르게 필요로 합니다. 최근에 데이터 분석 분야가 다소 예측 분석에 편중되어 있습니다만, 소위 말하는 ‘데이터 과학’ 이라는 용어에 더 적합한 것은 예측 분석이 아니라 인과 추론 분석이 아닌가 싶습니다.

이번 글에서는 인과 추론에 대한 케이스 스터디 목적으로 수행한 PK가 게임 유저의 이탈에 미치는 인과 효과 분석 사례를 정리하고자 합니다.

1. 단순 비교 분석의 문제점

PK를 당한 경험이 유저의 이탈에 어떤 영향을 주는지 확인하기 위한 가장 단순한 접근 방법은 PK 경험 집단과 미경험 집단을 나누고 이 두 집단의 이탈율의 차이를 비교하는 것입니다. 이를 위해 L모 게임에서 동일 시기에 신규 유입하여 플레이한 유저들 중 유입 후 1주일 이내에 PK를 한번 이상 당한 유저와 그렇지 않은 유저를 나눈 후 두 집단에서 대해서 일정 기간이 지난 후 게임에서 이탈한 비율을 비교한 결과는 다음과 같습니다.

  • PK 경험 집단의 이탈율: 11.9%
  • PK 미경험 집단의 이탈율: 79.5%

놀랍게도 PK를 당한 경험이 있는 집단이 그렇지 않은 집단에 비해 이탈율이 현저하게 낮게 관측됩니다. 따라서 이 결과만 놓고 생각하면, PK 경험은 (일반적인 사람들의 생각과 다르게) 유저의 이탈율을 크게 낮추는 효과가 있다는 결론이 나옵니다. 그러나 이런 단순 비교 분석에는 다음과 같은 문제가 있습니다.

1.1. 역인과 관계로 인한 오해

‘역 인과 관계’ 란 X가 Y의 원인이 아니라 반대로 Y가 X의 원인이 되는 경우를 말합니다. 이를 테면, 지역별 경찰관 수와 범죄율 데이터를 집계해 봤더니 경찰관 수가 많은 지역의 범죄율이 높다는 결과가 나왔다고 해서 ‘경찰관 수가 많을수록 범죄율이 높다’ 라고 해석해서는 안되는 것이죠 (반대로 범죄율이 높은 지역에 경찰관이 많이 배치된다 라고 해석하는게 더 합리적일 겁니다).

앞서 보여드린 이탈율에 대한 비교 분석 결과에서도 비슷한 문제가 있습니다. 왜냐하면 애초에 게임 플레이 기간이 매우 짧으면 PK 를 당할 확률이 매우 낮기 때문이죠 (극단적으로 보자면, 게임을 처음 시작한지 몇 분만에 이탈한 유저와 일주일 동안 하루에 10시간 이상씩 꾸준히 플레이를 하는 유저 중 어떤 유저가 더 PK를 경험할 확률이 높을지 생각해 보면 됩니다). 다시 말해, PK 경험이 게임의 이탈을 낮춘 것이 아니라 게임을 더 오래하는 유저일수록 PK를 당할 확률이 올라가는 ‘역 인과’ 관계가 있을 수 있는 것입니다. 따라서 PK 경험이 실제 이탈율에 어떤 인과적 영향을 끼치는지를 추정하려면 이런 역 인과 효과를 제거해야 합니다.

<그림 1> PK 와 유저의 이탈 사이에는 역인과 관계가 있을 수 있습니다.

1.2. 교란 요인으로 인한 오해

교란 요인은 X와 Y 양쪽에 영향을 미치는 제 3의 요인을 의미합니다. 이와 관련해서 흔히 드는 예시로 ‘아이스크림 판매량과 물놀이 사망자수의 관계’ 가 있습니다. 아이스크림 판매량이 올라갈수록 물놀이 사망자 수가 올라간다고 해서 아이스크림 판매가 물놀이 사고의 원인이라고 볼 수는 없습니다. 실제로는 온도가 올라갈수록 아이스크림 판매량과 물놀이 이용객이 증가하고 이로 인해 물놀이 사망자 수도 높아지는 것이죠. 즉, 기온 상승이라는 교란 요인으로 인해 아이스크림 판매량과 물놀이 사고 사이에 마치 인과 관계가 있는 것처럼 보이는 것입니다.

<그림 2> 교란요인으로 인해 상관 관계를 인과 관계로 오해할 수 있습니다.

PK 와 이탈율 역시 이 둘에 모두 영향을 미치는 교란 요인이 존재할 수 있습니다. 이를 테면, ‘캐릭터 레벨’을 생각해 볼 수 있습니다. 대개 온라인 게임에서는 초반 성장에 방해가 되지 않도록 저레벨 캐릭터의 활동 지역에서는 플레이어 간의 전투를 금지시키는 경우가 많기 때문에 만약 캐릭터의 레벨이 너무 낮다면 PK를 당할 일이 애초에 없을 수 있습니다.

한편, 캐릭터의 레벨은 이탈율에도 영향을 미칠 수 있습니다. 레벨이 높다는 것은 게임을 시작한지 얼마지나지 않은 유저에 비해 게임에 대한 충성도가 높다고 볼 수 있으며, 따라서 고레벨 유저는 저레벨 유저에 비해 이탈율이 낮을 가능성이 높습니다. 결국 예시로 든 캐릭터 레벨과 같은 교란 요인을 적절하게 통제하지 않으면 캐릭터 레벨 차이로 인해 발생한 PK 경험 여부와 이탈율 사이의 상관 관계를 자칫 인과 관계로 오해할 수 있습니다.

<그림 3> 캐릭터 레벨은 PK와 이탈율 모두에 영향을 주는 교란 요인일 수 있습니다.

1.3. 우연한 현상에 대한 오해

분석에 사용된 데이터에서만 나타난 우연한 차이를 모집단이 갖고 있는 일반적인 특징으로 오해할 수도 있습니다. 이런 오류를 피하기 위한 방법 중 하나는 ‘통계적 유의성’을 확인하는 것입니다.

PK가 이탈에 미치는 영향을 분석할 때에도 단순히 분석에 사용한 데이터 상에서 PK를 당한 집단과 그렇지 않은 집단 사이의 이탈율에 차이가 있는지 여부만 볼 것이 아니라 이 차이가 통계적으로 볼 때 충분히 의미가 있을만큼 큰지에 대해 확인해야 합니다. 여기서 말하는 ‘충분히 의미가 있다’ 라는 말은 내가 분석에 사용한 관측 데이터에서만 발생한 우연한 차이가 아니라 다음 번에 다른 관측 데이터를 수집하여 분석했을 때에도 일관된 결과가 나올 것으로 기대될 정도로 차이가 크다라는 뜻입니다.

2. 분석 방법

위에서 언급한 세 가지 문제를 해결하기 위해 사용한 방법은 다음과 같습니다.

첫째, 역인과 관계를 해소하기 위해 우선 PK 경험 집단을 최초 PK 를 당한 일자별로 분류한 후, 최소한 해당 일자까지 접속한 이력이 있는 PK 미경험 집단을 샘플링하여 대조군으로 선정하였습니다. 이렇게 하면 조기에 이탈하는 바람에 PK를 당할 일조차 없었던 유저들을 비교 대상에서 제외할 수 있으므로 위에서 설명한 역인과 관계로 인한 문제를 해결할 수 있습니다.

<그림 4> 역인과 관계를 통제하기 위해 PK 집단과 비교할 대조군을 선정할 때 게임 접속 일자와 PK 당한 일자에 대한 고려가 필요합니다.

둘째, 교란 요인을 통제하기 위해 ‘성향 점수 매칭 (Propensity Score Matching, PSM)’ 이라는 기법을 사용했습니다. 성향 점수 매칭은 쉽게 말해 실험군(PK 경험 집단)과 대조군(PK 미경험 집단) 에 속한 개체들의 여러 가지 특징을 대표하는 수치(성향 점수)를 만든 후, 실험군에 속한 개체들 각각의 점수와 동일하거나 비슷한 값을 갖는 대조군 개체들을 비교 대상으로 선정하는 기법입니다. 이렇게 하면 대조군과 실험군의 사전 조건들이 비슷해지기 때문에 이제 두 집단의 결과 변수 차이에 영향을 준 것은 원인 변수 (즉, PK 경험 여부) 밖에 없을 것이라고 추정할 수 있는 것이죠. 과학 실험을 할 때 실험 결과에 영향을 줄 수 있는 다른 환경을 최대한 동일하게 맞춰주는 작업과 비슷합니다.

PSM에 대한 좀 더 자세한 설명은 아래 두 링크를 참고하시기 바랍니다.

참고로 제가 통제한 변인들은 다음과 같습니다.

  • (최초로 PK를 당한 시점 직전까지의) 접속일수 및 일평균 플레이 시간
  • (최초로 PK를 당한 시점 직전까지의) 일평균 결제금액
  • (최초로 PK를 당한 시점 직전까지의) 캐릭터 레벨 및 기타 게임 컨텐츠 활동량
  • 본인이 다른 유저를 PK한 경험이 있는지 여부: 본인이 다른 사람을 공격한 경험이 있는 경우는 제외

셋째, 회귀 분석을 통해 PK가 이탈에 미치는 영향이 통계적으로도 유의한지 확인했습니다. 참고로 분석에 사용한 종속 변수는 각 유저별로 이탈 여부를 0과 1 로 표현한 값이기 때문에 로지스틱 회귀 모델을 사용했습니다.

3. 분석 결과

우선 역인과 관계를 제거하기 위해 위에서 언급한 첫번째 방법으로 대조군을 다시 샘플링하여 비교해 보니 PK 경험 집단과 미경험 집단 사이의 이탈율 차이가 크게 줄어드는 것을 확인할 수 있었습니다 (67.6%p -> 10.4%p). 그 결과는 아래와 같습니다.

  • PK 경험 집단의 이탈율: 13.9%
  • PK 미경험 집단의 이탈율: 24.3%

이렇게 선별된 집단에 대해서 이번엔 교란 요인을 통제하기 위해 PK를 당한 유저와 비슷한 특징을 갖는 PK 미경험 유저를 선별하는 PSM 작업을 수행했습니다. 아래 QQ plot은 PSM 전/후에 PK 경험 집단과 미경험 집단 사이의 데이터 분포가 어떻게 다른지를 보여주는 그래프입니다.

<그림 5> PSM 적용 전/후의 PK 경험 집단과 미경험 집단 데이터 분포 비교

그래프에서 ‘All’ 이라고 표시된 왼쪽 그래프들은 PSM 작업 전에 PK 경험 집단과 미경험 집단의 몇 가지 데이터에 대한 QQ plot 이며 ‘Matched’ 라고 표시된 오른쪽 그래프들은 PSM 작업 후의 결과입니다. 보다시피 PSM 전에는 두 집단의 데이터 분포 차이가 큰 반면, PSM 작업 후에는 분포가 비교적 비슷한 것을 확인할 수 있습니다 (굵은 점들이 대각선에 있는 실선에 가깝게 위치할수록 두 집단의 분포가 비슷한 것을 의미합니다).

따라서 이제 두 집단의 이탈율 차이는 두 집단 사이의 유일한 차이인 PK 경험이 준 효과일 것이라고 추정할 수 있는 것이죠.

마지막으로 이렇게 추출한 두 집단을 이용해 PK가 이탈율에 미친 영향력을 추정하기 위해 로지스틱 회귀 모델을 구하면 아래와 같은 결과가 나옵니다. 아래 회귀 모델 결과에서 is.pk 가 PK 를 당한 경험이 있는지 여부를 나타내는 변수인데 이 변수의 회귀 계수에 대한 p-value 가 매우 낮은 것으로 봐서 통계적으로 충분히 유의하다고 볼 수 있습니다.

<그림 6> 로지스틱 회귀 모델 결과

그런데 로지스틱 회귀 모델의 경우 회귀 계수가 의미하는 것은 이탈 확률이 아니라 로그 오즈비입니다. 따라서 PK의 인과 효과를 직관적으로 이해하기 쉬운 수치로 표현하기 위해 모델에서 제공한 회귀 계수를 이탈 확률에 대한 한계 효과로 변환하고 표준 오차 역시 이에 맞게 다시 계산하는 작업을 진행했습니다. 아쉽게도 제가 사용하는 R 의 glm 라이브러리에서는 이런 기능을 자동으로 제공하지 않기 때문에 https://www.r-bloggers.com/probitlogit-marginal-effects-in-r/ 를 참고하여 아래와 같은 함수를 만들었습니다.

marginal.effects <- function(formula, data, dist = 'logit', boot=100, digits=3) {
	x <- glm(formula, family = binomial(link = dist), data)
	# 학습 모델을 이용해 각 계수의 marginal effect 를 구한다. 
	pdf <- ifelse(dist == "probit", mean(dnorm(predict(x, type = "link"))), mean(dlogis(predict(x, type = "link"))))
	ame <- pdf * coef(x)
  
	# 부트스트래핑을 통해 반복 학습 수행 후 그 결과를 이용하여 marginal effect에 대한 표준 오차를 구한다.
	bootvals <- matrix(rep(NA, boot * length(coef(x))), nrow = boot)
	set.seed(1111)
	for (i in 1:boot) {
		samp1 <- data[sample(1:dim(data)[1], replace=TRUE, dim(data)[1]), ]
		x1 <- glm(formula, family = binomial(link = dist), samp1)
		pdf1 <- ifelse(dist == "probit", mean(dnorm(predict(x, type = "link"))), mean(dlogis(predict(x, type = "link"))))
		bootvals[i,] <- pdf1 * coef(x1)
	}
	res <- cbind(ame, apply(bootvals, 2, sd), ame / apply(bootvals, 2, sd))
	if (names(x$coefficients[1]) == "(Intercept)") { # Intercept 는 marginal effect 계산 시 제외
		row.names = rownames(res)[-1]
		res = matrix(res[-1, ], nrow = dim(res)[1] - 1)
		if (is.null(row.names) == FALSE) {
			rownames(res) <- row.names
		}
	}
	res = round(res, digits)
	return(data.frame(variable = rownames(res)
			, marginal.effect = res[, 1]
			, standard.error = res[, 2]
			, z.ratio = res[, 3]))
}

위 함수를 적용한 결과 및 시각화 자료는 다음과 같습니다.

<표 1> 회귀 분석 결과

항목 측정치
marginal effect -0.07
standard error 0.011
z-ratio -6.325

<그림 7> 로지스틱 회귀 분석 결과 시각화 - PK 경험은 이탈율을 약 7% 포인트 낮추는 효과가 있으며, 95% 신뢰도 기준 적용 시 통계적으로 유의합니다.

위 결과를 해석하면, PK를 한번이라도 당한 집단은 그렇지 않은 집단에 비해 평균적으로 이탈율이 7% 포인트 정도 더 낮다는 것을 의미합니다. 앞서 언급했듯이 이탈율에 영향을 줄만한 다른 요인들은 최대한 통제한 상태이기 때문에 이러한 차이는 PK 경험에 의한 것이라고 의심할 수 있습니다. 또한 표준 오차와의 비교를 통해 이 차이는 통계적으로도 충분히 유의하다는 것을 확인할 수 있었습니다.

결국 PK를 당한 유저는 게임에서 이탈할 것이라는 일반적인 생각과 다르게 오히려 이탈율이 소폭 감소합니다. 하지만 최초에 단순히 PK를 당한 집단과 그렇지 않은 집단 간의 이탈율 차이를 구했을 때와 비교해보면 PK가 이탈에 미치는 영향이 그리 크지는 않습니다.

4. 결론

데이터 분석을 통해 어떤 사건이나 행동이 특정 변수에 미치는 인과적 영향을 추정할 때는 해당 변수에 영향을 줄 수 있는 다양한 인과적 관계를 먼저 파악한 후, 인과 효과를 잘못 해석할 수 있는 다른 요인들을 최대한 통제하는 작업이 필요합니다.

이번 분석 사례에서 보다시피 이런 통제 작업이 전혀 이뤄지지 않은 상태에서는 마치 PK가 이탈율을 무려 67% 포인트나 낮추는 것처럼 보이지만, 역인과 관계나 교란 요인을 통제하게 되면 PK가 이탈율에 실제로 미치는 인과 효과는 약 7% 포인트를 낮추는 정도에 불과합니다.

물론 여기서 소개한 분석 결과가 정확한 것인지에 대해선 확신할 수 없습니다. 미처 고려하지 못한 다른 교란 요인이나 인과 효과를 왜곡하는 또다른 오류가 있을 수 있기 때문이죠. 더 나아가 이번 분석에서는 다양한 변인을 통제하기 위해 데이터에 여러 가지 제약을 가했기 때문에 이 결과는 PK 가 일반적으로 갖고 있는 인과 효과가 아닐 가능성이 높습니다.

이를테면, 이번 분석에서는 특정 기간 동안에 신규 유입된 유저만을 대상으로 하였기 때문에 다른 기간에는 그 결과가 달라질수도 있으며, 신규 유저가 아닌 기존 유저들이 PK 에 대해 느끼는 피로도 역시 다를 수도 있습니다. 심지어 이 결과는 분석 대상이 된 게임에서만의 특징일뿐 다른 게임에서는 PK가 이탈율을 높이는 인과 효과가 있을 수도 있습니다. 때문에 다양한 상황과 데이터에 대해서 반복적인 분석과 검증이 필요합니다 (사실 이 글을 쓰는 시점에 다른 게임에 대해 비슷한 분석을 수행하였는데 그 게임에서는 PK가 이탈율에 미치는 영향이 통계적으로 유의하지 않는 것으로 나왔습니다). 그러니 결과 자체에 대해 큰 의미를 부여하기 보다는 이런 식의 분석이 가능하다 정도로 받아들여 주시면 좋겠습니다.