Python基本统计分析

2024-05-15 04:28
文章标签 python 基本 统计分析

本文主要是介绍Python基本统计分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常见的统计分析方法

 

import numpy as np

import scipy.stats as spss

import pandas as pd

 

鸢尾花数据集

 

https://github.com/mwaskom/seaborn-data

 

df = pd.read_csv("iris.csv",index_col="species")

v1 = df.loc["versicolor",:].petal_length.values

v2 = df.loc["virginica",:].petal_length.values

 

1.组间差异的参数检验

数据是否服从正态分布

符合正态分布(p>0.05)

 

# Shapiro-Wilk test

stat, p_value = spss.shapiro(v1)

stat, p_value = spss.shapiro(v2)

 

方差齐性检验

方差齐,即v1和v2的方差没有显著性差异,即p>0.05

 

# 非参数检验,对于数据的分布没有要求

stat, p_value = spss.levene(v1,v2)

# 要求数据服从正态分布

stat, p_value = spss.bartlett(v1,v2)

 

两独立样本的 t 检验

stat, p_value = spss.ttest_ind(v1,v2)

 

非独立样本的 t 检验

配对 Paired Student’s t-test(本例中v1,v2并不是配对样本,这里仅用于演示)

 

stat, p_value = spss.ttest_rel(v1,v2)

one-way ANOVA

检查是否符合正态分布

df.petal_length.groupby(df.index).apply(spss.shapiro)

# species

# setosa (0.971718966960907, 0.27151283621788025)

# versicolor (0.9741330742835999, 0.3379890024662018)

# virginica (0.9673907160758972, 0.1808987259864807)

# Name: sepal_width, dtype: object

 

方差齐性检验

p_value > 0.05方差齐

 

v1 = df.loc["versicolor",:].sepal_width.values

v2 = df.loc["virginica",:].sepal_width.values

v3 = df.loc["setosa",:].sepal_width.values

stat, p_value = spss.bartlett(v1,v2,v3)

 

单因素方差分析

p_value < 0.05三个物种间的sepal_width有差异

 

stat, p_value = spss.f_oneway(v1, v2, v3)

也可以使用statsmodels中的函数,结果一致

 

from statsmodels.formula.api import ols

from statsmodels.stats.anova import anova_lm

df.loc[:,'species'] = df.index

aov_results = anova_lm(ols('sepal_width ~ species', data = df).fit())

aov_results

# df sum_sq mean_sq F PR(>F)

# species 2.0 11.344933 5.672467 49.16004 4.492017e-17

# Residual 147.0 16.962000 0.115388 NaN NaN

 

两两比较找出哪些组之间存在显著差异

3个物种两两之间的sepal_width都有显著性差异

 

from statsmodels.stats.multicomp import pairwise_tukeyhsd

tukey = pairwise_tukeyhsd(df.sepal_width, df.index)

print(tukey)

# Multiple Comparison of Means - Tukey HSD, FWER=0.05     

# ============================================================

# group1 group2 meandiff p-adj lower upper reject

# ------------------------------------------------------------

# setosa versicolor -0.658 0.0 -0.8189 -0.4971 True

# setosa virginica -0.454 0.0 -0.6149 -0.2931 True

# versicolor virginica 0.204 0.0088 0.0431 0.3649 True

# ------------------------------------------------------------

2.组间差异的非参数检验

两组样本

独立样本秩和检验

stat, p_value = spss.ranksums(v1, v2)

非独立样本秩和检验

stat, p_value = spss.wilcoxon(v1, v2)

多组样本

stat, p_value = spss.kruskal(v1, v2, v3)

3.连续型变量之间的相关性

Pearson’s Correlation Coefficient

v1,v2符合正态分布

 

r, p_value = spss.pearsonr(v1,v2)

spearman

v1,v2的分布没有特定的要求

 

r, p_value = spss.spearmanr(v1,v2)

kendalltau

v1,v2的分布没有特定的要求

 

r, p_value = spss.kendalltau(v1,v2)

多个变量之间的相关性

协方差矩阵

df.cov(numeric_only=True)

# sepal_length sepal_width petal_length petal_width

# sepal_length 0.685694 -0.042434 1.274315 0.516271

# sepal_width -0.042434 0.189979 -0.329656 -0.121639

# petal_length 1.274315 -0.329656 3.116278 1.295609

# petal_width 0.516271 -0.121639 1.295609 0.581006

 

相关系数矩阵

df.corr(numeric_only=True)

# sepal_length sepal_width petal_length petal_width

# sepal_length 1.000000 -0.117570 0.871754 0.817941

# sepal_width -0.117570 1.000000 -0.428440 -0.366126

# petal_length 0.871754 -0.428440 1.000000 0.962865

# petal_width 0.817941 -0.366126 0.962865 1.000000

3.分类变量

汽车耗油量数据集https://github.com/mwaskom/seaborn-data

 

mpg = pd.read_csv("mpg.csv")

频数

pd.value_counts(mpg.origin)

# usa 249

# japan 79

# europe 70

# Name: origin, dtype: int64

 

# 百分比

