机器学习-数据可视化

如今天天产生的数据都是海量的,这些数据中既有高质量的也有不少垃圾,如何从这些海量的数据中洞察出这些数据的内在联系是咱们机器学习的核心内容。若是光把数据丢在你们的面前,我们确定是无感的,没法获取这些数据的意义。为了可以更加直观的了解这些数据的一些特征,例如数据的分布状况,数据的趋势和走势,数据之间的对比等等。这些特性能够很好的帮助咱们理解一些数据的内在特性,从而对咱们的特征工程也有很大的辅助功能。还有最大的一个功能就是帮助我们作不少看起来很牛逼图像,而后在报告上面装B(你们都懂的,嘘嘘嘘嘘)。在数据科学的领域中,比较底层的数据可视化组件事matplotlib. 可是鉴于上一节我们已经说过pandas,pandas的可视化接口也都是基于matplotlib的,可是pandas的更加抽象,因此运用起来也更加简单一点。另外我也会简单的介绍一款专门用于数据可视化的组件叫作seaborn,它也是基于matplotlib的,可是seaborn也更加抽象,level也更加高,在可视化方面提供的接口也更加简单丰富。具体要用哪个都同样,你们随便选择,只要你们能在PPT或者报告中能成功在老板面前把B装起来,我们就成功了,无论黑猫白猫,能抓住老鼠的就是好猫。哈哈,那我们就开始我们的表演吧。程序员

  • categorical data type plot (univarate bar chart)

首先我们先要了解category data是什么,category data一般也分两种:nominal category和ordinal category。nominal category一般是一些名词,而后对于这些category的顺序并不care,例如省份,国家,品牌等等(地域黑除外,哈哈);ordinal category一般是一些对于顺序很敏感的变量,而后对于趋势和分布比较重要的数据,例如:分数,月份,年份,人口,消费等等啦。对于category data一般的可视化操做都是bar chart 或者 pie chart.下面的主要以bar chart做为例子来解释。本文主要是讲述数据的可视化,默认我们已经加载的数据哈,具体加载数据的过程,下面的代码就不展现了。看下面的bar chart实例,而后我来解释细节框架

reviews.points.value_counts().plot.bar()#sorting value from max to min(default)
reviews.points.value_counts().sort_index().plot.bar()#sorting index from min to max (can see the trend)

因为value_counts()返回的是一个series,而且返回的series的排序是按照这个series的value值从大到小的顺序,因此plot的结果就是只有一个变量,就是这个series的index,那么这个变量对应的值就是这个series的value值。第一句代码的图像结果以下:机器学习

 

从上图能够看出,上图的变量是乱序的,纵坐标(value)是按照从大到小的顺序的。 上面的第二句代码多了一句sort_index(), 直译过来就是将原来series的index 排序了,那么新的series的index是按照从小到大的顺序排列的。它的结果以下:函数

 

 从上图能够很清晰的看出数据的分布状况,第二幅图也能给咱们更加剧要的数据信息。学习

补充:对于ordinal category的数据,我们还有一种经常使用的绘图方式,那就是hist()。hist()能自动将series中的index进行排序,而后分红N个bins,每一个bins 对应的纵坐标则是这个bin相对应的frequency(即出现的次数)。例以下面的代码和图片字体

reviews.points.plot.hist()

 

 从上面的代码和图片能够看出,hist()函数不须要将现将points进行value_counts进行计算,它能够直接自动将series中的value按照顺序分红N个bins,而后自动计算在每一个bin中的数量。从上面的代码能够看出,bar()是讲series中的index做为变量,而hist()是将series中的value做为变量,而frequency(即出现的次数)做为y. 这一点在初学者中常常弄混淆,甚至认为二者是同样的。其实二者是有本质区别的,bar()是从series中一条一条的取数据,而后分别将index和value做为x,y进行绘制;而hist()则是一条一条的在series中取数据,只将series中的value做为x, 而后一直count每个x。这两种plot都是统计series中的value出现的次数,另外,不管hist()仍是bar(),series的value必须是numerical,不能是categorical。this

