关于Lets-Plot直方图中..density..计算结果不符的技术咨询
密度直方图计算结果不一致问题
我对密度直方图的理解是,第i个区间的密度计算方式为:
- 区间频数为fᵢ
- 样本量为n
- 区间宽度为w
密度dᵢ = (fᵢ / n)/w
在本次测试中,频数直方图和概率直方图的结果符合预期,但密度直方图不符。例如第1个区间频数为3,当n=20、w=0.1时,我预期密度为0.75(np.histogram的计算结果),但Lets-Plot绘制的结果显示为0.84。
请问是我对密度的理解有误、实现方式不正确,还是工具存在问题?
以下是复现问题的代码,使用的Lets-Plot版本为4.3.3:
import numpy as np import pandas as pd from lets_plot import * LetsPlot.setup_html() rng = np.random.default_rng(12345) test = rng.normal(0, 1, (20, 2)) df = pd.DataFrame(test, columns=['A', 'B']) plot_1 = ( ggplot(df, aes(x='A')) + geom_histogram(binwidth=.2, fill='pink') + ggtitle('Frequency') ) plot_2 = ( ggplot(df, aes(x='A')) + geom_histogram(aes(y='..density..'),binwidth=.2, fill='pink') + ggtitle('Density') ) plot_3 = ( ggplot(df, aes(x='A')) + geom_histogram(aes(weight=np.ones_like(df.A) / len(df.A)),binwidth=.2, fill='pink') + ggtitle('Probability') ) # 使用np.histogram计算相同分布,指定合适的分箱: bins = np.arange(-1.56, 2.5, .2) freq, edges = np.histogram(df.A, bins=bins) print('Numpy计算的分箱频数:') print(f'{'分箱':^5s}{'频数':^5s}') for i,f in enumerate(freq): print(f'{i+1:^5d}{f:^5d}') print('') plot_1.show() plot_3.show() dens, edges = np.histogram(df.A, density='True', bins=bins) print('Numpy计算的分箱密度:') print(f'{'分箱':^5s}{'密度':^9s}') for i,d in enumerate(dens): print(f'{i+1:^5d}{d:^9.2f}') print('') plot_2.show()



内容的提问来源于stack exchange,提问作者RobertM
相关产品推荐
相关产品推荐

