IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 案例-分析上市公司财务数据判断企业财务造假——基于R语言 -> 正文阅读

[人工智能]案例-分析上市公司财务数据判断企业财务造假——基于R语言

目录

一、基本情况?

二、数据清洗

三、随机森林确定重要指标?


一、基本情况?


今天来和大家分享一个案例,通过已有的数据集分析判断行业财务造假的情况,首先我们来看一下数据的基本情况。

这是附件2,也就是主要分析所要用到的数据,我们主要的目的就是把这些行业分类,然后分析出各个行业有关财务造假的变量有哪些(看图中的第一个变量,那个就是企业代码,每个代码都会对应一个行业),这个数据量是比较庞大的,我们把它导入到RStudio里面让大家看一下概况。

由于附件2时csv文件格式的,所以我们直接利用read.csv函数即可导入,不需要其他的相关包 ,导入后我们利用summary()函数来查看数据集的一些基本信息,如下所示:

这里其实只截取了一部分,不过这些基本情况在本次分析中不是重点,所以不在这里赘述了,我们看一下数据的规模:

这是导入后的工作环境中对data的描述,3563个观测值,也就是样本,变量则多达 363个,我们最后的目的就是从这363个变量中确定最重要的那几个。

附件2介绍完了,接下来给大家看看附件1和附件3,这两个附件主要是对附件2的补充说明,我们同样将其导入R内来观察其基本情况。

library(xlsx)
name_data <- read.xlsx("E:\\附件1.xlsx","Sheet1")#企业分类

这是附件1,由于他是xlsx文件,所以这里我利用到了xlsx包,这个包是需要java环境的,所以想要利用这个包来导入xlsx文件的一定要先配置Java环境,不过这也是个相当古老的包了,事实上已经有替代品了,大家不用纠结这里,接下来看看它的概况:

这就是数据本身的一部分

这是数据的规模情况,4163个样本,2个变量,这也很容易理解:就是股票代码一共有4163个,这4163个代码都有对应的行业分类。?这时候我想将附件2和附件1组合起来,这样就可以很直观地观察到每个企业的所属行业,我们来观察一下附件2的第一个变量:

TICKER_SYMBOL,很明显,这就是附件1中的行业代码,也就是说这两个数据集存在相同的列,只是名字稍微有些区别,所以我们只要将列名更改为一致的,那么很容易就可以将它们合并了,于是接下来我们就进行合并。

colnames(name_data)[1] <- colnames(data)[1]
data <- merge(data,name_data,by = "TICKER_SYMBOL",all = F)

首先将data(即附件2)的第一个变量的名字赋值给name_data(即附件1),再利用merge函数将两个数据集合并,注意这里是横向合并的,相当于直接给data添加了一个新的列,这里by参数即是合并的依据,意思就是按照给定变量来进行合并。

可以看到原数据集的变量多了一个,?如下是新的data,可以看出所属行业已经匹配了。?

二、数据清洗

上一个步骤结尾时我们其实也可以发现数据集中是存在相当多的缺失值的,所以我们在分析之前先对缺失值进行处理。

首先导入几个我们需要用到的包

library(lattice)                                          
library(MASS)                                        
library(nnet)  
library(mice)

接下来我们观察一下缺失值的规模情况

sum(is.na(data))
sum(complete.cases(data))

第一行是统计整个数据集中存在的缺失值个数,第二行语句则是判断数据集的所有样本中存在多少个所有变量均缺失的样本个数。

得到结果如下:

这表明我们的数据集中共有约66万个缺失值,但不存在无效样本(即全部变量都缺失的样本)。

我们首先进行初步的筛选,对所有的变量进行检验,若某个变量的缺失率高于80%,则我们认为该变量的数据是缺乏说服力的,直接删除就可以,具体检验函数如下:

list_NA <- c()
for (i in 1:364){
  NA_num <- sum(is.na(data[,i]))
  NA_rate <- NA_num/3145#计算缺失比例
  #print(NA_rate)
  if (NA_rate > 0.8){
    list_NA <- c(list_NA,i)#将所有缺失值大于80%的变量储存起来
  }
}

首先生成一个空向量,然后对我们之前的数据集中的变量进行遍历,每次对变量的缺失值进行统计然后计算比例,if语句内判断比例,然后将符合删去要求的变量索引填入空向量中,这样循环完毕后,原来的空向量中就填充满了所有需要删除的列索引。

new_data <- data[,-list_NA]
new_data <- new_data[,-c(6,9,10,269)]#将非数值型变量剔除以便后续分析
sum(is.na(new_data))
diff_NA <- sum(is.na(data))-sum(is.na(new_data));diff_NA

