统计分析
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()

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'])
u = 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'])
m = df.value.mean()
# 导入 sciy 库的 stats(统计)模块的 kstest 方法。
ks = kstest(df["value"], 'norm')
# 输出结果中第一个为统计数,第二个为 P 值
from scipy import stats
# 导入 sciy 库的 stats(统计)模块。
f = 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. 已知某学校某班级的数学平均分数大于 80 分才是达标,现在随机抽取 35位同学成绩
2. 给定均值为 80 分(达标),结果显示 statistic=-0.25620953073641706(小于 0)这 说明样本均值小于指定均值 80 了。
3. 注 意 : 这 不 表 示 该 班 的 数 学 平 均 成 绩 低 于 80 分 。 我 们 应 看 pvalue: 0.7993329473714417 的情况。
4. 说明:样本有>0.05 的概率认为数学平均成绩为 80。同理,不能拒绝均值>80 的 假设。
5. 结论:我们接受该班数学成绩是达标的。
1.3 两独立样本T检验
两独立样本 t 检验用于比较两个独立的组的均值是否存在差异。例如,试验数据集里, 有 100 人,包括 50 名女性和 50 名男性;我们想知道女性的数学成绩和男性的数学成绩,是否不受它们各自性别的影响,那么,把男生视为独立样本,女生视为独立样本,它们的数学 成绩又都具有正态分布的情况下,采用两独立样本 T 检验的方式,求证。
import numpy as np
from scipy import stats
np.random.seed(123)
a = np.random.randint(20,25,50)
b = 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)
a = np.random.randint(20,25,50)
b = np.random.randint(20,25,50)
df = pd.DataFrame(np.transpose([a,b]),columns=list('ab'))
df

df.corr()

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

R 语言版本a <- 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)
b <- 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)

2.3 一元回归方程简单版本

我们可以看到 Estimate(参数)所示的截距和斜率。
$y = 25.363-0.148x$ 通过绘图查看关系a <- 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)
b <- 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)


3 抽样方式
3.1重复随机抽样
import random
N = range(100)
m = 20
a= random.sample(N,m)
a

3.2 不重复随机抽样
import numpy as np
N = range(100)
a = np.random.choice(N, size=3, replace=False)
b = 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