{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Examen IS M8 du 31/03 \n", "------\n", "Le but de cet examen est de tester si vous avez acquis les compétences enseignées sur la première partie de M8.\n", "\n", "**Consignes**\n", " - Le fichier ipynb rempli devra être soumis sur le [dépot moodle](https://moodle.insa-rouen.fr/mod/assign/view.php?id=59084)\n", " - Vous avez accès aux sites suivants pour la documentation, en plus de la fonction help(), :\n", " * https://matplotlib.org/stable/\n", " * https://numpy.org/doc/\n", " * https://docs.scipy.org/doc/scipy/reference/\n", " * https://scikit-learn.org/stable/\n", " - Le barême est indicatif et pourra être amené à changer\n", " - L'efficacité et la simplicité de votre code sera pris en compte\n", " - Afin de garantir l'équité pour tout les groupes, pas de questions. Si vous avez un doute faites au mieux. Si il y a une erreur de ma part, ce sera pris en compte.\n", " - En fin d'examen, déconnectez vous mais **n'éteignez pas** les postes.\n", "______________" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 1 : du Python [5 points]\n", "Analysez le code suivant et trouver les 8 erreurs qui s'y sont glissées pour calculer correctement une analyse de variance et un coefficient de corrélation. \n", "Le jeu de données `X` correspond aux performances de 41 athletes pour les 10 épreuves( variable `epreuves`) durant deux competitions : JO et Decastar (variable `competition`).\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# on charge les bibliothèques\n", "import numpy as np\n", "\n", "################\n", "# DEBUT ZONE SANS ERREUR\n", "######################\n", "#on charge les données\n", "\n", "data = np.load('data_decath.npz')\n", "X=data['X'] # X contient toutes les perfomances pour chaque athlète pour chaque épreuve\n", "competition = data['type_competition'] # Les competitions associées à chaque performance au decathlon (JO et Decastar)\n", "print(competition)\n", "epreuves = data['epreuves'] #La liste des épreuves\n", "print(epreuves)\n", "col_points = np.where(epreuves==\"Points\") #Le total des points pour les 10 épreuves pour chaque athlète\n", "x_points = X[:,col_points]\n", "################\n", "# FIN ZONE SANS ERREUR\n", "######################\n", "\n", "labels,effectifs = np.unique(competition) \n", "plt.pie(effectifs,labels=labels);\n", "\n", "#Analyse de la variance totale avec numpy (voir Annexe) \n", "var_total = np.sum((x_points - np.mean(x_points))**2)\n", "print(f\"la variance totale est de : {var_total}\")\n", "#decoupage des données en jo et decastar\n", "x_jo = []\n", "x_decastar = []\n", "n=x_points.shape[0]\n", "\n", "for i in range(1,n):\n", " if(competition[i] == 'JO'):\n", " x_jo.append(x_points[i])\n", " else:\n", " x_decastar.append(x_points[i])\n", "x_jo=np.array(x_jo)\n", "n_jo=x_jo.shape[0]\n", "\n", "x_decastar=np.array(x_decastar)\n", "n_decastar=x_decastar.shape[0]\n", "\n", "#variance intra classe jo et decastar\n", "var_jo = np.sum((x_jo - np.mean(x_points))**2)\n", "var_decastar = np.sum((x_decastar - np.mean(x_decastar)))**2 \n", "print(f\"La variance de la competition JO est de {var_jo}\")\n", "print(f\"La variance de la competition Decastar est de {var_decastar}\")\n", "\n", "\n", "#variance interclasse\n", "var_inter_classe = n_jo*(np.mean(x_jo) - np.mean(x_points))**2\n", "var_inter_classe = n_decastar*(np.mean(x_decastar) - np.mean(x_points))**2 \n", "\n", "print(f\"La variance interclasse est de {var_inter_classe}\")\n", "\n", "#calcul rapport de corrélation\n", "rapport_corr = (var_inter_classe)/var_total\n", "print(f\"Le rapport de corrélation est de {rapport_corr:.2f}, donc le type de compétition n'influe pas sur la différence de niveau entre athlètes\")\n", "\n", "#calcul de la corrélation entre 100m et Longueur\n", "c1 = np.where(epreuves==\"100m\")\n", "c2 = np.where(epreuves==\"Longueur\")\n", "corr = np.mean((X[:,c1] - np.mean(X[:,c1]))*(X[:,c2] - np.mean(X))) /(np.prod(np.std(X[:,[c1,c2]])))\n", "print(corr)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Question bonus : Comment interprétez vous le coefficient de corrélation ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 2 : ACP géographique [10 points]\n", "\n", "Le but de cet exercice est de faire une ACP d'un ensemble de données représentant la température mensuelle ($p = 12$) de $n=15$ villes françaises. Le code suivant permet de charger les données dans la matrice `X`, les latitudes et longitudes de chaque ville dans `latitude` et `longitude`, et enfin le nom des villes dans `villes`. L'ordre donné est consistant, c'est à dire que `X[i,:]` contient toutes les températures observées pour la ville `villes[i]` de coordonnées `latitude[i],longitude[i]`. Les mois sont renseignés dans la variable `mois`. Pour information, la latitude indique un positionnement sur l'axe Nord/Sud, et la longitude sur l'axe Est/Ouest." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "data = np.load('data_temp.npz')\n", "X = data['X'] #les données de températures\n", "latitude = data['latitude'] # les latitudes de chaque ville\n", "longitude = data['longitude'] # les longitudes de chaque ville\n", "villes = data['villes'] # le nom des villes\n", "mois = data['mois'] # les mois de chaque colonne\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualisation des données\n", " 1. Affichez une représentation des températures moyennes de l'ensemble des villes pour chaque mois sous forme de boxplots. Le graphique vous parait-il cohérent ? Observez vous des données aberrantes ? " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calcul de l'ACP\n", " 1. Normalisez les données de températures dans une variable `X_norm`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X_norm = ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 2. Calculez la matrice de variance/covariance de `X_norm`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cov = ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 3. Affichez la matrice de covariance. La matrice de covariance vous parait elle cohérente ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 4. Calculez les deux premiers axes de l'ACP. \n", " \n", " a) Vérifiez que les deux vecteurs propres sont bien orthogonaux et de norme égale à 1.\n", " \n", " b) En déduire la matrice de projection `P` permettant de passer de l'espace de départ vers un espace à deux dimensions.\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 5. Quel est le pourcentage de variance (information) expliqué par ces deux premiers axes ?\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 6. Affichez un graphique sous forme de barres montrant le ratio de variance expliquée cumulée pour chaque axe." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Représentation en 2D\n", " 1. Calculez la projection en 2D des données `X_norm` via la matrice de projection `P` calculée plus haut.\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 2. Affichez un graphique avec les nouvelles coordonées de chaque ville. \n", " \n", " Affichez également le nom de chaque ville pour chaque point via la function `plt.text(x,y,\"text\")` (voir annexe). Commentez ce que vous observez." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Analyse corrélation 1er axe/Latitude\n", " 1. Calculez le coefficient de corrélation entre le 1er axe des données projetées et les variables `latitude` et `longitude`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 2. Commentez les deux coefficients calculés. Cela vous parait il cohérent comme observation ?\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 3 : L'harmonie moyenne [5 points]\n", "Dans cet exercice, on vous propose de calculer une nouvelle moyenne appelée moyenne harmonique. La moyenne harmonique $c$ d'un ensemble de points $x_i, i \\in 1, \\dots, n$ est définie comme la valeur $c$ minimisant $J(c)$:\n", "\n", "$$\n", "J(c) = \\sum_{i = 1}^n \\left( \\frac{1}{x_i} - \\frac{1}{c} \\right) ^2\n", "$$\n", "\n", "$$\n", "c^\\star = \\underset{c \\in \\mathbb{R}}{\\textrm{ arg min}} J(c)\n", "$$\n", "\n", "\n", "1.Quelle méthode utilisez vous pour trouver $c$ ?\n", "\n", "2.Démontrer sur la copie que $c = \\frac{1}{\\frac{1}{n} \\sum_{i=1}^n \\frac{1}{x_i} } $ ." ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3. Application numérique. Soit le trajet en voiture suivant : \n", " |Distance (km) | 0-20 | 20-40 | 40-60 | 60-80 | 80-100 |\n", " |--- | --- | ---|--- | --- | --- |\n", " |Vitesse (km/h) | 40 | 80 | 100 | 40 | 80 |\n", " \n", " \n", " a. Calculez la moyenne et la médiane des vitesses\n", " \n", " b. Calculez le temps de parcours et en déduire la vitesse moyenne\n", " \n", " c. Calculez la moyenne harmonique. Comparez avec la vitesse moyenne et la moyenne des vitesses. Commentez." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = np.array([40,80,100,40,80])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ANNEXES\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Utilisation de plt.text\n", "a = [1,2,3]\n", "b=[0.5,1,2]\n", "import matplotlib.pyplot as plt\n", "plt.scatter(a,b)\n", "plt.text(a[1],b[1],\"text\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Formulaire\n", "\n", "- Moyenne empirique: $\\bar{x} = \\frac{1}{n} \\sum_{i = 1}^n x_i $\n", "- Variance empirique: $s^2_{x} = \\frac{1}{n} \\sum_{i = 1}^n (x_i - \\bar{x})^2$\n", "- Covariance: $s_{jk} = \\frac{1}{n} \\sum_{i=1}^n (x_{i,j}- \\bar{x}_j)(x_{i,k}- \\bar{x}_k)$\n", "- Corrélation: $r_{j,k} = \\frac{s_{jk}}{s_j s_k} $\n", "- Variance totale: $s^2 = \\sum_{i=1}^{n} (y_i - \\bar{y})^2 = \\sum_{j \\in \\Omega_x} \\sum_{i=1}^{n_j} (y_{ij} - \\bar{y})^2 =\n", " s^2_{\\textrm{inter}} + s^2_{\\textrm{intra}}$\n", "- Variance intra-classe: $s^2_{\\textrm{intra}} = \\sum_{j \\in \\Omega_x}\\sum_{i=1}^{n_j} (y_{ij} - \\bar{y_j})^2$\n", "- Variance inter-classe: $s^2_{\\textrm{inter}} = \\sum_{j \\in \\Omega_x}\\sum_{i=1}^{n_j} (\\bar{y_j} - \\bar{y})^2 = \\sum_{j \\in\\Omega_x} n_j (\\bar{y_j} - \\bar{y})^2$\n", "- Rapport des variances: $\\eta_{Y/X}^2 = \\frac{s^2_{\\textrm{inter}}}{s^2} = \\frac{\\sum_{j \\in\n", " \\Omega_x} n_j (\\bar{y_j} - \\bar{y})^2}{\\sum_{i=1}^{n} (y_i - \\bar{y})^2}$\n", "- Coefficient de corrélation: $r = \\frac{s_{xy}}{s_x s_y} = \\frac{\\frac{1}{n} \\displaystyle \\sum_{i=1}^{n} (x_i-\\bar{x})(y_i - \\bar{y})}{s_x s_y} = \n", "\\frac{( \\sum_{i=1}^n x_i y_i) - n \\bar{x} \\bar{y}}{\\sqrt{ \\sum_{i=1}^n (x_i - \\bar{x})^2}\\sqrt{ \\sum_{i=1}^n (y_i - \\bar{y})^2}}$\n" ] } ], "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.9.7" } }, "nbformat": 4, "nbformat_minor": 4 }