数据分析实战(二) 基于美国人口adult数据集R语言分析实战

2023-10-30

一、数据集介绍

数据来源于UCI数据库,网址为adult数据集(下载下来是dat文件,可以用txt文本打开)。该数据集共32560条数据,15个变量,具体变量名及含义如下表所示。

变量名 含义 类型
age 年龄 数值型
workclass 工作类型 类别型
fnlwgt 编号 数值型
education 受教育程度 类别型
education.num 受教育时间 数值型
marital.status 婚姻状况 类别型
occupation 职位 类别型
relationship 家庭关系 类别型
race 种族 类别型
sex 性别 类别型
capital.gain 资本收益 数值型
capital.loss 资本损失 数值型
hours.per.week 每周工作小时 数值型
native.country 原籍 类别型
class 收入阶层 类别型(>50K和<50K)
二、数据预处理

(1)    数据读取

setwd("C:/Users/dell/Desktop")
rm(list=ls())
#读取数据
adult<-read.table("adult.txt",header=T,sep=",")
#添加变量名
colname<-c("age","workclass","fnlwgt","education","education.num",
           "marital.status","occupation","relationship",
           "race","sex","capital.gain","capital.loss","hours.per.week",
           "native.country","class")
colnames(adult)<-colname

#连续变量
varcontinue <- c("age","fnlwgt","education.num","capital.gain","capital.loss","hours.per.week")  
#连续变量转化为数值型并与因子型变量合并
adult <- cbind(lapply(adult[,varcontinue],function(x) as.numeric(as.character(x))),adult[,setdiff(colname,varcontinue)]) 
str(adult)  #查看各变量类型

在这里插入图片描述
为方便后续分析,各类别型变量已转为因子型。

(2)   缺失值识别

sum(is.na(adult))   #查看缺失值情况
#尝试观察是否存在非NA型缺失值
table(adult$workclass)
table(adult$occupation)
table(adult$native.country)

在这里插入图片描述
首先,对原数据集利用is.na函数判断是否存在NA型缺失值,结果发现并没有。但是,从workclass、occupation、native.country这三个因子型变量的统计来看,都含有"?"。故需要将其转化为R语言能够识别的缺失值,并对其删除。

(3)   缺失值处理

#将原数据的问号替换为缺失值,注意问号前有1个空格
adult$workclass[adult$workclass==" ?"]<-NA
adult$occupation[adult$occupation==" ?"]<-NA
adult$native.country[adult$native.country==" ?"]<-NA

#观察是否替换成功
table(adult$workclass)
table(adult$occupation)
table(adult$native.country)

#删除缺失值,生成新数据
adult1<-na.omit(adult)

print(nrow(adult))   #原数据总条数
print(nrow(adult1)) #现数据总条数
print(nrow(adult)-nrow(adult1)) #缺失值条数 

在这里插入图片描述
从上图可知,?已完全删除。删除缺失值后,查看新的数据总条数如下所示
在这里插入图片描述
从结果来看,缺失值共2399条。

三、描述型统计分析

以下以收入阶层class为研究中心,探究不同因素下群体收入是否存在显著差异。
(1)   探究不同教育程度的收入等级差异

library(ggplot2)      
library(Rmisc)           # multiplot(多图绘制)

# 封装绘图函数
# data:数据源,xlab:x轴数据,fillc:填充颜色,pos:调整位置,xname:x轴标签文本,yname:y轴标签文本
fun_bar <- function(data, xlab, fillc, pos, xname, yname) {
  ggplot(data, aes(xlab, fill = fillc)) + 
    geom_bar(position = pos) +
    labs(x = xname, y = yname) +
    coord_flip() +       # 使图形倒置
    theme_minimal()      # ggplot图形的一种背景主题
}
## 探索不同教育程度的群体的收入等级(pos=‘stack’指定使用堆积条形图)
p1 <- fun_bar(data = adult1, xlab = adult1$education, fillc = adult1$class, 
              pos = 'stack',  xname = 'education', yname = 'count')
              
## 探索不同教育程度的群体的收入等级(pos=‘fill’指定使用百分比堆积条形图)
p2 <- fun_bar(data = adult1, xlab = adult1$education, fillc = adult1$class, 
              pos = 'fill',  xname = 'education', yname = 'per count')

