Python
Pandas 直方图: 可视化数据的初学者指南

Pandas 直方图: 可视化数据的初学者指南

MoeNagy Dev

Pandas 直方图: 可视化数据分布

了解 Pandas 直方图

Pandas 直方图简介

Pandas 是 Python 中一个强大的数据操作和分析库,它提供了一种方便的方式来创建直方图,这是可视化数据分布的重要工具。直方图是数据集频率分布的图形表示,可以让您洞察数据的潜在模式和特征。

Pandas 直方图的关键特性和优势

Pandas 直方图提供了几个关键特性和优势:

  1. 直观的数据探索: 直方图可以帮助您快速识别数据的形状、中心和分散程度,是探索性数据分析的有价值工具。
  2. 异常值检测: 直方图可以揭示异常值的存在,即落在分布典型范围之外的数据点。
  3. 分布比较: 通过叠加多个直方图,您可以直观地比较不同数据集或数据子组的分布。
  4. 统计推断: 直方图可用于评估统计检验的假设,如正态性,并支持假设检验。
  5. 定制和灵活性: Pandas 直方图可高度定制,允许您调整柱子数量、柱子大小、颜色等视觉元素,以满足您的特定需求。

创建 Pandas 直方图

导入 Pandas 和 Matplotlib

要创建 Pandas 直方图,您需要导入必要的库。

import pandas as pd
import matplotlib.pyplot as plt

生成基本直方图

让我们从使用 Pandas 的 hist() 函数创建一个简单的直方图开始:

# 加载样本数据集
data = pd.DataFrame({'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70]})
 
# 创建基本直方图
data['Age'].hist()
plt.show()

这段代码将生成数据集中 'Age' 列的直方图,显示年龄的分布情况。

自定义直方图外观

Pandas 直方图提供了各种自定义选项来增强可视化效果。

设置柱子数量

您可以使用 bins 参数控制直方图中的柱子数量:

data['Age'].hist(bins=6)
plt.show()

这将创建一个有 6 个柱子的直方图。

调整柱子大小

要调整柱子大小,可以将柱子边界列表传递给 bins 参数:

bins = [20, 30, 40, 50, 60, 70, 80]
data['Age'].hist(bins=bins)
plt.show()

这将创建一个柱子范围从 20 到 80,步长为 10 的直方图。

更改直方图颜色和样式

您可以使用 Matplotlib 的样式选项来自定义直方图的颜色和样式:

# 设置直方图颜色
data['Age'].hist(color='green')
plt.show()
 
# 更改直方图样式
plt.style.use('seaborn')
data['Age'].hist()
plt.show()

这些示例演示了如何将直方图颜色更改为绿色,以及应用 'seaborn' 样式到绘图。

探索直方图属性

Pandas 直方图提供了对各种统计属性的访问,允许您深入了解数据。

访问直方图统计信息

您可以使用以下属性检索柱子边界、柱子计数和柱子中心:

# 创建直方图
hist = data['Age'].hist()
 
# 访问柱子边界
bin_edges = hist.patches[0].get_bbox().get_points()[:, 0]
 
# 访问柱子计数
bin_counts = hist.patches[0].get_height()
```# 访问bin中心
bin_centers = 0.5 * (bin_edges[:-1] + bin_edges[1:])
 
print(f"Bin Edges: {bin_edges}")
print(f"Bin Counts: {bin_counts}")
print(f"Bin Centers: {bin_centers}")

这段代码演示了如何从直方图对象中提取bin边缘、bin计数和bin中心。

合并直方图

Pandas直方图可以以各种方式组合,以实现比较分析。

叠加多个直方图

要在同一个图上叠加多个直方图,可以使用plot()函数而不是hist()函数:

# 创建一个包含两列的样本数据集
data = pd.DataFrame({'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70],
                     'Height': [160, 165, 170, 175, 180, 185, 190, 195, 200, 205]})
 
# 绘制叠加的直方图
data['Age'].plot(kind='hist', alpha=0.5, bins=6, label='Age')
data['Height'].plot(kind='hist', alpha=0.5, bins=6, label='Height')
plt.legend()
plt.show()

这段代码创建了一个单一的图,其中包含'Age'和'Height'列的叠加直方图,允许您直观地比较这两个分布。

子图进行比较分析

另外,您也可以创建一个网格子图来并排显示多个直方图:

# 创建子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
 
# 在单独的子图上绘制直方图
data['Age'].hist(ax=ax1, bins=6, label='Age')
data['Height'].hist(ax=ax2, bins=6, label='Height')
 
# 添加标签和标题
ax1.set_title('Age Distribution')
ax2.set_title('Height Distribution')
plt.show()

这个示例创建了一个包含两个子图的图形,每个子图都显示了数据集中一列的直方图,从而实现了更详细的比较分析。

高级直方图技术

Pandas直方图可以处理更复杂的数据类型,并提供高级可视化选项。

处理分类数据

Pandas直方图也可用于可视化分类变量的分布。

# 创建一个.
 
样本数据集包含一个分类变量
data = pd.DataFrame({'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female']})
 
# 为分类变量创建直方图
data['Gender'].value_counts().plot(kind='bar')
plt.show()

这段代码创建了一个条形图,这相当于对分类数据进行直方图分析,显示每个类别的频率。

归一化直方图

Pandas 直方图可以进行归一化,以显示概率密度函数 (PDF) 或累积分布函数 (CDF)。

# 创建归一化 PDF 直方图
data['Age'].plot(kind='hist', density=True, bins=6)
plt.show()
 
# 创建归一化 CDF 直方图
data['Age'].plot(kind='hist', cumulative=True, density=True, bins=6)
plt.show()

density=True 参数将直方图归一化以显示概率密度函数,而 cumulative=True 创建一个显示累积分布函数的直方图。

Pandas 直方图的使用场景

Pandas 直方图非常versatile,可以应用于各种数据分析和可视化场景。

探索性数据分析

直方图对于探索数据分布、识别异常值以及检测偏斜度或其他模式非常有价值。

# 探索变量的分布
data['Age'].hist()
plt.show()
 
# 检测异常值
data['Age'].plot(kind='box')
plt.show()

第一个示例创建了一个直方图来可视化 'Age' 列的分布,而第二个示例使用箱线图来识别潜在的异常值。

比较数据集

叠加直方图或创建并排子图可以帮助您比较不同数据集或数据子组的分布。

# 比较两个变量的分布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
data['Age'].hist(ax=ax1, bins=6, label='Age')
data['Height'].hist(ax=ax2, bins=6, label='Height')
plt.show()

这段代码创建了一个包含两个子图的图形,分别显示 'Age' 和 'Height' 变量的直方图。

假设检验

直方图可用于评估统计检验的假设,如正态性,并支持假设检验。

# 检验正态性
from scipy.stats import normaltest
_, p_value = normaltest(data['Age'])
print(f"正态性检验 p 值: {p_value:.4f}")

在这个例子中,使用 SciPy 库中的 normaltest() 函数对 'Age' 列进行正态性检验,并打印出结果的 p 值。直方图可用于直观地检查正态性假设。

数据结构

列表

列表是 Python 中最基本的数据结构之一。它们是有序的项目集合,每个项目可以是不同的数据类型。列表是可变的,这意味着您可以添加、删除和修改列表中的元素。

下面是一个创建和操作列表的示例:

# 创建列表
fruits = ['apple', 'banana', 'cherry']
 
# 访问元素
print(fruits[0])  # 输出: 'apple'
print(fruits[-1])  # 输出: 'cherry'
 
# 修改元素
fruits[1] = 'orange'
print(fruits)  # 输出: ['apple', 'orange', 'cherry']
 
# 添加元素
fruits.append('kiwi')
print(fruits)  # 输出: ['apple', 'orange', 'cherry', 'kiwi']
 
# 删除元素
fruits.remove('banana')
print(fruits)  # 输出: ['apple', 'orange', 'cherry', 'kiwi']

元组

元组与列表类似,但它们是不可变的,这意味着您无法在创建后修改它们的元素。元组通常用于存储应该不被更改的相关数据。

下面是使用元组的示例:

# 创建元组
point = (2, 3)
print(point)  # 输出: (2, 3)
 
# 访问元素
print(point[0])  # 输出: 2
print(point[1])  # 输出: 3
 
# 尝试修改元组元素
# point[0] = 4  # TypeError: 'tuple' object does not support item assignment

字典字典是无序的键值对集合。它们对于高效地存储和检索数据很有用。

下面是使用字典的示例:

# 创建一个字典
person = {
    '姓名': '约翰·道',
    '年龄': 35,
    '职业': '软件工程师'
}
 
# 访问值
print(person['姓名'])  # 输出: '约翰·道'
print(person['年龄'])  # 输出: 35
 
# 添加新的键值对
person['电子邮箱'] = 'john.doe@example.com'
print(person)  # 输出: {'姓名': '约翰·道', '年龄': 35, '职业': '软件工程师', '电子邮箱': 'john.doe@example.com'}
 
# 删除键值对
del person['职业']
print(person)  # 输出: {'姓名': '约翰·道', '年龄': 35, '电子邮箱': 'john.doe@example.com'}

集合

集合是无序的唯一元素集合。它们对于执行集合操作(如并集、交集和差集)很有用。

下面是使用集合的示例:

# 创建一个集合
colors = {'红色', '绿色', '蓝色'}
print(colors)  # 输出: {'绿色', '蓝色', '红色'}
 
# 向集合添加元素
colors.add('黄色')
print(colors)  # 输出: {'绿色', '蓝色', '红色', '黄色'}
 
# 从集合中删除元素
colors.remove('绿色')
print(colors)  # 输出: {'蓝色', '红色', '黄色'}
 
# 集合操作
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1.union(set2))  # 输出: {1, 2, 3, 4}
print(set1.intersection(set2))  # 输出: {2, 3}
print(set1.difference(set2))  # 输出: {1}

控制流

条件语句

条件语句(如 if-elseelif)允许您根据某些条件执行不同的代码块。

# if-else 语句
age = 18
if age >= 18:
    print("你是成年人。")
else:
    print("你是未成年人。")
 
# elif 语句
score = 85
if score >= 90:
    print("成绩: A")
elif score >= 80:
    print("成绩: B")
elif score >= 70:
    print("成绩: C")
else:
    print("成绩: F")

循环

循环(如 forwhile)允许您重复执行一个代码块。以下是中文翻译版本:

# for 循环
水果 = ['苹果', '香蕉', '樱桃']
for 水果 in 水果:
    print(水果)
 
# while 循环
计数 = 0
while 计数 < 5:
    print(计数)
    计数 += 1

列表推导式

列表推导式是一种简洁的创建列表的方式,通过对现有的可迭代对象(如列表、元组或集合)的每个元素应用转换或条件来创建新的列表。

# 创建平方列表的传统方式
数字 = [1, 2, 3, 4, 5]
平方 = []
forin 数字:
    平方.append(数 ** 2)
print(平方)  # 输出: [1, 4, 9, 16, 25]
 
# 使用列表推导式
平方 = [数 ** 2 forin 数字]
print(平方)  # 输出: [1, 4, 9, 16, 25]

函数

函数是可重复使用的代码块,用于执行特定的任务。它们可以接受参数,执行操作,并返回值。

# 定义一个函数
def 问候(姓名):
    """
    用给定的姓名问候该人。
    """
    print(f"你好, {姓名}!")
 
# 调用函数
问候("Alice")  # 输出: 你好, Alice!
 
# 带有返回值的函数
def 加数字(a, b):
    return a + b
 
结果 = 加数字(3, 4)
print(结果)  # 输出: 7

模块和包

Python 的模块化设计允许您将代码组织成可重用的组件,称为模块。模块可以分组到包中,包是相关模块的集合。

# 导入一个模块
import math
print(math.pi)  # 输出: 3.141592653589793
 
# 从一个模块中导入特定的函数
from math import sqrt
print(sqrt(16))  # 输出: 4.0
 
# 使用别名导入模块
import numpy as np
print(np.array([1, 2, 3]))  # 输出: [1 2 3]

异常处理

Python 中的异常处理允许您管理和响应运行时错误和意外情况。

# 处理 ZeroDivisionError
try:
    结果 = 10 / 0
except ZeroDivisionError:
    print("错误: 除数为零。")
 
# 处理多个异常
try:
    整数值 = int("abc")
except ValueError:
    print("错误: 无法将字符串转换为整数。")
except Exception as e:
    print(f"意外错误: {e}")

文件 I/O

Python 提供了内置的函数和方法,用于读取和写入文件。

# 写入文件
with open("example.txt", "w") as file:
    file.write("Hello, World!")
 
# 读取文件
with open("example.txt", "r") as file:
    content = file.read()
    print(content)  # 输出: Hello, World!

结论

在本教程中,您已经学习了各种数据结构、控制流语句、函数、模块、异常处理和文件 I/O 在 Python 中的使用。这些概念对于构建健壮和高效的 Python 应用程序至关重要。请记住要进行实践和应用,以巩固您的理解,成为一名熟练的 Python 程序员。

MoeNagy Dev