Turtles

1 Data Collection

# install jika belum ada
if (!require("rvest")) install.packages("rvest", quiet = TRUE)
if (!require("httr")) install.packages("httr", quiet = TRUE)
if (!require("dplyr")) install.packages("dplyr", quiet = TRUE)
if (!require("stringr")) install.packages("stringr", quiet = TRUE)
if (!require("knitr")) install.packages("knitr", quiet = TRUE)
if (!require("kableExtra")) install.packages("kableExtra", quiet = TRUE)

library(rvest)
library(httr)
library(dplyr)
library(stringr)
library(knitr)
library(kableExtra)

base_url  <- "https://www.scrapethissite.com"
frame_url <- "https://www.scrapethissite.com/pages/frames/?frame=i"

page <- read_html(GET(frame_url, user_agent("Mozilla/5.0")))

links <- page %>% html_elements("a") %>% html_attr("href")
turtle_links <- links[grepl("family=", links)]

all_data <- data.frame()

for (href in turtle_links) {
  full_url    <- paste0(base_url, href)
  family_name <- str_extract(href, "(?<=family=).+")

  resp <- GET(full_url, user_agent("Mozilla/5.0"))
  if (status_code(resp) != 200) next

  detail_page <- read_html(resp)

  # deskripsi dirapikan (ambil teks yang cukup panjang)
  description <- detail_page %>%
    html_elements("p") %>%
    html_text() %>%
    trimws() %>%
    .[nchar(.) > 50] %>%
    paste(collapse = " ")

  if (length(description) == 0 || description == "") description <- NA

  all_data <- bind_rows(all_data, data.frame(
    Name        = family_name,
    Description = description,
    Source_URL  = full_url,
    stringsAsFactors = FALSE
  ))
}

# status data
all_data$Data_Status <- ifelse(!is.na(all_data$Description), "Complete", "Incomplete")

