using CSV
using DataFrames
using StringEncodings
using FixedEffectModels
using RegressionTables
using Plots
using LinearAlgebra
using Statistics
using Optim
using Printf
using ForwardDiff
using Random
using GLM
using Serialization
using Roots
4 応用編
mutable struct datalist_struct
::Array{Float64,2};
X1::Array{Float64,2};
X2::Array{Float64,2};
Z::Vector{Float64};
ShareVec::Vector{Int64};
marketIndex::Vector{Float64};
logitshare::Array{Float64,2};
randomDrawMat::BitMatrix
marketIndexMatend
mutable struct parameter_struct
::Int;
Nsim::Int;
T::Int;
Nend
for file in readdir("functions/demand_estimation")
include("functions/demand_estimation/" * file)
end
4.1 データの読み込み
= CSV.read("data/demand_estimation_merger/chap3_data.csv", DataFrame);
data first(data, 5)
5×61 DataFrame
Row | NameID | year | Maker | Type | Name | Sales | Model | price | kata | FuelEfficiency | capacity | FuelType | HH | size | hppw | share | share0 | hppw_sum_own | FuelEfficiency_sum_own | size_sum_own | hppw_sqr_sum_own | FuelEfficiency_sqr_sum_own | size_sqr_sum_own | hppw_sum_mkt | FuelEfficiency_sum_mkt | size_sum_mkt | hppw_sqr_sum_mkt | FuelEfficiency_sqr_sum_mkt | size_sqr_sum_mkt | iv_BLP_own_hppw | iv_BLP_own_FuelEfficiency | iv_BLP_own_size | iv_BLP_other_hppw | iv_BLP_other_FuelEfficiency | iv_BLP_other_size | iv_BLP_own_num | iv_BLP_other_num | iv_GH_own_hppw | iv_GH_own_FuelEfficiency | iv_GH_own_size | iv_GH_other_hppw | iv_GH_other_FuelEfficiency | iv_GH_other_size | logit_share | iv_BLP_own_hppw_nest | iv_BLP_own_FuelEfficiency_nest | iv_BLP_own_size_nest | iv_BLP_other_hppw_nest | iv_BLP_other_FuelEfficiency_nest | iv_BLP_other_size_nest | iv_BLP_own_num_nest | iv_BLP_other_num_nest | iv_GH_own_hppw_nest | iv_GH_own_FuelEfficiency_nest | iv_GH_own_size_nest | iv_GH_other_hppw_nest | iv_GH_other_FuelEfficiency_nest | iv_GH_other_size_nest | sum_year_body | inside_share | log_inside_share |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Int64 | Int64 | String15 | String7 | String31 | Int64 | String | Float64 | String15 | Float64 | Int64 | String15 | Int64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Int64 | Int64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Int64 | Int64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Int64 | Float64 | Float64 | |
1 | 14 | 2011 | Audi | Foreign | A1シリーズ | 4206 | 1.4 TFSI | 2.99804 | DBA-8XCAX | 19.4 | 4 | ハイオク | 53783435 | 9.94723 | 0.102521 | 7.82025e-5 | 0.938981 | 0.299061 | 49.4 | 33.1397 | 0.0299428 | 831.48 | 369.074 | 1.93875 | 276.2 | 218.564 | 0.207044 | 4206.04 | 2550.97 | 0.19654 | 30.0 | 23.1925 | 15.7229 | 2464.5 | 1811.61 | 2 | 157 | 0.000154423 | 43.84 | 6.61965 | 0.216315 | 5703.33 | 1332.33 | -9.39325 | 0.19654 | 30.0 | 23.1925 | 1.63969 | 226.8 | 185.424 | 2 | 16 | 0.000154423 | 43.84 | 6.61965 | 0.00906462 | 596.48 | 76.1391 | 143357 | 0.0293393 | -3.52883 |
2 | 14 | 2012 | Audi | Foreign | A1シリーズ | 4502 | 1.4 TFSI | 2.835 | DBA-8XCAX | 19.4 | 4 | ハイオク | 54171475 | 9.94723 | 0.102521 | 8.31065e-5 | 0.919762 | 0.309984 | 49.8 | 33.1791 | 0.0323769 | 842.36 | 370.051 | 1.83969 | 298.3 | 215.509 | 0.182524 | 4896.57 | 2484.02 | 0.207463 | 30.4 | 23.2319 | 16.1851 | 2659.3 | 1891.36 | 2 | 164 | 0.000348865 | 39.2 | 6.8118 | 0.22062 | 6457.49 | 1428.51 | -9.31175 | 0.207463 | 30.4 | 23.2319 | 1.5297 | 248.5 | 182.33 | 2 | 16 | 0.000348865 | 39.2 | 6.8118 | 0.00466326 | 434.17 | 69.7742 | 159210 | 0.0282771 | -3.5657 |
3 | 14 | 2013 | Audi | Foreign | A1シリーズ | 5071 | 1.4 TFSI | 2.82326 | DBA-8XCAX | 19.4 | 4 | ハイオク | 54594744 | 9.94723 | 0.102521 | 9.28844e-5 | 0.919563 | 0.311828 | 52.7 | 33.5456 | 0.0327145 | 947.05 | 378.12 | 1.95986 | 334.4 | 228.399 | 0.196626 | 5760.2 | 2656.1 | 0.209307 | 33.3 | 23.5983 | 15.5385 | 2762.2 | 1857.63 | 2 | 161 | 0.000308215 | 31.37 | 7.59138 | 0.201628 | 6612.26 | 1400.56 | -9.2003 | 0.209307 | 33.3 | 23.5983 | 1.64803 | 281.7 | 194.853 | 2 | 17 | 0.000308215 | 31.37 | 7.59138 | 0.00467482 | 281.31 | 83.5873 | 191874 | 0.0264288 | -3.6333 |
4 | 15 | 2006 | Audi | Foreign | A3シリーズ | 4830 | アトラクション | 2.91889 | GH-8PBSE | 12.2 | 5 | ハイオク | 51102005 | 10.8151 | 0.075 | 9.45168e-5 | 0.915228 | 0.163435 | 23.4 | 22.4202 | 0.0134458 | 274.28 | 251.645 | 1.97874 | 224.8 | 231.473 | 0.207998 | 2577.22 | 2715.96 | 0.0884354 | 11.2 | 11.6051 | 16.1609 | 2391.0 | 1840.9 | 1 | 163 | 0.000180509 | 1.0 | 0.624049 | 0.255313 | 4557.36 | 1004.29 | -9.17815 | 0.0884354 | 11.2 | 11.6051 | 1.81531 | 201.4 | 209.053 | 1 | 18 | 0.000180509 | 1.0 | 0.624049 | 0.023506 | 67.9 | 47.8497 | 169488 | 0.0284976 | -3.55794 |
5 | 15 | 2007 | Audi | Foreign | A3シリーズ | 3874 | アトラクション | 2.93944 | GH-8PBSE | 12.2 | 5 | ハイオク | 51713048 | 10.8151 | 0.075 | 7.49134e-5 | 0.920174 | 0.312689 | 35.4 | 33.111 | 0.0357225 | 418.28 | 365.938 | 2.08997 | 225.1 | 232.358 | 0.230908 | 2583.73 | 2733.06 | 0.237689 | 23.2 | 22.2959 | 16.0534 | 2382.0 | 1839.16 | 2 | 162 | 0.00569413 | 1.04 | 0.639514 | 0.252811 | 4335.92 | 1039.11 | -9.41599 | 0.237689 | 23.2 | 22.2959 | 1.77728 | 189.7 | 199.247 | 2 | 17 | 0.00569413 | 1.04 | 0.639514 | 0.0242194 | 67.05 | 45.7941 | 162015 | 0.0239114 | -3.7334 |
4.2 データクリーニング
:Foreign_d] = data[:, :Type] .== "Foreign";
data[!, :FuelRegular_d] = data[:, :FuelType] .== "レギュラー";
data[!, :capacity_d] = data[:, :capacity] .> 4;
data[!, transform!(
data,
[:year => ByRow(isequal(v))=> Symbol("year_" * string(v))
in unique(data.year)
for v
]
);select!(data, Not(:year_2006));
4.3 ランダム係数ロジットモデルの推定
sort!(data, [:year, :Maker, :price]);
= nrow(data);
N = length(unique(data.year));
T = hcat(
X1 ones(N),
Matrix(
:,[
data[:price, :FuelEfficiency, :hppw, :size,
:capacity_d, :FuelRegular_d, :Foreign_d
]]
),Matrix(data[:, r"^year_"])
);= Matrix(data[:, [:price]]);
X2 = hcat(
Z ones(N),
Matrix(
:, [
data[:FuelEfficiency, :hppw, :size,
:capacity_d, :FuelRegular_d, :Foreign_d
]]
),Matrix(data[:, r"^year_"]),
Matrix(data[:, r"^iv_GH.*(?<!nest)$"])
);
.seed!(42);
Random= 1000;
Nsim
= randn(size(X2)[2], Nsim); randomDrawMat
= data.year;
marketIndex = sort(unique(data.year));
uniqueMarketIndex
= reduce(
marketIndexMat
hcat, .== market for market in uniqueMarketIndex]
[marketIndex
);
= datalist_struct(
datalist
X1,
X2,
Z,
data.share,
marketIndex,
data.logit_share,
randomDrawMat,
marketIndexMat
);= parameter_struct(Nsim, T, N); parameter
= [0.7];
initial_x = calculateMeanUtil(initial_x, datalist, datalist.logitshare); delta_ini
= OnceDifferentiable(
objFunc_for_Optim -> calculateGMMObjective(x, datalist, delta_ini),
x
initial_x;= :forward
autodiff
);@time resultGMM = optimize(
objFunc_for_Optim,0.0],
[Inf],
[
initial_x,Fminbox(),
Options(show_trace = false)
Optim. )
= inv(datalist.Z' * datalist.Z);
W = calculateMeanUtil(resultGMM.minimizer, datalist, delta_ini);
delta = (
beta_hat ' * datalist.Z * W * datalist.Z' * datalist.X1) \
(datalist.X1' * datalist.Z * W * datalist.Z' * delta)
(datalist.X1 );
= delta - X1 * beta_hat;
Xi = reduce(+, Z[i,:] * Z[i,:]' .* Xi[i]^2 ./ N for i = 1:N);
Omega_hat = ForwardDiff.jacobian(
Ddelta -> delta_ini = calculateMeanUtil(x, datalist, delta),
x
resultGMM.minimizer
);= Z' * hcat(- X1, Ddelta) ./ N;
G = (G' * W * G) \ G' * W * Omega_hat * W * G * inv(G' * W * G);
AsyVarMat = sqrt.(diag(AsyVarMat) ./ N);
Ase DataFrame(
= [
Var "Const", "Price", "Fuel Efficiency", "hppw", "size",
"capacity_d", "FuelRegular_d", "Foreign_d",
"year_2007", "year_2008", "year_2009",
"year_2010", "year_2011", "year_2012",
"year_2013", "year_2014", "year_2015", "year_2016",
"random_price"
],= vcat(beta_hat, resultGMM.minimizer),
Est = Ase
se )
19×3 DataFrame
Row | Var | Est | se |
---|---|---|---|
String | Float64 | Float64 | |
1 | Const | -13.9027 | 0.568553 |
2 | Price | -2.2782 | 0.660278 |
3 | Fuel Efficiency | 0.196678 | 0.012633 |
4 | hppw | 14.6705 | 3.61249 |
5 | size | 0.55519 | 0.0766644 |
6 | capacity_d | -0.323059 | 0.139002 |
7 | FuelRegular_d | -1.13995 | 0.292049 |
8 | Foreign_d | 1.04315 | 0.19486 |
9 | year_2007 | -0.836153 | 0.176559 |
10 | year_2008 | -0.704257 | 0.169228 |
11 | year_2009 | -0.856319 | 0.169012 |
12 | year_2010 | -0.0976351 | 0.152402 |
13 | year_2011 | -0.254089 | 0.152604 |
14 | year_2012 | -0.487342 | 0.16411 |
15 | year_2013 | -0.625138 | 0.166785 |
16 | year_2014 | -1.04974 | 0.180157 |
17 | year_2015 | -1.15121 | 0.179025 |
18 | year_2016 | -1.2502 | 0.180264 |
19 | random_price | 0.70029 | 0.248176 |
= data.year .== 2016;
market2016Index = data[market2016Index, :];
data_2016
@time elasmat_2016 = calculateElasticity(
data_2016.price,:],
X2[market2016Index,
beta_hat,
resultGMM.minimizer,
randomDrawMat,
delta[market2016Index] );
0.270182 seconds (691.04 k allocations: 54.730 MiB, 86.41% compilation time)
4.4 限界費用の推定
= data_2016.price;
Pricevec_2016 = data_2016.share;
Sharevec_2016
= Xi[data.year .== 2016];
Xi_2016 = data_2016.Maker .== permutedims(data_2016.Maker);
Ownership_2016 = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Derivative_2016 = Derivative_2016 .* Ownership_2016;
Delta_2016 = Pricevec_2016 - (Delta_2016 \ Sharevec_2016);
Marginal_Cost_2016 = DataFrame(
pred_mc_df = data_2016.Maker,
Maker = data_2016.Name,
Name = data_2016.price,
Price = Marginal_Cost_2016,
MC = (data_2016.price .- Marginal_Cost_2016) ./ data_2016.price
Margin
);first(pred_mc_df, 10)
10×5 DataFrame
Row | Maker | Name | Price | MC | Margin |
---|---|---|---|---|---|
String15 | String31 | Float64 | Float64 | Float64 | |
1 | Audi | A3シリーズ | 3.28 | 2.41726 | 0.263031 |
2 | Audi | A4シリーズ | 5.18 | 3.74093 | 0.277812 |
3 | BMW | ミニ | 2.4 | 1.7001 | 0.291626 |
4 | BMW | 1シリーズ | 3.1 | 2.27191 | 0.267127 |
5 | BMW | X1 | 3.67 | 2.71345 | 0.26064 |
6 | BMW | 2シリーズ | 3.81 | 2.81796 | 0.260378 |
7 | BMW | 3シリーズ | 4.49 | 3.29924 | 0.265202 |
8 | Daihatsu | ミラ | 0.885 | 0.379043 | 0.571703 |
9 | Daihatsu | ムーヴ | 1.134 | 0.601233 | 0.469812 |
10 | Daihatsu | ブーン | 1.15 | 0.615443 | 0.464832 |
histogram(pred_mc_df.Margin, bins = 40, legend = false)
4.5 合併シミュレーション
4.5.1 データの下準備
= leftjoin(data_2016, pred_mc_df, on = ["Maker", "Name"]);
data_2016 dropmissing!(data_2016);
.== "Honda", :Maker] .= "Nippyo";
data_2016[data_2016.Maker .== "Nissan", :Maker] .= "BrandA";
data_2016[data_2016.Maker .== "Subaru", :Maker] .= "BrandB";
data_2016[data_2016.Maker .== "Toyota", :Maker] .= "BrandC";
data_2016[data_2016.Maker
:MakerNippyoA] = data_2016[:, :Maker];
data_2016[!, :MakerNippyoB] = data_2016[:, :Maker];
data_2016[!, in(["Nippyo", "BrandA"]).(data_2016[:, :Maker]), :MakerNippyoA] .= "NippyoA";
data_2016[in(["Nippyo", "BrandB"]).(data_2016[:, :Maker]), :MakerNippyoB] .= "NippyoB";
data_2016[
= data_2016.Maker .== permutedims(data_2016.Maker);
Ownership_true = data_2016.MakerNippyoA .== permutedims(data_2016.MakerNippyoA);
Ownership_NippyoA = data_2016.MakerNippyoB .== permutedims(data_2016.MakerNippyoB); Ownership_NippyoB
= data_2016.MC;
mc = datalist_struct(
datalist_2016 :],
X1[market2016Index, :],
X2[market2016Index, :],
Z[market2016Index,
data_2016.share,
data_2016.year,
data_2016.logit_share,
datalist.randomDrawMat,:]
datalist.marketIndexMat[market2016Index, );
= calculateEquilibriumPrice(
p_NippyoA
datalist_2016,
data_2016.price,
Ownership_NippyoA,
beta_hat,
resultGMM.minimizer,
mc,
Xi_2016
);
= calculateEquilibriumPrice(
p_NippyoB
datalist_2016,
data_2016.price,
Ownership_NippyoB,
beta_hat,
resultGMM.minimizer,
mc,
Xi_2016 );
4.5.2 合併シミュレーションによる価格・販売台数変化
= DataFrame(
merger_sim_df = data_2016.Maker,
Maker = data_2016.Name,
Name = (p_NippyoA .- data_2016.price) ./ data_2016.price .* 100.0,
Price_A = (simulateMarketShare(
Share_A
datalist_2016,
p_NippyoA,
beta_hat,
resultGMM.minimizer,
Xi_2016.- data_2016.share) ./ data_2016.share .* 100.0,
) = (p_NippyoB .- data_2016.price) ./ data_2016.price .* 100.0,
Price_B = (simulateMarketShare(
Share_B
datalist_2016,
p_NippyoB,
beta_hat,
resultGMM.minimizer,
Xi_2016.- data_2016.share) ./ data_2016.share .* 100.0,
)
);
in(["Nippyo", "BrandA", "BrandB", "BrandC"]).(merger_sim_df.Maker), :] merger_sim_df[
92×6 DataFrame
67 rows omitted
Row | Maker | Name | Price_A | Share_A | Price_B | Share_B |
---|---|---|---|---|---|---|
String15 | String31 | Float64 | Float64 | Float64 | Float64 | |
1 | Nippyo | N-WGN | 0.541509 | -1.13154 | 0.205652 | -0.43036 |
2 | Nippyo | N-ONE | 0.53828 | -1.14005 | 0.204763 | -0.434345 |
3 | Nippyo | N-BOX | 0.526869 | -1.17471 | 0.201748 | -0.450635 |
4 | Nippyo | フィット | 0.523412 | -1.18701 | 0.200885 | -0.456444 |
5 | Nippyo | バモス | 0.515992 | -1.21749 | 0.199145 | -0.4709 |
6 | Nippyo | シャトル | 0.497664 | -1.35151 | 0.196526 | -0.5354 |
7 | Nippyo | グレイス | 0.49624 | -1.37468 | 0.196691 | -0.546694 |
8 | Nippyo | フリード | 0.49438 | -1.42958 | 0.197626 | -0.573601 |
9 | Nippyo | ヴェゼル | 0.49419 | -1.44649 | 0.198051 | -0.581931 |
10 | Nippyo | S660 | 0.494207 | -1.47187 | 0.198799 | -0.594463 |
11 | Nippyo | ステップワゴン | 0.499161 | -1.60188 | 0.204403 | -0.659201 |
12 | Nippyo | CR-V | 0.50524 | -1.67813 | 0.208852 | -0.697482 |
13 | Nippyo | ジェイド | 0.507676 | -1.70312 | 0.210473 | -0.710059 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
81 | BrandC | エスクァイア | 0.00519814 | 0.0500299 | 0.00233669 | 0.0204086 |
82 | BrandC | ハイエースワゴン | 0.00518198 | 0.0504996 | 0.00232583 | 0.0206358 |
83 | BrandC | ハリアー | 0.00514866 | 0.0513939 | 0.00230289 | 0.0210709 |
84 | BrandC | アルファード | 0.0049542 | 0.0551905 | 0.00216216 | 0.0229581 |
85 | BrandC | ヴェルファイア | 0.0049542 | 0.0551905 | 0.00216216 | 0.0229581 |
86 | BrandC | カムリ | 0.00494805 | 0.0552835 | 0.00215763 | 0.0230052 |
87 | BrandC | FJクルーザー | 0.00492789 | 0.0555804 | 0.00214276 | 0.0231559 |
88 | BrandC | エスティマ | 0.00490764 | 0.0558671 | 0.00212779 | 0.0233018 |
89 | BrandC | SAI | 0.00488527 | 0.0561714 | 0.00211125 | 0.0234572 |
90 | BrandC | クラウン | 0.00441796 | 0.0607408 | 0.00176394 | 0.0258581 |
91 | BrandC | ランドクルーザー | 0.00276548 | 0.0687654 | 0.000532712 | 0.0304729 |
92 | BrandC | センチュリー | -0.00420307 | 0.0562356 | -0.0034201 | 0.0171902 |
4.5.3 合併後に価格が変化しないような限界費用の計算
= data_2016.MakerNippyoA .== permutedims(data_2016.MakerNippyoA);
Ownership_2016_A = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Derivative_2016_A = Derivative_2016_A .* Ownership_2016_A;
Delta_2016_A = Pricevec_2016 - (Delta_2016_A \ Sharevec_2016);
mc_NippyoA_pfix
= data_2016.MakerNippyoB .== permutedims(data_2016.MakerNippyoB);
Ownership_2016_B = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Derivative_2016_B = Derivative_2016_B .* Ownership_2016_B;
Delta_2016_B = Pricevec_2016 - (Delta_2016_B \ Sharevec_2016);
mc_NippyoB_pfix
= DataFrame(
mc_sim_df = data_2016.Maker,
Maker = data_2016.Name,
Name = (mc_NippyoA_pfix .- mc) ./ mc .* 100.0,
Nippyo_and_Brand_A = (mc_NippyoB_pfix .- mc) ./ mc .* 100.0,
Nippyo_and_Brand_B
);
in(["Nippyo", "BrandA", "BrandB", "BrandC"]).(mc_sim_df.Maker), :] mc_sim_df[
92×4 DataFrame
67 rows omitted
Row | Maker | Name | Nippyo_and_Brand_A | Nippyo_and_Brand_B |
---|---|---|---|---|
String15 | String31 | Float64 | Float64 | |
1 | Nippyo | N-WGN | -0.91733 | -0.349287 |
2 | Nippyo | N-ONE | -0.900594 | -0.343475 |
3 | Nippyo | N-BOX | -0.842563 | -0.323451 |
4 | Nippyo | フィット | -0.825194 | -0.317506 |
5 | Nippyo | バモス | -0.787848 | -0.304822 |
6 | Nippyo | シャトル | -0.685154 | -0.271214 |
7 | Nippyo | グレイス | -0.673848 | -0.267729 |
8 | Nippyo | フリード | -0.651828 | -0.261192 |
9 | Nippyo | ヴェゼル | -0.646177 | -0.259586 |
10 | Nippyo | S660 | -0.638542 | -0.257483 |
11 | Nippyo | ステップワゴン | -0.611683 | -0.251122 |
12 | Nippyo | CR-V | -0.60284 | -0.249869 |
13 | Nippyo | ジェイド | -0.600761 | -0.249749 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
81 | BrandC | エスクァイア | 0.0 | 0.0 |
82 | BrandC | ハイエースワゴン | 0.0 | 0.0 |
83 | BrandC | ハリアー | 0.0 | 0.0 |
84 | BrandC | アルファード | 0.0 | 0.0 |
85 | BrandC | ヴェルファイア | 0.0 | 0.0 |
86 | BrandC | カムリ | 0.0 | 0.0 |
87 | BrandC | FJクルーザー | 0.0 | 0.0 |
88 | BrandC | エスティマ | 0.0 | 0.0 |
89 | BrandC | SAI | 0.0 | 0.0 |
90 | BrandC | クラウン | 0.0 | 0.0 |
91 | BrandC | ランドクルーザー | 0.0 | 0.0 |
92 | BrandC | センチュリー | 0.0 | 0.0 |
4.5.4 合併シミュレーションの厚生分析
= calculateCS(
CS_2016
datalist_2016,
data_2016.price,
beta_hat,
resultGMM.minimizer,
Xi_2016,1]
data_2016.HH[
);
= calculateCS(
CS_NippyoA
datalist_2016,
p_NippyoA,
beta_hat,
resultGMM.minimizer,
Xi_2016,1]
data_2016.HH[
);
= calculateCS(
CS_NippyoB
datalist_2016,
p_NippyoB,
beta_hat,
resultGMM.minimizer,
Xi_2016,1]
data_2016.HH[
);
= CS_NippyoA - CS_2016;
CV_NippyoA = CS_NippyoB - CS_2016; CV_NippyoB
= calculateProfit(
pro_rev_2016
data_2016.Maker,
data_2016.price,
mc,
data_2016.share,
data_2016.HH
);= calculateProfit(
pro_rev_NippyoA
data_2016.Maker,
p_NippyoA,
mc,simulateMarketShare(
datalist_2016,
p_NippyoA,
beta_hat,
resultGMM.minimizer,
Xi_2016,
),
data_2016.HH
);= calculateProfit(
pro_rev_NippyoB
data_2016.Maker,
p_NippyoB,
mc,simulateMarketShare(
datalist_2016,
p_NippyoB,
beta_hat,
resultGMM.minimizer,
Xi_2016,
),
data_2016.HH
);
= CV_NippyoA + sum(pro_rev_NippyoA.profit - pro_rev_2016.profit);
TS_change_NippyoA = CV_NippyoB + sum(pro_rev_NippyoB.profit - pro_rev_2016.profit); TS_change_NippyoB
DataFrame(
= ["Consumer surplus", "Total welfare"],
Measure = [CV_NippyoA, TS_change_NippyoA],
Nippyo_and_Brand_A = [CV_NippyoB, TS_change_NippyoB],
Nippyo_and_Brand_B )
2×3 DataFrame
Row | Measure | Nippyo_and_Brand_A | Nippyo_and_Brand_B |
---|---|---|---|
String | Float64 | Float64 | |
1 | Consumer surplus | -11740.6 | -4610.7 |
2 | Total welfare | -10457.5 | -4060.65 |
= DataFrame(
result_df = pro_rev_2016.Maker,
Maker = pro_rev_NippyoA.profit - pro_rev_2016.profit,
Profits_NippyoA = pro_rev_NippyoA.revenue - pro_rev_2016.revenue,
Revenue_NippyoA = pro_rev_NippyoB.profit - pro_rev_2016.profit,
Profits_NippyoB = pro_rev_NippyoB.revenue - pro_rev_2016.revenue,
Revenue_NippyoB
);
= combine(result_df, 2:5 .=> sum .=> names(result_df)[2:5]);
total_df :Maker] .= "Total"
total_df[!, append!(result_df, total_df)
16×5 DataFrame
Row | Maker | Profits_NippyoA | Revenue_NippyoA | Profits_NippyoB | Revenue_NippyoB |
---|---|---|---|---|---|
String15 | Float64 | Float64 | Float64 | Float64 | |
1 | Audi | 11.7143 | 43.2563 | 4.81051 | 18.5928 |
2 | BMW | 39.1788 | 134.846 | 16.3626 | 56.9962 |
3 | Daihatsu | 115.249 | 224.046 | 46.3959 | 88.9923 |
4 | Fiat | 1.6232 | 4.50466 | 0.67127 | 1.83475 |
5 | Lexas | 65.7824 | 239.717 | 24.6482 | 108.337 |
6 | Matsuda | 63.1001 | 164.767 | 25.9724 | 67.0548 |
7 | Mercedes | 57.4933 | 211.167 | 21.5483 | 95.6349 |
8 | Mitsubishi | 21.7094 | 54.6053 | 8.9026 | 22.1991 |
9 | Suzuki | 120.615 | 231.995 | 48.5311 | 92.1837 |
10 | Volkswagen | 20.6055 | 64.2728 | 8.60925 | 26.6126 |
11 | Volvo | 9.62959 | 35.0214 | 4.01389 | 14.9299 |
12 | Nippyo | 83.8031 | -9633.81 | 44.2023 | -3841.84 |
13 | BrandA | 14.4172 | -10950.4 | 59.5346 | 154.201 |
14 | BrandB | 58.2013 | 166.716 | -12.6581 | -5066.24 |
15 | BrandC | 599.97 | 1536.03 | 248.508 | 629.8 |
16 | Total | 1283.09 | -17473.3 | 550.053 | -7530.71 |
4.6 追加的なシミュレーション
= ["Nippyo", "Brand_A"];
costReducingFirms = 100
distance = 1e-6;
lambda = 1.0;
max_cost_red = 0.0;
min_cost_red
= 1; iter
@time while (distance > lambda) & (iter < 100)
= (max_cost_red + min_cost_red) / 2.0;
mid_cost_red
= calculateTSChangeByCostReduction(
mid_eval
mid_cost_red,
costReducingFirms,
Ownership_NippyoA,
data_2016,
mc,
datalist_2016,
beta_hat,
resultGMM.minimizer,
data_2016.HH,
p_NippyoA,
pro_rev_2016,
CS_2016,
Xi_2016
);
if mid_eval > 0
= mid_cost_red;
min_cost_red else
= mid_cost_red;
max_cost_red end
= abs(mid_eval - 0);
distance += 1
iter
end
= (min_cost_red + min_cost_red) / 2.0; cost_red_NippyoA
= mc[:];
mc_NippyoA_TSfix in(costReducingFirms).(data_2016.Maker)] .*= cost_red_NippyoA; mc_NippyoA_TSfix[
= calculateEquilibriumPrice(
p_NippyoA_TSfix
datalist_2016,
p_NippyoA,
Ownership_NippyoA,
beta_hat,
resultGMM.minimizer,
mc_NippyoA_TSfix,
Xi_2016
);= simulateMarketShare(
share_NippyoA_TSfix
datalist_2016,
p_NippyoA_TSfix,
beta_hat,
resultGMM.minimizer,
Xi_2016 );
= ["Nippyo", "Brand_B"];
costReducingFirms = 100
distance = 1e-6;
lambda = 1.0;
max_cost_red = 0.0;
min_cost_red
= 1; iter
@time while (distance > lambda) & (iter < 100)
= (max_cost_red + min_cost_red) / 2.0;
mid_cost_red
= calculateTSChangeByCostReduction(
mid_eval
mid_cost_red,
costReducingFirms,
Ownership_NippyoB,
data_2016,
mc,
datalist_2016,
beta_hat,
resultGMM.minimizer,
data_2016.HH,
p_NippyoB,
pro_rev_2016,
CS_2016,
Xi_2016
);
if mid_eval > 0
= mid_cost_red;
min_cost_red else
= mid_cost_red;
max_cost_red end
= abs(mid_eval - 0);
distance += 1
iter
end
= (min_cost_red + min_cost_red) / 2.0; cost_red_NippyoB
= mc[:];
mc_NippyoB_TSfix in(costReducingFirms).(data_2016.Maker)] .*= cost_red_NippyoB; mc_NippyoB_TSfix[
= calculateEquilibriumPrice(
p_NippyoB_TSfix
datalist_2016,
p_NippyoB,
Ownership_NippyoB,
beta_hat,
resultGMM.minimizer,
mc_NippyoB_TSfix,
Xi_2016
);= simulateMarketShare(
share_NippyoB_TSfix
datalist_2016,
p_NippyoB_TSfix,
beta_hat,
resultGMM.minimizer,
Xi_2016 );
1-cost_red_NippyoA 1-cost_red_NippyoB] .* 100 [
1×2 Matrix{Float64}:
1.46299 0.566009
4.6.1 限界費用削減をしたときの利潤と収入の変化
= calculateProfit(
pro_rev_NippyoA_rc
data_2016.Maker,
p_NippyoA_TSfix,
mc_NippyoA_TSfix,
share_NippyoA_TSfix,
data_2016.HH
);= calculateProfit(
pro_rev_NippyoB_rc
data_2016.Maker,
p_NippyoB_TSfix,
mc_NippyoB_TSfix,
share_NippyoB_TSfix,
data_2016.HH
);
= DataFrame(
result2_df = pro_rev_2016.Maker,
Maker = pro_rev_NippyoA_rc.profit - pro_rev_2016.profit,
Profits_NippyoA = pro_rev_NippyoA_rc.revenue - pro_rev_2016.revenue,
Revenue_NippyoA = pro_rev_NippyoB_rc.profit - pro_rev_2016.profit,
Profits_NippyoB = pro_rev_NippyoB_rc.revenue - pro_rev_2016.revenue,
Revenue_NippyoB
);
= combine(result2_df, 2:5 .=> sum .=> names(result2_df)[2:5]);
total2_df :Maker] .= "Total";
total2_df[!, append!(result2_df, total2_df)
16×5 DataFrame
Row | Maker | Profits_NippyoA | Revenue_NippyoA | Profits_NippyoB | Revenue_NippyoB |
---|---|---|---|---|---|
String15 | Float64 | Float64 | Float64 | Float64 | |
1 | Audi | 0.793296 | 0.201725 | 0.582527 | 1.91046 |
2 | BMW | 1.30464 | -0.281661 | 1.69209 | 4.62644 |
3 | Daihatsu | -2.32447 | -5.48557 | 0.798129 | -0.0426312 |
4 | Fiat | -0.0129613 | -0.082301 | 0.0369978 | 0.0560639 |
5 | Lexas | 10.4044 | -3.42116 | 3.23798 | 14.1655 |
6 | Matsuda | -0.530124 | -2.95159 | 1.30437 | 2.0182 |
7 | Mercedes | 8.89116 | -3.77824 | 2.75485 | 12.3406 |
8 | Mitsubishi | -0.208908 | -0.982314 | 0.404897 | 0.643476 |
9 | Suzuki | -2.43621 | -5.65451 | 0.808416 | 0.000309139 |
10 | Volkswagen | 0.103842 | -0.763724 | 0.664013 | 1.39932 |
11 | Volvo | 0.462478 | 0.0981585 | 0.463932 | 1.3971 |
12 | Nippyo | 10318.3 | 11771.1 | 3965.29 | 4405.35 |
13 | BrandA | -134.893 | -11555.4 | 3.09464 | 5.4871 |
14 | BrandB | -0.0324358 | -2.34412 | -35.68 | -5169.25 |
15 | BrandC | 1.32803 | -25.8976 | 16.4805 | 24.1591 |
16 | Total | 10201.1 | 164.387 | 3961.93 | -695.748 |
@printf(
"Percent change in profit by Brand A merger: %.3f \n",
sum(pro_rev_NippyoA_rc.profit) - sum(pro_rev_2016.profit)) / sum(pro_rev_2016.profit) * 100.0
(
)@printf(
"Percent change in revenue by brand A merger: %.3f \n",
sum(pro_rev_NippyoA_rc.revenue) - sum(pro_rev_2016.revenue)) / sum(pro_rev_2016.revenue) * 100.0
(
)@printf(
"Percent change in profit by Brand B merger: %.3f \n",
sum(pro_rev_NippyoB_rc.profit) - sum(pro_rev_2016.profit)) / sum(pro_rev_2016.profit) * 100.0
(
)@printf(
"Percent change in revenue by Brand B merger: %.3f \n",
sum(pro_rev_NippyoB_rc.revenue) - sum(pro_rev_2016.revenue)) / sum(pro_rev_2016.revenue) * 100.0
( )
Percent change in profit by Brand A merger: 0.384
Percent change in revenue by brand A merger: 0.002
Percent change in profit by Brand B merger: 0.149
Percent change in revenue by Brand B merger: -0.009