Multiple Criteria Assignment

The Kemper Corporation

Heather Schulz

April 7, 2008

 

Table of Contents:

Situation Analysis

Methodology

Specification

Estimation and Validation

Prediction

Proposed Budget

 

 

Situation Analysis

Solonex, Inc., a division of the Kemper Corporation, has manufactured and distributed laundry detergent using the brand name Solclean since 1979.  However, in recent years the laundry detergent market has become saturated with less expensive brands, which has had a negative effect on Solclean sales.  As a result, the brand manager for Solonex has decided to stop producing Solclean, and instead introduce Solonex’s own version of an inexpensive laundry detergent, called Solo Liquid Laundry Detergent.

Kemplar, the parent corporation, has required Solonex’s brand manager to provide both short-term and long-term projections before it will sign off on the new product.  Here, short term is defined as one quarter of the fiscal year (13 weeks), while long term is defined as three years.  The brand manager is also required to provide the recommended advertising expenditures.

The process the brand manager went through in order to reach her conclusions are explained below, and the recommendations and projections for the future are explained in the conclusion section.

(Back to Table of Contents)

 

Methodology

Short-Term Projections

Since Solo Liquid Laundry Detergent is a new brand, no sales or advertising expenditure data from previous quarters exist to consult in a time series analysis.  Therefore, the brand manager decided to utilize data showing several other market factors from the introductory stages of other brands in a multiple criteria analysis.

KTL, the advertising agency that works on the Solclean account was able to provide the Solonex brand manager with data for introductory period (i.e. first quarter) of 18 brands in the convenience goods product category.  This data consisted of some brands that became commercial successes, and other brands that were commercial failures.  This data is depicted below:

Next, the brand manager decided to utilize the following theory about market response to brand introductions (which was created by N. W. Ayer and published in the Journal of Marketing Research) in order to build a statistical model to predict short-term market criteria:

BA = f (DAR,AF)

IP = f (BA,DN,PK,FB,CU)

RR = f (IP,PS,PF,RP)

MS = f (RR)

Where:

f = function

BA = Brand Awareness

DAR = Day After Recall

AF = Average Frequency

IP = Initial Purchase Rate

DN = Distribution

PK = Quality of Packaging

FB = Family Brand Name

CU = Consumers Using

RR = Repeat Purchase Response

PS = Product Satisfaction

PF = Purchase Frequency

RP = Relative Price

MS = Market Share

(Back to Table of Contents)

 

 

Specification

Five current effects functions were applied to each step of the above-mentioned theory (BA, IP, RR, MS) in order to determine which one produced the best fit to the data, and therefore which had the lowest percentage of error.  As one can see, each step in the theory has the potential to utilize a different current effects model.

Current Effects Functions:

 

(Back to Table of Contents)

 

 

Estimation and Validation

Since the estimation potential of these current effects models is needed, these models were only applied to the first 16 brands.  Then, using a procedure called “post-diction” the last two brands (Purex and Reef) were utilized to test the prediction abilities for each model. 

The table below displays the “winning” current effects models for each step in the theory.  The APE denotes the post-diction effectiveness of each model.

 

 

Using the above parameter estimates, the following formulas will be utilized in the market share model to predict short-term market criteria:

BA = 60/(1+e^–(-2.443+0.011(DAR*AF)) )

IP = 55/(1+e^–(-3.301+(0.026*BA)+(0.002*(DN*PK))+(-0.145*FB)+(0.028*CU)) )

RR = 1.149+(2.768*ln(IP))+(-0.0309*ln(PS))+(0.836*ln(PF))+(0.585*ln(RP))

MS = -11.364+(1.892*RR)

Long-Term Projections

In order to predict long-term criteria, the market predicted market share will be integrated into the following net-profit function and overall value functions:

Net Profit Function

NP = GM – AM – D – A

GM = S – CGS

CGS = SU * C

S = SU * P

SU = MS * I

D = TD/Y

TD = O – R

O = SV3 * CPU

R = ARV * O

Where:

NP = Net Profit

GM = Gross Margin

AM = Administration and Marketing Expenses
(Year 1 = $22,731,000, with a 3% annual increase)

D = Depreciation

A = Advertising in dollars

