API Specs

english
analysis
tidytuesday
tidytuesday_25_06_17
Published

May 6, 2026

# Data
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.2     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     
── 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
tuesdata <- tidytuesdayR::tt_load('2025-06-17')
---- Compiling #TidyTuesday Information for 2025-06-17 ----
--- There are 5 files available ---


── Downloading files ───────────────────────────────────────────────────────────

  1 of 5: "api_categories.csv"
  2 of 5: "api_info.csv"
  3 of 5: "api_logos.csv"
  4 of 5: "api_origins.csv"
  5 of 5: "apisguru_apis.csv"
api_categories <- tuesdata$api_categories
api_info <- tuesdata$api_info
api_logos <- tuesdata$api_logos
api_origins <- tuesdata$api_origins
apisguru_apis <- tuesdata$apisguru_apis
# Ver la estructura de los datos (tipos de variables)
glimpse(apisguru_apis)
Rows: 2,529
Columns: 9
$ name                      <chr> "1forge.com", "1password.com:events", "1pass…
$ version                   <chr> "0.0.1", "1.0.0", "1.5.7", "6", "1.1.0", "1.…
$ added                     <dttm> 2017-05-30 08:34:14, 2021-07-19 10:17:09, 2…
$ updated                   <dttm> 2017-06-27 16:49:57, 2023-02-27 15:08:09, 2…
$ swagger_url               <chr> "https://api.apis.guru/v2/specs/1forge.com/0…
$ openapi_ver               <chr> "2.0", "3.0.0", "3.0.2", "3.0.0", "3.0.1", "…
$ link                      <chr> "https://api.apis.guru/v2/specs/1forge.com/0…
$ external_docs_description <chr> NA, NA, NA, NA, NA, NA, "API Documentation",…
$ external_docs_url         <chr> NA, NA, NA, NA, NA, NA, "https://www.abstrac…
# Resumen de las columnas numéricas (si las hubiera)
summary(apisguru_apis)
     name             version              added                    
 Length:2529        Length:2529        Min.   :2015-06-11 00:06:11  
 Class :character   Class :character   1st Qu.:2018-03-10 10:08:28  
 Mode  :character   Mode  :character   Median :2020-02-28 16:47:57  
                                       Mean   :2019-11-20 11:52:53  
                                       3rd Qu.:2021-02-07 16:13:22  
                                       Max.   :2023-04-20 23:20:25  
    updated                    swagger_url        openapi_ver       
 Min.   :2016-04-10 23:18:20   Length:2529        Length:2529       
 1st Qu.:2019-07-25 10:27:32   Class :character   Class :character  
 Median :2021-02-07 16:23:46   Mode  :character   Mode  :character  
 Mean   :2021-01-17 07:49:56                                        
 3rd Qu.:2023-03-06 07:12:59                                        
 Max.   :2023-04-21 23:18:02                                        
     link           external_docs_description external_docs_url 
 Length:2529        Length:2529               Length:2529       
 Class :character   Class :character          Class :character  
 Mode  :character   Mode  :character          Mode  :character  
                                                                
                                                                
                                                                
# Asegurarte de que 'added' es un formato de fecha
apisguru_apis <- apisguru_apis %>%
  mutate(added_year = year(added)) # Extraer el año de la fecha

# Contar cuántas APIs se añadieron cada año
apis_by_year <- apisguru_apis %>%
  count(added_year) %>% # Cuenta las ocurrencias de cada año
  arrange(added_year) # Ordena por año

# Ver el resultado
print(apis_by_year)
# A tibble: 9 × 2
  added_year     n
       <dbl> <int>
1       2015    73
2       2016    62
3       2017   355
4       2018   451
5       2019   192
6       2020   538
7       2021   548
8       2022    47
9       2023   263
# Contar cuántas APIs hay en cada categoría
category_counts <- api_categories %>%
  count(apisguru_category, sort = TRUE) # sort = TRUE ordena de mayor a menor

# Ver el resultado
print(category_counts)
# A tibble: 42 × 2
   apisguru_category     n
   <chr>             <int>
 1 cloud               955
 2 media               340
 3 open_data           318
 4 analytics           284
 5 developer_tools     168
 6 ecommerce            78
 7 financial            72
 8 messaging            62
 9 entertainment        61
