Explication du concept d'analyse de régression à l'aide de Python Partie 1

Récemment, l'apprentissage automatique, l'intelligence artificielle, etc. sont devenus populaires, et je pense que la connaissance des statistiques qui en constituent la base est importante. Par conséquent, je voudrais essayer d'expliquer le principe de l'analyse de régression, dont l'effet est facile à comprendre même en statistique, dans le but de pouvoir le comprendre conceptuellement tout en calculant et en dessinant des graphiques en Python. Je ne suis pas statisticien, donc si vous avez des suggestions ou des commentaires, n'hésitez pas à me contacter. Je pense qu'il y a certains points qui ne sont pas mathématiquement stricts, mais pardonnez-moi s'il vous plaît ...

base de données###

Tout d'abord, récupérez l'ensemble de données.

données voitures

Cette page utilise Python pour l'explication, mais les données utilisées sont les données des voitures de l'ensemble de données dans le logiciel d'analyse statistique R. Veuillez télécharger et utiliser les données csv depuis ici. (Cependant, selon la description de ces données, cela ressemble aux données des années 1920, il ne s'agit donc que d'un exemple de données.) Dans cette explication, on suppose qu'il est enregistré sous "cars.csv".

teble definition of cars data

[,0]    index
[,1]	speed	numeric	Speed (mph)
[,2]	dist	numeric	Stopping distance (ft)

Une explication détaillée des données peut être trouvée sur ici, mais la vitesse de la voiture et son Ce sont des données qui collectent 50 ensembles de distance d'arrêt lorsque le frein est actionné à grande vitesse.

Préparation Python

Python utilise la version 2.7. On suppose également que les bibliothèques suivantes sont déjà installées.

Importez-les.


import numpy as np
import matplotlib.pyplot as plt

Lecture des données

Lisez les données et dessinez d'abord un diagramme de dispersion. Pour obtenir une image des données, il est facile de dessiner un graphique.

Soit dit en passant, étant donné que les données d'origine sont une unité qui n'est pas familière aux Japonais, comme les miles et les pieds, nous convertirons l'unité en mètres.

1 pied ≒ 0,3048 mètres 1 mph   ≒ 1.61 km/h Alors, convertissez l'unité de données comme suit.


data= np.loadtxt('cars.csv',delimiter=',',skiprows=1)
data[:,1] = map(lambda x: x * 1.61, data[:,1])    #km de mph/Convertir en h
data[:,2] = map(lambda y: y * 0.3048, data[:,2])  #Convertir de ft en m

Ensuite, dessinez un diagramme de dispersion basé sur ces données.


fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(111)
ax.set_title("Stopping Distances of Cars")
ax.set_xlabel("speed(km/h)")
ax.set_ylabel("distance(m)")
plt.scatter(data[:,1],data[:,2])

cardistans_scatter.png

Qu'est-ce que l'analyse de régression?

En utilisant ces données, une analyse de régression peut être utilisée pour déterminer dans quelle mesure une voiture roulant à une certaine vitesse peut s'arrêter complètement lorsqu'elle freine brusquement. En d'autres termes


distance = \alpha * speed + \beta

