마케팅 데이터를 분석을 나름대로 재구성 해 보려고 합니다. 원본 분석은 아래의 주소에 있습니다. 후후.
• 주어진 데이터는
TV - TV 매체비.
radio - 라디오 매체비.
newspaper - 신문 매체비.
sales - 매출액.
• Goal! 어느 매체에 집중해야 할까?
• 마케팅 데이터 분석
https://velog.io/@kdhangelic/%EB%A7%88%EC%BC%80%ED%8C%85-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D
1) 어느 채널에 집중해야 할까?
데이터를 다운로드 받고, uzip한 후에 dataframe으로 읽어들인 후, 그것으로 분석을 해 보려 합니다.
★ 당연한 이야기겠지만, 목표는 매출에 기여하는 것이 무엇인가, 예측 가능한가, 그 다음 의사결정은 어떻게 해야하는가? 정도가 되겠습니다.
!kaggle datasets download -d bumba5341/advertisingcsv
!unzip advertisingcsv.zip
Archive: advertisingcsv.zip inflating: Advertising.csv
import pandas as pd
df_raw = pd.read_csv("./Advertising.csv")
df_raw.head()
Unnamed: 0 | TV | Radio | Newspaper | Sales | |
---|---|---|---|---|---|
0 | 1 | 230.1 | 37.8 | 69.2 | 22.1 |
1 | 2 | 44.5 | 39.3 | 45.1 | 10.4 |
2 | 3 | 17.2 | 45.9 | 69.3 | 9.3 |
3 | 4 | 151.5 | 41.3 | 58.5 | 18.5 |
4 | 5 | 180.8 | 10.8 | 58.4 | 12.9 |
df_raw.drop("Unnamed: 0", axis=1, inplace=True)
df_raw.head()
TV | Radio | Newspaper | Sales | |
---|---|---|---|---|
0 | 230.1 | 37.8 | 69.2 | 22.1 |
1 | 44.5 | 39.3 | 45.1 | 10.4 |
2 | 17.2 | 45.9 | 69.3 | 9.3 |
3 | 151.5 | 41.3 | 58.5 | 18.5 |
4 | 180.8 | 10.8 | 58.4 | 12.9 |
df_raw.shape
(200, 4)
df_raw.info()
RangeIndex: 200 entries, 0 to 199 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 TV 200 non-null float64 1 Radio 200 non-null float64 2 Newspaper 200 non-null float64 3 Sales 200 non-null float64 dtypes: float64(4) memory usage: 6.4 KB
다행히 결측치가 없어서, 나름 편한 분석이 될거라 생각합니다.
df_raw.describe()
TV | Radio | Newspaper | Sales | |
---|---|---|---|---|
count | 200.000000 | 200.000000 | 200.000000 | 200.000000 |
mean | 147.042500 | 23.264000 | 30.554000 | 14.022500 |
std | 85.854236 | 14.846809 | 21.778621 | 5.217457 |
min | 0.700000 | 0.000000 | 0.300000 | 1.600000 |
25% | 74.375000 | 9.975000 | 12.750000 | 10.375000 |
50% | 149.750000 | 22.900000 | 25.750000 | 12.900000 |
75% | 218.825000 | 36.525000 | 45.100000 | 17.400000 |
max | 296.400000 | 49.600000 | 114.000000 | 27.000000 |
아마도 이건 돈의 단위일 듯 하여, 그냥 천원 단위라고 생각하면 편할 것 같아서, 그렇게 생각해 보려고 합니다. 후후.
가만히 보니까, TV가 14.7만원, Radio가 2.326만원, 신문이 3만원이 평균이라고 생각하면 될 듯 한데, 이게 날짜와 같이 있었다면 더 좋았겠지만, 그렇지는 않군요. 날짜와 같이 있었다면 전체적인 추세를 볼 수 있었을텐데 말이죠.
그러면 일단 각 Feature에 대한 histogram정도 보면 좋겠네요.
df_raw.hist(figsize=(10,7))
array([[, ], [ , ]], dtype=object)
머 대~충 보니, TV나 Radio는 적당히 골고루 썼는데, Newspaper는 왼쪽으로 쏠리게 비용을 썼군요.
어쨌든 매출(Sales)이 종속변수가 될거고, 이 Sales와 나머지의 correlation을 보면!
(모든 분석의 실마리는 correlation에서 부터 시작하면 괜찮은 접근이라고 생각합니다)
df_raw.corr()
TV | Radio | Newspaper | Sales | |
---|---|---|---|---|
TV | 1.000000 | 0.054809 | 0.056648 | 0.782224 |
Radio | 0.054809 | 1.000000 | 0.354104 | 0.576223 |
Newspaper | 0.056648 | 0.354104 | 1.000000 | 0.228299 |
Sales | 0.782224 | 0.576223 | 0.228299 | 1.000000 |
TV - Radio - Newspaper 순으로 상관관계가 있군요? TV가 마케팅 채널로서는 매출과 관련이 깊고, 예측하기도 편할 거라 생각합니다.
눈으로 보면 좋으니까, Scatter plot을 그려볼까 합니당.
import matplotlib.pyplot as plt
df_raw.plot.scatter(x='TV', y='Sales')
df_raw.plot.scatter(x='Radio', y='Sales')
df_raw.plot.scatter(x='Newspaper', y='Sales')
처음에 예상한 바와 같이 TV가 가장 예측하기 좋고, 그 다음에 Radio가 되겠고 Newspaper는 거의 예측이 어렵겠군요.
그냥 아무렇게나 흩뿌려져 있는거 아닌가 싶을 정도입니다. (TV도 약간 로그 모양새가 보이긴 하는군요)
이 세개의 Feature를 기준으로 회귀를 하게되면 각각의 채널들이 얼마나 매출에 기여하는지 볼 수 있을테니까, 어쨌든 막무가내로 한번 ㄱㄱ 하겠습니다.
from statsmodels.formula.api import ols
model_ols_full = ols("Sales ~ TV + Radio + Newspaper", data=df_raw).fit()
model_ols_full.summary()
Dep. Variable: | Sales | R-squared: | 0.897 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.896 |
Method: | Least Squares | F-statistic: | 570.3 |
Date: | Prob (F-statistic): | 1.58e-96 | |
Time: | Log-Likelihood: | -386.18 | |
No. Observations: | 200 | AIC: | 780.4 |
Df Residuals: | 196 | BIC: | 793.6 |
Df Model: | 3 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | 2.9389 | 0.312 | 9.422 | 0.000 | 2.324 | 3.554 |
TV | 0.0458 | 0.001 | 32.809 | 0.000 | 0.043 | 0.049 |
Radio | 0.1885 | 0.009 | 21.893 | 0.000 | 0.172 | 0.206 |
Newspaper | -0.0010 | 0.006 | -0.177 | 0.860 | -0.013 | 0.011 |
Omnibus: | 60.414 | Durbin-Watson: | 2.084 |
---|---|---|---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 151.241 |
Skew: | -1.327 | Prob(JB): | 1.44e-33 |
Kurtosis: | 6.332 | Cond. No. | 454. |
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
결과를 보면 일단 TV, Radio는 유의하나, Newspaper는 유의하지 않군요? 게다가 Newspaper는 음의 계수가 나와버렸습니다. 어헛. Newspaper는 분석 불가 판정.
뭐 어찌보면 당연한 결과이기도 한데, 특이한 점은 Newspaper가 포함된 상태에서도 R^2가 엄청 크네요. 아마도 Newspaper는 왼쪽으로 몰려있는 데이터가 많아서 전체적으로 영향을 끼치지는 못하는 것 아닌가 생각하고요, 여튼 이런 경우라면 Newspaper를 일단 빼보고 해 보는 것도 좋겠습니다.
model_ols_featured = ols("Sales ~ TV + Radio", data=df_raw).fit()
model_ols_featured.summary()
Dep. Variable: | Sales | R-squared: | 0.897 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.896 |
Method: | Least Squares | F-statistic: | 859.6 |
Date: | Prob (F-statistic): | 4.83e-98 | |
Time: | Log-Likelihood: | -386.20 | |
No. Observations: | 200 | AIC: | 778.4 |
Df Residuals: | 197 | BIC: | 788.3 |
Df Model: | 2 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | 2.9211 | 0.294 | 9.919 | 0.000 | 2.340 | 3.502 |
TV | 0.0458 | 0.001 | 32.909 | 0.000 | 0.043 | 0.048 |
Radio | 0.1880 | 0.008 | 23.382 | 0.000 | 0.172 | 0.204 |
Omnibus: | 60.022 | Durbin-Watson: | 2.081 |
---|---|---|---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 148.679 |
Skew: | -1.323 | Prob(JB): | 5.19e-33 |
Kurtosis: | 6.292 | Cond. No. | 425. |
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
음 예상대로 TV와 Radio는 유의하네요. 그리고 TV의 계수는 0.0458, Radio는 0.1880로써 Radio의 광고 성과가 훨씬 좋습니다. 마.
자, 일단 첫번째 결론을 좀 맺고 가자면,
⓵ Newspaper는 광고 채널에서 빼 버리는 편이 낫겠습니다.
⓶ TV보다는 Radio가 훨씬 효율이 좋습니다. TV는 형편없다고 봐야 하겠네요.
⓷ 하지만 Radio라고 해서 엄청 효율이 좋은 것도 아닙니다. 왜냐하면 1000원 집행하면 188원 매출이 나니까요.
Newspaper가 유의하게 될 수 있는지 더 들여다 보자면, Newspaper의 경우에는 아무래도 데이터가 왼쪽으로 기울어져 있으니까, 마지막으로 Log를 씌워서 로그정규분포로 만든 후에 한번 더 해보죠.
import math
df_raw['Newspaper_log'] = df_raw['Newspaper'].apply(lambda row: math.log(row))
df_raw.plot.scatter(x='Newspaper_log', y='Sales')
헤잉~~~ 이거 뭐, Log변환을 해도 Newspaper는 선형성이 나오기는 다 글렀습니다. 그러니까, Newspaper는 채널로서 포기하는 편이 낫겠습니다.
그러면 최종적으로는
$$ y_{sales} = 2.9211 + 0.0458 x_{TV} + 0.1880 x_{Radio} $$
이런 식의 회귀 분석의 결론이 되겠죠. 예측을 좀 해본다면 TV에 1000원 Radio에 1000원의 예산을 사용한다면,
model_ols_featured.predict({'TV': 1000, 'Radio':1000})
0 236.670142 dtype: float64
2000원 쓰면, 237원의 매출이 나온다는 건데....
개인적인 의견으로는 이 회사는 마케팅을 안하는 편이 낫지 않을까 생각합니다.만.
어쨌든 사업을 해야 하긴 하니까, Radio에 주력을 하되, Radio 채널의 효율성을 1.0이상으로 만들기 위해 Radio 특성에 맞는 컨텐츠 개발이 시급하다고 생각합니다.
안그러면 홍보는 떄려치는 편이 낫지 않을까 생각합니다.
Newspaper의 분석이 가능했으면 더 좋았을텐데, 분석을 할 수 있는 껀덕지가 없어서 더 진행하지 못한 것이 좀 아쉽습니다.
댓글