- 涉及更好地分析和总结数据集,以了解其潜在的模式、关系和趋势。
- 识别基本的数据特征,检测异常或异常值,并确定最合适的建模技术来预测未来的结果。
让我们通过一个故事来理解EDA在数据分析中的意义。
从一个故事理解EDA的重要性
一家小公司刚刚在市场上开展业务。这家公司有一群对自己的角色充满热情的专业人士,他们以一种方式工作使整个公司都能获利。随着公司开始在员工或用户方面增加对其推广产品的了解,管理团队意识到,他们需要帮助了解用户或客户对公司提供的产品或服务的需求和行为。
为了克服这个问题,他们开始聘请一些技术专业人员。最终,他们在数据分析师的职位下找到了一个技术人员,以便他们能够更好地了解客户数据。该分析师将能够从中找到重要的信息或见解。他们聘请的分析师在他们主要从事探索性数据分析的同一类型技术或项目中具有良好的实践经验。
因此,对于这个问题,他们开始通过网络抓取从多个API收集数据,其中包括公司网站、社交媒体、论坛等。收集完数据后,他们开始清理和处理数据,以便他们能够从这些数据中找到一些见解。他们使用统计技术如假设测试和商业智能工具来探索数据,并使用模式识别技术发现隐藏的模式。
在建立管道后,他们观察到公司的客户对购买环保和可持续的产品最感兴趣。公司管理层基于这些见解推出了环保和可持续的产品。于是,基于这些更新,新产品得到了客户的喜欢,最终,公司的收入开始成倍增长。管理层已经开始意识到探索性数据分析的重要性,并聘请了更多的数据分析师。
因此,在本文中,受上述故事的启发,我们将了解管道的探索性数据分析阶段里面的不同技术,并在这个过程中使用流行的工具。本文为初学者和有经验的数据分析师提供了EDA的全面概述及其在数据科学中的重要性。
实施的不同技术
为了理解EDA内部使用的每一种技术,本文将研究一个数据集,并使用用于数据科学的Python库(例如NumPy、Pandas、Matplotlib等)来实现分析。
本文将在分析中使用的数据集是Titanic数据集,它可以从这里(https://www.kaggle.com/c/titanic/data)下载。本文将使用train.csv进行模型训练。
1.导入必要的库和依赖项
在实施之前,首先导入必要的库,本文将利用这些库来实现不同的EDA技术,包括:
- 用于矩阵操作的NumPy
- 用于数据分析的Pandas
- 用于数据可视化的Matplotlib和Seaborn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
2.加载和分析数据集
在导入所有需要的库之后,我们将使用Pandas dataframe加载Titanic数据集。然后我们可以开始执行不同的数据预处理技术,为进一步建模和归纳准备数据。
passenger_data = pd.read_csv('titanic.csv')
passenger_data.head(5)
输出:
图 1
3.获取统计摘要
下面的分析为我们提供了数据中所有数值列的统计数据。我们可以从这个函数中得到的统计数据是:
- 计数
- 平均数和中位数
- 标准偏差
- 最小值和最大值
- 不同的四分位数值
passenger_data.describe()
输出:
图 2
通过解释上述输出,我们可以看到有891名乘客,平均存活率为38%。年龄栏的最小值和最大值在0.42至80之间,平均年龄约为30岁。另外,至少有50%的乘客没有兄弟姐妹/配偶,至少有75%的乘客没有父母/子女,票价一栏的数值也有很大变化。
让我们试着通过从头开始编写代码来计算生存率。
4.计算乘客的总体存活率
为了计算总体存活率,首先选择Survived列,检查数值为1的行,然后计算所有这些行。最后,为了找到百分比,我们将用它除以总行数并输出结果。
survived_data = passenger_data[passenger_data['Survived'] == 1]
survived = survived_data.count().values[1]
survival_percent = (survived/891) * 100
print('The percentage of survived people in training data are {}'.format(survival_percent))
输出:
The percentage of survived people in training data are 38.38383838383838
5.按gender和Pclass列计算存活率
现在,我们必须用聚合运算找到不同列的存活率,我们将使用gender和 Pclass列,然后应用均值函数来找到它,然后输出结果。
survival_rate = passenger_data[['Pclass', 'Sex','Survived']].groupby(['Pclass', 'Sex'], as_index = False).mean().sort_values('Survived', ascending = False)
print(survival_rate)
输出:
Pclass Sex Survived
0 1 female 0.968085
2 2 female 0.921053
4 3 female 0.500000
1 1 male 0.368852
3 2 male 0.157407
5 3 male 0.135447
6.将Passenger Id、Survived、Pclass的数据类型改为String。
由于某些列具有不同的数据类型,我们将所有这些列转换为一个固定数据类型。即String(字符串)。
Cols = [ 'PassengerId', 'Survived', 'Pclass' ]
for index in Cols:
passenger_data[index] = passenger_data[index].astype(str)
passenger_data.dtypes
7.数据集中重复的行
在进行数据建模时,如果存在重复的行,我们的性能可能会下降。因此,始终建议删除重复的行。
passenger_data.loc[passenger_data.duplicated(), :]
8.创建直方图以检查数据分布情况
为了根据该列的可能值找到幸存列的分布,以便我们可以检查类偏差,如果有任何问题,我们可以应用诸如过量取样、欠量取样、SMOTE等技术来克服该问题。
sb.set_style("white")
g = sb.FacetGrid(data = train[train['Age'].notna()], col = 'Survived')
g.map(plt.hist, "Age");
输出:
图 3
现在,如果我们比较上述两个分布,那么建议使用相对频率,而不是使用累积密度函数等的绝对频率。由于我们以年龄一栏为例,具有绝对频率的直方图表明,在20-30岁的年龄组中受害者比幸存者多得多。
9.按生存值绘制年龄中缺失值百分比图
在这里,我们创建了饼状图来寻找按生存值计算的缺失值的百分比,然后查看分区。
dt0 = train['Age'][train['Survived']=='0']
dt1 = train['Age'][train['Survived']=='1']
plt.figure(figsize = [15, 5])
plt.subplot(1, 2, 1)
age_na_pie(dt0)
plt.title('Survived: No');
plt.subplot(1, 2, 2)
age_na_pie(dt1)
plt.title('Survived: Yes');
输出:
图 4
饼状图显示,年龄缺失的乘客更有可能成为受害者。
10.寻找每一列中的缺失值数量
passenger_data.isnull().sum()
从输出结果中,可以观察到Cabin列具有最大的缺失值,所以我们将从分析中删除该列。
11.每列空值的百分比
passenger_data.isna().sum()/passenger_data.shape[0]
在Age一栏中,大约有20%的数据缺失,Cabin一栏中大约有77%的数据缺失,Embarked一栏中有0.2%的数据缺失。我们的目的是在建模之前处理缺失的数据。
12.从数据集中删除Cabin一列
删除Cabin这一列,因为它有很多缺失的值。
drop_column = passenger_data.drop(labels = ['Cabin'], axis = 1)
print(drop_column)
为了处理Age列,首先,我们将检查Age列的数据类型并将其转换为整数数据类型,然后用Age列的中位数来填补Age列中所有的缺失值。
datatype = passenger_data.info('Age')
fill_values = passenger_data['Age'].fillna(int(passenger_data['Age'].median()),inplace=True)
print(fill_values)
在这之后,数据集在缺失值、离群值等方面看起来不错。现在,如果我们应用机器学习算法来查找数据集中的模式,然后在测试数据上进行测试,与没有预处理和探索性数据分析或数据处理的数据相比,模型的性能会更强。
来自EDA的收获
以下是幸存者与受害者相比的特征:
- 幸存者很可能有父母或子女陪伴;与其他人相比,他们的机票更贵。
- 与所有年龄段的受害者相比,儿童更有可能存活下来。
- 年龄缺失的乘客成为幸存者的可能性较小。
- pclass(SES)较高的乘客更有可能存活下来。
- 女性比男性更有可能存活下来。
- Cherbourg的乘客比Queenstown和Southampto的乘客有更高的生存机会。
总结
本文的讨论到此结束。当然,在EDA中还有很多技术比本文在这里介绍的要多得多,这取决于用户在问题陈述中要使用的数据集。总而言之,EDA在使用数据来训练模型之前,了解数据是有益的。这种技术在任何数据科学项目中都起着至关重要的作用,使简单模型在项目中使用时能有更好的表现。因此,每个有抱负的数据科学家、数据分析师、机器学习工程师和分析经理都需要正确了解这些技术。