有的时候,另一种图也能很好的反映index和value之间的关系,那就是line chart。这种图片也能很是好的反映数据的趋势,因此通常也是用在ordinal的category中。以下spa

reviews.points.value_counts().sort_index().plot.line()

 

  •  Biavariate

在不少状况下,我们会遇到要展现2个自变量的图片。例如经纬度,bmi等等。一般这种状况下,这种图都是反映的是出现的频率,热度等。一般展示两个自变量的图有scatter,hexbin.好了,下面我们就直接上代码和结果给你们解释一下3d

reviews[reviews.price<100].sample(100).plot.scatter(x='price',y='points')

 

 上面就是scatter图的代码和结果,我们能够啃方便的看出数据的分布状况,不一样于bar chart和histogram 它们都是展示一个维度的数据分布状况, scatter是展现的2个维度的数据分布状况。可是他有个致命的弱点,就是数据特别多而且它们不少的值都同样的时候,它们是覆盖在一块儿的,我们就没法用眼睛直观的准确的分辨出它们的分布状况了。scatter适合那些数据不是特别多,而且重复数据不多的状况。那么我们怎么解决这些问题呢?答案就是hexbin图啦,前人已经帮我们把坑都填好啦,哈哈,下面我们看看hexbin是如何展示2个变量的分布状况吧code

#another plot method - Hex plot could perfectly deal with the scatter plot's drawbacks. Hex aggregatepoints in
#a hexagons, and the colors of the hexagons represent the values within them, which clearly conveys the meaningful
#results and view to us, such as: where does the examples cluster. in this case, it clusters around 87.5points and around 20 dollars
reviews[reviews.price<100].plot.hexbin(x='price',y='points',gridsize=15)

 

 上面的的注释已经讲得很清楚啦,hexbin图中,颜色越深,出现的次数就越多。这样我们就不怕数据重叠的问题啦,很是直观的就能够看出数据的分布状况。综上所述,固然啦,对于bivariate的数据可视化确定还有不少其余的API,不可能全在这讲完,对于一名合格的程序员,我们最重要的品质就是看文档的能力,具体我们看,大家直接去pandas的官网看哈。总之对于数据量不大,重复数据很少的状况,我们能够选择scatter,对于数据量很大,而且不少重复数据的时候,就选hexbin,能够更加简单的看到数据的分布状况。

  • Subplotting

你们不少时候必定遇到过在同一个画布上面同时画出好几个图片的需求,可能用于对比,可能用于展现更加丰富的信息。这种时候,我们就想起了subplot了。下面先经过一个简单的实例展现一个最简单的subplot

fig,axarr = plt.subplots(2,2,figsize=(12,8))
first_150_reviews['points'].value_counts().sort_index().plot.bar(ax=axarr[0][0])
first_150_reviews['price'].value_counts().plot.hist(ax=axarr[0][1])
first_150_reviews['variety'].value_counts().head(20).plot.bar(ax=axarr[1][0])
first_150_reviews['province'].value_counts().head(20).plot.bar(ax=axarr[1][1])

 

 

上面的代码展现了一个subplot的最简单的方式,首先第一个参数是(2,2)表明着是有几个subplot,第二个参数figsize表明着整个画布的大小,因此第一行代码是初始化一个画布,而且设定一些画布的初始值。后面的四行代码则是绘图的过程,每一行的参数ax表明着坐标系,ax后面的index分别对应着subplot的row和column,例如ax[0][1]表明着第一行第二列。因此你们看看subplot是否是能够展示出更加丰富的内容呢。固然啦,每个subplot ax[row][column] 也能够有一些个性化的设置,这个我们后面慢慢说,上面只是一个最最最最简单的绘画subplot的一种方法。

  • 图片个性化

