{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "d4b08101-b0aa-4afa-9c9a-4cf4510b3d2e", "metadata": {}, "outputs": [], "source": [ "import math\n", "import statistics\n", "import networkx as nx\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "6d669d85-4a77-4477-a1f4-c6029251e640", "metadata": {}, "outputs": [], "source": [ "def degrees_list(G): \n", " return [d_v for (v, d_v) in G.degree()]\n", "\n", "def AnalyzeGraph(G, verbose=True):\n", " print(\"Analyzing the graph.\")\n", " print(f'There are {G.number_of_nodes()} nodes: {G.nodes() if verbose else \"--\"}')\n", " print(f'There are {G.number_of_edges()} edges: {G.edges() if verbose else \"--\"}')\n", " print(f'Average degree: {statistics.mean(degrees_list(G))}')\n", " print(f'Density: {nx.density(G)}')\n", " print(f'Average distance: {nx.average_shortest_path_length(G)}')" ] }, { "cell_type": "code", "execution_count": 3, "id": "790ec02b-27c4-45a6-88e7-0d4885a57616", "metadata": {}, "outputs": [], "source": [ "def VisualizeGraph(G, sizex=7, sizey=7):\n", " labels = {node: str(node) for node in G.nodes()}\n", " plt.figure(figsize=(sizex, sizey))\n", " node_sizes = [math.log(d + 1) * 8 for d in degrees_list(G)]\n", " pos = nx.forceatlas2_layout(G, scaling_ratio=1.5) # gravity=0.3\n", " nx.draw(G, pos=pos, node_size=node_sizes, labels=labels, font_size=7) " ] }, { "cell_type": "markdown", "id": "0fdb90d5-9d18-4c7c-bfe2-7870b30012a5", "metadata": {}, "source": [ "# Grafo dos Cientistas da Computação" ] }, { "cell_type": "code", "execution_count": 4, "id": "07af9cf9-9c40-4157-abd1-ce05e6a39ac3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Graph with 704 nodes and 5918 edges\n" ] } ], "source": [ "G = nx.read_gexf('network_scientists.gexf')\n", "print(G)" ] }, { "cell_type": "code", "execution_count": 5, "id": "c6074af2-f9cb-4d34-a4d4-80ba18bc1061", "metadata": {}, "outputs": [], "source": [ "#VisualizeGraph(G, 8, 8)" ] }, { "cell_type": "code", "execution_count": 6, "id": "a59e0254-70ca-45ac-9479-8cc7a97d212a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Analyzing the graph.\n", "There are 490 nodes: --\n", "There are 5898 edges: --\n", "Average degree: 24.073469387755104\n", "Density: 0.049229998747965444\n", "Average distance: 3.1241016652059597\n" ] } ], "source": [ "maior_componente = max(nx.connected_components(G), key=len)\n", "G2 = nx.subgraph(G, maior_componente)\n", "AnalyzeGraph(G2, verbose=False)" ] }, { "cell_type": "code", "execution_count": 7, "id": "e89fced6-e74d-4a9b-8d96-fea0ede24ef7", "metadata": {}, "outputs": [], "source": [ "#VisualizeGraph(G2, 8, 8)" ] }, { "cell_type": "code", "execution_count": null, "id": "b1d5a8fd-70d8-4191-8241-2a0bd76ba686", "metadata": {}, "outputs": [], "source": [ "import random\n", "sampled_edges = random.sample(list(G2.edges()), 120)\n", "H = nx.Graph()\n", "H.add_edges_from(sampled_edges)\n", "H = nx.subgraph(H, max(nx.connected_components(H), key=len))\n", "AnalyzeGraph(H, verbose=False)\n", "#VisualizeGraph(H)" ] }, { "cell_type": "code", "execution_count": 8, "id": "9f4c4e3a-864b-4fac-9f90-8f44611b3943", "metadata": {}, "outputs": [ { "data": { "image/png": "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dj0j48aNU5UqVfTf//63zDU447///a+sVquGDBliW1a1alVNmjRJmZmZ2rlzp932v/vd71S7dm3b81tvvVWS9N1333m0TqAicBoLMIHMzEyFh4dLkk6cOCHDMDRr1izNmjWr2O3Pnz+v+vXr69SpU4qLiyuyvmnTpsXuFxMTU2TZ8ePHdejQIdWrV8/haxVsl56ebqvT0XZllZmZKUkKCgpyuM1jjz2mDz74QP369VP9+vV1xx136IEHHlDfvn2dfp3i3oOSNGvWzO55rVq1FBkZ6fHLx0+dOqVmzZoVuUKs4LTXqVOn7JY3bNjQ7nlB8CnveCrAFxB2gEruhx9+UHp6ui2gFAwK/tOf/uSwB8JRmClNcVde5efnq3fv3nriiSeK3efGG2+0bRceHq5Vq1YVu52jsOSsw4cPSyq5beHh4UpMTNSmTZv0ySef6JNPPtHy5cs1fPjwIgN3HanIq8/y8vIq7LX8/f2LXW4YRoXVAHgKYQeo5N5++21JsgWbG264QdLVUxa9evUqcd9GjRrpxIkTRZYXt8yRJk2aKDMzs9TXatKkibZs2aKuXbt6JDBc+z44Uq1aNQ0YMEADBgxQfn6+HnvsMb366quaNWuWmjZt6tKgYWccP35cPXr0sD3PzMxUcnKy+vfvb1tWu3ZtpaWl2e135coVJScn2y1zpbZGjRrp0KFDys/Pt+vd+eabb2zrgesFY3aASmzbtm165plnFBMTYxtnEx4eru7du+vVV18t8mUpST/99JPt//v06aP4+HglJibalqWmpjrsfSnOAw88oPj4eG3atKnIurS0NOXm5tq2y8vL0zPPPFNku9zc3CJf9q5455139M9//lNxcXHq2bOnw+0uXLhg99zPz882GWPBDMw1a9a01e4Or732mnJycmzPly1bptzcXPXr18+2rEmTJraxTYX3u7Znx5Xa+vfvr5SUFL3//vu2Zbm5uXrxxRdVq1YtdevWrSzNASolenaASuKTTz7RN998o9zcXJ07d07btm3T5s2b1ahRI3388ccKDAy0bbt06VLdcsstio2N1ejRo3XDDTfo3Llzio+P1w8//KAvv/xSkvTEE09o5cqV6t27tyZOnGi79Lxhw4ZKTU11qifh8ccf18cff6y77rpLI0eOVMeOHXXp0iV99dVXWrNmjb7//nvVrVtX3bp109ixYzVv3jwlJibqjjvuUNWqVXX8+HGtXr1aL7zwgu67775SX2/NmjWqVauWrly5YptBec+ePWrbtq1Wr15d4r6PPPKIUlNTdfvtt6tBgwY6deqUXnzxRbVr1842lqVdu3by9/fXggULlJ6eroCAAN1+++0OxxqV5sqVK+rZs6ceeOABHTt2TC+//LJuueUW3X333XZ1Pfrooxo8eLB69+6tL7/8Ups2bbKbPNHV2saMGaNXX31VI0eO1IEDB9S4cWOtWbNGe/bs0eLFi0sc2wSYjrcvBwNQsoJLmAse1apVM6xWq9G7d2/jhRdesF1CfK2TJ08aw4cPN6xWq1G1alWjfv36xl133WWsWbPGbruDBw8at956qxEQEGA0aNDAmDdvnrFkyRJDkpGSkmLbrlGjRsadd95Z7GtdvHjRmDlzptG0aVOjWrVqRt26dY2bb77Z+Pvf/2532bVhGMZrr71mdOzY0ahevboRFBRkxMbGGk888YRx9uzZEt+HgkvPCx6BgYFGgwYNjLvuust488037S6zL3Dtpedr1qwx7rjjDiM8PNyoVq2a0bBhQ2Ps2LFGcnKy3X6vv/66ccMNNxj+/v52l3qX9B44uvR8586dxpgxY4zatWsbtWrVMoYOHWpcuHDBbt+8vDxj+vTpRt26dY0aNWoYffr0MU6cOFHkmCXVdu2l54ZhGOfOnTMefvhho27duka1atWM2NhYY/ny5XbbFFx6vmjRoiJtkoNL4oHKxmIYjD4DYG/KlCl69dVXlZmZ6XDgKgBUFozZAa5zv/76q93zCxcu6O2339Ytt9xC0AFgCozZAa5zcXFx6t69u1q2bKlz587pjTfeUEZGhsM5egCgsiHsANe5/v37a82aNXrttddksVjUoUMHvfHGG7rtttu8XRoAuAVjdgAAgKkxZgcAAJgaYQcAAJgaY3Z09Z49Z8+eVVBQkNunigcAAJ5hGIYuXryoqKioIje9LYywI+ns2bOKjo72dhkAAKAMzpw5owYNGjhcT9iRbNOmnzlzRsHBwV6uBgAAOCMjI0PR0dGl3v6EsKP/u5NwcHAwYQcAgEqmtCEoDFAGAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmxgzKHpKXb2hfUqrOX8xSeFCgOseEyd+Pm4wCAFDRCDsesPFwsuauP6Lk9CzbssiQQM0e0Ep9W0d6sTIAAK4/nMZys42HkzVuZYJd0JGklPQsjVuZoI2Hk71UGQAA1yfCjhvl5Ruau/6IjGLWFSybu/6I8vKL2wIAAHgCYceN9iWlFunRKcyQlJyepX1JqRVXFAAA1znCjhudv+g46JRlOwAAUH6EHTcKDwp063YAAKD8CDtu1DkmTJEhgXJ0gblFV6/K6hwTVpFlAQBwXSPsuJG/n0WzB7SSpCKBp+D57AGtmG8HAIAKRNhxs76tI7VsWAdZQ+xPVVlDArVsWAfm2QEAoIIxqaAH9G0dqd6trMygDACADyDseIi/n0VxTep4uwwAAK57nMYCAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACm5tWws2vXLg0YMEBRUVGyWCz68MMP7dZbLJZiH4sWLbJt07hx4yLr58+fX8EtAQAAvsqrYefSpUtq27atli5dWuz65ORku8ebb74pi8WiwYMH22339NNP2203ceLEiigfAABUAl69N1a/fv3Ur18/h+utVqvd848++kg9evTQDTfcYLc8KCioyLYAAABSJRqzc+7cOf3nP//RqFGjiqybP3++6tSpo/bt22vRokXKzc0t8VjZ2dnKyMiwewAAAHOqNHc9f+uttxQUFKRBgwbZLZ80aZI6dOigsLAw/e9//9PMmTOVnJys559/3uGx5s2bp7lz53q6ZAAA4AMshmEY3i5CujoYed26dRo4cGCx61u0aKHevXvrxRdfLPE4b775psaOHavMzEwFBAQUu012drays7NtzzMyMhQdHa309HQFBweXuQ0AAKDiZGRkKCQkpNTv70rRs/PZZ5/p2LFjev/990vdtkuXLsrNzdX333+v5s2bF7tNQECAwyAEAADMpVKM2XnjjTfUsWNHtW3bttRtExMT5efnp/Dw8AqoDAAA+Dqv9uxkZmbqxIkTtudJSUlKTExUWFiYGjZsKOlqF9Xq1av13HPPFdk/Pj5ee/fuVY8ePRQUFKT4+HhNnTpVw4YNU+3atSusHQAAwHd5Nex88cUX6tGjh+35tGnTJEkjRozQihUrJEnvvfeeDMPQkCFDiuwfEBCg9957T3PmzFF2drZiYmI0depU23EAAAB8ZoCyNzk7wAkAAPgOZ7+/K8WYHQAAgLIi7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFMj7AAAAFPzatjZtWuXBgwYoKioKFksFn344Yd260eOHCmLxWL36Nu3r902qampGjp0qIKDgxUaGqpRo0YpMzOzAlsBAAB8mVfDzqVLl9S2bVstXbrU4TZ9+/ZVcnKy7fHuu+/arR86dKi+/vprbd68WRs2bNCuXbs0ZswYT5cOAAAqiSrefPF+/fqpX79+JW4TEBAgq9Va7LqjR49q48aN2r9/vzp16iRJevHFF9W/f3/9/e9/V1RUlNtrBgAAlYvPj9nZsWOHwsPD1bx5c40bN04XLlywrYuPj1doaKgt6EhSr1695Ofnp7179zo8ZnZ2tjIyMuweAADAnHw67PTt21f/+te/tHXrVi1YsEA7d+5Uv379lJeXJ0lKSUlReHi43T5VqlRRWFiYUlJSHB533rx5CgkJsT2io6M92g4AAOA9Xj2NVZoHH3zQ9v+xsbFq06aNmjRpoh07dqhnz55lPu7MmTM1bdo02/OMjAwCDwAAJuXTPTvXuuGGG1S3bl2dOHFCkmS1WnX+/Hm7bXJzc5WamupwnI90dRxQcHCw3QMAAJhTpQo7P/zwgy5cuKDIyEhJUlxcnNLS0nTgwAHbNtu2bVN+fr66dOnirTIBAIAP8epprMzMTFsvjSQlJSUpMTFRYWFhCgsL09y5czV48GBZrVadPHlSTzzxhJo2bao+ffpIklq2bKm+fftq9OjReuWVV5STk6MJEybowQcf5EosAAAgSbIYhmF468V37NihHj16FFk+YsQILVu2TAMHDtTBgweVlpamqKgo3XHHHXrmmWcUERFh2zY1NVUTJkzQ+vXr5efnp8GDB2vJkiWqVauW03VkZGQoJCRE6enpnNICAKCScPb726thx1cQdgAAqHyc/f6uVGN2AAAAXEXYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApubVsLNr1y4NGDBAUVFRslgs+vDDD23rcnJyNH36dMXGxqpmzZqKiorS8OHDdfbsWbtjNG7cWBaLxe4xf/78Cm4JAADwVV4NO5cuXVLbtm21dOnSIusuX76shIQEzZo1SwkJCVq7dq2OHTumu+++u8i2Tz/9tJKTk22PiRMnVkT5AACgEqjizRfv16+f+vXrV+y6kJAQbd682W7ZSy+9pM6dO+v06dNq2LChbXlQUJCsVqtHawUAAJWTyz07CQkJ+uqrr2zPP/roIw0cOFBPPvmkrly54tbirpWeni6LxaLQ0FC75fPnz1edOnXUvn17LVq0SLm5uSUeJzs7WxkZGXYPAABgTi6HnbFjx+rbb7+VJH333Xd68MEHVaNGDa1evVpPPPGE2wsskJWVpenTp2vIkCEKDg62LZ80aZLee+89bd++XWPHjtXf/va3UuuYN2+eQkJCbI/o6GiP1Q0AALzLYhiG4coOISEhSkhIUJMmTbRgwQJt27ZNmzZt0p49e/Tggw/qzJkzZSvEYtG6des0cODAIutycnI0ePBg/fDDD9qxY4dd2LnWm2++qbFjxyozM1MBAQHFbpOdna3s7Gzb84yMDEVHRys9Pb3EYwMAAN+RkZGhkJCQUr+/XR6zYxiG8vPzJUlbtmzRXXfdJUmKjo7Wzz//XMZyHcvJydEDDzygU6dOadu2baWGkS5duig3N1fff/+9mjdvXuw2AQEBDoMQAAAwF5dPY3Xq1El//etf9fbbb2vnzp268847JUlJSUmKiIhwa3EFQef48ePasmWL6tSpU+o+iYmJ8vPzU3h4uFtrAQAAlZPLPTuLFy/W0KFD9eGHH+rPf/6zmjZtKklas2aNbr75ZpeOlZmZqRMnTtieJyUlKTExUWFhYYqMjNR9992nhIQEbdiwQXl5eUpJSZEkhYWFqVq1aoqPj9fevXvVo0cPBQUFKT4+XlOnTtWwYcNUu3ZtV5sGAABMyOUxO45kZWXJ399fVatWdXqfHTt2qEePHkWWjxgxQnPmzFFMTEyx+23fvl3du3dXQkKCHnvsMX3zzTfKzs5WTEyMHnroIU2bNs2l01TOnvMDAAC+w9nv7zKFnbS0NK1Zs0YnT57U448/rrCwMCUkJCgiIkL169cvV+HeQNgBAKDy8dgA5UOHDqlnz54KDQ3V999/r9GjRyssLExr167V6dOn9a9//atchQMAALiTywOUp02bpocffljHjx9XYGCgbXn//v21a9cutxYHAABQXi6Hnf3792vs2LFFltevX982gBgAAMBXuBx2AgICir29wrfffqt69eq5pSgAAAB3cTns3H333Xr66aeVk5Mj6erMx6dPn9b06dM1ePBgtxcIAABQHi6Hneeee06ZmZkKDw/Xr7/+qm7duqlp06YKCgrSs88+64kaAQAAyszlq7FCQkK0efNm7d69W4cOHVJmZqY6dOigXr16eaI+AACAcnHbpIKVGfPsAABQ+bh1np0lS5Y4/cKTJk1yelsAAABPc6pn59rbNvz000+6fPmyQkNDJV2dUblGjRoKDw/Xd99955FCPYmeHQAAKh9nv7+dGqCclJRkezz77LNq166djh49qtTUVKWmpuro0aPq0KGDnnnmGbc1AAAAwB1cHrPTpEkTrVmzRu3bt7dbfuDAAd13331KSkpya4EVgZ4dAAAqH7f27BSWnJys3NzcIsvz8vJ07tw5Vw8HAADgUS6HnZ49e2rs2LFKSEiwLTtw4IDGjRvH5ecAAMDnuBx23nzzTVmtVnXq1EkBAQEKCAhQ586dFRERoX/+85+eqBEAAKDMXJ5UsF69evrvf/+rb7/9VkePHpXFYlGLFi104403eqI+AACAcnE57BS48cYb1axZM0lX748FAADgi1w+jSVJ//rXvxQbG6vq1aurevXqatOmjd5++2131wYAAFBuLvfsPP/885o1a5YmTJigrl27SpJ2796tRx99VD///LOmTp3q9iIBAADKyuV5dmJiYjR37lwNHz7cbvlbb72lOXPmMM8OAACoEB6dZ+fmm28usvzmm29WcnKyq4cDAADwKJfDTtOmTfXBBx8UWf7+++/bBiwDAAD4CpfH7MydO1e/+93vtGvXLtuYnT179mjr1q3FhiAAAABvcrlnZ/Dgwdq7d6/q1q2rDz/8UB9++KHq1q2rffv26d577/VEjQAAAGXm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cBPCDgCfdfvtt6tt27Zau3atJOn+++/X+fPn9cknn+jAgQPq0KGDevbsqdTUVEnSqlWr9Oyzz2rBggU6cOCAGjZsqGXLlhU57tatW3Xs2DFt3rxZGzZsUE5Ojvr06aOgoCB99tln2rNnj2rVqqW+ffvaen5WrVqlp556Ss8++6yOHj2qv/3tb5o1a5beeuutintDAJSNx281CgClGDFihHHPPfcUu+53v/ud0bJlS+Ozzz4zgoODjaysLLv1TZo0MV599VXDMAyjS5cuxvjx4+3Wd+3a1Wjbtq3da0VERNjdmfztt982mjdvbuTn59uWZWdnG9WrVzc2bdpke5133nnH7tjPPPOMERcX53J7AVSsKt4OWwBQEsMwZLFY9OWXXyozM1N16tSxW//rr7/q5MmTkqRjx47pscces1vfuXNnbdu2zW5ZbGysqlWrZnv+5Zdf6sSJEwoKCrLbLisrSydPntSlS5d08uRJjRo1SqNHj7atz83NVUhIiFvaCcBzCDsAfNrRo0cVExOjzMxMRUZGaseOHUW2CQ0NdemYNWvWtHuemZmpjh07atWqVUW2rVevnjIzMyVJr7/+urp06WK33t/f36XXBlDxCDsAfNa2bdv01VdfaerUqWrQoIFSUlJUpUoVNW7cuNjtmzdvrv3792v48OG2Zfv37y/1dTp06KD3339f4eHhCg4OLrI+JCREUVFR+u677zR06NAytweAdxB2APiE7OxspaSkKC8vT+fOndPGjRs1b9483XXXXRo+fLj8/PwUFxengQMHauHChbrxxht19uxZ/ec//9G9996rTp06aeLEiRo9erQ6deqkm2++We+//74OHTqkG264ocTXHjp0qBYtWqR77rlHTz/9tBo0aKBTp05p7dq1euKJJ9SgQQPNnTtXkyZNUkhIiPr27avs7Gx98cUX+uWXXzRt2rQKepcAlAVhB4BP2LhxoyIjI1WlShXVrl1bbdu21ZIlSzRixAj5+V29cPS///2v/vznP+vhhx/WTz/9JKvVqttuu00RERGSroaW7777Tn/605+UlZWlBx54QCNHjtS+fftKfO0aNWpo165dmj59ugYNGqSLFy+qfv366tmzp62n55FHHlGNGjW0aNEiPf7446pZs6ZiY2M1ZcoUj74vAMrPYhiG4e0iAMBTevfuLavVqrffftvbpQDwEnp2AJjG5cuX9corr6hPnz7y9/fXu+++qy1btmjz5s3eLg2AF9GzA8A0fv31Vw0YMEAHDx5UVlaWmjdvrr/85S8aNGiQt0sD4EWEHQAAYGrcLgIAAJgaYQcAAJgaYQcAAJgaYQcAAJgaYQcAAJgaYQcAAJgaYQcAAJgaYQcAAJgaYQcAAJja/wPh/JW1vvzpnwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "degree_counts = nx.degree_histogram(G)\n", "x = range(len(degree_counts))\n", "plt.scatter(x, degree_counts) # scatter, plot\n", "plt.title(\"Degree Distribution\")\n", "plt.xlabel(\"Degree\")\n", "plt.ylabel(\"Number of Nodes\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 9, "id": "db9e36df-4e61-4f50-ae6f-01ea3c561011", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAHLCAYAAADBbjLhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABC3UlEQVR4nO3deXRU9f3/8dckQMKSDAQMCXsERSNITCAUV9aCliC4oUdkqSKlKFhsFexPQ1xKcTsUO8VdVLRF+CKKXwkqYGmRNggi0iBrRAoJWyQLEJCZ+/uDb0aGZJLZl5vn45ycdu7c5f25M+N9ce/nfq7FMAxDAAAAJhQT7gIAAACChaADAABMi6ADAABMi6ADAABMi6ADAABMi6ADAABMi6ADAABMi6ADAABMi6ADAABMi6ADwJTGjx+vLl26hGRbXbp00fjx452vFyxYIIvFoi+//DIk2+/fv7/69+8fkm0B0YagA0Sw6gNm9V98fLzatWunoUOHat68eaqoqAh3iSExa9Ysl/3QrFkzderUSTk5OXrjjTd06tSpgGynsLBQs2bN0nfffReQ9QVSJNcGRLJG4S4AQP0ef/xxpaWl6ccff1RJSYk+//xzPfDAA3r++ef14Ycf6vLLLw93iSExf/58tWjRQqdOndL+/fu1cuVK/fKXv9TcuXP10UcfqWPHjs55X3nlFTkcDq/WX1hYqLy8PPXv39+rs0Hbt29XTExw/91YV22ffPJJULcNRDOCDhAFrr/+evXu3dv5eubMmVq9erWGDx+uESNGaNu2bWratGnI6jEMQ1VVVSHdpiTdcsstatOmjfP1Y489pnfeeUdjx47Vrbfeqn/961/O9xo3bhzUWs7dB3FxcUHdVn2aNGkS1u0DkYxLV0CUGjhwoB599FHt3btXCxcudHnv22+/1S233KKkpCTFx8erd+/e+vDDD2usY8uWLbruuuvUtGlTdejQQU8++aTeeOMNWSwWl0skXbp00fDhw7Vy5Ur17t1bTZs21UsvvSRJOnbsmB544AF17NhRcXFx6tatm+bMmVPjbIrD4dDcuXN12WWXKT4+Xm3bttWkSZP0ww8/+LUf7rzzTt1zzz3697//rU8//dQ5vbY+On/729+UlZWlhIQEJSYmqmfPnvrTn/4k6exlwltvvVWSNGDAAOdlss8//7zefXB+H51qJ06c0KRJk9S6dWslJiZq7NixNdprsVg0a9asGsueu876aqutj86hQ4d09913q23btoqPj1evXr305ptvuszz3XffyWKx6Nlnn9XLL7+srl27Ki4uTn369NGGDRtq3d9AtOGMDhDF7rrrLj3yyCP65JNPNHHiREnSf/7zH1111VVq3769ZsyYoebNm+u9997TyJEj9T//8z8aNWqUJGn//v3Og+bMmTPVvHlzvfrqq27PTmzfvl133HGHJk2apIkTJ6p79+46ceKErrvuOu3fv1+TJk1Sp06d9MUXX2jmzJkqLi7W3LlznctPmjRJCxYs0IQJEzR16lQVFRXpz3/+s7766iutW7fOrzMwd911l15++WV98sknGjJkSK3zfPrpp7rjjjs0aNAgzZkzR5K0bds2rVu3TtOmTdO1116rqVOnat68eXrkkUd06aWXSpLzf93tg7rcd999atmypWbNmqXt27dr/vz52rt3rz7//HNZLBaP2+dJbec6efKk+vfvr127dum+++5TWlqaFi9erPHjx+vYsWOaNm2ay/zvvvuuKioqNGnSJFksFj399NO66aabtGfPnqCfGQOCzgAQsd544w1DkrFhwwa381itVuOKK65wvh40aJDRs2dPo6qqyjnN4XAYV155pXHRRRc5p91///2GxWIxvvrqK+e0o0ePGklJSYYko6ioyDm9c+fOhiQjPz/fZdtPPPGE0bx5c2PHjh0u02fMmGHExsYa33//vWEYhvGPf/zDkGS88847LvPl5+fXOv18ubm5hiTj8OHDtb7/ww8/GJKMUaNGOaeNGzfO6Ny5s/P1tGnTjMTEROPMmTNut7N48WJDkrFmzZoa77nbB9XvjRs3zvm6+nPLysoyTp8+7Zz+9NNPG5KMDz74wDlNkpGbm1vvOuuq7brrrjOuu+465+u5c+cakoyFCxc6p50+fdro16+f0aJFC6O8vNwwDMMoKioyJBmtW7c2SktLnfN+8MEHhiRj+fLlNbYFRBsuXQFRrkWLFs67r0pLS7V69Wrddtttqqio0JEjR3TkyBEdPXpUQ4cO1c6dO7V//35JUn5+vvr166eMjAznupKSknTnnXfWup20tDQNHTrUZdrixYt1zTXXqFWrVs5tHTlyRIMHD5bdbtfatWud81mtVg0ZMsRlvqysLLVo0UJr1qzxex9IqvMutJYtW+r48eMul7e8Vds+qMu9997rckZk8uTJatSokT7++GOfa/DExx9/rJSUFN1xxx3OaY0bN9bUqVNVWVmpv//97y7zjx49Wq1atXK+vuaaayRJe/bsCWqdQChw6QqIcpWVlUpOTpYk7dq1S4Zh6NFHH9Wjjz5a6/yHDh1S+/bttXfvXvXr16/G+926dat1ubS0tBrTdu7cqS1btuiCCy5wu63q+crKypx1upvPV5WVlZKkhIQEt/P8+te/1nvvvafrr79e7du3189//nPddtttGjZsmMfbqW0f1OWiiy5yed2iRQulpqYG/RbxvXv36qKLLqpxJ1j1pa69e/e6TO/UqZPL6+rQ42//KSASEHSAKPbf//5XZWVlznBS3QH4t7/9rdszD+6CTH1qu8PK4XBoyJAheuihh2pd5uKLL3bOl5ycrHfeeafW+dwFJU9t3bpVUt1tS05O1ubNm7Vy5UqtWLFCK1as0BtvvKGxY8fW6KTrTijvMrPb7SHbVmxsbK3TDcMIWQ1AsBB0gCj29ttvS5Iz1Fx44YWSzl6mGDx4cJ3Ldu7cWbt27aoxvbZp7nTt2lWVlZX1bqtr16767LPPdNVVVwUlLJy/H9xp0qSJcnJylJOTI4fDoV//+td66aWX9Oijj6pbt25edRD2xM6dOzVgwADn68rKShUXF+uGG25wTmvVqpWOHTvmstzp06dVXFzsMs2b2jp37qwtW7bI4XC4nNX59ttvne8DDQV9dIAotXr1aj3xxBNKS0tz9qtJTk5W//799dJLL9U4UErS4cOHnf9/6NChWr9+vTZv3uycVlpa6vasS21uu+02rV+/XitXrqzx3rFjx3TmzBnnfHa7XU888USN+c6cOVPjQO+Nd999V6+++qr69eunQYMGuZ3v6NGjLq9jYmKcAy1Wj6zcvHlzZ+2B8PLLL+vHH390vp4/f77OnDmj66+/3jmta9euzr5M5y53/hkdb2q74YYbVFJSokWLFjmnnTlzRi+88IJatGih6667zpfmAFGJMzpAFFixYoW+/fZbnTlzRgcPHtTq1av16aefqnPnzvrwww8VHx/vnNdms+nqq69Wz549NXHiRF144YU6ePCg1q9fr//+97/6+uuvJUkPPfSQFi5cqCFDhuj+++933l7eqVMnlZaWenQG4Xe/+50+/PBDDR8+XOPHj1dWVpaOHz+ub775RkuWLNF3332nNm3a6LrrrtOkSZM0e/Zsbd68WT//+c/VuHFj7dy5U4sXL9af/vQn3XLLLfVub8mSJWrRooVOnz7tHBl53bp16tWrlxYvXlznsvfcc49KS0s1cOBAdejQQXv37tULL7ygjIwMZ9+VjIwMxcbGas6cOSorK1NcXJwGDhzotm9RfU6fPq1Bgwbptttu0/bt2/WXv/xFV199tUaMGOFS169+9SvdfPPNGjJkiL7++mutXLnSZWBEb2u799579dJLL2n8+PHauHGjunTpoiVLlmjdunWaO3dunX2ZANMJ921fANyrvk25+q9JkyZGSkqKMWTIEONPf/qT8zbh8+3evdsYO3askZKSYjRu3Nho3769MXz4cGPJkiUu83311VfGNddcY8TFxRkdOnQwZs+ebcybN8+QZJSUlDjn69y5s/GLX/yi1m1VVFQYM2fONLp162Y0adLEaNOmjXHllVcazz77rMut1YZhGC+//LKRlZVlNG3a1EhISDB69uxpPPTQQ8aBAwfq3A/Vt5dX/8XHxxsdOnQwhg8fbrz++usut9JXO//28iVLlhg///nPjeTkZKNJkyZGp06djEmTJhnFxcUuy73yyivGhRdeaMTGxrrczl3XPnB3e/nf//5349577zVatWpltGjRwrjzzjuNo0ePuixrt9uNhx9+2GjTpo3RrFkzY+jQocauXbtqrLOu2s6/vdwwDOPgwYPGhAkTjDZt2hhNmjQxevbsabzxxhsu81TfXv7MM8/UaJPc3PYORBuLYdDbDMBPHnjgAb300kuqrKx020kVAKIFfXSABuzkyZMur48ePaq3335bV199NSEHgCnQRwdowPr166f+/fvr0ksv1cGDB/Xaa6+pvLzc7Rg8ABBtCDpAA3bDDTdoyZIlevnll2WxWJSZmanXXntN1157bbhLA4CAoI8OAAAwLfroAAAA0yLoAAAA02rwfXQcDocOHDighISEgA//DgAAgsMwDFVUVKhdu3Y1HmB7rgYfdA4cOKCOHTuGuwwAAOCDffv2qUOHDm7fb/BBp3oo9H379ikxMTHM1QAAAE+Ul5erY8eO9T7SpMEHnerLVYmJiQQdAACiTH3dTuiMDAAATIugAwAATIugAwAATIugAwAATIugAwAATIugAwAATIugAwAATIugAwAATIugAwAATKvBBh2bzab09HT16dMn3KUAAIAgsRiG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eF1yySX6y1/+EsxdAiBACDoAItLAgQPVq1cvLV26VJJ066236tChQ1qxYoU2btyozMxMDRo0SKWlpZKkd955R0899ZTmzJmjjRs3qlOnTpo/f36N9a5atUrbt2/Xp59+qo8++kg//vijhg4dqoSEBP3jH//QunXr1KJFCw0bNsx5xuedd97RY489pqeeekrbtm3TH/7wBz366KN68803Q7dDAPjGAIAwGjdunHHjjTfW+t7o0aONSy+91PjHP/5hJCYmGlVVVS7vd+3a1XjppZcMwzCMvn37GlOmTHF5/6qrrjJ69erlsq22bdsap06dck57++23je7duxsOh8M57dSpU0bTpk2NlStXOrfz7rvvuqz7iSeeMPr16+d1ewGEVqNwBy0AcMcwDFksFn399deqrKxU69atXd4/efKkdu/eLUnavn27fv3rX7u8n52drdWrV7tM69mzp5o0aeJ8/fXXX2vXrl1KSEhwma+qqkq7d+/W8ePHtXv3bt19992aOHGi8/0zZ87IarUGpJ0AgoegAyBibdu2TWlpaaqsrFRqaqo+//zzGvO0bNnSq3U2b97c5XVlZaWysrL0zjvv1Jj3ggsuUGVlpSTplVdeUd++fV3ej42N9WrbAEKPoAMgIq1evVrffPONfvOb36hDhw4qKSlRo0aN1KVLl1rn7969uzZs2KCxY8c6p23YsKHe7WRmZmrRokVKTk5WYmJijfetVqvatWunPXv26M477/S5PQDCg6ADIOxOnTqlkpIS2e12HTx4UPn5+Zo9e7aGDx+usWPHKiYmRv369dPIkSP19NNP6+KLL9aBAwf0v//7vxo1apR69+6t+++/XxMnTlTv3r115ZVXatGiRdqyZYsuvPDCOrd955136plnntGNN96oxx9/XB06dNDevXu1dOlSPfTQQ+rQoYPy8vI0depUWa1WDRs2TKdOndKXX36pH374QdOnTw/RXgLgC4IOgLDLz89XamqqGjVqpFatWqlXr16aN2+exo0bp5iYszeHfvzxx/r973+vCRMm6PDhw0pJSdG1116rtm3bSjobWPbs2aPf/va3qqqq0m233abx48eroKCgzm03a9ZMa9eu1cMPP6ybbrpJFRUVat++vQYNGuQ8w3PPPfeoWbNmeuaZZ/S73/1OzZs3V8+ePfXAAw8Edb8A8J/FMAwj3EUAQDAMGTJEKSkpevvtt8NdCoAw4YwOAFM4ceKEXnzxRQ0dOlSxsbH661//qs8++0yffvppuEsDEEac0QFgCidPnlROTo6++uorVVVVqXv37vp//+//6aabbgp3aQDCiKADAABMi0dAAAAA0yLoAAAA0yLoAAAA0yLoAAAA0yLoAAAA0yLoAAAA0yLoAAAA0yLoAAAA0/r/m3v70DW4QIgAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Distribuição de graus em log-log\n", "plt.loglog(x, degree_counts, 'o')\n", "plt.title(\"Degree Distribution\")\n", "plt.xlabel(\"Degree\")\n", "plt.ylabel(\"Number of Nodes\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 11, "id": "375aa0d1-d799-4dd0-871f-1984c21fdeda", "metadata": {}, "outputs": [], "source": [ "#nx.clustering(G)" ] }, { "cell_type": "code", "execution_count": 12, "id": "9f59a18c-5c3d-4220-afd1-b23768774716", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.32522474881015334" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.clustering(G, 'Alan_Turing')" ] }, { "cell_type": "code", "execution_count": 13, "id": "0c77407a-52d4-4908-95f7-40e1a36badef", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.3551473661219185" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.average_clustering(G)" ] }, { "cell_type": "code", "execution_count": 14, "id": "0fb1d53c-8938-4aa0-8419-4643939a7b9e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6905613681613745" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.transitivity(G)" ] }, { "cell_type": "code", "execution_count": 15, "id": "52f5b468-6c62-46a1-bb1d-b4f1cc897b11", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5896786456363929" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Implementação correta: \n", "all_cc = list(nx.clustering(G).values())\n", "cc_list = []\n", "for i, x in enumerate(degrees_list(G)):\n", " if x > 1:\n", " cc_list.append(all_cc[i])\n", "statistics.mean(cc_list)" ] }, { "cell_type": "markdown", "id": "56529466-4f0e-41a3-adc5-c620f902f1d3", "metadata": {}, "source": [ "# Grafos com sinais e equilíbrio" ] }, { "cell_type": "code", "execution_count": 16, "id": "4db795cd-019a-4fff-af46-2437c6222937", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Graph with 219 nodes and 520 edges\n" ] } ], "source": [ "G = nx.read_gexf('congress.gexf')\n", "print(G)" ] }, { "cell_type": "code", "execution_count": 17, "id": "84832751-7b4c-416a-9190-d80294b543ca", "metadata": {}, "outputs": [], "source": [ "#VisualizeGraph(G)" ] }, { "cell_type": "code", "execution_count": 18, "id": "4c2355fc-9f72-42dd-84f5-85717da12115", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "AtlasView({'14': {'sign': -1, 'id': '0'}, '2': {'sign': 1, 'id': '1'}, '3': {'sign': -1, 'id': '2'}, '4': {'sign': -1, 'id': '3'}})" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.adj['1']" ] }, { "cell_type": "code", "execution_count": 19, "id": "eac2faec-015e-40cf-a23c-5b4fc79e4cfd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Analyzing the graph.\n", "There are 219 nodes: --\n", "There are 520 edges: --\n", "Average degree: 4.748858447488584\n", "Density: 0.02178375434627791\n", "Average distance: 3.3164928155502493\n" ] } ], "source": [ "AnalyzeGraph(G, verbose=False)" ] }, { "cell_type": "code", "execution_count": 20, "id": "e61db547-cd49-43de-afaf-23ddfa4267ce", "metadata": {}, "outputs": [], "source": [ "# Contar as arestas positivas e negativas\n", "sum_plus = sum_minus = 0\n", "\n", "for u, v in G.edges():\n", " match G.edges[u, v]['sign']:\n", " case 1: \n", " sum_plus += 1\n", " case -1: \n", " sum_minus += 1\n", " case _:\n", " raise ValueError(\"Houston, we have a problem.\")" ] }, { "cell_type": "code", "execution_count": 21, "id": "a211f4a6-38fc-4b6b-8b67-6f12cf50e5f5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sum plus: 414, 0.7961538461538461\n", "Sum minus: 106, 0.20384615384615384\n" ] } ], "source": [ "plus_fr = sum_plus / (sum_plus + sum_minus)\n", "minus_fr = sum_minus / (sum_plus + sum_minus)\n", "print(f\"Sum plus: {sum_plus}, {plus_fr}\")\n", "print(f\"Sum minus: {sum_minus}, {minus_fr}\")" ] }, { "cell_type": "code", "execution_count": 22, "id": "4a460ad2-fa42-4e3d-a1e2-6957c35bea3d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "207.0\n" ] } ], "source": [ "# Compute number of triangles\n", "triangles_per_node = nx.triangles(G)\n", "total_triangles = sum(triangles_per_node.values()) / 3\n", "print(total_triangles)" ] }, { "cell_type": "code", "execution_count": 23, "id": "f3c17ea4-fa21-4800-b904-0094d4e0120e", "metadata": {}, "outputs": [], "source": [ "tr_3p = tr_2p = tr_1p = tr_0p = 0\n", "\n", "for C in nx.enumerate_all_cliques(G):\n", " if len(C) == 3:\n", " pass\n", " elif len(C) == 4: \n", " break" ] }, { "cell_type": "code", "execution_count": 24, "id": "bb62a52f-10bb-4c27-bdc6-76a78096b3ab", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Expected +++: 104.46272195038686, 0.5046508306781974\n", "Expected ++-: 80.2394820778334, 0.38763034820209374\n", "Expected +--: 20.544408454710968, 0.09924835002275831\n", "Expected ---: 1.75338751706873, 0.008470471096950387\n" ] } ], "source": [ "# +++\n", "tr_3p_fr_exp = plus_fr * plus_fr * plus_fr\n", "print(f\"Expected +++: {207*tr_3p_fr_exp}, {tr_3p_fr_exp}\")\n", "\n", "# ++-\n", "tr_2p_fr_exp = 3 * plus_fr * plus_fr * minus_fr\n", "print(f\"Expected ++-: {207*tr_2p_fr_exp}, {tr_2p_fr_exp}\")\n", "\n", "# +--\n", "tr_1p_fr_exp = 3 * plus_fr * minus_fr * minus_fr\n", "print(f\"Expected +--: {207*tr_1p_fr_exp}, {tr_1p_fr_exp}\")\n", "\n", "# ---\n", "tr_0p_fr_exp = minus_fr*minus_fr*minus_fr\n", "print(f\"Expected ---: {207*tr_0p_fr_exp}, {tr_0p_fr_exp}\")" ] }, { "cell_type": "code", "execution_count": 25, "id": "6220aa42-b3b9-45e8-b1f8-f58606e8c783", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.08537327739088207" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Finalmente, vamos expressar uma métrica de um valor apenas, para toda a rede\n", "tr_2p = 7\n", "tr_0p = 0\n", "\n", "(tr_2p + tr_0p) / (207*tr_2p_fr_exp + 207*tr_0p_fr_exp)" ] }, { "cell_type": "code", "execution_count": null, "id": "f29e5e55-e83a-43e3-ae04-5a8124819908", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.7" } }, "nbformat": 4, "nbformat_minor": 5 }