brunch

SHAP 분석으로 예측을 해석하다

Kaggle "Marketing & Product 데이터"로 실습하기

by 이건승
예측 모델, 그 너머를 보고 싶을 때


데이터 기반 의사결정에서 머신러닝 모델은 놀라운 예측력을 보여줍니다. 하지만 실무에서 자주 이런 질문이 따라옵니다.


“모델은 잘 맞는데... 왜 이런 결과가 나왔는지 설명할 수 있을까?”


예를 들어 마케팅 캠페인 데이터를 기반으로 매출(Revenue_Generated)을 예측하는 모델을 만들었다고 가정해 봅시다. 모델의 예측 정확도가 아무리 높더라도, 다음과 같은 질문이 해결되지 않으면 전략적 의사결정에 한계가 생깁니다.


✔️ 어떤 변수들이 매출에 가장 큰 영향을 주었는가?

✔️ 할인율을 높인 것이 매출에 긍정적으로 작용했는가, 아니면 오히려 해가 되었는가?

✔️ ROI가 높은 캠페인의 공통된 특성은 무엇인가?



SHAP이란 무엇인가?


SHAP(SHapley Additive exPlanations)는 머신러닝 모델의 예측 결과를 각 입력 변수의 기여도로 분해해 정량적으로 설명하는 방법입니다. 즉, 예측값이라는 결과가 어떻게 나왔는지를 각 변수들이 얼마만큼 기여했는지 수치로 보여주는 도구입니다.


쉽게 말해 이렇게 생각할 수 있습니다

"모델이 A라는 결과를 낸 이유를, 각 변수들이 얼마만큼 기여했는지 수치로 보여주는 방식"


이 기법은 게임이론에서 유래한 ‘샤플리값(Shapley value)’ 개념을 기반으로 합니다. 각 변수는 일종의 ‘참가자’로 간주되고, 이들이 협력해서 예측이라는 ‘성과’를 만들어냈을 때, 각자가 얼마나 공헌했는지를 공정하게 나누는 방식입니다.


다음과 같은 예시를 통해, 직관적으로 이해해 봅시다.


모델이 특정 캠페인의 매출을 $80,000로 예측했다고 해봅시다. 전체 평균 매출은 $50,000입니다. 그렇다면 모델은 평균보다 $30,000 더 높게 예측한 셈입니다. SHAP은 이 $30,000이 어떤 변수에 의해 설명되는지 아래처럼 보여줍니다.


그리고 SHAP 분석은 다음과 같은 강점을 가지고 있습니다.


1. 변수의 중요도 시각화

어떤 변수가 전체적으로 예측에 큰 영향을 주는지를 직관적으로 이해할 수 있음


2. 양/음 영향력 구분

예측값을 높이는 변수와 낮추는 변수를 명확히 분리


3. 개별 예측 해석

샘플 단위로 "왜 이 결과가 나왔는지" 설명 가능


4. 모델에 독립적

트리, 회귀, 신경망 등 대부분의 모델에서 사용 가능



실습 예제. Marketing and Product Performance


이제 본격적으로 SHAP을 직접 적용해 보겠습니다. 우리가 사용할 데이터셋은 Kaggle에서 제공하는 Marketing and Product Performance Dataset입니다. 이 데이터는 마케팅 예산, 할인율, 전환율, 제품 번들 가격 등의 변수로 구성되어 있으며, 우리가 궁금한 ‘매출에 영향을 주는 요인’을 분석하기에 적합한 구조를 가지고 있습니다.


데이터셋은 마케팅 캠페인과 그 결과를 중심으로 구성되어 있으며, 각 열은 캠페인, 고객, 제품, 판매 성과와 관련된 정보를 담고 있습니다.

우선 데이터의 전반적인 분포를 파악하기 위해 .describe() 메서드를 사용합니다. 이 명령어는 각 변수에 대해 평균, 표준편차, 최솟값, 최댓값 등을 한눈에 보여줍니다.

*참고. df.describe().T는 .describe()의 결과를 전치(transpose)해서 변수명이 행으로 나오도록 바꿉니다. 특히 변수 개수가 많고 행이 적을 때 가독성이 훨씬 좋아집니다.

