Segregación Espacial en Redes Sociales

Prerrequisito – Introducción a las Redes Sociales 

La segregación se refiere al acto de separación de unas personas de otras o del grupo principal.

La segregación espacial se refiere a la distribución de grupos sociales o cualquier otro elemento en el espacio. En la Segregación Espacial, las personas tienden a migrar a otros lugares donde tienen más vecinos que son como ellos. 

Grupo de Casas en una localidad

Según la segregación espacial, es poco probable que una persona pueda quedarse en un lugar donde los vecinos son muy diferentes a ti y no puedes tener una buena conversación con tu vecino. Es más probable que una persona migre a un lugar donde sus vecinos sean similares a ellos y pueda tener una buena conversación con su vecino.

Tomemos un ejemplo: supongamos que se fue a vivir a un país extranjero y está decidiendo dónde llevar la casa. Por lo tanto, es más probable que elija un lugar o localidad donde sus vecinos sean de su país y hablen el mismo idioma que el suyo y no un lugar donde la gente sea de un país diferente y hable un idioma diferente. Esto es segregación espacial.

Localidad con todos los vecinos diferentes a ti

Localidad con todos los mismos vecinos que tú

Pero a veces no es posible tener a todos los vecinos iguales a ti. Entonces, para eso, podemos tener algún valor de umbral para que los vecinos similares permanezcan allí.

Tomemos un ejemplo: suponga que hay un total de 9 casas en su localidad, incluida la suya, y digamos que hay un umbral de 3, lo que significa que al menos 3 casas deberían ser similares a la suya.

La persona se quedará aquí como t = 3 

Esta segregación espacial ha sido modelada y este modelo se conoce como el Modelo de Schelling. En el modelo de Schelling, hay una cuadrícula que tiene 2 tipos diferentes de personas y la simulación describe cómo se ha realizado la segregación espacial utilizando un modelo maravilloso. A continuación se muestra la implementación de dicha simulación en Python.

Ejemplo: 

Se crea una cuadrícula de 10 × 10 dimensiones para la demostración. Considere tres grupos de Nodes que se diferencian con los colores rojo, verde y blanco . Ahora, según el modelo de Schelling, los Nodes se mueven hacia los Nodes similares. Aquí la similitud se basa en el color. Más el número de iteraciones, Menos el número de vecinos diferentes.

Python3

#import modules
import networkx as nx
import matplotlib.pyplot as plt
import random
  
# grid dimension
n = 10
  
# Building the graph
g = nx.grid_2d_graph(10, 10)
pos = dict((s, s) for s in g.nodes())
labels = dict(((i, j), i * 10 + j) for i, j in g.nodes())
  
# Display the graph in grid form.
def display(g):
    nodes_g = nx.draw_networkx_nodes(
        g, pos, node_color='green', nodelist=type1_node_list)
    nodes_r = nx.draw_networkx_nodes(
        g, pos, node_color='red', nodelist=type2_node_list)
    nodes_w = nx.draw_networkx_nodes(
        g, pos, node_color='white', nodelist=empty_cells)
    nx.draw_networkx_edges(g, pos)
    nx.draw_networkx_labels(g, pos, labels=labels)
    plt.show()
  
  
# Get the boundary nodes in the graph as boundary nodes have only 6 neighbors.
def get_boundary(g):
    boundary_nodes_list = []
    for ((u, v), d) in g.nodes(data=True):
        if (u == 0 or v == n - 1 or u == n - 1 or v == 0):
            boundary_nodes_list.append((u, v))
    return boundary_nodes_list
  
  
# Get internal neighbors.
def get_internal_neigh(u, v):
    return (
        [(u - 1, v), (u + 1, v), (u, v - 1), (u, v + 1), (u - 1, v + 1),
         (u + 1, v - 1), (u - 1, v - 1), (u + 1, v + 1)])
  
  
