数据可视化-12. 直方图
直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。它是一个连续变量(定量变量)的概率分布的估计,由卡尔·皮尔逊(Karl Pearson)首先引入。
目录
1. 直方图介绍
直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。它是一个连续变量(定量变量)的概率分布的估计,由卡尔·皮尔逊(Karl Pearson)首先引入。
2. 直方图的基本构成
为了构建直方图,首先需要将数据的范围分段,即将整个数据范围分成一系列间隔,然后计算每个间隔中有多少数据点。这些间隔通常是(但不是必须的)相等的大小,并且必须是相邻的。直方图中的每个矩形的高度表示该间隔中的数据点的数量或频率。
下面是直方图的基本构成部分:
-
X轴(横轴):数据的范围(分组),即数据被分成若干个区间(称为“组”或“箱”)并且每个区间的宽度通常是均等的,称为组距。
-
Y轴(纵轴):频数或频率,每个区间对应的高度表示落入该区间的数据点个数(频数)或数据比例(频率)。
-
矩形条:表示频数或频率,条形的高度越高,说明数据在该区间内出现的次数越多。
3. 直方图的解读
直方图可能具有多样形态,能揭示数据中的模式和不规则性:
- 识别数据是正态分布、偏态分布还是双峰分布等。
- 通过观察较高或较低频率的区间,识别是否存在异常值。
- 可以帮助分析数据的概率密度函数。
- 判断数据的集中趋势和离散程度。
例如直方图的顶峰可能偏向左侧或右侧;当直方图中出现了两个峰,可能是由于观测值来自两个总体、两个分布的数据混合在一起造成的。当直方图出现凹凸不平的形状,可能是由于作图时数据分组太多,测量仪器误差过大或观测数据不准确等造成的。
4. 直方图的适用场景
- 摄影:在摄影领域,直方图被用来检查照片的曝光情况。通过观察直方图的形状和分布,摄影师可以判断照片的亮度是否合适,以及是否需要调整曝光参数。
- 过程稳定性监控:在质量控制领域,直方图常被用来监控生产过程的稳定性。通过观察直方图的形状和变化,可以判断生产过程是否处于受控状态,从而及时采取措施进行改进。
- 质量改进评估:在质量改进项目中,可以使用直方图来评估改进措施的效果,比如改进后的产品质量是否有所提高,异常值是否有所减少等。
- 市场分布分析:在经济学和金融领域,可以使用直方图来分析市场数据的分布情况,比如股票价格、交易量等数据的分布特征。
- 数据分析:直方图是常用的数据可视化工具之一,它可以帮助分析人员理解数据的分布特征、识别异常值和偏斜情况,以及评估数据的质量。
5. 直方图的局限性
5.1 分箱选择影响结果
分箱过少:可能导致重要的分布细节丢失。分箱过多:可能导致噪声过多,使分布不清晰。这个问题可以通过调整分箱数或使用优化算法(如 Freedman-Diaconis 规则)选择适当的分箱。
5.2 只能处理数值型连续数据
5.3 不适合小样本数据
当数据量较小时,直方图可能会因为频数过少而无法准确反映数据的分布特征
5.4 难以比较多个数据集
多个数据集的直方图难以直接叠加,可能导致对比不清晰。此时可使用分组柱状图、堆叠直方图或小提琴图等其他图形形式。
5.5 对异常值不敏感
由于直方图关注频数分布,孤立的异常值可能被隐藏在宽区间中而未被察觉。此时可结合箱线图等图表共同分析。
5.6 不提供动态或交互式分析
传统静态直方图无法动态调整分箱或交互分析。此时可以使用交互式工具(如 Dash 或 Plotly)制作动态直方图以增强可视化效果。
6. 直方图的代码实现
6.1 Python 代码实现
import dash
from dash import html, dcc, Input, Output
import plotly.graph_objects as go
import dash_bootstrap_components as dbc
import numpy as np
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
def create_histogram(data, bins=30, color='#66B3FF'):
"""
创建一个功能丰富的直方图
:param data: 数据集
:param bins: bin 的数量
:param color: 直方图的颜色
:return: 直方图图形对象
"""
# 计算密度曲线
density = np.histogram(data, bins=bins, density=True)
bin_centers = 0.5 * (density[1][1:] + density[1][:-1])
density_curve = np.exp(-0.5 * ((bin_centers - np.mean(data)) / np.std(data))**2)
density_curve = density_curve / (np.std(data) * np.sqrt(2 * np.pi))
# 创建直方图
hist_fig = go.Figure()
# 添加直方图
hist_fig.add_trace(go.Histogram(
x=data,
nbinsx=bins,
marker_color=color,
opacity=0.75,
name='直方图'
))
# 添加密度曲线
hist_fig.add_trace(go.Scatter(
x=bin_centers,
y=density_curve,
mode='lines',
line=dict(color='red', width=2),
name='密度曲线'
))
# 更新布局
hist_fig.update_layout(
title='功能丰富的直方图',
xaxis_title='值',
yaxis_title='频率',
template='plotly_white',
showlegend=True,
margin=dict(l=40, r=40, t=40, b=40),
transition=dict(duration=500) # 添加动画效果
)
return hist_fig
# 示例数据
data = np.random.normal(loc=0, scale=1, size=1000)
# 创建直方图
histogram_fig = create_histogram(data, bins=40)
app.layout = html.Div([
# 图表展示区域
html.Div([
html.H3("数据可视化展示--面积图", className="text-center mt-4 mb-3"),
dbc.Row([
dbc.Col(dcc.Graph(figure=histogram_fig), width=4)
], className="mb-4"),
], style={"backgroundColor": "#f0fff4", "padding": "20px", "borderRadius": "10px"}),
html.H3("直方图展示", className="text-center mt-4 mb-3"),
dcc.Graph(figure=histogram_fig)
], style={"padding": "20px"})
if __name__ == "__main__":
app.run_server(debug=True, port=8051)
6.2 直方图效果展示
更多推荐
所有评论(0)