Il peut être exprimé par une équation linéaire comme indiqué dans. C'est ce qu'on appelle une analyse de régression simple. (Puisqu'il n'y a qu'une seule variable, elle est "unique".) Cet ajustement linéaire est parfois appelé une approximation du premier ordre. $ \ Alpha $ est la pente de la ligne droite et $ \ beta $ est la valeur de la section. Appelons cette ligne droite une ligne droite approximative.

スクリーンショット 2015-02-15 15.23.38.png

J'essaierai d'appliquer une ligne droite à cela visuellement. Le graphique que j'ai appliqué visuellement est ci-dessous, mais j'ai mis $ \ alpha $ à 0,74 et $ \ beta $ à -5. comment c'est? N'est-il pas probable qu'une telle ligne droite puisse être appliquée d'une manière ou d'une autre?

# y = 0.74x -5 lignes droites((0,-5),(50,32)Traverser)
x = [0,  50]
y = [-5, 32]
plt.plot(x,y)

cardistans_scatter2.png

Cependant, je viens de l'appliquer visuellement, donc je ne sais pas si c'est vraiment la meilleure ligne droite. Voyons comment trouver les optimales $ \ alpha $ et $ \ beta $, la méthode des moindres carrés.

Méthode du carré minimum

Quelle est la méthode des moindres carrés et quel est le «minimum»? Qu'est-ce que vous «carré»?

Que minimiser?

Le minimum est l'erreur entre la ligne droite et les données. L'erreur est la ligne verticale tracée de chaque point à la ligne droite approximative. Voir le graphique ci-dessous.


# line: y = 0.74 -5
x = [0,  50]
y = [-5, 32]
plt.plot(x,y)

# draw errors
for d in data:
    plt.plot([d[1],d[1]],[d[2],d[1]*0.74-5],"k")

cardistans_scatter_with_errors.png

L'erreur est représentée par cette ligne noire. Intuitivement, j'estime que la ligne droite qui additionne toutes ces erreurs est la moins appropriée pour ces données.

Voyons ce qui se passe lorsque vous modifiez $ \ alpha $ ou $ \ beta $ pour la ligne droite que vous avez appliquée visuellement précédemment.

Tout d'abord, jetons un œil à la ligne droite qui a changé $ \ alpha $.


# line: y = 0.54x -5
x = [0,  50]
y = [-5, 72]
plt.plot(x,y)

# draw errors
for d in data:
    plt.plot([d[1],d[1]],[d[2],d[1]*1.54-5],"k")

cardistans_scatter_with_errors_a.png

Jetons un coup d'œil au $ \ beta $ modifié.


# line: y = 0.74x +15
x = [0,  50]
y = [15, 52]
plt.plot(x,y)

# draw errors
for d in data:
    plt.plot([d[1],d[1]],[d[2],d[1]*0.74+15],"k")

cardistans_scatter_with_errors_b.png

Comment c'est? Il semble que cette erreur soit petite lorsque vous dessinez pour la première fois une ligne droite approximative qui semble bonne visuellement et celle qui ose décaler $ \ alpha $ et $ \ beta $. La méthode des moindres carrés est une méthode pour trouver $ \ alpha $ et $ \ beta $ qui minimise cette erreur.

Que mettre au carré?

Cela corrige également l'erreur. La raison est que je veux trouver la distance entre la ligne droite et la ligne droite reliant les points de chaque donnée, mais si elle est laissée telle quelle, l'erreur sera positive pour les données au-dessus de la ligne droite et négative pour les données en dessous, donc au carré. Ensuite, prenez le plus et le moins et rendez tout positif.

Calculons

Maintenant que vous savez ce qu'il faut mettre au carré et minimiser, procédons au calcul concret.

D'abord de la définition des termes. La $ i $ th donnée est $ x_i, y_i $, et son approximation est $ \ hat {y} _i $.

Aussi, laissez l'erreur être $ \ epsilon_i $. Développons les 19èmes données.


i = 18
x_i = data[i,1]
y_i = data[i,2]
y_hat = x_i*0.74-5
ax.set_ylim(0,y_i+3)
ax.set_xlim(x_i-5,x_i+5)

plt.plot([x_i,x_i],[y_i,y_hat],"k")
plt.plot(x,y)

plt.scatter([x_i],[y_i])

スクリーンショット 2015-02-15 16.23.03.png

Maintenant, si vous corrigez cette erreur et ajoutez toutes les données,


S = \sum_i^n\epsilon_i^2=\sum_i^n (y_i-\hat{y}_i )^2

Peut être exprimé comme.


\hat{y}_i = \alpha  x_i + \beta

Donc, si vous remplacez les données de valeur approximative, ce sera comme suit.


S = \sum_i^n \epsilon_i^2 = \sum_i^n  ( y_i-\alpha x_i - \beta )^2 

La droite approximative optimale peut être obtenue en différenciant ce $ S $ avec les paramètres $ \ alpha et \ beta $ et en trouvant la valeur minimale. Exprimant ce $ S $ par l'équation de $ \ alpha $,


S(\alpha) = \left( \sum_i^n x_i^2 \right) \alpha^2
 + 2\left( \sum_i^n (x_i\beta - x_i y_i ) \right) \alpha 
 + n\beta^2 - 2\beta\sum_i^n y_i + \sum_i^n y_i^2

Sera. Quel genre de fonction est ce $ S (\ alpha) $? C'est une fonction quadratique de $ \ alpha $. Puisque le coefficient de $ \ alpha $ est la somme des carrés, il vaut toujours 0 ou une valeur positive, il s'agit donc d'une fonction quadratique convexe vers le bas. Ici, dessinons un graphique en supposant que $ \ beta = 0 $ pour donner une image de la forme.


S(\alpha) = \left( \sum_i^n x_i^2 \right) \alpha^2
 - 2\left( \sum_i^n x_i y_i \right) \alpha 
 + \sum_i^n y_i^2   ...  (if \beta = 0 )

Ça sera facile. Calculons ce coefficient à partir des données.

sum_x2 = np.sum([x ** 2 for x in data[:,1]])   # \sum x_i^2 
sum_y2 = np.sum([x ** 2 for y in data[:,2]])   # \sum y_i^2 
sum_xy = data[:,1].dot(data[:,2])              # \sum x_i y_i

print sum_x2
>>> 34288.2988

print sum_y2
>>> 11603.8684051

print sum_xy
>>> 18884.194896

Donc,


S(\alpha) ≒ 34288 \alpha^2 - 37768 \alpha + 11604 

Lorsque vous dessinez ce graphique,

x1 = np.linspace(-1,5,200)
x1_2 = np.array([x ** 2 for x in x1])

#34288α2−37768α+ 11604
y1 = np.array(34288 * x1_2) - (37768 * x1) + 11604

plt.plot(x1,y1)


# Y =Ligne de 11604
plt.plot([-1,5],[11604, 11604])
plt.plot([0,0],[13000, 0], "--k")

minimize_a3.png

Si vous décalez $ \ alpha $, vous trouverez la valeur minimale quelque part.

De même pour $ \ beta $


S(\beta) = n\beta^2
+ 2 \left( \sum_i^n (x_i\alpha - y_i) \right) \beta
+ \alpha^2\sum_i^n x_i^2 - 2\alpha \sum_i^n x_iy_i + \sum_i^n y_i^2

Trouvons un graphique en supposant que $ \ alpha = 0 $.


S(\beta) = n\beta^2
- 2 \left( \sum_i^n y_i \right) \beta + \sum_i^n y_i^2
   ...  (if \alpha = 0 )

Puisqu'il n'y avait pas de $ \ sum y_i $ dans la valeur calculée précédemment, quand je l'ai calculée (et aussi $ \ sum x_i $),


sum_x = np.sum(data[:,1])
print sum_x
>>> 1239.7

sum_y = np.sum(data[:,2])
print sum_y
>>> 655.0152

Par conséquent, l'équation quadratique pour $ \ beta $ est


S(\beta) ≒ 50\beta^2 - 1310 \beta + 11604

Et dessinez un graphique


x1 = np.arange(-100,100,0.01)
x1_2 = np.array([x ** 2 for x in x1])
n = len(data[:,2])

# nβ^2-1310β+11604 
y1 = np.array(n * x1_2) - (1310 * x1) + 11604 

fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(111)
ax.set_xlim(-5,30)
ax.set_ylim(0,20000)
ax.set_xlabel("beta")
plt.plot([-50,30],[11604,11604],"g")
plt.plot([0,0],[30000,0],"--k")
plt.plot(x1,y1)


minimize_b3.png

Et, après tout, si vous décalez $ \ beta $, vous pouvez voir qu'un certain $ \ beta $ prend la valeur minimale.

Passez à la Partie 2.

Recommended Posts

Explication du concept d'analyse de régression à l'aide de python Partie 2
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Explication du concept d'analyse de régression à l'aide de Python Extra 1
Découpez une partie de la chaîne à l'aide d'une tranche Python
Revoir le concept et la terminologie de la régression
Analyse de la variation temporelle des trous noirs en utilisant Python
[Python] Lire le code source de Bottle Part 2
Raccourcir le temps d'analyse d'Openpose à l'aide du son
Essayez d'utiliser le framework Web Python Tornado Partie 1
[Python] Lire le code source de Bottle Part 1
Essayez d'utiliser le module de collections (ChainMap) de python3
Essayez d'utiliser le framework Web Python Tornado Partie 2
[Python + OpenCV] Peignez la partie transparente de l'image en blanc
le zen de Python
Bases de l'analyse de régression
Analyse de régression avec Python
Prédire l'avenir des tendances démographiques dans la ville de Numazu par analyse de régression chronologique à l'aide de Prophet
[Python] [Word] [python-docx] Analyse simple des données de diff en utilisant python
Python - Explication et résumé de l'utilisation des 24 meilleurs packages
Implémentation python de la classe de régression linéaire bayésienne
La douleur de gRPC en utilisant Python. Novembre 2019. (Mémo personnel)
Étude de Python Hour8: Utilisation de packages
Vers la retraite de Python2
Analyse statique des programmes Python
python: principes de base de l'utilisation de scikit-learn ①
Analyse de régression simple avec Python
À propos des fonctionnalités de Python
Analyse de données à l'aide de pandas python
Principes de base de Python x SIG (1)
Le pouvoir des pandas: Python
Pensez à l'environnement d'analyse (Partie 1: Vue d'ensemble) * Depuis janvier 2017
Afficher à l'aide du module python du backend mobile Nifty Cloud
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
L'histoire de Python et l'histoire de NaN
Traitement du langage naturel japonais utilisant Python3 (4) Analyse des émotions par régression logistique
Capture d'image de Firefox en utilisant Python
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
First Python 3 ~ Le début de la répétition ~
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
[Python] PCA scratch dans l'exemple de "Introduction à la méthode d'analyse multivariée"
Suppression de la brume à l'aide de Python detailEnhanceFilter
Existence du point de vue de Python
[Python] Notification LINE des dernières informations à l'aide de la recherche automatique Twitter
pyenv-changer la version python de virtualenv
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 6: Utilisation du modèle
[Python] Comprendre le potentiel_field_planning de Python Robotics
Évaluer les performances d'un modèle de régression simple à l'aide de la validation d'intersection LeaveOneOut
Revue des bases de Python (FizzBuzz)
Principes de base de Python x SIG (partie 2)
Implémentation des notifications de bureau à l'aide de Python
Obtenez et définissez la valeur du menu déroulant en utilisant Python et Selenium
Extraire le fichier targz en utilisant python
Traitement de l'analyse japonaise à l'aide de Janome part1
Essayez d'utiliser le module Python Cmd
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Recommandation d'analyse des données à l'aide de MessagePack