A/B 테스트를 하고도 잘못된 결정을 하는 이유

A/B 테스트를 한다고 하지만 정작 테스트 결과를 왜곡해서 해석하거나 자기가 해석하고 싶은대로 해석하는 경우가 많습니다. 오늘은 온라인 서비스에서 하는 A/B테스트에 대한 불편한 사실에 대해서 얘기해 보겠습니다.

A/B테스트의 개념을 제대로 알자

A/B 테스트는 통계학의 실험계획법의 하나입니다. 역사가 오래된 과학적 실험 및 결과 확인 방법입니다. A/B테스트는 의료과학에서 정말 많이하는데 신약, 수술법, 처치법에 대한 테스트를 하기위해서 하고 온라인 서비스에서 UI의 변경이나 기능변경을 할 때 어떤 것이 좋은지 확인할 때도 씁니다.

실험대상을 A군과 B군으로 나누고 B군에 벼환를 주고 그 결과의 차이를 비교한다는 의미해서 A/B 테스트라고 부릅니다.

간단하게 정리하면

아무 처치도 하지 않은 콘트롤 그룹(Control Group, A)과
어떤 처치를 한 테스트 그룹(Threatment Group B)을 두고

  • Control Group 콘트롤그룹: 아무 처치도 하지 않은 것
  • Treatment Group 트리트먼트 테스트 그룹: 어떤 특정한 처치를 한 것

이때 Threatment group은 여러개가 있을 수 있습니다. T1, T2, T3이렇게 번호를 붙여서 여러가지 다른 처치를 하게 할 수도 있습니다. 온라인 서비스의 UI라면 UI1, UI2, UI3과 같이 새 UI를 한 번에 테스트해볼 수 있습니다.

콘트롤 그룹과 테스트 그룹의 샘플 수는 같아야 한다

콘트롤 그룹과 트리트먼트 그룹의 샘플 수는 같아야 합니다.
만약 사용자를 대상으로 하는 UI 버킷테스트라면 적용 받는 사용자는 동일하게 분할해야 합니다.

정확히 샘플 수가 같을 필요는 없고 카이스퀘어 테스트를 해서 균둥하다고 나올 정도면 됩니다.

최소한 시즌이 두 번은 반복될 수 있는 기간 동안 진행한다

여기서 말하는시즌은 온라인 서비스의 경우에는 2주를 말합니다. 월별로 특성을 타는 테스트라면 2개월은 돌려야합니다. 시즌을 2번 돌리게 하는 것은 시즌내에서는 특정 시점에 따라 기복이 있을 수 있고 잠시 튀는 경우가 생기기 때문입니다. 그리고 행위나 반응에 대한 샘플 수를 늘리기 위한 것입니다.

여기서 “하루 또는 1시간만하고 테스트 결과가 좋으니 테스트가 더 좋다”라고 판단하는 분들이 많은데 이게 좀 문제입니다. 과학적으로 보면 이건 사기나 마찬가지입니다.

어째서 1시간만 해도 되는지 1일만 해도 되는지 그게 괜찮은지에 대한 근거가 전혀 없습니다. 보통 왜 그 기간동안 하느냐라고 물으면 “그 정도면 충분하지 않을까요?” 라고 말합니다.

매우 비과학적인 사고여서 통계학에서 절대 하지 말아야 할 행위로 규정하고 있는 것입니다.
저렇게 하는 이유는 어떤 테스트 방법으로 어떻게 평가해야 하는지 모르기 때문입니다.

어떤 평가 방법을 써야 하는가?

A/B테스트는 실험을 시작하고 시간이 경과한 후 또는 어떤 처치를 한 후에 두 그룹의 차이가 있는지 없는지, 어떤 것이 더 좋은지를 확인하는 것입니다.

검정법

진행 후에 결과에 대한 검증법은 통계적 검정법을 쓰는데 통계적 검정법은 간단하게는 t-test부터 F-test 등 매우 많습니다. 샘플 수, 상황, 데이터의 분포에 따라 어떤 평가방법을 써야 하는지 각각 다르므로 어떤 평가방법을 써야하는지는 잘 알고 있어야 합니다.

T-test면 다되나?

평균의 유의미한 차이는 T-test를 하면 되고 원래 두 그룹의 평균차이가 달랐다면 부산분석을 통해 분산이 차이가 발생했는지 유의미한지를 확인해야합니다.

CTR이 좋아졌는지 보려면?

예를들어 테스트그룹1이 콘트롤그룹보다 CTR이 좋은지 보려면 2주간 버킷테스를 진행하고 CTR에 대한 T-test를 수행하면됩니다. 이때 CTR의 분포가 정규분포에 가까워야 합니다.

CTR은 하루 또는 전체 기간의 CTR을 계산하는 것이 통상적인데 페이지뷰는 있지만 CTR이 없는 경우에는 CTR이 계산이 안되는 것들은 버리고 불균등한 샘플의 숫자는 많은쪽에서 일부 줄여서 버려야 합니다.

의료과학에서의 A/B테스트

의료과학에서는 실험 대상의 샘플도 적고 콘트롤이 잘 안되고 관찰도 잘 안되는 문제 때문에 매우 어렵습니다. 온라인의 경우에는 콘트롤이 잘되고 샘플도 많습니다만 정작 실험 후에는 판단을 엉망으로 해서 잘못된 판단을 하는 것이 문제지만 의료과학은 케이스가 그때그때 다들 다르다는 문제가 있습니다. 그래서 그때 그때 방법을 선택해서 검정을 해야 합니다. 케이스별로 잘 알려진 통계적 검정법이 있는데 어떤 것을 써야 할지 애매할 때가 많습니다. 이런 경우에는 의료통계 전문가에게 물어봐야 합니다.

