Qué es Welokat
En Mapoteca nos hemos dedicado un año completo al desarrollo de un algoritmo en particular: Welokat. Algo así como el Giuseppe de NotCo.
Lo que hace Welokat es sencillo, pero a la vez poderoso (como dijo el otro!), en tanto toma evidencia territorial (puntos coordenados X, Y), busca el patrón espacial predominante de esa evidencia, para luego buscar sus similares en toda la ciudad (la que sea en cualquier País del mundo). Fácil, no?
Para entregar resultados nos basamos en información pública de diversas fuentes, que gracias a nuestra super-mega pericia, transformamos en algo único, distintivo. Lo que usamos como inputs son datos recolectados en procesos de crowdsourcing, redes sociales e imágenes satelitales. Estas tres fuentes de datos nos permiten tener comparativas en todo el mundo (o al menos las ciudades globales del planeta). Así nos olvidamos de Censos y gente que no sabe contar bien.
Para qué sirve una recomendación territorial
Spotify te recomienda qué música escuchar. Con esa recomendación tu tienes la oportunidad de tomar una decisión: escucho esa canción o no. Welokat te recomienda donde localizar cualquier elemento en el territorio, así, con información cuantificable, puedes tomar decisiones, que por lo general son para evitar perder una inversión. Sabías que al menos un 40% de los emprendimientos localizados en la Ciudad, cierran el primer año por una mala ubicación? El otro 60% es mala gestión o una Pandemia global pre-zombie, pero bueno, 40% sigue siendo un porcentaje alto.
En definitiva recomendamos para evitar que se pierdan inversiones, que en el caso del real estate o inmobiliario, son sumas altas.
El ejercicio de recomendarle a OxxO donde localizar sus sucursales, sin que lo haya pedido
Una de las ventajas de lo que hemos desarrollado es que sabemos cuál es el patrón espacial y por ende el modelo de negocio, de cualquier empresa que tiene una coordenada de Latitud y Longitud en el espacio. Como eso es público y no se puede esconder, los tenemos a todos identificados.
Un problema grande en la industria geo-espacial (allí estamos nosotros), es que se quiere dar respuesta a una mejor localización futura tratando de aglutinar la mayor cantidad de datos posible, con el fin de reducir incertezas. En nuestro caso, hemos resuelto el problema bajo el apronte del small data. Eso es más complejo, pero entrega mejores dividendos a la larga.
Un ejemplo de esto es que no necesitamos las ventas de una empresa para recomendar una mejor localización futura. A diferencia de nuestra competencia (ejem!).
En este escenario es que me puse la meta de recomendarle a OxxO donde localizar sus tiendas, sin que siquiera sepan que mi Ser existe. Espero les sirva. Allá vamos!
Los datos
Una de las cosas que hago bien es desarrollar spiders para obtener datos en Internet. Esto es conocido como web crawling o web scraping.
Los amigos de OxxO fueron muy amables en entregar sus ubicaciones en Santiago, Chile:
El desafío entretenido aquí fue obtener la dirección de la tienda y luego la coordenada de la tienda que se encuentra en el botón que dice Ver en Google. En source se ve así:
Lo que utilicé fue Selenium y un poquito del buen BeautifulSoup en Python. La función se ve así:
def get_info_from_oxxo_chile_website():
# Making browser
browser = webdriver.Firefox(executable_path=r'/Users/geckodriver')
browser.set_window_position(0, 0)
browser.maximize_window() browser.get('https://www.oxxo.cl/ubicaciones') browser.find_element_by_xpath('//*[@id="geoButton"]').click()
sleep(10)
s = html_soup(browser.page_source)
address = s.find_all('p', {'class': 'banner-address'})
address_list = [i.text.replace('|', '') for i in address] locations = s.find_all("a", string="Ver en Google")
locations_x_list = [i['href'].split('=')[-1].split(',')[0] for i in locations]
locations_y_list = [i['href'].split('=')[-1].split(',')[1] for i in locations] df = pd.DataFrame(list(zip(address_list, locations_x_list, locations_y_list)), columns=['address', 'x', 'y'])
df.to_csv(file_path, sep=';')
print(df)
browser.close()
return df
Esto me entregó un listado de tiendas con dirección y coordenadas. 70 tiendas.
Un poquitín más de datos, por favor
Más datos, mejor precisión (o menos margen de fallar). En este sentido, me faltaba algo que catalogara cuáles son ‘buenas’ y ‘no tan buenas’ tiendas, con el fin de poder generar evidencia territorial mas robusta (volver a leer el primer párrafo para saber a qué me refiero). Recordemos que luego quiero buscar ese mismo patrón espacial, por lo que no quiero recomendar copiar las tiendas que les va mal. Claro está.
Como no puedo ir a preguntarle a OxxO por sus ventas o una evaluación categórica de sus tiendas, decidí apelar a quienes mejor saben de algoritmos de rankeo: Google.
Si han visto algo así, ya saben hacia donde voy:
Esta búsqueda en Google: ‘OxxO La Concepción”, arroja una calificación, que según este artículo no está basada solamente en los comentarios, sino que al menos otras tres métricas que genera Google para calificar un lugar.
No tengo pruebas, pero tampoco tengo dudas que Google hizo bien su trabajo, por ende usaré este ranking como un proxy, que me ayude a entender o al menos tener una mínima aproximación a cual es un OxxO bueno y otro no tan bueno en Santiago de Chile.
NOTA: perdón por pegar una imagen con ranking 2.8. Fue al azar.
Buscando en Google con un Robot
Entonces, como nadie quiere hacer clicks en Google para buscar las 70 tiendas de OxxO, me hice un robotito con Selenium:
def add_google_rating(row):
browser.get('https://www.google.cl/') # Pass q and click to search
browser.find_element_by_xpath('//*[@id="tsf"]/div[2]/div[1]/div[1]/div/div[2]/input').send_keys(row['address'])
browser.find_element_by_xpath('//*[@id="tsf"]/div[2]/div[1]/div[3]/center/input[1]').click() try:
result = browser.find_element_by_xpath('/html/body/div[6]/div[2]/div[9]/div[1]/div[3]/div/div[1]/div/div[1]/div/div[1]/div[3]/div[2]/div/div/span[1]').text
print(result) sleep(5)
return result
except:
sleep(5)
return None
pass
def get_google_rating():
stores = pd.read_csv(file_path, sep=';')
stores['g_rating'] = stores.apply(lambda row: add_google_rating(row), axis=1)
fiinal_stores = stores.dropna()
fiinal_stores.to_csv(file_path, sep=';') print(fiinal_stores)
return fiinal_stores
Aquí básicamente estoy agregando una columna nueva con el ranking que me entrega Google. Encontré 40 con calificaciones que van desde el 1 (qué onda la gente que va a OxxO? Mala onda), hasta 5.
Las 40 tiendas que me entregó Google, las reduje luego a solamente aquellas que tienen una nota de más de 4.5. Considero discrecionalmente que desde 4.5 algo es bueno, en una escala que llega a 5.
Ahora la magia de Welokat
Finalmente, nuestro tamagotchi tiene evidencia con qué alimentarse: todas las posiciones en la ciudad de tiendas OxxO que tienen una calificación de 4.5 o mayor. Recomendaremos todos los lugares en Santiago que cumplan con la configuración espacial que permite que esas tiendas sean exitosas.
El mapa resultante, es este (al final del post el Mapa grande):
El histograma de la parte inferior es dinámico y permite filtrar los resultados (gracias CARTO). Ahora está marcando todo lo que va desde 0.9 a 1. Tómate un momento y juega con el mapa y mira si un OxxO bueno podría estar cerca de tu casa.
Si se mueve el histograma para mostrar los casos desde el 0.95 a 1, aparece un cluster muy interesante en San Bernardo:
Otro por Rojas Magallanes:
En conclusión, el ejercicio fue demostrar cómo Welokat puede generar evidencia sin mucho problema, y así mismo entregar una mirada de una ciudad completa, en segundos. Esta imagen cambia a medida que cambian los datos, por ende es bueno que Welokat funcione constantemente en el background de los procesos de operaciones de empresas con áreas inmobiliarias.
Si necesitas que te ayudemos, y no sabes a quién acudir… llámanos! O mejor no, mándame un correo a cris@mapoteca.co
Pronto más artículos como este, o mejores.
Ahora hazle caso a mi tía Marta, y dale una compartida, una retuitada y unos claps!. Besitos, besitos, chau, chau.
Fin.