2024/07/05
今回扱う内容はKey Performance Indicator (KPI) 分析です
Performance(主に収益)を予測する指標
コストドライバーと似てるっちゃ似てますが,Balanced Scorecardのような戦略的業績測定システムの運用を助けるようなイメージの分析を扱います。
経営戦略実現のために,財務的指標(売上高や原価,利益など)だけでなく,非財務指標(顧客満足度・従業員満足度・生産効率・従業員の学習成果など)を盛り込んだ多元的な業績測定・評価を行う仕組み。代表的なものがBalanced Scorecard(BSC)
端的に言うと
という取り組み。複数の視点を4つの視点に整理
BSCで設定される指標間に想定される因果関係を図示したのが戦略マップ
会計業績は通常1年,半年,4半期などの単位で集計
会計数値を目標として業務を行うと,比較的短期の業績を高くするために行動をとるように
BSCでは,より長期的な視野を持った指標(顧客→社内プロセス→育成と行くほど長期的な視点に立っています)を管理指標とすることで,短期思考を軽減することが期待される
財務指標は従業員たちが企業の目的に沿った行動をとっているかどうかを把握する指標としては不完全
BSCを用いることで,このような会計情報だけでは把握しにくい企業の貢献を多面的な指標によって汲み取れることが期待される
「顧客満足は大事」,「従業員満足は大事」,「利益目標の達成は大事」など大事なことは様々
BSCをはじめとする戦略的業績測定システムは,
ことを想定し,暗黙的に,もしくは明示的に
します。
理想的には,因果関係が本当に存在するのかどうかを定期的に確認し,改善していくことが望まれる
しかし,この指標間の因果関係を実際に検証するのはすごく難しいです。
結果として…
間違った目標に向けて努力
結果に繋がらない
最近因果推論の研究者がノーベル経済学賞を取っている(2021年)ように,データから因果関係を明らかにする手法は発展している。でも難しい。
例えば,最高品質を目指すことは収益につながるのか?
Ittner and Larcker (1998)
アメリカの通信会社の顧客満足データと財務データを使って,満足度と収益変化の非線形な関係を発見。
というような背景を踏まえて,今日は
タイムラグなどを考慮したKPIとPの関係の検証
について扱います。
set.seed(123)
adv <- 100 + 10 * rnorm(106) |> round(digits = 1)
rd <- 60 + 10 * rnorm(106,0, 0.4) |> round(digits = 1)
sales <- numeric(106)
kpi <- tibble(sales, adv, rd)
kpi <- kpi |>
mutate(sales = 800 + 2 * adv + 3 * lag(adv) + 3 * lag(rd, 2) +
3 * lag(rd, 3) + 25 * rnorm(106) |>
round(digits = 1))
write_csv(kpi, here('data', '13_kpi.csv'))
ある企業の経営者は,広告宣伝活動と研究開発活動それぞれが収益と関係していると予測し,それぞれの活動にヒトや資金を投入してきました。実際それぞれの活動が収益とどのように関係しているのかを知りたいと考えています。
datasummary()
関数を使うと結構簡単
売上と広告宣伝活動との相関はあるが,rdとの関係はあまりなさそう
(1) | (2) | (3) | |
---|---|---|---|
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | |||
(Intercept) | 1408.028*** | 1689.005*** | 1454.494*** |
(49.861) | (75.785) | (81.434) | |
adv | 2.541*** | 2.565*** | |
(0.494) | (0.496) | ||
rd | -0.422 | -0.816 | |
(1.262) | (1.129) | ||
Num.Obs. | 103 | 103 | 103 |
R2 | 0.208 | 0.001 | 0.212 |
R2 Adj. | 0.200 | -0.009 | 0.196 |
AIC | 1079.0 | 1102.9 | 1080.5 |
F | 26.502 | 0.112 | 13.450 |
広告宣伝活動は関係あるけど研究は関係なさそう。
ということは,研究活動は無駄だから削減するべき?
再掲
advについて,異なるタイムラグを含めて推定してみる
m1 <- lm(sales ~ adv , data = kpi)
m2 <- lm(sales ~ adv + lag(adv) , data = kpi)
m3 <- lm(sales ~ adv + lag(adv) + lag(adv, 2) , data = kpi)
m4 <- lm(sales ~ adv + lag(adv) + lag(adv, 2) + lag(adv, 3), data = kpi)
results <- list(m1, m2, m3, m4 )
msummary(results,
stars = TRUE,
coef_map = c('(Intercept)',
'adv',
'lag(adv)',
'lag(adv, 2)',
'lag(adv, 3)',
'lag(adv, 4)'),
gof_omit = 'Log.Lik.|RMSE') |>
style_tt(
i = 13:15,
background = "teal",
color = "white",
bold = TRUE)
(1) | (2) | (3) | (4) | |
---|---|---|---|---|
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | ||||
(Intercept) | 1408.028*** | 1031.439*** | 1054.713*** | 1081.285*** |
(49.861) | (46.124) | (58.820) | (67.028) | |
adv | 2.541*** | 2.574*** | 2.554*** | 2.593*** |
(0.494) | (0.324) | (0.326) | (0.330) | |
lag(adv) | 3.703*** | 3.700*** | 3.671*** | |
(0.320) | (0.320) | (0.323) | ||
lag(adv, 2) | -0.208 | -0.209 | ||
(0.324) | (0.325) | |||
lag(adv, 3) | -0.272 | |||
(0.328) | ||||
Num.Obs. | 103 | 103 | 103 | 103 |
R2 | 0.208 | 0.662 | 0.663 | 0.666 |
R2 Adj. | 0.200 | 0.655 | 0.653 | 0.652 |
AIC | 1079.0 | 993.3 | 994.9 | 996.1 |
BIC | 1086.9 | 1003.8 | 1008.0 | 1011.9 |
F | 26.502 | 97.905 | 65.022 | 48.787 |
同様に研究開発もやってみる。
m5 <- lm(sales ~ rd , data = kpi)
m6 <- lm(sales ~ rd + lag(rd) , data = kpi)
m7 <- lm(sales ~ rd + lag(rd) + lag(rd, 2) , data = kpi)
m8 <- lm(sales ~ rd + lag(rd) + lag(rd, 2) + lag(rd, 3), data = kpi)
m9 <- lm(sales ~ rd + lag(rd) + lag(rd, 2) + lag(rd, 3) + lag(rd, 4), data = kpi)
m10 <- lm(sales ~ rd + lag(rd) + lag(rd, 2) + lag(rd, 3) + lag(rd, 4) + lag(rd, 5), data = kpi)
m11 <- lm(sales ~ rd + lag(rd) + lag(rd, 2) + lag(rd, 3) + lag(rd, 4) + lag(rd, 5) + lag(rd, 6), data = kpi)
resultsr <- list(m5, m6, m7, m8, m9, m10, m11)
msummary(resultsr,
stars = TRUE,
gof_omit = 'Log.Lik.|RMSE') |>
style_tt(
i = 19:21,
background = "teal",
color = "white",
bold = TRUE)
(1) | (2) | (3) | (4) | (5) | (6) | (7) | |
---|---|---|---|---|---|---|---|
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | |||||||
(Intercept) | 1689.005*** | 1653.541*** | 1284.124*** | 924.412*** | 938.886*** | 1154.636*** | 1256.923*** |
(75.785) | (116.167) | (142.403) | (154.467) | (181.858) | (201.624) | (228.954) | |
rd | -0.422 | -0.347 | 0.336 | 0.295 | -0.078 | 0.147 | 0.004 |
(1.262) | (1.281) | (1.207) | (1.109) | (1.105) | (1.091) | (1.109) | |
lag(rd) | 0.517 | 1.264 | 1.909+ | 2.104+ | 1.594 | 1.663 | |
(1.280) | (1.208) | (1.120) | (1.091) | (1.095) | (1.106) | ||
lag(rd, 2) | 4.743*** | 5.399*** | 5.817*** | 5.774*** | 5.550*** | ||
(1.187) | (1.101) | (1.101) | (1.085) | (1.120) | |||
lag(rd, 3) | 4.756*** | 4.960*** | 4.542*** | 4.516*** | |||
(1.085) | (1.070) | (1.082) | (1.092) | ||||
lag(rd, 4) | -0.705 | -1.003 | -1.213 | ||||
(1.097) | (1.090) | (1.130) | |||||
lag(rd, 5) | -2.567* | -2.688* | |||||
(1.081) | (1.100) | ||||||
lag(rd, 6) | -1.055 | ||||||
(1.099) | |||||||
Num.Obs. | 103 | 103 | 103 | 103 | 102 | 101 | 100 |
R2 | 0.001 | 0.003 | 0.141 | 0.282 | 0.327 | 0.362 | 0.367 |
R2 Adj. | -0.009 | -0.017 | 0.115 | 0.253 | 0.292 | 0.322 | 0.319 |
AIC | 1102.9 | 1104.7 | 1091.3 | 1074.9 | 1059.5 | 1046.3 | 1038.1 |
BIC | 1110.8 | 1115.3 | 1104.5 | 1090.7 | 1077.9 | 1067.3 | 1061.6 |
F | 0.112 | 0.137 | 5.431 | 9.627 | 9.344 | 8.900 | 7.634 |
非財務指標が財務業績に影響を与えるまでにタイムラグを持ちうることは知られているが,どれぐらいのタイムラグを持つかを事前に予測することは難しい (Banker, Potter, and Srinivasan 2000) 。
モデルのラグを決める方法としては決定係数やAICやBICといった情報量規準が使われる (Banker et al. 2000; Banker, Potter, and Srinivasan 2005)
赤池情報量規準。赤池さんが作った。パラメータを増やせば増やすだけモデルの当てはまり(決定係数も)がよくなるけれど,そのサンプルのみに適合するような結果(過学習)が起こる場合も。
\(AIC=-2\log L+2(k+1)\)
Lは尤度。kはパラメータの数。第1項は尤度のマイナスなので,小さければ小さい方が良い。第2項は説明変数を増やすと大きくなる。説明変数が増えることによる第1項の減少と,第2項の増加のバランスを探るイメージ?
\(BIC=-2\log L+k \log n\)。考え方は一緒で小さい方が良い。
でも,今回はモデル全体の当てはまりというよりは,広告宣伝が売上にどれぐらいのタイムラグで効くと考えればいいのか知りたい。なので,係数の有意性の方が役に立つかも。
係数の全体の有意性はF検定で検証される
広告宣伝は,直近1,2年の業績と関係
一方で研究開発は3,4年後に効いてくる
直近の業績だけを使うと,研究開発と業績は関係なしと出てしまう
などなど…
Y社は,顧客満足度をKPIとして設定し,その向上に取り組んできた。満足した顧客のリピート利用により収益が向上する,という想定をしている。
実際に毎月収集している顧客満足度データと収益データを組み合わせてその関係を分析してみたい。
データ
Mean | SD | Min | Max | |
---|---|---|---|---|
satisfaction | 83.72 | 12.27 | 61.68 | 99.77 |
revenue | 983.24 | 28.07 | 900.94 | 1017.87 |
month | satisfaction | revenue | |
---|---|---|---|
month | 1 | . | . |
satisfaction | .11 | 1 | . |
revenue | -.01 | .12 | 1 |
満足度と収益の間にはタイムラグがありそう。1ヶ月程度。
微妙だけど,顧客満足度がある程度以上高いとき,収益は伸びていなさそう
Mean | SD | Min | Max | |
---|---|---|---|---|
satisfaction | 83.72 | 12.27 | 61.68 | 99.77 |
lagged_satisfaction | 83.02 | 12.05 | 61.68 | 98.27 |
revenue | 983.24 | 28.07 | 900.94 | 1017.87 |
month | satisfaction | revenue | lagged_satisfaction | |
---|---|---|---|---|
month | 1 | . | . | . |
satisfaction | .11 | 1 | . | . |
revenue | -.01 | .12 | 1 | . |
lagged_satisfaction | .02 | -.09 | .87 | 1 |
前月の満足度と収益に強い相関関係がある
線形回帰モデルでは,独立変数の高次の項目を入れることで非直線の関係をモデル化できる
\[ y_i = \beta_0 + \beta_1 x_i + \beta_2 x^2_i + e_i \tag{1}\]
Equation 1 は \(x\)の二次関数とみることができる。
Rでは,高次の項を含めるときには以下のように表現する
m0 <- lm(revenue ~ lagged_satisfaction, data = kpi2)
m1 <- lm(revenue ~ lagged_satisfaction + I(lagged_satisfaction^2), data = kpi2)
m2 <- lm(revenue ~ lagged_satisfaction + I(lagged_satisfaction^2)+ I(lagged_satisfaction^3), data = kpi2)
# モデルの要約
list(m0, m1, m2) |>
modelsummary(stars = TRUE,
gof_omit = 'Log.Lik.|RMSE')
(1) | (2) | (3) | |
---|---|---|---|
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | |||
(Intercept) | 813.544*** | 286.774* | 496.759 |
(21.388) | (104.605) | (977.322) | |
lagged_satisfaction | 2.032*** | 15.311*** | 7.226 |
(0.255) | (2.617) | (37.498) | |
I(lagged_satisfaction^2) | -0.082*** | 0.020 | |
(0.016) | (0.474) | ||
I(lagged_satisfaction^3) | 0.000 | ||
(0.002) | |||
Num.Obs. | 23 | 23 | 23 |
R2 | 0.751 | 0.892 | 0.892 |
R2 Adj. | 0.739 | 0.881 | 0.875 |
AIC | 191.9 | 174.8 | 176.8 |
BIC | 195.3 | 179.4 | 182.4 |
F | 63.447 | 82.196 | 52.201 |
二次関数のモデル2が良さそう
二次の項が有意に負→放物線の形
# ラグなしの線形モデル
model1 <- lm(revenue ~ satisfaction, data = kpi2)
# ラグなしの非線形モデル(2次関数)
model2 <- lm(revenue ~ satisfaction + I(satisfaction^2), data = kpi2)
# ラグを含む線形モデル
model3 <- lm(revenue ~ lagged_satisfaction, data = kpi2)
# ラグを含む非線形モデル(2次関数)
model4 <- lm(revenue ~ lagged_satisfaction + I(lagged_satisfaction^2), data = kpi2)
# ラグなしとラグありの変数を両方含むモデル
model5 <- lm(revenue ~ satisfaction + I(satisfaction^2) + lagged_satisfaction + I(lagged_satisfaction^2), data = kpi2)
# 各モデルの結果を表にまとめる
models <- list(
"線形モデル(ラグなし)" = model1,
"非線形モデル(ラグなし)" = model2,
"線形モデル(ラグあり)" = model3,
"非線形モデル(ラグあり)" = model4,
"複合モデル(ラグなし+ラグあり)" = model5
)
modelsummary(models,
stars = TRUE,
gof_omit = 'Log.Lik.|RMSE',
title = "顧客満足度と収益の関係モデル比較")
線形モデル(ラグなし) | 非線形モデル(ラグなし) | 線形モデル(ラグあり) | 非線形モデル(ラグあり) | 複合モデル(ラグなし+ラグあり) | |
---|---|---|---|---|---|
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | |||||
(Intercept) | 960.107*** | 1043.680** | 813.544*** | 286.774* | 445.484** |
(40.958) | (300.653) | (21.388) | (104.605) | (137.868) | |
satisfaction | 0.276 | -1.820 | -2.634 | ||
(0.484) | (7.483) | (2.237) | |||
I(satisfaction^2) | 0.013 | 0.019 | |||
(0.046) | (0.014) | ||||
lagged_satisfaction | 2.032*** | 15.311*** | 13.467*** | ||
(0.255) | (2.617) | (2.397) | |||
I(lagged_satisfaction^2) | -0.082*** | -0.070*** | |||
(0.016) | (0.015) | ||||
Num.Obs. | 24 | 24 | 23 | 23 | 23 |
R2 | 0.015 | 0.018 | 0.751 | 0.892 | 0.924 |
R2 Adj. | -0.030 | -0.075 | 0.739 | 0.881 | 0.908 |
AIC | 232.8 | 234.7 | 191.9 | 174.8 | 170.5 |
BIC | 236.3 | 239.4 | 195.3 | 179.4 | 177.4 |
F | 0.326 | 0.195 | 63.447 | 82.196 | 54.989 |
顧客満足度は,翌月の売上を予測する
顧客満足度と売上の関係は単純な直線関係ではない
90%付近から先は売上高の向上のつながらない
財務指標と非財務指標を組み合わせて業績測定・管理することで,財務指標だけを用いた場合に予測される問題を緩和できる(戦略的業績測定システム)
通常非財務指標は,財務指標の先行指標として,将来業績につながることが期待される中間的成果を測定
理想的には非財務指標と財務指標との関係を定期的に検証し,場合によっては指標の選択や目標レベルを修正したい
でも,タイムラグや非線形の関係などを特定して両者の関係を検証することは結構難しい
経営上重要だと思われるインプットとアウトプットの関係を分析する際,今回扱ったようなタイムラグもしくは非線形の関係を想定した方が良さそうだと考えられる例を,なぜそう考えたのか,という理由とともに一つ挙げてください。
(授業で使った例以外で)
2024経営データ分析(会計)