Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Andres.
Julio 2019
Matemática Discreta.
1
Dedicatoria
Este trabajo hecho en conjunto está dedicado a todos nuestros compañeros de la facultad de
Ingeniería d Sistemas que se esfuerzan día a día por lograr sus objetivos y cumplir sus sueños.
También se lo dedicamos a aquellos docentes que nos brindan paciencia al explicarnos las dudas
2
Agradecimientos
Agradecemos a Dios por bendecirnos la vida, por guiarnos a lo largo de nuestra existencia, ser
A nuestro profesor Román Concha, Norberto que nos motivó a realizar este trabajo el cual nos
llena de orgullo.
A las personas que nos apoyaron directa e indirectamente, como lo son nuestros padres por el
inmenso amor que nos brindan, nuestros hermanos por estar siempre presentes y demás familiares
3
Resumen
Las relaciones y las redes sociales son un componente clave en la vida de los seres humanos, el
En la actualidad, con la emergencia de Internet, las redes han evolucionado, permitiendo a las
personas organizarse en las, a partir de ahora llamadas, redes sociales virtuales. Estas divergen de
Las redes sociales virtuales permiten a las personas acceder y compartir información sobre
diferentes áreas de interés, realizar publicaciones implicando a uno o más individuos, iniciar
conversaciones y muchas otras diversas funcionalidades. Todas ellas tienen como fin vincular a
las personas.
De esta evolución en la forma de socializar de los seres humanos se desprende el objetivo del
presente trabajo. Realizar un análisis sobre los diferentes individuos involucrados dentro de una
red social virtual, los roles que estos representan y las relaciones entre cada uno de ellos. Para ello,
se identifican los distintos tipos de redes que existen y sus características, los diferentes métodos
Tanto la información en común entre los usuarios como el grafo que representa la red,
constituyen una herramienta que permite obtener resultados sobre los comportamientos y
preferencias de las personas, otorgándole flexibilidad a quien lleva a cabo el análisis para poder
alterar las ponderaciones de las variables con el fin de obtener resultados precisos acotados a su
búsqueda.
4
Índice
Resumen.............................................................................................................................. 1
1. Introducción ............................................................................................................ 3
5
indice de figuras
6
1. Introducción
El objetivo del presente trabajo consiste en realizar un análisis sobre los diferentes
individuos involucrados dentro de una red social virtual, los roles que estos representan y
las relaciones entre cada uno de ellos y proveer un prototipo de una herramienta para
El presente escrito cuenta con una serie de secciones teóricas, es decir, que sirven de
marco teórico que servirá luego para el desarrollo de la herramienta, y una serie de
teóricas. El apartado “Análisis de Redes Sociales” explica los dos métodos principales para
Socio-céntrico. Mediante la teoría de grafos y usando las herramientas que nos brindan los
lenguajes de programación como Python y Java buscamos realizar un código que explica
el funcionamiento que se tiene en una red social cuando se implementa mediante grafos.
Una vez finalizadas las secciones teóricas, se presentan una serie de secciones aplicadas
al desarrollo del prototipo. La primera sección es “Análisis del prototipo”, la cual enumera
las variables que se tendrán en cuenta y procedimiento mediante el cual estas se analizarán.
1
2. Redes sociales
2.1.Concepto y finalidad
por muchos autores conocidos como son Hagel y Armstrong, Romm, Etzioni, Lazar
JR, Preece J, etc. Mediante sus definiciones según sus perspectivas hemos sacado
Una red social la podemos definir como un medio en el cual se enlazan personas
común.
2.2.Desarrollo
Las redes sociales se han visto desde inicios del hombre siendo ésta muy amplia,
por eso nos centraremos en lo que es una red social virtual. El problema que se ha
el Perú existían los chasquis para transmitir los menajes de una cultura a otra, pero
2
luego con el desarrollo de la tecnología esto ha ido cambiando haciendo más fácil
primero con el uso del fax, teléfonos, hasta que el internet estuvo al alcance de todas
las personas, mediante este medio se comenzó a usar las redes sociales que nos
muy cómoda.
3. Métodos
El objetivo de los métodos para recolectar información de las redes sociales virtuales es
proveer un conjunto de datos que permita analizar los efectos que la red tiene en los
interacción.
Egocéntrico.
3.1.Método Socio-céntrico
etapas. La primera etapa consiste en analizar las relaciones entre cada uno de los
actores de la Red Social Virtual. Los tipos de relaciones deben ser analizados
a:
3
• Fuerza: frecuencia, duración y estabilidad de la relación en el tiempo.
Social Virtual.
Estas etapas requieren que cada individuo responda una serie de preguntas
4
Figura 2: Matriz utilizada para el análisis Socio-céntrico
La matriz está compuesta por filas y columnas que representan a todos los actores
de la red. Cada celda representa la respuesta dada por el primer actor sobre el
y permiten a los investigadores analizar cuán bien se conocen los actores dentro de
una red.
Sin embargo, cuando los grupos son grandes, el método Socio-céntrico tiene un
3.2.Método Ego-céntrico
conectan.
5
Figura 3: Método de análisis Ego-céntrico
el resto de los nodos dentro de la red. El número de relaciones establece cuán central
actor tiene un rol fundamental dentro de la red social virtual; por el contrario, si
este número es bajo, significa que este actor no es principal dentro de la red y, por
Para utilizar RFacebook, primero tiene que registrarse para obtener una
6
Una vez que estés autenticado, puede utilizar las funciones RFacebook para
social:
require(Rfacebook)
load("fb_oauth.Rd") ## load my previously saved
authentication token
require(igraph)
my_graph <-
graph.adjacency(my_network[!singletons,!singletons])
layout <-
layout.drl(my_graph,options=list(simmer.attraction=0))
plot(my_graph, vertex.size=2,
#vertex.label=NA,
vertex.label.cex=0.5,
edge.arrow.size=0, edge.curved=TRUE,layout=layout)
Figure 4: Programa R
Quité los únicos de la tabla de abajo para que sea más sencilla, mediante la
exclusión de los amigos eran amigos de mí, pero ninguno de mis otros amigos.
7
Figure 5: Representación de los amigos en Facebook.
Decidí no incluir los nombres de mi amigo en la tabla, pero los grupos que
que no conocen a ninguno de mis amigos en el resto del mundo. Otros grupos
aislados son mis amigos del Reino Unido, el trabajo y amigos relacionados con
Seattle. Es bastante impresionante cómo usar sólo las relaciones amigo (el
de que baremo hacer más con el informativo adicional disponible, que incluye
8
el cumpleaños, la ubicación, la foto de perfil y estado civil de sus amigos. Sólo
ver todo de tus amigos red social, sólo la parte que está a sólo amigos. Aun así,
es una rica fuente de datos para jugar, y estoy seguro de capacidades adicionales
Gephi y R
9
Facebook authentication
01
02 install.packages("Rfacebook")
03 library(Rfacebook)
oauth <- fbOAuth(app_id = "your_app_id_here",
04 app_secret = "your_app_secret_here",
05 extended_permissions = T)
06 save(oauth, file="fb_oauth")
07 # load(file="fb_oauth")
08
Figure 6: autentificación de Facebook
vínculos entre las personas en su lista de amigos, ya sea como una lista de
10
almacenarlas en una carpeta local (aquí FBImages). La descarga en sí
Hay varias maneras de mover datos de red de R a Gephi (ambos admiten varios
formatos como gexf). Sin embargo, para redes simples / pequeñas, la forma más
archivos CSV: uno que contenga una lista de bordes que describa cada enlace
(las columnas que contienen el nodo de inicio y el nodo final para cada enlace
11
correspondientes a los utilizados en Origen y Destino. Cualquier otro atributo
generalmente es opcional, pero aquí debe tener una imagen llamada, que
general hasta que esté satisfecho con él, luego cambie a la pestaña Vista
previa.
campo a continuación.
falla que encontré (que el creador del plugin Chris Xueamablemente ayudó)
13
Figure 12:Red de imágenes de Facebook: Gephi.
ambos funcionan bien. Estoy más familiarizado con el igraph, lo que hace que
sea más fácil modificarlo, pero qgraph tiene incorporada la opción de imágenes
de nodo, por lo que es muy fácil obtener un mapa de red con fotos de nodos
vea bien.
14
Plot the network with igraph (no images yet)
require("png")
require("jpeg")
require("igraph")
fb.net <- graph.adjacency(fb.net.mat)
# Add node degree, node colors based on gender, and
# edge colors based on the color of the source node.
my.friends$degree <- degree(fb.net)
my.friends$color <- "gray45"
my.friends$color[my.friends$gender=="female"] <- "lightpink3"
my.friends$color[my.friends$gender=="male"] <- "lightblue"
fb.net.el$color <- my.friends$color[match(fb.net.el$Source, my.friends$name)]
l <- layout.fruchterman.reingold(fb.net, niter=10000,area=vcount(fb.net)^2.3,
repulserad=vcount(fb.net)^2.2)
png("Facebook-friends-net-IGRAPH.png", width = 2500, height = 2000)
plot(fb.net, vertex.size=my.friends$degree/20, vertex.label=NA,
vertex.color=my.friends$color, edge.color=fb.net.el$color,
edge.width=1, edge.arrow.size=0, edge.curved=0.3, layout=l)
dev.off()
Figure 13: Trazar la red con igraph (todavía no hay imágenes)
trazaremos el grafo, pero esta vez con cuadrados blancos para los nodos. Luego
las fotos sobre esos cuadros blancos. Una cosa que tardó un poco en descubrirse
(la obtuve gracias a un comentario dejado en algún lugar en las interwebs por el
autor de qgraph Sacha Epskamp) es que el diseño debe ser re-escalado a [-1,1]
primero.
16
Figure 16: Red de fotografías de Facebook: igraph.
Realmente no hay mucho que explicar aquí: las imágenes de nodo son una opción
17
.
Plot the image network with qgraph
83 require("png")
84 require("qgraph")
85 png("Facebook-friends-net-2014-04-QGRAPH.png", width = 2500, height =
2000)
86 qgraph(fb.net.mat, images = my.friends$picture.dld, labels = F,
87 borders = F, esize=0.1, curve=0.2, curveAll=T,
88 edge.color="gray55")
89 dev.off()
90 detach(package:qgraph)
Figure 17: Trazar la red de imágenes de qgraph.
18
3.3.3.1.Incrementar un grafo por un arco en Python
para mostrar los grafos relacionados con Facebook que toma 4 campos de
19
import numpy as np
class Graph:
source = []
target = []
weight = []
vertex = []
undirected = 0
self.set_vertex()
def print_r(self):
print("Source: ", self.source)
print("Target: ", self.target)
print("Weight: ", self.weight)
print("Vertex: ", self.vertex)
def set_vertex(self):
vertex = np.unique(self.source)
vertex2 = np.unique(self.target)
self.vertex = np.unique(np.concatenate([vertex,
vertex2]))
return self.vertex
def export(self):
array_export = [(int(self.source[i]),
int(self.target[i]), self.weight[i]) for i in
range(self.source.size)]
return array_export
20
import numpy as np
from _graph.DynamicGraph import DynamicGraph
class GraphAPSP(DynamicGraph):
total_vertex = len(self.vertex)
Q = np.array(self.vertex)
dist = np.zeros(total_vertex)
dist.fill(np.inf)
dist[self.vertex == source] = 0
while len(Q) != 0:
min = np.inf
u = 0
for q in Q:
if dist[self.vertex == q] <= min:
min = dist[self.vertex == q]
u = q
return dist
def apsp_dijkstra(self):
return result
def floyd_warshall(self):
total_vertex = len(self.vertex)
dist = np.zeros((total_vertex, total_vertex))
dist.fill(np.inf)
21
for idx in range(self.source.size):
index_s = self.vertex == self.source[idx]
index_t = self.vertex == self.target[idx]
dist[index_s, index_t] = self.weight[idx]
for index in range(self.vertex.size):
dist[index, index] = 0
for k in np.nditer(self.vertex):
for i in np.nditer(self.vertex):
for j in np.nditer(self.vertex):
index_k = self.vertex == k
index_i = self.vertex == i
index_j = self.vertex == j
return dist
C) Grafo Pro: Trata principalmente las condiciones que debe tener un grafo
class GraphPro(GraphKNNB):
def __init__(self, source=[], target=[], weight=[],
directed=True):
GraphKNNB.__init__(self, source, target, weight, directed)
@staticmethod
def creategraph(total_nodes, pro_edges, weights, directed=True):
source = np.array([])
target = np.array([])
weight = np.array([])
for i in range(total_nodes):
for k in range(i+1, total_nodes):
if k == i:
continue
22
p = 1 - pro_edges
has_edge = np.random.choice(2, 1, p=[p,
pro_edges])[0]
if not has_edge:
continue
probabilities = np.zeros(len(weights))
probabilities = probabilities + (1 /
len(weights))
w = np.random.choice(weights, 1,
p=probabilities)[0]
source = np.append(source, i)
target = np.append(target, k)
weight = np.append(weight, w)
if not directed:
source = np.append(source, k)
target = np.append(target, i)
weight = np.append(weight, w)
if self.last_vertex_modified.size > 0:
last = (int(self.last_vertex_modified[0]),
int(self.last_vertex_modified[1]))
list_edges.remove(last)
if not self.directed:
list_edges.remove((int(self.last_vertex_modified[1]),
int(self.last_vertex_modified[0])))
if with_weight:
edge_labels = dict([((u, v,), d['weight']) for
u, v, d in gr.edges(data=True)])
nx.draw_networkx_edge_labels(gr, pos=pos,
edgelist=list_edges, edge_labels=edge_labels)
if len(last) > 0:
nx.draw_networkx_edges(gr, pos=pos,
edgelist=[last], width=2.0, edge_color='b')
plt.axis('off')
plt.show()
23
D) Grafo KNNB: Trata principalmente de determinar nodos en qué posición
debe ir, también se habla de este algoritmo los vértices que longitud debe
ir, etc.
import numpy as np
from _graph.GraphRR import GraphRR
class GraphKNNB(GraphRR):
z = self.node_incremental['node']
T1 = self.node_incremental['source']
T2 = self.node_incremental['target']
min_in_z = {}
min_out_z = {}
for v in self.vertex:
if v == z:
continue
for k_in in T1:
#if v == k_in:
# continue
L_vz = dist[self.vertex == v, self.vertex == k_in][0]
+ self.get_weight(k_in, z)
if v not in min_in_z or L_vz < min_in_z[v]:
min_in_z[v] = L_vz
for k_out in T2:
#if v == k_out:
# continue
24
if v not in min_out_z or L_zv <
min_out_z[v]:
min_out_z[v] = L_zv
for i, L_iz in min_in_z.items():
for j, L_jz in min_out_z.items():
if i == j:
continue
if L_iz + L_jz < dist[self.vertex == i,
self.vertex == j][0]:
dist[self.vertex == i, self.vertex == j]
= L_iz + L_jz
return dist
E) Grafo dinámico: Esta función realiza un recorrido de los vértices hasta que
import numpy as np
class DynamicGraph(Graph):
self.last_vertex_modified = np.array([])
self.node_incremental = {
'node': None,
'source': np.array([]),
'target': np.array([]),
}
def dynamic_decreasing_random_vertex(self):
25
choisen = self.target[node == self.source]
if choisen.size < 1:
return
self.dynamic_decreasing_vertex(other_node, node)
return self.dynamic_decreasing_vertex(node,
other_node)
index = np.where(np.logical_and(self.source ==
source, self.target == target))[0][0]
returned = np.array([])
self.last_vertex_modified = returned
return returned
26
def dynamic_incremental_random_vertex(self, weights=[1,
2, 3, 4, 5, 6, 7, 8, 9]):
w = np.random.choice(weights)
index_for_target = np.invert(
np.logical_or(np.in1d(self.vertex,
self.target[node == self.source]), self.vertex == node)
choisen = self.vertex[index_for_target]
if choisen.size < 1:
index_for_source = np.invert(
np.logical_or(np.in1d(self.vertex,
self.source[node == self.target]), self.vertex == node)
choisen = self.vertex[index_for_source]
return
self.dynamic_incremental_vertex(other_node, node, w)
return self.dynamic_incremental_vertex(node,
other_node, w)
returned = np.array([])
27
returned = np.append(returned, target)
self.last_vertex_modified = returned
return returned
return -1
sources = np.array(sources)
targets = np.array(targets)
self.target = np.concatenate((self.target,
np.full(sources.size, node), targets))
self.weight = np.concatenate((self.weight,
w_sources, w_targets))
self.node_incremental['node'] = node
self.node_incremental['source'] = sources
self.node_incremental['target'] = targets
return self.node_incremental
28
def vertex_update(self, source, target, weight=1):
self.weight[np.logical_and(self.source == source,
self.target == target)] = weight
if not self.directed:
self.weight[np.logical_and(self.source ==
target, self.target == source)] = weight
self.last_vertex_modified = np.array([source,
target, weight])
return self.last_vertex_modified
if choisen.size < 1:
4. Discusión y Resultados
mismo grafo después de una inserción, en este caso el arco insertado es \left (3, 0, 1
29
removido fue \left (0, 4 \right). De esta manera tenemos nuestro grafo dinámico
aleatorio.
Salida 1
#os.system('clear')
print("<--------Test Create------->\n")
num_tries = 1000
sources = [1, 0, 3, 2, 1, 4, 5, 4, 3, 5]
targets = [0, 2, 0, 1, 3, 1, 1, 3, 5, 4]
weights = [2, 2, 4, 3, 2, 4, 4, 3, 5, 1]
graph = G(sources, targets, weights)
graph.print_r()
print("-------Incremental-----")
print("-------Calc source(2)-----")
source = 1
dist = graph.sssp_dijkstra(source)
print(dist)
graph.vertex_update(1, 3, 1)
mean_time_dijkstra_sp = 0
for times1 in range(num_tries):
t = time()
graph.sssp_dijkstra(source)
lapsed = time() - t
mean_time_dijkstra_sp = mean_time_dijkstra_sp + lapsed
mean_time_dijkstra_sp = mean_time_dijkstra_sp / num_tries
30
dist_new = graph.dijkstra_truncated(dist.tolist())
print(dist_new)
mean_time_rr_sp = 0
for times2 in range(num_tries):
t = time()
graph.dijkstra_truncated(dist.tolist())
lapsed = time() - t
mean_time_rr_sp = mean_time_rr_sp + lapsed
mean_time_rr_sp = mean_time_rr_sp / num_tries
print()
print('SSSP Dijkstra: ', mean_time_dijkstra_sp)
print('SSSP RR :', mean_time_rr_sp)
print('Is less?', mean_time_rr_sp < mean_time_dijkstra_sp)
print()
graph.draw()
print()
print("------------------------")
Salida2
os.system('clear')
print("<--------Test Floyd-Warshall------->\n")
weights = [1, 2, 3, 4, 5]
#graph = g.creategraph(6, .75, weights, directed=False)
sources = [0, 1, 0, 2, 0, 3, 0, 5, 1, 2, 1, 3, 1, 4, 1, 5, 2, 3, 2, 4, 3, 4,
3, 5, 4, 5]
targets = [1, 0, 2, 0, 3, 0, 5, 0, 2, 1, 3, 1, 4, 1, 5, 1, 3, 2, 4, 2, 4, 3,
5, 3, 5, 4]
weights = [2, 2, 2, 2, 4, 4, 1, 1, 3, 3, 2, 2, 4, 4, 4, 4, 2, 2, 1, 1, 3, 3,
5, 5, 1, 1]
graph = g(sources, targets, weights)
graph.print_r()
print('.........................')
t = time()
print(graph.floyd_warshall())
elapsed = time() - t
print("Time: ", elapsed)
graph.draw()
os.system('clear')
print("<--------Test Khopkar------->\n")
weights = [1, 2, 3, 4, 5]
sources = [1, 0, 3, 2, 1, 4, 5, 4, 5]
targets = [0, 2, 0, 1, 3, 1, 1, 3, 4]
weights = [2, 2, 4, 3, 2, 4, 4, 3, 1]
graph = g(sources, targets, weights)
print('.........................')
dist = graph.floyd_warshall()
print(dist)
graph.dynamic_incremental_node(
node=6, sources=[2], w_sources=[1], targets=[5], w_targets=[1])
dist_new = graph.knnb_node_incremental(dist.tolist())
print(dist_new)
graph.print_r()
#graph.draw()
print('.........................')
dist2 = graph2.floyd_warshall()
print(dist2)
graph2.dynamic_incremental_node(
node=13, sources=[1, 3], w_sources=[1, 1], targets=[2, 4], w_targets=[1, 1])
dist2_new = graph2.knnb_node_incremental(dist2.tolist())
print(dist2_new)
graph2.print_r()
32
4.2. Aplicación Gephi
reconocible por lo cual escogemos GOP. Por lo cual nos va mostrar un código de su
dirección de enlace.
Esta página trata principalmente las noticias más recientes del presidente de Estados
Unidos que es TRUMP. La idea es saber que personas le dieron me gusta esa página
33
Figure 30: página de Facebook de elección.
Después que nos da el código buscamos en Facebook NETVIZ por lo cual nos
34
Figure 31: Ubicación de las personas que interactúan con la página.
programa Gephi y nos fijamos en abrir archivo y lo damos click y nos mostrara que
35
Y podemos simular el grafo y darle girarían 3d cambiarle colores las aristas,
aumentar los tamaños de los nodos, etc. También podemos ver las tablas de datos o
registros.
dieron like la página, las páginas relacionadas con esta página, etc.
36
Figure 33: Base de datos.
5. Conclusiones
La realización del presente trabajo implico varias partes en todo su desarrollo, como
primera parte fue hacer una exhaustiva investigación para adquirir conocimientos de las
redes sociales, como funcionan, cual es el impacto de las redes sociales como Facebook o
de una red social para posteriormente hacer el respectivo análisis, se encontró una
aplicación que podría hacerlo para así pasar a la tercera parte que corresponde al análisis
de esa base de datos, en esta parte decidimos a través de que lenguaje de programación
sería más conveniente realizar el análisis, cabe destacar que Python fue lo ideal para la
realización del proyecto, ya que hay distintos programas que pueden realizar esta acción,
37
Usamos varios métodos entre los más comunes se encuentran aquellos que se desarrollan
mediante lenguajes de programación como los que usamos que son Programa en R, Python,
Gephi, qgraph y rgraph lenguajes que nos demuestran a su manera el análisis de las redes
sociales a través de las conexiones, con las personas a lo largo del mundo y como estas
interactúan en el medio online, mediante grafos, estos nos pueden indicar desde las
ubicaciones de nuestros amigos en Facebook, el lugar geográfico que brinda de más likes
38
6. Bibliografía
Gámez, Julián & Varela, Agustina – (2015). Análisis de la red social virtual Facebook.
"Redes Sociales". Autor: María Estela Raffino. Para: Concepto. De. Disponible en:
https://concepto.de/redes-sociales/. Consultado: 03 de julio de 2019.
Peres Solá, Cristina & Casas Roma, Jordi (2016). Análisis de Datos de redes sociales.
39