Todas las entradas de: rvaquerizo

Truco Excel. Producto cartesiano de dos campos

Hacía tiempo que no ponía trucos en Excel y hoy os traigo un truco que puede ser de utilidad cuando tienes que hacer combinaciones. Se trata de realizar el producto cartesiano mediante una macro de Excel, además os pongo el enlace al propio Excel para que podáis rellenar los campos a cruzar. No creo que haga falta describir que es un producto cartesiano de dos campospero de forma resumida se puede decir que es crear el total de pares de esos dos campos, un todos con todos, es útil cuando quieres hacer combinaciones (como ya he dicho). La macro en Visual Basic se podrá hacer mejor, pero a mi se me ha ocurrido hacer un triple bucle, probablemente se pueda hacer con n campos pero si tenéis que realizar productos cartesianos más complejos es preferible que lo hagáis con otra herramienta. El código empleado es este:

Sub ProductoCartesiano()
    
L1 = Range(Range("A2"), Range("A2").End(xlDown)).Rows.Count
L2 = Range(Range("B2"), Range("B2").End(xlDown)).Rows.Count

Cells(1, 4) = Cells(1, 1)
Cells(1, 5) = Cells(1, 2)

i = 2
j = 1


While i <= L1 * L2
While j <= L1
k = 1
While k <= L2

Cells(i, 4) = Cells(j + 1, 1)
Cells(i, 5) = Cells(k + 1, 2)

k = k + 1
If k > L2 Then j = j + 1
i = i + 1

Wend
Wend
Wend
End Sub

Nada emocionante pero tiene su “talento”. Si no queréis complicaros la vida directamente podéis descargar del siguiente enlace la hoja del cálculo que realiza este proceso:

Producto_cartesiano_excelV0

Saludos.

El desarrollo de la Inteligencia Artificial, un paralelismo con el desarrollo de la aviación

Estoy en el claustro de profesores del Máster de la UNED en Big Data y Business Analytics y revisando la documentación, las clases teóricas y las clases prácticas he decidido incluir una diapositiva que establece un paralelismo entre el desarrollo de la Inteligencia Artificial (IA) y el desarrollo de la aviación. Este paralelismo se me ocurrió tras una conversación con una de esas personas que trabajan en este negocio y son íntegras y honradas [empezamos a quedar pocos]. El caso es que he añadido la siguiente imagen en la formación:

A ver, mi trabajo no es hacer diapositivas bonitas. Planteo un paralelismo que, en mi opinión, describe lo que estamos viviendo ahora. Me ahorro a Da Vinci, la Edad Media y los inicios, estamos más avanzados, tenemos Python… El caso es que podemos hacer nuestros primeros trabajos, estamos en disposición de planear, algunos estamos diseñando parapentes para tirarnos por las colinas y otros ya tienen aviones, aviones como los que hicieron los Hermanos Wright, con mucho esfuerzo vuelan. Seguramente en los ámbitos más avanzados estarán trabajando los primeros aviones de guerra como sucedió en la Primera Guerra Mundial. Igual que en la IA, la mayoría estamos agitando los brazos y dando saltitos al tiempo que decimos “mira como hago IA”, hay proyectos donde ya vuelan pero el coste para levantar el vuelo es mucho. Y por supuesto, en el ámbito armamentístico quizá se estén dando los primeros pasos en verdadera Inteligencia Artificial. Es inherente al hombre destruirse por eso imagino que en la Defensa es donde estarán los proyectos más avanzados.

Estos primeros proyectos generarán otros de mayor tamaño que se podrán empezar a utilizar comercialmente por aquellos que dispongan de más m€dio$ como los primeros bombarderos de la segunda guerra mundial que fueron la semilla de la aviación comercial. Sin embargo, necesitamos ese gran invento, ese gran desarrollo para que esto empiece a funcionar y se pueda democratizar, como sucedió con la aparición del avión a reacción, ese, desde mi ignorante punto de vista, es el giro copernicano en la historia de la aviación. En el caso de la IA podría tratarse de la computación cuántica porque a día de hoy con bits, con 010100100010101111 los tensores sólo pueden hacer aviones como los hizo Oscar Wright o buenos aviones de combate si ponemos medios. Con los 01010111 a un tensor le cuesta una cuadrilla de peones mejorar a un cálculo matricial.

