【问题标题】:PDF plotting concernPDF 绘图问题
【发布时间】:2018-08-02 18:42:59
【问题描述】:

我尝试了以下手动方法:

dict = {'id': ['a','b','c','d'], 'testers_time': [10, 30, 15, None], 'stage_1_to_2_time': [30, None, 30, None], 'activated_time' : [40, None, 45, None],'stage_2_to_3_time' : [30, None, None, None],'engaged_time' : [70, None, None, None]} 
df = pd.DataFrame(dict, columns=['id', 'testers_time', 'stage_1_to_2_time', 'activated_time', 'stage_2_to_3_time', 'engaged_time'])

df= df.dropna(subset=['testers_time']).sort_values('testers_time')

prob = df['testers_time'].value_counts(normalize=True)
print(prob)
#0.333333,  0.333333,  0.333333
plt.plot(df['testers_time'], prob, marker='.', linestyle='-') 

plt.show()

我尝试了在 stackoverflow 上找到的以下方法:

dict = {'id': ['a','b','c','d'], 'testers_time': [10, 30, 15, None], 'stage_1_to_2_time': [30, None, 30, None], 'activated_time' : [40, None, 45, None],'stage_2_to_3_time' : [30, None, None, None],'engaged_time' : [70, None, None, None]} 
df = pd.DataFrame(dict, columns=['id', 'testers_time', 'stage_1_to_2_time', 'activated_time', 'stage_2_to_3_time', 'engaged_time'])

df= df.dropna(subset=['testers_time']).sort_values('testers_time')

fit = stats.norm.pdf(df['testers_time'], np.mean(df['testers_time']), np.std(df['testers_time']))  
print(fit)
#0.02902547,  0.04346777,  0.01829513]
plt.plot(df['testers_time'], fit, marker='.', linestyle='-')
plt.hist(df['testers_time'], normed='true')      

plt.show()

如您所见,我得到了完全不同的值 - 概率对于 #1 是正确的,但对于 #2 它们不是正确的(它们加起来也不等于 100%),并且直方图的 y 轴 (%)是基于 6 个 bin,而不是 3 个。

你能解释一下我如何才能得到 #2 的正确概率吗?

【问题讨论】:

  • 第一种方法给你一个概率。第二个给你一个概率 density - 因此命名为probability density 函数(pdf)。因此两者都是正确的,它们只是表现出不同的东西。
  • @ImportanceOfBeingErnest 那么第一个是概率分布函数吗?还是有别的名字?
  • @ImportanceOfBeingErnest 如果第二个是 PDF 那么为什么它不从 0 开始?
  • 这将是一个概率质量函数。
  • 您自己选择评估此函数的值。如果您包含任何极值,那么此时它将为 0。

标签: python matplotlib scipy


【解决方案1】:

第一种方法为您提供概率质量函数。第二个给你一个概率密度 - 因此名称概率密度函数(pdf)。因此,两者都是正确的,它们只是显示了一些不同的东西。

如果您在更大的范围内评估 pdf(例如,标准偏差的 10 倍),它将看起来很像预期的高斯曲线。

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

dict = {'id': ['a','b','c','d'], 'testers_time': [10, 30, 15, None], 'stage_1_to_2_time': [30, None, 30, None], 'activated_time' : [40, None, 45, None],'stage_2_to_3_time' : [30, None, None, None],'engaged_time' : [70, None, None, None]} 
df = pd.DataFrame(dict, columns=['id', 'testers_time', 'stage_1_to_2_time', 'activated_time', 'stage_2_to_3_time', 'engaged_time'])

df= df.dropna(subset=['testers_time']).sort_values('testers_time')

mean = np.mean(df['testers_time'])
std = np.std(df['testers_time'])
x = np.linspace(mean - 5*std, mean + 5*std)

fit = stats.norm.pdf(x, mean, std)  
print(fit)

plt.plot(x, fit, marker='.', linestyle='-')
plt.hist(df['testers_time'], normed='true')      

plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多