Python验证数据的抽样分布类型
假如要对一份统计数据进行分析,一般其来源来自于社会调研/普查,所以数据不是总体而是一定程度的抽样。对于抽样数据的分析,就可以结合上篇统计量及其抽样分布的内容,判断数据符合哪种分布。使用已知分布特性,可以完成对总体的统计分析。
本文使用python函数判断数据集是否符合特定抽样分布。
数据来源
本次试验使用kagglehttps://www.kaggle.com/datasets上的公开数据集,可以通过搜索框进行数据集搜索。

通过搜索「income」关键值,最后决定使用https://www.kaggle.com/goldenoakresearch/us-household-income-stats-geo-locations/version/1#US_Income_Kaggle.csv这个数据集,其中包含抽样区域的家庭收入均值,中位数和标准差。通过页面中的pdf文件链接,可以获取每个字段的说明。

抽样分布验证
读入数据
import pandas as pd
import numpy as np
us_income = pd.read_csv("US_Income_Kaggle.csv", encoding="ISO-8859-1")
需要注意,csv文件的 编码是Latin-1,因此需要显式指定编码读取。
画出收入均值的直方图
import seaborn as sns
sns.distplot(us_income['Mean'], color="b", bins=10, kde=True)

从图形看,在低收入侧,有一个数量的下降,并不符合正态分布的曲线。
使用函数判断是否服从正态分布
from scipy import stats
stats.kstest(us_income['Mean'], 'norm')
Out[23]: KstestResult(statistic=0.980404837353683, pvalue=0.0)
因为kstest可以做多种分布的验证,这里需要指定验证的分布类型为正态分布,即第2个参数。
stats.shapiro(us_income['Mean'])
UserWarning: p-value may not be accurate for N > 5000.
warnings.warn("p-value may not be accurate for N > 5000.")
Out[25]: (0.9653068780899048, 0.0)
shapiro函数不适合样本数>5000的正态分布检验,所以这里提示warning。
stats.normaltest(us_income['Mean'],axis=0)
Out[27]: NormaltestResult(statistic=1170.1750576510913, pvalue=7.938067739808798e-255)
normaltest函数专门用于正态分布分布检验,其中axis=0表示按行读取数据。
通过以上的函数,可以得到所有的pvalue都小于0.05,这种情况下,我们认为区域收入平均值不服从正态分布。
是否服从t分布
np.random.seed(1)
ks = stats.t.fit(us_income['Mean'])
df = ks[0]
loc = ks[1]
scale = ks[2]
t_estm = stats.t.rvs(df=df, loc=loc, scale=scale, size=len(us_income['Mean']))
stats.ks_2samp(us_income['Mean'], t_estm)
Out[40]: Ks_2sampResult(statistic=0.07327168078639335, pvalue=1.7671996893936462e-36)
这里的思路是先用t分布拟合区域收入均值,然后使用ks_2samp函数比较区域收入均值和t分布的随机变量。因为pvalue小于0.05,认为该数据集不服从t分布。用以下方法可以画出拟合数据和数据集的对比图。
from matplotlib import pyplot as plt
plt.figure()
us_income['Mean'].plot(kind = 'kde')
t_distribution = stats.t(ks[0], ks[1],ks[2])
x = np.linspace(t_distribution.ppf(0.01), t_distribution.ppf(0.99), 100)
plt.plot(x, t_distribution.pdf(x), c='orange')
plt.xlabel('location based income')
plt.title('income on t_distribution', size=20)
plt.legend(['income_data', 't_distribution'])

是否服从卡方分布
np.random.seed(1)
chi_square = stats.chi2.fit(us_income['Mean'])
df = chi_square[0]
loc = chi_square[1]
scale = chi_square[2]
chi_estm = stats.chi2.rvs(df=df, loc=loc, scale=scale, size=len(us_income['Mean']))
stats.ks_2samp(us_income['Mean'], chi_estm)
Out[40]: Ks_2sampResult(statistic=0.07327168078639335, pvalue=1.7671996893936462e-36)
同样采用拟合值与原数据集比较,pvalue小于0.05,认为该数据不服从卡方分布。拟合数据和数据集的对比图方法同上,此处从略。
总结
对于数据集的抽样分布类型,可以使用scipy.stats包中的相应函数进行判断。其中,正态分布可以使用kstest,normaltest等函数;对于t分布和卡方分布,可以先对数据进行相应分布的拟合,然后用ks_2samp函数对拟合的数据同原始数据比较,获得两个数据是否服从相同的分布。
欢迎扫描二维码进行关注

