Archivos de la categoría Formación

Nuevo mapa por provincias en Excel de España. Actualiza los colores en RGB

Mapa_excel_provincias_españa_nuevo

A raiz de esta entrada Otto F. Wagner me envió hace unos meses una nueva versión del conocido mapa de provincias de España en Excel y tenía pendiente subirlo a la web. La diferencia con los anteriores es que puedes elegir el color de inicio y el color de fin jugando con RGB:

Mapa_excel_provincias_españa_nuevo2

------Descarga aquí la nueva versión en formato ZIP-----------

Ajuste de splines con R

spline_R1

El ajuste por polinomios, el ajuste por spline, es una técnica imprescindible dentro de análisis actuarial. Como siempre la parte matemática y la parte debida al puro azar pueden arrojar discrepancias. ¿Dónde son mayores estas discrepancias cuando usamos métodos estadísticos clásicos? Donde siempre, donde tenemos pocos datos, el comportamiento errático que tiene una tendencia y que habitualmente achacamos a la falta de información los actuarios gustan de corregirlo con ajuste por cúbicas, aunque es mejor emplear ajuste por polinomios ya que no tienen que ser necesariamente polinomios de grado 3. En mi caso particular tengo un Excel que no puedo poner a vuestra disposición porque no lo hice yo, creo que lo hizo alguna divinidad egipcia y desde entonces circula por el mundo la función cubic_spline. Hoy quiero aprovechar el blog no solo para sugeriros como realizar splines con R, además quería pedir ayuda para crear una herramienta en shiny que permita realizar este ajuste que voy a mostraros a continuación.

Disponemos de una serie de datos, probablemente una serie de parámetros de un modelo, que tiene tendencia. Deseamos ajustar un polinomio que recoja esa tendencia y que evite por interpolación los comportamientos erráticos que tienen algunos puntos de la serie. El código de R es Sigue leyendo Ajuste de splines con R

Ejemplo de web scraping con R. La formación de los diputados del Congreso