S = Sales in dollars (expected annual increase = 5%)

CGS = Cost per Goods Sold (expected annual increase = 5%)

SU = Sales in Units

C = Cost per case ($13.61)

P = Price ($28.30)

MS = Market Share

I = Industry Sales ($14,335,000)

TD = Total Depreciation

Y = Number of Years the Depreciation will be Spread Out Over (# = 3)

O = Original Value of the Plant

R = Residual Value of the Plant

SV3 = Sales Volume for Year 3 (i.e. highest expected amount of sales)

CPU = Cost per Unit to Remodel Plant ($2.50)

ARV = Assumed Residual Value (50% or 0.5)

 

 

Overall Value Functions

PV = NP1 * (1/0.08^1) + NP2 * (1/0.08^2) + NP3 * (1/0.08^3)

NPV = PV – R

NPC = NP1 + NP2 + NP3

Where:

PV = Present Value

NP1 = Net Profits for Year 1

NP2 = Net Profits for Year 2

NP3 = Net Profits for Year 3

NPV = Net Present Value

R = Residual Value of the Plant

NPC = Net Profit Cumulated over 3 Years

(Back to Table of Contents)

 

 

Prediction

The above market share model, net profit function and overall value functions have been integrated into the following Java applet:

 

(Click here to see Java code)

Next, the brand manager was able to obtain data from KTL of the first quarter day after recall (DAR) scores and average frequency (AF) scores along with the annual media schedule costs (which have been updated to 2008) for 10 cleaning products.  This data is depicted below:

 

 

An analysis was conducted utilizing the ten possible instances depicted above in order to determine a recommended amount of advertising expenditures.  From this analysis, two of the best performing instances will be compared, and then one will be recommended for implementation.

The results of all ten instances are displayed below:

 

As one can see in the bolded text, Instances 8 and 9 resulted in the two highest scores for both short-term and long term criteria.  The Java output for Instances 8 and 9 can be seen below:

 

 

 

As one can see, Instance 8 unanimously predicted the highest percentages for all short-term criteria, as well as predicted the highest dollar amount for all long-term criteria.

(Back to Table of Contents)

 

 

Conclusions: Proposed Budget

From the above analysis, the brand manager is recommending that $16.64 million should be spent on advertising during the first year for the introduction of the new product Solo Liquid Laundry Detergent.  This amount should produce the following results:

 

(Back to Table of Contents)

 

 

Code for Java applet:

package multiple_criteria;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.text.*;
import java.lang.*;
import javax.swing.*;
import java.util.*;

/**
* <p>Title: Multiple Criteria Budgeting Model</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author J.D.Leckenby
* @version 1.0
*/

 

public class multiple_criteria extends Applet {

 

  NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.getDefault());
NumberFormat notcurrency = NumberFormat.getInstance(Locale.getDefault());

 

  double ba,dar,af,ip,dn,pk,fb,cu,rr,ps,pf,rp,ms;

  double salesvol,salesvol3,salesdol1,salesdol2,salesdol3,cgs1,cgs2,cgs3;

  double gm1,gm2,gm3,x1,x2,x3,admin1,admin2,admin3;

  double cplant,resid,totdep,dept,adv1,adv2,adv3,y1,y2,y3,np1,np2,np3,z1,z2,z3,pv,npv,np,dep,adv;

 

 

  private boolean isStandalone = false;
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JTextField jTextFieldDar = new JTextField();
JTextField jTextFieldAf = new JTextField();
JTextField jTextFieldPk = new JTextField();
JTextField jTextFieldDn = new JTextField();
JTextField jTextFieldFb = new JTextField();
JTextField jTextFieldCu = new JTextField();
JTextField jTextFieldPs = new JTextField();
JTextField jTextFieldPf = new JTextField();
JTextField jTextFieldRp = new JTextField();
JTextField jTextFieldAdv = new JTextField();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel5 = new JLabel();
JLabel jLabel6 = new JLabel();
JLabel jLabel7 = new JLabel();
JLabel jLabel8 = new JLabel();
JLabel jLabel9 = new JLabel();
JLabel jLabel10 = new JLabel();
JLabel jLabel11 = new JLabel();
JLabel jLabel12 = new JLabel();
JLabel jLabel13 = new JLabel();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextAreaResults = new JTextArea();
JButton jButtonGo = new JButton();
JLabel jLabel14 = new JLabel();
JTextField jTextFieldAdv2 = new JTextField();
JLabel jLabel15 = new JLabel();
JTextField jTextFieldAdv3 = new JTextField();
JLabel jLabel16 = new JLabel();
//Get a parameter value
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}

  //Construct the applet
