导读在之前的《数据挖掘概念与技术 第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
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就一直想做爬虫的东西,还要继续学 理论上的东西一要加强 #!/usr/bin/python#coding=utf-8import urllibimport redef getHtml(url): page = urllib.urlopen(u......

  2. python实现简单的井字棋游戏(gui界面)

    项目输出项目先决条件要使用python构建井字游戏,我们需要tkinter模块和python的基本概念Tkinter模块是用于渲染图形的标准图形用户界面。Tkinter.messagebox用于显示消息框要安装tkinter模块,我们在命令提示符下使用了pip install命令:pip insta......

  3. python实现自幂数的示例代码

    1、什么是自幂数?前文介绍过 python 实现水仙花数,其实水仙花数为自幂数的一种,即,3位自幂数。自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数)自幂数-百度百科2、自幂......

  4. python中re模块的使用(正则表达式)

    一、什么是正则表达式?正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。二、正则表达式的匹配规则1.表......

  5. Python学习(5)(while循环语句、循环嵌套、break/continue、赋值运算符、转义字符等 )

    Python学习(5)一、python的while 循环语句二、python的赋值运算符三、python的while 循环语句 示例四、python的 break 和 continue五、python的while 嵌套1、用嵌套打印小星星2、python 九九乘法表六、python的print 函数......

  6. python中yield的用法详解

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。接下来是正题:首先,如果你还没有对yield有个初步分认识,那么......

  7. Python监控进程状态并实现告警

    公司的应用程序有时候会莫名其妙地挂掉,如果我们经常去登录服务器看是不是程序挂了,挂了再拉起,那样是非常耗时和麻烦的事情。后来我们通过使用 supervisor 去守护启动,实现方法如下:那什么是 supervisor了?Supervisor是用 Python 开发的一个client/server服务......

  8. Python单元测试框架pytest常用测试报告类型

    先前博客有介绍pytest测试框架的安装及使用,现在来聊聊pytest可以生成哪些测试报告1.allure测试报告关于allure报告参见先前的一篇博文:https://www.cnblogs.com/feng0815/p/13792188.html ,这里不再赘述2.生成resultlog文件#!......

  9. Python 日志打印之logging.getLogger源码分析

    日志打印之logging.getLogger源码分析日志打印之logging.getLogger源码分析By:授客 QQ:1033553122 #实践环境WIN 10Python 3.6.5#函数说明logging.getLogger(name=None)getLogger函数位于logging/_......

  10. Python 元类

    本文通过Python实现单例模式一步步理解元类。印象中,是在创建单例模式时知道可以用到元类(metaclass),但始终对其了解的不是很透彻,很多人也都说元类是Python中较难理解的概念之一,于是找来几本书,希望可以找到答案,本文以Python3为例。本文参考:《人人都懂设计模式》《Python ......

随机推荐

  1. 【python接口自动化】- 正则用例参数化

    我们在做接口自动化的时候,处理接口依赖的相关数据时,通常会使用正则表达式来进行提取相关的数据。正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(Regular Expression,在代码中常简写为regex、regexp或RE) 。它是一个特殊的字符序列,它能帮助你方便的......

  2. js简单粗暴的发布订阅示例代码

    什么是发布/订阅?我打个比方,你去某个门店买衣服,你和门店店长相互并不认识,门店店长只管卖他的衣服,并不关心是谁来买,而你也只管买你想要的衣服,并不关心是哪个门店在卖,这时,门店和你就组成了一个发布/订阅的关系。当门店挂出衣服款式,你去找你想要的衣服,如果找到了,那就买下来,如果没找到,那就离开这家......

  3. linux kernel操作GPIO函数

    一、头文件#include 二、注册 GPIO int gpio_request(unsigned gpio, const char *label)功能:申请一个GPIO参数:gpio:管脚号;label:管脚名,可以为空(NULL)返回值:成功返回0,失败返回错误码三、设置GPIO方向1、设置输出......

  4. Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤

    思路:使用Python爬虫对腾讯疫情网站世界疫情数据进行爬取,封装成一个函数返回一个 字典数据格式的对象,写另一个方法调用该函数接收返回值,和数据库取得连接后把 数据存储到mysql数据库。一、mysql数据库建表CREATE TABLE world(id INT(11) N......

  5. 详解JavaScript中哪一种循环最快呢

    了解哪一种 for 循环或迭代器适合我们的需求,防止我们犯下一些影响应用性能的低级错误。JavaScript 是 Web 开发领域的“常青树”。无论是 JavaScript 框架(如 Node.js、React、Angular、Vue 等),还是原生 JavaScript,都拥有非常庞大的粉丝基础。......

  6. Java 添加数字签名到Excel以及检测、删除签名

    Excel中可添加数字签名以供文档所有者申明文档的所有权或有效性。文本以Java代码示例介绍如何在Excel文档中对数字签名功能进行相关操作,包括如何添加签名到Excel、检测Excel文档是否已签名,以及如何删除Excel文档中的签名。本次代码测试环境Excel版本:2013编译环境:Intell......

  7. PHP 非常实用下载远程图片

    /*** 下载远程图片* @param string $url 图片的绝对url* @param string $filepath 文件的完整路径(例如/wwwhttp://www.580doc.com/images/test) ,此函数会自动根据图片url和http头信息确定图片的后缀名* @param string $filename ......

  8. Python PyQt5中弹出子窗口解决子窗口一闪而过的问题

    方式一:槽函数中创建子窗口对象,赋值到普通变量在主窗口添加按钮,并把按钮信号关联槽,在槽函数中创建子窗口对象赋值到普通变量,并调用其 show 方法。from PyQt5.QtWidgets import *import sysclass Main(QMainWindow):def __init......

  9. 使用 gRPCurl 调试.NET 5的gPRC服务

    介绍你用过 Curl 吗?这个工具允许你通过 http 来发送数据,现在有一个适用于gGRPC的工具,gRPCurl,在本文中,我将介绍如何下载安装这个工具,然后通过这个工具调试我们.NET 5上面的gGRC程序。安装 gRPCurlgRPCurl 基于GO语言开发,所以,你要安装GO环境,可以在这......

  10. 使用Python封装excel操作指南

    前言openpyxl 是 python 中操作 excel 表格比较常用的一个库,可以读取和写入excel文件,支持【.xlsx / .xlsm / .xltx / .xltm】格式的文件,处理excel数据、公式、样式,且可以在表格内插入图表但是在实际项目的使用过程中,如果经常要用到 openpy......