{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 1A.data - Visualisation des donn\u00e9es\n", "\n", "Les tableaux et les graphes sont deux outils incontournables des statisticiens. Petite revue des graphes."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": ["%matplotlib inline"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Cette instruction fait appara\u00eetre les graphes dans le notebook. Si ce n'est pas le cas, il faut la r\u00e9ex\u00e9cuer. Les deux lignes suivantes permettent de v\u00e9rifier o\u00f9 matplotlib a pr\u00e9vu d'afficher ses r\u00e9sultats. Pour un notebook, cela doit \u00eatre ``'nbAgg'`` ou ``'module://ipykernel.pylab.backend_inline'``."]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [{"data": {"text/plain": ["'module://matplotlib_inline.backend_inline'"]}, "execution_count": 3, "metadata": {}, "output_type": "execute_result"}], "source": ["import matplotlib\n", "matplotlib.get_backend()"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"data": {"text/plain": ["'module://matplotlib_inline.backend_inline'"]}, "execution_count": 4, "metadata": {}, "output_type": "execute_result"}], "source": ["import matplotlib.pyplot as plt\n", "import matplotlib\n", "matplotlib.get_backend()"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Matplotlib, pandas"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### R\u00e9cup\u00e9ration des donn\u00e9es\n", "\n", "On r\u00e9cup\u00e8re les donn\u00e9es disponibles sur le site de l'INSEE : [Naissance, d\u00e9c\u00e8s, mariages 2012](http://www.insee.fr/fr/themes/detail.asp?ref_id=fd-etatcivil2012&page=fichiers_detail/etatcivil2012/doc/documentation.htm). Il s'agit de r\u00e9cup\u00e9rer la liste des mariages de l'ann\u00e9e 2012. On souhaite repr\u00e9senter le graphe du nombre de mariages en fonction de l'\u00e9cart entre les mari\u00e9s."]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"data": {"text/plain": ["((246123, 16),\n", " Index(['ANAISH', 'DEPNAISH', 'INDNATH', 'ETAMATH', 'ANAISF', 'DEPNAISF',\n", " 'INDNATF', 'ETAMATF', 'AMAR', 'MMAR', 'JSEMAINE', 'DEPMAR', 'DEPDOM',\n", " 'TUDOM', 'TUCOM', 'NBENFCOM'],\n", " dtype='object'))"]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["from urllib.error import URLError\n", "import pyensae.datasource\n", "from pyensae.datasource import dBase2df, DownloadDataException\n", "files = [\"etatcivil2012_nais2012_dbase.zip\",\n", " \"etatcivil2012_dec2012_dbase.zip\",\n", " \"etatcivil2012_mar2012_dbase.zip\" ]\n", "\n", "try:\n", " pyensae.datasource.download_data(files[-1], \n", " website='http://telechargement.insee.fr/fichiersdetail/etatcivil2012/dbase/')\n", "except (DownloadDataException, URLError, TimeoutError):\n", " # backup plan\n", " pyensae.datasource.download_data(files[-1], website=\"xd\")\n", "\n", "df = dBase2df(\"mar2012.dbf\")\n", "df.shape, df.columns"]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ANAISHDEPNAISHINDNATHETAMATHANAISFDEPNAISFINDNATFETAMATFAMARMMARJSEMAINEDEPMARDEPDOMTUDOMTUCOMNBENFCOM
01982751119849921201201129999N
11956692419699924201201375999N
21982992119929911201201534999N
31985992119878411201201413999N
41968992119639921201201626999N
\n", "
"], "text/plain": [" ANAISH DEPNAISH INDNATH ETAMATH ANAISF DEPNAISF INDNATF ETAMATF AMAR MMAR \\\n", "0 1982 75 1 1 1984 99 2 1 2012 01 \n", "1 1956 69 2 4 1969 99 2 4 2012 01 \n", "2 1982 99 2 1 1992 99 1 1 2012 01 \n", "3 1985 99 2 1 1987 84 1 1 2012 01 \n", "4 1968 99 2 1 1963 99 2 1 2012 01 \n", "\n", " JSEMAINE DEPMAR DEPDOM TUDOM TUCOM NBENFCOM \n", "0 1 29 99 9 N \n", "1 3 75 99 9 N \n", "2 5 34 99 9 N \n", "3 4 13 99 9 N \n", "4 6 26 99 9 N "]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["df.head()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On r\u00e9cup\u00e8re de la m\u00eame mani\u00e8re la signification des variables :"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"data": {"text/plain": ["((16, 4), Index(['VARIABLE', 'LIBELLE', 'TYPE', 'LONGUEUR'], dtype='object'))"]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["from pyensae.datasource import dBase2df\n", "vardf = dBase2df(\"varlist_mariages.dbf\")\n", "vardf.shape, vardf.columns"]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
VARIABLELIBELLETYPELONGUEUR
0AMARAnn\u00e9e du mariageCHAR4
1ANAISFAnn\u00e9e de naissance de l'\u00e9pouseCHAR4
2ANAISHAnn\u00e9e de naissance de l'\u00e9pouxCHAR4
3DEPDOMD\u00e9partement de domicile apr\u00e8s le mariageCHAR3
4DEPMARD\u00e9partement de mariageCHAR3
5DEPNAISFD\u00e9partement de naissance de l'\u00e9pouseCHAR3
6DEPNAISHD\u00e9partement de naissance de l'\u00e9pouxCHAR3
7ETAMATF\u00c9tat matrimonial ant\u00e9rieur de l'\u00e9pouseCHAR1
8ETAMATH\u00c9tat matrimonial ant\u00e9rieur de l'\u00e9pouxCHAR1
9INDNATFIndicateur de nationalit\u00e9 de l'\u00e9pouseCHAR1
10INDNATHIndicateur de nationalit\u00e9 de l'\u00e9pouxCHAR1
11JSEMAINEJour du mariage dans la semaineCHAR1
12MMARMois du mariageCHAR2
13NBENFCOMEnfants en commun avant le mariageCHAR1
14TUCOMTranche de commune du lieu de domicile des \u00e9pouxCHAR1
15TUDOMTranche d'unit\u00e9 urbaine du lieu de domicile de...CHAR1
\n", "
"], "text/plain": [" VARIABLE LIBELLE TYPE \\\n", "0 AMAR Ann\u00e9e du mariage CHAR \n", "1 ANAISF Ann\u00e9e de naissance de l'\u00e9pouse CHAR \n", "2 ANAISH Ann\u00e9e de naissance de l'\u00e9poux CHAR \n", "3 DEPDOM\u00a0 D\u00e9partement de domicile apr\u00e8s le mariage CHAR \n", "4 DEPMAR D\u00e9partement de mariage CHAR \n", "5 DEPNAISF D\u00e9partement de naissance de l'\u00e9pouse CHAR \n", "6 DEPNAISH D\u00e9partement de naissance de l'\u00e9poux CHAR \n", "7 ETAMATF \u00c9tat matrimonial ant\u00e9rieur de l'\u00e9pouse CHAR \n", "8 ETAMATH \u00c9tat matrimonial ant\u00e9rieur de l'\u00e9poux CHAR \n", "9 INDNATF Indicateur de nationalit\u00e9 de l'\u00e9pouse CHAR \n", "10 INDNATH Indicateur de nationalit\u00e9 de l'\u00e9poux CHAR \n", "11 JSEMAINE Jour du mariage dans la semaine CHAR \n", "12 MMAR Mois du mariage CHAR \n", "13 NBENFCOM Enfants en commun avant le mariage CHAR \n", "14 TUCOM Tranche de commune du lieu de domicile des \u00e9poux CHAR \n", "15 TUDOM Tranche d'unit\u00e9 urbaine du lieu de domicile de... CHAR \n", "\n", " LONGUEUR \n", "0 4 \n", "1 4 \n", "2 4 \n", "3 3 \n", "4 3 \n", "5 3 \n", "6 3 \n", "7 1 \n", "8 1 \n", "9 1 \n", "10 1 \n", "11 1 \n", "12 2 \n", "13 1 \n", "14 1 \n", "15 1 "]}, "execution_count": 9, "metadata": {}, "output_type": "execute_result"}], "source": ["vardf"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Exercice 1 : \u00e9cart entre les mari\u00e9s\n", "\n", "1. En ajoutant une colonne et en utilisant l'op\u00e9ration [group by](http://pandas.pydata.org/pandas-docs/stable/groupby.html), on veut obtenir la distribution du nombre de mariages en fonction de l'\u00e9cart entre les mari\u00e9s. Au besoin, on changera le type d'une colone ou deux.\n", "2. On veut tracer un nuage de points avec en abscisse l'\u00e2ge du mari, en ordonn\u00e9e, l'\u00e2ge de la femme. Il faudra peut-\u00eatre jeter un coup d'oeil sur la documentation de la m\u00e9thode [plot](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html)."]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": ["# df[\"colonne\"] = df.apply (lambda r: int(r[\"colonne\"]), axis=1) # pour changer de type\n", "# df[\"difference\"] = ..."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Exercice 2 : graphe de la distribution avec pandas\n", "\n", "Le module ``pandas`` propose un panel de graphiques standard faciles \u00e0 obtenir. On souhaite repr\u00e9senter la distribution sous forme d'histogramme. A vous de choisir le meilleure graphique depuis la page [Visualization](http://pandas.pydata.org/pandas-docs/stable/visualization.html)."]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": ["# df.plot(...)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### matplotlib\n", "\n", "[matplotlib](http://matplotlib.org/) est le module qu'utilise [pandas](http://pandas.pydata.org/). Ainsi, la m\u00e9thode [plot](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html) retourne un objet de type [Axes](http://matplotlib.org/api/axes_api.html#module-matplotlib.axes) qu'on peut modifier par la suite via les [m\u00e9thodes suivantes](http://matplotlib.org/api/pyplot_summary.html). On peut ajouter un titre avec [set_title](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_title) ou ajouter une grille avec [grid](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.grid). On peut \u00e9galement superposer [deux courbes sur le m\u00eame graphique](http://stackoverflow.com/questions/19941685/how-to-show-a-bar-and-line-graph-on-the-same-plot), ou [changer de taille de caract\u00e8res](http://stackoverflow.com/questions/12444716/how-do-i-set-figure-title-and-axes-labels-font-size-in-matplotlib). Le code suivant trace le nombre de mariages par d\u00e9partement."]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["df[\"nb\"] = 1\n", "dep = df[[\"DEPMAR\",\"nb\"]].groupby(\"DEPMAR\", as_index=False).sum().sort_values(\"nb\",ascending=False)\n", "ax = dep.plot(kind = \"bar\", figsize=(14,6))\n", "ax.set_xlabel(\"d\u00e9partements\", fontsize=16)\n", "ax.set_title(\"nombre de mariages par d\u00e9partements\", fontsize=16)\n", "ax.legend().set_visible(False) # on supprime la l\u00e9gende\n", "\n", "# on change la taille de police de certains labels\n", "for i,tick in enumerate(ax.xaxis.get_major_ticks()):\n", " if i > 10 :\n", " tick.label.set_fontsize(8)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Quand on ne sait pas, le plus simple est d'utiliser un moteur de recherche avec un requ\u00eate du type : ``matplotlib + requ\u00eate``. Pour cr\u00e9er un graphique, le plus courant est de choisir le graphique le plus ressemblant d'une [gallerie de graphes](http://matplotlib.org/gallery.html) puis de l'adapter \u00e0 vos donn\u00e9es."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Exercice 3 : distribution des mariages par jour\n", " \n", "On veut obtenir un graphe qui contient l'histogramme de la distribution du nombre de mariages par jour de la semaine et d'ajouter une seconde courbe correspond avec un second axe \u00e0 la r\u00e9partition cumul\u00e9e."]}, {"cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["## R\u00e9seaux, graphes\n", "\n", "### networkx\n", "\n", "Le module [networkx](https://networkx.github.io/) permet de repr\u00e9senter un r\u00e9seau ou un graphe de petite taille (< 500 noeuds). Un graphe est d\u00e9fini par un ensemble de noeuds (ou *vertex* en anglais) reli\u00e9s par des arcs (ou *edge* en anglais). La [gallerie](http://networkx.github.io/documentation/latest/gallery.html) vous donnera une id\u00e9e de ce que le module est capable de faire."]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}], "source": ["import random\n", "import networkx as nx\n", "G=nx.Graph()\n", "for i in range(15) :\n", " G.add_edge ( random.randint(0,5), random.randint(0,5) )\n", "\n", "import matplotlib.pyplot as plt\n", "f, ax = plt.subplots(figsize=(8,4))\n", "nx.draw(G, ax = ax)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Graphviz\n", "\n", "[Graphviz](http://www.graphviz.org/) est un outil d\u00e9velopp\u00e9 depuis plusieurs ann\u00e9es d\u00e9j\u00e0 qui permet de r\u00e9pr\u00e9senter des graphes plus cons\u00e9quents (> 500 noeuds). Il propose un choix plus riche de graphes : [gallerie](http://www.graphviz.org/Gallery.php). Il est utilisable via le module [graphviz](https://pypi.python.org/pypi/graphviz). Son installation requiert l'installation de l'outil [Graphviz](http://www.graphviz.org/) qui n'est pas inclus. La diff\u00e9rence entre les deux modules tient dans l'algorithme utilis\u00e9 pour assigner des coordonn\u00e9es \u00e0 chaque noeud du graphe de fa\u00e7on \u00e0 ce que ses arcs se croisent le moins possibles. Au del\u00e0 d'une certaine taille, le dessin de graphe n'est plus lisible et n\u00e9cessite quelques tat\u00f4nnements. Cela peut passer par une clusterisation du graphe (voir la [m\u00e9thode Louvain](http://perso.uclouvain.be/vincent.blondel/research/louvain.html)) de fa\u00e7on \u00e0 colorer certains noeuds proches voire \u00e0 les regrouper."]}, {"cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [{"data": {"image/png": "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RRUVFW/9/19//UXl5eWsahg5cuR7fyQB0G+//caqDmXCiqk8efKEBALBez9ILS2ttyo7Ozv7nabC4/GoT58+b5V59OjRGrVwmjZtSnw+n4KCgipdf+jQIbmhSKXSOt33jRs3qGnTptS1a1fKzs6uUwx1xc7OjlavXs21jLe4ffs26enp0VdffSX/t7KyMpo+fToBoLCwMFbLX7RoEWlra1f7TAoEAnJyciKxWMyqDmXCWvdn/vz57zUWR0fHKq/18vKq1lj4fD7t2LHjrWsePnz4XhNjGEbeUmIYhrZv305E/2coAQEBdTaU8+fPk5GREXl5eVFhYWGdYqgzI0eOLCIdRgAAIABJREFUpGHDhnEto0r27dtHDMNQSEgIJScnU+fOnUkgEBCfz6eJEyeyWnZgYOA7vwcMw1BkZCSrGpQNa6by8uVLMjExeWeLY8yYMVVe++eff8q7LlU5e25u7lvXiMXit7pWb76EQiG5urpWqmCGYWju3LkkEAhozpw5dTaUw4cPk46ODo0fP5715rSq8v3331OLFi24llEtM2bMIH19fTI1Na30nOjp6VFpaSlr5Z47d+6dz+SECRNYK5srWB2o3bx5c7XmoK2tTd9++22V1xUUFJCWllaVhuLj41NteW3atHlnBRobG1f5f0OHDq2zocjuce7cuXUeh2kInD17lgDVGqx9k99//514PN5bLWCGYejYsWOslZuYmFjtM6mnp0fp6emslc0VrJqKWCymtm3bVtmVYRiGgoODq712+PDhbzUbGYahgwcPVnvNiBEjqjQxgUBAAwcOrLZLxTAMLV68uMqY33//fZVTf1KplFasWEEMw9CKFStq/dk0NGSDtadOneJaSiWKiopo1KhR1Y63CQSCalvMiqCioqLK7g+Px6NNmzaxVi6XsD6lfPLkyWqd+v79+9Ved+jQobceBB0dHXr16lW113z99ddvDYoxDEOmpqbUqlWrdw7k8ng8mjlzZqXWxj///EMAyN/fv1JLpqKigqZPn17t+E5jpVWrVrRq1SquZch5+PAhOTg4vLNbDIB0dXVrteygtrRs2fKtccG2bds22K6yUtap9OvX762K5fP5VFZWVu01paWlpK+vX6n74u/v/85y9u/f/1ZLhcfj0WeffVajaT0A8gVv5eXl1KZNG+LxeMTj8WjlypVE9HrmYOTIkaSnp0cn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\n", "text/plain": [""]}, "execution_count": 15, "metadata": {}, "output_type": "execute_result"}], "source": ["import random, os\n", "from graphviz import Digraph\n", "from IPython.display import Image\n", "from pyquickhelper.helpgen import find_graphviz_dot\n", "bin = os.path.dirname(find_graphviz_dot())\n", "if bin not in os.environ[\"PATH\"]:\n", " os.environ[\"PATH\"] = os.environ[\"PATH\"] + \";\" + bin\n", "\n", "dot = Digraph(comment='random graph', format=\"png\")\n", "for i in range(15) :\n", " dot.edge ( str(random.randint(0,5)), str(random.randint(0,5)) )\n", "\n", "img = dot.render('t_random_graph.gv')\n", "Image(img)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Exercice 4 : dessin d'un graphe avec networkx\n", " \n", "On construit un graphe al\u00e9atoire, ses 20 arcs sont obtenus en tirant 20 fois deux nombres entiers entre 1 et 10. Chaque arc doit avoir une \u00e9paisseur al\u00e9atoire. On regardera les fonctions [spring_layout](https://networkx.github.io/documentation/latest/reference/generated/networkx.drawing.layout.spring_layout.html?highlight=spring_layout#networkx.drawing.layout.spring_layout), [draw_networkx_nodes](https://networkx.github.io/documentation/latest/reference/generated/networkx.drawing.nx_pylab.draw_networkx_nodes.html?highlight=draw_networkx_nodes#networkx.drawing.nx_pylab.draw_networkx_nodes), [draw_networkx_edges](https://networkx.github.io/documentation/latest/reference/generated/networkx.drawing.nx_pylab.draw_networkx_edges.html?highlight=draw_networkx_edges#networkx.drawing.nx_pylab.draw_networkx_edges). La [gallerie](https://networkx.github.io/documentation/latest/gallery.html) peut aider aussi."]}, {"cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": []}, {"cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "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.9.5"}}, "nbformat": 4, "nbformat_minor": 2}