의료과학은 결과에 대한 검증이 매우 예민하고 철저하기 때문에 잘 해야하는데 사용해야 합니다. R언어를 사용하는 분들은 논문이 이미 R언어를 사용해서 실험을 평가한 것이 많으므로 관련 논문을 참조하거나 커뮤니티에 물어보면 어떤 테스트를 써야하는지 잘 알려주니 적극 활용할 필요가 있습니다. 미국의 유명한 의료과학 대학과 제약회사들은 모두 R언어를 기본으로 사용합니다.

그래서…

A/B테스트는 버킷을 분리해서 서로 다른 효과를 적용하게 만드는 시스템을 만드는 것이 가장 어렵습니다.

하지만 버킷테스트를 진행하고 나서 실험결과에 대한 올바른 과학적 해석과 그 논리적 결함, 통계적 해석 왜곡에 대한 검증도 매우 중요합니다.

테스트를 진행하고 단편적인 결과만 보거나 자신에게 유리한 것만 본다면 실패한 실험이 되므로 매우 주의해야 합니다.

의료과학에서 얼마나 철저하게 검증하는지 안다면 A/B테스트가 만만하지 않다는 것을 알 수 있습니다. 물론 온라인 서비스의 버킷테스트는 의료과학과는 달리 사람의 생명에 직접적연 영향을 주지 않을

만약 실험 결과에 대한 해석과 검정을 어떻게 하는지 모른다면 아예 하지 않는 것이 오히려 좋습니다.

A/B테스트를 진행하고 나서 그 결과가 믿을 만한 것인지 알고 싶다면 통계학의 가설검정법에 대해 공부해야 합니다.

한국 회사들이 데이터 기반 의사결정에 실패하는 이유

데이터 기반으로 의사결정을 하는 것은 이미 전세계적으로 당연히 해야 할 것으로 다를 인지하고 있습니다.

하지만 많은 한국회사들은 빅데이터, 데이터과학, 디지털트랜스포메이션을 도입해서 데이터기반 의사결정을 하려고하지만 대부분 실패를 맛보고 예전에 하던 경험기반의 주먹구구식 의사결정을 합니다.

데이터 기반 의사결정이 실패하는 대부분의 이유는 데이터 과학이 사기이거나 데이터 과학자의 역량 부족이나 실패보다는 경영자나 관리자 또는 조직원들의 문제인 경우가 대부분입니다.

즉 실행을 하는 사람들의 인식과 사고와 이해 관계의 문제입니다.

사람의 문제가 대부분입니다.

많은 한국회사들이 지난 십 수년동안 데이터 기반 의사결정을 하기 위한 시도를 했지만 제대로 한 곳은 거의 없습니다. 많은 회사들의 데이터 책임자, 실무자, 의사결정권자들과 얘기하거나 하다보면 처음에는 데이터 기반 의사결정이 꼭 필요하며 꼭 하고 싶다는 말과 함께 시작하지만 대부분 실패하게 됩니다.

여기에는 회사들 마다 나름대로 원인과 이유가 있겠지만 공통적으로 보이는 어이없는 원인들도 있습니다.

우선 조직내에서 수직적 레벨로 어느 위치에 있는지에 따른 문제점들입니다.

결정권자들의 문제 (탑 레벨의 문제)

결정권자들의 경우입니다. 이 경우가 문제가 가장 많습니다. 전후가 어쨌든 의사결정을 하는 최종 결정권자들이기 때문입니다.

보통 조직(회사)내에서는 결정권자들이 데이터기반 의사결정에 대해 무지하거나 잘못된 결정을 하는 것에 대해서 아무도 지적하거나 언급하지 않습니다. 이런 걸 잘못해서 결정권자의 귀에 그런 의견을 말한 사실이 알려지면 속된말로 찍혀서 인사상 불이익을 받거나 하는 문제에 휘말릴 수 있기 때문입니다. 사회생활 잘하고 싶은 것입니다.

필자가 듣거나 경험해 본 결정권자들의 문제는 여러가지 케이스로 나타납니다.

데이터기반 의사걸정을 하는 모양새만 갖추고 싶어한다

원래부터 데이터 기반 의사결정은 할 생각이 없거나 그게 뭔지 본질은 관심이 없는 케이스입니다. 본인이 데이터 기반 의사결정을 하는 합리적이고 선진화된 사람으로 각색되어 보여주길 원하는 것이고 실상 결정을 할 때는 자기가 하고싶은대로 해버립니다.

“데이터로 파악한다고 다 아는 것도 아니고 다 맞는 것도 아니잖아?” 이렇게 생각하거나 말하는 경우도 매우 많습니다.

데이터기반 의사결정 필요성을 아예 모르는 경우도 많습니다. 그냥 남들이 그걸 한다고 하고 그걸 하면 괜찮은 의사결정권자로 보일 것 같으니 그게 포장용으로 필요할 뿐입니다.

“나는 데이터기반 의사결정을 할 줄 아는 선진적이고 진보된 사람이야.” 라는 말을 하며 그런 사람으로 알려지길 바라지만 실제로 행동은 그렇게 하지 않는 것입니다.

수단과 목적이 바뀐 것입니다. 의사결정을 잘하기 위한 것이 목적이고 데이터기반 의사결정은 그걸 하기 위한 방법 중 하나입니다. 그런데 데이터 기반 의사결정을 한다는 것만 보여주고 싶은 것이 목적이고 그 수단으로 그걸 한다는 포장만 하는 것입니다.

안타깝게도 어떤 기업이든지 이런 사람이 거의 필연적으로 그리도 다수 존재합니다.

보고 싶은 것만 본다

