准备使用 R 进行建模的数据

发布日期:2026-06-25 05:27:02   来源 : 杭州电子商务研究院    浏览量 :11
杭州电子商务研究院 发布日期:2026-06-25 05:27:02  
11

介绍

在数据科学项目中,数据准备通常占用数据科学家 80% 的时间。这表明了它在机器学习生命周期中的重要性。在本指南中,您将学习 R 中几种数据准备技术的基础知识和实现:

  1. 处理错误条目

  2. 缺失值处理

  3. 编码分类标签

  4. 处理异常值

  5. 对数变换

  6. 标准化

  7. 转换列类型

数据

在本指南中,我们将使用一个虚构的贷款申请人数据集,其中包含 600 个观测值和 10 个变量,如下所述:

  1. Marital_status:申请人是否已婚(“1”)或未婚(“0”)

  2. 受抚养人:申请人声称的受抚养人人数

  3. Is_graduate:申请人是否为毕业生(“1”)或不是(“0”)

  4. 收入:申请人的年收入(百美元)

  5. Loan_amount:提交申请的贷款金额(以百美元为单位)

  6. Term_months:贷款期限(以月为单位)

  7. Credit_score:申请人的信用评分是良好(“1”)还是不良(“0”)

  8. 年龄:申请人的年龄(岁)

  9. 性别:申请人是女性(“F”)还是男性(“M”)

  10. Approval_status:贷款申请是否已获批准(“1”)或未获批准(“0”)

让我们首先加载所需的库和数据。

      library(plyr)
library(readr)
library(dplyr)
library(caret)
library(ggplot2)
library(repr)

dat <- read_csv("data_prep.csv")
glimpse(dat)
    

输出:

      Observations: 600
Variables: 10
$ Marital_status  <int> 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, ...
$ Dependents      <int> 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, ...
$ Is_graduate     <int> 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, ...
$ Income          <int> 5635, 2708, 3333, 5324, 12677, 50292, 9523, 3685, 3107...
$ Loan_amount     <int> 122, 126, 107, 230, 208, 169, 153, 122, 111, 107, 98, ...
$ Term_months     <int> 384, 504, 504, 384, 384, 384, 384, 384, 384, 384, 384,...
$ Credit_score    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, ...
$ approval_status <int> 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, ...
$ Age             <int> 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23,...
$ Sex             <chr> "M", "F", "M", "M", "M", "M", "F", "F", "F", "M", "F",...
    

输出显示数据集有九个数值变量(标记为int)和一个字符变量(标记为chr)。我们将在后续部分分析数据类型。现在,让我们看一下数据的摘要。

      summary(dat)
    

输出:

      Marital_status     Dependents      Is_graduate          Income      
 Min.   :0.0000   Min.   :0.0000   Min.   :  0.000   Min.   :   200  
 1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:  1.000   1st Qu.:  3832  
 Median :1.0000   Median :0.0000   Median :  1.000   Median :  5075  
 Mean   :0.6517   Mean   :0.7308   Mean   :  2.449   Mean   :  7211  
 3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:  1.000   3rd Qu.:  7642  
 Max.   :1.0000   Max.   :3.0000   Max.   :999.000   Max.   :108000  
                  NA's   :2        NA's   :1                         
  Loan_amount     Term_months     Credit_score    approval_status 
 Min.   : 10.0   Min.   : 36.0   Min.   :0.0000   Min.   :0.0000  
 1st Qu.:111.0   1st Qu.:384.0   1st Qu.:1.0000   1st Qu.:0.0000  
 Median :140.0   Median :384.0   Median :1.0000   Median :1.0000  
 Mean   :161.6   Mean   :367.1   Mean   :0.7883   Mean   :0.6867  
 3rd Qu.:180.5   3rd Qu.:384.0   3rd Qu.:1.0000   3rd Qu.:1.0000  
 Max.   :778.0   Max.   :504.0   Max.   :1.0000   Max.   :1.0000  
                                                                  
      Age             Sex           
 Min.   :  0.00   Length:600        
 1st Qu.: 36.00   Class :character  
 Median : 51.00   Mode  :character  
 Mean   : 51.77                     
 3rd Qu.: 64.00                     
 Max.   :200.00
    

处理错误条目

上面的输出显示变量Age的最小值和最大值分别为0200。此外,变量Is_graduate 的最大值是999,而不是二进制值01。这些条目不正确,需要更正。一种方法是删除这些记录,但相反,我们将这些记录视为缺失值,并用集中趋势的度量(平均值、中位数或众数)替换它们。

Age变量开始,下面的前两行代码将错误值0200转换为缺失记录。我们在第三行代码中对变量Is_graduate重复相同的过程。第四行和第五行打印有关变量的信息。

      dat[, 9][dat[, 9] == 0] <- NA
dat[, 9][dat[, 9] == 200] <- NA
dat[, 3][dat[, 3] == 999] <- NA
summary(dat$Age)
summary(dat$Is_graduate)
    

输出:

      Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  22.00   36.00   50.50   50.61   64.00   80.00       6 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 0.0000  1.0000  1.0000  0.7826  1.0000  1.0000       2
    

现在,变量AgeIs_graduate分别有 594 条和 598 条记录。遗漏的条目已被标记为缺失,我们将在下一节中处理。

缺失值处理

缺失值填补是最常见的数据准备步骤之一。使用sapply()函数可以轻松计算每个变量中的缺失值数量。

      sapply(dat, function(x) sum(is.na(x)))
    

输出:

      Marital_status      Dependents     Is_graduate          Income     Loan_amount 
              0               2               2               0               0 
    Term_months    Credit_score approval_status             Age             Sex 
              0               0               0               6               5
    

处理缺失值的方法有很多种。最广泛使用的方法是使用集中趋势度量来替换值。下面的第一行代码将Age变量的缺失值替换为剩余值的中位数。第二行将Is_graduate变量的缺失值替换为值 '1',这表明申请人的教育状况为研究生。最后两行打印变量的汇总统计数据。

      dat$Age[is.na(dat$Age)] <- median(dat$Age, na.rm = TRUE)
dat$Is_graduate[is.na(dat$Is_graduate)] <- 1

summary(dat$Age)
table(dat$Is_graduate)
    

输出:

      Min. 1st Qu.  Median    Mean 3rd Qu.    Max.     
  22.00   36.00   50.50   50.61   64.00   80.00  


  0   1 
130 470
    

两个变量的缺失值处理都已完成。数据中还有一个变量Sex,它有 5 个缺失值。由于这是一个分类变量,我们将检查标签的分布,这在下面的代码行中完成。

      table(dat$Sex)
    

输出:

      F   M 
111 484
    

输出显示 595 名申请人中有 484 名是男性,因此我们将用标签M替换缺失值。下面的第一行代码执行此任务,而第二行打印变量的分布。输出显示Sex变量有 600 条记录,表明缺失值已被填补。

      dat$Sex[is.na(dat$Sex)] <- "M"
table(dat$Sex)
    

输出:

      Length     Class      Mode 
      600 character character
    

现在,我们将使用下面的代码行检查是否还有缺失值。输出显示变量Dependents中仍然有两个缺失值。

      sapply(dat, function(x) sum(is.na(x)))
    

输出:

      Marital_status      Dependents     Is_graduate          Income     Loan_amount 
              0               2               0               0               0 
    Term_months    Credit_score approval_status             Age             Sex 
              0               0               0               0               0
    

数据集中剩下两个缺失值,我们将使用另一种方法处理缺失值,即删除记录。下面的第一行代码使用 complete.cases ()函数删除任何缺失值的行,而第二行检查数据集中缺失值的信息。第三行打印数据的结果维度。

      dat = dat[complete.cases(dat), ]
sapply(dat, function(x) sum(is.na(x)))
dim(dat)
    

输出:

      Marital_status      Dependents     Is_graduate          Income     Loan_amount 
              0               0               0               0               0 
    Term_months    Credit_score approval_status             Age             Sex 
              0               0               0               0               0 
      LogIncome 
              0 


[1] 598  10
    

编码分类标签

某些机器学习算法(例如xgboost)要求所有变量都是数字。在此数据中,变量Sex具有标签(MF),因此我们必须将它们更改为数字格式。由于有两个标签,我们可以进行二进制编码,这在下面的第一行代码中完成。第二行的输出显示我们已成功执行编码。

      dat$Sex <- ifelse(dat$Sex == "M",1,0)
table(dat$Sex)
    

输出:

      0   1 
111 487
    

处理异常值

<div class="rich-t
以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据