Scipy基础

1.1常用命令

import numpy as np
shift+enter                                                          运行当前单元格代码并切换到新的单元格
crtl+enter                                                            运行当前单元格
crtl+s                                                                    保存
Alt+Enter                                                            运行当前单元格并插入一个单元格
Ctrl+c                                                                  关闭程序
A                                              向上加一个单元
M                                              单元转入Markdown状态
Y                                              单元转入代码格式
B                                              向下加一个单元

1.2安装操作简介

1.2.1网址

官网:https://www.scipy.org/
安装:在C:\Python27\Scripts下打开cmd执行:
执行:pip install scipy

1.2.2安装Anaconda及环境搭建(举例演示)

创建环境:conda create -n env_name python=3.6
示例: conda create -n Py_36 python=3.6 #创建名为Py_367的环境
列出所有环境:conda info -e
进入环境: source activate Py_36 (OSX/LINUX系统)
activate Py_36 (windows系统)

1.2.3、jupyter 安装

jupyter简介:jupyter(Jupyter Notebook)是一个交互式笔记本
支持运行40多种编程语言
数据清理和转换,数值模拟,统计建模,机器学习等
jupyter 安装:conda install jupyter notebook
启动 jupyter:激活相应环境
在控制台执行 :**jupyter notebook**
notebook服务器运行地址:http://localhost:8888
新建(notebook,文本文件,文件夹)
qian

二、基础语法

2.1保存和加载命令—io.savemat/io.loadmat

#stats.norm.rvs()
from scipy import io
import numpy as np
a=np.arange(9).reshape(3,3)
#用scipy的io模块保存到mat文件中
io.savemat("a.mat",{"text":a})
#运用localmat载入数据
data=io.loadmat("a.mat")
data
'''
{'__globals__': [],
 '__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Wed May 30 15:00:04 2018',
 '__version__': '1.0',
 'text': array([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])}
        '''
from matplotlib import pyplot as plt
b=np.random.normal(size=(100,100))
plt.hist(b)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这里写图片描述

2.2、Scipy实现统计功能

2.2.1生成随机数

利用scipy.stats的包统计函数实现分析随机数的功能
均匀分布(uniform)
x=stats.unifrom.rvs(size = 20)生成20个[0,1]均匀分布随机数

正太分布(norm)
x=stats.norm.rvs(size = 20)生成20个正态分布随机数

贝塔分布(beta)
x=stats.beta.rvs(size=20,a=3,b=4) 生成20个服从参数a=3,b=4贝塔分布随机数 生成20个正态分布随机数

离散分布
伯努利分布(bernoulli)
几何分布(geom)
泊松分布(poisson)
x=stats.poisson.rvs(0.6,loc=0,size = 20)生成20个服从泊松分布随机数

2.2.2均值和标准差—fit

ndarray=stats.norm.rvs(size=100)
mean,std=stats.norm.fit(ndarray)
  • 1
  • 2

2.2.3偏度—stats.skewtes()

偏度
skewtest>0,正偏
skewtest<0,负偏

from scipy import stats
from matplotlib import pyplot as plt
#用scipy生成一个正太分布
normal1=stats.norm.rvs(size=100)
#绘图操作
plt.hist(normal1)
normal2=stats.norm.rvs(size=100)
#计算偏度
staistic1,pvalue1=stats.skewtest(normal1)
staistic1
0.23677884737006907
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这里写图片描述

2.2.4峰度—stats.kurtosistest()

from scipy import stats
from matplotlib import pyplot as plt
import numpy as np
norm=stats.norm.rvs(size=100)
normmalExample=stats.norm.rvs(size=100)
#计算峰度
kurtosis,pvalue=stats.kurtosistest(normmalExample)
print("峰度",kurtosis)
print("接近正太分布的饱和度:",pvalue)
kurt
>>0.21912014864574728
pvalue
>>0.8265564557880772
>#前面的峰度,值越大,月陡峭
>plt.hist(norm)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这里写图片描述

2.2.5检测相互对应的百分比和数值—stats.scoreatpercentile/stats.percentileofscore

#-*-coding:utf-8-*-
from scipy import stats
from matplotlib import pyplot as plt
import numpy as np
normmalExample=stats.norm.rvs(size=100)
result=stats.scoreatpercentile(normmalExample,95)
print("%95:",result)
values=stats.percentileofscore(normmalExample,1)
print(values,"%")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.2.6正太分布程度检验—pvalue

1 正态性检验(normality test),同样返回两个值,第二个返回p-values
2 利用 检验 stats.normaltest()
一般情况 pvalue>0.05 表示服从正态分布

2.2.7正太分布程度检验—pvalue

import matplotlib.pyplot as plt
在Anaconda环境下(py36)C:\Users\lenovo>导入:conda install matplotlib
plt.hist(arr) #设置直方图
plt.show() #显示图

三、综合练习

3.1分数问题

求均值 中位数 众数 极差 方差
标准差 变异系数(均值/方差) 偏度 峰度

import numpy as np
arrEasy=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]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

步骤1 分数和人数对应扩展

#方法1  repeat
sorces=arrEasy[:,0]
person=arrEasy[:,1]
a=np.repeat(list(sorces),list(person))
a
array([ 0. ,  0. ,  2.5, ..., 80. , 80. , 80. ])
sorces2=arrDiff[:,0]
person2=arrDiff[:,1]
b=np.repeat(list(sorces2),list(person2))
b
array([ 0.,  0.,  0., ..., 75., 75., 75.])
#方法2  独立封装打包
def createScore(arr):
    score = []          #所有学员分数
    row = arr.shape[0]
    for i in np.arange(0,row):
        for j in np.arange(0,int(arr[i][1])):
        score.append(arr[i][1]))
    score = np.array(score)
    return score
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

步骤2:创建函数,根据传入数组,对其进行统计

#用的方法2
def calStatValue(score):
    #集中趋势度量
    print('均值')
    print(np.mean(score))
    print('中位数')
    print(np.median(score))
    print('众数')
    print(stats.mode(score))
    #离散趋势度量
    print('极差')
    print(np.ptp(score))
    print('方差')
    print(np.var(score))
    print('标准差')
    print(np.std(score))
    print('变异系数')
    print(np.mean(score)/np.std(score))
    #偏度与峰度的度量
    print('偏度')
    print(stats.skewness(score))
    print('峰度')
    print(stats.Kurtosis(score))

猜你喜欢

转载自blog.csdn.net/weixin_42199174/article/details/80911075