固然啦,既然是图嘛,免不了不少时候我们想着要美化一下下嘛,毕竟常常要给别人展现的,门面仍是很重要的。因此我们常常须要将图形进行一些个性化设置,例如图形的颜色,字体大小,图形标题,图形大小等等一系列的特性。首先我们看一下图形的大小哈,我们能够经过figsize的参数进行设定,以下

reviews.points.value_counts().sort_index().plot.bar(figsize=(20,6))

能够经过设置tuple里面的数据对图片的大小进行设置。接下来我们能够看看对图形颜色的设置

#customerize the color of the bars
reviews.points.value_counts().sort_index().plot.bar(figsize = (12,6), color = 'green')

上面代码就是将bar chart中的bar设置成绿色。接下来我们瞧一瞧坐标系上字体大小的设置

#coustomerize font
reviews.points.value_counts().sort_index().plot.bar(figsize = (12,6), color = 'red', fontsize = 20)

上面代码的fontsize能够设置坐标系字体的大小。最后我们来看看图形标题的设置

reviews.points.value_counts().sort_index().plot.bar(
        figsize=(12,6),
        color='green', 
        fontsize = 16, 
        title='Rankings Given By Wine Magazine'
        )

上面的代码能够给这个图片设置一个标题叫作“Rankings Given By Wine Magazine”,这里我们有个小细节须要注意一下就是标题的字体大小也能够设置,可是在pandas plot的框架上面无法设置,必须去更加底层的matplotlib去设置图片标题的字体大小,代码以下

import matplotlib.pyplot as plt
title_customerise_plot = reviews.points.value_counts().sort_index().plot.bar(
        figsize = (12,6),
        color = 'green',
        fontsize = 16
        )
title_customerise_plot.set_title("Ranking Given By Wine Magazine",fontsize = 20)

我们必须经过matplotlib.pyplot中的set_title()的方法来设置图片标题的大小,而没法直接在pandas中设置它。上面的结果以下

 

  • Seaborn 简介

数据的可视化呢,除了pandas提供一些简单易用的API以外,还有一个专门用于数据可视化的框架,那就是seaborn。它也是基于matplotlib的,可是用起来比matplotlib简单,功能也比pandas的绘图功能更加丰富,毕竟seaborn人家是专业的嘛,哈哈。关于seaborn我也就在这里简单的演示一下bar chart,line chart,scatter plot, kde 等等一些简单的应用哈。仍是那句话,关于绘图有无数个API,须要你们安静下来去seaborn的documentation细细品味,嘻嘻. 下面的代码分别展现了bar chart,line chart在seaborn中的应用

import matplotlib.pyplot as plt
import seaborn as sns
#data flight_delays
= pd.read_csv("C:\\Users\\tangx\\OneDrive\\Desktop\\DATA\\flight_delays.csv",index_col='Month',parse_dates = True) spotify_df = pd.read_csv("C:\\Users\\tangx\\OneDrive\\Desktop\\DATA\\spotify.csv",index_col="Date",parse_dates = True) #plotting
sns.lineplot(data
=spotify_df['Despacito'],label = "Despacito") sns.barplot(x=flight_delays.index,y= flight_delays.NK)

从上面的代码能够看出,series都是做为参数(数据源)传递给函数的,而不像在pandas绘图那样,将绘图的方法做为series的方法。seaborn中也能够传递不少的参数来个性化图形,例如上面的label。你们有兴趣能够本身去看看哈。上面的结果以下

 

 我们能够从上图看出,对于数据源我们既能够直接把series传给data参数,也能够分别将横坐标纵坐标的值分别传递给x,y。并且若是你选择第二种它还能自动给横坐标和纵坐标命名,还挺智能。seaborn还有更加牛的功能,看看下面两个个scatter plot,你去瞧一瞧那些牛逼的功能

sns.scatterplot(x=insurance.bmi,y=insurance.charges)
sns.scatterplot(x=insurance.bmi,y=insurance.charges,hue=insurance.smoker)

 

