Minería de datos para determinar las mejores poke-rutas en Santiago

Sin duda Pokemon Go se ha convertido en todo un fenómeno. Gente de todas las edades han salido a recorrer sus ciudades en búsqueda de atrapar y entrarán pokemons. Nos dimos cuenta que nuestra oficina los alrededores de nuestra oficina son un muy buen lugar para jugar Pokemon Go por la gran cantidad de poke-paradas contiguas que hay en el sector. Comentando esto con algunos colegas nos surgió la duda... ¿Cuáles son entonces, con dicha métrica, los mejores lugares para jugar?

Como buenos ingenieros, curiosos, realizamos un simple análisis de los datos de un mapa con las poke-paradas y determinamos las mejores zonas para jugar en nuestra ciudad (Santiago).

A continuación una explicación del pequeño análisis que realizamos. Si entraste a este post solo para saber donde jugar, revisa la sección de resultados.

Para realizar este análisis utilizamos Python 2.7 en un notebook Jupyter y las librerías pandas y sklearn.

Preparando los datos

Antes de empezar, si utilizan Jupyter Notebook les recomiendo activar estas opciones para tener gráficos más agradables y que no se abran en una nueva ventana:

import pandas as pd

# Graficos más bonitos e inline en jupyter notebook

pd.set_option('display.mpl_style', 'default')  
%matplotlib inline

Luego, descargamos los datos de las poke-paradas de Santiago dados en este link y los abrimos:

# Importar mapa de Santiago
# Datos descargados desde https://www.google.com/maps/d/u/0/viewer?mid=1yMCArheRAvqSkCZuHpd50ENsJK0

xml_map = open("../../Descargas/PokéParadas - Santiago.kml").read()  

Y luego extraemos las coordenadas (con expresiones regulares) y las metemos en DataFrame de pandas:

import re

_regex = "<coordinates>([-+]?\d*\.\d+|\d+),([-+]?\d*\.\d+|\d+),([-+]?\d*\.\d+|\d+)</coordinates>"

coordinates = re.findall(_regex, xml_map)  
coordinates = pd.DataFrame(coordinates, columns=["longitud", "latitud", "z"]).apply(pd.to_numeric)  

La magia

Preguntándole a un colega que ve la parte financiera que es bastante flojo cómodo cuanto es la distancia ideal máxima entre poke-paradas respondió media cuadra. Además calculamos que unas 20 poke-paradas en un sector daba para hacer un recorrido que durara más de los 5 minutos que necesitan está para volver a dar objetos.

Por lo que definimos las constantes:

eps = 0.0012/2 # Distancia aproximada en lat/long de media cuadra.  
min_size = 20 # cantidad minima de poke-paradas  

Luego mediante DBSCAN, un algoritmo de clustering espacial basado en densidad, ingresamos los datos y generamos clusters que indiquen las zonas donde efectivamente se encuentren datos separados a no más de media cuadra. Además utilizamos la métrica de similitud manhattan ya que sabemos que si hay dos puntos que están en diagonal no podemos atravesar los edificios caminando (aun) por lo que dicha métrica será lo más similar a recorrer la calle.

# Clusterizar mediante DBSCAN
from sklearn.cluster import DBSCAN  
db = DBSCAN(eps=eps, metric="manhattan").fit(coordinates[["latitud", "longitud"]])  
coordinates[["cluster"]] = pd.DataFrame(db.labels_)  

Y luego agrupamos los datos por cluster y eliminamos los cluster menores a la cantidad mínima de poke-paradas:

cluster_coordinates = coordinates[["cluster", "z"]].groupby(["cluster"]).count().join(  
        coordinates[["cluster", "latitud", "longitud"]].groupby(["cluster"]).mean())

cluster_coordinates.rename(columns={"z": "quantity"}, inplace=True)

cluster_coordinates = cluster_coordinates.drop(-1)

cluster_coordinates = cluster_coordinates[cluster_coordinates.quantity >= min_size]  

Y luego agregamos en la posición del centro de cada cluster la dirección de dicha:

# Se incluye el lugar que esta al promedio de coordenadas del cluster

import geopy

geolocator = geopy.geocoders.Nominatim()

cluster_coordinates["address"] = pd.DataFrame(  
        cluster_coordinates.apply(
            lambda cluster: geolocator.reverse(
                geopy.point.Point(cluster.latitud, cluster.longitud)
            ).address, axis=1 )
    )

