1,一般随机变量
描述随机变量分布律/分布情况的方法:离散型随机变量使用概率质量函数(PMF),如二项分布、泊松分布;连续性随机变量使用概率密度函数(PDF),如均匀分布、正态分布、指数分布。
对于连续性随机变量,我们通常还会使用累计分布函数(CDF)来描述其性质,CDF是PDF的积分形式。
2,常见分布
2.1离散型分布
①二项分布
二项分布是只有两种结果(成功/失败)的单次试验重复多次后成功的概率。
满足的条件:1,试验次数是固定的;2,每次试验都是独立的;3,对于每次试验成功的概率都是一样的。
在n次实验中,单次试验成功率为p,失败率为1-p,则出现成功次数的概率为:
②泊松分布
泊松分布是用来描述泊松试验的一种分布,其满足的条件是:1,所考察的事件在任意两个长度相等的区间里发生一次的机会均等;2,所考察的事件在任何一个区间里发生与否和在其他区间里发生与否是独立的,没有相互影响。
泊松分布的条件:1,实验次数n趋近于无穷大;2,单次事件发生的概率趋向于0;3,np是一个有限的数值。
③二项分布、泊松分布、正态分布的关系
当n很大,p很小时二项分布可以近似为泊松分布;
当λ很大时,泊松分布可以近似为正态分布;
当n很大,np和n(1-p)都足够大,二项分布可以近似为正态分布。
④其他离散型随机分布:几何分布(考虑独立重复试验,经过k次试验才首次获得成功的概率,每次成功概率p)、负二项分布(考虑独立重复试验,试验一直进行到成功r次的概率,每次成功概率p)、超几何分布(总体为N的总体中进行)
有放回的抽样,其中k个元素属于一组,其余N-k个元素属于另外一组,假定从总体中抽取n次,其中x个第一组的概率。
2.2连续性分布
①均匀分布
②正态分布
③指数分布
④其他连续分布
#代码实现
import numpy
s=numpy.random.binomial(n=10,p=0.5,size=1000)
s=numpy.random.poisson(lam=1,size=1000)
s=numpy.random.uniform(low=0,high=1,size=1000)
s=numpy.random.normal(loc=0,scale=1,size=1000)
s=numpy.random.standard_normal(size=1000)
s=numpy.random.exponential(scale=1,size=1000)
from scipy import stats
stats.uniform.rvs(size=10)
#计算二项分布等PMF
from scipy import stats
x=range(11)
p=stats.binom.pmf(x,n=10,p=0.5)
p=stats.poisson.pmf(x,mu=1)
#均匀分布U(0,1)的PDF
x=numpy.linspace(0,1,100)
p=stats.uniform.pdf(x,loc=0,scale=1)
#正态分布N(0,1)的PDF
x=numpy.linspace(-3,3,1000)
p=stats.norm.pdf(x,loc=0,scale=1)
#指数分布E(1)的PDF
x=numpy.linspace(0,10,1000)
p=stats.expon.pdf(x,loc=0,scale=1)
#正态分布的CDF
x=numpy.linspace(-3,3,1000)
p=stats.norm.cdf(x,loc=0,scale=1)
#二项分布
from scipy import stats
import numpy
import matplotlib.pyplot as plt
import seaborn as sns
x=range(11)
t=stats.binom.rvs(10,0.5,size=10000)
p=stats.binom.pmf(x,10,0.5)
fig,ax=plt.subplots(1,1)
sns.distplot(t,bins=10,hist_kws={'density':True},kde=False,label='Distplot from 1000 samples')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Binomial distribution')
plt.legend(bbox_to_anchor=(1.05,1))
from scipy import stats
import numpy
import matplotlib.pyplot as plt
import seaborn as sns
x=numpy.linspace(0,10,100)
t=stats.expon.rvs(0,1,size=10000)
p=stats.expon.pdf(x,0,1)
fig,ax=plt.subplots(1,1)
sns.distplot(t,bins=100,hist_kws={'density':True},kde=False,label='Distplot from 1000 samples')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Exponential distribution')
plt.legend(bbox_to_anchor=(1,1))
#比较不同参数的指数分布的概率密度函数
x=numpy.linspace(0,10,100)
fig,ax=plt.subplots()
for scale in [0.2,0.5,1,2,5]:
p=stats.expon.pdf(x,scale=scale)
sns.lineplot(x,p,label='lamda='+str(1/scale))
plt.title('Exponential distribution')
plt.legend()
3,假设检验
在总体的分布函数完全位置或只知其形式不知其参数的情况,为了推断总体的某些未知特性,提出某些关于总体的假设,这类问题被称为假设检验。
3.1基本步骤
①陈述研究假设(原假设和备择假设)
我们通常会将原假设描述成变量之间不存在某种差异或关联,备择假设是变量之间存在某种差异或者关联。
②为验证假设收集证据
为统计检验结果的真实可靠,需要根据假设从总体中抽取样本,抽样的数据要具有代表性。
③构建合适的统计测试量进行测试
统计检验量有很多种类,但是所有的统计检验都是基于组内方差和组间方差的比较,如果组间方差足够大,使得不同组之间几乎没有重叠,那么统计量会反映出一个非常小的P值,意味着不同组织间的差异不是由于偶然性导致的。
最常用的统计检验包括:回归检验、比较检验、关联检验三类。
回归检验(x连续,y连续或类别)
简单线性回归、多重线性回归、logistics回归
比较检验(x是类别,y是数值)
关联检验卡方检验(X,Y均是类别性变量的情况)
非参数检验
④决定接受还是拒绝原假设
P=0.05作为临界值(单侧检验)
两类错误:去真和留伪
一类错误:拒绝真的原假设。可以通过显著性水平来控制,当p值=0.05的时候,说明我们拒绝一个真的原假设的可能性是5%,也就是说我们每做20次假设检验就会有一次一类错误的事件发生。
二类错误:接受错误的原假设。通常是由于小样本或高样本方差导致的。二类错误的概率用β表示功效分析
一般来说,这两类错误是无法同时降低的,在降低一类错误的前提下会增加犯二类错误的可能性。在实际案例中如何平衡这两类错误取决于我们更能接受一类错误还是二类错误。
⑤展示结论。
Python代码实战
正态检验
H0:样本总体服从正态分布
H1:样本总体不服从正态分布
import numpy as np
from scipy.stats import shapiro
data_nonnormal=np.random.exponential(size=100)
data_normal=np.random.normal(size=100)
def normal_judge(data):
stat,p=shapiro(data)
if p>0.05:
return 'stat={:.3f},p={:.3f},probably gaussian'.format(stat,p)
else:
return 'stat={:.3f},p={:.3f},probably not gaussian'.format(stat,p)
normal_judge(data_nonnormal)
normal_judge(data_normal)
卡方检验
检验两组类别变量是相关的还是独立的。
H0:两组样本是独立的;
H1:两组样本不是独立的。
from scipy.stats import chi2_contingency
table=[[10,20,30],[6,9,17]]
stat,p,dof,expected=chi2_contingency(table)
print('stat=%.3f,p=%.3f'%(stat,p))
if p>0.05:
print('Probably independent')
else:
print('Probably dependent')
t检验
检验两个独立样本集的均值是否具有显著差异
H0:均值是相等的;
H1:均值不相等。
from scipy.stats import ttest_ind
import numpy as np
data1=np.random.normal(size=10)
data2=np.random.normal(size=10)
stat,p=ttest_ind(data1,data2)
print('stat=%.3f,p=%.3f'%(stat,p))
if p<0.05:
print('probably different')
else:
print('probably the same')
ANOVA
检验两组及以上独立样本集的均值是否具有显著差异。
H0:均值相等。
H1:均值不等。
from scipy.stats import f_oneway
import numpy as np
data1=np.random.normal(size=10)
data2=np.random.normal(size=10)
data3=np.random.normal(size=10)
stat,p=f_oneway(data1,data2,data3)
print('stats=%.3f,p=%.3f'%(stat,p))
if p>0.05:
print('probably the same')
else:
print('probably different')
Mann-Whitney U Test
检验两个样本集的分布是否相同。
H0:两个样本集的分布相同。
H1:两个样本集的分布不同。
from scipy.stats import mannWhitneyu
data1=[0.334,0.345,3.456,34.456]
data2=[3.555,43.444,-0.945,0.455]
stat,p=mannwhitney(data1,data2)
print('stats=%.3f,p=%.3f'%(stat,p))
if p>0.05:
print('probably the same')
else:
print('probably different')