평균 매출(Revenue_Generated)은 약 $50,038이고, 평균 ROI는 2.76으로 양호하지만, 일부는 손해도 존재합니다. 할인율은 평균 39.4%로 할인율이 꽤 높은 캠페인들이 포함되어 있습니다. Customer_Satisfaction_Post_Refund는 1~4점으로 구성된 만족도 점수로 보이며, 평균은 2.5점 수준을 보이고 있습니다.

변수 간 상관관계를 살펴보면, Revenue_Generated와 대부분 변수 간 상관성은 거의 없는 것으로 보입니다. 이는 SHAP 분석이 필요한 이유이기도 합니다. 단순 상관계수로는 변수의 진짜 영향력을 파악하기 어렵기 때문입니다.


Revenue_Generated는 단일 변수로 설명되기 어려운 복합적인 요인들의 결과로 보이며, 따라서 우리는 랜덤포레스트와 SHAP을 통해 변수들의 영향력을 본격적으로 분석해 볼 것입니다.



예측 모델을 구축해 보자


앞서 살펴본 대로 Revenue_Generated는 단순한 변수 하나로 설명되기 어려운 복합적인 결과입니다. 이제 우리는 머신러닝 모델을 활용해 이 값을 예측해 보고, 예측에 기여한 주요 변수들을 SHAP으로 분석하는 기반을 만들겠습니다.


분석에 사용할 변수 구성

숫자형 변수: 예산, 클릭 수, 전환 수, 판매 수량 등

범주형 변수 : Subscription_Tier (Basic, Standard, Premium)


Random Forest 모델을 생성해 보겠습니다.

생성된 모델 성능을 평가하면 RMSE(Root Mean Squared Error) 값이 29,097.56으로 이는 테스트셋에서 모델이 예측한 매출이 실제 매출과 평균적으로 약 $29,098 정도 차이가 났음을 의미합니다. 데이터의 평균 매출이 약 $50,000 수준이므로, 예측 오차는 약 58% 정도입니다.


따라서, 이 모델의 성능을 개선해 보도록 하겠습니다. 우선, 예측하는 매출을 로그 변환을 하고 동시에 이상치를 제거하겠습니다. 추가로 중요 변수를 조합해서 파생변수를 만들어 모델 학습에 유용한 구조적 신호를 주도록 하겠습니다.

개선된 모델의 성능을 평가하면, 로그 스케일 기준 RMSE는 모델이 log(매출)에서 평균 약 ±0.04 정도로 모델이 상당히 정밀하게 학습되었음을 보여줍니다. 원래 기존 단위 RMSE도 평균적으로 약 $1,344 정도 오차를 보이는데, 참고로 데이터 평균 매출이 $50,000 전후였으므로, 이는 오차율 약 2.71%에 해당합니다. 이 정도 수준의 모델이면 상당히 높은 예측 정확도이며, 모델 기반 의사결정에 활용 가능한 수준이라고 할 수 있습니다.



SHAP 분석: 예측 결과를 해석 가능한 인사이트로 전환하기


모델이 예측한 결과가 실무에 의미 있으려면, 무엇이 매출 예측에 영향을 주었는가를 설명할 수 있어야 합니다. SHAP은 바로 이 목적을 위해 도입한 분석 방법입니다. 이제 SHAP 분석을 통해 위에서 생성한 모델을 설명해 보도록 하겠습니다.


먼저 SHAP 분석을 위해 필요한 라이브러리를 설치하고, 코드를 작성합니다.


매출 예측에 영향을 미치는 주요 변수는?

이 그래프는 모델이 매출을 예측할 때 어떤 변수가 평균적으로 얼마나 영향을 주었는지를 보여줍니다. 수평 막대의 길이는 해당 변수의 영향력(평균 SHAP 값 절대값)을 나타냅니다.


당연한 이야기지만 Revenue_per_Unit이 가장 큰 영향력이 있는 변수입니다. 제품 1개당 발생한 매출 수준이 높을수록 예측 결과(매출)가 커졌습니다. 이는 가격 전략 혹은 프리미엄 제품의 효과가 모델에서 강하게 반영되었음을 뜻합니다.


다음 주요 변수는 판매 수량을 나타내는 Units_Sold입니다. 단가가 높더라도 실제로 많이 팔려야 전체 매출이 올라가는 구조이므로, 모델이 자연스럽게 이 변수를 반영한 것입니다. 결국 단가 × 수량 = 매출이라는 기본 구조를 모델이 스스로 학습한 셈입니다.


모델 분석 결과, ROI나 Budget과 같은 변수들은 예측 성능에 큰 영향을 주지 않는 변수로 나타났습니다.

이는 다음과 같은 이유로 해석해 볼 수 있습니다.


특히 ROI는 Revenue / Budget 형태의 파생 변수이기 때문에, 이미 포함된 Revenue_per_Unit이나 Units_Sold와 높은 중복도를 가질 수 있습니다. 모델 입장에서는 ROI를 별도로 고려하지 않아도 유사한 정보를 이미 학습했을 가능성이 큽니다. 또한, ROI는 비즈니스 상 중요한 지표이지만, 이번 예측의 대상은 ‘매출’이었기 때문에 직접적으로 영향을 주는 단가나 수량이 더 유의미한 변수로 작용했습니다. 트리 기반 모델의 특성상, 이처럼 예측에 크게 기여하지 않는 중복 변수는 자동으로 중요도가 낮게 반영되기도 합니다.



Beeswarm Plot : 변수 값이 예측에 미치는 방향까지 이해하기


앞서의 bar plot이 ‘어떤 변수가 중요한가’를 보여줬다면, 이번 beeswarm plot은 "해당 변수의 값이 클 때 예측값을 올리는지/내리는지", 즉 방향성과 분포를 보여줍니다.


SHAP 값이 0보다 크면 → 매출 예측치를 증가시키는 방향

SHAP 값이 0보다 작으면 → 매출 예측치를 감소시키는 방향

컬러가 진할수록 → 해당 변수의 값이 높음 (빨간색), 낮을수록 파란색


주요 변수별 해석

1. Revenue_per_Unit

✔️ 빨간색 점들이 오른쪽에 몰려 있음 → 단가가 높을수록 매출 예측치를 높입니다.

✔️ 반대로, 단가가 낮은 값(파란색)은 매출 예측을 깎는 방향으로 작용합니다.

✔️ 이는 프리미엄 가격 전략이 예측 모델에서도 효과적으로 반영되었음을 시사합니다.


2. Units_Sold

✔️ 단가와 유사한 패턴을 보입니다.

✔️ 판매 수량이 많을수록(빨간색) 모델은 매출을 높게 예측합니다.

✔️ 특히, 수량이 적을 경우에는 예측값을 강하게 낮추는 역할도 보입니다.


3. 기타 변수들 (ROI, Budget, Clicks 등)

✔️ 대부분 SHAP 값이 0 근처에서 밀집되어 있고, 색깔의 경향성도 불분명합니다.

✔️ 이는 모델이 해당 변수들의 변화에 대해 거의 반응하지 않았음을 의미합니다.


SHAP bar plot + beeswarm plot을 함께 활용하면, 단순한 변수 중요도뿐만 아니라 "어떤 값이 모델을 어떤 방향으로 밀었는지"까지 확인할 수 있습니다. 예를 들어 Revenue_per_Unit이 높으면 매출 예측을 높이는 반면, 너무 낮으면 모델이 오히려 매출을 크게 깎아 예측하는 경향을 보였기 때문에, 실무에서는 단가 하향 전략의 리스크도 충분히 감안해야 함을 시사합니다.



Force Plot : 개별 예측에 대한 이유를 한눈에


Base value는 전체 평균 예측값(log scale 기준)이며, 이 기준에서 어떤 변수들이 예측값을 끌어올리거나 낮췄는지를 시각적으로 표현합니다. 빨간색은 예측을 증가, 파란색은 감소시키는 요인입니다.


1. Base Value (기준값) : 전체 데이터의 평균 예측값 (log scale 기준)

2. Feature 영향력 : 각 변수의 값이 예측을 얼마나 끌어올렸는지 또는 낮췄는지

3. 최종 예측값 : 해당 개별 샘플에 대해 모델이 예측한 최종 결과


(예시 1) 예측값을 높인 주요 변수들

첫 번째 샘플의 경우 Units_Sold = 137과 Revenue_per_Unit = 469.4가 예측값을 크게 밀어 올린 요인입니다. 이로 인해 base value(10.44)에서 f(x)=11.08까지 예측이 증가했습니다. 해당 샘플은 판매 수량도 많고 단가도 높아, 자연스럽게 높은 매출로 예측된 것입니다.