Python验证数据的抽样分布类型的更多相关文章
- Python的数据的基本类型
基本数据类型 int整数 str 字符串 一般不存放大量的数据 bool 布尔值,用来判断. True,False list 列表.存放大量数据,[]表示,里面可以放各种数据类型 ...
- 使用 Python 验证数据集中的体温是否符合正态分布
数据集地址:http://jse.amstat.org/datasets/normtemp.dat.txt 数据集描述:总共只有三列:体温.性别.心率 #代码 from scipy import st ...
- python 可变、不可变类型、深拷贝、浅拷贝理解
简介 python中数据分为可变类型,不可变类型.不同的数据类型影响着不同情况下的深浅拷贝. 下面则将简要介绍一下 可变类型 当某个数据的值发生改变时,它对应的内存地址不发生改变,常见的有列表.字典. ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- Python——可变和不可变类型数据
什么是不可变类型? 存储空间保存的数据不允许被修改,这种数据就是不可变类型. 常见的不可变类型有: 数字类型 int, bool, float, complex, long(2.x) 字符串 str ...
- python基础知识五 各类型数据方法补充,转换,分类,编码+坑中菜
3.9各类型数据方法补充,转换,分类,编码,坑中菜 3.9.1数据类型方法补充 1.str:不可变 补充方法 s1.capitalize():首字母大写 s1 = "alex" s ...
- python和数据科学(Anaconda)
Python拥有着极其丰富且稳定的数据科学工具环境.遗憾的是,对不了解的人来说这个环境犹如丛林一般(cue snake joke).在这篇文章中,我会一步一步指导你怎么进入这个PyData丛林. 你可 ...
- Python之数据序列化(json、pickle、shelve)
本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...
- 数据挖掘(二)用python实现数据探索:汇总统计和可视化
今天我们来讲一讲有关数据探索的问题.其实这个概念还蛮容易理解的,就是我们刚拿到数据之后对数据进行的一个探索的过程,旨在了解数据的属性与分布,发现数据一些明显的规律,这样的话一方面有助于我们进行数据预处 ...
随机推荐
- IO之复制文件的四种方式
1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是 ...
- Mysql索引查询失效的情况
首先,复习一下索引的创建: 普通的索引的创建: CREATE INDEX (自定义)索引名 ON 数据表(字段); 复合索引的创建: CREATE INDEX (自定义)索引名 ON 数据 ...
- 发布mybatis-generator-core 1.3.5的中文注释版
源码剖析介绍:基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析 目前,我把该项目,发布到了Maven中央仓库中,可直接使用: 使用方式 在项目.pom中,添加以下部 ...
- unix进程通信方式总结(中)(转)
在上一篇博客http://blog.csdn.net/caoyan_12727/article/details/52049417已经总结了<<uinx环境高级编程>>进程通信前 ...
- Ubuntu开放指定端口
一般情况下,ubuntu安装好的时候,iptables会被安装上,如果没有的话那就安装上吧 安装 在终端输入 sudo apt-get install iptables 添加规则 在终端输入 ipta ...
- Swift小知识点总结
1>判断输入字符串位数: if phoneTextField.text?.lengthOfBytes(using: .utf8) != 11 { self.showHint(hint: &quo ...
- 【JVM学习笔记】异常表的重要作用以及locals属性的含义
有如下代码 public class Test { public void work() { try { InputStream is = new FileInputStream("test ...
- 20190603 - CentOS 7 提示 Failed to load SELinux policy. Freezing 导致卡住不启动的解决办法
现象 最近 Windows 和两台 Mac 混用,将 Windows VirtualBox 中安装的 CentOS 7 拷贝到 Mac 上. 启动 CentOS 7 时,图形界面进度卡在最后,按 Es ...
- BUGKU (Mountain climbing)
UPX壳,手脱后打不开,可能是在windows10脱壳的缘故吧.放在XP虚拟机上手脱可能会好,但是提示缺少dll.无奈,智能用工具了. 用的这个,感觉蛮好用的. 先打开程序.随便输入一个数,提示err ...
- GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调
GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...