brunch

You can make anything
by writing

C.S.Lewis

by 데이터쟁이 Nov 10. 2020

평균의 함정

퍼센트 표기의 함정



제목 참 그럴싸하다.

 분석 업무를 수행하면서 (비단 분석'가'가 아니더라도, 수치를 관리하고 모니터링해야 하는 어느 포지션이든) 비일비재하게 있는 일인, 지표 정리할 때 수치들이 시계열 단순 리스트업이든 많고 많은 데이터들을 취합한다. 그렇다 보니 자연히 그 숫자들을 뭉치기 위해서 평균값과 같은 집계 함수(Aggregation Function - e.g. sum, avg, min, max, count etc)를 써서 표기하게 되는데 거기에서 발생하는 애로사항이 많게 된다. 




 오픈 한지 얼마 안 되는 (상황의 극적인 전개를 위해) 서비스에서 하루 구매자가 100명도 안 되는 소규모의 이커머스에서 평균 고객당 지출액 (ACV - Average Customer Value)를 구하게 되는데 (실제로 주요 지표로 자주 사용된다, AOV - Average Order Value, AIC - Average Item Value와 함께) 여기에서 빈번하게 발생하는 오류가 있다. 화장품을 판매하는 서비스라고 했을 때 주요 고객층이 10대, 20대 초반인 상황이니 평균 고객당 지출액은 1-2만 원선이라고 가정하자. 여기에 영세한 서비스의 상품의 잠재력을 보고 중국에 개인적으로 떼다 팔 요량으로 (다이궁 代工) 매일 특정 카테고리 구분 없이 인기 상품들을 종류별로 100개씩 사는 고객이 한 명 끼어있다고 한다면, 평균의 의미가 퇴색해버리게 된다. 사용자가 몇백만 명, 구매자가 몇십만 명씩 되는 상황이라면 저런 예외 케이스가 평균에 파묻히게 되겠지만 몇 명 되지 않는 상황이라면 한 명이 전체의 평균을 흐릴 수도 있기 때문. 소수의 Edge case 때문에 평균값이 2배 그 이상으로 상승해버린다거나 하는 경우, 전략을 잘못 세우기 십상이다. 


https://www.azquotes.com/author/91793-Avinash_Kaushik 


1-2만 원이었던 평균 지출액이 갑자기 한 명의 고액 지출 고객으로 인해 3-4만 원으로 집계된다면, 추후 신규 상품들의 가격 책정이나 프로모션의 시뮬레이션, 타깃 고객층 확장에 대한 기준 수립에 난관을 겪게 된다. 

 분석의 대부라는 Avinash Kaushik (요즘은 뭐하고 지내시는지 모르겠다) 이 했던, 진실을 숨기기에 가장 효과적인 방법이 평균이라는 말처럼 평균은 실제 데이터를 단편적으로 혹은 잘못된 시각으로 관찰하게 하기 십상이다.







 이 부분에 대해서 이상치(Outlier)를 제외 혹은 고려하기 위해서 몇 가지 통계적 접근을 하곤 한다. 대표적으로 첨도 (Kurtosis)와 왜도 (Skewness)가 있다. 



왜도, 첨도, 분산, 표준편차... 아무튼 뭐 막 복잡한데 대략적인 느낌적인 느낌만 가져가도 좋다. 왜도는 왜곡(歪曲, distortion) 됐다 할 때의 '왜'자를 쓰는데, 말 그대로 정규분포의 차트에서 한쪽으로 못생기게 기운 것을 말한다. 분포도 상의 최고점이 중앙에 있지 않고 한쪽으로 치우쳐져 있는 상황을 말하는데, 이로 인해 중간값 (Median)과 평균값 (Mean)의 차이가 발생한다. 


 이런 공식이 있지만, 복잡하니까 접어두고 (Python에서는 정말 간단하게 명령어 하나로 뽑을 수 있긴 하다 정말로.) 느낌만 가져가면 아래와 같다. 




필요는 하지만, 다소 복잡한 내용


왜도 값이 음수(A) 일 경우 (Skewed to the left, Negatively skewed) 우측으로 높게 치솟고, 좌측으로 길게 진다 (Long-Tail). 

 왜도 값이 양수(C) 일 경우 (Skewed to the right, Positively skewed) 좌측으로 높게 치솟고, 우측으로 길게 빠진다. 

 중간값 (배열의 딱 중간에 있는 값) 대비 평균값 (모든 값들의 평균)의 위치에 따라 값이 정해지고, 보편적으로 ±2.0 정도의 수준이라면 정규분포 (B)에 해당된다고 보고, 이상치(Outlier)에 대한 고려를 하지 않아도 된다. 


