尽管均值、中位数和标准差等数值概括量能提供关于集中趋势和离散度的精确数值,但它们未能完全展现变量分布的形态。数据是集中在均值附近,还是分散开来?是对称的,还是偏向一侧?是否存在多个峰值?为了回答这些问题,我们转向可视化,而用于了解单一数值变量分布的主要工具就是直方图。直方图将数值分组到“箱体”或“区间”中,然后绘制落在每个箱体中的观测值的频率(计数)。水平轴表示变量的数值范围,被划分为这些箱体,而垂直轴表示每个箱体中观测值的频率或密度。这形成了一个条形图,提供了对潜在概率分布的直观近似表示。理解箱体箱体的选择很重要。箱体的数量(或等效地,每个箱体的宽度)能显著影响直方图的外观以及我们从中获得的认识。箱体过少: 可能过于简化分布,隐藏多峰或间隙等重要细节。数据可能显示为一个大块。箱体过多: 可能产生噪点较多的图表,波动会遮蔽整体形态。每个箱体可能只包含少量观测值,使分布看起来锯齿状且不规则。虽然均值、中位数和标准差等数值概括提供了关于集中趋势和离散程度的精确值,但它们无法完全捕捉变量分布的形态。数据是集中在均值附近,还是广泛分散?它是对称的,还是偏向一侧?是否存在多个峰值?为了回答这些问题,需要借助可视化方法,而用于理解单个数值变量分布的主要工具是直方图。在Python中创建直方图我们来看看如何使用流行的Python库生成直方图。我们假设你有一个名为df的Pandas DataFrame,并且对一个名为'age'的数值列感兴趣。使用Pandas: Pandas DataFrames有一个内置的.hist()方法,其底层使用Matplotlib。import pandas as pd import matplotlib.pyplot as plt import numpy as np # 创建一个示例 DataFrame,其中包含 'student_heights'(学生身高)数据 data = {'student_heights': np.random.normal(175, 10, 1000)} # 正态分布,均值为 175cm df_students = pd.DataFrame(data) # 使用更具描述性的 DataFrame 和列名 df_students['student_heights'].hist(bins=15, grid=False, figsize=(8, 5)) plt.title('学生身高分布') plt.xlabel('身高 (cm)') plt.ylabel('频率') plt.show()Image 12 使用Matplotlib: 你可以直接使用Matplotlib以获得更多控制。import matplotlib.pyplot as plt import pandas as pd import numpy as np # 创建一个示例 DataFrame,其中包含 'exam_scores'(考试分数)数据 data = {'exam_scores': np.random.normal(75, 15, 500)} # 正态分布,均值为 75 df_class = pd.DataFrame(data) # 使用更具描述性的 DataFrame 和列名 plt.figure(figsize=(8, 5)) plt.hist(df_class['exam_scores'].dropna(), bins=20, color='#339af0', edgecolor='black') plt.title('考试分数分布') plt.xlabel('考试分数') plt.ylabel('频率') plt.grid(axis='y', alpha=0.75) plt.show()Image 13 请注意使用.dropna()来处理绘图前可能存在的缺失值。使用Seaborn: Seaborn通常能生成更美观的图表,并与Pandas DataFrame很好地集成。histplot函数功能多。import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np # 创建一个示例 DataFrame,其中包含 'employee_ages'(员工年龄)数据 data = {'employee_ages': np.random.randint(20, 60, 200)} # 20到60岁之间的均匀分布 df_employees = pd.DataFrame(data) # 使用更具描述性的 DataFrame 和列名 plt.figure(figsize=(8, 5)) sns.histplot(data=df_employees, x='employee_ages', bins=25, kde=True, color='#20c997') plt.title('带密度曲线的员工年龄分布') plt.xlabel('年龄 (岁)') plt.ylabel('频率') plt.show()Image 14 添加kde=True会叠加一个核密度估计,它提供了分布形态的平滑表示。这里是一个使用Plotly进行交互式网页可视化的例子:{ "layout": { "title": "样本数值数据的分布", "xaxis": { "title": "数值" }, "yaxis": { "title": "频率" }, "bargap": 0.1, "plot_bgcolor": "#e9ecef" }, "data": [ { "type": "histogram", "x": [22, 45, 30, 51, 28, 33, 40, 36, 25, 30, 48, 31, 39, 42, 29, 35, 37, 41, 26, 34, 55, 61, 38, 44, 32], "marker": { "color": "#4dabf7", "line": { "color": "#1c7ed6", "width": 1 } } } ] }显示样本数值数据集频率分布的直方图。解读直方图查看直方图时,请注意以下特征:形态:对称: 分布在中心附近大致呈镜像对称(例如,钟形或正态分布)。均值、中位数和众数通常彼此接近。右偏(正偏): 右侧的尾部更长。大多数数据点集中在左侧。通常,均值 > 中位数 > 众数。左偏(负偏): 左侧的尾部更长。大多数数据点集中在右侧。通常,均值 < 中位数 < 众数。均匀: 所有箱体频率大致相同。分布看起来是平坦的。模态(峰值):单峰: 一个明显的峰值。双峰: 两个明显的峰值。这可能表示数据中存在两个不同的子组。多峰: 超过两个明显的峰值。离散度(分散):数据是涵盖了宽广的范围,还是紧密聚集?这在视觉上与之前计算的方差和标准差相关。更宽的直方图表明更大的离散度。异常值和间隙:寻找远离数据主体部分的箱体。这些可能代表潜在的异常值。箱体之间存在的显著间隙也提供信息,可能表明测量问题或不同的总体。直方图提供了即时视觉概括,补充了数值统计量。它们帮助你快速掌握数值变量的性质,辨别偏度或异常值等潜在问题,并指导后续分析步骤。例如,强偏度可能暗示未来考虑数据转换。