上場会社で経理やってます。
子会社の決算をチェックする仕事があるので、Pythonを使って指摘事項をいっぱい見つけることにチャレンジ中です。
試行錯誤を書いていきます。
エクセルとPython
プログラム言語は流行っているみたいなのでとりあえずPython(+Jupyter Notebook)を選びました。エクセルとの使い分けを考えてみました。
自分の中では、
エクセル
・簡単なことであればPythonより簡単にできる
・エクセルは引継ぎしてもよい
Python
・複雑なことであればエクセルより簡単にできる
・Pythonは引継ぎしてはいけない
システム部以外のふつうの職員が「Pythonで業務を行う」のはウチの会社では無茶です
という関係になっています。
後は、用途に合わせて決めています。
必須の作業
SharePoint+エクセル
引継ぎを考えると、複雑なことでもPythonは使えません。
必須の作業ではない
管理職としては、決算(月次・四半期・通期)で手を動かすことはありません。基本、チェックだけです。
そのチェックも、どうチェックするか(チェックをサボることも含め)、ウチの会社では管理職にお任せです。
部下が優秀なら何もしなくても何も問題はありません。
ここで、仮に「鋭いチェックをする管理職」という高い評価を得たとしても、異動するときに、「あの鋭いチェックを後任の管理職もできるようにちゃんと引き継げ!」といわれることはありません。「レベルの高いチェックは当然属人的なもの」という共通認識があります。
・必須の作業ではないので引継ぎ不要
・手順は複雑になるのでPythonの方が簡単にできる
ということでPythonでやります!
仕訳データ
経理でチェックするものといえば、財務諸表、注記の開示資料があります。
これらの出来上がりの資料は、人が読んでチェックした方がいいです。
ここでは、これらの開示資料より未完成な資料、決算上の加工がそれほどなく、「データ」の集合に近い仕訳データをPythonでチェックします。
経理データは様々な形に加工されます。
最終的には、各社、多種多様な分析ツール(エクセル1本のところも多い?)で料理されていることでしょう。
会社で使う、データの中間ツール、最終ツールは結構変わります。
こういったツールに依存した部分があると不安定になり、仕組みの賞味期限が短くなります。
なるべく、普遍的な、幅広く使える仕組みを作りたいと考えています。
ということで、会計システムから出力する仕訳データから分析することにします。
なるべく出発点に近いデータを、基本的な項目で分析する仕組みであれば、会計システム等入れ替えても、他の会社に行っても、あまり手直しせずに長く使えます。
コードと名称
取引先、科目などは、コードと名称をセットで管理していると思います。
名称の方はちょろちょろ変わりますが、この辺をどう扱うか、考えておく必要があります。
Pythonで名称も含めて処理すると、名称変更があると「違うデータ」として処理され、意図した処理となりません。そこで、処理の前に「名称」は削除して「コード」だけで処理し、最後に読んでわかり易いように「名称」を追加します。
「名称」追加用の最新マスタが常にアクセスできる状態ならいいですが、決算のチェックは「よそ者」として行うので、お願いすれば、お願いした時点の最新マスタらしきものがもらえるかもしれない、くらいのことも想定して、最新マスタはあてにしません。
過去データ(機械学習なら学習データ)とチェック対象データのうち、チェック対象データから辞書を作成して、この辞書から最後に名称を付与します。チェック対象データ内でも名称が変わっている場合は、dictやLabelEncoderの挙動を見ると最後に読み込んだ名称で辞書が作成されるみたいです。
仕訳データをDataFrameにする
読み込むクラスを作成します。
引数は、以下の通りです。
・項目名称(取引先名称、取引先コード・・・)
・貸借の判断(通常、貸借項目で、(0,1)や(1,2)などで区別していると思います。その読取り方を指定します)
引数はcsvにまとめて読込むことにします。(コードをすっきりさせる)
このあたりを引数にしたら、割とこの後の処理は汎用的に使えるのでは?と期待しています。
欠損値を埋めます。コードは会社によっては必ずしも数字だけではありませんので、数字だけの会社も想定して、金額を除く主要項目はすべていったん文字列にしてから欠損値を特定の文字列で埋めます。
結構、取引先コードはブランクでOKなところが多い印象です。
Pythonの構成
普段、使うときは、「実行モジュール」を開けて実行します。
「基本モジュール」、「チェックのモジュール」は作り直すときしか開きません。
基本モジュール
・ファイル操作のクラス
・チェックのクラス
・データ抽出のクラス
チェックのモジュール
・【基本モジュール】「チェックのクラス」を継承した「チェックの子クラス」
・【基本モジュール】「データ抽出のクラス」を継承した「データ抽出の子クラス」
「チェックの子クラス」に「データ抽出の子クラス」を使ってチェック内容を記載
実行モジュール
・【基本モジュール】「ファイル操作のクラス」をインポート
・仕訳データCSVから読み込み(過去データ、チェック対象データ)
・チェック対象データから辞書を作成
・【チェックのモジュール】「チェックの子クラス」をインポート
・「チェックの子クラス」を実行
・結果データのファイルを作成(形式が同じものは一つのファイルにまとめる)