고동의 데이터 분석

[분석] 회귀분석으로 의사결정을 도와보기

by 소라고동_

이번 포스팅은 회사에서 업무 상 진행했던 회귀분석에 대한 이야기를 해보려 합니다.
회귀분석에 대한 개념 설명이나 검증방법과 같은 이론적인 부분은 거의 다루지 않을 예정이며,
그저 실무에서 어떻게 회귀분석이라는 개념을 엮어서 활용했는지에 대한 경험적인 내용만 담아볼 생각입니다.
 
 


0. 회귀분석이란?

회귀분석은 기본적으로 통계학, 심리학, 경영학 등 다양한 학문에서 활용되고 배울 수 있는 통계적 기법입니다.
다양한 모델링 기법들이 존재하지만 회귀분석은 간단하게 변수와 변수 간의 관계를 확인할 수 있다는 장점이 있죠.
 
잘 아시겠지만 아주 간단하게 회귀분석에 대해서 설명을 하고 넘어가 보겠습니다.

회귀분석 (Regression Analysis)
 - 독립변수들이 종속변수에 얼마나 영향을 미치는지를 파악하여
   독립변수들의 변화에 따라 종속변수가 어떻게 변화하는지 예측하는 통계적 분석 방법

뭐가 어려워 보이는 말로 설명을 했지만 용어에 대한 정의만 제대로 내릴 수 있다면 사실상 간단한 내용입니다.

  • 종속변수 : 예측을 하고자 하는 값
  • 독립변수 : 종속변수 값에 영향을 미치는 변수
  • 계수 : '얼마나 영향을 미치는지'에서 '얼마나'에 해당하는 부분

 

즉, 각각의 독립변수들의 계수를 알아낸 뒤 그 계수들에 독립변수를 곱해줌으로써 종속변수를 예측하는 방법

이것이 회귀분석에 기본적인 내용입니다.
 
 

0.1. 회귀분석을 진행하게 된 배경

제가 근무하고 있는 회사의 플랫폼에는 다양한 구좌들이 존재하는데요.
(여기서 구좌라는 것은 '플랫폼 내에서 존재하는 하나의 자리'라고 생각하시면 됩니다.)
각각의 구좌에 진열되는 상품들은 구좌 특성에 맞는 상품들이 진열되고 각각의 목표를 가지게 됩니다.
 
메인 페이지에 노출되는 구좌일수록, 그리고 페이지 상단에 노출되는 구좌일수록 당연히 더 높은 매출을 기대하게 되고요.
그리고 기대치가 높은 구좌에서 기대만큼 매출을 발생시키지 못한다면 그만큼의 기회 손실이 발생하기도 하죠.
 
이런 기회손실을 최소화하기 위해서 실시간 매출을 확인하며 해당 구좌 내 상품들이 목표를 달성할 수 있을지에 대한 판단을 하고,
목표 달성이 어렵다고 판단될 경우엔 해당 상품을 구좌에서 내리고 다른 상품을 올리는 방식으로 기회 손실을 최소화하고 있었습니다.
 
그런데 이 교체에 대한 의사결정을 주관적으로 감에 의존해서 진행하는 것은 당연히 비효율적이고, 기존의 로직에 대한 고도화가 필요하다는 요청이 발생하여 회귀분석을 진행하게 되었습니다.
 
즉, 회귀분석의 목적은 이렇습니다.

플랫폼 내의 노출도가 굉장히 높은 구좌의 상품들의 목표 매출 달성 여부를 파악하여 기회손실을 줄이기 위함

 
 

0.2. 회귀분석을 선택한 이유

위에서 구좌 내 상품들의 목표 매출 달성 여부를 파악하기 위해 예측 모델을 사용해야 한다는 목적을 말씀드렸는데요.
다양한 모델들 중 왜 회귀 분석을 사용했는지에 대해서도 간단히 이야기해보려 합니다.
 
회귀분석을 선택하게 된 이유에는 여러 가지 이유가 존재했습니다.

< 회귀분석을 선택한 이유 >
1. 짧은 기간 내 진행해야 하는 업무였기 때문에 간단하지만 비교적 접근이 쉽고 잘 알려져 있는 분석 방법 선택 필요

2. 예측 결과에 대한 이유를 어느 정도 설명할 수 있음
   (독립변수와 회귀 계수를 이용해서)

3. 모델링을 전문적으로 돌릴 환경이 구축되어 있지 않음 (사실 있어도 모델링할 능력이 없음)

더 좋은 예측 방법이 많이 있겠지만 우선은 위와 같은 이유로 회귀분석을 활용해 보기로 했습니다.
그런 이야기도 있잖아요.
초창기의 추천 모델은 rule 기반의 추천만 해도 어느 정도의 정확도와 만족도를 이끌어낼 수 있다는 이야기를요.
 
그렇기 때문에 상황에 맞지 않는 거창한 모델을 선택하기보다는 잘 알고 있고, 어느 정도 예측 결과를 설명할 수 있는 회귀분석을 선택했습니다.
(만약 이 회귀분석의 결과에서 더욱 고도화가 필요한 경우라면 모델링을 전문적으로 하는 팀으로 업무가 이관되어야 할 듯하네요.)
 
이렇게 회귀분석을 하게 된 배경과 이유를 이야기해 봤는데요.
이젠 어떻게 회귀 분석을 진행했는지, 그리고 그 속에서 어떤 것들을 느끼게 되었는지를 이야기해 보겠습니다.
 
 
 


1. 회귀분석 진행 흐름

제가 진행했던 회귀 분석의 흐름을 정리해 보면 이렇습니다.
 

1.1. 회귀분석에 사용할 독립 변수 정하기

먼저 회귀분석에서 사용할 독립 변수들을 선정해야 했습니다.
여기서 변수를 선정한 기준이 있는데요.

1) 당연히 해당 구좌의 매출에 영향을 미치는 변수여야 한다.
  이 부분에서는 과거에 간단히 해당 구좌에 대한 분석을 진행했었던 경험이 있었고,
   상품의 가격, 할인율 등의 기본적으로 고려되는 변수들이 있었기 때문에 어렵지 않게 변수 후보들을 선정할 수 있었습니다.

2) 실시간성으로 예측 결과를 보여줘야 하기 때문에 실시간성 집계가 가능한 변수여야 한다.
   아무리 영향력이 높을 것 같은 변수라고 하더라도, 실제로 실시간성으로 목표 매출 달성 여부를 파악해야 하는 목적을 가지고 있었기 때문에,
   실시간 수집이 가능한 데이터인지, 그리고 그 부분에서 너무 많은 리소스가 들어가지는 않는지를 확인해야 했습니다.

이 과정에서 회사 내에서 모델링을 담당하고 있는 팀과의 미팅을 진행해 보면서 피드백을 받기도 했고, 조언을 받으며 변수 선정에 고민을 했습니다.
그리고 이렇게 선정한 변수들을 가지고 회귀분석을 진행하게 되었습니다.
 
 
 

1.2. 데이터 셋 만들기

이렇게 독립변수들을 선정하고 나서는 이 독립변수들과 종속변수를 포함하고 있는 데이터셋을 만들어야 했습니다.
즉, 모델을 만들기 위해 학습할 데이터셋을 만들어야 했죠.
이 부분은 데이터를 추출해서 데이터셋을 만드는 것이 모든 것인 과정이지만, 이 과정이 굉장히 중요함을 뼈저리게 느꼈습니다.
왜냐하면 데이터셋을 만드는 과정에서 어떻게 전처리를 진행하느냐에 따라서 회귀모델의 예측력이 달라졌기 때문입니다.
 
사실 처음 데이터셋을 만들 땐 어렵지 않게 금방 데이터셋을 만들어낼 수 있다고 생각을 했었습니다.
그런데 역시나 아니었죠..
데이터가 예쁘게 쌓여있으면 좋았겠지만 프로모션과 관련된 데이터들은 수시로 변동이 생기다 보니,

  • 구글 시트에서 해당 내용(구좌 위치 및 상품 리스트)들이 관리되고 있었고,
  • 사람이 입력하다 보니 어쩔 수 없는 휴먼에러들이 종종 존재했습니다.

 
그래서 전처리를 진행할 때 신경을 많이 썼던 부분을 정리하면 이렇습니다.

