Geoinformática - Práctica 6

Agrupamiento, Regionalización y Segmentación Geodemográfica

Parte 1 - Introducción a la Regionalización

In [1]:
# Librerías a Utilizar
import seaborn as sns
import pandas as pd
import pysal as ps
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import cluster
/home/datalab/miniconda3/envs/geoinf/lib/python3.7/site-packages/pysal/explore/segregation/network/network.py:16: UserWarning: You need pandana and urbanaccess to work with segregation's network module
You can install them with  `pip install urbanaccess pandana` or `conda install -c udst pandana urbanaccess`
  "You need pandana and urbanaccess to work with segregation's network module\n"
/home/datalab/miniconda3/envs/geoinf/lib/python3.7/site-packages/pysal/model/spvcm/abstracts.py:10: UserWarning: The `dill` module is required to use the sqlite backend fully.
  from .sqlite import head_to_sql, start_sql

Datos de Trabajo

En esta primera parte de la práctica, se utilizarán datos extraídos de la Base de Datos oficial de AirBnb; se trata de una compañía que provee alternativas de hospedaje diferentes de los hoteles a las personas que visitan un lugar determinado, así como de un ingreso adicional a aquellos con la posibilidad de rentar sus inmuebles. El sitio web de la compañía se actualiza de manera constante con el listado de todas las propiedades disponibles en un lugar dado para los usuarios puedan revisar y reservar según sus necesidades; asimismo, el servicio provee de un mecanismo de retroalimentación en el que ambas partes, tanto anfitriones como huéspedes, tienen la posibilidad de calificar su experiencia, lo cual permite que cada propiedad tenga no sólo una Calificación General de su aptitud como estancia, sino también puntuaciones relacionadas a la limpieza del inmueble, la facilidad de comunicación con el huésped, entre otras.

Los datos originales proporcionados por AirBnb se encuentran detallados a nivel propiedad para toda la Ciudad de México; sin embargo, dado que el número de inmuebles en esta base es demasiado alto, para propósitos de la práctica, los datos han sido agregados a nivel de AGEB. Asimismo, aunque los datos se encuentran disponibles para toda la ciudad, la gran mayoría de estas propiedades se encuentran concentradas en la Alcaldía Cuauhtémoc, donde se ubican los principales atractivos turísticos de la ciudad como el Centro Histórico, el Palacio de Bellas Artes o la Condesa; como tal, se trabajará únicamente con esta alcaldía y, dado que no todas las AGEB's de la alcaldía poseen un AirBnb, únicamente se trabajarán con las AGEB's de la Alcaldía Cuahtémoc que posean por lo menos un AirBnb en su interior, de modo que se le puedan asociar los promedios de calificaciones.

