Un diagrama chord es un tipo de visualización orientado a mostrar las interrelaciones entre varios valores. Dentro de este diagrama, se pueden ver cuerdas que muestran las relaciones entre cada pareja de valores posibles. Dichas cuerdas además, a través de su anchura, muestran la relación bidireccional entre cada pareja de valores.
En nuestro caso, esta anchura representa el número de trayectos que se han realizado dependiendo de la ruta seguida. NYC tiene 5 barrios, por lo que si definimos como ruta cada una de las posibles combinaciones existentes entre todos los barrios, nos encontramos con 25 posibles rutas, de las cuales, algunas serán más transitadas que otras.
Mediante una matriz cuadrada, expresaremos el número de trayectos entre cada uno de los barrios con los demás y consigo mismo.
Como comprobación para saber si nuestra matriz es correcta, la suma total del nº de trayectos en cada una de las posibles rutas debe ser el mismo que el número total de trayectos realizados por los taxis de color verde. O lo que es lo mismo, si el número total de trayectos realizados por los taxis de color verde supone un 100%, la suma total de trayectos en todas las rutas debe sumar el 100%.
Este Jupyter Notebook se basa en la obtención y comprobación de dicha matriz cuadrada.
#Importación de las librerías necesarias
import pandas as pd
import matplotlib.path as mpltPath
import numpy as np
#Llamada al dataset que contiene la diferenciación por barrios y por distritos
filename = "data_limpios_distritos.csv"
data = pd.read_csv(filename, sep=";", decimal=',', encoding = "utf-8")
data.head()
#Extraemos aquellas filas que pertenecen a los taxis verdes y reseteamos el index de esta extracción
data1 = data[data["color"]=='Verde']
data1 = data1.reset_index(drop=True)
#Número total de trayectos realizados por taxis verdes
data1["color"].count()
Primero de todo creamos una lista con los nombres de todos los barrios de NYC.
Después, inicializamos un diccionario "carreras" con todas sus claves a 0. Cada una de estas claves representan cada una de las posibles rutas entre barrios.
barrios = ["Manhattan", "Bronx", "Brooklyn", "Queens", "Staten"]
carreras = {}
for barrio_salida in barrios:
for barrio_llegada in barrios:
salida_llegada = barrio_salida + "_" + barrio_llegada
carreras[salida_llegada] = 0
carreras
Ahora asignamos cada carrera realizada a aquella ruta a la cual pertenece por lo que al final del siguiente bucle tendremos un diccionario con todas las carreras asginadas a su ruta.
Como podemos ver, algunas rutas no se transitaron en todo el día por lo que el valor de estas seguirá siendo 0.
for index, _ in enumerate(data1["pickup_barrio"]):
carreras[data1["pickup_barrio"][index] + "_" + data1["dropoff_barrio"][index]] += 1
carreras
#Comprobación de que se han asignado todas las carreras
total_carreras = sum(carreras.values())
total_carreras
Para hacer la comprobación y nuestra matriz chord visualmente más atractiva, obtenemos los porcentajes que se han dado en cada una de las rutas posibles
carreras_en_porcentaje = {}
for index in carreras:
carreras_en_porcentaje[index] = carreras[index]/total_carreras
total_porcentaje = sum(carreras_en_porcentaje.values())
total_porcentaje
Por último, debemos transformar el diccionario anterior en una matriz cuadrada. Así, primero convertimos el diccionario en un array, luego lo redimensionamos para que tenga una dimension de 5x5 y por último, transformamos dicha matriz en una lista entendible para los archivos JSON.
matrix = np.array([carreras_en_porcentaje[index] for index in carreras]).reshape(5,5)
matrix_json = matrix.tolist()
matrix_json
Una vez terminado el proceso, guardamos este la matriz en un archivo json.
import json
with open('matrix.json', 'w') as outfile:
json.dump(matrix_json, outfile)
Para hacer posible el diagrama chord en d3.js, debemos tener paralelamente un archivo csv que establezca el nombre, orden y color de cada uno de los barrios. En nuestro caso, aquel archivo que recoge esta información es "barrios.csv" y su contenido es: