準備
options(scipen = 999)
options(digits = 3)
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse, estimatr, modelsummary, here, tinytable, readxl)
stars <- c("*" = 0.1, "**" = 0.05, "***" = 0.01)佐久間智広
2026/07/03
2026/07/07
前回は
コスト構造を理解し,意思決定やコストマネジメントに役立てるためのコスト構造の推定を扱いました。
今回は,
企業のコスト構造を推定し,それを通して投資の判断や政策判断に役立てよう,というイメージです。
具体的には公表財務諸表データを使ったコストビヘイビア分析を扱います。
伝統的には,コストと活動量(売上高)は比例関係にあるとされてきた
だけど, Anderson, Banker, and Janakiraman (2003) は売上高の増加時におけるコストの増加率が,同額の売上高の減少時におけるコストの減少率より小さい場合があることを発見。
売上高の変化とコストの変化は単純な比例関係を想定していたけど,どうも違うみたいだ。
Balakrishnan, Petersen, and Soderstrom (2004)
公表財務データは基本的にすごく高いデータベースから入手します。
政府の提供するEDINETからもデータをとってくることができますが
等の問題から使い勝手が悪く研究目的で使われているのをみたことがありません。
今回は,小笠原先生(甲南大学)と早田さん(神戸大学の大学院生)が抽出し,教育目的で提供してくださっているEDINET経由で取得したデータを使います (小笠原 and 早田 2021) 。
| 変数名 | 内容 | 変数名 | 内容 |
|---|---|---|---|
| f1 | EDINETコード | x20 | 資本金 |
| f2 | 証券コード | x21 | 資本剰余金 |
| f3 | 会計期間終了日 | x22 | 利益剰余金 |
| f4 | 提出日 | x23 | 自己株式 |
| f5 | 当事業年度開始日 | x24 | 評価・換算差額等 |
| f6 | 当事業年度終了日 | y1 | 売上高 |
| x1 | 現金及び現金同等物の残高 | y2 | 売上原価 |
| x2 | 資産 | y3 | 売上総利益又は売上総損失 |
| x3 | 流動資産 | y4 | 販売費及び一般管理費 |
| x4 | 固定資産 | y5 | 給料及び手当 |
| x5 | 有形固定資産 | y6 | 減価償却費/販売費及び一般管理費 |
| x6 | 無形固定資産 | y7 | 研究開発費 |
| x7 | 投資その他の資産 | y8 | 営業利益又は営業損失 |
| x8 | 負債 | y9 | 営業外収益 |
| x9 | 流動負債 | y10 | 営業外費用 |
| x10 | 短期借入金 | y11 | 支払利息 |
| x11 | 1年内償還予定の社債 | y12 | 経常利益又は経常損失 |
| x12 | 1年内返済予定の長期借入金 | y13 | 特別利益 |
| x13 | 固定負債 | y14 | 特別損失 |
| x14 | 社債 | y15 | 税引前当期純利益又は税引前当期純損失 |
| x15 | 転換社債型新株予約権付社債 | y16 | 親会社株主に帰属する当期純利益又は親会社株主に帰属する当期純損失 |
| x16 | コマーシャル・ペーパー | y17 | 包括利益 |
| x17 | 長期借入金 | z1 | 営業活動によるキャッシュ・フロー |
| x18 | 純資産 | z2 | 減価償却費/営業活動によるキャッシュ・フロー |
| x19 | 株主資本 | z3 | 投資活動によるキャッシュ・フロー |
| z4 | 財務活動によるキャッシュ・フロー |
ufo <- ufo |>
rename(
id = f1,
code = f2,
end = f3,
submit = f4,
year_start = f5,
year_finish = f6,
cash = x1,
asset = x2,
current_assets = x3,
fixed_assets = x4,
tangible = x5,
intangible = x6,
other_assets = x7,
liability = x8,
current_liability = x9,
short_debt = x10,
bonds_due_within_1_year = x11,
long_term_debt_due_within_1_year = x12,
fixed_liability = x13,
bonds = x14,
convertible_bonds = x15,
commercial_paper = x16,
long_debt = x17,
net_worth = x18,
shareholders_equity = x19,
capital_stock = x20,
capital_surplus = x21,
retained_earnings = x22,
treasury_stock = x23,
valuation_and_translation_adjustments = x24,
sales = y1,
cogs = y2,
gross = y3,
sga = y4,
salary = y5,
depreciation = y6,
r_and_d = y7,
operating_income_loss = y8,
non_operating_income = y9,
non_operating_expenses = y10,
interest = y11,
ordinary_income = y12,
extraordinary_income = y13,
extraordinary_losses = y14,
income_before_income_taxes = y15,
net_income_attributable_to_owners_of_the_parent = y16,
comprehensive_income = y17,
cf_from_operating_activities = z1,
depreciation_expenses_cf = z2,
cf_investing = z3,
cf_financing = z4
)
ufo <- ufo |>
mutate(code = code / 10) |>
mutate(code = as.character(code))企業名が欲しかったので,日本証券取引所グループから持ってきた会社コードと企業名一覧データをくっつける
\(Cost\)を何らかの費用( Anderson et al. (2003) やそれに続く研究では販売費及び一般管理費 ),\(Sales\) を売上高とすると
\[ \log \frac{Cost_{i,t}}{Cost_{i,t-1}} = \beta_0 + \beta_1 \log \frac{Sales_{i,t}}{Sales_{i,t-1}} + \beta_2 Dec_{i,t} \log \frac{Sales_{i,t}}{Sales_{i,t-1}} + \varepsilon_{i,t} \tag{1}\]
ただし,\(i\)は企業,\(t\)は年度を表し,\(Dec\) は企業の売上高が減少した場合に 1,そうでない場合に0を取るダミー変数。
つまり
\[\begin{cases} \log \frac{Cost_{i,t}}{Cost_{i,t-1}} = \beta_0 + \beta_1 \log \frac{Sales_{i,t}}{Sales_{i,t-1}} + \varepsilon_{i,t} & 増収時 \\ \log \frac{Cost_{i,t}}{Cost_{i,t-1}} = \beta_0 + (\beta_1 + \beta_2 ) \log \frac{Sales_{i,t}}{Sales_{i,t-1}} + \varepsilon_{i,t} & 減収時 \end{cases} \]
となる。ここで,\(\frac{Cost_{i,t}}{Cost_{i,t-1}}(\frac{Sales_{i,t}}{Sales_{i,t-1}})\)はコスト(売上高)の前年比,それにlogをとっているので,前年比コスト(売上高)の変化率,と解釈できる。
増収時と減収時の売上高の変化率に対するコストの変化率が違うかどうかを知りたいので,注目するのは,\(\beta_1\)(増収時)と\(\beta_1 + \beta_2\)(減収時)の差。
| Mean | SD | Min | Max | |
|---|---|---|---|---|
| sales | 151829860504.49 | 477491147761.95 | 8397000.00 | 1.2e+13 |
| sga | 25993400520.89 | 8.2e+10 | 98701000.00 | 2e+12 |
model <- lm(
dlogsga ~ dlogsales + dec_dlogsales,
data = data
)
m <- summary(model)
modelsummary(
list(model),
stars = stars,
estimate = "{estimate}{stars}",
align = 'ld',
fmt = fmt_decimal(digits = 2, pdigits = 3),
gof_map = c("nobs", "r.squared", 'adj.r.squared')
) |>
style_tt(i = 5, background = '#C6DBCE')| (1) | |
|---|---|
| (Intercept) | 0.02*** |
| (0.00) | |
| dlogsales | 0.49*** |
| (0.01) | |
| dec_dlogsales | -0.06*** |
| (0.01) | |
| Num.Obs. | 8390 |
| R2 | 0.403 |
| R2 Adj. | 0.403 |
その後の研究で,Bankerらは,このようなコストの非対称性が起こる理由を資源調整コストに求めるように(Banker and Byzalov 2014; Banker, Byzalov, Fang, and Liang 2018)
ある年の売上高が前年より下がったとしても,それに対応して,経営資源を削減できる?
シナリオA
シナリオB
シナリオC
この考えに従うと,固定費と直接費も,資源調整コストの大きさによって区分し直すことができる。
\(Y = \log X\) とは,「\(e^Y = X\)となる\(Y\)」のこと(\(e \approx 2.718\))。会計・経済データの分析では,底が\(e\)の自然対数を使うのが標準(以下,\(\log\)は自然対数を指す)。
対数には,掛け算・割り算を足し算・引き算に変換するという重要な性質がある。
\(\log X\)を\(X\)で微分すると
\[\frac{d \log X}{dX} = \frac{1}{X}\]
つまり,\(X\)が少しだけ(\(\Delta X\)だけ)変化するとき,対数の変化は
\[\Delta(\log X) \approx \frac{\Delta X}{X}\]
で近似できる。右辺は\(X\)の変化率(%)。だから対数の差は変化率を近似する。
説明変数・被説明変数のどちらに対数を使うかによって,モデルの型と係数\(\beta_1\)の意味が変わる。
| モデル | 式 | \(\beta_1\)の意味 |
|---|---|---|
| 線形 | \(Y = \beta_0 + \beta_1 X + \varepsilon\) | \(X\)が1単位増えると\(Y\)が\(\beta_1\)単位変化 |
| 対数線形(log-linear) | \(\log Y = \beta_0 + \beta_1 X + \varepsilon\) | \(X\)が1単位増えると\(Y\)が約\(100\beta_1\)%変化 |
| 線形対数(linear-log) | \(Y = \beta_0 + \beta_1 \log X + \varepsilon\) | \(X\)が1%増えると\(Y\)が約\(\beta_1/100\)単位変化 |
| 対数対数(log-log) | \(\log Y = \beta_0 + \beta_1 \log X + \varepsilon\) | \(X\)が1%増えると\(Y\)が約\(\beta_1\)%変化(弾力性) |
Andersonモデルは,このうち「対数対数(log-log)」型の考え方を,時点間の変化(差分)に応用したもの,と位置づけられる。
Andersonモデルの「対数差分」,つまり前年比\(\dfrac{X_t}{X_{t-1}}\)の対数が,なぜ%として読めるのか,4ステップで確認する。
① 成長率\(g_t\)を定義する(定義そのものが「前年比の変化率」)
\[g_t = \frac{X_t - X_{t-1}}{X_{t-1}}\]
② 定義を比率の形に書き直す
\[X_t = X_{t-1}(1+g_t) \ \Rightarrow\ \frac{X_t}{X_{t-1}} = 1+g_t\]
③ 対数を取る(ここまでは近似なし,対数の性質だけ)
\[\log X_t - \log X_{t-1} = \log \frac{X_t}{X_{t-1}} = \log(1+g_t)\]
④ 先ほど確認した近似を適用する(\(g_t\)が小さいとき)
\[\log(1+g_t) \approx g_t\]
\[Cost_{i,t} - Cost_{i,t-1} = \beta_0 + \beta_1 (Sales_{i,t} - Sales_{i,t-1}) + \varepsilon_{i,t}\]
\[\log Cost_{i,t} - \log Cost_{i,t-1} = \beta_0 + \beta_1 (\log Sales_{i,t} - \log Sales_{i,t-1}) + \varepsilon_{i,t}\]
対数の性質より \(\log X_{i,t} - \log X_{i,t-1} = \log \dfrac{X_{i,t}}{X_{i,t-1}}\)(割り算のログは引き算になる)。つまり下の式の左辺は,前年比\(\frac{Cost_{i,t}}{Cost_{i,t-1}}\)の対数そのもの。
上の式は金額そのものの変化,下の式(Andersonモデル)は対数差分。係数\(\beta_1\)の意味がまったく違う。
先ほど確認した近似(対数の差\(\approx\)変化率)を\(Cost\)と\(Sales\)の両方に当てはめると,対数差分同士の回帰係数\(\beta_1\)は弾力性(elasticity)として解釈できる。
\[\beta_1 \approx \frac{\%\Delta Cost}{\%\Delta Sales}\]
Andersonモデルの下方硬直性は,この弾力性が増収時(\(\beta_1\))と減収時(\(\beta_1+\beta_2\))で異なる,という主張だと言い換えられる。
set.seed(1)
n <- 400
sim_scale <- tibble(
firm_size = sample(c("小企業", "大企業"), n, replace = TRUE),
lag_sales = if_else(firm_size == "小企業", 1000, 100000),
g_sales = rnorm(n, mean = 0, sd = 0.1)
) |>
mutate(
sales = lag_sales * (1 + g_sales),
lag_cost = lag_sales * 0.6,
cost = lag_cost * (1 + 0.8 * g_sales + rnorm(n, sd = 0.02)),
diff_level = cost - lag_cost,
diff_sales_level = sales - lag_sales,
dlogcost = log(cost / lag_cost),
dlogsales = log(sales / lag_sales)
)
m_level <- lm(diff_level ~ diff_sales_level, data = sim_scale)
m_log <- lm(dlogcost ~ dlogsales, data = sim_scale)
modelsummary(
list("水準モデル" = m_level, "対数モデル" = m_log),
stars = stars,
estimate = "{estimate}{stars}",
gof_map = c("nobs", "r.squared")
)| 水準モデル | 対数モデル | |
|---|---|---|
| (Intercept) | -33.670 | -0.000 |
| (45.970) | (0.001) | |
| diff_sales_level | 0.481*** | |
| (0.006) | ||
| dlogsales | 0.797*** | |
| (0.010) | ||
| Num.Obs. | 400 | 400 |
| R2 | 0.933 | 0.938 |
真の関係は,売上高が1%変わればコストも0.8%変わる,で全企業共通に設定した。対数モデルの係数は\(\beta_1 \approx 0.8\)付近に収束するが,水準モデルの係数は企業規模構成に依存してブレる。
左(水準)では大企業と小企業で点の散らばる場所がまったく違う。右(対数差分)では,規模に関係なく同じ直線関係に乗る。
Andersonモデルが対数差分を使う理由は,単に変化率にしたいからだけではない。
下方硬直性の分析は,対数変換で弾力性を作り,交互作用でその弾力性を増減収で分割する,という2つの道具の組み合わせでできている。
重回帰分析では,独立変数を複数含められる。さらに,独立変数どうしの掛け合わせ(交互作用項)を加えると,「一方の効果がもう一方の値によって変わる」関係を推定できる。
直感的な例:勉強時間が点数に与える効果は,睡眠時間によって変わりそう。睡眠が十分なら,勉強した分だけ点数が伸びる。でも寝不足だと,同じだけ勉強しても身につきにくい。一方の変数(勉強時間)の効果が,もう一方の変数(睡眠時間)の水準によって変わる,これが交互作用。
\[ Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 (X_1 \times X_2) + \varepsilon \]
\(X_1\) の効果(\(Y\) を \(X_1\) で偏微分):
\[ \frac{\partial Y}{\partial X_1} = \beta_1 + \beta_3 X_2 \]
→ \(X_2\) の値によって \(X_1\) のスロープが変わる。
今分析した Anderson モデルは,実は交互作用モデルだった。
\[ \Delta\log SGA = \beta_0 + \beta_1 \Delta\log Sales + \beta_2 (Dec \times \Delta\log Sales) + \varepsilon \]
\(Dec\) を0か1しかとらないので,式を展開すると:
\[ \begin{cases} \Delta\log SGA = \beta_0 + \beta_1 \Delta\log Sales + \varepsilon & (Dec = 0\text{: 増収時}) \\ \Delta\log SGA = \beta_0 + (\beta_1 + \beta_2)\Delta\log Sales + \varepsilon & (Dec = 1\text{: 減収時}) \end{cases} \]
→ 2本の直線(傍きが増収・減収の2段階で切り替わる)
pred_and <- tibble(
dlogsales = seq(-0.3, 0.3, length.out = 100)
) |>
mutate(
inc = coef(model)["(Intercept)"] + coef(model)["dlogsales"] * dlogsales,
dec_line = coef(model)["(Intercept)"] +
(coef(model)["dlogsales"] + coef(model)["dec_dlogsales"]) * dlogsales
) |>
pivot_longer(inc:dec_line, names_to = "grp", values_to = "pred") |>
mutate(grp = if_else(grp == "inc", "増収時 (Dec=0)", "減収時 (Dec=1)"))
ggplot(pred_and, aes(x = dlogsales, y = pred, color = grp)) +
geom_line(linewidth = 1) +
geom_hline(yintercept = 0, linetype = "dashed", alpha = 0.4) +
geom_vline(xintercept = 0, linetype = "dashed", alpha = 0.4) +
labs(x = "売上高変化率(対数)", y = "販管費変化率(対数)",
color = NULL) +
theme_minimal()2本の直線の傾きの差 \(= \hat{\beta}_2\)
lm(y ~ x1 * x2) は lm(y ~ x1 + x2 + x1:x2) と同じ。* で交互作用項・主効果の両方を自動包含。
\(Dec\)(0/1)を連続変数に置き換えると?
\[ Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 (X_1 \times X_2) + \varepsilon \]
\[ \frac{\partial Y}{\partial X_1} = \beta_1 + \beta_3 X_2 \]
→ \(X_2\) の値が変わるたびにスロープが変わる。無数の直線。
| 0/1 ダミー × 連続変数 | 連続変数 × 連続変数 | |
|---|---|---|
| スロープの種類 | 2本(0か1か) | 無数(\(X_2\) の値ごと) |
| 変化のしかた | 段階的に切り替わる | 連続的に変化する |
各変数から平均を引く:\(\tilde{X} = X - \bar{X}\)
例:試験の点数 \(Score\),学習時間 \(Study\),睡眠時間 \(Sleep\)
\[ Score = \beta_0 + \beta_1 Study + \beta_2 Sleep + \beta_3 (Study \times Sleep) + \varepsilon \]
偏微分すると:
\[ \frac{\partial Score}{\partial Study} = \beta_1 + \beta_3 \cdot Sleep \]
→ \(\beta_1\) は「\(Sleep = 0\)(睡眠ゼロ)のときの学習効果」← 非現実的
中心化:\(\tilde{X} = X - \bar{X}\)(平均を引く)
\[ Score = \beta_0 + \beta_1 \tilde{Study} + \beta_2 \tilde{Sleep} + \beta_3 (\tilde{Study} \times \tilde{Sleep}) + \varepsilon \]
→ \(\beta_1\) は「\(Sleep\) が平均値のときの学習効果」← 解釈可能
| 係数 | 中心化後の意味 |
|---|---|
| \(\beta_1\) | \(Sleep\) が平均値のときの \(Study\) の効果 |
| \(\beta_2\) | \(Study\) が平均値のときの \(Sleep\) の効果 |
| \(\beta_3\) | \(Study\) の効果が \(Sleep\) 1単位増加でどれだけ変わるか |
\(\beta_3\) の値は中心化の前後で変わらない。変わるのは主効果の解釈のみ。
真のモデル:\(Score = 30 + 5 Study + 4 Sleep + 2 Study \times Sleep + \varepsilon\)
# 変数作成
set.seed(42)
n <- 300
sim <- tibble(
study = rnorm(n, mean = 4, sd = 1.5),
sleep = rnorm(n, mean = 6, sd = 1.2)
) |>
mutate(score = 30 + 5 * study + 4 * sleep + 2 * study * sleep + rnorm(n, sd = 8))
# 中心化
sim <- sim |>
mutate(
c_study = study - mean(study),
c_sleep = sleep - mean(sleep),
c_inter = c_study * c_sleep
)
# 回帰モデルの推定
m_raw <- lm(score ~ study + sleep + I(study * sleep), data = sim)
m_cent <- lm(score ~ c_study + c_sleep + c_inter, data = sim)
# 結果の表示
modelsummary(
list("中心化なし" = m_raw, "中心化あり" = m_cent),
stars = stars,
estimate = "{estimate}{stars}",
gof_map = c("nobs", "r.squared"),
coef_map = c(
"(Intercept)" = "切片",
"study" = "学習時間",
"c_study" = "学習時間",
"sleep" = "睡眠時間",
"c_sleep" = "睡眠時間",
"I(study * sleep)" = "交互作用",
"c_inter" = "交互作用"
)
)| 中心化なし | 中心化あり | |
|---|---|---|
| 切片 | 27.629*** | 120.542*** |
| (7.582) | (0.447) | |
| 学習時間 | 6.056*** | 16.583*** |
| (1.754) | (0.303) | |
| 睡眠時間 | 4.545*** | 11.545*** |
| (1.252) | (0.381) | |
| 交互作用 | 1.764*** | 1.764*** |
| (0.289) | (0.289) | |
| Num.Obs. | 300 | 300 |
| R2 | 0.933 | 0.933 |
\(\hat{\beta}_3\) は両モデルで一致。切片と主効果の係数のみ変化。
交互作用あり → ねじれた曲面。なし → 平らな平面。
「睡眠時間が異なる水準で,学習時間とスコアの関係はどう変わるか」
sleep_q <- quantile(sim$sleep, probs = c(0.1, 0.5, 0.9))
sleep_lab <- c("低 (10%ile)", "中央値", "高 (90%ile)")
pred_data <- tibble(
study = rep(seq(min(sim$study), max(sim$study), length.out = 50), times = 3),
sleep = rep(sleep_q, each = 50),
grp = rep(sleep_lab, each = 50)
) |>
mutate(score_hat = predict(m_raw, newdata = pick(study, sleep)))
ggplot(pred_data, aes(x = study, y = score_hat,
color = grp, group = grp)) +
geom_line(linewidth = 1) +
labs(x = "学習時間(時間)", y = "予測点数",
color = "睡眠時間の水準") +
theme_minimal()3本の直線の傾きが異なる → 交互作用の存在。傾きが等しければ交互作用はない。
コストの下方硬直性の研究は,販売費及び一般管理費(SG&A)を対象として研究されてきました。
一方で,販管費には何百,何千もの費目が含まれているとも言われます(Tracy and Tracy 2014)
経営者の戦略的な意思決定を捉えるためには,より細分化された費目を用いた分析も役に立ちそうです 。
以下の分析コードと説明内容をQuartoのqmdファイルで提出してください。分析コードは実行可能なようにR Code Chunkに書いてください。
---
title: "12 公表データを用いた分析"
author: 佐久間智広
date: 2026/07/03
format:
html:
df-print: paged
revealjs:
output-file: 12_cost_slide.html
echo: true
df-print: paged
code-fold: true
simplemenu:
scale: 0.7
flat: true
draft: false
---
## はじめに {data-name="はじめに"}
前回は
- 企業の内部データ(をイメージしたもの)を使って,
- 企業内部者の視点で,
コスト構造を理解し,意思決定やコストマネジメントに役立てるためのコスト構造の推定を扱いました。
今回は,
- [**公表データを使って**]{.green}
- 企業内部者の視点,及び企業外部者の視点から,
企業のコスト構造を推定し,それを通して投資の判断や政策判断に役立てよう,というイメージです。
具体的には公表財務諸表データを使ったコストビヘイビア分析を扱います。
------------------------------------------------------------------------
### 準備
```{r}
#| label: prepare
#| message: false
#| code-summary: 準備
#| code-fold: show
options(scipen = 999)
options(digits = 3)
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse, estimatr, modelsummary, here, tinytable, readxl)
stars <- c("*" = 0.1, "**" = 0.05, "***" = 0.01)
```
## 非対称なコスト変動 {data-name="コスト変動"}
### コストの下方硬直性
伝統的には,コストと活動量(売上高)は比例関係にあるとされてきた
- 売上高が1%上がったら(下がったら)コストも1%上がる(下がる)
だけど, @anderson2003 は売上高の増加時におけるコストの増加率が,同額の売上高の減少時におけるコストの減少率より小さい場合があることを発見。
::: {layout="[1,1]"}