Resultados

¡Ahora si! Veamos los resultados:

CantidadLatitudLongitudDirección
1 38 -33.415 -70.59513376, Reyes Lavalle, El Golf, Las Condes, Provincia de Santiago, Región Metropolitana de Santiago, 7550201, Chile
2 38 -33.4203 -70.6129Parque Las Esculturas, Autopista Costanera Norte, Suecia, Providencia, Provincia de Santiago, Región Metropolitana de Santiago, 7500000, Chile
3 35 -33.4351 -70.6439MAC, Ismael Valdés Vergara, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 755009, Chile
4 27 -33.5264 -70.756997, Avenida Pajaritos, Ciudad Jardín, Ciudad Satélite, Maipú, Provincia de Santiago, Región Metropolitana de Santiago, Chile
5 23 -33.3895 -70.6186Milano, Avenida Santa Clara, Ciudad Empresarial, Huechuraba, Provincia de Santiago, Región Metropolitana de Santiago, 7690000, Chile
6 20 -33.4498 -70.6519332, Zenteno, Barrio República, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8330130, Chile

Visto en un gráfico donde estan las diversas poke-paradas y coloreados los clusters podemos observar:

Posición de las poke-paradas de Santiago y los diferentes clusters

Pero ¿Si no soy tan cómodo y puedo caminar al menos una cuadra completa entre poke-paradas? Bueno, los lugares son los siguientes:

CantidadLatitudLongitudDirección
1 344 -33.443 -70.6516Club de La Unión, La Unión, Barrio Brasil, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8320000, Chile
2 234 -33.4383 -70.6425387, Rosal, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8320151, Chile
3 198 -33.4483 -70.662489, Vergara, Barrio República, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8370403, Chile
4 178 -33.4406 -70.6742438, Libertad, Barrio Brasil, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8370261, Chile
5 165 -33.5815 -70.58133050, Avenida Concha y Toro, Villa Los Prados, Puente Alto, Provincia de Cordillera, Región Metropolitana de Santiago, 8301711, Chile
6 98 -33.4153 -70.6487Cementerio General, Recoleta, Provincia de Santiago, Región Metropolitana de Santiago, 7690000, Chile
7 82 -33.4301 -70.692 Salida Autopista Central, Quinta Normal, Provincia de Santiago, Región Metropolitana de Santiago, 8370261, Chile
8 82 -33.4151 -70.5953Fluor Chile S.A., 3340, Reyes Lavalle, El Golf, Las Condes, Provincia de Santiago, Región Metropolitana de Santiago, 7550201, Chile
9 72 -33.4337 -70.6562Brigada Investigadora de Lavados de Activos y Ciber Crimen Metropolitana, General Mackenna, Barrio Brasil, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8320000, Chile
10 62 -33.4674 -70.5959Facultad de Ciencias, Las Palmeras, Villa Frei, Ñuñoa, Provincia de Santiago, Región Metropolitana de Santiago, 7750000, Chile
11 56 -33.4873 -70.6506Parada 1 / Municipalidad de San Miguel, Gran Avenida José Miguel Carrera, San Miguel, Provincia de Santiago, Región Metropolitana de Santiago, 8460174, Chile
12 53 -33.447 -70.641 296, Manuel Antonio Tocomal, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8331059, Chile
13 49 -33.4204 -70.6129Parque Las Esculturas, Autopista Costanera Norte, Suecia, Providencia, Provincia de Santiago, Región Metropolitana de Santiago, 7500000, Chile
14 48 -33.3896 -70.6181Gusta Gusta, Avenida del Parque, Ciudad Empresarial, Huechuraba, Provincia de Santiago, Región Metropolitana de Santiago, 7690000, Chile
15 47 -33.4324 -70.636624, Antonia López de Bello, Bellavista de San Cristóbal, Recoleta, Provincia de Santiago, Región Metropolitana de Santiago, 755009, Chile
16 41 -33.4414 -70.633725, Ernesto Prado Tagle, Providencia, Provincia de Santiago, Región Metropolitana de Santiago, 7500000, Chile
17 40 -33.4246 -70.612762, Monseñor Félix Cabrera, Suecia, Providencia, Provincia de Santiago, Región Metropolitana de Santiago, 7500000, Chile
18 39 -33.4986 -70.6135Escuela de Construcción Civil, Paseo del Sagrado Corazón, Villa Santa Elena, Macul, Provincia de Santiago, Región Metropolitana de Santiago, 7810000, Chile
19 37 -33.5009 -70.66285402, Pasaje 1, San Miguel, Provincia de Santiago, Región Metropolitana de Santiago, 8460600, Chile
20 37 -33.526 -70.757 119, Avenida Pajaritos, Ciudad Jardín, Ciudad Satélite, Maipú, Provincia de Santiago, Región Metropolitana de Santiago, Chile
21 33 -33.4282 -70.61561867, Doctor Hector Ducci, Unidad Vecinal Providencia, Providencia, Provincia de Santiago, Región Metropolitana de Santiago, 7500000, Chile
22 32 -33.4128 -70.6424Avenida Recoleta, Bellavista de San Cristóbal, Recoleta, Provincia de Santiago, Región Metropolitana de Santiago, 7690000, Chile
23 32 -33.5115 -70.7559Megasalud, Ciclovia Alberto LLona, Ciudad Jardín, Maipú, Provincia de Santiago, Región Metropolitana de Santiago, Chile
24 31 -33.4581 -70.6531933, Roberto Espinoza, Barrio Franklin, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8370403, Chile
25 28 -33.3674 -70.7313Plaza Quilicura, Raimundo Romo, Plaza Los Castaños, Quilicura, Provincia de Santiago, Región Metropolitana de Santiago, 9020000, Chile
26 28 -33.5108 -70.7614340, Avenida 5 de Abril, Ciudad Jardín, Maipú, Provincia de Santiago, Región Metropolitana de Santiago, Chile
27 25 -33.4628 -70.6162Instituto de Salud Pública de Chile, Pericles, Villa Olímpica, Ñuñoa, Provincia de Santiago, Región Metropolitana de Santiago, 7750000, Chile
28 24 -33.4619 -70.5969UMCE, 774, Profesor Juan Gómez Millas, Villa Frei, Ñuñoa, Provincia de Santiago, Región Metropolitana de Santiago, 7750000, Chile
29 23 -33.5369 -70.78462296, Pasaje Carbiri, Población Los Heroes, Ciudad Satélite, Maipú, Provincia de Santiago, Región Metropolitana de Santiago, 9720028, Chile
30 23 -33.4041 -70.705 Plaza Renca, Avenida Domingo Santa María, Renca, Provincia de Santiago, Región Metropolitana de Santiago, Chile
31 22 -33.5436 -70.6335Plaza Cívica La Granja, Avenida Santa Rosa, La Granja, Provincia de Santiago, Región Metropolitana de Santiago, 7970000, Chile
32 22 -33.592 -70.7103Parque García de la Huerta, Avenida América, San Bernardo, Provincia de Maipo, Región Metropolitana de Santiago, 648, Chile
33 22 -33.4545 -70.6671Estacionamiento Avenida Republica, Paseo República, Barrio República, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8370456, Chile
34 22 -33.4549 -70.5936Plaza Ñuñoa, Jorge Washington, Villa Frei, Ñuñoa, Provincia de Santiago, Región Metropolitana de Santiago, 7750000, Chile
35 22 -33.4205 -70.654 1076, Avenida Santos Dumont, Independencia, Provincia de Santiago, Región Metropolitana de Santiago, 755009, Chile
36 21 -33.5225 -70.57881791, Avenida Walker Martínez, La Florida, Provincia de Santiago, Región Metropolitana de Santiago, 8240000, Chile
37 21 -33.5192 -70.6132Museo Interactivo Mirador, Avenida Punta Arenas, Bellavista de La Florida, La Florida, Provincia de Santiago, Región Metropolitana de Santiago, 8240000, Chile
38 20 -33.4491 -70.6361580, Raulí, Santiago, Provincia de Santiago, Región Metropolitana de Santiago, 8331059, Chile
39 20 -33.4504 -70.6867E.O.A., Avenida Ecuador, Estación Central, Provincia de Santiago, Región Metropolitana de Santiago, 8370261, Chile

¡Ya saben! A cazar pokemons en el Parque de las Esculturas o el Club de la Unión. Y si se preguntan si tuvieran la habilidad de sobrevolar edificios cuál es el mejor lugar la respuesta es: La Moneda y sus alrededores (¡Con más de 1600 poke-paradas!).