첨도(Kurtosis)는 뾰족한 탑이라는 뜻의 첨탑(尖塔)의 '첨' 자를 쓰고 있다. 차트가 위로 얼마나 뾰족한가를 뜻하는데, 첨도가 양수의 값을 가지면 고첨(Leptokurtic), 음수의 값을 가지면 저첨(platykurtic)이라고 멋있게도 말할 수 있지만(간단하게는 Positive, Negative Kurtosis), 그냥 "뾰족하다" / "평평하다"라고 하자. 아무튼 분포도가 위로 뾰족하게 되면, 데이터의 폭(최대치와 최소치의 간극)이 커진다. 이 값이 0에 수렴할수록 데이터가 전체적으로 고만고만하다는 뜻이고 그렇지 않을수록 차이가 크게 벌어진다는 뜻이다.



 


각설하고 정리하자면, 가지고 있는 데이터의 분포를 계산해서 각종 통계학적 지표들을 추출해서 "몇 이하는 걷어내고, 몇 이상만 걸러서 보자" 면 더할 나위 없이 좋겠지만, 솔직히 좀 어렵지 않은가? 그러니 차트에 뿌려보고, 좀 이상하게 튀어나오는 부분들이 있으면 (x-axis : Volume, y-axis : Quantity 차트 기준), 곰곰이 훑어보고, 해당 케이스가 극단적으로 높아서 전체의 평균을 오염 (Data corruption) 시킬 정도라면, 현실에서의 사례에서는 제외시키고 본다. (고액 매출 사용자는 정말 감사하고 감사해서 따로 VIP 대접을 해드리자 대중과는 다르시다)  










어려운 이야기 (저에게... 도)를 조금 하였으니, 상대적으로 쉬운 이야기를 조금 해보자면 % 의 대한 부분이다. 보통 전환율 (Conversion rate)를 주요 지표로 두고 관리하게 되는데, (구) 영문학도로 조금 진지하게 써보자면, 전환 즉 Convert의 명사형인 Conversion은 A가 B로 변화/변모 함을 말하는데, A는 뭐고 B는 뭐일까? 

이는 목적(Goal)을 달성하였느냐에 따라 달라진다. "서비스 내에서 사용자가 했으면 하는 것"을 목적이라고 정의한다면 해당 목적을 달성하는 비중을 전환율이라고 측정하게 된다. 

 여기까지는 조금 쉬운데, 분석 리포트들을 보다 보면 위 계산식에서 조~금 이상한 점을 찾곤 했다. (내 기준에서만 이상했을 수는 있겠다) 단순히 구매를 목적으로 정한 전환율 즉 구매율을 측정할 때 사실 가능한 공식들이 여럿 있다. Google Analytics를 한창 사용하던 시절에 차용했던 산식이다.


기본은 Specific / Entire인데, 세부 조건이 조금씩 다르다




User based

특정 사용자 / 전체 사용자로 해당 사용자의 경험 여부 자체에 의미를 둘 때 사용한다. 출석체크 이벤트 참여도를 계산할 때 활용할 수 있는 지표인데, 출석체크 이벤트는 다중참여에 의미를 두는 것이 아니라 해당 이벤트를 얼마나 참여했는지가 관점인 지표이기 때문에 이벤트 진행 기간 동안 들어왔던 활성 사용자 (Active user) 중 이벤트 참여 사용자로 나누어 지표를 산출한다. 


Session based

세션은 여러 3rd Partytool에서 (특히나 GA) 주로 사용되는 지표로, '방문의 단위'로 표현된다. User based가 사용자 한 명 한 명에게 해당 목적을 달성했는지 안 했는지만 판가름한다면, 한 가지 디멘션이 추가된다; 세션. 첫 번째 세션은 목적을 달성했고, 두 번째 세션에는 목적을 달성하지 않았다면 사용자 기준에서는 1/1 이므로 100%가 나오지만, 세션 기반에서는 1/2 가 되어 50%가 된다. 이 지표가 활용 가능한 상황은 어떤 상황일까? 

 매 세션마다 "클릭할 이유"가 있는 경우에 해당된다. 예를 들면 첫 랜딩 화면에 롤링 배너가 돌고 있고, 해당 롤링 배너의 노출순서가 매번 랜덤으로 바뀐다고 가정하자. 동일한 세션에는 동일한 배너가 노출되지만, 재접속 시 (=다른 세션이 발급되었을 시) 에는 동일한 배너가 노출되지 않기 때문에, 해당 사용자는 매 방문 시마다 해당 배너를 클릭할 상황이 주어진다. 이는 동일 광고 계좌의 배너들이 소재가 바뀌었다고 해서 사용자가 해당 배너의 클릭 가치(Freshness)를 두고, 다시금 눌러줄지 아니면 내용이 바뀌었어도 동일 계좌이기 때문에 누르지 않을 건지에 대한 판단을 할 수 있는 지표를 제공한다.  


