Tidyverse入门开发(教程)

本文概述

  • 整理数据
  • 绘制数据
  • 汇总和分组数据
  • 总结
本教程是我们一周前进行的Facebook Live活动的写照。主题为” Tidyverse简介” , 本教程将带你浏览我们在代码伴随会话中介绍的所有内容!
你可以在此处观看会议的第一部分:
第二部分在这里:
请注意, 你可以在此存储库中找到该会话的所有代码。
tidyverse的核心包括你可能在日常数据分析中使用的软件包, 例如用于数据可视化的ggplot2和用于数据整理的dplyr。在本教程中, 你将专注于这两个。
请记住, 包本质上是一组用于处理数据的工具。如果你想进一步了解R中的软件包, 请查阅本教程。
有关Tidyverse的更多信息, 请查看David Robinson的有关srcmini的Tidyverse入门课程和” 学习Tidyverse” 资源。
Tidyverse入门开发(教程)

文章图片
首先, 如果尚未安装tidyverse, 请安装:
# Install the tidyverse# install.packages("tidyverse")

现在你已经安装了tidyverse, 现在该加载数据并检查一些观察结果了。
在本教程中, 你将探索泰坦尼克号数据集, 其中每个观察值都是一个人, 每个变量都是诸如名称, 年龄和生存(或不存在)之类的特征。
像这样加载你的数据:
# Import the Tidyverselibrary(tidyverse)# Import datapassengers < - read.csv("data/train.csv")# Check out the first several observations of your dataframepassengers##PassengerId Survived Pclass## 1103## 2211## 3313## 4411## 5503## 6603##NameSex Age SibSp## 1Braund, Mr. Owen Harrismale221## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female381## 3Heikkinen, Miss. Laina female260## 4Futrelle, Mrs. Jacques Heath (Lily May Peel) female351## 5Allen, Mr. William Henrymale350## 6Moran, Mr. JamesmaleNA0##ParchTicketFare Cabin Embarked## 10A/5 211717.2500S## 20PC 17599 71.2833C85C## 30 STON/O2. 31012827.9250S## 40113803 53.1000C123S## 503734508.0500S## 603308778.4583Q

请注意, 你提供给read.csv()的路径可以根据你的设置而改变。如果你只想保留相同的文件路径, 则可以随时在我们的GitHub存储库中检出该项目的文件夹结构, 你可以在此处找到它。
还要注意, 如果你想更多地了解执行乘客后看到的所有变量, 可以查看数据集描述。
要获得数据概述, 可以使用summary()函数:
# Summarize titanicsummary(passengers)##PassengerIdSurvivedPclass##Min.:1.0Min.:0.0000Min.:1.000##1st Qu.:223.51st Qu.:0.00001st Qu.:2.000##Median :446.0Median :0.0000Median :3.000##Mean:446.0Mean:0.3838Mean:2.309##3rd Qu.:668.53rd Qu.:1.00003rd Qu.:3.000##Max.:891.0Max.:1.0000Max.:3.000####NameSexAge##Abbing, Mr. Anthony:1female:314Min.: 0.42##Abbott, Mr. Rossmore Edward:1male:5771st Qu.:20.12##Abbott, Mrs. Stanton (Rosa Hunt):1Median :28.00##Abelson, Mr. Samuel:1Mean:29.70##Abelson, Mrs. Samuel (Hannah Wizosky):13rd Qu.:38.00##Adahl, Mr. Mauritz Nils Martin:1Max.:80.00##(Other):885NA's:177##SibSpParchTicketFare##Min.:0.000Min.:0.00001601:7Min.:0.00##1st Qu.:0.0001st Qu.:0.0000347082:71st Qu.:7.91##Median :0.000Median :0.0000CA. 2343:7Median : 14.45##Mean:0.523Mean:0.38163101295 :6Mean: 32.20##3rd Qu.:1.0003rd Qu.:0.0000347088:63rd Qu.: 31.00##Max.:8.000Max.:6.0000CA 2144 :6Max.:512.33##(Other) :852##CabinEmbarked##:687:2##B96 B98:4C:168##C23 C25 C27:4Q: 77##G6:4S:644##C22 C26:3##D:3##(Other):186

