营销组合模型概述

Marketing Mix Modeling (MMM)营销组合模型是一套统计分析技术,用来测量和预测不同营销行为对销售及ROI的影响。它被用来测量整体的marketing effectiveness并用来在不同的营销渠道中决定最优的预算分配

Marketing Mix中的“Mix”一词最早指的是Mix of 4Ps(Product,Price,Place & Promotion)。早期MMM分析的目的就是为了理解并找到这4P的最优组合,同时测量并预测不同的营销活动对销售的不同影响。

时至今日,MMM中包含的变量更加广泛,一个Marketing Mix Model可以由以下这些类型的数据组成:

  • Target Audience data (目标用户数据)
  • Product data (产品数据,包括产品价格、产品特征)
  • Competitive data(竞品数据)
  • Industry data(行业数据)
  • Economic data(经济数据)
  • Marketing data(营销数据)
  • Conversion data(转化数据如sales,profit,ROI)

营销组合模型实战

1.首先导入数据与所需要的库

import pandas as pd
import numpy as np
import matplotlib.patches as mpatches
import matplotlib.pyplot as pltdata = pd.read_excel('MMM.xlsx')

2.EDA(探索性数据分析)

先大致的看一下各列数据

print (data.describe())>>>         Brand ID         Year     Absolut  Aristocrat      Barton  \
count  263.000000   263.000000  263.000000  263.000000  263.000000
mean    12.596958  2001.695817    0.049430    0.049430    0.049430
std      7.654584     3.639093    0.217177    0.217177    0.217177
min      1.000000  1995.000000    0.000000    0.000000    0.000000
25%      6.000000  1999.000000    0.000000    0.000000    0.000000
50%     12.000000  2002.000000    0.000000    0.000000    0.000000
75%     18.000000  2005.000000    0.000000    0.000000    0.000000
max     31.000000  2007.000000    1.000000    1.000000    1.000000   Belvedere     Burnett      Chopin  Crystal Palac   Finlandia  ...  \
count  263.000000  263.000000  263.000000     263.000000  263.000000  ...
mean     0.026616    0.041825    0.026616       0.049430    0.049430  ...
std      0.161265    0.200571    0.161265       0.217177    0.217177  ...
min      0.000000    0.000000    0.000000       0.000000    0.000000  ...
25%      0.000000    0.000000    0.000000       0.000000    0.000000  ...
50%      0.000000    0.000000    0.000000       0.000000    0.000000  ...
75%      0.000000    0.000000    0.000000       0.000000    0.000000  ...
max      1.000000    1.000000    1.000000       1.000000    1.000000  ...   LagTotalMinusSales     TierSales  OutsideTierSales  LagTierSales  \
count          263.000000    263.000000        263.000000    263.000000
mean         62673.935361   9547.235741      53106.615970   9215.528517
std           1548.346560   2917.310122       2259.775837   2946.563257
min          55687.000000    846.000000      48358.000000    697.000000
25%          62459.000000   8151.500000      51863.000000   7493.000000
50%          63204.000000  10605.000000      52335.000000  10400.000000
75%          63616.000000  11209.000000      54570.000000  11127.500000
max          64131.000000  15790.000000      59760.000000  14299.000000   LagOutsideTierSales  Firstintro  Marketshare  LagMktshare      YearID  \
count           263.000000  263.000000   263.000000   263.000000  263.000000
mean          53458.406844    0.015209     0.046972     0.047470    9.695817
std            2327.430916    0.122617     0.053831     0.054685    3.639093
min           49806.000000    0.000000     0.001468     0.000971    3.000000
25%           51947.000000    0.000000     0.014762     0.014655    7.000000
50%           52419.000000    0.000000     0.029463     0.029181   10.000000
75%           55392.000000    0.000000     0.053087     0.053633   13.000000
max           59868.000000    1.000000     0.270477     0.270477   15.000000   total ad
count    263.000000
mean    7386.359312
std    14280.852135
min        6.000000
25%        6.000000
50%        6.000000
75%     9691.400000
max    70489.200000

可以看出数据总共有263行,同时查看有没有缺失数据的存在。

#查看是否有空值
data.isnull().any()...
diff                   False
IfDom                  False
DollarSales            False
PriceRerUnit           False
LagPrice                True
LnPrice                False
LnLPrice                True
Mag                    False
News                   False...

查看列,数据的数据字典已经放在MMM数据文件中,可以对照着看一下各列的含义
注意:数据已经清洗过,所以缺失值较少,同时由于需要的字段中的数字数量级相差较大,所以对其进行取对数处理

print (data.columns)>>>     [8 rows x 66 columns]
Index(['BrandName', 'Brand ID', 'Year', 'Absolut', 'Aristocrat', 'Barton','Belvedere', 'Burnett', 'Chopin', 'Crystal Palac', 'Finlandia','Fleischmann's', 'Fris', 'Gilbey's', 'Gordon's', 'Grey Goose','Kamchatka', 'Ketel One', 'Level', 'McCormick', 'Polar Ice', 'Popov','Pravda', 'Seagram's', 'Skol', 'Sky', 'Smirnoff', 'Stolicnaya','Tanqueray', 'Three Olives', 'TotalSales', 'LagTotalSales','2LagTotalSales', 'LnSales', 'LnLSales', 'Ln2Lsales', 'LnDiff', 'diff','IfDom', 'DollarSales', 'PriceRerUnit', 'LagPrice', 'LnPrice','LnLPrice', 'Mag', 'News', 'Outdoor', 'Broad', 'Print', 'LnMag','LnNews', 'LnOut', 'LnBroad', 'LnPrint', 'Tier1', 'Tier2','TotalMinusSales', 'LagTotalMinusSales', 'TierSales','OutsideTierSales', 'LagTierSales', 'LagOutsideTierSales', 'Firstintro','Marketshare', 'LagMktshare', 'YearID', 'total ad'],dtype='object')

接下来再看数据中一共有多少个品牌:

print (data['BrandName'].unique())
print ('\n')
print ('Total Number of brands',len(data['BrandName'].unique()))>>>
['Absolut' 'Aristocrat' 'Barton' 'Belvedere' 'Burnett' 'Chopin''Crystal Palac' 'Finlandia' "Fleischmann's" 'Fris' "Gilbey's" "Gordon's"'Grey Goose' 'Kamchatka' 'Ketel One' 'Level' 'McCormick' 'Polar Ice''Popov' 'Pravda' "Seagram's" 'Skol' 'Sky' 'Smirnoff' 'Stolicnaya''Tanqueray' 'Three Olives']Total Number of brands 27

可以看到该数据集包括总共27个伏特加制造公司品牌。对于MMM,让我们选择一个品牌并分析价格对销售的影响。例如,让我们选择’Absolut’作为我们的分析品牌。

Absolut = data[data['BrandName'] == 'Absolut']]
Pr_Absolut = Absolut[['LnSales','LnPrice']]

之后画出Absolut的价格与销售之间的关系

plt.scatter(Pr_Absolut['LnPrice'],Pr_Absolut['LnSales'])
plt.xlabel('Log of Price')
plt.ylabel('Log of Sales')
plt.show()

matplotlib.pyplot.scatte函数的语法为:

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)

参数的解释:
x,y:表示的是大小为(n,)的数组,也就是我们即将绘制散点图的数据点

s:是一个实数或者是一个数组大小为(n,),这个是一个可选的参数。

c:表示的是颜色,也是一个可选项。默认是蓝色’b’,表示的是标记的颜色,或者可以是一个表示颜色的字符,或者是一个长度为n的表示颜色的序列等等,感觉还没用到过现在不解释了。但是c不可以是一个单独的RGB数字,也不可以是一个RGBA的序列。可以是他们的2维数组(只有一行)。

marker:表示的是标记的样式,默认的是’o’。

cmap:Colormap实体或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap

norm:Normalize实体来将数据亮度转化到0-1之间,也是只有c是一个浮点数的数组的时候才使用。如果没有申明,就是默认为colors.Normalize。

vmin,vmax:实数,当norm存在的时候忽略。用来进行亮度数据的归一化。

alpha:实数,0-1之间。

linewidths:也就是标记点的长度

得到的散点图如下所示:

从生成的散点图中我们可以知道随着价格的增长销量增加。

import statsmodels.formula.api as sm
result = sm.ols(formula = 'LnSales ~ LnPrice',data = Pr_Absolut).fit()
result.summary()

Statsmodels 是 Python 中一个强大的统计分析包,包含了回归分析、时间序列分析、假设检
验等等的功能,当我们需要使用回归时,只需要import statsmodels.formula.api as sm即可(也可以import statsmodels.api as sm,两者的用法会有一些差别,但是具有相同的功能)。

使用sm.ols(formula = ‘LnSales ~ LnPrice’,data = Pr_Absolut).fit()即可获取拟合结果

#获取计算出的回归系数
print(result.params)#打印出全部摘要
print(result.summary())

得到的回归系数与概要:

Intercept 2.836674
LnPrice 1.130972

从上述的描述中可以得到R方(R-squared)的值为0.688,即此函数接近69%的数据点。价格系数表明,每增加单位价格,销售额便增加1.13倍。同时P>|t|的值为0.表示两者之间有非常显著的关系

我们还可以将拟合结果画出来。

#先调用拟合结果的 fittedvalues 得到拟合的 y 值。
y_fitted = result.fittedvalues
#然后使用 matplotlib.pyploft 画图。首先设定图轴,图片大小为 8×6。
fig, ax = plt.subplots(figsize=(8,6))
#画出原数据,图像为圆点,默认颜色为蓝。
ax.plot(x, y, 'o', label='data')
#画出拟合数据,图像为红色带点间断线。
ax.plot(x, y_fitted, 'r--.',label='OLS')
#放置注解。
ax.legend(loc='best')

得到的拟合曲线与散点图的关系如图

接下来我们向回归中添加更多变量,看看R方会发生什么。

首先尝试使用广告和价格列

Ad_Absolut = Absolut[['LnSales','LnMag','LnNews','LnOut','LnBroad','LnPrint','LnPrice']]
result_ad = sm.ols('LnSales ~ LnMag + LnNews + LnOut + LnBroad + LnPrint + LnPrice',data=Ad_Absolut).fit()
result_ad.summary()

得到如下结果

调整R方值(Adj. R-squared)显示该模型能够解释87%的数据点。但是,此处某些变量的p值很高,这可能是由于相互作用效应和其他一些因素导致的。

  • 注:多元回归实际应用中,判定系数R平方有个最大的问题:增加自变量的个数时,判定系数就会增加,即随着自变量的增多,R平方会越来越大,会显得回归模型精度很高,有较好的拟合效果。而实际上可能并非如此,有些自变量与因变量(即预测)完全不相关,增加这些自变量,并不会提升拟合水平和预测精度。调整R方同时考虑了样本量(n)和回归中自变量的个数(k)的影响,这使得调整R方永远小于R方,而且调整R方的值不会由于回归中自变量个数的增加而越来越接近1。因此,在多元回归分析中,通常用调整的多重判定系数来评价拟合效果

同时我们也可以通过其他的单因素的回归分析来判断各个媒体对实际销售的影响

通过回归系数,我们知道某一个自变量对自变量的影响的程度有多大

同时,我们还可以看一下各个因素与销售量之间相关性

print(Ad_Absolut.corr())

得到相关系数如图:

源码和实验数据文件可以关注公众号:Smilecoc的杂货铺,回复MMM获取

Python数据分析实战之营销组合模型相关推荐

  1. Python数据分析实战基础 | 初识Pandas

    这是Python数据分析实战基础的第一篇内容,主要是和Pandas来个简单的邂逅.已经熟练掌握Pandas的同学,可以加快手速滑动浏览或者直接略过本文. 01  重要的前言 这段时间和一些做数据分析的 ...

  2. 《Python数据分析实战》day2: Pandas中取得某行或者是某列的一点思考

    今天看了<Python数据分析实战>这本书的第四章:Pandas的简介的部分,大概看了一半,在实践代码的时候发现了jupyter notebook提示warning,研究了一下有了一些自己 ...

  3. python数据分析实战 fabio nelli百度云_Python数据分析实战 内利(Fabio Nelli),杜春晓 9787115432209...

    商品描述: 基本信息 书名:Python数据分析实战 定**价:59.00元 作者: 内利(Fabio Nelli) 著,杜春晓 译 出版社:人民邮电出版社 出版日期:2016-08-01 ISBN: ...

  4. python电影数据分析报告_【python数据分析实战】电影票房数据分析(二)数据可视化...

    在上一部分<[python数据分析实战]电影票房数据分析(一)数据采集> 已经获取到了2011年至今的票房数据,并保存在了mysql中. 本文将在实操中讲解如何将mysql中的数据抽取出来 ...

  5. Python数据分析实战:上海二手房价分析

    1 数据搜集 使用 urllib 库中的request 模块爬取赶集网发布的上海二手房信息,包括包括户型.面积.单价等,再使用BeautifulSoup 库解析爬取的HTML数据,最终将数据保存到CS ...

  6. Python数据分析实战学习与分享(一)

    学习的书籍: Python Data Analytics Python数据分析实战(尚未出版电子书) 1.1数据分析 当今世界对信息技术的依赖程度日渐加深,每天都会产生和存储海量的数据.数据的来源多种 ...

  7. Python数据分析实战学习

    Python数据分析实战学习\displaystyle\boxed{Python数据分析实战学习}Python数据分析实战学习​ AprilJulyOctober2015AprilJulyOctobe ...

  8. Python数据分析实战

    Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...

  9. python数据分析实例-python数据分析实战

    Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...

最新文章

  1. codeforces 650D. Zip-line 线段树
  2. 1.我和python的第一次亲密接触
  3. 400分理科学计算机,理科400分能上哪些大学 高考400分算什么水平
  4. Spring boot集成spring-boot-starter-data-jpa环境搭建
  5. shell date常用运算命令
  6. javascript-高级用法
  7. Java导入导出Excel工具类ExcelUtil
  8. RTC硬件时钟设置修改【转】
  9. ArcGIS打开shapefile失败:形状数与记录表数不一致
  10. 手机号码归属地查询工具的正确使用方法
  11. 学习笔记(1):FFmpeg打造Android万能音频播放器-实现变速变调功能(二)
  12. arccos用计算机,arccos(arccos在线计算器)
  13. ARM嵌入式的位绑定原理
  14. css 设置手机浏览器背景图片填充整个页面的小问题级解决方法
  15. Micropython八位共阴数码管驱动模块分享
  16. 网络原理——基础知识
  17. 一文总结图像生成必备经典模型(二)
  18. [暑假]简单认识一下常用的字体 <<微软雅黑 黑体 和 宋体>>
  19. 用C++实现强化学习,速度不亚于Python,这里有个框架可用
  20. 集合——数组容器笔记

热门文章

  1. [51nod1074]约瑟夫环V2
  2. python读取xlsx的超链接_用Python从Excel(.xlsx)中提取超链接
  3. 免费在线loading生成。
  4. java用for打印正方形_Java程序为给定的整数打印正方形图案
  5. 计算机网络之TCP三次握手
  6. HTML+CSS页面练习——legend第五部分
  7. Java - 批量录入Excel数据优化 (一)
  8. LCS(最长公共子串) python3实现
  9. 科创板规则压实责任 券商投行业务重塑
  10. PhotoZoom Pro—图片“无损”放大