第十二篇:概率论

概率论的基本概念

排列

def A(m:int,n:int):
    if m >= n > 0:
        result = 1
        for v in range(m,m-n,-1):
            result *= v
        return result
    else:
        return None
print(A(10,3))

组合

def C(m:int,n:int):
    if m >= n:
        result = 1
        factorial = 1
        for v in range(m,m-n,-1):
            result *= v
        for i in range(1,n+1):
            factorial *= i
        result /= factorial
        return result
    else:
        return None
print(C(10,3))

 古典概型

联合概率

def  joint_probability(A_pro,B_pro):
    return A_pro*B_pro

条件概率

全概率公式

贝叶斯公式

概率公式

事件的独立

from sympy import pprint,Eq,simplify,lambdify,S,And,Symbol,plot,diff,Rational,solve
from sympy.stats import P,density,Poisson,Binomial,sample_iter,Hypergeometric
from sympy.abc import p,lamda,k
#sympy使用方便,但计算效率慢一些
#用颜色的求被取出符从超几何分布
A = Hypergeometric('A',4,2,1) #共有4个球,2个有红色,现从4球中取1个。
B = Hypergeometric('B',4,2,1) #共有4个球,2个有白色,现从4球中取1个。
C = Hypergeometric('C',4,2,1) #共有4个球,2个有黑色,现从4球中取1个。
print(P(Eq(A,1)))
print(P(Eq(B,1)))
print(P(Eq(C,1)))

随机变量及其分布

 

from sympy import pprint,Eq,simplify,lambdify,S,And,Symbol,plot,diff,Rational,solve
from sympy.stats import P,density,Poisson,Binomial,sample_iter,Hypergeometric
from sympy.abc import p,lamda,k
#sympy使用方便,但计算效率慢一些
#取出的3只球中的黑球的个数服从超几何分布
A = Hypergeometric('A',5,3,3) #共有5个球,3个黑球,现从5球中任取3个。
print('取出的3只球中的黑球的个数等于3的概率:{}'.format(P(Eq(A,3))))
print(density(A).dict)

from sympy import pprint,Eq,simplify,lambdify,S,And,Symbol,plot,diff,Rational,Mod
from sympy.stats import P,density,Die,Binomial,sample_iter
from sympy.abc import p,lamda,k
#sympy使用方便,但计算效率慢一些
X = Die('X')
print(density(X).dict)
print(density(X<=4).dict)
print('X<=4的概率:{}'.format(P(X<=4)))
print('X取偶的概率:{}'.format(P(Eq(Mod(X,2),0))))

离散型随机变量及其分布规律

Bernoulli分布

from sympy import pprint,Eq,simplify,lambdify,S,collect
from sympy.stats import Coin,density,Binomial,variance,sample_iter,sample,Die,Bernoulli
from sympy.abc import p,x,k
C = Coin('C') #抛硬币
D = Die('D') #抛骰子
C_dis = density(C).dict #概率字典
D_dis = density(D)(x) #转成函数形式
print(C_dis)
print(D_dis)

#Bernoulli分布
X = Bernoulli('X',p,1,0) #随机变量X服从参数为p的Bernoulli分布,1表示成功,0表示失败
P_X = density(X)
print('Bernoulli分布律:') #分段函数里面的True表示其他的意思
pprint(P_X(k),use_unicode=False)
print('成功的概率是:{}'.format(P_X(1)))
print('所有取值的概率字典:{}'.format(P_X.dict))

二项分布

from sympy import pprint,Eq,simplify,lambdify,S,collect,Symbol,Integer
from sympy.stats import Coin,density,Binomial,variance,sample_iter,sample,Die,Bernoulli
from sympy.abc import p
k = Symbol('k',positive=True,integer=True,real=True)
X = Binomial('X',6,p,1,0) #随机变量X服从参数为(6,p)的二项分布,1表示成功,0表示失败
P_X = density(X)
print('二项分布律:') #分段函数里面的True表示其他的意思
pprint(P_X(k),use_unicode=False)
print('做6次实验有3次成功的概率是:{}'.format(P_X(3)))
print('所有取值的概率字典:{}'.format(P_X.dict))

