viernes, 27 de marzo de 2020

Estudio estático. Comparación de ciudades según la evolución del número de agrupaciones conexas

En el último post, explicamos en qué consistía una agrupación conexa dentro de un grafo, visualizamos de forma gráfica cómo evolucionaba el número de agrupaciones conexas conforme aumentábamos el radio de influencia de cada nodo y estudiamos si había correlación lineal al aplicar logaritmos a ambos ejes. 

En esta ocasión, vamos a comprobar si hay ciudades que presenten un comportamiento similar en este experimento para tratar de establecer similitudes entre las redes de bicicletas. Para ello, vamos a estudiar la correlación que presentan las curvas de cada una de las ciudades.

Para el cálculo de la correlación, es necesario que las curvas estén normalizadas tanto en el eje X (número de agrupaciones conexas) como en el eje Y (porcentaje de diámetro que se toma como radio). Por tanto, será necesario hacer un procesamiento previo de los datos.


NORMALIZAR EL EJE Y


Normalizar el eje Y es una tarea sencilla. Solo tenemos que dividir el número de agrupaciones conexas entre el número total de estaciones que tiene la red. Si el número de agrupaciones conexas es igual al número de estaciones, el resultado de la división será 1 (valor máximo posible) y, a medida que el número de agrupaciones disminuya, el resultado de la división tenderá a 0 (valor mínimo posible).



NORMALIZAR EL EJE X


Para normalizar el eje X necesitamos conocer cuál es el porcentaje del diámetro que hace que el número de agrupaciones conexas sea 1. Este valor no lo tenemos, así que, debemos diseñar un algoritmo que lo calcule. 

Para la investigación que estamos haciendo, no es necesario saber el valor exacto, nos basta con una buena aproximación. Si nos fijamos en cómo son las curvas, veremos que siempre son decrecientes. Podemos apoyarnos en esto para construir nuestro algoritmo.



La idea consiste en hacer un algoritmo en dos pasadas:
  • Primera pasada (de derecha a izquierda): escogemos un valor de porcentaje que sea muy alto, de manera que nos aseguremos de que, con ese porcentaje, el número de agrupaciones conexas es 1, por ejemplo, 60%. A continuación, vamos reduciendo el porcentaje una cantidad constante (step 1), por ejemplo, 1%, hasta que el número de agrupaciones conexas es mayor que 1.
  • Segunda pasada (de izquierda a derecha): incrementamos el valor de porcentaje que hemos obtenido de la primera pasada una cantidad constante (step 2), por ejemplo, 0.01%, hasta que el número de agrupaciones conexas sea 1. 
Cuanto menor sea el valor de step 2, más preciso será el resultado que se obtiene. Podríamos haber planteado un algoritmo de una única pasada empezando desde el 0% e incrementando una cantidad pequeña, si bien, el coste computacional es mucho más alto. 

Para que poder establecer la correlación, todas las ciudades deben tener la misma cantidad de valores en el eje X. Así que, vamos a tomar N valores comprendidos entre (0, Pmax] siendo Pmax el porcentaje del diámetro donde el número de agrupaciones conexas es 1. 

Supongamos que N = 100. Esto quiere decir que para cada ciudad tenemos 100 muestras en el eje X y que la primera de estas muestras es el 1% del porcentaje que hace que el número de agrupaciones conexas sea 1.

De esta forma, ya tendríamos todos nuestros datos normalizados.


MATRIZ DE CORRELACIÓN DE PEARSON


Para el calculo de la correlación, vamos a usar una función incorporada dentro de la librería de Pandas en Python. Para usarla, tenemos que crear un DataFrame que tenga una columna por cada ciudad y una fila para cada valor de agrupaciones conexas. Si tenemos 83 ciudades y hemos tomado un valor de N = 100, tendremos un DataFrame de 83 ciudades y 100 filas. En el resultado que se va a mostrar, se ha tomado un valor de N = 1000.

Importante: debemos ordenar las ciudades según el número de estaciones para que podamos estudiar si la correlación depende del número de estaciones. 

