龙空技术网

探索性数据分析: 结构化数据实用指南和模板

新语数据故事汇 932

前言:

而今同学们对“unique count”大致比较关注,同学们都想要学习一些“unique count”的相关知识。那么小编在网上网罗了一些对于“unique count””的相关资讯,希望小伙伴们能喜欢,咱们快快来了解一下吧!

原文:

“很多时候,最困难的不是画画,而是在一张白纸上画什么,这让人很困惑。”

同样地,对于数据科学,人们通常想知道在收到数据集后如何开始。这就是探索性数据分析(EDA)的用武之地。

根据维基百科,EDA“是一种通常采用可视化的方法分析数据集以总结其主要特征的方法”。用自己的话来说,就是在你开始从数据中提取洞察力之前,先了解你的数据,对数据有一定程度的熟悉。

由于EDA对于所有数据科学项目来说都是至关重要的初始步骤,懒惰的我决定编写一个代码模板(code template),用于在结构化数据集上执行EDA。中心思想是减少编码时间,更多地关注数据本身的分析。

EDA 在数据科学过程中的位置

在我们深入研究EDA之前,首先必须了解EDA在整个数据科学过程中的位置。

维基百科的数据科学流程图

参考维基百科的流程图,数据收集完成后,在清理前进行一些处理,然后执行EDA。注意,在EDA之后,我们可能会回到处理和清理数据的阶段,也就是说,这可能是一个迭代过程。随后,我们可以使用清理过的数据集和来自EDA的知识来执行建模和报告。

因此,我们可以这样理解EDA的目标:

为了理解数据并从数据中找到线索,

为我们的模型制定假设和假说;检查数据的质量,以便在必要时进一步处理和清洗。

为了更好地理解和说明 EDA 的概念,以下我们将使用SmartNoteBook来探索Kaggle上的数据集商店销售“train.csv”。由于该数据集的问题描述是为了预测商店销售额,因此,我们本次的EDA目标是:

检查有助于预测销售额的特征;检查可能影响我们预测模型的异常或异常值。EDA的大纲

我们的代码模板(code template)须执行下列步骤:

预览数据检查条目和列类型的总数检查任何空值检查重复条目数值数据的图形分布图(单变量和成对联合分布)分类数据的计数分布图按日、月、年频率分析数值型数据的时间序列

导入必要的依赖如下:

import pandas as pdimport numpy as npimport matplotlibimport matplotlib.pyplot as pltimport seaborn as snsimport missingno%matplotlib inline
初步数据处理

首先,我们读入数据集并生成数据的简单预览和统计信息。

df = pd.read_csv('train.csv')df.info()df.head()

来自SmartNoteBook的单元格输出

输出显示,我们有大约100万个条目,总共9列。没有空值,但某些列的数据类型需要更改。正如我们将在后面看到的,正确设置数据类型可以帮助我们进行数据科学处理。简而言之,有三种常见的数据类型(分类型、数值型和日期时间类型),我们对每种类型都有不同的EDA过程。

在我们的初步处理中,我们按以下方式更改了数据类型:

将标识符 Store 设置为 String。对于分类(categorical)列,也就是那些可能的值数量有限且通常是固定的列,我们将它们的类型设置为“分类”。例如,性别、血型和国家都是分类数据。对于数值型(numeric)列,我们可以将其类型设置为int64(整数)或 float64(浮点数)。例如,销售额、体温和人数都是数值型类型数据。将Date设置为 datetime64数据类型。

# set identifier "Store" as stringdf['Store'] = df['Store'].astype('str')# set categorical datadf['DayOfWeek'] = df['DayOfWeek'].astype('category')df['Open'] = df['Open'].astype('category')df['Promo'] = df['Promo'].astype('category')df['StateHoliday'] = df['StateHoliday'].astype(str).str.strip().astype('category')df['SchoolHoliday'] = df['SchoolHoliday'].astype('category')# set datetime datadf['Date'] = pd.to_datetime(df['Date'])
开始EDA

在设置了数据类型之后,我们就可以开始玩了(EDA)。

为了建立party,我们只需要复制、粘贴并运行包含各种函数的代码模板(code template),然后运行接受Pandas DataFrame作为输入的函数eda。

eda(df)

就是这样!简单吧!

现在让我们浏览一下输出的显著部分,以了解如何利用EDA结果。

缺失值和重复项

在我们的示例中,没有缺失值的条目。

但是,如果有缺失值,代码将生成一个类似于下面的图表。注意CustomerID和Description下面的空白; 这些是缺少的值。因此,只需一瞥,我们就能够知道缺失值问题的程度。

字段存在缺失值的示例

与检查缺失值相关的代码如下。

# generate preview of entries with null valuesif df.isnull().any(axis=None):    print("\nPreview of data with null values:\nxxxxxxxxxxxxx")    print(df[df.isnull().any(axis=1)].head(3))    missingno.matrix(df)    plt.show()

在我们的示例中,也没有重复的条目,代码将通过打印输出“没有找到重复的条目”来直接指出这一点。

在出现重复条目时,输出将显示重复条目的数量并预览这些条目。

重复值输出的示例

检查重复项的代码:

# generate count statistics of duplicate entriesif len(df[df.duplicated()]) > 0:    print("No. of duplicated entries: ", len(df[df.duplicated()]))    print(df[df.duplicated(keep=False)].sort_values(by=list(df.columns)).head())else:    print("No duplicated entries found")

如果有任何丢失的值或重复的条目,您应该在进一步进行 EDA 的其他部分之前决定所需的清理步骤。

对于重复的条目,检查它们是否确实重复,并通过以下代码删除它们。

df.drop_duplicates(inplace=True)
分类数据EDA

我们对分类数据的主要 EDA 目标是知道唯一值及其对应的计数。

商店的销售情况,例如,Promo列表示商店是否在当天进行促销活动。根据其唯一值的count结果计算促销活动的次数。结果表明,促销活动举行得相当频繁,占据了大约40% (388,080/1,017,209)的商店天数。这可能表明促销是预测销售额的一个重要特征。

为分类数据生成 EDA 的函数是categorical_eda。

def categorical_eda(df):    """Given dataframe, generate EDA of categorical data"""    print("To check: Unique count of non-numeric data")    print(df.select_dtypes(include=['category']).nunique())    top5(df)    # Plot count distribution of categorical data    for col in df.select_dtypes(include='category').columns:        fig = sns.catplot(x=col, kind="count", data=df)        fig.set_xticklabels(rotation=90)        plt.show()
数值型数据EDA

对于数值型数据,我们的 EDA 方法如下:

绘制每个数值数据的单变量分布图如果有分类数据,则按每个分类值绘制单变量分布图绘制数值数据的成对联合分布图

在运行 eda 函数之前,我们创建了一个新的列ave_sales,将Sales除以Customer,这样我们就可以分析每个顾客每个商店日的平均销售额。

我们的数值型数据EDA的第一个输出显示了一些简单的分布统计数据,包括平均值、标准差和四分位数。

我们可以从输出中得出的一些观点包括:

所有数值数据都没有负值。如果有任何负值,这可能意味着我们必须进一步调查,因为销售和客户数量不太可能是负值,我们可能不得不重新清洗数据。数值数据的最大值与上四分位数(75%)相差甚远,这表明我们可能存在异常值。

箱线图进一步证实存在销售额字段超过40,000或客户字段超过7,000的异常值。因此,我们可以进行检查,看看这是否是一个错误或是否有其他特殊情况导致异常数字。

我们还为每个数字数据按类别值绘制了小提琴曲线,以便调查,例如,促销对销售的影响。

从上面的小提琴图,我们可以推断,在促销日,销售额通常增加。Sales接近0的左图的面积区域可能是由于商店关闭所致。在删除Open = 0的条目之后再次运行eda 函数显示接近0的宽截面不再存在,从而证实了我们的假设。

数值数据 EDA 的最后一个输出是一个成对的联合分布图。

为了对数据产生更进一步的理解,我们运行了函数numeric_eda 并添加了一个参数 hue =‘DayOfWeek’。这使得我们可以根据一周中的每一天来为我们的配对图上色。

numeric_eda(df, hue='DayOfWeek')

通过将 DayOfWeek 合并到图中,我们注意到周日的ave_sales(用粉红色表示)相对来说比其他日子更加稳定。因此,这可以作为一个预测因子进一步研究和考虑。

时间序列EDA

最后,我们还绘制了时间序列图,以检查趋势和季节性。

为了便于分析,在绘制图表之前,我们的代码会自动根据每日、每月和每年的频率对数值数据进行总结。它通过Pandas的resample方法实现了这一点。

绘制日数据

绘制月数据

在我们的示例中,年度图表没有用处,因为数据只包含2015年的部分数据,因此并没有放在截图中。

从日度图表中,我们可以看到,在2013年12月底前还有一些异常值。这也反映在月度图中。

月度图还显示出一些季节性特征,即2月份的销售额较低,这可能是由于月度短期效应,以及接近年底的销售额较高。如果我们预测月销售量,我们的预测将不得不考虑这种季节性效应。

总结

通过上面的例子,我们演示了使用SmartNoteBook编写EDA代码模板来为后续的建模制定猜想和假设,并检查数据的质量,以便进一步处理和清理。

最后,请注意,根据不同的数据科学问题,可能需要执行额外的EDA步骤。尽管如此,代码模板应该能够覆盖基本的EDA,并使使用者快速了解数据。

如果您也在考虑为文本数据执行EDA,可以搜索这篇文章 《EDA for Natural Language Processing》。在文中,作者说明了几乎所有可用于理解文本数据的主要技术。

感谢您的阅读!(文中涉及的数据集和EDA代码模板可以在关注我们《新语数据故事汇》公众号后私信领取

《新语数据故事汇,数说新语》 科普数据科学、讲述数据故事,深层次挖掘数据价值。欢迎各位朋友投稿!

《新语数据故事汇,数说新语》

标签: #unique count