1. 실제로 해당 구좌에서 라이브 된 상품만 데이터셋에 넣는다.
   ㄴ 당연한 전제이지만, 해당 구글 시트에는 라이브 된 상품과 대체되었을 때 후보가 되는 상품들, 추석/설날 등의 특수한 상황 등이 모두 포함되어 있었기 때문에 이 부분에서의 전처리가 필요했습니다.

2. 중간에 대체된 상품 (빠지거나/추가되거나)은 제외한다.
   ㄴ 해당 구좌의 시작과 끝을 모두 경험하지 않은 상품은 구좌 종료 시 매출을 예측하는데 제대로 된 학습을 방해하기 때문에 제외했습니다.

3. 비정상적으로 매출이 적게 발생한 상품은 제외한다.
   ㄴ 예를 들면 라이브를 시작한 지 4시간이 되었는데도 매출이 0으로 집계되어 있는 경우는 사실상 라이브 되지 않았지만 시트엔 라이브 되었다고 기입되어 있는 오류라고 판단하여 제외했습니다.

이렇게 전처리를 하고 나니 데이터의 샘플 수가 많이 줄어들긴 했지만, 그럴수록 더 확실히 전처리가 필요하다는 생각이 들었습니다.
데이터 샘플의 수가 많으면 이상치가 미치는 영향이 적어지겠지만, 샘플의 수가 적은 경우에는 이상치 하나하나가 영향을 크게 미친다고 생각했기 때문입니다.
 
아무튼 이런 시행착오를 겪으면서 전처리를 하는 데 신경을 많이 썼고, 이렇게 만들어진 데이터셋을 이용해서 회귀분석을 진행하게 되었습니다.
 
 
 

1.3. 회귀분석을 진행하면서 어떤 독립 변수를 선택할지 시행착오 겪기

이렇게 생각했던 독립변수들을 가지고 회귀분석을 진행했다고 끝난다면 정말 좋았겠지만, 현실을 당연히도 그렇지 않았습니다.
제가 생각하기에 회귀분석을 함에 있어서 전처리 다음으로 중요한 부분은 변수를 선택하는 일이었습니다.
회귀분석은 무작정 많은 변수를 넣는다고 해서 예측력이 높아지는 모델이 아니기 때문입니다.
오히려 변수 간의 상관관계가 너무 높을 경우엔 다중공선성의 문제가 발생해서 오히려 예측력을 떨어뜨리기 때문에 변수를 선별하는 과정이 필요했습니다.
 
이를 위해서 우선은 변수 간의 상관관계를 확인했습니다.
변수 간의 상관관계를 확인했을 때 상관관계가 지나치게 높은 (= 0.9 이상) 변수들이 있었고 그 변수들은 제외했습니다.

변수 제외

 
그렇게 상관관계가 높은 변수를 제외하고 나서는 VIF(=분산팽창지수)를 확인했는데요.
상관관계가 높은 변수들을 제외했음에도 VIF가 높은 변수들이 존재했습니다.
 
VIF가 높은 변수들을 무작정 제외할 수도 있겠지만, 우선은 다중공선성이 높다고 나온 변수들이 유의한 변수인지를 살펴봤습니다.
회귀분석을 업무에서 적용해 보기 위해 찾아본 내용 중 아래와 같은 내용이 있었는데요.

다중공선성이 있음에도 해당 독립변수가 유의하다면,
표준오차가 비정상적으로 팽창되었음에도 유의하다는 의미이므로 그 자체로 매우 유의미하다는 의미가 되어 그대로 두어도 무방함

 
위 내용에 대해서 이해한 바를 설명해 보면 아래와 같이 이야기할 수 있습니다.

  • 다중공선성이 발생하면 회귀 계수의 표준오차가 비정상적으로 커짐
  • 회귀계수의 유의성은 t값에 의해 결정되는데, t값은 회귀계수를 표준오차로 나누어서 계산
  • 다중공선성이 발생하여 표준오차가 비정상적으로 커졌음에도 불구하고 (= t값을 구성하는 분모가 아주 커졌음에도) 해당 변수가 유의하다는 것은,
  • 그 변수가 그 자체로 너무나도 유의미하다는 의미이므로 제외하지 않고 사용해도 됨

 
이러한 이유로 VIF 가 높게 나왔음에도 회귀분석에서 유의한 변수는 제외하지 않고 그대로 사용하기로 했습니다.
 
