数据分析实战45讲笔记(15)数据可视化

1.在数据可视化产品中,一般都包括哪些视图?

我们常用的可视化视图超过20种,分别包括:文本表、热力图、地图、符号地图、饼图、水平条、堆叠条、并排条、树状图、圆视图、并排圆、线、双线、面积图、双组合、散点图、直方图、盒须图、甘特图、靶心图、气泡图等。

要了解使用它们背后的目的是什么,可以分为以下的9种情况:

比如说,你想呈现某个变量的分布情况,就可以通过直方图的形式来呈现。如果你想要看两个变量之间的相关性及分布情况,可以采用散点图的形式呈现。

一个视图可能会有多种表达的目的,比如散点图既可以表明两个变量之间的关系,也可以体现它们的分布情况。同样,如果我想看变量的分布情况,既可以采用散点图的形式,也可以采用直方图的形式。

所以说,具体要采用哪种视图,取决于你想要数据可视化呈现什么样的目的。

2.常用数据可视化工具

Tableau,PowerBI,FineBI;DataV,FineReport;python的Matplotlib,Seaborn等。

3.可视化视图

      按照数据之间的关系,我们可以把可视化视图划分为4类,它们分别是比较、联系、构成和分布。我来简单介绍下这四种关系的特点:

  1. 比较:比较数据间各类别的关系,或者是它们随着时间的变化趋势,比如折线图;

  2. 联系:查看两个或两个以上变量之间的关系,比如散点图;

  3. 构成:每个部分占整体的百分比,或者是随着时间的百分比变化,比如饼图;

     4.分布:关注单个变量,或者多个变量的分布情况,比如直方图。

同样,按照变量的个数,我们可以把可视化视图划分为单变量分析和多变量分析。

单变量分析指的是一次只关注一个变量。比如我们只关注“身高”这个变量,来看身高的取值分布,而暂时忽略其他变量。

多变量分析可以让你在一张图上可以查看两个以上变量的关系。比如“身高”和“年龄”,你可以理解是同一个人的两个参数,这样在同一张图中可以看到每个人的“身高”和“年龄”的取值,从而分析出来这两个变量之间是否存在某种联系。

3.1 散点图

散点图的英文叫做scatter plot,它将两个变量的值显示在二维坐标中,非常适合展示两个变量之间的关系。当然,除了二维的散点图,我们还有三维的散点图。使用matplotlib画图,在工具包引用后,画散点图,需要使用plt.scatter(x, y, marker=None)函数。x、y 是坐标,marker代表了标记的符号。也可以使用Seaborn进行散点图的绘制,使用sns.jointplot(x, y, data=None, kind=‘scatter’)函数。其中x、y是data中的下标。data就是要传入的数据,一般是DataFrame类型。kind这类取scatter,代表散点的意思。当然kind还可以取其他值,不同的kind代表不同的视图绘制方式。

#数据是随机的100个点
N=1000
x=np.random.random(N)
y=np.random.random(N)
#用matplotlib画散点图
plt.scatter(x,y,marker='x')
plt.show()
#用Seaborn画散点图
df=pd.DataFrame({'x':x,'y':y})
sns.jointplot(x="x",y="y",data=df,kind='scatter');
plt.show()

(第一张图为Matplotlib绘制的,第二张图为Seaborn绘制的)。看到Matplotlib和Seaborn的视图呈现还是有差别的。Matplotlib默认情况下呈现出来的是个长方形。而Seaborn呈现的是个正方形,而且不仅显示出了散点图,还给了这两个变量的分布情况。

3.2 折线图

折线图可以用来表示数据随着时间变化的趋势。

在Matplotlib中,我们可以直接使用plt.plot()函数,当然需要提前把数据按照x轴的大小进行排序,要不画出来的折线图就无法按照x轴递增的顺序展示。在Seaborn中,我们使用sns.lineplot (x, y, data=None)函数。其中x、y是data中的下标。data就是我们要传入的数据,一般是DataFrame类型。

#x数组代表时间(年),y数组随便取值
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Matplotlib画折线图
plt.plot(x, y)
plt.show()
# 使用Seaborn画折线图
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()

3.3直方图

