导读在之前的《数据挖掘概念与技术 第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. [日常摸鱼]Luogu2521[HAOI2011]防线修建-set维护凸包

    https://www.luogu.org/problemnew/show/2521 题意:维护一个上凸包:删点,查询周长 很容易想到把问题转换为离线:先读入全部操作,记录下最后剩下的点,倒着加点来维 ...

  2. 留心一下VS的这个调试代码的bug

    最近和同事在Debug代码时,遇到一个诡异的问题,开始以为是代码问题,分析了之后发现是VS(v16.8.3)的bug,特此分享一下,如果大家近期遇到类似的问题,不要茫然. 这个bug重现的方式是,在d ...

  3. 工具-chrome相关-安装crx包及错误解决(99.3.1)

    @ 目录 1.安装教程 2.程序包无效:"CRX_HEADER_INVALID" 1.安装教程 在浏览器上输入 chrome://extensions 并且选择开发者模式 将.cr ...

  4. 使用Github快速的寻找项目

    作为一个3年的码农昨天在学习项目,顺便总结一下 ,在Github找项目的几个常用方式 ,如果对您有帮助,可以点个关注,便于下次光顾! 首先我们来看一下常用命令 1.指定搜索方式 搜索文件中有spiri ...

  5. 学习tomcat-如何建立连接,处理请求

    tomcat如何建立连接,处理请求 学习探讨tomcat如何建立网络连接协议,并处理客户端过来的请求 建立http网络连接,指定通信协议 tomcat在创建时,会创建连接对象,负责处理客户端的请求,基 ...

  6. CORS(跨域资源共享)笔记

    0.前言 CORS(Cross-Origin Resource Sharing)是一个用于处理跨域问题的W3C标准,本文将介绍什么是跨域,引起跨域的同源策略,什么是CORS,CORS的工作过程,请求方 ...

  7. matlab随机系数矩阵产生以及矩阵的可视化函数

    clc; clear all; close all; n = 100;%所产生矩阵的大小 A= sprandsym(n,0.015,0.1,1);%产生系数矩阵函数: spy(A)矩阵图形化相当于im ...

  8. java基础:方法的定义和调用详细介绍,方法同时获取数组最大值和最小值,比较两个数组,数组交换最大最小值,附练习案列

    1. 方法概述 1.1 方法的概念 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建才可以使用,该过程成为方法定义 方法创建后并不是直接可 ...

  9. k8s之深入解剖Pod(三)

    目录: Pod的调度 Pod的扩容和缩容 Pod的滚动升级 一.Pod的调度 Pod只是容器的载体,通常需要通过RC.Deployment.DaemonSet.Job等对象来完成Pod的调度和自动控制 ...

  10. MySQL 触发器、存储过程 练习

    创建表并插入数据: ```        字段名 数据类型 主键 外键 非空 唯一 自增        id INT    是 否 是  是 否        name VARCHAR(50) 否 否 ...