3.数据探索与可视化基本图形(直方图、箱线图、散点图)——Python数据挖掘代码实践

发布于:2025-03-20 ⋅ 阅读:(20) ⋅ 点赞:(0)


一、 基本概念与专业术语解析

本部分旨在帮助初学者从理论上认识数据可视化的基本概念,并理解常见图形的内涵及其适用场景。通过掌握这些基本概念,您将能更好地利用数据分布、相关性和多维数据展示等工具来探索和分析数据。

1.1 数据分布、相关性与多维数据

  • 数据分布
    数据分布描述的是数据在数值空间中的分布情况,它反映了数据的集中趋势、离散程度及其偏斜性。直观了解数据分布有助于发现数据中的异常值和潜在模式。例如,直方图能展示不同区间内数据出现的频率,让我们了解数据的偏态情况或多峰特性。

  • 相关性
    相关性描述的是两个或多个变量之间的关系程度和方向。通过计算相关系数,我们可以判断变量之间是否存在正相关、负相关或无明显相关性。散点图是展示两个变量相关性的常用图形,它能直观地反映变量间的线性或非线性趋势。

  • 多维数据
    在实际数据分析中,往往涉及多个变量。多维数据展示方法(例如平行坐标图)可以同时呈现多个维度的信息,帮助我们从全局上观察数据结构、变量间的相互关系和分布模式。这对于高维数据的探索和特征工程具有重要意义。

1.2 专业术语解释与图形介绍

图形名称 定义 适用场景 常用工具
直方图 展示数值型数据的分布情况,通过分桶(bins)统计各区间的频数或密度。 数值型数据的分布分析、检测偏态和多峰现象。 Matplotlib、Seaborn
箱线图 利用五数概述(最小值、Q1、中位数、Q3、最大值)展示数据分布及异常值。 异常值检测、数据分布比较。 Matplotlib、Seaborn、Pandas
散点图 显示两个变量之间的关系,每个点代表一对数据值,常用于观察趋势与相关性。 变量间相关性分析、趋势判断,多维信息可通过颜色或形状编码。 Matplotlib、Seaborn
热图 用颜色深浅展示矩阵中数值大小,如相关系数矩阵或缺失值分布。 相关性分析、缺失数据可视化。 Seaborn、Matplotlib
平行坐标图 通过平行排列的坐标轴展示多维数据,每条线代表一个数据样本。 高维数据展示、分类、聚类结果的模式识别。 Pandas、Plotly
交互式图表 允许用户通过缩放、过滤、悬停等方式与图表互动,获得更详细的数据展示。 动态数据探索、实时数据分析。 Plotly、Bokeh、Altair
地理信息图 将数据与地理位置关联,通过地图显示区域数据分布、热点和趋势。 区域销售、人口统计、环境监测等需要地理位置关联的数据分析。 GeoPandas、Folium、Plotly

二、 直方图

在数据探索过程中,我们通常需要了解数据的分布情况,例如数据的集中趋势、离散程度、是否存在异常值等。直方图(Histogram)是一种常用的可视化工具,能够直观地展示数据在不同区间(bins,桶)中的频数或概率密度。

直方图的作用

  • 展示数据分布:帮助我们理解数据是否服从正态分布、偏态分布或其他模式。
  • 识别数据的集中趋势:可以观察数据的均值、中位数及高频出现的数值范围。
  • 检测异常值:极端值可能会落在分布的尾部或独立的 bin 内。
  • 支持数据建模:了解数据分布对于选择合适的机器学习模型(如正态假设下的回归模型)非常重要。

直方图 vs. 条形图

对比项 直方图(Histogram) 条形图(Bar Chart)
数据类型 数值型数据(连续变量) 分类数据(离散变量)
x 轴 数值区间(bins) 离散类别(分类变量)
柱子间隔 无间隔,数据是连续的 有间隔,数据是独立的
用途 显示数据分布,适用于统计分析 统计分类变量的频数,适用于类别对比

直方图绘制(Matplotlib & Seaborn)

中文乱码必备:

import matplotlib.pyplot as plt
# 设置中文字体和解决负号显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

Python 提供了多种绘制直方图的工具,最常用的是 MatplotlibSeaborn,它们支持不同的 bin 规则,并能叠加密度曲线,提升数据可读性。

2.1 使用 Matplotlib 绘制基础直方图

import numpy as np
import matplotlib.pyplot as plt

# 生成模拟数据(服从正态分布)
np.random.seed(42)
data = np.random.normal(loc=50, scale=15, size=1000)  # 均值 50,标准差 15,样本数 1000

# 绘制直方图
plt.figure(figsize=(8, 5))
plt.hist(data, bins=30, color='skyblue', edgecolor='black', alpha=0.7)

# 添加标题和标签
plt.title("数据分布直方图", fontsize=14)
plt.xlabel("数值区间", fontsize=12)
plt.ylabel("频数", fontsize=12)

# 显示图形
plt.show()

解释

  • plt.hist() 用于绘制直方图,bins=30 设定了 30 个区间。
  • color='skyblue' 设置柱子颜色,edgecolor='black' 增强对比度。
  • alpha=0.7 设定透明度,使直方图更具层次感。
    在这里插入图片描述

2.2 使用 Seaborn 绘制直方图 + 密度曲线

import seaborn as sns

# 绘制直方图 + KDE 密度曲线
plt.figure(figsize=(8, 5))
sns.histplot(data, bins=30, kde=True, color='blue', edgecolor='black', alpha=0.6)

# 添加标题
plt.title("Seaborn 直方图与密度曲线", fontsize=14)
plt.xlabel("数值区间", fontsize=12)
plt.ylabel("频数", fontsize=12)

plt.show()

Seaborn 的优势

  • kde=True 可叠加密度曲线,便于观察数据模式。
  • 默认 bin 计算较智能,使直方图更平滑。

在这里插入图片描述


2.3 不同 bin 规则对比

bin 的选择对于直方图的展示效果至关重要。这里对比不同 bin 规则在实际数据中的表现。

对比 Sturges、Rice 和 Freedman-Diaconis 规则

# 计算不同 bin 规则
bins_sturges = np.histogram_bin_edges(data, bins='sturges')  # Sturges 规则
bins_rice = np.histogram_bin_edges(data, bins='rice')  # Rice 规则
bins_fd = np.histogram_bin_edges(data, bins='fd')  # Freedman-Diaconis 规则

plt.figure(figsize=(12, 5))

# Sturges 规则
plt.subplot(1, 3, 1)
plt.hist(data, bins=bins_sturges, color='orange', edgecolor='black', alpha=0.7)
plt.title("Sturges 规则", fontsize=12)

# Rice 规则
plt.subplot(1, 3, 2)
plt.hist(data, bins=bins_rice, color='blue', edgecolor='black', alpha=0.7)
plt.title("Rice 规则", fontsize=12)

# Freedman-Diaconis 规则
plt.subplot(1, 3, 3)
plt.hist(data, bins=bins_fd, color='green', edgecolor='black', alpha=0.7)
plt.title("Freedman-Diaconis 规则", fontsize=12)

plt.show()

分析

  • Sturges 规则:适用于小型数据集,bin 数量较少,可能无法捕捉复杂数据模式。
  • Rice 规则:适用于较大数据集,bin 数量相对较多,提供更精细的数据分布信息。
  • Freedman-Diaconis 规则:动态调整 bin 数量,平衡数据的平滑性与细节度,适用于未知数据分布。

在这里插入图片描述


业务案例:用户评分数据分布

在实际业务分析中,我们常需要分析用户评分数据,了解客户满意度分布。

# 模拟用户评分数据
ratings = np.random.choice([1, 2, 3, 4, 5], p=[0.05, 0.10, 0.35, 0.35, 0.15], size=1000)

plt.figure(figsize=(8, 5))
sns.histplot(ratings, bins=5, kde=False, discrete=True, color='purple', edgecolor='black')

plt.title("用户评分数据分布", fontsize=14)
plt.xlabel("评分", fontsize=12)
plt.ylabel("频数", fontsize=12)

plt.show()

业务解读

  • 评分 3 和 4 最高,表明用户整体满意度较高。
  • 评分 1 和 2 偏少,说明负面反馈较少,但若异常增多,可能需要调查原因。
    在这里插入图片描述

总结

直方图优化方向 关键点
bin 选择 Sturges 适用于小数据集,Freedman-Diaconis 适用于未知数据分布
颜色与透明度 alpha 透明度提高可读性,edgecolor='black' 增强对比度
密度曲线 kde=True 叠加密度曲线,便于观察数据模式
业务场景 结合用户评分、销售数据等挖掘数据特征

直方图是数据探索的重要工具,通过合理选择 bin 数量、颜色、密度曲线等参数,可以直观分析数据分布并辅助业务决策。在 Jupyter Notebook 中运行这些代码,即可快速上手并深入理解数据的潜在模式。


三、 箱线图

箱线图(Box Plot)是一种基于数据的五数概述来展示数据分布和检测异常值的图形工具。它能够直观显示数据的中位数、上下四分位数以及数据范围,同时通过“须”(whiskers)和散点标记出潜在异常值,是数据质量检查的重要手段。

3.1 理论基础

箱线图的组成

