目录
箱线图(Boxplot),又称为盒须图,是一种用于统计数据分布分析的图表。它可以直观地展示数据的分布特征、集中趋势和离散程度,并能有效识别异常值。
1. 箱线图的构成
箱线图由以下几个部分组成:
- 箱体(Box):表示数据分布的中间部分,通常从第一四分位数(Q1)到第三四分位数(Q3)。
- Q1(第25百分位数):表示25%的数据小于此值。
- Q3(第75百分位数):表示75%的数据小于此值。
- 箱体的高度(或宽度,取决于方向)反映了四分位距(IQR = Q3 - Q1),即中间50%数据的范围。
- 中位数(Median):箱体内的一条线,表示数据的中间值。
- 须(Whiskers):
- 须的长度通常延伸至非异常值的范围。
- 上须的最大值为
Q3 + 1.5 × IQR
,下须的最小值为Q1 - 1.5 × IQR
。
- 异常值(Outliers):
- 在须范围外的数据点,被单独标记为圆点或其他符号,表示可能的异常数据。
2. 解读箱线图
以一个单个箱线图为例:
- 箱体位置:如果箱体位于图表的上半部分,说明数据整体偏高;反之偏低。
- 箱体宽窄:箱体越窄,说明中间50%的数据分布越集中。
- 中位数的位置:如果中位数偏向箱体一侧,说明数据分布不对称。
- 须的长度:长须表明数据有较大的变化范围或离散程度。
- 异常值的数量和位置:离须越远的点,异常程度越高。
多个箱线图在一起时候,
- 组间对比:可以比较不同组数据的分布和特征。
3. 箱线图的适用场景
- 数据分布的初步探索
- 数据质量检查(例如检测异常值)
- 比较多个数据组的特征,例如实验组与对照组的结果
- 分析指标的趋势和变化
4. 箱线图的局限性
- 仅展示关键的统计特征,隐藏了数据的具体分布形态(如双峰分布)。
- 如果数据量较少,可能不适合使用箱线图。
- 异常值的定义较为固定(1.5 × IQR以外),对特殊情况下的异常值判断可能不够灵活。
- 箱线图在某些情况下可能不适用。例如,当数据中存在超大或超小异常值时,箱线图可能呈现扁平形态或只剩一线,此时不适合使用箱线图;当数据量较小时,箱线图的统计能力可能不足;此外,箱线图只能反映数据的一维分布,无法展示多个变量之间的关系。
5. 箱线图的代码实现
5.1 Python 代码
import dash
from dash import html, dcc
import plotly.graph_objects as go
import dash_bootstrap_components as dbc
import numpy as np
def create_advanced_charts():
"""
创建高级图表示例
返回一个包含多个图表的列表
"""
# 1. 箱线图
#np.random.normal(loc=0.0, scale=1.0, size=None),其作用:返回一组符合高斯分布的概率密度随机数。
# 其中,loc为高斯概率分布的均值;scale为高斯概率分布的标准差;size为输出的shape,默认为None,只输出一个值。
box_data = [
np.random.normal(0, 1, 100),
np.random.normal(2, 1.2, 100),
np.random.normal(-1, 1.5, 100)
]
print(max(box_data[0]),min(box_data[0]))
print(max(box_data[1]),min(box_data[1]))
print(max(box_data[2]),min(box_data[2]))
box_fig = go.Figure()
box_fig.add_trace(go.Box(y=box_data[0], name="组A"))
box_fig.add_trace(go.Box(y=box_data[1], name="组B"))
box_fig.add_trace(go.Box(y=box_data[2], name="组C"))
box_fig.update_layout(
title='箱线图示例',
yaxis_title='数值',
template='plotly_white'
)
return(box_fig)
app = dash.Dash(__name__)
app.layout = html.Div([
html.Div([
html.H3("高级图表展示", className="text-center mt-4 mb-3"),
dbc.Row([
dbc.Col(dcc.Graph(figure=create_advanced_charts()), width=6)
], className="mb-4")
], style={"backgroundColor": "#fff0f4", "padding": "20px", "borderRadius": "10px"}),
])
if __name__ == "__main__":
app.run_server(debug=True, port=8051)