10 telecom              60
# ℹ 32 more rows
ggplot(apis_by_year, aes(x = added_year, y = n)) +
  geom_col(fill = "steelblue") + # geom_col para gráficos de barras con conteos
  labs(title = "Número de APIs Añadidas a apis.guru por Año",
       x = "Año de Adición",
       y = "Número de APIs") +
  theme_minimal() # Un tema de gráfico limpio

ggplot(category_counts %>% head(10), aes(x = reorder(apisguru_category, n), y = n)) +
  geom_col(fill = "lightgreen") +
  coord_flip() + # Voltea las coordenadas para que las etiquetas sean más legibles
  labs(title = "Top 10 Categorías de APIs más Comunes",
       x = "Categoría de API",
       y = "Número de APIs") +
  theme_minimal()

#other

joined_data <- apisguru_apis %>%
  inner_join(api_categories, by = "name")

joined_data <- joined_data %>%
  mutate(
    added_year = year(as_datetime(added))
    )

glimpse(joined_data)
Rows: 2,783
Columns: 11
$ name                      <chr> "1forge.com", "1password.com:events", "1pass…
$ version                   <chr> "0.0.1", "1.0.0", "1.5.7", "6", "1.1.0", "1.…
$ added                     <dttm> 2017-05-30 08:34:14, 2021-07-19 10:17:09, 2…
$ updated                   <dttm> 2017-06-27 16:49:57, 2023-02-27 15:08:09, 2…
$ swagger_url               <chr> "https://api.apis.guru/v2/specs/1forge.com/0…
$ openapi_ver               <chr> "2.0", "3.0.0", "3.0.2", "3.0.0", "3.0.1", "…
$ link                      <chr> "https://api.apis.guru/v2/specs/1forge.com/0…
$ external_docs_description <chr> NA, NA, NA, NA, NA, NA, "API Documentation",…
$ external_docs_url         <chr> NA, NA, NA, NA, NA, NA, "https://www.abstrac…
$ added_year                <dbl> 2017, 2021, 2021, 2017, 2019, 2021, 2021, 20…
$ apisguru_category         <chr> "financial", "security", "security", "securi…
category_year_counts <- joined_data %>%
  group_by(added_year, apisguru_category) %>%
  summarise(n_apis = n(), .groups = 'drop') %>%
  #filter(added_year  2022) %>%  
  arrange(added_year, desc(n_apis)) 
# Identificar las top N categorías para enfocarse en las más relevantes
top_categories <- category_year_counts %>%
  group_by(apisguru_category) %>%
  summarise(total_n_apis = sum(n_apis), .groups = 'drop') %>%
  top_n(10, total_n_apis) %>% # Seleccionar las 10 categorías con más APIs en total
  pull(apisguru_category) # Extraer solo los nombres de las categorías

# Filtrar los datos para incluir solo estas top categorías
filtered_category_data <- category_year_counts %>%
  filter(apisguru_category %in% top_categories)

# Graficar las tendencias de las top categorías a lo largo del tiempo
ggplot(filtered_category_data, aes(x = added_year, y = n_apis, color = apisguru_category)) +
  geom_line(linewidth = 1) + # Usar geom_line para tendencias
  geom_point(size = 2) +    # Añadir puntos para cada año
  labs(
    title = "Número de APIs Añadidas por Año para las Categorías Principales",
    x = "Año de Adición",
    y = "Número de APIs Añadidas",
    color = "Categoría de API"
  ) +
  theme_minimal() +
  scale_x_continuous(breaks = unique(filtered_category_data$added_year)) + # Asegurar que se muestren todos los años
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas para legibilidad

# Puedes usar los mismos filtered_category_data de antes o seleccionar categorías específicas
ggplot(filtered_category_data, aes(x = added_year, y = n_apis)) +
  geom_col(fill = "darkred") + # O geom_line, según prefieras
  facet_wrap(~ apisguru_category, scales = "free_y", ncol = 2) + # Crea un panel para cada categoría
  labs(
    title = "Número de APIs Añadidas por Año por Categoría",
    x = "Año de Adición",
    y = "Número de APIs Añadidas"
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(face = "bold"), # Estilo para los títulos de las facetas
    axis.text.x = element_text(angle = 45, hjust = 1)
  )