箱线图主要由以下部分构成:

  • 最小值:数据中最小的非异常值。
  • 第一四分位数(Q1):将数据分为四等份的下界,表示 25% 的数据低于这个值。
  • 中位数:数据的中间值,表示 50% 的数据低于此值。
  • 第三四分位数(Q3):表示 75% 的数据低于此值。
  • 最大值:数据中最大的非异常值。
  • 须(Whiskers):一般延伸至 Q1 - 1.5×IQR 及 Q3 + 1.5×IQR 之间的最远数据点,IQR(Interquartile Range)为 Q3 与 Q1 之差。
  • 异常值:位于须外的数据点,通常以单独的点标记。

箱线图的作用

  • 检测异常值:箱线图通过设定 1.5×IQR 的阈值来区分正常数据和异常数据,帮助识别可能的录入错误或极端情况。
  • 展示数据分布:不仅展示数据的集中趋势(中位数),还揭示数据的离散程度(四分位数间距)和分布形态(是否对称或偏态)。
  • 数据质量检查:在数据预处理中,箱线图可用于快速识别数据中的错误或异常情况,指导后续的缺失值处理或异常值修正。

3.2 绘制箱线图

我们将通过 Matplotlib 和 Seaborn 分别展示如何绘制箱线图,并解读图形中的须和异常点。以下代码可在 Jupyter Notebook 中直接运行练习。

3.2.1 使用 Matplotlib 绘制箱线图

import numpy as np
import matplotlib.pyplot as plt

# 生成模拟数据:例如模拟某产品销售数据,包含一些异常值
np.random.seed(42)
data = np.random.normal(loc=50, scale=10, size=200)  # 正常分布数据
data = np.append(data, [80, 85, 90])  # 添加几个异常值

plt.figure(figsize=(8, 5))
plt.boxplot(data, vert=True, patch_artist=True, boxprops=dict(facecolor='lightblue', color='blue'),
            whiskerprops=dict(color='blue'), capprops=dict(color='blue'), flierprops=dict(color='red', marker='o', markersize=6))

plt.title("Matplotlib 箱线图示例", fontsize=14)
plt.ylabel("数值", fontsize=12)
plt.show()

代码解释

  • 使用 plt.boxplot() 函数绘制箱线图。
  • 参数 patch_artist=True 允许填充箱体颜色;boxpropswhiskerpropscappropsflierprops 分别用于设置箱体、须、顶帽和异常值点的颜色和样式。
  • 异常值(flier)以红色圆点标出,直观展示了数据中超出 1.5×IQR 范围的点。
    在这里插入图片描述

3.2.2 使用 Seaborn 绘制箱线图

Seaborn 提供更高层次的接口,使得绘图过程更加简单,同时与 Pandas 数据结构结合紧密,便于数据探索和可视化。

import pandas as pd
import seaborn as sns

# 构造 DataFrame 示例数据
df = pd.DataFrame({
    '销售数据': data,
    '类别': ['A'] * len(data)  # 此处所有数据归为一个类别
})

plt.figure(figsize=(8, 5))
sns.boxplot(x='类别', y='销售数据', data=df, palette="Set2")

plt.title("Seaborn 箱线图示例", fontsize=14)
plt.xlabel("类别", fontsize=12)
plt.ylabel("销售数据", fontsize=12)
plt.show()

代码解释

  • 使用 Seaborn 的 boxplot() 函数从 DataFrame 中绘制箱线图,自动计算五数概述并标记异常值。
  • palette="Set2" 设置调色板,提升图形美观度。
  • 通过该图,我们可以直观地观察到中位数、四分位数及异常值的分布情况,从而判断数据质量。

在这里插入图片描述


应用场景与数据质量检查

箱线图在数据预处理中的应用非常广泛。例如,在检测数据录入错误时,异常值的标记可以帮助数据科学家判断数据是否需要清洗或修正。在业务场景中,箱线图可以用于:

  • 销售数据监控:快速识别销售异常值,可能是系统错误或特殊促销导致的数据波动。
  • 客户行为分析:观察客户购买金额的分布,判断是否存在极端消费群体。
  • 质量控制:监控生产数据,及时发现设备异常或质量问题。

四、 散点图

散点图(Scatter Plot)是一种用于展示两个变量之间关系的图形工具。通过在二维坐标系中绘制数据点,我们可以直观地观察变量之间的相关性和趋势。同时,通过颜色、形状和大小等编码方法,还能引入第三个或更多维度的信息,从而实现多变量关系的可视化分析。

4.1 理论基础

展示变量关系

  • 相关性与趋势:散点图能够直观展示两个变量之间是否存在正相关、负相关或无明显相关性。例如,在销售数据中,可以通过散点图观察广告费用与销售额之间的关系。
  • 拟合线:添加拟合线(如线性回归线)可以帮助更好地识别变量之间的趋势,并量化这种关系。

