本文概述
本教程是我们一周前进行的Facebook Live活动的写照。主题为” Tidyverse简介”, 本教程将带你浏览我们在代码伴随会话中介绍的所有内容!
你可以在此处观看会议的第一部分:
第二部分在这里:
请注意, 你可以在此存储库中找到该会话的所有代码。
tidyverse的核心包括你可能在日常数据分析中使用的软件包, 例如用于数据可视化的ggplot2和用于数据整理的dplyr。在本教程中, 你将专注于这两个。
请记住, 包本质上是一组用于处理数据的工具。如果你想进一步了解R中的软件包, 请查阅本教程。
有关Tidyverse的更多信息, 请查看David Robinson的有关srcmini的Tidyverse入门课程和”学习Tidyverse”资源。
首先, 如果尚未安装tidyverse, 请安装:
# Install the tidyverse
# install.packages("tidyverse")
现在你已经安装了tidyverse, 现在该加载数据并检查一些观察结果了。
在本教程中, 你将探索泰坦尼克号数据集, 其中每个观察值都是一个人, 每个变量都是诸如名称, 年龄和生存(或不存在)之类的特征。
像这样加载你的数据:
# Import the Tidyverse
library(tidyverse)
# Import data
passengers <- read.csv("data/train.csv")
# Check out the first several observations of your dataframe
passengers
## PassengerId Survived Pclass
## 1 1 0 3
## 2 2 1 1
## 3 3 1 3
## 4 4 1 1
## 5 5 0 3
## 6 6 0 3
## Name Sex Age SibSp
## 1 Braund, Mr. Owen Harris male 22 1
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1
## 3 Heikkinen, Miss. Laina female 26 0
## 4 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1
## 5 Allen, Mr. William Henry male 35 0
## 6 Moran, Mr. James male NA 0
## Parch Ticket Fare Cabin Embarked
## 1 0 A/5 21171 7.2500 S
## 2 0 PC 17599 71.2833 C85 C
## 3 0 STON/O2. 3101282 7.9250 S
## 4 0 113803 53.1000 C123 S
## 5 0 373450 8.0500 S
## 6 0 330877 8.4583 Q
请注意, 你提供给read.csv()的路径可以根据你的设置而改变。如果你只想保留相同的文件路径, 则可以随时在我们的GitHub存储库中检出该项目的文件夹结构, 你可以在此处找到它。
还要注意, 如果你想更多地了解执行乘客后看到的所有变量, 可以查看数据集描述。
要获得数据概述, 可以使用summary()函数:
# Summarize titanic
summary(passengers)
## PassengerId Survived Pclass
## Min. : 1.0 Min. :0.0000 Min. :1.000
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000
## Median :446.0 Median :0.0000 Median :3.000
## Mean :446.0 Mean :0.3838 Mean :2.309
## 3rd Qu.:668.5 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Name Sex Age
## Abbing, Mr. Anthony : 1 female:314 Min. : 0.42
## Abbott, Mr. Rossmore Edward : 1 male :577 1st Qu.:20.12
## Abbott, Mrs. Stanton (Rosa Hunt) : 1 Median :28.00
## Abelson, Mr. Samuel : 1 Mean :29.70
## Abelson, Mrs. Samuel (Hannah Wizosky): 1 3rd Qu.:38.00
## Adahl, Mr. Mauritz Nils Martin : 1 Max. :80.00
## (Other) :885 NA's :177
## SibSp Parch Ticket Fare
## Min. :0.000 Min. :0.0000 1601 : 7 Min. : 0.00
## 1st Qu.:0.000 1st Qu.:0.0000 347082 : 7 1st Qu.: 7.91
## Median :0.000 Median :0.0000 CA. 2343: 7 Median : 14.45
## Mean :0.523 Mean :0.3816 3101295 : 6 Mean : 32.20
## 3rd Qu.:1.000 3rd Qu.:0.0000 347088 : 6 3rd Qu.: 31.00
## Max. :8.000 Max. :6.0000 CA 2144 : 6 Max. :512.33
## (Other) :852
## Cabin Embarked
## :687 : 2
## B96 B98 : 4 C:168
## C23 C25 C27: 4 Q: 77
## G6 : 4 S:644
## C22 C26 : 3
## D : 3
## (Other) :186
现在使用管道%>%(tidyverse中最方便的工具之一)执行相同的操作:
# Summarize titanic using a pipe
passengers %>%
summary()
## PassengerId Survived Pclass
## Min. : 1.0 Min. :0.0000 Min. :1.000
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000
## Median :446.0 Median :0.0000 Median :3.000
## Mean :446.0 Mean :0.3838 Mean :2.309
## 3rd Qu.:668.5 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Name Sex Age
## Abbing, Mr. Anthony : 1 female:314 Min. : 0.42
## Abbott, Mr. Rossmore Edward : 1 male :577 1st Qu.:20.12
## Abbott, Mrs. Stanton (Rosa Hunt) : 1 Median :28.00
## Abelson, Mr. Samuel : 1 Mean :29.70
## Abelson, Mrs. Samuel (Hannah Wizosky): 1 3rd Qu.:38.00
## Adahl, Mr. Mauritz Nils Martin : 1 Max. :80.00
## (Other) :885 NA's :177
## SibSp Parch Ticket Fare
## Min. :0.000 Min. :0.0000 1601 : 7 Min. : 0.00
## 1st Qu.:0.000 1st Qu.:0.0000 347082 : 7 1st Qu.: 7.91
## Median :0.000 Median :0.0000 CA. 2343: 7 Median : 14.45
## Mean :0.523 Mean :0.3816 3101295 : 6 Mean : 32.20
## 3rd Qu.:1.000 3rd Qu.:0.0000 347088 : 6 3rd Qu.: 31.00
## Max. :8.000 Max. :6.0000 CA 2144 : 6 Max. :512.33
## (Other) :852
## Cabin Embarked
## :687 : 2
## B96 B98 : 4 C:168
## C23 C25 C27: 4 Q: 77
## G6 : 4 S:644
## C22 C26 : 3
## D : 3
## (Other) :186
提示:如果你想进一步了解R中管道运算符的用法, 可以查看本教程。
删除具有缺失值的观察值后, 请执行相同的操作。这里有一个提示:你可以连接管道!
# Summarize titanic after dropping na
passengers %>%
drop_na() %>%
summary()
## PassengerId Survived Pclass
## Min. : 1.0 Min. :0.0000 Min. :1.000
## 1st Qu.:222.2 1st Qu.:0.0000 1st Qu.:1.000
## Median :445.0 Median :0.0000 Median :2.000
## Mean :448.6 Mean :0.4062 Mean :2.237
## 3rd Qu.:677.8 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Name Sex Age
## Abbing, Mr. Anthony : 1 female:261 Min. : 0.42
## Abbott, Mr. Rossmore Edward : 1 male :453 1st Qu.:20.12
## Abbott, Mrs. Stanton (Rosa Hunt) : 1 Median :28.00
## Abelson, Mr. Samuel : 1 Mean :29.70
## Abelson, Mrs. Samuel (Hannah Wizosky): 1 3rd Qu.:38.00
## Adahl, Mr. Mauritz Nils Martin : 1 Max. :80.00
## (Other) :708
## SibSp Parch Ticket Fare
## Min. :0.0000 Min. :0.0000 347082 : 7 Min. : 0.00
## 1st Qu.:0.0000 1st Qu.:0.0000 3101295 : 6 1st Qu.: 8.05
## Median :0.0000 Median :0.0000 347088 : 6 Median : 15.74
## Mean :0.5126 Mean :0.4314 CA 2144 : 6 Mean : 34.69
## 3rd Qu.:1.0000 3rd Qu.:1.0000 382652 : 5 3rd Qu.: 33.38
## Max. :5.0000 Max. :6.0000 S.O.C. 14879: 5 Max. :512.33
## (Other) :679
## Cabin Embarked
## :529 : 2
## B96 B98 : 4 C:130
## C23 C25 C27: 4 Q: 28
## G6 : 4 S:554
## C22 C26 : 3
## D : 3
## (Other) :167
你可能已经在上面编写的代码中注意到了样式上的一致性。那是因为你要遵循样式指南。一般来说, 在数据科学和编程/编码中, 习惯于尽快使用样式指南很重要。正如Hadley Wickham在tidyverse风格指南中所说的那样,
良好的编码风格就像正确的标点符号一样:你可以在没有标点符号的情况下进行管理, 但是这会使阅读变得更加轻松。
在下一节中, 你将处理与dplyr争用的数据, 以过滤数据, 对数据进行整理并通过使旧功能发生变化来创建新功能。
整理数据
现在是时候探索你的数据并初步了解数据集了。你将使用dplyr动词, 例如filter(), arrange()和mutate(), 它们完全按照它们说的去做。
让我们坐下来, 你想选择一组特定的观察结果, 例如, 那些”性别”为”女性”的观察结果。 dplyr允许我们直观地以反映你如何思考和谈论数据的语言进行操作。
筛选动词仅选择符合条件的观察值。实际观看:
# Filter to get all "male" rows
passengers %>%
filter(Sex == "male")
## PassengerId Survived Pclass Name Sex Age
## 1 1 0 3 Braund, Mr. Owen Harris male 22
## 2 5 0 3 Allen, Mr. William Henry male 35
## 3 6 0 3 Moran, Mr. James male NA
## 4 7 0 1 McCarthy, Mr. Timothy J male 54
## 5 8 0 3 Palsson, Master. Gosta Leonard male 2
## 6 13 0 3 Saundercock, Mr. William Henry male 20
## SibSp Parch Ticket Fare Cabin Embarked
## 1 1 0 A/5 21171 7.2500 S
## 2 0 0 373450 8.0500 S
## 3 0 0 330877 8.4583 Q
## 4 0 0 17463 51.8625 E46 S
## 5 3 1 349909 21.0750 S
## 6 0 0 A/5. 2151 8.0500 S
查看上面代码块的结果时, 你会发现许多人似乎没有幸免于RMS Titanic的沉没。这很有趣, 你将在本教程的后面部分对此进行更严格的探索!
请注意, 你可以像句子一样阅读dplyr代码:取出数据, 然后(%>%)根据性别为男性的条件对其进行过滤。你在上面的代码块中看到的代码不会更改原始数据帧。 filter(Sex =” male”)是一个常见错误(Hugo犯了同样的错误!);有一个很酷的tidyverse错误指南。
# Filter to get all "female" rows
passengers %>%
filter(Sex == "female")
## PassengerId Survived Pclass
## 1 2 1 1
## 2 3 1 3
## 3 4 1 1
## 4 9 1 3
## 5 10 1 2
## 6 11 1 3
## Name Sex Age SibSp
## 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1
## 2 Heikkinen, Miss. Laina female 26 0
## 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1
## 4 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27 0
## 5 Nasser, Mrs. Nicholas (Adele Achem) female 14 1
## 6 Sandstrom, Miss. Marguerite Rut female 4 1
## Parch Ticket Fare Cabin Embarked
## 1 0 PC 17599 71.2833 C85 C
## 2 0 STON/O2. 3101282 7.9250 S
## 3 0 113803 53.1000 C123 S
## 4 2 347742 11.1333 S
## 5 0 237736 30.0708 C
## 6 1 PP 9549 16.7000 G6 S
至少从轶事上讲, 女性似乎更有可能在泰坦尼克号灾难中幸存下来。
当你探索数据时, 你应该问并回答自己可能会感兴趣的问题!现在, 你可能想通过增加票价来安排()观测, 以查看是否可以注意到任何趋势。你可以使用动词ranging()实现此目的:
# Arrange by increasing Fare
passengers %>%
arrange(Fare)
## PassengerId Survived Pclass Name Sex Age
## 1 180 0 3 Leonard, Mr. Lionel male 36
## 2 264 0 1 Harrison, Mr. William male 40
## 3 272 1 3 Tornquist, Mr. William Henry male 25
## 4 278 0 2 Parkes, Mr. Francis "Frank" male NA
## 5 303 0 3 Johnson, Mr. William Cahoone Jr male 19
## 6 414 0 2 Cunningham, Mr. Alfred Fleming male NA
## SibSp Parch Ticket Fare Cabin Embarked
## 1 0 0 LINE 0 S
## 2 0 0 112059 0 B94 S
## 3 0 0 LINE 0 S
## 4 0 0 239853 0 S
## 5 0 0 LINE 0 S
## 6 0 0 239853 0 S
许多人付的钱少了, 却没有幸免于难。你只是通过重新排列数据而发现了一个有趣的东西!
你也可以通过降低票价来安排:
# Arrange by decreasing Fare
passengers %>%
arrange(desc(Fare))
## PassengerId Survived Pclass Name Sex
## 1 259 1 1 Ward, Miss. Anna female
## 2 680 1 1 Cardeza, Mr. Thomas Drake Martinez male
## 3 738 1 1 Lesurer, Mr. Gustave J male
## 4 28 0 1 Fortune, Mr. Charles Alexander male
## 5 89 1 1 Fortune, Miss. Mabel Helen female
## 6 342 1 1 Fortune, Miss. Alice Elizabeth female
## Age SibSp Parch Ticket Fare Cabin Embarked
## 1 35 0 0 PC 17755 512.3292 C
## 2 36 0 1 PC 17755 512.3292 B51 B53 B55 C
## 3 35 0 0 PC 17755 512.3292 B101 C
## 4 19 3 2 19950 263.0000 C23 C25 C27 S
## 5 23 3 2 19950 263.0000 C23 C25 C27 S
## 6 24 3 2 19950 263.0000 C23 C25 C27 S
高端确实有更多的幸存者!
有时你可能希望创建新变量。你知道变量Parch是父母和子女的数量, 而SibSp是兄弟姐妹和配偶的数量。你可以将它们加在一起以获得新的变量FamSize。这是功能工程, 并且在很多时候是机器学习的重要组成部分!
现在, 要创建新变量, 你可以将原始变量mutate()到新变量中。
# Create new column FamSize (size of family)
passengers %>%
mutate(FamSize = Parch + SibSp)
## PassengerId Survived Pclass
## 1 1 0 3
## 2 2 1 1
## 3 3 1 3
## 4 4 1 1
## 5 5 0 3
## 6 6 0 3
## Name Sex Age SibSp
## 1 Braund, Mr. Owen Harris male 22 1
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1
## 3 Heikkinen, Miss. Laina female 26 0
## 4 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1
## 5 Allen, Mr. William Henry male 35 0
## 6 Moran, Mr. James male NA 0
## Parch Ticket Fare Cabin Embarked FamSize
## 1 0 A/5 21171 7.2500 S 1
## 2 0 PC 17599 71.2833 C85 C 1
## 3 0 STON/O2. 3101282 7.9250 S 0
## 4 0 113803 53.1000 C123 S 1
## 5 0 373450 8.0500 S 0
## 6 0 330877 8.4583 Q 0
请注意, mutate()可用于创建新列, 但也可以从生物学的角度来看, 与修改突变的方式几乎相同, 可以修改现有列。这不是完全正确, 而是一种为动词选择提供上下文的好方法。
现在有了额外的变量, 你可以提出其他问题, 例如”大家庭的生存率是否可能较低?”。
要检验此假设, 请如上所述创建一个新变量FamSize作为Parch和SibSp的总和, 然后通过减小FamSize进行排列:
# Create new column FamSize (size of family)
# Arrange by decreasing FamSize
passengers %>%
mutate(FamSize = Parch + SibSp) %>%
arrange(desc(FamSize))
## PassengerId Survived Pclass Name Sex Age
## 1 160 0 3 Sage, Master. Thomas Henry male NA
## 2 181 0 3 Sage, Miss. Constance Gladys female NA
## 3 202 0 3 Sage, Mr. Frederick male NA
## 4 325 0 3 Sage, Mr. George John Jr male NA
## 5 793 0 3 Sage, Miss. Stella Anna female NA
## 6 847 0 3 Sage, Mr. Douglas Bullen male NA
## SibSp Parch Ticket Fare Cabin Embarked FamSize
## 1 8 2 CA. 2343 69.55 S 10
## 2 8 2 CA. 2343 69.55 S 10
## 3 8 2 CA. 2343 69.55 S 10
## 4 8 2 CA. 2343 69.55 S 10
## 5 8 2 CA. 2343 69.55 S 10
## 6 8 2 CA. 2343 69.55 S 10
顶级家庭中的每个人都无法生存!这可能说明:也许如果你是一个大家庭的成员, 那么你将无法及时离开泰坦尼克号。
但是, 由于零和1表示的含义并不多, 因此请将Survived变量的值突变为字符串No和Yes(并创建新的数据框!):
# Turn numerical values of Survived column to "No" & "Yes" (new data frame)
passengers1 <- passengers %>%
mutate(Survived = ifelse(Survived == 0, "No", "Yes"))
passengers1
## PassengerId Survived Pclass
## 1 1 No 3
## 2 2 Yes 1
## 3 3 Yes 3
## 4 4 Yes 1
## 5 5 No 3
## 6 6 No 3
## Name Sex Age SibSp
## 1 Braund, Mr. Owen Harris male 22 1
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1
## 3 Heikkinen, Miss. Laina female 26 0
## 4 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1
## 5 Allen, Mr. William Henry male 35 0
## 6 Moran, Mr. James male NA 0
## Parch Ticket Fare Cabin Embarked
## 1 0 A/5 21171 7.2500 S
## 2 0 PC 17599 71.2833 C85 C
## 3 0 STON/O2. 3101282 7.9250 S
## 4 0 113803 53.1000 C123 S
## 5 0 373450 8.0500 S
## 6 0 330877 8.4583 Q
绘制数据
要使用ggplot2绘制数据, 请指定三件事:
- 你的资料
- 你的美学(例如, x轴上的内容)
- 你的图层(例如, barplot, scatterplot)
首先, 你将绘制一个性行为图, 以查看泰坦尼克号上记录了多少只雄性和雌性:
# Plot barplot of passenger Sex
ggplot(passengers, aes(x = Sex)) +
geom_bar()
从上图可以看出, RMS泰坦尼克号上约有600名男性和300名女性。
注意, aes()函数实际上是一种将图表的美感映射到数据中变量的方法。有关更多信息, 请参阅Chester Ismay和Albert Y. Kim的Modern Dive。
现在是时候进行一些散点图了。给定乘客的年龄是否与其所支付的票价相关?
# Scatter plot of Age vs Fare
ggplot(passengers, aes(x = Age, y = Fare)) +
geom_point()
## Warning: Removed 177 rows containing missing values (geom_point).
你仅从这一情节中收集了很多见解!你会发现, 许多支付较高费用的人也实际上年龄较大。票价可能会根据年龄而有所增加…此外, 你会立即在情节顶部看到两个异常值, 你可能需要对其进行进一步调查!
你可以像阅读句子一样阅读ggplot2代码, 就像上面的dplyr代码一样:”你将数据视为泰坦尼克号, 然后将Age映射到x轴, 将Fare映射到y轴, 在图的图层上添加点。”
让我们以前面的图为依据, 按性别为每个点上色, 以查看性别, 年龄和票价之间的任何相关性:
# Scatter plot of Age vs Fare colored by Sex
ggplot(passengers %>% drop_na(), aes(x = Age, y = Fare, color = Sex)) +
geom_point()
你会发现, 底层的很多人薪水较低, 都是男人。在地块的顶部, 你还有一群年龄稍大的女性, 也花了更多钱才能登上《泰坦尼克号》。
在一张图上可视化三个变量(年龄和票价两个数字, 性别一个性别)非常酷, 但是如果你想将Survived变量放入混合图中以查看是否存在明显趋势, 该怎么办?你可以使用构面进行此操作, 这是一种同时生成多个图的方法:
# Scatter plot of Age vs Fare colored by Sex faceted by Survived
ggplot(passengers1, aes(x = Age, y = Fare, color = Sex)) +
geom_point() +
facet_grid(~Survived)
## Warning: Removed 177 rows containing missing values (geom_point).
突然之间, 你看到在上一个情节中提到的许多女性都幸存了下来, 而大多数没有幸存下来的妇女支付了50个单位。提示:尝试自己找出货币单位!
现在, 让我们重做你的”乘客性爱”酒吧图, 这次根据”幸存者”填写你的酒吧:
# Plot barplot of passenger Sex & fill according to Survival
ggplot(passengers1, aes(x = Sex, fill = Survived)) +
geom_bar()
你会看到, 很大一部分男人没有生存, 而超过三分之二的女人没有生存!
汇总和分组数据
使用summarise()动词找出已支付的平均票价:
# Check out mean Fare
passengers %>%
summarise(meanFare = mean(Fare))
## meanFare
## 1 32.20421
使用summarise()动词找出已支付的中位数车费:
# Check out mean Fare
passengers %>%
summarise(medianFare = median(Fare))
## medianFare
## 1 14.4542
你还可以使用filter()和summarise()动词来找出男性平均支付的车费:
# Check out mean Fare for men
passengers %>%
filter(Sex == "male") %>%
summarise(meanFare = mean(Fare))
## meanFare
## 1 25.52389
使用filter()和summarise()动词找出女性平均车费:
# Check out mean Fare for women
passengers %>%
filter(Sex == "female") %>%
summarise(meanFare = mean(Fare))
## meanFare
## 1 44.47982
使用filter()和summarise()动词来找出女性平均支付的车费以及有多少女性幸存下来:
# Check out mean Fare & number of survivors for women
passengers %>%
filter(Sex == "female") %>%
summarise(meanFare = mean(Fare), numSurv = sum(Survived))
## meanFare numSurv
## 1 44.47982 233
使用group_by()和summarise()动词来查找平均性别和幸存者人数与性别的关系:
# Check out mean Fare & number of survivors grouped by Sex
passengers %>%
group_by(Sex) %>%
summarise(meanFare = mean(Fare), numSurv = sum(Survived))
## # A tibble: 2 x 3
## Sex meanFare numSurv
## <fct> <dbl> <int>
## 1 female 44.5 233
## 2 male 25.5 109
使用group_by()和summarise()动词来查找幸存者的平均票价和所占比例与性别的关系:
# Check out mean Fare & proportion of survivors grouped by Sex
passengers %>%
group_by(Sex) %>%
summarise(meanFare = mean(Fare), numSurv = sum(Survived)/n())
## # A tibble: 2 x 3
## Sex meanFare numSurv
## <fct> <dbl> <dbl>
## 1 female 44.5 0.742
## 2 male 25.5 0.189
总结
在本教程中, 你将使用tidyverse和tidy工具进行数据分析的基础知识从零变为一。你已经学习了如何使用dplyr和ggplot2对数据进行过滤(), 对数据进行sort()和mutate(), 绘制和汇总(), 以及通过编写反映你思考和谈论数据方式的代码。恭喜你我鼓励你通过参加David Robinson的Tidyverse入门课程并在你感兴趣的其他数据集中使用这些工具来学习更多。在Twitter @srcmini和@hugobowne上与我们分享这些分析。谢谢阅读。
评论前必须登录!
注册