【R语言】实验四 数据分析

系列文章目录

实验一 R 语言数据结构、数据导入与数据处理

实验二 基本数据处理

实验三 数据可视化

实验四 数据分析

实验五 综合应用


实验数据

实验数据下载

1. hospital-data 数据集
数据是关于一些医院的基础信息,数据包含13个字段,包含的字段分别为:供应商编号、医院名、地址 1、地址2、地址3、所处城市、所处州、邮编、所处乡镇、电话、医院类型、医院所有权和是否提供急救服务。数据信息如下:

Provider Number 供应商编号 Hospital Name 医院名 Address 1 地址1
Address 2 地址2 Address 3 地址3 City 所处城市
State 所处州 ZIP Code 邮编 County 所处乡镇
Phone Number 电话 Hospital Type 医院类型 Hospital Ownership 医院所有权
Emergency Services 是否提供急救服务

2. death rate 数据集
选取人类死亡率数据库(HMD,2007),提供了 1951-2005 年瑞典人口信息。这是个多变量的数据集,变量描述如下表:

Year 年份 Age 年龄
Female_Exp 女性生存人口数 Male_Exp 男性生存人口数
q_female 女性死亡率 q_male 男性死亡率
Female_death 女性死亡人数 Male_death 男性死亡人数
L_female_exp 对数女性生存人口数 L_male_exp 对数男性生存人口数

3. outcome-of-care-measures 数据集
该数据是记录超过4000家医院关于心脏病、心力衰竭、肺炎的30天内的死亡率和重入院率。(这份数据变量解释,可参照Hospital_Revised_Flatfiles.pdf中的 Outcome of Care Measures.csv 的变量请参考第 17 页编号 19),数据信息如下:

Provider Number 供应商编号 Hospital Name 医院名
Address 1 地址1 Address 2 地址2
Address 3 地址3 City 所处城市
State 所处州 ZIP Code 邮编
County 所处乡镇 Phone Number 电话
Hospital 30-Day Death (Mortality) Rates from Heart Attack 医院心脏病发作30天死亡率-列出各医院的风险调整率(百分比) Comparison to U.S. Rate - Hospital 30-Day Death (Mortality) Rates from Heart Attack 与美国死亡率的比较-心脏病发作的医院30天死亡率-列出医院所属的死亡率和再入院类别。数值为:优于美国全国平均值、与美国全国平均值无差异、低于美国全国平均值、病例数量太少
Lower Mortality Estimate - Hospital 30-Day Death (Mortality) Rates from Heart Attack 较低的死亡率估计-心脏病发作的医院30天死亡率-列出各医院风险调整率的下限(区间估计) Upper Mortality Estimate - Hospital 30-Day Death (Mortality) Rates from Heart Attack 死亡率上限估计-心脏病发作的医院30天死亡率-列出各医院风险调整率的上限(区间估计)
Number of Patients - Hospital 30-Day Death (Mortality) Rates from Heart Attack 患者人数-因心脏病发作住院30天死亡率-列出医院治疗心脏病发作的医疗保险患者人数 Footnote - Hospital 30-Day Death (Mortality) Rates from Heart Attack 脚注-心脏病发作的医院30天死亡率-列出与医院护理的心脏病发作结果相关的适当脚注值
Heart Failure 心力衰竭 Pneumonia 肺炎

提示:以下是本篇文章正文内容

一、实验目的

在数据被组织成合适的形式后,开始使用图形探索数据,而下一步通常就是使用数值描述每个变量的分布,接下来则是两两探索所选择变量之间的关系。

  1. 描述性统计分析
  2. 频数表(列联表)
  3. 独立性检验
  4. 相关性检验
  5. t 检验
  6. 方差分析
  7. 组间差异的非参数检验

二、实验内容

题目1

  1. 通过读取“hospital-data.csv”将数据保存到 df 中,获取该数据的条数;查看数据中的前 5 条数据。
  2. 查看数据概况;求得邮编的范围。
  3. 我们默认电话号码是个数值,没有实际意义;应用 sapply 函数,通过调用用户自定义函数,返回电话号码的最大值,最小值,均值,中位数,标准差和方差。
  4. 利用 aggregate 求取各州的电话号码的中位数。
  5. 利用 by 求取各城市的电话号码的最大值和最小值;显示结果的前 3 条数据。
  6. 对所属州生成简单的频数统计表;并将这个频数表转化为比例值。
  7. 建立所属州和医院类型的二维列联表,命名为 mycontable;按列生成边际和。
  8. 利用 CrossTable 建立所属乡镇和是否提供急救服务字段的二维列联表,命名为 mycrosstable。

题目2

  1. 通过读取文件 death rate.csv 获取数据保存到 death 中,通过卡方检验来检验年龄与男性生存人口数(二级列联表)之间是否独立。
  2. 通过 assocstats 函数来度量年龄与男性的死亡率(二级列联表)之间的相关性。
  3. 计算年龄与男性的死亡率之间的 Pearson 和 Spearman 相关系数和 death 中所有变量的协方差。

题目3

通过读取文件 outcome-of-care-measures.csv 获取数据保存到 care_df 中,通过写一个名为 best 的函数,找到一个州中最好的医院,函数有两个参数,一个是有两个字母缩写的州名称,另一个是结果名称,包括(heart attack, heart failure, pneumonia),函数的返回结果为 30 天死亡率最低的医院名称。在处理排名的时候,如果出现死亡率相等的情况,将医院按照字母表顺序排序,取第一家医院。

自定义函数:best <- function(state, outcome){}。函数检查输入变量的有效性,如果输入一个无效的州名,函数停止程序,并提示”invalid state”,同样当输入的 outcome 参数有误时,提示”invalid outcome”

函数检验:best(“TX”, “heart failure”);best(“MD”, “heart attack”);best(“MD”, “pneumonia”);best(“BB”, “heart attack”);best(“NY”, “hert attack”)


三、实现过程与实验结果

题目1

1.通过读取“hospital-data.csv”将数据保存到df中,获取该数据的条数;查看数据中的前 5 条数据。

# 读取数据
df <- read.csv("R\\data\\ex4\\hospital-data.csv")
# 获取该数据的条数
nrow(df)
## [1] 4826
# 查看数据中的前5条数据
head(df, n = 5)

2.查看数据概况;求得邮编的范围。

# 查看数据概况
summary(df)
# 求得邮编的范围
range(df$ZIP.Code)
## [1]   603 99929

3.我们默认电话号码是个数值,没有实际意义;应用sapply函数,通过调用用户自定义函数,返回电话号码的最大值、最小值、均值、中位数、标准差和方差。

# 自定义函数
getSummary <- function(x, na.omit=FALSE) {
  if(na.omit)
    x <- x[!is.na(x)]
  getMax <- max(x)
  getMin <- min(x)
  getMean <- mean(x)
  getMedian <- median(x)
  getSd <- sd(x)
  getVar <- var(x)
  return(c(
    max = getMax,
    min = getMin,
    mean = getMean,
    median = getMedian,
    sd = getSd,
    var = getVar
  ))
}
# sapply(X, FUN, …,simplify) 输入为列表(list) 返回值为向量
sapply(df["Phone.Number"], getSummary)
##        Phone.Number
## max    9.898943e+09
## min    9.369338e+08
## mean   5.829414e+09
## median 6.033435e+09
## sd     2.333778e+09
## var    5.446519e+18

4.利用 aggregate 求取各州的电话号码的中位数。

# aggregate(x,by,FUN)
aggregate(df$Phone.Number, by = list(State = df$State), median)
##    State          x
## 1     AK 9074869592
## 2     AL 2563366806
## 3     AR 5019772300
## 4     AS 6846334590
## 5     AZ 6024974278
## 6     CA 6506965270
## 7     CO 7202251000
## 8     CT 8603446000
## 9     DC 2027456100
## 10    DE 3026453300
……

5.利用 by 求取各城市的电话号码的最大值和最小值;显示结果的前 3 条数据。

getMaxAndMin <- function(x, na.omit=FALSE) {
  if(na.omit)
    x <- x[!is.na(x)]
  getMax <- max(x)
  getMin <- min(x)
  return(c(max = getMax, min = getMin))
}
# by(data, INDICES, FUN, …, simplify = TRUE)
# 将data中的数据,按照INDICES里面的内容拆分成若干个小的data frame,并且在每一小块data frame上应用FUN函数。
head(by(df$Phone.Number, df$City, getMaxAndMin), n = 3)
## $ABBEVILLE
##        max        min 
## 8643665011 3378986501 
## 
## $ABERDEEN
##        max        min 
## 6056225000 3605328330 
## 
## $`ABERDEEN                      `
##        max        min 
## 6623692455 6623692455

6.对所属州生成简单的频数统计表;并将这个频数表转化为比例值。

# 对所属州生成简单的频数统计表
stable <- table(df$State)
stable
# 将频数表转化为比例值
ptable <- prop.table(stable)
ptable

7.建立所属州和医院类型的二维列联表,命名为 mycontable;按列生成边际和。

# 所属州和医院类型的二维列联表
mycontable <- with(df, table(State, Hospital.Type))
head(mycontable)
# 按列生成边际和
margin.table(mycontable, 2)

8.利用 CrossTable 建立所属乡镇和是否提供急救服务字段的二维列联表,命名为 mycrosstable。

# install.packages("gmodels")
library(gmodels)
mycrosstable <- CrossTable(df$County, df$Emergency.Services) 
head(mycrosstable)

题目2

1.通过读取文件 deathrate.csv获取数据保存到death中,通过卡方检验来检验年龄与男性生存人口数(二级列联表)之间是否独立。

# 读取数据保存到death中
death <- read.csv("R\\data\\ex4\\death rate.csv")
# 卡方检验
library(vcd)
# 生成列联表
mytable <- xtabs( ~ Male_Exp + Age, data = death)
# 卡方检验
# 原假设:年龄与男性生存人口数独立
# 备择假设H1:年龄与男性生存人口数不独立,即存在某种关系
chisq.test(mytable)
## 
##  Pearson's Chi-squared test
## 
## data:  mytable
## X-squared = 617857, df = 609201, p-value = 2.956e-15
# p小于0.05,有足够理由否定H0,即说明年龄与男性生存人口数独立

2.通过 assocstats 函数来度量年龄与男性的死亡率(二级列联表)之间的相关性。

# 生成列联表
mytable <- xtabs( ~ q_male + Age, data = death)
# 相关性
assocstats(mytable)
##                     X^2     df P(> X^2)
## Likelihood Ratio  51232 505978  1.00000
## Pearson          503827 505978  0.98387
## 
## Phi-Coefficient   : NA 
## Contingency Coeff.: 0.994 
## Cramer's V        : 0.888
# phi系数、列联系数、Cramer's V系数
# 总体来说,较大的值意味着较强的相关性

3.计算年龄与男性的死亡率之间的Pearson和Spearman相关系数,death中所有变量的协方差。

# Pearson积差相关系数
cor(death[,c('q_male','Age')])
##        q_male Age
## q_male      1  NA
## Age        NA   1
# Spearman相关系数
cor(death[,c('q_male','Age')], method="spearman")
##        q_male Age
## q_male      1  NA
## Age        NA   1
# 协方差
cov(death)

4.检验女性生存人口数和男性生存人口数之间的相关性的显著性。

# 检验女性生存人口数和男性生存人口数的Pearson相关系数为0的原假设
cor.test(death[,'Female_Exp'],death[,'Male_Exp'])
## 
##  Pearson's product-moment correlation
## 
## data:  death[, "Female_Exp"] and death[, "Male_Exp"]
## t = 550.72, df = 6103, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9895806 0.9905709
## sample estimates:
##      cor 
## 0.990088
# p-value 远小于0.05 拒绝原假设
# 女性生存人口数和男性生存人口数之间的总体相关度不为零
# install.packages("psych")
library(psych)
corr.test(death[,c('Female_Exp','Male_Exp')], use="complete")
## Call:corr.test(x = death[, c("Female_Exp", "Male_Exp")], use = "complete")
## Correlation matrix 
##            Female_Exp Male_Exp
## Female_Exp       1.00     0.99
## Male_Exp         0.99     1.00
## Sample Size 
## [1] 6105
## Probability values (Entries above the diagonal are adjusted for multiple tests.) 
##            Female_Exp Male_Exp
## Female_Exp          0        0
## Male_Exp            0        0
## 
##  To see confidence intervals of the correlations, print with the short=FALSE option

题目3

通过读取文件 outcome-of-care-measures.csv获取数据保存到care_df中。通过写一个名为 best 的函数,找到一个州中最好的医院。函数有两个参数,一个是有两个字母缩写的州名称,另一个是结果名称,包括(heartattack、heartfailure、pneumonia),函数的返回结果为30天死亡率最低的医院名称。在处理排名的时候,如果出现死亡率相等的情况,将医院按照字母表顺序排序,取第一家医院。

# 读取数据保存到care_df中
care_df <- read.csv("R\\data\\ex4\\outcome-of-care-measures.csv")
# best函数
best <- function(state, outcome) {
  if (!state %in% care_df$State)
    return("invalid state")
  if (!outcome %in% c("heart attack", "heart failure", "pneumonia"))
    return("invalid outcome")
  a <- care_df[care_df$State == state,]
  if (outcome == "heart attack") {
    a <-
      a[a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack != "Not Available",]
    a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack <-
      as.numeric(a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack)
    b <-
      a[order(a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack), ]
  } else if (outcome == "heart failure") {
    a <-
      a[a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure != "Not Available",]
    a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure <-
      as.numeric(a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure)
    b <-
      a[order(a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure), ]
  } else{
    a <-
      a[a$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia != "Not Available",]
    a$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia <-
      as.numeric(a$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia)
    b <-
      a[order(a$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia), ]
  }
  return(hospital = b[1,]["Hospital.Name"])
}
best("TX", "heart failure")
##                   Hospital.Name
## 3935 FORT DUNCAN MEDICAL CENTER
best("MD", "heart attack")
##                    Hospital.Name
## 1875 JOHNS HOPKINS HOSPITAL, THE
best("MD", "pneumonia")
##                         Hospital.Name
## 1900 GREATER BALTIMORE MEDICAL CENTER
best("BB", "heart attack")
## [1] "invalid state"
best("NY", "hert attack")
## [1] "invalid outcome"

四、总结

以上就是全部内容。

你可能感兴趣的:(R语言,r语言)