Trong lĩnh vực xử lý và phân tích dữ liệu, người dùng thường đối mặt với nhiều thách thức và khó khăn trong việc làm việc với dữ liệu. Các công việc như nhập dữ liệu, làm sạch dữ liệu, xử lý dữ liệu và tạo biểu đồ thường đòi hỏi nhiều công đoạn phức tạp và mất thời gian. Ngoài ra, việc duy trì tính nhất quán và linh hoạt trong quy trình làm việc cũng là một thách thức. Ví dụ, khi làm việc với một bộ dữ liệu lớn thì việc bị mất, thiếu thông tin về dữ liệu hay là trong quá trình thu thập dữ liệu có các thông tin chưa chính xác mà khi đưa vào phân tích nếu chúng ta không xử lý chung sẽ cho ra một kết quả sai và quá trình phân tích là hoàn toàn không có ý nghĩa.
Để giải quyết những thách thức này, thì có rất nhiều công cụ hoàn toàn giúp ta có thể giải quyết được một cách nhanh gọn và tiết kiệm thời gian hiệu quả. Trong bài viết này, chúng em sẽ giới thiệu về tidyverse, một công cụ cung cấp một giải pháp toàn diện trong xử lý và phân tích dữ liệu.
Tidyverse là một bộ công cụ được phát triển bởi nhà phân tích dữ liệu và nhà phát triển phần mềm nổi tiếng Hadley Wickham và nhóm của ông tại công ty RStudio. Hadley Wickham là một trong những người đóng góp quan trọng vào sự phát triển của ngôn ngữ R và được biết đến với công việc của mình trong việc tạo ra các gói R mạnh mẽ, dễ sử dụng, có tầm quan trọng và ảnh hưởng trong lĩnh vực.
Tidyverse xuất phát từ triết lý của Hadley Wickham về xử lý dữ liệu và phân tích dữ liệu trong R. Ông đã nhận thấy rằng việc làm việc với dữ liệu trong R thường không nhất quán và gặp nhiều khó khăn trong việc tổ chức và xử lý dữ liệu. Vì vậy, ông đã tạo ra tidyverse nhằm cung cấp một phương pháp chuẩn hóa và nhất quán để làm việc với dữ liệu. Hadley Wickham và nhóm của ông đã phát triển các gói R như dplyr, tidyr, ggplot2 và purrr, cùng với nhiều gói khác để tạo nên tidyverse. Những gói này không chỉ giúp người dùng xử lý dữ liệu một cách dễ dàng và nhất quán, mà còn mang lại sự linh hoạt và mở rộng để giải quyết các thách thức trong lĩnh vực khoa học dữ liệu. Tidyverse đã trở thành một hệ sinh thái phát triển phần mềm rất lớn và đa dạng, với đóng góp và cống hiến từ nhiều nhà phát triển, người dùng và cộng đồng R.
Như đã giới thiệu trước đó, Tidyverse là tập hợp các gói tạo nên một hệ sinh thái đa dạng cho người dùng và cho cộng đồng sử dụng R. Đó không phải là một gói mà là nhiều gói nhỏ bao gồm các gói cốt lõi và các gói không cốt lõi - Các gói này sẽ được cài đặt với tidyverse qua lệnh install.packages(“tidyverse”), nhưng không được gọi đính kèm với thư viện này.
Các gói cốt lõi trong tidyverse
1.Dplyr: Package này cung cấp các công cụ mạnh mẽ để thực hiện các hoạt động xử lý, truy vấn và biến đổi dữ liệu. Dplyr cho phép bạn thực hiện các thao tác như chọn cột, lọc dữ liệu, sắp xếp, nhóm và tóm tắt dữ liệu.
• Mutate(): mutate() là một hàm cực kì tiện ích trong khi phân tích dữ liệu, vì nó cho phép bạn tạo ra biến số mới tùy thích trong data frame. Bạn có thể dùng mutate cho 2 việc: hoán chuyển biến số hiện có và tạo ra biến số mới hoàn toàn.
• Select(): chọn các biến dựa trên tên của chúng.
• Filter(): chọn các trường hợp dựa trên giá trị của chúng.
• Summarise(): dùng để tóm tắt dữ liệu
• Arrange(): thay đổi thứ tự của các hàng
2.Ggplot2: Package này cung cấp công cụ đồ họa mạnh mẽ để tạo ra biểu đồ đẹp mắt và rõ ràng. Ggplot2 cho phép bạn tạo các biểu đồ dựa trên dữ liệu và áp dụng các thay đổi mô phỏng phức tạp và tùy chỉnh.
• Histograms: geom_histogram()
• Biểu đồ cột:* geom_bar()* hoặc geom_col()
• Box plots: geom_boxplot()
• Điểm (vd: biểu đồ phân tán): geom_point()
• Biểu đồ đường: geom_line() hoặc geom_path()
• Đường xu hướng: geom_smooth()
3.Readr: Package này hỗ trợ đọc và ghi dữ liệu từ và đến các định dạng dữ liệu phổ biến như CSV, Excel và các tập tin văn bản. Readr giúp đọc dữ liệu nhanh chóng và chính xác, đồng thời cung cấp các công cụ để xử lý và chuyển đổi dữ liệu . Những hàm quan trọng trong package này gồm:
• Đọc tệp tin dữ liệu có các trường phân tách bằng dấu phẩy: read_csv()
• Đọc tệp tin dữ liệu có các trường phân tách bằng tab (TSV): read_csv()
• Đọc tệp tin dữ liệu có các trường phân cách bằng dấu chấm phẩy (;): read_csv2()
• Đọc tệp tin dữ liệu có các trường phân cách bằng kí tự khác: read_delim()
• Đọc tệp tin dữ liệu có kích thước của trường được quy định trước: read_table()
4.Purrr: Package Purrr là một gói dùng để làm việc với các hàm và vector. Một hàm được sử dụng phổ biến trong package Purr là hàm map().Các hàm họ map() sử dụng cho vòng lặp (loop). Được thiết kế rất tiện và loại bỏ những thao tác thừa đối với việc sử dụng vòng lặp for, và đầu ra xác định rõ ràng hơn so với vòng lặp while.
• map(): tạo thành một danh sách.
• map_lgl(): tạo ra một vectơ logic.
• map_int(): tạo thành một vectơ số nguyên.
• map_dbl(): tạo thành một vectơ kép
• map_chr(): tạo thành một vectơ ký tự.
5.Tibble: Package Tibble dùng để mô phỏng lại bộ dữ liệu theo yêu cầu (thêm một hoặc nhiều biến vào bộ dữ liệu đã có sẵn)
• Bạn có thể tạo một tibble từ một đối tượng hiện có với: as_tibble()
• Bạn cũng có thể tạo một tibble mới từ các vectơ đại diện cho các cột bằng: tibble()
• Có thể tạo những cột dữ liệu bằng: tribble()
6.Stringr: Package này cung cấp các công cụ mạnh mẽ để làm việc với chuỗi ký tự. Stringr cung cấp các hàm để tìm kiếm, thay thế, tách chuỗi và thực hiện các xử lý phức tạp với chuỗi ký tự.Một số hàm cơ bản trong stringr:
• Các hàm kết hợp, thiết lập thứ tự, phân tách, sắp xếp: str_c(), str_glue(), str_order(), str_split()
• Các hàm điều chỉnh độ dài ký tự: str_pad(), str_trunc(), str_wrap()
• Các hàm thay đổi chữ hoa/chữ thường: str_to_upper(), str_to_title(), str_to_lower(), str_to_sentence()
• Các hàm đánh giá và trích xuất vị trí: str_length(), str_sub(), word()
• Phát hiện và định vị: str_detect(), str_subset(), str_match(), str_extract()
• Sửa đổi và thay thế: str_sub(), str_replace_all()
7.Forcats: Giúp chúng ta sắp xếp thông tin của bộ dữ liệu theo các trình tự nhất định( di chuyển các yếu tố được chỉ định lên trước, sắp xếp theo lần xuất hiện đầu tiên, đảo ngược hoặc xáo trộn ngẫu nhiên) và sửa đổi các trình tự dữ liệu(thu gọn các cấp độ ít xuất hiện thành các cấp độ khác, mã hoá lại dữ liệu theo cách thủ công).
8.Tidyr: Package này giúp bạn làm việc với dữ liệu không được tổ chức cấu trúc (messy data) và biến đổi chúng thành dạng dữ liệu rõ ràng (tidy data). Tidyr cung cấp các công cụ để chuyển đổi dữ liệu giữa các định dạng rỗng (wide format) và dài (long format) và làm sạch dữ liệu (source). Các hàm phổ biến trong Package Tidyr:
• Để chuyển đổi dữ liệu từ hàng thành cột: Pivot_longe()
• Chuyển đổi từ cột thành hàng: Pivot_wider()
9.Lubridate: Package lubridate là 1 package rất hữu dụng để xử lý date và date-time. Một số function cơ bản trong package lubridate:
• Để lấy thông tin ngày, tháng, năm của date chúng ta có thể sử dụng hàm: day(), month(), year()
• Trong trường hợp chúng ta muốn xem hôm nay là thứ mấy, sử dụng hàm wday() và thêm option label = T.
• Nếu chúng ta muốn xem ngày trong tháng hoặc ngày trong năm, sử dụng hàm mday() và yday() tương ứng
• Chúng ta có thể dùng các hàm hour(), minute(), second() để biết được giờ, phút, giây của date-time.
Các gói phát triển từ tidyverse
1.Hms: Nó được phát triển bởi nhóm tidyverse và có thể được sử dụng để lưu trữ và thao tác các giá trị thời gian trong ngày. Gói triển khai một lớp S3 để lưu trữ và định dạng các giá trị thời gian trong ngày dựa trên “difftime”. Nó có thể hữu ích để đơn giản hóa việc trao đổi dữ liệu với cơ sở dữ liệu, bảng tính và các nguồn dữ liệu khác.Gói hms cung cấp các chức năng và phương pháp khác nhau để làm việc với các giá trị thời gian trong ngày. Một số chức năng chính trong package này bao gồm:
• Hms() : Hàm này tạo ra một đối tượng đại diện cho một thời gian cụ thể trong ngày.
• As_hms(): Hàm này chuyển đổi một biểu diễn số thời gian thành lớp hms.
• parse_hms():Hàm này chuyển đổi các vectơ ký tự thành các đối tượng của lớp hms.
• as.numeric(): Kiểm tra xem vector đó có ở dưới dạng số hay không.
Ghi chú:
S3: đề cập đến một hệ thống lớp được tích hợp trong R. Hệ thống chi phối cách R xử lý các đối tượng của các lớp khác nhau.
Difftime: Sự khác biệt về thời gian
2.Feather: Package “feather” là một gói trong R được sử dụng để đọc và ghi file feather, được thiết kế để lưu trữ các bảng dữ liệu. Feather cho phép lưu trữ và chia sẻ các bộ dữ liệu giữa các ngôn ngữ lập trình khác nhau như Python và R.
• Bạn có thể sử dụng các hàm write_feather() để ghi dữ liệu vào file feather và read_feather() để đọc dữ liệu từ file feather.
3.Haven: Package haven là một package trong ngôn ngữ lập trình R được sử dụng để nhập và xuất dữ liệu từ các định dạng thống kê khác nhau. Nó cho phép người dùng nhập dữ liệu từ các định dạng như SPSS, SAS và Stata vào R và xuất dữ liệu từ R sang các định dạng này.
• Package haven sử dụng thư viện ReadStat để thực hiện việc nhập dữ liệu và cung cấp các hàm như read_sas(), read_sav(), read_dta() để đọc dữ liệu từ các định dạng tương ứng.
• Ngoài ra, package haven cũng cung cấp các hàm như write_sas(), write_sav(), write_dta() để xuất dữ liệu từ R sang các định dạng SPSS, SAS và Stata.
4.Httr: Trong R, gói httr là một gói phổ biến để làm việc với giao thức HTTP. Gói này cung cấp các công cụ để tạo, gửi và xử lý các yêu cầu HTTP, bao gồm việc tương tác với các API web, tải xuống dữ liệu từ các trang web và thực hiện các tác vụ liên quan đến HTTP khác. Gói httr cung cấp một loạt các hàm hữu ích để thực hiện các tác vụ HTTP. Dưới đây là một số ví dụ về việc sử dụng gói httr:
• Gửi yêu cầu GET đến một URL: Get()
• Trích xuất nội dung phản hồi từ yêu cầu: Content()
• Gửi yêu cầu POST với dữ liệu: Post()
• Xử lý lỗi và mã trạng thái từ phản hồi: Dùng if() else()
HTTP là Giao thức truyền siêu văn bản (Hypertext Transfer Protocol) và là định dạng cơ bản của giao thức yêu cầu (request)/phản hồi (response) giữa máy khách và máy chủ. Đầu vào và đầu ra chính xác có thể khác nhau tùy thuộc vào loại API nhưng quy trình là giống nhau - “Request” (thường là HTTP request) từ người dùng, thường chứa một truy vấn, theo sau là “Response”, chứa thông tin trạng thái về request và có thể là nội dung được yêu cầu.
5.Jsonlite: Gói thư viện “jsonlite” trong R là một công cụ hỗ trợ đọc và tạo các bảng JSON. Gói này cung cấp một trình phân tích JSON nhanh chóng và tin cậy, được tối ưu hóa cho dữ liệu thống kê.
6.Rvest: Package cho phép đọc dữ liệu html từ web trong hệ sinh thái của tidyverse. Sử dụng rvest cho phép thu thập dữ liệu một cách nhanh chóng từ web.
7.Readxl: Package này dùng để đọc tập tin Excel và chuyển thành data.frame. Câu lệnh dùng để đọc tập tin Excel là Read_excel().
8.Xml2: Package xml2 là một gói liên kết với package libxml2, giúp dễ dàng làm việc với HTML và XML từ R. Một số function cơ bản trong xlm2:
• Read_xml(): Đọc file HTML hoặc XML
• XML_type(): Xác định loại nút
• Xml_structure(): Hiển thị cấu trúc của tài liệu html/xml
• Xml_text(): Trích hoặc thay đổi văn bản
9.Modelr: Gói modelr trong R là một công cụ mạnh mẽ cung cấp các chức năng để tích hợp liền mạch mô hình hóa vào cụm các thao tác và trực quan hóa dữ liệu.
• %>% : Package này cho phép thực hiện các thao tác mô hình hoá một cách dễ đọc và ngắn gọn hơn
• geom_ref_line(): Thêm dòng tham chiếu
• add_residuals(): Thêm phần dư vào bộ dữ liệu
• add_predictions(): Thêm dự báo vào bộ dữ liệu
Ngoài các gói mà chúng em đưa ra, thì tidyverse còn có rất nhiều gói được cài đặt nhưng không được đính kèm khi gọi gói tidyverse như là glue, magrittr, googledrive,…Mỗi gói này có một mục đích và chức năng cụ thể, nó đóng một vai trò chuyên biệt hơn vì vậy mà tùy thuộc vào mục đích mà người phân tích sẽ gọi lên nếu cần thiết.
Có thể nói, tidyverse là một ngôn ngữ để giải quyết các thách thức trong khoa học dữ liệu bằng mã R. Mục tiêu chính của nó là tạo ra một khung giao tiếp giữa con người và máy tính về dữ liệu. Cụ thể hơn, tidyverse là một bộ sưu tập các gói R chia sẻ cùng một triết lý thiết kế cấp cao và cấu trúc ngữ pháp và dữ liệu cấp thấp, nhằm đảm bảo việc học một gói dễ dàng hơn và tạo nền tảng cho việc học các gói tiếp theo. Tidyverse đã trở thành một công cụ quan trọng và phổ biến trong cộng đồng người dùng R và khoa học dữ liệu. Nó không chỉ là một tập hợp các gói R, mà còn là một triết lý và một cách tiếp cận toàn diện để làm việc với dữ liệu.
Mọi việc phân tích dữ liệu đều bao gồm các nhiệm vụ chính như là: nhập dữ liệu, làm sạch, xử lý dữ liệu, trực quan hóa và phân tích dữ liệu. Bằng cách cung cấp một bộ gói hợp nhất, tidyverse sẽ làm việc với dữ liệu một cách hiệu quả hơn. Ngoài ra, tidyverse cho phép người dùng cài đặt các gói bằng một câu lệnh duy nhất, điều này đơn giản hóa quá trình cài đặt và đảm bảo người dùng có quyền truy cập vào các gói cốt lõi của hệ sinh thái tidyverse. Mặc dù, tidyverse cung cấp một bộ công cụ mạnh mẽ, nhưng nó nhận thức rằng các dự án khoa học dữ liệu thường đòi hỏi sử dụng các gói chuyên ngành ngoài phạm vi của tidyverse. Mục tiêu của tidyverse không phải giải quyết tất cả các vấn đề có thể có, mà là cung cấp các công cụ cho các thách thức phổ biến nhất trong khoa học dữ liệu. Tiếp cận này cho phép người dùng tận dụng ưu điểm của tidyverse trong khi tích hợp các gói chuyên ngành khác theo nhu cầu.
Khi học R, chúng em nhận ra có rất nhiều gói hỗ trợ trong quá trình phân tích dữ liệu, tuy nhiên chọn tidyverse tìm hiểu sẽ bao gồm rất nhiều gói nhỏ khác, việc tìm hiểu một gói rộng hơn các gói còn lại sẽ giúp chúng em có cái nhìn toàn diện và bao quát hơn, từ đó làm nền tảng cho việc học và phân tích các gói còn lại. Bên cạnh đó, tidyverse có một cộng đồng hỗ trợ nhiệt tình bao gồm các nhà phát triển và người dùng trên toàn thế giới, cho nên việc nghiên cứu tidyverse giúp chúng em học được nhiều kiến thức hơn từ cộng đồng, hình thành nên nhiều tư duy về phân tích dữ liệu cơ bản và nâng cao, khả năng dùng phần mềm để làm việc với dữ liệu một cách nhất quán và dễ dàng.
Ngoài ra, sau khi nghiên cứu về gói này chúng em sẽ đưa ra: Đánh giá hiệu suất và hiệu quả của tidyverse, mục tiêu này tập trung vào việc nghiên cứu và đánh giá khả năng của tidyverse trong việc xử lý dữ liệu và phân tích dữ liệu so với các phương pháp và công cụ khác. Qua đó, ta có thể đưa ra nhận xét về hiệu suất và hiệu quả của tidyverse trong quy trình làm việc với dữ liệu. Khám phá quy trình làm việc và thực tiễn sử dụng tidyverse, tập trung vào việc khám phá quy trình làm việc sử dụng tidyverse và thực hiện các bước thực tế trong quá trình xử lý và phân tích dữ liệu. Nghiên cứu này có thể xem xét các bước từ nhập dữ liệu, làm sạch dữ liệu, xử lý dữ liệu, tạo biểu đồ, và lập trình sử dụng tidyverse và phân tích những lợi ích và thách thức của việc sử dụng và áp dụng tidyverse trong quy trình làm việc thực tế.
Ở chương này, chúng em sẽ đi sâu vào cách làm việc và mô tả chi tiết cách thức hoạt động với dữ liệu của các gói trong Tidyverse. Điều này bao gồm ví dụ về cách sử dụng các gói để thực hiện các tác vụ phân tích dữ liệu phổ biến. Đầu tiên, điều kiện tiên quyết để bắt đầu các phân tích xuyên suốt bài luận là chúng ta phải cài đặt và gọi gói Tidyverse.
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
“Cốt lõi” ở đây đề cập đến việc các gói này đóng một vai trò trung tâm trong hệ sinh thái tidyverse. Nói cách khác, những gói này tạo nên nền tảng chính cho việc làm việc với dữ liệu trong tidyverse. Các gói khác trong tidyverse có thể hỗ trợ các công việc chuyên biệt hơn, nhưng các gói cốt lõi này được sử dụng trong hầu hết các quy trình phân tích dữ liệu.
Hơn nữa, các gói cốt lõi này cũng được phát triển và bảo dưỡng một cách chặt chẽ, đảm bảo chúng luôn tương thích với nhau và làm việc một cách hiệu quả. Cùng với đó, các gói cốt lõi thường được sử dụng rộng rãi và có tài liệu hướng dẫn chi tiết, giúp người dùng mới làm quen với tidyverse dễ dàng hơn.
Đầu tiên, khi nhắc đến quy trình khoa học dữ liệu chúng ta thường sẽ nhắc đến việc đưa dữ liệu từ nhiều nguồn khác nhau vào trong R (import) để phân tích, nếu không đưa dữ liệu vào trong R thì chúng ra sẽ không có thể thực hiện các thao tác khoa học dữ liệu ở trên đó. Các nguồn dữ liệu có thể csv, excel, DBI,…tùy thuộc vào hoàn cảnh, giai đoạn mà ta phân tích hay chủ đề mà ta muốn quan tâm. Vậy đối với các gói R được xem là “cốt lõi” thì gói nào hỗ trợ việc nhập dữ liệu này.
Trong Tidyverse, gói “readr” chính là gói cốt lõi hỗ trợ việc nhập dữ liệu, nó cung cấp một cách nhanh chóng và thân thiện để đọc dữ liệu dạng văn bản (như CSV và TSV), và còn cung cấp chức năng đọc và ghi dữ liệu dạng văn bản khác như fwf.
Một số chức năng chính của gói “readr” bao gồm:
data <- read_csv("C:/Users/tranh/Downloads/thongke/Supermarket Transactions.csv")
## New names:
## Rows: 14059 Columns: 16
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," chr
## (10): Gender, MaritalStatus, Homeowner, AnnualIncome, City, StateorProv... dbl
## (5): ...1, CustomerID, Children, UnitsSold, Revenue date (1): PurchaseDate
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
data1 <- read_csv2("C:/Users/tranh/Downloads/thongke/Supermarket Transactions.csv")
## ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
## Rows: 14059 Columns: 1
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (1): ,PurchaseDate,CustomerID,Gender,MaritalStatus,Homeowner,Children,An...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Khi chúng ra sử dụng thành thạo câu lệnh read_csv thì việc sử dụng các câu lệnh bên dưới là hoàn toàn có thể vì nó hoàn toàn tương tự nhau. Quan trọng là chức năng mà ta hướng đến trong việc phân tích dữ liệu để chọn câu lệnh phù hợp.
read_tsv(): Đọc tệp TSV (tab-separated values) vào R.
read_delim(): Đọc tệp có các trường được phân cách bằng một ký tự phân cách cụ thể (như “|”) vào R.
read_fwf(): Đọc các tệp văn bản với định dạng chiều rộng cố định (fixed width format).
read_table(): Đọc dữ liệu từ tệp văn bản, giả định rằng các cột được phân tách bằng các dấu cách.
Ngoài ra, readr cũng cung cấp các chức năng như ghi dữ liệu văn bản, chuyển đổi dữ liệu,…ví dụ như các câu lệnh sau:
write_csv(): Ghi (hoặc xuất) dữ liệu từ R ra tệp CSV.
write_tsv(): Ghi dữ liệu từ R ra tệp TSV
write_delim(): Ghi dữ liệu ra tệp với dữ liệu được phân tách bằng ký tự cụ thể.
Bên dưới là câu lệnh minh họa cho lệnh write_csv:
data
## # A tibble: 14,059 × 16
## ...1 PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## <dbl> <date> <dbl> <chr> <chr> <chr> <dbl>
## 1 1 2007-12-18 7223 F S Y 2
## 2 2 2007-12-20 7841 M M Y 5
## 3 3 2007-12-21 8374 F M N 2
## 4 4 2007-12-21 9619 M M Y 3
## 5 5 2007-12-22 1900 F S Y 3
## 6 6 2007-12-22 6696 F M Y 3
## 7 7 2007-12-23 9673 M S Y 2
## 8 8 2007-12-25 354 F M Y 2
## 9 9 2007-12-25 1293 M M Y 3
## 10 10 2007-12-25 7938 M S N 1
## # ℹ 14,049 more rows
## # ℹ 9 more variables: AnnualIncome <chr>, City <chr>, StateorProvince <chr>,
## # Country <chr>, ProductFamily <chr>, ProductDepartment <chr>,
## # ProductCategory <chr>, UnitsSold <dbl>, Revenue <dbl>
write_csv(data, "data-1.csv")
read_csv("data-1.csv")
## Rows: 14059 Columns: 16
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (10): Gender, MaritalStatus, Homeowner, AnnualIncome, City, StateorProv...
## dbl (5): ...1, CustomerID, Children, UnitsSold, Revenue
## date (1): PurchaseDate
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 14,059 × 16
## ...1 PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## <dbl> <date> <dbl> <chr> <chr> <chr> <dbl>
## 1 1 2007-12-18 7223 F S Y 2
## 2 2 2007-12-20 7841 M M Y 5
## 3 3 2007-12-21 8374 F M N 2
## 4 4 2007-12-21 9619 M M Y 3
## 5 5 2007-12-22 1900 F S Y 3
## 6 6 2007-12-22 6696 F M Y 3
## 7 7 2007-12-23 9673 M S Y 2
## 8 8 2007-12-25 354 F M Y 2
## 9 9 2007-12-25 1293 M M Y 3
## 10 10 2007-12-25 7938 M S N 1
## # ℹ 14,049 more rows
## # ℹ 9 more variables: AnnualIncome <chr>, City <chr>, StateorProvince <chr>,
## # Country <chr>, ProductFamily <chr>, ProductDepartment <chr>,
## # ProductCategory <chr>, UnitsSold <dbl>, Revenue <dbl>
lines <- read_lines("C:/Users/tranh/Downloads/thongke/Supermarket Transactions.csv")
#In ra 5 dòng đầu tiên của lines
head(lines, 5)
## [1] "\"\",\"PurchaseDate\",\"CustomerID\",\"Gender\",\"MaritalStatus\",\"Homeowner\",\"Children\",\"AnnualIncome\",\"City\",\"StateorProvince\",\"Country\",\"ProductFamily\",\"ProductDepartment\",\"ProductCategory\",\"UnitsSold\",\"Revenue\""
## [2] "\"1\",\"2007-12-18\",7223,\"F\",\"S\",\"Y\",2,\"$30K - $50K\",\"Los Angeles\",\"CA\",\"USA\",\"Food\",\"Snack Foods\",\"Snack Foods\",5,27.38"
## [3] "\"2\",\"2007-12-20\",7841,\"M\",\"M\",\"Y\",5,\"$70K - $90K\",\"Los Angeles\",\"CA\",\"USA\",\"Food\",\"Produce\",\"Vegetables\",5,14.9"
## [4] "\"3\",\"2007-12-21\",8374,\"F\",\"M\",\"N\",2,\"$50K - $70K\",\"Bremerton\",\"WA\",\"USA\",\"Food\",\"Snack Foods\",\"Snack Foods\",3,5.52"
## [5] "\"4\",\"2007-12-21\",9619,\"M\",\"M\",\"Y\",3,\"$30K - $50K\",\"Portland\",\"OR\",\"USA\",\"Food\",\"Snacks\",\"Candy\",4,4.44"
strings <- c("1", "2", "three", "4", "5")
parse_integer(strings)
## [1] 1 2 NA 4 5
## attr(,"problems")
## # A tibble: 1 × 4
## row col expected actual
## <int> <int> <chr> <chr>
## 1 3 NA no trailing characters three
Hoặc hàm parse_factor() được sử dụng để chuyển đổi một vector các chuỗi thành một factor (loại dữ liệu chuyên biệt trong R được sử dụng để lưu trữ và xử lý dữ liệu phân loại).
strings <- c("apple", "banana", "cherry", "apple", "banana")
parse_factor(strings, levels = c("apple", "banana", "cherry"))
## [1] apple banana cherry apple banana
## Levels: apple banana cherry
datetimes <- c("2023-01-01 12:00:00", "2023-02-02 13:14:15", "2023-03-03 16:17:18")
parsed_datetimes <- parse_datetime(datetimes, format = "%Y-%m-%d %H:%M:%S")
parsed_datetimes
## [1] "2023-01-01 12:00:00 UTC" "2023-02-02 13:14:15 UTC"
## [3] "2023-03-03 16:17:18 UTC"
Sau khi đưa dữ liệu vào R, thì chúng ta phải thực hiện việc dọn dẹp (tidy) lại dữ liệu đó. Trong Tidyverse, định dạng “tidy” của dữ liệu đề cập đến một quy tắc cụ thể về cách dữ liệu nên được tổ chức. Theo định nghĩa của Hadley Wickham, một bảng dữ liệu được coi là “tidy” nếu thỏa các yếu tố sau đây, đầu tiên mỗi biến tạo thành một cột, thứ hai mỗi quan sát tạo thành một dòng, và cuối cùng mỗi loại đơn vị quan sát tạo thành một bảng.
Điều này giúp đơn giản hóa quy trình phân tích, vì nó đảm bảo rằng dữ liệu luôn được tổ chức theo cùng một cách. Dữ liệu thực tế thường không ở định dạng “tidy” ngay từ đầu. Chúng có thể có các biến lưu trữ dưới dạng tiêu đề cột, dữ liệu bị thiếu, hoặc dữ liệu đang được lưu trữ dưới dạng chuỗi ký tự thay vì dạng số. “Dọn dẹp dữ liệu” là quá trình chuẩn hóa dữ liệu theo định dạng “tidy”, bao gồm việc chuyển đổi dữ liệu về đúng kiểu, xử lý dữ liệu bị thiếu, và phân tách hoặc gộp các cột để mỗi cột chỉ đại diện cho một biến.
Gói “tidyr” trong Tidyverse là gói cốt lõi hỗ trợ quá trình dọn dẹp dữ liệu. Gói này chứa một số hàm mạnh mẽ giúp chuyển đổi dữ liệu giữa các định dạng “rộng” và “dài”, và cung cấp các công cụ để chuyển đổi dữ liệu không “tidy” thành định dạng “tidy”.
Cụ thể, đây là một số hàm chính trong gói “tidyr”:
Bộ dữ liệu billboard chứa thông tin về thứ hạng Billboard của các bài hát trong năm 2000.
billboard
## # A tibble: 317 × 79
## artist track date.entered wk1 wk2 wk3 wk4 wk5 wk6 wk7 wk8
## <chr> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 Pac Baby… 2000-02-26 87 82 72 77 87 94 99 NA
## 2 2Ge+her The … 2000-09-02 91 87 92 NA NA NA NA NA
## 3 3 Doors D… Kryp… 2000-04-08 81 70 68 67 66 57 54 53
## 4 3 Doors D… Loser 2000-10-21 76 76 72 69 67 65 55 59
## 5 504 Boyz Wobb… 2000-04-15 57 34 25 17 17 31 36 49
## 6 98^0 Give… 2000-08-19 51 39 34 26 26 19 2 2
## 7 A*Teens Danc… 2000-07-08 97 97 96 95 100 NA NA NA
## 8 Aaliyah I Do… 2000-01-29 84 62 51 41 38 35 35 38
## 9 Aaliyah Try … 2000-03-18 59 53 38 28 21 18 16 14
## 10 Adams, Yo… Open… 2000-08-26 76 76 74 69 68 67 61 58
## # ℹ 307 more rows
## # ℹ 68 more variables: wk9 <dbl>, wk10 <dbl>, wk11 <dbl>, wk12 <dbl>,
## # wk13 <dbl>, wk14 <dbl>, wk15 <dbl>, wk16 <dbl>, wk17 <dbl>, wk18 <dbl>,
## # wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>,
## # wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>,
## # wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>, wk36 <dbl>,
## # wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, wk41 <dbl>, wk42 <dbl>, …
Trong dữ liệu này mỗi quan sát là một bài hát, ba cột đầu tiên là các biến mô tả bài hát đó, các cột tiếp theo mô tả thứ hạn của bài hát theo tuần. Để dọn dẹp lại dữ liệu này nhóm chúng em sử dụng pivot_longer
data <- billboard %>% pivot_longer(
cols = starts_with("wk"),
names_to = "week",
values_to = "rank",
values_drop_na = TRUE
)
data
## # A tibble: 5,307 × 5
## artist track date.entered week rank
## <chr> <chr> <date> <chr> <dbl>
## 1 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk1 87
## 2 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk2 82
## 3 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk3 72
## 4 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk4 77
## 5 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk5 87
## 6 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk6 94
## 7 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk7 99
## 8 2Ge+her The Hardest Part Of ... 2000-09-02 wk1 91
## 9 2Ge+her The Hardest Part Of ... 2000-09-02 wk2 87
## 10 2Ge+her The Hardest Part Of ... 2000-09-02 wk3 92
## # ℹ 5,297 more rows
Trong câu lệnh pivot_longer, cols: các cột được chỉ định xoay. starts_with(“wk”) ý nghĩa là chỉ bắt đầu với các cột có kí tự là wk. names_to: cột mới lưu trữ tên các cột biến cũ có tên là week. value_to: đặt tên cột biến lưu trữ giá trị các ô là rank. values_drop_na = TRUE: Loại bỏ các giá trị NA. Như vậy là em đã chuyển dữ liệu dạng rộng sang dạng dài của bộ dữ liệu billbroad.
Tiếp theo em sẽ thực hiện câu lệnh pivot_wider trên bộ dữ liệu trên. Với names_from=week có nghĩa là lập các cột biến mới có tên lấy từ các giá trị cột week trong dữ liệu data, values_from lấy các giá trị từ cột biến rank của dữ liệu.
data %>% pivot_wider(names_from = week,values_from = rank)
## # A tibble: 317 × 68
## artist track date.entered wk1 wk2 wk3 wk4 wk5 wk6 wk7 wk8
## <chr> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 Pac Baby… 2000-02-26 87 82 72 77 87 94 99 NA
## 2 2Ge+her The … 2000-09-02 91 87 92 NA NA NA NA NA
## 3 3 Doors D… Kryp… 2000-04-08 81 70 68 67 66 57 54 53
## 4 3 Doors D… Loser 2000-10-21 76 76 72 69 67 65 55 59
## 5 504 Boyz Wobb… 2000-04-15 57 34 25 17 17 31 36 49
## 6 98^0 Give… 2000-08-19 51 39 34 26 26 19 2 2
## 7 A*Teens Danc… 2000-07-08 97 97 96 95 100 NA NA NA
## 8 Aaliyah I Do… 2000-01-29 84 62 51 41 38 35 35 38
## 9 Aaliyah Try … 2000-03-18 59 53 38 28 21 18 16 14
## 10 Adams, Yo… Open… 2000-08-26 76 76 74 69 68 67 61 58
## # ℹ 307 more rows
## # ℹ 57 more variables: wk9 <dbl>, wk10 <dbl>, wk11 <dbl>, wk12 <dbl>,
## # wk13 <dbl>, wk14 <dbl>, wk15 <dbl>, wk16 <dbl>, wk17 <dbl>, wk18 <dbl>,
## # wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>,
## # wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>,
## # wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>, wk36 <dbl>,
## # wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, wk41 <dbl>, wk42 <dbl>, …
separate() và unite(): Hai hàm này cho phép chia một cột thành nhiều cột (separate), hoặc gộp nhiều cột lại thành một (unite), dựa trên một ký tự phân cách cụ thể.
drop_na(): Loại bỏ các dòng có dữ liệu bị thiếu trong một hoặc nhiều cột cụ thể.
fill(): Điền các giá trị bị thiếu trong một cột với giá trị gần nhất ở phía trước hoặc phía sau.
nest() và unnest(): Tạo hoặc hủy các cột “nested”, trong đó mỗi ô chứa một tibble hoặc danh sách hơn một giá trị.
Bằng cách sử dụng các hàm này, chúng ta có thể chuyển dữ liệu của mình vào (hoặc ra) định dạng “tidy”, giúp việc phân tích và trực quan hóa dữ liệu trở nên dễ dàng hơn.
Sử dụng bộ dữ liệu txhousing cho các hàm này
library(tidyverse)
data()
data(txhousing)
data <- txhousing
data <- unite(data, col =year_month, year, month, sep = "-")
Câu lệnh trên sử dụng hàm unite() trong gói tidyr để kết hợp giá trị của hai cột “year” và “month” thành một cột mới có tên “year_month”. Trong đó:
data: là tên của data frame txhousing
col: là tên của cột mới sẽ chứa nội dung kết hợp, trong trường hợp này là “year_month”. year, month: là các cột trong dataframe chứa nội dung cần kết hợp, trong trường hợp này là “year” và “month”.
sep: là biểu thức kết hợp (delimiter) để ngăn cách nội dung các cột khi kết hợp. Trong trường hợp này, dấu gạch ngang “-” được sử dụng để ngăn cách giữa năm và tháng trong cột mới. Sau khi thực hiện câu lệnh này, dữ liệu trong cột “year” và “month” của data sẽ được kết hợp thành một cột mới có tên “year_month” trong data, và các giá trị trong cột mới sẽ có định dạng “year-month”.
data <- data %>%
separate(col = year_month, into = c("year", "month"), sep = "-")
Câu lệnh trên được sử dụng để thực hiện tách cột “year_month” trong bộ dữ liệu data (txhousing) thành hai cột mới là “year” và “month” bằng dấu “-” làm biểu thức tách cột.
+`Toán tử %>%``: Đây là toán tử chuỗi dữ liệu (pipe operator) của gói dplyr, cho phép thực hiện các phép biến đổi dữ liệu liên tiếp một cách dễ đọc. Nó cho phép chuyển dữ liệu qua các hàm một cách tuần tự từ trái qua phải. Trong trường hợp này, dữ liệu data sẽ được chuyển từ bước này sang bước tiếp theo của câu lệnh.
separate(): Đây là hàm trong gói tidyr, được sử dụng để tách cột của data frame thành các cột mới dựa trên một biểu thức kết hợp (delimiter) cụ thể. Hàm này được áp dụng trên dữ liệu data.
col: Đây là tham số trong hàm separate() chỉ định tên cột mà chúng ta muốn tách, trong trường hợp này là “year_month”.
into: Đây là tham số trong hàm separate() chỉ định danh sách tên cột mới mà chúng ta muốn tạo sau khi tách cột “year_month”. Trong trường hợp này, chúng ta tạo hai cột mới “year” và “month”.
sep: Đây là tham số trong hàm separate() chỉ định biểu thức kết hợp (delimiter) dùng để tách cột. Trong trường hợp này, dấu “-” được sử dụng làm biểu thức tách cột “year_month” thành “year” và “month”.
Khi thực hiện câu lệnh này, dữ liệu trong cột “year_month” của data sẽ được tách thành hai cột mới “year” và “month”. Bây giờ, data chứa các cột mới “year” và “month” với thông tin về năm và tháng được tách riêng rẽ.
ndata <- drop_na(data)
Giải thích câu lệnh trên:
data: Đây là tên của dataframe ban đầu mà bạn muốn loại bỏ các hàng chứa giá trị thiếu.
drop_na(): Đây là hàm được sử dụng để loại bỏ các hàng chứa giá trị thiếu từ dataframe. Hàm này trả về một bản sao của dataframe gốc với các hàng chứa giá trị NA bị loại bỏ.
ndata: Đây là tên của biến mới để lưu dataframe sau khi đã loại bỏ các hàng chứa giá trị thiếu. Điều này cho phép bạn giữ nguyên dataframe ban đầu nếu cần thiết và tạo một bản sao mới chứa các hàng đã được loại bỏ giá trị thiếu.
fill(data, inventory, .direction = "down")
## # A tibble: 8,602 × 9
## city year month sales volume median listings inventory date
## <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Abilene 2000 1 72 5380000 71400 701 6.3 2000
## 2 Abilene 2000 2 98 6505000 58700 746 6.6 2000.
## 3 Abilene 2000 3 130 9285000 58100 784 6.8 2000.
## 4 Abilene 2000 4 98 9730000 68600 785 6.9 2000.
## 5 Abilene 2000 5 141 10590000 67300 794 6.8 2000.
## 6 Abilene 2000 6 156 13910000 66900 780 6.6 2000.
## 7 Abilene 2000 7 152 12635000 73500 742 6.2 2000.
## 8 Abilene 2000 8 131 10710000 75000 765 6.4 2001.
## 9 Abilene 2000 9 104 7615000 64500 771 6.5 2001.
## 10 Abilene 2000 10 101 7040000 59300 764 6.6 2001.
## # ℹ 8,592 more rows
Sử dụng hàm fill() từ gói tidyr để điền các giá trị thiếu (NA) trong cột inventory của dataframe data từ phía trên xuống và lưu kết quả vào biến ndata.
ndata: Đây là tên của dataframe mới để lưu kết quả sau khi đã điền các giá trị thiếu.
fill(): Đây là hàm được sử dụng để điền các giá trị thiếu trong dataframe.
data: Đây là tên của dataframe ban đầu chứa cột inventory mà muốn điền các giá trị thiếu.
inventory: Đây là tên của cột trong dataframe data để điền các giá trị thiếu.
.direction: Đây là tham số tùy chọn để chỉ định hướng điền giá trị thiếu. Trong trường hợp này, giá trị “down” được sử dụng, có nghĩa là hàm fill() sẽ điền các giá trị thiếu từ phía trên xuống theo thứ tự của dataframe.
ndata <- data %>%
nest(nestdata = city)
Giải thích ý nghĩa của câu lệnh
data: Đây là dataframe chứa dữ liệu muốn nhóm.
nest(): Đây là hàm từ gói tidyr được sử dụng để nhóm dữ liệu dựa trên các biến được chỉ định.
nestdata = city: Đây là đối số của hàm nest(). Trong trường hợp này, city là biến muốn nhóm dữ liệu theo. nestdata là tên của cột mới trong dataframe kết quả sẽ chứa các tập dữ liệu con (tức là các bảng hoặc danh sách) dựa trên nhóm của biến city.
Kết quả của câu lệnh trên là dataframe mới ndata chứa một cột có tên nestdata, trong đó mỗi hàng chứa một tập dữ liệu con (danh sách) của các biến trong dataframe data, tương ứng với từng giá trị của biến city.
Hàm unnest() hoạt động ngược lại so với hàm nest(), nơi bạn nhóm dữ liệu thành các tập dữ liệu con. Hàm unnest() giúp giải phóng các phần tử đã nhúng và chuyển chúng thành các hàng độc lập.
Chuyển đổi dữ liệu trong phân tích dữ liệu và khoa học dữ liệu, thường ám chỉ việc thay đổi, biến đổi hoặc tạo ra thông tin mới từ dữ liệu gốc để đưa đến mục tiêu cuối cùng của việc chuyển đổi dữ liệu là tạo ra một bộ dữ liệu mà có thể dễ dàng được sử dụng để phân tích, mô hình hóa, hoặc trực quan hóa dữ liệu.
Tidyverse có các gói “cốt lõi” với các hàm để chuyển đổi dữ liệu tạo ra thao tác để lấy được thông tin mà dữ liệu đã cung cấp.
dplyr
Trong Tidyverse, chủ yếu sử dụng gói “dplyr” để chuyển đổi dữ liệu. Đây là một số hàm cốt lõi của “dplyr”:
mutate(): Thêm cột mới vào bảng, thường dựa trên các cột hiện có.
transmute(): Giống như mutate(), nhưng chỉ giữ lại các cột mới.
rename(): Đổi tên một hoặc nhiều cột.
arrange(): Sắp xếp dữ liệu theo thứ tự tăng dần hoặc giảm dần.
select(): Lựa chọn một hoặc nhiều cột từ bảng.
filter(): Lọc ra các hàng thỏa mãn một điều kiện nào đó.
summarise() hoặc summarize(): Tính toán các giá trị thống kê tổng hợp, như mean(), median(), sum(), max(), min() và nhiều hàm khác.
group_by(): Tạo các nhóm dữ liệu dựa trên giá trị của một hoặc nhiều cột. Thường được dùng kết hợp với summarise() để tính toán các thống kê tổng hợp theo nhóm.
slice(): Chọn ra các hàng dựa trên vị trí của chúng.
distinct(): Loại bỏ các hàng trùng lặp trong dữ liệu.
Ngoài ra, dplyr còn cung cấp nhiều hàm khác như pull(), n(), tally(), add_tally() và nhiều hàm khác, giúp việc chuyển đổi dữ liệu trở nên dễ dàng và linh hoạt hơn.
Sử dụng bộ dữ liệu penguins cho các thao tác trên
library(dplyr)
library(palmerpenguins)
## Warning: package 'palmerpenguins' was built under R version 4.3.1
data("penguins")
pen <- na.omit(penguins)
Gọi bộ dữ liệu penguins trong package Dplyr Mô tả bộ dữ liệu: Bộ dữ liệu “penguins” là một bộ dữ liệu thống kê về loài chim cánh cụt (penguins). Nó được cung cấp trong gói R “palmerpenguins” và chứa thông tin về các mẫu chim cánh cụt được thu thập tại đảo Anvers, Nam Cực, bởi Ron Naveen và nhóm của ông từ năm 1960 đến 2009.
Bộ dữ liệu “penguins” bao gồm các thông tin sau đây:
Species: Loài của chim cánh cụt (kiểu factor) - Gồm các loài: “Adelie”, “Chinstrap” và “Gentoo”.
Island: Đảo nơi chim cánh cụt được quan sát (kiểu factor) - Gồm các đảo: “Biscoe”, “Dream” và “Torgersen”.
Bill Length (mm): Độ dài mỏ của chim cánh cụt tính bằng milimet (kiểu numeric).
Bill Depth (mm): Độ dày mỏ của chim cánh cụt tính bằng milimet (kiểu numeric).
Flipper Length (mm): Chiều dài vây của chim cánh cụt tính bằng milimet (kiểu numeric).
Body Mass (g): Cân nặng của chim cánh cụt tính bằng gram (kiểu numeric).
Sex: Giới tính của chim cánh cụt (kiểu factor) - Gồm các giá trị: “male”, “female”.
Year: Năm quan sát chim cánh cụt (kiểu integer).
pen <- pen %>% mutate(BillRatio = bill_length_mm / bill_depth_mm)
Chúng ta sử dụng hàm mutate từ package dplyr để thêm một cột mới có tên là “BillRatio” vào bộ dữ liệu “pen”. Cột “BillRatio” sẽ chứa giá trị tính toán từ tỷ lệ giữa “bill_length_mm” và “bill_depth_mm”. Hãy giải thích từng phần trong câu lệnh:
pen: Đây là tên của bộ dữ liệu đang làm việc.
%>%: Đây là toán tử chuyển tiếp (pipe operator) trong package dplyr, cho phép áp dụng các chức năng liên tiếp trên bộ dữ liệu một cách dễ dàng.
mutate(...): Đây là hàm trong package dplyr dùng để thêm cột mới hoặc biến đổi các cột đã có trong bộ dữ liệu. Trong trường hợp này, chúng ta sẽ thêm cột mới “BillRatio” vào bộ dữ liệu “pen”.
BillRatio = bill_length_mm / bill_depth_mm: Đây là cách xác định cột mới “BillRatio” và tính giá trị cho cột này. Chúng ta sử dụng toán tử “=” để gán kết quả của phép tính bill_length_mm / bill_depth_mm vào cột “BillRatio”.
Kết quả là, sau khi thực hiện câu lệnh, bộ dữ liệu “pen” sẽ bổ sung thêm một cột mới là “BillRatio”, chứa giá trị tính toán từ tỷ lệ giữa độ dài mỏ “bill_length_mm” và độ dày mỏ “bill_depth_mm” của các mẫu chim cánh cụt. Cột “BillRatio” sẽ cung cấp thông tin về tỷ lệ giữa hai đặc điểm mỏ của chim cánh cụt, giúp chúng ta hiểu hơn về sự tương quan giữa hai thuộc tính này.
npenguins <- pen %>%
transmute(species, island, BillRatio = bill_length_mm / bill_depth_mm)
Chúng ta sử dụng hàm transmute() từ package dplyr để tạo bộ dữ liệu mới “npenguins”. Bộ dữ liệu mới này chỉ chứa các cột “species”, “island” từ bộ dữ liệu gốc “pen”, và cột mới “BillRatio” tính tỷ lệ giữa “bill_length_mm” và “bill_depth_mm”.
Giải thích các yếu tố trong đoạn code trên:
npenguins: Đây là tên của bộ dữ liệu mới (data frame) đang tạo ra và lưu vào biến “npenguins”.
pen: Đây là tên của bộ dữ liệu gốc đang làm việc.
%>%: Đây là toán tử chuyển tiếp (pipe operator) trong package dplyr, cho phép bạn áp dụng các chức năng liên tiếp trên bộ dữ liệu một cách dễ dàng.
transmute(...): Đây là hàm trong package dplyr dùng để tạo bộ dữ liệu mới và chỉ chứa các cột được chọn hoặc tính toán dựa trên cột hiện có trong bộ dữ liệu gốc. Trong trường hợp này, chúng ta sử dụng hàm transmute() để tạo bộ dữ liệu mới “npenguins” và chỉ giữ lại các cột “species” và “island” từ bộ dữ liệu “pen”.
BillRatio = bill_length_mm / bill_depth_mm: Đây là cách xác định cột mới “BillRatio” và tính giá trị cho cột này. Chúng ta sử dụng toán tử “=” để gán kết quả của phép tính bill_length_mm / bill_depth_mm vào cột “BillRatio”.
Kết quả là, sau khi thực hiện câu lệnh, bộ dữ liệu mới “npenguins” sẽ chỉ chứa các cột “species”, “island” từ bộ dữ liệu “pen” và một cột mới là “BillRatio”, chứa giá trị tính toán từ tỷ lệ giữa “bill_length_mm” và “bill_depth_mm”. Bộ dữ liệu mới “npenguins” giúp chúng ta tạo ra một phiên bản mới của bộ dữ liệu ban đầu chỉ chứa các thông tin quan trọng mà chúng ta cần để thực hiện phân tích hoặc vẽ biểu đồ.
pen <- pen %>% rename(bill_length = bill_length_mm, bill_depth = bill_depth_mm, body_mass = body_mass_g)
pen <- pen %>%
arrange(bill_length)
pengui <- pen %>% select(bill_length,bill_depth,sex,year)
pen %>% filter(year == "2008", sex == "male")
## # A tibble: 57 × 9
## species island bill_length bill_depth flipper_length_mm body_mass sex year
## <fct> <fct> <dbl> <dbl> <int> <int> <fct> <int>
## 1 Adelie Torge… 35.1 19.4 193 4200 male 2008
## 2 Adelie Dream 36.3 19.5 190 3800 male 2008
## 3 Adelie Torge… 37.2 19.4 184 3900 male 2008
## 4 Adelie Biscoe 37.6 19.1 194 3750 male 2008
## 5 Adelie Dream 38.3 19.2 189 3950 male 2008
## 6 Adelie Dream 39.6 18.1 186 4450 male 2008
## 7 Adelie Torge… 39.7 18.4 190 3900 male 2008
## 8 Adelie Biscoe 40.1 18.9 188 4300 male 2008
## 9 Adelie Dream 40.3 18.5 196 4350 male 2008
## 10 Adelie Biscoe 40.6 18.8 193 3800 male 2008
## # ℹ 47 more rows
## # ℹ 1 more variable: BillRatio <dbl>
pen %>% group_by(species) %>% summarise(mean = mean(bill_length), min = min(bill_length), max = max(bill_length), median = median(bill_length), var = var(bill_length), sd = sd(bill_length))
## # A tibble: 3 × 7
## species mean min max median var sd
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Adelie 38.8 32.1 46 38.8 7.09 2.66
## 2 Chinstrap 48.8 40.9 58 49.6 11.2 3.34
## 3 Gentoo 47.6 40.9 59.6 47.4 9.65 3.11
Giải thích từng phần trong đoạn code:
group_by(species): Đây là hàm trong package dplyr dùng để nhóm các dòng của bộ dữ liệu theo giá trị của cột “species”. Chúng ta sử dụng hàm group_by() để tạo các nhóm riêng biệt cho từng loài chim cánh cụt.
summarise(...): Đây là hàm trong package dplyr dùng để tính toán các giá trị thống kê cho từng nhóm của bộ dữ liệu. Trong trường hợp này, chúng ta sử dụng hàm summarise() để tính trung bình (mean), giá trị nhỏ nhất (min), giá trị lớn nhất (max), trung vị (median), phương sai (var) và độ lệch chuẩn (sd) của chiều dài mỏ (“bill_length”) cho từng loài chim cánh cụt.
Kết quả là, sau khi thực hiện câu lệnh, chúng ta sẽ có một bộ dữ liệu mới với các cột “species”, “mean”, “min”, “max”, “median”, “var” và “sd”, chứa các giá trị thống kê cho chiều dài mỏ của chim cánh cụt theo từng loài. Các cột “mean”, “min”, “max”, “median”, “var” và “sd” sẽ hiển thị các giá trị thống kê tương ứng cho mỗi loài.
pen %>% slice(10:20)
## # A tibble: 11 × 9
## species island bill_length bill_depth flipper_length_mm body_mass sex year
## <fct> <fct> <dbl> <dbl> <int> <int> <fct> <int>
## 1 Adelie Biscoe 35 17.9 192 3725 fema… 2009
## 2 Adelie Torge… 35.1 19.4 193 4200 male 2008
## 3 Adelie Torge… 35.2 15.9 186 3050 fema… 2009
## 4 Adelie Biscoe 35.3 18.9 187 3800 fema… 2007
## 5 Adelie Biscoe 35.5 16.2 195 3350 fema… 2008
## 6 Adelie Torge… 35.5 17.5 190 3700 fema… 2008
## 7 Adelie Dream 35.6 17.5 191 3175 fema… 2009
## 8 Adelie Biscoe 35.7 16.9 185 3150 fema… 2008
## 9 Adelie Dream 35.7 18 202 3550 fema… 2008
## 10 Adelie Torge… 35.7 17 189 3350 fema… 2009
## 11 Adelie Biscoe 35.9 19.2 189 3800 fema… 2007
## # ℹ 1 more variable: BillRatio <dbl>
pen <- distinct(pen)
forcats
forcats là một gói trong tidyverse hỗ trợ quản lý và làm việc với dữ liệu loại factor trong R. Dưới đây là một số hàm trong forcats giúp thực hiện việc chuyển đổi dữ liệu:
fct_relevel(): Dùng để thay đổi thứ tự của các biểu hiện trong factor. Điều này rất hữu ích khi bạn muốn biết các biểu hiện cụ thể xuất hiện đầu tiên trong các biểu đồ hoặc phân tích.
fct_infreq(): Sắp xếp các biểu hiện theo tần số xuất hiện của chúng, với biểu hiện xuất hiện nhiều nhất đứng đầu.
fct_recode(): Dùng để đổi tên các biểu hiện của factor.
fct_collapse(): Gộp các biểu hiện lại với nhau.
fct_lump(): Gộp các biểu hiện có tần số thấp lại thành một biểu hiện duy nhất.
fct_drop(): Loại bỏ các biểu hiện không có trong dữ liệu.
fct_expand(): Thêm các biểu hiện mới vào factor, thậm chí nếu chúng không xuất hiện trong dữ liệu.
fct_rev(): Đảo ngược thứ tự của các biểu hiện trong factor.
Dùng bộ dữ liệu penguins cho package này
pen$species <- fct_relevel(pen$species, "Adelie", "Gentoo", "Chinstrap")
pen$species <- fct_infreq(pen$species)
pen$species <- fct_recode(pen$species, "ADELIE" = "Adelie", "GENTOO" = "Gentoo", "CHINSTRAP" = "Chinstrap")
pen$speciess <- fct_collapse(pen$species, "Nhom1" = c("ADELIE", "CHINSTRAP"), "Nhom2" = "GENTOO")
pen$specieses <- fct_lump(pen$species, n = 50, other_level = "rare")
pen$species <- fct_drop(pen$species)
pen$species <- fct_rev(pen$species)
stringr
Gói stringr trong tidyverse cung cấp các hàm để làm việc và xử lý dữ liệu dạng chuỗi ký tự (string) một cách dễ dàng và hiệu quả. Dưới đây là một số hàm trong stringr giúp chuyển đổi dữ liệu:
str_replace() và str_replace_all(): Thay thế chuỗi ký tự phù hợp với một mẫu bằng một chuỗi khác. str_replace() thay thế lần xuất hiện đầu tiên của mẫu, trong khi str_replace_all() thay thế tất cả lần xuất hiện của mẫu.
str_subset(): Trích xuất các chuỗi phù hợp với một mẫu.
str_split() và str_split_fixed(): Tách chuỗi thành các phần nhỏ hơn dựa trên một mẫu. str_split_fixed() trả về số phần nhỏ cố định.
str_trim(): Loại bỏ khoảng trắng không cần thiết từ đầu và cuối chuỗi.
str_pad(): Thêm ký tự vào bên trái, bên phải, hoặc cả hai bên của chuỗi để nó đạt đến độ dài cố định.
str_c(): Kết hợp nhiều chuỗi lại với nhau.
str_sub(): Trích xuất hoặc thay thế chuỗi con trong chuỗi.
str_to_upper(), str_to_lower(), và str_to_title(): Chuyển đổi chuỗi thành dạng chữ hoa, chữ thường, hoặc chữ đầu mỗi từ hoa.
library(palmerpenguins)
library(tidyverse)
library(stringr)
data("penguins")
data <- penguins
data$species <- str_replace(data$species, "Adelie", "ADELIE")
data$species <- str_replace(data$species, "Chinstrap", "CHINSTRAP")
data$species <- str_replace(data$species, "Gentoo", "GENTOO")
adelie_species <- str_subset(data$species, "ADELIE")
Đoạn code trên có ý nghĩa là tìm các dòng trong cột “species” của bộ dữ liệu “data” mà chứa chuỗi “ADELIE” (không phân biệt chữ hoa/thường) và lưu kết quả vào biến adelie_species.
species_split <- str_split(data$species, pattern = " ")
str_split_fixed() có tác dụng như hàm str_split()data$species_trim <- str_trim(data$species)
data$species_pad <- str_pad(data$species, width = 15, side = "right")
data$species_island <- str_c(data$species, data$island, sep = "_")
data$species_sub <- str_sub(data$species, start = 1, end = 4)
data$species_upper <- str_to_upper(data$species)
str_to_lower(), và str_to_title() cũng giống như str_to_upper()lubridate
Gói lubridate trong tidyverse giúp đơn giản hóa việc làm việc với dữ liệu thời gian và ngày tháng trong R. Dưới đây là một số hàm trong lubridate hỗ trợ việc chuyển đổi dữ liệu:
ymd(), ymd_hms(), dmy(), mdy(),…: Chuyển đổi chuỗi ký tự thành đối tượng ngày tháng (Date) hoặc thời gian (POSIXt), tương ứng với định dạng của chuỗi.
year(), month(), day(), hour(), minute(), second(): Trích xuất thành phần cụ thể của ngày tháng hoặc thời gian.
duration(), period(), interval(): Tạo ra các đối tượng thời gian kéo dài, thời kì và khoảng thời gian.
floor_date(), ceiling_date(), round_date(): Làm tròn ngày tháng hoặc thời gian xuống hoặc lên đến đơn vị thời gian gần nhất.
with_tz(), force_tz(): Chuyển đổi giữa các múi giờ khác nhau.
today(), now(): Lấy ngày hoặc thời gian hiện tại.
date(): Chuyển đổi một đối tượng thời gian thành ngày.
as.duration(), as.period(), as.interval(): Chuyển đổi giữa các kiểu thời gian khác nhau.
Ta sử dụng bộ dữ liệu economics cho các thao tác này. - Mô tả bộ dữ liệu: Bộ dữ liệu “economics” là một bộ dữ liệu ví dụ đi kèm với gói “datasets”. Bộ dữ liệu này chứa thông tin về các chỉ số kinh tế của Hoa Kỳ trong một khoảng thời gian dài từ năm 1947 đến 2021.
date: Đây là cột chứa thông tin về ngày tháng năm trong định dạng “yyyy-mm-dd”. Các giá trị trong cột này biểu thị thời gian diễn ra sự kiện kinh tế.
psavert: Tỷ lệ tiết kiệm của người tiêu dùng (% thu nhập cá nhân tiêu thụ tiết kiệm).
pce: Chi tiêu tiêu dùng cá nhân (tính theo tỷ lệ phần trăm của GDP).
pop: Dân số của Hoa Kỳ (tính theo triệu người).
uempmed: Số tuần trung bình mà người thất nghiệp đã thất nghiệp.
unemploy: Tổng số người thất nghiệp.
psavert: Lạm phát (tỉ lệ phần trăm thay đổi hàng năm của chỉ số giá tiêu dùng).
rgdp: GDP thật (GDP tính bằng giá cố định, đã điều chỉnh để loại bỏ tác động của lạm phát).
rpcve: Thu nhập cá nhân trung bình (tính theo người) và điều chỉnh tính đến lạm phát.
Một số ví dụ về việc sử dụng bộ dữ liệu “economics” trong R:
Bộ dữ liệu “economics” cung cấp một tập hợp thông tin phong phú về tình hình kinh tế của Hoa Kỳ qua nhiều năm và là nguồn tài nguyên hữu ích cho việc thực hiện các phân tích kinh tế và thống kê.
library(tidyverse)
library(lubridate)
data(economics)
data <- economics
data$date <- ymd(data$date)
ymd() từ gói “lubridate” để chuyển đổi chuỗi ký tự trong cột “date” thành đối tượng ngày tháng trong R. Hàm ymd trong “lubridate” được sử dụng để phân tích các chuỗi ngày tháng trong định dạng “yyyy-mm-dd” (ví dụ: “2023-07-22”) và tạo đối tượng ngày tháng tương ứng. Sau khi thực hiện câu lệnh này, cột “date” trong bộ dữ liệu “data” sẽ chứa các đối tượng ngày tháng thay vì các chuỗi ký tự.ymd_hms(), dmy(), mdy() sử dụng tương tự như hàm ymd()data$year <- year(data$date)
month(), day(), hour(), minute(), second() cũng tương tự hàm year(), hàm month() dùng để lấy tháng của các giá trị, day() dùng để lấy ngày, hour() dùng để lấy giờ, minute() dùng để lấy phút và second() dùng để lấy giây của bộ dữ liệu.dataa <- data.frame(start_date = c("2023-07-01", "2023-07-15", "2023-08-05"),
end_date = c("2023-07-10", "2023-07-20", "2023-08-10"))
dataa$start_date <- ymd(dataa$start_date)
dataa$end_date <- ymd(dataa$end_date)
dataa$event_duration <- interval(dataa$start_date, dataa$end_date)
dataa
## start_date end_date event_duration
## 1 2023-07-01 2023-07-10 2023-07-01 UTC--2023-07-10 UTC
## 2 2023-07-15 2023-07-20 2023-07-15 UTC--2023-07-20 UTC
## 3 2023-08-05 2023-08-10 2023-08-05 UTC--2023-08-10 UTC
Vì bộ dữ liệu “economics” không chứa thông tin về thời gian thực sự (chỉ chứa thông tin về các chỉ số kinh tế và các giá trị số), việc sử dụng hàm duration() trong bộ dữ liệu này không có ý nghĩa.
Câu lệnh trên đã tạo một data frame “data” với hai cột là “start_date” và “end_date” và sau đó đã thực hiện một số xử lý với dữ liệu trong data frame đó. Dưới đây là ý nghĩa của từng dòng code và kết quả khi in ra data frame “data”:
data <- data.frame(start_date = c("2023-07-01", "2023-07-15", "2023-08-05"), end_date = c("2023-07-10", "2023-07-20", "2023-08-10")): Dòng này tạo ra data frame “data” với hai cột “start_date” và “end_date”. Các giá trị trong cột “start_date” tương ứng với “2023-07-01”, “2023-07-15” và “2023-08-05”, còn các giá trị trong cột “end_date” tương ứng với “2023-07-10”, “2023-07-20” và “2023-08-10”.
data$start_date <- ymd(data$start_date): Dòng này chuyển đổi các giá trị trong cột “start_date” từ định dạng chuỗi ngày tháng sang đối tượng ngày tháng của R. Sau khi thực hiện dòng này, cột “start_date” sẽ chứa các đối tượng ngày tháng có thể thao tác và tính toán được.
data$end_date <- ymd(data$end_date): Dòng này tương tự như dòng trước, nhưng thực hiện việc chuyển đổi các giá trị trong cột “end_date” từ định dạng chuỗi ngày tháng sang đối tượng ngày tháng của R.
data$event_duration <- interval(data$start_date, data$end_date): Dòng này tạo ra cột “event_duration” mới trong data frame, chứa thông tin về khoảng thời gian (interval) của mỗi sự kiện từ “start_date” đến “end_date”.
data$date_floor_month <- floor_date(data$date, "month")
data$datetime <- with_tz(data$date, "America/New_York")
Purrr
Package Purrr là một gói dùng để làm việc với các hàm và vector. Một hàm được sử dụng phổ biến trong package Purr là hàm map().Các hàm họ map() sử dụng cho vòng lặp (loop). Được thiết kế rất tiện và loại bỏ những thao tác thừa đối với việc sử dụng vòng lặp for, và đầu ra xác định rõ ràng hơn so với vòng lặp while.
• map(): tạo thành một danh sách.
• map_lgl(): tạo ra một vectơ logic.
• map_int(): tạo thành một vectơ số nguyên.
• map_dbl(): tạo thành một vectơ kép
• map_chr(): tạo thành một vectơ ký tự.
Ta sử dụng bộ dữ liệu economics cho các thao tác trong package này
library(tidyverse)
data("economics")
means <- map_dbl(economics, mean, na.rm = TRUE)
print(means)
## date pce pop psavert uempmed unemploy
## 7.806399e+03 4.820093e+03 2.571597e+05 8.567247e+00 8.608711e+00 7.771310e+03
test <- map_lgl(economics$unemploy, ~ .x > 10000)
print(test)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [193] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [433] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [457] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [493] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [505] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [517] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [529] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [541] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [553] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
## [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
map_int(economics, ~ sum(!is.na(.x)))
## date pce pop psavert uempmed unemploy
## 574 574 574 574 574 574
popclass <- map_chr(economics$pop, ~ toString(unique(.x)))
map_chr()Tibble
Package Tibble dùng để mô phỏng lại bộ dữ liệu theo yêu cầu (thêm một hoặc nhiều biến vào bộ dữ liệu đã có sẵn)
• Có thể tạo một tibble từ một đối tượng hiện có với: as_tibble()
• Có thể tạo một tibble mới từ các vectơ đại diện cho các cột bằng: tibble()
• Có thể tạo những cột dữ liệu bằng: tribble()
Ngoài ra, trong tidyverse còn có toán tử %>%, còn được gọi là “pipe operator”, thuộc về gói magrittr trong ngôn ngữ lập trình R. Tuy nhiên, toán tử này cũng được xuất hiện nhiều trong tidyverse, bởi vì tidyverse bao gồm magrittr và khuyến khích sử dụng cú pháp “pipe” để làm cho mã nguồn dễ đọc và dễ hiểu hơn.
Toán tử %>% được sử dụng để truyền kết quả của một biểu thức như là đối số đầu tiên của biểu thức tiếp theo. Điều này giúp cho mã nguồn trở nên sạch sẽ hơn và giảm bớt việc phải tạo ra nhiều biến tạm thời.
library(palmerpenguins)
library(tidyverse)
library(stringr)
data("penguins")
penguinss <- as_tibble(penguins)
products <- tribble(
~product, ~price,
"Laptop", 1000,
"Phone", 600,
"Tablet", 400,
"Headphones", 150
)
Câu lệnh trên sử dụng hàm tribble để tạo một tibble có tên products, chứa thông tin về các sản phẩm và giá của chúng. Dữ liệu được cung cấp trong câu lệnh bao gồm:
product: Chứa tên của sản phẩm (kiểu dữ liệu là chr - chuỗi ký tự).price: Chứa giá của sản phẩm (kiểu dữ liệu là dbl - số thực).Các dòng của tibble tương ứng với thông tin của từng sản phẩm, và các cột product và price chứa thông tin tương ứng với tên và giá của sản phẩm đó.
Dữ liệu về các sản phẩm và giá của chúng được cung cấp trực tiếp trong câu lệnh, mỗi sản phẩm và giá của nó được định nghĩa sau dấu ~.
Sau khi thực hiện câu lệnh trên, biến products sẽ trở thành một tibble chứa thông tin về các sản phẩm và giá của chúng, giúp bạn dễ dàng làm việc với dữ liệu một cách tiện lợi và hiệu quả.
Trực quan hóa dữ liệu là quá trình biến đổi dữ liệu thô thành dạng hình ảnh hoặc đồ họa để giúp người dùng hiểu thông tin một cách dễ dàng và nhanh chóng. Dữ liệu thô có thể khó hiểu và tiếp thu, nhưng khi được biểu diễn dưới dạng hình ảnh, biểu đồ, hoặc đồ thị, nó trở nên dễ dàng để nhìn thấy xu hướng, mẫu, và tương quan mà ta không thể nào tìm thấy được qua các thao tác thống kê mô tả cơ bản. Trực quan hóa là cách tốt nhất để truyền đạt kết quả của việc phân tích dữ liệu. Một hình ảnh tốt có thể truyền đạt một thông điệp mạnh mẽ và rõ ràng hơn nhiều so với một bảng số.
Các loại trực quan hóa dữ liệu phổ biến bao gồm biểu đồ cột, biểu đồ dòng, biểu đồ tròn, biểu đồ hộp, biểu đồ phân tán, và nhiều hơn nữa. Loại biểu đồ cần sử dụng sẽ phụ thuộc vào loại dữ liệu đang có và thông điệp mà người phân tích dữ liệu muốn truyền đạt.
Trực quan hóa dữ liệu có thể giúp rất nhiều trong việc ra quyết định dựa trên dữ liệu. Đối với những người làm việc với dữ liệu, trực quan hóa cũng là một công cụ quan trọng để khám phá dữ liệu và tìm hiểu cấu trúc và mẫu của dữ liệu đó.
ggplot2 là một gói trong R được thiết kế để tạo ra trực quan hóa dữ liệu tĩnh (static) phức tạp nhưng vẫn giữ được tính nhất quán và đơn giản trong cú pháp. ggplot2 giúp tạo các biểu đồ chất lượng cao với sự điều chỉnh tinh vi và linh hoạt.
Dưới đây là một số khái niệm cốt lõi của ggplot2:
The Grammar of Graphics (Ngữ pháp của Đồ họa): ggplot2 được xây dựng dựa trên Ngữ pháp của Đồ họa, một khái niệm mô tả cách tạo ra biểu đồ từ các thành phần cơ bản. Bắt đầu bằng một “bức tranh” trống và sau đó thêm vào các lớp để tạo ra biểu đồ. Các lớp có thể bao gồm các điểm, đường, hình, nhãn, tiêu đề, chú thích, v.v.
Aesthetics (Thẩm mỹ): Trong ggplot2, thẩm mỹ là những thuộc tính của dữ liệu được ánh xạ lên các thuộc tính về màu sắc, kích thước, hình dạng, vị trí… của các đối tượng đồ họa. Ví dụ, trong một biểu đồ phân tán, có thể ánh xạ giá trị của biến x và y lên vị trí trên trục x và y, và ánh xạ một biến danh mục khác lên màu sắc của các điểm.
Geoms (Đối tượng đồ họa): Đối tượng đồ họa là những thứ mà bạn vẽ lên biểu đồ. Các đối tượng đồ họa phổ biến bao gồm điểm (geom_point cho biểu đồ phân tán), đường (geom_line cho biểu đồ dòng), và thanh (geom_bar cho biểu đồ cột).
Scales (Thang đo): Thang đo trong ggplot2 kiểm soát cách mà giá trị của dữ liệu được ánh xạ lên thẩm mỹ. Ví dụ, có thể có một thang đo màu sắc chuyển đổi giữa màu đỏ và xanh dựa trên một biến liên tục, hoặc một thang đo kích thước chuyển đổi giữa các kích thước cố định dựa trên một biến danh mục.
Themes (Chủ đề): ggplot2 cung cấp nhiều chủ đề mà bạn có thể sử dụng để thay đổi tổng thể vẻ ngoài của biểu đồ, từ màu nền, màu viền, đến kiểu chữ của nhãn và tiêu đề.
Ngoài ra, ggplot2 còn hỗ trợ nhiều loại biểu đồ phức tạp và đặc biệt hơn, như biểu đồ hộp, biểu đồ violin, biểu đồ phân phối mật độ, biểu đồ lưới đồ họa đa biến (facet grids) và nhiều hơn nữa.
Dưới đây là ví dụ cơ bản cho việc sử dụng ggplot2 để trực quan hóa dữ liệu.
data(mpg) # Load bộ dữ liệu mpg
ggplot(data = mpg, aes(x = displ, y = hwy)) # Tạo khung đồ thị với trục x là displ và trục y là hwy
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() # Thêm điểm vào đồ thị(vẽ biểu đồ phân tán)
ggplot(data = mpg, aes(x = class)) +
geom_bar() # Tạo biểu đồ cột với trục x là class
Ngoài các hàm geom_ mà nhóm chúng em thực hiện ví dụ, thì còn các hàm geom_ như sau:
Geom_density(): biểu đồ dùng để biểu diễn mật độ phân bố của một biến liên tục
Geom_histogram(): để tạo biểu đồ histogram
Geom_smooth(): dùng để thêm đường cong điều chỉnh (trend line) vào biểu đồ phân tán
Geom_text(): thêm các nhãn văn bản vào biểu đồ, giúp tăng cường thông tin và giải thích cho dữ liệu.
Geom_contour(): để vẽ các đường đẳng cấp (contour lines) từ dữ liệu hai chiều.
Và bên cạnh đó còn rất nhiều hàm geom_ khác trong ggplot2 nhằm phục vụ cho việc trực quan hóa dữ liệu thuận tiện hơn.
ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point() # Thêm màu sắc cho điểm dựa trên class
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~class) # Tạo các biểu đồ con dựa trên class
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
theme_minimal() # Sử dụng theme minimal cho đồ thị
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
scale_x_continuous(limits = c(1, 7)) # Giới hạn trục x từ 1 đến 7
Các gói cốt lõi trong tidyverse là những gói phổ biến và cơ bản nhất, giúp bạn thực hiện các công việc liên quan đến xử lý và phân tích dữ liệu chính. Các gói này được thiết kế để có thể làm việc với hầu hết các loại dữ liệu và tình huống phân tích.
Ngược lại, các gói không cốt lõi thường tập trung vào các công việc phân tích dữ liệu cụ thể hoặc chuyên sâu hơn. Ví dụ, rvest hỗ trợ web scraping, dbplyr giúp làm việc với cơ sở dữ liệu, v.v. Mặc dù những gói này rất hữu ích, nhưng chúng không phải lúc nào cũng cần thiết trong mọi tình huống phân tích dữ liệu. Do đó, chúng không được coi là “cốt lõi” của tidyverse. Sự phân biệt giữa các gói cốt lõi và không cốt lõi phụ thuộc vào mức độ phổ biến và cơ bản của công việc mà chúng hỗ trợ. Những gói này thường chỉ được cài đặt và gọi lên khi cần thiết, chứ không phải được gọi lên cùng lúc khi ta gọi tidyverse như các gói cốt lõi khác.
Gói “readxl” là một gói R hữu ích được sử dụng để đọc dữ liệu từ các tệp Excel (.xls và .xlsx) vào môi trường R. Gói này cung cấp các công cụ dễ sử dụng để đọc dữ liệu từ các tệp Excel và chuyển đổi chúng thành các đối tượng dữ liệu R, chẳng hạn như data frame. Điều này rất hữu ích khi cần thực hiện phân tích dữ liệu từ các báo cáo, bảng tính hoặc dữ liệu được lưu trữ trong tệp Excel.
library(readxl)
data <- read_excel("C:/Users/tranh/Downloads/thongke/Mohinhngaunhien.xlsx")
head(data)
## # A tibble: 6 × 7
## `Thời gian` FDI TO IR ER INF GDP
## <chr> <chr> <dbl> <chr> <dbl> <dbl> <chr>
## 1 Quý 1/2011 1.39 0.870 13.5 20803 2.17 441707
## 2 Quý 2/2011 0.78 0.641 13.94 20803 1.09 628223
## 3 Quý 3/2011 0.95 0.640 14.11 20803 0.82 640284
## 4 Quý 4/2011 0.95 0.527 13.41 20803 0.53 824794
## 5 Quý 1/2012 1.52 0.800 10.64 20828 0.16 545764
## 6 Quý 2/2012 0.89 0.655 6.53 20828 -0.26 706813
Dưới đây là một số tính năng và lợi ích của gói “readxl”:
Dễ sử dụng: Gói “readxl” cung cấp hàm read_excel() với cú pháp đơn giản để đọc dữ liệu từ tệp Excel. Điều này giúp người dùng dễ dàng sử dụng và nhanh chóng làm việc với dữ liệu trong Excel.
Hỗ trợ định dạng Excel: Gói “readxl” hỗ trợ đọc dữ liệu từ cả các tệp Excel cổ điển (.xls) và định dạng mới hơn (.xlsx), do đó, có thể làm việc với các tệp Excel ở nhiều phiên bản khác nhau.
Hiệu suất tốt: Gói này được xây dựng với hiệu suất cao và sử dụng thư viện C++ để xử lý đọc dữ liệu từ Excel nhanh chóng và hiệu quả, đặc biệt là với các tệp Excel lớn.
Tự động xác định kiểu dữ liệu: Gói “readxl” tự động xác định kiểu dữ liệu của các cột dữ liệu trong tệp Excel, bao gồm cả dữ liệu số, văn bản và ngày tháng, giúp tiết kiệm thời gian và công sức phân loại dữ liệu.
Xử lý lỗi linh hoạt: Gói này cung cấp các tùy chọn để xử lý các tình huống không thể đọc hoặc hiểu định dạng dữ liệu trong tệp Excel một cách linh hoạt và dễ dàng.
Hỗ trợ đọc nhiều trang: Gói “readxl” cho phép bạn đọc dữ liệu từ nhiều trang trong cùng một tệp Excel và chuyển đổi thành các data frame riêng biệt cho mỗi trang.
Tự động nhận diện dòng tiêu đề: Gói này có khả năng tự động xác định dòng tiêu đề trong tệp Excel và sử dụng nó làm tên cột cho data frame.
Gói “haven” là một gói R được phát triển bởi Hadley Wickham và Evan Miller. Nguồn gốc của gói “haven” xuất phát từ nhu cầu xử lý dữ liệu từ các phần mềm thống kê phổ biến như SPSS, SAS và Stata. Các phần mềm này thường sử dụng các định dạng tệp dữ liệu riêng biệt, và việc chuyển đổi dữ liệu từ các định dạng này sang R có thể gặp khó khăn.
Gói này được xây dựng trên thư viện “ReadStat”, một thư viện C/C++ mã nguồn mở, giúp xử lý việc đọc và ghi dữ liệu từ các định dạng SPSS, SAS và Stata.
Với “haven”, người dùng có thể dễ dàng đọc dữ liệu từ các tệp SPSS, SAS và Stata vào môi trường R mà không cần phải sử dụng các công cụ bổ sung hoặc chuyển đổi tệp dữ liệu. Gói này cũng hỗ trợ đọc metadata từ các tệp dữ liệu này, bao gồm nhãn biến và nhãn giá trị, giúp duy trì thông tin quan trọng liên quan đến dữ liệu.
library(haven)
data <- read_sav("path/to/your/file.sav")
data <- read_sas("path/to/your/file.sas7bdat")
data <- read_dta("path/to/your/file.dta")
write_dta(data_frame, "path/to/your/output_file.dta")
Với path/to/your/file và path/to/your/output_file: là đường dẫn đến dữ liệu và tệp tên máy tính
Gói “haven” cung cấp các hàm mạnh mẽ để xử lý dữ liệu từ các định dạng tệp SPSS, SAS và Stata trong R, giúp bạn tiết kiệm thời gian và cải thiện hiệu suất trong quá trình xử lý dữ liệu.
Gói “rvest” là một gói R được phát triển bởi Hadley Wickham và cộng tác viên, là một thành viên của hệ sinh thái tidyverse. Gói này cung cấp các công cụ mạnh mẽ để thu thập thông tin và dữ liệu từ các trang web bằng cách trích xuất dữ liệu từ HTML và XML. “rvest” là một công cụ tiện lợi và linh hoạt cho việc làm việc với web scraping trong R.
Dưới đây là một số tính năng và chức năng chính của gói “rvest”:
Web Scraping: Gói “rvest” cho phép thu thập dữ liệu từ các trang web công cộng hoặc có sẵn trên internet. Có thể trích xuất dữ liệu từ các trang web dữ liệu, blogs, báo cáo, v.v.
Lựa chọn dữ liệu từ HTML và XML: Gói này hỗ trợ cả CSS selectors và XPath để lựa chọn và trích xuất các phần tử HTML và XML. Điều này giúp bạn xử lý các trang web có cấu trúc phức tạp một cách linh hoạt.
Trích xuất nội dung văn bản và dữ liệu bảng: có thể trích xuất nội dung văn bản và dữ liệu bảng từ các trang web và chuyển đổi chúng thành các đối tượng có thể phân tích trong R như vector, list, data frame, v.v.
Đa trang và dữ liệu động: “rvest” cho phép thu thập dữ liệu từ nhiều trang web cùng lúc và thậm chí có thể điều khiển trang web, điền các mẫu form và thao tác với các phần tử trang web để thu thập dữ liệu động.
Tùy chỉnh thông qua gói “xml2”: Gói “rvest” được xây dựng dựa trên gói “xml2”, cho phép bạn tùy chỉnh và điều chỉnh các thao tác xử lý HTML và XML.
Tương thích với tidyverse: “rvest” hoạt động tốt với các gói khác trong hệ sinh thái tidyverse, giúp kết hợp dễ dàng với các công cụ phân tích và biểu đồ khác trong R.
Giới thiệu một số lệnh chính:
read_html(url): Đọc HTML từ một URL hoặc tệp HTML và trả về một đối tượng “html_document” chứa thông tin HTML của trang web.
html_nodes(html_object, css, xpath): Lựa chọn các phần tử HTML hoặc XML từ đối tượng “html_document” dựa trên CSS selectors hoặc XPath. Trả về một danh sách các phần tử lựa chọn.
html_text(html_nodes_object): Trích xuất văn bản từ các phần tử HTML hoặc XML đã lựa chọn và trả về một vector văn bản.
html_table(html_nodes_object): Trích xuất các bảng HTML từ các phần tử đã lựa chọn và trả về một danh sách các data frame.
html_attr(html_nodes_object, “attribute_name”): Trích xuất giá trị của một thuộc tính (attribute) từ các phần tử đã lựa chọn.
html_form(html_nodes_object): Lựa chọn mẫu form HTML từ các phần tử đã lựa chọn và trả về một đối tượng “html_form” chứa thông tin về mẫu form.
html_submit(form_object, “button_name”): Gửi mẫu form HTML bằng cách nhấn vào nút (button) được chỉ định.
html_session(url): Tạo một phiên (session) để duyệt web, cho phép bạn thực hiện nhiều yêu cầu trên cùng một trang web.
html_element() và html_elements(): Tạo các đối tượng “html_element” hoặc danh sách “html_element” để thao tác với các phần tử HTML và XML.
html_table_rows(): Tạo các đối tượng “html_table_rows” để trích xuất dữ liệu từ các hàng của bảng HTML.
Dưới đây là một ví dụ minh họa sử dụng các lệnh trong gói “rvest” để trích xuất thông tin từ một trang web. Trong ví dụ này, chúng ta sẽ thu thập thông tin từ web: “https://coinmarketcap.com/”
library(rvest)
library(DT)
links <- "https://coinmarketcap.com/"
data <- read_html(links)
Name <- data %>% html_nodes(".cmc-link .kKpPOn") %>% html_text()
Price <- data %>% html_nodes(".gDrtaY span") %>% html_text()
ohours <- data %>% html_nodes("td:nth-child(5) .sc-97d6d2ca-0") %>% html_text()
thours <- data %>% html_nodes("td:nth-child(6) .sc-97d6d2ca-0") %>% html_text()
sdays <- data %>% html_nodes("td:nth-child(7) .sc-97d6d2ca-0") %>% html_text()
marketcap <- data %>% html_nodes(".bOsKfy") %>% html_text()
Cirsup <- data %>% html_nodes("td:nth-child(10)") %>% html_text()
acroname <- data %>% html_nodes(".coin-item-symbol") %>% html_text()
Coinmarket <- data.frame(Name, acroname, Price, ohours, thours, sdays, marketcap, Cirsup)
datatable(Coinmarket,options = list(scrollX = TRUE))
Giải thích
Tạo một data frame gồm 8 biến, dữ liệu của các biến này được lấy từ trang web Coinmarketcap.com. CoinMarketCap là một trang web được sử dụng để theo dõi, phân tích và cung cấp thông tin về thị trường tiền điện tử. Trang web này chứa thông tin về hàng trăm loại tiền điện tử khác nhau, bao gồm cả các đồng tiền điện tử nổi tiếng như Bitcoin, Ethereum, Ripple và Litecoin.
Name: Tên của các đồng tiền điện tử
acroname: Ký hiệu của các đồng tiền điện tử
Price: Giá hiện tại của đồng tiền điện tử
ohours: tỷ lệ tăng/ giảm của đồng tiền trong 1h qua
thours: tỷ lệ tăng/ giảm của đồng tiền trong 24h qua
sdays: tỷ lệ tăng giảm của đồng tiền trong 7 ngày qua
marketcap: Vốn hoá thị trường của đồng tiền đó
Cirsup: Số lượng đồng tiền đang lưu thông trên thị trường
Ngoài “Rvest” thì “httr” cũng là một gói làm việc với web nhưng chức năng của httr là cùng để tạo và gửi các yêu cầu HTTP đến các máy chủ web, truy xuất dữ liệu từ các API web, và thực hiện các thao tác liên quan đến giao tiếp qua mạng. Gói này cung cấp cách dễ dàng để tương tác với API và lấy dữ liệu từ web, là một phần quan trọng trong phân tích dữ liệu và làm việc với dịch vụ web.
Dưới đây là một số tính năng và chức năng chính của gói “httr”:
Tạo và Gửi Yêu Cầu HTTP: Gói “httr” cho phép tạo và gửi các yêu cầu HTTP như GET, POST, PUT, DELETE, và nhiều loại yêu cầu khác để tương tác với máy chủ web.
Cài Đặt Yêu Cầu: Gói này cung cấp cách dễ dàng để thiết lập các thông số yêu cầu như tiêu đề, thân yêu cầu, tham số truy vấn và nhiều thiết lập khác.
Xử Lý Dữ Liệu Trả Về: “httr” cho phép xử lý dữ liệu trả về từ yêu cầu HTTP dưới dạng các đối tượng dễ dàng để làm việc tiếp.
Xác Thực: Gói này hỗ trợ xác thực qua các phương thức như Basic Auth, OAuth, Bearer Token và nhiều phương thức xác thực khác.
Cookie và Session: có thể quản lý cookie và session trong yêu cầu và duy trì trạng thái giữa các yêu cầu.
SSL/TLS: “httr” hỗ trợ SSL và TLS để đảm bảo an toàn trong giao tiếp qua mạng.
Ví dụ về việc sử dụng gói “httr” để thực hiện yêu cầu GET và POST:
# Sử dụng gói httr để thực hiện yêu cầu GET
library(httr)
response <- GET("https://api.example.com/data")
content(response, "text")
# Thực hiện yêu cầu POST
payload <- list(name = "John", age = 30)
response <- POST("https://api.example.com/submit", body = payload)
content(response, "text")
Gói “feather” trong ngôn ngữ lập trình R là một gói dùng để đọc và ghi dữ liệu dưới định dạng Feather. Định dạng Feather là một định dạng dữ liệu nhị phân được tối ưu hóa để lưu trữ dữ liệu tabular (dạng bảng) dưới dạng các cột có kiểu dữ liệu cố định. Feather được thiết kế để đọc và ghi dữ liệu nhanh chóng và hiệu quả, đặc biệt là khi chia sẻ dữ liệu giữa R và Python.
Gói “feather” trong R: Gói “feather” cung cấp các hàm để đọc và ghi dữ liệu dưới định dạng Feather trong R. Có thể sử dụng hàm read_feather() để đọc dữ liệu từ tệp Feather và hàm write_feather() để ghi dữ liệu vào tệp Feather.
Một vài ví dụ về cách sử dụng gói feather như sau:
library(feather)
# Đọc dữ liệu từ tệp Feather
data <- read_feather("data.feather")
# Ghi dữ liệu vào tệp Feather
write_feather(data, "new_data.feather")
Với data.feather và new_data.feather: là đường dẫn đến dữ liệu và tệp tên máy tính.
Feather được thiết kế để đảm bảo tốc độ đọc/ghi nhanh, hỗ trợ dữ liệu kiểu số, chuỗi, ngày giờ và logic. Do Feather là định dạng nhị phân, nên dữ liệu được lưu trữ một cách hiệu quả hơn so với một số định dạng dữ liệu văn bản khác.
Tương thích với Python: Feather cũng có hỗ trợ trong Python thông qua gói pyarrow, giúp chia sẻ dữ liệu dễ dàng giữa R và Python.
Ngoài việc đọc dữ liệu vào R có nhiều kiểu dữ liệu khác nhau thì nhóm chúng em sẽ giới thiệu thêm một kiểu dữ liệu và một package cần thiết để thao tác, Xml2: Package xml2 là một gói liên kết với package libxml2, giúp dễ dàng làm việc với HTML và XML từ R. Một số function cơ bản trong xlm2:
• Read_xml(): Đọc file HTML hoặc XML
• XML_type(): Xác định loại nút
• Xml_structure(): Hiển thị cấu trúc của tài liệu html/xml
• Xml_text(): Trích hoặc thay đổi văn bản
Ở phần các gói “cốt lõi” trong R, chúng em có giới thiệu gói lubridate cũng làm một gói làm việc với kiểu dữ liệu thời gian. Ở phần này, chúng em thực hiện tìm hiểu thêm một package cung cấp các hàm làm việc với thời gian nữa là hms. Gói “hms” trong ngôn ngữ lập trình R là một gói dùng để làm việc với thời gian trong ngày. Tên của gói là viết tắt của “hours, minutes, seconds”, thể hiện mục tiêu chính của nó là làm việc với các thành phần thời gian trong một ngày cụ thể. Gói này được phát triển bởi nhóm “tidyverse” để cung cấp cách dễ dàng và rõ ràng để biểu diễn, tính toán và thao tác với thời gian trong ngày. Gói triển khai một lớp S3 để lưu trữ và định dạng các giá trị thời gian trong ngày dựa trên “difftime”. Nó có thể hữu ích để đơn giản hóa việc trao đổi dữ liệu với cơ sở dữ liệu, bảng tính và các nguồn dữ liệu khác.
Dưới đây là một số chức năng và tính năng chính của gói “hms”:
Tạo đối tượng thời gian: có thể sử dụng hàm hms() để tạo đối tượng thời gian trong ngày dựa trên các thành phần giờ, phút và giây. Ví dụ: hms(hours = 8, minutes = 30, seconds = 45) tạo ra một thời gian 08:30:45.
Chuyển đổi dữ liệu thời gian: Gói “hms” cung cấp hàm as_hms() để chuyển đổi giá trị thời gian số thành đối tượng “hms”. Ví dụ: as_hms(0.5) sẽ chuyển đổi giá trị 0.5 (tương ứng với 12 giờ trưa) thành đối tượng thời gian.
Chuyển đổi chuỗi thành thời gian: Hàm parse_hms() cho phép chuyển đổi các chuỗi ký tự chứa thời gian thành các đối tượng “hms”. Ví dụ: parse_hms(c(“08:30:45”, “12:15:30”)) sẽ tạo ra các đối tượng thời gian từ chuỗi.
Thao tác với thời gian: Gói này hỗ trợ các phép tính cộng và trừ giữa các đối tượng “hms”, cho phép thực hiện các phép tính thời gian dễ dàng.
Tích hợp với tidyverse và dplyr: Gói “hms” tích hợp tốt với hệ thống tidyverse và gói dplyr, giúp kết hợp việc làm việc với thời gian trong quy trình phân tích dữ liệu.
Định dạng hiển thị: Gói này cho phép bạn định dạng đối tượng thời gian thành chuỗi theo định dạng mong muốn, giúp hiển thị dữ liệu thời gian một cách dễ đọc và thẩm mỹ hơn.
Tích hợp với lubridate: “hms” có tích hợp với gói “lubridate”, giúp làm việc với dữ liệu thời gian phức tạp khi cần.
Dưới đây là một vài ví dụ:
library(hms)
#Tạo đối tượng thời gian
time1 <- hms(hours = 8, minutes = 30, seconds = 45)
time1
## 08:30:45
#Chuyển đổi dữ liệu thời gian
as_hms(0.5)
## 00:00:00.5
# Chuyển đổi thành chuỗi
format(time1)
## [1] "08:30:45"
parse_hms(c("08:30:45", "12:15:30"))
## 08:30:45
## 12:15:30
#Thao tác với thời gian
time2 <- hms(hours = 2, minutes = 15)
sum_time <- time1 + time2
Mục tiêu của một mô hình là cung cấp một bản tóm tắt đơn giản của tập dữ liệu. Lý tưởng nhất là mô hình sẽ nắm bắt được “tín hiệu” thực sự (tức là các mẫu do hiện tượng quan tâm tạo ra) và bỏ qua “nhiễu” (tức là biến thể ngẫu nhiên mà không quan tâm). Các mô hình “dự đoán”, đúng như tên gọi, tạo ra các dự đoán và cũng có một loại mô hình khác là mô hình “khám phá dữ liệu”. Các mô hình này không đưa ra dự đoán mà thay vào đó giúp khám phá các mối quan hệ thú vị trong dữ liệu. model là một phần quan trọng để xây dựng các mô hình thống kê hoặc dự đoán dựa trên dữ liệu đã thu thập. Bước này giúp bạn tạo ra các biểu diễn hoặc hàm toán học để mô tả mối quan hệ giữa các biến hoặc để dự đoán một biến dự phóng dựa trên các biến khác.
Gói “modelr” trong ngôn ngữ lập trình R là một phần của hệ sinh thái “tidyverse” và được sử dụng để làm việc với mô hình thống kê và dự đoán. “modelr” cung cấp các công cụ giúp chuẩn bị dữ liệu, tạo mô hình, đánh giá và hiểu kết quả mô hình một cách dễ dàng và hiệu quả.
Dưới đây là một số tính năng và chức năng chính của gói “modelr”:
Chuẩn bị Dữ liệu: Gói “modelr” cung cấp các hàm để chuẩn bị dữ liệu trước khi xây dựng mô hình. Bạn có thể sử dụng các hàm như data_grid() để tạo lưới dữ liệu để dự đoán và add_case() để thêm các trường dữ liệu mới.
Lựa chọn dữ liệu mẫu: Bạn có thể sử dụng các hàm như resample() và bootstraps() để tạo dữ liệu mẫu ngẫu nhiên từ tập dữ liệu gốc để thực hiện kiểm tra mô hình và đánh giá độ tin cậy của dự đoán.
Tích hợp với dplyr: “modelr” tích hợp chặt chẽ với gói “dplyr” để thực hiện các thao tác biến đổi dữ liệu trước và sau khi xây dựng mô hình.
Tạo Mô hình: Gói này hỗ trợ việc tạo mô hình dự đoán sử dụng các hàm như linear_reg() (mô hình tuyến tính), glm() (mô hình tuyến tính tổng quát), và nhiều hàm khác.
Đánh giá Mô hình: Bạn có thể sử dụng các hàm như collect_predictions() để thu thập dự đoán từ mô hình và rmse() để tính toán sai số bình phương trung bình.
Hiểu Kết quả Mô hình: Gói “modelr” cung cấp các hàm để giúp bạn hiểu kết quả mô hình, chẳng hạn như add_predictions() để thêm dự đoán vào dữ liệu và augment() để bổ sung thông tin dự đoán vào tập dữ liệu.
Ví dụ về việc sử dụng gói “modelr” để xây dựng và đánh giá mô hình tuyến tính:
# Sử dụng gói modelr để làm việc với mô hình
library(modelr)
library(dplyr)
# Tạo dữ liệu mẫu
data <- data.frame(x = 1:10, y = 2*(1:10) + rnorm(10))
data
## x y
## 1 1 2.010237
## 2 2 4.977366
## 3 3 7.514985
## 4 4 6.850019
## 5 5 9.932892
## 6 6 11.552401
## 7 7 13.526623
## 8 8 16.407170
## 9 9 17.626085
## 10 10 19.722803
# Xây dựng mô hình tuyến tính bằng hàm lm()
model <- lm(y ~ x, data = data)
summary(model)
##
## Call:
## lm(formula = y ~ x, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.3069 -0.3937 -0.0877 0.5068 1.2615
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.54325 0.51876 1.047 0.326
## x 1.90342 0.08361 22.767 1.47e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7594 on 8 degrees of freedom
## Multiple R-squared: 0.9848, Adjusted R-squared: 0.9829
## F-statistic: 518.3 on 1 and 8 DF, p-value: 1.469e-08
# Tạo lưới dữ liệu để dự đoán
grid <- data.frame(x = seq(1, 10, by = 0.1))
# Dự đoán và đánh giá mô hình
predictions <- grid %>%
add_predictions(model) %>%
collect()
head(predictions)
## x pred
## 1 1.0 2.446666
## 2 1.1 2.637008
## 3 1.2 2.827350
## 4 1.3 3.017692
## 5 1.4 3.208034
## 6 1.5 3.398376
# Tính toán sai số RMSE
rmse(model,data)
## [1] 0.6792183
Tóm lại, sử dụng gói modelr giúp bạn có cái nhìn sâu hơn và cấu trúc hơn về mô hình của mình, từ việc xây dựng đến đánh giá và hiểu mối quan hệ giữa các biến.
Sử dụng tidyverse trong phân tích dữ liệu mang lại nhiều lợi ích cho người dùng. Dưới đây là một số lợi ích chính của việc sử dụng tidyverse:
Code dễ đọc và dễ hiểu: Tidyverse được thiết kế để giúp người dùng viết code một cách đơn giản, ngắn gọn và dễ hiểu. Cú pháp sạch sẽ và dễ nhìn giúp cải thiện tính đồng nhất của code, giúp cho việc tái sử dụng và bảo trì mã dễ dàng hơn.
Thao tác với dữ liệu dễ dàng: Tidyverse cung cấp một loạt các hàm và công cụ mạnh mẽ để làm sạch và biến đổi dữ liệu một cách hiệu quả. Các hàm như filter(), select(), mutate() và group_by() giúp người dùng thực hiện các thao tác dữ liệu phổ biến một cách nhanh chóng và linh hoạt.
Phân tích dữ liệu mạnh mẽ: Tidyverse cung cấp các gói dữ liệu và trực quan hóa như dplyr, ggplot2, readr, tidyr,… giúp người dùng thực hiện các phân tích dữ liệu phức tạp và trực quan hóa dữ liệu một cách dễ dàng và chính xác.
Hỗ trợ tích hợp dữ liệu: Tidyverse cung cấp các phương pháp linh hoạt để tích hợp dữ liệu từ nhiều nguồn khác nhau. Các hàm như bind_rows(), bind_cols(), left_join(),… cho phép người dùng kết hợp và làm việc với các tập dữ liệu khác nhau một cách thuận tiện.
Trực quan hóa dữ liệu dễ dàng: Tidyverse tích hợp chặt chẽ với gói ggplot2, cho phép người dùng tạo các biểu đồ và đồ thị trực quan chất lượng cao với một số dòng code đơn giản. Điều này giúp làm cho việc thể hiện kết quả và giải thích dữ liệu trở nên dễ dàng và thu hút hơn.
Hỗ trợ công cụ liên quan đến tự động hóa: Tidyverse tương thích với các công cụ liên quan đến tự động hóa như RMarkdown và knitr, giúp tạo ra báo cáo và tài liệu thuyết trình chuyên nghiệp dễ dàng từ code và kết quả của phân tích.
Cộng đồng lớn và hỗ trợ mạnh mẽ: Tidyverse có cộng đồng người dùng lớn và nhiều tài liệu hướng dẫn, tài liệu tham khảo và gợi ý trên các diễn đàn trực tuyến. Điều này giúp người dùng dễ dàng tìm kiếm giải pháp cho các vấn đề và thắc mắc khi sử dụng gói này.
Tóm lại, tidyverse không chỉ giúp người dùng làm việc với dữ liệu một cách hiệu quả và tiết kiệm thời gian mà còn mang lại tính thẩm mỹ cao trong việc trình bày kết quả và trực quan hóa dữ liệu.
Việc sử dụng tidyverse trong R mang lại nhiều ưu điểm so với việc sử dụng các gói R thuần tuý. Dưới đây là một số khác biệt chính:
Cú pháp thân thiện và dễ sử dụng: Tidyverse được thiết kế với mục tiêu làm cho việc viết mã dễ dàng và thân thiện với người dùng. Cú pháp trong tidyverse dễ đọc, gần gũi và tương tự với các cú pháp trong ngôn ngữ lập trình thông thường. Tidyverse sử dụng cú pháp đơn giản và nhất quán, giúp việc viết và đọc mã dễ dàng hơn. Ví dụ, dplyr (một phần của tidyverse) sử dụng các hàm như filter(), select(), mutate(), v.v. để làm việc với dữ liệu. Ngược lại, R thuần túy sử dụng cú pháp truyền thống hơn, như sử dụng [, [[, và $ để truy cập dữ liệu, và dùng các hàm như subset(), apply(), v.v. Điều này giúp giảm thời gian học và làm quen với gói và tăng tính hiệu quả trong việc sử dụng nó
Cách tiếp cận dữ liệu: Tidyverse khuyến khích tiếp cận “tidy data”, trong đó mỗi biến là một cột, mỗi quan sát là một hàng, và mỗi loại đơn vị quan sát là một bảng. Điều này giúp dễ dàng hơn trong việc quản lý và phân tích dữ liệu. Ngược lại, R thuần túy không có quan điểm cụ thể về cách tổ chức dữ liệu.
Hiệu năng: Một số hàm của tidyverse được tối ưu hóa để nhanh hơn và tiêu tốn ít bộ nhớ hơn so với hàm tương ứng trong R thuần túy. Tuy nhiên, trong một số trường hợp, R thuần túy có thể hiệu quả hơn, đặc biệt khi làm việc với dữ liệu rất lớn.
Tính tương thích: Một số gói R không được thiết kế để làm việc trực tiếp với các đối tượng tidyverse như tibbles. Trong khi đó, R thuần túy có tính tương thích rộng rãi hơn.
Thời gian học: Dù tidyverse giúp việc viết mã dễ dàng hơn, nó cũng đòi hỏi thời gian học và hiểu các gói của nó. Người mới học R có thể bắt đầu nhanh hơn với R thuần túy vì nó không yêu cầu hiểu biết về các gói phức tạp.
Tóm lại, tidyverse và R thuần túy đều có ưu và nhược điểm riêng. Lựa chọn nào tốt nhất phụ thuộc vào nhiệm vụ cụ thể, dữ liệu đang làm việc, và sở thích cá nhân.
Một trong những hạn chế của nghiên cứu này là kiến thức liên quan đến đề tài rất lớn, nhiều kiến thức liên quan, tuy rằng có nhiều tài liệu và hỗ trợ cộng đồng, không phải tất cả các gói và hàm trong Tidyverse đều được tài liệu hóa rõ ràng. Điều này có thể gây khó khăn cho việc học và sử dụng nên không thể tránh khỏi sai sót khi thực hiện nghiên cứu. Thứ hai, có một số lượng lớn các hàm trong tidyverse có cách sử dụng khác nhưng chúng tôi chưa khai thác hết. Mặc dù nghiên cứu này có một số đóng góp, nhưng cần phải mở rộng nghiên cứu sâu hơn để có thể giải thích rõ hơn các gói nhỏ trong tidyverse để có thể áp dụng các gói này vào trong thực tế. Cuối cùng, khó khăn về mặt thu thập dữ liệu có thể không chính xác tuyệt đối, khi sử dụng Tidyverse (hoặc bất kỳ công cụ nào khác) để phân tích dữ liệu, chất lượng và độ chính xác của dữ liệu gốc rất quan trọng. Nếu có bất kỳ vấn đề gì về chất lượng dữ liệu, kết quả phân tích cũng sẽ bị ảnh hưởng.
https://epirhandbook.com/vn/basics.html
https://www.tidyverse.org/packages/
https://r4ds.hadley.nz/?fbclid=IwAR1k4EhrGQIP7NJACqZfGpvLLOXdqlNGzkEzmToViAD30k0mmJbrJBN2ztE
https://cran.r-project.org/web/packages/tidyverse/index.html
Mô tả các bộ dữ liệu đã sử dụng trong bài nghiên cứu
Bộ dữ liệu “txhousing” cung cấp cho người dùng một cái nhìn sơ bộ về thị trường bất động sản ở Texas:
city: Tên của thành phố ở Texas.
year: Năm ghi nhận dữ liệu.
month: Tháng ghi nhận dữ liệu.
sales: Số lượng bất động sản đã bán trong tháng.
volume: Doanh số bán nhà trong tháng.
median: Giá trung bình của nhà bán ra trong tháng.
listings: chỉ số thể hiện số lượng bất động sản mới được niêm yết trong một tháng cụ thể tại một thành phố trong tiểu bang Texas. Biến này cho biết tốc độ và xu hướng cung cấp bất động sản trên thị trường.
inventory: chỉ số thể hiện số lượng bất động sản tồn đọng trên thị trường trong một tháng cụ thể tại một thành phố trong tiểu bang Texas. Biến này cho biết mức độ cạnh tranh và sự khan hiếm của bất động sản tại thời điểm đó.
date: Đây là biến đại diện cho thời gian trong bộ dữ liệu, được xác định bởi cặp giá trị “year” (năm) và “month” (tháng). Biến “date” cho phép bạn theo dõi các chỉ số “listings” và “inventory” theo từng tháng và năm, giúp phân tích xu hướng thị trường bất động sản theo thời gian.
Bộ dữ liệu “penguins” bao gồm các thông tin sau đây:
Species: Loài của chim cánh cụt (kiểu factor) - Gồm các loài: “Adelie”, “Chinstrap” và “Gentoo”.
Island: Đảo nơi chim cánh cụt được quan sát (kiểu factor) - Gồm các đảo: “Biscoe”, “Dream” và “Torgersen”.
Bill Length (mm): Độ dài mỏ của chim cánh cụt tính bằng milimet (kiểu numeric).
Bill Depth (mm): Độ dày mỏ của chim cánh cụt tính bằng milimet (kiểu numeric).
Flipper Length (mm): Chiều dài vây của chim cánh cụt tính bằng milimet (kiểu numeric).
Body Mass (g): Cân nặng của chim cánh cụt tính bằng gram (kiểu numeric).
Sex: Giới tính của chim cánh cụt (kiểu factor) - Gồm các giá trị: “male”, “female”.
Year: Năm quan sát chim cánh cụt (kiểu integer).
Mô tả bộ dữ liệu: Bộ dữ liệu “economics” là một bộ dữ liệu ví dụ đi kèm với gói “datasets”. Bộ dữ liệu này chứa thông tin về các chỉ số kinh tế của Hoa Kỳ trong một khoảng thời gian dài từ năm 1947 đến 2021.
date: Đây là cột chứa thông tin về ngày tháng năm trong định dạng “yyyy-mm-dd”. Các giá trị trong cột này biểu thị thời gian diễn ra sự kiện kinh tế
psavert: Tỷ lệ tiết kiệm của người tiêu dùng (% thu nhập cá nhân tiêu thụ tiết kiệm).
pce: Chi tiêu tiêu dùng cá nhân (tính theo tỷ lệ phần trăm của GDP).
pop: Dân số của Hoa Kỳ (tính theo triệu người).
uempmed: Số tuần trung bình mà người thất nghiệp đã thất nghiệp.
unemploy: Tổng số người thất nghiệp.
psavert: Lạm phát (tỉ lệ phần trăm thay đổi hàng năm của chỉ số giá tiêu dùng).
rgdp: GDP thật (GDP tính bằng giá cố định, đã điều chỉnh để loại bỏ tác động của lạm phát).
rpcve: Thu nhập cá nhân trung bình (tính theo người) và điều chỉnh tính đến lạm phát.