欢迎光临散文网 会员登陆 & 注册

统计分析

2022-12-08 12:20 作者:情报工作站  | 我要投稿

1 分布状态

1.1 描述统计

使用Python的Pandas包,将数据转换为dataframe格式,使用df.describe()可以生成描述数据的报表。

import pandas as pd
data = [87,77,92,68,80,78,84,77,81,80,80,77,92,86,
       76,80,81,75,77,72,81,72,84,86,80,68,77,87,
       76,77,78,92,75,80,78]
# 样本数据,35位健康男性在未进食之前的血糖浓度

df = pd.DataFrame(data, columns =['value'])
df.describe()

截图_20221207164256.png

count 计数 mean 平均数 std 标准差 min 最小值 25% 25%分位
50% 50%分位数 75% 75%分位数 max 最大值

1.2 T检验

单样本T检验

适用于某个变量的平均值与已知标准(或理论/假设)平均值进行比较($\mu$)。前提是数据呈现正态分布,需要进行正态性检验。(shapiro-Wilk检验[1])

from scipy import stats
import pandas as pd
# scipy包是一个高级的科学计算库,它和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算

data = [87,77,92,68,80,78,84,77,81,80,80,77,92,86,
       76,80,81,75,77,72,81,72,84,86,80,68,77,87,
       76,77,78,92,75,80,78]
# 样本数据,35位健康男性在未进食之前的血糖浓度

df = pd.DataFrame(data, columns =['value'])
= df['value'].mean()  # 计算均值
std = df['value'].std()  # 计算标准差
stats.kstest(df['value'], 'norm', (u, std))
# .kstest方法:KS检验,参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差
# 结果返回两个值:statistic → D值,pvalue → P值
# p值大于0.05,为正态分布

假设检验的典型问题,包括: (1)均值(m)是否等于理论平均值(μ)? (2)均值(m)是否小于理论平均值(μ)? (3)均值(m)是否大于理论平均值(μ)?
在进行假设检验时,首先需要定义相应的无效假设(H0),定义如下: H0:m = μ H0:m≤ μ H0:m≥ μ 据此,相应的备择假设(H1)如下: H1:m ≠ μ (不同) H1:m> m(大于) H1:m< μ(小于
其中,假设一称为双向检验;假设二、三,称为单向检验

例子

from scipy.stats import kstest
import pandas as pd
import numpy as np

data = [87,77,92,68,80,78,84,77,81,80,80,77,92,86,
       76,80,81,75,77,72,81,72,84,86,80,68,77,87,
       76,77,78,92,75,80,78]
df = pd.DataFrame(data, columns =['value'])
= df.value.mean()

# 导入 sciy 库的 stats(统计)模块的 kstest 方法。
ks = kstest(df["value"], 'norm')
# 输出结果中第一个为统计数,第二个为 P 值
from scipy import stats
# 导入 sciy 库的 stats(统计)模块。
= stats.ttest_1samp(df["value"],80, axis=0)
# 单样本 T 检验,第一个位置是 Mat 列,第二个位置是给定均值
print(m,ks,f) #79.74285714285715 KstestResult(statistic=1.0, pvalue=0.0) Ttest_1sampResult(statistic=-0.25620953073641706, pvalue=0.7993329473714417)

请注意,科学研究应该是 先有研究问题、文献综述(所以知道“已知数值= 80”)、研究设计(假设检验)后,才是进行分析和解释,而不是像我们现在这样,利用试验数据集进行分析之后,才做事后解释的。 分析结果,如下:

  1. 1. 已知某学校某班级的数学平均分数大于 80 分才是达标,现在随机抽取 35位同学成绩

  2. 2. 给定均值为 80 分(达标),结果显示 statistic=-0.25620953073641706(小于 0)这 说明样本均值小于指定均值 80 了。

  3. 3. 注 意 : 这 不 表 示 该 班 的 数 学 平 均 成 绩 低 于 80 分 。 我 们 应 看 pvalue: 0.7993329473714417 的情况。

  4. 4. 说明:样本有>0.05 的概率认为数学平均成绩为 80。同理,不能拒绝均值>80 的 假设。

  5. 5. 结论:我们接受该班数学成绩是达标的。

1.3 两独立样本T检验

两独立样本 t 检验用于比较两个独立的组的均值是否存在差异。例如,试验数据集里, 有 100 人,包括 50 名女性和 50 名男性;我们想知道女性的数学成绩和男性的数学成绩,是否不受它们各自性别的影响,那么,把男生视为独立样本,女生视为独立样本,它们的数学 成绩又都具有正态分布的情况下,采用两独立样本 T 检验的方式,求证。

import numpy as np 
from scipy import stats

np.random.seed(123)
= np.random.randint(20,25,50)
= np.random.randint(20,25,50)
print(np.mean([a,b],axis=1)) #[22.04 22.1 ]
stats.kstest(a,'norm') #KstestResult(statistic=1.0, pvalue=0.0)
stats.kstest(b,'norm')#KstestResult(statistic=1.0, pvalue=0.0)
stats.ttest_ind(a,b)#Ttest_indResult(statistic=-0.21869068439925404, pvalue=0.8273457924006156)

由 statistic=-0.21869068439925404小于 0 可以知道在样本统计上 a 的均值比 b 的小, 事实上a 的均值为 22.04,b 的均值为 22.1。另外 pvalue=0.8273457924006156 远大于 0.1, 由此我们不能否认 a均值与 b 均值存在明显差异,换言之,a 均值与 b 均值没有明显差别。 (再次注意,我们是刻意把 a 与 b视为独立样本,事实上,它们是一个样本里的两个变量,我们为了便于分析,所以这么处理)

2 变量关系

2.1 皮尔森相关系数

皮尔逊(pearson)相关系数要求样本满足正态分布,两个变量之间的皮尔逊相关系数 定义为两个变量之间的协方差和标准差的商,其值介于-1 与 1 之间 。

import pandas as pd 
import numpy as np 
from scipy import stats

np.random.seed(123)
= np.random.randint(20,25,50)
= np.random.randint(20,25,50)
df = pd.DataFrame(np.transpose([a,b]),columns=list('ab'))
df

截图_20221207171051.png

df.corr()

截图_20221207171215.png

2.2 斯皮尔曼等级相关系数

Sperman 秩相关系数是一种非参数统计量,其值与两组相关变量的具体值无关,而仅仅 与其值之间的大小关系有关。皮尔森相关系数主要用于服从正太分布的连续变量,对于不是 正态分布的变量,特别是定序变量,可采用 Sperman 秩相关系数。

df.corr(method='spearman')

截图_20221207171704.png

R 语言版本<- c(24, 24, 23, 22, 20, 24, 23, 21, 23, 22, 21, 22, 24, 20, 21, 24, 22, 21, 21, 23, 24, 21, 20, 20, 23, 21, 23, 23, 23, 21, 21, 22, 23, 23, 23, 23, 20, 21, 23, 21, 24, 23, 21, 22, 23, 24, 23, 21, 20, 20)
<- c(22, 24, 22, 21, 23, 22, 23, 21, 21, 20, 21, 21, 20, 20, 21, 23, 24, 20, 20, 24, 21, 23, 22, 24, 22, 24, 20, 20, 21, 23, 24, 24, 24, 21, 23, 22, 21, 24, 20, 23, 22, 20, 23, 22, 22, 22, 22, 24, 23, 23)
shapiro.test(a)
shapiro.test(b)
cor.test(a,b)

截图_20221207172634.png

2.3 一元回归方程简单版本

截图_20221207173214.png

我们可以看到 Estimate(参数)所示的截距和斜率。
$y = 25.363-0.148x$ 通过绘图查看关系<- c(24, 24, 23, 22, 20, 24, 23, 21, 23, 22, 21, 22, 24, 20, 21, 24, 22, 21, 21, 23, 24, 21, 20, 20, 23, 21, 23, 23, 23, 21, 21, 22, 23, 23, 23, 23, 20, 21, 23, 21, 24, 23, 21, 22, 23, 24, 23, 21, 20, 20)
<- c(22, 24, 22, 21, 23, 22, 23, 21, 21, 20, 21, 21, 20, 20, 21, 23, 24, 20, 20, 24, 21, 23, 22, 24, 22, 24, 20, 20, 21, 23, 24, 24, 24, 21, 23, 22, 21, 24, 20, 23, 22, 20, 23, 22, 22, 22, 22, 24, 23, 23)
shapiro.test(a)
shapiro.test(b)
cor.test(a,b)
lm.reg<-lm(a~b)
summary(lm.reg)
windows <-par(mfrow=c(2,2)) #绘制 2 行 2列的图像框
plot(lm.reg)
par(windows)
#对所得的回归方程中,误差项独立同正态分布的假设,进行检验。
# plot(lm.reg)实际上使用了四次 plot(x, y)

截图_20221207174051.png
截图_20221207174239.png

3 抽样方式

3.1重复随机抽样

import random 
= range(100)
= 20
a= random.sample(N,m)
a

截图_20221207174544.png

3.2 不重复随机抽样

import numpy as np
= range(100)
= np.random.choice(N, size=3, replace=False)
= np.random.choice(N, size=6, replace=False)
c = np.random.choice(N, size=9, replace=False)
# a 抽样序列
# size 抽样数目
# replace 是否重复抽样
print(a,b,c)#[22 21 73] [57 97 88 33  1 10] [41 60 95  0 98 92  9 42 62]

参考资料

顾立平. 数据科学R与Python实践_课程讲义(2021版). 2021.

引用链接

[1] shapiro-Wilk检验: https://blog.csdn.net/qq_42363032/article/details/121204166


统计分析的评论 (共 条)

分享到微博请遵守国家法律