In Letztes Mal veröffentlicht folgte ich der Manga-basierten Statistik [Faktoranalyse] Kapitel 4 Hauptkomponentenanalyse mit Python.
Dieses Mal werde ich die Hauptkomponentenanalyse von Textdaten mit Python herausfordern.
Ursprünglich war es dieses Textanalysebuch von Herrn Akitetsu Kim, das mich dazu brachte, etwas über die Hauptkomponentenanalyse zu wissen. Als ich Textdaten gruppieren wollte, fand ich die Hauptkomponentenanalyse dieses Buches interessant, und dies war der Auslöser für das Studium der Hauptkomponentenanalyse.
Das Analyseziel besteht darin, Daten zu drei Themen zu schreiben (Freunde, Autos, japanisches Essen). Insgesamt gibt es 33 Daten für 3 Themen x 11 Personen.
Die Daten können vom Quellcode-Download auf der Support-Seite von [hier] abgerufen werden (https://www.kyoritsu-pub.co.jp/bookdetail/9784320112612).
Die Daten sind kein Text, sondern bereits im BoW-Format (Bag of Words). Daher sind Verarbeitungen wie morphologische Analysen und BoW-Umrechnungen diesmal nicht enthalten.
Der Code wird von Vorheriger Artikel umgeleitet.
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']
#Lesen von Schreibdaten * Bitte ändern Sie den Dateipfad entsprechend Ihrer Umgebung.
df = pd.read_csv('./sakubun3f.csv',encoding='cp932')
data = df.values
# "Words"Säule,"OTHERS"Spalten ausschließen
d = data[:,1:-1].astype(np.int64)
#Datenstandardisierung * Die Standardabweichung wird durch unverzerrte Standardabweichung berechnet
X = (d - d.mean(axis=0)) / d.std(ddof=1,axis=0)
#Finden Sie die Korrelationsmatrix
XX = np.round(np.dot(X.T,X) / (len(X) - 1), 2)
#Finden Sie den Eigenwert und den Eigenwertvektor der Korrelationsmatrix
w, V = np.linalg.eig(XX)
print('-------Eigenwert-------')
print(np.round(w,3))
print('')
#Finden Sie die erste Hauptkomponente
z1 = np.dot(X,V[:,0])
#Finden Sie die zweite Hauptkomponente
z2 = np.dot(X,V[:,1])
##############################################################
#Zeichnen Sie ein Diagramm der ersten Hauptkomponentenbewertung und der zweiten Hauptkomponentenbewertung, die bisher erhalten wurden
##############################################################
#Objekte für Diagramme generieren
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
#Gitterlinien einfügen
ax.grid()
#Grenze der zu zeichnenden Daten
lim = [-6.0, 6.0]
ax.set_xlim(lim)
ax.set_ylim(lim)
#Bringen Sie die linke und untere Achse in die Mitte
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
#Löschen Sie die rechte und obere Achse
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
#Passen Sie den Abstand der Achsenskalen an
ticks = np.arange(-6.0, 6.0, 2.0)
ax.set_xticks(ticks)
ax.set_yticks(ticks)
#Achsenbeschriftung hinzufügen, Position anpassen
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)
#Datenplot
for (i,j,k) in zip(z1,z2,data[:,0]):
ax.plot(i,j,'o')
ax.annotate(k, xy=(i, j),fontsize=16)
#Zeichnung
plt.show()
-------Eigenwert-------
[ 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]
Nach der Erklärung des Buches lautet der Text mit 9 am Ende des Etiketts "japanisches Essen", 2 am Ende "Freund" und 5 am Ende "Auto".
Die Streukarte wird in der entgegengesetzten Richtung zum Buch ausgegeben, aber die drei Themen sind ordentlich klassifiziert: "Japanisches Essen" in der oberen linken Richtung, "Freunde" in der oberen rechten Richtung und "Auto" in der unteren rechten Richtung. .. (Die Zahl, die der des Buches entgegengesetzt ist, kann auf die Beliebigkeit eines konstanten Vielfachen des Eigenwerts zurückzuführen sein.)
#Koordinaten mit dem Eigenvektor, der dem größten Eigenwert auf der horizontalen Achse entspricht, und dem Eigenvektor, der dem vorletzten Eigenwert auf der vertikalen Achse entspricht.
V_ = np.array([(V[:,0]),V[:,1]]).T
V_ = np.round(V_,2)
#Daten für die Grafikzeichnung
data_name=df.columns[1:-1]
z1 = V_[:,0]
z2 = V_[:,1]
#Objekte für Diagramme generieren
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
#Gitterlinien einfügen
ax.grid()
#Grenze der zu zeichnenden Daten
lim = [-0.4, 0.4]
ax.set_xlim(lim)
ax.set_ylim(lim)
#Bringen Sie die linke und untere Achse in die Mitte
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
#Löschen Sie die rechte und obere Achse
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
#Passen Sie den Abstand der Achsenskalen an
ticks = np.arange(-0.4, 0.4, 0.2)
ax.set_xticks(ticks)
ax.set_yticks(ticks)
#Achsenbeschriftung hinzufügen, Position anpassen
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)
#Datenplot
for (i,j,k) in zip(z1,z2,data_name):
ax.plot(i,j,'o')
ax.annotate(k, xy=(i, j),fontsize=14)
#Zeichnung
plt.show()
Die Faktorbelastung ist ebenfalls entgegengesetzt, aber das Ergebnis ist fast das gleiche wie im Buch.
Wörter, die wahrscheinlich mit dem Thema "japanisches Essen" wie "Japanisch" und "Reis" in der oberen linken Richtung zusammenhängen, und Wörter, die wahrscheinlich mit dem Thema "Freunde" wie "bester Freund" und "Freund" in der oberen rechten Richtung zusammenhängen. In der unteren rechten Richtung gibt es jedoch Wörter, die mit dem Thema "Auto" in Zusammenhang zu stehen scheinen, wie "Verkehr" und "Unfall".
Wenn Sie es mit dem Streudiagramm der Hauptkomponenten vergleichen, können Sie sehen, dass die Richtungen der Wörter, die wahrscheinlich mit jedem Thema zusammenhängen, gleich sind.
Als ich den Code vom vorherigen Artikel umleitete, konnte ich die Hauptkomponenten von Textdaten einfacher analysieren als erwartet.
Dieses Mal wurden die Daten bereits sauber vorverarbeitet, sodass die Ergebnisse ziemlich gut waren. Das nächste Mal möchte ich prüfen, ob es in Nachrichtenartikeln ordentlich klassifiziert werden kann.
Ende
Recommended Posts