2. Analyse multivariée expliquée dans Python 3-1. Analyse en composantes principales (scikit-learn)

** L'analyse en composantes principales ** est une technique permettant de résumer un grand nombre de variables en un petit nombre de nouvelles variables. En d'autres termes, on peut dire que c'est une technique qui révèle la tendance générale et les caractéristiques individuelles en compressant les informations détenues par plusieurs variables, en synthétisant de nouvelles variables et en reconstruisant les données. Cette nouvelle variable est appelée le ** composant principal **.

Supposons que les résultats des tests de 5 matières, mathématiques, sciences, sciences sociales, anglais et japonais, soient pour 20 élèves par classe. Par conséquent, lorsque vous voulez connaître vos capacités académiques, vous regardez généralement le «score total». Exprimons les cinq sujets sous forme de variables $ x_ {1}, x_ {2}, x_ {3}, x_ {4}, x_ {5} $.

Points totaux= 1×x_{1} + 1×x_{2} + 1×x_{3} + 1×x_{4} + 1×x_{5}

J'ai volontairement écrit 1 $ × $, mais le score total est la somme des cinq sujets multipliée par le même poids de 1 $. Ce qui se passe ici, c'est que l'information qui avait à l'origine 5 sujets = 5 dimensions est résumée en 1 dimension appelée «capacité scolaire». La méthode d'examen de la capacité académique basée sur ce score total est basée sur l'idée que toute personne ayant des capacités académiques aura un bon score dans n'importe quelle matière. En d'autres termes, il y aura une corrélation entre chaque sujet.

Par conséquent, préparons des données factices pour 20 personnes dans une classe et voyons toutes les données pour le moment.

** ⑴ Importer la bibliothèque **

#Bibliothèque pour les calculs numériques et les opérations sur les blocs de données
import numpy as np
import pandas as pd

#Bibliothèque pour dessiner des graphiques
import matplotlib.pyplot as plt
%matplotlib inline

#Bibliothèque d'apprentissage automatique
import sklearn
from sklearn.decomposition import PCA

** ⑵ Préparez les données **

#Données de score de test pour 20 personnes
arr = np.array([[71,64,83,100,71], [34,48,67,57,68], [58,59,78,87,66], [41,51,70,60,72],
                [69,56,74,81,66], [64,65,82,100,71], [16,45,63,7,59], [59,59,78,59,62],
                [57,54,84,73,72], [46,54,71,43,62], [23,49,64,33,70], [39,48,71,29,66],
                [46,55,68,42,61], [52,56,82,67,60], [39,53,78,52,72], [23,43,63,35,59],
                [37,45,67,39,70], [52,51,74,65,69], [63,56,79,91,70], [39,49,73,64,60]])

#Convertir en bloc de données
df = pd.DataFrame(data = arr, columns = ['Math', 'Science', 'société', 'Anglais', 'langue nationale'])

002_0301_002.PNG

** ⑶ Dessinez un diagramme de dispersion pour avoir un aperçu des données **

#Importer la méthode de tracé de pandas
from pandas import plotting

#Dessinez un diagramme de dispersion
plotting.scatter_matrix(df, alpha=0.5, figsize=(8, 8))
plt.show()

Du code pandas.plotting.scatter_matrix (frame, alpha, figsize) qui dessine un diagramme de dispersion, l'argument ʻalpha est la transparence de la couleur du dessin (0 à 1), et figsize` est la taille du dessin (largeur, hauteur). ) Est spécifié en pouces.

002_0301_003.PNG

Que diriez-vous. Par exemple, vous pouvez voir une distribution linéaire qui monte vers la droite, comme les sciences et les mathématiques. Les scores en sciences plus élevés ont tendance à avoir des scores en mathématiques plus élevés, ce qui signifie qu'il existe une corrélation entre les données. Si tel est le cas, l'idée de l '** analyse en composantes principales ** est que les informations peuvent être compressées de manière plus compacte.

Analyse en composantes principales (ACP)