from sympy import pprint,Eq,simplify,lambdify,S,collect,Symbol,Integer
from sympy.stats import Coin,density,Binomial,variance,sample_iter,sample,Die,Bernoulli
from sympy.abc import p
k = Symbol('k',positive=True,integer=True,real=True)
X = Binomial('X',15,0.1) #随机变量X服从参数为(6,p)的二项分布,1表示成功,0表示失败
P_X = density(X)
print('取出的15件产品中恰有2件次品的概率是:{}'.format(P_X(2)))
print('取出的15件产品中至少有2件次品的概率是:{}'.format(1-P_X(2)))

from sympy import pprint,Eq,simplify,lambdify,S,collect,Symbol,Integer,plot,diff,Rational
from sympy.stats import Coin,density,Binomial,variance,sample_iter,sample,Die,Bernoulli
from sympy.abc import p
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
# 设置中文显示
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
k = Symbol('k',positive=True,integer=True,real=True)
X = Binomial('X',300,0.44) #随机变量X服从参数为(6,p)的二项分布,1表示成功,0表示失败
P_X = density(X)
x = np.array([i for i in range(301)])
y = np.array([P_X.dict[i] for i in range(301)])
plt.plot(x,y,'.b')
plt.title('二项分布的分布律图')
plt.show()
print('300次射击最可能命中{}次,其相应的概率是:{}'.format(int((300+1)*0.44),P_X(int((300+1)*0.44))))

泊松分布

 

from sympy import pprint,Eq,simplify,lambdify,S,collect,Symbol,plot,diff,Rational,solve
from sympy.stats import Coin,density,Poisson,Binomial,sample_iter,sample,Die,Bernoulli
from sympy.abc import p,lamda
# k = Symbol('k',positive=True,integer=True,real=True)
# X = Poisson('X',lamda) #随机变量X服从参数为lamda的泊松分布
# P_X = density(X)
# print('泊松分布的概率函数:')
# pprint(P_X(k),use_unicode=False)

#sympy使用方便,但计算效率慢一些
X = Poisson('X',lamda)
P_X = density(X)
lmd = solve(Eq(P_X(1),P_X(2)))
for e in lmd:
    if e > 0:
        print('lamda = {}'.format(e))
        print('X = 4 的概率是:{}'.format(density(Poisson('x',e))(4).evalf()))

#用scipy计算效率高一些
from scipy.stats import poisson
ps = poisson(2) #传入lamda参数
print('X = 4 的概率是:{}'.format(ps.pmf(4)))

from scipy.stats import poisson,binom
bn = binom(600,0.012)
print('用二项分布计算的结果:{}'.format(1-bn.pmf(0)-bn.pmf(1)-bn.pmf(2)))

ps = poisson(600*0.012) #传入lamda参数
print('用泊松分布近似计算的结果:{}'.format(1-ps.pmf(0)-ps.pmf(1)-ps.pmf(2)))

from sympy.stats import P,density,Poisson,Binomial,sample_iter,Probability,Die,Bernoulli
from sympy.abc import p,lamda
#sympy使用方便,但计算效率慢一些
X = Binomial('X',2500,0.001)
print('用二项分布计算:')
print(round(1-P(25>=2*X),6))
print(round(P(25<=2*X),6))
Y = Poisson('Y',2500*0.001)
Y_pdf = density(Y)
result = 0
for x in range(13):
    result += Y_pdf(x)
print('用泊松分布计算:')
print(round(1 - result,6))

#用scipy计算效率高一些
from scipy.stats import poisson
ps = poisson(2500*0.001) #传入lamda参数
result = 0
for x in range(13):
    result += ps.pmf(x)
print(round(1-result,6))

print('第二题:')
print('用泊松分布计算:')
print(round(P(25-2*X>=10),6))

result = 0
for x in range(8):
    result += Y_pdf(x)
print('用泊松分布计算:')
print(round(result,6))
result = 0
for x in range(8):
    result += ps.pmf(x)
print(round(result,6))

几何分布

