{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# M8 - Final 2022\n", "\n", "## Consignes\n", "### Procédures examen \n", "\n", "1. Récupérez le sujet ainsi que les données sur Moodle\n", "2. Configurez le proxy pour accéder aux sites web : Renseignez \"asi-examen.insa-rouen.fr\" et port 80 pour le protocole HTTPS afin de pouvoir accéder à la documentation en ligne. Vous avez une vidéo de démo plus bas. Attention, Moodle n'est alors plus disponible.\n", "3. Une fois votre travail terminé, désactivez le proxy : Paramètres -> Proxy -> \"Pas de proxy\".\n", "4. Déposez votre fichier ipynb dans le dépot moodle prévu à cet effet. Attention à bien tout sauvegarder. *Pas* de fichier html, pdf ou autre.\n", "5. Déconnectez vous mais n'éteignez pas la machine. Cela permettra de faire une sauvegarde de votre session en cas de problème.\n", "\n", "### Consignes générales\n", "- Le fichier ipynb rempli devra être soumis sur le [dépot moodle](https://moodle.insa-rouen.fr/mod/assign/view.php?id=61313)\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", "- Justifiez vos réponses. Si la réponse n'est pas justifiée, elle sera considérée comme non correcte." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercice 1 : Régression de chenilles\n", "\n", "Le dataset `pine_full` est tiré d'un article analysant des parcelles de terrain et le nombre de nids de chenilles processionnaires. Pour tenter d'expliquer ce nombre de nids pour une parcelle donnée, on considère les variables explicatives suivantes :\n", "\n", "1. altitude (en mètres)\n", "2. pente (en degres)\n", "3. nombre de pins dans la parcelle\n", "4. hauteur (en mètres) de l'arbre échantilloné au centre de la parcelle\n", "5. diamètre (en mètres) de l'arbre échantilloné au centre de la parcelle\n", "6. indice de la densité de population\n", "7. orientation de la parcelle (1 plein sud jusqu'à 2 sinon)\n", "8. hauteur (en mètres) de l'arbre dominant\n", "9. Nombre de strates de végétation\n", "10. Indice de mixité de la population (entre 1 (non mixte) et 2 (mixte))\n", "\n", "La variable à expliquer est un logarithme appliqué au nombre moyen de nids de chenilles observés par arbre dans la parcelle.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Chargement des données\n", "Le code suivant permet de charger le dataset avec les variables explicatives dans `data_pine` et la propriété dans `y_pine`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "data_pine = np.loadtxt('pine_full.csv',delimiter=\",\")\n", "y_pine = data_pine[:,-1]\n", "data_pine = data_pine[:,:-1]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Donnez le nombre d'observations ainsi que le nombre de variables explicatives à partir des données chargées" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Calculez les covariances entre chaque variable explicative et la propriété à prédire. Quelles sont les variables les plus prometteuses pour prédire le nombre de nids ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Effectuez une régression sur ce jeu de données et donnez le $R^2$ associé" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Calculez les résidus de votre modèle. Affichez les sous forme de nuage de points en fonction de `y`. Quel observation faites vous ? " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* On décide d'analyser le problème. Calculez les effets leviers de chacune des observations. Détectez vous des points potentiellement problématiques ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Calculez les contributions de chaque observation ? Quelles remarques pouvez vous faire ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Afin d'améliorer les résultats, proposez et implémentez une méthode pour améliorer le $R^2$. Donnez le nouveau $R^2$ et portez un regard critique sur votre nouveau modèle." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Quel est le meilleur modèle à une seule variable ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Proposez le meilleur modèle possible avec un nombre de variables que vous déterminerez. Détaillez et justifier votre méthode" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 2 : Une différence de poids " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les données suivantes ont été récupérées sur des modèles de voiture conçues en Europe et au Japon. On cherche à savoir si il y une différence dans le poids des voitures conçues. \n", "La variable `poids_voiture_japon` correspond au poids en kg de 68 voitures du Japon, et `poids_voiture_europe` le poids de 79 voitures européennes. \n", "\n", "On suppose que le poids des voitures japonaises est distribué selon une loi normale d'espérance $\\mu_j$ et de variance inconnue $\\sigma^2$, et que les voitures européennes une loi normale d'espérance $\\mu_e$ et de même variance inconnue $\\sigma^2$.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "poids_voiture_japon = np.loadtxt('car_weight_japan.csv')\n", "poids_voiture_europe = np.loadtxt('car_weight_europe.csv')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Posez les hypothèses du test statistique associé à la question posée" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Donnez une estimation de chacune des moyennes des deux groupes " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Quel test statistique allez vous utiliser pour répondre à la question ?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Calculez la statistique associé à ce test." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Donnez la p-valeur de cette statistique. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Pour un risque $\\alpha = 0.05$, que concluez vous ? " ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Calculez les variances sur chaque groupe. Est ce que votre test est adapté ? Que concluez vous de nouveau ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## PizzACP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le jeu de données suivant renseigne sur les données nutritionnelles de pizzas issues de 10 marques différentes. La variable `pizza_marques` code les différentes marques par un entier différent. La variable `pizza_data` contient les variables suivantes :\n", "1. id - Sample analised\n", "2. mois - Amount of water per 100 grams in the sample\n", "3. prot - Amount of protein per 100 grams in the sample\n", "4. fat - Amount of fat per 100 grams in the sample\n", "5. ash - Amount of ash per 100 grams in the sample\n", "6. sodium - Amount of sodium per 100 grams in the sample\n", "7. carb - Amount of carbohydrates per 100 grams in the sample\n", "8. cal - Amount of calories per 100 grams in the sample\n", "\n", "On se propose d'effectuer une analyse descriptive de ce jeu de données via une ACP\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "pizza_marques = np.loadtxt('pizza_marque.csv')\n", "pizza_data = np.loadtxt('pizza_data.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Parmi les données présentées, une variable devrait être supprimée avant tout calcul. Laquelle ? Supprimez cette colonne du jeu de données." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2. Affichez la boite à moustaches des données. Quelle opération déduisez vous de cette observation ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3. Normalisez les données" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "4. Calculez et affichez la matrice de covariance. Est ce qu'elle vous parait cohérente ?\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "5. Calculez les valeurs et vecteurs propres de la matrice de covariance. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "6. Combien faut il d'axes factoriels au minimum pour représenter 90% de l'information ? Pensez à justifier." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "7. Calculez la projection 2D des données selon l'ACP" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "8. Affichez les données projetées avec une couleur différente par étiquette (cf. Annexe, utilisez `plt.scatter`).Commentez le graphique obtenu" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "9. Donnez les contributions de chaque variable au premier axe de l'ACP. Quelle la variable qui contribue le plus ? Comment interpréter vous cette contribution ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Annexes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#utilisation de plt.text\n", "coords = np.random.rand(10,2)\n", "plt.plot(coords[:,0],coords[:,1],'o')\n", "for i,coord in enumerate(coords):\n", " print(coord)\n", " plt.text(coord[0],coord[1],i,fontsize='large')" ] }, { "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", "- Problème de la régression : $min_\\alpha \\| X \\alpha - y \\|^2_2$\n", "- Paramètres de la régression $\\alpha = (X^\\top X )^{-1}X^\\top y$\n", "- Coefficient de détermination $R^2$ : $\\frac{\\sum_{i=1}^{n} (z_i - \\bar{y})^2}{\\sum_{i=1}^{n} (y_i - \\bar{y})^2}$\n", "- Influence de l'observation $i$ : $H(i,i) = \\|H(i,:)\\|^2$ avec $H= X(X^\\top X)^{-1}X^\\top$\n", "- Contribution de l'observation $i$ (Distance de Cook) : $c_i = \\frac{H_{ii}}{p(1 - H_{ii})^2} \\frac{\\varepsilon_i^2}{s^2}$ avec $p$ le nombre de dimensions et $s^2 = \\frac{1}{n-p} \\sum_{i=1}^n \\varepsilon_i^2 $ \n", "- $C_p$ de Mallows : $Cp = \\frac{1}{s^2} \\sum_{i=1}^n (y_i - z_i^{(0)})^2 -n + 2 p_0$ avec $s^2 = \\frac{1}{n-p} \\sum_{i=1}^n (y_i - z_i)^2$ et $z_i^{(0)}$ l'estimation de $y_i$ faite avec la sous matrice $X^{(0)} \\in \\mathbb{R}^{n \\times p_0}$\n", "- Distance du $\\chi^2$ : $ D(O,T) = \\sum_{i=1}^I \\sum_{j=1}^J \\frac{(O_{ij} - T_{ij})^2}{T_{ij}} $" ] }, { "cell_type": "code", "execution_count": null, "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.9.7" } }, "nbformat": 4, "nbformat_minor": 4 }