데이터 기반의 분석결과는 그 분석이 틀리지 않고 맞다는 전제하라면 좋은 결과가 나올 수도 있고 안좋은 결과가 있을 수도 있고 세부적으로는 좋고 나쁨이 섞여 있을 수 있습니다.

이 중에서 자기가 보고 싶은 것만 봅니다. 그러니까 자기가 하고 싶은 것을지지하는 결과만을 선택하고 그게 아닌 결과는 무시해 버립니다.

이렇게 할꺼면 데이터를 확인할 필요가 없습니다. 그냥 자기가 하고 싶은 대로 하면 됩니다. 하지만 그렇게하면 비론리적이라는 말을 듣기 때문에 논리적이라는 말을 듣기 위한 포장용으로 자신에게 유리한 결가만 필요한 것입니다.

어떤 실험, 사실 탐색, 인사이트 도출과 같은 것은 보통 좋은 사실과 나쁜 사실이 뒤섞여 나오는경우가 많습니다. 대표적인 실수는 여기에서 자신이 원하는 결과에 유리한 것만 채택하고 나머지는 별거 아니라고 무시해 버리는 것은 가장 경계해야 할 것이고 그렇게 하지 않는 것은 도덕적으로 문제가 있는 것입니다.

데이터를 보긴 하지만 결정 자체를 안한다

의사결정이란 시의적절하게 해야 합니다. 즉 할 때는 해야 하는데 무조건 의사결정을 안합니다. 데이터를 보는 이유는 사람의 경험에 의한 의사결정이 왜곡이 많거나 틀릴 위험이 많기 때문에 최대한 현실을 제대로 보고 참고해서 결정을 하기 위한 것입니다.

결정을 안 하는 결정권자는 데이터 기반이든 아니든 문제가 매우 많습니다.

이런 결정권자가 있는 회사는 서서히 망합니다.

다행인 것은 당장 망하지는 않습니다. 하지만 더 불행인 것은 이런 회사는 반드시 망합니다.

매니지먼트 레벨들의 문제

본부장, 센터장, 사업장, 유닛장, 팀장 등과 같은 상위 또는 중간 매니저들의 문제입니다.

이런 사람들도 데이터기반 의사결정에 문제를 만드는 경우가 많습니다. 사실 문제를 가장 많이 만드는 사람들은 이 사람들입니다.

위에서 하라고 시키니까 하는 척만 한다

위에서 “데이터 기반으로 의사결정” 하자고 탑다운으로 지시가 내려온 경우입니다. 그게 뭔지도 모르겠고 인터넷 검색을 하고 업체를 찾아서 하는 시늉을 합니다.

그러고나서 “이거 잘 안되는거네. 거봐 사기라니깐” 이렇게 말합니다.

원래부터 하고 싶은 생각이 없었던 것입니다.

뭔지, 왜 해야하는지 학습할 생각은 없습니다. 뭔지 다 이해했지만 본인이 충분히 잘하기 때문에 그런 it인력이나 솔루션 업체들 돈이나 퍼주는 그런 것은 낭비라고 생각하는 것입니다.

부하직원에게 말해도 무슨 말인지 알아듣지 못한다

데이터 기반을 왜 해야하는지 같이 일을 해야 할 팀 동룝 또는 부하직원들이 이해를 못하는 경우입니다. 혼자 데이터 추출하고 데이터 검증을 하거나 데이터 관련 부서로부터 협조를 받아야 하지만 그렇게 하지 못하는 경우도 많습니다.

데이터 기반 의사결정에 필요한 기술이 없다

태블로 같은 BI도구를 사거나 하둡, 스파크, 빅쿼리, GCP같은 것을 써서 카운트를 세고 그래프를 예쁘게 그리고 나서 의사결정을 하면 데이터기반 의사결정이라고 생각해버립니다.

데이터를 집계하고 시각화하는 것이 데이터 기반 의사결정을 하기 위한 출발점이긴하지만 데이터 기반 의사결정은 그런 그래프와 데이터를 보고 여러가지 고민과 생각과 탐색을 해서 결론을 내는 것입니다. 즉 데이터를 제대로 집계하거나 추출, 가공하고 시각화한 데이터 요약을 해석 하는 방법을 터득해야 합니다. 그런데 그 방법은 익히기 매우 어려운 기술이고 잘 정리된 튜토리얼이 없습니다.

그래서 본인이 잘하고 있다고 착각하기 쉽지만 실상은 아닌 경우가 많습니다.

실무자들의 문제

마지막으로 실무자들의 문제가 있습니다. 즉 데이터 과학자, 데이터 분석가가 아닌 사람들입니다.

대부분의 실무자들은 데이터기반의 어쩌고 하는 것에 대해 기본적인 거부감을 가지고 있습니다.

뭔지 잘 모를말로 자신들보다 지적, 과학적으로 우위에 있다는 것을 과대포장하기 위해 데이터기반이라는 것을 만들어냈다고 생각하는 것입니다.

“실제로 해보니 안되드라”

데이터분석을 하고 인사이트 도출을 위한 미팅을 하기 위해서 초기 셋업 미팅을 하면 이런 피드백을 꽤 많이 합니다.

그리고 이런 상황에서 시작하는 프로젝트는 실상을 보면 애초에 협조하거나 잘되길 바라지 않고 방해하는 일이 허다합니다.

데이터기반으로 의사결정을 하게 되면 경험기반의 자신들의 노하우가 쓸모가 없어지는 것 같고 컴퓨터에게 자신들의 일자리를 잃어버릴 것 같은 느낌 때문입니다.

즉 애초레 제대로 할 생각도 없었고 잘 안되길 바라고 그렇게 되도록 행동한 것입니다.