Si nuestro DataFrame se llama df, la función a aplicar sería:

df.corr(method='pearson')

El resultado es otro DataFrame que representa una matriz cuadrada que tendrá tantas filas y columnas como ciudades, es decir, 83x83. Si visualizamos el resultado como un mapa de calor, lo que se obtiene es:


Las ciudades están ordenadas según el número de estaciones de menor a mayor, las columnas situadas más a la izquierda tienen menor número de estaciones que las situadas a la derecha.

A primera vista, hay correlación alta entre muchas ciudades pero, no hay un dependencia aparente con el número de estaciones de la ciudad.



domingo, 1 de marzo de 2020

Estudio estático. Recopilación de datasets


Para llevar a cabo un estudio de un sistema, ya sea de bicicletas o de cualquier otra índole, es necesario tener a nuestra disposición una gran cantidad de datos con los que trabajar. Para nuestro proyecto, necesitamos conocer la localización geográfica de las estaciones de bici de diferentes ciudades. 


DATOS EN FORMATO .CSV


Si buscamos "bikesharing data" en Internet, encontraremos varios portales web de empresas de alquiler de bicicletas con una sección de Open Data donde podemos obtener estos datos de forma gratuita y podemos usarlos sin ningún tipo de restricción. Algunos de estos sitios web son:
Estos datos suelen aparecer en formato .csv y muchos de ellos siguen el formato especificado por la GBFS (General Bikeshare Feed Specification). Algunos de estos sitios no solo nos facilitan la localización de las estaciones de bici sino que además mantienen un registro abierto y accesible de la actividad de cada una de estas estaciones. Podemos saber cuándo y dónde un usuario alquiló una bici, cuánto tiempo la ha estado usando y dónde la ha depositado al terminar, entre otras cosas.

Además, existe una página web llamada bikeshare.com que nos redirige a diferentes repositorios donde podemos obtener también información de la actividad de las estaciones que puede ser útil para hacer un estudio dinámico de la red. El sitio en cuestión es este. En alguno de los enlaces que hemos mostrado antes, también es posible conseguir datos de los trayectos que han hecho los usuarios.



TRADUCCIÓN DE DIRECCIONES CON GEOPY


El primer problema que aparece con estos datos es que no todos nos indican las coordenadas de longitud y latitud de las estaciones sino que utilizan el nombre de la calle en la que se encuentran. Debemos mapear las direcciones a coordenadas de latitud y longitud para nuestro estudio. 

Para ello, vamos a usar una librería de Python llamada Geopy que permite la traducción de nombres de calles a coordenadas y viceversa. Además, podemos solicitar a Geopy que nos calcule la distancia entre dos puntos. Esto puede ser interesante porque así podemos saber con mayor exactitud la distancia entre dos estaciones en lugar de basarnos en la distancia euclidiana.

La documentación oficial de Geopy la podemos encontrar en el siguiente enlace. En ella se nos enseña a utilizar las funciones de Geopy mediante ejemplos que podemos copiar en nuestro programa para hacer las traducciones de direcciones. Cabe destacar que, en nuestro caso, queremos traducir un dataset completo de direcciones, es decir, vamos a tener que hacer muchas peticiones al servidor de Geopy. 

Como Geopy es abierto para toda la comunidad, no podemos bombardear sus servidores con peticiones muy seguidas, debemos dejar un intervalo de tiempo entre ellas o el servidor nos bloqueará. La documentación oficial contempla esta situación y explica la forma correcta de hacer muchas peticiones consecutivas en el apartado Usage with Pandas donde se explica el uso de la clase RateLimit.

Si tenemos alguna duda y preferimos el clásico tutorial de Youtube, aquí dejo el que usé yo (click aquí).


DATOS EN FORMATO .JSON


Hasta ahora, la mayoría de los sitios de los que habíamos conseguido información se encontraban en EEUU. Para obtener información de sistemas de bicicletas por todo el mundo, podemos visitar la página de bikeshare-research.org. Este sitio web recopila información de redes de alquiler de bicicletas y la ofrece a través de una API.