from sympy.stats import P,density,Poisson,Binomial,sample_iter,Probability,Die,Geometric
from sympy.abc import p,lamda,k
#sympy使用方便,但计算效率慢一些
X = Geometric('X',0.1)
X_pdf = density(X)
print(X_pdf(k))

#用scipy计算效率高一些
import numpy as np
from scipy.stats import poisson,geom
Y = geom(0.1)
x = np.array([i for i in range(9)])
print(Y.pmf(x))

 超几何分布

from sympy.stats import P,density,Poisson,Binomial,sample_iter,Hypergeometric
from sympy.abc import p,lamda,k
#sympy使用方便,但计算效率慢一些
X = Hypergeometric('X',10,5,3)
X_pdf = density(X)
print(X_pdf.dict)

#用scipy计算效率高一些
import numpy as np
from scipy.stats import poisson,hypergeom
N = 10
M = 5
n = 3
Y = hypergeom(N,M,n)
x = np.array([i for i in range(min(M,n)+1)])
print({key:val for key,val in enumerate(Y.pmf(x))})

连续型随机变量及其分布规律

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,solve,oo,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Binomial,sample_iter,FiniteRV
from sympy.abc import p,lamda,k,r,w,d,c
x = Symbol('x',real=True)
f = Piecewise((c*(4*x-2*x**2),And(0<x,x<2)),(0,True))

print(solve(Eq(integrate(f,(x,0,2)),1),c))
print(integrate(f,(x,1,2)).subs(c,3/8))

from sympy import pprint,Eq,E,simplify,lambdify,S,And,solve,oo,exp,Rational,Mod,integrate
from sympy.stats import P,density,Die,Binomial,sample_iter,FiniteRV
from sympy.abc import p,lamda,k,r,w,d,x
f = k*E**(-3*x)
# 一个数与无穷大的做加减乘除还是等于无穷大。
print(integrate(f,(x,0,+oo)))
print(solve(Eq(integrate(f,(x,0,+oo)),1),k)) # -k*exp(-oo)/3 - (-k*exp(0) = 1;k = 3
#不定积分是要加一个常数C的,并且 -1 <= -exp(-3x) <= 0;0 <= F(x) <= 1,所以C=1
print(integrate(f,x).subs(k,3))

均匀分布

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,solve,oo,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Uniform,sample_iter,FiniteRV,cdf
from sympy.abc import p,lamda,k,r,w
x = Symbol('x',real=True)
a = Symbol("a", negative=True)
b = Symbol("b", positive=True)
X = Uniform('X',a,b)
print('均匀分布的概率密度函数:')
pprint(density(X)(x),use_unicode=False)
print('均匀分布的分布函数:')
pprint(simplify(cdf(X)(x)),use_unicode=False)

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,solve,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Uniform,sample_iter,FiniteRV,cdf
from sympy.abc import p,lamda,k,r,w
x = Symbol('x',real=True)
X = Uniform('X',0,30)
print('均匀分布的概率密度函数:')
pprint(density(X)(x),use_unicode=False)
print('均匀分布的分布函数:')
pprint(cdf(X)(x),use_unicode=False)
print(P(And(X>=25,X<=30))+P(And(X>=10,X<=15)))
print('方法2:')
X_cdf = cdf(X)
print((X_cdf(15)-X_cdf(10))+(X_cdf(30)-X_cdf(25)))
from scipy.stats import poisson,uniform
Y = uniform(0,30)
# x = np.array([i for i in range(min(M,n)+1)])
# print({key:val for key,val in enumerate(Y.pmf(x))})
#Y.pdf():概率密度函数,Y.cdf分布函数
print((Y.cdf(15)-Y.cdf(10))+(Y.cdf(30)-Y.cdf(25)))