No sabía si realizar esta entrada sobre web scraping con R o con python. He obtado por la primera opción porque en un principio era una entrada para ilustrar un ejemplo de web scraping y al final se me están ocurriendo muchas ideas sobre el análisis de la web de Congreso de los diputados y he preferido hacerla con R porque tengo una mayor soltura para hacer distintos análisis. Quería empezar por estudiar la formación que tienen nuestros 350 diputados, para ello se me ocurrió descargarme las líneas que tienen en su ficha de diputado y crear un data frame con los datos personales referentes a su formación. Si entráis en la ficha de cualquier diputado (http://www.congreso.es/portal/page/portal/Congreso/Congreso/Diputados/BusqForm?_piref73_1333155_73_1333154_1333154.next_page=/wc/fichaDiputado?idDiputado=171&idLegislatura=12) veréis que les han dejado un pequeño texto donde describen su hoja de vida. La verdad es que cada uno a escrito lo que le ha parecido pero algún patrón se puede encontrar. Para ilustrar el ejemplo he preferido usar la librería rvest porque me ha parecido una sintaxis más sencilla. Yo no soy un buen programador, incluso soy un poco desastre, hasta guarrete programando y con rvest creo que el código es bastante claro.

El procedimiento para el web scraping será el siguiente:

  1. Identificar en la web del Congreso como funciona el formulario para cambiar de diputado, es sencillo basta con ver el link y tenemos fichaDiputado?idDiputado=171&idLegislatura=12" es evidente que vamos a crear un bucle con el idDiputado.
  2. Que parte corresponde con el curriculum de cada personaje, esta parte también es sencilla, véis el código fuente y hay un bloque de contenido identificado como
    div id="curriculum" esta es la parte que nos interesa.
  3. Tenemos que limpiar con alguna función de R el HTML y el texto que estamos "escrapeando".
  4. Lo ponemos todo en un data frame por si queremos analizarlo.

Esta es la idea y se traduce en R del siguiente modo:

library(rvest)

curriculos = ""
for (dip in seq(1,350,by=1)){
url = paste0("http://www.congreso.es/portal/page/portal/Congreso/Congreso/Diputados/BusqForm?_piref73_1333155_73_1333154_1333154.next_page=/wc/fichaDiputado?idDiputado=",dip,"&idLegislatura=12")

congreso <- read_html(url)
curric <- congreso %>% 
        html_node("#curriculum") %>%
        html_text %>%
        strsplit(split = "\n") %>%
        unlist() %>%
        .[. != ""]
#Pequeña limpieza de texto
curric <- trimws(curric)  
#Elimina las líneas sin contenido
curric <- curric[which(curric!="")]
#Nos quedamos justo con la linea que hay debajo de la palabra legislaturas
linea <- curric[grep("legislatura", curric)+1]
curriculos <- rbind(curriculos,linea)}

curriculos <- data.frame(curriculos[-1])

Ya podéis ver que la elegancia programando brilla por su ausencia pero queda todo muy claro. Particularidades, para identificar la formación dentro del texto libre he seleccionado aquellas líneas que están debajo de la palabra legislaturas, no he encontrado mejor forma y soy consciente de que falla, es suceptible de mejora. La función read_html de rvest es la que lee la web, el contenido que nos interesa lo seleccionamos con html_node pero es necesario que sea un texto y por eso aparece html_text  y por último particionamos el texto en función de los /n. Con el texto más o menos formateado pasamos la función TRIMWS que se cepilla los  espacios en blanco, tabuladores y saltos de línea. Tenía que meter esta función con calzador porque me parece útil para limipar textos con R y este ejemplo ilustra el funcionamiento. Para finalizar eliminamos las líneas vacías del texto con Which. Acumulamos las líneas con la formación de cada diputado y creamos el data frame curriculos que contiene lo que ellos han escrito como su formación.

No he trabajado mucho con ello, pero podemos buscar la palabra que más se repite replicando algún código ya conocido:

palabras = strsplit(curriculos, split=" ")
palabras = as.character(unlist(palabras))
palabras = data.frame(palabras)
names(palabras) = c("V1")
palabras$V1 = sub("([[:space:]])","",palabras$V1)
palabras$V1 = sub("([[:digit:]])","",palabras$V1)
palabras$V1 = sub("([[:punct:]])","",palabras$V1)
palabras$largo = nchar(palabras$V1)
palabras = subset(palabras, largo>4)

library(plyr)
conteo = data.frame(ddply(palabras, "V1",summarise, cuenta=length(V1) ))
conteo = conteo[order(-conteo$cuenta),]

Aproximadamente el 28% de los diputados son licenciados en derecho, no veo ingenierías por ningún sitio y muchos casados y ayuntamientos... No voy a valorar lo poco que he explorado pero es evidente que nos representan personas con una experiencia profesional muy acotada en las instituciones públicas (que forma más bonita de decir personas poco productivas). Seguiré escrapeando esta web os lo prometo.

 

Truco SAS. Tablas de una librería en una macro variable

Me plantean una duda, como crear un conjunto de datos con las tablas de una librería en sas y posteriormente generar una macro variable con ellos, esta es una entrada análoga a otra del blog pero sirve para recordar como funciona el ODS de SAS y el PROC DATASETS un procedimiento que no he usado habitualmente. Lo primero que vamos a hacer es observar que resultados arroja el PROC DATASETS en su sintaxis más sencilla, ver los contenidos de una librería:

 ods trace on;
proc datasets lib=datos;
quit;
ods trace off;

Recordamos que ODS (Output Delivery System) TRACE ON nos permite ver en la log de SAS los elementos que se obtienen como resultado, en este caso, el más sencillo, tenemos:

Output Added:
-------------
Name: Directory
Label: Directory Information
Template: Base.Datasets.Directory
Path: Datasets.Directory
-------------

Output Added:
-------------
Name: Members
Label: Library Members
Template: Base.Datasets.Members
Path: Datasets.Members
-------------

Evidentemente nos interesa Members para poner en una tabla SAS todos los miembros de la librería:

ods output Members=tablas;
proc datasets lib=datos ;
quit;

Ahora tenemos que meter en una macrovariable todos los elementos del campo name de la tabla SAS que hemos generado. Para ello en vez de emplear el habitual PROC SQL podemos usar una concatenación sobre los valores de name que diera como resultado final la macrovariable con la lista de las tablas: Sigue leyendo Truco SAS. Tablas de una librería en una macro variable

Mover elementos de un mapa con QGIS. Ejemplo mover Canarias

Para modificar shapefile estaba acostumbrado a usar R, sin embargo, poco a poco estoy usando más QGIS para este tipo de tareas. Lo primero que tengo que comentaros es que no sé QGIS, no tengo ni idea, lo uso sólo para visualizar mapas porque es más cómodo que R pero poco a poco me estoy acostumbrando a usarlo. Hoy quería mostraros como he realizado una tarea muy habitual cuando hacemos mapas de España, mover las Islas Canarias para que queden más cerca de la Península. El proceso lo he presentado para torpes con QGIS (como yo mismo). Lo primero es abrir el shapefile con QGIS y nos encontraremos con algo parecido a  esto:

mover_qgis

Es un mapa comarcar de España, a la hora de presentar el este mapala posición de las Islas Canarias puede ser un poco incómoda por ello hemos decidido acercarlas a la península y para ello el primer paso es pulsar un botón con forma de lápiz de nuestra barra de herramientas que nos permite editar las formas:

mover_qgis_2

Al pulsarlo se marcan todos los polígonos que componen nuestro shapefile:

mover_qgis_3

En este punto tenemos que seleccionar las Canarias y cambiarlas de ubicación para que estén más cerca de la península, Sigue leyendo Mover elementos de un mapa con QGIS. Ejemplo mover Canarias

Truco Excel. Repetir un campo a partir de otro que define el número de repeticiones

En realidad necesitamos repetir filas, pero el número de repeticiones está parametrizado por otro campo. Partimos de un rango donde la primera columna es un valor que necesita ser repetido el número de filas que nos indica la segunda columna. Es una duda que planteaba un lector del blog:

Hola, a ver si me podeis ayudar,
quiero repetir cada fila el número de veces que hay en cada celda que le corresponde.
Es decir tengo una variable Nombre (Columna A) y otra Frecuencia (Columna B)
Nombre Frecuencia
A 5
B 8
C 25
D 12
… ….

La idea es repetir la la Fila A, 5 veces, la fila B, 8 veces y así sucesivamente.
En realidad es lo inverso a crear una tabla de frecuencias desde una matriz de datos.

Tenía en la nevera un truco de Excel que puede hacer esta tarea y que también subiré al blog en los próximos días, en realidad esta entrada y la siguiente son modificaciones de un anterior truco Excel que subí al blog. En esta imagen podéis ver lo que hace:

excel_repite_filas

La macro que lo realiza es esta:

Sub rango_columnas2()

Dim rango, celda As Variant
Dim i As Long, j As Long, k As Long
Dim col As Long

rango = Application.InputBox(Prompt:="Seleccione el rango a repetir sin cabeceras", Type:=8)
Set celda = Application.InputBox(Prompt:="Seleccione donde quiere poner los datos", Type:=8)

'Esta es la parte que permite ubicar la salida
celda.Select
k = 0

'Esto recorre el rango
For i = 1 To UBound(rango, 1)
    For j = 1 To rango(i, 2)
        ActiveCell.Offset(k, 0).Value = rango(i, 1)
        k = k + 1
    Next
Next

End Sub

Se ejecutan 2 cuadros con el método Application.InputBox, en el primero seleccionamos el rango de datos sin cabeceras y en el segundo indicamos donde queremos que salgan los datos. Se trata de recorrer el rango y pararse a repetir las primera columna del rango tantas veces como lo indica la segunda columna. Un proceso sencillo con Visual Basic pero que sería interesante replicar con funciones de Excel, en este caso creo que INDIRECTO sería la más adecuada. En el siguiente enlace podéis descargar el ejemplo:

repite_filas

En siguientes fechas daré más vueltas a este bucle para realizar transposiciones de datos. Saludos.

 

Financiación del Grupo de Usuarios de R de Madrid

El Grupo de Usuarios de R de Madrid no ha renovado el patrocinio con Revolution Analytics y para la financiación de los gastos que genera se ha lanzado una edición de tazas con el logo del grupo. Las tazas cuestan 9,99€ y se han hecho una tirada de 100 tazas, del precio de estas tazas la mitad iría para dicha financiación.

Para reservar sólo tienes que rellenar este formulario web:

https://docs.google.com/forms/d/e/1FAIpQLSfSC1oSx99S-1M7hPgeZJ9SAHfmF2ilV292hadH_PqnfNqM6Q/viewform

Yo ya he reservado un par de ellas que recogeré el 16 de diciembre en la siguiente reunión del Grupo. Saludos.

Como obtener los centroides de municipios con SAS. Mapas con SGPLOT

mapa_municipios_sas2

Un amigo y lector del blog me ha pedido un mapa de códigos postales donde poder identificar los centroides para andar calculando distancias a otros puntos. Yo no tengo un mapa de España por códigos postales para poder usar con fines comerciales, pero si cuento en el blog como poder obtenerlo bajo ciertas condiciones. Lo que si puedo contar a Juan es como hacer un mapa por municipios con SAS, aunque ya he hablado de ello hay ciertos aspectos que pueden ser interesantes. y todo empieza donde siempre http://www.gadm.org/country la web donde tenemos los mapas "libres" por países, seleccionáis Spain y el formato shapefile una vez descargados los mapas en vuestros equipos empezamos con el trabajo en SAS:

proc mapimport datafile="\directorio\mapa\ESP_adm_shp.shp"
out = work.espania;
run;
proc contents;quit;

mapa_municipios_sas1

El procedimiento MAPIMPORT ha creado un conjunto de datos SAS donde tenemos caracterizados todos los polígonos que componen el shapefile. Entonces si tenemos que calcular el centroide de un municipio con SAS sugiero realizar un PROC SQL de la siguiente forma Sigue leyendo Como obtener los centroides de municipios con SAS. Mapas con SGPLOT