Al final todos estos desarrollos se tienen que transformar en dinero, como la aviación empezó a usar la aviación comercial, al principio serán unos pocos privilegiados y luego se democratizará como está pasando con el precio de los billetes de avión que han bajado su precio (ajustado a inflación) un 50% desde 1980. Después, cuando la AI empiece a funcionar, todos tendremos un teclado basado en IA y nos moveremos en coches autónomos y construiremos aberraciones como el Airbus A380 que no irán a ningún sitio.

Con esta opinión no estoy diciendo que no se invierta, al contrario, es necesario invertir para obtener un uso comercial, con esta opinión estoy alertando. No dejéis que os vendan transbordadores espaciales, que el negocio empieza a oler a humo.

¿Qué nos pasa con R? (de nuevo)

Hace años ya sorprendió R situándose muy arriba en la lista tiobe de lenguajes de programación subió en los años siguientes y ahora nos encontramos con una sorprendente bajada en el índice:

¿Volvemos a tener complejo por usar R? A veces tengo la sensación de que no eres un “pro” si no usas Python. Debe ser que determinados framework funcionan mejor en otros lenguajes, o no, pero nos da vergüenza usar R (de nuevo).

Longitud de las frases del Quijote con #rstats

Siempre he querido hacer cosas con Rstats y el Quijote y ayer se me ocurrió medir la longitud de las frases del Quijote y crear un histograma que describa esta longitud. Aunque confieso que no me lo he leído, me he quedado en el capítulo 7 u 8 (no recuerdo) el caso es que me pareció hipnótico con sus ritmos, es musical. Además tengo muchas ganas de meter mano al proyecto Gutemberg porque esos ritmos, esa musicalidad, el uso de palabras esdrújulas,… me llama la atención.
Bueno, al lío, todo el código está subido al repositorio por si lo queréis, pero hay algunas funciones y algunas ideas que me parecen interesantes.

library(dplyr)
library(ggplot2)
library(plotly)

#Leemos el fichero desde proyecto Gutemberg
ubicacion <- "https://www.gutenberg.org/cache/epub/2000/pg2000.txt"
quijote <- read.table (ubicacion,sep="\r", encoding="UTF-8")
quijote <- data.frame(quijote)
names(quijote) <- 'linea'

#Transformaciones e identificar el inicio del libro.
quijote <- quijote %>%
  mutate(linea = toupper(linea),
         inicio = grepl("EN UN LUGAR DE LA MANCHA",linea)>0)

Leemos directamente un txt desde Gutemberg y prefiero transformarlo en data frame para usar dplyr. Todas las palabras las pongo en mayúsculas e identifico donde empieza el Quijote, para evitar prólogos y demás. Ya tengo unos datos con los que poder trabajar:

#Marcamos lo que vamos a leer
desde <- which(quijote$inicio)
hasta <- nrow(quijote)

#Texto de trabajo
texto <- quijote[desde:hasta,1]

#El texto lo transformamos en una lista separada por espacios
texto_split = strsplit(texto, split=" ")

#Deshacemos esa lista y tenemos el data.frame
texto_col = as.character(unlist(texto_split))
texto_col = data.frame(texto_col)
names(texto_col) = 'palabra'

En este caso los datos los quiero de tal forma que disponga de un data frame con una sola variable que sea cada palabra del Quijote. Ahora voy a medir las frases identificando donde hay puntos en esas palabras:

#Identificamos donde tenemos puntos y un autonumérico del registro
texto_col <- texto_col %>% filter(!is.na(palabra)) %>%
  mutate(punto = ifelse(grepl('.',palabra,fixed=T),"FIN","NO"),
         posicion = row_number())

¿Qué se me ha ocurrido? Trabajar con autonuméricos, tengo identificados los puntos, ahora tengo que fijar una posición inicial y una posición final:

#Si unimos las posiciones con puntos con lag podemos calcular la longitud
pos_puntos1 <- filter(texto_col,punto=="FIN") %>% 
  select(posicion) %>% mutate(id = row_number())

pos_puntos2 <- pos_puntos1 %>% mutate(id = id + 1) %>%
  rename(posicion_final = posicion)

pos_puntos <- left_join(pos_puntos1,pos_puntos2) %>%
  mutate(longitud = ifelse(is.na(posicion_final), posicion, posicion - posicion_final))

Como no soy un tipo muy brillante opto por una opción sencilla de cruzar una tabla consigo misma, como me ponen los productos cartesianos “con talento”. La idea es seleccionar solo los registros que marcan el final de la frase, un autonumérico me marca cual es cada frase, ahora si hago una left join por el id de la frase y el id + 1 de la frase creo una especie de lag. La longitud de la frase será donde está el punto menos donde estaba el final de la anterior frase. Creo que me he explicado de pena, pero si veis el data frame final lo entenderéis mejor. Ahora ya pinto un histograma:

