大学院自習室

筆者が学生時代に作成した記事の置き場です。

Pythonを利用して上場会社における役員報酬の額を予測するモデルを作成してみた

 この記事は,Pythonを使って,会社の役員報酬を予測するモデルを作成しようと試みたものです。

 筆者は,大学院で税法を専攻していました。そのため,法学を勉強していた人間がプログラミングをかじりだすとどうなるのか?という点も,この記事の見どころの一つだと思います。

 

<目次>

1 はじめに
1.1 研究の動機
1.2 研究の流れと注意事項
2 サンプルデータの取得
3 モデルの構築
3.1 探索的データ分析(EDA)
3.2 モデル構築
3.3 結果
4 モデルの検証
4.1 検証
4.2 モデル精度向上に何が必要か
4.3 精度の向上に向けた追加検証
5 全体の考察
5.1 結果
5.2 考察
5.3 問題点と今後の展望
6 おわりに

(参考)実質的なモデルの構築は3.2 モデル構築から記載しております。また,検証の結果については5.1 結果に記載しております。

 

1 はじめに

1.1 研究の動機

 法人の負担する税金の計算する方法を規定した法律として,法人税法があります。

 法人税法によると,法人税の計算の仕方は,「益金」から「損金」を引いた金額に税率をかけて計算することとされています。ここで,「益金」とは,企業の収益(売上高など)とほぼ同じであり,「損金」とは,企業の費用(商品の仕入れ代金や人件費など)とほぼ同じです。

 ただし,「ほぼ同じ」とあるとおり,一部「益金」と「収益」が,「損金」と「費用」が異なることがあります。この,どのように異なるかについても,法人税法に規定されています。

 ところで,法人税法にはたくさんの規定がありますが,その中に次のような規定があります。

 

法人税法 第34条 第2項

 内国法人がその役員に対して支給する給与の額のうち不相当に高額な部分の金額として政令で定める金額は,その内国法人の各事業年度の所得の金額の計算上,損金の額に算入しない

 

 これは,役員給与,つまり会社の役員に支払う報酬についての規定です。条文を見てみると,会社が役員に支払う給与のうち,「不相当に高額な部分の金額」については,法人の利益の計算上「費用」であっても,法人税の計算では「損金」にはならない,と言っています。税金の計算上,ひけるものが少なくなることを意味するので,会社にとっては,不利な規定です。

 ところで,条文には,「不相当に高額な部分の金額」は,政令で定めがある,と言っています。そこで,この条文に対応する政令の規定を見てみます。ただし,本物の条文は長くて読みにくいので,編集しています。

 

法人税法施行令 第70条

 法第三十四条第二項(役員給与の損金不算入)に規定する政令で定める金額は当該役員の職務の内容,その内国法人の収益及びその使用人に対する給与の支給の状況,その内国法人と同種の事業を営む法人でその事業規模が類似するものの役員に対する給与の支給の状況等に照らし,当該役員の職務に対する対価として相当であると認められる金額を超える場合におけるその超える部分の金額とする。

 

 つまり,①報酬をもらう役員のしていた仕事の内容や,②その会社と似た会社を探してきて,その似た会社の役員がもらっている報酬の額,を参考にして決めてねと言っています。

 ところが,現実的な法の運用の面では,①よりも②が重視されている傾向がみられます。そして,②を参考にするというのは,会社にとっては大変難しいことです。自分の会社の役員に払う給与の額の参考にしようとして,ほかの会社の役員の給与の額を調べようとしても,そのような情報が簡単に見つかるわけではないからです。

 その結果,会社が役員に支払った給与が,この規定により「不相当に高額」として損金にさせてもらえない,ということが起こります。なお,税金に関する処分をする立場である課税庁には情報が集まっているので,②により金額を決定することができます。ある意味,情報量に格差がある状態といえるでしょう。

 このような状況を見たとき,問題が生じる根本的な原因は,納税者である会社が②の情報を参考にできないことではないか?と考えました。つまり,現に誰でも簡単に入手することができる情報をもとに,自分の会社の役員に払う給与の相場がわかれば,70条2項により「不相当に高額」となる金額の予測がつき,情報を持っていないことによる不利益を解消できるのではないか,と考えたわけです。

 そこで,これ以降では,自分の会社と役員の情報(これは当然知っています)から,役員報酬の相場を予測するモデルを作成しようと試みています。知っている情報をポンポン放り込むだけで,自動的に役員報酬額の目安を出力してくれるモデルを作れば,この規定の抱える問題を少しでも解消できるのではないかと思っています。

 

 …というのは実は嘘で,本当は,Pythonが少し使えるようになったので,練習も兼ねてPythonを使っていろいろ遊んでみたかっただけです。

 

1.2 研究の流れと注意事項

 研究の流れは,大きく次のとおりです。

[1]サンプルデータの取得

 誰でも取得可能なデータ,ということで今回は「EDINET」より,上場会社の有価証券報告書から情報を拾ってこようと思います。

「『不相当に高額』で処分されるのはむしろ非上場会社なのだから,有報からモデルを作るのなんてナンセンスだろ」とか言わないでください…

[2]Pythonによるモデルの構築

 Python機械学習ライブラリを用いてモデルを作成します。線形モデル(重回帰分析)で予測を行います。

[3]上記モデルの検証

 予測できたモデルの精度を確認します。精度が低ければ改善案を考えます。

[4] [2]と[3]を繰り返してモデル精度の向上を試みる

[5]研究全体のまとめ

 

 次に,注意点です。

 

 前述したとおり,これは税法の条文とPythonを用いた遊びです。その点をご理解の上,読んでいただきたいです。税法がご専門の方や統計学がご専門の方には,これからの成長にご期待いただき,生温かい目で見守っていただけますと幸いです。

 また,はじめから断っておきますが,この研究は,現実の運用に応用するのは無理だと思っております。例えば,この規定により争訟が想定されるのは非上場会社なのに,サンプルは上場会社のものを使っているなどの問題があるためです。このほかにも,この研究の問題点については,後ほどまとめて述べることとします。

 

2 サンプルデータの取得

 さて,この研究は,予測の前提となるサンプルデータを収集しないことには始まりません。そこで,まずは,このデータの収集の過程について述べてみようと思います。

 

 まず,データの収集の前提として,次の2点を考えました。

①どの企業のデータを収集するか

②データの何を(収集する項目)取得するか

 

 ①について,分析に使用する企業は,できるだけランダムに選ぶ必要があります。(こんな研究,そんな細かいことどうでもいいよなと思いながらも,なぜか無駄にこだわります。)ランダムといっても,具体的にどうしようかと考えていたところ,私は企業に付されている証券コードに着目しました。具体的には,

(1)エクセルにて4桁の整数をランダムに発生させ,

(2)それをヤフーファイナンスの検索ボックスに打ち込み,

(3)検索に何らかの企業が引っかかれば,その企業を採用する

という手順を踏みました。

 「 非効率だよな。もっといいやり方無いかな?」と思いながら作業を行いました。

 4桁の整数であれば,必ず上場企業がヒットするわけではなく,何も出てこない場合も多かったです。また,ETFがヒットすることもあり,ETFにも証券コードが降られていることを初めて知りました。

 

②については,容易に取得可能であるという点を考えて,有価証券報告書に記載の情報を採用することにしました。このうち,取得する情報は,次に掲げるものとしました。

・売上高

当期純利益(または純損失)

・純資産

・総資産

・従業員数

・従業員平均給与

・市場区分

・役員給与

 

 上の6つについては,役員報酬の額に与える要因について分析した研究*1を参考(というか,まったく同じ)にして決定しました。最後の市場区分については,検索エンジンにかけたときに,一瞬で判明する情報だったことから採用しました。

 いずれも,役員給与と関連がありそうな項目を選んできたのがポイントです。なお,各項目の詳細については,参考(この章の最後に掲載)としてまとめておきます。

 

 収集するデータのサンプル数は, 30 とすることにしました。このように設定すると,「分析するにしては,あまりに少ないではないか」と鼻で笑われそうな数ではあると思います。現に私もそう思います。ですが,データの収集を私一人でやっていて結構大変だったので,どうか勘弁してください。

 データの収集ですが,最初は金額などを拾うのに苦労していました。しかし最終的には,ヤフーファイナンスからEDINETへ行き,有報を開いて必要な情報にアクセスするという作業を最適化することが可能となりました。無駄なスキルとは思いますが…

 

 では,収集したデータの様子を写真でお示します。

f:id:daigakuinjisyuusitu:20220225160107p:plain

30社分のデータを集計しました。

 

 

(参考)

各項目の具体的な収集の仕方についてまとめておきました。

項目

説明

売上高

連結損益計算書の「売上高」。なお,国際会計基準を採用している企業については「売上収益」とする。

当期純利益(または純損失)

連結損益計算書の「親会社に帰属する当期純利益(または純損失)」の金額。

純資産

連結貸借対照表の金額。

総資産

連結貸借対照表の金額。

従業員数

連結ベースの情報。なお,人数は全日ベースで記載のものを採用。

従業員平均給与

提出会社の年間平均給与の額。

市場区分

東証一部上場の場合は「1」,それ以外は「0」と表示。

役員給与

取締役に対する報酬の合計額を,その合計額の対象人数で除したもの。

 

なお,全体的な方針として,

・最新年分の情報を使用しました。

・金額は,「百万円」単位(人件費関係は「千円単位」)とし,それ以下の金額については切り捨てました。また,有価証券報告書において,人件費が「百万円」単位となっているものについては,百万円未満の金額はないものとみなしました(この場合,金額の下3桁が000となっています。)。

・収益の構造が一般の事業会社と異なる,金融業・保険業の会社については,データの収集は行わないこととしました。

 

3 モデルの構築

 全体の流れを簡単に確認すると,次の通りです。

[1]サンプルデータの取得

[2]Pythonによるモデルの構築

[3]上記モデルの検証

[4] [2]と[3]を繰り返してモデル精度の向上を試みる

[5]研究全体のまとめ

 第3章では,上記の[2]に入っていきます。

 

3.1 探索的データ分析(EDA

 Pythonのコード作成は,「Google Colaboratory」を用いて行うこととします。早速モデル構築をしていきたいわけですが,その前に,データの特徴を大まかにつかんでいきたいと思います。これは,探索的データ分析(EDA)と呼ばれたりもします。

 データファイルを読み込んだのち,データ数や欠損値の確認,基本統計量の確認,相関関係の確認を行っていきます。

 自分でひとつひとつデータを打ち込んで作ったわけなので,データ数やカラム名は既知であり,欠損値がないことも明らかですが,一応確認します。

カラム名と項目の対応も示しておきます。

項目

カラム名

売上高

Sales

当期純利益(または純損失)

Income

純資産

Nassets

総資産

Tassets

従業員数

Employees

従業員平均給与

Salary

市場区分

Place

役員給与

Officer

 

 

 次に,基本統計量の確認です。データの中に,一部巨大企業(みんなが知っているような有名企業)が含まれており,分析がしにくくなるかなと思ったので,規模が他と比べて極端に大きすぎる企業については,この段階で除外することとしました。

 ヒストグラムを見ても,まだ売上が上に抜けている企業がみられますが,許容範囲と考えて,次に進むこととしました。

 

f:id:daigakuinjisyuusitu:20220228111621p:plain

基本統計量

 

f:id:daigakuinjisyuusitu:20220228111738p:plain

ヒストグラム

 

 相関行列散布図も確認しました。今回は,初めから線形モデルで行くと決めていたので,あまり関係ないかもしれませんが,気分の問題です。

f:id:daigakuinjisyuusitu:20220228112753p:plain

相関行列、散布図

 散布図は,相関行列と同じ数だけあるのですが,一部だけ表示させてもらいます。

 

3.2 モデル構築

 ようやく,モデルの構築に入ることになります。私が書いたコードを一気にお示しします。

f:id:daigakuinjisyuusitu:20220228113028p:plain

コード

 解説です。

①必要なライブラリをインポートして,[11]

②説明変数(x),目的変数(y)をそれぞれ設定します。[12]

③集めたデータを,「学習データ」と「テストデータ」に分けます。[13]

④モデルを宣言して,[14]

⑤学習をさせます。[15]

 これで,学習は完了です。

 

補足:③について

「学習データ」の方で,機械にデータの学習をさせ,「テストデータ」で学習してできたモデルの性能をチェックします。

ちなみに,それぞれのデータ型を確認してみると,

学習データ…19

テストデータ…9

もはや,雀の涙かというようなデータ数となってしまいました…

 

3.3 結果

 では,ここまでのモデル構築の結果,モデルはどのようになったのでしょうか。

早速表示させたいと思います。

f:id:daigakuinjisyuusitu:20220228113403p:plain

モデル

 どうでしょうか。とはいっても,「数字だけダラダラ表示されても」という感じかもしれません。少し補足をします。

 

 今回,モデルの構築は,「重回帰分析」という手法により行っています。重回帰分析を式で表すと,次の通りです。

   Y=b1X1+b2X2+b3X3+…+b0

 今回でいうと,役員給与Yを予測するために,売上高などの項目を複数個用意しました。それぞれ,X1,X2などが対応します。そして,X1,X2…の値からうまくYを予測できるように,b1,b2,…を調整する必要があります。このb1,b2…の値を機械学習によってうまい具合に調整してくれたものが上記の結果になるというわけなのです。

 例えば,売上高に対応するbの値が0.0156…となっているというわけです。

 

 今回の結果が,重回帰式の係数なのだということはわかりました。しかし,それがわかったところで,正直このモデルの出来不出来はやっぱりわかりません。そこで,次章ではこのモデルの「検証」に入っていきます。

 

4 モデルの検証

 全体の流れについても簡単に確認しておきます。

[1]サンプルデータの取得

[2]Pythonによるモデルの構築

[3]上記モデルの検証

[4] [2]と[3]を繰り返してモデル精度の向上を試みる

[5]研究全体のまとめ

 本章では,上記の[3]と[4]に入っていきます。

 

4.1 検証

 まずは,前回構築したモデルの結果を示しておきます。なお,モデルはLinearRegressionにより行っており,結果の各係数は,重回帰式を構成するものとなっています。

f:id:daigakuinjisyuusitu:20220228113403p:plain

結果



 

 では,ここからこのモデルの検証を行います。検証は,

①決定係数を求める

②予測値と実測値の直接比較

ということにより行います。

 

 まず,前回は「学習データ」を使用してモデルを構築しました。この学習させたモデルの精度のテストには,「テストデータ」を用います。これは,モデルの検証をするのに,モデルの構築に使用したデータを使用するのは適切ではないためです。

 ところで,モデルを作成するそもそもの目的は何だったかというと,モデルを使用することにより値の予測を行うということにありました。したがって,そのモデルの精度を検証するためには,モデルにより予測した「予測値」と,データの実際の値「実測値」を比べることにより行えばいいわけです。

 予測値と実測値の差が小さくなるほど,あてはまりのよい,すなわち精度の高いモデルができたということになります。

 

 そして,そのことを具体的に検証するために,上記検証を実施します。①の決定係数は,予測値と実測値がどのくらいマッチしているのかを0から1の数値で示したものです。この値が1に近づくほど,モデルの精度が高いといえます。②は説明せずともわかりやすいと思います。

 

 これらを,前回作成したモデルに対して検証してみます。

 まず,①スコアの結果ですが…

f:id:daigakuinjisyuusitu:20220304121102p:plain

スコア

 え,テストデータの数値がマイナス…

 学習データに対するスコアは高いので特に問題がないのですが,テストスコアの方がわけわからない低さになっています。

 いったん飛ばして,②直接比較をしてみます。とりあえず,5社分出力することとしました。

f:id:daigakuinjisyuusitu:20220304121205p:plain

直接比較

 若干見づらいかもしれませんが,予測38162に対して,実測20813,予測13181に対して,実測13088, …と対応しています。上から2番目,4番目あたりはうまく予測できていますが,それ以外がかなり離れていることがわかります。特に,一番下が予測2207に対して,実測37489と大きく外しています。

 決定係数はともかく(これは本当にわからないです…),値を直接比較してみても,精度が悪そうということがわかりました。

 

4.2 モデル精度向上に何が必要か

 では,このように予測の精度が低かった原因は何だったのでしょうか。いくつか原因を考えたので以下に示します。

 

①サンプル数が少なすぎる

②モデル(線形モデル)が悪い

③外れ値の影響を受けた

④多重共線性の問題

 

 まず,①のせいでモデルの精度が落ちているのはほぼ確実でしょう。この対応としては,データ数を増やすというとても単純なものです。

 また,②についても,他の機械学習モデルを採用することにより対策すべきです。しかし,私の勉強不足により,それ以外のモデルについて今回は試すのをやめることとします。ネットを探すと他のモデルも載っていたりしており,実装自体はできるかもしれませんが,そのモデルに対する理解があやふやなのであれば,今回はすべきではないかなと判断しました。

 ③の影響も大きいと思われます。今回,サンプルデータの作成の時点で,事業規模が極端に上に振れているものについては除外しました。しかし,依然として事業規模がかなり大きい企業が残っています。

 これについては,あまり神経質に見始めると,事業規模が似ているものばかりがサンプルとして集まってしまい,それはそれで問題かなということで,触れないこととしました。それよりも,①の問題を解消することの方が重要と思われます。

 最後に,④について。重回帰分析を行う場合において,強く関連しあっている説明変数が存在すると,モデルの精度が落ちるという状況が起こることがあります。これを「多重共線性」と呼びます。

 今回であれば,説明変数の中に「総資産」と「純資産」という項目があり,その相関係数は,0.9346となっています。これは,説明変数同士の相関係数のなかで,最も高い値です。また,「総資産」「純資産」のどちらも,貸借対照表の資産の状況を示すものであるという共通点もあります。そこで,この2項目の間で多重共線性の問題が生じているのではないかと予想しました。

 

4.3 精度の向上に向けた追加検証

 以上を踏まえ,モデルの精度を高めるために,次のような調整をしました。

 

検証1 学習データとテストデータの振り分けを変える

検証2 「純資産」を説明変数から落とす

検証3 「総資産」を説明変数から落とす

 

検証1 学習データとテストデータの振り分けを変える

 前述の①にもあるとおり,データを増やして再挑戦するのが筋な気はするのですが,ここでは付け焼き刃的な対応として,データの振り分け方をいじってみます。これだけで改善されたら占めたものです。

 具体的には,train_test_splitのところで,random_state=10に設定しました

 先ほどは,random_state=0で設定していたので,ここを変えることになります。その結果は次の通りです。

f:id:daigakuinjisyuusitu:20220304121738p:plain

random_state=10

 おお,ここをいじるだけでかなりモデルが改善されているではないですか!

 さっきまで負数だったところ,これは大きな進歩です。テストスコアと比較して,0.3ほどの開きがありますが,データ数の乏しさを考えるとまずまずといえるのではないでしょうか。少なくとも,私は満足しています。

 ところで,今回random_state=10と設定したのは特に意味があってのことではありません。Pythonを教わったときに,先生が,「ここに入れる数字は何でもいいです」とさらっと言っていたので,適当に決定しました。ただし,「もしかして何らかの意味があるけど説明を省略したのでは?」とも考えてしまいます。

 問題がある場合は,指摘がほしいです…

 

 また,値の直接比較でも,若干改善されたような気がしないでもないですね。

 

検証2 「純資産」を説明変数から落とす

 次に,多重共線性対策を考えます。説明変数から「純資産」をおとしてやったモデルを構築しました。

検証の結果がこちらです。なお,係数については次回以降で扱うこととして,今回は省略しました。

f:id:daigakuinjisyuusitu:20220304122255p:plain

純資産を落として、random_state=10

 これは,先ほどとあまり変わっていない気がしますね。多重共線性の問題は特になかったと解釈していいのでしょうか。

 

検証3 「総資産」を説明変数から落とす

 今度は逆に,説明変数から「純資産」をおとしてやったモデルを検証します。

f:id:daigakuinjisyuusitu:20220304122440p:plain

総資産を落として、random_state=10

 

 こちらも,そこまで変化がないように思われます。特に,モデルの精度に改善は見られませんでした。

 ちなみに,random_state=0と設定して検証2,3をやったところ,いずれもモデルとして機能していませんでした。

 

 したがって,データの振り分け方はモデルの精度向上に大きく貢献した一方,多重共線性の問題は生じておらず,この点からの改善は見られなかったと考えられそうです。そもそも,この程度のデータ数で,過学習なんてしようがないような気がしますし…

 今のところ,検証1の後のモデルが一番適切といえそうです。

 

 そして,(しつこいかもしれませんが)サンプル数の少なさの問題は依然として残りました。データの絶対量を増やさなければ,他をどう工夫したところで,これ以上の精度の向上は考えにくいと思われます。データの振り分け方を変えたことで,結果が大きく変わったことからもこのことが言えると思われます。

 

5 全体の考察

 これまでで,モデルの構築と検証,そして,精度向上のための試行を行いました。そこで,本章では,これまでの内容を踏まえて研究全体のまとめを行おうと思います。

 

5.1 結果

 現在まで作成したモデルについて,その結果を表にまとめたので,次に示します。

f:id:daigakuinjisyuusitu:20220309171418p:plain

分析結果(まとめ)

 1行目に記載の,①から⑤の条件のもとでそれぞれモデルを構築し,係数決定係数(学習データ,テストデータそれぞれ)をそれぞれまとめてあります。予測値と実測値を直接比較した結果についても表の下に掲載しました。

(注)

「rnd」とは、「train_test_split」(テストデータと学習データの振り分け作業)において、データの振り分け方を固定する「random_state」をどう設定したのかを示しています。

「-nasとは、純資産を説明変数から除外したことを示しています。

「-tas」とは、総資産を説明変数から除外したことを示しています。

 

 なお,前回までの記事で触れておりませんが,Pythonと同じデータを使用して,エクセルによる重回帰分析も行っていました。その結果についても併せて載せてあります。

f:id:daigakuinjisyuusitu:20220309171457p:plain

エクセルでの分析結果

 

5.2 考察

(1)係数について

 まず,上記分析で求められたモデルの係数を見ていきます。すると,多少の違いは見られるものの,大きな傾向みたいなものはあることがわかります。

 売上高の係数が多くの場合で負数になっているのは少し意外でした。そのほか,総資産や純資産など会社の規模と関連が深そうな変数についても,全体的に絶対値が小さく(スケールの問題もありますが),値が正になったり負になったりと,事業規模は役員報酬とそこまで関係ないのかな?という印象も受けます

 しかしながら,従業員数はいずれのモデルでも正の値をとり,エクセルの分析の結果,p値が有意に小さいことを考えると,これは関連がありそうということになります。

 また,利益の額についてはいずれのモデルでもわかりやすく正の値をとり,エクセルでもp値が有意に小さいことから,役員報酬への影響は高いものと想定されます。「利益」という,経営成績と直結する指標の方がむしろ説明変数として有用なのかもしれないです

なお,依然引用した論文(*2)でも,利益の額は役員報酬へ有意に影響を与えていることが示されており,本研究においてもこれを確認することができたという点は良かったと思います。

 

(2)モデルの精度

 次に,モデルの精度を見てみます。テストデータの決定係数をみると,③(rnd=0,説明変数は落としていない)が最も精度が高いという結果になりました。ただし,エクセルは学習データとテストデータを分けておらず,単純比較できないので今回は考慮外とします。

 ①については,精度が極端に下がっていますが,学習データの当てはまりは他と比べて最も良いことから,過学習のような状態が起こっているのではないかと予想しています(これは本当にわからないです)。

しかし,最も良いものでも,学習データとテストデータの決定係数に0.3程度の差が生じており,モデルとしての精度はそこまで高くない状態となっています

 最後に,直接比較についてです。これは①についてはかなり誤差が目立つ結果となりました。それ以外についても,それなりの誤差がみられます。ただし①ほどの,よっぽど見当違いというような値までは出ておらず,一定程度の予測精度は担保できているものと思われます。

 

5.3 問題点と今後の展望

 ここで,ここまでの内容を踏まえ,問題を整理してみたいと思います。

 

(1)サンプルの数を十分に収集しなかった

 これは前回も触れましたが,再確認します。データが少ないことで,モデルが個々のデータの影響を大きく受けてしまうことで,安定した分析が行えないということが起こってしまいました。前回の記事で,学習データとテストデータの振り分け方を変えただけでスコアが著しく上昇しました。この工夫によりモデルの精度が上がったことは良かったといえます。しかし,その反面,この点だけを変えてスコアが多く変化したというのは,つまるところモデルが個別のデータの影響を強く受けているということも示しており,安定的なモデルの構築の妨げになっているという懸念もあるのではないかと推察されます。

 また,事業規模が大きい法人があると,その法人の影響を大きく受けてしまう一方で,そのようなデータを外して処理してしまうと,モデルを適用可能な法人の範囲が狭まってしまうという問題も起きます。したがって,外れ値の処理も困難となるという影響を受けてしまいました。

 やはり,サンプル数の確保は重要であることを(自明のことではありますが)身をもって実感しました。今後同じような検証をするのであれば,しっかりとデータ数をそろえて臨むようにしたいです。

 

(2)単純な線形モデル以外を検討しなかった

 今回は重回帰分析モデルで検証を行いましたが,これ以外の他のモデルにより精度が向上することも十分考えられます。他のモデルによる検証も併せて行うべきでした。

 今回は,私が勉強不足のため他の手法は用いませんでしたが、今後機械学習についてより応用的な論点について学ぶことがあるかもしれません。それにより,使える道具が増えれば,それらを用いて精度の向上を目指すこととしたいと思います。

 

(3)説明変数の選び方の問題

 今回の検証において,目的変数は「役員報酬」です。役員報酬は,役員がその職務を行ったことに対する対価として支払われていると考えるのが一般的です。そして,役員は,その会社の経営を担うのが通常の役割ですから,その報酬の額は,役員がどれほどの経営手腕を発揮したかということと関連が深そうであるといえます。

 ところで,例えば今回説明変数として採用した売上高などは,合併など組織再編によって経営成績等と関係なく伸ばすことができます。同様に,総資産額や従業員数なども,結局のところ事業規模と関連の深い項目であるといえるでしょう。

 このように,今回選んだ説明変数が,役員の報酬や,それを決定づける経営手腕などとあまり関係がなく,変数としてあまり適切でなかった可能性もあります。

 そこで,今回使用したものとは別の説明変数を導入することにより,モデルの精度を向上させられることも十分想定されると考えられます。例えば,ROE,ROAなどの収益性指標,一定期間における株価の上昇幅,前記収益性指標の上昇幅などは,経営手腕と関係がありそうです。いずれにしても,説明変数をどう選ぶかというのは,非常に重要と言えそうです。この点は,機械学習の理解というよりは,役員報酬それ自体への理解の深さが求められると思うので,そうした分野に対する理解が今後の課題として残されたものと考えています。

 

(4)現実運用への応用に対する問題点

 これは,モデルの作成を通して明らかになった問題というよりは,むしろ最初から分かっていた問題ではあるのですが,何も始める前から書くこともないだろうと思っていたのでこのタイミングでまとめたいと思います。

 今回の研究で行った,「有報からとれる情報をもとに,役員報酬を予測する」というアプローチ,そして,それにより法人税法34条に規定する「不相当に高額」となる役員給与等の額を予測するという応用には次のような問題があります。

・この規定により争訟が想定されるのは非上場会社なのに,サンプルは上場会社のものを使っている。

・事業規模について実際の適用にあたり,データの外挿(※)の問題が生じる。

有価証券報告書から判明する定量的なデータしか使用することができず,モデルに限界が生じる。

・モデルにより,役員報酬の「適正額」,つまりいわゆる相場は判明するが,これは「『不相当に高額』規定により否認されることのない額である,『適正額』の上限ギリギリ」とは異なる概念である。したがって,役員報酬の予測ができたところで,その結果をもとに直ちに応用できるというわけではない。

・そもそも,有価証券報告書の情報によると,役員個人の報酬については判明しない。今回の分析は,あくまで役員全体の平均報酬しか使用していない。したがって,役員個々人の報酬という点にはアプローチできていない。

(※)外挿とは,あるデータを使って学習した機械学習モデルにおいて,その学習データ(入力データおよび教師ラベル)の数値の範囲外で出力を求めることを指します。例えば,今回の研究で収集したデータのうち,売上高の最小値は3億1300万円でした。したがって,売上高がこれ以下(1億円程度など)の企業についてモデルを使って予測を行うと,外挿の問題が生じます。外挿が生じている場合には,モデルの精度にかかわらず予測がうまくいかないことがあり,実用にあってはこのことを意識しておく必要があるのです。

 

6 おわりに

 上記のように,今回の研究は様々な課題を残すこととなりました。

 また,そもそもこのアプローチによっては,役員報酬税務への応用は無理っぽいことも明らかとなっています。(この点については,私はただPythonで遊びたかっただけなので,特に落ち込んだりはしないですが)

 しかしながら,今回の検討を行うことにより,次はどのように改善したらいいか?という方向性は少し見えてきたように思います。それだけでも,今回の研究には(ごく少しかもしれないですが)多少の意義はあったのではないかと思います。

 

 最後に,少し恥ずかしいですが私の感想です。

 今回,問題を自分で設定したうえで,モデルを実装し,考察を行うというのは,初めての試みでした。それまで,Pythonについての簡単な講義を受ける程度のことしかしていなかったので,この程度の記事ではありますが,本人は大変だった部分が相当数はありました。

 具体的な分析の方法などについては,本を読むなどで対応し,見様見真似でやっていきました。大学などで経験したわけではなかったので,この記事の作成過程自体が新鮮でよかったですね。

 私の専攻や進路を考えると,このような手法での研究を行うことはまず考えられないですが,この「なんちゃって実証研究」みたいなことをした経験が何らかの形で糧にあってくれるとうれしいです。

 

 以上です。ここまで読んでいただきたいてありがとうございます。

 なお,冒頭でも述べた通り,この連載企画は今回が最後です。初回から読んでいただいた方,結構長くなってしまいましたが,それでも最後までお付き合いいただきありがとうございました。

 

参考資料等

高橋信「マンガでわかる統計学 回帰分析編」オーム社、2005

いまにゅのプログラミング塾「【完全版】この動画1本で機械学習実装(Python)の基礎を習得!忙しい人のための速習コース」https://www.youtube.com/watch?v=okpRV08-svw

(最終確認:2022年3月2日)

「内挿/外挿(Interpolation/Extrapolation)とは?」

https://atmarkit.itmedia.co.jp/ait/articles/2008/26/news017.html

(最終確認;2022年3月5日),ほか。

 

*1:島弘・豊田雄彦「上場会社における役員報酬等の決定要素に関する統計的分析」立正大学法制研究所研究年報,20号(2015)

*2:前掲*1