“내가 진짜로 여러 번 같이 해봤는데 그거 현실성이 없더라니깐”

이렇게 말하는 사람들도 다수입니다.

앞서 말했듯이 제대로 안해봤거나 사실은 여러번 안해본 것입니다.

반약 데이터기반 의사결정이라는 것이 말만 그럴듯하고 정말로 안되는 거라면 데이터기반 의사결정은 꼭 필요한 것이며 많은 실수를 바로잡았다고 말해온 실리콘벨리의 선진적인 회사들은 모두 단체로 거짓말과 사기를 치고 있는 것입니다.

R에서 Hashmap 사용하기

대부분의 컴퓨터언어에는 키로 값을 꺼내올 수 있는 자료구조인 hashmap을 제공합니다.

Python에는 자료구조 딕셔너리 dictionary를 지원합니다.

R에도 env라는 것이 있어서 딕셔너리 형태로 쓸 수는 있지만 R의 environment는 작업 공간으로도 사용되기 때문에 사용하기 복잡하고 부담스럽습니다. 학습장벽도 높은 편입니다.

그런데 다행히도 r2r 패키지라는 것이 있어서 이 패키지를 이용하면 R에서도 hashmap을 쓸 수 있습니다.

R-Object to R-Object Hash Maps

해시 테이블은 효율적인 코딩을 위한 가장 유용한 자료구조 중 하나입니다. 추상적으로 해시 테이블은 고유 키(문자열, 숫자 또는 더 복잡한 객체일 수 있음)로 값을 가르키게 한다고 생각 할 수 있습니다. 계산적 관점에서 볼 때 가장 두드러진 특징은 읽기/쓰기 작업(예: 특정 키 또는 키-값 쌍 저장, 검색 또는 삭제)이 테이블과 관계없이 평균 시간복잡도가 O(1)입니다.

많은 프로그래밍 언어는 해시 테이블이 각각의 방법으로 구현된 것이 제공됩니다. 예를 들면 C++의 std::unordered_map/sets와 Python의 dicts 및 set이 있습니다. 기본 R에서는 해시 테이블에 가장 가까운 객체는 environment입니다. 하지만 environment는사용자의 관점에서 처리하기 다소 번거로울 수 있으며 문자열타입의 키만 지원합니다.

r2r패키지는 기본 R 환경에서 제공하는 environment보다 R에서 쓸 수 있는 더 유연한 해시 테이블 기능을 구현해서 제공합니다.

특히 r2r 해시 테이블은 다음을 지원합니다.

  • 키와 값으로 임의의 R 객체
  • 임의의 키 비교 및 해시 함수
  • 누락된 키 예외에 대한 사용자 정의 가능한 동작(기본값 던지거나 반환)

여기에서는 r2r 해시 테이블에 대한 간단한 실습용 코드를 소개합니다.

우선 r2r 패키지를 로딩합니다.

library(r2r)

기본 사용법 Basic Manipulations

다음을 사용하여 빈 해시맵(해시 테이블)을 만듭니다.

m <- hashmap()

여러 가지 방법으로 m이라는 해시맵에 키-값 쌍을 삽입할 수 있습니다.

m[["key"]] <- "value" 
m[c(1, 2, 3)] <- c("a", "b", "c") 
# Vectorized over keys and values 
m[[c(4, 5, 6)]] <- c("d", "e", "f") 
# Not vectorized