指数分布

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,solve,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Exponential,sample_iter,FiniteRV,cdf
from sympy.abc import p,k,r,x
lamda = Symbol('lamda',positive=True)
X = Exponential('X',lamda)
print('指数分布的概率密度函数:')
pprint(density(X)(x),use_unicode=False)
print('指数分布的分布函数:')
pprint(cdf(X)(x),use_unicode=False)

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,solve,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Exponential,sample_iter,FiniteRV,cdf
from sympy.abc import p,k,r,x
lamda = Symbol('lamda',positive=True)
X = Exponential('X',1/10)
print(P(And(X>=10,X<=20)))
print('方法2:')
X_cdf = cdf(X)
print(X_cdf(20)-X_cdf(10))

from scipy.stats import poisson,expon
Y = expon(10)
#Y.pdf():概率密度函数,Y.cdf分布函数
print(Y.cdf(20)-Y.cdf(10))

正态分布

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,solve,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Normal,sample_iter,FiniteRV,cdf
from sympy.abc import p,k,r,x
mu = Symbol("mu")
sigma = Symbol("sigma", positive=True)
X = Normal('X',mu,sigma)
print('正态分布的概率密度函数:')
pprint(density(X)(x),use_unicode=False)
print('正态分布的分布函数:')
pprint(simplify(cdf(X)(x)),use_unicode=False)

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,solve,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Normal,sample_iter,FiniteRV,cdf
from sympy.abc import p,k,r,x
X = Normal('X',0,1)
print('正态分布的概率密度函数:')
pprint(density(X)(x),use_unicode=False)
print('正态分布的分布函数:')
pprint(simplify(cdf(X)(x)),use_unicode=False)

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,plot,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Normal,sample_iter,FiniteRV,cdf
from sympy.abc import p,k,r,x
X = Normal('X',0,1)
Y = Normal('Y',2,1)
X_pdf = density(X)
Y_pdf = density(Y)
p1 = plot(X_pdf(x),(x,-10,10),line_color=(1.0,0.0,0.0),show=False)
p2 = plot(Y_pdf(x),(x,-10,10),line_color=(0.0,1.0,0.0),show=False)
p2.append(p1[0])
p2.show()

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,plot,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Normal,sample_iter,FiniteRV,cdf
from sympy.abc import p,k,r,x
X = Normal('X',2,1)
Y = Normal('Y',2,5)
Z = Normal('Z',2,9)
X_pdf = density(X)
Y_pdf = density(Y)
Z_pdf = density(Z)
p1 = plot(X_pdf(x),(x,-10,10),line_color=(1.0,0.0,0.0),show=False)
p2 = plot(Y_pdf(x),(x,-10,10),line_color=(0.0,1.0,0.0),show=False)
p3 = plot(Z_pdf(x),(x,-10,10),line_color=(0.0,0.0,1.0),show=False)
p2.append(p1[0])
p2.append(p3[0])
p2.show()

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,plot,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Normal,sample_iter,FiniteRV,cdf
from sympy.abc import p,k,r,x
X = Normal('X',0,1)
X_pdf = density(X)
print('(1):{}'.format(P(And(X>=1,X<2)).evalf()))
print('(2):{}'.format(P(And(X>=-1,X<2)).evalf()))

from scipy.stats import norm
Y = norm(0,1)
#Y.pdf():概率密度函数,Y.cdf分布函数
print('(1):{}'.format(Y.cdf(2)-Y.cdf(1)))
print('(2):{}'.format(Y.cdf(2)-Y.cdf(-1)))

Γ - 分布

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,plot,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Gamma,sample_iter,FiniteRV,cdf
from sympy.abc import p,x,lamda,r
X = Gamma('X',r,1/lamda)
X_pdf = density(X)
print(density(X)(x))

from sympy.stats import P,density,Die,Gamma,sample_iter,FiniteRV,cdf
from sympy.abc import p,x,lamda
X = Gamma('X',1,1/lamda)
X_pdf = density(X)
print(density(X)(x))

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,plot,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,variance,Gamma,sample_iter,E,cdf
from sympy.abc import p,x,lamda,r
print('*'*18+'使用sympy计算'+'*'*18)
X = Gamma('X',1,2)
X_pdf = density(X)
print(density(X)(x))
print('(1):{}'.format((cdf(X)(5)-cdf(X)(3)).evalf()))
print(E(X))
print(simplify(variance(X)))


