ML-for hackers 第二章笔记

来源:互联网 发布:x art 知乎 编辑:程序博客网 时间:2024/06/03 06:58

本章讲解如何用R的基本方法做出摘要表和基本的可视化,并看出变化趋势;并介绍了分布曲线的特点以及分类。


本章所说的数值摘要就是一些基本的统计项目:均值和众数、百分数和中位数、标准差和方差;
可视化工具:直方图、核密度估计以及散点图。

准备知识:
作者认为把分析数据的工作分为两个独立的部分:探索和确认

  • 对新数据集进行操作前,首先要推断数据集每一列的类型,含义

一种常用的的变量编码方式:虚拟变量编码(dummy coding),如0表示正常电子邮件,1表示垃圾电子邮件,用0和1对一个对象的定性属性进行描述的方法。

  R中的因子是采用文字标签来表达对象的定性属性,但是在后台实际上还是编码为数值型,当读取标签时,这些数值自动的映射为一个字符串索引数组中对应的字符串标签。

summary()可以给出一个数值向量的数值统计量
mean()均值
median()中位数
quantile()分位数,默认情况,会给出数据集的0%、25%、50%、75%以及100%位置处的数据。含义:第N个分位数就表示数据集中有N%的数据小于它

标准差和方差给出数据散布程度,最小值和最大值无法给出数据集的整体情况,R的内置函数sd()和var()实现;

 R的内置函数var()与实际定义的方差函数会有偏差,解释:浮点运算的精度问题;var()函数的分母是向量长度减1(是因为从经验数据估算的方差会由于一些细微原因比其真值要略小)。

此时还没有给出众数的求解方法(继续往下看)


上面是一些基本的统计学术语,接下来对数据作出可视化的相关技术介绍,并介绍一些常用的分布

1.典型的单列可视化方法:直方图

library(ggplot2)ggplot(heights.weights,aes(x = Height)) +  geom_histogram(binwidth = 1)

这里写图片描述
直方图呈现对称性,且大部分数据位于中间,与均值和中位数接近。
binwidth参数通过设定组距来调节平滑度这对平滑程度的试验非常重要。

下面检验不同区间宽度的直方图

ggplot(heights.weights,aes(x = Height)) +  geom_histogram(binwidth = 5)

这里写图片描述

采用较大区间宽度时,对称性不存在,只有顶峰,这是oversmoothing(过平滑);与之相反的问题则称为欠平滑(undersmoothing).

下面采用较小的组距,这样才有可能显示出更多的细节。

 ggplot(heights.weights,aes(x = Height)) +  geom_histogram(binwidth = 0.01)

这里写图片描述
数据右出现了锯齿状,因为区间宽度太小,使数据欠平滑了.

2.选择另外一种可视化方法,即核密度估计(KDE)或叫做密度曲线图(density plot)
对于密度曲线图而言,adjust参数控制了曲线的平滑程度(adjust取值越大,曲线越平滑);
密度曲线能够在大数据集上更加接近我们所期望的理论形状,此外,密度曲线也有一些理论优势:揭示数据潜在的形状。

ggplot(heights.weights,aes(x = Height)) +  geom_density()

这里写图片描述
从密度曲线来看,峰峰值处有些平坦(标准的钟型曲线在峰值处是不平坦的)

根据其中任意一个定性变量将曲线分开(分组绘图)

# 根据数据集中的性别将曲线分离成两部分ggplot(heights.weights,aes(x = Height,fill = Gender)) +  geom_density()

这里写图片描述

发现两个部分重叠的钟形曲线;(正态分布也称为高斯分布或钟形曲线),上面的混合分布就是把两个正态分布组合而成的。

将两条曲线分开(分面)

ggplot(heights.weights,aes(x = Height,fill = Gender)) +  geom_density() +  facet_grid(Gender ~ .)

这里写图片描述
调整正态分布的均值和方差,改变钟形曲线的中心和其伸缩宽度(注:钟形并不是判断数据是否为正态分布的充要条件,因为还存在其他钟形分布)

3.说明众数的求法
连续数值的众数可用可视化的方法解释清楚:当构建一条密度曲线时,数据的众数就在钟形的峰值处。(可视化方法估计众数,密度曲线要比直方图容易。)正态分布所定义的众数的有一个特点,它只有一个众数,同时也是数据的均值和中位数。

只有一个众数的分布叫做单峰(unimodal);有两个众数的分布加做双峰(bimodal);有两个以上众数的分布叫做多峰(multimodal)

划分数据的方法:
从定性的区别来划分两类数据:对称分布(symmetric)数据和偏态分布(skewed)数据。

 对称分布的特点是:众数的左右两边形状一样,该特点说明,观察到小于众数的数据和大于众数的数据的可能性是一样的。

观察下图:
这里写图片描述

  图形向右偏,说明在众数右侧观察到极值的可能性要大于其左侧,这种图形称为伽马分布(gamma distribution)

从另一个定性的区别来划分出两类数据:窄尾分布(thin-tailed)数据和重尾分布(heavy-tailed)数据;

窄尾分布所产生的值通常都在均值附近,99%的可能性都是这样,比如正态分布在99%的情况下所产生的数据偏离均值都不会超过三个标准差,相比之下,另一个钟形分布-柯西分布(cauchy distribution)大约只有90%的值落在三个标准差范围内,距离均值越远,这两个分布的特点越不同:正态分布几乎不可能产生距离均值有6个标准差的值,然而柯西分布仍有5%的可能性。 

总结:
正态分布是单峰的,对称分布,也是钟形的窄尾分布;柯西分布也是单峰的,对称的分布,也是钟形曲线,却是重尾分布;
偏态分布(非对称分布)有伽马分布和指数分布
伽马分布是向右倾斜的,意味着中位数和均值有时差距很大,伽马分布 只有正值;
指数分布的众数出现在0值处,它特别像是把钟形曲线切掉一半后留下的正值部分(指数分布满足的条件是:数据集中频数最高的是0,并且只有非负值出现)

4.前面给出了单变量的可视化方法,后面考察两个变量的关系:
(预测数值问题,用回归方法;预测标签问题就称为分类问题。)
散点图是考察两个变量关系的最基本手段

画出数据的散点图,观察是否有隐含的形状来体现数据集两列之间的关系

ggplot(heights.weights,aes(x = Height,y = Weight))+  geom_point()

这里写图片描述
从该散点图明显可以看出:较高的人会较重

添加平滑曲线

ggplot(heights.weights,aes(x = Height,y = Weight)) +  geom_point() +  geom_smooth()

这里写图片描述

添加颜色属性映射,查看不同群体的变化(分类图)

ggplot(heights.weights,aes(x = Height,y = Weight,color = Gender)) +  geom_point()

这里写图片描述

下面构造分类超平面(separating hyperplane)

0 0