다음 쿼리는 위의 설명에서 언급한 [[ 및 [ 연산자 간의 차이점을 설명합니다.

m[["key"]]
#> [1] "value"

m[c(1, 2, 3)]
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] "b"
#> 
#> [[3]]
#> [1] "c"
m[[c(1, 2, 3)]]
#> NULL

m[c(4, 5, 6)]
#> [[1]]
#> NULL
#> 
#> [[2]]
#> NULL
#> 
#> [[3]]
#> NULL
m[[c(4, 5, 6)]]
#> [1] "d" "e" "f"

단일 요소 삽입 및 쿼리는 제네릭 insert() 및 query()를 통해 수행할 수도 있습니다.

insert(m, "user", "vgherard") # Modifies `m` in place
query(m, "user")
#> [1] "vgherard"

세트 Sets

해시 테이블 외에도 단순히 키를 저장하는 해시 세트를 만들 수도 있습니다.

s <- hashset()
insert(s, 1)
s[[2]] <- T # equivalent to insert(s, 2)
s[c(1, 2, 3)]
#> [[1]]
#> [1] TRUE
#> 
#> [[2]]
#> [1] TRUE
#> 
#> [[3]]
#> [1] FALSE

키와 값의 타입 Key and value types

키와 값으로 사용할 수 있는 개체 유형에는 제한이 없습니다.

예를 들면 다음과 같이 모델을 키로 사용할 수도 있습니다.

m[[ lm(wt ~ mpg, mtcars) ]] <- list("This is my fit!", 840)
m[[ lm(wt ~ mpg, mtcars) ]]
#> [[1]]
#> [1] "This is my fit!"
#> 
#> [[2]]
#> [1] 840
m[[ lm(cyl ~ mpg, mtcars) ]]
#> NULL

기본값 설정하기 Setting default values

누락된 키에 대한 기본값을 설정할 수 있습니다.

다음은 그 예입니다.

m <- hashmap(default = 0)

이 기능은 카운터를 만드는 데 유용합니다.

objects <- list(1, 1, "1", FALSE, "1", 1)
for (object in objects)
    m[[object]] <- m[[object]] + 1
m[["1"]]
#> [1] 2

누락된 키를 참조하려고 할 때 exception을 throw할 수 있습니다.

m <- hashmap(on_missing_key = "throw")
tryCatch(m[["Missing key"]], error = function(cnd) "Oops!")
#> [1] "Oops!"

커스텀 키 비교와 해시 함수 Using custom key comparison and hash functions

hashmaps와 hashmaps는 기본적으로 base::identical()을 사용하여 키를 비교합니다.

m <- hashmap()
m[[1]] <- "double"
m[["1"]] <- "character"
m[[1]]
#> [1] "double"

이 동작은 키 비교 기능을 명시적으로 제공하여 변경할 수 있습니다. 올바르게 작동하게 하려면 동등한 키에 대해 동일한 해시를 생성하는 해시 함수를 명시적으로 제공해야 합니다.

이를 수행하는 간단한 방법은 다음 예제와 해시맵을 생성할 때 키에 전처리 함수를 정의할 수 있습니다.

m <- hashmap(key_preproc_fn = Arg)

키가 하나의 복소수라고 가정할 때 복소수 평면에서 방향이 같을 때 두 개의 키를 동등하게 간주합니다. 복소수 벡터의 방향은 R 함수 Arg()를 사용해서 구할 수 있기 때문에 Arg함수를 사용하는 걸이 이 경우에는 맞습니다. 생성자의 key_preproc_fn 인수를 통해 이러한 방식으로 키를 사전 처리하도록 해시맵에 지정할 수 있습니다.

의도한 대로 잘 작동하는지 확인해 봅니다.

m[list(1, 1 + 1i, 1i)] <- list("EAST", "NORTH-EAST", "NORTH")
m[[10]]
#> [1] "EAST"
m[[100i]]
#> [1] "NORTH"
m[[2 + 2i]]
#> [1] "NORTH-EAST"

참고: https://cran.r-project.org/web/packages/r2r/vignettes/r2r.html

Confusion Matrix 혼동 행렬

Confusion Matrix(컨퓨전 매트릭스)는 한국어로 혼동행렬이라고 부릅니다.

혼동행렬이라는 단어가 어색해서 흔히 영어 발음 그대로 컨퓨전 매트릭스라고 부릅니다.

Confusion matrix는 기계학습 모델 중에서 분류 모델의 성능을 측정하고 학인하기 위한 간단한 계산식과 표입니다. 기계학습의 분류모델의 성능 측정을 위한 지표 계산법 이라고 기억하시면 됩니다.

인터뷰나 멘토링을 할 때 기계학습 초보자인지 아닌지를 확인하는 가장 쉬운 방법은 Confusion Matrix를 설명하라고 하거나 어떤 모델에 대한 설명을 한 후 Confusion Matrix에서 어떤 것을 보는게 좋을지에 대해서 물어보고 대답을 어찌하는지 보면 확인할 수 있습니다.

Confusion Matrix에 대해서 잘 모른다면 기계학습에 대한 지식이 아예 없다고도 볼 수 있습니다.

흔히 Confusoin matrix는 위의 그림에서 좌상단에 있는 조그만 박스를 말하는데 기계학습을 하다가 보통 Precision, Recall과 같은 지표 이름이 나오면 Confusion matrix라고 생각하면 됩니다.

위의 표가 행렬처럼 생겨서 혼동행렬이라고 하는것인데

이름이 왜 혼동이라는 단어가 들어가서 혼동행렬인지 단어의 뜻을 이해하면 저게 왜 복잡한지 알 수 있습니다.

기계학습 모델의 문제는 “그 모델이 왜필요하며 어떤 문제를 해결하기 위해서 필요한가 ”에 따라서 어떤 지표를 봐야 하는지를 결정해야 하고 어떤 지표와 어떤 지표가 상관관계가 있는지 상호충돌(trade off)인지도 잘 이해하지 않으면 지표를 보는 것(해석하는 요령)이 어렵습니다.

그래서 혼동행렬이라고 부릅니다.

Precision을 중요하게 봐야 하는 모델, Recall을 중요하게 봐야 하는 모델, 둘 다 봐야하는 모델 등 각기 다른데 모델의 각 지표에 대한 중요도와 우선순위는 모델이 처한 상황과 산업, 모델이 해결해야 하는 문제에 따라 다릅니다.

어쨌든 혼동행렬에서 중요한 기본 4개의 지표는

  • TP: True Positive. 모델이 긍정이라고 한 것중에 정답도 긍정인 것
  • FP: False Positive. 모델은 긍정이라고 했지만 정답은 부정인 것
  • FN: False Positive. 모델이 부정이라고 한 것중에 정답이 긍정인것
  • TN: True Negative. 모델이 부정이라고 한 것중에 실제로 정답도 부정인 것

TP, TP, FN, TN은 모두 카운트한 값으로 빌드한 모델을 테스트 데이터에 대해서 실험해서 나온 결과로 구하게 됩니다.

위의 기본 지표도 상당히 헷갈리는데 간단하게 이해하려면 True와 False는 기계(모델)이 한 행위가 맞다 틀리다를 표현하는 것이고 Positive와 Netagive는 모델이 데이터 레코드를 어떻게 판별했는가를 나타냅니다.

True Positive라면 모델은 데이터레코드를 긍정이라고 판단했고 True이기 때문에 모델이 긍정이라고 한 것이 맞다! 라는 뜻입니다.

False Negative라면 모델은 데이터 레코드를 부정으로 판단했고 False이기 때문에 모델이 그렇게 판단한 것이 틀렸다는 의미입니다. 풀어서 설명하면 False Negative는 모델이 부정이라고 했지만 사실 정답은 긍정인것이라 모델이 네가티브로 판별한 것은 틀렸다는 의미입니다.

그 뒤에 2차 지표를 구하게 되는데

이것들이 precision, Recall, Accuracy, F1-score, F-beta score 같은 것들입니다.

이 지표들은 Confusion Matrix안에 있는 4개의 기초 카운트값으로 계산해서 구할 수 있고 보통 비율값으로 계산이 됩니다.

RFM 분석, RFM Analysis, 리테일 고객 분석하기

RFM에 대해서 간단하게 정리한 것을 올립니다.
더 복잡한 분석기법이나 모델링 방법은 다른 포스트에 올려보겠습니다.

RFM 정의

RFM은 마케팅 분석 방법 중 하나입니다.
온라인 리테일(물건을 판매하는 사업)에서 고객 군집을 고객의 최종 방문수, 유휴시간, 소비금액을 기준으로 나누고 각 군집이 어떻게 유지되고 변화하는지에 따라서 현재 비즈니스 상태를 파악하고 문제가 있다면 어떻게 대응해야 할지를 판단하는데 쓰는 방벘입니다.

온라인 리테일이라면 쿠팡, 위메프, 티몬, 지마켓, 11번가, SSG 등을 생각하면 쉬울 것입니다.

RFM은 디지털마케팅 기법을 이용해서 기업을 성장시키는 그로쓰해킹 (Growth Hacking)에서도 자주 쓰이는 분석지표입니다. 그래서 디지털 마케터, 비즈니스 데이터 분석가라면 반드시 알아야 하는 분석 방법입니다.

RFM의 용어 정리

RFM – Recency, Frequency, Monetary 의 각각 앞 글자를 따서 RFM이라고 부릅니다.

비슷한 것으로 RFD가 있으나 Monetary가 Duration으로 바뀐것 외에는 동일합니다. Duration는 체류기간입니다.

RFD – Recency, Frequency, Duration

RFM에서 고객의 방문 또는 구매 주기의 관점에서 볼 때 구매액은 크게 중요하지 않고 그 보다는 체류시간 같은 것이 더 중요한 비즈니스에서는 머니테리 대신 듀레이션을 사용하기도 합니다.

체류시간이 중요한 비즈니스는 게임입니다. 게임의 체류시간은 어떤 면에서는 게임에서 인앱구매를 하는 것 보다 더 중요할 수 있으며 정액제 게임이고 게임내 구매가 없는 경우라면 활성유저가 많아야 게임이 흥하기 때문입니다. 어쨌든 RFD 분석도 RFM 분석과 같은 것입니다.

RFM과 마케팅 전략

RFM을 한국어로 번역하면 최신성, 빈발성, 통화성(체류성) 으로 해석할 수 있으나 한국어로 번역하면 매우 어색하므로 그대로 리센시, 프리퀀시, 머니테리로 부릅니다.

광고주가 그들의 관점에서 고객(Customer)을 세그멘테이션하고 프로파일링하고 고객의 가치를 판단하고 마케팅 전략을 세우는 데 활용하는 방법입니다.

앞서 말했듯이 리테일 비즈니스 업체 (소비재 물건을 판매하는 업체) 또는 온라인 서비스 업체(넷플릭스, 유튜브, 멜론 같은)가 고객을 분할해서 구분하고 관리하는 오래된 고객 관리 및 분석 기법입니다.

RFM 계산하기

RFM은 고객에게 R, F, M 각각의 점수를 부여하고 그 다음에 점수들을 다시 몇개의 적은 그룹으로 묶은 뒤에 구분한 그룹들을 관리하게 됩니다.

R 점수

R(Recency)은 오늘로 부터 최종 방문한 날까지의 날짜수를 계산합니다. 10일전에 왔다면 R은 10이 됩니다. R점수는 적을 수록 좋은 것입니다.

F 점수

F(Frequency)는 고객이 가입 또는 최초방문 또는 최초구매일로부터 지금까지 구매한 수입니마. 구매한 횟수 일수도 있고 구매한 물건 수 일수도 있지만 보통은 트랜잭션을 기준으로 합니다. 그러니까 결제를 한 번했다면 물건을 여러번 사도 1회로 카운트합니다. F는 높을 수록 좋습니다.

M 점수

M(Moneytary)는 구매한 금액의 총액입니다. F와 마찬가지로 지금까지 구매한 트랜잭션의 금액을 모두 더하면 됩니다. 반품이나 결제취소는 할 수 있다면 계산에서 빼야합니다.

RFM의 점수 분할 척도

R, F, M을 각각 기본 5점 척도로 분할해서 총 125가지 유형으로 고객을 중규모(세그먼트 수가 100을 넘지 않음) 분할해서 관리 계획을 세우고 대책을 만들어 정복합니다.

R, F, M은 각각 척도를 주고 양적점수에 의한 순서로 등분할 하는데 (Quantile) 척도는 3 ~ 5점 등으로 분석하는 사람과 업체에 따라 다르게 할 수 있으나 기본 5점으로 분할하는 예가 가장 많습니다.

아까 구한 R값을 기준으로 역순정렬해서 퀀타일로 고객그룹을 5개로 균등분할해서 각 고객에게 R점수를 1 ~ 5점으로 부여합니다. R은 숫자가 낮을 수록 좋은 것이기 때문에 역순정렬합니다.

F값은 순 정렬해서 역시 순서대로 5개로 균등분할해서 F점수를 부여하고 M도 마찬가지로 순정렬해서 5개로 부여합니다.

예를들어 지금까지 가입한 고객이 총 100명이라면 R=1은 20, R=2도 20, R=3도 20, R=4도 20, R=5도 20명씩이 됩니다. F와 M도 동일하게 각 점수별로 20명씩이됩니다.

퀀타일은 어떤 기준값을 가지고 정렬을 해서 순서대로 균등(또는 최대한 균등

표 – 5점 척도에 의한 RFM 분할

RecencyFrequencyMonetary
555
444
333
222
111

위와 같이 되는데 중요한 것은 나뉘는 그룹이 총 5 x 5 x 5 = 125개 일것 같지만 실제로는 125개가 안될 수도 있습니다.

R=1, F=5, M=5와 같은 특정 조합에 해당하는 고객이 한명도 없을 수 있기 때문입니다.

어쨌든 이렇게 해서 고객들은 최소 5개에서 최대 125개의 그룹으로 나눕니다. 보통 100개 이상의 그룹에 모두 고객이 존재하게 되는데 이건 관리하기 너무 많고 인사이트를 얻기에도 힘듭니다. 그래서 이 그룹들을 다시 관리하기 좋게 의미와 이름을 부여해서 나누고 관리합니다.

캠페인의 전환율을 RFM으로 파악하는 법

캠페인의 전환률이 매우 낮다면 그 이유는 적절한 고객(Customer)에게 타겟팅하지 않았기 때문입니다. 고객 세그먼트는 각각 동일한 캠페인에도 다르게 반응하기 때문입니다.

그래서 고객을 구매 행동에 따라 다르게 분류해야 할 필요가 있고 분류된 세그먼트별로 다른 접근 방법으로 다르게 접근해야 합니다.

충성고객에게는 상품이 형편없지만 않으면 구매를 합니다. 하지만 비충성 고객에게는 매리트가 충분히 있는 비교적 가격 경쟁력이 높으면서 구매 부담이 없는 제품을 캠페인으로 보여주지 않으면 클릭하지 않습니다.

RFM은 행동 기반의 고객 세그먼트를 위해 이미 증명된 마케팅 모델입니다. RFM은 거래 내역(transaction history)으로 얼마나 최근에, 얼마나 자주, 얼마나 많은 돈을 지불했는지로 고객을 그루핑(grouping) 합니다.

RFM은 파라미터 3개를 사용하는 이유는 고객 가치평가는 1개의 파라미터만으로는 부족할 수 있기 때문입니다.

RFM의 3개의 척도중에서 보통은 가장 좋은 고객은 가장 많은 금액을 지불한 고객이라는 데는 대부분 동의하지만 그 고객이 아주 오래전에 딱 한 번 구매를 했고 더 이상 우리 제품을 사용하지 않는다면 최고의 고객이 아닐 가능성이 큽니다.

그래서 RFM은 3개의 고객 속성으로 고객을 순위화(rank)합니다.

고객이 최근에 구매했다면 더 높은 점수를 주고

고객이 빈번하게 구매했다면 더 높은 점수를 주고

고객이 많은 돈을 지불했다면 더 높은 점수를 줍니다.

그리고 3가지 점수를 병합해서 RFM 점수를 만듭니다.

그런 후에 고객을 RFM(Recency – Frequency – Monetary) 점수로 서로 다른 그룹으로 분할할 수 있다. 반대로 말하면 동질 그룹으로 묶을 수 있게 됩니다.

고객을 여러 다른 세그먼트 체계로 분할 수 있지만 보통 11개 정도로 분할하는 것을 추천하고 있습니다.

RFM 세그먼트 분할표1

#세그먼트 (Customer Segment) 별칭한글 별칭활동 (Activity)대응 방안 (Actionable Tip)
1Champions챔피온Bought recently, buy often and spend the most!Reward them. Can be early adopters for new products. Will promote your brand.
2Loyal Customers로얄(충성고객)Spend good money with us often. Responsive to promotions.Upsell higher value products. Ask for reviews. Engage them.
3Potential Loyalist잠재 로얄 (잠재적 충성고객)Recent customers, but spent a good amount and bought more than once.Offer membership/loyalty program, recommend other products.
4Recent Customers단골 고객Bought most recently, but not often.Provide onboarding support, give them early success, start building a relationship.
5Promising유망 고객Recent shoppers, but haven’t spent much.Create brand awareness, offer free trials
6Customers Needing Attention주목해야 할 고객Above average recency, frequency and monetary values. May not have bought very recently though.Make limited time offers, Recommend based on past purchases. Reactivate them.
7About To Sleep휴면 직전 고객Below average recency, frequency and monetary values. Will lose them if not reactivated.Share valuable resources, recommend popular products / renewals at discount, reconnect with them.
8At Risk떠나면 위험한 고객Spent big money and purchased often. But long time ago. Need to bring them back!Send personalized emails to reconnect, offer renewals, provide helpful resources.
9Can’t Lose Them붙잡아야 할 고객Made biggest purchases, and often. But haven’t returned for a long time.Win them back via renewals or newer products, don’t lose them to competition, talk to them.
10Hibernating동면 고객Last purchase was long back, low spenders and low number of orders.Offer other relevant products and special discounts. Recreate brand value.
11Lost떠난 고객Lowest recency, frequency and monetary scores.Revive interest with reach out campaign, ignore otherwise.

RFM 세그먼트 분할표2

통계학적 RFM Analysis를 위해서 예제로 제시한 RFM 점수와 세그먼트 분할표

SEGMENTDESCRIPTIONRFM
ChampionsBought recently, buy often and spend the most4 – 54 – 54 – 5
Loyal CustomersSpend good money. Responsive to promotions2 – 43 – 44 – 5
Potential LoyalistRecent customers spent good amount, bought more than once3 – 51 – 31 – 3
New CustomersBought more recently, but not often4 – 5< 2< 2
PromisingRecent shoppers, but haven’t spent much3 – 4< 2< 2
Need AttentionAbove-average recency, frequency & monetary values3 – 43 – 43 – 4
About To SleepBelow average recency, frequency & monetary values2 – 3< 3< 3
At RiskSpent big money, purchased often but a long time ago< 32 – 52 – 5
Can’t Lose ThemMade big purchases and often, but a long time ago< 24 – 54 – 5
HibernatingLow spenders, low frequency, purchased a long time ago2 – 32 – 32 – 3
LostLowest recency, frequency & monetary scores< 2< 2< 2

이 세그먼트 분할 기준으로 여러 세그먼트에 중복 분류되는 고객군이 있을 수 있으므로 다소 문제가 있을 수 있다.

문제점

  • 조건 적용에 순서에 따라 분할되지 않은 세그먼트가 발생하므로 범위에 따른 조건의 적용 순서를 재배열 해야함
  • 조건에 포함되지 않는 고객들이 있음
    • 모든 고객들이 꼭 1개의 세그먼트에 포함되어야 하는가에 대한 결정 문제가 있음
    • 고객들이 2개 이상의 세그먼트에 겹쳐서 포함되어도 괜찮은가에 대한 결정 문제가 있음
    • 세그먼트간 경곗값이 크지 않으면 세그먼트를 합치거나 중복해야 할 수 있음

코멘트

  • RFM 그룹에 따라 광고배너의 내러티브를 변경하는 것이 더 나을 수 있음
    • 저희의 최고의 고객이십니다. 고객님이 지금 가글을 한 병 사시면 한 병 더 드립니다. 뭐 이런식으로? 해줘야 한다.

RFM 점수 계산

RFM점수는 다음의 3가지 행동 데이터를 기반으로 계산합니다.

  • Recency (R): 마지막으로 구매한 후에 오늘까지 몇일이 지났는가?
  • Frequency (F): 지금까지 전체 구매(거래)가 몇번 있었는가?
  • Monetary (M): 지금까지 전체 구매한 금액은 얼마인가?

위의 값을 계산한 후에 1 ~ 5점의 척도로 바꾸면 RFM 점수(RFM score)가 된다.

RFM 데이터 처리 흐름 Data processing workflow

비닝 binning

Percentile 또는 Quantile 기반으로 개체수에 따른 등분할 합니다. 동일하거나 거의 비슷한 수가 되도록 분할하는 것입니다.

이것은 상대적 분할이기 때문에 절대 기준이라고생각해서는 안됩니다. RFM은 상대적으로 좋은 고객인지 위험한 고객인지를 아는 것이지 절대적으로 좋은 고객 안좋은 고객을 알아내는 지표는 아닙니다.

특히 업종별로는 고객의 구매 관련 행동 패턴의 양상이 다르므로 비교하는데 사용하기 어렵지만 같은 업종끼리라면 비슷한 업종의 회사의 RFM 고객 세그먼트는 비교대상이 됩니다.

RFM의 문제점

프로파일링 문제1

세그먼트를 분할하고 분할 세그먼트에 네이밍 또는 정의(definition)을 사람에 의해서 해석해야 하는 문제. 샘플이 있으므로 샘플 이용해 시도한 후에 정의하는 방법을 알아낼 수 있습니다.

프로파일링 문제2

세그먼트 분할 후 각 세그먼트의 분포와 개체수를 확인하고 나서 문제를 알게 되는데 문제의 원인을 알기 위해서는 고객사 현업의 경험 지식이 필요합니다.

프로파일링 문제3

세그먼트에 대한 분할 예제가 있으나 주관적(업체별)일 수 있어 공통된 세그멘테이션 방법으로 진행해도 무리가 없을지에 대한 판단이 필요

  •  우선 공통 기준으로 세그먼트를 모두 나눈 뒤 업종별 또는 광고주별로 세그먼트의 분할이 어떻게 되었는지 성과는 어떠했는지, 변화는 어떻게 되어 왔는지 구분해서 비교 리포트를 작성한다.
  • 작성한 후 세그먼트 분할 기준을 각각 따로 할지 공통으로 할지 재결정한다. 가능하다면 공통 기준으로 가는 것이 비교 분석을 하기 편리하므로 그에 대한 가중치를 주고 결정을 하도록 한다.
  • 타일을 분할할 때 타일간의 대푯값의 차이가 없는 경우 타일 수를 조절해야 할 수 있는데 조절하지 않고 대푯값의 차이와 분포의 현상태만 나열해 둔다. 

RFM 세그먼트 활용 방법

간단하게는 RFM세그먼트를 약 3가지로 활용할 수 있을 것으로 기대할 수 있습니다.

현재 사업의 상태를 파악할 수 있습니다.

  • 비즈니스가 망해가고 있는지 잘되고 있는지 조치가 필요한지를 알 수 있습니다.

비즈니스 개선을 위해서 집중해야 할 세그먼트를 알아낼 수 있고 세그먼트를 공략하기 위한 캠페인 진행 방법을 선택할 수 있습니다.

  • 어떤 세그먼트에 문제가 있는지? 고객 리텐션이 필요한지, 이탈 방지가 필요한지, 신규 고객 입수가 필요한지, 기존 고객의 구매 활성화가 필요한지 등
  • 위의 해석에 따라 캠페인 상품을 깔 맞춰서 제안할 수 있고 진행을 시도할 수 있다.

역으로 특정 캠페인에 적합한 세그먼트를 찾아내서 데이터 교환으로 활용할 수 있습니다.

  • 어떤 업체의 어떤 세그먼트는 어떤 다른 업체에게는 좋은 세그먼트가 될 수 있다.
  • 통신사에서 요금제를 새로 구매한 고객 세그먼트는 핸드폰 악세사리를 판매하는 광고에 활용한다던가 (이런 것을 스토리라인 캠페인이라고 부름)

참고 자료