miércoles, 21 de noviembre de 2018

Identificar genero de un nombre


El siguiente script identifica el genero de un nombre dado, utilizando una lista de nombres+genero. Los valores que devuelve son: {m, f, a}, correspondientes a masculino, femenino o ambiguo.

La lista contiene más de 46mil nombres + genero, unificados de las siguientes fuentes:
  • Lista de nombres de la librería nltk
  • Lista nombres de la librería gender_guesser
  • Lista de nombres argentinos publicados aqui

También se hicieron otras modificaciones para nombres hispanos, como borrar apellidos, agregar diminutivos, nombres cortos, alias, entre otros.

R script:
libs<-c('tm','stringi')
lapply(libs,require, character.only= TRUE)

# FUNCIONES ------------------------------
clean_txt <- function(txt){
   txt <- stri_trim(gsub('[[:punct:][:digit:] ]+',' ',tolower(txt)))
    return(strsplit(txt, " ")[[1]])
}

get_gender2 <- function(nombre, lista_nombres="") {
  nombre <- clean_txt(nombre)
  nombre <- subset(nombre, nombre %in% lista_nombres)
  mylist <- list()
  mylist[c("f", "m","a")] <- 0
  for (i in 1:length(nombre)){
    g <- as.character(df[which(df$nombre == nombre[i]),"genero"])
    g <- ifelse(identical(g, character(0)), 'a', g)
    if(i==1){
    mylist[[g]] <- mylist[[g]] + 2
    } else{
    mylist[[g]] <- mylist[[g]] + 1
    }
  g2 = sapply(mylist, function(x) x[which.max(abs(x))])
  return(names(g2[g2==max(g2)])[1])
  }
}

# DATOS ---------------------------------
path <- 'https://www.dropbox.com/s/edm5383iffurv4x/nombres.csv?dl=1'
df <- read.csv(path, sep=",",  colClasses = "character")
get_gender2("jose maria altagracia", df$nombre)

lunes, 12 de febrero de 2018

Estadisticas de un Texto

El siguiente script calcula estadísticos y métricas de palabras en un texto. La mayoría de estas métricas provienen de otras publicaciones (ver Referencia 1 a 5).

Conceptualmente seria así:


DESCRIPCION DE METRICAS
chr_len: Cantidad de palabras únicas
chr_rt: Total de letras / Total caracteres
chr_max: Cantidad de letras de la palabra mas larga
chr_min: Cantidad de letras de la palabra mas corta
chr_avg: Cantidad de letras promedio de las palabras
chr_std: Desviación estándar de cantidad de letras de las palabras
chr_unq_rt: Cantidad palabras únicas / Total de palabras
chr_rep_rt: Cantidad de palabras repetidas/ Total de palabras
chr_upp_rt Cantidad de palabras mayúsculas / Total de palabras
chr_cpt_rt: Cantidad de palabras CapitalCases / Total de palabras
chr_cpt_ini: Tendrá valor 1 si la primera palabra es CapitalCases, sino 0
chr_tkn_qty: Cantidad de letras en el texto
chr_vcl_rt: Total de vocales / Total de letras
chr_pnt_rt: Cantidad de signos puntuación / Total de palabras
chr_1gram_rt: Cantidad de palabras de una letra / Total de palabras
chr_2gram_rt: Cantidad de palabras de dos letra / Total de palabras
chr_3gram_rt: Cantidad de palabras de tres letra / Total de palabras
chr_4gram_rt: Cantidad de palabras de cuatro letra / Total de palabras
chr_Lgram_rt: Cantidad de palabras con mas de ocho letras / Total de palabras

domingo, 31 de diciembre de 2017

Regresion Logistica de R a Qlik

Si se tiene una regresión logistica entrenada en R y se quiere predecir casos nuevos en un ambiente Qlik, se pueden extraer los coeficientes de R y calcular la probabilidad en Qlik.

El siguiente ejemplo ajusta un modelo glm con el dataset titanic. Luego crea una función que devuelve el script Qlik para calcular la probabilidad. Esta función solo sirve si todas las variables son numéricas.

Nota: Para detalles sobre regresión logística, ver nota publicada  AQUI.


Conceptualmente seria así:




















domingo, 2 de abril de 2017

Apuntes sobre Data Table

La libreria "data.table" ofrece una "versión mejorada" de los Data Frame. Una de las mayores ventajas es que los Data Table ocupan 10 veces menos espacio que los Data Frame.  Otra ventaja es la mejora en los tiempos de ejecución para leer y escribir un csv, hacer group by, ordenar una tabla, entre otras funciones.

Los Data Table pueden ser utilizados como Data Frame.  Si se hace un class(miTabla) de un data.table se imprime una lista con dos valores: "data.table" "data.frame", identificando que los objetos Data Table también pueden ser considerados como Data Frame  y las librerías que solo usan Data Frame no tendrían problemas al usar Data Table.

En el blog de Jan Gorecki (ver referencia Nro.4) se hace una comparación de eficiencia de los data.table. Se pueden destacar estas funciones, en linea roja las pertenecientes a la libreria data.table:



Para mas detalles sobre data.table, ver referencias.

domingo, 6 de noviembre de 2016

Text Mining con Twiter

El siguiente ejemplo utiliza textos de twitter clasificados previamente como POS, NEG o SEM para predecir si un tweet es positivo, negativo o imparcial sobre Amazon. La técnica usada para representar el texto es bag-of-words, donde se mide la aparición de la palabra y no su orden. Estos tweets fueron copiados de la cuenta pública de @amazon.

NOTAS:
Para mismo ejemplo en PYTHON, ver nota publicada AQUI
El excel con las imágenes se puede descargar AQUI
Para este ejemplo se utilizó la libreria tm_0.6-2

El proceso general sigue estos pasos:

1. Cargar Datos
Para este ejemplo, los datos se cargan de un archivo csv en Dropbox, el cual tiene dos columnas: el texto y la clase a predecir. Conceptualmente queda así:












2. Crear Corpus
El corpus es un conjunto de documentos, que pueden ser artículos periodísticos, noticias, currículos, tweets, chat, o cualquier colección de textos que se vaya a utilizar para predecir/clasificar. En este ejemplo se usan tweets, y la columna "texto" del csv será el corpus.

Una forma de crear el corpus en R es usando la libreria tm de la siguiente forma:
- Crear un objeto VectorSource que será el origen de datos que luego se utiliza para crear un corpus volatil o vcorpus
- Crear un objeto VCorpus que es un corpus que se guarda en memoria, con lo cual es volatil. En este objeto se considera cada observación (tweet para este ejemplo) como un documento. El origen de datos para crear un vcorpus siempre será un VectorSource.
Para detalle sobre estos objetos, ver Referencia No.2

Conceptualmente seria así:












3. Limpiar Corpus
Luego que se tiene el VCorpus, se procede "limpiar" el corpus de la siguiente forma:
- Se sustituyen los signos de puntuación por espacios (replacePunctuation)
- Se eliminan los numeros (removeNumbers)
- Se elimina el doble espacio (stripWhitespace)
- Se convierte en minúscula todas las palabras (tolower)
- Se sustituyen algunas palabras abreviadas (stri_replace_all_fixed)
- Se transforma en documento plano (PlainTextDocument). Esto para cuando se usan funciones que no retornan un TextDocuments. Para detalle ver Ref. Nro 3
- Se eliman los sufijos de las palabras usando el algoritmo PorterStemmer (stemDocument). Para detalle ver referencia Nro. 4
- Se eliminan palabras sin significados, como pronombres, preposiciones, etc. usando el stopwords o lista de palabras que trae la libreria tm (removeWords). Para detalle ver referencia Nro. 4

Conceptualmente sería asi:















domingo, 3 de julio de 2016

Analisis de Componentes Principales


El Análisis de Componentes Principales (ACP o PCA en ingles) es una técnica de reducción de la dimensionalidad que busca extraer toda la información de un data set en unas pocas variables no correlacionadas entre si.

La información puede considerarse como la cantidad de grados de libertad que tiene “una vaiable”, y la varianza puede ser una medida que nos de una aproximacion de qué tanta información tiene una variable. Conceptualmente seria así:





















Los componentes principales de un data set de dos variables seria algo así:















sábado, 9 de abril de 2016

Agregar variables de PCA

Una forma de redefinir las variables  es usar Analisis de Componentes Principales (o PCA por Principal Component Analysis), que es una combinación lineal de las variables originales que busca resumir todas las variables en unas pocas variables combinadas. Muchas veces, agregar los componentes principales al data set mejora los resultados de los algoritmos predictivos, ya que se agrega otra representacion de los datos, donde las variables del PCA representan un hiperplano ortogonal, es deecir, variables no correlacionadas entre si. Para detalle del PCA ver nota y referencias publicadas AQUI.

El siguiente script calcula los componentes principales de un data set, y agrega únicamente los componentes principales para tener el 99% de la proporción de la variabilidad.

Conceptualmente seria así:






















....

lunes, 28 de marzo de 2016

Transformar variables usando Box-Cox

Si se tiene un data set con variables que no tienen una distribución normal, y se quiere transformar esas variables para obtener mayor información de ellas, una forma es usar la transformación de box-cox, que busca un valor "lambda" para elevar la variable hasta encontrar la desviaciones estándar más cercana a cero, y así obtener una nueva variable con una distribución más "normal". Para detalles de box-cox ver referencia.

Conceptualmente las transformaciones quedan así:












 y el data set queda así:


domingo, 13 de marzo de 2016

Binarizar variables continuas

El siguiente script transforma las variables continuas en múltiples variables binarias (0,1) que indican a qué cuartil pertenece la observación para cada variable.
Esto para usar en algoritmos (como las redes neuronales) que aprenden mas rápido con datos binarizados.
NOTA: En algunas situaciones esto puede significar una perdida de información, para detalle sobre esto ver referencias 1 y 2.

Usando el data set iris, conceptualmente queda así:













viernes, 25 de diciembre de 2015

Regresion con Red Neuronal


El siguiente script utiliza el package neuralnet para hacer una regresión y predecir el valor de viviendas (expresado en \$1000), usando el data set Boston incluido en el package MASS.

Para un mejor ajuste del modelo (es decir, para que la red aprenda mejor), se hace un preprocesamiento de los datos, donde se normaliza el data set, quedando así: