EDA 探索性数据分析是数据分析过程中非常重要的一个环节,包含以下作用:

  • 熟悉数据:通过可视化和统计方法了解数据的分布情况(如均值、方差、偏度、峰度等),识别变量之间的关系(如相关性、因果关系),帮助理解数据的内在结构

  • 数据质量检查:通过识别缺失值、异常值,再决定如何对数据进行预处理(删除、填充等)

  • 数据特征选择:通过分析特征与目标变量的关系,选择对模型有帮助的特征,去除冗余特征,简化数据集,提高模型性能

  • 生成假设:基于数据分析结果生成初步假设,为后续的统计检验或建模提供基础

这篇文章我们基于 tips 消费数据集,包含属性:总金额、消费金额、是否吸烟、时间段、就餐人数(可关注微信公众号 Python技术极客,在消息框中输入 tips ,可获取下载链接和提取码),来介绍在 EDA 中常用的 10 个可视化图表。

1、条形图

条形图是用来显示分类变量的分布,通过可视化数据集中每个类别的频率或计数,可以快速看出各类别的大小。

以下示例按天进行分类汇总,统计每天的消费数量,从图表可以分别得到 周四-周天的每条消费数量

# 条形图
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.read_csv('tips.csv')
# 按周一到周五的顺序
order = ['Thur', 'Fri', 'Sat', 'Sun']
ax = sns.countplot(x='day', hue='day', data=data, order=order)

# 添加数值标签
for bar in ax.patches:
    # 获取每个条形的高度
    height = bar.get_height()
    # 在条形上方添加文本
    ax.text(bar.get_x() + bar.get_width() / 2, height, 
            f'{height}', ha='center', va='bottom')

plt.title('Count of Tips by Day')
plt.show()

2、折线图

折线图主要用于展示数据随时间或其他变量变化的趋势,通过分析现有数据的趋势,可以进行未来值的预测,帮助决策制定

以下示例绘制的折线图绘制了一个小费和账单之间的关系,从而分析小费和账单之间存在的关系

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('tips')
data.sort_values(by='total_bill', inplace=True)
# sns.lineplot(x='total_bill', y='tip', data=data)
plt.plot(data['total_bill'].values, data['tip'].values)
plt.title('Line Plot of Tip Over Total Bill')
plt.show()

3、散点图

散点图(Scatter Plot)是一种用于展示两个变量之间关系的图形,可以通过观察点的分布,直观地显示两个变量之间的关系,比如正相关、负相关或无相关性。

以下示例绘制的散点图绘制了一个小费和账单之间的关系,从而分析小费和账单可能存在的关系

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('tips')
sns.scatterplot(x='total_bill', y='tip', data=data)
plt.title('Scatter Plot of Total Bill vs. Tip')
plt.show()

4、箱线图

箱线图(Box Plot)是一种用于展示数据分布特征的统计图表,显示数据中的平均值、中位数、分位数和离群值。比较多个变量的分布。可以识别扩散的数值变量,检测数据集中潜在的异常值。

以下示例绘制的箱线图展示了不同星期几(day)的总账单金额(total_bill)的分布特征

import seaborn as sns
import matplotlib.pyplot as plt

data = pd.read_csv('tips.csv')

order = ['Thur', 'Fri', 'Sat', 'Sun']
sns.boxplot(x='day', y='total_bill', hue='day', data=data, order=order)
plt.title('Box Plot of Total Bill by Day')
plt.show()

5、密度图

密度图(Density Plot)是一种用于显示数据分布的可视化工具,有以下好处:

  • 数据分布清晰:通过平滑的曲线展示数据的概率密度,帮助分析者直观理解数据的分布情况;

  • 识别多峰值:可以清晰地显示数据是否存在多个峰值(即多模态),这有助于识别不同的子群体或类别;

  • 更平滑展示:相比于直方图,密度图能够提供更平滑的视图,减少由于分箱选择而导致的波动,

  • 集中趋势:密度图的峰值位置表示数据的集中趋势,而曲线的宽度则反映了数据的变异性

