<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Régressions linéaires avec Statsmodels et Scikit-Learn
On peut réaliser des régressions linéaires de beaucoup de manières avec Python. 
On en a retenu 2, statsmodels et scikit-learn. Les deux librairies ont chacunes leurs qualités et leurs défauts, sachez que l'une est plus orienté data science et l'autre plus pour des économistes. 
(inspiré de la page Linear Regression with Statsmodels and Scikit-Learn)
Par exemple, statsmodel vous fournira directement le tableau de regression, pour scikit c'est moins immédiat 
On commence par charger tous les packages qui vont servir dans ce notebook 
Step1:  On va utiliser la fameuse base des Iris qu'on peut appeler depuis la librairie seaborn.
Pour chaque fleur, on a des informations sur la longueur et largeur de ses sépales ainsi que de ses pétales.
Pour comprendre la différence en image 
Step2:  Grâce à ces graphiques, on observere une forte relation entre longeur et la largeur des pétales. 
On réalise une regression à une variable entre la longueur et la largeur grâce à seaborn. 
Regression à une variable avec seaborn
Step3:  Si on observe bien qu'une relation existe, on ne connait pas grand chose d'autre. 
Regression en utilisant scikit-learn
Step4:  La meilleure approximation linéaire est donc y=a+bx avec 
- a=−0.363075521319
- b=0.41575542
Mais en termes de présentation de résultats, c'est un peu limité... Pas de standard errors, pas de $R^2$ etc (du moins pas automatiquement) 
Regression en utilisant statsmodels
Remarque 
Step5:  Si vous regardez de plus près, vous observez que les coefficients des deux régressions sont proches mais pas égaux. Problème de précision ? Non...
Il faut faire attention avec statsmodels, il n'inclut pas de lui-même un intercept ($\beta_0$) alors que scikit learn le fait.
Step6:  Ca y est, les coefficients de scikit et de statsmodels sont quasi identiques (en réalité si vous regardez après la 10ème décimale, ils sont légèrement différents...)
Si on regadre le $R^2$, on se dit qu'on est plutôt pas mal pour cette régression (en même temps, dire que pour un iris, la longueur et la largeur du pétale sont corrélées, c'est un peu normal...)'
Mais voyons si on peut aller encore plus loin, par exemple, en ajoutant l'information de l'espèce de l'iris, avec des variables catégorielles (qu'on ajoutera sous la forme d'indicatries ou dummies)
Step7:  La regression multi-linéaire avec statsmodels
<ASSISTANT_TASK:>
Python Code:
from jyquickhelper import add_notebook_menu
add_notebook_menu()
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import seaborn as sns
import statsmodels.api as sm
from sklearn import linear_model
Explanation: Régressions linéaires avec Statsmodels et Scikit-Learn
On peut réaliser des régressions linéaires de beaucoup de manières avec Python. 
On en a retenu 2, statsmodels et scikit-learn. Les deux librairies ont chacunes leurs qualités et leurs défauts, sachez que l'une est plus orienté data science et l'autre plus pour des économistes. 
(inspiré de la page Linear Regression with Statsmodels and Scikit-Learn)
Par exemple, statsmodel vous fournira directement le tableau de regression, pour scikit c'est moins immédiat 
On commence par charger tous les packages qui vont servir dans ce notebook :
End of explanation
iris = sns.load_dataset("iris")
iris.head()
sns.pairplot(iris, hue="species");
Explanation: On va utiliser la fameuse base des Iris qu'on peut appeler depuis la librairie seaborn.
Pour chaque fleur, on a des informations sur la longueur et largeur de ses sépales ainsi que de ses pétales.
Pour comprendre la différence en image : Sépale.
End of explanation
sns.lmplot(x="petal_length", y="petal_width", data=iris);
Explanation: Grâce à ces graphiques, on observere une forte relation entre longeur et la largeur des pétales. 
On réalise une regression à une variable entre la longueur et la largeur grâce à seaborn. 
Regression à une variable avec seaborn
End of explanation
X = iris[["petal_length"]]
y = iris["petal_width"]
# On fit le modele
model = linear_model.LinearRegression()
results = model.fit(X, y)
print(results.intercept_, results.coef_)
Explanation: Si on observe bien qu'une relation existe, on ne connait pas grand chose d'autre. 
Regression en utilisant scikit-learn
End of explanation
model = sm.OLS(y, X)
results = model.fit()
# Avec  statsmodel, on a une sortie qui ressemble beaucoup à celle de R
print(results.summary())
Explanation: La meilleure approximation linéaire est donc y=a+bx avec 
- a=−0.363075521319
- b=0.41575542
Mais en termes de présentation de résultats, c'est un peu limité... Pas de standard errors, pas de $R^2$ etc (du moins pas automatiquement) 
Regression en utilisant statsmodels
Remarque : on invese X et y dans la spécification du modèle pour cette librairie.
End of explanation
X = iris["petal_length"]
X = np.vander(X, 2) #ici on ajoute
y = iris["petal_width"]
model = sm.OLS(y, X)
results = model.fit()
print(results.summary())
Explanation: Si vous regardez de plus près, vous observez que les coefficients des deux régressions sont proches mais pas égaux. Problème de précision ? Non...
Il faut faire attention avec statsmodels, il n'inclut pas de lui-même un intercept ($\beta_0$) alors que scikit learn le fait.
End of explanation
dummies = pd.get_dummies(iris["species"])
iris = pd.concat([iris, dummies], axis=1)
iris.head()
Explanation: Ca y est, les coefficients de scikit et de statsmodels sont quasi identiques (en réalité si vous regardez après la 10ème décimale, ils sont légèrement différents...)
Si on regadre le $R^2$, on se dit qu'on est plutôt pas mal pour cette régression (en même temps, dire que pour un iris, la longueur et la largeur du pétale sont corrélées, c'est un peu normal...)'
Mais voyons si on peut aller encore plus loin, par exemple, en ajoutant l'information de l'espèce de l'iris, avec des variables catégorielles (qu'on ajoutera sous la forme d'indicatries ou dummies)
End of explanation
X = iris[["petal_length", "setosa", "versicolor", "virginica"]]
X = sm.add_constant(X) # une autre façons d'ajouter une constante 
y = iris["petal_width"]
model = sm.OLS(y, X)
results = model.fit()
print(results.summary())
Explanation: La regression multi-linéaire avec statsmodels
End of explanation
<END_TASK>