导读在之前的《数据挖掘概念与技术 第2章》的文章中我们介绍了Q-Q图的概念,并且通过调用现成的python函数, 画出了Q-Q图, 验证了Q-Q图的两个主要作用,1. 检验一列数据是否符合正态分布 2. 检验两列数据是否符合同一分布。本篇文章将更加全面的为大家介绍QQ图的原理以及自己手写函数实现画图过程
本文的代码文件(jupyter)和数据文件可以在我们的公众号"数据臭皮匠" 中回复"QQ图"获取

Q-Q图是什么

QQ图是quantile-quantile(分位数-分位数图) 的简称,上面也有介绍它的两个主要作用:
1.检验一列数据是否符合正态分布
2.检验两列数据是否符合同一分布
 
Q-Q图的原理
要弄清Q-Q图的原理,我们先来介绍下分位数的概念。这里我们引用下百度百科的介绍:
分位数, 指的就是连续分布函数中的一个点,这个点对应概率p。若概率0<p<1,随机变量X或它的概率分布的分位数Za,是指满足条件p(X≤Za)=α的实数。
 
What...?? 是不是感觉有点抽象,别着急,我们继续往下看分位数的实例-百分位数。
 
百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列。如,处于p%位置的值称第p百分位数。
给大家举个例子:初三年级有1000名学生, 期末考试成绩按照从高到低的顺序排列, 排名第10的同学, 刚好位于全校1000名同学的1%处, 他的分数就是全校期末考试分数的第1百分位数, 记为P1, 同理, 第20名同学对应的分数就是第2百分位数P2, ... 第990名同学的分数为第99百分位数 P99。
 
那么Q-Q图的原理就是,通过把一列样本数据的分位数与已知分布的一列数据的分位数相比较,从而来检验数据的分布情况。所以, Q-Q图的两个功能都是比较两列数据的分位数是否分布在y=x的直线上。当两列数据行数相同时, 首先将两列数据分别从高到低排序, 直接画散点图就可以了, 当两列数据行数不一样时, 需要分别计算出每列数据的百分位数, 再将两列数据的百分位数画散点图, 检查散点图是否分布在y=x直线附近。
 
检验数据是否符合正态分布
我们接下来的实例数据及引用自自kaggle的Students Performance in Exams , 你可以在我们公众号后台回复"QQ图"来获取它。
首先来介绍一下我们的数据集。数据共1000行, 8列, 每行代表一名学生的属性信息, 最后三列为三科成绩, 分别是: 'math score', 'reading score', 'writing score' , 我们将只适用最后三列的分数, 验证学生分数是否符合正态分布
我们先通过调用python包来画QQ图 检验是否符合正态分布
可以看到, 学生的三科总分与标准正态分布的数值画出的散点图, 基本分布在一条直线附近, 可以认为学生分数符合正态分布, 但不是标准正态分布,详细分析我们在下文会讲到。
接下来,我们通过手动画Q-Q图 来实现检验数据是否符合正态分布
当两列数据行数相同时,直接将分别排序后的两列数值画散点图
可以看到, 我们画出了和统计包几乎一样的QQ图(最左侧和最右侧之间的差异, 是由于正态分布变量是随机产生的, 每次都会有一些不同)
 
直接将分别排序后的两列数值画散点图, 好像不能体现Q-Q图的本质, 我们接下来取0到100的500个分位数,画图看下情况
我们画出了和上面几乎一样的图, 但是可以看到, 右侧的点分布在在直线下方, 结果是符合直觉的, 因为正态分布的数据在最右侧需要有一些比较大的数字, 但是学生成绩被总分300 限制住了, 这就印证了一句话,学霸只能考100是因为满分只有100
 
检验两列数据是否符合同一分布
两列数据行数相同时
两列数据行数不同时
可以看到, 'math score' 和 'reading score' 两列的分位数分布在y=x 直线附近, 我们可以认为两列数据符合同一分布。
 
符合正态和标准正态分布的区别
在上面检验数据是否符合正态分布时,我们说, 学生分数符合正态分布, 但不是标准正态分布。是因为通过仔细观察会发现, 散点图并不是沿着y=x 线分布, 而是沿着 y=ax+b 分布, 即, 一条有截距且有斜率的直线。
Q-Q散点图是沿着y=x分布时, 符合标准正态分布
Q-Q散点图沿y=ax+b分布时, 符合正态分布, 但非标准正态分布
可以看到, 散点图基本在y = ax+b 的附近分布, 这时我们可以说,score_tol 列符合正态分布, 但不是标准正太分布。
一般认为,Q-Q图的散点需要分布在y=x 直线附近才认为符合正态分布, 为什么散点图分布在y=ax+b附近, 仍然可以认为, score_tol 符合正态分布呢? 因为, 从图中可以看到, score_tol 列可以写成正态分布的列val 的线性函数 score_tol = a * val + b 而正态分布的性质决定了, 如果一个变量x服从正态分布, 那么他的函数ax+b 也符合正态分布。
本文的Python代码和数据文件可以在我们的公众号"数据臭皮匠" 中回复"QQ图"获
 
关注公众号:数据臭皮匠;获得更多精彩内容

作者:范小匠

审核:灰灰匠

编辑:森匠

Q-Q图原理详解及Python实现的更多相关文章

  1. python编写微信公众号首图思路详解

    前言 之前一直在美图秀秀调整自己的微信公众号首图,效果也不尽如人意,老是调来调去,最后发出来的图片被裁剪了一大部分,丢失部分关键信息,十分恼火,于是想着用python写一个程序,把微信公众号首图的模式 ...

  2. 【转】VLAN原理详解

    1.为什么需要VLAN 1.1 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.V ...

  3. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  4. VLAN原理详解[转载] 网桥--交换机---路由器

    来自:http://blog.csdn.net/phunxm/article/details/9498829 一.什么是桥接          桥接工作在OSI网络参考模型的第二层数据链路层,是一种以 ...

  5. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  6. Skip List(跳跃表)原理详解与实现【转】

    转自:http://dsqiu.iteye.com/blog/1705530 Skip List(跳跃表)原理详解与实现 本文内容框架: §1 Skip List 介绍 §2 Skip List 定义 ...

  7. I2C 基础原理详解

    今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...

  8. 锁之“轻量级锁”原理详解(Lightweight Locking)

    大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意. 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖 ...

  9. Influxdb原理详解

    本文属于<InfluxDB系列教程>文章系列,该系列共包括以下 15 部分: InfluxDB学习之InfluxDB的安装和简介 InfluxDB学习之InfluxDB的基本概念 Infl ...

随机推荐

  1. Spark性能调优篇六之调节数据本地化等待时长

    数据本地化等待时长调节的优化 在项目该如何使用? 通过 spark.locality.wait 参数进行设置,默认为3s,6s,10s. 项目中代码展示: new SparkConf().set(&q ...

  2. Python高级语法-多继承MRO相关-args和kwargs(4.5.2)

    @ 目录 1.说明 2.代码 关于作者 1.说明 args数据类型为元组 kwargs数据类型为字典 一般传入方法中使用遍历去得到值 这个传入参数的顺序没有特殊的要求 当你自定义的参数传完以后,写了名 ...

  3. day021|python之面向对象进阶1

    面向对象进阶 目录 面向对象进阶 1 继承 1.1 继承入门 1.1.1 继承基础 1.1.2 类的基本使用 1.2 多继承 1.2.1 多继承的基本使用 1.2.2 多继承以后的重复性 1.3 类的 ...

  4. 深入理解MySQL系列之索引

    索引 查找一条数据的过程 先看下InnoDB的逻辑存储结构: 表空间:可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中.默认有个共享表空间ibdata1.如果启用innodb ...

  5. 编译nginx增加fair模块

    安装必要的软件 ubuntu里是 apt install wget gcc make zlib1g-dev libpcre3-dev 去官网下载最新稳定版的nginx源码 git clone 源码 g ...

  6. 安装篇六:安装PHP(7.2.29版本)

    准备环境,下载依赖软件 # No1:在前面安装好的基础上,关闭iptables.selinux # No2:安装依赖包 yum install zlib-devel bzip2-devel -y &l ...

  7. idea提交svn不显示新建文件

    在idea中,使用svn提交时可能会出现 预期文件没出现在提交目录里. 是因为没有把新建文件添加到版本控制里. 解决办法:右键选择文件→subversion→add to  vcs. 自动把新文件添加 ...

  8. 关于BackTop按钮的实现

    今天在处理,首页面的制作的时候,在实现backtop按键的时候,有些思路,作为记录. 功能为,点击backtop即可,立马跳到首页的最上面,且backtop只有在页面后1/2处才显示出来. 首先,我们 ...

  9. ASP.NET Core Controller与IOC的羁绊

    前言 看到标题可能大家会有所疑问Controller和IOC能有啥羁绊,但是我还是拒绝当一个标题党的.相信有很大一部分人已经知道了这么一个结论,默认情况下ASP.NET Core的Controller ...

  10. Java核心类

    Java核心类的学习: 常用类库 io流 集合 多线程 网络编程 调试与优化 XML和JSON 枚举.注解和反射 设计模式