假如要对一份统计数据进行分析,一般其来源来自于社会调研/普查,所以数据不是总体而是一定程度的抽样。对于抽样数据的分析,就可以结合上篇统计量及其抽样分布的内容,判断数据符合哪种分布。使用已知分布特性,可以完成对总体的统计分析。

本文使用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包中的相应函数进行判断。其中,正态分布可以使用kstestnormaltest等函数;对于t分布和卡方分布,可以先对数据进行相应分布的拟合,然后用ks_2samp函数对拟合的数据同原始数据比较,获得两个数据是否服从相同的分布。

欢迎扫描二维码进行关注

Python验证数据的抽样分布类型的更多相关文章

  1. Python的数据的基本类型

    基本数据类型 int整数 str 字符串   一般不存放大量的数据 bool  布尔值,用来判断. True,False    list  列表.存放大量数据,[]表示,里面可以放各种数据类型     ...

  2. 使用 Python 验证数据集中的体温是否符合正态分布

    数据集地址:http://jse.amstat.org/datasets/normtemp.dat.txt 数据集描述:总共只有三列:体温.性别.心率 #代码 from scipy import st ...

  3. python 可变、不可变类型、深拷贝、浅拷贝理解

    简介 python中数据分为可变类型,不可变类型.不同的数据类型影响着不同情况下的深浅拷贝. 下面则将简要介绍一下 可变类型 当某个数据的值发生改变时,它对应的内存地址不发生改变,常见的有列表.字典. ...

  4. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  5. Python——可变和不可变类型数据

    什么是不可变类型? 存储空间保存的数据不允许被修改,这种数据就是不可变类型. 常见的不可变类型有: 数字类型 int, bool, float, complex, long(2.x) 字符串 str ...

  6. python基础知识五 各类型数据方法补充,转换,分类,编码+坑中菜

    3.9各类型数据方法补充,转换,分类,编码,坑中菜 3.9.1数据类型方法补充 1.str:不可变 补充方法 s1.capitalize():首字母大写 s1 = "alex" s ...

  7. python和数据科学(Anaconda)

    Python拥有着极其丰富且稳定的数据科学工具环境.遗憾的是,对不了解的人来说这个环境犹如丛林一般(cue snake joke).在这篇文章中,我会一步一步指导你怎么进入这个PyData丛林. 你可 ...

  8. Python之数据序列化(json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  9. 数据挖掘(二)用python实现数据探索:汇总统计和可视化

    今天我们来讲一讲有关数据探索的问题.其实这个概念还蛮容易理解的,就是我们刚拿到数据之后对数据进行的一个探索的过程,旨在了解数据的属性与分布,发现数据一些明显的规律,这样的话一方面有助于我们进行数据预处 ...

随机推荐

  1. Leetcode题目236.二叉树的最近公共祖先(中等)

    题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先 ...

  2. laravel 链式组合查询数据

    laravel 链式组合查询数据 一.总结 一句话总结: - 就是链式操作的基本操作,因为返回的都是一直可以进行链式操作的对象,所以我们接收返回的对象即可 - $result = DB::table( ...

  3. POJ3009-Curling 2.0(WA)

    POJ3009-Curling 2.0 题意: 要求把一个冰壶从起点“2”用最少的步数移动到终点“3” 其中0为移动区域,1为石头区域,冰壶一旦想着某个方向运动就不会停止,也不会改变方向(想想冰壶在冰 ...

  4. HTTP中GET请求与POST请求的区别

    GET和POST是HTTP请求的两种基本方法.最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数.但这只是表象,或者说只是现象,并不是核心.本文将细细谈谈对它们的 ...

  5. easyUI之Dialog(对话框窗口)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  6. Swift开源parser

    https://www.prowidesoftware.com/products/core https://github.com/prowide/prowide-core-examples/blob/ ...

  7. SQL中group by后面的having中不能使用别名

    如下图中,SQL中需要对group by的结果使用having进行过滤,不能使用select中定义的别名,需要使用查询字段的原始名.否则会报错,列明未定义. 下图未错误演示: 修改后,正确的SQL语句 ...

  8. 8. find

    find使用 find命令的主要作用是对树形目录层次结构进行彻底检查. find命令的一般格式: find pathname -expressions     find常用表达式 在当前文件夹中找出名 ...

  9. 【Linux】配置SSH免密登录

    环境说明 假设我们有三台机器分别为bigdata111,bigdata112,bigdata113,三台机器均为centos 7系统. 配置SSH免密登录 (1)利用Xshell的发送键输入到所有会话 ...

  10. vue自定义过滤器的创建与使用

    原文地址 过滤器:生活中有很多例子,净水器 空气净化器 .过滤器的作用:实现数据的筛选.过滤.格式化. vue1.*版本是有内置的过滤器,但是在vue2.*所有的版本都已经没有自带的过滤器了. 1.过 ...