计算数据框中某类参数的所需的数
str(airquality)
summary(airquality)
mean(airquality$Ozone,na.rm=T) #na.rm默认是F,但得到的数也是缺失值,所以要=T,忽略缺失值
mean(airquality$Ozone,na.rm=T,trim=0.01) #trim是切尾,按比例各去掉百分之一的头和尾巴,再计算mean
加权平均数
temp100=rnorm(100,30,1) #rnorm(n,mean=30,sd=1) n个,平均值是mean,方差是1,默认mean=0,sd=1
w=1:100 #随即产生了100年的温度,第一年的温度没参考价值w=1
temp100
library(stats)
(wtm<-weighted.mean(temp100,w,na.rm=T)) #加权平均数 w是权数,
(tm=mean(temp100,na.rm=T)) #又顺便求一下平均数
几何平均数
x<-c(0.045,.021,.255,.019)
(xm=mean(x))
(xg=exp(mean(log(x))))
中位数
(tmid=median(temp100,na.rm=T))
分位数
quantile,就很常跟probs
(quantile(airquality$Temp,na.rm=T))
quantile(airquality$Temp,probs=c(0,0.1,0.9,1))
方差和标准差
方差var()
(tv=var(temp100)) #var方差
temp100
(ts=sd(temp100)) #sd标准差
ts^2 #标准差的平方等于方差
函数fivenum()
fivenum(temp100) #五个数分别是:最小值,lower-hinge,中位数,upper-hinge,最大值
#lower-hinge是先取中间两个数得到中位数(100个),再前49加上这个中位数,再取前50个的中位数
quantile(temp100)
协方差cov()
summary(airquality)
cov(airquality[,-5:-6],use='pairwise.complete.obs') #cov求协方差,把五六列去掉月份和天数 use是配对删除
cov(airquality[,-5:-6],use='complete.obs') #use是整行删除
var(airquality$Ozone,na.rm = T)
var(airquality$Solar.R,na.rm = T)
#协方差的表格对角线就是他自己的方差
相关系数cor()
cor(airquality[,-5:-6],use='pairwise.complete.obs') #cor求相关系数
cor(airquality[,-5:-6],use='complete.obs')
apply(airquality[,c(-5,-6)],2,FUN=mean,na.rm=T)
去掉5、6列,在将每列进行mean操作
分组统计量
split(airquality[,-5:-6],airquality$Month) #根据Month将去掉5,6列的airquality进行分组,简单的 返回的是列表
airquality
sapply(split(airquality$Temp,airquality$Month),FUN = quantile,probs=c(0,0.1,0.9,1))
#前面的split是按月份将温度分组,FUN就在对其中细的进行分组,quantile就分位数进行分组,quantile后就有了probs
lapply(split(airquality$Temp,airquality$Month),FUN = quantile,probs=c(0,0.1,0.9,1))
#laaply和sapply 一样的就返回的不一样,lapply返回的是列表,sapply是向量或矩阵,通常用sapply好看点
sapply(split(airquality$Temp,list(airquality$Month,airquality$Day)),FUN = quantile,probs=c(0,0.1,0.9,1))
#就按月份和日期进行分组了,因为有两个,就把他们组成了一个list放一起,因为他这个DAY一天只有一条数据,不太好看,如果一天很多条数据就会好一点
tapply(airquality$Temp,airquality$Month,FUN = quantile,probs=c(0,0.1,0.9,1))
#tapply不像sapply,不用split进行分组了,但结果是一个list
split后就先显示月份,再其他信息
上面这些分类统计量的缺点是,只能处理一个变量(就最前面那个)
aggregate(airquality[,-5:-6],by=list(airquality$Month),FUN=mean,na.rm=T)#na.rm是丢给mean的
aggregate(airquality[,-5:-6],by=list(airquality$Month,airquality$Day),FUN=mean,na.rm=T)#因为这个DAY只有一天,就很蠢取mean
aggregate(cbind(Ozone,Solar.R)~Month,data=airquality,FUN=quantile,probs=c(0,.1,.9,1))
#前面ozone,solar.r是数据集,month是分组的列
例子:
airquality
attach(airquality)
cor(Ozone,Wind,use='pairwise.complete.obs') #求的ozone和wind的相关系数
by(cbind(Ozone,Wind),Month,function(m) cor(m[,1],m[,2],use='pairwise.complete.obs'))
#ozone和wind按Month进行分组,再求相关系数,就不同月ozone和wind的相关系数
as.vector( by(cbind(Ozone,Wind),Month,function(m) cor(m[,1],m[,2],use='pairwise.complete.obs')))
#将上面那个结果转为向量的形式
detach(airquality)
可视化
①单变量
散点图
x=rnorm(1000,100,5) #rnorm(n,mean=30,sd=1) n个,平均值是mean,方差是1,默认mean=0,sd=1
plot(x) #散点图,x轴是100个数的编号,像正态分布,rnorm就是正态分布的差不多的东西
abline(h=100) #h是高度,abline是画一条直线
plot(airquality$Ozone)
箱线图boxplot
boxplot(airquality$Ozone)
?boxplot #也可以查下参数,再水平摆放
boxplot(airquality$Ozone,horizontal=T) #他有两个边,边中间有一个长方形,再长方形里面有一个竖线
#两个边对应的最小值和最大值(对于标准的箱线图,外面没点),长方形左边的是25%的分位点,右边是75%分位点.里面的竖线是50%的分位点
#当然还可以改箱子的两边的分位点的百分比
#长方形的宽度是IQR(四分位距),第一、三个四分位数之间的间距
#最右边的竖线到箱子的右边不能超过1.5*IQR,如果有最大值超过了这个,就最右边的竖线用1.5*IQR来划
#这个图箱子外面的两个点,是超出的两个点,就说明可能是异常值
airquality$Ozone
直方图hist
hist(x)
hist(airquality$Ozone)
hist(airquality$Ozone,breaks=seq(0,180,5),prob=T)
#就改变每条柱子的宽度,0到180之间每5个一条柱子,prob=T就不在统计频数了,改为频率(纵坐标)
lines(density(airquality$Ozone,na.rm=T),col=3,lw=4)
#density是生成密度数据,再用lines连起来,是核密度估计图
画布布置
par(mfrow=c(1,2)) #控制画布的布局
hist(airquality$Ozone,breaks=seq(0,180,5),prob=T) #画了直方图
lines(density(airquality$Ozone,na.rm=T),col=3,lw=4) #画了核密度估计图 col=3颜色是绿色,lw=4控制粗细
library(carData)
library(car)
qqPlot(airquality$Ozone) #qq图是专门用来看是否符合正态分布的,之间的直线是如果是标准的正态分布的话,点全在直线上,边上的两条线是95%的置信区间,
par(mfrow=c(1,1)) #再把画布还原回去
par(mfrow=c(1,3)) #par画布分为三个
attach(airquality)
plot(density(Ozone,na.rm=T))
abline(v=mean(Ozone,na.rm=T),col='red',lw=2) #红色均值线,v是垂直的维度
abline(v=median(Ozone,na.rm=T),col='green',lw=2) #绿色中位数线
#看图是右偏的数据,就说明有很多极大值的存在,拉着均值往右跑,如果两侧对称的就会重合,均值比中位数大
boxplot(Ozone)
abline(h=mean(Ozone,na.rm=T),col='red',lw=2) #h是水平的维度
vioplot(na.omit(airquality$Ozone)) #小提琴图把箱线图和核密度估计图结合起来
abline(h=mean(Ozone,na.rm=T),col='red',lw=2)
par(mfrow=c(1,1)) #再把画布还原回去
detach(airquality)
但是他那个vioplot包安装不了 什么sm包,,,就只显示了两个图
table()看频数
table(airquality$Month) #table看的频数表
barplot(table(airquality$Month))#再画成柱状图
②双变量的可视化
散点图()
先简单看下散点图
attach(airquality)
plot(Wind,Temp)
detach(airquality)
添加回归线:
1、一元线性回归y=ax+b 直线 黑色的
attach(airquality)
plot(Wind,Temp)
alm=lm(Temp~Wind) #做了一个回归模型放到了alm里面
abline(alm$coefficients) #回归模型的coefficients画出来
2、局部加权回归 :画的红色的线
alowess=loess(Temp~Wind) #首先得到回归模型loess放到alowess里面
ord=order(Wind)
lines(Wind[ord],alowess$fitted[ord],lwd=1,col=2,lty=2)
detach(airquality)
他这个col可以是数字也可以说直接'red'、‘blue'
lwd参数是线宽,1=默认线宽、n=默认线宽的n倍、-n=默认线宽的1/n倍
lty参数是设置线的类型1=实线、2=虚线、3=点线、4=点+短虚线、5=长虚线、6=点+长虚线
问题:解决数据点重叠
x=rbinom(1000,10,0.1)
y=rbinom(1000,10,0.1) #先构造两个数据集,有1000个数据点,都重复到一块了 一个小白点后面有很多个点
par(mfrow=c(1,4)) #分为4个画布
plot(x,y)
sunflowerplot(x,y,cl='red',seg.col='blue') #向日葵seg.col花瓣的颜色蓝色
plot(jitter(x),jitter(y)) #扰动的方式jitter
smoothScatter(x,y) #蘑菇
第一个plot就全部都重叠在一起了
散点图集
pairs(airquality[,-5:-6]) #就有点像相关系数的那个表
plot(airquality[,-5:-6]) #跟上面这个画出来一样的
#错误的函数:
scatterPlotMatrix((airquality[,-5:-6]),lty.smooth=2,spread=F) #NO不是这个
?scatterPlotMatrix #NO不是这个
#真正的函数:
car::scatterplotMatrix((airquality[,-5:-6]),lty.smooth=2,spread=F) #是car包里的
第一个图里最下面的竖线是密度分布一样的,一元线性回归线 直线,曲线是局部加权回归曲线
smooth=2就是画局部加权回归曲线
用了scatterplot后才有的下面这个蓝色的图
相关系数
library(corrgram)
corrgram(airquality[,-5:-6],lower.panel=panel.conf,upper.panel=panel.pie,text.panel=panel.txt)
#都是n*n的,下三角区是相关系数,括号里面的相关系数的区间估计,是对称矩阵,看颜色来对于正负相关,正的蓝色
#lower.panel=conf控制下三角区是数字,upper.panel=pie控制上三角区是pie,斜对角可以是text.panel文字区也可以是diag.panel对角区
corrgram(airquality[,-5:-6],lower.panel=panel.conf,upper.panel=panel.pts,diag.panel=panel.minmax)
#pts是散点图,斜对角里面还展示了左下和右上的最小值和最大值
马赛克图
library(grid)
library(vcd) #马赛克图 就随便看看
mosaic(~cyl+gear,data=mtcars,shade=T,legend=T)