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 相关文章推荐
Python文档生成工具pydoc使用介绍
Jun 02 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
flask入门之文件上传与邮件发送示例
Jul 18 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
Python的UTC时间转换讲解
Feb 26 Python
Python Django基础二之URL路由系统
Jul 18 Python
python3的数据类型及数据类型转换实例详解
Aug 20 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
python boto和boto3操作bucket的示例
Oct 30 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 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
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
jQuery实现列表的全选功能
2015/03/18 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
JS模拟实现京东快递单号查询
2020/11/30 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
Python partial函数原理及用法解析
2019/12/11 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
python实现猜拳游戏项目
2020/11/30 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
女大学生自我鉴定
2013/12/09 职场文书
自荐信的格式
2014/03/10 职场文书
后备干部推荐材料
2014/12/24 职场文书
协议书范文
2015/01/27 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