1

海博恩

  1. 导入库和加载数据
import pandas as pd

import seaborn as sns
from matplotlib import pyplot as plt

sns.set_theme(style="whitegrid", palette="muted") # Set2, muted, pastel, colorblind

# Load the data
import plotly.express as px
df = px.data.gapminder()
df.head()
  1. 显示箱线图和四分位数
sns.boxplot(
    data=df[df.year==2007],
    x='lifeExp',
    orient="h",
);

print('q1', df[df.year==2007]['lifeExp'].quantile(.25))
print('median', df[df.year==2007]['lifeExp'].median())
print('q3', df[df.year==2007]['lifeExp'].quantile(.75))

plt.show()

情节

  1. 显示箱线图和四分位数
fig_box = px.box(df[df.year==2007], x='lifeExp', orientation='h',
                 width=500, height=300)
fig_box.show()

为什么四分位数不同?

4

2 回答 2

1

我没有足够的能力给你解释统计数据,但似乎是25%和75%四分位数的补全方法不同造成的。简单来说,pandas(seaborn,numpy) 和 plotly 默认有不同的计算方式。

import pandas as pd
x = df[df.year==2007]['lifeExp'].values
pd.DataFrame(pd.Series(x.ravel()).describe()).transpose()
数数 意思是 性病 分钟 25% 50% 75% 最大限度
0 142 67.0074 12.073 39.613 57.1602 71.9355 76.4133 82.603

pd.Series.quantile 看到这个

插值{'linear', 'lower', 'higher', 'midpoint', 'nearest'} 此可选参数指定要使用的插值方法,当所需的分位数位于两个数据点 i 和 j 之间时:

  • 线性:i + (j - i) * fraction,其中 fraction 是由 i 和 j 包围的索引的小数部分。

  • 较低:一。

  • 更高:j。

  • 最近的:i 或 j 以最近的为准。

  • 中点:(i + j) / 2。

pd.Series(x.ravel()).quantile(q=0.75, interpolation='higher')
76.423 <- plotly.box.Q3

pd.Series(x.ravel()).quantile(q=0.25, interpolation='lower')
56.867 <- plotly.box.Q1

在此处输入图像描述

于 2021-08-22T03:59:24.413 回答
0

r-beginners 已经回答了您的主要问题,但次要问题似乎仍未得到回答:

我怎样才能让他们向我展示相同的结果?

px.box具有三个用于计算四分位数的内置选项:

['linear', 'exclusive', 'inclusive']

如果您有预先计算的值,或者如果您需要使用与提供的算法不同的算法,则可以为您的px.box图形指定它们,如下所示:

fig.update_traces(q1=[df['lifeExp'].quantile(.25)],
                  median=[df['lifeExp'].median()],
                  q3=[df['lifeExp'].quantile(.75)],
                  lowerfence=[df['lifeExp'].min()],
                  upperfence=[df['lifeExp'].max()],
                 )

阴谋

在此处输入图像描述

但请注意,如果您尝试仅手动设置上述其中一项,您可能会遇到一些不正常的行为。在这种情况下,绘图的基础计算似乎可能会恢复为默认值。如果我发现更多信息,我会回复你。

完整代码:

import plotly.graph_objects as go

import plotly.express as px
df = px.data.gapminder()

df = df[df.year==2007]#.tail(8)

fig = px.box(df, x = 'lifeExp', orientation = 'h')

fig.update_traces(q1=[df['lifeExp'].quantile(.25)],
                  median=[df['lifeExp'].median()],
                  q3=[df['lifeExp'].quantile(.75)],
                  lowerfence=[df['lifeExp'].min()],
                  upperfence=[df['lifeExp'].max()],
                 )

fig.show()
于 2021-08-22T22:21:48.413 回答