13 コストドライバとKPIの分析

Author

佐久間智広

Published

2024/07/05

Modified

2024/07/04

1 はじめに

今回扱う内容はKey Performance Indicator (KPI) 分析です

KPI

Performance(主に収益)を予測する指標

コストドライバーと似てるっちゃ似てますが,Balanced Scorecardのような戦略的業績測定システムの運用を助けるようなイメージの分析を扱います。

1.1 戦略的業績測定システム

経営戦略実現のために,財務的指標(売上高や原価,利益など)だけでなく,非財務指標(顧客満足度・従業員満足度・生産効率・従業員の学習成果など)を盛り込んだ多元的な業績測定・評価を行う仕組み。代表的なものがBalanced Scorecard(BSC)

2 BSC(Balanced Scorecard:バランスト・スコアカード)とは

端的に言うと

  • 測定できなければ管理できない」と言う精神のもと
  • 財務指標だけでは測れない業務における多様な側面を非財務的な複数の指標で測定し
  • 多面的に測定・評価しよう

という取り組み。複数の視点を4つの視点に整理



2.1 戦略マップ

BSCで設定される指標間に想定される因果関係を図示したのが戦略マップ


2.2 期待される効果

短期志向の緩和

会計業績は通常1年,半年,4半期などの単位で集計

会計数値を目標として業務を行うと,比較的短期の業績を高くするために行動をとるように

  • 言い換えると,長期的な視点が欠如する
  • もっとひどい場合は長期的業績を犠牲にして短期的業績をとりに行くような行動をとる

BSCでは,より長期的な視野を持った指標(顧客→社内プロセス→育成と行くほど長期的な視点に立っています)を管理指標とすることで,短期思考を軽減することが期待される


多面的な業績評価

財務指標は従業員たちが企業の目的に沿った行動をとっているかどうかを把握する指標としては不完全

  • 例えばチームワークよく働けるような気配りや,部下のフォロー,アドバイスとった行動は,企業の目的達成に資する行動だけど,財務指標では測定しづらい

BSCを用いることで,このような会計情報だけでは把握しにくい企業の貢献を多面的な指標によって汲み取れることが期待される


指標間の因果関係を意識した行動の変容

「顧客満足は大事」,「従業員満足は大事」,「利益目標の達成は大事」など大事なことは様々

  • それら大事なものを会計指標にこだわらず数値化して管理する,というのがBSC
  • 戦略マップと併用することで,大事なもの同士の関係が明示される

3 戦略的業績測定システム運用上の困難性

BSCをはじめとする戦略的業績測定システムは,

  • 多様な指標を組み合わせて使う

ことを想定し,暗黙的に,もしくは明示的に

  • 指標間の因果関係を想定

します。


理想的には,因果関係が本当に存在するのかどうかを定期的に確認し,改善していくことが望まれる

しかし,この指標間の因果関係を実際に検証するのはすごく難しいです。


結果として…

  • 間違った目標に向けて努力

  • 結果に繋がらない


3.1 そもそも何が難しいのか?

  1. 根本的に因果関係を推定するのは難しい

最近因果推論の研究者がノーベル経済学賞を取っている(2021年)ように,データから因果関係を明らかにする手法は発展している。でも難しい。

  1. 各関係は異なるタイムラグを持つかもしれない


  1. 非財務指標と財務指標との間の関係は線形ではないかもしれない

例えば,最高品質を目指すことは収益につながるのか?

  • ある程度以上を超えたら十分,みたいなラインはないのか?
Ittner and Larcker (1998)

アメリカの通信会社の顧客満足データと財務データを使って,満足度と収益変化の非線形な関係を発見。

4 今日やること

というような背景を踏まえて,今日は

タイムラグなどを考慮したKPIとPの関係の検証

について扱います。

準備

パッケージの読み込み
options(digits = 3) 
if (!require("pacman")) install.packages("pacman") 
pacman::p_load(tidyverse, magrittr, estimatr,
               modelsummary, here, broom, conflicted, 
               lmtest, zoo, tinytable, np, glmnet) 
conflicts_prefer(dplyr::group_by(),
                 dplyr::select(),
                 dplyr::filter(),
                 dplyr::arrange(),
                 dplyr::lag())
Code
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'))

5 例1

5.1 状況

ある企業の経営者は,広告宣伝活動と研究開発活動それぞれが収益と関係していると予測し,それぞれの活動にヒトや資金を投入してきました。実際それぞれの活動が収益とどのように関係しているのかを知りたいと考えています。

5.2 データ

Code
kpi <- here('data', '13_kpi.csv') |> read_csv()
kpi

5.3 記述統計量

記述統計表

datasummary()関数を使うと結構簡単

Code
datasummary(sales + adv + rd ~ Mean + SD + Min + Max,
            data = kpi)
