Archivos de la categoría Formación

Mapas municipales de España con Excel y QGIS

mapa_españa_municipal7
Un tweet a @r_vaquerizo me preguntaba por mapas para representar datos a nivel municipal en España. Estas cuestiones las suelen plantear porque los mapas en Excel que hay publicados en el blog están muy extendidos y quieren herramientas similares pero a otro nivel, ya sea comarcal, municipal, código postal… Hacer estos mapas con Excel es muy complicado porque estos mapas no dejan de ser un gran rompecabezas que colocamos en Excel. Sin embargo podemos emplear QGIS para realizar este tipo de mapas, QGIS es libre, tiene muchas posibilidades y ‘comunica’ a la perfección con Excel y como ejemplo de ello vamos a realizar un mapa con la población total de la provincia de Zaragoza. Para esta tarea el mejor mapa que he encontrado es este, no tiene restricciones de uso pero sobre todo es muy simple y tiene un campo código de municipio que nos permite cruzar a la perfección con los datos del INE. Comencemos a trabajar.

Descargado el mapa vemos que tenemos 7 archivos que contienen información sobre el mapa, los dejamos en una carpeta y abrimos QGIS, aquí creamos un nuevo proyecto y añadimos una capa vectorial entonces nos pide seleccionar un archivo a abrir y de ese mapa que nos hemos descargado seleccionamos el archivo *.shp y obtendremos:

mapa_españa_municipal1

Tenemos un mapa de municipios de toda España pero necesitamos seleccionar Zaragoza, sobre el panel de capas duplicamos esa capa Municipios ETRS89_30N y con el botón derecho del ratón podemos realizar un filtro Sigue leyendo Mapas municipales de España con Excel y QGIS

Truco Excel. Unir todos los libros en una hoja

unir_excel1

Los trucos Excel referentes a la unión de varios libros en uno tienen mucho éxito en esta web, además era necesario crear una versión que uniera de forma horizontal. No es una unión como la pueda hacer Power Query de anexar tablas con cierto sentido teniendo en cuenta el nombre de las columnas y demás, se trata
de unir todas las celdas de un conjunto de libros de forma horizontal en otro libro resultante como ilustra la figura de arriba. Se unirán todos los campos unos encima de otros independientemente de si se llaman igual o no, si queremos anexar tablas es recomendable usar herramientas más específicas. El funcionamiento es muy sencillo pero
lo vamos a ilustrar con imágenes, el primer paso es pulsar directamente el botón y seleccionar los archivos a unir:

unir_excel2

Ahora sólo tenemos que especificar el archivo de destino, puede existir o no, el proceso lo sustituye:

unir_excel3

Y et voilá! Ya tenemos nuestro archivo resultante Sigue leyendo Truco Excel. Unir todos los libros en una hoja

Truco Excel. Actualizar el filtro de todas las tablas dinámicas de mi libro

Traigo hoy al blog una macro de Excel que nos permite recorrer todas las hojas de un libro y dentro de las hojas nos permite recorrer todas las tablas dinámicas y actualizar un campo. Cuando tenemos un informe que se basa en tablas dinámicas y tiene una actualización mensual nos podemos encontrar con la necesidad de cambiar sólo un elemento de la tabla dinámica para actualizar el informe. Este era el caso de mi compañera, hay una entrada en el blog que ya trataba el tema pero esta nueva macro supone otra vuelta de tuerca sobre ella, no sólo recorre y actualiza todas las tablas dinámicas de una hoja, además lo hace de todo el libro. El código de Visual Basic para Excel es:

Sub filtros()
'Macro creada por www.analisisydecision.es

Dim pt As PivotTable
Dim actual, nuevo As String
    actual = 201701
    nuevo = 201702

For i = 1 To Worksheets.Count

Sheets(i).Activate
For Each pt In ActiveSheet.PivotTables
pt.PivotFields("mes").EnableMultiplePageItems = True
With pt.PivotFields("mes")
.PivotItems(nuevo).Visible = True
.PivotItems(actual).Visible = False
End With
Next pt
Next i

En PivotFields ponemos el nombre del campo que deseamos actualizar. Evidentemente necesitamos esconder el valor actual y poner el valor nuevo recorriendo todas las hojas con el bucle For i = 1 To Worksheets.Count y recorriendo todas las tablas dinámicas de cada hoja con For Each pt In ActiveSheet.PivotTables. Lo que si necesitó estar activo es seleccionar varios elementos del campo que deseamos actualizar y por ello fue necesario poner EnableMultiplePageItems = True no llegamos a entender el motivo pero es importante que “Seleccionar varios elementos” esté activo en la tabla dinámica. Espero que estas pocas líneas de código os sean de utilidad, por aquí han automatizado mucho trabajo manual. Saludos.

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