数据可视化 —— 直方图

一、前言

直方图(Histogram)是一种用柱状图形表示数据分布的统计图表,它将数据划分为连续的区间(称为"分箱"或"区间"),统计每个区间内的数据频数(或频率),并用柱形的高度直观展示数据分布情况。

二、常用场景

  1. 数据分布分析

    • 观察数据集中趋势(如集中在哪个区间)、离散程度(如是否对称、是否存在长尾)或异常值。

    • 例:分析某班级学生考试成绩的分布,判断是否接近正态分布。

  2. 图像处理

    • 分析图像像素的亮度或颜色分布,辅助调整对比度、曝光或均衡化。

    • 例:Photoshop 中的直方图可帮助摄影师优化照片的明暗细节。

  3. 质量控制

    • 监测生产过程中产品的规格(如零件尺寸)是否符合标准。

    • 例:统计工厂生产的螺丝长度是否集中在目标值附近。

  4. 市场研究

    • 分析用户行为数据(如购物金额、使用时长)的分布特征。

    • 例:统计电商用户的消费金额区间,识别主要消费群体。

  5. 自然科学

    • 研究实验数据的分布规律(如气温变化、生物特征测量)。

    • 例:统计某地区每日降雨量的分布,研究气候特征。

三、直方图的优势

  • 直观展示数据分布:快速识别数据是否对称、是否多峰、是否存在偏态。

  • 发现异常值:通过离群区间判断数据中的极端值。

  • 辅助决策:帮助调整数据处理策略(如是否需要数据分箱、归一化)。


示例

假设统计100人的月收入(单位:千元),直方图可能显示:

  • 区间0-5:10人

  • 区间5-10:35人

  • 区间10-15:40人

  • 区间15-20:15人

    由此可看出收入集中在5-15千元,呈近似正态分布。

通过直方图,复杂的数值分布规律变得一目了然。

四、基本使用

python 复制代码
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.style as ms

# 设置主题风格
# classic、fast、petroff10、seaborn-v0_8-colorblind
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='高二男生、女士各科平均成绩', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False

scores = []

'''
np.random.randint:NumPy 中生成随机整数的函数。
参数:0:最小值(包含该值)。
     100:最大值(不包含该值,实际生成的数是 0 ≤ 值 < 100)。
     50:生成的随机整数数量。'''
scores.append(np.random.randint(0, 100, 50))
scores.append(np.random.randint(0, 100, 50))

# stacked: 允许堆积,histtype:直方图类型
plt.hist(x=scores, bins=12, histtype='barstacked', stacked=True)
plt.show()

五、灰度直方图

应用场景

  • 对比度增强:如直方图均衡化,通过重新分布灰度值提升图像细节。

  • 图像分割:利用双峰直方图选取阈值,分离前景与背景。

  • 曝光评估:摄影中检查过曝(右侧溢出)或欠曝(左侧溢出)问题。

  • 图像分类:作为特征描述符辅助内容检索或分类。

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as ms

# 设置主题风格
#  classic、fast、petroff10、seaborn-v0_8-colorblind
ms.use('seaborn-v0_8-colorblind')
plt.figure(num=' ', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False


random_state = np.random.RandomState(19680801)
random_x = random_state.randn(10000)
plt.hist(random_x, bins=25, histtype='barstacked')
plt.show()

核心区别对比

特征 灰度直方图 正态分布图
数据来源 图像像素灰度值的统计 符合正态分布的随机变量模拟
形状决定因素 图像内容(亮度分布) 数学公式(μ和σ)
对称性 可能不对称(取决于图像) 严格对称
应用场景 图像质量分析、增强、分割等 概率统计、误差分析、自然现象建模

六、顾客类型的消费记录

数据

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as ms


ms.use('seaborn-v0_8-colorblind')
plt.figure(num='某餐厅顾客消费记录', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_excel('某餐厅顾客消费记录.xlsx')
df1 = df[df['顾客类型'] == '普通顾客']
df2 = df[df['顾客类型'] == '会员']
x = []
x.append(df1['消费金额(元)'])
x.append(df2['消费金额(元)'])

plt.title('某餐厅不同顾客消费记录直方图', fontsize=20, fontfamily='SimHei')
plt.xlabel('消费金额(元)', fontsize=16)
plt.ylabel('消费次数', fontsize=16)

# stacked: 允许堆积,histtype:直方图类型
plt.hist(x, bins=25, histtype='barstacked', stacked=True)

plt.legend(['普通顾客','会员',],shadow=True, fancybox=True)
plt.show()

七、不同分店的消费记录

python 复制代码
# 记录频率
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as ms

# 设置主题风格
#  classic、fast、petroff10、seaborn-v0_8-colorblind
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='某餐厅各分店消费记录', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_excel('某餐厅顾客消费记录.xlsx')
df1 = df[df['分店'] == '第一分店']
df2 = df[df['分店'] == '第二分店']
df3 = df[df['分店'] == '第三分店']
x = []
x.append(df1['消费金额(元)'])
x.append(df2['消费金额(元)'])
x.append(df3['消费金额(元)'])

plt.title('某餐厅不同分店消费记录直方图', fontsize=20, fontfamily='SimHei')
plt.xlabel('消费金额(元)', fontsize=16)
plt.ylabel('消费次数', fontsize=16)

# stacked: 允许堆积,histtype:直方图类型
plt.hist(x, bins=25, histtype='barstacked', stacked=True)

plt.legend(['第一分店','第二分店','第三分店',],shadow=True, fancybox=True)
plt.show()
相关推荐
查士丁尼·绵1 小时前
笔试-羊狼过河
python
摸鱼的老谭1 小时前
构建Agent该选Python还是Java ?
java·python·agent
鄃鳕2 小时前
python 字典 列表 类比c++【python】
c++·python
可触的未来,发芽的智生2 小时前
新奇特:黑猫警长的纳米世界,忆阻器与神经网络的智慧
javascript·人工智能·python·神经网络·架构
程序员三藏2 小时前
Jmeter接口测试与压力测试
自动化测试·软件测试·python·测试工具·jmeter·接口测试·压力测试
烛阴2 小时前
用 Python 揭秘 IP 地址背后的地理位置和信息
前端·python
大宝剑1702 小时前
python环境安装
开发语言·python
Element_南笙2 小时前
吴恩达新课程:Agentic AI(笔记2)
数据库·人工智能·笔记·python·深度学习·ui·自然语言处理
倔强青铜三3 小时前
苦练Python第69天:subprocess模块从入门到上瘾,手把手教你驯服系统命令!
人工智能·python·面试
倔强青铜三3 小时前
苦练 Python 第 68 天:并发狂飙!concurrent 模块让你 CPU 原地起飞
人工智能·python·面试