El objetivo de la práctica es crear una clasificación de las áreas (AGEB's) de la Alcaldía Cuauhtémoc, en la Ciudad de México, basándose en las calificaciones que los AirBnb en su interior han recibido. Esto permitirá crear una tipología para la geografía de AirBnb en la alcaldía y, hasta cierto punto, entender un poco mejor la distribución de las propiedades en la misma a través de lo que los propios AirBnb puedan decir del lugar en el que se encuentran. Por una parte, este ejercicio es una prueba idónea para demostrar el tipo de análisis que pueden realizarse gracias a la aparición de nuevas y grandes bases de datos en todas las áreas, algo que hace sólo algunos pocos años hubiera sido muy complicado de realizar por otros medios; por otra parte, es importante tomar en cuenta las restricciones que poseen este tipo de datos y, por ende, limitan la posibilidad de hacer interpretaciones completamente certeras hacia la población en general.

En primer lugar, y como se ha hecho hasta ahora, se establecerá una variable que contenga la ruta en la cual se encuentran almacenados los datos:

In [2]:
f = 'data/'

Después, puede importarse el ShapeFile a utilizar a lo largo de la práctica, como se ha hecho tradicionalmente a través de geopandas:

In [3]:
airbnb = gpd.read_file('data/agebs_airbnb.shp')  # Importar el ShapeFile
airbnb = airbnb.set_index('ageb')                # Establecer la Clave Geográfica del AGEB como Índice
airbnb.head()                                    # Observar el GeoDataFrame importado
Out[3]:
no_prop calif expec limp checkin com ubi precio geometry
ageb
0901500010235 4.0 96.5000 10.00000 10.00000 10.00000 10.00000 10.00000 9.75000 POLYGON ((484786.4564242049 2151318.632194062,...
0901500010362 1.0 100.0000 10.00000 10.00000 10.00000 10.00000 10.00000 10.00000 POLYGON ((484415.3002532361 2150990.921335925,...
0901500010606 14.0 96.3571 9.92857 10.00000 10.00000 9.92857 9.71429 9.85714 POLYGON ((483366.716567839 2150099.090658844, ...
0901500011017 204.0 96.1569 9.83823 9.64706 9.86765 9.86765 9.92157 9.68627 POLYGON ((483869.0666524998 2147955.234262425,...
0901500010201 1.0 100.0000 9.00000 10.00000 10.00000 10.00000 10.00000 10.00000 POLYGON ((484252.7970705956 2151134.263629142,...

A continuación se presenta el significado de cada una de las variables contenidas en el GeoDataFrame; es importante recordar que las calificaciones mostradas para cada AGEB resultan del promedio de todas las propiedades contenidas en su interior:

  • no_prop - Número de Propiedades contenidas en el AGEB.
  • calif - Calificación General de las Propiedades, en una escala del 0 al 100.
  • expec - Calificación de Expectativa, es decir, qué tanto se asemeja la experiencia real con lo prometido.
  • limp - Calificación de Limpieza general de la propiedad.
  • checkin - Calificación de la facilidad con la que fue posible realizar el Check-In a la propiedad.
  • com - Calificación de facilidad de Comunicación entre el huésped y el anfitrión
  • ubi - Calificación de Ubicación de la propiedad con respecto a la accesibilidad a otros lugares de la ciudad.
  • precio - Calificación del Precio, es decir, el equilibrio entre lo pagado y lo recibido.

Antes de comenzar a explorar los datos más a fondo, resulta de utilidad realizar un paso más. Puede observarse que no todas las variables contenidas en la tabla resultarán de utilidad para el ejercicio, sino únicamente las asociadas a las calificaciones; como tal, para facilitar el trabajo a futuro, se almacenará el nombre de cada una de estas dentro de una Lista (Array):

In [4]:
calificaciones = ['calif', 'expec', 'limp', 'checkin', 'com', 'ubi', 'precio']

Conociendo los Datos

La mejor forma de comenzar a estudiar la geografía de las Calificaciones de AirBnb es graficandolas a todas ellas dentro de un mapa particular para cada una, lo cual nos dará una perspectiva univariada de cada una de las variables de interés.

Debido a que existen muchas columnas de las cuales generar un mapa, puede utilizarse un Bucle (Loop) del tipo for que genere cada uno de estos mapas, y los coloque dentro de una de las unidades de la figura principal:

In [5]:
# Generación de figura con tres filas y tres columnas
fig, ejes = plt.subplots(nrows=3, ncols=3, figsize=(20, 20))

# Hacer los accesibles a través de un solo índice con la función '.flatten()'
ejes = ejes.flatten()

# Comenzar el bucle utilizando todas las variables de interés
for i, var in enumerate(calificaciones):
    # Seleccionar el eje en el que se colocará el mapa
    eje = ejes[i]
    # Generar el mapa
    airbnb.plot(column=var, ax=eje, scheme='Quantiles', linewidth=0.5, edgecolor = 'black', cmap='Blues')
    # Remover los ejes del mapa
    eje.set_axis_off()
    # Colocar como título el nombre de la variable graficada
    eje.set_title(var)
    
plt.show()
/home/datalab/miniconda3/envs/geoinf/lib/python3.7/site-packages/mapclassify/classifiers.py:138: UserWarning: Warning: Not enough unique values in array to form k classes
  "Warning: Not enough unique values in array to form k classes", UserWarning
/home/datalab/miniconda3/envs/geoinf/lib/python3.7/site-packages/mapclassify/classifiers.py:140: UserWarning: Warning: setting k to 4
  Warn("Warning: setting k to %d" % k_q, UserWarning)

Antes de realizar cualquier interpretación de los mapas, resulta pertinente estudiar a detalle el código que permitió generar los mapas anteriores:

  1. Primero, en la Línea 2, se determina el número de filas y columnas de la cuadrícula en la cual se acomodarán los mapas, utilizando la función .subplots() de la librería matplotlib, así como sus argumentos nrows y ncols respectivamente.
  2. Después, en la Línea 5, se utiliza la función .flatten() para que cada uno de los espacios de la cuadrícula puedan ser llamados de forma individual. Puede pensarse como una forma de enumerar los espacios de la cuadrícula; como tal, si se llama al elemento ejes[0] (recordando que Python comienza a enumerar desde 0), se estará trabajando con el primer cuadro de la primera fila; el elemento ejes[1] corresponderá al segundo de la primera fila; ejes[2] al tercero de la primera fila; ejes[3] al primero de la segunda fila, y así consecutivamente.
  3. En la Línea 8 se genera el bucle de tipo for utilizando la lista de calificaciones que se generó anteriormente; sin embargo, se está aplicando el método enumerate() sobre la lista. Esto se debe a que la función enumerate(), como indica su nombre, enumera a los elementos de la lista; como tal, en la lista calificaciones, al elemento calif se le asigna el número 0, a expec el número 1, y así con el resto. Lo anterior permite que las variables generadas por el bucle, var e i, correspondan a la variable con la que se generará el mapa y su ennumeración correspondiente, respectivamente.
  4. Dentro del bucle, primero se establece con cual de los ejes (o, elemento de la cuadrícula) se trabajará para generar el mapa (Línea 10); después, se genera el mapa a través de la función .plot() (Línea 12); posteriormente, se remueven los ejes del mapa generado con .set_axis_off() (Línea 14) y, por último, se le coloca como título al mapa el nombre de la variable con la que se ha trabajado.
  5. Para finalizar, simplemente se muestra el resultado (Línea 18).

Gracias a los mapas generados, es posible observar que existe una diferencia sustancial en cómo se distribuyen las calificaciones de cada uno de los aspectos de un AirBnb en el espacio. Mientras que la Calificación General (calif), la de Comunicación con el Anfitrión (com) y la Ubicación (ubi) tienden a ser altas en muy pocas AGEB's, principalmente las concentradas en los límites de la alcaldía, otras calificaciones como las de Precio (prec) o Expectativa (expec) también tienden a concentrarse en el centro de la misma, donde se encuentra el Centro Histórico.

Aunque se está trabajando con un número relativamente pequeño de variables, resulta complicado a primera instancia determinar cómo funcionan en conjunto y de qué forma se relacionan como un todo con la naturaleza de cada una de las AGEB's estudiadas. Como tal, también resulta de utilidad estudiar la Correlación entre cada una de las variables (como influye una en la otra) y, para esto, la librería seaborn ofrece la función .pairplot(), que permite estudiar esta correlación entre un grupo de variables de forma gráfica:

In [6]:
_ = sns.pairplot(airbnb[calificaciones], kind='reg', diag_kind='hist')