?删去缺失率大于80%的变量后再将字符型变量删去(非数值型的变量会影响我们的分析,而且这里的字符型变量意义不大),我们再看看新的数据集中的缺失值情况

删去了28万个缺失值后的新数据集中仍然存在约38万个缺失值。

我们现在想对缺失值进行插补,这里我们选择的方法是建立回归模型预测因变量来进行填补,所以自变量需要我们自行选择,这些自变量当然不能存在缺失值,所以我们需要对变量进行检验一下,查看一下有哪些变量是不存在缺失值的

for (i in 1:265){
  kk <- sum(is.na(new_data[,i]))
  if(kk==0){
    print(paste(i,colnames(new_data)[i]))
  }
}

得到的结果如下:

这里我从中选择T_PROFIT作为自变量来进行回归

for (i in 1:265){
  NA_num <- sum(is.na(new_data[,i]))
  if (NA_num != 0){
    #print(paste(i,colnames(new_data)[i]))
    sub <- which(is.na(new_data[,i])==TRUE)#返回第i列中那些为NA的行
    new_data_TR <- new_data[-sub,]#不为NA的行
    new_data_TE <- new_data[sub,]#为NA的行
    lm <- lm(new_data_TR[,i]~T_PROFIT,data = new_data_TR)
    new_data[sub,i] <- round(predict(lm,new_data_TE))
  }
}

?上面的代码都有注释,都是一些简单函数的应用

然后我们就插补完了,再来看一下是否还存在缺失值

sum(is.na(new_data))#查看是否全部插补完毕

?

三、随机森林确定重要指标?

没有缺失值了,这证明我们全部插补完了,插补完后我们再对数据集进行一下更新,我们将数据按照行业进行分类

CompanyList <- data.frame(table(new_data$所属行业));colnames(CompanyList) <- c("企业类型",'出现频率')

这就是行业的分类概况,十九个行业 ,也就是说我们需要十九个数据集,在划分数据集前我们首先需要19个变量名来进行赋值,R语言不同于python,因为R中即便我们生成了19个变量名,我们还是不能直接将数据集赋值给他,不过我们利用assign函数就可以解决这个问题了!

dataList <- c()
for (i in 1:19){
  dataList <- c(dataList,paste("Company_data",i,sep = ""))#首先将所有要用的数据集名称放在一个向量里
}

我们首先生成变量名,将其储存在向量中,dataList情况如下:

?这就是我们待会要用到的变量名

j <- 1
for (i in CompanyList$企业类型){
  assign(dataList[j],new_data[which(new_data[,266]==i),])#分类函数
  j = j+1
}

这里assign函数的使用十分直观,第一个参数就是变量名,还是放在循环中进行遍历赋值,第二个参数就是赋值的内容,which函数中的266就是数据集中的最后一列(行业分类)

这样就一次性将我们需要的数据集都生成了。

接下来的操作就比较简单了,只要对我们生成的每一个数据集利用随机森林来建模并判断变量的重要性,这里我们以采矿业为例给大家介绍一下,其他的行业就以此类推了!

library(randomForest)
Cp_dt1.rf <- randomForest(FLAG~.,data = Company_data1[,-266],mytry=23,importance=T)
plot(Cp_dt1.rf)
Cp_dt1.rf <- randomForest(FLAG~.,data = Company_data1[,-266],ntree=400,importance=T)
importance <- as.data.frame(round(importance(Cp_dt1.rf),6))
Sort1 <- importance[order(importance$`%IncMSE`,decreasing = T),]
Sort2 <- importance[order(importance$IncNodePurity,decreasing = T),]

dataF3 <- read.xlsx("E:\\附件3.xlsx","Sheet1")[,-3];colnames(dataF3)[1] <- "VarName"
Var <- data.frame(row.names(Sort1),Sort1);colnames(Var)[1] <- "VarName"
Var <- data.frame(Var[,1],Var[,2],Var[,3]);colnames(Var) <- c("VarName","X.IncMSE","IncNodePurity")
dataFV <- merge(Var,dataF3,by = "VarName")
Sort <- dataFV[order(dataFV$IncNodePurity,decreasing = T),-2];head(Sort,20)

这部分代码就是随机森林判断变量重要性了,得到的结果主要是:

这是输出的最重要的变量的前二十个变量,好了,一次肝完的,希望大家能点个赞!最后一部分代码要是大家有问题就留言,我下次再讲,没有问题的话就祝大家一切顺利!

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:49:57  更:2021-11-16 18:50:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 6:21:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码