以下示例绘制的密度图绘制了一个关于餐厅总账单金额的密度图,帮助用户直观理解账单金额的分布情况

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('tips')
sns.kdeplot(data['total_bill'], shade=True)
plt.title('Density Plot of Total Bill')
plt.show()

6、饼图

饼图(Pie Chart)是一种常见的数据可视化工具,用于展示各部分与整体之间的比例关系

import matplotlib.pyplot as plt

# 数据准备
labels = ['A', 'B', 'C', 'D']
# 各部分的大小
sizes = [15, 30, 45, 10] 
# 各部分的颜色
colors = ['gold', 'lightcoral', 'lightskyblue', 'lightgreen'] 
# 突出显示第一部分 
explode = (0.1, 0, 0, 0)

# 绘制饼图
plt.figure(figsize=(8, 6))
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=140)

plt.axis('equal')  # 确保饼图是圆形
plt.title('饼图示例')
plt.show()

7、热图

热图(Heatmap)主要用于展示数据矩阵的值,通过颜色的深浅来表示数值的大小。

以下示例绘制的热图表示 账单、小费、就餐人数 三者之间的关联深度有多大

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('tips')
data = data[['total_bill', 'tip', 'size']]
# 计算相关性矩阵
correlation_matrix = data.corr()

sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Heatmap')
plt.show()

8、小提琴图

小提琴图(Violin Plot)用于展示数据的分布情况,可以可视化一个数值变量在不同类别中的分布,非常适合比较多个组的数据分布,能一目了然地展示不同组之间的差异和相似性

以下示例绘制的小提琴图表示不同的账单在一周中的不同天中分布情况

import seaborn as sns
import matplotlib.pyplot as plt

# 创建示例数据
tips = sns.load_dataset("tips")

# 绘制小提琴图
sns.violinplot(x='day', hue='day', y='total_bill', data=tips)
plt.title('Violin Plot of Total Bill by Day')
plt.show()

9、子图

为了进行对比,可以在同一图中并排比较多个子图

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('tips')

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

plt.subplot(2, 2, 1)
sns.scatterplot(x='total_bill', y='tip', data=data)
plt.title('Scatter Plot of Total Bill vs Tip')

plt.subplot(2, 2, 2)
sns.boxplot(x='day', y='total_bill',  hue='day', data=data)
plt.title('Box Plot of Total Bill by Day')

plt.subplot(2, 2, 3)
sns.barplot(x='day', y='total_bill',  hue='day', data=data)
plt.title('Bar Plot of Total Bill by Day')

plt.subplot(2, 2, 4)
sns.violinplot(x='day', hue='day', y='total_bill', data=tips)
plt.title('Violin Plot of Total Bill by Day')

plt.tight_layout()
plt.show()

图片

10、关系图

pairplot 是 Seaborn 库中的一个非常有用的函数,用于可视化数据集中所有数值特征之间的关系。它能够生成一个矩阵图,其中每个子图展示了两个特征之间的散点图,以及对角线上的每个特征的分布(通常是直方图或核密度估计图)

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('tips')

sns.pairplot(data, hue='day')
plt.suptitle('Pairplot of Numerical Variables by Day', y=1.02)
plt.show()

图片

在这篇文章中,我们使用数据可视化在数据集上做了一系列的可视化:条形图、饼图、折线图、直方图等 10 个在EDA 中常用的图表,相信对大家有一定的启发帮助!

探索性分析(EDA)和数据可视化的主要目的是在做任何假设之前帮助我们更好的理解数据,它们能够让我们对数据分布、汇总统计、变量和异常值之间的关系有一个直观的理解。通过可视化,能够得出一些有价值的洞见,达到辅助策略决策的目的。


如果你喜欢本文,欢迎点赞,并且关注我们的微信公众号:Python技术极客,我们会持续更新分享 Python 开发编程、数据分析、数据挖掘、AI 人工智能、网络爬虫等技术文章!让大家在Python 技术领域持续精进提升,成为更好的自己!

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