一.统计学简介
听说你已经被
统计学
劝退,被Python唬住……先别着急划走,其实统计学并不难。
简单说一下,大多数情况下的学不会都
不是知识本身难,而是被知识的传播者劝退的
。
比如大佬们授课,虽逻辑严谨、思维缜密,但你只能望其项背,因为大佬们往往无法体会菜鸟的痛苦。再比如一些照本宣科的老师,他们没有深入研究这些知识,无法用通俗的语言帮你解释,只能貌似努力地帮你认真地读完所有PPT……
究其本质而言,这种情况多半是按 “
是什么、有什么用,怎么用
” 的方式在学,而对在大多数人而言,第一步就学懂“
是什么
”,或许难度有点大,因为得从定义出发,了解性质,推导出原理,一套流程下来直接劝退了,反而最关心的
有什么用、怎么用
的问题没有解决。
所以接下来的内容我将用“
MVP(最小可行化产品)
” 的思路来筛选重点内容,帮你厘清哪些内容是不可或缺及必须要学的。然后以 “
有什么用,怎么用,是什么
” 的顺序展开,快速提升当你急需Get某个技能时候的学习效率。
本文至少有2个原则:
说“尽量”是因为有些时候,不得不说些废话才能引起你的注意,比如以上内容…
好,我们正式开始!首先来看第一个问题:
1. 数据的种类
我们都知道,一般数据可以分为两类,即
定性数据(类别型数据)
和
定量数据(数值型数据)
(1). 定性数据,
表示研究对象的类别。很好理解,这里的表示类别用的数字既没有大小之分,也没有先后顺序之分,更不能进行算术四则运算。
定性数据可以分为:
① 定类数据
表现为类别,但不区分顺序,是由定类尺度计量形成的。一般可以从非数值型数据中编码转换而来,数值本身没有意义,只是为了区分类别做出的数值型标识
例如
性别
用1代表男性,用2代表女性;
血型
用1,2,3,4来表示A、B、AB及O四种;
② 定序数据
表现为类别,但有顺序,是由定序尺度计量形成的。运算符也没有意义,
例如
受教育程度
用 文盲 = 1,半文盲 = 2,小学 = 3,初中 =4,高中 = 5,大专 = 6,本科 = 7,(研究生)硕士 = 8,(研究生)博士 = 9表示。
(2). 定量数据,
表示的是研究对象的数量特征,如人群中人的身高、体重等。
定量数据可以分为以下几种:
① 定距数据
表现为数值,可进行加、减运算,是由定距尺度计量形成的。定距数据的特征是没有绝对的零点,例如温度,不能说10摄氏度的一倍是20摄氏度。因此乘、除法对于定距数据来说也是没有意义的。
② 定比数据
表现为数值,可进行加、减、乘、除运算,是由定比尺度计量形成的。定比数据存在绝对的零点。例如价格,100元的2倍就是200元。
扫码免费获取本文完整版代码文档
2. 什么是统计学
先看一个例子,这里有一组数据
2,23,4,17,12,12,13,16
,请思考你要怎么描述它?
你可能会说他们的平均数是12.375,中位数是12.5,最大值是23,最小值是2,等等。
没错,这里其实你已经在用平均数、中位数、最大值、最小值的来描述这组数据。
那么用几个数来描述一堆数就是统计学的基本概念:统计学是一门将
数据汇总为统计量或图表的学问
。
Tips:通俗来说就是,数据太多记不住且不好描述,需要简化为更少的数字或图表,于是有了统计学和统计图表
知道了统计学的定义再接着看:
3. 统计学的知识体系是什么样的?
通常我们把统计学分为两大方向,通过计算出来的统计量来概括已有数据叫做
描述统计学
,通过样本获取总体特征的叫做
推断统计学
Tips:“算”出来的统计量,比如
中位数、平均值、众数
这些;“猜”出来的叫推断统计学,比如通过样本数据来推断总体的数字特征。
下面这张图展示了统计学两大分支:描述统计与推断统计。其中推断统计又分两大学派,频率学派与贝叶斯学派。这些内容大家先知道就行,后面再展开。
如果您的统计学学得很不错,想找几道题练练手,可以扫码CDA认证小程序,开始测试。
二. 描述性统计
上一篇介绍了数据的分类、统计学是什么、以及统计学知识的大分类,本篇我们重点学习描述性统计学。
我们描述一组数据的时候,通常分三个方面描述:集中趋势、离散趋势、分布形状。通俗来说,集中趋势是描述数据
集中在什么位置
,离散趋势描述的是数据
分散的程度
,分布形状描述的是数据
形状
。
首先,来看
描述数据的集中趋势
,使用的三个常见的统计量:
平均数
算术平均数
算术平均数是n个数求和后除以n得到的结果。广泛应用于各个领域,用于描述和分析数据的
平均水平和集中趋势
Excel求算术平均数的函数
=AVERAGE(A1:A8)
PS:聪明的你肯定知道把上面8个数据
2,23,4,17,12,12,13,16
,用左手复制到你Excel中的A1:A8单元格(记得竖着放!)
用Python求算术平均数
## 使用 numpy 库里的 mean 函数 import numpy as np data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(np.mean(data))# 12.375
几何平均数
几何平均数就是n个数乘积的n次方根。在
金融财务、投资和银行业
的问题中,几何平均数的应用尤为常见。当你任何时候想确定
过去几个连续时期的平均变化率
时,都能应用几何平均数。其他通常的应用包括物种总体、农作物产量、污染水平以及出生率和死亡率的变化。(在
第8节案例8.1
中会举例说明)。公式如下:
Excel求几何平均数的函数
=GEOMEAN(A1:A8)
用Python求几何平均数
# 使用 scipy 库里的 gmean 函数求几何平均数 from scipy import
stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.gmean(data))# 9.918855683110795
n个数的倒数的算术平均数的倒数
Excel求调和平均数的函数
=HARMEAN(A1:A8)
Python求调和平均数
# 使用 scipy 库里的 hmean 函数求调和平均数 from scipy import stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.hmean(data))# 6.906127821278071
还没看晕吧?我们小结一下,
算数平均值 ≥ 几何平均值 ≥ 调和平均值
数值类数据的均值一般用
算数平均值
,比例型数据的均值一般用
几何平均值
,平均速度一般用
调和平均数
中位数
中位数是一组按大小顺序排列在一起的数据中位于中间位置的数。
Excel求中位数的函数
=MEDIAN(A1:A8)
Python求中位数
# 使用 numpy 库里的 median 函数求中位数 import numpy as np data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(np.median(data))# 12.5
众数
众数是一组数据中出现次数最多的变量值。
Excel求众数的函数
=MODE(A1:A8)
Python求众数
# 使用 scipy 库里的 mode 函数求众数 from scipy import stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.mode(data))# ModeResult(mode=array([12]), count=array([2]))
以上便是描述数据集中趋势的几个统计量,接下来我们来看描述数据离散趋势的统计量:
分位数
四分位数用3个分位数,将数据等分成4个部分。这3个四分位数,分别位于这组数据排序后的25%、50%和75%的位置上。另外,75%分位数与25%分位数的差叫做四分位距。
Excel求分位数的函数
=QUARTILE(A1:A8,1)
,括号里面的参数:0代表最小值,1代表25%分位数,2代表50%分位数,3代表75%分位数,4代表最大值,
Python求该组数据的下四分位数与上四分位数
from scipy import stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.scoreatpercentile(data,25 )) #25分位数 print(sts.scoreatpercentile(data,75 )) #75分位数 10.0 16.25
补充一点,关于描述性统计部分的图表可视化,本系列教程不做展开,唯一值得一提的是
箱线图
,不论是描述数据、还是判断异常都是你应该掌握的数据分析利器(在
第8节案例8.2
中会详细举例说明)这里先简单举例如下
用四分位数绘制的箱线图
import seaborn as sns data = [2,23,4,17,12,12,13,16]# 使用sns.boxplot()函数绘制箱线图 sns.boxplot(data=data)
箱线图可以很直观地看到:数据的最大值、最小值、以及大部分数据集中在什么区间。
具体来说就是:异常值、上边缘
Q3+1.5(Q3-Q1)
、上四分位数
Q3
、中位数
Q2
下四分位数
Q1
、下边缘
Q1-1.5(Q3-Q1)
极差又称范围误差或全距,是指一组数据中最大值与最小值的差
Excel求极差的函数
=MAX(A1:A8) - MIN(A1:A8)
Python 求极差
import numpy as np data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(np.ptp(data))# 21
四分位距是上四分位数与下四分位数之差,一般用
表示
Excel求分位数的函数
=QUARTILE(A1:A8,3)-QUARTILE(A1:A8,1)
Python 求四分位距
from scipy import stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.scoreatpercentile(data,75 )-sts.scoreatpercentile(data,25 ))# 6.25
方差
方差是一组数据中的各数据值与该组数据算术平均数之差的平方的算术平均数。
Excel求方差的函数
=VAR(A1:A8)
Python求方差
from scipy import stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.tvar(data,ddof = 1 ))# ddof=1时,分母为n-1;ddof=0时,分母为n #46.55357142857143
标准差
标准差为方差的开方。总体标准差常用σ表示,样本标准差常用S表示。Excel求方差的函数
=STDEV(A1:A8)
Python求标准差:
from scipy import stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.tstd(data,ddof = 1 ))# ddof=1时,分母为n-1;ddof=0时,分母为n # 6.823017765517794
变异系数
对不同变量或不同数组的离散程度进行比较时,如果它们的平均水平和计量单位都相同,才能利用上述指标进行分析,否则需利用变异系数来比较它们的离散程度。
变异系数又称为离散系数,是一组数据中的极差、四分位差或标准差等离散指标与算术平均数的比率。
Excel求变异系数的函数
=STDEV(A1:A8)/AVERAGE(A1:A8)
Python求标准差变异系数:
from scipy import stats as sts data = [2,23,4,17,12,12,13,16]print (sts.tstd(data)/sts.tmean(data))# 0.5513549709509329
看完了描述数据离散程度的几个统计量,我们接着看描述数据分布形状的偏度和峰度:
偏度
偏度系数是对分布偏斜程度的测度,通常用SK表示。偏度衡量随机变量概率分布的不对称性,是相对于平均值不对称程度的度量。
当偏度系数为正值时,表示正偏离差数值较大,可以判断为正偏态或右偏态;反之,当偏度系数为负值时,表示负偏离差数值较大,可以判断为负偏态或左偏态。偏度系数的绝对值越大,表示偏斜的程度就越大。
Excel求偏度的函数
=SKEW(A1:A8)
Python如何求偏度:
from scipy import stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.skew(data,bias=False )) # bias=False 代表计算的是总体偏度,bias=True 代表计算的是样本偏度 # -0.21470003988916822
峰度
峰度描述的是分布集中趋势高峰的形态,通常与标准正态分布相比较。在归化到同一方差时,若分布的形状比标准正态分布更“瘦”、更“高”,则称为尖峰分布;若比标准正态分布更“矮”、更“胖”,则称为平峰分布。
峰度系数是对分布峰度的测度,通常用K表示:
由于标准正态分布的峰度系数为0,所以当峰度系数大于0时为尖峰分布,当峰度系数小于0时为平峰分布。
Excel求峰度的函数
=KURT(A1:A8)
Python如何求峰度:
from scipy import stats as sts data = [2 ,23 ,4 ,17 ,12 ,12 ,13 ,16 ] print(sts.kurtosis(data,bias=False )) # bias=False 代表计算的是总体峰度,bias=True 代表计算的是样本峰度 # -0.17282884047242897
四. 区间估计
还以为你被上节课的内容唬住了~终于等到你,还好没放弃!
本节我们将说明两个问题:
总体均值
的区间估计
和
总体比例
的区间估计
。
区间估计经常用于质量控制领域来检测生产过程是否正常运行或者在“控制之中” ,也可以用来监控互联网领域各类数据指标是否在正常区间。
一个总体均值的区间估计
另外补充一个公式,样本量
这个了解就好,大部分情况下是不缺数据的,尽可能选数据量稍大些的数据。
把以上过程编写成Python的自定义函数:
import numpy as npimport scipy.statsfrom scipy import stats as stsdef mean_interval (mean=None, sigma=None,std=None,n=None,confidence_coef=0.95 ) : """ mean:样本均值 sigma: 总体标准差 std: 样本标准差 n: 样本量 confidence_coefficient:置信系数 confidence_level:置信水平 置信度 alpha:显著性水平 功能:构建总体均值的置信区间 """ alpha = 1 - confidence_coef z_score = scipy.stats.norm.isf(alpha / 2 ) # z分布临界值 t_score = scipy.stats.t.isf(alpha / 2 , df = (n-1 ) ) # t分布临界值 if n >= 30 : if sigma != None : me = z_score * sigma / np.sqrt(n) print("大样本,总体 sigma 已知:z_score:" ,z_score) elif sigma == None : me = z_score * std / np.sqrt(n) print("大样本,总体 sigma 未知 z_score" ,z_score) lower_limit = mean - me upper_limit = mean + me if n 30 : if sigma != None : me = z_score * sigma / np.sqrt(n) print("小样本,总体 sigma 已知 z_score * sigma / np.sqrt(n) \n z_score = " ,z_score) elif sigma == None : me = t_score * std / np.sqrt(n) print("小样本,总体 sigma 未知 t_score * std / np.sqrt(n) \n t_score = " ,t_score) print("t_score:" ,t_score) lower_limit = mean - me upper_limit = mean + me return (round(lower_limit, 1 ), round(upper_limit, 1 ))
应用:网站流量UV区间估计:
某网站流量UV数据如下
[52,44,55,44,45,59,50,54,62,46,54,42,60,62,43,42,48,55,57,56]
,我们研究一下该网站的总体流量uv均值:
先把数据放进来
import numpy as np data = np.array([52,44,55,44,45,59,50,54,62,46,54,42,60,62,43,42,48,55,57,56])
计算一下均值为:
x_bar = data.mean() x_bar# 51.5
样本标准差为:
x_std = sts.tstd(data,ddof = 1) # ddof=1时,分母为n-1;ddof=0时,分母为n x_std# 6.840283158189472
mean_interval(mean=x_bar, sigma=None ,std= x_std, n=n, confidence_coef=0.95 )
输出结果:
小样本,总体 sigma 未知 t_score * std / np.sqrt(n) t_score = 2.093024054408263 (48.3, 54.7)
于是我们有95%的把握,该网站的流量uv介于 [48, 55]之间。
值得一提的是,上面这个案例的数据是实际上是公众号
山有木兮水有鱼
的按天统计阅读量……有人可能要说了,你这数据也太惨了,而且举个案例都是小样本。我想说,小样本的原因是这新号一共发了也没几天,至于数量低,你帮忙动动小手转发转发,这数据也就高了~希望下次举例的时候这个能变成大样本,均值怎么着也得个千儿八百的,感谢感谢!
一个总体比例的区间估计
其中样本量
def proportion_interval (p=None, n=None, confidence_coef =0.95 ) : """ p: 样本比例 n: 样本量 confidence_coef: 置信系数 功能:构建总体比例的置信区间 """ alpha = 1 - confidence_coef z_score = scipy.stats.norm.isf(alpha / 2 ) # z分布临界值 me = z_score * np.sqrt((p * (1 - p)) / n) lower_limit = p - me upper_limit = p + me return (round(lower_limit, 3 ), round(upper_limit, 3 ))
五. 假设检验
久经考场的你肯定对于很多概念类题目里问到的
“区别和联系”
不陌生,与之类似,在统计领域要研究的是
数据之间的区别和联系
,也就是
差异性分析
和
相关性分析
。本节我们重点关注数据的
差异性分析
。
我们知道,比较两个数之间的大小,要么前后两者求差,要么求比。差值大于零说明前者大于后者。比值大于1说明分子大于分母。
那么如何比较两组数据的差异性呢?大道至简,其实和上面原理类似
我们先从简单的看起,先比较一组数和一个给定数的差异,即,单个总体的差异性分析:
单个总体的假设检验
常见的单个总体差异性的假设检验分为3个类型:均值、比例、方差
一个总体均值的假设检验 (指定值和样本均值)
顾名思义,就是检验指定值与样本均值的差异,按
是否已知可以分2种情况:
①
已知的情况:
检验
接下来我们用代码举例实现一下你就明白怎么用了:
例5.1 检验一批厂家生产的红糖是否够标重
监督部门称了50包标重500g的红糖,均值是498.35g,少于所标的500g。对于厂家生产的这批红糖平均起来是否够份量,需要统计检验。
分析过程:
由于厂家声称每袋500g,因此原假设为总体均值等于500g(被怀疑对象总是放在零假设)。而且由于样本均值少于500g(这是怀疑的根据),把备择假设设定为总体均值少于500g (上面这种备选假设为单向不等式的检验称为单侧检验,而备选假设为不等号“
”的称为双侧检验,后面会解释)
于是我们有了原假设和备择假设
:
:
引入相关库、读取数据如下
from scipy import statsimport scipy.statsimport numpy as npimport pandas as pdimport statsmodels.stats.weightstats data = [493.01 ,498.83 ,494.16 ,500.39 ,497.63 ,499.72 ,493.41
,498.97 ,501.94 ,503.45 ,497.47 ,494.19 ,500.99 ,495.81 ,499.63 ,494.91 ,498.90 ,502.43 ,491.34 ,497.50 ,505.95 ,496.56 ,501.66 ,492.02 ,497.68 ,493.48 ,505.40 ,499.21 ,505.84 ,499.41 ,505.65 ,500.51 ,489.53 ,496.55 ,492.26 ,498.91 ,496.65 ,496.38 ,497.16 ,498.91 ,490.98 ,499.97 ,501.21 ,502.85 ,494.35 ,502.96 ,506.21 ,497.66 ,504.66 ,492.11 ]
进行z检验:
z, pval = statsmodels.stats.weightstats.ztest(data, value=500,alternative = 'smaller' )# 'two-sided': 样本均值与给定的总体均值不同 # 'larger' : 样本均值小于给定总体均值 # 'smaller' : 样本均值大于给定总体均值 print (z,pval)# -2.6961912076362085 0.0035068696715304876
结论:
选择显著性水平 0.05 的话,
P=0.0035 < 0.05
, 故应该拒绝原假设。具体来说就是该结果倾向于支持平均重量小于500g的备则假设。
②
未知的情况:
检验
例5.2 检验汽车实际排放是否低于其声称的排放标准
汽车厂商声称其发动机排放标准的一个指标平均低于20个单位。在抽查了10台发动机之后,得到下面的排放数据:
17.0 21.7 17.9 22.9 20.7 22.4 17.3 21.8 24.2 25.4
该样本均值为21.13.究竟能否由此认为该指标均值超过20?
分析过程:由于厂家声称指标平均低于20个单位,因此原假设为总体均值等于20个单位(被怀疑对象总是放在零假设)。而且由于样本均值大于20(这是怀疑的根据),把备择假设设定为总体均值大于20个单位
于是我们有了原假设和备择假设
:
:
读取数据如下
data = [17.0 , 21.7 , 17.9 , 22.9 , 20.7 , 22.4 , 17.3 , 21.8
, 24.2 , 25.4 ]
进行t检验如下:
import scipy.stats t, pval = scipy.stats.ttest_1samp(a = data, popmean=20,alternative = 'greater' )# 说明 # a 为给定的样本数据 # popmean 为给定的总体均值 # alternative 定义备择假设。以下选项可用(默认为“two-sided”): # ‘two-sided’:样本均值与给定的总体均值(popmean)不同 # ‘less’:样本均值小于给定总体均值(popmean) # ‘greater’:样本均值大于给定总体均值(popmean) print (t, pval)# ''' # P= 0.004793 < 5%, 拒绝原假设,接受备择假设样本 # '''
结论:
选择显著性水平 0.01 的话,
P=0.1243 > 0.05
, 故无法拒绝原假设。具体来说就是该结果无法支持指标均值超过20的备则假设。
一个总体比例的假设检验(指定比例和样本比例)
例5.3 检验高尔夫球场女性球员比例是否因促销活动而升高
某高尔夫球场去年打球🏌🏻的人当中有20%是女性,为了增加女性球员的比例,该球场推出了一项促销活动来吸引更多的女性参加高尔夫运动,在活动实施了1个月后,球场的研究者想通过统计分析研究确定高尔夫球场的女性球员比例是否上升,收集到了400个随机样本,其中有100是女性
分析过程:由于研究的是女性球员所占的比例是否上升,因此选择上侧检验比较合适,备择假设是比例大于20%
:
:
方法1:用statsmodels.stats.proportion里面的proportions_ztest函数计算(推荐)
import numpy as npfrom statsmodels.stats.proportion import proportions_ztest count = 100 nobs = 400 p_0 = 0.2 p_bar = count/nobs p_0 = 0.2 n = 400 # 执行单一样本比例检验 statsmodels.stats.proportion.proportions_ztest z_statistic, p_value = proportions_ztest(count, nobs, value = p_0,alternative='larger' ,prop_var = value)# 注:statsmodels.stats.proportion.proportions_ztest 的函数有几个问题:讲在第八节之后说明,感兴趣的读者请持续关注 # 打印结果 print("z统计量:" , z_statistic) print("p值:" , p_value)#z统计量:2.4999999999999996 #p值: 0.006209665325776138
方法2 用手动方式计算
count = 100 nobs = 400 p_0 = 0.2 p_bar = count/nobs p_0 = 0.2 n = 400 def calc_z_score (p_bar, p_0, n) : z = (p_bar - p_0) / (p_0 * (1 - p_0) / n)**0.5 return
z z = calc_z_score(p_bar, p_0, n) p = stats.norm.sf(z)# 打印结果 print("z统计量:" , z) print("p值:" , p)# z统计量:2.4999999999999996 # p值: 0.006209665325776138
结论:
选择显著性水平 0.05 的话,
P=0.0062 < 0.05
, 拒绝原假设。具体来说就是该结果支持特定的促销活动能够提升该球场女性运动员比例的备则假设。
一个总体方差的假设检验(指定方差和样本方差)
import numpy as np from scipy import stats def chi2test(sample_var, sample_num,sigma_square,side, alpha=0.05): '' ' 参数: sample_var--样本方差 sample_num--样本容量 sigma_square--H0方差 返回值: pval ' '' chi_square =((sample_num-1)*sample_var)/(sigma_square) p_value = None if side == 'two-sided' : p = stats.chi2(df=sample_num-1).cdf(chi_square) p_value = 2*np.min([p, 1-p]) elif side == 'less' : p_value = stats.chi2(df=sample_num-1).cdf(chi_square) elif side == 'greater' : p_value = stats.chi2(df=sample_num-1).sf(chi_square) return chi_square,p_value
例5.4 检验公交车到站时间的方差是否比规定标准大
某市中心车站为规范化提升市民对于公交车到站时间的满意度,对于公交车的到站时间管理做了规定,标准是到站时间的方差不超过4。为了检验时间的到站时间的方差是否过大,随机抽取了24辆公交车的到站时间组成一个样本,得到的样本方差是
,假设到站时间的总体分布符合正态分布,请分析总体方差是否过大。
分析过程:由于研究的是方差是否过大,因此选择上侧检验比较合适,备择假设是方差大于4
于是我们有了原假设和备择假设
:
:
chi_square,p_value = chi2test(sample_var = 4.9, sample_num = 24, sigma_square = 4,side='greater' )print ("p值:" , p_value)# p值: 0.2092362676676498
结论:
选择显著性水平 0.05 的话,
P=0.2092 > 0.05
, 无法拒绝原假设。具体来说就是该结果不支持方差变大的备则假设。
例5.5 检验某考试中心升级题库后考生分数的方差是否有显著变化
某数据分析师认证考试机构CDA考试中心,历史上的持证人考试分数的方差为
,现在升级了题库,该考试中心希望新型考题的方差保持在原有水平上,为了研究该问题,收集到了30份新考题的考分组成的样本,样本方差是
,在
的显著性水平下进行假设检验。
分析过程:由于目标是希望考试分数的方差保持原有水平,因此选择双侧检验
于是我们有了原假设和备择假设
:
:
p_value = chi2test(sample_var = 162, sample_num = 30, sigma_square = 100,side='two-sided' )print ("p值:" , p_value)# p值: 0.07213100536907469
结论:
选择显著性水平 0.05 的话,
P=0.0721 > 0.05
, 故无法拒绝原假设。具体来说就是不支持方差发生了变化的备则假设。
两个总体的假设检验
常见的两总体差异性的假设检验也分3个类型:均值、比例、方差
两总体均值之差的假设检验(独立样本)
例5.6(数据:drug.txt) 检验某药物在实验组的指标是否低于对照组
为检测某种药物对情绪的影响,对实验组的100名服药者和对照组的150名非服药者进行心理测试,得到相应的某指标。需要检验实验组指标的总体均值
是否大于对照组的指标的总体均值
。这里假定两个总体独立地服从正态分布。相应的假设检验问题为:
分析过程:由于目标是检验实验组指标的总体均值
是否大于对照组的指标的总体均值
,因此选择上侧检验
于是我们有了原假设和备择假设
:
:
data = pd.read_table("./t-data/drug.txt" ,sep = ' ' ) data.sample(5 )
ah
id
4.4
2
6.8
2
9.6
2
4.8
2
13.2
1
a = data[data['id' ]==1 ]['ah' ] b = data[data['id' ]==2 ]['ah' ]''' H0: 实验组的均值等于对照组 H1: 实验组的均值大于对照组 ''' t, pval = scipy.stats.ttest_ind(a,b,alternative = 'greater' ) print(t,pval)# 0.9109168350628888 0.18161186154576608
结论:
选择显著性水平 0.05 的话,
p = 0.1816 > 0.05
,无法拒绝H0,具体来说就是该结果无法支持实验组均值大于对照组的备则假设。
两总体均值之差的假设检验(配对样本)
例5.7(数据: diet.txt) 检验减肥前后的重量是否有显著性差异(是否有减肥效果)
这里有两列50对减肥数据。其中一列数据(变量名before)是减肥前的重量,另一列(变量名after)是减肥后的重量(单位: 公斤),人们希望比较50个人在减肥前和减肥后的重量。
分析过程:这里不能用前面的独立样本均值差的检验,这是因为两个样本并不独立。每一个人减肥后的重量都和自己减肥前的重量有关,但不同人之间却是独立的,所以应该用配对样本检验。同时,由于研究的是减肥前后的重量变化,期望减肥前的重量大于减肥后的重量,所以备择假设是期望减肥前的重量大于减肥后的重量
于是我们有了原假设和备择假设:
:
:
data = pd.read_table("./t-data/diet.txt" ,sep = ' ' ) data.sample(5 )
before
after
58
50
76
71
69
65
68
76
81
75
a = data['before' ] b = data['after' ] stats.ttest_rel(a, b,alternative = 'greater' )# Ttest_relResult(statistic=3.3550474801424173, pvalue=0.000769424325484219)
结论
选择显著性水平 0.05 的话,
p = 0.0007 < 0.05
,故应该拒绝原假设。具体来说就是该结果倾向支持减肥前后的重量之差大于零(即减肥前重量大于减肥后,也就是有减肥效果)的备则假设。
两总体比例之差的假设检验
import numpy as np import scipy.stats as stats def proportion_test(p1, p2, n1, n2, side='two-sided' ): "" " 参数: p1: 样本1的比例 p2: 样本2的比例 n1: 样本1的数量 n2: 样本2的数量 side: 假设检验的方向,可选'two-sided'(双侧检验,默认), 'greater'(右侧检验), 'less'(左侧检验) 返回值: z_value: Z统计量的值 p_value: 对应的p值 " "" p = (p1 * n1 + p2 * n2) / (n1 + n2) se = np.sqrt(p * (1 - p) * (1 / n1 + 1 / n2)) z_value = (p1 - p2) / se if side == 'two-sided' : p_value = 2 * (1 - stats.norm.cdf(np.abs(z_value))) elif side == 'greater' : p_value = 1 - stats.norm.cdf(z_value) elif side == 'less' : p_value = stats.norm.cdf(z_value) else : raise ValueError("Invalid side value. Must be 'two-sided', 'greater', or 'less'." ) return z_value, p_value
例5.8 检验不同保险客户的索赔率是否存在差异
某保险公司抽取了单身与已婚客户的样本,记录了他们在一段数据内的索赔次数,计算了索赔率,现在需要检验两种保险客户的索赔率是否存在差异
分析过程:由于目标比例是否有差异,因此选择比例之差的双侧检验
于是我们有了原假设和备择假设
:
:
p1 = 0.14 p2 = 0.09 n1 = 250 n2 = 300 z_value, p_value = proportion_test(p1, p2, n1, n2, side='two-sided' )# 选择双侧检验 alternative = 'two-sided' print("Z_value:" , z_value) print("p_value:" , p_value)# Z_value: 1.846189280616294 # p_value: 0.0648647268570739
结论
选择显著性水平 0.05 的话,
p = 0.0648 > 0.05
,故应该拒绝原假设。具体来说就是该结果倾向支持两种保险客户的索赔率存在差异的备则假设。
两总体方差之比的假设检验
import numpy as np from scipy import stats def f_test_by_s_square(n1, n2, s1_square,s2_square, side ='two-sided' ): "" " 参数 n1 :样本1的数量 n2 :样本2的数量 s1_square:样本1的方差 s2_square:样本2的方差 # # F_value :F统计量的值 # p_value :对应的p值 " "" F_value = s1_square/s2_square F = stats.f(dfn = n1-1, dfd = n2-1) if side=='two-sided' : print ("two-sided" ) p_value = 2*min(F.cdf(F_value), 1-F.cdf(F_value)) return F_value,p_value elif side=='greater' : print ("greater" ) p_value = 1-F.cdf(F_value) return F_value,p_value
例5.9 检验不同公交公司的校车到达时间的方差是否有差异
某学校的校车合同到期,先需要在A、B两个校车供应公司中选择一个,才有到达时间的方差作为衡量服务质量的标准,较低方差说明服务质量稳定且水平较高,如果方差相等,则会选择价格更低的公司,,如果方差不等,则优先考虑方差更低的公司。现收集到了A公司的26次到达时间组成一个样本,方差68,B公司16次到达时间组成一个样本,方差是30,请检验AB两个公司的到达时间方差。
分析过程:由于目标是希望的方差保持原有水平,因此选择双侧检验。两总体方差之比用F检验,将方差较大的A视为总体1
于是我们有了原假设和备择假设
:
:
f_statistic , p_value= f_test_by_s_square(n1=26 , n2=16 ,s1_square=78 ,s2_square=20 ,side='two-sided' )# 选择双侧检验所以side='two-sided' # 打印检验结果 print("F statistic:" , f_statistic) print("p-value:" , p_value)#two-sided #F statistic: 3.9 #p-value: 0.00834904415829052
结论
选择显著性水平 0.05 的话,
p = 0.0083 < 0.05
,故拒绝原假设。结果倾向支持AB两个公司的到达时间方差存在差异的备则假设。
例5.10 检验修完Python课程的学生是否比修完数据库课程的学生考CDA的成绩方差更大
某高校数据科学专业的学生,修完一门数据库课程的41名学生考CDA的方差
,修完Python课程的31名学生考CDA的方差是
,这些数据是否表明,修完数据库的学生要比修完Python的学生CDA成绩的方差更大?
分析过程:由于目标是希望修完Python的学生CDA成绩的方差更大,因此选择上侧检验。两总体方差之比用F检验,将方差较大的数据库课程的考试成绩视为总体1
于是我们有了原假设和备择假设
:
:
f_statistic , p_value= f_test_by_s_square(n1=41, n2=31,s1_square=120,s2_square=80,side='greater' )# 打印检验结果 # 选择上侧检验所以side='greater' print ("F statistic:" , f_statistic)print ("p-value:" , p_value)
结论
选择显著性水平 0.05 的话,p = 0.1256 > 0.05,故无法原假设。结果无法支持修完数据库的学生要比修完Python的学生CDA成绩的方差更大的备则假设。
关于知识的学习,你会发现有很多相似的逻辑,抓住问题的本质去理解的话就没那么复杂了,比如概念题里面的
区别和联系
延伸到数据分析里的
差异性和相关性
;再比如计算机数据结构里的
树、森林、网络
到机器学习里面的
决策树、随机森林、神经网络
;再比如从
互联网、区块链到元宇宙
,都是想通过技术的手段去刻画客观世界;算法应用里面的图像识别、语音识别,替代人的
眼耳鼻舌身意
中的前二者去感知世界。抓住了问题的本质不仅可以帮助我们理解知识,还可以将一个领域的知识或模型迁移到另一个领域加以创新和应用。
假设检验背后的故事:统计学史上最著名的女士品茶
六. 方差分析
单因素多水平方差分析
例6.1 不同装配方式对生产的过滤系统数量的差异性检验
某城市过滤水系统生产公司,有A、B、C3种方式进行过滤水系统的装配,该公司为了研究三种装配方式生产的过滤系统数量是否有差异,从全体装配工人中抽取了15名工人,然后随机地指派一种装配方式,这样每个装配方式就有5个工人。在指派装配方法和培训工作都完成后,一周内对每名工人的装配过滤系统数量进行统计如下:
方法A
方法B
方法C
58
58
48
64
69
57
55
71
59
66
64
47
67
68
49
请根据数据判断3种装配方式有无差异
分析过程:由于目标是判断3种装配方式有无差异,多样本的检验用方差分析
于是我们有了原假设和备择假设
:均值不全相等
import pandas as pd import numpy as np from scipy import stats# 数据 A = [58,64,55,66,67] B = [58,69,71,64,68] C = [48,57,59,47,49] data = [A, B, C]# 方差的齐性检验 w, p = stats.levene(*data)if p print ('方差齐性假设不成立' ) # 成立之后, 就可以进行单因素方差分析 f_value, p_value = stats.f_oneway(*data)# 输出结果 print ("F_value:" , f_value)print ("p_value:" , p_value) F_value: 9.176470588235295 p_value: 0.0038184120755124806
结论
选择显著性水平 0.05 的话,
p = 0.0038 < 0.05
,故拒绝原假设。支持三种装配方式装配数量均值不全相等的备则假设。
例6.2 不同优惠金额对购买转化率的差异性检验
某公司营销中心为了提升销量,针对某产品设计了3种不同金额的优惠,想测试三种优惠方式对于用户的购买转化率是否有显著影响,先收集到了三种不同方式在6个月内的转化率数据
请根据数据判断3种不同优惠金额的转化率有无差异
优惠A
优惠B
优惠C
0.043
0.05
0.048
0.047
0.048
0.05
0.051
0.045
0.047
0.049
0.055
0.056
0.045
0.048
0.054
0.0469
0.0491
0.0509
分析过程:由于目标是判断3种不同金额的优惠券对于转化率有无差异,多样本的检验用方差分析
于是我们有了原假设和备择假设
:认为这几组之间的购买率不一样
P < 0.05 拒绝原假设,倾向于支持不同优惠金额购买率不一样的备择假设。认为不同优惠金额会对购买率产生影响 P > 0.05 无法拒绝原假设。认为不同优惠金额不会对购买率产生影响
import pandas as pd import numpy as np from scipy import stats A = [0.043 , 0.047 , 0.051 , 0.049 , 0.045 , 0.0469] B = [0.05 , 0.048 , 0.045 , 0.055 , 0.048 , 0.0491] C = [0.048 , 0.05 , 0.047 , 0.056 , 0.054 , 0.0509]
data = [A, B, C]# 方差的齐性检验 w, p = stats.levene(*data)if p print ('方差齐性假设不成立' ) # 成立之后, 就可以进行单因素方差分析 f_value, p_value = stats.f_oneway(*data)# 输出结果 print ("F_value:" , f_value)print ("p_value:" , p_value)# F_value: 2.332956563862427 # p_value: 0.13116820340181937
结论
选择显著性水平 0.05 的话,
p = 0.1311 > 0.05
,故无法拒绝原假设。认为不同优惠金额不会对购买率产生影响
双因素方差分析
1.双因素方差分析(等重复实验)
这里的等重复实验,意思就是针对每个组合做大于等于两次的实验,比如下方例子中表里A1和B1的组合里面有2个数字,即说明做了两次实验,如果是3个数字则说明3次实验,依次类推。
例6.3 不同燃料种类和推进器的火箭射程差异性检验
火箭的射程与燃料的种类和推进器的型号有关,现对四种不同的燃料与三种不同型号的推进器进行试验,每种组合各发射火箭两次,测得火箭的射程如表(以海里计)(设显著性水平为0.05)
燃料
B1
B2
B3
A1
58.2 , 52.6
56.2 , 41.2
65.3 , 60.8
A2
49.1 , 42.8
54.1 , 50.5
51.6 , 48.4
A3
60.1 , 58.3
70.9 , 73.2
39.2 , 40.7
A4
75.8 , 71.5
58.2 , 51.0
48.7 , 41.0
import numpy as np import pandas as pd d = np.array([[58.2, 52.6, 56.2, 41.2, 65.3, 60.8], [49.1, 42.8, 54.1, 50.5, 51.6, 48.4], [60.1, 58.3, 70.9, 73.2, 39.2, 40.7], [75.8, 71.5, 58.2, 51.0, 48.7,41.4] ]) data = pd.DataFrame(d) data.index=pd.Index(['A1' ,'A2' ,'A3' ,'A4' ],name='燃料' ) data.columns=pd.Index(['B1' ,'B1' ,'B2' ,'B2' ,'B3' ,'B3' ],name='推进器' )# pandas宽表转长表 data = data.reset_index().melt(id_vars =['燃料' ]) data = data.rename(columns={'value' :'射程' }) data.sample(5)
燃料
推进器
射程
A2
B3
48.4
A3
B2
73.2
A3
B3
39.2
A4
B1
71.5
A2
B2
54.1
import statsmodels.api as sm from statsmodels.formula.api import ols# 进行双因素方差分析 model = ols('射程~C(燃料) + C(推进器)+C(燃料):C(推进器)' , data =data).fit()# 打印方差分析表 anova_table = sm.stats.anova_lm(model, typ=2) anova_table
sum_sq
df
F
PR(>F)
C(燃料)
261.675
3
4.41739
0.025969
C(推进器)
370.981
2
9.3939
0.00350603
C(燃料):C(推进器)
1768.69
6
14.9288
6.15115e-05
Residual
236.95
12
nan
nan
结论:
对燃料因素来说,其
p = 0.0259 < 0.05
所以拒绝
,认为燃料对射程影响显著;
对推进器因素来说,其
p = 0.0035 < 0.05
,所以拒绝
,认为推进器对射程影响显著;
对燃料和推进器的交互因素来说,其
p = 0.000062< 0.05
,所以拒绝
,认为交互因素其对射程影响显著。
2.双因素方差分析(无重复实验)
在等重复实验中,我们为了检验实验中两个因素的交互作用,针对每对组合至少要做2次以上实验,才能够将交互作用与误差分离开来,在处理实际问题时候,如果我们一直不存在交互作用,或者交互作用对实验指标影响极小,则可以不考虑交互作用,此时每对组合只做一次实验,类似下方例子中的表中数据:
例6.3 不同时间、不同地点颗粒状物含量差异性检验 无重复实验
下面给出了在5个不同地点、不同时间空气中的颗粒状物(单位:mg/m°)含 量的数据记录于表中,试在显著性水平
下检验不同时间、不同地点颗粒状物含量有无显著差异?(假设两者没有交互作用〉
因素B -地点
因素A - 时间
1995年10月
76
67
81
56
51
1996年01月
82
69
96
59
70
1996年05月
68
59
67
54
42
1996年08月
63
56
64
58
37
import numpy as np import pandas as pd d = np.array([ [76,67,81,56,51], [82,69,96,59,70], [68,59,67,54,42], [63,56,64,58,37]]) data = pd.DataFrame(d) data.index=pd.Index(['1995年10月' ,'1996年01月' ,'1996年05月' ,'1996年08月' ],name='时间' ) data.columns=pd.Index(['B1' ,'B2' ,'B3' ,'B4' ,'B5' ],name='地点' )# pandas宽表转长表 data = data.reset_index().melt(id_vars =['时间' ]) data = data.rename(columns={'value' :'颗粒状物含量' }) data.sample(5)
随机查看5条转化后的数据:
时间
地点
颗粒状物含量
1996年05月
B4
54
1995年10月
B4
56
1996年05月
B3
67
1996年01月
B2
69
1996年01月
B3
96
import statsmodels.api as sm from statsmodels.formula.api import ols# 进行双因素方差分析 model = ols('颗粒状物含量~C(时间) + C(地点)' , data =data).fit()# 打印方差分析表 anova_table = sm.stats.anova_lm(model, typ=2) anova_table
sum_sq
df
F
PR(>F)
C(时间)
1182.95
3
10.7224
0.00103293
C(地点)
1947.5
4
13.2393
0.000234184
Residual
441.3
12
nan
nan
结论:
对时间因素来说,其
p = 0.001033 < 0.05
所以拒绝
,认为时间对颗粒状物含量影响显著;
对地点因素来说,其
p = 0.000234 < 0.05
,所以拒绝
,认为地点对颗粒状物含量影响显著;
致敬:数理统计的大半江山的创造者——费希尔
下期将为大家带来《统计学极简入门》之相关分析
七. 相关性分析
前面的假设检验、方差分析基本上都是围绕差异性分析,不论是单个总体还是两个总体及以上,总之都是属于研究“区别”,从本节开始,我们关注“联系”,变量之间的关系分为
函数关系和相关关系。
本节这里重点探讨的是不同类型变量之间的相关性,千万记住一点相关性不代表因果性。除表中列出的常用方法外,还有Tetrachoric、
相关系数等。
变量类型
变量类型
相关系数计算方法
示例
连续型变量
连续型变量
Pearson(正态)/Spearman(非正态)
商品曝光量和购买转化率
二分类变量(无序)
连续型变量
Point-biserial
性别和疾病指数
无序分类变量
连续型变量
方差分析
不同教育水平的考试成绩
有序分类变量
连续型变量
连续指标离散化后当做有序分类
商品评分与购买转化率
二分类变量
二分类变量
数学公式:
检验 联合 Cramer's V
性别和是否吸烟
二分类变量(有序)
连续型变量
Biserial
乐器练习时间与考级是否通过
无序分类变量
无序分类变量
数学公式:
检验 / Fisher检验
手机品牌和年龄段
有序分类变量
无序分类变量
数学公式:
检验
满意度和手机品牌
有序分类变量
有序分类变量
Spearman /Kendall Tau相关系数
用户等级和活跃程度等级
连续型变量 vs 连续型变量 : Pearson / Spearmanr
Pearson
Pearson相关系数度量了两个连续变量之间的线性相关程度;
import random import numpy as np import pandas as pd np.random.seed(10) df = pd.DataFrame({'商品曝光量' :[1233,1333,1330,1323,1323,1142,1231,1312,1233,1123], '购买转化率' :[0.033,0.034,0.035,0.033,0.034,0.029,0.032,0.034,0.033,0.031]}) df
pd.Series.corr(df['商品曝光量' ], df['购买转化率' ],method = 'pearson' ) # pearson相关系数 # 0.885789300493948
import scipy.stats as stats# 假设有两个变量X和Y X = df['商品曝光量' ] Y = df['购买转化率' ]# 使用spearmanr函数计算斯皮尔曼相关系数和p值 corr, p_value = stats.pearsonr(X, Y)print ("Pearson相关系数:" , corr)print ("p值:" , p_value)# Pearson相关系数: 0.8857893004939478 # p值: 0.0006471519603654732
Spearman等级相关系数
Spearman等级相关系数可以衡量非线性关系变量间的相关系数,是一种非参数的统计方法,可以用于定序变量或不满足正态分布假设的等间隔数据;
import random import numpy as np import pandas as pd np.random.seed(10) df = pd.DataFrame({'品牌知名度排位' :[9,4,3,6,5,8,1,7,10,2], '售后服务质量评价排位' :[8,2,5,4,7,9,1,6,10,3]}) df
pd.Series.corr(df['品牌知名度排位' ], df['售后服务质量评价排位' ],method = 'spearman' ) # spearman秩相关 # 0.8787878787878788
import scipy.stats as stats# 假设有两个变量X和Y X = df['品牌知名度排位' ] Y = df['售后服务质量评价排位' ]# 使用spearmanr函数计算斯皮尔曼相关系数和p值 corr, p_value = stats.spearmanr(X, Y)print ("斯皮尔曼相关系数:" , corr)print ("p值:" , p_value)# 斯皮尔曼相关系数: 0.8787878787878788 # p值: 0.0008138621117322101
结论
:
p = 0.0008<0.05
,表明两变量之间的正向关系很显著。
二分类变量(自然)vs 连续型变量 :Point-biserial
假设我们想要研究性别对于某种疾病是否存在影响。我们有一个二元变量“性别”(男、女)和一个连续型变量“疾病指数”。我们想要计算性别与疾病指数之间的相关系数,就需要用到Point-biserial相关系数。
import scipy.stats as stats# 创建一个列表来存储数据 gender = [0, 1, 0, 1, 1, 0] disease_index = [3.2, 4.5, 2.8, 4.0, 3.9, 3.1]# 使用pointbiserialr函数计算Point-biserial相关系数和p值 corr, p_value = stats.pointbiserialr(gender, disease_index)print ("Point-biserial相关系数:" , corr)print ("p值:" , p_value)# Point-biserial相关系数: 0.9278305692406299 # p值: 0.007624695507848026
结论
:
p = 0.007<0.05
,表明两变量之间的正向关系很显著。即性别与疾病指数正相关
无序分类变量 vs 连续型变量 :ANOVA
假设我们想要比较不同教育水平的学生在CDA考试成绩上是否存在显著差异。我们有一个无序分类变量“教育水平”(高中、本科、研究生)和一个连续型变量“考试成绩”。
import pandas as pd import statsmodels.api as sm from statsmodels.formula.api import ols# 创建一个DataFrame来存储数据 data = pd.DataFrame({ '教育水平' : ['高中' , '本科' , '本科' , '研究生' , '高中' , '本科' , '研究生' ], '考试成绩' : [80, 90, 85, 95, 75, 88, 92] })# 使用ols函数创建一个线性模型 model = ols('考试成绩 ~ C(教育水平)' , data=data).fit()# 使用anova_lm函数进行方差分析 anova_table = sm.stats.anova_lm(model, typ=2) anova_table
结论
:
p = 0.0102<0.05
,拒绝原假设,表明两变量之间的正向关系很显著。教育水平与考试成绩正相关
有序分类变量 vs 连续型变量
将连续型变量离散化后当做有序分类,然后用 有序分类变量 VS 有序分类变量的方法
二分类变量 vs 二分类变量 :
检验 联合 Cramer's V
一项研究调查了不同性别的成年人对在公众场合吸烟的态度,结果如表所示。那么,性别与对待吸烟的态度之间的相关程度
import numpy as np from scipy.stats import chi2_contingency observed = np.array([[15, 10], [10, 26]]) observed chi2, p, dof, expected = chi2_contingency(observed,correction =False) # correction =False # 卡方值 # P值 # 自由度: # 与原数据数组同维度的对应期望值 chi2, p#(6.3334567901234555, 0.011848116168529757)
结论
:
p = 0.0118<0.05
,拒绝原假设,表明两变量之间的正向关系很显著。
phi = np.sqrt(chi2/n)print ("phi's V:" , phi)# phi's V: 0.3222222222222222
卡方检验时有多种指标可表示效应量,可结合数据类型及交叉表格类型综合选择
第二:如果是3
3,或 4
4表格,建议使用
列联系数
;
第三:如果是n*n(n>4)表格,建议使用
校正列联系数
;
第四:如果是m*n(m不等于n)表格,建议使用
Cramer V指标
;
这里只列出
指标
和
Cramer V指标
的计算,其他计算方式请读者自行研究。
# 计算Cramer's V contingency_table = observed n = contingency_table.sum().sum() phi_corr = np.sqrt(chi2 / (n * min(contingency_table.shape) - 1)) v = phi_corr / np.sqrt(min(contingency_table.shape) - 1)print ("Cramer's V:" , v)# Cramer's V: 0.22878509151645754
二分类变量(有序) 连续型变量:Biserial
import numpy as np from scipy.stats import pearsonr# 生成随机的二元变量 binary_variable = np.random.choice([0, 1], size=100)# 生成随机的连续变量 continuous_variable = np.random.normal(loc=0, scale=1, size=100)# 注:此处的代码未经严格考证,请谨慎使用 def biserial_correlation(binary_variable, continuous_variable): binary_variable_bool = binary_variable.astype(bool) binary_mean = np.mean(binary_variable_bool) binary_std = np.std(binary_variable_bool) binary_variable_norm = (binary_variable_bool - binary_mean) / binary_std corr, _ = pearsonr(binary_variable_norm, continuous_variable) biserial_corr = corr * (np.std(continuous_variable) / binary_std) return biserial_corr# 计算Biserial相关系数 biserial_corr = biserial_correlation(binary_variable, continuous_variable)print ("Biserial相关系数:" , biserial_corr) Biserial相关系数: -0.2061772328681707
无序分类变量 vs 无序分类变量
参考
检验
有序分类变量 vs 无序分类变量
参考
检验
有序分类变量 vs 有序分类变量
Kendall秩相关系数
Kendall秩相关系数也是一种非参数的等级相关度量,类似于Spearman等级相关系数。
import random import numpy as np import pandas as pd np.random.seed(10) df = pd.DataFrame({'品牌知名度排位' :[9,4,3,6,5,8,1,7,10,2], '售后服务质量评价排位' :[8,2,5,4,7,9,1,6,10,3]}) df
pd.Series.corr(df['品牌知名度排位' ], df['售后服务质量评价排位' ],method = 'kendall' ) # Kendall Tau相关系数 # 0.7333333333333333
from scipy.stats import kendalltau# 两个样本数据 x = df['品牌知名度排位' ] y = df['售后服务质量评价排位' ]# 计算Kendall Tau相关系数 correlation, p_value = kendalltau(x, y)print ("Kendall Tau相关系数:" , correlation)print ("p值:" , p_value)# Kendall Tau相关系数: 0.7333333333333333 # p值: 0.002212852733686067
浮生皆纵,恍如一梦,让我们只争朝夕,不负韶华!
如果您想找几道题练练手,看一下自己的统计学掌握情况,可以扫码CDA认证小程序,开始测试。
八. 再看t检验、F检验、
检验
前面在假设检验的部分经学过t检验、F检验、
检验,之所以再看,是想通过纵向对比这几个检验统计量以加深理解:
t检验
针对不同的场景,主要分为单样本T检验、独立样本T检验、配对样本T检验:
单样本的t检验
主要用于分析
一组定量数据
与
指定值
的差异,例如检验食盐的实际称重是否不够标重的份量。
单样本T检验需要满足正态分布的假设,若不满足可采用
单样本Wilcoxon检验
。
例8.1 检验汽车实际排放是否低于其声称的排放标准
汽车厂商声称其发动机排放标准的一个指标平均低于20个单位。在抽查了10台发动机之后,得到下面的排放数据:
17.0 21.7 17.9 22.9 20.7 22.4 17.3 21.8 24.2 25.4
该样本均值为21.13.究竟能否由此认为该指标均值超过20?
分析过程:由于厂家声称指标平均低于20个单位,因此原假设为总体均值等于20个单位(被怀疑对象总是放在零假设)。而且由于样本均值大于20(这是怀疑的根据),把备择假设设定为总体均值大于20个单位
于是我们有了原假设和备择假设
:
:
读取数据如下
data = [17.0 , 21.7 , 17.9 , 22.9 , 20.7 , 22.4 , 17.3 , 21.8 , 24.2 , 25.4 ]
分步骤计算过程如下:
步骤一
:计算样本均值
=(17+21.7+...+25.4)/10=21.13
用Python:
x_bar = np.array(data).mean() x_bar# 21.13
步骤二
:计算样本标准差
用Python计算:
s = np.sqrt(((data-x_bar)**2).sum()/len(data)) s# 2.7481084403640255
步骤三
:计算统计量
,其中
为整体均值20,自由度n-1为9
t = (x_bar - 20)/(s/np.sqrt(len(data)-1)) t# 1.2335757753252794
步骤四
:查表或用软件查询p值与