print('*'*18+'使用scipy计算'+'*'*18)
'''
scipy中连续随机变量的主要公共方法如下:
rvs:随机变量(就是从这个分布中抽一些样本)
pdf:概率密度函数。
cdf:累计分布函数
sf:残存函数(1-CDF)
ppf:分位点函数(CDF的逆)
isf:逆残存函数(sf的逆)
stats:返回均值,方差,(费舍尔)偏态,(费舍尔)峰度。
moment:分布的非中心矩。
'''
from scipy.stats import gamma
Y = gamma(1,scale=2) #lamda参数需要通过scale给定。
#Y.stats():返回均值,方差,(费舍尔)偏态,(费舍尔)峰度。moments="mv"表示只返回均值和方差。
print(Y.stats(moments="mv"))
print('(2):{}'.format(Y.cdf(5)-Y.cdf(3)))

贝塔分布

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,plot,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,Die,Beta,sample_iter,FiniteRV,cdf
from sympy.abc import p,x,lamda,r
X = Beta('X',1,1/2)
X_pdf = density(X)
print(density(X)(x))
print('(1):{}'.format((cdf(X)(1/2)-cdf(X)(1/3)).evalf()))

from scipy.stats import beta
Y = beta(1,1/2)
#Y.pdf():概率密度函数,Y.cdf分布函数
print('(2):{}'.format(Y.cdf(1/2)-Y.cdf(1/3)))

二维随机变量及其分布函数

 

 

 二维随机变量的分布函数

二维离散型随机变量

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,plot,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,variance,DiscreteUniform,sample_iter,E,cdf,given
from sympy.abc import p,x,lamda,r
from sympy.matrices import Matrix
print('*'*18+'使用sympy计算'+'*'*18)
X = DiscreteUniform('X',list(range(1,5)))
Y = DiscreteUniform('Y',list(range(1,5)))
# for i in range(1,5):
#     Y = given(X,X<=i) #创建某个条件下的新的样本空间。
#     print(density(Y).dict)
result = []
for v_x,p_x in density(X).dict.items():
    newlist = []
    for v_y, p_y in density(X).dict.items():
        newlist.append(p_x*P(Eq(Y,v_y),Y<=v_x)) #由公式:P(A,B) = P(A)*P(B/A) 得。
    result.append(newlist)
pprint(Matrix(result).T)
print('*'*18+'使用scipy计算'+'*'*18)
from scipy.stats import rv_discrete
import pandas as pd
import numpy as np
#已经知道X是服从离散均匀分布的
# xd = [i for i in range(1,5)]
# xp = [1/4 for i in range(1,5)]
# Z = rv_discrete(name='Z',values=(xd,xp)) #lamda参数需要通过scale给定。
# # for i in Z.numargs:
# print(Z.pmf(3))
ind_clu = [i for i in range(1,5)]
date = pd.DataFrame(np.array(result).T,ind_clu,ind_clu)
date.index.name='Y'
date.columns.name = 'X'
print(date)

二维连续型随机变量

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,oo,radsimp,exp,Symbol,Mod,integrate
from sympy.stats import P,density,variance,ContinuousRV,sample_iter,E,cdf,given
from sympy.abc import p,lamda,r,y,x
from sympy.matrices import Matrix
print('*'*18+'使用sympy计算'+'*'*18)
pdf = Piecewise((2*exp(-(2*x+y)),And(x>0,y>0)),(0,True))
def my2Cdf(pdf,x1,x2,y1,y2):
    return integrate(pdf,(x,x1,x2),(y,y1,y2))
    # return integrate(integrate(pdf,(x,x1,x2)),(y,y1,y2))
#由 0 < y <= x < +oo 得;y <= x < +oo , 0 < y < +oo
print(my2Cdf(2*exp(-(2*x+y)),y,+oo,0,+oo))

边缘分布函数

离散型随机变量的边缘分布

