一、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()