Comment trouver des relations dans vos données
La collecte de données ne suffit pas. Vous pouvez remplir des feuilles de calcul avec des données, mais c'est inutile si vous ne pouvez pas agir dessus. La régression est l'un des outils statistiques les plus puissants pour trouver des relations dans les données. Python facilite la tâche et il est beaucoup plus flexible qu'une feuille de calcul. Mettez ce crayon et la manchette et ramassez Python à la place. Voici comment commencer.
Sommaire
Régression linéaire simple: trouver des tendances
La forme la plus simple de régression dans Python est, bien, une régression linéaire simple. Avec une régression linéaire simple, vous essayez de voir s'il existe une relation entre deux variables, avec la première connue sous le nom de « variable indépendante » et ce dernier cette « variable dépendante ». La variable indépendante est généralement tracée sur l'axe x et la variable dépendante de l'axe y. Cela crée le diagramme de dispersion classique des points de données. L'objectif est de tracer une ligne qui correspond le mieux à ce diagramme de dispersion.
Nous allons commencer par utiliser l'exemple de données des conseils dans les restaurants de New York. Nous voulons voir s'il existe une relation entre le projet de loi total et la pointe. Cet ensemble de données est inclus dans le package de traçage statistique Seaborn, mon outil de visualisation de données préféré. J'ai défini ces outils dans un environnement Mamba pour un accès facile.
Tout d'abord, nous importerons SeaBorn, une base de données de traçage statistique.
import seaborn as sns
Ensuite, nous nous chargerons dans l'ensemble de données:
tips = sns.load_dataset('tips')
Si vous utilisez un cahier Jupyter, comme celui à lequel je lie sur ma propre page GitHub, assurez-vous d'inclure cette ligne pour afficher des images dans le cahier au lieu d'une fenêtre externe:
%matplotlib inline
Nous allons maintenant regarder le diagramme de dispersion avec la méthode Relplot:
sns.relplot(x='total_bill',y='tip',data=tips)
Le diagramme de dispersion semble être principalement linéaire. Cela signifie qu'il pourrait y avoir une relation linéaire positive entre le montant de la facture et la pointe. Nous pouvons tracer la ligne de régression avec la méthode Regplot:
sns.regplot(x='total_bill',y='tip',data=tips)
La ligne semble s'adapter assez bien.
Nous pouvons utiliser une autre bibliothèque, Pingouin, pour une analyse plus formelle. La méthode linéaire de Pingouin calculera les coefficients de l'équation de régression de la ligne pour s'adapter aux points de données et déterminer l'ajustement.
import pingouin as pg
pg.linear_regression(tips('total_bill'),tips('tip')).round(2)
L'arrondi rendra les résultats plus faciles à lire. Le nombre auquel faire attention en régression linéaire est le coefficient de corrélation. Dans le tableau résultant, il est répertorié comme « R2 » car c'est le carré du coefficient de corrélation. C'est .46, ce qui indique un bon ajustement. Prendre la racine carrée révèle qu'il est autour de 0,68, ce qui est assez proche de 1, indiquant une relation linéaire positive plus formellement que l'intrigue que nous avons vue plus tôt.
Nous pouvons également construire un modèle avec les valeurs du tableau. Vous vous souvenez peut-être de l'équation d'une ligne: y = mx + b. Le Y serait la variable dépendante, le M est le coefficient de x, ou la facture totale, qui est de 0,11. Cela détermine à quel point la ligne est raide. Le B est l'ordonnée Y, ou 0,92.
L'équation résultante basée sur ce modèle est
tip = 0.11(total bill) + 0.92
Les équations de régression retournent cela, donc ce serait:
tip = 0.92 + 0.11(total_bill)
Nous pouvons écrire une courte fonction Python qui prédit la pointe en fonction du montant de la facture.
def tip(total_bill):
return 0.92 + 0.11 * total_bill
La deuxième ligne est censée être en retrait, mais notre CMS ne peut pas afficher cela, veuillez donc vous assurer de mettre cette ligne sur votre machine. N'oubliez pas que les retraits en python sont de quatre espaces.
Prédons le conseil d'une facture de restaurant de 100 $:
tip(100)
La pointe attendue est d'environ 12 $.
Régression linéaire multiple: prendre la régression dans la troisième dimension, et au-delà
La régression linéaire peut être étendue à plus de variables que deux. Vous pouvez regarder des variables plus indépendantes. Au lieu d'ajuster une ligne sur des points de données sur un plan, vous installez un plan sur un diagramme de dispersion. Malheureusement, cela est plus difficile à visualiser qu'avec une régression 2D. J'ai utilisé la régression multiple pour construire un modèle de prix des ordinateurs portables en fonction de leurs spécifications.
Nous utiliserons l'ensemble de données TIPS. Cette fois, nous examinerons la taille de la fête avec la colonne « Taille ». C'est facile à faire à Pingouin.
pg.linear_regression(tips(('total_bill','size')),tips('tip')).round(2)
Notez les doubles supports sur le premier argument spécifiant la facture totale et la taille de la partie. Notez que le R² est identique. Cela signifie encore qu'il y a un bon ajustement et que la facture totale et la taille du tableau sont de bons prédicteurs de la pointe.
Nous pouvons réécrire notre modèle antérieur pour tenir compte de la taille, en utilisant le coefficient de la taille du tableau:
def tip(total_bill,size):
return 0.67 + 0.09 * total_bill + 0.19 * size
Régression non linéaire: courbes d'ajustement
Non seulement vous pouvez adapter une régression linéaire, mais vous pouvez également s'adapter aux courbes non linéaires. Je vais le démontrer en utilisant Numpy pour générer certains points de données qui peuvent représenter un tracé quadratique.
Tout d'abord, je vais générer un grand tableau de points de données dans Numpy pour l'axe X:
x = np.linspace(-100,100,1000)
Maintenant, je vais créer un tracé quadratique pour l'axe y.
y = 4*x**2 + 2*x + 3
Pour créer la régression, je vais créer un Pandas DataFrame, une structure de données similaire à une base de données relationnelle, pour les axes X et Y. Cela créera des colonnes pour les valeurs x et y, avec les noms « x » et « y ». Nous passons un dictionnaire pour le DataFrame que nous voulons créer à Pandas. Nous appellerons DataFrame « DF ».
import pandas as pd
df = pd.DataFrame({'x':x,'y':y})
Nous pouvons examiner notre dataframe avec la méthode de tête:
df.head()
Nous pouvons créer un diagramme de dispersion avec Seaborn comme nous l'avons fait plus tôt avec les données linéaires:
sns.relplot(x='x',y='y',data=df)
Il ressemble à l'intrigue parabolique classique dont vous vous souvenez peut-être de la classe de mathématiques, en traçant sur votre calculatrice graphique (que Python peut remplacer). Voyons si nous pouvons installer une parabole dessus. La méthode Regplot de SeaBorn a l'option de commande, qui spécifie le degré de la ligne polynomiale à s'adapter. Puisque nous essayons de tracer une ligne quadratique, nous allons définir l'ordre sur 2:
sns.regplot(x='x',y='y',order=2,data=df)
Il semble en effet s'adapter à une parabole quadratique classique.
Pour obtenir la régression du format, nous pouvons utiliser la technique de régression non linéaire avec Pingouin. Nous allons simplement ajouter une autre colonne à notre DataFrame pour carré les valeurs X:
df('x2') = df('x')**2
Nous pouvons ensuite utiliser une régression linéaire pour s'adapter à la courbe quadratique:
pg.linear_regression(df(('x','x2')),df('y')).round(2)
Parce qu'il s'agissait d'une création artificielle, le R² est 1, indiquant un très bon ajustement, que vous ne verriez probablement pas sur les données réelles.
Nous pouvons également construire un modèle prédictif en utilisant une fonction:
def quad(x):
return 3 + 2*x + 4*x**2
Vous pouvez également étendre cette méthode aux polynômes avec des degrés supérieurs à 2.
Régression logistique: ajustement des catégories binaires
Si vous souhaitez trouver une relation pour les catégories binaires, comme un certain facteur de risque, comme si une personne fume ou non, nous pouvons utiliser la régression logistique.
La façon la plus simple de visualiser cela est à nouveau d'utiliser la bibliothèque Seaborn. Nous chargerons l'ensemble de données des passagers sur le Titanic. Nous voulons voir si le prix du billet était un prédicteur de qui survivrait ou non au voyage malheureux.
titanic = sns.load_dataset('titanic')
Nous pouvons examiner les données comme nous l'avons fait avec le DataFrame quadratique:
titanic.head()
Nous utiliserons la méthode LMPlot, car elle peut s'adapter à une courbe logistique:
sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)
Nous voyons la courbe logistique sur le nombre de passagers, séparés par leur survie ou non. La colonne « Survive » est déjà séparée en 0 pour « n'a pas survécu » et 1 pour « a survécu ».
Nous pouvons utiliser Pingouin pour déterminer officiellement si le prix des tarifs était un prédicteur de la survie sur le Titanic, en utilisant Pingouin, qui, parmi ses nombreux tests statistiques, offre une régression logistique:
pg.logistic_regression(titanic('fare'),titanic('survived')).round(2)
Le nombre à qui faire attention dans un test statistique est la valeur p, indiquée dans le tableau comme «PVAL». Il est 0,0, ce qui indique que le prix du billet était un fort prédicteur de survivre au voyage du Titanic.
Ces opérations montrent pourquoi Python est un langage de choix pour l'analyse des données. Il fait des opérations qui pourraient prendre des jours à faire à la main, ou qui étaient même au-delà de ce que les statisticiens étaient prêts à faire, ne prennent que quelques secondes à Python. Ces opérations de régression vous aideront à parcourir vos données pour trouver des relations et faire des prédictions.