import pandas as pd
import numpy as np
from fractions import Fraction #python的分数运算库
index_columns = [0,1]
data = pd.DataFrame(np.array([[Fraction(16,49),Fraction(12,49)],[Fraction(12,49),Fraction(9,49)]]),index_columns,index_columns)
data['col_sum'] = data.apply(lambda x:x.sum(),axis=1)
data.loc['row_sum'] = data.apply(lambda x:x.sum())
data.index.name='Y'
data.columns.name = 'X'
print(data)

连续性随机变量的边缘分布

离散型随机变量的条件分布

连续性随机变量的条件分布

数字特征

数学期望

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,oo,radsimp,exp,Symbol,integrate,Integral
from sympy.stats import P,density,variance,Normal,Expectation,E,cdf,Die,Exponential,Probability
from sympy.abc import p,lamda,r,y,x,mu,sigma,C
from sympy.matrices import Matrix
X = Normal('X',mu,sigma)
Y = Exponential('Y',lamda)
Z = Die('Z',10)
print('*'*18+'使用sympy计算'+'*'*18)
print('E(C) = {}'.format(Expectation(C)))
print('E(X) = {}'.format(Expectation(X).rewrite(Integral)))
print('E(X):')
pprint(Expectation(X).rewrite(Probability))
print('E(C*X) = {}'.format(Expectation(C*X).doit()))
print('E(X+Y) = {}'.format(Expectation(X+Y).doit()))
from sympy.stats import P,density,variance,Normal,Expectation,E,cdf,Die,Exponential
from sympy.abc import p,lamda,r,y,x,mu,sigma
from sympy.matrices import Matrix
X = Normal('X',2,1)
Y = Exponential('Y',1/2)
Z = Die('Z',10)
W = X+Y
C = 3
print('*'*18+'使用sympy计算'+'*'*18)
print('E(C):{}'.format(E(C)))
print('E(X):{}'.format(E(X)))
print('E(Y):{}'.format(E(Y)))
print('E(Z):{}'.format(E(Z)))
print('E(X*Y):{};E(X)*E(Y):{}'.format(E(X*Y),E(X)*E(Y)))
print('E(W):{}'.format(E(W)))
print('E(X*W):{};E(X)*E(W):{}'.format(E(X*W),E(X)*E(W)))

方差

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,oo,radsimp,exp,Symbol,integrate,Integral
from sympy.stats import P,density,variance,Normal,Exponential,cdf,Die,Variance,Expectation
from sympy.abc import p,lamda,r,y,x,mu,sigma,C
from sympy.matrices import Matrix
X = Normal('X',mu,sigma)
Y = Exponential('Y',lamda)
Z = Die('Z',10)
W = X+Y
print('*'*18+'使用sympy计算'+'*'*18)
print('D(C) = {}'.format(Variance(C)))
print('D(X) = {}'.format(Variance(X).rewrite(Integral)))
print('D(X) = {}'.format(Variance(X).rewrite(Expectation)))
print('D(C*X) = {}'.format(Variance(C*X).doit()))
print('D(C+X) = {}'.format(Variance(C+X).doit()))
print('D(X+Y) = {}'.format(Variance(X+Y).doit()))
print('D(X-Y) = {}'.format(Variance(X-Y).doit()))

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,oo,radsimp,exp,Symbol,integrate,Integral
from sympy.stats import P,density,variance,Normal,Exponential,cdf,Die,Variance,Expectation,Uniform,Poisson
from sympy.abc import p,r,y,x,C
from sympy.matrices import Matrix
mu = Symbol('mu',positive=True)
sigma = Symbol('sigma',positive=True)
lamda = Symbol('lamda',positive=True)
theta = Symbol('theta',positive=True)
a = Symbol('a',negative=True)
b = Symbol('b',positive=True)
X = Normal('X',mu,sigma)
Y = Exponential('Y',1/theta)
Z = Uniform('Z',a,b)
W = Poisson('W',lamda)

