机器学习 探索性数据分析

news2024/11/14 15:42:28

文章目录

  • 1. 数据总览
    • 1.1 查看数据的维度
    • 1.2 查看列的数据类型
    • 1.3 查看索引
    • 1.4 获取数据值
    • 1.5 数据集相关信息概览
    • 1.6 查看数据的统计信息
    • 1.7 查看前3行数据
  • 2. 缺失值查看与处理
    • 2.1 缺失值查看
    • 2.2 缺失值处理
  • 3. 异常值检测与处理
    • 3.1 异常值检测
    • 3.2 异常值处理
  • 4. 特征分析
    • 4.1 查看数值型和类别型特征
    • 4.2 单一变量分布可视化
    • 4.3 相关性分析
  • 5. 生成数据分析报告

数据探索性分析(EDA)目的主要是了解整个数据集的基本情况(多少行、多少列、均值、方差、缺失值、异常值等);通过查看特征的分布、特征与标签之间的分布了解变量之间的相互关系、变量与预测值之间的存在关系;为特征工程做准备。

1. 数据总览

使用的数据是广告点击率预估挑战赛数据集

读取数据集

path = r'E:\数据集\竞赛数据\广告点击率预估挑战赛.csv'
df = pd.read_csv(path, encoding='utf-8')

1.1 查看数据的维度

df.shape

# (391825, 13)

共有391825条数据,13个列

1.2 查看列的数据类型

查看所有列的数据类型

# 查看所有列的数据类型
df.dtypes

在这里插入图片描述

查看某一列的数据类型

# 查看某一列的数据类型
df['gender'].dtype, df['id'].dtype

# (dtype('O'), dtype('int64'))

1.3 查看索引

查看行索引

df.index

# RangeIndex(start=0, stop=391825, step=1)

查看列索引

df.columns

"""
Index(['id', 'date', 'user_id', 'product', 'campaign_id', 'webpage_id',
       'product_category_id', 'user_group_id', 'gender', 'age_level',
       'user_depth', 'var_1', 'isClick'],
      dtype='object')
"""

1.4 获取数据值

# 两者均返回numpy类型数组
df.values 或者 df.to_numpy()

"""
array([[0, '07-02 00:00', 0, ..., 3.0, 0, 0],
       [1, '07-02 00:00', 1, ..., 2.0, 0, 0],
       [2, '07-02 00:00', 1, ..., 2.0, 0, 0],
       ...,
       [391822, '07-06 23:59', 135658, ..., 3.0, 1, 0],
       [391823, '07-06 23:59', 39562, ..., 3.0, 0, 0],
       [391824, '07-06 23:59', 39562, ..., 3.0, 0, 0]], dtype=object)
"""

1.5 数据集相关信息概览

# 包含了所有列的列名及其数据类型,以及每列中非空值的数量,数据大小,索引等
df.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 391825 entries, 0 to 391824
Data columns (total 13 columns):
 #   Column               Non-Null Count   Dtype  
---  ------               --------------   -----  
 0   id                   391825 non-null  int64  
 1   date                 391825 non-null  object 
 2   user_id              391825 non-null  int64  
 3   product              391825 non-null  int64  
 4   campaign_id          391825 non-null  int64  
 5   webpage_id           391825 non-null  int64  
 6   product_category_id  391825 non-null  int64  
 7   user_group_id        376082 non-null  float64
 8   gender               376082 non-null  object 
 9   age_level            376082 non-null  float64
 10  user_depth           376082 non-null  float64
 11  var_1                391825 non-null  int64  
 12  isClick              391825 non-null  int64  
