4  応用編

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
mutable struct datalist_struct
    X1::Array{Float64,2};
    X2::Array{Float64,2};
    Z::Array{Float64,2};
    ShareVec::Vector{Float64};
    marketIndex::Vector{Int64};
    logitshare::Vector{Float64};
    randomDrawMat::Array{Float64,2};
    marketIndexMat::BitMatrix
end

mutable struct parameter_struct
    Nsim::Int;
    T::Int;
    N::Int;
end
for file in readdir("functions/demand_estimation")
    include("functions/demand_estimation/" * file)
end

4.1 データの読み込み

data = CSV.read("data/demand_estimation_merger/chap3_data.csv", DataFrame);
first(data, 5)
5×61 DataFrame
RowNameIDyearMakerTypeNameSalesModelpricekataFuelEfficiencycapacityFuelTypeHHsizehppwshareshare0hppw_sum_ownFuelEfficiency_sum_ownsize_sum_ownhppw_sqr_sum_ownFuelEfficiency_sqr_sum_ownsize_sqr_sum_ownhppw_sum_mktFuelEfficiency_sum_mktsize_sum_mkthppw_sqr_sum_mktFuelEfficiency_sqr_sum_mktsize_sqr_sum_mktiv_BLP_own_hppwiv_BLP_own_FuelEfficiencyiv_BLP_own_sizeiv_BLP_other_hppwiv_BLP_other_FuelEfficiencyiv_BLP_other_sizeiv_BLP_own_numiv_BLP_other_numiv_GH_own_hppwiv_GH_own_FuelEfficiencyiv_GH_own_sizeiv_GH_other_hppwiv_GH_other_FuelEfficiencyiv_GH_other_sizelogit_shareiv_BLP_own_hppw_nestiv_BLP_own_FuelEfficiency_nestiv_BLP_own_size_nestiv_BLP_other_hppw_nestiv_BLP_other_FuelEfficiency_nestiv_BLP_other_size_nestiv_BLP_own_num_nestiv_BLP_other_num_nestiv_GH_own_hppw_nestiv_GH_own_FuelEfficiency_nestiv_GH_own_size_nestiv_GH_other_hppw_nestiv_GH_other_FuelEfficiency_nestiv_GH_other_size_nestsum_year_bodyinside_sharelog_inside_share
Int64Int64String15String7String31Int64StringFloat64String15Float64Int64String15Int64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Int64Int64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Int64Int64Float64Float64Float64Float64Float64Float64Int64Float64Float64
1142011AudiForeignA1シリーズ42061.4 TFSI2.99804DBA-8XCAX19.44ハイオク537834359.947230.1025217.82025e-50.9389810.29906149.433.13970.0299428831.48369.0741.93875276.2218.5640.2070444206.042550.970.1965430.023.192515.72292464.51811.6121570.00015442343.846.619650.2163155703.331332.33-9.393250.1965430.023.19251.63969226.8185.4242160.00015442343.846.619650.00906462596.4876.13911433570.0293393-3.52883
2142012AudiForeignA1シリーズ45021.4 TFSI2.835DBA-8XCAX19.44ハイオク541714759.947230.1025218.31065e-50.9197620.30998449.833.17910.0323769842.36370.0511.83969298.3215.5090.1825244896.572484.020.20746330.423.231916.18512659.31891.3621640.00034886539.26.81180.220626457.491428.51-9.311750.20746330.423.23191.5297248.5182.332160.00034886539.26.81180.00466326434.1769.77421592100.0282771-3.5657
3142013AudiForeignA1シリーズ50711.4 TFSI2.82326DBA-8XCAX19.44ハイオク545947449.947230.1025219.28844e-50.9195630.31182852.733.54560.0327145947.05378.121.95986334.4228.3990.1966265760.22656.10.20930733.323.598315.53852762.21857.6321610.00030821531.377.591380.2016286612.261400.56-9.20030.20930733.323.59831.64803281.7194.8532170.00030821531.377.591380.00467482281.3183.58731918740.0264288-3.6333
4152006AudiForeignA3シリーズ4830アトラクション2.91889GH-8PBSE12.25ハイオク5110200510.81510.0759.45168e-50.9152280.16343523.422.42020.0134458274.28251.6451.97874224.8231.4730.2079982577.222715.960.088435411.211.605116.16092391.01840.911630.0001805091.00.6240490.2553134557.361004.29-9.178150.088435411.211.60511.81531201.4209.0531180.0001805091.00.6240490.02350667.947.84971694880.0284976-3.55794
5152007AudiForeignA3シリーズ3874アトラクション2.93944GH-8PBSE12.25ハイオク5171304810.81510.0757.49134e-50.9201740.31268935.433.1110.0357225418.28365.9382.08997225.1232.3580.2309082583.732733.060.23768923.222.295916.05342382.01839.1621620.005694131.040.6395140.2528114335.921039.11-9.415990.23768923.222.29591.77728189.7199.2472170.005694131.040.6395140.024219467.0545.79411620150.0239114-3.7334

4.2 データクリーニング

data[!, :Foreign_d] = data[:, :Type] .== "Foreign";
data[!, :FuelRegular_d] = data[:, :FuelType] .== "レギュラー";
data[!, :capacity_d] = data[:, :capacity] .> 4;
transform!(
    data, 
    [
        :year => ByRow(isequal(v))=> Symbol("year_" * string(v)) 
        for v in unique(data.year)
        ]
    );
select!(data, Not(:year_2006));

4.3 ランダム係数ロジットモデルの推定

sort!(data, [:year, :Maker, :price]);
N = nrow(data);
T = length(unique(data.year));
X1 = hcat(
    ones(N),
    Matrix(
        data[:,[
            :price, :FuelEfficiency, :hppw, :size, 
            :capacity_d, :FuelRegular_d, :Foreign_d
            ]]
        ),
    Matrix(data[:, r"^year_"])    
    );
X2 = Matrix(data[:, [:price]]);
Z = hcat(
    ones(N),
    Matrix(
        data[:, [
            :FuelEfficiency, :hppw, :size, 
            :capacity_d, :FuelRegular_d, :Foreign_d
            ]]
        ),
    Matrix(data[:, r"^year_"]),
    Matrix(data[:, r"^iv_GH.*(?<!nest)$"])
    );

Random.seed!(42);
Nsim = 1000;

randomDrawMat = randn(size(X2)[2], Nsim);
marketIndex = data.year;
uniqueMarketIndex = sort(unique(data.year));

marketIndexMat = reduce(
    hcat, 
    [marketIndex .== market for market in uniqueMarketIndex]
    );

datalist = datalist_struct(
    X1, 
    X2, 
    Z, 
    data.share, 
    marketIndex, 
    data.logit_share, 
    randomDrawMat, 
    marketIndexMat
    );
parameter = parameter_struct(Nsim, T, N);
initial_x = [0.7];
delta_ini = calculateMeanUtil(initial_x, datalist, datalist.logitshare);
objFunc_for_Optim = OnceDifferentiable(
    x -> calculateGMMObjective(x, datalist, delta_ini),
    initial_x;
    autodiff = :forward
    );
@time resultGMM = optimize(
    objFunc_for_Optim,
    [0.0],
    [Inf],
    initial_x,
    Fminbox(),
    Optim.Options(show_trace = false)
)
W = inv(datalist.Z' * datalist.Z);    
delta = calculateMeanUtil(resultGMM.minimizer, datalist, delta_ini);
beta_hat = (
    (datalist.X1' * datalist.Z * W * datalist.Z' * datalist.X1) \ 
    (datalist.X1' * datalist.Z * W * datalist.Z' * delta)
);
Xi = delta - X1 * beta_hat;
Omega_hat = reduce(+, Z[i,:] * Z[i,:]' .* Xi[i]^2 ./ N for i = 1:N);
Ddelta = ForwardDiff.jacobian(
    x -> delta_ini = calculateMeanUtil(x, datalist, delta), 
    resultGMM.minimizer
    );
G = Z' * hcat(- X1, Ddelta) ./ N;
AsyVarMat = (G' * W * G) \ G' * W * Omega_hat * W * G * inv(G' * W * G);
Ase = sqrt.(diag(AsyVarMat) ./ N);
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"
        ],
    Est = vcat(beta_hat, resultGMM.minimizer),
    se = Ase
)
19×3 DataFrame
RowVarEstse
StringFloat64Float64
1Const-13.90270.568553
2Price-2.27820.660278
3Fuel Efficiency0.1966780.012633
4hppw14.67053.61249
5size0.555190.0766644
6capacity_d-0.3230590.139002
7FuelRegular_d-1.139950.292049
8Foreign_d1.043150.19486
9year_2007-0.8361530.176559
10year_2008-0.7042570.169228
11year_2009-0.8563190.169012
12year_2010-0.09763510.152402
13year_2011-0.2540890.152604
14year_2012-0.4873420.16411
15year_2013-0.6251380.166785
16year_2014-1.049740.180157
17year_2015-1.151210.179025
18year_2016-1.25020.180264
19random_price0.700290.248176
market2016Index = data.year .== 2016;
data_2016 = data[market2016Index, :];

@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 限界費用の推定

Pricevec_2016 = data_2016.price;
Sharevec_2016 = data_2016.share;

Xi_2016 = Xi[data.year .== 2016];
Ownership_2016 = data_2016.Maker .== permutedims(data_2016.Maker);
Derivative_2016 = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Delta_2016 = Derivative_2016 .* Ownership_2016;
Marginal_Cost_2016 = Pricevec_2016 - (Delta_2016 \ Sharevec_2016);
pred_mc_df = DataFrame(
    Maker = data_2016.Maker, 
    Name = data_2016.Name, 
    Price = data_2016.price,
    MC = Marginal_Cost_2016,
    Margin = (data_2016.price .- Marginal_Cost_2016) ./ data_2016.price
);
first(pred_mc_df, 10)
10×5 DataFrame
RowMakerNamePriceMCMargin
String15String31Float64Float64Float64
1AudiA3シリーズ3.282.417260.263031
2AudiA4シリーズ5.183.740930.277812
3BMWミニ2.41.70010.291626
4BMW1シリーズ3.12.271910.267127
5BMWX13.672.713450.26064
6BMW2シリーズ3.812.817960.260378
7BMW3シリーズ4.493.299240.265202
8Daihatsuミラ0.8850.3790430.571703
9Daihatsuムーヴ1.1340.6012330.469812
10Daihatsuブーン1.150.6154430.464832
histogram(pred_mc_df.Margin, bins = 40, legend = false)

4.5 合併シミュレーション

4.5.1 データの下準備

data_2016 = leftjoin(data_2016, pred_mc_df, on = ["Maker", "Name"]);
dropmissing!(data_2016);

data_2016[data_2016.Maker .== "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[!, :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";

Ownership_true = data_2016.Maker .== permutedims(data_2016.Maker);
Ownership_NippyoA = data_2016.MakerNippyoA .== permutedims(data_2016.MakerNippyoA);
Ownership_NippyoB = data_2016.MakerNippyoB .== permutedims(data_2016.MakerNippyoB);
mc = data_2016.MC;
datalist_2016 = datalist_struct(
    X1[market2016Index, :],
    X2[market2016Index, :],
    Z[market2016Index, :],
    data_2016.share,
    data_2016.year,
    data_2016.logit_share,
    datalist.randomDrawMat,
    datalist.marketIndexMat[market2016Index, :]
);
p_NippyoA = calculateEquilibriumPrice(
    datalist_2016,
    data_2016.price,
    Ownership_NippyoA,
    beta_hat,
    resultGMM.minimizer,
    mc,
    Xi_2016
);

p_NippyoB = calculateEquilibriumPrice(
    datalist_2016,
    data_2016.price,
    Ownership_NippyoB,
    beta_hat,
    resultGMM.minimizer,
    mc,
    Xi_2016
);

4.5.2 合併シミュレーションによる価格・販売台数変化

merger_sim_df = DataFrame(
    Maker = data_2016.Maker, 
    Name = data_2016.Name, 
    Price_A = (p_NippyoA .- data_2016.price) ./ data_2016.price .* 100.0,
    Share_A = (simulateMarketShare(
                datalist_2016,
                p_NippyoA,
                beta_hat,
                resultGMM.minimizer,
                Xi_2016
            ) .- data_2016.share) ./ data_2016.share .* 100.0,
    Price_B = (p_NippyoB .- data_2016.price) ./ data_2016.price .* 100.0,
    Share_B = (simulateMarketShare(
                datalist_2016,
                p_NippyoB,
                beta_hat,
                resultGMM.minimizer,
                Xi_2016
            ) .- data_2016.share) ./ data_2016.share .* 100.0,
);

merger_sim_df[in(["Nippyo", "BrandA", "BrandB", "BrandC"]).(merger_sim_df.Maker), :]
92×6 DataFrame
67 rows omitted
RowMakerNamePrice_AShare_APrice_BShare_B
String15String31Float64Float64Float64Float64
1NippyoN-WGN0.541509-1.131540.205652-0.43036
2NippyoN-ONE0.53828-1.140050.204763-0.434345
3NippyoN-BOX0.526869-1.174710.201748-0.450635
4Nippyoフィット0.523412-1.187010.200885-0.456444
5Nippyoバモス0.515992-1.217490.199145-0.4709
6Nippyoシャトル0.497664-1.351510.196526-0.5354
7Nippyoグレイス0.49624-1.374680.196691-0.546694
8Nippyoフリード0.49438-1.429580.197626-0.573601
9Nippyoヴェゼル0.49419-1.446490.198051-0.581931
10NippyoS6600.494207-1.471870.198799-0.594463
11Nippyoステップワゴン0.499161-1.601880.204403-0.659201
12NippyoCR-V0.50524-1.678130.208852-0.697482
13Nippyoジェイド0.507676-1.703120.210473-0.710059
81BrandCエスクァイア0.005198140.05002990.002336690.0204086
82BrandCハイエースワゴン0.005181980.05049960.002325830.0206358
83BrandCハリアー0.005148660.05139390.002302890.0210709
84BrandCアルファード0.00495420.05519050.002162160.0229581
85BrandCヴェルファイア0.00495420.05519050.002162160.0229581
86BrandCカムリ0.004948050.05528350.002157630.0230052
87BrandCFJクルーザー0.004927890.05558040.002142760.0231559
88BrandCエスティマ0.004907640.05586710.002127790.0233018
89BrandCSAI0.004885270.05617140.002111250.0234572
90BrandCクラウン0.004417960.06074080.001763940.0258581
91BrandCランドクルーザー0.002765480.06876540.0005327120.0304729
92BrandCセンチュリー-0.004203070.0562356-0.00342010.0171902

4.5.3 合併後に価格が変化しないような限界費用の計算

Ownership_2016_A = data_2016.MakerNippyoA .== permutedims(data_2016.MakerNippyoA);
Derivative_2016_A = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Delta_2016_A = Derivative_2016_A .* Ownership_2016_A;
mc_NippyoA_pfix = Pricevec_2016 - (Delta_2016_A \ Sharevec_2016);

Ownership_2016_B = data_2016.MakerNippyoB .== permutedims(data_2016.MakerNippyoB);
Derivative_2016_B = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Delta_2016_B = Derivative_2016_B .* Ownership_2016_B;
mc_NippyoB_pfix = Pricevec_2016 - (Delta_2016_B \ Sharevec_2016);

mc_sim_df = DataFrame(
    Maker = data_2016.Maker, 
    Name = data_2016.Name, 
    Nippyo_and_Brand_A = (mc_NippyoA_pfix .- mc) ./ mc .* 100.0,
    Nippyo_and_Brand_B = (mc_NippyoB_pfix .- mc) ./ mc .* 100.0,
);

mc_sim_df[in(["Nippyo", "BrandA", "BrandB", "BrandC"]).(mc_sim_df.Maker), :]
92×4 DataFrame
67 rows omitted
RowMakerNameNippyo_and_Brand_ANippyo_and_Brand_B
String15String31Float64Float64
1NippyoN-WGN-0.91733-0.349287
2NippyoN-ONE-0.900594-0.343475
3NippyoN-BOX-0.842563-0.323451
4Nippyoフィット-0.825194-0.317506
5Nippyoバモス-0.787848-0.304822
6Nippyoシャトル-0.685154-0.271214
7Nippyoグレイス-0.673848-0.267729
8Nippyoフリード-0.651828-0.261192
9Nippyoヴェゼル-0.646177-0.259586
10NippyoS660-0.638542-0.257483
11Nippyoステップワゴン-0.611683-0.251122
12NippyoCR-V-0.60284-0.249869
13Nippyoジェイド-0.600761-0.249749
81BrandCエスクァイア0.00.0
82BrandCハイエースワゴン0.00.0
83BrandCハリアー0.00.0
84BrandCアルファード0.00.0
85BrandCヴェルファイア0.00.0
86BrandCカムリ0.00.0
87BrandCFJクルーザー0.00.0
88BrandCエスティマ0.00.0
89BrandCSAI0.00.0
90BrandCクラウン0.00.0
91BrandCランドクルーザー0.00.0
92BrandCセンチュリー0.00.0

4.5.4 合併シミュレーションの厚生分析

CS_2016 = calculateCS(
    datalist_2016, 
    data_2016.price, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016,
    data_2016.HH[1]
);

CS_NippyoA = calculateCS(
    datalist_2016, 
    p_NippyoA, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016,
    data_2016.HH[1]
);

CS_NippyoB = calculateCS(
    datalist_2016, 
    p_NippyoB, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016,
    data_2016.HH[1]
);

CV_NippyoA = CS_NippyoA - CS_2016;
CV_NippyoB = CS_NippyoB - CS_2016;
pro_rev_2016 = calculateProfit(
    data_2016.Maker,
    data_2016.price,
    mc,
    data_2016.share,
    data_2016.HH
);
pro_rev_NippyoA = calculateProfit(
    data_2016.Maker,
    p_NippyoA,
    mc,
    simulateMarketShare(
                datalist_2016,
                p_NippyoA,
                beta_hat,
                resultGMM.minimizer,
                Xi_2016,
            ),
    data_2016.HH
);
pro_rev_NippyoB = calculateProfit(
    data_2016.Maker,
    p_NippyoB,
    mc,
    simulateMarketShare(
                datalist_2016,
                p_NippyoB,
                beta_hat,
                resultGMM.minimizer,
                Xi_2016,
            ),
    data_2016.HH
);

TS_change_NippyoA = CV_NippyoA + sum(pro_rev_NippyoA.profit - pro_rev_2016.profit);
TS_change_NippyoB = CV_NippyoB + sum(pro_rev_NippyoB.profit - pro_rev_2016.profit);
DataFrame(
    Measure = ["Consumer surplus", "Total welfare"],
    Nippyo_and_Brand_A = [CV_NippyoA, TS_change_NippyoA],
    Nippyo_and_Brand_B = [CV_NippyoB, TS_change_NippyoB],
)
2×3 DataFrame
RowMeasureNippyo_and_Brand_ANippyo_and_Brand_B
StringFloat64Float64
1Consumer surplus-11740.6-4610.7
2Total welfare-10457.5-4060.65
result_df = DataFrame(
    Maker = pro_rev_2016.Maker,
    Profits_NippyoA = pro_rev_NippyoA.profit - pro_rev_2016.profit,
    Revenue_NippyoA = pro_rev_NippyoA.revenue - pro_rev_2016.revenue,
    Profits_NippyoB = pro_rev_NippyoB.profit - pro_rev_2016.profit,
    Revenue_NippyoB = pro_rev_NippyoB.revenue - pro_rev_2016.revenue,
);

total_df = combine(result_df, 2:5 .=> sum .=> names(result_df)[2:5]);
total_df[!, :Maker] .= "Total"
append!(result_df, total_df)
16×5 DataFrame
RowMakerProfits_NippyoARevenue_NippyoAProfits_NippyoBRevenue_NippyoB
String15Float64Float64Float64Float64
1Audi11.714343.25634.8105118.5928
2BMW39.1788134.84616.362656.9962
3Daihatsu115.249224.04646.395988.9923
4Fiat1.62324.504660.671271.83475
5Lexas65.7824239.71724.6482108.337
6Matsuda63.1001164.76725.972467.0548
7Mercedes57.4933211.16721.548395.6349
8Mitsubishi21.709454.60538.902622.1991
9Suzuki120.615231.99548.531192.1837
10Volkswagen20.605564.27288.6092526.6126
11Volvo9.6295935.02144.0138914.9299
12Nippyo83.8031-9633.8144.2023-3841.84
13BrandA14.4172-10950.459.5346154.201
14BrandB58.2013166.716-12.6581-5066.24
15BrandC599.971536.03248.508629.8
16Total1283.09-17473.3550.053-7530.71

4.6 追加的なシミュレーション

costReducingFirms = ["Nippyo", "Brand_A"];
distance = 100
lambda = 1e-6;
max_cost_red = 1.0;
min_cost_red = 0.0;

iter = 1;
@time while (distance > lambda) & (iter < 100)
    
    mid_cost_red = (max_cost_red + min_cost_red) / 2.0;
    
    mid_eval = calculateTSChangeByCostReduction(
        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
        min_cost_red = mid_cost_red;
    else
        max_cost_red = mid_cost_red;
    end
    
    distance = abs(mid_eval - 0);
    iter += 1
    
end
cost_red_NippyoA = (min_cost_red + min_cost_red) / 2.0;
mc_NippyoA_TSfix = mc[:];
mc_NippyoA_TSfix[in(costReducingFirms).(data_2016.Maker)] .*= cost_red_NippyoA;
p_NippyoA_TSfix = calculateEquilibriumPrice(
    datalist_2016, 
    p_NippyoA, 
    Ownership_NippyoA, 
    beta_hat, 
    resultGMM.minimizer, 
    mc_NippyoA_TSfix, 
    Xi_2016
    );
share_NippyoA_TSfix = simulateMarketShare(
    datalist_2016, 
    p_NippyoA_TSfix, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016
    );
costReducingFirms = ["Nippyo", "Brand_B"];
distance = 100
lambda = 1e-6;
max_cost_red = 1.0;
min_cost_red = 0.0;

iter = 1;
@time while (distance > lambda) & (iter < 100)
    
    mid_cost_red = (max_cost_red + min_cost_red) / 2.0;
    
    mid_eval = calculateTSChangeByCostReduction(
        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
        min_cost_red = mid_cost_red;
    else
        max_cost_red = mid_cost_red;
    end
    
    distance = abs(mid_eval - 0);
    iter += 1
    
end
cost_red_NippyoB = (min_cost_red + min_cost_red) / 2.0;
mc_NippyoB_TSfix = mc[:];
mc_NippyoB_TSfix[in(costReducingFirms).(data_2016.Maker)] .*= cost_red_NippyoB;
p_NippyoB_TSfix = calculateEquilibriumPrice(
    datalist_2016, 
    p_NippyoB, 
    Ownership_NippyoB,
    beta_hat, 
    resultGMM.minimizer, 
    mc_NippyoB_TSfix, 
    Xi_2016
    );
share_NippyoB_TSfix = simulateMarketShare(
    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 限界費用削減をしたときの利潤と収入の変化

pro_rev_NippyoA_rc = calculateProfit(
    data_2016.Maker,
    p_NippyoA_TSfix,
    mc_NippyoA_TSfix,
    share_NippyoA_TSfix,
    data_2016.HH
);
pro_rev_NippyoB_rc = calculateProfit(
    data_2016.Maker,
    p_NippyoB_TSfix,
    mc_NippyoB_TSfix,
    share_NippyoB_TSfix,
    data_2016.HH
);

result2_df = DataFrame(
    Maker = pro_rev_2016.Maker,
    Profits_NippyoA = pro_rev_NippyoA_rc.profit - pro_rev_2016.profit,
    Revenue_NippyoA = pro_rev_NippyoA_rc.revenue - pro_rev_2016.revenue,
    Profits_NippyoB = pro_rev_NippyoB_rc.profit - pro_rev_2016.profit,
    Revenue_NippyoB = pro_rev_NippyoB_rc.revenue - pro_rev_2016.revenue,
);

total2_df = combine(result2_df, 2:5 .=> sum .=> names(result2_df)[2:5]);
total2_df[!, :Maker] .= "Total";
append!(result2_df, total2_df)
16×5 DataFrame
RowMakerProfits_NippyoARevenue_NippyoAProfits_NippyoBRevenue_NippyoB
String15Float64Float64Float64Float64
1Audi0.7932960.2017250.5825271.91046
2BMW1.30464-0.2816611.692094.62644
3Daihatsu-2.32447-5.485570.798129-0.0426312
4Fiat-0.0129613-0.0823010.03699780.0560639
5Lexas10.4044-3.421163.2379814.1655
6Matsuda-0.530124-2.951591.304372.0182
7Mercedes8.89116-3.778242.7548512.3406
8Mitsubishi-0.208908-0.9823140.4048970.643476
9Suzuki-2.43621-5.654510.8084160.000309139
10Volkswagen0.103842-0.7637240.6640131.39932
11Volvo0.4624780.09815850.4639321.3971
12Nippyo10318.311771.13965.294405.35
13BrandA-134.893-11555.43.094645.4871
14BrandB-0.0324358-2.34412-35.68-5169.25
15BrandC1.32803-25.897616.480524.1591
16Total10201.1164.3873961.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