Tratamiento y procesado de imágenes con R y `magick`

Estoy preparando la batalla entre geometría e inteligencia artificial, batalla que está perdida porque tengo que dar de comer a mis chavales y, si tengo que ir a vender un producto, queda más comercial contar lo que se supone que hace la inteligencia artificial y no contar lo que hacen vectores, direcciones, puntos en el espacio… eso lo cuentan en la educación secundaria y no es “disruptivo”. Sin embargo, aprovecho para contar historia del abuelo: el único proyecto serio basado en inteligencia artificial en el que he estado involucrado se resolvió gracias a la geometría y a las mejoras que se propusieron en el reconocimiento óptico; las redes convolucionales nos provocaron un problema. Inicialmente es mejor plantear una solución sencilla. ...

1 de septiembre de 2020 · rvaquerizo

Expandir un data frame de R con tidyr

En alguna entrada del blog ya he tratado sobre la expansión de un conjunto de datos, pero quería tener una entrada específica. Es algo que se puede programar mediante bucles (tarda una vida) o bien podemos usar la función expand del paquete tidyr. Viendo un ejemplo y los conjuntos de datos generados, vais a entender el propósito de la expansión de tablas: se trata de un inicio y un fin, y deseamos que se genere una secuencia de observaciones sucesivas dado ese inicio y ese fin. A modo de ejemplo ilustrativo: ...

13 de agosto de 2020 · rvaquerizo

Optical Character Recognition (OCR) con R y tesseract

Una pincelada sobre Optical Character Recognition con R. El paquete tesseract de R permite aplicar el reconocimiento óptico de caracteres con R de una forma bastante sencilla; es uno de los múltiples líos en los que me estoy metiendo; si llega a buen puerto, pondré más. Tenemos esta imagen: Necesitamos tanto el paquete tesseract como el magick y, ejecutando en R: library(tesseract) library(magick) img <- image_read("/images/2020/06/prueba_OCR.png") str(img) cat(image_ocr(img)) El resultado del OCR es el siguiente: ...

15 de junio de 2020 · rvaquerizo

Latent semantic analysis y la importancia de las matemáticas

Vivimos «días extraños», tan extraños que in España se están planteando prescindir de la asignatura de matemáticas en la enseñanza obligatoria. Es evidente que las personas que gobiernan hoy (25/05/2020) España habrían suspendido matemáticas. Sin embargo, es curioso que haya pocos matemáticos ejerciendo cargos políticos, ¿puede ser que los matemáticos no tengan esa vocación por mejorar la vida de los demás? En fin, esta crítica a la ignorancia numérica y al egoísmo matemático me sirve de «extraña introducción» al Latent Semantic Analysis (LSA); como siempre, los aspectos teóricos los podéis encontrar in otros sitios. Y todo este conjunto de frases inconexas hilan con la entrada en el blog de mi amigo J.L. Cañadas in Muestrear no es pecado porque reducción de dimensionalidad, el lenguaje y la importancia de las matemáticas es, in realidad, el Latent Semantic Analysis. ...

27 de mayo de 2020 · rvaquerizo

Identificar los municipios costeros y limítrofes de España con R

Otro ejercicio con spatial data, R y data science para el trabajo con objetos espaciales. El tema que traigo hoy puede ser útil para aquellos que, dado un spatial data, tienen que identificar los polígonos que bordean ese objeto; en este caso vamos a identificar los municipios que bordean España (ya sean limítrofes con Francia y Portugal o municipios costeros). No se plantean algoritmos complicados; como en entradas anteriores, nos centramos en la extracción de mapas de GADM. ...

27 de abril de 2020 · rvaquerizo

Mover parte de un shapefile con R. Mapa con tasa de casos de coronavirus por habitante en España

Si leéis habitualmente el blog, ya conocéis la entrada sobre el mapa del COVID por comunidades autónomas y estaréis de acuerdo conmigo en que el mapa de España representado con Rstats es feo de solemnidad. Pero el código es «sencillo»; por ahí se ve cada representación que requiere ser desarrollador de R cinturón negro. Bueno, los torpes empleamos ggplot2 con geom_polygon(), pero podemos empezar a complicar el mapa añadiendo nuevas posibilidades. La que os traigo hoy es muy interesante en el caso de España: se trata de mover las Islas Canarias en el mapa de comunidades autónomas, pero directamente con R. Ya tenemos hecho un mapa con QGIS en otra entrada, pero ahora vamos a mover esa parte del shapefile directamente con R y la función elide(), como hemos hecho en otra ocasión. ...

23 de abril de 2020 · rvaquerizo

Mi breve seguimiento del coronavirus con R

Este código es la unión de muchos de los scripts de días anteriores; es un buen ejemplo de uso de la librería gridExtra para poner múltiples gráficos en una sola salida: library(tidyverse) library(reshape2) library(gridExtra) library(lubridate) # Carga de datos de fallecidos df_raw <- read.csv("https://raw.githubusercontent.com/datadista/datasets/master/COVID%2019/ccaa_covid19_fallecidos.csv", check.names = FALSE, encoding = 'UTF-8') # Reestructuración de datos df_long <- melt(df_raw, id.vars = "CCAA", variable.name = "fecha", value.name = "fallecidos") df_long$fecha <- as.Date(as.character(df_long$fecha), format = "%Y-%m-%d") # Identificamos las regiones con más fallecidos ranking <- df_long %>% group_by(CCAA) %>% summarise(total = max(fallecidos, na.rm = TRUE)) %>% arrange(desc(total)) %>% mutate(CCAA2 = ifelse(row_number() >= 10, 'Resto', as.character(CCAA))) df_long <- left_join(df_long, ranking[, c("CCAA", "CCAA2")], by = "CCAA") # Agregamos por la nueva clasificación df_agrupado <- df_long %>% group_by(CCAA2, fecha) %>% summarise(fallecidos = sum(fallecidos)) %>% ungroup() # Cálculo del dato diario (lag manual con left_join) df_anterior <- df_agrupado %>% mutate(fecha = fecha + 1, fallecidos_anterior = fallecidos) %>% select(-fallecidos) df_final <- left_join(df_agrupado, df_anterior, by = c("CCAA2", "fecha")) %>% mutate(fallecidos_dia = fallecidos - fallecidos_anterior) # Función para generar los gráficos grafica_ccaa <- function(comunidad) { df_pinta <- filter(df_final, CCAA2 == comunidad & !is.na(fallecidos_dia)) ggplot(df_pinta, aes(x = fecha, y = fallecidos_dia)) + geom_line(alpha = 0.5, color = 'red') + geom_smooth(method = "loess", formula = y ~ x) + labs(title = comunidad, x = "", y = "Fallecidos/día") + theme_minimal() } # Generamos los objetos gráficos g1 <- grafica_ccaa('Madrid') g2 <- grafica_ccaa('Cataluña') g3 <- grafica_ccaa('Castilla-La Mancha') g4 <- grafica_ccaa('Castilla y León') g5 <- grafica_ccaa('País Vasco') g6 <- grafica_ccaa('C. Valenciana') g7 <- grafica_ccaa('Andalucía') g8 <- grafica_ccaa('Aragón') g9 <- grafica_ccaa('Resto') g10 <- grafica_ccaa('Total') # Suponiendo que 'Total' esté calculado # Composición final grid.arrange(g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, nrow = 5, ncol = 2) ...

20 de abril de 2020 · rvaquerizo

Entender una blockchain con R

Una introducción de bajo nivel (sin entrar mucho en tecnología) a los blockchain con R. Es una entrada destinada a comprender qué es un blockchain desde otro punto de vista, no sólo criptografía o criptomoneda: podemos poner información que sólo conoce el origen. ¿Os imagináis si pusieran a disposición de los científicos de datos información sobre todos los españoles identificados por NIF y si tiene o no coronavirus? Los científicos de datos podrían trabajar de forma anónima con esos datos y ayudar a establecer las zonas libres de COVID-19, persona a persona de forma perfectamente anónima. Aunque no se descarta que algún cabestro se dedicara a desencriptar… ...

9 de abril de 2020 · rvaquerizo

Datos agrupados en R con dplyr

Entrada rápida para ilustrar cómo crear un campo autonumérico por un factor; es una duda que me plantean: tienen datos de clientes y fechas y necesitan crear un autonumérico en R que les diga el número de orden de los eventos de una fecha. Algo parecido a lo que hacemos con el retain de SAS. Vamos a ilustrar la tarea con un ejemplo: library(dplyr) library(lubridate) clientes <- 100 id_cliente <- rpois(clientes, 10) fecha <- rpois(clientes, today() - rpois(clientes, 5)) eventos <- cbind.data.frame(id_cliente, fecha) eventos$fecha <- as.Date(eventos$fecha, origin = "1970-01-01") eventos <- eventos %>% arrange(id_cliente, fecha) 100 clientes que aparecen una o $n$ veces con fechas asociadas; el primer paso que sugiero hacer es eliminar duplicados con dplyr: ...

26 de marzo de 2020 · rvaquerizo

Los pilares de mi simulación de la extensión del COVID19

No debería publicar esta simulación de la extensión del COVID19 o coronavirus porque puede disparar alarmas, provocar insultos, levantar ampollas… el caso es que yo llevo 7 días de aislamiento más que el resto de España porque sólo había que ver los datos de Italia para saber lo que iba a pasar y no avise a nadie para no disparar alarmas, provocar insultos, levantar ampollas… Y AL FINAL YO TENÍA RAZÓN. Así que os voy a exponer el motivo por el cual estoy muy asustado; bueno, hoy quiero mostraros el inicio de una simulación mala y sin fundamento que estoy realizando sobre la extensión en España del COVID19. Para hacerla vamos a emplear la siguiente información: ...

23 de marzo de 2020 · rvaquerizo