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

共 1470字,需浏览 3分钟

 ·

2020-12-25 04:18

这篇文章主要介绍了python 生成正态分布数据,并绘图和解析,帮助大家更好的利用python进行数据分析,感兴趣的朋友可以了解下

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

  1. import pandas as pd

  2. import numpy as np

  3. import matplotlib.pyplot as plt

  4.  

  5.  

  6. # 根据均值、标准差,求指定范围的正态分布概率值

  7. def normfun(x, mu, sigma):

  8. pdf = np.exp(-((- mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi))

  9. return pdf

  10.  

  11.  

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

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

  14. print(result)

  15.  

  16. = np.arange(min(result), max(result), 0.1)

  17. # 设定 y 轴,载入刚才的正态分布函数

  18. print(result.mean(), result.std())

  19. = normfun(x, result.mean(), result.std())

  20. plt.plot(x, y) # 这里画出理论的正态分布概率曲线

  21.  

  22. # 这里画出实际的参数概率与取值关系

  23. plt.hist(result, bins=10, rwidth=0.8, density=True) # bins个柱状图,宽度是rwidth(0~1),=1没有缝隙

  24. plt.title('distribution')

  25. plt.xlabel('temperature')

  26. plt.ylabel('probability')

  27. # 输出

  28. plt.show() # 最后图片的概率和不为1是因为正态分布是从负无穷到正无穷,这里指截取了数据最小值到最大值的分布

根据范围生成正态分布:

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

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

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

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

  1. import numpy as np

  2. from scipy import stats

  3.  

  4.  

  5. pts = 1000

  6. np.random.seed(28041990)

  7. = np.random.normal(0, 1, size=pts) # 生成1个正态分布,均值为0,标准差为1,100个点

  8. = np.random.normal(2, 1, size=pts) # 生成1个正态分布,均值为2,标准差为1, 100个点

  9. = np.concatenate((a, b)) # 把两个正态分布连接起来,所以理论上变成了非正态分布序列

  10. k2, p = stats.normaltest(x)

  11. alpha = 1e-3

  12. print("p = {:g}".format(p))

  13.  

  14.  

  15. # 原假设:x是一个正态分布

  16. if p < alpha: # null hypothesis: x comes from a normal distribution

  17. print("The null hypothesis can be rejected") # 原假设可被拒绝,即不是正态分布

  18. else:

  19. print("The null hypothesis cannot be rejected") # 原假设不可被拒绝,即使正态分布

3、求置信区间、异常值

  1. import numpy as np

  2. import matplotlib.pyplot as plt

  3. from scipy import stats

  4. import pandas as pd

  5.  

  6.  

  7. # 求列表数据的异常点

  8. def get_outer_data(data_list):

  9. df = pd.DataFrame(data_list, columns=['value'])

  10. df = df.iloc[:, 0]

  11. # 计算下四分位数和上四分位

  12. Q1 = df.quantile(q=0.25)

  13. Q3 = df.quantile(q=0.75)

  14.  

  15. # 基于1.5倍的四分位差计算上下须对应的值

  16. low_whisker = Q1 - 1.5 * (Q3 - Q1)

  17. up_whisker = Q3 + 1.5 * (Q3 - Q1)

  18.  

  19. # 寻找异常点

  20. kk = df[(df > up_whisker) | (df < low_whisker)]

  21. data1 = pd.DataFrame({'id': kk.index, '异常值': kk})

  22. return data1

  23.  

  24.  

  25. = 100

  26. result = np.random.normal(0, 1, N)

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

  28. mean, std = result.mean(), result.std(ddof=1) # 求均值和标准差

  29.  

  30. # 计算置信区间,这里的0.9是置信水平

  31. conf_intveral = stats.norm.interval(0.9, loc=mean, scale=std) # 90%概率

  32. print('置信区间:', conf_intveral)

  33.  

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

  35.  

  36. # 求异常值

  37. outer = get_outer_data(result)

  38. print(outer, type(outer))

  39. x1 = outer.iloc[:, 0]

  40. y1 = outer.iloc[:, 1]

  41. plt.scatter(x1, y1, marker='x', color='r') # 所有离散点

  42. plt.scatter(x, result, marker='.', color='g') # 异常点

  43. plt.plot([0, len(result)], [conf_intveral[0], conf_intveral[0]])

  44. plt.plot([0, len(result)], [conf_intveral[1], conf_intveral[1]])

  45. plt.show()

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

  1. import numpy as np

  2. import matplotlib.pyplot as plt

  3. from scipy import stats

  4. import pandas as pd

  5. import time

  6.  

  7.  

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

  9.  

  10.  

  11. # 根据均值、标准差,求指定范围的正态分布概率值

  12. def _normfun(x, mu, sigma):

  13. pdf = np.exp(-((- mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi))

  14. return pdf

  15.  

  16.  

  17. # 求列表数据的异常点

  18. def get_outer_data(data_list):

  19. df = pd.DataFrame(data_list, columns=['value'])

  20. df = df.iloc[:, 0]

  21. # 计算下四分位数和上四分位

  22. Q1 = df.quantile(q=0.25)

  23. Q3 = df.quantile(q=0.75)

  24.  

  25. # 基于1.5倍的四分位差计算上下须对应的值

  26. low_whisker = Q1 - 1.5 * (Q3 - Q1)

  27. up_whisker = Q3 + 1.5 * (Q3 - Q1)

  28.  

  29. # 寻找异常点

  30. kk = df[(df > up_whisker) | (df < low_whisker)]

  31. data1 = pd.DataFrame({'id': kk.index, '异常值': kk})

  32. return data1

  33.  

  34.  

  35. = 100

  36. result = np.random.normal(0, 1, N)

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

  38. # result = [100]*100 # 取值全相同

  39. # result = np.array(result)

  40. mean, std = result.mean(), result.std(ddof=1) # 求均值和标准差

  41. # 计算置信区间,这里的0.9是置信水平

  42. if std == 0: # 如果所有值都相同即标准差为0则无法计算置信区间

  43. conf_intveral = [min(result)-1, max(result)+1]

  44. else:

  45. conf_intveral = stats.norm.interval(0.9, loc=mean, scale=std) # 90%概率

  46. # print('置信区间:', conf_intveral)

  47. # 求异常值

  48. outer = get_outer_data(result)

  49. # 绘制离散图

  50. fig = plt.figure()

  51. fig.add_subplot(2, 1, 1)

  52. plt.subplots_adjust(hspace=0.3)

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

  54. plt.scatter(x, result, marker='.', color='g') # 画所有离散点

  55. plt.scatter(outer.iloc[:, 0], outer.iloc[:, 1], marker='x', color='r') # 画异常离散点

  56. plt.plot([0, len(result)], [conf_intveral[0], conf_intveral[0]]) # 置信区间线条

  57. plt.plot([0, len(result)], [conf_intveral[1], conf_intveral[1]]) # 置信区间线条

  58. plt.text(0, conf_intveral[0], '{:.2f}'.format(conf_intveral[0])) # 置信区间数字显示

  59. plt.text(0, conf_intveral[1], '{:.2f}'.format(conf_intveral[1])) # 置信区间数字显示

  60. info = 'outer count:{}'.format(len(outer.iloc[:, 0]))

  61. plt.text(min(x), max(result)-((max(result)-min(result)) / 2), info) # 异常点数显示

  62. plt.xlabel('sample count')

  63. plt.ylabel('value')

  64. # 绘制概率图

  65. if std != 0: # 如果所有取值都相同

  66. fig.add_subplot(2, 1, 2)

  67. = np.arange(min(result), max(result), 0.1)

  68. = _normfun(x, result.mean(), result.std())

  69. plt.plot(x, y) # 这里画出理论的正态分布概率曲线

  70. plt.hist(result, bins=10, rwidth=0.8, density=True) # bins个柱状图,宽度是rwidth(0~1),=1没有缝隙

  71. info = 'mean:{:.2f}\nstd:{:.2f}\nmode num:{:.2f}'.format(mean, std, np.median(result))

  72. plt.text(min(x), max(y) / 2, info)

  73. plt.xlabel('value')

  74. plt.ylabel('Probability')

  75. else:

  76. fig.add_subplot(2, 1, 2)

  77. info = 'non-normal distribution!!\nmean:{:.2f}\nstd:{:.2f}\nmode num:{:.2f}'.format(mean, std, np.median(result))

  78. plt.text(0.5, 0.5, info)

  79. plt.xlabel('value')

  80. plt.ylabel('Probability')

  81. plt.savefig('./distribution.jpg')

  82. plt.show()

  83.  

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

以上就是python 生成正态分布数据,并绘图和解析的详细内容

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

万水千山总是情,点个【在看】行不行

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜



浏览 113
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报