# Get boundary neighbors.
def get_boundary_neigh(u, v):
    if (u == 0 and v == 0):
        return ([(0, 1), (1, 1), (1, 0)])
    elif (u == n - 1 and v == n - 1):
        return ([(n - 2, n - 2), (n - 1, n - 2), (n - 2, n - 1)])
    elif (u == n - 1 and v == 0):
        return ([(u - 1, v), (u, v + 1), (u - 1, v + 1)])
    elif (u == 0 and v == n - 1):
        return ([(u + 1, v), (u + 1, v - 1), (u, v - 1)])
    elif (u == 0):
        return ([(u, v - 1), (u, v + 1), (u + 1, v), (u + 1, v - 1), (u + 1, v + 1)])
    elif (v == n - 1):
        return ([(u, v - 1), (u - 1, v), (u + 1, v), (u - 1, v - 1), (u + 1, v - 1)])
    elif (u == n - 1):
        return ([(u - 1, v), (u, v - 1), (u, v + 1), (u - 1, v + 1), (u - 1, v - 1)])
    elif (v == 0):
        return ([(u - 1, v), (u + 1, v), (u, v + 1), (u - 1, v + 1), (u + 1, v + 1)])
  
  
# Get the list of unsatisfied nodes in the graph.
def get_unsatisfied_nodes_list(g, internal_nodes_list, boundary_nodes_list):
    unsatisfied_nodes_list = []
    t = 3
    for u, v in g.nodes():
        type_of_this_node = g.nodes[(u, v)]['type']
  
        if (type_of_this_node == 0):
            continue
        else:
            similar_nodes = 0
            if ((u, v) in internal_nodes_list):
                neigh = get_internal_neigh(u, v)
            elif ((u, v) in boundary_nodes_list):
                neigh = get_boundary_neigh(u, v)
  
            for each in neigh:
                if (g.nodes[each]['type'] == type_of_this_node):
                    similar_nodes += 1
            if (similar_nodes <= t):
                unsatisfied_nodes_list.append((u, v))
  
    return unsatisfied_nodes_list
  
  
# Make the node satisfied by shifting the position
# of unsatisfied node randomly and check if it becomes satisfied.
def make_a_node_satisfied(unsatisfied_nodes_list, empty_cells):
    if (len(unsatisfied_nodes_list) != 0):
        node_to_shift = random.choice(unsatisfied_nodes_list)
        new_position = random.choice(empty_cells)
  
        g.nodes[new_position]['type'] = g.nodes[node_to_shift]['type']
        g.nodes[node_to_shift]['type'] = 0
        labels[node_to_shift], labels[new_position] = labels[new_position],
        labels[node_to_shift]
    else:
        pass
  
  
# for adding diagonal edges
for (u, v) in g.nodes():
    if (u + 1 <= n - 1 and v + 1 <= n - 1):
        g.add_edge((u, v), (u + 1, v + 1))
    if (u + 1 <= n - 1 and v - 1 >= 0):
        g.add_edge((u, v), (u + 1, v - 1))
  
  
for ni in g.nodes():
    g.nodes[ni]['type'] = random.randint(0, 2)
  
type1_node_list = [ni for (ni, d) in g.nodes(data=True) if d['type'] == 1]
type2_node_list = [ni for (ni, d) in g.nodes(data=True) if d['type'] == 2]
empty_cells = [ni for (ni, d) in g.nodes(data=True) if d['type'] == 0]
display(g)
  
boundary_nodes_list = get_boundary(g)
internal_nodes_list = list(set(g.nodes()) - set(boundary_nodes_list))
  
unsatisfied_nodes_list = get_unsatisfied_nodes_list(g, internal_nodes_list,
                                                    boundary_nodes_list)
  
  
# Loop to move unsatisfied nodes
# vary the value of for loop to visualize different results
for i in range(10000):
    unsatisfied_nodes_list = get_unsatisfied_nodes_list(g, internal_nodes_list,
                                                        boundary_nodes_list)
  
    make_a_node_satisfied(unsatisfied_nodes_list, empty_cells)
  
    type1_node_list = [ni for (ni, d) in g.nodes(data=True) if d['type'] == 1]
    type2_node_list = [ni for (ni, d) in g.nodes(data=True) if d['type'] == 2]
    empty_cells = [ni for (ni, d) in g.nodes(data=True) if d['type'] == 0]
  
display(g)

Producción: 

gráfico inicial

Después de 10.000 iteraciones

Publicación traducida automáticamente

Artículo escrito por sankalpsharma424 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *