{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TP4 : Ensemble de variables\n",
    "\n",
    "Le but de ce TP est de mettre en oeuvre visualisations et analyses statistiques d'un ensemble de variables. Comme vu en cours, une première analyse consiste à prendre en compte un ensemble de couples de variables.\n",
    "\n",
    "\n",
    "### Compétences associées :\n",
    "\n",
    "| Numéro        | Compétence           | \n",
    "|:------------- |:--------------------:|\n",
    "|AS301|\tSavoir représenter un jeu de données sous forme matricielle|\n",
    "|AS302|\tSavoir identifier un jeu de données nécessitant une normalisation|\n",
    "|AS303|\tÊtre capable d’analyser une matrice de covariance|\n",
    "|PY301|\tSavoir obtenir des informations d’une matrice  de données (dimensions, donnée, variable)|\n",
    "|PY302|\tÊtre capable d’appliquer une normalisation standard des données|\n",
    "|PY303|\tÊtre capable de calculer la matrice de covariance d’un jeu de données|\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Nuage de points et boxplots\n",
    "1.  Chargez le dataset iris avec sklearn. Garder que la description des données et donner le nombre d'observations et le nombre de variables. Jetez également un oeil à la description des données.\n",
    "> utilisez la fonction `load_iris` de scikit-learn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "X,y = load_iris(return_X_y = True)\n",
    "print(X.shape)\n",
    "n,p = X.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. En utilisant la fonction `subplot` de matplotlib, affichez les nuages de points par paires de variables. Mettez des histogrammes sur la diagonale. Quelles variables vous semblent liées ?\n",
    "\n",
    "\n",
    "> la \"case\" i,j du subplot est donnée par l'index i*4+j+1\n",
    "\n",
    "\n",
    "> Il y a beaucoup de manière de plotter avec matplotlib. Pour une référence complète, voir https://github.com/rougier/scientific-visualization-book"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt \n",
    "plt.figure(figsize=(15,15))\n",
    "# on pourrait aussi utiliser plt.subplots\n",
    "for i in range(p):\n",
    "    for j in range(i):\n",
    "        plt.subplot(4,4,i*4+j+1) #Les aider la dessus\n",
    "        plt.scatter(X[:,i],X[:,j],marker='*')\n",
    "        \n",
    "for i in range(p):\n",
    "    plt.subplot(4,4,i*4+i+1)\n",
    "    plt.hist(X[:,i])\n",
    "\n",
    "#3 et 4 semblent liées"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Normalisation des données\n",
    "3. Calculez la matrice `Xc` correspondant au centrage de la matrice `X`. Vérifiez que vous avez bien une moyenne nulle.\n",
    "> `np.mean(X,axis=0)` permet de calculer la moyenne pour chaque colonne de `X`\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "Xc = X - np.mean(X,axis=0)\n",
    "print(np.mean(Xc,axis=0)) # 0 à la précision de la machine\n",
    "np.allclose(np.mean(Xc,axis=0),0) # 0 à la précision de la machine"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4.  Calculez la matrice `Xr` correspondant aux données `X` centrées et réduites. Vérifiez que vos données sont bien centrées et réduites.\n",
    "> `np.std(X,axis=0)` permet de calculer l'écart type pour chaque colonne de `X`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Xr = (X - np.mean(X,axis=0))/np.std(X,axis=0)\n",
    "print(np.mean(Xr,axis=0))\n",
    "print(np.std(Xr,axis=0))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5. Faites la même chose avec l'objet `StandardScaler` du module sklearn.preprocessing de scikit-learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "sc = StandardScaler()\n",
    "X_rbis = sc.fit_transform(X)\n",
    "print(np.mean(Xr,axis=0))\n",
    "print(np.std(Xr,axis=0))\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Matrices de variance covariance / corrélation\n",
    "\n",
    "3. Calculez la matrice de variance/covariance de ce jeu de données en utilisant une multiplication matricielle.\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cov = Xc.T@Xc\n",
    "plt.imshow(cov)\n",
    "plt.colorbar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. Calculez maintenant la matrice de corrélation, toujours de manière matricielle. Est ce que cette matrice confirme votre hypothèse de la question 2 ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "Xr = (X - np.mean(X,axis=0))/np.std(X,axis=0)\n",
    "\n",
    "corr = (Xr.T@Xr)/n\n",
    "print(corr)\n",
    "plt.imshow(corr)\n",
    "plt.colorbar()"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "Retour dans le monde réel : que pouvez vous dire de la forme générale des pétales des orchidées ?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "elles sont probablement ellipsoïdales"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=X[:,0]\n",
    "y=X[:,1]\n",
    "(x.T@y - (n *np.mean(x)*np.mean(y)))/(np.sqrt(np.sum((x-np.mean(x))**2)*np.sum((y-np.mean(y))**2)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "corr[0,1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "iml",
   "language": "python",
   "name": "iml"
  },
  "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.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
