Scipy入门

一、scipy中io模块使用
import scipy
import numpy as np
import matplotlib.pyplot as plt
from scipy import io

#用io模块写入数据
a = np.arange(7)
io.savemat('a.mat',{'array':a})
data = io.loadmat('a.mat')
print(data['array'])

[[0 1 2 3 4 5 6]]

二、scipy中stats子模块产生符合特定规律的随机数
from scipy import stats

Stats提供了产生连续性分布的函数:

均匀分布(uniform)
正态分布(norm)
贝塔分布(beta)
离散分布
伯努利分布(bernoulli)
几何分布(geom)
泊松分布(poisson)
#产生符合正态分布的随机数
x = stats.norm.rvs(size = 20)
x

array([-0.3668553 , -1.97745322,  0.3353114 , -0.89573224, -0.11372808,
        0.51618827, -1.28898304,  0.25557684, -2.59951208, -0.82487573,
        0.66980873, -0.49528425, -1.34229043,  0.79874304, -0.81134343,
        0.85968282, -1.35237681, -0.59951369,  0.65832086,  0.82553856])

#用频率分布直方图反映一组数据的分布情况
plt.hist(x)#数据点比较少时,不一定符合正太分布
plt.show()

这里写图片描述

 
x = stats.norm.rvs(size = 20000)#取多数据点进行尝试

plt.hist(x)
plt.show()#多数据情况下可看出符合正态分布
这里写图片描述

 
#产生服从beta分布的数组
y = stats.beta.rvs(size=100,a=0.5,b=0.5)

plt.hist(y)
plt.show()
这里写图片描述

 
三、计算随机数的均值和标准差
#fit方法拟合一组数据
generated = stats.norm.rvs(size=920)
mean,std = stats.norm.fit(generated)
mean#均值

0.075387649613412891

std#标准差

1.0126002204446221

四、scipy计算随机数组的偏度、峰度
normal = stats.normal = stats.norm.rvs(size=200000000)
'''
检验随机数组的偏度函数  stats.skewtest()  返回数组的偏度和符合正太分布的程度
skew 偏度
pvalue  符合正太分布的程度  0-1之间的小数
'''

skew,pvalue=stats.skewtest(normal)

skew#偏度

-0.00062751704801152495

pvalue#符合正太分布的程度

0.99949931386861079

normal= stats.norm.rvs(size=900)
# scipy检测数组峰度函数  stats.kurtosistest()   返回峰度和符合正太分布的程度
kurtosis,pvalue=stats.kurtosistest(normal)
print("峰度:",kurtosis)
print("符合正太分布程度:",pvalue)

峰度: 0.839481223202
符合正太分布程度: 0.401199321623

五、计算数据符合正太分布程度的函数

'''
1、 skew,pvalue = stats.skewtest()  
    skew:偏度   pvalue:符合正太分布程度
2、 kurtosis,pvalue = stats.kurtosistest()
    kurtosis:峰度
    pvalue:符合正太分布程度
3、 stats.normaltest()  返回符合正太分布程度

'''

normal = stats.norm.rvs(size=100)

# stats.normaltest()方法测试数据符合正太分布的程度
normaltest,pvalue = stats.normaltest(normal)
print("符合正太分布的程度:",pvalue)


符合正太分布的程度: 0.885540772912

#将数据进行排序后,计算在某一百 分比位置上的数值
stats.scoreatpercentile(normal,95)


1.8470874538995359

#利用percentileofscore计算某数值对应的百分数
stats.percentileofscore(normal,1.12693064)

84.0

六、练习
需求:比较两组分数(总人数为:4653),分别为考试分数及人数。分析两组分数的考试难易度。

#一组数据
ararrEasyr1=np.array([[0,2],[2.5,4],[5,6],[7.5,9],[10,13],[12.5,16],[15,19],[17.5,23],[20,27],
                    [22.5,31],[25,35],[27.5,40],[30,53],[32.5,68],[35,90],[37.5,110],[40,130],
                    [42.5,148],[45,165],[47.5,182],[50,195],[52.5,208],[55,217],[57.5,226],[60,334],
                   [62.5,342],[65,349],[67.5,500],[70,511],[72.5,300],[75,200],[77.5,80],[80,20]])
#二组数据
arrDiff=np.array([[0,20],[2.5,30],[5,45],[7.5,70],[10,100],[12.5,135],[15,170],[17.5,205],[20,226],
                    [22.5,241],[25,251],[27.5,255],[30,256],[32.5,253],[35,249],[37.5,242],[40,234],
                    [42.5,226],[45,217],[47.5,208],[50,195],[52.5,182],[55,165],[57.5,148],[60,130],
                   [62.5,110],[65,40],[67.5,30],[70,20],[72.5,5],[75,5],[77.5,0],[80,0]])

#取出分数及人数
scores1 = ararrEasyr1[:,0]
person1 = ararrEasyr1[:,1]

