Chuyển đến nội dung chính

Bắt đầu với Tidyverse: Hướng dẫn

Bắt đầu phân tích dữ liệu Titanic với R và tidyverse: học cách filter, arrange, summarise, mutate và trực quan hóa dữ liệu với dplyr và ggplot2!
Đã cập nhật 5 thg 10, 2026  · 8 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Bài hướng dẫn này là bản viết lại của một buổi Facebook Live chúng tôi thực hiện cách đây một tuần. Chủ đề là "Giới thiệu về Tidyverse" và hướng dẫn này sẽ đưa bạn đi qua toàn bộ nội dung chúng tôi đã trình bày trong phiên code-along!

Bạn có thể xem phần đầu của phiên tại đây:

Và phần hai tại đây:

Lưu ý bạn có thể tìm toàn bộ mã cho phiên này trong kho lưu trữ này.

Tidyverse cốt lõi bao gồm các gói mà bạn có khả năng dùng trong phân tích dữ liệu hàng ngày, như ggplot2 để trực quan hóa dữ liệu và dplyr để xử lý dữ liệu. Bạn sẽ tập trung vào hai gói này trong hướng dẫn này.

Hãy nhớ rằng một package về bản chất là một bộ công cụ để thao tác với dữ liệu. Nếu bạn muốn biết thêm về package trong R, hãy xem hướng dẫn này.

Để tìm hiểu thêm về Tidyverse, hãy xem khóa học Introduction to Tidyverse của David Robinson trên DataCamp và tài nguyên Learn the Tidyverse.

action diagram

Bắt đầu

Để khởi động, bạn nên cài đặt tidyverse nếu chưa làm:

# Install the tidyverse
# install.packages("tidyverse")

Bây giờ bạn đã cài đặt tidyverse, đến lúc nạp dữ liệu và xem qua một số quan sát.

Trong hướng dẫn này, bạn sẽ khám phá bộ dữ liệu Titanic, trong đó mỗi quan sát là một người và mỗi biến là một đặc trưng như Name, Age và Survived (hoặc không).

Nạp dữ liệu như sau:

 # 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

Lưu ý rằng đường dẫn bạn cung cấp cho read.csv() có thể thay đổi tùy thiết lập của bạn. Nếu bạn muốn giữ nguyên đường dẫn tệp, bạn luôn có thể xem cấu trúc thư mục của dự án này trong kho GitHub của chúng tôi, tại đây.

Cũng lưu ý rằng nếu bạn muốn biết thêm về tất cả biến bạn thấy sau khi chạy passengers, bạn có thể xem mô tả bộ dữ liệu.

Để có cái nhìn tổng quan về dữ liệu, bạn có thể dùng hàm 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

Bây giờ hãy làm tương tự bằng cách dùng pipe %>%, một trong những công cụ hữu ích nhất trong 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

Mẹo: nếu bạn muốn biết thêm về cách dùng toán tử pipe trong R, bạn có thể xem hướng dẫn này.

Hãy làm tương tự sau khi loại bỏ các quan sát có giá trị khuyết. Gợi ý: bạn có thể nối nhiều pipe!

# 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

Bạn có thể đã nhận thấy sự nhất quán về mặt phong cách trong đoạn mã bạn viết ở trên. Đó là vì bạn đang tuân theo một hướng dẫn phong cách. Trong khoa học dữ liệu và lập trình/ncoding nói chung, việc làm quen với một hướng dẫn phong cách càng sớm càng tốt là rất quan trọng. Như Hadley Wickham nói trong hướng dẫn phong cách của tidyverse,

Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread.

Ở phần tiếp theo, bạn sẽ xử lý dữ liệu với dplyr để lọc, sắp xếp và tạo đặc trưng mới bằng cách biến đổi từ các đặc trưng cũ.

Xử lý dữ liệu của bạn

Bây giờ là lúc khám phá dữ liệu và thu được một số hiểu biết ban đầu về bộ dữ liệu. Bạn sẽ dùng các động từ của dplyr như filter(), arrange() và mutate(), vốn làm đúng như tên gọi của chúng.

Giả sử bạn muốn chọn một tập quan sát cụ thể, chẳng hạn những quan sát có "Sex" là 'female'. dplyr cho phép chúng ta làm điều này một cách trực quan và bằng một ngôn ngữ phản chiếu cách bạn nghĩ và nói về dữ liệu.

Động từ filter chọn ra những quan sát khớp với điều kiện. Xem nó hoạt động:

# 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

Khi xem kết quả đoạn mã trên, bạn sẽ thấy có vẻ như nhiều đàn ông đã không sống sót sau vụ chìm tàu RMS Titanic. Điều này thú vị, và bạn sẽ khám phá kỹ hơn sau trong hướng dẫn này!

Lưu ý bạn có thể đọc mã dplyr như một câu: lấy dữ liệu của bạn rồi (%>%) lọc theo điều kiện giới tính là nam. Mã trong đoạn trên không làm thay đổi data frame gốc. filter(Sex = "male") là một lỗi phổ biến (Hugo cũng đã mắc lỗi này!); có một hướng dẫn lỗi tidyverse rất hay.

# 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

Có vẻ phụ nữ có khả năng sống sót cao hơn sau thảm họa Titanic, ít nhất là theo cảm nhận ban đầu.

Khi khám phá dữ liệu, bạn nên đặt và trả lời những câu hỏi bạn quan tâm trong khả năng tốt nhất! Lúc này, bạn có thể muốn arrange() các quan sát theo Fare tăng dần để xem có phát hiện xu hướng nào không. Bạn có thể dùng động từ arrange() để làm điều này:

# 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

Nhiều người trả ít tiền hơn đã không sống sót sau thảm họa. Đó là điều thú vị bạn vừa phát hiện chỉ bằng cách sắp xếp lại dữ liệu!

Bạn cũng có thể arrange theo Fare giảm dần:

# 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

Quả thật có nhiều người sống sót ở nhóm trả cao nhất!

Đôi khi bạn có thể muốn tạo biến mới. Bạn biết biến Parch là số cha mẹ và con cái, trong khi SibSp là số anh chị em và vợ/chồng. Bạn có thể cộng chúng để có biến mới FamSize. Đây là kỹ thuật tạo đặc trưng và thường chiếm phần lớn trong máy học!

Bây giờ, để tạo biến mới, bạn mutate() các biến gốc thành biến mới.

# 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

Lưu ý rằng mutate() có thể dùng để tạo cột mới nhưng cũng có thể sửa đổi các cột hiện có, giống như cách một đột biến có thể xảy ra từ góc nhìn sinh học. Không hoàn toàn chính xác nhưng là một cách hay để ngữ cảnh hóa lựa chọn động từ.

Bây giờ bạn đã có biến bổ sung, bạn có thể đặt câu hỏi khác, như "Liệu gia đình lớn hơn có tỷ lệ sống sót thấp hơn không?".

Để kiểm định giả thuyết này, tạo biến mới FamSize là tổng của Parch và SibSp như trên, rồi sắp xếp giảm dần theo 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

Mọi người trong gia đình đứng đầu đều không sống sót! Điều này có thể nói lên điều gì đó: có lẽ nếu bạn là thành viên một gia đình lớn, bạn không thể rời khỏi Titanic kịp thời.

Tuy nhiên, vì các số 0 và 1 thường không nói lên nhiều điều, hãy biến đổi các giá trị của biến Survived thành chuỗi No và Yes (và tạo data frame mới!):

# 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

Vẽ biểu đồ dữ liệu của bạn

Để vẽ dữ liệu bằng ggplot2, bạn chỉ định ba thứ:

  • Dữ liệu của bạn
  • Các đối tượng thẩm mỹ (aesthetics, ví dụ, trục x là gì)
  • Các lớp (layers, ví dụ, biểu đồ cột, biểu đồ phân tán)

Trước tiên bạn sẽ vẽ biểu đồ cột của Sex để xem có bao nhiêu nam và nữ được ghi nhận trên tàu Titanic:

# Plot barplot of passenger Sex
ggplot(passengers, aes(x = Sex)) +
  geom_bar()

barplot

Từ biểu đồ trên, bạn có thể thấy có khoảng 600 nam và 300 nữ trên tàu RMS Titanic.

Lưu ý rằng hàm aes() thực chất là cách ánh xạ các thuộc tính thẩm mỹ của biểu đồ tới các biến trong dữ liệu. Xem Modern Dive của Chester Ismay & Albert Y. Kim để biết thêm.

Bây giờ là lúc cho vài biểu đồ phân tán. Liệu Age của mỗi hành khách có tương quan với Fare họ trả không?

# Scatter plot of Age vs Fare
ggplot(passengers, aes(x = Age, y = Fare)) +
  geom_point()

## Warning: Removed 177 rows containing missing values (geom_point).

scatter plot

Bạn rút ra khá nhiều điều chỉ từ biểu đồ này! Bạn thấy nhiều người trả nhiều tiền hơn cũng lớn tuổi hơn đáng kể. Có thể có sự tăng giá vé theo tuổi... Ngoài ra, bạn lập tức thấy hai điểm ngoại lai ở phía trên biểu đồ, có thể bạn muốn tìm hiểu thêm!

Bạn có thể đọc mã ggplot2 như một câu, giống như mã dplyr ở trên: "Bạn lấy dữ liệu là titanic và ánh xạ Age lên trục x và Fare lên trục y, thêm các điểm như một lớp của biểu đồ."

Hãy lấy biểu đồ trước và tô màu mỗi điểm theo Sex, để xem có mối tương quan nào giữa Sex, Age và Fare không:

# Scatter plot of Age vs Fare colored by Sex
ggplot(passengers %>% drop_na(), aes(x = Age, y = Fare, color = Sex)) +
  geom_point()

scatter plot 2

Bạn thấy nhiều người ở phía dưới, trả ít tiền hơn, là nam giới. Bạn cũng thấy một cụm phụ nữ ở phía trên biểu đồ, lớn tuổi hơn một chút và cũng trả nhiều tiền hơn để lên tàu Titanic.

Việc trực quan hóa ba biến (hai biến số, Age và Fare, và một biến phân loại, Sex) trên một biểu đồ là khá thú vị, nhưng nếu bạn muốn thêm biến Survived để xem có xu hướng rõ ràng nào không thì sao? Bạn có thể làm điều này bằng faceting, một cách để tạo nhiều biểu đồ đồng thời:

# 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).

scatter plot 3

Ngay lập tức, bạn thấy nhiều phụ nữ mà bạn đã để ý ở biểu đồ trước đó đã sống sót, và rằng đa số những người không sống sót trả dưới 50 đơn vị. Mẹo: thử tự tìm xem đơn vị tiền tệ là gì!

Bây giờ hãy vẽ lại biểu đồ cột về Sex của hành khách và lần này tô màu cột theo Survived:

# Plot barplot of passenger Sex & fill according to Survival
ggplot(passengers1, aes(x = Sex, fill = Survived)) +
  geom_bar()

bar plot 2

Bạn thấy phần lớn đàn ông không sống sót, trong khi hơn hai phần ba phụ nữ đã sống sót!

Tóm tắt và nhóm dữ liệu của bạn

Dùng động từ summarise() để tìm giá vé trung bình đã trả:

# Check out mean Fare
passengers %>%
  summarise(meanFare = mean(Fare))

##   meanFare
## 1 32.20421

Dùng summarise() để tìm giá vé trung vị đã trả:

# Check out mean Fare
passengers %>%
  summarise(medianFare = median(Fare))

##   medianFare
## 1    14.4542

Bạn cũng có thể dùng filter() và summarise() để tìm giá vé trung bình trong nhóm nam:

# Check out mean Fare for men
passengers %>%
  filter(Sex == "male") %>%
  summarise(meanFare = mean(Fare))

##   meanFare
## 1 25.52389

Dùng filter() và summarise() để tìm giá vé trung bình trong nhóm nữ:

# Check out mean Fare for women
passengers %>%
  filter(Sex == "female") %>%
  summarise(meanFare = mean(Fare))

##   meanFare
## 1 44.47982

Dùng filter() và summarise() để tìm giá vé trung bình trong nhóm nữ và có bao nhiêu phụ nữ sống sót:

# 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

Dùng group_by() và summarise() để tìm giá vé trung bình và số người sống sót theo giới tính:

# 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

Dùng group_by() và summarise() để tìm giá vé trung bình và tỷ lệ người sống sót theo giới tính:

# 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

Kết luận

Trong hướng dẫn này, bạn đã đi từ con số không đến nắm bắt căn bản phân tích dữ liệu bằng tidyverse và các công cụ tidy. Bạn đã học cách filter() dữ liệu, arrange() và mutate() nó, vẽ và summarise() nó bằng dplyr và ggplot2, tất cả bằng cách viết mã phản chiếu cách bạn nghĩ và nói về dữ liệu. Xin chúc mừng. Tôi khuyến khích bạn học thêm bằng cách tham gia khóa học Introduction to Tidyverse của David Robinson và bằng cách dùng các công cụ này trên các bộ dữ liệu khác mà bạn quan tâm. Hãy chia sẻ các phân tích này với chúng tôi trên twitter @DataCamp và @hugobowne. Cảm ơn bạn đã đọc.

Chủ đề
R
Khoa học Dữ liệu
Trực quan hóa Dữ liệu
Phân tích dữ liệu

Tìm hiểu thêm về R

Khóa học

Giới thiệu về Tidyverse

4 giờ
399.1K
Bắt đầu hành trình khám phá và trực quan hóa dữ liệu của riêng bạn với tidyverse, một bộ công cụ khoa học dữ liệu mạnh mẽ và phổ biến trong R.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm