View source: R/psm_weighted_functions.R
psm_analysis_weighted | R Documentation |
psm_analysis_weighted()
performs a weighted analysis
of consumer price preferences and price sensitivity known as
van Westendorp Price Sensitivity Meter (PSM). The function
requires a sample design from the survey package as the
main input. Custom weights or sample designs from other packages
are not supported.
To run a PSM analysis without weighting, use the function
psm_analysis
.
psm_analysis_weighted(
toocheap, cheap, expensive, tooexpensive,
design,
validate = TRUE,
interpolate = FALSE,
interpolation_steps = 0.01,
intersection_method = "min",
acceptable_range = "original",
pi_cheap = NA, pi_expensive = NA,
pi_scale = 5:1,
pi_calibrated = c(0.7, 0.5, 0.3, 0.1, 0),
pi_calibrated_toocheap = 0, pi_calibrated_tooexpensive = 0
)
toocheap , cheap , expensive , tooexpensive |
Names of the variables in the data.frame/matrix that contain the survey data on the respondents' "too cheap", "cheap", "expensive" and "too expensive" price preferences. If the |
design |
A survey design which has been created by the
function |
validate |
logical. should only respondents with consistent price preferences (too cheap < cheap < expensive < too expensive) be considered in the analysis? |
interpolate |
logical. should interpolation of the price curves be applied between the actual prices given by the respondents? If interpolation is enabled, the output appears less bumpy in regions with sparse price information. If the sample size is sufficiently large, interpolation should not be necessary. |
interpolation_steps |
numeric. if |
intersection_method |
"min" (default), "max", "mean" or "median". defines the method how to determine the price points (range, indifference price, optimal price) if there are multiple possible intersections of the price curves. "min" uses the lowest possible prices, "max" uses the highest possible prices, "mean" calculates the mean among all intersections and "median" uses the median of all possible intersections |
acceptable_range |
"original" (default) or "narrower". Defines which intersection is used to calculate the point of marginal cheapness and point of marginal expensiveness, which together form the range of acceptable prices. "original" uses the definition provided in van Westendorp's paper: The lower end of the price range (point of marginal cheapness) is defined as the intersection of "too cheap" and the inverse of the "cheap" curve. The upper end of the price range (point of marginal expensiveness) is defined as the intersection of "too expensive" and the inverse of the "expensive" curve. Alternatively, it is possible to use a "narrower" definition which is applied by some market research companies. Here, the lower end of the price range is defined as the intersection of the "expensive" and the "too cheap" curves and the upper end of the price range is defined as the intersection of the "too expensive" and the "cheap" curves. This leads to a narrower range of acceptable prices. Note that it is possible that the optimal price according to the Newton/Miller/Smith extension is higher than the upper end of the acceptable price range in the "narrower" definition. |
pi_cheap , pi_expensive |
Only required for the Newton Miller Smith extension. Names of the variables in the data that contain the survey data on the respondents' purchase intent at their individual cheap/expensive price. |
pi_scale |
Only required for the Newton Miller Smith extension. Scale of the purchase intent variables pi_cheap and pi_expensive. By default assuming a five-point scale with 5 indicating the highest purchase intent. |
pi_calibrated |
Only required for the Newton Miller Smith extension. Calibrated purchase probabilities that are assumed for each value of the purchase intent scale. Must be the same order as the pi_scale variable so that the first value of pi_calibrated corresponds to the first value in the pi_scale variable. Default values are taken from the Sawtooth Software PSM implementation in Excel: 70% for the best value of the purchase intent scale, 50% for the second best value, 30% for the third best value (middle of the scale), 10% for the fourth best value and 0% for the worst value. |
pi_calibrated_toocheap , pi_calibrated_tooexpensive |
Only required for the Newton Miller Smith extension. Calibrated purchase probabilities for the "too cheap" and the "too expensive" price, respectively. Must be a value between 0 and 1; by default set to zero following the logic in van Westendorp's paper. |
The main logic of the Price Sensitivity Meter Analysis is
explained in the documentation of the psm_analysis
function. The psm_analysis_weighted
performs the same
analysis, but weights the survey data according to a known
population.
The function output consists of the following elements:
data_input : |
|
validated : |
|
invalid_cases : |
|
total_sample : |
|
data_vanwestendorp : |
|
pricerange_lower : |
|
pricerange_upper : |
|
idp : |
|
opp : |
|
weighted : |
|
survey_design : |
|
NMS : |
|
Van Westendorp, P (1976) "NSS-Price Sensitivity Meter (PSM) – A new approach to study consumer perception of price" Proceedings of the ESOMAR 29th Congress, 139–167. Online available at https://archive.researchworld.com/a-new-approach-to-study-consumer-perception-of-price/.
Newton, D, Miller, J, Smith, P, (1993) "A market acceptance extension to traditional price sensitivity measurement" Proceedings of the American Marketing Association Advanced Research Techniques Forum.
Sawtooth Software (2016) "Templates for van Westendorp PSM for Lighthouse Studio and Excel". Online available at https://sawtoothsoftware.com/resources/software-downloads/tools/van-westendorp-price-sensitivity-meter
# assuming a skewed sample with only 1/3 women and 2/3 men
input_data <- data.frame(tch = round(rnorm(n = 250, mean = 8, sd = 1.5), digits = 2),
ch = round(rnorm(n = 250, mean = 12, sd = 2), digits = 2),
ex = round(rnorm(n = 250, mean = 13, sd = 1), digits = 2),
tex = round(rnorm(n = 250, mean = 15, sd = 1), digits = 2),
gender = sample(x = c("male", "female"),
size = 250,
replace = TRUE,
prob = c(2/3, 1/3)))
# ... and in which women have on average 1.5x the price acceptance of men
input_data$tch[input_data$gender == "female"] <- input_data$tch[input_data$gender == "female"] * 1.5
input_data$ch[input_data$gender == "female"] <- input_data$ch[input_data$gender == "female"] * 1.5
input_data$ex[input_data$gender == "female"] <- input_data$ex[input_data$gender == "female"] * 1.5
input_data$tex[input_data$gender == "female"] <- input_data$tex[input_data$gender == "female"] * 1.5
# creating a sample design object using the survey package
# ... assuming that gender is balanced equally in the population of 10000
input_data$gender_pop <- 5000
input_design <- survey::svydesign(ids = ~ 1, # no clusters
probs = NULL, # hence no cluster samling probabilities,
strata = input_data$gender, # stratified by gender
fpc = input_data$gender_pop, # strata size in the population
data = input_data)
# data object used as input: no need to specify single variables
output_weighted_psm <- psm_analysis_weighted(toocheap = "tch",
cheap = "ch",
expensive = "ex",
tooexpensive = "tex",
design = input_design)
summary(output_weighted_psm)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.