{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En mi [post anterior](./cuanto-dinero-le-ha-hecho-perder-bancolombia.html) empec\u00e9 a documentar el abuso de Bancolombia de\n",
"tener productos cuya fecha de caducidad es autom\u00e1tica y desconocida por sus clientes, como ocurre con la Sucursal Virtual de Empresas y\n",
"di una serie de consejos para quejarse efectivamente en Internet, articulando la presencia en blogs con la de las redes sociales, \n",
"en particular twitter. Di un esquema general de esta serie de escritos y dije que la segunda l\u00ednea de acci\u00f3n ser\u00eda tazar el costo \n",
"de estas pr\u00e1cticas por parte de la entidad bancaria, no s\u00f3lo para mi, sino para personas que tambi\u00e9n fuesen v\u00edctimas de ellas. Este segundo \n",
"post va en esa l\u00ednea y empezar\u00e1 intentando hacer una m\u00e9trica, cada vez m\u00e1s precisa, de c\u00f3mo se expande la mala fama de Bancolombia en\n",
"Twitter. Otras m\u00e9tricas venideras permitir\u00e1n medir las p\u00e9rdicas econ\u00f3micas que dichas pr\u00e1cticas causan a las personas, para finalmente\n",
"entrar en la de denuncias ante entidades de control, con aquello de lo que se ha hecho recuento ac\u00e1 como elementos que pueden ser llevados\n",
"antes dichas entidades. Es decir, empezaremos tazando el impacto negativo para Bancolombia de sus pr\u00e1cticas, luego para los clientes de\n",
"tal entidad y finalmente usaremos la informaci\u00f3n recopilada en todos estos post para construir un caso en su contra en entidades de control.\n",
"\n",
"Como en el texto anterior, este no tiene un caracter p\u00faramente de denuncia, sino tambien tutorial, pues ense\u00f1ar\u00e9 c\u00f3mo calcular dichos \n",
"perjuicios de reputaci\u00f3n institucional y dinero personal y empresarial y c\u00f3mo tener mejores estrategias de denuncia. Sin embargo, en \n",
"este caso el tutorial tendr\u00e1 un caracter m\u00e1s te\u00f3rico, pues se usar\u00e1n ciertas t\u00e9cnicas de \n",
"[teor\u00eda de grafos](http://en.wikipedia.org/wiki/Graph_theory) y *[data scraping](https://en.wikipedia.org/wiki/Data_scraping)*\n",
"para hacer visible y auditable la mala fama que circula sobre Bancolombia, pero que luego puede ser aplicable a otras entidades que\n",
"cometen abusos similares a los denunciados. Esto adem\u00e1s lo usaremos como tutorial en otros cursos de programaci\u00f3n para novatos, \n",
"usando este caso real y eventualmente habr\u00e1 una traducci\u00f3n de este texto, para ver c\u00f3mo las denuncias se propagan en otro idioma.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Favor RT o lo que pueden hacer unos pocos reenv\u00edos de mensajes\n",
"\n",
"Una de las cosas que m\u00e1s me sorprendi\u00f3 de mis quejas contra Bancolombia era c\u00f3mo se expand\u00edan en la red a trav\u00e9s de Twitter. A los pocos\n",
"minutos ten\u00eda ya un par de retuits:\n",
"\n",
"\n",
"\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Como dije en el escrito anterior, hay que enviar el mensaje en diferentes d\u00edas, debido a los distintos ritmos de las redes sociales. Ac\u00e1\n",
"est\u00e1 el resultado los retuits de otro mensaje donde se compart\u00eda el mismo enlace:\n",
"\n",
"\n",
"\n",
"
\n",
"\n",
"\n",
"
\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hay tambi\u00e9n otros mensajes que no se originan como retuits, sino como tuits en s\u00ed mismos. Ac\u00e1 los resultados de esta b\u00fasqueda:\n",
"\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ahora bien, les sorprender\u00eda saber que **con pocos retuits basta para llegar a varias decena de miles de personas en la red**, como se calcular\u00e1 \n",
"en un momento. \n",
"Si consideremos que, al d\u00eda de hoy **Bancolombia tiene cerca de 111.000 seguidores en Twitter** y que ha invertido centenas de millones en \n",
"construir su presencia y reputaci\u00f3n en l\u00ednea, no deja de ser interesante lo que un caso bien documentado, algunos retuits y la geometr\u00eda de los \n",
"6 grados de separaci\u00f3n de las redes sociales, puede hacer para llegar a una cantidad considerable de personas con pocos saltos de mensajes\n",
"y buenas conexiones entre ellas. Procesamos a los c\u00e1lculos. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# \u00bfA cu\u00e1ntas personas llegamos?\n",
"\n",
"El c\u00e1lculo se empezar\u00e1 grueso, y se ir\u00e1 afinando. Empezar\u00e9 mir\u00e1ndo cu\u00e1ntos seguidores tienen todas las personas que han compartido el enlace.\n",
"Los sumar\u00e9 de una manera sencilla y luego descontar\u00e9 los seguidores compartidos entre ellos, de forma que s\u00f3lo miremos qu\u00e9 informaci\u00f3n llega\n",
"a seguidores \u00fanicos.\n",
"\n",
"Para lo anterior definiremos un diccionario que contiene los avatares de quienes retuitearon y sus seguidores."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"nuestrosSeguidores = {\n",
" \"andresfcalderon\": 563 ,\n",
" \"xtingray\": 154, \n",
" \"ijpulidos\": 39, \n",
" \"hpsaturn\":1400, \n",
" \"irenarco\": 853, \n",
" \"kmilo\": 1583,\n",
" \"edusan\": 194,\n",
" \"Orinaldeiglesia\": 58,\n",
" \"zilegman\":459,\n",
" \"jorgitomacumba\": 12800,\n",
" \"donIngeniero\": 992,\n",
" \"kerobero\": 57,\n",
" \"isadiceque\": 197,\n",
" \"taufpate\": 406,\n",
" \"Menticolcito\": 316,\n",
" \"La_eche\": 7582,\n",
" \"DivisionDeAriza\": 1697,\n",
" \"carobotero\": 5573,\n",
" \"athpernath\": 41,\n",
" \"no_HAY_palabras\": 86,\n",
" \"wikiperiodismo\": 18300,\n",
" \"offrayLC\": 465\n",
" }"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 62
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ahora sumemos todos los seguidores de las personas que hicieron un retuit y compartieron este mensaje."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sum(nuestrosSeguidores.values())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 63,
"text": [
"53815"
]
}
],
"prompt_number": 63
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nada mal! Entre todos y todas **estamos llegando casi a la mitad de los seguidores de Bancolombia, a *grosso modo***, sin invertir millones y sin necesidad de ser un banco. Ahora bien, como dije esta es s\u00f3lo una primera aproximaci\u00f3n. Necesitamos quitar los seguidores compartidos, lo cual reduce el n\u00famero, pero sigue produciendo resultados interesantes. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hagamos una gr\u00e1fica de lo anterior para apreciarlo mejor (esta gr\u00e1fica tambi\u00e9n se ir\u00e1 afinando). \n",
"Hay muchas posibilidades para hacer los gr\u00e1ficos, pero como ac\u00e1 queremos representar c\u00f3mo las conexiones entre las personas ayudan a difundir\n",
"la informaci\u00f3n de maneras que desaf\u00edan a las instituciones con mucho m\u00e1s dinero, usaremos una biblioteca para representar \n",
"[grafos](http://en.wikipedia.org/wiki/Graph_%28mathematics%29) en python llamada [NetworkX](http://networkx.github.io/), \n",
"que es m\u00e1s adecuada para este tipo de tem\u00e1ticas."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Importamos las bibliotecas y las variables de entorno que usaremos en el\n",
"# notebook\n",
"%matplotlib inline\n",
"\n",
"# Biblioteca para trabajar con Grafos\n",
"import networkx as nx\n",
"\n",
"# Biblioteca para trabajar con im\u00e1genes\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Soporte de d3 (gr\u00e1ficas en la web) para matplotlib\n",
"from mpld3 import enable_notebook\n",
"enable_notebook()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Una variable que almacena el grafo de difusi\u00f3n de mensajes entre\n",
"# los seguidores de Bancolombia y nosotros\n",
"difusion = nx.Graph()\n",
"\n",
"# Adicionamos nodos\n",
"difusion.add_node(\"bancolombia\")\n",
"difusion.add_node(\"nosotros\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 50
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Par\u00e1metros de la gr\u00e1fica\n",
"plt.rc('figure', figsize=(9, 7))\n",
"\n",
"# Dibujamos el grafo con el tama\u00f1o de los nodos igual al n\u00famero de seguidores\n",
"nx.draw_circular(difusion, node_size=[111000, sum(nuestrosSeguidores.values())])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"\n",
"\n",
"