[PYTHON] Apprenez les données comptables et essayez de prédire les comptes à partir du contenu de la description lors de la saisie des journaux

introduction

Lorsqu'il est temps de déposer une déclaration finale, si vous reconfirmez les données comptables, vous trouverez des erreurs dans le compte, j'ai donc pensé qu'il serait bon que vous puissiez apprendre les données comptables par apprentissage automatique et prédire le compte.

Lecture des données comptables

Exportez les données au format CSV depuis le logiciel de comptabilité et utilisez-le. En passant, ces données utilisent le logiciel "JDL IBEX Treasurer" comme exemple.

http://www.jdl.co.jp/co/soft/ibex-ab/

Chargez les données avec le code suivant.

python


import pandas as pd

filename = "Livre de comptes JDL-xxxx-xxxx-Journal.csv"
df = pd.read_csv(filename, encoding="Shift-JIS", skiprows=3)

Affinez les données à utiliser à partir des données lues. Ici, nous utilisons le code et le nom de la description et du débit.

python


columns = ["La description", "Objet du débit", "Objet du débit正式名称"]
df_counts = df[columns].dropna()

Analyse morphologique

À propos des données de description Par analyse morphologique, les données de caractères sont vectorisées sous forme de valeur numérique directionnelle.

Une bibliothèque appelée Janome est utilisée pour l'analyse morphologique.

http://mocobeta.github.io/janome/

S'il n'est pas installé, vous devez l'installer avec la commande suivante.

python


$ pip install janome

Le code suivant convertit les données de description en données de jeton.

python


from janome.tokenizer import Tokenizer

t = Tokenizer()

notes = []
for ix in df_counts.index:
    note = df_counts.ix[ix,"La description"]
    tokens = t.tokenize(note.replace(' ',' '))
    words = ""
    for token in tokens:
        words += " " + token.surface
    notes.append(words.replace(' \u3000', ''))

En conséquence, la conversion suivante est effectuée et elle devient une chaîne de caractères avec un espace demi-largeur pour chaque mot.

Résumé des données originales "Frais de souvenir BLUE SKY Haneda" Données après modification "Frais de souvenir BLUE SKY Haneda"

Cette chaîne de caractères est vectorisée avec le code suivant et utilisée comme données d'entrée.

python


from sklearn.feature_extraction.text import TfidfVectorizer

vect = TfidfVectorizer()
vect.fit(notes)

X = vect.transform(notes)

Il utilise également le code de compte comme données de l'enseignant.

python


y = df_counts.Objet du débit.as_matrix().astype("int").flatten()

Apprentissage automatique

Les données converties en valeurs numériques sont divisées en données d'entraînement et données de vérification par validation croisée.

python


from sklearn import cross_validation

test_size = 0.2
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=test_size)

Apprenez à utiliser les données divisées. Ici, nous utilisons LinearSVC comme modèle.

python


from sklearn.svm import LinearSVC

clf = LinearSVC(C=120.0, random_state=42)
clf.fit(X_train, y_train)

clf.score(X_test, y_test)

Le score était de "0,89932885906040272".

Prévoir

À partir des résultats appris, entrez les données de test comme indiqué ci-dessous et vérifiez le type de compte attendu.

python


tests = [
    "Frais d'utilisation de l'autoroute",
    "Coût des pièces PC",
    "Frais de timbre"
]

notes = []
for note in tests:
    tokens = t.tokenize(note)
    words = ""
    for token in tokens:
        words += " " + token.surface
    notes.append(words)

X = vect.transform(notes)

result = clf.predict(X)

df_rs = df_counts[["Nom officiel de l'objet du débit", "Objet du débit"]]
df_rs.index = df_counts["Objet du débit"].astype("int")
df_rs = df_rs[~df_rs.index.duplicated()]["Nom officiel de l'objet du débit"]

for i in range(len(tests)):
    print(tests[i], "\t[",df_rs.ix[result[i]], "]")

Le résultat de sortie est ...

python


Frais d'utilisation de l'autoroute[Frais de déplacement transport]
Coût des pièces PC[frais de fournitures]
Frais de timbre[Frais de communication]

Ça fait du bien (^ - ^)

Au fait, le bordereau de transfert a besoin d'un peu plus d'ingéniosité.

Je pensais que ce serait mieux si je pouvais également utiliser des informations sur les mois, les jours et les états financiers, mais je ne savais pas comment gérer les données d'apprentissage, alors je vais l'examiner plus tard.

Eh bien, que dois-je faire ensuite?

(Bonus) Séparation de l'apprentissage et de la prédiction

Si vous essayez d'utiliser le programme ci-dessus tel quel, il ne sera pas efficace car les données réelles seront lues, apprises, puis prédites à chaque exécution. Par conséquent, enregistrez les données d'apprentissage, et dans la partie à prédire, lisez les données entraînées et modifiez-les pour prédire.

Sauvegarde des résultats d'apprentissage

Vous pouvez enregistrer les données d'entraînement en ajoutant le code suivant à la fin du programme ci-dessus.

python


from sklearn.externals import joblib

joblib.dump(vect, 'data/vect.pkl')
joblib.dump(clf, 'data/clf.pkl')
df_rs.to_csv("data/code.csv")

Lecture des résultats d'apprentissage

Dans le nouveau programme, chargez les données d'entraînement comme suit.

python


import pandas as pd

filename = "data/code.csv"
df = pd.read_csv(filename, header=None)
df.index = df.pop(0)
df_rs = df.pop(1)

from sklearn.externals import joblib

clf = joblib.load('data/clf.pkl')
vect = joblib.load('data/vect.pkl')

Prévoir

Après avoir lu les données d'entraînement, continuez à exécuter la prédiction.

python


from janome.tokenizer import Tokenizer

t = Tokenizer()
tests = [
    "Frais d'utilisation de l'autoroute",
    "Coût des pièces PC",
    "Frais de timbre",
]

notes = []
for note in tests:
    tokens = t.tokenize(note)
    words = ""
    for token in tokens:
        words += " " + token.surface
    notes.append(words)

X = vect.transform(notes)

result = clf.predict(X)

for i in range(len(tests)):
    print(tests[i], "\t[",df_rs.loc[result[i]], "]")

Le résultat de l'exécution est ...

python


Frais d'utilisation de l'autoroute[Frais de déplacement transport]
Coût des pièces PC[frais de fournitures]
Frais de timbre[Frais de communication]

l'a fait!

Recommended Posts

Apprenez les données comptables et essayez de prédire les comptes à partir du contenu de la description lors de la saisie des journaux
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
Donnez les données de séquence de points de latitude et de longitude et essayez d'identifier la route à partir des données d'OpenStreetMap
[Introduction au graphique logarithmique] Prédire l'heure de fin de chaque pays à partir du graphique logarithmique des données sur le nombre d'infections ♬
L'histoire de la copie de données de S3 vers TeamDrive de Google
Essayez d'extraire les caractéristiques des données de capteur avec CNN
[Note] Essayons de prédire la quantité d'électricité utilisée! (Partie 1)
Comment éviter la duplication des données lors de la saisie de Python vers SQLite.
Apprenez les méthodes M-H et HMC en lisant les statistiques bayésiennes à partir des bases
Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage
Essayez de prédire la valeur de la jauge de niveau d'eau par apprentissage automatique en utilisant les données ouvertes de Data City Sabae
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Essayez d'obtenir l'état de la surface de la route en utilisant de grandes données de gestion de la surface de la route
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Même dans le processus de conversion de CSV en délimiteur d'espace, essayez sérieusement de séparer les entrées / sorties et les règles
Script pour changer la description de fasta
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
Jusqu'à ce que vous essayiez de laisser DNN apprendre la vérité de l'image en utilisant Colab
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
[Vérification] LevelDB prend-il du temps pour enregistrer les données lorsque la quantité de données augmente? ??
Essayez d'afficher les données ferroviaires des informations numériques des terres nationales en 3D