Le but de l'analyse en composantes principales est de compresser les données sans perdre autant d'informations que possible. Nous voulons minimiser la perte d'informations causée par la réduction du nombre de dimensions, en d'autres termes, nous recherchons une nouvelle variable qui maximise la quantité initiale d'informations. Maintenant, confirmons que l'analyse des composants principaux est effectivement effectuée dans ces étapes.

Tout d'abord, définissez le vecteur de 5 sujets = 5 variables comme suit.

  x = \left(
    \begin{array}{ccc}
      x_{1} \\
      x_{2} \\
      x_{3} \\
      x_{4} \\
      x_{5} 
    \end{array}
  \right)

** Calcul de la première composante principale ** La composante principale est définie comme "la valeur de chaque composante avec un coefficient ajouté à chaque variable" comme suit.

z_{1} = w_{11}x_{1} + w_{12}x_{2} + w_{13}x_{3} + w_{14}x_{4} + w_{15}x_{5} = w_{1}· X

Si $ w_ {1} $ sur le côté droit est représenté par un vecteur, ce sera comme suit, mais dans l'exemple précédent de total de points, $ 1 $ était tout inclus ici.

  w_{1} = \left(
    \begin{array}{ccc}
      w_{11} \\
      w_{12} \\
      w_{13} \\
      w_{14} \\
      w_{15} 
    \end{array}
  \right)

Ensuite, quel type de $ w_ {1} $ doit être recherché est "$ w_ {1} $ qui maximise la quantité d'informations". Quelle est cette quantité d'informations? Dans l'analyse en composantes principales, «information = dispersion». La dispersion est le degré de distribution des données, mais pourquoi la quantité d'informations est-elle importante lorsque la distribution est importante? C'est juste une analogie, mais disons que tout le monde a obtenu un score parfait de 10 sur un quiz très simple à la fin du cours. En d'autres termes, la distribution est de 0 $, mais dans ce cas, il n'y a pas d'information qui caractérise l'individu. Par contre, si la dispersion est raisonnable comme dans les 5 sujets de l'exemple, on peut évaluer que, par exemple, 90 points ou plus est bon et 20 points n'est pas bon. C'est pourquoi on peut dire que "distribution maximale = information maximale".

Cependant, même si la dispersion est maximale, elle peut en fait être aussi grande que vous le souhaitez. Si vous multipliez toutes les valeurs de $ w_ {1} $ à $ w_ {5} $ par 100, alors $ z_ {1} $ sera également multiplié par 100 et la distribution sera multipliée par 10 000. Ce n'est pas que vous puissiez le rendre infiniment grand, mais ce que vous voulez savoir, c'est le rapport de poids pour chaque sujet. Je veux savoir quel genre de ratio la quantité d'informations sera la plus importante. Alors gardez la taille constante.

\|w_{1}\| = 1

Trouvez $ w_ {1} $ qui maximise la quantité d'informations $ V [z_ {1}] $ sous une certaine règle selon laquelle l'ajout de tous les poids donne $ 1 $. En d'autres termes, si vous découvrez dans quelle direction et dans quel rapport la quantité d'informations est maximisée, cela s'appelle le ** premier composant principal **. Cela se répète.

** Calcul de la deuxième composante principale ** Cependant, je sais déjà que la quantité maximale d'informations est $ w_ {1} $, donc j'aimerais trouver un autre type de méthode de pondération de $ w_ {1} $ qui maximise la quantité d'informations. .. Par conséquent, je veux que $ w_ {2} $ soit tourné dans une direction différente de $ w_ {1} $, donc j'ajouterai une condition.

\|w_{2}\| = 1, w_{2}\perp{w_{1}}

La condition est que $ w_ {2} $ soit orthogonal à $ w_ {1} $. Maintenant $ w_ {2} $ a un autre type d'information que $ w_ {1} $. Ensuite, quand il est $ w_ {3} $, faites une condition qu'il soit orthogonal à la fois à $ w_ {1} $ et $ w_ {2} $, et quand il est $ w_ {4} $, faites une condition qui ... En répétant tout en ajoutant, ce qui suit peut être obtenu.

  \left(
    \begin{array}{ccc}
      z_{1} \\
      \vdots \\
      z_{5} 
    \end{array}
  \right)
  = \left(
    \begin{array}{cccc}
      w_{11} & \ldots & w_{15} \\
      \vdots & \ddots & \vdots \\
      w_{51} & \ldots & w_{55}
    \end{array}
  \right)x
z=Wx

** L'analyse principale ** utilise ces formules pour compresser des dizaines de milliers ou des centaines de milliers de dimensions de données en centaines de dimensions afin que l'information d'origine reste autant que possible. En d'autres termes, la kème composante principale est la direction dans laquelle la variation des données est la kème la plus grande. En passant, les poids $ w_ {1}, w_ {2}, w_ {3}, w_ {4}, w_ {5} $ de chaque variable sont également appelés ** charge du composant principal **. Donc, enfin, en utilisant scikit-learn de la bibliothèque de machine learning, ce ** composant principal $ z_ {1} $ ** et ** composant principal charge $ w_ {1}, w_ {2}, w_ { Trouvez 3}, w_ {4}, w_ {5} $ **.

** ⑷ Effectuer une analyse en composantes principales **

#Créer une instance du modèle
pca = PCA()

#Créer un modèle basé sur les données
pca.fit(df)

#Appliquer les données au modèle
values = pca.transform(df)

L'analyse en composantes principales est appelée analyse en composantes principales en anglais, elle est donc abrégée en PCA. Tout d'abord, ➀ créez une instance qui sert de modèle pour le modèle, et ➁ transmettez les données à cette instance avec la fonction fit pour générer le modèle. ➂ Il y a 3 étapes: si vous appliquez à nouveau les données à ce modèle, le score pour chaque composante principale sera calculé.

002_0301_004.PNG

C'est difficile à voir, alors je vais le convertir en un bloc de données.

df_pca = pd.DataFrame(data = values,
                      columns = ["Composant principal{}".format(x+1) for x in range(len(df.columns))])

002_0301_005.PNG

De la 1ère composante principale à la 5e composante principale, chaque élève a 5 points. Ce score est appelé le ** score de la composante principale **. Étant donné que l'original comprend 5 sujets et 5 dimensions, le composant principal est également le plus 5 dimensions.

** ⑸ Calculer le taux de cotisation **

#Calculer le taux de cotisation du modèle pca
ev_ratio = pca.explained_variance_ratio_

#Convertir la contribution en bloc de données
df_evr = pd.DataFrame(data = ev_ratio, 
                      columns = ['Taux de cotisation'],
                      index = ["Composant principal{}".format(x+1) for x in range(len(df.columns))])

002_0301_006.PNG

Le taux de cotisation est un indice montrant le pouvoir explicatif de chaque composante principale. La valeur de 0 $ ≤ c ≤ 1 $ est prise parce que le rapport de la quantité d'informations que les données ont à l'origine = la distribution des principaux composants = le pourcentage de la quantité d'informations. Quoi qu'il en soit, le premier élément principal a la plus grande quantité d'informations, l'autre plus grande quantité d'informations est recherchée, et le deuxième plus grand est ..., donc le taux de cotisation est le plus élevé dans le premier élément principal et diminue dans l'ordre. La somme de toutes les contributions est de 1 $. Vous pouvez le voir en créant un graphique appelé ** Taux de contribution cumulé **.

#Accumuler le taux de cotisation
cc_ratio = np.cumsum(ev_ratio)

#Concaténer 0
cc_ratio = np.hstack([0, cc_ratio])

#Dessinez un graphique
plt.plot(cc_ratio, "-o")
plt.xlabel("Composant principal")
plt.ylabel("Taux de cotisation cumulé")
plt.grid()
plt.show()

Puisque le taux de cotisation du premier élément principal à lui seul dépasse 90%, j'estime que le deuxième élément principal et au-delà ne sont pas nécessaires, mais ce n'est pas toujours le cas. 002_0301_007.PNG

** ⑹ Interpréter le composant principal **

#Calculer la dispersion des composants principaux
eigen_value = pca.explained_variance_
pd.DataFrame(eigen_value, 
             columns = ["Distribué"], 
             index = ["Composant principal{}".format(x+1) for x in range(len(df.columns))])

002_0301_008.PNG

Vous pouvez voir que l'ampleur de la dispersion reflète le taux de cotisation. La dispersion du premier composant principal est extrêmement plus grande que celle des autres composants principaux, et il contient une grande quantité d'informations.

#Calculer la charge du composant principal
eigen_vector = pca.components_
#Convertir en bloc de données
pd.DataFrame(eigen_vector,
             columns = [df.columns],
             index = ["Composant principal{}".format(x+1) for x in range(len(df.columns))])

002_0301_009.PNG

Que signifie le composant principal? ** 1er composant principal **: Les 5 sujets sont marqués d'un signe moins C'est comme inverser le total des points, et le fait est que les données sont le plus dispersées selon qu'elles sont toutes élevées ou toutes faibles. Puisqu'il y a un moins, plus le score total est élevé, plus le score du composant principal est petit. Parmi eux, le coefficient anglais est particulièrement élevé, c'est-à-dire que même si le score anglais est légèrement différent, le score de la composante principale sera significativement différent. ** Deuxième composante principale **: anglais / japonais est négatif et grand, et mathématiques / sciences est positif et grand. Plus le score en mathématiques / sciences est élevé, plus le score de la composante principale est élevé et plus le score de l'anglais / japonais est bas, plus le score de la composante principale est élevé. Pour ainsi dire, les données sont dispersées dans le sens de la science ou des arts libéraux, et plus il y a de gens qui sont bons dans les matières scientifiques et pas bons dans les matières des arts libéraux, plus le score de la composante principale est élevé. ** Troisième composante principale **: La langue nationale est exceptionnelle et négative. En d'autres termes, les données sont dispersées dans le sens de savoir si vous parlez ou non la langue nationale, et plus le score de la langue nationale est élevé, plus le score de la composante principale est petit.

En résumé, le score total est-il élevé ou faible dans la direction dans laquelle les données sont le plus dispersées (** 1ère composante principale )? La prochaine ( 2e composante principale ) est plus proche du système littéraire ou du système scientifique, et la direction avec la prochaine plus grande variation ( 3e composante principale **) est de savoir si vous pouvez ou non parler japonais. Il semble que les données soient dispersées. Cette analyse montre que si vous utilisez ces trois composants principaux, vous pouvez obtenir les informations les plus riches de la compression tridimensionnelle.

** ⑺ Comparez le score total avec le score de la première composante principale **

À la fin, en quoi le classement des capacités académiques de l'étudiant diffère-t-il entre le score total, qui est simplement la somme des scores des cinq matières, et le score de la première composante principale, qui représente 90% de la quantité d'informations pour les cinq matières? J'aimerais confirmer.

##Créer un classement par score total
#Calculer le total des points
sum = np.sum(np.array(df), axis=1)
#Convertir en un tableau bidimensionnel 20x1
sum.reshape(len(sum), 1)
#Convertir en bloc de données
df_sum = pd.DataFrame(sum,
                      columns = ['Points totaux'],
                      index = ["ID{}".format(x+1) for x in range(len(df.index))])
#Tri décroissant
df_sum_rank = df_sum.sort_values('Points totaux', ascending=False)

##Créer un classement par score du premier composant principal
#Extraire le composant 1
df_PC1 = df_pca["Composant principal 1"]
#Convertir en tableau
pc1 = np.array(df_PC1)
#Convertir en un tableau bidimensionnel 20x1
pc1 = pc1.reshape(len(pc1), 1)
#Donnez une pièce d'identité
df_pca = pd.DataFrame(pc1,
                      columns = ['Composant principal 1'],
                      index = ["ID{}".format(x+1) for x in range(len(df.index))])
#Tri croissant
df_pca_rank = df_pca.sort_values('Composant principal 1')

002_0301_012.PNG

La ** 1ère composante principale ** est de savoir si le score total est élevé ou faible, de sorte que les classements du groupe supérieur et du groupe inférieur sont les mêmes. En attendant, la classe moyenne est un peu différente, mais j'ai trouvé que le sentiment du score total, «Je pense que les personnes ayant des capacités académiques peuvent faire n'importe quelle matière», est généralement approprié.


Maintenant, dans la section suivante, je voudrais démêler davantage le mécanisme de calcul de l'analyse en composantes principales sans utiliser scicit-learn.

Recommended Posts

2. Analyse multivariée expliquée dans Python 3-1. Analyse en composantes principales (scikit-learn)
2. Analyse multivariée décrite dans Python 3-2. Analyse en composantes principales (algorithme)
2. Analyse multivariée définie dans Python 1-1. Analyse de régression simple (scikit-learn)
2. Analyse multivariée décrite dans Python 7-1. Arbre de décision (scikit-learn)
2. Analyse multivariée décrite dans Python 2-1. Analyse de régression multiple (scikit-learn)
2. Analyse multivariée expliquée dans Python 8-1. Méthode de voisinage k (scikit-learn)
2. Analyse multivariée décrite dans Python 6-1. Régression de crête / Régression de lasso (scikit-learn) [régression multiple vs régression de crête]
2. Analyse multivariée décrite dans Python 6-3. Régression Ridge / Régression Lasso (scikit-learn) [Fonctionnement de la régularisation]
2. Analyse multivariée énoncée dans Python 8-3. Méthode de voisinage K [vérification d'intersection]
2. Analyse multivariée expliquée dans Python 7-2. Arbre de décision [différence de critères de division]
2. Analyse multivariée détaillée dans Python 2-3. Analyse de régression multiple [taux d’infection au COVID-19]
2. Analyse multivariée expliquée dans Python 8-2. Méthode de voisinage k [méthode de pondération] [modèle de retour]
Analyse en composants principaux (PCA) et analyse en composants indépendants (ICA) avec python
Python: apprentissage non supervisé: analyse principale
Défis d'apprentissage automatique de Coursera en Python: ex7-2 (analyse principale)
Visualisez la matrice de corrélation par l'analyse des composants principaux avec Python
Ceci et cela de l'analyse en composantes principales
PRML Chapitre 12 Mise en œuvre de l'analyse principale bayésienne Python
Analyse d'association en Python
Analyse en composantes principales (Analyse en composantes principales: ACP)
Analyse de régression avec Python
Défiez l'analyse des composants principaux des données textuelles avec Python
Analyse des composants principaux à l'aide de python de nim avec nimpy
Analyse des contraintes symétriques axiales avec Python
Apprendre sans enseignant 3 Analyse des principales composantes
Analyse de régression simple avec Python
Analyse des ondes cérébrales avec Python: tutoriel Python MNE
Première analyse de régression simple en Python
[Python] PCA scratch dans l'exemple de "Introduction à la méthode d'analyse multivariée"
Reconnaissance faciale à l'aide de l'analyse des composants principaux
Analyse des composants principaux avec Spark ML
Scikit-learn ne peut pas être installé en Python
Analyse du squelette planaire dans Python (2) Hotfix
Régression linéaire en Python (statmodels, scikit-learn, PyMC3)
Analyse résiduelle en Python (Supplément: règles Cochrane)
Commençons l'analyse multivariée et l'analyse des composants principaux avec Pokemon! Coopération entre R et Tableau
Analyse des composants principaux avec python (version Scikit-learn, version pandas et numpy) ([High school information department information II] didacticiel pour la formation des enseignants)
Analyse des composants principaux avec Livedoor News Corpus --Préparation--
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
Analyse de survie apprise avec Python 2 - Estimation Kaplan-Meier
Effectuer une analyse d'entité à l'aide de spaCy / GiNZA en Python
Analyse de données en Python: une note sur line_profiler
[Construction de l'environnement] Analyse des dépendances à l'aide de CaboCha avec Python 2.7
Environnement enregistré pour l'analyse des données avec Python
Sortie d'une courte chaîne de caractères de type URL en Python