Hit based는 매 노출 시 마다로 측정하게 되는데, 수치의 Fructuation이 심해서 실제로 많이 사용하지 않는다. 

 



(저작권 때문에 혹시 몰라서 브런치의 롤링 배너)





 결국은 특정 / 전체의 공식을 갖고, 전체도 사용자와 세션으로 구분해 두었지만 한 가지 더 신경 써야 할 부분은, '전체'에 대한 정의이다. 전체가 전체지 무슨 정의가 필요한가 라는 생각이 들 수 있지만, 한 가지 예시를 들어보면 이해가 갈 것 같다.

 보통 많이들 관리하는 지표들이 UI적으로 특정 버튼들의 클릭률이다. 해당 클릭률을 어떻게 구할지 생각해본다면 당연히 해당 페이지에 인입된 사용자 중 해당 버튼을 누른 사람이 되겠다. 해당 페이지에 들어온 사람이 그 버튼을 '누를 수 있었는지'가 사실 중요한 포인트다. 예를 들어 해당 버튼이 상품 상세 화면 최하단에 존재했다면, 버튼의 존재 여부 자체를 인지도 못한 채 화면을 이탈하는 사용자도 있을 수 있었기 때문에 '단순히 누르지 않은 사용자'로 구분되기 때문에 단순히 화면이 인입된 사용자를 전체 모수로 잡게 되면 그렇지 않은 사용자들과 모수가 합쳐져서 수치가 명확하게 산출이 되지 않을 수도 있다. 버튼이라고 해서 공감이 어려울 수도 있는데, 상품 썸네일이라고 해보자. 




상품의 썸네일에 해당 상품의 사진, 상품명, 할인율, 배송 타입, 도착 예정일, 별점, 평가 개수가 표시되어 있다. 해당 상품의 상세페이지에 있는 내용들을 몇 줄로 간추려 써두었다. 들어가 보지 않아도 썸네일에 같이 표기된 내용만으로 대략적인 상품에 대한 이해를 할 수 있도록, 또한 얼마나 많은 사람들이 해당 상품을 구매했고 리뷰를 남겼는지도 보여줌으로 클릭을 그리고 궁극적으로 구매를 유도한다. 하지만 이 설명들을 보지도 못한 사용자들이 이 상품의 클릭률을 산출하는데 모수로 포함되어야 할까? 개인적인 견해로는 아니다 쪽이다. 클릭률은 사람들이 '보인 정보를 통해 얼마나 궁금해하였는가?' 이므로, 낮다면 노출의 위치나 노출되는 정보의 종류나 구도를 바꾸어 볼 수 있겠지만, 노출 자체가 되질 않았다면 클릭할 수도 없었던 사람이므로 모수에서 제외하고 계산하는 게 맞다고 본다. 


 그렇다면 어떻게 보면 좋을까, 수정된 산출공식은 이렇다



실제로 누른 사람 (Specific) / 실제로 누를 수 있었던 사람 (Entire)



썸네일의 경우라면, 상품들이 화면에 노출되었을 때 그때 비로소 모수로 카운트되어야 한다. 매 화면 노출 시마다 그 기록(Log)이 남아야 하고, 동일 화면에서 반복 노출되었을 때는 남기지 않고, 화면 이탈 이후 재방문 시에는 다시 남기는 식의 정책도 정의되어야 한다. 




데이터 분석을 함에 있어, 많은 데이터들을 관리하고 시각화하고 인사이트를 도출하기 위해 집계 (Aggregate, Capsulate) 할 때, 단순히 흔히들 사용하는 복합 지표 (Complex metrics)를 사용하는 것은 무관하나 그 지표들의 측정기준에 대한 명확한 이해가 필요하다. 어떤 식으로 활용하는지에 따라 얼마든지 곡해가 가능하기 때문이다. 



작가의 이전글 차트의 장난
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari