update book

This commit is contained in:
Yangzhuoran Yang 2021-08-08 09:26:20 +08:00
parent d6cee4e2d7
commit dc97b19112
167 changed files with 15990 additions and 4350 deletions

2655
RLanguage/RLearning.Rmd Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,34 +1,12 @@
--- # (PART) 准备工作 {-}
title: |
| DataWhale 组队学习 R语言数据分析
| Task 0 入门篇
author: "Fin"
date: "`r Sys.Date()`"
header-includes:
- \usepackage{ctex}
urlcolor: blue
output:
prettydoc::html_pretty:
theme: cayman
highlight: github
number_section: yes
toc: no
knit: (function(inputFile, encoding) {
rmarkdown::render(inputFile, encoding = encoding,
output_dir = "output", output_format = "all") })
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE,warning=FALSE, message=FALSE,tidy=TRUE,collapse=FALSE)
```
# 熟悉规则与R语言入门 {#task-00 .unnumbered}
![](./image/task00_intro_structure.jpg){width=100%} ![](./image/task00_intro_structure.jpg){width=100%}
## 安装
# 安装 ### R
## R
* R 语言是一门用于统计计算与绘图的编程语言和开源软件([The R Foundation](https://www.r-project.org/))。 * R 语言是一门用于统计计算与绘图的编程语言和开源软件([The R Foundation](https://www.r-project.org/))。
* R 语言是当今应用最多的统计软件之一。 * R 语言是当今应用最多的统计软件之一。
@ -38,7 +16,7 @@ knitr::opts_chunk$set(echo = TRUE,warning=FALSE, message=FALSE,tidy=TRUE,collaps
你可以从 CRAN 的网站上下载 Rhttps://cloud.r-project.org/。 你可以从 CRAN 的网站上下载 Rhttps://cloud.r-project.org/。
你也可以在[这里](https://cran.r-project.org/mirrors.html)选择任意一个镜像网站来下载 R. 你也可以在[这里](https://cran.r-project.org/mirrors.html)选择任意一个镜像网站来下载 R.
## RStudio ### RStudio
[RStudio](https://rstudio.com/products/rstudio/) 是针对 R 语言设计的集成开发环境。如果没有 RStudio 的话R 本身只提供一个简单的文本编辑器。如果把R语言本身比喻成飞机的话那么 RStudio 便是飞机场:你不需要它就可以飞,但是有了它会极大增加效率。它包括一个控制台、语法突出显示的编辑器、直接执行代码的支持,以及用于绘图、历史记录、调试和工作区管理的工具。 [RStudio](https://rstudio.com/products/rstudio/) 是针对 R 语言设计的集成开发环境。如果没有 RStudio 的话R 本身只提供一个简单的文本编辑器。如果把R语言本身比喻成飞机的话那么 RStudio 便是飞机场:你不需要它就可以飞,但是有了它会极大增加效率。它包括一个控制台、语法突出显示的编辑器、直接执行代码的支持,以及用于绘图、历史记录、调试和工作区管理的工具。
@ -46,7 +24,7 @@ knitr::opts_chunk$set(echo = TRUE,warning=FALSE, message=FALSE,tidy=TRUE,collaps
在本文档中,我们会介绍 RStudio 的用户界面和部分功能,帮助你尽快上手使用 RStudio 的数据分析。 在本文档中,我们会介绍 RStudio 的用户界面和部分功能,帮助你尽快上手使用 RStudio 的数据分析。
## R语言程辑包R Package ### R语言程辑包R Package
R 语言程辑包是 R 语言必不可少的部分。R语言能有他今天在统计学里的位置正是归功于其程辑包在统计计算方面的发展。一个程辑包为用户提供函数function、数据data或者插件addins。除了 R 本身自带的基础程辑包base、utils、stats等以外你还可以用以下代码来从 CRAN 上下载并安装额外的程辑包: R 语言程辑包是 R 语言必不可少的部分。R语言能有他今天在统计学里的位置正是归功于其程辑包在统计计算方面的发展。一个程辑包为用户提供函数function、数据data或者插件addins。除了 R 本身自带的基础程辑包base、utils、stats等以外你还可以用以下代码来从 CRAN 上下载并安装额外的程辑包:
@ -56,7 +34,7 @@ install.packages("tidyverse")
我们将会在这次组队学习中多次用到`tidyverse`。它其实是一系列程辑包的组合,主要提供数据清洗与处理的工具。 我们将会在这次组队学习中多次用到`tidyverse`。它其实是一系列程辑包的组合,主要提供数据清洗与处理的工具。
### 进阶的安装方法 #### 进阶的安装方法
当你应用 R 语言的能力到一定阶段之后,你会发现自己需要安装不在 CRAN 上发布的程辑包,或者你需要最新版本的程辑包( CRAN 上的包为了保证代码的可靠性,发布前需要经过一系列的检查与测试,这就导致 CRAN 上的版本往往不是最新的开发版本)。以安装 GitHub 上发布的程辑包为例,你可以使用以下代码: 当你应用 R 语言的能力到一定阶段之后,你会发现自己需要安装不在 CRAN 上发布的程辑包,或者你需要最新版本的程辑包( CRAN 上的包为了保证代码的可靠性,发布前需要经过一系列的检查与测试,这就导致 CRAN 上的版本往往不是最新的开发版本)。以安装 GitHub 上发布的程辑包为例,你可以使用以下代码:
@ -69,7 +47,7 @@ remotes::install_github("username/repo")
我们需要先安装 `remotes` 包,并使用其中的 `install_github` 函数来完成操作。注意这里是从源代码安装在本地编译。Windows 用户需要使用 Rtools 作为背后的编译工具。关于 Rtools 的安装信息见 https://cran.r-project.org/bin/windows/Rtools/ 我们需要先安装 `remotes` 包,并使用其中的 `install_github` 函数来完成操作。注意这里是从源代码安装在本地编译。Windows 用户需要使用 Rtools 作为背后的编译工具。关于 Rtools 的安装信息见 https://cran.r-project.org/bin/windows/Rtools/
### R与其程辑包的更新 #### R与其程辑包的更新
在本文档编写之时R 语言已更新到版本`r R.version$version.string`。当新的版本发布时,你可以使用 `installr` 包中的 `installr` 函数来完成R的更新你当然也可以手动下载更新如果不嫌麻烦的话。代码如下 在本文档编写之时R 语言已更新到版本`r R.version$version.string`。当新的版本发布时,你可以使用 `installr` 包中的 `installr` 函数来完成R的更新你当然也可以手动下载更新如果不嫌麻烦的话。代码如下
@ -92,13 +70,13 @@ update.packages(ask = FALSE)
``` ```
# 环境配置 ## 环境配置
## 项目Project ### 项目Project
在RStudio中一个项目Project本质上是一个把项目相关的文件储存在一个地方的文件夹。如果使用项目相关的功能的话你不需要担心使用的文件是否在当前的工作目录Working Directory。 项目功能提供了一个将不同目的的文件分隔开的方式,同时自动保存上次相应的工作进度。 在RStudio中一个项目Project本质上是一个把项目相关的文件储存在一个地方的文件夹。如果使用项目相关的功能的话你不需要担心使用的文件是否在当前的工作目录Working Directory。 项目功能提供了一个将不同目的的文件分隔开的方式,同时自动保存上次相应的工作进度。
### 练习 {-} #### 练习 {-}
为这次组队学习建立一个新的项目。 为这次组队学习建立一个新的项目。
@ -110,26 +88,28 @@ update.packages(ask = FALSE)
## 用户界面 ### 用户界面
接下来让我们关注一下 RStudio 用户界面里的各种面板和标签。在这一部分有四个基础面板值得注意。 接下来让我们关注一下 RStudio 用户界面里的各种面板和标签。在这一部分有四个基础面板值得注意。
![](./image/Rstudio.png)
* __Console__ 控制台位于界面左侧。你可以在这里运行命令、浏览输出结果。 * __Console__ 控制台位于界面左侧。你可以在这里运行命令、浏览输出结果。
* __Environment__ 位于界面右上方。环境面板会总结出当前加载的数据、定义的函数等。现在在你看来可能是空的,因为我们还没有做任何事情。 * __Environment__ 位于界面右上方。环境面板会总结出当前加载的数据、定义的函数等。现在在你看来可能是空的,因为我们还没有做任何事情。
* __Files__ 位于界面右下方。文件面板展示当前文件夹的信息。 * __Files__ 位于界面右下方。文件面板展示当前文件夹的信息。
* __Help__ 帮助面板也位于界面右下方。在这里你可以找到相应数据或者函数的帮助信息。 * __Help__ 帮助面板也位于界面右下方。在这里你可以找到相应数据或者函数的帮助信息。
## R Markdown ### R Markdown
你可以控制台Concole直接运行命令但是这样跑出来的指令不会被保存下来。一般来说我们更建议将命令写在叫做 R script 的脚本中,或者写在一个叫做 R Markdown 的文件中。 你可以控制台Concole直接运行命令但是这样跑出来的指令不会被保存下来。一般来说我们更建议将命令写在叫做 R script 的脚本中,或者写在一个叫做 R Markdown 的文件中。
### 练习 {-} #### 练习 {-}
创建一个脚本 R script. 创建一个脚本 R script.
* __File__ >> __New File__ >> __R Script__ * __File__ >> __New File__ >> __R Script__
### 练习 {-} #### 练习 {-}
创建一个 R Markdown 文件。 创建一个 R Markdown 文件。
@ -138,7 +118,7 @@ update.packages(ask = FALSE)
在脚本或者 R Markdown 的界面中,界面上方可以找到一个运行所有代码的按键。 在脚本或者 R Markdown 的界面中,界面上方可以找到一个运行所有代码的按键。
一个R Markdown文件是一个可以将代码与 _markdown_ 标准文本一种纯文本的格式语法结合在一起的文本文档。使用R Markdown文件可以很容易地生成pdf文件或者html文件其中不止包含了你的文本还有代码以及运行代码所生成的结果。点击界面上方的 __Knit__ 按键^[如果你想要生成pdf文件你需要安装[LaTeX](https://www.latex-project.org/)。可以看看很好地兼容了R的[TinyTex](https://yihui.org/tinytex/)。]即可。再也不需要复制粘贴、屏幕截图输出结果到Wrod了。R Markdown文档的一个主要优势是可复现。只要有了同样的代码和数据你可以获得与其他人一模一样的结果只要生成文档就可以了。 一个 R Markdown 文件是一个可以将代码与 _markdown_ 标准文本(一种纯文本的格式语法)结合在一起的文本文档。使用 R Markdown 文件可以很容易地生成 pdf 文件或者 html 文件,其中不止包含了你的文本,还有代码以及运行代码所生成的结果。点击界面上方的 __Knit__ 按键^[如果你想要生成 pdf 文件,你需要安装 [LaTeX](https://www.latex-project.org/)。可以看看很好地兼容了 R 的[TinyTex](https://yihui.org/tinytex/)。]即可。再也不需要复制粘贴、屏幕截图输出结果到 Word 了。R Markdown 文档的一个主要优势是可复现。只要有了同样的代码和数据,你可以获得与其他人一模一样的结果,只要生成文档就可以了。
在 R Markdown 文件里写代码需要使用特定的代码块code chunks来告诉 R Markdown 这部分是需要运行的代码而不只是文本。^[R Markdown 的更多语法可以看看 [R Markdown cheatsheet](https://rstudio.com/wp-content/uploads/2016/03/rmarkdown-cheatsheet-2.0.pdf)。] 在 R Markdown 文件里写代码需要使用特定的代码块code chunks来告诉 R Markdown 这部分是需要运行的代码而不只是文本。^[R Markdown 的更多语法可以看看 [R Markdown cheatsheet](https://rstudio.com/wp-content/uploads/2016/03/rmarkdown-cheatsheet-2.0.pdf)。]
@ -156,7 +136,7 @@ update.packages(ask = FALSE)
## 帮助 ### 帮助
R 能够发展到其今天的地位,很大的一个因素是他提供了相对详细的帮助文档,对初学者相对友好。一个相对完整的 R 包最低标准便是有函数的帮助文档。需要查看一个具体函数或者数据的帮助时可以用 `?fun`(等同于 `help(fun)`),该函数 `fun` 的帮助文档便会出现在之前提到过的帮助面板里。这个是已经知道需要什么函数了之后查找具体函数的用法的方式,如果你不记得具体的函数名字,可以使用两个问号加关键字来搜索:`??keyword`。 R 能够发展到其今天的地位,很大的一个因素是他提供了相对详细的帮助文档,对初学者相对友好。一个相对完整的 R 包最低标准便是有函数的帮助文档。需要查看一个具体函数或者数据的帮助时可以用 `?fun`(等同于 `help(fun)`),该函数 `fun` 的帮助文档便会出现在之前提到过的帮助面板里。这个是已经知道需要什么函数了之后查找具体函数的用法的方式,如果你不记得具体的函数名字,可以使用两个问号加关键字来搜索:`??keyword`。
@ -178,22 +158,25 @@ browseVignettes("packagename")
``` ```
# Happy Coding! ## Happy Coding!
这次的R语言数据分析组队学习的入门篇便到这里了。接下里请移步组队学习的正篇第一部分数据结构与数据集。 这次的R语言数据分析组队学习的入门篇便到这里了。接下里请移步组队学习的正篇第一部分数据结构与数据集。
玩得开心! 玩得开心!
## 本章作者 {-}
---- __Fin__
By: Fin
> https://yangzhuoranyang.com > https://yangzhuoranyang.com
关于Datawhale Datawhale是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习专题知识将在天池分享详情可关注Datawhale ## 关于Datawhale {-}
[![logo.png](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572)](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572) Datawhale 是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习,专题知识将在天池分享,详情可关注 Datawhale
```{r, echo = FALSE}
insert_logo()
```

View File

@ -1,41 +1,20 @@
--- # (PART) 开始干活 {-}
title: |
| DataWhale 组队学习 R语言数据分析
| Task 1 数据结构与数据集篇
author: "Fin"
date: "`r Sys.Date()`"
header-includes:
- \usepackage{ctex}
urlcolor: blue
output:
prettydoc::html_pretty:
theme: cayman
highlight: github
number_section: yes
toc: no
knit: (function(inputFile, encoding) {
rmarkdown::render(inputFile, encoding = encoding,
output_dir = "output", output_format = "all") })
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, cache = TRUE,warning=FALSE, message=FALSE,tidy=TRUE,collapse=FALSE)
```
# 数据结构与数据集 {#task-01}
![](./image/task01_data_structure.jpg){width=100%} ![](./image/task01_data_structure.jpg){width=100%}
# 准备工作 ## 准备工作
这节组队学习的目的主要是帮助你上手R的基本编程逻辑了解一些R编程的基本概念包括各个数据类型和数据集的读取与保存。 这节组队学习的目的主要是帮助你上手R的基本编程逻辑了解一些R编程的基本概念包括各个数据类型和数据集的读取与保存。
在开始我们的学习之前,不要忘记在 R Studio 中切换到组队学习专属的项目,打开一个 R script 文件或者 R Markdown 文件(详见入门篇)。 在开始我们的学习之前,不要忘记在 R Studio 中切换到组队学习专属的项目,打开一个 R script 文件或者 R Markdown 文件(详见入门篇)。
# 编码基础 ## 编码基础
首先我们来了解一些基本的编码操作。在 R Studio 中想要运行代码可以在控制台 Console 中键入代码后点击回车。这样运行的代码会被保存在当前项目的 `.Rhistory` 文件中,也可以在 R Studio 界面右上角的 History 面板中找到但是不会被明确地保存下来作为一个脚本文件。一般只有在我们想要运行一些简单的指令或者计算的时候才会采取这种方式。更常见的是将代码写在脚本文件中选中相应的代码后点击界面上方的Run或者快捷键`Ctrl` + `Enter`)来运行。 首先我们来了解一些基本的编码操作。在 R Studio 中想要运行代码可以在控制台 Console 中键入代码后点击回车。这样运行的代码会被保存在当前项目的 `.Rhistory` 文件中,也可以在 R Studio 界面右上角的 History 面板中找到但是不会被明确地保存下来作为一个脚本文件。一般只有在我们想要运行一些简单的指令或者计算的时候才会采取这种方式。更常见的是将代码写在脚本文件中选中相应的代码后点击界面上方的Run或者快捷键`Ctrl` + `Enter`)来运行。
## 算术 ### 算术
你可以直接运行计算命令。计算符号包括加`+`、减`-`、乘`*`、除`/`、求幂`^`以及求余数`%%`等。值得一提的是开平方根有他自己单独的函数`sqrt`。 你可以直接运行计算命令。计算符号包括加`+`、减`-`、乘`*`、除`/`、求幂`^`以及求余数`%%`等。值得一提的是开平方根有他自己单独的函数`sqrt`。
@ -49,7 +28,7 @@ knitr::opts_chunk$set(echo = TRUE, cache = TRUE,warning=FALSE, message=FALSE,tid
sqrt(2) sqrt(2)
``` ```
## 赋值 ### 赋值
在 R 里,我们可以为一个“东西”取一个名字,这个“东西”可以是一个值、一个向量、或者一个函数等,这样我们就可以之后再获取存储在这个名字下面的信息。 在 R 里,我们可以为一个“东西”取一个名字,这个“东西”可以是一个值、一个向量、或者一个函数等,这样我们就可以之后再获取存储在这个名字下面的信息。
@ -93,7 +72,7 @@ x <- x + y
## 函数 ### 函数
R是一个非纯函数式编程Functional Programming的语言与你平时可能所熟悉的面向对象程序设计Object-Oriented Programming的编程语言比如 Python不一样。这意味着在R中相对于以类Class与对象Object的思路思考问题我们要更多地定义函数Function以及考虑函数的输入与输出来进行运算。如果你不知道我在这里说什么请忽略这段话。 R是一个非纯函数式编程Functional Programming的语言与你平时可能所熟悉的面向对象程序设计Object-Oriented Programming的编程语言比如 Python不一样。这意味着在R中相对于以类Class与对象Object的思路思考问题我们要更多地定义函数Function以及考虑函数的输入与输出来进行运算。如果你不知道我在这里说什么请忽略这段话。
@ -132,7 +111,7 @@ y <- 42
y_plusone <- addone(y) y_plusone <- addone(y)
``` ```
## 循环loop ### 循环loop
使用代码很重要的一个原因是可以重复进行多次相同或有规律的操作,也就是循环了。 使用代码很重要的一个原因是可以重复进行多次相同或有规律的操作,也就是循环了。
@ -156,7 +135,7 @@ for(i in 1:3){
## 管道pipe ### 管道pipe
如果我们想要对一个对象进行多个函数的操作,比如说想要使用我们刚刚定义的`addone`函数,还有新定义的`addtwo``addthree`,我们可以按照普通调用函数的方法一个套一个: 如果我们想要对一个对象进行多个函数的操作,比如说想要使用我们刚刚定义的`addone`函数,还有新定义的`addtwo``addthree`,我们可以按照普通调用函数的方法一个套一个:
@ -189,13 +168,13 @@ x %>%
关于管道符号的具体使用规则详见`` ?`%>%` ``。 关于管道符号的具体使用规则详见`` ?`%>%` ``。
# 数据类型 ## 数据类型
## 基础数据类型 ### 基础数据类型
在R中有五种基础数据类型包括三个数值型、一个逻辑型和一个字符型。 在R中有五种基础数据类型包括三个数值型、一个逻辑型和一个字符型。
### 数值型 #### 数值型
数值型数据包括三种分别是默认的实数数值型数据double、整数类型integer和复数类型complex 数值型数据包括三种分别是默认的实数数值型数据double、整数类型integer和复数类型complex
```{r} ```{r}
@ -222,7 +201,7 @@ typeof(b)
typeof(c) typeof(c)
``` ```
### 逻辑型 #### 逻辑型
逻辑型logical数据只包括两个值`TRUE``T` 和 `FALSE``F`: 逻辑型logical数据只包括两个值`TRUE``T` 和 `FALSE``F`:
@ -244,7 +223,7 @@ TRUE | FALSE
### 字符型 #### 字符型
字符型数据character可以总结为“任何带引号的值”。它可以是一个字母、一个单词、一句话、或者任何用引号框起来的数值或逻辑。 字符型数据character可以总结为“任何带引号的值”。它可以是一个字母、一个单词、一句话、或者任何用引号框起来的数值或逻辑。
@ -269,7 +248,7 @@ typeof("TRUE")
在R中单引号`'`)和双引号(`"`)是等效的,但是我们推荐大多数情况下使用双引号,只有在引号内有双引号的时候使用单引号去引双引号(比如`' This is an "example". '`。这主要是为了帮助其他语言C, C++, Java等的用户区分单双引号的细微区别。在C语言里单双引号不是等效的。R语言中的双引号大致是与C语言中的双引号等效的。 在R中单引号`'`)和双引号(`"`)是等效的,但是我们推荐大多数情况下使用双引号,只有在引号内有双引号的时候使用单引号去引双引号(比如`' This is an "example". '`。这主要是为了帮助其他语言C, C++, Java等的用户区分单双引号的细微区别。在C语言里单双引号不是等效的。R语言中的双引号大致是与C语言中的双引号等效的。
## 向量vector ### 向量vector
这里说到的向量主要指基础向量类型atomic vector 这里说到的向量主要指基础向量类型atomic vector
向量是由一组相同类型的值组成的一维序列。根据值的类型不同,我们会有不同类型的向量。 向量是由一组相同类型的值组成的一维序列。根据值的类型不同,我们会有不同类型的向量。
@ -300,7 +279,7 @@ mean(vec_A)
``` ```
### 因子factor #### 因子factor
除了之前提到的基础数据类型组成的向量外,还有一类重要的的向量类型便是因子,可以使用函数`factor`和`c`组合来创建。 除了之前提到的基础数据类型组成的向量外,还有一类重要的的向量类型便是因子,可以使用函数`factor`和`c`组合来创建。
@ -337,7 +316,7 @@ educ
实质上R 把因子向量当作整数型数值向量来对待。这也就意味着用因子向量替代字符向量可以剩下很多字节。 实质上R 把因子向量当作整数型数值向量来对待。这也就意味着用因子向量替代字符向量可以剩下很多字节。
### 数值之间的转换 {#transform} #### 数值之间的转换 {#transform}
不同的向量/数据类型之间是可以互相转换的。相互转换的可行性取决于数据类型的复杂程度(或者说自由程度)。按照自由程度将已经提到的几种向量以从高到低的排序可得 不同的向量/数据类型之间是可以互相转换的。相互转换的可行性取决于数据类型的复杂程度(或者说自由程度)。按照自由程度将已经提到的几种向量以从高到低的排序可得
@ -410,7 +389,7 @@ as.factor(vec_num)
### 向量命名 #### 向量命名
除了向量自己的名字,我们也可以给向量里的每个元素一个名字。 除了向量自己的名字,我们也可以给向量里的每个元素一个名字。
@ -429,7 +408,7 @@ vec
### 访问向量的子集 #### 访问向量的子集
三种截取子集的符号:`[`、`[[` 和 `$`(其中`$`不能用在基础向量上)。 三种截取子集的符号:`[`、`[[` 和 `$`(其中`$`不能用在基础向量上)。
@ -474,9 +453,9 @@ vec[[c(1, 3)]]
## 特殊数据类型 ### 特殊数据类型
### 日期date #### 日期date
R中有蕴含日期的特殊类型`Date`,有日期-时间类型的`POSIXct`和`POSIXlt`。但在这一节我主要想介绍一下专注于日期处理的包`lubridate`。 R中有蕴含日期的特殊类型`Date`,有日期-时间类型的`POSIXct`和`POSIXlt`。但在这一节我主要想介绍一下专注于日期处理的包`lubridate`。
@ -509,7 +488,7 @@ sevenseven + months(1)
`lubridate`的更多用法详见[`lubridate`主页](https://lubridate.tidyverse.org/)。 `lubridate`的更多用法详见[`lubridate`主页](https://lubridate.tidyverse.org/)。
### 时间序列ts #### 时间序列ts
时间序列作为一种有自相关性质的特殊数据类型在R中也是可以分开处理的。制造时间序列的函数叫做`ts`,也就是 time series 的缩写: 时间序列作为一种有自相关性质的特殊数据类型在R中也是可以分开处理的。制造时间序列的函数叫做`ts`,也就是 time series 的缩写:
@ -540,11 +519,11 @@ gas %>%
关于时间序列的分析与预测的更多信息可见[`tidyverts`系列包](https://tidyverts.org/) [`forecast`包](https://pkg.robjhyndman.com/forecast/)等。 关于时间序列的分析与预测的更多信息可见[`tidyverts`系列包](https://tidyverts.org/) [`forecast`包](https://pkg.robjhyndman.com/forecast/)等。
# 多维数据类型 ## 多维数据类型
之前我们讨论的数据类型都是一个序列(向量),都是一维的数据。在这章里我们会学习二维甚至多于二维的数据类型。 之前我们讨论的数据类型都是一个序列(向量),都是一维的数据。在这章里我们会学习二维甚至多于二维的数据类型。
## 矩阵matrix ### 矩阵matrix
在R中的矩阵和数学概念上的矩阵很相似。在数学概念里矩阵是一个按照长方阵列排列的数字集合它有着固定的行数和列数。在R里矩阵是一个按照长方阵列排列的、有着固定行数和列数的、包含同一类型数据的集合。你可以使用函数`matrix`来创建一个矩阵: 在R中的矩阵和数学概念上的矩阵很相似。在数学概念里矩阵是一个按照长方阵列排列的数字集合它有着固定的行数和列数。在R里矩阵是一个按照长方阵列排列的、有着固定行数和列数的、包含同一类型数据的集合。你可以使用函数`matrix`来创建一个矩阵:
@ -567,7 +546,7 @@ mat_month <- matrix(month.name, nrow = 4, byrow = TRUE)
mat_month mat_month
``` ```
### 矩阵命名 #### 矩阵命名
对于一个矩阵来说,主要的命名集中于行名`rownames`和列名`colnames` 对于一个矩阵来说,主要的命名集中于行名`rownames`和列名`colnames`
@ -588,7 +567,7 @@ dimnames(mat_month)
### 访问矩阵子集 #### 访问矩阵子集
和在向量里一样,访问矩阵的子集也可以用`[`或者`[[`。区别在于矩阵中我们有两个维度,所以需要同时给定两个维度的坐标: 和在向量里一样,访问矩阵的子集也可以用`[`或者`[[`。区别在于矩阵中我们有两个维度,所以需要同时给定两个维度的坐标:
@ -612,7 +591,7 @@ mat_month[["Quarter1", "Month3"]]
## 列表list ### 列表list
列表是R中比较基础的数据类型中最灵活的类型。它和向量或者矩阵不一样在一个列表中可以储存各种不同的基本数据类型。你既可以存三个数字也可以把数值型、字符型、逻辑型混合 列表是R中比较基础的数据类型中最灵活的类型。它和向量或者矩阵不一样在一个列表中可以储存各种不同的基本数据类型。你既可以存三个数字也可以把数值型、字符型、逻辑型混合
@ -639,7 +618,7 @@ stuff <- list(
stuff stuff
``` ```
### 访问子列表 #### 访问子列表
列表同样可以用中括号来访问子列表。单个中括号`[`和两个中括号`[[`的区分在列表中特别重要。简单来说,单个中括号返回的列表元素类型还是列表,双中括号返回的列表元素是它本身的类型。想要返回多个子列表,就只能用单括号了,因为元素本身的类型不允许多个类型在一个序列中保存。 列表同样可以用中括号来访问子列表。单个中括号`[`和两个中括号`[[`的区分在列表中特别重要。简单来说,单个中括号返回的列表元素类型还是列表,双中括号返回的列表元素是它本身的类型。想要返回多个子列表,就只能用单括号了,因为元素本身的类型不允许多个类型在一个序列中保存。
@ -654,7 +633,7 @@ stuff[[1]][[2]]
``` ```
### 列表命名 #### 列表命名
列表的维度,或者说层数可是比矩阵多多了,这也就意味着,列表中可以命名的地方多多了。 列表的维度,或者说层数可是比矩阵多多了,这也就意味着,列表中可以命名的地方多多了。
@ -684,7 +663,7 @@ stuff$I$II
## 数据表data frame与tibble ### 数据表data frame tibble
数据表将是进行数据分析的时候接触的最多的数据类型了。一个数据表data frame的本质是一个列表list但是采取了矩阵matrix的展示形式 数据表将是进行数据分析的时候接触的最多的数据类型了。一个数据表data frame的本质是一个列表list但是采取了矩阵matrix的展示形式
@ -705,7 +684,7 @@ tb
除了看起来好看以外,`tibble`在原始数据表的基础上保留了有用的功能,去除了多余的功能。它干得更少,比如它不会自发修改变量类型或变量名字,也不会做部分匹配;同时它抱怨得更多,比如当一个变量不存在的时候就会触发错误信息。这样用户就能及早发现错误,不会等到代码堆成小`r emo::ji("poop")`山。 除了看起来好看以外,`tibble`在原始数据表的基础上保留了有用的功能,去除了多余的功能。它干得更少,比如它不会自发修改变量类型或变量名字,也不会做部分匹配;同时它抱怨得更多,比如当一个变量不存在的时候就会触发错误信息。这样用户就能及早发现错误,不会等到代码堆成小`r emo::ji("poop")`山。
### 访问数据表内容 #### 访问数据表内容
既然看上去像矩阵,听起来像列表,那就应该可以用适用于矩阵和列表的方法访问数据表元素。事实上也的确是这样: 既然看上去像矩阵,听起来像列表,那就应该可以用适用于矩阵和列表的方法访问数据表元素。事实上也的确是这样:
@ -736,11 +715,11 @@ tibble的另一个特性是其访问的子列表也是`tibble`类型的数据表
关于`tibble`更多信息,详见[`tibble`主页](https://tibble.tidyverse.org/)。 关于`tibble`更多信息,详见[`tibble`主页](https://tibble.tidyverse.org/)。
# 读写数据 ## 读写数据
这一章我们主要讨论根据不同数据保存方式区分的读写数据的方法。 这一章我们主要讨论根据不同数据保存方式区分的读写数据的方法。
## 内置数据集 ### 内置数据集
R本身和一些R包都会有内置的数据集。使用`data`命令来查看、使用可用数据集。 R本身和一些R包都会有内置的数据集。使用`data`命令来查看、使用可用数据集。
@ -761,7 +740,7 @@ glimpse(AirPassengers)
``` ```
## 表格类型数据csv, excel) ### 表格类型数据csv, excel)
h1n1 流感问卷数据储存在名为 “h1n1_flu.csv” 的文件中,我们会在下一篇《数据清洗与准备》中用到。假设 “h1n1_flu" 有不同的储存类型,我们列举一些读写数据表类型数据的方法。 h1n1 流感问卷数据储存在名为 “h1n1_flu.csv” 的文件中,我们会在下一篇《数据清洗与准备》中用到。假设 “h1n1_flu" 有不同的储存类型,我们列举一些读写数据表类型数据的方法。
@ -787,7 +766,7 @@ h1n1_flu <- read_xlsx("h1n1_flu.xlsx")
不建议在R中直接编辑 excel 文件csv 文件应该满足日常所需了。如果有编辑 excel 文件的需求,可以看看`openxlsx`包。 不建议在R中直接编辑 excel 文件csv 文件应该满足日常所需了。如果有编辑 excel 文件的需求,可以看看`openxlsx`包。
## R的专属类型数据RData, rds ### R的专属类型数据RData, rds
有一些数据存储方式是R中独有的。我们在这里讨论两类。一类是 rds 文件,一类是 RData 文件。 有一些数据存储方式是R中独有的。我们在这里讨论两类。一类是 rds 文件,一类是 RData 文件。
@ -808,7 +787,7 @@ save(h1n1_flu, file = "h1n1_flu.RData")
``` ```
## 其他软件SPSS, Stata, SAS ### 其他软件SPSS, Stata, SAS
R也可以直接读取其他软件的数据类型。这里列举使用`haven`包读写 SPSS 的 sav 和 zsav、 Stata 的 dta、SAS 的 sas7bdat 和 sas7bcat。 R也可以直接读取其他软件的数据类型。这里列举使用`haven`包读写 SPSS 的 sav 和 zsav、 Stata 的 dta、SAS 的 sas7bdat 和 sas7bcat。
@ -832,13 +811,13 @@ write_sas()
``` ```
# 练习题 ## 练习题
## 了解数据集 ### 了解数据集
请使用之前读取的`h1n1_flu`完成以下任务。 请使用之前读取的`h1n1_flu`完成以下任务。
### 常用数据探查函数 #### 常用数据探查函数
请尝试使用以下常用的数据探查函数,挑出两个你最喜欢的描述他们的功能。别忘了可以用`?fun`查看帮助文档。 请尝试使用以下常用的数据探查函数,挑出两个你最喜欢的描述他们的功能。别忘了可以用`?fun`查看帮助文档。
@ -857,22 +836,30 @@ table(h1n1_flu$sex)
``` ```
### 分组计算统计量 #### 分组计算统计量
```{r, include = FALSE} ```{r, include = FALSE}
h1n1_flu <- read_csv("./datasets/h1n1_flu.csv") h1n1_flu <- read_csv("./datasets/h1n1_flu.csv")
library(tidyverse)
``` ```
```{r}
```{r, echo=TRUE, eval = FALSE}
h1n1_flu %>% h1n1_flu %>%
group_by(sex, employment_status) %>% group_by(sex, employment_status) %>%
summarise(n()) summarise(n())
``` ```
```{r, echo=FALSE}
h1n1_flu %>%
group_by(sex, employment_status) %>%
dplyr::summarise(n())
```
请问上边这几行代码在计算什么?你可不可以使用同样的方法计算一些其他的统计量?别忘了看看帮助文档`?summarise`。 请问上边这几行代码在计算什么?你可不可以使用同样的方法计算一些其他的统计量?别忘了看看帮助文档`?summarise`。
## 创造数据集 ### 创造数据集
我们说过数据表的本质是将列表排列在一起,所以数据表就会有列表的性质。而我们又知道列表可以包含任何类型的数据,无论是单个的数值或者是向量、矩阵等。 我们说过数据表的本质是将列表排列在一起,所以数据表就会有列表的性质。而我们又知道列表可以包含任何类型的数据,无论是单个的数值或者是向量、矩阵等。
@ -880,14 +867,20 @@ h1n1_flu %>%
1. 请你描述一个可以在数据分析时运用此类特性的使用场景。 1. 请你描述一个可以在数据分析时运用此类特性的使用场景。
----
By: Fin ## 本章作者 {-}
__Fin__
> https://yangzhuoranyang.com > https://yangzhuoranyang.com
关于Datawhale Datawhale是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习专题知识将在天池分享详情可关注Datawhale ## 关于Datawhale {-}
Datawhale 是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习,专题知识将在天池分享,详情可关注 Datawhale
```{r, echo = FALSE}
insert_logo()
```
[![logo.png](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572)](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572)

View File

@ -1,33 +1,12 @@
---
title: |
| DataWhale 组队学习 R语言数据分析
| Task02 数据清洗与准备
author: "June Yao"
date: "`r Sys.Date()`"
header-includes:
- \usepackage{ctex}
urlcolor: blue
output:
prettydoc::html_pretty:
theme: cayman
highlight: github
number_section: no
toc: no
knit: (function(inputFile, encoding) {
rmarkdown::render(inputFile, encoding = encoding,
output_dir = "output", output_format = "all") })
---
```{r setup, include=FALSE} # 数据清洗与准备 {#task-02}
knitr::opts_chunk$set(echo = TRUE,warning=FALSE, message=FALSE,tidy=TRUE,collapse=FALSE)
```
![](./image/task02_structure.jpg){width=100%} ![](./image/task02_structure.jpg){width=100%}
Task 02共计6个知识点预计需学习5~8小时请安排好学习任务。 Task 02共计6个知识点预计需学习5~8小时请安排好学习任务。
## 0 环境配置 ## 环境配置 {-}
```{r} ```{r, message=FALSE}
library(mlbench) # 将会使用到包中的BostonHousing数据集 library(mlbench) # 将会使用到包中的BostonHousing数据集
library(funModeling) # 探索性数据分析工具包本节内容中将会使用到它的status()函数,打印整体数据质量 library(funModeling) # 探索性数据分析工具包本节内容中将会使用到它的status()函数,打印整体数据质量
library(tidyverse) # 数据转化工具包本节内容中将会使用它包含的dplyr中的管道函数 %>% library(tidyverse) # 数据转化工具包本节内容中将会使用它包含的dplyr中的管道函数 %>%
@ -40,23 +19,23 @@ library(MASS)#基于此包进行box-cox转换
library(dlookr) # 本节内容将会使用到它的transform()函数 library(dlookr) # 本节内容将会使用到它的transform()函数
``` ```
## 0 案例数据 ## 案例数据 {-}
本节内容将会使用到两个数据集。 本节内容将会使用到两个数据集。
### 数据集1 h1n1流感问卷数据集 ### 数据集1 h1n1流感问卷数据集 {-}
#### 数据说明 #### 数据说明 {-}
目前提供的数据集来自关于h1n1流感调查问卷的部分内容可以从这个网站上看到具体字段的详细说明https://www.drivendata.org/competitions/66/flu-shot-learning/page/211/ 目前提供的数据集来自关于h1n1流感调查问卷的部分内容可以从这个网站上看到具体字段的详细说明https://www.drivendata.org/competitions/66/flu-shot-learning/page/211/
数据集包含26,707个受访者数据共有32个特征+1个标签是否接种h1n1疫苗 数据集包含26,707个受访者数据共有32个特征+1个标签是否接种h1n1疫苗
#### 加载并查看部分数据 #### 加载并查看部分数据 {-}
首先加载数据,了解数据集大小。 首先加载数据,了解数据集大小。
```{r h1n1} ```{r}
h1n1_data <- read.csv("./datasets/h1n1_flu.csv", header = TRUE) h1n1_data <- read.csv("./datasets/h1n1_flu.csv", header = TRUE)
dim(h1n1_data) dim(h1n1_data)
``` ```
@ -68,21 +47,21 @@ h1n1_data <- h1n1_data[,c(1,3,11,12,15,16,19,20,22,23,33)]
head(h1n1_data) head(h1n1_data)
``` ```
### 数据集2 波士顿房价数据集 ### 数据集2 波士顿房价数据集 {-}
#### 数据说明 #### 数据说明 {-}
数据集来自`mlbench`包请提前装好。数据字段说明可从网址查看https://blog.csdn.net/weixin_46027193/article/details/112238597 数据集来自`mlbench`包请提前装好。数据字段说明可从网址查看https://blog.csdn.net/weixin_46027193/article/details/112238597
数据集包含506条房价信息共有13个特征+1个预测字段房屋价格 数据集包含506条房价信息共有13个特征+1个预测字段房屋价格
#### 加载并查看部分数据 #### 加载并查看部分数据 {-}
```{r } ```{r }
data(BostonHousing) data(BostonHousing)
dim(BostonHousing) dim(BostonHousing)
head(BostonHousing) head(BostonHousing)
``` ```
## 1 重复值处理 ## 重复值处理
在某些情况下,我们需要对数据进行去重处理。`unique()`函数可以对数据进行整体去重,`distinct()`函数可以针对某些列去重。 在某些情况下,我们需要对数据进行去重处理。`unique()`函数可以对数据进行整体去重,`distinct()`函数可以针对某些列去重。
@ -95,27 +74,27 @@ h1n1_data_de_dup2 <- distinct(h1n1_data,respondent_id,h1n1_knowledge,.keep_all =
``` ```
## 2 缺失值识别与处理 ## 缺失值识别与处理
现实环境中,由于数据来源及搜集过程,可能有各种不规范,导致数据往往会存在缺失。缺失值识别与处理,无论是在统计还是数据管理中,往往是数据清洗的第一步。 现实环境中,由于数据来源及搜集过程,可能有各种不规范,导致数据往往会存在缺失。缺失值识别与处理,无论是在统计还是数据管理中,往往是数据清洗的第一步。
### 2.1 缺失值识别 ### 缺失值识别
#### 2.1.1 常用识别方法 #### 常用识别方法
在R语言中惯用会把缺失值表示为NA一般可使用`is.nan(a)``!complete.cases(a)`来识别`a`是否为缺失值。 在R语言中惯用会把缺失值表示为NA一般可使用`is.na(a)``!complete.cases(a)`来识别`a`是否为缺失值。
```{r } ```{r }
# 假设定义的一个变量中存在缺失值 # 假设定义的一个变量中存在缺失值
y <- c(1, 2, 3, NA) y <- c(1, 2, 3, NA)
#用is.nan在识别是否为缺失值 # 用is.na在识别是否为缺失值
is.na(y) is.na(y)
# 用!complete.cases()在识别是否为缺失值 # 用!complete.cases()在识别是否为缺失值
!complete.cases(y) !complete.cases(y)
``` ```
#### 2.1.2 缺失值统计 #### 缺失值统计
统计缺失值总数。 统计缺失值总数。
```{r } ```{r }
@ -129,7 +108,9 @@ sum(is.na(h1n1_data["h1n1_knowledge"]))
如果想按行或按列统计,可以写函数。 如果想按行或按列统计,可以写函数。
```{r } ```{r }
pMiss <- function(x){sum(is.na(x))/length(x)*100} pMiss <- function(x) {
sum(is.na(x)) / length(x) * 100
}
apply(h1n1_data, 2, pMiss) # 按列统计缺失比率% apply(h1n1_data, 2, pMiss) # 按列统计缺失比率%
# apply(h1n1_data,1,pMiss) #按行统计缺失比率% # apply(h1n1_data,1,pMiss) #按行统计缺失比率%
``` ```
@ -147,7 +128,7 @@ data_quality %>% mutate(across(where(is.numeric), ~ round(., 3))) #保留4位小
missing_Value <- data_quality[which(data_quality$p_na > 0), ] missing_Value <- data_quality[which(data_quality$p_na > 0), ]
missing_Value$variable missing_Value$variable
``` ```
#### 2.1.3 缺失值机制与分析 #### 缺失值机制与分析
统计学家通常将缺失数据分为3类为了更好的处理缺失值我们可以基于缺失值机制来识别以下3种缺失模式 统计学家通常将缺失数据分为3类为了更好的处理缺失值我们可以基于缺失值机制来识别以下3种缺失模式
@ -206,7 +187,7 @@ heatmap(cor(shadow_mat) )
其他数据缺失关系分析,可参考附录`数据的预处理基础`。 其他数据缺失关系分析,可参考附录`数据的预处理基础`。
### 2.2 缺失值处理 ### 缺失值处理
缺失值一般有三种方式: 缺失值一般有三种方式:
@ -216,7 +197,7 @@ heatmap(cor(shadow_mat) )
以下我们主要介绍删除法和插补法: 以下我们主要介绍删除法和插补法:
#### 2.2.1 删除法 #### 删除法
行删除,可以直接用`complete.cases()`或`na.omit()`来过滤掉数据集中所有缺失行。 行删除,可以直接用`complete.cases()`或`na.omit()`来过滤掉数据集中所有缺失行。
```{r } ```{r }
@ -232,7 +213,7 @@ h1n1_data_row_del2 <- na.omit(h1n1_data)
h1n1_data_col_del1 <- subset(h1n1_data, select = -c(health_insurance)) h1n1_data_col_del1 <- subset(h1n1_data, select = -c(health_insurance))
``` ```
#### 2.2.2 简单插补法 #### 简单插补法
注意在空值插补的时候,要区分类别变量与数值变量,均值插补不适用于类别变量。我们这里随机选择了一个变量演示`impute()`函数用法,在实际插补的时候,请大家根据情况进行选择。 注意在空值插补的时候,要区分类别变量与数值变量,均值插补不适用于类别变量。我们这里随机选择了一个变量演示`impute()`函数用法,在实际插补的时候,请大家根据情况进行选择。
@ -243,12 +224,12 @@ h1n1_data_sim_imp$h1n1_knowledge <- impute(h1n1_data_sim_imp$h1n1_knowledge, med
h1n1_data_sim_imp$h1n1_knowledge <- impute(h1n1_data_sim_imp$h1n1_knowledge, mean) # 插补均值 h1n1_data_sim_imp$h1n1_knowledge <- impute(h1n1_data_sim_imp$h1n1_knowledge, mean) # 插补均值
``` ```
#### 2.2.3 拟合插补法 #### 拟合插补法
利用有监督的机器学习方法,比如回归、最邻近、随机森林、支持向量机等模型,对缺失值作预测。 利用有监督的机器学习方法,比如回归、最邻近、随机森林、支持向量机等模型,对缺失值作预测。
#### 2.2.4 多重插补法 #### 多重插补法
多重插补MI是一种基于重复模拟的处理缺失值的方法。其思想来源于贝叶斯估计认为待插补的值是随机的它的值来自于已观测到的值。具体实践上通常是估计出待插补的值然后再加上不同的噪声形成多组可选插补值通常是3到10个。根据某种选择依据选取最合适的插补值。与单个插补例如均值相比创建多个插补可解决缺失值的不确定性。 R中可利用`Amelia`、`mice`和`mi`包来执行这些操作。 多重插补MI是一种基于重复模拟的处理缺失值的方法。其思想来源于贝叶斯估计认为待插补的值是随机的它的值来自于已观测到的值。具体实践上通常是估计出待插补的值然后再加上不同的噪声形成多组可选插补值通常是3到10个。根据某种选择依据选取最合适的插补值。与单个插补例如均值相比创建多个插补可解决缺失值的不确定性。 R中可利用`Amelia`、`mice`和`mi`包来执行这些操作。
@ -287,16 +268,16 @@ h1n1_data_complete <- complete(imp, action=2)
``` ```
## 3 异常值识别与处理 ## 异常值识别与处理
### 3.1 异常值识别 ### 异常值识别
本节的异常值指离群点。为了让数据统计或数据建模更加准确,我们通常会识别并对处理一些离群点。有些模型会对异常值较敏感,参考附录`什么样的模型对缺失值更敏感?`。 本节的异常值指离群点。为了让数据统计或数据建模更加准确,我们通常会识别并对处理一些离群点。有些模型会对异常值较敏感,参考附录`什么样的模型对缺失值更敏感?`。
总的来说有几种常用方法包括可视化图形分布识别箱线图、z-score识别、局部异常因子法LOF法、聚类法等。 总的来说有几种常用方法包括可视化图形分布识别箱线图、z-score识别、局部异常因子法LOF法、聚类法等。
我们这里用波士顿房价数据集来演示一下异常值识别的处理过程。 我们这里用波士顿房价数据集来演示一下异常值识别的处理过程。
### 3.1.1 可视化图形分布 ### 可视化图形分布
首先是可视化图形分布识别将数值型变量筛选出来用boxlpot看看分布。 首先是可视化图形分布识别将数值型变量筛选出来用boxlpot看看分布。
@ -307,24 +288,29 @@ nums_data<-BostonHousing[ , nums]
# 数据变形 # 数据变形
nums_data.new <- nums_data %>% nums_data.new <- nums_data %>%
as.data.frame %>% as.data.frame() %>%
mutate(Cell = rownames(.)) %>% mutate(Cell = rownames(.)) %>%
gather(., key = colname, value = "value", -Cell) gather(., key = colname, value = "value", -Cell)
# 用ggplot画出箱线图 # 用ggplot画出箱线图
ggplot(data = nums_data.new, aes(x = colname, y = value)) + geom_boxplot(aes(1)) + ggplot(data = nums_data.new, aes(x = colname, y = value)) +
facet_wrap(~colname, scales = "free") + theme_grey() + labs(title = "Outlier Detection On Numeric Data By Boxplot", x = "Numeric Columns", y = "") + theme(legend.position = "top") + theme_bw() geom_boxplot(aes(1)) +
facet_wrap(~colname, scales = "free") +
theme_grey() +
labs(title = "Outlier Detection On Numeric Data By Boxplot", x = "Numeric Columns", y = "") +
theme(legend.position = "top") +
theme_bw()
``` ```
通过可视化分布可以选择剔除一些不合理的离群值比如在数据集中将dis>10.0的数据剔除。 通过可视化分布可以选择剔除一些不合理的离群值比如在数据集中将dis>10.0的数据剔除。
### 3.1.2 z-score ### z-score
z-score是一种一维或低维特征空间中参数异常检测方法。它假定数据是高斯分布异常值是分布尾部的数据点因此远离数据的平均值。一般将z-score低于-3或高于3的数据看成是异常值。 z-score是一种一维或低维特征空间中参数异常检测方法。它假定数据是高斯分布异常值是分布尾部的数据点因此远离数据的平均值。一般将z-score低于-3或高于3的数据看成是异常值。
```{r } ```{r }
# 定义一个识别异常点的函数x是输入数据matrix或df,zs是异常临界值z-score超过zs的被识别为异常点 # 定义一个识别异常点的函数x是输入数据matrix或df,zs是异常临界值z-score超过zs的被识别为异常点
outliers = function(x, zs) { outliers <- function(x, zs) {
temp <- abs(apply(x, 1, scale)) temp <- abs(apply(x, 1, scale))
return(x[temp > zs]) return(x[temp > zs])
} }
@ -332,7 +318,7 @@ outliers = function(x, zs) {
outliers(nums_data, 3) outliers(nums_data, 3)
``` ```
### 3.1.3 局部异常因子法 ### 局部异常因子法
局部异常因子法(LOF),是一种无监督的离群检测方法,是基于密度的离群点检测方法中一个比较有代表性的算法。适用于在中等高维数据集上执行异常值检测。 局部异常因子法(LOF),是一种无监督的离群检测方法,是基于密度的离群点检测方法中一个比较有代表性的算法。适用于在中等高维数据集上执行异常值检测。
@ -348,15 +334,15 @@ names(outlier_score) <- 1:nrow(nums_data)
sort(outlier_score, decreasing = TRUE)[1:5] sort(outlier_score, decreasing = TRUE)[1:5]
``` ```
### 3.2 异常值处理 ### 异常值处理
首先需要确定是否是真的异常值,有些值虽然离群,但其实并不是异常值,处理掉反而会影响后续任务的准确性。 如果确定需要处理,可以参考缺失值的处理方式进行处理。 首先需要确定是否是真的异常值,有些值虽然离群,但其实并不是异常值,处理掉反而会影响后续任务的准确性。 如果确定需要处理,可以参考缺失值的处理方式进行处理。
## 4 特征编码 ## 特征编码
为什么要进行特征编码?我们拿到的原始数据中,一般会有一些类别变量,但是在统计或机器学习中,我们通常需要把类别变量转化为数值型变量,才能应用于一些方法中。 为什么要进行特征编码?我们拿到的原始数据中,一般会有一些类别变量,但是在统计或机器学习中,我们通常需要把类别变量转化为数值型变量,才能应用于一些方法中。
### 4.1 独热编码/哑编码 ### 独热编码/哑编码
One-hot encoding 和 dummy,是将类别变量扩充为多个只显示10的变量每个变量代表原类别变量中的一个类。 注意他们之间的区别https://www.cnblogs.com/lianyingteng/p/7792693.html One-hot encoding 和 dummy,是将类别变量扩充为多个只显示10的变量每个变量代表原类别变量中的一个类。 注意他们之间的区别https://www.cnblogs.com/lianyingteng/p/7792693.html
@ -370,7 +356,7 @@ h1n1_data_dummy <- dummy_cols(subset(h1n1_data_complete, select = c(age_group)),
head(h1n1_data_dummy) head(h1n1_data_dummy)
``` ```
### 4.2 标签编码 ### 标签编码
标签编码(Label Encoder)是将类别变量转换成连续的数值型变量,通常对有序的变量进行标签编码,既保留了顺序信息,也节约了空间(不会扩充变量) 标签编码(Label Encoder)是将类别变量转换成连续的数值型变量,通常对有序的变量进行标签编码,既保留了顺序信息,也节约了空间(不会扩充变量)
@ -382,7 +368,7 @@ h1n1_data_complete_lab_encoder$income_poverty_lab_encoder <-as.numeric(factor(h1
head(subset(h1n1_data_complete_lab_encoder, select = c(income_poverty, income_poverty_lab_encoder))) head(subset(h1n1_data_complete_lab_encoder, select = c(income_poverty, income_poverty_lab_encoder)))
``` ```
### 4.3 手动编码 ### 手动编码
比如,当某一个特征中有很多类别,我们认为某些类别可以合为一类,可以用`case_when()`函数手动处理。 比如,当某一个特征中有很多类别,我们认为某些类别可以合为一类,可以用`case_when()`函数手动处理。
@ -396,12 +382,12 @@ h1n1_data_manual$age_group_manual<-case_when(
head(h1n1_data_manual) head(h1n1_data_manual)
``` ```
### 4.4 日期特征转换 ### 日期特征转换
参考附录`R语言日期时间处理` 参考附录`R语言日期时间处理`
## 5 规范化与偏态数据 ## 规范化与偏态数据
为什么要数据规范化简单来说是为了去除数据量纲和数据大小的差异确保数据是在同一量纲或者同一数量级下进行比较一般用在机器学习算法之前。数据规范化又可以使用0-1规范化Z-score等方法。 为什么要数据规范化简单来说是为了去除数据量纲和数据大小的差异确保数据是在同一量纲或者同一数量级下进行比较一般用在机器学习算法之前。数据规范化又可以使用0-1规范化Z-score等方法。
为什么要处理偏态数据?。很多模型会假设数据或参数服从正态分布。例如线性回归(linear regression),它假设误差服从正态分布。 为什么要处理偏态数据?。很多模型会假设数据或参数服从正态分布。例如线性回归(linear regression),它假设误差服从正态分布。
@ -411,13 +397,16 @@ head(h1n1_data_manual)
这里我们使用波士顿房价数据集来做演示。可以看到图中数据的偏态分布及量纲差别。 这里我们使用波士顿房价数据集来做演示。可以看到图中数据的偏态分布及量纲差别。
```{r } ```{r }
BostonHousing %>% keep(is.numeric) %>% BostonHousing %>%
gather() %>% ggplot(aes(value)) + keep(is.numeric) %>%
gather() %>%
ggplot(aes(value)) +
facet_wrap(~key, scales = "free") + facet_wrap(~key, scales = "free") +
geom_density(color="#348498",fill="#8ac6d1") + theme_bw() geom_density(color = "#348498", fill = "#8ac6d1") +
theme_bw()
``` ```
### 5.1 0-1规范化 ### 0-1规范化
0-1规范化是将原始数据缩放到[0,1]区间内,一般方法是最小最大规范的方法,公式如下: 0-1规范化是将原始数据缩放到[0,1]区间内,一般方法是最小最大规范的方法,公式如下:
@ -440,10 +429,13 @@ head(nums_data_norm1)
转换完再看一下分布已经缩放到0-1之间了。 转换完再看一下分布已经缩放到0-1之间了。
```{r } ```{r }
nums_data_norm1 %>% keep(is.numeric) %>% nums_data_norm1 %>%
gather() %>% ggplot(aes(value)) + keep(is.numeric) %>%
gather() %>%
ggplot(aes(value)) +
facet_wrap(~key, scales = "free") + facet_wrap(~key, scales = "free") +
geom_density(color="#348498",fill="#8ac6d1") + theme_bw() geom_density(color = "#348498", fill = "#8ac6d1") +
theme_bw()
``` ```
@ -453,7 +445,7 @@ nums_data_norm2 <- nums_data
nums_data_norm2$crim <- dlookr::transform(nums_data$crim, method = "minmax") nums_data_norm2$crim <- dlookr::transform(nums_data$crim, method = "minmax")
``` ```
### 5.2 Z-score标准化 ### Z-score标准化
Z-score标准化是原数据减去期望再除以标准差将数据按比例缩放使其落入到一个小的区间内标准化后的数据可正可负但是一般绝对值不会太大。 Z-score标准化是原数据减去期望再除以标准差将数据按比例缩放使其落入到一个小的区间内标准化后的数据可正可负但是一般绝对值不会太大。
@ -470,13 +462,16 @@ head(nums_data_zscore)
转换完再看一下分布数据缩放后在0周围的一个小区间了。 转换完再看一下分布数据缩放后在0周围的一个小区间了。
```{r } ```{r }
data.frame(nums_data_zscore) %>% keep(is.numeric) %>% data.frame(nums_data_zscore) %>%
gather() %>% ggplot(aes(value)) + keep(is.numeric) %>%
gather() %>%
ggplot(aes(value)) +
facet_wrap(~key, scales = "free") + facet_wrap(~key, scales = "free") +
geom_density(color="#348498",fill="#8ac6d1") + theme_bw() geom_density(color = "#348498", fill = "#8ac6d1") +
theme_bw()
``` ```
### 5.3 对数转换(log transform) ### 对数转换(log transform)
使用对数转换也是一种常见的处理偏斜特征的方法但要注意原数据中不能含有负值。此外为了避免0值我们通常使用log1p公式为`lg(x+1)`。可以直接用dlookr包里的`transform()`函数一般结合mutate函数一起使用。 使用对数转换也是一种常见的处理偏斜特征的方法但要注意原数据中不能含有负值。此外为了避免0值我们通常使用log1p公式为`lg(x+1)`。可以直接用dlookr包里的`transform()`函数一般结合mutate函数一起使用。
@ -492,13 +487,16 @@ nums_data_log1p2$b <- dlookr::transform(nums_data_log1p2$b,method = "log+1")
转换完再看一下分布,大多变量转换后接近正态分布了。但是这里要特别注意离散数据。 转换完再看一下分布,大多变量转换后接近正态分布了。但是这里要特别注意离散数据。
```{r } ```{r }
nums_data_log1p1 %>% keep(is.numeric) %>% nums_data_log1p1 %>%
gather() %>% ggplot(aes(value)) + keep(is.numeric) %>%
gather() %>%
ggplot(aes(value)) +
facet_wrap(~key, scales = "free") + facet_wrap(~key, scales = "free") +
geom_density(color="#348498",fill="#8ac6d1") + theme_bw() geom_density(color = "#348498", fill = "#8ac6d1") +
theme_bw()
``` ```
### 5.4 Box-Cox ### Box-Cox
Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法在变换后可以一定程度上减小不可观测的误差和预测变量的相关性在机器学习中经常用来处理偏态分布。其一个显著优点是通过求变换参数来确定变换形式而这个过程完全基于数据本身而无须任何先验信息这无疑比凭经验或通过尝试而选用对数、平方根等变换方式要客观和精确。计算公式如下 Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法在变换后可以一定程度上减小不可观测的误差和预测变量的相关性在机器学习中经常用来处理偏态分布。其一个显著优点是通过求变换参数来确定变换形式而这个过程完全基于数据本身而无须任何先验信息这无疑比凭经验或通过尝试而选用对数、平方根等变换方式要客观和精确。计算公式如下
@ -507,12 +505,13 @@ Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法在变
示例参考附录`基于R语言进行Box-Cox变换` 示例参考附录`基于R语言进行Box-Cox变换`
## 6 小拓展 ## 小拓展
R语言中mutate 类似于SQL中根据表的现有变量生成新变量。使用mutate集中处理变量转换代码显示较整洁。 R语言中mutate 类似于SQL中根据表的现有变量生成新变量。使用mutate集中处理变量转换代码显示较整洁。
```{r } ```{r }
h1n1_data_de <- h1n1_data_complete %>% to_dummy(education, suffix = "label") %>% h1n1_data_de <- h1n1_data_complete %>%
to_dummy(education, suffix = "label") %>%
bind_cols(h1n1_data_complete) %>% bind_cols(h1n1_data_complete) %>%
mutate( mutate(
# 标签编码(label encoder) # 标签编码(label encoder)
@ -531,18 +530,22 @@ R语言中mutate 类似于SQL中根据表的现有变量生成新变量
age_group %in% c("18 - 34 Years") ~ 1, age_group %in% c("18 - 34 Years") ~ 1,
age_group %in% c("35 - 44 Years", "45 - 54 Years", "55 - 64 Years") ~ 2, age_group %in% c("35 - 44 Years", "45 - 54 Years", "55 - 64 Years") ~ 2,
age_group %in% c("65+ Years") ~ 3 age_group %in% c("65+ Years") ~ 3
)), )
),
# 标准化 # 标准化
across( across(
c("h1n1_knowledge", c(
"h1n1_knowledge",
"doctor_recc_h1n1", "doctor_recc_h1n1",
"chronic_med_condition", "chronic_med_condition",
"opinion_h1n1_vacc_effective", "opinion_h1n1_vacc_effective",
"age_group", "age_group",
"income_poverty"), "income_poverty"
),
~ scale(as.numeric(.x)) ~ scale(as.numeric(.x))
) )
) %>% dplyr::select(-one_of("education","education_")) ) %>%
dplyr::select(-one_of("education", "education_"))
head(h1n1_data_de) head(h1n1_data_de)
``` ```
@ -554,9 +557,9 @@ head( h1n1_data_de)
看完了本节数据清洗与准备,尝试着选取一个完整的数据集(从本节中选取或使用自己的数据集),来做一次清洗吧! 看完了本节数据清洗与准备,尝试着选取一个完整的数据集(从本节中选取或使用自己的数据集),来做一次清洗吧!
## 附录:参考资料 ## 附录:参考资料 {-}
### 理论资料 ### 理论资料 {-}
**数据的预处理基础:** 如何处理缺失值 https://cloud.tencent.com/developer/article/1626004 **数据的预处理基础:** 如何处理缺失值 https://cloud.tencent.com/developer/article/1626004
@ -571,7 +574,7 @@ head( h1n1_data_de)
**什么样的模型对缺失值更敏感?:** https://blog.csdn.net/zhang15953709913/article/details/88717220 **什么样的模型对缺失值更敏感?:** https://blog.csdn.net/zhang15953709913/article/details/88717220
### R语言函数用法示例 ### R语言函数用法示例 {-}
`funModeling`用法示例https://cran.r-project.org/web/packages/funModeling/vignettes/funModeling_quickstart.html `funModeling`用法示例https://cran.r-project.org/web/packages/funModeling/vignettes/funModeling_quickstart.html
@ -594,13 +597,19 @@ R语言日期时间处理https://zhuanlan.zhihu.com/p/83984803
R中数据集分割https://zhuanlan.zhihu.com/p/45163182 R中数据集分割https://zhuanlan.zhihu.com/p/45163182
**Task2 END.** ## 本章作者 {-}
--- By: June
__June__
> 悉尼大学研究生Datawhale成员 > 悉尼大学研究生Datawhale成员
> https://blog.csdn.net/Yao_June
关于Datawhale Datawhale是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习专题知识将在天池分享详情可关注Datawhale ## 关于Datawhale {-}
[![logo.png](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572)](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572) Datawhale 是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习,专题知识将在天池分享,详情可关注 Datawhale
```{r, echo = FALSE}
insert_logo()
```

View File

@ -1,32 +1,9 @@
--- # 基本统计分析 {#task-03}
title: |
| DataWhale 组队学习 R语言数据分析
| Task03 基础统计分析
author: "杨佳达"
date: "`r Sys.Date()`"
header-includes:
- \usepackage{ctex}
urlcolor: blue
output:
prettydoc::html_pretty:
theme: cayman
highlight: github
number_section: no
toc: no
knit: (function(inputFile, encoding) {
rmarkdown::render(inputFile, encoding = encoding,
output_dir = "output", output_format = "all") })
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE,warning=FALSE, message=FALSE,tidy=TRUE,collapse=FALSE)
```
![](./image/task03_structure.png){width=100%} ![](./image/task03_structure.png){width=100%}
# 基础统计分析
## 准备工作 ## 准备工作 {-}
如果没有相关的包,则使用`install.packages('package_name')`进行安装以下包。 如果没有相关的包,则使用`install.packages('package_name')`进行安装以下包。
```{r} ```{r}
@ -37,13 +14,13 @@ library(ggm)
读取数据使用H1N1流感数据集和波士顿房价数据集。 读取数据使用H1N1流感数据集和波士顿房价数据集。
```{r} ```{r}
flu = read.table('./datasets/h1n1_flu.csv', header=TRUE, sep=',') flu <- read.table("./datasets/h1n1_flu.csv", header = TRUE, sep = ",")
housing = read.csv('./datasets/BostonHousing.csv', header=TRUE) housing <- read.csv("./datasets/BostonHousing.csv", header = TRUE)
``` ```
## 1 多种方法获取描述性统计量 ## 多种方法获取描述性统计量
### 1.1 基础方法 ### 基础方法
通过summary计算数值型变量的最大值、最小值、分位数以及均值类别变量计算频数统计。 通过summary计算数值型变量的最大值、最小值、分位数以及均值类别变量计算频数统计。
```{r} ```{r}
@ -57,8 +34,9 @@ summary(flu[c("h1n1_concern", "h1n1_knowledge")])
通过 sapply() 计算描述性统计量,先定义统计函数,在进行聚合计算。 通过 sapply() 计算描述性统计量,先定义统计函数,在进行聚合计算。
```{r} ```{r}
mystats <- function(x, na.omit = FALSE) { mystats <- function(x, na.omit = FALSE) {
if (na.omit) if (na.omit) {
x <- x[!is.na(x)] x <- x[!is.na(x)]
}
m <- mean(x) m <- mean(x)
n <- length(x) n <- length(x)
s <- sd(x) s <- sd(x)
@ -69,7 +47,8 @@ return(c(n=n, mean=m, stdev=s, skew=skew, kurtosis=kurt))
sapply(flu[c("h1n1_concern", "h1n1_knowledge")], mystats) sapply(flu[c("h1n1_concern", "h1n1_knowledge")], mystats)
``` ```
### 1.2 拓展包方法
### 拓展包方法
通过pastecs包中的 stat.desc()函数计算描述性统计量可以得到中位数、平均数、平均数的标准误、平均数置信度为95%的置信区间、方差、标准差以及变异系数。 通过pastecs包中的 stat.desc()函数计算描述性统计量可以得到中位数、平均数、平均数的标准误、平均数置信度为95%的置信区间、方差、标准差以及变异系数。
```{r} ```{r}
@ -80,11 +59,11 @@ stat.desc(flu[c("household_children","sex")])
describe(flu[c("household_children", "sex")]) describe(flu[c("household_children", "sex")])
``` ```
## 2 分组计算描述性统计 ## 分组计算描述性统计
### 2.1 基础方法 ### 基础方法
#### 使用aggregate()分组获取描述性统计 #### 使用aggregate()分组获取描述性统计 {-}
1. 分组计算不同性别收入贫困计数。 1. 分组计算不同性别收入贫困计数。
2. 是否属于查尔斯河的房价中位数平均值。 2. 是否属于查尔斯河的房价中位数平均值。
@ -92,18 +71,22 @@ describe(flu[c("household_children","sex")])
aggregate(flu[c("income_poverty")], by = list(sex = flu$sex), length) aggregate(flu[c("income_poverty")], by = list(sex = flu$sex), length)
aggregate(housing$medv, by = list(medv = housing$chas), FUN = mean) aggregate(housing$medv, by = list(medv = housing$chas), FUN = mean)
``` ```
#### 使用 by() 分组计算描述性统计量
#### 使用 by() 分组计算描述性统计量 {-}
```{r} ```{r}
by(flu[c("income_poverty", "sex")], flu$sex, length) by(flu[c("income_poverty", "sex")], flu$sex, length)
``` ```
## 3 频数表和列联表
## 频数表和列联表
```{r} ```{r}
table(flu$sex) table(flu$sex)
``` ```
## 4 相关 ## 相关
### 4.1 相关的类型
#### Pearson、Spearman和Kendall相关 ### 相关的类型
#### Pearson、Spearman和Kendall相关 {-}
R可以计算多种相关系数包括Pearson相关系数、Spearman相关系数、Kendall相关系数、偏相关系数、多分格polychoric相关系数和多系列polyserial相关系数。 R可以计算多种相关系数包括Pearson相关系数、Spearman相关系数、Kendall相关系数、偏相关系数、多分格polychoric相关系数和多系列polyserial相关系数。
1. 计算房价数据的相关系数默认是Pearson相关系数。 1. 计算房价数据的相关系数默认是Pearson相关系数。
@ -123,29 +106,45 @@ y <- housing[c("medv")]
cor(x, y) cor(x, y)
``` ```
#### 偏相关 #### 偏相关 {-}
偏相关是指在控制一个或多个定量变量时另外两个定量变量之间的相互关系。使用ggm 包中的 pcor() 函数计算偏相关系数。 偏相关是指在控制一个或多个定量变量时另外两个定量变量之间的相互关系。使用ggm 包中的 pcor() 函数计算偏相关系数。
### 4.2 相关性的显著性检验 ### 相关性的显著性检验
```{r} ```{r}
cor.test(housing[, c("crim")], housing[, c("medv")]) cor.test(housing[, c("crim")], housing[, c("medv")])
``` ```
## 5 方差分析 ## 方差分析
方差分析ANOVA又称“变异数分析”或“F检验”用于两个及两个以上样本均数差别的显著性检验。 方差分析ANOVA又称“变异数分析”或“F检验”用于两个及两个以上样本均数差别的显著性检验。
### 5.1 单因素方差分析 ### 单因素方差分析
从输出结果的F检验值来看p<0.05比较显著,说明是否在查尔斯河对房价有影响。 从输出结果的F检验值来看p<0.05比较显著,说明是否在查尔斯河对房价有影响。
```{r} ```{r}
fit <- aov(housing$medv ~ housing$chas) fit <- aov(housing$medv ~ housing$chas)
summary(fit) summary(fit)
``` ```
### 5.2 多因素方差分析 ### 多因素方差分析
构建多因素方差分析,查看因子对房价的影响是否显著。 构建多因素方差分析,查看因子对房价的影响是否显著。
```{r} ```{r}
fit <- aov(housing$medv ~ housing$crim * housing$b) fit <- aov(housing$medv ~ housing$crim * housing$b)
summary(fit) summary(fit)
``` ```
## 本章作者 {-}
__杨佳达__
> 数据挖掘师Datawhale成员目前在国内某第三方数据服务公司做数据分析挖掘及数据产品
> https://github.com/yangjiada
## 关于Datawhale {-}
Datawhale 是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习,专题知识将在天池分享,详情可关注 Datawhale
```{r, echo = FALSE}
insert_logo()
```

View File

@ -1,29 +1,10 @@
---
title: |
| DataWhale 组队学习 R语言数据分析
| Task04 数据可视化
author: "牧小熊"
date: "`r Sys.Date()`"
header-includes:
- \usepackage{ctex}
urlcolor: blue
output:
prettydoc::html_pretty:
theme: cayman
highlight: github
number_section: no
toc: no
knit: (function(inputFile, encoding) {
rmarkdown::render(inputFile, encoding = encoding,
output_dir = "output", output_format = "all") })
---
```{r setup, include=FALSE} # 数据可视化 {#task-04}
knitr::opts_chunk$set(echo = TRUE,warning=FALSE, message=FALSE,tidy=TRUE,collapse=TRUE)
```
![](./image/task04_structure.png){width=60%} ![](./image/task04_structure.png){width=60%}
## 0.ggplot2包介绍 ## ggplot2包介绍 {-}
ggplot2包由Hadley Wickham编写提供了一种基于Wilkinson所述图形语法的图形系统。ggplot2包的目标是提供一个全面的、基于语法的、连贯一致的图形生成系统允许用户创建新颖的、有创新性的数据可视化图形。 ggplot2包由Hadley Wickham编写提供了一种基于Wilkinson所述图形语法的图形系统。ggplot2包的目标是提供一个全面的、基于语法的、连贯一致的图形生成系统允许用户创建新颖的、有创新性的数据可视化图形。
@ -61,7 +42,7 @@ ggplot2的安装方法
# install.packages("ggplot2") # install.packages("ggplot2")
``` ```
## 1.环境配置 ## 环境配置
``` {r} ``` {r}
library(ggplot2) # 画图工具ggplot2 library(ggplot2) # 画图工具ggplot2
library(ggpubr) # 将多个图形拼接 library(ggpubr) # 将多个图形拼接
@ -71,7 +52,7 @@ library(plyr) #数据处理包
在本讲中会用到ggpubr中的ggrrange这个多图拼接工具详细使用方法参见 在本讲中会用到ggpubr中的ggrrange这个多图拼接工具详细使用方法参见
http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/81-ggplot2-easy-way-to-mix-multiple-graphs-on-the-same-page/ http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/81-ggplot2-easy-way-to-mix-multiple-graphs-on-the-same-page/
## 案例数据 ### 案例数据 {-}
本节内容将会使用到两个数据集 本节内容将会使用到两个数据集
**1.1h1n1流感问卷数据集** **1.1h1n1流感问卷数据集**
@ -80,7 +61,7 @@ h1n1流感问卷数据集是关于h1n1流感问卷调查的一个数据属于
数据集包含26,707个受访者数据共有32个特征+1个标签是否接种h1n1疫苗 数据集包含26,707个受访者数据共有32个特征+1个标签是否接种h1n1疫苗
读取相关的数据集 读取相关的数据集
```{r h1n1} ```{r }
h1n1_data <- read.csv("./datasets/h1n1_flu.csv", header = TRUE) h1n1_data <- read.csv("./datasets/h1n1_flu.csv", header = TRUE)
``` ```
@ -94,7 +75,7 @@ boston_data <- read.csv("./datasets/BostonHousing.csv", header = TRUE)
``` ```
## 2.散点图 ## 散点图
散点图是指在数理统计回归分析中,数据点在直角坐标系平面上的分布图,散点图表示因变量随自变量而变化的大致趋势,由此趋势可以选择合适的函数进行经验分布的拟合,进而找到变量之间的函数关系。 散点图是指在数理统计回归分析中,数据点在直角坐标系平面上的分布图,散点图表示因变量随自变量而变化的大致趋势,由此趋势可以选择合适的函数进行经验分布的拟合,进而找到变量之间的函数关系。
@ -109,7 +90,8 @@ boston_data <- read.csv("./datasets/BostonHousing.csv", header = TRUE)
# 读取数据 # 读取数据
boston_data <- read.csv("./datasets/BostonHousing.csv", header = TRUE) boston_data <- read.csv("./datasets/BostonHousing.csv", header = TRUE)
# 绘制简单的散点图 x轴选择的是lstat ,y轴选择的是medv # 绘制简单的散点图 x轴选择的是lstat ,y轴选择的是medv
ggplot(data=boston_data, aes(x=lstat, y=medv)) + geom_point() ggplot(data = boston_data, aes(x = lstat, y = medv)) +
geom_point()
``` ```
上图选择的是lstat为x轴medv为y轴绘制的散点图x轴表示弱势群体人口所占比例y轴表示房屋的平均价格通过图上的数据可以看到弱势人群的比例增加会影响房价这2个变量呈现一定的负相关。 上图选择的是lstat为x轴medv为y轴绘制的散点图x轴表示弱势群体人口所占比例y轴表示房屋的平均价格通过图上的数据可以看到弱势人群的比例增加会影响房价这2个变量呈现一定的负相关。
@ -120,30 +102,35 @@ ggplot2可以修改散点图的性状和大小,R语言中存储了一些相关
size参数修改点的大小color参数修改点的颜色 size参数修改点的大小color参数修改点的颜色
```{r plot2} ```{r plot2}
# 使用第17号形状 # 使用第17号形状
p1<-ggplot(data=boston_data, aes(x=lstat, y=medv)) + geom_point(shape=17) p1 <- ggplot(data = boston_data, aes(x = lstat, y = medv)) +
geom_point(shape = 17)
# size参数修改点的大小color参数修改点的颜色 # size参数修改点的大小color参数修改点的颜色
p2<-ggplot(data=boston_data, aes(x=lstat, y=medv)) + geom_point(size=3,color="red") p2 <- ggplot(data = boston_data, aes(x = lstat, y = medv)) +
geom_point(size = 3, color = "red")
ggarrange(p1, p2, nrow = 1) ggarrange(p1, p2, nrow = 1)
``` ```
可将数据集的其它属性映射到散点图的颜色属性中 可将数据集的其它属性映射到散点图的颜色属性中
```{r plot4} ```{r plot4}
p3<-ggplot(data=boston_data, aes(x=lstat, y=medv,colour=factor(rad))) + geom_point() p3 <- ggplot(data = boston_data, aes(x = lstat, y = medv, colour = factor(rad))) +
p4<-ggplot(data=boston_data, aes(x=lstat, y=medv,colour=rad)) + geom_point() geom_point()
p4 <- ggplot(data = boston_data, aes(x = lstat, y = medv, colour = rad)) +
geom_point()
ggarrange(p3, p4, nrow = 1) ggarrange(p3, p4, nrow = 1)
``` ```
ggplot2关于散点图的相关做法有很详细的介绍相关参考链接https://ggplot2.tidyverse.org/reference/geom_point.html ggplot2关于散点图的相关做法有很详细的介绍相关参考链接https://ggplot2.tidyverse.org/reference/geom_point.html
## 3.直方图 ## 直方图
直方图是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。 直方图是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
直方图可以很好的查看数据的分布情况,是常用的数据可视化展示图形。 直方图可以很好的查看数据的分布情况,是常用的数据可视化展示图形。
我们对rad变量进行直方图分析 我们对rad变量进行直方图分析
```{r plot6} ```{r plot6}
ggplot(data=boston_data, aes(x=rad)) + geom_histogram() ggplot(data = boston_data, aes(x = rad)) +
geom_histogram()
``` ```
可以看到ggplot2可以自动对数据进行直方图的统计 可以看到ggplot2可以自动对数据进行直方图的统计
@ -153,8 +140,10 @@ ggplot(data=boston_data, aes(x=rad)) + geom_histogram()
RGB颜色表可以参考http://www.mgzxzs.com/sytool/se.htm RGB颜色表可以参考http://www.mgzxzs.com/sytool/se.htm
```{r plot7} ```{r plot7}
p5<-ggplot(data=boston_data, aes(x=rad)) + geom_histogram(color="black",fill="#69b3a2") p5 <- ggplot(data = boston_data, aes(x = rad)) +
p6<-ggplot(data=boston_data, aes(x=rad)) + geom_histogram(color="black",fill="#69b3a2",linetype="dashed") geom_histogram(color = "black", fill = "#69b3a2")
p6 <- ggplot(data = boston_data, aes(x = rad)) +
geom_histogram(color = "black", fill = "#69b3a2", linetype = "dashed")
ggarrange(p5, p6, nrow = 1) ggarrange(p5, p6, nrow = 1)
``` ```
@ -162,22 +151,24 @@ ggplot2也支持在直方图上添加平均线和密度图
```{r plot8} ```{r plot8}
p7 <- p5 + geom_vline(aes(xintercept = mean(rad)), color = "blue", linetype = "dashed", size = 1) p7 <- p5 + geom_vline(aes(xintercept = mean(rad)), color = "blue", linetype = "dashed", size = 1)
p8<-ggplot(data=boston_data, aes(x=rad)) + geom_histogram(color="black",fill="#69b3a2",aes(y=..density..))+ p8 <- ggplot(data = boston_data, aes(x = rad)) +
geom_histogram(color = "black", fill = "#69b3a2", aes(y = ..density..)) +
geom_density(alpha = .2, fill = "#FF6666") geom_density(alpha = .2, fill = "#FF6666")
ggarrange(p7, p8, nrow = 1) ggarrange(p7, p8, nrow = 1)
``` ```
ggplot2关于直方图的相关做法有很详细的介绍相关参考链接https://ggplot2.tidyverse.org/reference/geom_histogram.html ggplot2关于直方图的相关做法有很详细的介绍相关参考链接https://ggplot2.tidyverse.org/reference/geom_histogram.html
## 4.柱状图 ## 柱状图
柱状图是一种常用的数据可视化图形,根据翻译的不同,柱状图又叫长条图、柱状统计图、条状图、棒形图 柱状图是一种常用的数据可视化图形,根据翻译的不同,柱状图又叫长条图、柱状统计图、条状图、棒形图
柱状图图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。长条图亦可横向排列,或用多维方式表达。需要注意的是柱状图与直方图是不同的数据可视化方法,不要弄混淆了。 柱状图图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。长条图亦可横向排列,或用多维方式表达。需要注意的是柱状图与直方图是不同的数据可视化方法,不要弄混淆了。
对h1n1数据集中填写人的受教育情况进行可视化展示,使用pylr包中的count对edcation进行计数统计 对h1n1数据集中填写人的受教育情况进行可视化展示,使用pylr包中的count对edcation进行计数统计
```{r plot9} ```{r plot9}
data<-count(h1n1_data['race']) data <- count(h1n1_data["race"])
p<-ggplot(data,aes(x=race,y=freq))+geom_bar(stat="identity") p <- ggplot(data, aes(x = race, y = freq)) +
geom_bar(stat = "identity")
# 也可以进行水平放置 # 也可以进行水平放置
p1 <- p + coord_flip() p1 <- p + coord_flip()
ggarrange(p, p1) ggarrange(p, p1)
@ -186,9 +177,10 @@ ggarrange(p,p1)
可以看到左边的柱状图文字有点挡住了我们把文字旋转45° 可以看到左边的柱状图文字有点挡住了我们把文字旋转45°
```{r plot9a} ```{r plot9a}
data<-count(h1n1_data['race']) data <- count(h1n1_data["race"])
ggplot(data,aes(x=race,y=freq))+geom_bar(stat="identity")+theme(axis.text.x = element_text(angle = 45,hjust=1)) ggplot(data, aes(x = race, y = freq)) +
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
``` ```
对柱状图的样式进行修改 对柱状图的样式进行修改
@ -197,14 +189,17 @@ ggplot(data,aes(x=race,y=freq))+geom_bar(stat="identity")+theme(axis.text.x = el
# 更改条的宽度和颜色: # 更改条的宽度和颜色:
# 更改条的宽度 # 更改条的宽度
p2 <- ggplot(data, aes(x = race, y = freq)) + p2 <- ggplot(data, aes(x = race, y = freq)) +
geom_bar(stat="identity", width=0.5)+theme(axis.text.x = element_text(angle = 45,hjust=1)) geom_bar(stat = "identity", width = 0.5) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# 改变颜色 # 改变颜色
p3 <- ggplot(data, aes(x = race, y = freq)) + p3 <- ggplot(data, aes(x = race, y = freq)) +
geom_bar(stat="identity", color="blue", fill="white")+theme(axis.text.x = element_text(angle = 45,hjust=1)) geom_bar(stat = "identity", color = "blue", fill = "white") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# 最小主题+蓝色填充颜色 # 最小主题+蓝色填充颜色
p4 <- ggplot(data, aes(x = race, y = freq)) + p4 <- ggplot(data, aes(x = race, y = freq)) +
geom_bar(stat = "identity", fill = "steelblue") + geom_bar(stat = "identity", fill = "steelblue") +
theme_minimal()+theme(axis.text.x = element_text(angle = 45,hjust=1)) theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# 选择要显示的项目 # 选择要显示的项目
p5 <- p + scale_x_discrete(limits = c("White", "Black")) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) p5 <- p + scale_x_discrete(limits = c("White", "Black")) + theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggarrange(p2, p3, p4, p5) ggarrange(p2, p3, p4, p5)
@ -215,12 +210,14 @@ ggarrange(p2,p3,p4,p5)
p6 <- ggplot(data = data, aes(x = race, y = freq)) + p6 <- ggplot(data = data, aes(x = race, y = freq)) +
geom_bar(stat = "identity", fill = "steelblue") + geom_bar(stat = "identity", fill = "steelblue") +
geom_text(aes(label = freq), vjust = -0.3, size = 3.5) + geom_text(aes(label = freq), vjust = -0.3, size = 3.5) +
theme_minimal()+theme(axis.text.x = element_text(angle = 45,hjust=1)) theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# 条形内部标签 # 条形内部标签
p7 <- ggplot(data = data, aes(x = race, y = freq)) + p7 <- ggplot(data = data, aes(x = race, y = freq)) +
geom_bar(stat = "identity", fill = "steelblue") + geom_bar(stat = "identity", fill = "steelblue") +
geom_text(aes(label = freq), vjust = 1.6, color = "white", size = 3.5) + geom_text(aes(label = freq), vjust = 1.6, color = "white", size = 3.5) +
theme_minimal()+theme(axis.text.x = element_text(angle = 45,hjust=1)) theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggarrange(p6, p7, nrow = 1) ggarrange(p6, p7, nrow = 1)
``` ```
@ -229,13 +226,15 @@ ggarrange(p6,p7,nrow = 1)
data <- within(data, { data <- within(data, {
race <- factor(race, levels = c("White", "Black", "Hispanic", "Other or Multiple")) race <- factor(race, levels = c("White", "Black", "Hispanic", "Other or Multiple"))
}) })
ggplot(data,aes(x=race,y=freq))+geom_bar(stat="identity", fill="steelblue")+theme(axis.text.x = element_text(angle = 45,hjust=1)) ggplot(data, aes(x = race, y = freq)) +
geom_bar(stat = "identity", fill = "steelblue") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
``` ```
ggplot2关于柱状图的相关做法有很详细的介绍相关参考链接 ggplot2关于柱状图的相关做法有很详细的介绍相关参考链接
https://ggplot2.tidyverse.org/reference/geom_bar.html https://ggplot2.tidyverse.org/reference/geom_bar.html
## 5.饼状图 ## 饼状图
饼状图作为常用的数据可视化图形之一,广泛的使用在各个领域,能够很清楚展示数据的所占的百分比。 饼状图作为常用的数据可视化图形之一,广泛的使用在各个领域,能够很清楚展示数据的所占的百分比。
ggplot2并没有类似于geom_pie()这样的函数实现饼图的绘制但ggplot2有一个理念就是通过极坐标变换绘制饼图 ggplot2并没有类似于geom_pie()这样的函数实现饼图的绘制但ggplot2有一个理念就是通过极坐标变换绘制饼图
@ -244,39 +243,51 @@ ggplot2并没有类似于geom_pie()这样的函数实现饼图的绘制但ggp
对h1n1问卷表中race数据进行数据展示 对h1n1问卷表中race数据进行数据展示
```{r plot13} ```{r plot13}
data<-count(h1n1_data['race']) data <- count(h1n1_data["race"])
ggplot(data = data, aes(x ='', y = freq, fill = race)) + geom_bar(stat = 'identity') ggplot(data = data, aes(x = "", y = freq, fill = race)) +
geom_bar(stat = "identity")
``` ```
堆叠的条形图绘制完后接下来就需要进行极坐标变换了ggplot2中coord_polar()函数可以非常方便的实现极坐标变换。 堆叠的条形图绘制完后接下来就需要进行极坐标变换了ggplot2中coord_polar()函数可以非常方便的实现极坐标变换。
```{r plot14} ```{r plot14}
ggplot(data = data, aes(x ='', y = freq, fill = race)) + geom_bar(stat = 'identity')+coord_polar(theta = 'y') ggplot(data = data, aes(x = "", y = freq, fill = race)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y")
``` ```
看起来像饼图了,但是饼图周围还有多余的数字,如何清除呢? 看起来像饼图了,但是饼图周围还有多余的数字,如何清除呢?
这里的标签其实就是坐标轴的标签可以通过labs()函数将其清除。 这里的标签其实就是坐标轴的标签可以通过labs()函数将其清除。
```{r plot15} ```{r plot15}
ggplot(data = data, aes(x ='', y = freq, fill = race)) + geom_bar(stat = 'identity')+coord_polar(theta = 'y')+labs(x = '', y = '', title = '') + theme(axis.text = element_blank()) ggplot(data = data, aes(x = "", y = freq, fill = race)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y") +
labs(x = "", y = "", title = "") +
theme(axis.text = element_blank())
``` ```
接下来就是显示各个所占的比例 接下来就是显示各个所占的比例
第一种方法,将百分比直接显示在图例中,这种方式适合分类较多的情况。 第一种方法,将百分比直接显示在图例中,这种方式适合分类较多的情况。
```{r } ```{r }
label_value <- paste('(', round(data$freq/sum(data$freq) * 100, 1), '%)', sep = '') label_value <- paste("(", round(data$freq / sum(data$freq) * 100, 1), "%)", sep = "")
label_value label_value
``` ```
将计算的百分比和race匹配 将计算的百分比和race匹配
```{r } ```{r }
label <- paste(data$race, label_value, sep = '') label <- paste(data$race, label_value, sep = "")
label label
``` ```
接下来就是将这些百分比标签放到图例中 接下来就是将这些百分比标签放到图例中
```{r } ```{r }
ggplot(data = data, aes(x ='', y = freq, fill = race)) + geom_bar(stat = 'identity')+coord_polar(theta = 'y')+labs(x = '', y = '', title = '') + theme(axis.text = element_blank())+scale_fill_discrete(labels = label) ggplot(data = data, aes(x = "", y = freq, fill = race)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y") +
labs(x = "", y = "", title = "") +
theme(axis.text = element_blank()) +
scale_fill_discrete(labels = label)
``` ```
看起来就很不错~ 看起来就很不错~
@ -285,19 +296,25 @@ ggplot(data = data, aes(x ='', y = freq, fill = race)) + geom_bar(stat = 'identi
首先是去掉饼图中的图例 首先是去掉饼图中的图例
```{r } ```{r }
ggplot(data = data, aes(x ='', y = freq, fill = race)) + geom_bar(stat = 'identity')+coord_polar(theta = 'y')+labs(x = '', y = '', title = '') + theme(axis.text = element_blank())+theme(legend.position = "none") ggplot(data = data, aes(x = "", y = freq, fill = race)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y") +
labs(x = "", y = "", title = "") +
theme(axis.text = element_blank()) +
theme(legend.position = "none")
``` ```
将标签放置在饼图中 将标签放置在饼图中
```{r } ```{r }
ggplot(data = data, aes(x ='', y = freq, fill = race)) + ggplot(data = data, aes(x = "", y = freq, fill = race)) +
geom_bar(stat = 'identity',width = 1)+ geom_bar(stat = "identity", width = 1) +
coord_polar(theta = 'y')+labs(x = '', y = '', title = '') + coord_polar(theta = "y") +
labs(x = "", y = "", title = "") +
theme(axis.text = element_blank(), legend.position = "none") + theme(axis.text = element_blank(), legend.position = "none") +
geom_text(aes(label = label), size = 3, position = position_stack(vjust = 0.5)) geom_text(aes(label = label), size = 3, position = position_stack(vjust = 0.5))
``` ```
## 6.折线图 ## 折线图
折线图作为反映数据变化的趋势是常用的数据可视化图形之一在ggplot2中通过geom_line()这个函数进行绘制。 折线图作为反映数据变化的趋势是常用的数据可视化图形之一在ggplot2中通过geom_line()这个函数进行绘制。
对波士顿房价中rad进行可视化展示使用pylr包中的count对edcation进行计数统计 对波士顿房价中rad进行可视化展示使用pylr包中的count对edcation进行计数统计
@ -310,30 +327,39 @@ data
把rad为24的数据去除掉 把rad为24的数据去除掉
```{r } ```{r }
data <- data[1:8, ] data <- data[1:8, ]
ggplot(data,aes(x=rad,y=freq))+geom_line() ggplot(data, aes(x = rad, y = freq)) +
geom_line()
``` ```
有时候我们需要在折线图上显示对应x轴的点数据从而可以更加清晰的辨别原始数据,这特别适合数据比较稀疏的情况 有时候我们需要在折线图上显示对应x轴的点数据从而可以更加清晰的辨别原始数据,这特别适合数据比较稀疏的情况
```{r } ```{r }
ggplot(data,aes(x=rad,y=freq))+geom_line()+geom_point(size=4) ggplot(data, aes(x = rad, y = freq)) +
geom_line() +
geom_point(size = 4)
``` ```
我们调整横坐标的显示刻度 我们调整横坐标的显示刻度
```{r } ```{r }
ggplot(data,aes(x=rad,y=freq))+geom_line()+geom_point(size=4)+scale_x_continuous(breaks =c(1:8)) ggplot(data, aes(x = rad, y = freq)) +
geom_line() +
geom_point(size = 4) +
scale_x_continuous(breaks = c(1:8))
``` ```
也可以修改线的类型和颜色 也可以修改线的类型和颜色
```{r } ```{r }
ggplot(data,aes(x=rad,y=freq))+geom_line(linetype = "dashed",color="red")+geom_point(size=4)+scale_x_continuous(breaks =c(1:8)) ggplot(data, aes(x = rad, y = freq)) +
geom_line(linetype = "dashed", color = "red") +
geom_point(size = 4) +
scale_x_continuous(breaks = c(1:8))
``` ```
ggplt2关于折线图的相关做法的参考链接 ggplt2关于折线图的相关做法的参考链接
https://ggplot2.tidyverse.org/reference/geom_abline.html https://ggplot2.tidyverse.org/reference/geom_abline.html
## 7.ggplot2扩展包主题 ## ggplot2扩展包主题
R语言中的ggplot2包里面的风格固定在需要特殊的图形时需要更改甚至自定义设置主题。 R语言中的ggplot2包里面的风格固定在需要特殊的图形时需要更改甚至自定义设置主题。
ggplot2内置了8种风格的主题 ggplot2内置了8种风格的主题
@ -352,7 +378,8 @@ ggplot2内置了8种风格的主题
我们来试一试不同的主题 我们来试一试不同的主题
```{r} ```{r}
p<-ggplot(data=boston_data, aes(x=lstat, y=medv,colour=rad)) + geom_point() p <- ggplot(data = boston_data, aes(x = lstat, y = medv, colour = rad)) +
geom_point()
p1 <- p + theme_bw() + labs(title = "网格白色主题") + theme(legend.position = "none") p1 <- p + theme_bw() + labs(title = "网格白色主题") + theme(legend.position = "none")
p2 <- p + theme_classic() + labs(title = "经典主题") + theme(legend.position = "none") p2 <- p + theme_classic() + labs(title = "经典主题") + theme(legend.position = "none")
p3 <- p + theme_dark() + labs(title = "暗色主题") + theme(legend.position = "none") p3 <- p + theme_dark() + labs(title = "暗色主题") + theme(legend.position = "none")
@ -381,18 +408,22 @@ ggthemr相关链接https://github.com/Mikata-Project/ggthemr
使用方法也是非常简单这里用我比较喜欢的greyscale主题方案 使用方法也是非常简单这里用我比较喜欢的greyscale主题方案
```{r} ```{r}
library(ggthemr) library(ggthemr)
ggthemr('greyscale') ggthemr("greyscale")
p3<-ggplot(data=boston_data, aes(x=lstat, y=medv,colour=factor(rad))) + geom_point() p3 <- ggplot(data = boston_data, aes(x = lstat, y = medv, colour = factor(rad))) +
p4<-ggplot(data=boston_data, aes(x=lstat, y=medv,colour=rad)) + geom_point() geom_point()
p4 <- ggplot(data = boston_data, aes(x = lstat, y = medv, colour = rad)) +
geom_point()
ggarrange(p3, p4, nrow = 1) ggarrange(p3, p4, nrow = 1)
``` ```
试一试light这个主题配色非常的温柔 试一试light这个主题配色非常的温柔
```{r} ```{r}
library(ggthemr) library(ggthemr)
ggthemr('light') ggthemr("light")
p3<-ggplot(data=boston_data, aes(x=lstat, y=medv,colour=factor(rad))) + geom_point() p3 <- ggplot(data = boston_data, aes(x = lstat, y = medv, colour = factor(rad))) +
p4<-ggplot(data=boston_data, aes(x=lstat, y=medv,colour=rad)) + geom_point() geom_point()
p4 <- ggplot(data = boston_data, aes(x = lstat, y = medv, colour = rad)) +
geom_point()
ggarrange(p3, p4, nrow = 1) ggarrange(p3, p4, nrow = 1)
``` ```
@ -401,14 +432,18 @@ ggarrange(p3,p4,nrow = 1)
ggplot2是一个非常经典的数据可视化R包内容非常丰富由于篇幅的原因没办法将ggplot2中的各种方法全部讲述因此选择了几个常见的图形进行相关的讲解以期达到抛砖引玉的效果。如果对ggplot2感兴趣的同学可以去官网进行更加详细的学习也非常期待大家的数据可视化作品~ ggplot2是一个非常经典的数据可视化R包内容非常丰富由于篇幅的原因没办法将ggplot2中的各种方法全部讲述因此选择了几个常见的图形进行相关的讲解以期达到抛砖引玉的效果。如果对ggplot2感兴趣的同学可以去官网进行更加详细的学习也非常期待大家的数据可视化作品~
**Task4 END.** ## 本章作者 {-}
--- By: 牧小熊
__牧小熊__
> 华中农业大学研究生Datawhale成员, Datawhale优秀原创作者 > 华中农业大学研究生Datawhale成员, Datawhale优秀原创作者
>
> 知乎https://www.zhihu.com/people/muxiaoxiong > 知乎https://www.zhihu.com/people/muxiaoxiong
关于Datawhale Datawhale是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习专题知识将在天池分享详情可关注Datawhale ## 关于Datawhale {-}
[![logo.png](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572)](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572) Datawhale是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习专题知识将在天池分享详情可关注Datawhale
```{r, echo = FALSE}
insert_logo()
```

View File

@ -1,32 +1,11 @@
--- # 模型 {#task-05}
title: |
| DataWhale 组队学习 R语言数据分析
| Task05 模型建立
author: "Jin Zhang"
date: "`r Sys.Date()`"
header-includes:
- \usepackage{ctex}
urlcolor: blue
output:
prettydoc::html_pretty:
theme: cayman
highlight: github
number_section: no
toc: no
knit: (function(inputFile, encoding) {
rmarkdown::render(inputFile, encoding = encoding,
output_dir = "output", output_format = "all") })
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE,warning=FALSE, message=FALSE,tidy=TRUE,collapse=FALSE)
```
![](./image/task05_structure.png){width=100%} ![](./image/task05_structure.png){width=100%}
Task05共计3个知识点预计需学习2-3小时请安排好学习任务。 Task05共计3个知识点预计需学习2-3小时请安排好学习任务。
## 1 前言 ## 前言
为了帮助大家更好的使用R语言进行建模分析本章节将借助波士顿房价数据集来展示常见的模型。本章节学习的目的是帮助大家了解模型的适用范围以及如何建模不会对模型的底层原理进行深入的研究。并且迫于时间和精力有限本章节仅介绍部分模型的实现。 为了帮助大家更好的使用R语言进行建模分析本章节将借助波士顿房价数据集来展示常见的模型。本章节学习的目的是帮助大家了解模型的适用范围以及如何建模不会对模型的底层原理进行深入的研究。并且迫于时间和精力有限本章节仅介绍部分模型的实现。
- 回归模型: 回归模型是一种有监督的、预测性的建模技术,它研究的是因变量和自变量之间的关系。 - 回归模型: 回归模型是一种有监督的、预测性的建模技术,它研究的是因变量和自变量之间的关系。
@ -58,12 +37,12 @@ dim(BostonHousingTest)
names(BostonHousing) names(BostonHousing)
``` ```
## 2 回归模型 ##回归模型
回归模型有很多主要有Linear Regression、Logistic Regression、Polynomial Regression、Stepwise Regression、Ridge Regression、Lasso Regression、ElasticNet等。 回归模型有很多主要有Linear Regression、Logistic Regression、Polynomial Regression、Stepwise Regression、Ridge Regression、Lasso Regression、ElasticNet等。
本部分主要介绍有Linear Regression、以及Stepwise Regression三种回归模型的实现。 本部分主要介绍有Linear Regression、以及Stepwise Regression三种回归模型的实现。
### 2.1 Linear Regression ### Linear Regression
多元线性回归是一种最为基础的回归模型其使用多个自变量和一个因变量利用OLS完成模型训练。下面我们将使用`medv`作为因变量,剩余变量作为自变量构建模型。 多元线性回归是一种最为基础的回归模型其使用多个自变量和一个因变量利用OLS完成模型训练。下面我们将使用`medv`作为因变量,剩余变量作为自变量构建模型。
@ -88,7 +67,7 @@ plot(lr_model)
BostonHousingTest$lr_pred <- predict(lr_model, newdata = BostonHousingTest) BostonHousingTest$lr_pred <- predict(lr_model, newdata = BostonHousingTest)
``` ```
### 2.2 Stepwise Regression ### Stepwise Regression
利用逐步回归分析可以对模型中的变量进行优化。R语言中的`step()`命令,是以AIC信息统计量为准则通过选择最小的AIC信息统计量来达到提出或添加变量的目的。 利用逐步回归分析可以对模型中的变量进行优化。R语言中的`step()`命令,是以AIC信息统计量为准则通过选择最小的AIC信息统计量来达到提出或添加变量的目的。
对于逐步回归,一般有前向、后向、双向等逐步方式。本部分将基于已经实现的`lr_model`进行双向逐步回归。前向和后向回归只需要更改`step()`命令行中的`direstion`参数即可。具体内容参照 https://blog.csdn.net/qq_38204302/article/details/86567356 对于逐步回归,一般有前向、后向、双向等逐步方式。本部分将基于已经实现的`lr_model`进行双向逐步回归。前向和后向回归只需要更改`step()`命令行中的`direstion`参数即可。具体内容参照 https://blog.csdn.net/qq_38204302/article/details/86567356
@ -101,7 +80,7 @@ summary(step_model)
对于分类模型还有较为常用的Lasso Regression 和 Ridge Regression我们将会在进阶教程中来更加具体的讲解模型知识。 对于分类模型还有较为常用的Lasso Regression 和 Ridge Regression我们将会在进阶教程中来更加具体的讲解模型知识。
## 3 分类模型 ## 分类模型
在进行分类模型前,我们需要构建分类标签。我们使用`medv`的中位数进行划分其中1表示高房价0表示低房价。通过这样的转化将原本的数值型变量转化为二元标签。并使用相同的种子值划分测试集和训练集。 在进行分类模型前,我们需要构建分类标签。我们使用`medv`的中位数进行划分其中1表示高房价0表示低房价。通过这样的转化将原本的数值型变量转化为二元标签。并使用相同的种子值划分测试集和训练集。
@ -121,15 +100,15 @@ BostonHousingTest <- BostonHousing[-train_index,]
同时引入两个计算函数用来计算AUC指标值。 同时引入两个计算函数用来计算AUC指标值。
```{r } ```{r }
# 引入auc计算函数 # 引入auc计算函数
library('ROCR') library("ROCR")
calcAUC <- function(predcol, outcol) { calcAUC <- function(predcol, outcol) {
perf <-performance(prediction(predcol,outcol==1),'auc') perf <- performance(prediction(predcol, outcol == 1), "auc")
as.numeric(perf@y.values) as.numeric(perf@y.values)
} }
``` ```
### 3.1 Logistics Regression ### Logistics Regression
逻辑回归是一种广义的线性回归分析模型利用sigmode将线性回归结果转化成概率的形式。下面展示了利用`glm()`构建逻辑回归的过程。通过计算训练集上的auc取值为0.9554211测试集上的auc取值为0.9506969,说明模型效果整体不错。 逻辑回归是一种广义的线性回归分析模型利用sigmode将线性回归结果转化成概率的形式。下面展示了利用`glm()`构建逻辑回归的过程。通过计算训练集上的auc取值为0.9554211测试集上的auc取值为0.9506969,说明模型效果整体不错。
@ -148,7 +127,7 @@ calcAUC(lr_pred_test,BostonHousingTest$medv)
``` ```
### 3.2 KNN ### KNN
KNN模型是一种简单易懂、可以用于分类和回归的模型。其中 K 表示在新样本点附近(距离)选取 K 个样本数据,通过在 K 个样本进行投票来判断新增样本的类型。 KNN模型是一种简单易懂、可以用于分类和回归的模型。其中 K 表示在新样本点附近(距离)选取 K 个样本数据,通过在 K 个样本进行投票来判断新增样本的类型。
@ -167,7 +146,7 @@ calcAUC(as.numeric(knn_pred_test),BostonHousingTest$medv)
``` ```
### 3.3 Decision Tree ### Decision Tree
决策树是一种基于树模型进行划分的分类模型通过一系列if then决策规则的集合将特征空间划分成有限个不相交的子区域对于落在相同子区域的样本决策树模型给出相同的预测值。下面构建了决策树的分类模型 决策树是一种基于树模型进行划分的分类模型通过一系列if then决策规则的集合将特征空间划分成有限个不相交的子区域对于落在相同子区域的样本决策树模型给出相同的预测值。下面构建了决策树的分类模型
@ -198,7 +177,7 @@ calcAUC(as.numeric(dt_pred_test),BostonHousingTest$medv)
``` ```
### 3.4 Random Forest ### Random Forest
随机森林是一个包含多个决策树的分类器,可以用于分类和回归问题。在解决分类问题是,其输出的类别是由个别树输出的类别的众数而定。相比于单树模型,随机森林具有更好地泛化能力。 随机森林是一个包含多个决策树的分类器,可以用于分类和回归问题。在解决分类问题是,其输出的类别是由个别树输出的类别的众数而定。相比于单树模型,随机森林具有更好地泛化能力。
@ -222,21 +201,24 @@ calcAUC(as.numeric(rf_pred_train),BostonHousingTrain$medv)
calcAUC(as.numeric(rf_pred_test), BostonHousingTest$medv) calcAUC(as.numeric(rf_pred_test), BostonHousingTest$medv)
``` ```
## 思考与练习 ## 思考与练习 {-}
本章节仅对模型进行简单介绍,更多详细、复杂的模型将在后面的进阶课程中展开。 本章节仅对模型进行简单介绍,更多详细、复杂的模型将在后面的进阶课程中展开。
学习完本章节希望你能够尝试一些模型调优工作。如决策树剪枝如尝试搜索KNN模型中最佳K取值等。 学习完本章节希望你能够尝试一些模型调优工作。如决策树剪枝如尝试搜索KNN模型中最佳K取值等。
**Task5 END.** ## 本章作者 {-}
--- By: 张晋 __张晋__
> Datawhale成员, 数据科学爱好者 > Datawhale成员算法竞赛爱好者
> https://blog.csdn.net/weixin_44585839/
## 关于Datawhale {-}
关于Datawhale Datawhale是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习专题知识将在天池分享详情可关注Datawhale Datawhale 是一个专注于数据科学与AI领域的开源组织汇集了众多领域院校和知名企业的优秀学习者聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner和学习者一起成长”为愿景鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。 本次数据挖掘路径学习,专题知识将在天池分享,详情可关注 Datawhale
[![logo.png](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572)](https://camo.githubusercontent.com/8578ee173c78b587d5058439bbd0b98fa39c173def229a8c3d957e62aac0b649/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323032303039313330313032323639382e706e67237069635f63656e746572)
```{r, echo = FALSE}
insert_logo()
```

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Some files were not shown because too many files have changed in this diff Show More