数据的统计分析及可视化

今天学习了运用python进行的数据统计分析及可视化

一、随机变量及其分布

 1.均匀分布及随机数图

(1)均匀分布

加载numpy模块,设置格式

import numpy as np                        #加载numpy包
np.set_printoptions(precision=4)          #设置numpy输出为4位有效数

生成数据集

a=0
b=1
n=20            # n表示在[a,b]中生成n个点
x=np.linspace(a,b,n);   # [a,b]中n个等差数据
# x = np.linspace(0, 1, 20)
x
z = np.ones(n)
y=np.ones(n)/(b-a)
import matplotlib.pyplot as plt               
plt.plot(x,y)
plt.ylim(0,1.5)
plt.stem(x,y)

 

stem图是一种用于表示离散序列数据的图表,类似于条形图但更加简洁。每个数据点用一根垂直线(茎)表示,而数据值则显示在线的顶部或底部(叶子)。这种类型的图表在信号处理、统计学和工程领域非常常见,因为它可以清晰地展示数据点的位置及其对应的值。

(2)均匀随机数

#生成一个均匀随机实数
np.random.rand(1)   #生成[0,1]上的一个随机实数:random.uniform(0,1) ,每次运行的结果,是不一样的 
#生成一组随机实数及图示
np.random.seed(123)            #设置种子数seed可重复结果,可任意设置
R=np.random.rand(10)
R[:10]  #[0,1]上的1000个随机数=np.random.uniform(0,1,1000) 
plt.plot(R,'.');

示例代码:

# 整数随机数
import random
random.randint(10,20)
# 实数随机数
random.uniform(0,1)
# 整数随机数列
import numpy as np
np.random.randint(10, 21, 9)
# 实数随机数列
np.random.uniform(0,1,10)

2.正态分布及随机数图

(1)正态分布函数

#标准正态分布曲线
from numpy import arange,exp  #arange类似linspace函数
from math import sqrt,pi   
x=arange(-4, 4, 0.1)            #x为-4到4上间距为0.1的数   
y=1/sqrt(2*pi)*exp(-x**2/2)
plt.plot(x,y)

#标准正态分布的取值(pdf)及分位数(ppf)计算
import scipy.stats as st  #加载统计方法包 
p_z=st.norm.pdf(-2)
p_z   #p(z)=1/sqrt(2*pi)*exp(-z**2/2);

za=st.norm.ppf(0.95)
za   #单侧
[st.norm.ppf(0.025),st.norm.ppf(0.975)] #双侧
#标准正态分布的概率计算
p=st.norm.cdf(1.645)
p       #标准正态分布下的面积:p=P(z≤1.645)的累积概率

 #标准正态曲线下[a,b]上计算概率的面积图
import scipy.stats as st  #加载统计方法包 
def norm_p(a,b):            
        x=np.arange(-4,4,0.1) 
        y=st.norm.pdf(x)         
        x1=x[(a<=x) & (x<=b)];x1 
        y1=y[(a<=x) & (x<=b)];y1         
        p=st.norm.cdf(b)-st.norm.cdf(a);
        print("    N(0,1)分布: [%3.2f,%3.2f]  p=%5.4f"%(a,b,p)) 
        plt.plot(x,y);#plt.text(-0.7,0.2,"p=%5.4f"%p,fontsize=15);
        plt.hlines(0,-4,4); plt.vlines(x1,0,y1,colors='r');         
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st

def norm_p(a, b):
    # 定义x的范围
    x = np.arange(-4, 4, 0.1)
    y = st.norm.pdf(x)
    
    # 计算区间[a, b]内的x和y值
    mask = (a <= x) & (x <= b)
    x1 = x[mask]
    y1 = y[mask]
    
    # 计算累积概率p
    p = st.norm.cdf(b) - st.norm.cdf(a)
    print("N(0,1)分布: [{:.2f},{:.2f}]  p={:.4f}".format(a, b, p))
    
    # 绘制图形
    plt.figure(figsize=(10, 6))
    plt.plot(x, y, label='Standard Normal Distribution PDF')
    plt.fill_between(x1, y1, color='skyblue', alpha=0.5, label=f'Area between {a} and {b}')
    plt.hlines(0, -4, 4, colors='black', linestyles='dashed')
    plt.vlines([a, b], 0, [st.norm.pdf(a), st.norm.pdf(b)], colors='red', linestyle='--')
    
    # 添加标题和标签
    plt.title('Standard Normal Distribution Probability Density Function')
    plt.xlabel('x')
    plt.ylabel('Probability Density')
    plt.legend()
    
    # 显示图形
    plt.grid(True)
    plt.show()

# 示例调用
norm_p(-1, 1)

(2)正态分布随机图

#标准正态随机数及分布图 
np.random.normal(0,1,5)    #生成 5 个标准正态分布随机数 

#随机产生1000个标准正态分布随机数,作其概率直方图,然后再添加正态分布的密度函数线。
#np.random.seed(123)             #设置种子数seed可使结果可重复
z1=np.random.normal(0,1,1000)   #1000个标准正态分布随机数N(0,1)
z1[:20]
plt.hist(z1);                   #可设定分段数bins, plt.hist(z1,bins=30)

 两张图制作方法

np.random.seed(456)            #设置种子seed可重复结果
z2=np.random.normal(0,1,1000)
plt.hist(z2);#plt.ylim=[0,400];
#做在一张图上
plt.hist(z1)
plt.hist(z2);    
#一页绘制2个正态分布随机图
plt.subplot(121)
plt.hist(z1)
plt.subplot(122)
plt.hist(z2)
import pandas as pd
z12=pd.DataFrame({'z1':z1,'z2':z2})
z12 #构建数据框
z12.plot(kind='hist'); #根据数据框绘直方图
z12.plot(kind='hist',subplots=True,layout=(1,2))
z12.plot(kind='density',subplots=True,layout=(1,2)) #模拟正态分布曲线

#一般正态随机数及分布图
np.random.seed(12)   #设置种子数seed可重复结果
X=np.random.normal(170,10,100)
X.round(1)    #  将数组 X 中的所有元素四舍五入到小数点后一位
import seaborn as sns
sns.distplot(X)

#非正态随机数及分布图
np.random.seed(15)  #设置种子数seed可重复结果
Y=np.random.lognormal(0,1,1000)
Y[:10]
sns.histplot(Y, kde=True)
Z=np.log(Y)      # Z=log(Y)
sns.histplot(Z, kde=True)

(3)正态分布概率检验图

import scipy.stats as st   #加载科学计算包scipy的统计功能
st.probplot(X,plot=plt)

同理可得Y、Z的图像 

st.probplot(Y,plot=plt)
st.probplot(Z, plot=plt)

二、统计量及抽样分布图

1.统计量及抽样的概念

(1)简单随机模拟

#生成[0,1]上的一组随机整数
np.random.randint(0,2,10)    #[0,1]上的10个随机整数 
#生成任意区间上的一组随机整数
np.random.randint(1,101,10)  #[1,100]上的10个随机整数数组
np.random.seed(15)           #设置种子数结果可重复
np.random.randint(1,101,10)

(2)随机抽样方法

#根据随机数抽样
import pandas as pd
BSdata=pd.read_excel('./data/DaPy_data.xlsx','BSdata');   #读取学生数据

i=np.random.randint(0,52,6);i #抽取6名学生,取[1,52]上的6个整数
BSdata.iloc[i]                 #获取抽到的6名学生信息 
#直接抽取样本(sample)
BSdata.sample(6)             #直接抽取名学生及其信息 

数据集(部分):

随机数抽样:

直接抽取样本:

2.统计量的分布

(1)中心极限定理及其模拟图

#正态均值的分布—正态分布 
# 基于正态分布的中心极限定理模拟函数
import seaborn as sns
def norm_sim1(N=1000,n=10):    # n为样本个数,N为模拟次数(即抽样次数) 
    xbar=np.zeros(N)           # 产生放置样本均值的向量  
    for i in range(N):         # 计算[0,1]上的标准正态随机数及均值 
        xbar[i]=np.random.normal(0,1,n).mean() 
    sns.distplot(xbar,bins=50) #plt.hist(xbar,bins=50)   
    print(pd.DataFrame(xbar).describe().T) #模拟结果的基本统计量
np.random.seed(1)         #设置种子数seed使结果可重复
norm_sim1(10000,30)               #根据默认值模拟

#非正态均值统计量的分布 —— 渐近正态分布
# 基于非正态分布的中心极限定理模拟函数
def norm_sim2(N=1000,n=10): 
    xbar=np.zeros(N) 
    for i in range(N):  #计算[0,1]上的均匀随机数及均值 
        xbar[i]=np.random.uniform(0,1,n).mean()  
    sns.distplot(xbar,bins=50)
    print(pd.DataFrame(xbar).describe().T) 
np.random.seed(3)   #设置种子数seed使结果可重复
norm_sim2() 

(2)均值的t分布及其图示

#t 分布曲线比较图
x = np.arange(-4,4,0.1)
yn = st.norm.pdf(x,0,1)
yt3 = st.t.pdf(x, 3)
yt10 = st.t.pdf(x, 10)
plt.plot(x, yn, 'r-', x,yt3,'b.',x,yt10,'g-.')
plt.legend(["N(0, 1)", "t(3)", "t(10)"])

三、基本统计推断方法

1.参数的估计方法

(1)点估计

import pandas as pd
BSdata=pd.read_excel('./data/DaPy_data.xlsx','BSdata');   #读取学生数据
#均值的点估计
BSdata['身高'].mean() 

#标准差的点估计
BSdata['身高'].std() 
#比例的点估计
f=BSdata['开设'].value_counts(); 
p=f/sum(f)
p

(2)区间估计

norm_p(-2,2) 

# 定义t分布曲线下[a, b]上计算概率的面积图
import scipy.stats as st
def t_p(a,b,df=10):  #t分布曲线下[a,b]上计算概率的面积图
        x=np.arange(-4,4,0.1) 
        y=st.t.pdf(x,df)         
        x1=x[(a<=x) & (x<=b)];x1 
        y1=y[(a<=x) & (x<=b)];y1 
        p=st.t.cdf(b,df)-st.t.cdf(a,df);
        print("      t("+str(df)+"): [%3.2f, %3.2f]  p=%5.4f"%(a,b,p)) 
        plt.plot(x,y);#plt.text(-0.7,0.2,"p=%5.4f"%p,fontsize=15);
        plt.hlines(0,-4,4); plt.vlines(x1,0,y1,colors='r'); 
t_p(-2,2)  #t:[-2,2], df=10

#基于原始数据的t分布均值和置信区间
def t_interval(x,b=0.95):  #这里b为置信水平,通常取95%
    a=1-b 
    n = len(x) 
    ta=st.t.ppf(1-a/2,n-1);ta     
    from math import sqrt 
    se=x.std()/sqrt(n)
    return(x.mean()-ta*se, x.mean()+se*ta)
t_interval(BSdata['身高']) #身高均值的 95%的置信区间

2.参数的假设检验

(1)样本均值t检验

#单样本 t 检验函数进行均值的 t 检验 
print("样本均值:",BSdata.身高.mean())
st.ttest_1samp(BSdata.身高,popmean = 166)

3.统计推断的可视化

(1)均值推断的可视化函数

#定义单样本均值t检验图
def ttest_1plot(X,mu=0,k=0.1): 
    df=len(X)-1  #df=n-1
    t1p=st.ttest_1samp(X, popmean = mu);
    x=np.arange(-4,4,k); y=st.t.pdf(x,df)
    t=abs(t1p[0]);p=t1p[1]
    x1=x[x<=-t]; y1=y[x<=-t];
    x2=x[x>=t]; y2=y[x>=t];
    print("  样本均值: \t%8.4f "%X.mean())
    print("  单样本t检验:    t=%6.3f  p=%6.4f"%(t,p))
    t_interval=st.t.interval(0.95,len(X)-1,X.mean(),X.std())
    print("   t置信区间:\t(%7.4f, %7.4f)"%(t_interval[0],t_interval[1]))
    plt.plot(x,y); plt.hlines(0,-4,4);
    plt.vlines(x1,0,y1,colors='r'); plt.vlines(x2,0,y2,colors='r');
    plt.vlines(st.t.ppf(0.05/2,df),0,0.2,colors='b');
    plt.vlines(-st.t.ppf(0.05/2,df),0,0.2,colors='b');
    plt.text(-0.6,0.2,r"$\alpha$=%3.2f"%0.05,fontsize=15);
ttest_1plot(BSdata.身高,166)  #总体均值为166时的推断图 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值