目录

1. 直方图介绍

2. 直方图的基本构成

3. 直方图的解读

4. 直方图的适用场景

5. 直方图的局限性

5.1 分箱选择影响结果

5.2 只能处理数值型连续数据

5.3 不适合小样本数据

5.4 难以比较多个数据集

5.5 对异常值不敏感

5.6 不提供动态或交互式分析

6. 直方图的代码实现

6.1 Python 代码实现

6.2 直方图效果展示


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 直方图效果展示

更多推荐