위와 같은 과정으로 변수들을 일차적으로 제외한 뒤 회귀 모델을 만들어봤는데요.
사실 이 과정을 통해 변수를 선정하고 나서도 여러 변수들을 넣고 빼면서 여러 회귀 모델을 만들어 성능을 비교해 보는 작업을 진행했습니다.
 
 

1.4. 기존 모델과 비교하기

이렇게 위와 같은 과정을 통해 3개 정도의 회귀 모델을 만들었고, 그 모델들을 실제 값에 적용해 보면서 기존에 사용하던 로직이 만들어낸 예측값과 비교를 했습니다.
이렇게 모델 비교를 할 때 중요한 비교 지표로 2개의 지표를 선정했습니다.

1. 달성 여부에 대한 정확도
    이 모델의 목적은 구좌 내 상품들의 목표 매출 달성 여부를 알아내는 것이었습니다.
    그렇기 때문에 달성을 했는지, 그렇지 못했는지에 대한 예측을 정확하게 했는지에 대한 정확도를 중요하게 살펴봤습니다.

2. 예측 매출의 정확도 = (예상 매출값/실제 매출값)*100
    추가적으로 모델을 통해 예측한 값이 실제 매출과 얼마나 유사한지에 대한 정확도를 살펴봤습니다.
    (100%에 가까울수록 정확한 예측)
    사실 달성 여부만 예측을 하면 될 것이라고 생각을 했지만, 만약 예측값이 목푯값보다 훨씬 높게 나왔을 경우
    물류센터 측에서도 대응을 하는 경우가 있다고 하여 예측 매출의 정확도도 하나의 지표로 선정하여 살펴봤습니다.

이렇게 2가지 지표를 기준으로 살펴봤을 때,
'달성 여부에 대한 정확도'는 기존의 모델과 유사한 정도의 정확도를 보였지만 '예측 매출의 정확도'는 기존 로직보다 안정적인 모습을 보였습니다. (기존 로직보다 낮은 표준편차와 100%에 더 가까운 평균 예측 매출 정확도를 기록함)
 
 
 


2. 실무에 적용하기 (진행 중)

이렇게 만들어낸 회귀 모델이 기존의 로직보다 더 나은 성능을 보여주었기 때문에 예측 로직을 팀 내에서 작업한 로직으로 변경하기로 의사결정이 났습니다.
현재에는 해당 매출 예측값에 대한 정보를 대시보드나 Slack을 통해서 주기적으로 제공해 주기 위한 작업을 진행 중인데요.
해당 부분은 작업이 완료된 후 정상적으로 루틴이 돌아가기 시작했을 때 다시 이야기해 보도록 하겠습니다.
 
 
 


3. 끝마치며

아무튼 이렇게 회귀 분석을 실제 업무에 적용해 볼 기회가 있었는데요.
아쉬운 점은 아직 해당 구좌에 대한 데이터가 많이 쌓여있지 않았기 때문에 꼭 넣어주면 좋을 것 같은 변수들을 넣었을 때, 오히려 정확도가 떨어지는 케이스가 많았습니다.
그래서 샘플이 더 쌓이게 되면 회귀 모델을 고도화하여 보다 정확한 모델을 만들어내고 싶은 마음이 드네요.
 
그리고 평소에는 모델의 예측력을 높이거나 모델을 고도화시키는 모델링 작업에 대한 큰 흥미가 없었는데요.
이번 업무를 계기로 이러한 모델이 의사결정에 활용될 수 있음을 직접적으로 느낄 수 있었고 보다 정확한 의사결정을 위해서 필요한 작업이라는 것을 알게 되어 이 부분에 흥미를 가질 수 있었습니다.
(역시 경험해 봐야 관심이 가고 관심이 있어야 이해를 쉽게 할 수 있네요)
 
이렇게 회귀 모델을 만들어보는 과정에 대해 오늘 이야기를 해봤는데요.
다음번에 기회가 된다면 해당 모델을 고도화하는 과정도 다룰 수 있었으면 좋겠습니다.
 
읽어주셔서 감사합니다.
 
 
 

3.1. 참고한 자료

 

블로그의 정보

고동의 데이터 분석

소라고동_

활동하기