实验5:数据预处理(1)
一:实验目的与要求
1:熟悉和掌握数据预处理,学习数据清洗、数据集成、数据变换、数据规约、R语言中主要数据预处理函数。
二:实验内容
【缺失值分析】
第一步:构建数据框
score <- data.frame(student = c("A","B","C","D"), gender = c("M","M","F","F"), math = c(90,70,80,60), Eng = c(88,78,69,98), p1 = c(66,59,NA,88)) score |
第二步:检测缺失值是否存在
is.na(score) |
第三步:判断数据中是否存在缺失值
anyNA(score) |
第四步:判断哪行有缺失值
complete.cases(score) |
第五步:删除存在缺失值的行
score[complete.cases(score),] |
第六步:删除数据框中所有带缺失值的行
na.omit(score) |
三:课堂练习
【练习1】PPT-07第13页——缺失值处理(均值替换、回归差补法、多重插值法)
第一步:读取销售数据文件,提取标题行
(inputfile <- read.csv('catering_sale.csv', header = TRUE, fileEncoding="GB2312")) |
完整运行结果:
日期 销量 1 2015/3/1 51.00 2 2015/2/28 2618.20 3 2015/2/27 2608.40 4 2015/2/26 2651.90 5 2015/2/25 3442.10 6 2015/2/24 3393.10 7 2015/2/23 3136.60 8 2015/2/22 3744.10 9 2015/2/21 6607.40 10 2015/2/20 4060.30 11 2015/2/19 3614.70 12 2015/2/18 3295.50 13 2015/2/16 2332.10 14 2015/2/15 2699.30 15 2015/2/14 NA 16 2015/2/13 3036.80 17 2015/2/12 865.00 18 2015/2/11 3014.30 19 2015/2/10 2742.80 20 2015/2/9 2173.50 21 2015/2/8 3161.80 22 2015/2/7 3023.80 23 2015/2/6 2998.10 24 2015/2/5 2805.90 25 2015/2/4 2383.40 26 2015/2/3 2620.20 27 2015/2/2 2600.00 28 2015/2/1 2358.60 29 2015/1/31 2682.20 30 2015/1/30 2766.80 31 2015/1/29 2618.80 32 2015/1/28 2714.30 33 2015/1/27 2280.80 34 2015/1/26 2414.00 35 2015/1/25 3130.60 36 2015/1/24 2716.90 37 2015/1/23 2930.80 38 2015/1/22 2504.90 39 2015/1/21 2559.50 40 2015/1/20 2168.60 41 2015/1/19 2436.40 42 2015/1/18 3234.30 43 2015/1/17 3061.00 44 2015/1/16 2900.10 45 2015/1/15 2646.80 46 2015/1/14 2615.20 47 2015/1/13 2124.40 48 2015/1/12 1958.00 49 2015/1/8 2259.10 50 2015/1/7 2419.80 51 2015/1/6 2775.00 52 2015/1/5 2594.90 53 2015/1/4 2468.30 54 2015/1/3 3004.30 55 2015/1/2 3313.30 56 2015/1/1 3613.60 57 2014/12/31 2655.90 58 2014/12/30 2644.30 59 2014/12/29 2565.30 60 2014/12/27 2525.90 61 2014/12/26 2778.00 62 2014/12/25 2542.10 63 2014/12/24 2473.30 64 2014/12/23 2240.10 65 2014/12/22 2575.00 66 2014/12/21 3802.80 67 2014/12/18 2274.70 68 2014/12/17 2687.20 69 2014/12/16 2577.80 70 2014/12/15 2583.00 71 2014/12/14 3282.60 72 2014/12/13 3113.70 73 2014/12/12 2661.40 74 2014/12/11 2553.20 75 2014/12/10 2511.30 76 2014/12/9 2710.30 77 2014/12/8 2468.10 78 2014/12/7 3041.50 79 2014/12/6 3178.90 80 2014/12/5 2594.40 81 2014/12/4 2381.10 82 2014/12/3 2415.00 83 2014/12/2 2236.40 84 2014/11/30 3207.20 85 2014/11/29 3059.50 86 2014/11/28 3039.10 87 2014/11/26 2817.50 88 2014/11/25 2891.80 89 2014/11/24 2470.10 90 2014/11/23 3556.60 91 2014/11/22 3397.70 92 2014/11/20 2761.60 93 2014/11/19 2618.20 94 2014/11/18 2758.30 95 2014/11/17 2614.30 96 2014/11/16 3437.10 97 2014/11/15 3250.00 98 2014/11/14 3063.70 99 2014/11/13 2839.20 100 2014/11/12 2360.90 101 2014/11/11 2158.50 102 2014/11/10 2005.50 103 2014/11/9 3236.40 104 2014/11/8 22.00 105 2014/11/7 2452.60 106 2014/11/6 2265.00 107 2014/11/5 2566.10 108 2014/11/4 2527.20 109 2014/11/3 2326.50 110 2014/11/2 2941.90 111 2014/11/1 60.00 112 2014/10/31 2520.90 113 2014/10/30 2446.20 114 2014/10/29 2549.40 115 2014/10/28 2449.30 116 2014/10/27 2162.50 117 2014/10/26 2781.30 118 2014/10/25 3060.60 119 2014/10/24 2064.00 120 2014/10/22 2439.70 121 2014/10/21 2476.20 122 2014/10/20 2478.30 123 2014/10/19 2826.20 124 2014/10/18 2924.80 125 2014/10/17 2417.50 126 2014/10/16 2450.10 127 2014/10/15 2533.00 128 2014/10/14 2238.70 129 2014/10/13 2388.80 130 2014/10/12 3291.30 131 2014/10/11 2738.80 132 2014/10/10 2344.10 133 2014/10/9 2068.80 134 2014/10/8 3185.30 135 2014/10/7 2778.60 136 2014/10/6 2921.10 137 2014/10/5 2524.30 138 2014/10/4 3057.10 139 2014/10/3 3039.60 140 2014/10/2 3193.40 141 2014/10/1 3075.40 142 2014/9/30 2847.60 143 2014/9/29 2311.40 144 2014/9/28 2327.30 145 2014/9/27 9106.44 146 2014/9/26 2616.60 147 2014/9/25 2620.20 148 2014/9/24 2616.40 149 2014/9/23 2655.80 150 2014/9/22 2310.70 151 2014/9/21 2935.80 152 2014/9/20 3017.90 153 2014/9/19 2625.50 154 2014/9/18 2752.70 155 2014/9/17 2181.50 156 2014/9/16 2440.50 157 2014/9/15 2422.80 158 2014/9/14 2583.60 159 2014/9/13 2728.90 160 2014/9/12 2525.30 161 2014/9/11 2531.70 162 2014/9/10 2300.50 163 2014/9/9 2097.50 164 2014/9/8 4065.20 165 2014/9/7 3555.20 166 2014/9/6 3462.50 167 2014/9/5 3033.10 168 2014/9/4 2926.10 169 2014/9/3 2431.40 170 2014/9/2 2706.00 171 2014/9/1 3049.90 172 2014/8/31 3494.70 173 2014/8/30 3691.90 174 2014/8/29 2929.50 175 2014/8/28 2760.60 176 2014/8/27 2593.70 177 2014/8/26 2884.40 178 2014/8/25 2591.30 179 2014/8/24 3022.60 180 2014/8/23 3052.10 181 2014/8/22 2789.20 182 2014/8/21 2909.80 183 2014/8/20 2326.80 184 2014/8/19 2453.10 185 2014/8/18 2351.20 186 2014/8/17 3279.10 187 2014/8/16 3381.90 188 2014/8/15 2988.10 189 2014/8/14 2577.70 190 2014/8/13 2332.30 191 2014/8/12 2518.60 192 2014/8/11 2697.50 193 2014/8/10 3244.70 194 2014/8/9 3346.70 195 2014/8/8 2900.60 196 2014/8/7 2759.10 197 2014/8/6 2915.80 198 2014/8/5 2618.10 199 2014/8/4 2993.00 200 2014/8/3 3436.40 201 2014/8/2 2261.70 |
第二步:变换变量名
inputfile <- data.frame(sales = inputfile$'销量', date = inputfile$'日期') inputfile |
第三步:数据截取
inputfile <- inputfile[5:16, ] inputfile |
第四步:缺失数据的识别
is.na(inputfile) # 判断是否存在缺失 n <- sum(is.na(inputfile)) # 输出缺失值个数 n |
第五步:异常值识别
par(mfrow = c(1, 2)) # 将绘图窗口划为1行两列,同时显示两图 dotchart(inputfile$sales) # 绘制单变量散点图 boxplot(inputfile$sales, horizontal = TRUE) # 绘制水平箱形图 |
第六步:异常数据处理
inputfile$sales[5] = NA # 将异常值处理成缺失值 fix(inputfile) # 表格形式呈现数据 |
第七步:缺失值的处理
inputfile$date <- as.numeric(inputfile$date) # 将日期转换成数值型变量 sub <- which(is.na(inputfile$sales)) # 识别缺失值所在行数 inputfile1 <- inputfile[-sub, ] # 将数据集分成完整数据和缺失数据两部分 inputfile2 <- inputfile[sub, ] sub inputfile1 inputfile2 |
第八步:行删除法处理缺失,结果转存
result1 <- inputfile1 result1 |
第九步:均值替换法处理缺失,结果转存
avg_sales <- mean(inputfile1$sales) # 求变量未缺失部分的均值 inputfile2$sales <- rep(avg_sales,n) # 用均值替换缺失 result2 <- rbind(inputfile1, inputfile2) # 并入完成插补的数据 result2 |
第十步:回归插补法处理缺失,结果转存
model <- lm(sales ~ date, data = inputfile1) # 回归模型拟合 inputfile2$sales <- predict(model, inputfile2) # 模型预测 result3 <- rbind(inputfile1, inputfile2) result3 |
第十一步:多重插补法处理缺失,结果转存
install.packages("lattice") install.packages("MASS") install.packages("nnet") install.packages("mice") install.packages("tidyr") install.packages("foreach") install.packages("shape") install.packages("mitml") install.packages("lme4") library(lattice) library(MASS) library(nnet) library(mice) imp <- mice(inputfile, m = 4) # 4重插补,即生成4个无缺失数据集 fit <- with(imp,lm(sales ~ date, data = inputfile)) # 选择插补模型 pooled <- pool(fit) summary(pooled) result4 <- complete(imp, action = 3) # 选择第三个插补数据集作为结果 result4 |
四:实验知识点总结
1:处理缺失值的方法可分为三类:删除记录、数据插补和不处理。
2:插值方法有Hermite插值、分段插值、样条插值法,而最主要的有拉格朗日插值法、牛顿插值法。
五:遇到的问题和解决方法
问题1:PPT中第6页开始的练习内容,没有给出具体的数据。
解决1:在CSDN中查询到有博客存有该练习的数据框。链接如下:R语言 清洗数据_1.创建数据框数据,自定义数据,检查数据是否有缺失值、异常值,对数据进行清洗 r语-CSDN博客
问题2:练习1中的【回归插补法处理缺失,结果转存】,无法正确运行,会出现以下报错。
解决2:重新运行一遍之前的代码,发现问题出在第一次将日期转换成数值型变量,如下图所示。
如果采用上面的代码,运行得到的inputfile1和inputfile2如下图所示,date处全为NA。
此时需要在这段代码之前加上【inputfile$date <- as.Date(inputfile$date, format = "%Y/%m/%d")】,并且重新运行一遍之前的所有代码,再进行之后的操作。得到的新的inputfile1和inputfile2如下图所示。
问题3:练习1中利用多重插补法处理缺失时,mice依赖包加载时不断报错,如下图所示。
解决3:此时需要根据提示自己再进行依赖包的安装,直至加载mice包时不会出错,如下图所示。