tinytable_moel7sk8xa36awak92yx
Mean SD Min Max
sales 1663.71 49.96 1570.50 1848.00
adv 100.70 8.99 77.00 122.00
rd 59.80 3.95 52.00 73.00

相関表

相関表も同じように

Code
kpi |> 
  datasummary_correlation()
tinytable_4iv1g7hpti4ssb0t649z
sales adv rd
sales 1 . .
adv .46 1 .
rd -.03 .07 1

売上と広告宣伝活動との相関はあるが,rdとの関係はあまりなさそう


5.4 回帰分析

単純な回帰分析

Code
m01 <- lm(sales ~ adv, data = kpi)
m02 <- lm(sales ~ rd, data = kpi)
m03 <- lm(sales ~ adv + rd, data = kpi)
msummary(list(m01, m02, m03), 
         stars = TRUE, 
         gof_omit = 'Log.Lik.|BIC|RMSE',
         align = 'lccc'
         )
tinytable_g88lv10h6q6z4aquarwv
(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

広告宣伝活動は関係あるけど研究は関係なさそう。

ということは,研究活動は無駄だから削減するべき?


再掲

  1. 各関係は異なるタイムラグを持つかもしれない


advのタイムラグ

advについて,異なるタイムラグを含めて推定してみる

Code
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) 
tinytable_2nvc8gdu7bj4y47polu8
(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

R and Dのタイムラグ

同様に研究開発もやってみる。

Code
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) 
tinytable_l7jzauf9zwa17msuk3ey
(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

赤池情報量規準。赤池さんが作った。パラメータを増やせば増やすだけモデルの当てはまり(決定係数も)がよくなるけれど,そのサンプルのみに適合するような結果(過学習)が起こる場合も。
\(AIC=-2\log L+2(k+1)\)
Lは尤度。kはパラメータの数。第1項は尤度のマイナスなので,小さければ小さい方が良い。第2項は説明変数を増やすと大きくなる。説明変数が増えることによる第1項の減少と,第2項の増加のバランスを探るイメージ?

BIC

\(BIC=-2\log L+k \log n\)。考え方は一緒で小さい方が良い。

でも,今回はモデル全体の当てはまりというよりは,広告宣伝が売上にどれぐらいのタイムラグで効くと考えればいいのか知りたい。なので,係数の有意性の方が役に立つかも。

  • 今期と前期が効いてる

係数の全体の有意性はF検定で検証される


5.5 結果の検討

  • 広告宣伝は,直近1,2年の業績と関係

  • 一方で研究開発は3,4年後に効いてくる

  • 直近の業績だけを使うと,研究開発と業績は関係なしと出てしまう

などなど…

6 例2

6.1 状況

Y社は,顧客満足度をKPIとして設定し,その向上に取り組んできた。満足した顧客のリピート利用により収益が向上する,という想定をしている。

実際に毎月収集している顧客満足度データと収益データを組み合わせてその関係を分析してみたい。

データ

Code
kpi2 <- here('data', '13_kpi2.csv') |> read_csv()
kpi2

6.2 記述統計量

記述統計表と相関表

Code
datasummary(satisfaction + revenue ~ Mean + SD + Min + Max,
            data = kpi2)
kpi2 |> 
  datasummary_correlation()
Table 1: 記述統計量
tinytable_yzqqym2u1m28tut8zxlr
Mean SD Min Max
satisfaction 83.72 12.27 61.68 99.77
revenue 983.24 28.07 900.94 1017.87
tinytable_rc715mgvd6c7ag6iedpq
month satisfaction revenue
month 1 . .
satisfaction .11 1 .
revenue -.01 .12 1

時系列グラフ

Code
  # データのプロット
ggplot(kpi2, aes(x = month)) +
  geom_line(aes(y = satisfaction, color = "満足度")) +
  geom_line(aes(y = revenue / 10, color = "収益")) +  # 収益のスケールを調整
  labs(title = "月次の顧客満足度と収益",
       x = "月",
       y = "値") +
  theme_minimal()

満足度と収益の間にはタイムラグがありそう。1ヶ月程度。


Code
# ラグ変数の作成
kpi2 <- kpi2 %>%
  mutate(lagged_satisfaction = lag(satisfaction, 1))

ggplot(kpi2, aes(x = lagged_satisfaction, y = revenue)) +
  geom_point() +
  labs(title = "ラグ変数を用いた顧客満足度と収益の非線形関係",
       x = "前月の顧客満足度 (%)",
       y = "収益") +
  theme_minimal()

微妙だけど,顧客満足度がある程度以上高いとき,収益は伸びていなさそう


Code
datasummary(satisfaction + lagged_satisfaction + revenue ~
              Mean + SD + Min + Max,
            data = kpi2)
kpi2 |> 
  datasummary_correlation()
Table 2: 記述統計量
tinytable_7u4lb9st0d6x9eihlh2h
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
tinytable_eucalnbpjzrf1ict46fi
month satisfaction revenue lagged_satisfaction
month 1 . . .
satisfaction .11 1 . .
revenue -.01 .12 1 .
lagged_satisfaction .02 -.09 .87 1

前月の満足度と収益に強い相関関係がある


6.3 分析

非線形関係の表現

線形回帰モデルでは,独立変数の高次の項目を入れることで非直線の関係をモデル化できる

\[ y_i = \beta_0 + \beta_1 x_i + \beta_2 x^2_i + e_i \tag{1}\]

Equation 1\(x\)の二次関数とみることができる。

  • \(\beta_2\)が正だとUの形,負だと放物線の形

Rでは,高次の項を含めるときには以下のように表現する

lm(y ~ x + I(x^2))

a: y = 3 -3x +x^2

a: \(y = 3 -3x +x^2\)

b: $y = 1 + 3x - x^2$

b: $y = 1 + 3x - x^2$

Code
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')
tinytable_2nvc8gdu7bj4y47polu8
(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が良さそう

    • 決定係数,AIC,BIC,係数の有意性
  • 二次の項が有意に負→放物線の形

Code
# モデルの適合度を確認するためのプロット
ggplot(kpi2, aes(x = lagged_satisfaction, y = revenue)) +
  geom_point() +
  stat_smooth(method = "lm", formula = y ~ x + I(x^2)) +
  labs(title = "ラグ変数を用いた顧客満足度と収益の非線形関係",
       x = "前月の顧客満足度 (%)",
       y = "収益") +
  theme_minimal()

他のモデルとの比較

Code
# ラグなしの線形モデル
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 = "顧客満足度と収益の関係モデル比較")
tinytable_e9sa1wkie52pz923e1nc
顧客満足度と収益の関係モデル比較
線形モデル(ラグなし) 非線形モデル(ラグなし) 線形モデル(ラグあり) 非線形モデル(ラグあり) 複合モデル(ラグなし+ラグあり)
+ 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

6.4 結果の検討

  • 顧客満足度は,翌月の売上を予測する

  • 顧客満足度と売上の関係は単純な直線関係ではない

  • 90%付近から先は売上高の向上のつながらない

    • 90%程度の満足度を目指すのが効率的?

7 まとめ

  • 財務指標と非財務指標を組み合わせて業績測定・管理することで,財務指標だけを用いた場合に予測される問題を緩和できる(戦略的業績測定システム)

  • 通常非財務指標は,財務指標の先行指標として,将来業績につながることが期待される中間的成果を測定

  • 理想的には非財務指標と財務指標との関係を定期的に検証し,場合によっては指標の選択や目標レベルを修正したい

  • でも,タイムラグや非線形の関係などを特定して両者の関係を検証することは結構難しい

    • 関係性を検証せずに使うことで,戦略的業績測定システムに期待された効果が発揮されないことも

8 課題

経営上重要だと思われるインプットとアウトプットの関係を分析する際,今回扱ったようなタイムラグもしくは非線形の関係を想定した方が良さそうだと考えられる例を,なぜそう考えたのか,という理由とともに一つ挙げてください。

(授業で使った例以外で)

  • BEEF+の第13回(2024/07/05)課題に記入してください。

参考文献

Banker, R. D., G. Potter, and D. Srinivasan. 2000. An Empirical Investigation of an Incentive Plan that Includes Nonfinancial Performance Measures. The Accounting Review 75 (1): 65–92.
Banker, R. D., G. Potter, and D. Srinivasan. 2005. Association of nonfinancial performance measures with the financial performance of a lodging chain. Cornell Hotel and Restaurant Administration Quarterly 46 (4): 394412.
Chenhall, R. H. 2005. Integrative strategic performance measurement systems, strategic alignment of manufacturing, learning and strategic outcomes: An exploratory study. Accounting, Organizations and Society 30 (5): 395422.
Hyvönen, J. 2007. Strategy, performance measurement techniques and information technology of the firm and their links to organizational performance. Management Accounting Research 18 (3): 343366.
Ittner, C. D., and D. F. Larcker. 1998. Are nonfinancial measures leading indicators of financial performance? An analysis of customer satisfaction. Journal of Accounting Research 36: 1–35.
Lee, C.-L., and H.-J. Yang. 2011. Organization structure, competition and performance measurement systems and their joint effects on performance. Management Accounting Research 22 (2): 84104.
Van der Stede, W. A., C. W. Chow, and T. W. Lin. 2006. Strategy, choice of performance measures, and performance. Behavioral Research in Accounting 18 (2002): 185205.