Dentro de esta página, si seleccionamos un país y una ciudad, podemos ver un apartado llamado CityBikes feed donde puede aparecer un enlace a un fichero json con la información geoespacial de las estaciones de bici de la ciudad. En todas las ciudades no aparece este enlace pero en muchas de ellas sí.

Es posible que a través de la API se pueda obtener más información de la que aparece en el json. De hecho, algunos atributos indican el número de bicicletas disponibles en la estación y el número de huecos. Así que, esta API también puede ser interesante para hacer un estudio dinámico. Además, también cabe la posibilidad de que podamos obtener los datos de las ciudades que no tienen un json vinculado mediante la API.

Cabe mencionar que la información geoespacial de las estaciones aparece expresada en un formato con el que no estamos familiarizados y será necesario estudiar cómo traducir los valores de latitud y longitud para poder representarlos y estudiarlos.

RESULTADOS


Después de extraer toda la información, hemos realizado un conteo del número de estaciones por ciudad y hemos elaborado un ranking con todas las ciudades. El resultado se muestra a continuación:

En total hay 84 ciudades.

place num_stations
Paris_Francia 1398
NewYork_EEUU 936
Londres_ReinoUnido 781
Boston_Canada 619
Chicago_EEUU 612
Washington_EEUU 579
Toronto_Canada 463
Helsinki_Finlandia 450
Barcelona_Spain 444
SanFrancisco_EEUU 430
Lyon_Francia 415
Bruselas_Belgica 354
Warsaw_Polonia 344
Boston_EEUU 330
Milan_Italia 302
Antwerp_Belgica 301
Toulouse_Francia 288
RioDeJaneiro_Brasil 262
Sevilla_Spain 260
Madrid_Spain 214
Turin_Italia 206
Vancouver_Canada 200
Nice_Francia 176
StPetesburg_EEUU 174
SaoPaulo_Brasil 154
Brisbane_Australia 151
Miami_EEUU 146
Budapest_Hungria 144
Philadelphia_EEUU 141
Zaragoza_Spain 130
Marseille_Francia 123
Nantes_Francia 121
Viena_Austria 120
Dublin_Irlanda 110
Houston_EEUU 108
Pittsburgh_EEUU 101
Edimburgo_ReinoUnido 97
Luxemburgo_Luxemburgo 92
Columbus_EEUU 83
Recife_Brasil 77
Denver_EEUU 76
Goteborg_Suecia 74
AustinTexas_EEUU 74
Omaha_EEUU 70
Glasgow_ReinoUnido 67
Ljubljana_Eslovenia 61
SanAntonio_EEUU 61
Calais_Francia 56
ClermontFerrand_Francia 52
Caen_Francia 50
AbuDhabi_EmiratosArabes 50
Indianapolis_EEUU 50
Belfast_ReinoUnido 47
Madison_EEUU 46
FortWorth_EEUU 46
Boulder_EEUU 45
SaltLake_EEUU 45
CergyPontoise_Francia 43
Valence_Francia 43
Chattanooga_EEUU 42
Mulhouse_Francia 41
Kansas_EEUU 41
Vilnius_Lithuania 36
Cork_Irlanda 33
SaintEtienne_Francia 31
Besacon_Francia 30
Charlotte_EEUU 29
Namur_Belgica 28
Nancy_Francia 28
Amiens_Francia 27
Dayton_EEUU 27
Rouen_Francia 25
FortLauderdale_EEUU 23
Limerick_Irlanda 23
Toyama_Japon 22
DesMoines_EEUU 22
ElPaso_EEUU 18
Lund_Suecia 17
Santander_Spain 16
Fargo_EEUU 11
Creteil_Francia 10
Kazan_Rusia 7
Spartanburg_EEUU 6
Lillestrom_Noruega 6




Teoría de Redes Complejas (Parte 1). Conceptos básicos

Para continuar con nuestro proyecto vamos a hacer un estudio aplicando teoría de grafos y de redes complejas con el objetivo de demostrar...