| #3.1.1基础描述分析 |
| #如何画基本统计图形 |
|
| #柱箱点、折直饼: |
| #柱状图、箱线图、散点图、折线图、直方图、饼图 |
|
| #(1)描述一个变量还是两个变量或多个变量? |
| #(2)描述的变量是什么类型,是定性变量还是定量变量? |
|
|
|
| ### 数据准备 ### |
| # 清空工作空间 |
| rm(list = ls()) |
| # 载入相关包及设定路径 |
| # install.packages(plyr) |
| library(plyr) |
| # install.packages("reshape2") |
| library(reshape2) |
| # 读入数据 |
| novel = read.csv("novel.csv", fileEncoding = "UTF-8") |
| # 数据查看与异常处理 |
| head(novel) |
| novel$小说性质 = as.character(novel$小说性质) |
| novel = novel[novel$小说性质 != "", ] |
|
|
|
|
| #1、单变量作图 |
|
| #(一)一个定性变量:如性别、国籍这类描述一个事物质的特性的变量,其取值只能是离散的 |
| #如:男、女,中国、美国、英国 |
| #描述一个定性变量的图形:柱状图、饼图 |
|
| #1)柱状图:展示一个定性变量的频数分布,也可用来观察不同类别样本的分布 |
| barplot(height,names.arg)#height是柱子的高度,names.arg是柱子的名称 |
|
| #例: |
| ### 单变量 ### |
|
| ## 定性变量--柱状图 ## |
| a = table(novel$小说类型) |
| a = a[order(a, decreasing = T)] |
| barplot(a[1:5], names.arg = names(a)[1:5], col = rainbow(5, alpha = 0.4), xlab = "小说类型", ylab="频数") |
| #常用参数: |
| #names.arg可定义每个柱子的名字,即分类变量的类别名称 |
| #col可定义柱子的颜色 |
| #main可定义图标题 |
| #rainbow()生成彩虹色 |
| #alpha调节透明度 |
|
| #2)饼图 |
| pie(numerical_vector,labels)#numerical_vector是各类别的频数,labels是每块小饼的标签 |
|
| #例1: |
| ## 定性变量--饼图 ## |
| pie(c(4000, 3000, 2000, 1000), labels = c("北京", "天津", "上海", "广州"), main = "熊粉成员分布", col = 2:5) |
|
| #例2: |
| #画饼图常用技巧:合并小类、计算百分比、如何展示各块饼的标签 |
|
| # 将小说类型进行简要合并 |
| novel$'小说类别' = "其他" |
| novel$'小说类别'[novel$小说类型 == "都市小说" | novel$小说类型 == "职场小说"] = "都市类小说" |
| novel$'小说类别'[novel$小说类型 == "科幻小说" | novel$小说类型 == "玄幻小说" | novel$小说类型 == "奇幻小说"] = "幻想类小说" |
| novel$'小说类别'[novel$小说类型 == "武侠小说" | novel$小说类型 == "仙侠小说"] = "武侠类小说" |
| # 求出每一类所占百分比 |
| ratio = table(novel$'小说类别') / sum(table(novel$'小说类别')) * 100 |
| # 定义标签 |
| label1 = names(ratio) |
| label2 = paste0(round(ratio, 2), "%") |
| # 画饼图 |
| pie(ratio, col = heat.colors(5, alpha = 0.4), labels = paste(label1, label2, sep = "\n"), font = 1) |
|
| heat.colors()#“配色模板”,产生类红色的一组邻近色,适用于渐变色场景 |
|
|
| #(二)单个定量变量:可以取连续数值的变量,如年龄、收入 |
| #横截面数据(不同对象在该变量上的取值)、时间序列数据(一个变量在不同时期的取值) |
| #描述单个定量变量:直方图、折线图 |
|
| #1)直方图:直观地展现数据的分布形态及异常值(针对横截面数据) |
|
| hist(x) #画出变量x的直方图 |
| #hist()的常用参数: |
| #xlab设置直方图的横坐标题目 |
| #ylab设置直方图的纵坐标题目 |
| #breaks设置直方图的组数或分割点 |
|
| #例: |
| ## 定量变量--直方图 ## |
| novel$总字数 = novel$总字数 / 10000 |
| par(mfrow = c(1, 2)) #实现一页多图的功能,这里是一行两列,一页两图 |
| chara = sort(novel$总字数)[1:1500] # 去掉异常值 |
| hist(chara, breaks = 10, xlab = "总字数(万字)", ylab = "频数", main = "", col = "lightblue") |
| hist(chara, breaks = 100, xlab = "总字数(万字)", ylab = "频数", main = "", col = "lightblue") |
|
|
| #2)折线图:观察该指标随时间变化的趋势(针对时间序列的数据) |
|
| #1、如果数据已经是R中的某种数据格式,比如时间序列格式tz,直接采用plot(x)即可 |
| plot(x) |
|
| #例: |
| ## 定量变量--折线图 ## |
| par(mfrow = c(1, 1)) |
| # 画时间序列图 |
| data(AirPassengers) #data()加载特定的dataset |
| head(AirPassengers) |
| ## [1] 112 118 132 129 121 135 |
| class(AirPassengers) |
| ## [1] "ts" |
| plot(AirPassengers) |
|
|
| #2、如果数据仅仅是一个普通向量 |
|
| #如果数据是年、月或者季度数据,采用tz()函数直接转换 |
| tz() |
|
| #如果数据是天数据或者不等间隔的时序数据,选用zoo包生成 |
| # install.packages(zoo) |
| library(zoo) |
| #生成时间序列数据需两步: |
| #一:设定好时间标签(如下面例子中的date) |
| #二:使用zoo()函数将时间标签及对应的数据“组合”在一起 |
| #最后:直接采用plot()函数画出折线图 |
|
| #例: |
| # 人民的名义百度搜索指数图 |
|
| # 将搜索指数index变成时间序列格式 |
| index = c(127910, 395976, 740802, 966845, 1223419, 1465722, 1931489, 2514324, 3024847, 3174056, 3208696, 3644736, 4198117, 3868350, 3576440, 3524784, 3621275, 3695967, 3728965, 3845193, 3525579, 3452680, 3535350, 3655541, 3884779, 3780629) / 10000 |
| date = seq(as.Date("2017-3-28"), length = 26, by = "day") |
| people_index = zoo(index, date) |
| class(people_index) |
| ## [1] "zoo" |
| plot(people_index, xlab = "时间", ylab = "百度搜索指数(万)", main = "《人民的名义》搜索指数折线图") |
|
| axis() #通过参数tick和label_name自定义横轴显示时间的格式 |
| #例: |
| # 更改坐标轴显示内容 |
| plot(people_index, xaxt = "n", xlab = "时间", ylab = "百度搜索指数(万)", main = "《人民的名义》搜索指数折线图") |
| times = date #or directly times = x.Date |
| ticks = seq(times[1], times[length(times)], by = "weeks") # month, weeks, year etc. |
| label_name = c("3月28日", "4月4日", "4月11日", "4月18日") |
| axis(1, at = ticks, labels = label_name, tcl = -0.3) |
|
|
|
|
| ### 两个变量 ### |
|
| #(1)切分画板 |
| par(mfrow=c(a,b)) #将画图的屏幕切分成a行b列个小格子 |
|
|
| #1)定性与定量变量--分组箱线图 |
| boxplot(y~x) #画分组箱线图,参数用“公式形式”,其中y是要对比的定量变量,x是分组变量 |
| #表示将y按照x分组,分别画箱线图 |
|
| #例: |
| # 将画板分成1行2列 |
| par(mfrow = c(1, 2)) |
| # 不同性质的小说总点击数和评论数有差别吗 |
| boxplot(log(总点击数) ~ 小说性质, data = novel, col = rainbow(2, alpha = 0.3), ylab = "总点击数对数") |
| boxplot(log(评论数) ~ 小说性质, data = novel, col = rainbow(2, alpha = 0.3), ylab = "总评论数对数") |
|
|
| #2) 两个定量变量--散点图 |
| plot(x,y) #画散点图 |
| #参数main为图加标题,text在图上添加文本,xlab、ylab设置坐标轴,col设置点的颜色,pch设定点的形状,cex设定符号的大小 |
|
| #例:(想看看小说的总点击数和评论数有何关联) |
| # 将画板恢复 |
| par(mfrow = c(1, 1)) |
| # 去除较大的异常值后画图 |
| test = novel[novel$评论数 < 8000 & novel$总点击数 < 200000, ] |
| x = test$总点击数 |
| y = test$评论数 |
| plot(x, y, pch = 1, cex = 0.6, xlab = "总点击数", ylab = "评论数") |
|
| #假如散点图显示的相关程度并不高,可以把某个连续变量离散化(分组),变成定性变量 |
| #例: |
| # 分组做分组箱线图 |
| aa = cut(x, breaks = c(0, 50000, 100000, 150000, 200000), labels = c("(0-5w]", "(5w-10w]", "(10w-15w]", "(15w-20w]")) |
| boxplot(y ~ aa, col = rainbow(4, alpha = 0.4), xlab = "总点击数", ylab = "评论数") |
|
|
| #一次性观察所有变量的相关关系 |
| plot(data.frame) #输出一个散点图矩阵 |
| #例: |
| plot(iris[, 1:4]) |
|
| #3)两个定性变量--堆积柱状图和并列(分组)柱状图 |
| barplot()#添加参数beside=T画出并列柱状图,beside=F画出堆积柱状图 |
|
| #备注:单变量柱状图需要输入一个向量,或类似向量的数据(如用table()函数生成的table类数据) |
| #而画堆积或并列柱状图,需要输入矩阵 |
|
|
| #例: |
| a = ddply(novel, .(小说类别,小说性质), nrow) |
| d = dcast(a, 小说性质 ~ 小说类别)[, -1] |
| ## Using V1 as value column: use value.var to override. |
| rownames(d) = c("VIP作品", "大众作品") |
| (d = as.matrix(d)) |
| ## 都市类小说 幻想类小说 其他 武侠类小说 |
| ## VIP作品 34 45 188 18 |
| ## 大众作品 339 404 370 149 |
|
| # beside = T,按列累计 |
| barplot(d, beside = F, col = rainbow(2, alpha = 0.3)) |
| legend("topright", legend = c("VIP作品", "大众作品"), |
| fill = rainbow(2, alpha = 0.3), cex = 0.8) |
|
| # beside = F,按列并列 |
| barplot(d, beside = T, col = rainbow(2, alpha = 0.3)) |
| legend("topright",legend= c("VIP作品", "大众作品"), |
| fill = rainbow(2, alpha = 0.3), cex = 0.8) |
|
|
| ################################################################ |
| #总结# |
|
| #基本统计图形:柱状图、箱线图、散点图、折线图、直方图、饼图 |
| library(plyr) #plyr包的主函数是**ply形式的 |
| library(reshape2) |
|
| ### 单个变量 ### |
| #(1)单个定性变量--柱状图 |
| barplot(height,names.arg)#height是柱子的高度,names.arg是柱子的名称 |
|
| #常用参数: |
| #names.arg可定义每个柱子的名字,即分类变量的类别名称 |
| #col可定义柱子的颜色 |
| #main可定义图标题 |
| #rainbow()生成彩虹色 |
| #alpha调节透明度 |
|
| #(2)单个定性变量--饼图 |
| pie(numerical_vector,labels)#numerical_vector是各类别的频数,labels是每块小饼的标签 |
|
| heat.colors()#“配色模板”,产生类红色的一组邻近色,适用于渐变色场景 |
|
| #(3)单个定量变量--直方图 |
| hist(x) |
| #hist()的常用参数: |
| #xlab设置直方图的横坐标题目 |
| #ylab设置直方图的纵坐标题目 |
| #breaks设置直方图的组数或分割点 |
|
| #(4)单个定量变量--折线图 |
| plot(x) |
| #如果数据是年、月或者季度数据,采用tz()函数直接转换 |
| tz() |
| #如果数据是天数据或者不等间隔的时序数据,选用zoo包生成 |
| library(zoo) |
| axis() #通过参数tick和label_name自定义横轴显示时间的格式 |
|
| ### 两个变量 ### |
| par(mfrow=c(a,b)) #将画图的屏幕切分成a行b列个小格子 |
|
| #(5)定性与定量变量--分组箱线图 |
| boxplot(y~x) #表示将y按照x分组,分别画箱线图 |
|
| #(6)两个定量变量--散点图 |
| plot(x,y) #参数main为图加标题,text在图上添加文本,xlab、ylab设置坐标轴,col设置点的颜色,pch设定点的形状,cex设定符号的大小 |
|
| #一次性观察所有变量的相关关系 |
| plot(data.frame) #输出一个散点图矩阵 |
|
| #(7)两个定性变量--堆积柱状图和并列(分组)柱状图 |
| barplot()#添加参数beside=T画出并列柱状图,beside=F画出堆积柱状图 |
|
| ################################################################ |