前言
本文是本人研读《深入浅出数据分析》一书后,使用不同工具对书中案例的分析,一是为了加强自己对案例的理解,二是希望能将各种主流工具学以致用,三是将个人的学习思考进行总结量化;
本文所使用的案例数据均从《深入浅出数据分析》的官网中下载,根据自己的学习需求对数据进行了一些处理,不代表官方,官方下载地址如下:examples / Head First Data Analysis · GitLab (oreilly.com)
背景描述
有一家在线服装零售商,刚刚进行了一次测试网页外观的试验,在一个月的时间内,每一位浏览网站的人都随机浏览到三种不同风格的主页设计之一。实验数据非常丰富,甚至可以说是太多了,老板想知道哪一种网页设计能够给网站带来最高营业额、最多浏览时间、最多浏览次数和最高回访率,需要你从中找出有用的数据,按照老板的要求呈现数据图表,并分析出最优秀的主页设计!
思考引导
你需要哪些数据来回应老板的要求?
个人思考:老板想知道哪一种网页设计能够给网站带来最高营业额、最多浏览时间和最高回访率,那么我就需要每个主页的上述信息,通过对比各个主页的数据,分析出最优秀的主页设计;
现有数据
3个主页的数据,数据结构如下
解决思路
绘制出每个主页的浏览时间、浏览次数、回访率与营业额之间的两两关系散点图,并加上以上各项数据的平均值线,通过对比分析出最优秀的主页设计;
详细步骤
(1)先手绘草图构思好数据要怎么呈现(横轴和纵轴分别放什么数据);
(2)思考在图面上要加什么图表对象(坐标轴、坐标轴标题、图表标题、数据标签、趋势线、图例);
(3)思考这些对象的位置、颜色、风格、形状、透明度等方面要调整成什么参数,先从散点的形状开始调整;
(4)先做出一个样图后再批量复制代码/图表,更换数据源画另一个图;
工具选择
Excel
(1)首先将源数据处理成以下格式并进行转置,计算了每个属性的平均值;
(2)绘制散点图
如果想在散点图中绘制线条,只需要传入两个坐标点做为一个序列,将这个序列的标记分割全部改为无,将线条风格改为实线,并将实线改为虚线。上一步计算出的各项平均值就是是为了绘制平均线用的,每项平均值都是两个是因为绘制一条直线需要两个点,两点确定一条直线,通过(0,平均营业额),(25,平均营业额) 这两点绘制出平均营业额直线,通过(平均浏览时间,0), (平均浏览时间,120)这两点绘制出平均浏览时间直线;具体数据源选择见附录;
Tableau
(1)首先可以根据个人喜好修改源数据的列名,本文为了方便操作使用源数据格式;
(2)绘制散点图
导入上述数据后,需要在Tableau工作表中将所有度量转换为维度、连续放置在行列框上,才能绘制散点图;
Python
(1)首先可以根据个人喜好修改源数据的列名,本文为了方便操作更改了数据列名;
(2)绘制散点图
源代码见附录。
工具总结
Excel绘图的优点是简单快速,但是当要批量做同样的图时,一定要先调好一张图的格式,再复制这张图,更改数据列,画下一张图,不然每张图都要调格式的话很浪费时间!!
Tableau制图,最简单最友好,平均线的添加最简单!
Python适合批量制图,和Exce制图的思维差不多,调好一张图后,复制黏贴代码,更改代码数据画下一张图,本次散点图效果和Excel不相上下!
图表分析
(1)通过两条平均线,将数据点分布区划分为四象限,左上表示浏览时间短但营业额高,左下表示浏览时间短且营业额低,右上表示浏览时间长且营业额高,右下表示浏览时间长但营业额低;对于一个店铺来说,最好的效果当然是营业额越高越好,但显然大部分人的消费金额都是低于平均营业额的;
(2)通过两条平均线,将数据点分布区划分为四象限,左上表示浏览次数少但营业额高,左下表示浏览次数少且营业额低,右上表示浏览次数多且营业额高,右下表示浏览次数多但营业额低;
(3)通过两条平均线,将数据点分布区划分为四象限,左上表示回头次数少但营业额高,左下表示回头次数少且营业额低,右上表示回头次数多且营业额高,右下表示回头次数多但营业额低;
(4)综上所述,数据最漂亮的是主页3,因为主页3的平均营业额最高,但由于官网只提供了主页1的数据,因此本文没有办法呈现出其他主页的数据图进行对比(除非自己虚假造出一些数据),原书中三个主页的数据图如下:
全文总结
通过散点图,我们可以大致呈现出每位顾客数据的分布,在散点图上加上平均线后,能将区域划分为四象限,更直观展现出散点的分布区域,也方便我们聚焦一开始的目标,最重要的就是营业额的高低,因此平均营业额这条线必不可少;其实还可以将四象限中的重点区域标记上显眼的颜色,让用户一眼看到高光区;
附录
1.Excel数据列选择
(1)双击散点图后,进入图表设计-选择数据
(2)更改数据列
(3)传入平均值点
可以通过手动键入,也可以创造两行数据列来传入x,y
(4)修改平均值序列样式
双击平均值坐标点,进入系列选项-标记,将标记里的参数全部改为“无”,将线条修改为“实线”,颜色改为“黑色”,短划线类型改为“- - -”;
2.Python源代码
import matplotlib.pyplot as plt import pandas as pd #导入数据 data = pd.read_csv('F:/hfda/home_page1.csv') print(data)#查看数据 #分离数据,计算各个变量的平均值 Rev=data['营业额'] Rev_Mean=Rev.mean() Time=data['浏览时间'] Time_Mean=Time.mean() View=data['浏览次数'] View_Mean=View.mean() Return=data['回头次数'] Return_Mean=Return.mean() #散点图 f = plt.figure() # 创造一个空图框 # 在空图框中绘制子图,行数=模型个数,列数=数据集个数,子图开始位置= 第几个 plt.rcParams['font.sans-serif']='SimHei'#设置中文字体格式 plt.rcParams['axes.unicode_minus']=False#设置横杠显示 #向图框中逐个添加子图 #添加子图1 f.add_subplot(1, 3, 1) plt.scatter(Time,Rev,color='white',edgecolors='black')#设置散点的填充色和边框色 plt.axvline(Time_Mean,color='black',linestyle='--',alpha=0.5,label='平均浏览时间')#添加平均线,alpha是线条透明度 plt.axhline(Rev_Mean,color='orange',linestyle='--',alpha=0.5,label='平均营业额') plt.grid(True,linewidth=0.5,alpha=0.4)#设置网格线格式 plt.legend()#显示图例,图例标签为上述线条代码中的label值 plt.title('主页1') #设置标题 plt.xlabel('浏览时间') #设置x轴名称 plt.ylabel('营业额',rotation='vertical').set_rotation(90) #设置y轴名称 plt.ylim(0,120) #设置y轴范围 plt.xlim(0,25) #设置X轴范围 #添加子图2 f.add_subplot(1, 3, 2) plt.scatter(View,Rev,color='white',edgecolors='black') plt.axvline(View_Mean,color='black',linestyle='--',alpha=0.5,label='平均浏览次数') plt.axhline(Rev_Mean,color='orange',linestyle='--',alpha=0.5,label='平均营业额') plt.grid(True,linewidth=0.5,alpha=0.4) plt.legend() plt.title('主页1') #设置标题 plt.xlabel('浏览次数') #设置x轴名称 plt.ylabel('营业额',rotation='vertical').set_rotation(90) #设置y轴名称 plt.ylim(0,120) #设置y轴范围 plt.xlim(0,80) #设置X轴范围 #添加子图3 f.add_subplot(1, 3, 3) plt.scatter(Return,Rev,color='white',edgecolors='black') plt.axvline(Return_Mean,color='black',linestyle='--',alpha=0.5,label='平均回头次数') plt.axhline(Rev_Mean,color='orange',linestyle='--',alpha=0.5,label='平均营业额') plt.grid(True,linewidth=0.5,alpha=0.4) plt.legend() plt.title('主页1') #设置标题 plt.xlabel('回头次数') #设置x轴名称 plt.ylabel('营业额',rotation='vertical').set_rotation(90) #设置y轴名称 plt.ylim(0,120) #设置y轴范围 plt.xlim(0,25) #设置X轴范围 #显示图像 plt.show()