• Publicado: 02 Nov 2015

  • Archivado en: general, datascience

Como revisar las descargas de paquetes de R

Siempre es bueno tratar de medir la popularidad de los paquetes en R, pero cuando tienes la perseverancia de subir uno a CRAN, te importa mucho más.

Siguiendo algunos artículos en línea, decidí intentar hacer esto con inegiR.

El tema es complicado por que en R no hay un respositorio “madre” sino que todo se distribuye por medio de “espejos” de servidores que tienen diferentes lugares (por ejemplo en México el ITAM o UNAM). Este artículo en el blog de Rstudio lo explica bastante bien.

Por fortuna, Rstudio hizo un buen ejercicio de guardar registro de todas las descargas en su espejo y hacerlo público, lo que en este caso me ayudó para lo que quería medir.

Les dejo la explicación por si alguna vez tienen la misma duda.

Espejo RStudio

Los logs los guardan en este sitio: http://cran-logs.rstudio.com/ con un archivo por cada día.

Por lo tanto, primero tenemos que decidir las fechas a descargar:

start <- as.Date('2015-10-22')
today <- as.Date('2015-10-31')

Vamos a llenar un objeto con todos los días entre esos dos que defini previamente:

all_days <- seq(start, 
                today, by = 'day')
year <- as.POSIXlt(all_days)$year + 1900

Obtenemos un URL por cada día, siguiendo el mismo formato del sitio:

urls <- paste0('http://cran-logs.rstudio.com/', year, '/', all_days, '.csv.gz')

Descarga y limpia

Usamos download.file para descargar a un directorio que creamos o que ya existe..

# si no existe... 
dir.create("CRANlogs")

Descarga de archivos

# Loop para bajar todos
for (i in 1:length(all_days)) {
  download.file(urls[i], 
                paste0('CRANlogs/', 
                        all_days[i], 
                        '.csv.gz'))
}

Una vez descargados, los vamos a importar a R, haciendo una data.table con rbind y agregando algunas modificaciones a las columnas y llaves únicas:

# lista de files...
file_list <- list.files("CRANlogs", full.names=TRUE)

logs <- list()

# loop para importar todos los archivos... 
for (file in file_list) {
  print(paste("Importando", file, "..."))
  logs[[file]] <- read.table(file, 
                             header = TRUE, 
                             sep = ",", 
                             quote = "\"",
                             dec = ".", 
                             fill = TRUE, 
                             comment.char = "", 
                             as.is=TRUE)
}

# rbind para juntar todas...
library(data.table)
dat <- rbindlist(logs)

# agregamos varias definiciones y limpiamos dataset
dat[, date:=as.Date(date)]
dat[, package:=factor(package)]
dat[, country:=factor(country)]
dat[, weekday:=weekdays(date)]
dat[, week:=strftime(as.POSIXlt(date),format="%Y-%W")]

# indicador unico
dat[, key:=paste0(package,"_",date,"_",week,"_",ip_id)]

# a data frame
# para manipular con dplyr
df <- as.data.frame(dat)

Analizar

Ya que tenemos un data set limpio y listo para analizar, hice una simple gráfica…

# gráfica de downloads
library(ggplot2)
library(dplyr)
library(eem)

if(length(unique(df$country))>19){
# gráfica sin división por país
p <- ggplot((df %>% 
          filter(package == "inegiR") %>%
          group_by(date) %>%
          summarise("Count" = n())
        ), 
       aes(x = date, 
           y = Count))+
  geom_bar(stat = "identity")+
  theme_eem()+
  labs(title = "Descargas de inegiR en espejo de Rstudio", 
       x = "Fecha", 
       y = "Descargas únicas")
}else{
# gráfica con división por país
p <- ggplot((df %>% 
          filter(package == "inegiR") %>%
          group_by(date, country) %>%
          summarise("Count" = n())
        ), 
       aes(x = date, 
           y = Count, 
           fill = country))+
  geom_bar(stat = "identity")+
  theme_eem()+
    # ojo, solo hasta 20 diferentes países ... 
  scale_fill_eem(20)+
  labs(title = "Descargas de inegiR en espejo de Rstudio", 
       x = "Fecha", 
       y = "Descargas únicas")
}

# graficar objeto
plot(p)

Si tenemos un horizonte más grande de tiempo, podemos agrupar la gráfica por semana:

# gráfica de downloads
library(ggplot2)
library(dplyr)
library(eem)


p <- ggplot((df %>% 
          filter(package == "inegiR") %>%
          group_by(week) %>%
          summarise("Count" = n())
        ), 
       aes(x = week, 
           y = Count))+
  geom_bar(stat = "identity")+
  theme_eem()+
  labs(title = "Descargas de inegiR en espejo de Rstudio", 
       x = "Fecha", 
       y = "Descargas únicas")

plot(p)

Como el paquete inegiR es nuevo, hice solamente una gráfica por día y el resultado es el siguiente:

Grafica de descargas inegiR