# tampilkan (aman dari error jumlah baris)
n <- min(5, nrow(all_data))
kable(all_data[1:n, c("Name", "Description", "Data_Status")], align = "c") %>%
  kable_styling(full_width = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#8B1E3F", color = "white") %>%
  row_spec(1:n, background = "#F9F9F9")
Name Description Data_Status
Carettochelyidae The Carettochelyidae family of turtles — more commonly known as “Pig-nosed turtle” — were first discovered in 1887 by Boulenger. Complete
Cheloniidae The Cheloniidae family of turtles — more commonly known as “Sea turtles” — were first discovered in 1811 by Oppel. Complete
Chelydridae The Chelydridae family of turtles — more commonly known as “Snapping turtles” — were first discovered in 1831 by Gray. Complete
Dermatemydidae The Dermatemydidae family of turtles — more commonly known as “Central American river turtle” — were first discovered in 1870 by Gray. Complete
Dermochelyidae The Dermochelyidae family of turtles — more commonly known as “Leatherback sea turtle” — were first discovered in 1843 by Fitzinger. Complete
kable(
  data.frame(Informasi = "Jumlah Data", Nilai = nrow(all_data)),
  align = "c"
) %>%
  kable_styling(full_width = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#8B1E3F", color = "white")
Informasi Nilai
Jumlah Data 14
# simpan CSV
write.csv(all_data, "turtles_data.csv", row.names = FALSE)

Dilakukan pengambilan data dari halaman website yang menggunakan iframe dengan teknik web scraping menggunakan R. Data yang diperoleh meliputi nama dan deskripsi setiap entri. Proses scraping dilakukan dengan mengakses sumber iframe dan mengekstrak data menggunakan fungsi iteratif.

2 Data Understanding

Dilakukan proses pemahaman terhadap data hasil scraping untuk mengetahui struktur dataset, jumlah data, tipe data, serta memastikan tidak terdapat missing values. Tahap ini penting untuk memastikan data siap digunakan pada proses selanjutnya.

library(knitr)
library(kableExtra)

# ringkasan data
summary_df <- data.frame(
  Informasi = c("Jumlah Baris", "Jumlah Kolom", "Missing Values"),
  Nilai = c(nrow(all_data), ncol(all_data), sum(is.na(all_data)))
)

kable(summary_df, align = "c") %>%
  kable_styling(full_width = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#8B1E3F", color = "white")
Informasi Nilai
Jumlah Baris 14
Jumlah Kolom 4
Missing Values 0

Berdasarkan hasil analisis, dataset hasil scraping terdiri dari 14 baris dan 4 kolom utama, yaitu Name, Description, Source_URL, dan Data_Status. Tidak ditemukan missing values pada seluruh kolom, sehingga data dapat dikatakan lengkap dan memiliki kualitas yang baik. Dengan kondisi tersebut, dataset telah siap untuk digunakan pada tahap selanjutnya seperti proses pembersihan data dan analisis lebih lanjut.

3 Data Cleaning

Dilakukan proses pembersihan data untuk memastikan seluruh kolom memiliki format yang konsisten dan siap digunakan untuk analisis. Proses ini meliputi penghapusan spasi berlebih, penyesuaian format teks, serta validasi nilai pada setiap kolom.

library(dplyr)
library(knitr)
library(kableExtra)

# cleaning
clean_data <- all_data %>%
  mutate(
    Name = trimws(Name),
    Description = trimws(Description),
    Source_URL = trimws(Source_URL),
    Data_Status = trimws(Data_Status)
  )

# cek hasil (min & max panjang karakter sebagai validasi)
check_df <- data.frame(
  Kolom = c("Name", "Description"),
  Min_Panjang = c(min(nchar(clean_data$Name)), min(nchar(clean_data$Description))),
  Max_Panjang = c(max(nchar(clean_data$Name)), max(nchar(clean_data$Description)))
)

kable(check_df, align = "c") %>%
  kable_styling(full_width = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#8B1E3F", color = "white") %>%
  row_spec(1:nrow(check_df), background = "#F9F9F9")
Kolom Min_Panjang Max_Panjang
Name 8 16
Description 114 200

Hasil proses cleaning menunjukkan bahwa seluruh kolom telah memiliki format yang konsisten tanpa adanya spasi berlebih. Panjang karakter pada setiap kolom juga berada dalam rentang yang wajar, sehingga data dinyatakan bersih dan siap digunakan untuk proses analisis selanjutnya.

4 Conditional Logic

Dilakukan penerapan conditional logic untuk mengelompokkan data berdasarkan panjang deskripsi. Hal ini bertujuan untuk mengidentifikasi apakah suatu data memiliki informasi yang detail atau tidak.

library(dplyr)
library(knitr)
library(kableExtra)

# conditional logic
logic_data <- clean_data %>%
  mutate(
    Description_Length = nchar(Description),
    Description_Category = ifelse(Description_Length > 100, "Detail", "Singkat")
  )

# ringkasan kategori
summary_logic <- logic_data %>%
  count(Description_Category)

kable(summary_logic, align = "c") %>%
  kable_styling(full_width = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#8B1E3F", color = "white") %>%
  row_spec(1:nrow(summary_logic), background = "#F9F9F9")
Description_Category n
Detail 14

Hasil klasifikasi menunjukkan bahwa sebagian besar data memiliki deskripsi yang cukup panjang dan informatif. Hal ini menandakan bahwa data yang diperoleh memiliki kualitas yang baik dan dapat digunakan untuk analisis lebih mendalam.

5 Analytical Thinking

Berdasarkan hasil scraping dan pengolahan data, diperoleh total 14 jenis keluarga kura-kura yang berhasil dikumpulkan dari website. Seluruh data memiliki status lengkap (Complete), yang menunjukkan bahwa proses pengambilan data berjalan dengan baik tanpa adanya informasi yang hilang.

Dari hasil analisis deskripsi, sebagian besar data memiliki informasi yang cukup detail, sehingga dapat memberikan gambaran yang jelas mengenai masing-masing jenis kura-kura. Hal ini menunjukkan bahwa sumber data memiliki kualitas yang baik dan informatif.

Selain itu, tidak ditemukan adanya inkonsistensi atau nilai yang tidak valid pada dataset, sehingga data dapat langsung digunakan untuk analisis lanjutan. Secara keseluruhan, dataset ini dapat dianggap reliabel dan layak digunakan sebagai dasar dalam pengambilan keputusan atau pengembangan analisis lebih lanjut.