public multiple_criteria() {
}
//Initialize the applet
public void init() {

 

 

    try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception {
jLabel1.setBackground(Color.gray);
jLabel1.setFont(new java.awt.Font("Dialog", 1, 24));
jLabel1.setBorder(BorderFactory.createLoweredBevelBorder());
jLabel1.setDebugGraphicsOptions(0);
jLabel1.setText("Multiple Criteria Budgeting Model");
jLabel1.setBounds(new Rectangle(220, 5, 392, 36));
this.setBackground(SystemColor.text);
this.setLayout(null);
jLabel2.setFont(new java.awt.Font("Dialog", 1, 16));
jLabel2.setText("Inputs:");
jLabel2.setBounds(new Rectangle(42, 75, 63, 29));
jTextFieldDar.setText("");
jTextFieldDar.setBounds(new Rectangle(108, 169, 70, 16));
jTextFieldAf.setText("");
jTextFieldAf.setBounds(new Rectangle(108, 194, 70, 16));
jTextFieldPk.setBounds(new Rectangle(108, 221, 70, 16));
jTextFieldPk.setText("7.0");
jTextFieldDn.setBounds(new Rectangle(108, 245, 70, 16));
jTextFieldDn.setText("50");
jTextFieldFb.setBounds(new Rectangle(108, 266, 70, 16));
jTextFieldFb.setText("1");
jTextFieldCu.setBounds(new Rectangle(108, 292, 70, 16));
jTextFieldCu.setText("77.4");
jTextFieldPs.setBounds(new Rectangle(108, 314, 70, 16));
jTextFieldPs.setText("55.1");
jTextFieldPf.setBounds(new Rectangle(108, 335, 70, 16));
jTextFieldPf.setText("2.1");
jTextFieldRp.setBounds(new Rectangle(108, 357, 70, 16));
jTextFieldRp.setText(".82");
jTextFieldAdv.setText("");
jTextFieldAdv.setBounds(new Rectangle(108, 148, 70, 16));
jLabel3.setText("DAR");
jLabel3.setBounds(new Rectangle(44, 171, 57, 15));
jLabel4.setText("PK");
jLabel4.setBounds(new Rectangle(45, 220, 57, 15));
jLabel5.setBounds(new Rectangle(45, 193, 57, 15));
jLabel5.setText("AF");
jLabel6.setBounds(new Rectangle(44, 245, 57, 15));
jLabel6.setText("DN");
jLabel7.setBounds(new Rectangle(44, 269, 57, 15));
jLabel7.setText("FB");
jLabel8.setBounds(new Rectangle(45, 295, 57, 15));
jLabel8.setText("CU");
jLabel9.setBounds(new Rectangle(44, 314, 57, 16));
jLabel9.setText("PS");
jLabel10.setBounds(new Rectangle(44, 338, 57, 15));
jLabel10.setText("PF");
jLabel11.setBounds(new Rectangle(44, 361, 57, 15));
jLabel11.setText("RP");
jLabel12.setBounds(new Rectangle(44, 148, 57, 15));
jLabel12.setText("ADV$ YR 1");
jLabel13.setBounds(new Rectangle(206, 74, 164, 29));
jLabel13.setText("Projected Results:");
jLabel13.setFont(new java.awt.Font("Dialog", 1, 16));
jScrollPane1.setBounds(new Rectangle(205, 118, 655, 435));
jTextAreaResults.setText("");
jButtonGo.setBounds(new Rectangle(53, 495, 134, 31));
jButtonGo.setText("Execute");
jButtonGo.addActionListener(new multiple_criteria_jButtonGo_actionAdapter(this));
jLabel14.setText("ADV YR 2");
jLabel14.setBounds(new Rectangle(45, 385, 57, 15));
jTextFieldAdv2.setText("");
jTextFieldAdv2.setBounds(new Rectangle(107, 384, 70, 16));
jLabel15.setText("ADV YR 3");
jLabel15.setBounds(new Rectangle(46, 409, 57, 15));
jTextFieldAdv3.setText("");
jTextFieldAdv3.setBounds(new Rectangle(108, 410, 70, 16));
jLabel16.setVerifyInputWhenFocusTarget(true);
jLabel16.setHorizontalAlignment(SwingConstants.LEADING);
jLabel16.setHorizontalTextPosition(SwingConstants.TRAILING);
jLabel16.setText("(Input ADV in millions)");
jLabel16.setVerticalAlignment(SwingConstants.CENTER);
jLabel16.setVerticalTextPosition(SwingConstants.CENTER);
jLabel16.setBounds(new Rectangle(43, 105, 134, 33));
this.add(jLabel1, null);
this.add(jLabel2, null);
this.add(jScrollPane1, null);
this.add(jButtonGo, null);
this.add(jLabel13, null);
this.add(jTextFieldFb, null);
this.add(jLabel12, null);
this.add(jTextFieldAdv3, null);
this.add(jTextFieldAdv2, null);
this.add(jLabel15, null);
this.add(jLabel14, null);
this.add(jLabel11, null);
this.add(jLabel10, null);
this.add(jLabel9, null);
this.add(jLabel8, null);
this.add(jLabel6, null);
this.add(jLabel7, null);
this.add(jLabel4, null);
this.add(jLabel5, null);
this.add(jLabel3, null);
this.add(jTextFieldAdv, null);
this.add(jTextFieldDar, null);
this.add(jTextFieldAf, null);
this.add(jTextFieldPk, null);
this.add(jTextFieldDn, null);
this.add(jTextFieldCu, null);
this.add(jTextFieldPs, null);
this.add(jTextFieldPf, null);
this.add(jTextFieldRp, null);
this.add(jLabel16, null);
jScrollPane1.getViewport().add(jTextAreaResults, null);
}
//Get Applet information
public String getAppletInfo() {
return "Applet Information";
}
//Get parameter info
public String[][] getParameterInfo() {
return null;
}

  void jButtonGo_actionPerformed(ActionEvent e) {

    //get the input values from the TextField(s)

    dar = (Double.valueOf(jTextFieldDar.getText())).doubleValue();
af = (Double.valueOf(jTextFieldAf.getText())).doubleValue();
dn = (Double.valueOf(jTextFieldDn.getText())).doubleValue();
pk = (Double.valueOf(jTextFieldPk.getText())).doubleValue();
cu = (Double.valueOf(jTextFieldCu.getText())).doubleValue();
ps = (Double.valueOf(jTextFieldPs.getText())).doubleValue();
pf = (Double.valueOf(jTextFieldPf.getText())).doubleValue();
rp = (Double.valueOf(jTextFieldRp.getText())).doubleValue();

    adv = (Double.valueOf(jTextFieldAdv.getText())).doubleValue();
adv2 = (Double.valueOf(jTextFieldAdv2.getText())).doubleValue();
adv3 = (Double.valueOf(jTextFieldAdv3.getText())).doubleValue();

    //below are the three-short term functions

    ba = 60/1+Math.exp-(-2.443+(0.011*(DAR*AF)))

    ip = 55/1+Math.exp-(-.301+(0.026*BA)+(0.002*(DN*PK))+(0.145*FB)+(0.028*CU))

    rr = 1.149+(2.768*Math.log(IP))+(-0.0309*Math.log(PS))+(0.836*Math.log(PF))+(0.585*Math.log(RP))

    ms = -11.364+(1.892*RR)

 

    //below are financial calculations

    salesvol = 14335000 * ms/100.0;

    salesdol1 = 28.30 * salesvol;

    salesdol2 = salesdol1 * 1.05;

    salesdol3 = salesdol2 * 1.05;

    cgs1 = 13.61 * salesvol;

    cgs2 = cgs1 * 1.05;

    cgs3 = cgs2 * 1.05;

    gm1 = salesdol1 - cgs1;

    gm2 = salesdol2 - cgs2;

    gm3 = salesdol3 - cgs3;

    x1 = (gm1/salesdol1) * 100.0;

    x2 = (gm2/salesdol2) * 100.0;

    x3 = (gm3/salesdol3) * 100.0;

    admin1 = 22731000;

    admin2 = admin1 * 1.03;

    admin3 = admin2 * 1.03;

    salesvol3 = salesvol * 1.05 * 1.05;

    cplant = salesvol3 * 2.5;

    resid = .5 * cplant;

    totdep = cplant - resid;

    dep = totdep/3.0;

    adv1 = adv;

    //adv2 = adv1 * .68;

    //adv3 = adv2 * .63;

    y1 = (adv1/salesdol1) * 100.0;

    y2 = (adv2/salesdol2) * 100.0;

    y3 = (adv3/salesdol3) * 100.0;

    np1 = gm1 - admin1 - dep - adv1;

    np2 = gm2 - admin2 - dep - adv2;

    np3 = gm3 - admin3 - dep - adv3;

    z1 = (np1/salesdol1) * 100.0;

    z2 = (np2/salesdol2) * 100.0;

    z3 = (np3/salesdol3) * 100.0;

    pv = np1 * (1.0/1.08) + np2 * (1.0/Math.pow(1.08,2)) + np3 * (1.0/Math.pow(1.08,3));

    npv = pv - resid;

    np = np1 + np2 + np3;

    //ready to go to output

    //short-term output first

 

    jTextAreaResults.append("\n\n\n\n\nProjected Short-Term Results for Solo");
jTextAreaResults.append("\n\n\nBrand Awareness:  " + notcurrency.format(ba) + "%");
jTextAreaResults.append("\nInitial Purchase Rate:  " + notcurrency.format(ip) + "%");
jTextAreaResults.append("\nRepeat Purchase Rate:  " + notcurrency.format(rr) + "%");
jTextAreaResults.append("\nMarket Share:  " + notcurrency.format(ms) + "%");

 

    //now, long-term output

    jTextAreaResults.append("\n\n\n\nProjected Long-Term Financial Statement");
jTextAreaResults.append("\n\n\t                 2005                2006                  2007");

    jTextAreaResults.append("\n\n===================================================================================");

    jTextAreaResults.append("\n\nSales" + "\t\t" + nf.format(salesdol1) + "\t\t" + nf.format(salesdol2) + "\t\t" + nf.format(salesdol3));
jTextAreaResults.append("\nc.g.s." + "\t\t" + nf.format(cgs1) + "\t\t" + nf.format(cgs2) + "\t\t" + nf.format(cgs3));

    jTextAreaResults.append("\n\t\t__________________\t__________________\t___________________");

    jTextAreaResults.append("\nGM" + "\t\t" + nf.format(gm1) + "\t\t" + nf.format(gm2) + "\t\t" + nf.format(gm3));
jTextAreaResults.append("\nAdmin/Mktg" + "\t" + nf.format(admin1) + "\t\t" + nf.format(admin2) + "\t\t" + nf.format(admin3));
jTextAreaResults.append("\nDepreciation" + "\t" + nf.format(dep) + "\t\t" + nf.format(dep) + "\t\t" + nf.format(dep));
jTextAreaResults.append("\nADV" + "\t\t" + nf.format(adv1 * 1.0e6)  + "\t\t" + nf.format(adv2 * 1.0e6)  + "\t\t" + nf.format(adv3 * 1.0e6));

    jTextAreaResults.append("\n\t\t__________________\t__________________\t___________________");

    jTextAreaResults.append("\nNet Profit" + "\t" + nf.format(np1) + "\t\t" + nf.format(np2) + "\t\t" + nf.format(np3));

    //now output the present value indicators

    jTextAreaResults.append("\n\n\nPresent Value:\t" + nf.format(pv));
jTextAreaResults.append("\nNet Present Value:\t" + nf.format(npv));
jTextAreaResults.append("\nNet Profit 3 Years Cume:\t" + nf.format(np));

 

 

 

 

  }
}

class multiple_criteria_jButtonGo_actionAdapter implements java.awt.event.ActionListener {
multiple_criteria adaptee;

  multiple_criteria_jButtonGo_actionAdapter(multiple_criteria adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButtonGo_actionPerformed(e);
}
}