scores2 = arrDiff[:,0]
person2 = arrDiff[:,1]

scores1

array([  0. ,   2.5,   5. ,   7.5,  10. ,  12.5,  15. ,  17.5,  20. ,
        22.5,  25. ,  27.5,  30. ,  32.5,  35. ,  37.5,  40. ,  42.5,
        45. ,  47.5,  50. ,  52.5,  55. ,  57.5,  60. ,  62.5,  65. ,
        67.5,  70. ,  72.5,  75. ,  77.5,  80. ])

person1

array([   2.,    4.,    6.,    9.,   13.,   16.,   19.,   23.,   27.,
         31.,   35.,   40.,   53.,   68.,   90.,  110.,  130.,  148.,
        165.,  182.,  195.,  208.,  217.,  226.,  334.,  342.,  349.,
        500.,  511.,  300.,  200.,   80.,   20.])

#前面得到的数据为浮点数,这里转成整型进行处理
newperson1 = person1.astype(np.int64)
newperson2 = person2.astype(np.int64)
print(newperson1)
print(newperson2)
#np,repeat()方法得出每个分数出现的次数
arr1 = np.repeat(scores1,newperson1)
arr2 = np.repeat(scores2,newperson2)
print(arr1)
print(arr2)

[  2   4   6   9  13  16  19  23  27  31  35  40  53  68  90 110 130 148
 165 182 195 208 217 226 334 342 349 500 511 300 200  80  20]
[ 20  30  45  70 100 135 170 205 226 241 251 255 256 253 249 242 234 226
 217 208 195 182 165 148 130 110  40  30  20   5   5   0   0]
[  0.    0.    2.5 ...,  80.   80.   80. ]
[  0.   0.   0. ...,  75.  75.  75.]

#求平均值scipy/np.meaan
aver1 = scipy.mean(arr1)
aver2 = scipy.mean(arr2)
print("第一组的平均值为:",aver1)
print("第二组的平均值为:",aver2)

第一组的平均值为: 57.3269933376
第二组的平均值为: 35.0654085353

#求中位数scipy/np.median
median1 = scipy.median(arr1)
median2 = scipy.median(arr2)
print("第一组的中位数为:",median1)
print("第二组的中位数为:",median2)

第一组的中位数为: 60.0
第二组的中位数为: 35.0

#求众数stats.mode及奇异值(平均值/标准差)
mode1 = stats.mode(arr1)
mode2 = stats.mode(arr2)
print("第一组的众数为:",mode1)
print("第二组的众数为:",mode2)

hen1 = aver1/std1
hen2 = aver2/std2
print("第一组变异系数为:",hen1)
print("第二组变异系数为:",hen2)

第一组的众数为: ModeResult(mode=array([ 70.]), count=array([511]))
第二组的众数为: ModeResult(mode=array([ 30.]), count=array([256]))
第一组变异系数为: 3.95595207737
第二组变异系数为: 2.24892999025

#极差ptp,方差var,标准差std
ptp1 = scipy.ptp(arr1)
ptp2 = scipy.ptp(arr2)
print("第一组极差为:",ptp1)
print("第二组极差为:",ptp2)


var1 = np.var(arr1)
var2 = np.var(arr2)
print("第一组方差为:",var1)
print("第二组方差为:",var2)

std1 = np.std(arr1)
std2 = np.std(arr2)
print("第一组标准差为:",std1)
print("第二组标准差为:",std2)

第一组极差为: 80.0
第二组极差为: 75.0
第一组方差为: 209.998544947
第二组方差为: 243.111741453
第一组标准差为: 14.491326542
第二组标准差为: 15.592040965

skew1 = stats.skew(arr1)
skew2 = stats.skew(arr1)
print("第一组偏度为:",skew1)
print("第二组偏度为:",skew2)

第一组偏度为: -1.029998112478232
第二组偏度为: -1.029998112478232

kurtosis1 = stats.kurtosis(arr1)
kurtosis2 = stats.kurtosis(arr1)
print("第一组偏度为:",kurtosis1)
print("第二组偏度为:",kurtosis2)

第一组偏度为: 0.7454850579509733
第二组偏度为: 0.7454850579509733

#用来正常显示中文标签 
plt.rcParams['font.sans-serif']=['SimHei'] 
#用来正常显示负号 
plt.rcParams['axes.unicode_minus']=False

fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.boxplot(arr1)
ax1.set_title('第一组箱型图')
ax2 = fig.add_subplot(122)
ax2.boxplot(arr2)
ax2.set_title('第二组箱型图')
plt.show()

这里写图片描述


fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.hist(arr1,width=0.8)
ax1.set_title('第一组分布直方图')
ax2 = fig.add_subplot(122)
ax2.hist(arr2,width=0.8)
ax2.set_title('第二组分布直方图')
plt.show()
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

py爱好者~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值