python 生成正态分布数据,并绘图和解析


Posted in Python onDecember 21, 2020

1、生成正态分布数据并绘制概率分布图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


# 根据均值、标准差,求指定范围的正态分布概率值
def normfun(x, mu, sigma):
  pdf = np.exp(-((x - mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi))
  return pdf


# result = np.random.randint(-65, 80, size=100) # 最小值,最大值,数量
result = np.random.normal(15, 44, 100) # 均值为0.5,方差为1
print(result)

x = np.arange(min(result), max(result), 0.1)
# 设定 y 轴,载入刚才的正态分布函数
print(result.mean(), result.std())
y = normfun(x, result.mean(), result.std())
plt.plot(x, y) # 这里画出理论的正态分布概率曲线

# 这里画出实际的参数概率与取值关系
plt.hist(result, bins=10, rwidth=0.8, density=True) # bins个柱状图,宽度是rwidth(0~1),=1没有缝隙
plt.title('distribution')
plt.xlabel('temperature')
plt.ylabel('probability')
# 输出
plt.show() # 最后图片的概率和不为1是因为正态分布是从负无穷到正无穷,这里指截取了数据最小值到最大值的分布

python 生成正态分布数据,并绘图和解析

根据范围生成正态分布:

result = np.random.randint(-65, 80, size=100) # 最小值,最大值,数量

根据均值、方差生成正态分布:

result = np.random.normal(15, 44, 100) # 均值为0.5,方差为1

2、判断一个序列是否符合正态分布

import numpy as np
from scipy import stats


pts = 1000
np.random.seed(28041990)
a = np.random.normal(0, 1, size=pts) # 生成1个正态分布,均值为0,标准差为1,100个点
b = np.random.normal(2, 1, size=pts) # 生成1个正态分布,均值为2,标准差为1, 100个点
x = np.concatenate((a, b)) # 把两个正态分布连接起来,所以理论上变成了非正态分布序列
k2, p = stats.normaltest(x)
alpha = 1e-3
print("p = {:g}".format(p))


# 原假设:x是一个正态分布
if p < alpha: # null hypothesis: x comes from a normal distribution
  print("The null hypothesis can be rejected") # 原假设可被拒绝,即不是正态分布
else:
  print("The null hypothesis cannot be rejected") # 原假设不可被拒绝,即使正态分布

3、求置信区间、异常值

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import pandas as pd


# 求列表数据的异常点
def get_outer_data(data_list):
  df = pd.DataFrame(data_list, columns=['value'])
  df = df.iloc[:, 0]
  # 计算下四分位数和上四分位
  Q1 = df.quantile(q=0.25)
  Q3 = df.quantile(q=0.75)

  # 基于1.5倍的四分位差计算上下须对应的值
  low_whisker = Q1 - 1.5 * (Q3 - Q1)
  up_whisker = Q3 + 1.5 * (Q3 - Q1)

  # 寻找异常点
  kk = df[(df > up_whisker) | (df < low_whisker)]
  data1 = pd.DataFrame({'id': kk.index, '异常值': kk})
  return data1


N = 100
result = np.random.normal(0, 1, N)
# result = np.random.randint(-65, 80, size=N) # 最小值,最大值,数量
mean, std = result.mean(), result.std(ddof=1) # 求均值和标准差

# 计算置信区间,这里的0.9是置信水平
conf_intveral = stats.norm.interval(0.9, loc=mean, scale=std) # 90%概率
print('置信区间:', conf_intveral)

x = np.arange(0, len(result), 1)

# 求异常值
outer = get_outer_data(result)
print(outer, type(outer))
x1 = outer.iloc[:, 0]
y1 = outer.iloc[:, 1]
plt.scatter(x1, y1, marker='x', color='r') # 所有离散点
plt.scatter(x, result, marker='.', color='g') # 异常点
plt.plot([0, len(result)], [conf_intveral[0], conf_intveral[0]])
plt.plot([0, len(result)], [conf_intveral[1], conf_intveral[1]])
plt.show()

python 生成正态分布数据,并绘图和解析

4、采样点离散图和概率图

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import pandas as pd
import time


print(time.strftime('%Y-%m-%D %H:%M:%S'))


# 根据均值、标准差,求指定范围的正态分布概率值
def _normfun(x, mu, sigma):
  pdf = np.exp(-((x - mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi))
  return pdf


# 求列表数据的异常点
def get_outer_data(data_list):
  df = pd.DataFrame(data_list, columns=['value'])
  df = df.iloc[:, 0]
  # 计算下四分位数和上四分位
  Q1 = df.quantile(q=0.25)
  Q3 = df.quantile(q=0.75)

  # 基于1.5倍的四分位差计算上下须对应的值
  low_whisker = Q1 - 1.5 * (Q3 - Q1)
  up_whisker = Q3 + 1.5 * (Q3 - Q1)

  # 寻找异常点
  kk = df[(df > up_whisker) | (df < low_whisker)]
  data1 = pd.DataFrame({'id': kk.index, '异常值': kk})
  return data1


N = 100
result = np.random.normal(0, 1, N)
# result = np.random.randint(-65, 80, size=N) # 最小值,最大值,数量
# result = [100]*100 # 取值全相同
# result = np.array(result)
mean, std = result.mean(), result.std(ddof=1) # 求均值和标准差
# 计算置信区间,这里的0.9是置信水平
if std == 0: # 如果所有值都相同即标准差为0则无法计算置信区间
  conf_intveral = [min(result)-1, max(result)+1]
else:
  conf_intveral = stats.norm.interval(0.9, loc=mean, scale=std) # 90%概率
# print('置信区间:', conf_intveral)
# 求异常值
outer = get_outer_data(result)
# 绘制离散图
fig = plt.figure()
fig.add_subplot(2, 1, 1)
plt.subplots_adjust(hspace=0.3)
x = np.arange(0, len(result), 1)
plt.scatter(x, result, marker='.', color='g') # 画所有离散点
plt.scatter(outer.iloc[:, 0], outer.iloc[:, 1], marker='x', color='r') # 画异常离散点
plt.plot([0, len(result)], [conf_intveral[0], conf_intveral[0]]) # 置信区间线条
plt.plot([0, len(result)], [conf_intveral[1], conf_intveral[1]]) # 置信区间线条
plt.text(0, conf_intveral[0], '{:.2f}'.format(conf_intveral[0])) # 置信区间数字显示
plt.text(0, conf_intveral[1], '{:.2f}'.format(conf_intveral[1])) # 置信区间数字显示
info = 'outer count:{}'.format(len(outer.iloc[:, 0]))
plt.text(min(x), max(result)-((max(result)-min(result)) / 2), info) # 异常点数显示
plt.xlabel('sample count')
plt.ylabel('value')
# 绘制概率图
if std != 0: # 如果所有取值都相同
  fig.add_subplot(2, 1, 2)
  x = np.arange(min(result), max(result), 0.1)
  y = _normfun(x, result.mean(), result.std())
  plt.plot(x, y) # 这里画出理论的正态分布概率曲线
  plt.hist(result, bins=10, rwidth=0.8, density=True) # bins个柱状图,宽度是rwidth(0~1),=1没有缝隙
  info = 'mean:{:.2f}\nstd:{:.2f}\nmode num:{:.2f}'.format(mean, std, np.median(result))
  plt.text(min(x), max(y) / 2, info)
  plt.xlabel('value')
  plt.ylabel('Probability')
else:
  fig.add_subplot(2, 1, 2)
  info = 'non-normal distribution!!\nmean:{:.2f}\nstd:{:.2f}\nmode num:{:.2f}'.format(mean, std, np.median(result))
  plt.text(0.5, 0.5, info)
  plt.xlabel('value')
  plt.ylabel('Probability')
plt.savefig('./distribution.jpg')
plt.show()

print(time.strftime('%Y-%m-%D %H:%M:%S'))

python 生成正态分布数据,并绘图和解析

以上就是python 生成正态分布数据,并绘图和解析的详细内容,更多关于python 正态分布的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
django批量导入xml数据
Oct 16 Python
Python 文件处理注意事项总结
Apr 10 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
python画一个玫瑰和一个爱心
Aug 18 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
详解python中的数据类型和控制流
Aug 08 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
Python networkx包的实现
Feb 14 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
python statsmodel的使用
Dec 21 #Python
Python 实现集合Set的示例
Dec 21 #Python
Python 实现二叉查找树的示例代码
Dec 21 #Python
如何利用Python matplotlib绘制雷达图
Dec 21 #Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 #Python
python opencv肤色检测的实现示例
Dec 21 #Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 #Python
You might like
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
用穿越火线快速入门php面向对象
2012/02/22 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
禁止刷新,回退的JS
2006/11/25 Javascript
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
js实现随机点名小功能
2017/08/17 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
python三元运算符实现方法
2013/12/17 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
Pytorch之contiguous的用法
2019/12/31 Python
python deque模块简单使用代码实例
2020/03/12 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
Python如何读写字节数据
2020/08/05 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
室内拓展活动方案
2014/02/13 职场文书
工作迟到检讨书
2014/02/21 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书