经过上面我们能够看出,虽然是同一个scatter,可是它还能够经过hue这个参数,将数据根据必定的条件(例如上面的是否是吸烟者)来分开,从而能够帮助我们更加深入的理解数据。若是看到这里大家就以为seaborn牛逼,那么只能说大家仍是太年轻,哈哈,它仍是有大招的,那就是它还能够话拟合线,具体是什么呢?看看下面的代码

sns.regplot(x=insurance['bmi'], y=insurance['charges'])
sns.lmplot(x='bmi',y='charges',hue='smoker',data=insurance)

 

 

 regplot至关于直接画一条regression line,而lmplot则可以根据不一样条件下的子集画出不一样的regression line,这对于我们分析数据走势,和一些数据的subset的趋势都有很大的帮助。最后我们来看看seaborn的另一个大杀器,那就是KDE plot, 那么很大同窗可能会有疑问了,什么是kde呢? kde实际上是kernel density estimation的简称,它实际上是一种几率分布的技术,像是一个小window从我们的图形从左到右的走一遍,而后把那些偏离很大的值(outliers)和那些忽然变化很大的值(in-between values)删除和变成一条更加顺滑的线,而且将结果转成几率。它既能够用于univariate也能够用于bivariate。注意:kde的y值(函数的变量)是几率(对于2d数据来讲,是经过颜色的深浅来判断的),而不是frequency!!!!!!!。那我们如今来看看kde的简单应用

first_150_reviews[first_150_reviews['price']<200]['price'].value_counts().sort_index().plot.line()
sns.kdeplot(first_150_reviews.query('price<200').price)

 

 我们看看上面的两个图片,右边的图片应用了kde,是否是像给第一幅图用了海飞丝同样,瞬间顺滑了不少,也更加直观的展现了数据的分布和趋势。下面我们来看看kde用于bivariate的状况

first_150_reviews[first_150_reviews.price<200][['price','points']].dropna().sample(5000).sort_index().plot.scatter(x='price',y='points')
sns.kdeplot(first_150_reviews[first_150_reviews.price<200][['price','points']].dropna().sample(5000))

 

 第一个图片是通常的scatter,第二幅图是kde,越靠近图形中间的位置,出现的几率越大。 至于哪个好,那一牛逼,大家本身内心有一把尺,不用我说了吧。哈哈

  •  box plot and violin plot

如今介绍最后一种常见的图形,实际上是两种图,可是他们本质同样,分别是box plot和violin plot。我们先看建立它们的代码和运行结果真后在分析这两种图形

df = first_150_reviews[first_150_reviews.variety.isin(first_150_reviews.variety.value_counts().head(5).index)]
sns.boxplot(
        x="variety",
        y = "points",
        data = df
        )


#violin plot
#violin plot cleverly replace the box in the boxplot with a kde for the data, it is more visually enticing
sns.violinplot(
        x='variety',
        y='points',
        data = df)

 

看到上面的五光十色的图形,是否是内心一万只曹尼玛,哈哈,心想什么玩意儿。待我慢慢来分析,首先看看左边的图形box plot,最下面的一条线是每个variaty相对应points的最小值,中间box有三条横线,分别对应着该variaty下面points的25%,median,75%的值,而后box上面的最顶上的一个横线表明着该variaty下points的最大值。右边的violin plot其实就是对box plot的kde,更能反映出数据的分布状况。他们之间的对比能够看下面这个经典的图

 

 

总结:这节的数据可视化的内容很杂,其实若是想把数据可视化玩的转,最重要的的捷径就是理解数据。关于可视化的API我我的认为是最简单的API,并且很少,建议你们都能理解透彻。虽然可视化的内容不难,可是有不少图形很像,可是要知道他们的不一样,例如bar chart 和histogram,box plot和violin plot 等等,虽然看着类似,但实际上是不一样的。就像开头说的,这里主要是写的是pandas和seaborn的可视化的方法,实际中还常常须要用到底层一点的matplotlib,这里我就不细说了,若是上面的内容能消化,以你们的能力看matplotlib的API 应该也不是问题的。

相关文章
相关标签/搜索