增加维度信息

  • 颜色编码:通过改变数据点的颜色,可以将第三个变量映射到散点图上,例如,不同的客户群体、产品类别或时间段。
  • 形状编码:利用不同形状的标记,可以进一步区分数据点,适用于展示类别变量。
  • 大小编码:数据点大小可以反映第四个维度,例如订单量、人口数量等。

通过这些编码手段,我们可以在二维图形中融入更多信息,帮助业务人员更全面地理解数据特性。


4.2 绘制散点图与拟合线

在 Python 中,我们可以使用 Matplotlib 和 Seaborn 来绘制散点图,并通过添加拟合线来辅助数据关联性分析。

4.2.1 使用 Matplotlib 绘制散点图并添加拟合线

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 生成模拟数据:例如,广告费用与销售额之间的关系
np.random.seed(42)
x = np.random.normal(50, 10, 100)  # 广告费用
y = 2 * x + np.random.normal(0, 10, 100)  # 销售额,加上一定噪声

plt.figure(figsize=(8, 6))
plt.scatter(x, y, color='teal', alpha=0.7, edgecolor='black', label='数据点')

# 计算线性回归拟合线
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
fit_line = slope * x + intercept
plt.plot(x, fit_line, color='red', linewidth=2, label=f'拟合线: y={slope:.2f}x+{intercept:.2f}')

plt.title("广告费用与销售额散点图及拟合线", fontsize=14)
plt.xlabel("广告费用", fontsize=12)
plt.ylabel("销售额", fontsize=12)
plt.legend()
plt.show()

解释

  • 使用 plt.scatter() 绘制散点图,参数 alpha=0.7 控制透明度,edgecolor='black' 提升数据点的对比度。
  • 使用 scipy.stats.linregress() 计算线性回归参数,并通过 plt.plot() 添加拟合线。
  • 拟合线能够直观展示广告费用与销售额之间的线性关系。
    在这里插入图片描述

4.2.2 使用 Seaborn 绘制散点图并添加拟合线

Seaborn 提供了更高级的接口 lmplot()regplot(),可以直接绘制带有拟合线的散点图,同时支持颜色和形状编码。

import pandas as pd
import seaborn as sns

# 构造 DataFrame 数据,添加一个类别变量,用于颜色编码
df = pd.DataFrame({
    '广告费用': x,
    '销售额': y,
    '产品类别': np.where(x < 50, '低预算', '高预算')  # 根据广告费用划分产品类别
})

# 使用 regplot 绘制散点图与拟合线
plt.figure(figsize=(8, 6))
sns.regplot(x='广告费用', y='销售额', data=df, scatter_kws={'color': 'purple', 'alpha': 0.7, 'edgecolor': 'black'},
            line_kws={'color': 'red', 'linewidth': 2})
plt.title("Seaborn 散点图与拟合线", fontsize=14)
plt.xlabel("广告费用", fontsize=12)
plt.ylabel("销售额", fontsize=12)
plt.show()

# 使用 lmplot 添加颜色编码
sns.lmplot(x='广告费用', y='销售额', hue='产品类别', data=df, height=6, aspect=1.2,
           scatter_kws={'alpha': 0.7, 'edgecolor': 'black'},
           markers=['o', 's'], palette="Set1", ci=None)
plt.title("广告费用与销售额(按产品类别区分)", fontsize=14)
plt.xlabel("广告费用", fontsize=12)
plt.ylabel("销售额", fontsize=12)
plt.show()

解释

  • sns.regplot():用于绘制基础散点图并添加回归拟合线,简单直观。
  • sns.lmplot():在 regplot 的基础上,支持 hue 参数根据类别变量对数据点进行颜色编码,同时可以设定不同的 marker(如圆圈和方形)来区分不同类别。
  • 参数 ci=None 禁用了置信区间的显示,保持图形简洁。

在这里插入图片描述
在这里插入图片描述

通过上述代码,我们了解到:

  • 散点图能有效展示两个变量之间的相关性和趋势。
  • 添加拟合线可以帮助量化变量之间的关系,并验证假设。
  • 通过颜色、形状等编码方法,可以在二维图形中融入更多维度的信息,辅助更全面的数据分析。
  • Matplotlib 与 Seaborn 均为绘制散点图的强大工具,Seaborn 的高级接口使得数据可视化更加便捷和美观。

在实际应用中,如销售分析、客户行为分析等场景下,散点图不仅能揭示变量间的基本关系,还能通过多维编码提供更深入的业务洞察。您可以在 Jupyter Notebook 中运行这些代码,亲自探索数据并根据实际需求调整参数,从而更好地理解和应用散点图的各种功能。

未完待续

进入主页:小胡说技书
更多Python相关关注专栏:Data/Python/大模型