로지스틱 회귀 파이썬 연습 예제1 – 놀이공원 데이터

Share

지난 글에서 로지스틱 회귀에 대해 알아보았다. 파이썬 예제로 연습을 해보자.

연습할 데이터는 어떤 놀이 공원의 구매 데이터이다. (소스 코드와 데이터는 제 깃헙에 공개되어 있습니다.)

어떤 채널(우편-Post, 현장-Offline, 이메일-Email)을 통해 티켓이 판매되었는지, 판매될 때(Pass/NoPass) 추가적인 번들 옵션(Bundle/NoBundle)이 제공되었는지의 여부가 기록된 간단한 데이터셋이다. 마케팅 매니저로서 번들을 제공하는 것이 실질적으로 판매량에 영향을 미치는지 알고 싶다. ‘판매 여부’라는 종속변수는 Pass/NoPass의 이산적 카테고리 데이터이므로 로지스틱 회귀를 사용한다.

■ Q1. 프로모션이 판매 여부에 영향이 미칠까?

먼저 보기 쉽게 텍스트 데이터를 0, 1의 숫자로 인코딩하자. astype(str)를 통해 데이터 타입을 문자열로 다시금 확인/지정해주고 map()을 통해 Pass/Bundle에 1값을, NoPass/NoBundle에 0값을 넣어주었다 (astype을 쓰지 않으면 NaN으로 매핑된다).

data['Ticket'] = data['Ticket'].astype(str).map({'Pass':1,'NoPass':0})
data['Offer'] = data['Offer'].astype(str).map({'Bundle':1,'NoBundle':0})
data.head()

이제 로지스틱 회귀를 적용하면 된다. statsmodels라는 파이썬 패키지를 사용한다.

# statsmodels package loading
import statsmodels.api as sm

# logistic regression
feature = data['Offer']
output = data['Ticket']
model = sm.formula.glm("output ~ feature", data, family = sm.families.Binomial()).fit()
print(model.summary())

요런 결과를 보면 일단 p값을 확인해서 독립 변수가 통계적으로 유의미한지 확인해야한다. 유의수준이 0.05라고 할 때 p값이 0.05보다 작으므로 통계적으로 유의미하다는 것을 확인할 수 있고, 계수값이 0.3888로 번들이 제공 되었을 때 판매여부에 양(+)의 영향을 준다는 것이 확인되었다.

오즈비(Odds ratio)를 구해 좀 더 명확히 해석해보자.

# odds ratio
np.exp(model.params) # Given an offer, the likelihood of purchase increases by 1.47x 

오즈비를 exp(계수값)으로 구한 이유는 다음의 수식을 참고하면 된다. θ와 η의 관계에 대해 자세히 보고 싶다면 이전 글을 참고하면 좋겠다.

odds(θ) = \frac{θ}{(1-θ)} = \frac{\frac{1}{1+exp(-η)}}{1-(\frac{1}{1+exp(-η)})} = \frac{\frac{1}{1+exp(-η)}}{(\frac{1+exp(-η)-1}{1+exp(-η)})} = \frac{1}{exp(-η)} = exp(η)

다시 오즈의 개념을 살펴보자. 오즈는 성공할 확률과 실패할 확률의 비이다. 오즈의 결정 경계(decision threshold)는 1이다. 즉, 오즈비를 해석하자면 번들을 제공했을 때의 오즈비가 1.475196으로 1보다 크므로 번들을 제공함에 따라 티켓 판매 여부에 증가함을 의미한다(정확히는 1.475196배 늘어난다).

■ Q2. 판매 채널별로 프로모션이 판매 여부에 영향이 미칠까?

프로모션이 판매 여부에 영향을 주는 것은 확인했고, 이제 판매 채널별로 프로모션과 판매 여부의 관계를 알아보고 싶다. groupby()를 이용해서 간단히 데이터를 다시 살펴보자.

숫자만 보았을 때는 티켓은 현장 판매 때 가장 많이 팔렸고, 이메일은 그다지 효과가 없어보인다. 로지스틱 회귀로 자세히 살펴볼 필요가 있다.

model2 = sm.formula.glm("data['Ticket'] ~ data['Offer']+data['Channel']", data, family = sm.families.Binomial()).fit()
print(model2.summary())

# odds ratio
np.exp(model2.params) # decision boundary = 1. 

일단 p값은 0으로 모든 종속 변수가 통계적으로 유의미하다. 종속 변수를 보면 현장 판매, 우편 판매만 있다. 채널은 분명 3개인데 이메일 판매는 어디갔을까? 이메일 판매가 모델 요약에 나타나지 않은 이유는 이메일을 기준(baseline)으로 삼았기 때문이다. 즉, 현장 판매가 이메일 판매보다 41배 가량 판매 여부에 더 효과적이고, 우편 판매 역시 이메일 판매보다 8.8배 더 효과적이다.

그런데 첫 번째 문제에서와 다르게 프로모션을 했을 때 오히려 음(-)의 관계가 나타났음을 확인할 수 있다. 문제를 더 면밀히 살펴볼 이유가 생겼다.

■ Q3. 교호작용(interaction effect)이 있을까?

모자이크 플롯을 그려보면, 우편 판매와 이메일 판매의 경우 NoPass 비중이 더 높은 반면 현장 판매의 경우 Pass의 비중이 더 높다는 것을 알 수 있다. 또한, 티켓을 산 사람들 중의 번들의 제공 여부 비중을 따져서 보면, 우편의 경우 NoBundle의 비중이 오히려 더 높고, 이메일의 경우 Bunlde의 비중이 높다는 것을 알 수 있다. 이러한 사항들은 각각의 채널별로 번들의 효과가 다르다는 것을 암시하며, 교호 작용이 발생하고 있음을 보여준다.

교호작용이란, 하나의 독립 변수가 또 다른 독립 변수에 영향을 주는 현상을 말한다. 우리의 주요 가정 중 하나는 독립 변수끼리 독립적이어야 한다는 것인데 교호작용이 있다면 문제가 생겼다는 것이다!

model3 = sm.formula.glm("data['Ticket'] ~ data['Offer']*data['Channel']", data, family = sm.families.Binomial()).fit()
print(model3.summary())

# odds ratio
np.exp(model3.params) # decision boundary = 1. 

번들 제공이라는 독립 변수와 판매 채널이라는 독립 변수의 교호작용을 추가하여 다시 모델링을 해보자.

이제 direct effect와 interaction effect가 모두 나온 요약 결과를 볼 수 있다. 여기서도 이메일 채널이 기준으로 위의 결과를 해석하자면

  • 현장 판매가 이메일 판매보다 약 104배 가량 판매 여부에 더 효과적이다.
  • 우편 판매의 이메일 판매보다 약 23배 가량 판매 여부에 더 효과적이다.
  • 번들을 제공할 때의 판매 여부는 그렇지 않을 때보다 약 8배 높다
  • 그러나, 현장 판매할 때 번들을 제공하는 것은 이메일 판매할 때 번들을 제공하는 것보다 효과적이지 않다.
  • 마찬가지로 우편 판매할 때 번들을 제공하는 것은 이메일 판매할 때 번들을 제공하는 것보다 효과적이지 않다.

결론적으로 마케팅 매니저는 각각의 채널에 쓸 예산을 정할 때 합리적인 근거와 현장/우편 판매 시 번들 제공 여부를 재고해볼 수 있는 근거가 생겼다 🙂

주의: 본 예제는 로지스틱 회귀의 이해와 마케팅에서의 활용 방법에 대한 이해를 돕기 위한 간단한 예제입니다. train/test data split 등 실제 로지스틱 회귀를 적용할 때 필요한 데이터 전처리에 대해 다루지 않았으므로 참고바랍니다.

2 Comments
답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다