现在使用管道%> %(tidyverse中最方便的工具之一)执行相同的操作:
# Summarize titanic using a pipepassengers %> %summary()##PassengerIdSurvivedPclass##Min.:1.0Min.:0.0000Min.:1.000##1st Qu.:223.51st Qu.:0.00001st Qu.:2.000##Median :446.0Median :0.0000Median :3.000##Mean:446.0Mean:0.3838Mean:2.309##3rd Qu.:668.53rd Qu.:1.00003rd Qu.:3.000##Max.:891.0Max.:1.0000Max.:3.000####NameSexAge##Abbing, Mr. Anthony:1female:314Min.: 0.42##Abbott, Mr. Rossmore Edward:1male:5771st Qu.:20.12##Abbott, Mrs. Stanton (Rosa Hunt):1Median :28.00##Abelson, Mr. Samuel:1Mean:29.70##Abelson, Mrs. Samuel (Hannah Wizosky):13rd Qu.:38.00##Adahl, Mr. Mauritz Nils Martin:1Max.:80.00##(Other):885NA's:177##SibSpParchTicketFare##Min.:0.000Min.:0.00001601:7Min.:0.00##1st Qu.:0.0001st Qu.:0.0000347082:71st Qu.:7.91##Median :0.000Median :0.0000CA. 2343:7Median : 14.45##Mean:0.523Mean:0.38163101295 :6Mean: 32.20##3rd Qu.:1.0003rd Qu.:0.0000347088:63rd Qu.: 31.00##Max.:8.000Max.:6.0000CA 2144 :6Max.:512.33##(Other) :852##CabinEmbarked##:687:2##B96 B98:4C:168##C23 C25 C27:4Q: 77##G6:4S:644##C22 C26:3##D:3##(Other):186

提示:如果你想进一步了解R中管道运算符的用法, 可以查看本教程。
删除具有缺失值的观察值后, 请执行相同的操作。这里有一个提示:你可以连接管道!
# Summarize titanic after dropping napassengers %> %drop_na() %> %summary()##PassengerIdSurvivedPclass##Min.:1.0Min.:0.0000Min.:1.000##1st Qu.:222.21st Qu.:0.00001st Qu.:1.000##Median :445.0Median :0.0000Median :2.000##Mean:448.6Mean:0.4062Mean:2.237##3rd Qu.:677.83rd Qu.:1.00003rd Qu.:3.000##Max.:891.0Max.:1.0000Max.:3.000####NameSexAge##Abbing, Mr. Anthony:1female:261Min.: 0.42##Abbott, Mr. Rossmore Edward:1male:4531st Qu.:20.12##Abbott, Mrs. Stanton (Rosa Hunt):1Median :28.00##Abelson, Mr. Samuel:1Mean:29.70##Abelson, Mrs. Samuel (Hannah Wizosky):13rd Qu.:38.00##Adahl, Mr. Mauritz Nils Martin:1Max.:80.00##(Other):708##SibSpParchTicketFare##Min.:0.0000Min.:0.0000347082:7Min.:0.00##1st Qu.:0.00001st Qu.:0.00003101295:61st Qu.:8.05##Median :0.0000Median :0.0000347088:6Median : 15.74##Mean:0.5126Mean:0.4314CA 2144:6Mean: 34.69##3rd Qu.:1.00003rd Qu.:1.0000382652:53rd Qu.: 33.38##Max.:5.0000Max.:6.0000S.O.C. 14879:5Max.:512.33##(Other):679##CabinEmbarked##:529:2##B96 B98:4C:130##C23 C25 C27:4Q: 28##G6:4S:554##C22 C26:3##D:3##(Other):167

你可能已经在上面编写的代码中注意到了样式上的一致性。那是因为你要遵循样式指南。一般来说, 在数据科学和编程/编码中, 习惯于尽快使用样式指南很重要。正如Hadley Wickham在tidyverse风格指南中所说的那样,
良好的编码风格就像正确的标点符号一样:你可以在没有标点符号的情况下进行管理, 但是这会使阅读变得更加轻松。
在下一节中, 你将处理与dplyr争用的数据, 以过滤数据, 对数据进行整理并通过使旧功能发生变化来创建新功能。
整理数据 现在是时候探索你的数据并初步了解数据集了。你将使用dplyr动词, 例如filter(), arrange()和mutate(), 它们完全按照它们说的去做。
让我们坐下来, 你想选择一组特定的观察结果, 例如, 那些” 性别” 为” 女性” 的观察结果。 dplyr允许我们直观地以反映你如何思考和谈论数据的语言进行操作。
筛选动词仅选择符合条件的观察值。实际观看:
# Filter to get all "male" rowspassengers %> %filter(Sex == "male")##PassengerId Survived PclassNameSex Age## 1103Braund, Mr. Owen Harris male22## 2503Allen, Mr. William Henry male35## 3603Moran, Mr. James maleNA## 4701McCarthy, Mr. Timothy J male54## 5803 Palsson, Master. Gosta Leonard male2## 61303 Saundercock, Mr. William Henry male20##SibSp ParchTicketFare Cabin Embarked## 110 A/5 211717.2500S## 2003734508.0500S## 3003308778.4583Q## 40017463 51.8625E46S## 531349909 21.0750S## 600 A/5. 21518.0500S

查看上面代码块的结果时, 你会发现许多人似乎没有幸免于RMS Titanic的沉没。这很有趣, 你将在本教程的后面部分对此进行更严格的探索!
请注意, 你可以像句子一样阅读dplyr代码:取出数据, 然后(%> %)根据性别为男性的条件对其进行过滤。你在上面的代码块中看到的代码不会更改原始数据帧。 filter(Sex =” male” )是一个常见错误(Hugo犯了同样的错误!);有一个很酷的tidyverse错误指南。
# Filter to get all "female" rowspassengers %> %filter(Sex == "female")##PassengerId Survived Pclass## 1211## 2313## 3411## 4913## 51012## 61113##NameSex Age SibSp## 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female381## 2Heikkinen, Miss. Laina female260## 3Futrelle, Mrs. Jacques Heath (Lily May Peel) female351## 4Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female270## 5Nasser, Mrs. Nicholas (Adele Achem) female141## 6Sandstrom, Miss. Marguerite Rut female41##ParchTicketFare Cabin Embarked## 10PC 17599 71.2833C85C## 20 STON/O2. 31012827.9250S## 30113803 53.1000C123S## 42347742 11.1333S## 50237736 30.0708C## 61PP 9549 16.7000G6S

至少从轶事上讲, 女性似乎更有可能在泰坦尼克号灾难中幸存下来。
当你探索数据时, 你应该问并回答自己可能会感兴趣的问题!现在, 你可能想通过增加票价来安排()观测, 以查看是否可以注意到任何趋势。你可以使用动词ranging()实现此目的:
# Arrange by increasing Farepassengers %> %arrange(Fare)##PassengerId Survived PclassNameSex Age## 118003Leonard, Mr. Lionel male36## 226401Harrison, Mr. William male40## 327213Tornquist, Mr. William Henry male25## 427802Parkes, Mr. Francis "Frank" maleNA## 530303 Johnson, Mr. William Cahoone Jr male19## 641402Cunningham, Mr. Alfred Fleming maleNA##SibSp Parch Ticket Fare Cabin Embarked## 100LINE0S## 200 1120590B94S## 300LINE0S## 400 2398530S## 500LINE0S## 600 2398530S

许多人付的钱少了, 却没有幸免于难。你只是通过重新排列数据而发现了一个有趣的东西!
你也可以通过降低票价来安排:
# Arrange by decreasing Farepassengers %> %arrange(desc(Fare))##PassengerId Survived PclassNameSex## 125911Ward, Miss. Anna female## 268011 Cardeza, Mr. Thomas Drake Martinezmale## 373811Lesurer, Mr. Gustave Jmale## 42801Fortune, Mr. Charles Alexandermale## 58911Fortune, Miss. Mabel Helen female## 634211Fortune, Miss. Alice Elizabeth female##Age SibSp ParchTicketFareCabin Embarked## 13500 PC 17755 512.3292C## 23601 PC 17755 512.3292 B51 B53 B55C## 33500 PC 17755 512.3292B101C## 4193219950 263.0000 C23 C25 C27S## 5233219950 263.0000 C23 C25 C27S## 6243219950 263.0000 C23 C25 C27S

高端确实有更多的幸存者!
有时你可能希望创建新变量。你知道变量Parch是父母和子女的数量, 而SibSp是兄弟姐妹和配偶的数量。你可以将它们加在一起以获得新的变量FamSize。这是功能工程, 并且在很多时候是机器学习的重要组成部分!
现在, 要创建新变量, 你可以将原始变量mutate()到新变量中。
# Create new column FamSize (size of family)passengers %> %mutate(FamSize = Parch + SibSp)##PassengerId Survived Pclass## 1103## 2211## 3313## 4411## 5503## 6603##NameSex Age SibSp## 1Braund, Mr. Owen Harrismale221## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female381## 3Heikkinen, Miss. Laina female260## 4Futrelle, Mrs. Jacques Heath (Lily May Peel) female351## 5Allen, Mr. William Henrymale350## 6Moran, Mr. JamesmaleNA0##ParchTicketFare Cabin Embarked FamSize## 10A/5 211717.2500S1## 20PC 17599 71.2833C85C1## 30 STON/O2. 31012827.9250S0## 40113803 53.1000C123S1## 503734508.0500S0## 603308778.4583Q0

请注意, mutate()可用于创建新列, 但也可以从生物学的角度来看, 与修改突变的方式几乎相同, 可以修改现有列。这不是完全正确, 而是一种为动词选择提供上下文的好方法。
现在有了额外的变量, 你可以提出其他问题, 例如” 大家庭的生存率是否可能较低?” 。
要检验此假设, 请如上所述创建一个新变量FamSize作为Parch和SibSp的总和, 然后通过减小FamSize进行排列:
# Create new column FamSize (size of family)# Arrange by decreasing FamSizepassengers %> %mutate(FamSize = Parch + SibSp) %> %arrange(desc(FamSize))##PassengerId Survived PclassNameSex Age## 116003Sage, Master. Thomas HenrymaleNA## 218103 Sage, Miss. Constance Gladys femaleNA## 320203Sage, Mr. FrederickmaleNA## 432503Sage, Mr. George John JrmaleNA## 579303Sage, Miss. Stella Anna femaleNA## 684703Sage, Mr. Douglas BullenmaleNA##SibSp ParchTicketFare Cabin Embarked FamSize## 182 CA. 2343 69.55S10## 282 CA. 2343 69.55S10## 382 CA. 2343 69.55S10## 482 CA. 2343 69.55S10## 582 CA. 2343 69.55S10## 682 CA. 2343 69.55S10

顶级家庭中的每个人都无法生存!这可能说明:也许如果你是一个大家庭的成员, 那么你将无法及时离开泰坦尼克号。
但是, 由于零和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## 11No3## 22Yes1## 33Yes3## 44Yes1## 55No3## 66No3##NameSex Age SibSp## 1Braund, Mr. Owen Harrismale221## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female381## 3Heikkinen, Miss. Laina female260## 4Futrelle, Mrs. Jacques Heath (Lily May Peel) female351## 5Allen, Mr. William Henrymale350## 6Moran, Mr. JamesmaleNA0##ParchTicketFare Cabin Embarked## 10A/5 211717.2500S## 20PC 17599 71.2833C85C## 30 STON/O2. 31012827.9250S## 40113803 53.1000C123S## 503734508.0500S## 603308778.4583Q

绘制数据 要使用ggplot2绘制数据, 请指定三件事:
  • 你的资料
  • 你的美学(例如, x轴上的内容)
  • 你的图层(例如, barplot, scatterplot)
首先, 你将绘制一个性行为图, 以查看泰坦尼克号上记录了多少只雄性和雌性:
# Plot barplot of passenger Sexggplot(passengers, aes(x = Sex)) +geom_bar()

Tidyverse入门开发(教程)

文章图片
从上图可以看出, RMS泰坦尼克号上约有600名男性和300名女性。
注意, aes()函数实际上是一种将图表的美感映射到数据中变量的方法。有关更多信息, 请参阅Chester Ismay和Albert Y. Kim的Modern Dive。
现在是时候进行一些散点图了。给定乘客的年龄是否与其所支付的票价相关?
# Scatter plot of Age vs Fareggplot(passengers, aes(x = Age, y = Fare)) +geom_point()## Warning: Removed 177 rows containing missing values (geom_point).

Tidyverse入门开发(教程)

文章图片
你仅从这一情节中收集了很多见解!你会发现, 许多支付较高费用的人也实际上年龄较大。票价可能会根据年龄而有所增加… 此外, 你会立即在情节顶部看到两个异常值, 你可能需要对其进行进一步调查!
你可以像阅读句子一样阅读ggplot2代码, 就像上面的dplyr代码一样:” 你将数据视为泰坦尼克号, 然后将Age映射到x轴, 将Fare映射到y轴, 在图的图层上添加点。”
让我们以前面的图为依据, 按性别为每个点上色, 以查看性别, 年龄和票价之间的任何相关性:
# Scatter plot of Age vs Fare colored by Sexggplot(passengers %> % drop_na(), aes(x = Age, y = Fare, color = Sex)) +geom_point()

Tidyverse入门开发(教程)

文章图片
你会发现, 底层的很多人薪水较低, 都是男人。在地块的顶部, 你还有一群年龄稍大的女性, 也花了更多钱才能登上《泰坦尼克号》。
在一张图上可视化三个变量(年龄和票价两个数字, 性别一个性别)非常酷, 但是如果你想将Survived变量放入混合图中以查看是否存在明显趋势, 该怎么办?你可以使用构面进行此操作, 这是一种同时生成多个图的方法:
# Scatter plot of Age vs Fare colored by Sex faceted by Survivedggplot(passengers1, aes(x = Age, y = Fare, color = Sex)) +geom_point() +facet_grid(~Survived)## Warning: Removed 177 rows containing missing values (geom_point).

Tidyverse入门开发(教程)

文章图片
突然之间, 你看到在上一个情节中提到的许多女性都幸存了下来, 而大多数没有幸存下来的妇女支付了50个单位。提示:尝试自己找出货币单位!
现在, 让我们重做你的” 乘客性爱” 酒吧图, 这次根据” 幸存者” 填写你的酒吧:
# Plot barplot of passenger Sex & fill according to Survivalggplot(passengers1, aes(x = Sex, fill = Survived)) +geom_bar()

Tidyverse入门开发(教程)

文章图片
你会看到, 很大一部分男人没有生存, 而超过三分之二的女人没有生存!
汇总和分组数据 使用summarise()动词找出已支付的平均票价:
# Check out mean Farepassengers %> %summarise(meanFare = mean(Fare))##meanFare## 1 32.20421

使用summarise()动词找出已支付的中位数车费:
# Check out mean Farepassengers %> %summarise(medianFare = median(Fare))##medianFare## 114.4542

你还可以使用filter()和summarise()动词来找出男性平均支付的车费:
# Check out mean Fare for menpassengers %> %filter(Sex == "male") %> %summarise(meanFare = mean(Fare))##meanFare## 1 25.52389

使用filter()和summarise()动词找出女性平均车费:
# Check out mean Fare for womenpassengers %> %filter(Sex == "female") %> %summarise(meanFare = mean(Fare))##meanFare## 1 44.47982

使用filter()和summarise()动词来找出女性平均支付的车费以及有多少女性幸存下来:
# Check out mean Fare & number of survivors for womenpassengers %> %filter(Sex == "female") %> %summarise(meanFare = mean(Fare), numSurv = sum(Survived))##meanFare numSurv## 1 44.47982233

使用group_by()和summarise()动词来查找平均性别和幸存者人数与性别的关系:
# Check out mean Fare & number of survivors grouped by Sexpassengers %> %group_by(Sex) %> %summarise(meanFare = mean(Fare), numSurv = sum(Survived))## # A tibble: 2 x 3##SexmeanFare numSurv##< fct> < dbl> < int> ## 1 female44.5233## 2 male25.5109

使用group_by()和summarise()动词来查找幸存者的平均票价和所占比例与性别的关系:
# Check out mean Fare & proportion of survivors grouped by Sexpassengers %> %group_by(Sex) %> %summarise(meanFare = mean(Fare), numSurv = sum(Survived)/n())## # A tibble: 2 x 3##SexmeanFare numSurv##< fct> < dbl> < dbl> ## 1 female44.50.742## 2 male25.50.189

总结 【Tidyverse入门开发(教程)】在本教程中, 你将使用tidyverse和tidy工具进行数据分析的基础知识从零变为一。你已经学习了如何使用dplyr和ggplot2对数据进行过滤(), 对数据进行sort()和mutate(), 绘制和汇总(), 以及通过编写反映你思考和谈论数据方式的代码。恭喜你我鼓励你通过参加David Robinson的Tidyverse入门课程并在你感兴趣的其他数据集中使用这些工具来学习更多。在Twitter @srcmini和@hugobowne上与我们分享这些分析。谢谢阅读。

    推荐阅读