《统计学基于R》第一章 数据与R
文章目录
1.1 数据与统计学
1.1.1 什么是统计学
1、统计学:统计学是一门分析数据的科学,它提供了收集数据、处理数据和分析数据的一套方法和技术。
2、处理数据:包括数据的录入、筛选、分类和汇总等。
3、分析数据:利用统计学方法对数据进行分析。包括描述统计和推断统计。
4、描述统计:主要利用图表形式对数据进行汇总和展示,计算一些简单的统计量(诸如比例、比率、平均数和标准差等)。
5、推断统计:利用样本信息来推断总体的特征,内容包括参数估计和假设检验两大类。
6、参数估计:是利用样本信息推断所关心的总体特征
7、假设检验:是利用样本信息判断总体的某个假设是否成立。
1.1.2变量和数据
1、变量:变量是描述所观察对象某种特征,从一次观察到下一次观察可能会出现不同结果。
2、数据:变量的观测结果。
3、变量的分类
1.1.3 数据的来源
1、抽样:亲自调查或实验
2、总体:包含所研究的全部个体(或数据)的集合
3、样本:从总体中抽取的一部分元素的集合
4、样本量:构成样本的元素的数目
5、概率抽样:根据已知的概率抽取样本元素,也称随机抽样
6、简单随机抽样:从总体N个单位(元素)中随机地抽取n个单位作为样本,使得总体中每一个元素都有相同的机会(概率)被抽中。抽取元素的具体方法有放回抽样和无放回抽样
7、分层抽样(分类抽样):将总体单位按某种特征或规则划分为不同层,再从不同的层中随机地抽取样本
8、系统抽样(等距抽样):将总体中的所有单位(抽样单位)按一定顺序排列,并按某种规则确定一个随机起点,然后每隔一定间隔抽取一个元素,直至抽取n个元素组成一个样本。
9、整群抽样:将总体中若干个单位合并为组(群),抽样时直接抽取群,再对中选群中的所有单位全部实施调查。
1.2 R的初步使用
1.2.1 R语言
R语言:一种自由软件编程语言,主要用于统计分析、绘图、数据挖掘
1.2.2 对象赋值与运行
#对象赋值
x<-c(80,87,98,73,100) # 将5个数据赋值给对象x
# 对象运行
sum(x) # 计算对象x的总和
mean(x) # 计算对象x的平均数
var(x) # 计算对象x的方差
barplot(x) # 绘制对象x的条形图
1.2.3 查看帮助信息
help(sum) # 查看mean函数的帮助信息
help(plotmath) # 查看R的数学运算符
help(package="stats") # 查看包stats的信息
var # 查看var函数源代码
1.2.4 包的安装和加载
# 安装包
install.packages("car") # 安装包car
install.packages(c("car","vcd")) # 同时安装两个包
# 加载包
library(car) # 加载包car
require(car) # 加载包car
# 显示已安装包的名称
installed.packages(all.available=TRUE)
# 卸载(删除)安装在R中的包
remove.packages("vcd") # 从R中彻底删除vcd包
# 查看包中的函数
help(package=vcd)
1.3 R数据
R的基本数据类型:数值型、字符型、逻辑型、因子型。
R的基本数据结构:向量、矩阵、数组、数据框、因子、列表。
1.3.1 创建R格式数据
1、 向量:一维数组,可以是数值型数据、字符数据或逻辑值
# 用c函数创建向量
a<-c(2,5,8,3,9) # 数值型向量
b<-c("甲","乙","丙","丁") # 字符型向量
c<-c("TRUE","FALSE","FALSE","TRUE") # 逻辑值向量
# 创建向量其他方法
v1<-1:6 # 产生1~6的等差数列
v2<-seq(from=2,to=4,by=0.5) # 在2~4之间产生步长为0.5的等差数列
v3<-rep(1:3,times=3) # 将1~3的向量重复3次
v4<-rep(1:3,each=3) # 将1~3的向量中每个元素重复3次
2、 矩阵:二维数组,其中每个元素都是相同的数据类型
# 用matrix函数创建矩阵
a<-1:6 # 生成1到6的数值向量
mat<-matrix(a,nrow=2,ncol=3,byrow=TRUE) # 生成2行3列的矩阵
rownames(mat)=c("甲","乙") # 添加行名
colnames(mat)=c("A","B","C") # 添加行名
# 取出矩阵元素
mat[1,2] # 注:角标从1开始不是从0开始
mat["甲","B"]
mat[1:2,c(1,2)]
t(mat) # 矩阵转置
3、数据框:表格结构数据
# 写入姓名和分数向量
names<-c("刘文涛","王宇翔","田思雨","徐丽娜","丁文斌")
stat<-c(68,85,74,88,63)
math<-c(85,91,74,100,82)
econ<-c(84,63,61,49,89)
# 将向量组织成数据框形式
table1_1<-data.frame(学生姓名=names,统计学=stat,数学=math,经济学=econ)
1.3.2 数据的读取、处理和保存
1、读取和保存R格式数据
# 读取R格式的数据
load("./data/matrix1_1.RData")
# 保存为R格式的数据
save(matrix_1, file="./data/matrix1_1.RData")
2、读取和保存csv数据
# 读取包含标题的csv格式数据
table1_1<-read.csv("C:/example/chap01/table1_1.csv")
# 读取不包含标题的csv格式数据
table1_1<-read.csv("C:/example/chap01/table1_1.csv", header=FALSE)
# 将tablel_1存为csv格式文件
write.csv(table1_1, file="C:/mydata/chap01/table1_1.csv“ )
3、读取和保存xlsx数据
# 读取*.xlsx的数据
install.packages("readxl")
library("readxl")
test.df<-read_excel("./data/test_excel.xlsx",sheet=1,col_names=T,col_types=NULL)
# 保存*.xlsx的数据
install.packages("writexl")
library("writexl")
write_xlsx(x = test.df,"./data/save_excle.xlsx")
4、在R中查看数据
head(table1_1,3) # 查看前3行
tail(table1_1,3) # 查看后3行
nrow(table1_1) # 查看行数
ncol(table1_1) # 查看列数
dim(table1_1) # 同时查看行数和列数
class(table1_1) # 查看table1_1的数据类型
str(table1_1) # 查看每列数据的数据结构
1.3.3 数据的使用和编辑
1、数据排序
## 按学生姓名第一个字母升序排列
table1_1<-read.csv("./data/example/chap01/table1_1.csv")
newdata<-table1_1[order(table1_1$姓名),]
## 按统计学成绩降序排列
newdata1<-table1_1[order(table1_1$统计学,decreasing=TRUE),]
newdata1<-table1_1[order(-table1_1$统计学),]
2、选择数据框中特定的列
mean(table1_1$统计学) # 选定数据框中的某一列求平均数
mean(table1_1[,2]) # 选定数据框中的第2列求平均数
3、对矩阵的行列处理
load("./data/matrix1_1.RData")
# 对行或列求和
colSums(matrix1_1[,1:3])
rowSums(matrix_1)
# 将求和结果加到原矩阵上
rbind(matrix1_1,colSums(matrix1_1[,1:3])) # 对列求和后,按行合并
cbind(matrix1_1,rowSums(matrix1_1)) # 对行求和后,按列合并
# apply对矩阵处理
apply(matrix1_1, 1, sum) # 对矩阵所有行求和
apply(matrix1_1, 2, sum) # 对矩阵所有列求和
apply(matrix1_1, 1, mean) # 对矩阵所有行求平均
apply(matrix1_1, 2, mean) # 对矩阵所有列求平均
apply(matrix_1, 2, std) # 对矩阵所有列求标准差
4、编辑数据框
# 变量重命名
table1_1<-read.csv("./data/example/chap01/table1_1.csv")
head(table1_1,3)
install.packages("reshape")
library(reshape)
rename(table1_1, c(姓名="name",统计学="stat")) # 对副本重命名,原数据框列名不变
table1_1<-rename(table1_1,c(姓名="name",统计学="stat")) # 对原数据框重命名
5、缺失值处理
x<-c(2,4,6,NA)
is.na(x) # 判断是否有空值
sum(x) # 一旦有空值,则求和得到的也是NA
sum(x,na.rm=TRUE) # 排除空值后求和
table1_2<-read.csv("./data/example/chap01/table1_2.csv")
table1_3<-na.omit(table1_2);table1_3 # 删除含有空值的行
6、数据框的合并
rbind(d1.df,d2.df) # 当两个数据框的列变量相同时,可以按行合并
cbind(d1.df,d4.df) # 当两个数据框的行索引相同时,可以按列合并。
7、因子类型
类别变量在R中称为因子(factor),因子的取值称为水平。
a<-c("金融","地产","医药","医药","金融","医药") # a是字符串向量
f<-factor(a) # 将a转换成因子,f是无序的因子,level默认按照拼音排序
num<-as.numeric(f) # 将因子转换成数值数据
b<-c("很好","好","一般","差","很差")
f<-factor(b,order=TRUE) # f是有序因子,但顺序按拼音字母排序,不是我们理想的的排序
bb<-c("很好","好","一般","差","很差")
ff<-factor(bb,order=TRUE,
levels=c("很好","好","一般","差","很差")) #指定理想的level排序
1.3.4 数据类型转换
1、数据框—>向量
table1_1<-read.csv("C:/example/chap01/table1_1.csv")
vector1<-as.vector(table1_1$统计学) # 将统计学分数转换成向量
vector2<-as.vector(c(table1_1$统计学,table1_1$数学)) # 将统计学和数学分数合并转换成向量
vector3<-as.vector(as.matrix(table1_1[,2:4])) # 将数据框转换为向量
2、数据框<—>矩阵
# 将数据框转换为矩阵
mat<-as.matrix(table1_1[,2:4]) # 转换为矩阵mat
rownames(mat)=table1_1[,1] # 矩阵的行名为table1_1第1列的名称
# 将矩阵转化成数据框
as.data.frame(mat)
3、短格式—>长格式
library(reshape2)
# 融合table1_1与id变量,并命名variable.name="课程",value.name="分数"
tab.long<-melt(table1_1,id.vars="姓名",variable.name="课程",value.name="分数")
1.3.5 生成随机数
# 设置固定的seed后,产生的随机数都相同,每次用rnorm前都要设置
set.seed(15)
rnorm(n, mean=0, sd=1) # 产生n个服从均值为mean,方差为sd正态分布的随机数
runif(n, min, max) # 产生n个在min~max之间服从均匀分布随机数
rexp(n) # 产生n个服从指数分布的随机数
rchisq(n, df) # 产生n个服从自由度为df的卡方分布的随机数
1.3.6 数据抽样与筛选
函数sample(x,size,replace=FALSE,………)用于简单随机抽样。
其中,x为抽样的元素向量;size为样本量;函数默认replace=FALSE,表示无放回抽样;若replace=TRUE,为有放回抽样。
titanic.df <- read.csv(".//data//example//chap01//Titanic.csv")
str(titanic.df)
# 1. 采取无放回和有放回抽样方式抽取10个样本
x<-sample(titanic.df$PassengerId,10,replace=FALSE) #无放回抽样
y<-sample(titanic.df$PassengerId,10,replace=TRUE) #有放回抽样
# 2. 筛选出age<20的所有passenger的名字
xx<-sample(titanic.df$Name[titanic.df$Age<20])
1.4 R函数
table1_1<-read.csv(".//data//example//chap01//table1_1.csv")
x<-table1_1$统计学
myfun<-function(x){
n<-length(x)
mean<-sum(x)/n
r<-max(x)-min(x)
s<-sd(x)
summ<-data.frame(c(mean,r,s),row.names=c("平均数","极差","标准差"))
names(summ)<-"值"
return(summ)
}
y<-myfun(x)
1.5 数据的频数分布
1、频数分布:变量的取值及其相应的频数形成的分布。
一个类别变量——简单频数表
两个类别变量——二维列联表(交叉表)
多个类别变量——多维列联表
# 一维列联表
mytable1<-table(example1_1$社区)
# 将频数表转化成百分比表
prop.table(mytable1)*100
# 生成二维列联表
# 生成社区和态度的二维列联表
mytable2<-table(example1_1$态度,example1_1$社区)
addmargins(mytable2) # 为列联表添加边际和
addmargins(prop.table(mytable2)*100) # 将列联表转换成百分比表
# 生成三维频数表(列变量为“社区”)
# 行变量为性别和态度,列变量为社区
mytable3<-ftable(example1_1,row.vars=c("性别","态度"),col.vars="社区")
# 生成三维频数表(列变量为"社区",行变量为“性别”和"态度")
ftable(example1_1,row.vars=c("社区"),col.vars=c("性别","态度"))
# 为列联表添加边际和
ftable(addmargins(table(example1_1$性别,example1_1$态度,example1_1$社区)))
# 将列联表转化为数据框
install.packages("DescTools")
library(DescTools)
mytable<-ftable(example1_1,row.vars=c("社区"),col.vars=c("性别","态度"))
df<-Untable(mytable) # 将列联表转化成原始数据框
dff<-as.data.frame(mytable3) # 将列联表转换成带有交叉频数标签的数据框
2、计算描述统计量
频数(frequency) :落在各类别中的数据个数
百分比(percentage) :将对比的基数作为100而计算的比值
比例(proportion) :某一类别数据个数占全部数据个数的比值
比率(ratio) :不同类别数值个数的比值
3、 数值数据如何生成生成频数分布表?
(1)确定要分的组数
(2)确定各组的组距(组的宽度):组距=(最大值-最小值) ÷ 组数。
(3)统计出各组的频数即得频数分布表
# 数值数据的类别化
install.packages("DescTools")
library(DescTools)
example1_2<-read.csv(".//data//example//chap01//example1_2.csv")
tab<-Freq(example1_2$销售额)
# 指定组距,不含上限值
tab1<-Freq(example1_2$销售额,breaks=c(160,175,190,205,220,235,250,265,280),right=FALSE)
tab2<-data.frame(分组=tab1$level,频数=tab1$freq,
频数百分比=tab1$perc*100,累积频数=tab1$cumfreq,
累积百分比=tab1$cumperc*100) # 重新命名频数表中的变量