#GRaficamos la longitud
plot_ly(data = pos_puntos, x = ~longitud, type = "histogram") %>%
  layout(title = "Longitud de las frases del Quijote",
         xaxis = list(title = "Longitud"), yaxis = list(title = ""))

Y queda una gamma perfecta, yo diría que hasta bonita. Ahora quedaría identificar los parámetros de esta gamma y compararlos con otros libros, e incluso comparar lenguas. Pero esas tareas se las dejo a los “buenos”.

Ya no nos interesa el GDPR

GDPR en Google Trends un pico en mayo de 2018 y desaparece el interés. Será porque todas las compañías se han adecuado a ese marco general legislativo y no es necesario trabajar más en ello o será porque seguimos en modo “preproducción”. En cualquier caso es probable que esta legislación haya nacido anticuada, es probable que no la hayamos entendido e incluso es probable que no sea necesaria. 

Y recuerda, legislar también nos cuesta dinero. 

Gráfico con eje secundario en ggplot2

Los gráficos con eje secundario o con dos ejes son un tema que ya he puesto en el blog en varias ocasiones, hay un ejemplo con R que tenía sus problemas y hay un ejemplo con Python y matplotlib que particularmente me gusta por elegancia y sencillez. En esta entrada vamos a repetir el ejercicio y vamos a realizar un gráfico de columnas y líneas con 2 ejes, primario y secundario pero con ggplot2. Este tipo de gráficos son muy utilizados por los actuarios para representar frecuencias o siniestralidades y exposición. Para ilustrar el ejercicio vamos a emplear los mismos datos que usamos en el ejemplo con matplotlib pero vemos paso a paso como realizaríamos el gráfico Seguir leyendo Gráfico con eje secundario en ggplot2

Trucos simples para #rstats

En mi cuenta de twitter suelo poner algunos trucos sencillos de R, cosas que me surgen cuando estoy trabajando y que no me cuesta compartir en 2 minutos, por si puedo ayudar a alguien. Me acabo de dar cuenta que de verdad son útiles y que tenerlos en twitter desperdigados es un problema, así que he pensado en recopilarlos en una entrada del blog para que sea más sencillo buscarlos (incluso para mi). Aquí van algunos de esos trucos Seguir leyendo Trucos simples para #rstats

Muestrear no es pecado

Hace unos días que nació la web de Jose Luis Cañadas y ya está añadida a los enlaces de AyD, desde aquí nos hacemos eco de esta nueva bitácora:

https://muestrear-no-es-pecado.netlify.com/

Seguiremos muy de cerca a JL porque es un tipo de esos que merece ser escuchado por como mezcla pragmatismo y rigor dos de las principales características que tienen que tener los científicos de datos y que últimamente están vilipendiadas.

Las mujeres son más inteligentes pero no están en puestos directivos

A raíz de una noticia sobre la reestructuración del consejo directivo de un gran banco en España donde sólo una mujer ha sido elegida entre los 12 puestos de dirección general me ha surgido la oportunidad para explicar que es una distribución de probabilidad, que es una distribución normal y que es la media y la desviación típica.

Aquí tenéis en python un código que simula el IC de los hombres y el IC de las mujeres, no me he complicado mucho la vida ni he buscado datos al respecto pero leyendo un poco creo que deben de parecerse mucho a esto:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

hombres = np.random.normal(loc=60, scale=32, size=10000)
mujeres = np.random.normal(loc=70, scale=25, size=10000)

p1=sns.kdeplot(hombres, shade=True, color="r")
p1=sns.kdeplot(mujeres, shade=True, color="b")
sns.plt.show()

Bonito gráfico de densidades con varias variables hecho con seaborn y kdeplot de sintaxis sencilla que pone de manifiesto con unos datos simulados (con cierto talento) que en media la mujer es un 15% más inteligente que el hombre, pero la dispersión de la inteligencia del hombre es mayor, o como le he dicho a la persona que le he explicado que es la distribución normal, hay hombres muy tontos y hombres muy listos, muchos más que mujeres muy tontas y mujeres muy listas; así es la biología.

Pero ya os digo yo que la relación de hombres/mujeres inteligentes no es 1/12, así que esa importante entidad bancaria no está tomando decisiones correctas. Ellos verán lo que hacen pero no ha sido una medida inteligente, probablemente porque la ha tomado un hombre.