它是把横坐标等分成了一定数量的小区间,这个小区间也叫作“箱子”,然后在每个“箱子”内用矩形条(bars)展示该箱子的箱子数(也就是y值),这样就完成了对数据集的直方图分布的可视化。

在Matplotlib中,我们使用plt.hist(x, bins=10)函数,其中参数x是一维数组,bins代表直方图中的箱子数量,默认是10。在Seaborn中,我们使用sns.distplot(x, bins=10, kde=True)函数。其中参数x是一维数组,bins代表直方图中的箱子数量,kde代表显示核密度估计,默认是True,我们也可以把kde设置为False,不进行显示。核密度估计是通过核函数帮我们来估计概率密度的方法。

# 随机的100个数
a = np.random.randn(100)
s = pd.Series(a) 
# 用Matplotlib画直方图
plt.hist(s)
plt.show()
# 用Seaborn画直方图
sns.distplot(s, kde=False)
plt.show()
sns.distplot(s, kde=True)
plt.show()

3.4 条形图

如果说通过直方图可以看到变量的数值分布,那么条形图可以帮我们查看类别的特征。在条形图中,长条形的长度表示类别的频数,宽度表示类别。

在Matplotlib中,我们使用plt.bar(x, height)函数,其中参数x代表x轴的位置序列,height是y轴的数值序列,也就是柱子的高度。在Seaborn中,我们使用sns.barplot(x=None, y=None, data=None)函数。其中参数data为DataFrame类型,x、y是data中的变量。

# x,y分别代表类别和类别的频数
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
# 用Matplotlib画条形图
plt.bar(x, y)
plt.show()
# 用Seaborn画条形图
sns.barplot(x, y)
plt.show()

3.5 箱线图

由五个数值点组成:最大值(max)、最小值(min)、中位数(median)和上下四分位数(Q3, Q1)。它可以帮我们分析出数据的差异性、离散程度和异常值等。

在Matplotlib中,我们使用plt.boxplot(x, labels=None)函数,其中参数x代表要绘制箱线图的数据,labels是缺省值,可以为箱线图添加标签。在Seaborn中,我们使用sns.boxplot(x=None, y=None, data=None)函数。其中参数data为DataFrame类型,x、y是data中的变量。


# 生成0-1之间的10*4维度数据
data=np.random.normal(size=(10,4)) 
lables = ['A','B','C','D']
# 用Matplotlib画箱线图
plt.boxplot(data,labels=lables)
plt.show()
# 用Seaborn画箱线图
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()

3.6饼图

饼图是常用的统计学模块,可以显示每个部分大小与总和之间的比例。在Python数据可视化中,它用的不算多。我们主要采用Matplotlib的pie函数实现它。在Matplotlib中,我们使用plt.pie(x, labels=None)函数,其中参数x代表要绘制饼图的数据,labels是缺省值,可以为饼图添加标签。

#几种学历的人数
nums = [25, 37, 33, 37, 6]
labels = ['High-school','Bachelor','Master','Ph.d', 'Others']
# 用Matplotlib画饼图
plt.pie(x = nums, labels=labels)
plt.show()

3.7 热力图

是一种矩阵表示方法,其中矩阵中的元素值用颜色来代表,不同的颜色代表不同大小的值。通过颜色就能直观地知道某个位置上数值的大小。另外你也可以将这个位置上的颜色,与数据集中的其他位置颜色进行比较。

热力图是一种非常直观的多元变量分析方法。我们一般使用Seaborn中的sns.heatmap(data)函数,其中data代表需要绘制的热力图数据。

# Seaborn自带数据集flights,记录了1949年到1960年期间每个月的航班乘客数量
flights = sns.load_dataset("flights")
data=flights.pivot('year','month','passengers')
# 用Seaborn画热力图
sns.heatmap(data)
plt.show()

可以看到不同年份,不同月份的乘客数量变化,越浅的代表乘客数量越多。

3.8蜘蛛图

蜘蛛图是一种显示一对多关系的方法。在蜘蛛图中,一个变量相对于另一个变量的显著性是清晰可见的。

需要使用Matplotlib来进行画图,首先设置两个数组:labels和stats。他们分别保存了这些属性的名称和属性值。因为蜘蛛图是一个圆形,你需要计算每个坐标的角度,然后对这些数值进行设置。当画完最后一个点后,需要与第一个点进行连线。因为需要计算角度,所以我们要准备angles数组;又因为需要设定统计结果的数值,所以我们要设定stats数组。并且需要在原有angles和stats数组上增加一位,也就是添加数组的第一个元素。

#给王者荣耀的玩家做一个战力图,指标一共包括推进、KDA、生存、团战、发育和输出。
#设置两个数组labels和stats分别保存属性名称和属性值
#蜘蛛图是圆形的,需要计算每个坐标的角度,对这些数值进行设置,当画完最后一个点后与第一个点连线
labels=np.array([u"推进","KDA",u"生存",u"团战",u"发育",u"输出"])
stats=[83,61,95,67,76,88]
#画图数据准备,角度、状态值
angles=np.linspace(0,2*np.pi,len(labels),endpoint=False)
stats=np.concatenate((stats,[stats[0]]))#设定统计结果的数值,并在原有的angles和stats数组上增加一位(添加数组的第一个元素)
angles=np.concatenate((angles,[angles[0]]))#计算角度,
#用Matplotlib画蜘蛛图
fig=plt.figure()#创建一个空白figure对象
ax=fig.add_subplot(111,polar=True)#将画板划分为1行1列
ax.plot(angles,stats,'o-',linewidth=2)#连线
ax.fill(angles,stats,alpha=0.25)#给图形上色
ax.set_thetagrids(angles * 180/np.pi, labels)#显示属性名
plt.show()

4.二元变量分布

二元变量分布有多种呈现方式,开头给你介绍的散点图就是一种二元变量分布。

在Seaborn里,使用二元变量分布是非常方便的,直接使用sns.jointplot(x, y, data=None, kind)函数即可。其中用kind表示不同的视图类型:“kind=‘scatter’”代表散点图,“kind=‘kde’”代表核密度图,“kind=‘hex’ ”代表Hexbin图,它代表的是直方图的二维模拟。

#Seaborn中自带的数据集tips,这个数据集记录了不同顾客在餐厅的消费账单及小费情况。
tips = sns.load_dataset("tips")
print(tips.head(10))
# 用Seaborn画二元变量分布图(散点图,核密度图,Hexbin图)
#total保存了客户的账单金额,tip是该客户给出的小费金额
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')#jointplot查看两个变量的关系

sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')
plt.show()

分别是散点图,核密度图,Hexbin图

5.成对关系

探索数据集中的多个成对双变量的分布,可以直接采用sns.pairplot()函数。同时展示出DataFrame中每对变量的关系,另外在对角线上,你能看到每个变量自身作为单变量的分布情况。它可以说是探索性分析中的常用函数,可以很快帮我们理解变量对之间的关系。

#使用iris数据集(鸢尾花数据集)
#鸢尾花可以分成Setosa、Versicolour和Virginica三个品种,在这个数据集中,针对每一个品种,都有50个数据,每个数据中包括了4个属性,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。通过这些数据,需要你来预测鸢尾花卉属于三个品种中的哪一种。
iris = sns.load_dataset('iris')
# 用Seaborn画成对关系
sns.pairplot(iris)
plt.show()

分别为4个变量两两之间的关系。比如矩阵中的第一张图是花萼长度自身的分布图,第二张是花萼长度与宽度两个变量之间的关系。

思考:

Seaborn数据集中自带了car_crashes数据集,这是一个国外车祸的数据集,你要如何对这个数据集进行成对关系的探索呢?第二个问题就是,请你用Seaborn画二元变量分布图,如果想要画散点图,核密度图,Hexbin图,函数该怎样写?

car_crashes=sns.load_dataset('car_crashes')
print(car_crashes.head(10))#查看数据集的大体数据结构
sns.pairplot(car_crashes)#画图

#画散点图
sns.jointplot(x='total',y='speeding',data=car_crashes,kind='scatter')
#画核密度图
sns.jointplot(x='total',y='speeding',data=car_crashes,kind='kde')
#画Hexbin图
sns.jointplot(x='total',y='speeding',data=car_crashes,kind='hex')
plt.show()

car_crashes有8个变量, total, speeding, alcohol, no_distracted, no_previous, ins_premium, ins_losses, abbrev,

下面三个图是描述的total和speeding之间的关系

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值