print('正态分布:')
print('期望:{}'.format(Expectation(X).evaluate_integral().simplify()))
print('方差:{}'.format(Variance(X).evaluate_integral().simplify()))
print()
print('指数分布:')
print('期望:{}'.format(Expectation(Y).evaluate_integral().simplify()))
print('方差:{}'.format(Variance(Y).evaluate_integral().simplify()))
print()
print('均匀分布:')
print('期望:{}'.format(Expectation(Z).evaluate_integral().simplify()))
print('方差:{}'.format(Variance(Z).evaluate_integral().simplify()))
print()
print('泊松分布:')
print('期望:{}'.format(Expectation(W).evaluate_integral().simplify()))
print('方差:{}'.format(Variance(W).evaluate_integral().simplify()))

标准差

协方差

from sympy import pprint,Eq,E,simplify,Piecewise,S,And,oo,radsimp,exp,Symbol,integrate,Integral
from sympy.stats import P,density,variance,Normal,Exponential,cdf,Die,Covariance,Expectation
from sympy.abc import p,r,y,x,C
from sympy.matrices import Matrix
mu = Symbol('mu',positive=True)
sigma = Symbol('sigma',positive=True)
theta = Symbol('theta',positive=True)
a = Symbol('a',positive=True)
b = Symbol('b',positive=True)
X = Normal('X',mu,sigma)
Y = Exponential('Y',1/theta)
Z = Normal('Z',mu,sigma)
print('*'*18+'使用sympy计算'+'*'*18)
print('Cov(X,Y) = {}'.format(Covariance(X,Y)))
print('Cov(X,Y) = {}'.format(Covariance(X,Y).rewrite(Expectation)))
print('Cov(C*X,Y) = {}'.format(Covariance(C*X,Y).doit()))
print('Cov(a*X,b*Y) = {}'.format(Covariance(a*X,b*Y).doit()))
print('Cov(X+Y,Z) = {}'.format(Covariance(X+Y,Z).doit()))
print('Cov(X-Y,Z) = {}'.format(Covariance(X-Y,Z).doit()))

协方差矩阵

 Pearson相关系数

import numpy as np
import pandas as pd
df = pd.DataFrame({'A':np.random.randint(1, 100, 10), 'B':np.random.randint(1, 100, 10),'C':np.random.randint(1, 100, 10)})
print(df.corr())  # pearson相关系数
df.corr('kendall') # Kendall Tau相关系数
df.corr('spearman') # spearman秩相关
 from numpy import array, cov, corrcoef
  
  data = array([data1, data2])
  
  #计算两组数的协方差
  #参数bias=1表示结果需要除以N,否则只计算了分子部分
  #返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的协方差。对角线为方差
  cov(data, bias=1)
  
  #计算两组数的相关系数
  #返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的相关系数。对角线为1
  corrcoef(data)

中心距、原点距

峰度

import numpy as np
from scipy import stats #scipy中的stats可以做统计推断
np.set_printoptions(suppress=True) #将数字表示成我们习惯的方式
x = np.random.randn(100) #randn可随机生成标准正态分布的样本,100表示样本数量
mu = np.mean(x, axis=0) #axis=0,那么输出矩阵是1行,求每一列的平均;axis=1,输出矩阵是1列,求每一行的平均
sigma = np.std(x, axis=0) #求标准差,这里除的是N
skew = stats.skew(x) #求偏度
kurtosis = stats.kurtosis(x) #求峰度

print(x,'\n')
print(mu,sigma,skew,kurtosis)

峰度反应的是图像的尖锐程度:峰度越大,表现在图像上面是中心点越尖锐。在相同方差的情况下,中间一大部分的值方差都很小,为了达到和正太分布方差相同的目的,必须有一些值离中心点越远,所以这就是所说的“厚尾”,反应的是异常点增多这一现象。峰度定义为四阶标准矩,峰度表示分布的尾部与正态分布的区别。使用峰度可帮助您初步了解有关数据分布的一般特征。

基线:峰度值 0

完全服从正态分布的数据的峰度值为 0。正态分布的数据为峰度建立了基准。如果样本的峰度值显著偏离 0,则表明数据不服从正态分布。

 

正峰度

具有正峰度值的分布表明,相比于正态分布,该分布有更重的尾部。例如,服从 t 分布的数据具有正峰度值。实线表示正态分布,虚线表示具有正峰度值的分布。

