数据探索分析(EDA)是一种帮助更深入理解数据的方法,它对于后续的数据预处理至关重要。而数据可视化则是EDA过程中的关键,它通过图表和图形简化了数据分析的过程,使得数据信息一目了然。本文将介绍如何使用Python中的matplotlib和seaborn库来进行数据可视化,以及如何通过不同的图表类型来探索不同类型的数据。
数据可视化将文本或数值数据以视觉格式呈现,使得信息更易于理解。人类对图像的记忆比文本更为深刻,因此Python提供了多种数据可视化库,如matplotlib、seaborn和plotly等。本文将使用Matplotlib和seaborn来展示如何利用不同的图表探索数据。
在处理机器学习问题时,创建假设和测试业务假设是非常重要的,而EDA正是帮助完成这一任务的工具。理解数据需要掌握Numpy进行数学运算和Pandas进行数据操作的知识。将使用大家熟悉的泰坦尼克号数据集来进行演示,可以从这里下载数据集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from seaborn import load_dataset
# 加载泰坦尼克号数据集
data = pd.read_csv("titanic_train.csv")
# 加载内置的tips数据集
tips = load_dataset("tips")
单变量分析是最简单的分析形式,只探索一个变量。单变量分析有助于更好地描述数据。由于绘图使用不同的图表,因此对数值型和分类型变量进行单变量分析的方式也不同。
分类型数据是指包含基于文本的信息的变量。以下是可以用来可视化分类型数据的各种图表。
计数图本质上是一个条形图形式的频率计数图。它为每个类别绘制一个单独的条形。当使用pandas的value_counts函数对任何列进行操作时,它与value_counts函数的可视化形式相同。在数据中,目标变量是“Survived”,它是分类型的,因此让绘制这个变量的计数图。
sns.countplot(data['Survived'])
plt.show()
饼图与计数图类似,只是提供了每个类别在数据中所占百分比的额外信息,即每个类别在数据中的权重。让检查“Sex”列,看看男性和女性成员的百分比是多少。
data['Sex'].value_counts().plot(kind="pie", autopct="%.2f")
plt.show()
分析数值型数据很重要,因为理解变量的分布有助于进一步处理数据。大多数时候,会发现数值型数据存在很多不一致性,因此需要探索数值型变量。
直方图是数值列的值分布图。它基本上在不同的值范围内创建箱子,并绘制它们,可以可视化值的分布情况。让看看“Age”列。
plt.hist(data['Age'], bins=5)
plt.show()
分布图也被称为第二个直方图,因为它是直方图的改进版本。分布图为提供了KDE(核密度估计),它解释了PDF(概率密度函数),即每个值在该列中出现的概率是多少。如果之前学过统计学,那么一定知道PDF函数。
sns.distplot(data['Age'])
plt.show()
箱线图是一个非常有趣的图表,它基本上绘制了一个五数概括。为了得到五数概括,需要描述一些术语。
中位数 - 排序后的系列中的中间值
百分位数 - 给出在该百分位数之前存在的值的数量,例如,在25百分位数下有50个值,这意味着有50个值低于25百分位数
最小值和最大值 - 这些不是最小值和最大值,而是描述使用四分位距(IQR)计算的标准差的下界和上界。
IQR = Q3 - Q1
下界 = Q1 - 1.5 * IQR
上界 = Q3 + 1.5 * IQR
这里Q1和Q3分别是第一四分位数(25百分位数)和第三四分位数(75百分位数)
sns.boxplot(data['Sex'], data["Age"])
plt.show()
已经学习了探索单个分类型和数值型数据的各种图表。双变量分析用于探索两个不同变量之间的关系,因为主要任务是探索变量之间的关系以构建一个强大的模型。当一起分析超过两个变量时,它被称为多变量分析。将为双变量和多变量分析使用不同的图表。
首先,让探索两个变量都是数值型时的图表。
要绘制两个数值型变量之间的关系,散点图是一个简单的图表。让看看总账单和提供的小费之间的关系。
sns.scatterplot(tips["total_bill"], tips["tip"])
plt.show()
还可以在散点图中绘制三个或四个变量之间的关系。假设想要找到男性和女性与总账单和小费提供的比例。
sns.scatterplot(tips["total_bill"], tips["tip"], hue=tips["sex"])
plt.show()
还可以使用样式参数在散点图中进行四个变量的多变量分析。假设现在除了性别之外,还想要知道顾客是否是吸烟者,那么可以这样做。
sns.scatterplot(tips["total_bill"], tips["tip"], hue=tips["sex"], style=tips['smoker'])
plt.show()
如果一个变量是数值型,另一个是分类型,那么有各种图表可以用于双变量和多变量分析。
条形图是一个简单的图表,可以使用它来绘制x轴上的分类型变量和y轴上的数值型变量,并探索两个变量之间的关系。每个条形图顶部的黑色提示显示了置信区间。让探索P-Class与年龄的关系。
sns.barplot(data['Pclass'], data['Age'])
plt.show()
Hue参数非常有用,它帮助分析超过两个变量。现在,除了上述关系之外,还想看看性别。
sns.barplot(data['Pclass'], data['Fare'], hue = data["Sex"])
plt.show()
已经在单变量分析中学习了箱线图。可以为两个变量绘制单独的箱线图。让使用箱线图探索性别与年龄的关系。
sns.boxplot(data['Sex'], data["Age"])
plt.show()
除了年龄和性别之外,让看看谁生存了下来,谁没有。
sns.boxplot(data['Sex'], data["Age"], data["Survived"])
plt.show()
分布图使用核密度估计解释PDF函数。分布图没有hue参数,但可以使用它。假设想要看看年龄范围的生存概率,并找出哪个年龄范围的生存概率高于死亡比例。
sns.distplot(data[data['Survived'] == 0]['Age'], hist=False, color="blue")
sns.distplot(data[data['Survived'] == 1]['Age'], hist=False, color="orange")
plt.show()
正如所看到的,图表非常有趣。蓝色显示了死亡的概率,橙色图表显示了生存的概率。如果观察它,可以看到儿童的生存概率高于死亡,而在老年人的情况下则相反。这个小分析有时可以告诉一些关于数据的重要信息,它有助于准备数据故事。
现在将处理分类型和分类型列。
如果曾经使用过pandas的交叉表函数,那么热图是类似的视觉表示,它显示了一个类别相对于另一个类别在数据集中的存在程度。让首先用交叉表,然后用热图来展示。
pd.crosstab(data['Pclass'], data['Survived'])
sns.heatmap(pd.crosstab(data['Pclass'], data['Survived']))
sns.clustermap(pd.crosstab(data['Parch'], data['Survived']))
plt.show()