:::
------------------------------------------------------------------------
売上高の変化とコストの変化は単純な比例関係を想定していたけど,どうも違うみたいだ。
1. 増収時のコスト増加率よりも,減収時のコスト減少率が低い。これをsticky cost と呼ぼう(日本では下方硬直性と呼ぶ)[@anderson2003]
2. 後にstickyとは逆パターンが起こることも発見される。これはanti-sticky [@kama2013]
3. 近年では両方の現象に同じ原因を想定して,asymmetric cost behavior (コストの非対称性)と呼ぶ [@banker2014b]
------------------------------------------------------------------------
### その後
#### なんでこんなことが起こるんだろう?
1. コストの中にはそんな簡単に増減させられないものがある。売上高の変化にコストの変化が追いついていない [@yasukata2009a]
2. 経営者は,合理的な意思決定の結果としてコストをstickyにするんじゃないか [@yasukata2009a]
3. 経営者の利己的な行動の結果としてコストがstickyになるんじゃないか [@chen2012]
#### それぞれの仮説に従う証拠を集めよう
1. 経営者が特定の行動をとるインセンティブを持つときに,コストの動きはどうなる? [@kama2013]
2. 経営資源の需要が異なるときにコストの動きがどうなる? [@banker2014]
------------------------------------------------------------------------
#### そもそもこの現象は方法論上のカラクリで生じているように見えるだけでは?
@balakrishnan2004
1. 変数の決め方が悪い?
2. 固定費と変動費の話を言い換えているだけでは?
#### コストの非対称性があると何が困るの?
1. コストの非対称性の経済的帰結は? (佐久間福嶋濵村 2017)
2. 市場はコストの非対称性を織り込んで企業を評価しているのか? [@anderson2007]
3. 保守主義会計との関係は? [@banker2016]
------------------------------------------------------------------------
## データ分析 {data-name="データ分析"}
公表財務データは基本的にすごく高いデータベースから入手します。
- 典型的には日経NEEDS FinancialQUESTっていうデータベースを使います。
政府の提供するEDINETからもデータをとってくることができますが
- 提供期間が限られる
- XBRLというデータ格納形式の操作性
等の問題から使い勝手が悪く研究目的で使われているのをみたことがありません。
今回は,小笠原先生(甲南大学)と早田さん(神戸大学の大学院生)が抽出し,教育目的で提供してくださっているEDINET経由で取得したデータを使います [@ogasawara2021] 。
------------------------------------------------------------------------
```{r}
ufo <- here("data","12_ufo.csv") |> read_csv()
ufo
```
------------------------------------------------------------------------
| 変数名 | 内容 | 変数名 | 内容 |
|------------------|------------------|------------------|------------------|
| f1 | EDINETコード | x20 | 資本金 |
| f2 | 証券コード | x21 | 資本剰余金 |
| f3 | 会計期間終了日 | x22 | 利益剰余金 |
| f4 | 提出日 | x23 | 自己株式 |
| f5 | 当事業年度開始日 | x24 | 評価・換算差額等 |
| f6 | 当事業年度終了日 | y1 | 売上高 |
| x1 | 現金及び現金同等物の残高 | y2 | 売上原価 |
| x2 | 資産 | y3 | 売上総利益又は売上総損失 |
| x3 | 流動資産 | y4 | 販売費及び一般管理費 |
| x4 | 固定資産 | y5 | 給料及び手当 |
| x5 | 有形固定資産 | y6 | 減価償却費/販売費及び一般管理費 |
| x6 | 無形固定資産 | y7 | 研究開発費 |
| x7 | 投資その他の資産 | y8 | 営業利益又は営業損失 |
| x8 | 負債 | y9 | 営業外収益 |
| x9 | 流動負債 | y10 | 営業外費用 |
| x10 | 短期借入金 | y11 | 支払利息 |
| x11 | 1年内償還予定の社債 | y12 | 経常利益又は経常損失 |
| x12 | 1年内返済予定の長期借入金 | y13 | 特別利益 |
| x13 | 固定負債 | y14 | 特別損失 |
| x14 | 社債 | y15 | 税引前当期純利益又は税引前当期純損失 |
| x15 | 転換社債型新株予約権付社債 | y16 | 親会社株主に帰属する当期純利益又は親会社株主に帰属する当期純損失 |
| x16 | コマーシャル・ペーパー | y17 | 包括利益 |
| x17 | 長期借入金 | z1 | 営業活動によるキャッシュ・フロー |
| x18 | 純資産 | z2 | 減価償却費/営業活動によるキャッシュ・フロー |
| x19 | 株主資本 | z3 | 投資活動によるキャッシュ・フロー |
| | | z4 | 財務活動によるキャッシュ・フロー |
------------------------------------------------------------------------
```{r}
ufo <- ufo |>
rename(
id = f1,
code = f2,
end = f3,
submit = f4,
year_start = f5,
year_finish = f6,
cash = x1,
asset = x2,
current_assets = x3,
fixed_assets = x4,
tangible = x5,
intangible = x6,
other_assets = x7,
liability = x8,
current_liability = x9,
short_debt = x10,
bonds_due_within_1_year = x11,
long_term_debt_due_within_1_year = x12,
fixed_liability = x13,
bonds = x14,
convertible_bonds = x15,
commercial_paper = x16,
long_debt = x17,
net_worth = x18,
shareholders_equity = x19,
capital_stock = x20,
capital_surplus = x21,
retained_earnings = x22,
treasury_stock = x23,
valuation_and_translation_adjustments = x24,
sales = y1,
cogs = y2,
gross = y3,
sga = y4,
salary = y5,
depreciation = y6,
r_and_d = y7,
operating_income_loss = y8,
non_operating_income = y9,
non_operating_expenses = y10,
interest = y11,
ordinary_income = y12,
extraordinary_income = y13,
extraordinary_losses = y14,
income_before_income_taxes = y15,
net_income_attributable_to_owners_of_the_parent = y16,
comprehensive_income = y17,
cf_from_operating_activities = z1,
depreciation_expenses_cf = z2,
cf_investing = z3,
cf_financing = z4
)
ufo <- ufo |>
mutate(code = code / 10) |>
mutate(code = as.character(code))
```
------------------------------------------------------------------------
企業名が欲しかったので,日本証券取引所グループから持ってきた会社コードと企業名一覧データをくっつける
```{r}
JPXdata <- here("data", "JPXdata.xls") |> read_excel()
JPXdata <- JPXdata |>
rename(code = コード, firm = 銘柄名)
data <- left_join(ufo, JPXdata, by = 'code')
```
------------------------------------------------------------------------
### 統計モデル
$Cost$を何らかの費用( @anderson2003 やそれに続く研究では販売費及び一般管理費 ),$Sales$ を売上高とすると
$$
\log \frac{Cost_{i,t}}{Cost_{i,t-1}} = \beta_0 + \beta_1 \log \frac{Sales_{i,t}}{Sales_{i,t-1}} + \beta_2 Dec_{i,t} \log \frac{Sales_{i,t}}{Sales_{i,t-1}} + \varepsilon_{i,t}
$$ {#eq-and}
ただし,$i$は企業,$t$は年度を表し,$Dec$ は企業の売上高が減少した場合に 1,そうでない場合に0を取るダミー変数。
------------------------------------------------------------------------
つまり
$$\begin{cases}
\log \frac{Cost_{i,t}}{Cost_{i,t-1}} = \beta_0 + \beta_1 \log \frac{Sales_{i,t}}{Sales_{i,t-1}} + \varepsilon_{i,t} & 増収時 \\
\log \frac{Cost_{i,t}}{Cost_{i,t-1}} = \beta_0 + (\beta_1 + \beta_2 ) \log \frac{Sales_{i,t}}{Sales_{i,t-1}} + \varepsilon_{i,t} & 減収時
\end{cases}
$$
となる。ここで,$\frac{Cost_{i,t}}{Cost_{i,t-1}}(\frac{Sales_{i,t}}{Sales_{i,t-1}})$はコスト(売上高)の前年比,それにlogをとっているので,**前年比コスト(売上高)の変化率**,と解釈できる。
増収時と減収時の売上高の変化率に対するコストの変化率が違うかどうかを知りたいので,注目するのは,$\beta_1$(増収時)と$\beta_1 + \beta_2$(減収時)の差。
- 特に$\beta_1 > \beta_1 + \beta_2$,つまり$0> \beta_2$のときにコストの下方硬直性があるということになる。
------------------------------------------------------------------------
### 変数の作成
```{r}
#| code-fold: show
data <- data |>
group_by(code) |>
mutate(
lag_sales = lag(sales), #<1>
lag_sga = lag(sga),
dec = lag_sales > sales, #<2>
dlogsales = log(sales / lag_sales), #<3>
dlogsga = log(sga / lag_sga),
dec_dlogsales = dec * dlogsales
) #<4>
```
1. 1期前の売上,販管費
2. 売上が前期下がってる場合に1を取るダミー変数
3. 売上・販管費の前年比の対数
4. ダミー変数と売上変数の掛け算項目
------------------------------------------------------------------------
### 記述統計量
```{r}
datasummary(
sales + sga ~ Mean + SD + Min + Max,
data = data
)
```
------------------------------------------------------------------------
### 分析
::::: columns
::: {.column width="50%"}
```{r}
model <- lm(
dlogsga ~ dlogsales + dec_dlogsales,
data = data
)
m <- summary(model)
modelsummary(
list(model),
stars = stars,
estimate = "{estimate}{stars}",
align = 'ld',
fmt = fmt_decimal(digits = 2, pdigits = 3),
gof_map = c("nobs", "r.squared", 'adj.r.squared')
) |>
style_tt(i = 5, background = '#C6DBCE')
```
:::
::: {.column width="50%"}
- $\beta_2$の係数は有意に負( `{r} model$coefficients['dec_dlogsales']` , *p* = `{r} m$coefficients['dec_dlogsales','Pr(>|t|)']` )
- コストの下方硬直性が確認された。
:::
:::::
------------------------------------------------------------------------
{fig-align="center" width="700"}
------------------------------------------------------------------------
### その後の進展: 資源調整コストという考え方
その後の研究で,Bankerらは,このようなコストの非対称性が起こる理由を資源調整コストに求めるように[@banker2014b; @banker2018]
- 経営においてかかる費用は,経営資源に対する投資を含む
- 特に無形の経営資源(Intangibles)への投資
- 合理的な価値推定が難しく,資産として貸借対照表上に現れない [@yīngjǐng2015]
- 例えばブランド価値,研究開発力,営業力,組織文化…
- これらは費用,特に販管費に含まれがち
- 毎年の費用はこれらの経営資源の獲得・維持費だと考える
ある年の売上高が前年より下がったとしても,それに対応して,経営資源を削減できる?
- 前年よりも売上高が下がったから, 従業員(ヒト)の給料をそのぶん下げたり,クビにしたりする?
- 設備を処分する?
- 情報システムを安いのに切り替える?
------------------------------------------------------------------------
::::: columns
::: {.column width="50%"}
**シナリオA**
- 今期の売上高が利用可能な資源レベルより大きいとき:需要に対応するために資源を所要量獲得
**シナリオB**
- 今期の売上高が利用可能な資源レベルより小さいとき:限界資源(marginal resource)を維持することとそれを削除することが無差別になるまで,資源を削減。 資源スラックの維持にかかるコストと資源の廃棄にかかるコストを判断。
**シナリオC**
- 利用可能な資源レベルが今期の売上高に対応するのに十分なとき:資源スラックは許容可能な範囲にあるので,元々の資源レベルを維持。
:::
::: {.column width="50%"}

:::
:::::
------------------------------------------------------------------------
この考えに従うと,固定費と直接費も,資源調整コストの大きさによって区分し直すことができる。

------------------------------------------------------------------------
## log変換 {data-name="log変換"}
### なぜ対数(log)を使うのか
- Andersonモデルでは,コストも売上高も金額の差ではなく,対数差分(前年比の対数)を使っている。なぜだろう?
- 企業ごとに規模がまったく違う。売上高1000億円の企業と10億円の企業を同じデータセットに入れて,金額の差(水準)で回帰すると,大企業の変化額がそのまま推定を支配してしまう。
- 対数を取ると,水準の違いを**変化率**に変換できる。これで,規模の異なる企業を同じ土俵で比較できるようになる。
------------------------------------------------------------------------
### そもそも対数(log)とは
$Y = \log X$ とは,「$e^Y = X$となる$Y$」のこと($e \approx 2.718$)。会計・経済データの分析では,底が$e$の自然対数を使うのが標準(以下,$\log$は自然対数を指す)。
対数には,掛け算・割り算を足し算・引き算に変換するという重要な性質がある。
- $\log(AB) = \log A + \log B$ (掛け算 → 足し算)
- $\log(A / B) = \log A - \log B$ (割り算 → 引き算)
- $\log(A^n) = n \log A$
- $\log 1 = 0$
------------------------------------------------------------------------
### 対数の変化は「変化率」の近似
$\log X$を$X$で微分すると
$$\frac{d \log X}{dX} = \frac{1}{X}$$
つまり,$X$が少しだけ($\Delta X$だけ)変化するとき,対数の変化は
$$\Delta(\log X) \approx \frac{\Delta X}{X}$$
で近似できる。右辺は$X$の変化率(%)。だから対数の差は変化率を近似する。
------------------------------------------------------------------------
### 対数を使った回帰モデルの型
説明変数・被説明変数のどちらに対数を使うかによって,モデルの型と係数$\beta_1$の意味が変わる。
| モデル | 式 | $\beta_1$の意味 |
|------------------------|------------------------|------------------------|
| 線形 | $Y = \beta_0 + \beta_1 X + \varepsilon$ | $X$が1単位増えると$Y$が$\beta_1$単位変化 |
| 対数線形(log-linear) | $\log Y = \beta_0 + \beta_1 X + \varepsilon$ | $X$が1単位増えると$Y$が約$100\beta_1$%変化 |
| 線形対数(linear-log) | $Y = \beta_0 + \beta_1 \log X + \varepsilon$ | $X$が1%増えると$Y$が約$\beta_1/100$単位変化 |
| 対数対数(log-log) | $\log Y = \beta_0 + \beta_1 \log X + \varepsilon$ | $X$が1%増えると$Y$が約$\beta_1$%変化(弾力性) |
: {tbl-colwidths="[25, 30, 45]"}
Andersonモデルは,このうち「対数対数(log-log)」型の考え方を,時点間の変化(差分)に応用したもの,と位置づけられる。
------------------------------------------------------------------------
### 前年比の対数はなぜ変化率(%)になるのか
Andersonモデルの「対数差分」,つまり前年比$\dfrac{X_t}{X_{t-1}}$の対数が,なぜ%として読めるのか,4ステップで確認する。
::::: columns
::: column
**① 成長率**$g_t$を定義する(定義そのものが「前年比の変化率」)
$$g_t = \frac{X_t - X_{t-1}}{X_{t-1}}$$
**② 定義を比率の形に書き直す**
$$X_t = X_{t-1}(1+g_t) \ \Rightarrow\ \frac{X_t}{X_{t-1}} = 1+g_t$$
:::
::: column
**③ 対数を取る(ここまでは近似なし,対数の性質だけ)**
$$\log X_t - \log X_{t-1} = \log \frac{X_t}{X_{t-1}} = \log(1+g_t)$$
**④ 先ほど確認した近似を適用する**($g_t$が小さいとき)
$$\log(1+g_t) \approx g_t$$
:::
:::::
------------------------------------------------------------------------
### 水準モデル vs 対数モデル
$$Cost_{i,t} - Cost_{i,t-1} = \beta_0 + \beta_1 (Sales_{i,t} - Sales_{i,t-1}) + \varepsilon_{i,t}$$
$$\log Cost_{i,t} - \log Cost_{i,t-1} = \beta_0 + \beta_1 (\log Sales_{i,t} - \log Sales_{i,t-1}) + \varepsilon_{i,t}$$
対数の性質より $\log X_{i,t} - \log X_{i,t-1} = \log \dfrac{X_{i,t}}{X_{i,t-1}}$(割り算のログは引き算になる)。つまり下の式の左辺は,前年比$\frac{Cost_{i,t}}{Cost_{i,t-1}}$の対数そのもの。
上の式は金額そのものの変化,下の式(Andersonモデル)は対数差分。係数$\beta_1$の意味がまったく違う。
------------------------------------------------------------------------
### 係数の意味:弾力性としての$\beta_1$
先ほど確認した近似(対数の差$\approx$変化率)を$Cost$と$Sales$の両方に当てはめると,対数差分同士の回帰係数$\beta_1$は弾力性(elasticity)として解釈できる。
$$\beta_1 \approx \frac{\%\Delta Cost}{\%\Delta Sales}$$
- $\beta_1 = 1$:売上高が1%変化したら,コストもちょうど1%変化する(比例的)
- $\beta_1 < 1$:コストの反応が鈍い(固定費的な性質が強い)
- $\beta_1 > 1$:コストの反応が過敏
Andersonモデルの下方硬直性は,この弾力性が増収時($\beta_1$)と減収時($\beta_1+\beta_2$)で異なる,という主張だと言い換えられる。
------------------------------------------------------------------------
### シミュレーションで確認:規模の異なる企業を混ぜると何が起こるか
```{r}
#| label: sim-log-level
#| code-summary: 規模の異なる企業のシミュレーション
#| code-fold: show
set.seed(1)
n <- 400
sim_scale <- tibble(
firm_size = sample(c("小企業", "大企業"), n, replace = TRUE),
lag_sales = if_else(firm_size == "小企業", 1000, 100000),
g_sales = rnorm(n, mean = 0, sd = 0.1)
) |>
mutate(
sales = lag_sales * (1 + g_sales),
lag_cost = lag_sales * 0.6,
cost = lag_cost * (1 + 0.8 * g_sales + rnorm(n, sd = 0.02)),
diff_level = cost - lag_cost,
diff_sales_level = sales - lag_sales,
dlogcost = log(cost / lag_cost),
dlogsales = log(sales / lag_sales)
)
m_level <- lm(diff_level ~ diff_sales_level, data = sim_scale)
m_log <- lm(dlogcost ~ dlogsales, data = sim_scale)
modelsummary(
list("水準モデル" = m_level, "対数モデル" = m_log),
stars = stars,
estimate = "{estimate}{stars}",
gof_map = c("nobs", "r.squared")
)
```
真の関係は,売上高が1%変わればコストも0.8%変わる,で全企業共通に設定した。対数モデルの係数は$\beta_1 \approx 0.8$付近に収束するが,水準モデルの係数は企業規模構成に依存してブレる。
------------------------------------------------------------------------
### 図解:水準データ vs 対数データ
::::: columns
::: {.column width="50%"}
```{r}
#| label: plot-level
#| fig-cap: "水準:規模で散らばりが違う"
#| echo: false
ggplot(
sim_scale,
aes(x = diff_sales_level, y = diff_level, color = firm_size)
) +
geom_point(alpha = 0.6) +
labs(x = "売上高の変化額", y = "コストの変化額", color = NULL) +
theme_minimal()
```
:::
::: {.column width="50%"}
```{r}
#| label: plot-log
#| fig-cap: "対数差分:規模によらず同じ形"
#| echo: false
ggplot(sim_scale, aes(x = dlogsales, y = dlogcost, color = firm_size)) +
geom_point(alpha = 0.6) +
labs(x = "売上高の対数差分", y = "コストの対数差分", color = NULL) +
theme_minimal()
```
:::
:::::
左(水準)では大企業と小企業で点の散らばる場所がまったく違う。右(対数差分)では,規模に関係なく同じ直線関係に乗る。
------------------------------------------------------------------------
### コスト分析への応用:Andersonモデルを対数変換の視点で見直す
Andersonモデルが対数差分を使う理由は,単に変化率にしたいからだけではない。
1. 財務諸表データは企業規模が数桁単位で異なる。対数変換なしでは,大企業の変化額が回帰結果を支配してしまう。
2. $\beta_1$,$\beta_1+\beta_2$を弾力性として解釈できるので,増収時と減収時で反応性がどれだけ違うかを比率として比較できる。
3. 交互作用($Dec \times \Delta\log Sales$)は,この弾力性が増減収で切り替わる,という話だった。対数変換があって初めて,弾力性の非対称性という解釈が成り立つ。
下方硬直性の分析は,対数変換で弾力性を作り,交互作用でその弾力性を増減収で分割する,という2つの道具の組み合わせでできている。
------------------------------------------------------------------------
## 交互作用 {data-name="交互作用"}
### 交互作用とは
重回帰分析では,独立変数を複数含められる。さらに,**独立変数どうしの掛け合わせ**(交互作用項)を加えると,「一方の効果がもう一方の値によって変わる」関係を推定できる。
::: {.callout-note appearance="simple" icon="false"}
**直感的な例**:勉強時間が点数に与える効果は,睡眠時間によって変わりそう。睡眠が十分なら,勉強した分だけ点数が伸びる。でも寝不足だと,同じだけ勉強しても身につきにくい。一方の変数(勉強時間)の効果が,もう一方の変数(睡眠時間)の水準によって変わる,これが交互作用。
:::
$$
Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 (X_1 \times X_2) + \varepsilon
$$
$X_1$ の効果($Y$ を $X_1$ で偏微分):
$$
\frac{\partial Y}{\partial X_1} = \beta_1 + \beta_3 X_2
$$
→ $X_2$ の値によって $X_1$ のスロープが変わる。
------------------------------------------------------------------------
### 0/1 ダミー × 連続変数:Anderson モデルの再解釈
今分析した Anderson モデルは,実は交互作用モデルだった。
$$
\Delta\log SGA = \beta_0 + \beta_1 \Delta\log Sales + \beta_2 (Dec \times \Delta\log Sales) + \varepsilon
$$
$Dec$ を0か1しかとらないので,式を展開すると:
$$
\begin{cases}
\Delta\log SGA = \beta_0 + \beta_1 \Delta\log Sales + \varepsilon & (Dec = 0\text{: 増収時}) \\
\Delta\log SGA = \beta_0 + (\beta_1 + \beta_2)\Delta\log Sales + \varepsilon & (Dec = 1\text{: 減収時})
\end{cases}
$$
→ **2本の直線**(傍きが増収・減収の2段階で切り替わる)
- $\beta_1$:増収時のスロープ
- $\beta_2$:減収時にスロープがどれだけ変わるか
- 下方硬直性 $= \beta_2 < 0$
------------------------------------------------------------------------
### 0/1 ダミーとの交互作用:図示
:::::: columns
::: {.column width="55%"}
```{r}
#| label: dummy-inter-plot
#| code-fold: true
#| fig-cap: "増収・減収でスロープが異なる"
pred_and <- tibble(
dlogsales = seq(-0.3, 0.3, length.out = 100)
) |>
mutate(
inc = coef(model)["(Intercept)"] + coef(model)["dlogsales"] * dlogsales,
dec_line = coef(model)["(Intercept)"] +
(coef(model)["dlogsales"] + coef(model)["dec_dlogsales"]) * dlogsales
) |>
pivot_longer(inc:dec_line, names_to = "grp", values_to = "pred") |>
mutate(grp = if_else(grp == "inc", "増収時 (Dec=0)", "減収時 (Dec=1)"))
ggplot(pred_and, aes(x = dlogsales, y = pred, color = grp)) +
geom_line(linewidth = 1) +
geom_hline(yintercept = 0, linetype = "dashed", alpha = 0.4) +
geom_vline(xintercept = 0, linetype = "dashed", alpha = 0.4) +
labs(x = "売上高変化率(対数)", y = "販管費変化率(対数)",
color = NULL) +
theme_minimal()
```
:::
:::: {.column width="45%"}
2本の直線の傾きの差 $= \hat{\beta}_2$
- $\hat{\beta}_2 < 0$ → 減収時のスロープが小さい
- これが下方硬直性の正体
::: {.callout-tip icon="false"}
## **Rでの記法**
`lm(y ~ x1 * x2)` は `lm(y ~ x1 + x2 + x1:x2)` と同じ。`*` で交互作用項・主効果の両方を自動包含。
:::
::::
::::::
------------------------------------------------------------------------
### 連続変数 × 連続変数への拡張
$Dec$(0/1)を連続変数に置き換えると?
$$
Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 (X_1 \times X_2) + \varepsilon
$$
$$
\frac{\partial Y}{\partial X_1} = \beta_1 + \beta_3 X_2
$$
→ $X_2$ の値が変わるたびにスロープが変わる。**無数の直線**。
| | 0/1 ダミー × 連続変数 | 連続変数 × 連続変数 |
|----------------|-----------------------|------------------------|
| スロープの種類 | 2本(0か1か) | 無数($X_2$ の値ごと) |
| 変化のしかた | 段階的に切り替わる | 連続的に変化する |
------------------------------------------------------------------------
### 中心化:係数に意味を持たせる
各変数から平均を引く:$\tilde{X} = X - \bar{X}$
例:試験の点数 $Score$,学習時間 $Study$,睡眠時間 $Sleep$
$$
Score = \beta_0 + \beta_1 Study + \beta_2 Sleep + \beta_3 (Study \times Sleep) + \varepsilon
$$
偏微分すると:
$$
\frac{\partial Score}{\partial Study} = \beta_1 + \beta_3 \cdot Sleep
$$
→ $\beta_1$ は「$Sleep = 0$(睡眠ゼロ)のときの学習効果」← **非現実的**
----------
**中心化**:$\tilde{X} = X - \bar{X}$(平均を引く)
$$
Score = \beta_0 + \beta_1 \tilde{Study} + \beta_2 \tilde{Sleep} + \beta_3 (\tilde{Study} \times \tilde{Sleep}) + \varepsilon
$$
→ $\beta_1$ は「$Sleep$ が**平均値**のときの学習効果」← **解釈可能**
| 係数 | 中心化後の意味 |
|-----------|------------------------------------------------------|
| $\beta_1$ | $Sleep$ が平均値のときの $Study$ の効果 |
| $\beta_2$ | $Study$ が平均値のときの $Sleep$ の効果 |
| $\beta_3$ | $Study$ の効果が $Sleep$ 1単位増加でどれだけ変わるか |
$\beta_3$ の値は中心化の前後で**変わらない**。変わるのは主効果の解釈のみ。
------------------------------------------------------------------------
### シミュレーションデータで確認
真のモデル:$Score = 30 + 5 Study + 4 Sleep + 2 Study \times Sleep + \varepsilon$
```{r}
#| label: sim-interact
#| code-summary: シミュレーションデータの生成と推定
#| code-fold: show
# 変数作成
set.seed(42)
n <- 300
sim <- tibble(
study = rnorm(n, mean = 4, sd = 1.5),
sleep = rnorm(n, mean = 6, sd = 1.2)
) |>
mutate(score = 30 + 5 * study + 4 * sleep + 2 * study * sleep + rnorm(n, sd = 8))
# 中心化
sim <- sim |>
mutate(
c_study = study - mean(study),
c_sleep = sleep - mean(sleep),
c_inter = c_study * c_sleep
)
# 回帰モデルの推定
m_raw <- lm(score ~ study + sleep + I(study * sleep), data = sim)
m_cent <- lm(score ~ c_study + c_sleep + c_inter, data = sim)
# 結果の表示
modelsummary(
list("中心化なし" = m_raw, "中心化あり" = m_cent),
stars = stars,
estimate = "{estimate}{stars}",
gof_map = c("nobs", "r.squared"),
coef_map = c(
"(Intercept)" = "切片",
"study" = "学習時間",
"c_study" = "学習時間",
"sleep" = "睡眠時間",
"c_sleep" = "睡眠時間",
"I(study * sleep)" = "交互作用",
"c_inter" = "交互作用"
)
)
```
$\hat{\beta}_3$ は両モデルで一致。切片と主効果の係数のみ変化。
------------------------------------------------------------------------
### 3次元で見る:交互作用の形
::::: columns
::: {.column width="50%"}
```{r}
#| label: persp-inter
#| fig-cap: "交互作用あり(ねじれた曲面)"
#| echo: false
study_seq <- seq(1, 8, length.out = 30)
sleep_seq <- seq(3, 9, length.out = 30)
z_inter <- outer(study_seq, sleep_seq,
function(s1, s2) 30 + 5*s1 + 4*s2 + 2*s1*s2)
persp(study_seq, sleep_seq, z_inter,
xlab = "学習時間", ylab = "睡眠時間", zlab = "点数",
theta = 40, phi = 20, col = "lightblue", shade = 0.4,
ticktype = "detailed", main = "交互作用あり")
```
:::
::: {.column width="50%"}
```{r}
#| label: persp-nointer
#| fig-cap: "交互作用なし(平面)"
#| echo: false
z_flat <- outer(study_seq, sleep_seq,
function(s1, s2) 30 + 5*s1 + 4*s2)
persp(study_seq, sleep_seq, z_flat,
xlab = "学習時間", ylab = "睡眠時間", zlab = "点数",
theta = 40, phi = 20, col = "lightgray", shade = 0.4,
ticktype = "detailed", main = "交互作用なし")
```
:::
:::::
交互作用あり → **ねじれた曲面**。なし → **平らな平面**。
------------------------------------------------------------------------
### 条件付き効果プロット
「睡眠時間が異なる水準で,学習時間とスコアの関係はどう変わるか」
```{r}
#| label: cond-effect
#| fig-cap: "条件付き効果プロット(睡眠時間の水準別)"
#| code-fold: show
#| fig-height: 4
#| fig-width: 6
#| output: false
sleep_q <- quantile(sim$sleep, probs = c(0.1, 0.5, 0.9))
sleep_lab <- c("低 (10%ile)", "中央値", "高 (90%ile)")
pred_data <- tibble(
study = rep(seq(min(sim$study), max(sim$study), length.out = 50), times = 3),
sleep = rep(sleep_q, each = 50),
grp = rep(sleep_lab, each = 50)
) |>
mutate(score_hat = predict(m_raw, newdata = pick(study, sleep)))
ggplot(pred_data, aes(x = study, y = score_hat,
color = grp, group = grp)) +
geom_line(linewidth = 1) +
labs(x = "学習時間(時間)", y = "予測点数",
color = "睡眠時間の水準") +
theme_minimal()
```
{fig-align="center" width="600"}
3本の直線の**傾きが異なる** → 交互作用の存在。傾きが等しければ交互作用はない。
## 実習 {data-name="実習"}
コストの下方硬直性の研究は,販売費及び一般管理費(SG&A)を対象として研究されてきました。
一方で,販管費には何百,何千もの費目が含まれているとも言われます[@tracy2014]
- つまり,複数の費目に関する意思決定が混ざった結果
経営者の戦略的な意思決定を捉えるためには,より細分化された費目を用いた分析も役に立ちそうです 。
------------------------------------------------------------------------
### 課題
以下の分析コードと説明内容をQuartoのqmdファイルで提出してください。分析コードは実行可能なようにR Code Chunkに書いてください。
1. 給料及び手当について,コストの下方硬直性が存在するか推定してください。また,結果から経営者のどのような意思決定が想像できるか説明してください。
2. 研究開発費について,コストの下方硬直性が存在するか推定してください。また,結果から経営者のどのような意思決定が想像できるか説明してください。
------------------------------------------------------------------------
## 参考文献 {.no-auto-agenda .unnumbered}
::: {#refs}
:::
::::::: content-hidden
### 解答例
:::::: columns
::: {.column width="60%"}
```{r}
data <- data |>
group_by(code) |>
mutate(
lag_salary = lag(salary),
lag_r_and_d = lag(r_and_d),
lag_cogs = lag(cogs),
dlogsalary = log(salary / lag_salary),
dlogr_and_d = log(r_and_d / lag_r_and_d),
dlogcogs = log(cogs / lag_cogs)
)
data <- data |>
mutate(
dlogr_and_d = ifelse(
is.infinite(dlogr_and_d) | is.nan(dlogr_and_d),
NA,
dlogr_and_d
)
)
# 回帰
Salary <- lm(dlogsalary ~ dlogsales + dec_dlogsales, data = data)
RandD <- lm(dlogr_and_d ~ dlogsales + dec_dlogsales, data = data)
cogs <- lm(dlogcogs ~ dlogsales + dec_dlogsales, data = data)
list(Salary = Salary, RandD = RandD, CoGS = cogs) |>
modelsummary(
stars = stars,
estimate = "{estimate}{stars}",
align = 'lddd',
fmt = fmt_decimal(digits = 2, pdigits = 3),
gof_map = c("nobs", "r.squared", 'adj.r.squared')
) |>
style_tt(i = 5, background = '#C6DBCE')
```
:::
:::: {.column width="40%"}
- 人件費は下方硬直的
- 減収時直ちに減俸や解雇を通した人件費の抑制行動をとるわけではない。
- 人的資源を保持した方が,解雇⇨再獲得・再教育よりもコストが低いと判断している可能性?
- 研究開発費は有意でない。そもそも売上高の変動とも関係ない。
- 業績に関わらず一定の金額を支出するような企業が多い可能性?
- 売上原価は,反下方硬直的
- 売上高が下がった時,売上高の増加時よりも急な傾きで減少する。
::: {.callout-note appearance="simple" icon="false"}
販売費及び一般管理費の明細を使っていろんな費目を推定してみた論文
<https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4292523>
:::
::::
::::::
:::::::