从图中来看,学历对收入阶层的影响的确是有一定作用。例如,对于硕士(master)和博士(Doctorate)来说,收入>50K的群体明显要多一些。此外,还有Prof-school(专门学院)大部分群体工资也都在50K以上。(主要培养职业型人才,一开始我以为是技校hhh。百度才知道这种学院出来的人才是社会的精英,具备高薪和崇高的社会地位)

(2)   探索受教育年限对收入的影响

p3 <- fun_bar(data = adult1, xlab = adult1$education.num, fillc = adult1$class,
              pos = 'stack', xname = 'education.num', yname = 'count')

p4 <- fun_bar(data = adult1, xlab = adult1$education.num, fillc = adult1$class,
              pos = 'fill', xname = 'education.num', yname = 'per count')
multiplot(p3,p4,cols = 1)

不难看出,受教育年限越长,收入>50k的群体占比越大。

(3)   探究婚姻状况对收入的影响

p5 <- fun_bar(data = adult1, xlab = adult1$marital.status, fillc = adult1$class,
              pos = 'stack', xname = 'marital.status', yname = 'count')
p6 <- fun_bar(data = adult1, xlab = adult1$marital.status, fillc = adult1$class,
              pos = 'fill', xname = 'marital.status', yname = 'per count')
multiplot(p5, p6,cols = 1)

可以发现,married-civ-spouse(已婚平民配偶)和married-AF-spouse(已婚军属)类型的收入>50k群体占比大。

(4)   探究性别、年龄、受教育年限、每周工作时间与收入关系

bar_sex <- fun_bar(data = adult1, xlab = adult1$sex, fillc = adult1$class,
                       pos = 'fill', xname = 'sex', yname = 'per count')
                    
box_age <- ggplot(adult1, aes(x = class, y = age ,fill = class))+
  geom_boxplot()+theme_bw()+labs(x = 'class', y = 'age')

box_edu <- ggplot(adult1, aes(x = class, y = education.num ,fill = class))+
  geom_boxplot()+theme_bw()+labs(x = 'class', y = 'education.num')

box_work <- ggplot(adult1, aes(x = class, y = hours.per.week ,fill = class))+
  geom_boxplot()+theme_bw()+labs(x = 'class', y = 'hours.per.week')

multiplot(bar_sex,box_age, box_edu, box_work, cols = 2)

从图中大致可以发现,收入高的群体一般男性居多、年龄较大、每周工作时间较长、受教育年限较长。

四、机器学习及模型比较

(1)   构建训练集和测试集

train=sample(1:nrow(adult1),0.7*nrow(adult1))
adult1_train <- adult1[train,]
adult1_test <- adult1[-train,]

(2)    随机森林分析

library(randomForest)
library(caret)           # confusionMatrix
#建立随机森林模型进行预测,并可视化重要变量
set.seed(1234)
#首先在训练集上训练,并剔除序号fnlwgt变量
rf_model <- randomForest(class ~.-fnlwgt, data = adult1_train, importance =T)
pred_rf <- predict(rf_model, adult1_train, type = 'class')
varImpPlot(rf_model)    #绘制变量重要性曲线
confusionMatrix(pred_rf, adult1_train$class)   #混淆矩阵

左图显示的是平均减少的准确率,右图显示的是平均减少的基尼系数。以左图为例,其中每个点即代表移除相应的特征后平均减少的准确率,故越高的变量越重要。不难看出,caption.gain(资本增值)、occpation(职业)较为重要。输出的混淆矩阵如下所示:
在这里插入图片描述
从结果不难看出,随机森林在训练集上准确率为93.15%,共有15341+4324个样本判断正确,473+974个样本判断错误。

以下,再在测试集上进行验证:

pred_rf_test <- predict(rf_model, adult_test, type = 'class')
confusionMatrix(pred_rf_test, adult1_test$class) 

在这里插入图片描述
测试集上准确率为86.27%,共有6347+1460个样本判断正确,750+492个样本判断错误。

(3)    SVM分析

library(kernlab)         # ksvm()
library(caret)           # confusionMatrix
# 建立支持向量机模型(kernel='rbfdot'指定使用径向基函数)
set.seed(1234)
#剔除变量fnlwgt,在训练集上训练
svm_model <- ksvm(class ~.-fnlwgt, data = adult1_train, kernel = 'rbfdot')
pred_svm <- predict(svm_model, adult1_train, type = 'response')
confusionMatrix(pred_svm, adult1_train$class) 

在这里插入图片描述
SVM在训练集上准确率为86.22%,共有14898+3305个样本判断正确,1933+916个样本判断错误。

以下,再在测试集上进行验证:

pred_svm_test <- predict(svm_model, adult1_test, type = 'response')
confusionMatrix(pred_svm_test, adult1_test$class) 

在这里插入图片描述
SVM在测试集上准确率为85.74%,共有6402+1357个样本判断正确,437+853个样本判断错误。

(4)    模型比较(ROC曲线)
单从准确率的角度来看,随机森林的确要高一些,但在训练集和测试集上的准确率差别相比SVM在训练集和测试集的准确率差别更大一些。以下,将从ROC曲线的角度来判断两者模型优劣。

library(pROC)
#roc()函数适用于数值型数据,所以需要数据类型转换
red_rf_test<-as.numeric(pred_rf_test)
pred_svm_test<-as.numeric(pred_svm_test)
adult1_test$class <-as.numeric(adult1_test$class)
par(mfrow=c(1,2))
roc(pred_rf_test,adult1_test$class, plot=TRUE, print.thres=TRUE, print.auc=TRUE,main="随机森林ROC")
roc(pred_svm_test,adult1_test$class, plot=TRUE, print.thres=TRUE, print.auc=TRUE,main="支持向量机ROC")

从AUC的值来看,随机森林较SVM稍好一点,但相差并不大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据分析实战(二) 基于美国人口adult数据集R语言分析实战 的相关文章

  • shell 执行sql语句

    对于自动化运维 诸如备份恢复之类的 DBA经常需要将SQL语句封装到shell脚本 本文描述了在Linux环境下mysql数据库中 shell脚本下调用sql语句的几种方法 供大家参考 对于脚本输出的结果美化 需要进一步完善和调整 以下为具
  • 抖音接口安全参数X-Ladon、X-Argus计算过程分析

    抖音APP在每个请求的header中都加入了X Ladon X Khronos X Gorgon X Argus四个安全参数 当url变动的时候 这几个参数也会跟着变化 下面是一个完整的请求报文 method GET path aweme