pd.value_counts(mpg.origin,normalize=True)

# usa 0.625628

# japan 0.198492

# europe 0.175879

# Name: origin, dtype: float64

 

列联表

两个以上的变量交叉分类的频数分布表

 

pd.crosstab(mpg.cylinders, mpg.origin)

# origin europe japan usa

# cylinders      

# 3 0 4 0

# 4 63 69 72

# 5 3 0 0

# 6 4 6 74

# 8 0 0 103

 

pd.crosstab(mpg.cylinders, mpg.origin, margins = True)

# origin europe japan usa All

# cylinders        

# 3 0 4 0 4

# 4 63 69 72 204

# 5 3 0 0 3

# 6 4 6 74 84

# 8 0 0 103 103

# All 70 79 249 398

 

每个单元格占总数的比例

pd.crosstab(mpg.cylinders, mpg.origin, normalize = True)

# origin europe japan usa

# cylinders      

# 3 0.000000 0.010050 0.000000

# 4 0.158291 0.173367 0.180905

# 5 0.007538 0.000000 0.000000

# 6 0.010050 0.015075 0.185930

# 8 0.000000 0.000000 0.258794

按行求比例

pd.crosstab(mpg.cylinders, mpg.origin, normalize = 0)

# origin europe japan usa

# cylinders      

# 3 0.000000 1.000000 0.000000

# 4 0.308824 0.338235 0.352941

# 5 1.000000 0.000000 0.000000

# 6 0.047619 0.071429 0.880952

# 8 0.000000 0.000000 1.000000

按列求比例

pd.crosstab(mpg.cylinders, mpg.origin, normalize = 1)

# origin europe japan usa

# cylinders      

# 3 0.000000 0.050633 0.000000

# 4 0.900000 0.873418 0.289157

# 5 0.042857 0.000000 0.000000

# 6 0.057143 0.075949 0.297189

# 8 0.000000 0.000000 0.413655

列联表独立性检验

χ2 独立性检验

在该函数中,参数““correction”用于设置是否进行连续性校正,默认为 True。对于大样本,且频数表中每个单元格的期望频数都比较大(一般要求大于 5),可以不进行连续性校正。

 

tb = pd.crosstab(mpg.cylinders, mpg.origin)

# χ2 值、 P 值、自由度、期望频数表

chi2, p_value, df, expected = spss.chi2_contingency(tb)

p_value

# 9.800693325588298e-35

expected

# array([[ 0.70351759, 0.79396985, 2.50251256],

# [ 35.87939698, 40.49246231, 127.6281407 ],

# [ 0.52763819, 0.59547739, 1.87688442],

# [ 14.77386935, 16.67336683, 52.55276382],

# [ 18.11557789, 20.44472362, 64.43969849]])

 

Fisher 精确概率检验

R语言中fisher.test的故事以及示例

 

Agresti (1990, p. 61f; 2002, p. 91) Fisher's Tea Drinker A British woman claimed to be able to distinguish whether milk or tea was added to the cup first. To test, she was given 8 cups of tea, in four of which milk was added first. The null hypothesis is that there is no association between the true order of pouring and the woman's guess, the alternative that there is a positive association (that the odds ratio is greater than 1).

 

如果观察总例数 n 小于 40,或者频数表里的某个期望频数很小(小于 1),则需要使用 Fisher 精确概率检验

 

spss.fisher_exact这个函数的输入只能是2X2的二维列联表,R中的fisher.test输入可以不是2X2列联表。

 

OR(0,+inf)如果 OR 值大于 1,则说明该因素更容易导致结果事件发生

 

alternative可以选two-sided(默认,OR可能>1,也可能<1), less(OR<1), greater(OR>1)

 

tea_tasting = pd.DataFrame({"Milk":[3,1],"Tea":[1,3]},index=["Milk", "Tea"])

tea_tasting

# Milk Tea

# Milk 3 1

# Tea 1 3

OR, p_value = spss.fisher_exact(tea_tasting,alternative="greater")

OR, p_value

# (9.0, 0.24285714285714283)

# p > 0.05, association could not be established

 

配对列联表的Mcnemar 检验

对每个对象分别用两种方法处理

 

exact:True(样本量小,使用二项分布);False(样本较大,使用 χ2 分布)

correction:在样本量较大,且不一致的结果总数小于 40 时,需要进行连续性校正

from statsmodels.sandbox.stats.runs import mcnemar

tb = np.array([[11, 12],[2, 33]])

stat, p_value = mcnemar(tb, exact = False, correction = True)

p_value

# 0.016156931261181305

 

Reference

https://www.heywhale.com/mw/notebook/61e3d3c7ddda3c0017b4658f

https://www.statsmodels.org/stable/generated/statsmodels.sandbox.stats.runs.mcnemar.html

这篇关于Python基本统计分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/990797

相关文章

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

一文带你搞懂Python中__init__.py到底是什么

《一文带你搞懂Python中__init__.py到底是什么》朋友们,今天我们来聊聊Python里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没... 目录先搞懂 python 模块(module)Python 包(package)是啥?那么 __in

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp