EDA(Exploratory Data Analysis)探索性数据分析

EDA(Exploratory Data Analysis)中文名称为探索性数据分析,是为了在特征工程或模型开发之前对数据有个基本的了解。数据类型通常分为两类:连续类型和离散类型,特征类型不同,我们探索的内容也不同。

1. 特征类型

1.1 连续型特征

定义:取值为数值类型且数值之间的大小具有实际含义。例如:收入。对于连续型变量,需要进行EDA的内容包括:

  • 缺失值
  • 均值
  • 方差
  • 标准差
  • 最大值
  • 最小值
  • 中位数
  • 众数
  • 四分位数
  • 偏度
  • 最大取值类别对应的样本数

1.2 离散型特征

定义:不具有数学意义的特征。如:性别。对于离散型变量,需要进行EDA的内容包括:

  • 缺失值
  • 众数
  • 取值个数
  • 最大取值类别对应的样本数
  • 每个取值对应的样本数

2. EDA目的

​ 通过EDA,需要达到以下几个目的:

​ (1)可以有效发现变量类型、分布趋势、缺失值、异常值等。

​ (2)缺失值处理:(i)删除缺失值较多的列,通常缺失超过50%的列需要删除;(ii)缺失值填充。对于离散特征,通常将NAN单独作为一个类别;对于连续特征,通常使用均值、中值、0或机器学习算法进行填充。具体填充方法因业务的不同而不同。

​ (3)异常值处理(主要针对连续特征)。如:Winsorizer方法处理。

​ (4)类别合并(主要针对离散特征)。如果某个取值对应的样本个数太少,就需要将该取值与其他值合并。因为样本过少会使数据的稳定性变差,且不具有统计意义,可能导致结论错误。由于展示空间有限,通常选择取值个数最少或最多的多个取值进行展示。

​ (5)删除取值单一的列。

​ (6)删除最大类别取值数量占比超过阈值的列。

3.实验

3.1 统计变量类型、分布趋势、缺失值、异常值等

#!/usr/bin/pythonimport pandas as pd
import numpy as npdef getTopValues(series, top = 5, reverse = False):"""Get top/bottom n valuesArgs:series (Series): data seriestop (number): number of top/bottom n valuesreverse (bool): it will return bottom n values if True is givenReturns:Series: Series of top/bottom n values and percentage. ['value:percent', None]"""itype = 'top'counts = series.value_counts()counts = list(zip(counts.index, counts, counts.divide(series.size)))if reverse:counts.reverse()itype = 'bottom'template = "{0[0]}:{0[2]:.2%}"indexs = [itype + str(i + 1) for i in range(top)]values = [template.format(counts[i]) if i < len(counts) else None for i in range(top)]return pd.Series(values, index = indexs)def getDescribe(series, percentiles = [.25, .5, .75]):"""Get describe of seriesArgs:series (Series): data seriespercentiles: the percentiles to include in the outputReturns:Series: the describe of data include mean, std, min, max and percentiles"""d = series.describe(percentiles)return d.drop('count')def countBlank(series, blanks = []):"""Count number and percentage of blank values in seriesArgs:series (Series): data seriesblanks (list): list of blank valuesReturns:number: number of blanksstr: the percentage of blank values"""if len(blanks)>0:isnull = series.replace(blanks, None).isnull()else:isnull = series.isnull()n = isnull.sum()ratio = isnull.mean()return (n, "{0:.2%}".format(ratio))def isNumeric(series):"""Check if the series's type is numericArgs:series (Series): data seriesReturns:bool"""return series.dtype.kind in 'ifc'def detect(dataframe):""" Detect dataArgs:dataframe (DataFrame): data that will be detectedReturns:DataFrame: report of detecting"""numeric_rows = []category_rows = []for name, series in dataframe.items():# 缺失值比例nblank, pblank = countBlank(series)# 最大类别取值占比biggest_category_percentage = series.value_counts(normalize=True, dropna=False).values[0] * 100if isNumeric(series):desc = getDescribe(series,percentiles=[.01, .1, .5, .75, .9, .99])details = desc.tolist()details_index = ['mean', 'std', 'min', '1%', '10%', '50%', '75%', '90%', '99%', 'max']row = pd.Series(index=['type', 'size', 'missing', 'unique', 'biggest_category_percentage', 'skew'] + details_index,data=[series.dtype, series.size, pblank, series.nunique(), biggest_category_percentage, series.skew()] + details)row.name = namenumeric_rows.append(row)else:top5 = getTopValues(series)bottom5 = getTopValues(series, reverse=True)details = top5.tolist() + bottom5[::-1].tolist()details_index = ['top1', 'top2', 'top3', 'top4', 'top5', 'bottom5', 'bottom4', 'bottom3', 'bottom2', 'bottom1']row = pd.Series(index=['type', 'size', 'missing', 'unique', 'biggest_category_percentage'] + details_index,data=[series.dtype, series.size, pblank, series.nunique(), biggest_category_percentage] + details)row.name = namecategory_rows.append(row)return pd.DataFrame(numeric_rows), pd.DataFrame(category_rows)

demo(数据来自:https://www.kaggle.com/competitions/home-credit-default-risk/data)

import os
import eda
import pandas as pd
import numpy as npdata_dir = "./"df = pd.read_csv(os.path.join(data_dir, "bureau.csv"))
numeric_df, category_df = eda.detect(df)

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

3.2 缺失值处理(示例)

#连续特征
df[col].fillna(-df[col].mean(), inplace=True)
#离散特征
df[col].fillna('nan', inplace=True)

3.3 删除无用特征

def get_del_columns(df):del_columns = {}for index, row in df.iterrows():if row["unique"] < 2:del_columns[row["Feature"]] = "取值单一"continueif row["missing"] > 90:del_columns[row["Feature"]] = "缺失值数量大于90%"continueif row["biggest_category_percentage"] > 99:del_columns[row["Feature"]] = "取值最多的类别占比超过99%"continuedel_columns[row["Feature"]] = "正常"return del_columns

3.4 异常值处理

Winsorizer算法(定义某个变量的上界和下界,取值超过边界的话会用边界的值取代):
在这里插入图片描述

class Winsorizer():"""Performs Winsorization 1->1*Warning: this class should not be used directly."""    def __init__(self,trim_quantile=0.0):self.trim_quantile=trim_quantileself.winsor_lims=Nonedef train(self,X):# get winsor limitsself.winsor_lims=np.ones([2,X.shape[1]])*np.infself.winsor_lims[0,:]=-np.infif self.trim_quantile>0:for i_col in np.arange(X.shape[1]):lower=np.percentile(X[:,i_col],self.trim_quantile*100)upper=np.percentile(X[:,i_col],100-self.trim_quantile*100)self.winsor_lims[:,i_col]=[lower,upper]def trim(self,X):X_=X.copy()X_=np.where(X>self.winsor_lims[1,:],np.tile(self.winsor_lims[1,:],[X.shape[0],1]),np.where(X<self.winsor_lims[0,:],np.tile(self.winsor_lims[0,:],[X.shape[0],1]),X))return X_
winsorizer = Winsorizer (0.1)
a=np.random.random((10,2))
print("转化前: ", a)
winsorizer.train(a)
print("上界和下界: ", winsorizer.winsor_lims)
b = winsorizer.trim(a)
print("转化后: ", b)

在这里插入图片描述

4.总结

这篇文章只总结了EDA的常用做法,实际应用过程中还需要根据具体业务来做调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题(两数相加)

每日一题&#xff08;两数相加&#xff09; 2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a; 由于链表从头开始向后存储的是低权值位的数据&#xff0c;所以只需要两个指针p1和p2&#xff0c;分别从链表的头节点开始遍历。同时创建一个新的指针new…

全球汽车安全气囊芯片总体规模分析

安全气囊系统是一种被动安全性的保护系统&#xff0c;它与座椅安全带配合使用&#xff0c;可以为乘员提供有效的防撞保护。在汽车相撞时&#xff0c;汽车安全气囊可使头部受伤率减少25%&#xff0c;面部受伤率减少80%左右。 汽车安全气囊芯片是整个系统的控制核心&#xff0c;并…

给微信小程序添加隐私协议

前些日子&#xff0c;微信官方针对用户的安全信息又进行了增强&#xff0c;这次更新几乎要求所有的小程序都需要进行整改&#xff0c;只要是涉及到用户的隐私的小程序都需要进行整改&#xff0c;这次整改是强制性的。 点开相关指引之后会跳转到下面的链接&#xff1a;参考链接…

【深度学习】Pytorch 系列教程(十一):PyTorch数据结构:3、变量(Variable)介绍

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 3、变量&#xff08;Variable&#xff09; 一、前言 ChatGPT&#xff1a; PyTorch是一个开源的机器学习框架&am…

主题配置和 消息发送(一)KafkaTemplate 的使用

一、主题 1.1、配置主题 在应用程序上下文定义一个 KafkaAdmin Bean, 它可以自动将主题添加到代理。通过这个Bean可以将 每一个新建的主题 Topic 添加到应用程序上下文中。下面是一个简单的示例:也可以创建 TopicBuilder 类,使用它创建 Bean 更加简单。 @Bean public Kafka…

C++:string的模拟实现

目录 1.string的四大默认函数 1.1构造函数 1.2析构函数 1.3拷贝构造 1.4赋值运算符重载 2.访问string的三种方式 2.1[]访问 2.2迭代器访问 2.3范围for(本质是迭代器) 3.string相关功能的实现 3.1modify 3.2capacity 3.3access 3.4relations 3.5补充 4.补充 1.s…

C++之哈希表、哈希桶的实现

哈希表、哈希桶的实现 哈希概念哈希冲突哈希函数哈希冲突解决闭散列哈希表闭散列实现哈希表的结构哈希表的插入哈希表的查找哈希表的删除 开散列开散列概念哈希表的结构哈希表的插入哈希表的查找哈希表的删除 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置…

git everything up-to-date解决方法

git push origin master 总是提示git everything up-to-date,原因是远端没有分支 . 操作如下:(1)查看当前分支名 git branch -av(2)git push --set-upstream origin (当前分支名)

Linux-相关操作

2.2.2 Linux目录结构 /&#xff1a;根目录&#xff0c;一般根目录下只存放目录&#xff0c;在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”&#xff0c;你其实是在告诉电脑&#xff0c;先从/&#xff08;根目录&#xff09;开始&#xf…

P2239 [NOIP2014 普及组] 螺旋矩阵

题目链接&#xff1a; 找到矩阵元素与 n , i , j \rm n, i, j n,i,j之间的关系&#xff0c;然后直接输出 #include <bits/stdc.h>using namespace std;int find(int n, int i, int j) {if (i 1) return j;if (j n) return i n - 1;if (i n) return 3 *n - 1 - j;if …

广州xx策划公司MongoDB恢复-2023.09.09

2023.09.08用户的MongoDB数据库被勒索病毒攻击&#xff0c;数据全部被清空。 提示&#xff1a; mongoDB的默认端口为27017&#xff0c;黑客通常通过全网段扫描27017是否开放判断是否是MongoDB服务器。一旦发现27017开放&#xff0c;黑客就会用空密码、弱密码尝试连接数据库。黑…

Mojo-SDK详细安装教程

Mojo-SDK安装 运行环境&#xff1a;windows11wsl2&#xff08;ubuntu1804&#xff09; 官方推荐&#xff1a;wsl2&#xff08;ubuntu2204&#xff09;&#xff0c;我下面是wsl2&#xff08;ubuntu1804&#xff09;&#xff0c;发现有些问题&#xff0c;不知道是不是ubuntu版本问…

opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4

博客【opencv dnn模块 示例(3) 目标检测 object_detection (2) YOLO object detection】 测试了yolov3 及之前系列的模型&#xff0c;有在博客【opencv dnn模块 示例(15) opencv4.2版本dnn支持cuda加速&#xff08;vs2015异常解决&#xff09;】 说明了如何使用dnn模块进行cuda…

kafka 3.5 主题分区ISR伸缩源码

ISR(In-sync Replicas)&#xff1a;保持同步的副本 OSR(Outof-sync Replicas)&#xff1a;不同步的副本。最开始所有的副本都在ISR中&#xff0c;在kafka工作的过程中&#xff0c;如果某个副本同步速度慢于replica.lag.time.max.ms指定的阈值&#xff0c;则被踢出ISR存入OSR&am…

(1)输入输出函数:cin和cout(2)数学函数:sqrt、pow、sin、cos、tan等

输入输出函数&#xff1a;cin 和 cout 在C编程语言中&#xff0c;为了与用户进行交互和显示程序的结果&#xff0c;我们使用了两个非常重要的函数&#xff1a;cin 和 cout。这两个函数分别用于输入和输出。 cin是C中的标准输入流对象&#xff0c;它用于从键盘接收用户的输入。…

SQL12 高级操作符练习(2)

描述 题目&#xff1a;现在运营想要找到学校为北大或GPA在3.7以上(不包括3.7)的用户进行调研&#xff0c;请你取出相关数据&#xff08;使用OR实现&#xff09; 示例&#xff1a;user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.03…

六、不root不magisk不xposed lsposed frida原生修改定位

前言常用风控APP检测1.Aida64检测2.momo检测3.微霸检测4.cellular-z检测 厂商测试总结 前言 不root不戴面具 不xposed lsposed frida&#xff0c;不分身&#xff0c;不多开&#xff0c;最完美的原生修改定位。 常用风控APP检测 先看效果再说原理&#xff0c;先过一遍环境 1.Ai…

聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化

聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化 目录 聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于自组织特征映射聚类算法(SOM)的数据聚类可视化 可直接运行 注释清晰 Matlab语言 1.多特征输入&…

Python 可迭代对象、迭代器、生成器

可迭代对象 定义 在Python的任意对象中&#xff0c;只要它定义了可以返回一个迭代器的 __iter__ 魔法方法&#xff0c;或者定义了可以支持下标索引的 __getitem__ 方法&#xff0c;那么它就是一个可迭代对象&#xff0c;通俗的说就是可以通过 for 循环遍历了。Python 原生的列…

爬虫 — 正则案例

目录 一、需求二、页面分析三、代码实现 一、需求 目标网站&#xff1a;http://www.weather.com.cn/weather/101010700.shtml 需求&#xff1a;获取日期&#xff0c;天气&#xff0c;温度&#xff0c;风力数据 二、页面分析 1、确定 url&#xff0c;静态加载 url&#xff1a;ht…