随机推荐

  • 利用python自带的库sympy,求解不同阻尼比的振动方程表达式

    利用python自带的库sympy 求解不同阻尼比的振动方程表达式 import sympy 导入数学符号运算库 属于自带库 import numpy as np import matplotlib pyplot as plt 导入绘图模块
  • nacos基本用法

    nacos安装环境必须正确配置JAVA HOME nacos用于服务注册与发现 可以代替zookeeper 在分布式服务注册与发现有更好的性能 nacos启动指令 Linux Unix Mac 启动命令 standalone代表着单机模式运
  • python小游戏毕设 打砖块小游戏设计与实现 (源码)

    文章目录 1 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3 1 环境配置 3 2 Pygame介绍 4 具体实现 4 1 实现游戏精灵类 4 2 实现游戏主循环 5 最后 1 项目简介 Hi 各位同学好呀 这里是L学长 今天向大家
  • 解读区块链配置文件

    证书 首先我们现将所有的文件列出来看一下我们的FISCO BCOS起链完成后nodes中有多少配置文件 介绍证书 config ini 主配置文件 主要配置RPC P2P SSL证书 账本配置文件路径 兼容性等信息 start sh sto
  • 基数统计算法--HyperLogLog

    楔子 在我们实际开发的过程中 可能会遇到这样一个问题 当我们需要统计一个大型网站的独立访问次数时 该用什么的类型来统计 如果我们使用 Redis 中的集合来统计 当它每天有数千万级别的访问时 将会是一个巨大的问题 因为这些访问量不能被清空
  • 【Vue3.0】

    提示 继续深入了解Vue3 0内容 文章目录 前言 一 Setup 二 Composition API 前言 提示 这里可以添加本文要记录的大概内容 例如 Vue js是一款流行的JavaScript前端框架 Vue js的2 0版本于20
  • Python调用R(rpy2的基本使用)

    一 rpy2安装 相关环境为 Windows anaconda3 0 R 3 4 4 1 打开cmd 直接安装 安装过程中下载对应版本的R以及R包 conda install rpy2 2 配置环境变量 添加环境变量 不是在path中添加环
  • 归一化方法

    生物信息学中的归一化方法RPKM FPKM TPM SRPBM 是Reads Per Kilobase per Million mapped reads的缩写 代表每百万reads中来自于某基因每千碱基长度的reads数 RPKM是将映射到
  • kerberos认证下hadoop的java应用程序超时分析

    参考资料 https cloud tencent com developer article 1419270 https issues apache org jira browse HADOOP 10786 背景 我们的云平台项目涉及到了没
  • 第三方 视频播放器

    implementation fm jiecao jiecaovideoplayer 4 8 3 视频播放
  • 机器人学基础(3)-动力学分析和力-拉格朗日力学、机器人动力学方程建立、多自由度机器人的动力学方程建立

    机器人学基础 3 动力学分析和力 拉格朗日力学 机器人动力学方程建立 多自由度机器人的动力学方程建立 本章节主要包括拉格朗日力学 拉格朗日函数及建立求解 多自由度机器人的动力学方程 机器人的静力分析 坐标系间力和力矩的变换 主要结合例题进行
  • 基于SSL/TLS双向安全连接设备CA证书认证

    小伙伴儿们 如果觉得文章干货满满 欢迎加入公众号 编程识堂 更多干货等你们来哦 背景消息 设备证书是由CA根证书签发给客户端设备使用的数字证书 用于客户端和服务端连接时 服务端对客户端进行安全认证 认证通过后服务端和客户端可基于证书内的加密
  • 如何在Jenkins构建完代码后,能够查看HTML Report?

    有同学说想要在Jenkins构建完代码后就能查看构建后的结果报告 不知道怎么配置 这里我详细的说明一下步骤 对于想学习的同学有很大帮助 本次说明仅针对 python3 request unittest框架的案例作详细说明 想要完成这项配置过
  • paxos之Multi-Paxos

    paxos之Multi Paxos 朴素Paxos算法的Latency很高 Multi Paxos通过改变Promised的生效范围至全局的Instance 收到来自其他节点的Accept 则进行一段时间的拒绝提交请求 从而使得一些唯一节点
  • MySQL数据表的操作

    数据表操作 在MySQL数据库中 表是一种很重要的数据库对象 是组成数据库的基本元素 由若干个字段组成 主要用来实现存储数据记录 表的操作包含创建表 查询表 修改表和删除表 这些操作是数据库对象的表管理中最基本也是最重要的操作 表的创建 基
  • 架构设计方法学

    架构设计的方法学 约公元前25年 古罗马建筑师维特鲁威说 理想的建筑师应该既是文学家又是数字家 他还应通晓历史 热衷于哲学研究 精通音乐 懂得医药知识 具有法学造诣 深谙天文学及天文计算 好难哪 软件构架设计师的要求呢 大家好好想想吧 本文
  • 深入学习jquery源码之Deferred对象与holdReady()

    深入学习jquery源码之Deferred对象与holdReady jQuery的Deferred对象也有resolve reject then方法 还有done fail always 方法 jQuery就是用这个Deferred对象来注
  • 超级计算机使用机时,使用天河二号超级计算机资源申请表(10页).doc

    使用天河二号超级计算机资源申请表 10页 使用天河二号超级计算机资源申请表 Tianhe 2 Supercomputer Resource Application Form 填表日期 年 月 日 Date of Application 单位
  • 盛高会员系统服务器启动不了,盛高会员管理系统实用操作指南

    一 盛高小小系列软件介绍 二 盛高会员管理系统操作指引 1 安装盛高会员管理系统软件 单机应用须安装数据服务器和软件客户端 局域网应用主机安装数据服务器和客户端 分机只安装客户端 互联网应用总部安装数据服务器和客户端 分店分机只安装客户端
  • 数据分析实战(二) 基于美国人口adult数据集R语言分析实战

    目录 一 数据集介绍 二 数据预处理 三 描述型统计分析 四 机器学习及模型比较 一 数据集介绍 数据来源于UCI数据库 网址为adult数据集 下载下来是dat文件 可以用txt文本打开 该数据集共32560条数据 15个变量 具体变量名