(예시 2) 서로 다른 영향이 상쇄된 사례

두 번째 샘플의 경우 Revenue_per_Unit = 2,606으로 매우 높은 단가지만, Units_Sold = 21로 수량이 적어 예측값이 상쇄되었습니다. 결국 base value에서 아주 크게 벗어나지 않은 log revenue 10.97 (약 $58,800 수준)으로 예측된 케이스입니다. 고단가 소량 판매의 한계와 가능성을 동시에 보여줍니다.


마케팅 담당자라면, 단순히 예측 수치만 보는 것이 아니라, “왜 이런 예측이 나왔는가”를 Force Plot으로 확인하며 전략적 인사이트를 도출할 수 있습니다.


예를 들어, 예상보다 낮은 예측값이 나왔다면, 어떤 요소가 매출을 깎았는지를 바로 파악 가능하고 반대로 고매출 캠페인의 요인이 무엇인지도 정확히 알 수 있습니다.



데이터 기반 예측, 설명 가능성까지 확보한 모델링


이번 글에서는 마케팅 및 상품 성과 데이터를 활용해 매출(Revenue_Generated)을 예측하는 모델을 구축하고, 더 나아가 예측 결과를 설명할 수 있는 SHAP 분석까지 이어지는 전 과정을 실습했습니다. 단순히 예측 정확도를 높이는 데 그치지 않고, 모델이 내린 판단의 이유를 이해할 수 있는 해석력(explainability) 또한 확보하는 것이 핵심 목표였습니다.


이 글의 예제에서는 SHAP 분석을 통해 전반적으로 매출에 가장 큰 영향을 준 변수는 다음과 같았습니다.

Revenue_per_Unit (단위당 매출) : 높은 단가일수록 매출 예측치가 상승

Units_Sold (판매 수량) : 많이 팔릴수록 당연히 매출에 긍정적 영향


이외에도 SHAP의 Force Plot을 활용하면 개별 사례별로 어떤 요인이 예측값에 기여했는지 시각적으로 파악할 수 있습니다. 예를 들어, 단가는 높지만 판매 수량이 낮은 고객과 단가는 낮지만 수량이 많은 고객 간의 구성 차이와 매출 기여도를 비교 분석할 수 있었습니다.


이 글에서 다룬 예제는 캐글의 공개 데이터를 활용해 모델링부터 SHAP 분석까지의 전체 과정을 실습 형태로 보여주기 위한 목적이었습니다. 따라서 데이터셋 자체에서 얻는 인사이트보다 중요한 건, SHAP을 활용한 ‘설명 가능한 예측’의 방법론과 적용 방식입니다. 실제 실무에서는 아래와 같은 방향으로 SHAP 분석을 효과적으로 확장할 수 있습니다.


1. 캠페인 사후 성과 예측

캠페인 종료 직후 데이터(클릭 수, 전환 수 등)로 향후 매출을 빠르게 예측하고 ROI를 추정할 수 있습니다.


2. 시뮬레이션 기반 예산 할당

어떤 변수(예: 할인율, 단가, 판매 수량)가 매출에 더 민감한지 파악하여 예산 효율 최적화에 활용할 수 있습니다.


3. 리텐션 전략 설계

매출이 아닌 장기 유저 유지율(리텐션)을 예측 대상으로 설정한다면, SHAP 분석을 통해 리텐션에 기여하는 유저/상품/프로모션 구조를 역으로 도출할 수 있습니다. 대표적인 사례로는, 토스(Toss)에서 SHAP을 활용해 설명력 있는 선행 지표를 전략 수립에 반영한 방식이 있습니다.

출처. 그로스 도메인이 토스를 성장시키는 방법(https://toss.im/career/article/growth-domain)



끝으로


이처럼 모델의 성능뿐 아니라 그 예측이 왜 나왔는지 설명할 수 있는 능력은 비즈니스 실무에서 매우 강력한 무기가 됩니다. 이제는 ‘정확한 예측’만으로는 충분하지 않습니다. 왜 그런 예측이 나왔는지 설명할 수 있는 모델이야말로, 진짜 의사결정을 가능하게 합니다.

keyword