dtypes: float64(3), int64(8), object(2)
memory usage: 38.9+ MB
"""

1.6 查看数据的统计信息

查看表中数值列的最大值,最小值,均值,标准差, 四分位数,中位数等

查看所有列的数据统计信息

df.describe()

在这里插入图片描述

查看age_level列的数据统计信息

df.age_level.describe()

"""
count    376082.000000
mean          2.777796
std           1.072364
min           0.000000
25%           2.000000
50%           3.000000
75%           3.000000
max           6.000000
Name: age_level, dtype: float64
"""

查看指定列,指定占比的统计信息


# percentile list 
perc =[.20, .40, .60, .80] 

df.age_level.describe(percentiles = perc, include = include) 

"""
count    376082.000000
mean          2.777796
std           1.072364
min           0.000000
20%           2.000000
40%           2.000000
50%           3.000000
60%           3.000000
80%           4.000000
max           6.000000
Name: age_level, dtype: float64
"""

1.7 查看前3行数据

# 默认显示前5行数据
df.head(3)

# 后5个样本
df.tail(5)

# 随机抽取5个样本
df.sample(5)

在这里插入图片描述

2. 缺失值查看与处理

2.1 缺失值查看

缺失值查看

# 查看整个数据集的值是否为缺失值
df.isnull()  

# 查看某一列的值是否为缺失值
df['age_level'].isnull()

查看每列缺失值的个数

# 查看每列的空值,并根据空值个数进行大小排序
data.isnull().sum().sort_values(ascending=False)

"""
user_group_id          15743
gender                 15743
age_level              15743
user_depth             15743
id                         0
date                       0
user_id                    0
product                    0
campaign_id                0
webpage_id                 0
product_category_id        0
var_1                      0
isClick                    0
dtype: int64
"""

查看每列的缺失值占比

# 统计不同类别的缺失值占比
((df.isnull().sum())/df.shape[0]).sort_values(ascending=False).map(lambda x:"{:.2%}".format(x))

"""
user_group_id          4.02%
gender                 4.02%
age_level              4.02%
user_depth             4.02%
id                     0.00%
date                   0.00%
user_id                0.00%
product                0.00%
campaign_id            0.00%
webpage_id             0.00%
product_category_id    0.00%
var_1                  0.00%
isClick                0.00%
dtype: object
"""

可视化含有缺失值的列的缺失占比

missing = df.isnull().sum()/len(df)
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()

在这里插入图片描述

获取缺失值占比大于4%的列

missing_df = ((df.isnull().sum())/df.shape[0])
missing_columns = (list(missing_df[missing_df >0.04].index))
missing_columns

# ['user_group_id', 'gender', 'age_level', 'user_depth']

2.2 缺失值处理

pandas.DataFrame.fillna(value = None,method = None,inplace = False)

  • value:用于填充的值,可以是具体值、字典和数组,不能是列表;
  • method:填充方法,有 ffill 和 bfill 等;ffill:填充上一个值;bfill :填充下一个值
  • inplace:默认无False,如果为True,则将修改此对象上的所有其他视图。
# 填充上一个值
df['gender'].fillna(method="ffill", inplace=True)  

# 填充下一个值
df['gender'].fillna(method="bfill", inplace=True) 

# 填充具体值
df['gender'].fillna(value="Female", inplace=True) 

# 众数填充
df['age_level'].fillna(df['age_level'].mode(), inplace=True)

# 均值填充
df['age_level'].fillna(df['age_level'].mean(), inplace=True)

# 中位数填充
df['age_level'].fillna(df['age_level'].median(),inplace=True)

# 将负值(-10)替换为空值,然后空值替换为均值
data['age_level'].replace(-10, np.nan, inplace=True)                    
data['age_level'].replace(np.nan, data['age_level'].mean(), inplace=True)

pandas.DataFrame.dropna(axis, how= None, thresh, subset, inplace)

  • axis: default 0指行,1为列
  • how: {‘any’, ‘all’}, default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的
  • thresh: int,保留含有int个非空值的行
  • subset: 对特定的列进行缺失值删除处理
  • inplace: 这个很常见,True表示直接在原数据上更改
# 删除所有空值对应的行
df.dropna(inplace=True)

# 删除指定列空值对应的行
df['age_level'].dropna(inplace=True)

# 删除特定列的空值对应的行
subset = ['age_level', 'gender']
df.dropna(subset=subset, inplace=True)

pandas.DataFrame.drop(labels,axis=0,level=None,columns=None, inplace=False,errors=’raise’)

  • labels:接收string或array,代表要删除的行或列的标签(行名或列名)。无默认值
  • axis:接收0或1,代表操作的轴(行或列)。默认为0,代表行;1为列。
  • level:接收int或索引名,代表标签所在级别。默认为None
  • inplace:接收布尔值,代表操作是否对原数据生效,默认为False
  • errors:errors='raise’会让程序在labels接收到没有的行名或者列名时抛出错误导致程序停止运行,errors='ignore’会忽略没有的行名或者列名,只对存在的行名或者列名进行操作。默认为‘errors=‘raise’’。
# 删除 age_level列
df = df.drop(labels='age_level', axis=1)

# 删除 第一行
df = df.drop(labels=0)

# 同时删除多列
df = df.drop(labels=['age_level', 'gender'], axis=1)

# 同时删除多行:删除第一行和第二行
df = df.drop(labels=range(2)) # 等价于df.drop(labels=[0,1]

# 使用del 删除一列,且只能删除一列,不能同时删除多列
del df['age_level']

# 删除缺失值占比大于70%的所有列
missing_df = ((df.isnull().sum())/df.shape[0])
missing_columns = (list(missing_df[missing_df >0.7].index))
df= df.drop(columns = list(missing_columns))

3. 异常值检测与处理

3.1 异常值检测

类别型字段

# 查看类别型字段的取值情况,根据经验判断取值是否合理
for i in df:
    print(i+": "+str(df[i].unique()))      # 查看某一列的唯一值

数值型字段

describe函数

# 可以通过describe函数,查看数值列的统计信息,根据经验判断取值是否合理,例如人的年龄不可能是负数
df.describe()

箱线图(四分位法)

# 查看age_level字段的箱线图
df.age_level.plot.box()

在这里插入图片描述

3.2 异常值处理

在数据处理时,异常值的处理方法,需视具体情况而定。有时,异常值也可能是正常的值,只不过异常的大或小,所以,很多情况下,要先分析异常值出现的可能原因,再判断如何处理异常值。

  • 删除含有异常值的记录;
  • 插补,把异常值视为缺失值,使用缺失值的处理方法进行处理,好处是利用现有数据对异常值进行替换,或插补;
  • 不处理,直接在含有异常值的数据集上进行数据分析;

4. 特征分析

4.1 查看数值型和类别型特征

特征一般都是由类别型特征和数值型特征组成,而数值型特征又分为连续型和离散型。

  • 类别型特征有时具有非数值关系,有时也具有数值关系。比如‘grade’中的等级A,B,C等,是否只是单纯的分类,还是A优于其他要结合业务判断。
  • 数值型特征本是可以直接入模的,但往往风控人员要对其做分箱,转化为WOE编码进而做标准评分卡等操作。从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。

数值型特征

# 数值型特征
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)

"""
['id',
 'user_id',
 'product',
 'campaign_id',
 'webpage_id',
 'product_category_id',
 'user_group_id',
 'age_level',
 'user_depth',
 'var_1',
 'isClick']
"""

类别型特征

# 类别型特征
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))

# ['date', 'gender']

数值型中的离散型变量

#过滤数值型类别特征
def get_numerical_serial_fea(df,feas):
    numerical_serial_fea = []
    numerical_noserial_fea = []
    for fea in feas:
        temp = df[fea].nunique()
        if temp <= 10:
            numerical_noserial_fea.append(fea)
            continue
        numerical_serial_fea.append(fea)
    return numerical_serial_fea,numerical_noserial_fea
numerical_serial_fea,numerical_noserial_fea = get_numerical_serial_fea(df,numerical_fea)

# 数值型连续特征
numerical_serial_fea
# ['id', 'user_id', 'user_group_id']

# 数值型类别特征
numerical_noserial_fea 
"""
['product',
 'campaign_id',
 'webpage_id',
 'product_category_id',
 'age_level',
 'user_depth',
 'var_1',
 'isClick']
 """

# product离散型变量
df['product'].value_counts()
"""
0    143195
3     93340
1     52374
5     33125
4     19043
7     18261
9     11877
8      8045
2      6621
6      5944
Name: product, dtype: int64
"""

# campaign_id离散型变量
df['campaign_id'].value_counts()
"""
0    92769
2    87450
3    47741
5    29383
6    26042
4    24816
7    23943
8    22417
1    19569
9    17695
Name: campaign_id, dtype: int64
"""

...

如果离散型变量中全部都是一个值,可以直接舍弃这个变量;如果不同类别的比例相差较大,需要根据业务分析原因,考虑是否需要使用

数值型连续变量可视化分析
在这里为了演示,把id相关的列当做数值型连续变量进行分析

# 每个数字特征得分布可视化,根据上面计算只有三个变量:['id', 'user_id', 'user_group_id']
f = pd.melt(data_train, value_vars=numerical_serial_fea)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False)
g = g.map(sns.distplot, "value")

在这里插入图片描述

  • 查看某一个数值型变量的分布,查看变量是否符合正态分布,如果不符合正太分布的变量可以log化后再观察下是否符合正态分布。
    如果想统一处理一批数据变标准化 必须把这些之前已经正态化的数据提出
    正态化的原因:一些情况下正态非正态可以让模型更快的收敛,一些模型要求数据正态(eg. GMM、KNN),保证数据不要过偏态即可,过于偏态可能会影响模型预测结果。
# 三种log转换
df['log'] = df['user_group_id'].transform(np.log)
df['log+1'] = (df['user_group_id'] +1).transform(np.log)
df['log(x- min(x)+1)'] = (df['user_group_id']-df['user_group_id'].min() +1).transform(np.log)

# 归一化
df['normalized'] = (df['user_group_id'] - df['user_group_id'].min())/(df['user_group_id'].max()-df['A'].min())

# 标准化
df['standardized'] = (df['user_group_id'] - df['user_group_id'].mean())/df['user_group_id'].std()

非数值型类别型变量分析
根据上面计算,此部分变量有 ['date', 'gender']

df['gender'].value_counts()
"""
Male      332376
Female     43706
Name: gender, dtype: int64
"""

分析方法和数值型离散变量一致

4.2 单一变量分布可视化

类别型变量:采用柱状图可视化频次

sns.countplot(df["gender"])
plt.show()

在这里插入图片描述

数值型中的连续型变量分布可以参考上面数值型连续变量可视化分析,也可以采用如下方法:

plt.figure(figsize=(9, 8))
sns.distplot(df['user_group_id'], color='g', bins=100, hist_kws={'alpha': 0.4})

# 若图像偏离正态分布,取 log之后观察
plt.figure(figsize=(9, 8))
sns.distplot(np.log(train['user_group_id']), color='g', bins=100, hist_kws={'alpha': 0.4})

4.3 相关性分析

相关性分析只能比较数值特征,因此字母、字符串特征需先进行编码并转换为数值,才能查看特征间的关联。相关性分析可以很好地过滤掉与标签没有直接关系的特征。若两标签之间完全正相关(多重共线性),则两特征包含几乎相同的信息,可对其进行删除。

# 通过热力图观察变量之间的相关性
corrmat = df.corr()
f, ax = plt.subplots(figsize=(20, 9))
sns.heatmap(corrmat, vmax=0.8, square=True,annot=True)

在这里插入图片描述

5. 生成数据分析报告

!pip install pandas_profiling
import pandas_profiling
pfr = pandas_profiling.ProfileReport(df)
pfr.to_file("./example.html")

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

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

相关文章

计算机网络考试复习——第4章 4.6

理想的路由算法&#xff1a;几个特点 1.算法必须是正确和完善的 2.算法在计算上应该简单 3.算法能适应通信量和网络拓扑的变化具有自适应性也称为稳健性 4.算法应该具有稳定性 5。算法应该是公平的 6.算法应该是最佳的 关于“最佳路由”——不存在一种绝对的最佳路由算法…

第二章 法的内容与形式

目录 第一节 法的内容与形式的概念 一、法的内容与形式的含义 二、法的内容和形式的关系 第二节 法律权利与法律义务 一、权利和义务的概念 二、权利和义务的分类 三、权利与义务的联系 第三节 法的成文形式与不成文形式 一、历史上各种法的表现形式 二、成文法与不成文…

defaultdict 默认值

文章目录 前言语法setdefault()和defaultdict()的区别setdefault()defaultdict() 前言 在字典中查找某一个值的时候&#xff0c;若key不存在就会返回一个keyerror错误而不是一个默认值&#xff0c;如果想要返回一个默认值可以使用defaultdict函数。 defaultdict是python内建dic…

从0搭建Vue3组件库(三): 组件库的环境配置

本篇文章将在项目中引入 typescript,以及手动搭建一个用于测试组件库组件 Vue3 项目 因为我们是使用 ViteTs 开发的是 Vue3 组件库,所以我们需要安装 typescript、vue3,同时项目将采用 Less 进行组件库样式的管理 pnpm add vuenext typescript less -D -w 使用pnpm如果要安装在…

【C语言】void 和 void* 类型

一. void 类型 1. 为何不能定义 void 类型的变量 为什么不能定义 void 类型的变量&#xff1f;因为它是空类型&#xff0c;不能够为变量提供空间吗&#xff1f; 定义变量的本质是开辟空间&#xff0c;我们用 sizeof 来计算 void 类型的大小&#xff1a; 在vs2017下&#xf…

Direct3D 12——模板——平面阴影效果

平行光阴影 图展示了由平行光源经物体所投射岀的阴影。给定方向为L的平行光源&#xff0c;并用r&#xff08;t&#xff09;p tL来表 示途经顶点p的光线。光线r &#xff08;t&#xff09;与阴影平面(n,d&#xff09;的交点为S。以此光源射出的光线照射到物体的各个顶点&#x…

Stable Diffusion本地搭建windows and linux(附搭建环境)

linux搭建过程以centos为例 1.使用git工具下载项目文件到本地文件夹&#xff0c;命令如下&#xff1a; git clone https://github.com/IDEA-CCNL/stable-diffusion-webui.git然后进入该文件夹&#xff1a; cd stable-diffusion-webui2.运行自动化脚本 运行webui.sh安装一些p…

2023最新接口自动化测试面试真题详解,看完轻松拿捏HR

目录 一.有接口测试工具为什么还需要开发自动化框架或自动化平台。 二.接口自动化中如果一个接口请求不通该如何排查 三.你平常做接口自动化的过程中发现过哪些bug?多吗&#xff1f; 四.你在接口自动化中是怎么校验接口返回结果是否正确&#xff1f; 五、接口自动化回归过程中…

【C生万物】 操作符篇

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 我觉得学习语言&#xff0c;最直接的就是懂不懂符号&#xff0c;而符号中最突出的就是操作符&#xff0c;这期带大家认识认识C语言中的操作符及其使用。 目录 Part1:算数操作符 Part2:移…

直方图均衡化(调节图像亮度、对比度)

直方图均衡化&#xff08;调节图像亮度、对比度&#xff09; 本篇目录 &#x1f984; 一、前言 &#x1f984; 二、直方图均衡化概念 &#x1f984; 三、直方图均衡化实例 &#xff08;1&#xff09;、灰度图像的均衡处理实例 ①、卡通人物灰度图像均衡处理 ②、卡通猫头…

音频编辑开发SDK Audio DJ Studio for .NET Crack

11.7版本--Audio DJ Studio for .NET是 MultiMedia Soft 开发的 .NET Windows Forms 自定义控件&#xff0c;可以轻松地向使用Microsoft Visual Studio编写的Winform和WPF 应用程序添加声音播放和混音功能&#xff1b;由于与 DirectShow 编解码器和 BASS 库的集成&#xff0c;两…

【UITableView和UITableViewCell的常见属性 Objective-C语言】

一、UITableView和UITableViewCell的常见属性, 1.我们说,这些属性里面, 2.这些是不是都是单元格的属性, 1)这个imageView:是单元格里面的图片框,是不是指的是这个啊, 2)这个textLabel:是指的这个标题上面这个Label吧, 3)这个detailTextLabel:是指的标题下面这…

安装tomcat8,配置服务启动脚本,部署jpress应用

1. 简述静态网页和动态网页的区别。 静态网站顾名思义就是不能动的网站&#xff0c;其中的内容一旦做好就固定了。而动态网站是一种网页编程技术&#xff0c;它可以使得浏览器和服务器可以交互&#xff0c;根据服务器的不同请求动态的生成网页内容。 3. 简述 Webl.0 和 Web2.…

基于STM32的倒车雷达系统设计

目录 前言 一、绪论 1.1 设计背景 1.2 设计内容 二、系统硬件设计 2.1 硬件系统框图 2.2 主控制电路 2.3 超声波电路 2.4 OLED显示电路 2.5 键盘输入电路 2.6 声光报警模块电路 三、系统软件设计 3.1 系统主程序设计 3.2 OLED显示程序设计 3.3 键盘设定程序设计…

设计模式-结构型模式之外观模式

4. 外观模式4.1. 模式定义外观模式(Facade Pattern)&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。外观模式…

C++11 make_shared函数和std::make_unique详解

make_shared的使用: shared_ptr<string> p1 make_shared<string>(10, 9); shared_ptr<string> p2 make_shared<string>("hello"); shared_ptr<string> p3 make_shared<string>(); 好处&#xff1a;减少分配次数 std::s…

大厂面试内幕:阿里内部整理出的5000页Java面试复盘指南,起飞!!!

互联网的技术岗一直是高薪的代名词&#xff0c;特别是大厂&#xff0c;应届生的年薪基本都20W起&#xff0c;比一般的公司高多了。 看下面这张网上热传的大厂应届生薪酬表就知道了&#xff0c;SP offer甚至能拿到30W以上。 技术社区也有晒出高薪offer的同学&#xff1a; 除了薪…

Unity LOD 技术

Unity LOD 技术 LOD(Level of detail) 多层次细节&#xff0c;常用的Unity 优化技术 它是根据物体在游戏画面中所占视图百分比来调用显示不同精度的模型 说白了就是 当物体距离摄像机距离较近时显示高精度模型 当物体距离摄像机距离较远时显示低精度模型 优点&#xff1a;优化…

Python深度学习实现DIY专属个人表情包

引言&#xff1a; 在现代社交媒体的时代&#xff0c;表情包已经成为了人们日常生活中不可或缺的一部分。表情包可以用来表达情感、传递信息&#xff0c;甚至成为一种文化符号。然而&#xff0c;随着表情包的日益普及&#xff0c;大量的表情包已经不能满足人们的需求&#xff0…

如何对图片批量重命名?

对于爱好摄影的朋友们来说&#xff0c;不管是手机还是相机拍摄的照片&#xff0c;在导入电脑后&#xff0c;它们的文件名通常都是一串长长的乱码。这不仅会导致桌面看起来杂乱无章&#xff0c;还会给我们查找图片带来很多不便&#xff0c;有时候丢失几张图片都发现不了。不过&a…