负峰度

具有负峰度值的分布表明,相比于正态分布,该分布有更轻的尾部。例如,服从 Beta 分布(第一个和第二个分布形状参数等于 2)的数据具有负峰度值。实线表示正态分布,虚线表示具有负峰度值的分布。

样本的峰度计算方法:

 样本的峰度还可以这样计算:

 

其中k4k4是四阶累积量的唯一对称无偏估计,k2k2是二阶累积量的无偏估计(等同于样本方差),m4m4是样本四阶平均距,m2m2是样本二阶平均距。

注意,大多数程序都是采用G2来计算峰度。

偏度

偏度是数据的不对称程度。无论偏度值是 0、正数还是负数,都显示有关数据分布形状的信息。

    

对称或非偏斜分布

当数据变得更加对称时,它的偏度值会更接近零。图 A 显示正态分布的数据,顾名思义,正态分布数据的偏度相对较小。通过沿这一正态数据直方图的中间绘制一条线,可以很容易地看到两侧互相构成镜像。但是,没有偏度并不表示具有正态性。在图 B 显示的分布中,两侧依然互相构成镜像,但这些数据完全不是正态分布。

 

正偏斜或向右偏斜分布

正偏斜或右偏斜的数据之所以这样命名,是因为分布的“尾部”指向右侧,而且它的偏度值大于 0(或为正数)。薪金数据通常按这种方式偏斜:一家公司中许多员工的薪金相对较低,而少数人员的薪金则非常高。

负偏斜或向左偏斜分布

左偏斜或负偏斜的数据之所以这样命名,是因为分布的“尾部”指向左侧,而且它产生负数偏度值。故障率数据通常就是左偏斜的。以灯泡为例:极少数灯泡会立即就烧坏,但大部分灯泡都会持续相当长的时间。

偏度的定义:

 

样本X的偏度为样本的三阶标准矩,其中μμ是均值,δδ为标准差,E是均值操作。μ3μ3是三阶中心距,κtκt是tthtth累积量

偏度可以由三阶原点矩来进行表示:

样本偏度的计算方法:

 一个容量为n的数据,一个典型的偏度计算方法如下:

其中x¯x¯为样本的均值(和μμ的区别是,μμ是整体的均值,x¯x¯为样本的均值)。s是样本的标准差,m3m3是样本的3阶中心距。

另外一种定义如下:

k3k3是三阶累积量κ3κ3的唯一对称无偏估计(unique symmetric unbiased estimator)(k3k3 和 κ3κ3写法不一样)。k2=s2k2=s2是二阶累积量的对称无偏估计。大多数软件当中使用G1来计算skew,如Excel,Minitab,SAS和SPSS。

import pandas as pd
x = [53, 61, 49, 66, 78, 47]
s = pd.Series(x)
print(s.skew())
print(s.kurt())

变异系数

数据的发散程度可用极差(PTP)、方差(Variance)、标准差(STD)、变异系数(CV)来衡量,它们的计算方法如下:

  from numpy import mean, ptp, var, std
  
  #极差
  ptp(data)
  #方差
  var(data)
  #标准差
  std(data)
  #变异系数
  mean(data) / std(data)

分位数

from numpy import quantile
quantile(data,q=1/2)
from scipy.stats import norm
X = norm(0,1)
p = 1/4
print(X.cdf(0))
print('下分位:')
print(X.ppf(p))
print(X.sf(0))
print('上分位:')
print(X.isf(1-p))

中位数

对于定量数据(Data)来说,均值是总和除以总量(N),中位数是数值大小位于中间(奇偶总量处理不同)的值:

 

均值相对中位数来说,包含的信息量更大,但是容易受异常的影响。使用NumPy计算均值与中位数:

from numpy import mean, median
from scipy.stats import mode
#计算众数
mode(data)
#计算中位数
median(data)

数据的发散程度可用极差(PTP)、方差(Variance)、标准差(STD)、变异系数(CV)来衡量,它们的计算方法如下:

posted @ 2019-07-21 23:32  码迷-wjz  阅读(1096)  评论(0)    收藏  举报