Défiez l'analyse des composants principaux des données textuelles avec Python

À propos de cet article

Dans Publié la dernière fois, j'ai suivi les statistiques basées sur les mangas [Analyse factorielle] Analyse des composants principaux du chapitre 4 avec Python.

Cette fois, je vais contester l'analyse des composants principaux des données texte avec Python.

référence

but de fond

À l'origine, c'est ce livre d'analyse de texte de M. Akitetsu Kim qui m'a donné envie d'en savoir plus sur l'analyse en composantes principales. Lorsque j'ai voulu regrouper des données textuelles, j'ai trouvé que l'analyse en composantes principales de ce livre était intéressante, et c'était le déclencheur pour étudier l'analyse en composantes principales.

À propos du contenu de l'analyse

La cible de l'analyse est l'écriture de données écrites sur trois thèmes (amis, voitures, cuisine japonaise). Il y a 33 données au total pour 3 thèmes x 11 personnes.

Les données peuvent être obtenues à partir du téléchargement du code source sur la page d'assistance de ici.

Les données ne sont pas du texte, mais déjà au format Bag of Words (BoW). Par conséquent, le traitement tel que l'analyse morphologique et la conversion BoW n'est pas inclus cette fois.

Code (analyse des composants principaux)

Le code est détourné de Article précédent.

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'Noto Sans CJK JP']

#Lecture des données d'écriture * Veuillez modifier le chemin du fichier en fonction de votre environnement.
df = pd.read_csv('./sakubun3f.csv',encoding='cp932')
data = df.values
# "Words"Colonne,"OTHERS"Exclure les colonnes
d = data[:,1:-1].astype(np.int64)

#Standardisation des données * L'écart type est calculé par l'écart type non biaisé
X = (d - d.mean(axis=0)) / d.std(ddof=1,axis=0)

#Trouvez la matrice de corrélation
XX = np.round(np.dot(X.T,X) / (len(X) - 1), 2)

#Trouver la valeur propre et le vecteur de la valeur propre de la matrice de corrélation
w, V = np.linalg.eig(XX)

print('-------valeur propre-------')
print(np.round(w,3))
print('')

#Trouvez le premier composant principal
z1 = np.dot(X,V[:,0])

#Trouvez le deuxième composant principal
z2 = np.dot(X,V[:,1])

##############################################################
#Tracez un graphique du score du premier composant principal et du score du second composant principal obtenu jusqu'à présent
##############################################################

#Générer des objets pour les graphiques
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)

#Insérer des lignes de quadrillage
ax.grid()

#Limite des données à dessiner
lim = [-6.0, 6.0]
ax.set_xlim(lim)
ax.set_ylim(lim)

#Amenez les axes gauche et inférieur au milieu
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
#Effacer les axes droit et supérieur
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

#Ajuster l'espacement des échelles des axes
ticks = np.arange(-6.0, 6.0, 2.0)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

#Ajouter une étiquette d'axe, ajuster la position
ax.set_xlabel('Z1', fontsize=16)
ax.set_ylabel('Z2', fontsize=16, rotation=0)
ax.xaxis.set_label_coords(1.02, 0.49)
ax.yaxis.set_label_coords(0.5, 1.02)

#Graphique de données
for (i,j,k) in zip(z1,z2,data[:,0]):
    ax.plot(i,j,'o')
    ax.annotate(k, xy=(i, j),fontsize=16)

#dessin
plt.show()

Résultat d'exécution (analyse des composants principaux)

-------valeur propre-------
[ 5.589e+00  4.433e+00  2.739e+00  2.425e+00  2.194e+00  1.950e+00
  1.672e+00  1.411e+00  1.227e+00  1.069e+00  9.590e-01  9.240e-01
  7.490e-01  6.860e-01  5.820e-01  5.150e-01  4.330e-01  3.840e-01
  2.970e-01  2.200e-01  1.620e-01  1.080e-01  8.800e-02  7.800e-02
  4.600e-02  3.500e-02 -7.000e-03 -2.000e-03  4.000e-03  1.700e-02
  1.300e-02]

Diagramme de dispersion (analyse des composants principaux)

テキスト主成分分析1.png

Prise en compte du résultat

Selon l'explication du livre, le texte avec 9 à la fin de l'étiquette est «nourriture japonaise», 2 à la fin est «ami» et 5 à la fin est «voiture».

La carte de dispersion est sortie dans la direction opposée au livre, mais les trois thèmes sont soigneusement classés: «cuisine japonaise» dans la direction supérieure gauche, «amis» dans la direction supérieure droite et «voiture» dans la direction inférieure droite. .. (Le chiffre opposé à celui du livre peut être dû à l'arbitraire d'un multiple constant de la valeur propre.)

Code (chargement de facteur)

#Coordonnées avec le vecteur propre correspondant à la plus grande valeur propre sur l'axe horizontal et le vecteur propre correspondant à la deuxième plus grande valeur propre sur l'axe vertical.
V_ = np.array([(V[:,0]),V[:,1]]).T
V_ = np.round(V_,2)

#Données pour le dessin graphique
data_name=df.columns[1:-1]
z1 = V_[:,0]
z2 = V_[:,1]

#Générer des objets pour les graphiques
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)

#Insérer des lignes de quadrillage
ax.grid()

#Limite des données à dessiner
lim = [-0.4, 0.4]
ax.set_xlim(lim)
ax.set_ylim(lim)

#Amenez les axes gauche et inférieur au milieu
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
#Effacer les axes droit et supérieur
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

#Ajuster l'espacement des échelles des axes
ticks = np.arange(-0.4, 0.4, 0.2)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

#Ajouter une étiquette d'axe, ajuster la position
ax.set_xlabel('Z1', fontsize=16)
ax.set_ylabel('Z2', fontsize=16, rotation=0)
ax.xaxis.set_label_coords(1.02, 0.49)
ax.yaxis.set_label_coords(0.5, 1.02)

#Graphique de données
for (i,j,k) in zip(z1,z2,data_name):
    ax.plot(i,j,'o')
    ax.annotate(k, xy=(i, j),fontsize=14)
    
#dessin
plt.show()

Diagramme de dispersion (chargement factoriel)

テキスト主成分分析2.png

Prise en compte du résultat

Le coefficient de chargement est également opposé, mais le résultat est presque le même que celui du livre.

Mots susceptibles d'être liés au thème de la "cuisine japonaise" tels que "japonais" et "riz" dans la direction supérieure gauche, et mots susceptibles d'être liés au thème des "amis" tels que "meilleur ami" et "ami" dans le sens supérieur droit. Cependant, en bas à droite, il y a des mots qui semblent être liés au thème de «voiture» comme «trafic» et «accident».

Si vous le comparez avec le diagramme de dispersion des composants principaux, vous pouvez voir que les directions des mots susceptibles d'être liés à chaque thème sont les mêmes.

Impressions

Lorsque j'ai détourné le code de l'article précédent, j'ai pu analyser les principaux composants des données textuelles plus facilement que prévu.

Cette fois, les données étaient déjà prétraitées proprement, donc les résultats étaient plutôt bons. La prochaine fois, je voudrais vérifier si elle peut être classée proprement dans les articles de presse.

fin

Recommended Posts

Défiez l'analyse des composants principaux des données textuelles avec Python
Analyse de données avec python 2
Analyse de données avec Python
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
Analyse des composants principaux à l'aide de python de nim avec nimpy
Text mining avec Python ① Analyse morphologique
Analyse des composants principaux avec Spark ML
Analyse de données à partir de python (visualisation de données 1)
Python: apprentissage non supervisé: analyse principale
Analyse de données à partir de python (visualisation de données 2)
Ceci et cela de l'analyse en composantes principales
Analyse des composants principaux avec le corpus d'actualités Livedoor - Pratique--
Analyse de données python
Exercice pratique d'analyse de données avec Python ~ 2016 New Coder Survey Edition ~
Introduction aux bases de Python de l'apprentissage automatique (apprentissage non supervisé / analyse principale)
Recommandation d'Altair! Visualisation des données avec Python
Analyse de données à partir de python (pré-traitement des données-apprentissage automatique)
J'ai 0 ans d'expérience en programmation et je défie le traitement des données avec python
Analyse des composants principaux avec Livedoor News Corpus --Préparation--
Compression dimensionnelle par auto-encodeur et analyse des composants principaux
PRML Chapitre 12 Mise en œuvre de l'analyse principale bayésienne Python
Analyse statique du code Python avec GitLab CI
Environnement enregistré pour l'analyse des données avec Python
Analyse vocale par python
Reconnaître le contour et la direction d'un objet façonné avec OpenCV3 et Python3 (analyse des composants principaux: PCA, vecteur propre)
Modèle d'analyse de données Python
Analyse en composantes principales (Analyse en composantes principales: ACP)
Analyse vocale par python
Analyse des données de pratique Python Résumé de l'apprentissage que j'ai atteint environ 10 avec 100 coups
[Python] Comparaison de la théorie de l'analyse des composants principaux et de l'implémentation par Python (PCA, Kernel PCA, 2DPCA)
2. Analyse multivariée décrite dans Python 3-2. Analyse en composantes principales (algorithme)
Filtrage coordonné avec analyse des composants principaux et clustering K-means
[Python] [Word] [python-docx] Analyse simple des données de diff en utilisant python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Note de lecture: Introduction à l'analyse de données avec Python
Compréhension mathématique de l'analyse en composantes principales depuis le début
Construction d'un environnement d'analyse de données avec Python (notebook IPython + Pandas)
Calculer le coefficient de régression d'une analyse de régression simple avec python
Liste du code Python utilisé dans l'analyse de Big Data
Analyse du squelette de plan avec Python (4) Gestion du déplacement forcé
Analyse en composants principaux (PCA) et analyse en composants indépendants (ICA) avec python
[Bases de la science des données] Collecte de données depuis RSS avec python
2. Analyse multivariée expliquée dans Python 3-1. Analyse en composantes principales (scikit-learn)
Utilisez python installé par Pyenv avec Sublime REPL de Sublime Text 3
Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 4: Extraction de fonctionnalités de données à l'aide de T-SQL
Exemple de données créées avec python
Mon conteneur d'analyse de données python
[Python] Analyse morphologique avec MeCab
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Python pour l'analyse des données Chapitre 4
Python: texte japonais: analyse morphologique
Obtenez des données Youtube avec python
Analyse des émotions par Python (word2vec)
Analyse statique des programmes Python
[Python] Notes sur l'analyse des données
Apprendre sans enseignant 3 Analyse des principales composantes