Comment exécuter facilement des régressions linéaires de style R en Python
Python est populaire pour l'analyse statistique en raison du grand nombre de bibliothèques. L'un des calculs statistiques les plus courants est la régression linéaire. statsmodels propose des outils puissants pour la régression et l'analyse de la variance. Voici comment démarrer avec les modèles linéaires.
Sommaire
Qu'est-ce que les modèles de statistiques ?
statsmodels est une bibliothèque Python permettant d'exécuter des tests statistiques courants. Il est particulièrement adapté à l'analyse de régression, en particulier celle que l'on trouve en économétrie, mais il n'est pas nécessaire d'être économiste pour l'utiliser.
Il y a une courbe d’apprentissage. mais une fois que vous aurez compris, vous constaterez qu'il est beaucoup plus flexible à utiliser que les fonctions de régression que vous trouverez dans un tableur comme Excel. Cependant, cela ne fera pas l'intrigue à votre place. Si vous souhaitez générer le nuage de points classique avec une ligne de régression tracée dessus, vous devrez utiliser une bibliothèque comme Seaborn.
L'un des avantages de l'utilisation des modèles de statistiques est qu'ils sont vérifiés avec d'autres logiciels statistiques tels que R, Stata et SAS pour en vérifier l'exactitude. Ce package pourrait donc être fait pour vous si vous êtes dans la recherche professionnelle ou universitaire.
Régression linéaire simple
Si vous souhaitez simplement déterminer la relation entre une variable dépendante (y), ou la variable endogène dans le langage économétrique et des modèles statistiques, par rapport à la variable exogène, indépendante ou « x », vous pouvez le faire facilement avec les modèles statistiques.
Si vous avez de l'expérience avec R ou si vous souhaitez un moyen rapide de générer une régression avec des modèles de statistiques à l'aide d'un DataFrame pandas, vous pouvez utiliser des formules de style R.
Tout d’abord, vous devez importer les modèles de statistiques et son API de formule :
import statsmodels.formula.api as smf
import statsmodels.api as sm
J'utiliserai mon modèle préféré, mais il s'agit en fait de Seaborn, des pourboires et des factures totales dans un restaurant de New York.
import seaborn as sns
sns.set_theme()
tips = sns.load_dataset('tips')
Je peux regarder l'ensemble de données avec la méthode head :
tips.head()
Je veux comprendre la relation entre le pourboire et la facture totale. Je peux tracer cette relation avec un nuage de points dans Seaborn.
sns.relplot(x='total_bill',y='tip',data=tips)
Il semble qu'il existe une relation linéaire positive. Je peux essayer un tracé de régression :
sns.regplot(x='total_bill',y='tip',data=tips)
Il semble qu’il existe effectivement une relation linéaire positive, comme l’indique la ligne. Avec une facture plus importante, il semble que le pourboire augmente également. Ce tracé ne me donnera pas les coefficients dont j'ai besoin pour cette ligne. les modèles de statistiques le feront.
Tout d'abord, je vais m'adapter à la ligne.
results = smf.ols('tip ~ total_bill',data = tips).fit()
Cela utilise l'API de formule de statsmodels. Il utilise le module patsy, qui emprunte les conventions établies par le langage R. « ols » signifie « Moindres carrés ordinaires », la méthode utilisée pour générer la régression. Cela minimise autant que possible le carré de la distance entre la ligne et les points de données, également appelé résidu. Cela définit la colonne des pourboires comme variable endogène et la colonne de la facture totale comme variable exogène. Le tilde (~) dans ce contexte est une sorte de signe égal sophistiqué. Cela semble étrange, mais c’est une façon succincte de préciser la relation. Le « data = tips » indique aux modèles de statistiques d'utiliser les conseils DataFrame. La méthode .fit() ajuste les points de données à un objet de résultats, dans ce cas, il sera appelé « résultats ».
Vous pouvez afficher un résumé de deux manières. Vous pouvez utiliser la commande print de Python si vous écrivez un script Python :
print(results.summary())
Si vous utilisez une session interactive, telle qu'IPython ou un notebook Jupyter, vous pouvez simplement taper le nom de l'objet, que je vais démontrer dans un notebook d'exemples pour cet article :
results.summary()
Cela montrera les résultats de la régression. Je l'expliquerai en détail plus tard.
Vous pouvez également utiliser des tableaux NumPy pour effectuer la régression. Vous allez créer une matrice de « conception » de la variable indépendante plus une colonne d'interception de 1.
Créons des valeurs x et y en générant des nombres aléatoires avec NumPy :
x = np.linspace(-10,10,100)
statsmodels inclut une fonction pour créer cette interception avec la méthode add_intercept
y = 2*x - 3
statsmodels inclut une fonction pour créer cette interception avec la méthode add_intercept. Cela créera la matrice de conception.
X = sm.add_intercept(x)
La création du modèle est similaire à l'utilisation de formules de style R.
model = sm.OLS(y,X)
results = model.fit()
print(results.summary())
Notez que lorsque vous utilisez l'API statsmodels au lieu de l'API de formule, la fonction OLS est en majuscules.
Régression linéaire multiple
Il est facile d'étendre la régression simple à plusieurs variables exogènes. Ceci est utile pour voir s'il pourrait y avoir une variable confondante conduisant à une corrélation erronée. Au lieu d'ajuster une ligne sur un ensemble de points de données sur un plan, vous ajustez un plan sur les points de données dans un espace tridimensionnel et un hyperplan avec plus de deux variables exogènes et donc plus de trois dimensions.
Ceci est facile à réaliser avec des formules de style R. Supposons que nous voulions ajouter la taille du groupe à notre régression des pourboires. Nous pouvons faire cela :
results = smf.ols('tip ~ total_bill + size',data = tips).fit()
results.summary()
Pour ajouter des régresseurs, vous pouvez simplement les ajouter à la formule avec un signe plus (« + »)
Vous pouvez également l'utiliser pour modéliser des relations non linéaires, telles qu'une équation quadratique. Générons un autre modèle en utilisant NumPy et créons un DataFrame pandas :
x = np.linspace(-10,10,100)
y = 3*x**2 + 2*x + 5
df = pd.DataFrame({'x':x,'y':y})
Nous pouvons visualiser cela avec un autre nuage de points :
sns.relplot(x='x',y='y',data=df)
L’intrigue semble suggérer une parabole quadratique classique.
Nous pouvons créer une autre formule pour modéliser cela avec statsmodels en ajoutant le carré des valeurs x comme régresseur :
results = smf.ols('y ~ x + I(x**2)',data=df).fit()
results.summary()
Le « I() » autour du x**2 sert à indiquer aux modèles de statistiques qu'il ne s'agit pas d'un régresseur distinct, mais d'une opération sur la colonne x dans le DataFrame pandas.
Interprétation des résultats de régression
Vous vous demandez peut-être comment interpréter les résultats de la régression.
Lorsque vous affichez les informations results.summary(), vous verrez un tableau avec quelques valeurs. Passons en revue. Le coin supérieur droit a le r au carré, ou le carré du coefficient de corrélation r. Cela vous indique le degré de corrélation entre les variables indépendantes ou exogènes et les variables endogènes ou dépendantes, et par conséquent, dans quelle mesure le modèle est adapté aux données. Plus le r au carré est proche de 1, plus il y a de corrélation entre les variables. Les données du monde réel sont rarement parfaitement corrélées. Dans cet exemple avec régression multiple, le r carré ajusté est d'environ 0,463, ce qui constitue une assez bonne corrélation.
Le r carré ajusté est utile pour la régression multiple et corrige les régressions erronées, vous donnant ainsi un coefficient de corrélation plus précis. Si vous regardez la régression multiple que nous avons effectuée, vous remarquerez qu'elle est légèrement inférieure au r au carré.
Le tableau ci-dessous montre l'ordonnée à l'origine, les coefficients de chaque régresseur et leur degré d'ajustement. Avec une simple régression linéaire, l’équation correspond à la forme à l’origine de la pente, y = mx + b. La valeur du coefficient de la variable indépendante sera le m et l'ordonnée à l'origine est le « b ». Cela s’étend naturellement à davantage de régresseurs. Les colonnes de droite du tableau montrent l'intervalle de confiance de l'endroit où pourraient se situer les vraies valeurs, qui a été représenté sur le tracé de régression par la zone ombrée.
La colonne « std err » mesure l'erreur standard, qui est la distance entre les points de données et la ligne ajustée. Plus le chiffre est bas, meilleur est l’ajustement du modèle.
Les valeurs p déterminent également la signification statistique des variables. statsmodels effectue le test t sur chaque variable de l'hypothèse nulle selon laquelle la pente est de 0. Si la valeur de p est inférieure à un seuil prédéterminé, le minimum habituel étant de 0,05, le résultat est significatif.
Le bas du graphique montre la distribution des résidus, ou la différence entre les points de données et la ligne. Elle doit être aussi proche que possible d’une distribution normale pour être bien ajustée. L'asymétrie et l'aplatissement mesurent dans quelle mesure les résidus diffèrent de la distribution normale. Comme pour le coefficient de corrélation, les données du monde réel s’ajustent rarement parfaitement.
Analyse de variance unidirectionnelle
Vous vous demandez peut-être comment comparer une valeur numérique à travers une variable catégorielle. Pour ce faire, vous devez passer à l’analyse de variance, ou ANOVA. C'est facile à réaliser avec les modèles de statistiques. Puisque nous n’utilisons qu’une seule catégorie, c’est ce qu’on appelle l’ANOVA unidirectionnelle.
Chargeons un autre ensemble de données, cette fois sur les manchots de l'Antarctique.
penguins = sns.load_dataset('penguins')
penguins.head()
Voyons si l'espèce est un prédicteur significatif de la longueur du bec. On peut utiliser un modèle linéaire similaire à la régression, mais avec une variable catégorielle :
penguin_lm = smf.ols('bill_length_mm ~ species',data=penguins).fit()
Nous pouvons transmettre cela à la fonction anova_lm de statsmodels :
results = sm.stats.anova_lm(penguin_lm)
Nous pouvons visualiser les résultats :
print(results)
Nous verrons un tableau des résultats, mais le nombre auquel il faut prêter attention est la valeur p. Puisqu’elle est si basse qu’elle est en notation scientifique négative, l’espèce est un prédicteur important de la longueur du bec.
Analyse de variance multivoie
Nous pouvons étendre cela avec une autre variable catégorielle avec une anova bidirectionnelle. Il est facile de modifier notre formule originale et d'ajouter l'îlot au mélange pour voir si cela peut également réduire la longueur de la facture :
penguin_multi_lm = smf.ols('bill_length_mm ~ species * island',data=penguins).fit()
results = sm.stats.anova_lm(penguin_multi_lm)
imprimer(résultats)
C'est similaire à la régression multiple, mais nous utilisons la multiplication pour la formule au lieu de l'addition.
La régression multiple et l'ANOVA comme celles que vous venez de voir seraient presque impossibles à réaliser manuellement, avec la grande quantité de données et les formules complexes. statsmodels met à votre disposition une modélisation sophistiquée.
