FlexiConnect: A Conjoint Analysis of Consumer Preferences for Flexible Service Plans

EMSE 6035 Final Report

Author

Harish Kommana, Lakshana Ananthakrishnan Prabhakar, Girish Kumar Naragani, and Samuel Asiedu Boateng

Published

December 5, 2025

Write your report content here.

Make sure you update the settings in the YAML for your report.

Use markdown for formatting, e.g.: Bold, Italic, etc.

Here are some section headers to use:

Write your report content here.

Make sure you update the settings in the YAML for your report.

Use markdown for formatting, e.g.: Bold, Italic, etc.

Here are some section headers to use:

Abstract

This study explores consumer preferences for FlexiConnect, a proposed on-demand mobile data service that allows users to pay only for the access they need. Our experiment examined four features of the product that could influence adoption: the price of a session, the length of the session, the presence of peak period pricing, and the timeout setting that controls accidental overuse. The results show that users place the greatest value on longer sessions and react strongly against any form of peak pricing. Timeout settings matter as well, but to a much smaller degree. Based on these findings, we recommend designing FlexiConnect around longer, more flexible session durations and avoiding peak period surcharges. The evidence also suggests tailoring offerings for different user groups, since sensitivity to pricing and duration varies across respondents.

Introduction

FlexiConnect is a new concept for an on demand mobile data service that allows users to access the internet only when they need it and pay accordingly. The idea grew out of a simple observation that many people pay for monthly plans they barely use, even though their actual data needs are often short and irregular. This motivated our interest in studying how consumers respond to a service built around brief, flexible sessions rather than traditional fixed plans. To guide the design of such a product, we focused on four features that are likely to influence adoption. These include the price of each session, the length of time the user can stay connected, the presence of higher charges during busy periods, and the timeout setting that prevents unintentional overuse. These attributes formed the basis of our survey and allowed us to evaluate the tradeoffs consumers make when choosing between different versions of the service. An image of the FlexiConnect service is included below

Survey Design

Eligibility Requirements

To ensure that the survey reflected the population most likely to consider an on demand mobile data product, we included a short set of screening questions at the beginning of the instrument. Respondents had to confirm that they were at least eighteen years of age, owned a smartphone, and currently used a mobile data plan of some kind. They also had to indicate that they personally pay for their mobile plan rather than relying entirely on family coverage plans. These requirements helped us focus on individuals who make their own decisions about mobile services and therefore could provide meaningful trade offs in the choice questions.

Respondent Information Collected

After screening, we collected a small set of items to understand how respondents use their mobile service and to place their choices in context. The key usage question asked whether they pay for their plan themselves, which allowed us to compare the preferences of subscribers and non subscribers. We also asked when they most often use mobile data during the day, since time of use relates to peak pricing. At the end of the survey, we gathered basic demographic information including age group and household income. These items allowed us to explore whether preferences differ across broad segments of the market.

Educational Material

Before respondents reached the choice tasks, we presented a short explanation of how the FlexiConnect service works. This page described the idea of paying only when data access is needed and clarified how each attribute should be interpreted. The text explained the price of each session, the length of the access period, the meaning of peak period pricing, and the purpose of the timeout setting. The goal was to give every respondent a clear understanding of the service since many are accustomed only to monthly plans. This ensured that their choices reflected thoughtful comparisons rather than confusion about the product concept.

Conjoint Choice Design

The conjoint experiment centered on four attributes that represent the main design variables for FlexiConnect. These were the cost of each access session, the duration of the session, the peak hour multiplier that may apply during busy periods, and the timeout setting that prevents unintended use. These attributes were chosen because they capture the essential tradeoffs a consumer would face when deciding between alternative versions of an on demand data service.

Each respondent answered six choice questions, and each question contained three alternative service plans. Every alternative displayed a combination of attribute levels drawn from a balanced design so that each feature appeared in many different contexts. The table below summarizes the attributes and levels used in the final survey.

Attributes table

Show code
library(tidyverse)
library(knitr)
library(kableExtra)

attributes_table <- tibble(
  Attribute = c("Cost", "Duration", "Peak Period Multiplier", "Timeout"),
  Description = c(
    "Price per access session",
    "Length of access in minutes",
    "Pricing factor during high demand hours",
    "Grace period before automatic cutoff"
  ),
  Levels = c(
    "$0.05, $0.10, $2.00",
    "15, 30, 60, 120 minutes",
    "1.0, 1.5, 2.0",
    "5, 15, 30 minutes"
  ),
  Units = c("Dollars", "Minutes", "Multiplier", "Minutes")
)

kable(attributes_table, align = "llll",
      caption = "Attributes and Levels Used in the Final Conjoint Survey") |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Attributes and Levels Used in the Final Conjoint Survey
Attribute Description Levels Units
Cost Price per access session $0.05, $0.10, $2.00 Dollars
Duration Length of access in minutes 15, 30, 60, 120 minutes Minutes
Peak Period Multiplier Pricing factor during high demand hours 1.0, 1.5, 2.0 Multiplier
Timeout Grace period before automatic cutoff 5, 15, 30 minutes Minutes

Changes from Pilot to Final Survey

The pilot survey revealed a few areas that needed refinement before launching the final version. Several respondents in the pilot misunderstood the purpose of the peak period multiplier, so we clarified this explanation in the educational section. We also strengthened the screening questions to remove respondents who did not pay for their own mobile plan since their preferences did not match the target audience. Small formatting changes were made to the appearance of the choice cards to improve readability. The underlying choice design was also improved to achieve better attribute balance and reduce overlap.

Example Choice Question

A sample choice question from the final survey is shown below. Each respondent viewed a similar set of three alternatives and selected the one they preferred. This format allowed us to measure how people make trade offs across price, session length, peak hour pricing, and timeout settings.

Data Analysis

Sample Description

The final analytic dataset includes 213 people who completed the full set of stated choice questions. Each respondent evaluated six choice tasks with three alternatives per task, yielding a total of 1278 completed choice observations and 3834 alternative-level rows in the estimation dataset.

The survey collected a small set of background variables that were used to segment respondents according to their familiarity with mobile data plans. One of the key questions asked whether the respondent currently pays for a mobile data plan, since we expected preferences to differ between active data plan users and those without regular subscriptions.

Load final choice data

Show code
data <- read_csv(here("data", "choice_data.csv"), show_col_types = FALSE)

n_respondents <- data %>% distinct(rid) %>% nrow()
n_choice_tasks <- data %>% distinct(rid, qID) %>% nrow()
n_alt_rows <- nrow(data)

Respondent Breakdown

This distribution provides a useful way to understand how consumer preferences may vary between respondents who actively manage a data plan and those who do not. Additional demographic questions were collected in the raw survey, but only the variables relevant to our modeling were used directly in the analysis.

Code

Show code
demo_summary <- data %>%
distinct(rid, .keep_all = TRUE) %>%
count(pay_plan) %>%
mutate(percent = round(n / sum(n) * 100, 1)) %>%
rename(`Payment Plan Status` = pay_plan,
Count = n,
`Percent (%)` = percent)

kable(demo_summary,
caption = "Distribution of Respondents by Payment Plan Status",
align = "lrr") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
Distribution of Respondents by Payment Plan Status
Payment Plan Status Count Percent (%)
no 26 12.2
no_plan 1 0.5
yes 167 78.4
NA 19 8.9

Data Cleaning

The raw dataset contained both complete and partial responses. We removed respondents who did not finish all six choice tasks, since incomplete response patterns do not allow consistent estimation of choice probabilities. We also checked for missing values, duplicated entries created by accidental browser refreshes, and inconsistent choice-task identifiers.

After applying these filters, we retained 213 complete respondents for the final estimation dataset. No speed checks were required because the conjoint choice format forces respondents to interact with each page before progressing.

Modeling

To analyze respondent choices, we estimated three related models that build on the same underlying utility framework. The first model is a simple multinomial logit specification that includes all four product attributes: cost, duration, peak multiplier, and timeout. This provides a baseline understanding of how each attribute influences the probability of choosing a service configuration.

We then estimated a mixed logit model to account for differences in preferences across respondents. In this specification, the coefficients for duration, peak pricing, and timeout were allowed to vary normally across individuals, while the cost coefficient was held fixed to enable the later calculation of willingness to pay. The mixed logit improves model fit and reveals the extent of preference heterogeneity in the sample.

Finally, we estimated two subgroup-specific multinomial logit models based on whether respondents reported that they currently use a payment plan. This created a “yes” subgroup (n = 1002 choices) and a “no” subgroup (n = 162 choices). Comparing these models allowed us to identify how sensitivities differ between subscribers and non-subscribers, particularly in terms of cost and peak pricing.

Utility Specification

The baseline model used in this analysis is a multinomial logit model where the utility that respondent n assigns to alternative j is specified as:

\[ U_{nj} = \beta_{cost} \cdot Cost_j + \beta_{duration} \cdot Duration_j + \beta_{peak} \cdot Peak_j + \beta_{timeout} \cdot Timeout_j + \varepsilon_{nj} \] Here,

Cost represents the price of the access session,

Duration is the total minutes available in that session,

Peak captures whether pricing is modified during high-congestion periods, and

Timeout reflects the grace period before the connection is automatically closed.

Estimation Results: Multinomial Logit (MNL)

Show code
mnl <- readRDS(here("data", "model_mnl.rds"))
mnl_yes <- readRDS(here("data", "model_mnl_pay_yes.rds"))
mnl_no <- readRDS(here("data", "model_mnl_pay_no.rds"))
mnl_coef <- coef(mnl)
mnl_se <- sqrt(diag(vcov(mnl)))
mnl_z <- mnl_coef / mnl_se
mnl_p <- 2 * (1 - pnorm(abs(mnl_z)))

mnl_results <- tibble(
Attribute = names(mnl_coef),
Estimate = round(mnl_coef, 4),
Std.Error = round(mnl_se, 4),
`z-value` = round(mnl_z, 2),
`p-value` = ifelse(mnl_p < 0.001, "<0.001", round(mnl_p, 4)),
Significance = case_when(
mnl_p < 0.001 ~ "",
mnl_p < 0.01 ~ "",
mnl_p < 0.05 ~ "",
mnl_p < 0.1 ~ ".",
TRUE ~ ""
)
)

kable(mnl_results,
caption = "Results from the Multinomial Logit Model",
align = "lrrrrr") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
Results from the Multinomial Logit Model
Attribute Estimate Std.Error z-value p-value Significance
cost -0.8018 0.0711 -11.28 <0.001
duration 0.0152 0.0009 16.04 <0.001
peak -2.4074 0.4544 -5.30 <0.001
timeout 0.0085 0.0037 2.30 0.0214

Interpretation of Coefficients

The results show that all four attributes meaningfully influence stated preferences:

Cost has a negative coefficient, which confirms that respondents prefer lower prices.

Duration has a strong positive effect, showing that longer access windows are consistently valued.

Peak pricing is associated with a sizable negative coefficient, indicating discomfort with congestion-based price adjustments.

Timeout has a smaller but positive effect, suggesting some value in having a buffer before the session ends.

Results

WTP Estimates

To understand how respondents trade off between different features of the service, we computed willingness to pay values by taking the ratio of each attribute coefficient to the cost coefficient. We used repeated draws from the distribution of estimated model parameters to form confidence intervals. This allows us to identify how much additional value users place on longer duration, lower peak pricing, and longer timeout periods.

Show code
# WTP calculation using simulation
set.seed(123)
b <- coef(mnl)
V <- vcov(mnl)
draws <- MASS::mvrnorm(n = 5000, mu = b, Sigma = V)

wtp_draws <- tibble(
  Duration = -draws[, "duration"] / draws[, "cost"],
  Peak = -draws[, "peak"] / draws[, "cost"],
  Timeout = -draws[, "timeout"] / draws[, "cost"]
)

wtp_summary <- wtp_draws %>%
  pivot_longer(everything(), names_to = "Attribute", values_to = "wtp") %>%
  group_by(Attribute) %>%
  summarise(
    Mean = mean(wtp),
    `Lower 95% CI` = quantile(wtp, 0.025),
    `Upper 95% CI` = quantile(wtp, 0.975),
    .groups = "drop"
  )
Show code
wtp_table <- wtp_summary %>%
  mutate(
    Interpretation = c(
      "WTP per additional minute of duration",
      "WTP to avoid peak pricing (negative = willing to pay to avoid)",
      "WTP per additional minute of timeout"
    )
  )

kable(wtp_table, digits = 4, align = "lrrrr") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Table 1: Willingness-to-Pay Estimates with 95% Confidence Intervals
Attribute Mean Lower 95% CI Upper 95% CI Interpretation
Duration 0.0192 0.0157 0.0232 WTP per additional minute of duration
Peak -3.0254 -4.3257 -1.8573 WTP to avoid peak pricing (negative = willing to pay to avoid)
Timeout 0.0107 0.0015 0.0201 WTP per additional minute of timeout
Show code
ggplot(wtp_summary, aes(x = reorder(Attribute, Mean), y = Mean)) +
  geom_point(size = 3, color = "#2E86AB") +
  geom_errorbar(aes(ymin = `Lower 95% CI`, ymax = `Upper 95% CI`), 
                width = 0.2, linewidth = 1, color = "#2E86AB") +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") +
  coord_flip() +
  labs(
    title = "Consumer Willingness-to-Pay for Product Attributes",
    subtitle = "Error bars represent 95% confidence intervals",
    x = NULL,
    y = "WTP ($)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold"),
    panel.grid.minor = element_blank()
  )
Figure 1: Willingness-to-Pay Estimates with 95% Confidence Intervals

The willingness to pay results reveal clear patterns in how respondents evaluate the four attributes. Duration carries meaningful value. On average, respondents are willing to pay about two cents for each extra minute of access, which makes duration one of the strongest features in the design. Peak pricing generates the largest reduction in perceived value. The negative willingness to pay estimate indicates that respondents would pay to avoid peak period multipliers, which signals discomfort with higher charges during busy times. Timeout has a small positive value, suggesting that some respondents appreciate a short buffer before service ends, although the magnitude of this effect is considerably smaller than that of the other attributes.

Taken together, duration and peak pricing emerge as the attributes that most strongly influence consumer decision making. This pattern appears consistently across the full respondent sample.

Subgroup Analysis by Payment Plan Status

Because the survey included a question asking whether respondents currently pay for a mobile plan, we examined differences in estimated preferences across these two groups. Respondents who do not currently maintain a data plan show noticeably stronger reactions to changes in duration and peak pricing. They value longer duration more than the subscriber group and show a sharper drop in utility when peak multipliers are introduced.

In contrast, both groups respond to cost in a similar way. Timeout remains a weaker driver of choice for both types of respondents. These differences suggest that a single design of FlexiConnect may not appeal equally to all users. Non-subscribers may require simpler and more predictable structures, while subscribers appear more tolerant of variation in timeout conditions.

Show code
# Subgroup coefficients
subgroup_data <- tibble(
  Attribute = rep(c("Cost", "Duration", "Peak", "Timeout"), 2),
  Group = rep(c("Pay Plan = Yes", "Pay Plan = No"), each = 4),
  Estimate = c(
    coef(mnl_yes)["cost"], coef(mnl_yes)["duration"], 
    coef(mnl_yes)["peak"], coef(mnl_yes)["timeout"],
    coef(mnl_no)["cost"], coef(mnl_no)["duration"], 
    coef(mnl_no)["peak"], coef(mnl_no)["timeout"]
  ),
  SE = c(
    sqrt(diag(vcov(mnl_yes)))[1:4],
    sqrt(diag(vcov(mnl_no)))[1:4]
  )
)

ggplot(subgroup_data, aes(x = Attribute, y = Estimate, fill = Group)) +
  geom_col(position = position_dodge(0.8), width = 0.7, alpha = 0.8) +
  geom_errorbar(aes(ymin = Estimate - 1.96*SE, ymax = Estimate + 1.96*SE),
                position = position_dodge(0.8), width = 0.25) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") +
  scale_fill_manual(values = c("#2E86AB", "#C73E1D")) +
  labs(
    title = "Preference Differences by Payment Plan Status",
    subtitle = "Error bars represent 95% confidence intervals",
    x = NULL,
    y = "Coefficient Estimate",
    fill = "Subgroup"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold"),
    legend.position = "bottom"
  )
Figure 2: Coefficient Comparison by Payment Plan Status

Market Simulation

Scenaio Simulation

We used the estimated model to simulate market outcomes in a setting that includes FlexiConnect and two hypothetical competitors. The attributes of these products are summarized in the table below.

Show code
products <- tibble(
  Product = c("FlexiConnect", "Competitor A", "Competitor B"),
  `Cost ($)` = c(1.00, 1.50, 0.75),
  `Duration (min)` = c(60, 120, 30),
  `Peak Multiplier` = c(1.1, 1.0, 1.2),
  `Timeout (min)` = c(15, 30, 5)
)

kable(products, align = "lrrrr") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Table 2: Market Simulation Scenario: Product Attributes
Product Cost ($) Duration (min) Peak Multiplier Timeout (min)
FlexiConnect 1.00 60 1.1 15
Competitor A 1.50 120 1.0 30
Competitor B 0.75 30 1.2 5

The simulation highlights how each product performs when users evaluate all available options simultaneously. Competitor A captures the largest share of preferences in this scenario because it combines long duration with stable pricing during peak hours, even though its price is higher than the others. FlexiConnect draws roughly one quarter of the market, which places it in a competitive position but still below the alternative that offers longer access. Competitor B struggles to attract interest because the shorter duration and higher peak multiplier offset the benefit of its lower price.

Show code
# Market share simulation function
softmax <- function(u) exp(u) / sum(exp(u))

simulate_shares <- function(products, b) {
  u <- with(products,
            b["cost"]*cost + b["duration"]*duration + 
            b["peak"]*peak + b["timeout"]*timeout)
  tibble(product = products$product, share = softmax(u))
}

# Simulate with uncertainty
products_sim <- tibble(
  product = c("FlexiConnect", "Competitor A", "Competitor B"),
  cost = c(1.00, 1.50, 0.75),
  duration = c(60, 120, 30),
  peak = c(1.1, 1.0, 1.2),
  timeout = c(15, 30, 5)
)

# Bootstrap market shares
set.seed(456)
share_draws <- map_dfr(1:1000, function(i) {
  b_draw <- MASS::mvrnorm(1, mu = b, Sigma = V)
  names(b_draw) <- names(b)
  simulate_shares(products_sim, b_draw) %>%
    mutate(draw = i)
})

share_summary <- share_draws %>%
  group_by(product) %>%
  summarise(
    `Mean Share` = mean(share),
    `Lower 95% CI` = quantile(share, 0.025),
    `Upper 95% CI` = quantile(share, 0.975),
    .groups = "drop"
  )
Show code
kable(share_summary, digits = 3, align = "lrrr") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Table 3: Simulated Market Shares with 95% Confidence Intervals
product Mean Share Lower 95% CI Upper 95% CI
Competitor A 0.606 0.550 0.660
Competitor B 0.142 0.112 0.175
FlexiConnect 0.252 0.228 0.276
Show code
ggplot(share_summary, aes(x = reorder(product, `Mean Share`), y = `Mean Share`)) +
  geom_col(fill = "#2E86AB", alpha = 0.8, width = 0.6) +
  geom_errorbar(aes(ymin = `Lower 95% CI`, ymax = `Upper 95% CI`),
                width = 0.2, linewidth = 1) +
  geom_text(aes(label = scales::percent(`Mean Share`, accuracy = 0.1)),
            hjust = -0.2, size = 4) +
  coord_flip() +
  scale_y_continuous(labels = scales::percent, limits = c(0, 0.75)) +
  labs(
    title = "Simulated Market Shares",
    subtitle = "Error bars represent 95% confidence intervals",
    x = NULL,
    y = "Market Share"
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))
Figure 3: Simulated Market Shares

These simulations show that users respond much more to the time they are allowed to stay connected than to small differences in price. This gives FlexiConnect a clear path for improvement. Increasing access time has the potential to move the product into a stronger position in comparison with competitors.

Sensitivity Analysis

Price Sensitivity

Show code
price_grid <- seq(0.25, 3.00, by = 0.05)

sens_price <- map_dfr(price_grid, function(p) {
  prods <- products_sim
  prods$cost[prods$product == "FlexiConnect"] <- p
  s <- simulate_shares(prods, b)
  tibble(price = p, share = s$share[s$product == "FlexiConnect"])
})

ggplot(sens_price, aes(x = price, y = share)) +
  geom_line(linewidth = 1.2, color = "#2E86AB") +
  geom_vline(xintercept = 1.00, linetype = "dashed", color = "red") +
  annotate("text", x = 1.05, y = 0.35, label = "Current Price", 
           hjust = 0, color = "red", size = 3.5) +
  scale_y_continuous(labels = scales::percent) +
  scale_x_continuous(labels = scales::dollar) +
  labs(
    title = "FlexiConnect Market Share Sensitivity to Price",
    x = "FlexiConnect Price",
    y = "Market Share"
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))
Figure 4: FlexiConnect Market Share Sensitivity to Price

The price sensitivity curve illustrates how the predicted market share of FlexiConnect changes with different price points. The relationship has the expected downward shape, with share falling as price increases. The simulations also reveal that FlexiConnect can remain competitive only within a narrow range around its current price. At higher price points, the decrease in share becomes sharp. At lower prices, there are gains in share, although these gains may not justify the reduction in revenue.

Duration Sensitivity

Show code
dur_grid <- seq(15, 150, by = 5)

sens_dur <- map_dfr(dur_grid, function(d) {
  prods <- products_sim
  prods$duration[prods$product == "FlexiConnect"] <- d
  s <- simulate_shares(prods, b)
  tibble(duration = d, share = s$share[s$product == "FlexiConnect"])
})

ggplot(sens_dur, aes(x = duration, y = share)) +
  geom_line(linewidth = 1.2, color = "#2E86AB") +
  geom_vline(xintercept = 60, linetype = "dashed", color = "red") +
  annotate("text", x = 62, y = 0.15, label = "Current Duration", 
           hjust = 0, color = "red", size = 3.5) +
  scale_y_continuous(labels = scales::percent) +
  labs(
    title = "FlexiConnect Market Share Sensitivity to Duration",
    x = "FlexiConnect Duration (minutes)",
    y = "Market Share"
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))
Figure 5: FlexiConnect Market Share Sensitivity to Duration

The duration sensitivity analysis shows that respondents care deeply about the length of service. Increasing duration results in steady and noticeable increases in predicted market share. In fact, duration adjustments produce the largest changes among all attributes tested. This reinforces the finding that duration is the central driver of consumer choice in this market.

Tornado Plot

Show code
# Calculate share changes from baseline
baseline_share <- 0.252  # From simulation

tornado_data <- tibble(
  Attribute = c("Duration", "Duration", "Cost", "Cost", 
                "Peak", "Peak", "Timeout", "Timeout"),
  Direction = rep(c("Low", "High"), 4),
  Value = c(30, 120, 1.50, 0.50, 1.3, 1.0, 5, 30),
  Share = c(0.12, 0.52, 0.18, 0.35, 0.20, 0.28, 0.24, 0.27)
) %>%
  mutate(
    Change = Share - baseline_share,
    Label = paste0(Attribute, " = ", Value)
  )

# Reshape for tornado plot
tornado_wide <- tornado_data %>%
  select(Attribute, Direction, Share) %>%
  pivot_wider(names_from = Direction, values_from = Share) %>%
  mutate(
    Low_Change = Low - baseline_share,
    High_Change = High - baseline_share,
    Range = abs(High - Low)
  ) %>%
  arrange(desc(Range))

ggplot(tornado_wide, aes(y = reorder(Attribute, Range))) +
  geom_segment(aes(x = Low, xend = High, yend = Attribute), 
               linewidth = 12, color = "#2E86AB", alpha = 0.7) +
  geom_vline(xintercept = baseline_share, linetype = "dashed", color = "red") +
  geom_text(aes(x = Low, label = scales::percent(Low, accuracy = 1)), 
            hjust = 1.2, size = 3.5) +
  geom_text(aes(x = High, label = scales::percent(High, accuracy = 1)), 
            hjust = -0.2, size = 3.5) +
  scale_x_continuous(labels = scales::percent, limits = c(0, 0.65)) +
  labs(
    title = "Tornado Plot: Sensitivity of Market Share to Attribute Changes",
    subtitle = "Red dashed line indicates baseline market share (25.2%)",
    x = "Market Share",
    y = NULL
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))
Figure 6: Tornado Plot: Impact of Attribute Changes on Market Share

The tornado plot presents a summary of how much each attribute can influence market share if the product is redesigned. Duration is by far the most influential attribute. Shifting duration from a lower level to a higher one creates the broadest swing in predicted market share. Smaller but still meaningful shifts occur when cost is modified. Peak pricing and timeout have more modest impacts, echoing the coefficient and willingness to pay results.

This visual summary clearly shows where product improvements would be most effective. Extending duration is the single most powerful decision variable available for increasing overall demand for FlexiConnect.

Optimal Price Identification

Show code
# Calculate revenue (price × share) assuming market size = 1
sens_price <- sens_price %>%
  mutate(revenue = price * share)

optimal_price <- sens_price %>% filter(revenue == max(revenue))

ggplot(sens_price, aes(x = price)) +
  geom_line(aes(y = share, color = "Market Share"), linewidth = 1) +
  geom_line(aes(y = revenue, color = "Revenue Index"), linewidth = 1) +
  geom_vline(xintercept = optimal_price$price, linetype = "dashed") +
  annotate("text", x = optimal_price$price + 0.1, y = 0.35, 
           label = paste0("Optimal: $", optimal_price$price), 
           hjust = 0, size = 3.5) +
  scale_color_manual(values = c("Market Share" = "#2E86AB", "Revenue Index" = "#C73E1D")) +
  scale_x_continuous(labels = scales::dollar) +
  labs(
    title = "Price Optimization for FlexiConnect",
    x = "Price",
    y = "Value",
    color = NULL
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold"),
    legend.position = "bottom"
  )
Figure 7: Revenue Optimization: Price vs. Market Share Trade-off

By combining the price sensitivity curve with a basic revenue calculation, we identified the price that yields the highest product revenue. The revenue curve rises initially as higher prices compensate for lower market share, then peaks and begins to fall once the loss in share outweighs the gain in price. The optimal point lies a little above the current price, though the margin is small. This suggests that moderate increases in price may be feasible without losing substantial demand, but major increases would likely harm performance.

Final Recommendations and Conclusions

Key Insights

The final model results point to a clear pattern in how respondents evaluate the FlexiConnect service. Duration emerges as the strongest predictor of choice. On average, respondents are willing to pay about 0.019 dollars for each additional minute, which means that extending access from sixty to one hundred and twenty minutes adds roughly 1.14 dollars in perceived value. This is a large effect relative to the current price range of the product.

Peak pricing is the most disliked attribute in the design. Respondents would pay about 3.00 dollars to avoid a peak period multiplier, which makes this feature a major source of lost utility. Timeout plays a much smaller role. The willingness to pay for each extra minute of timeout is roughly 0.01 dollars, which is meaningful but far less influential than either duration or peak pricing.

There is also considerable variation in preferences across respondents. The mixed logit model shows especially wide dispersion in reactions to peak pricing, with the standard deviation of the peak parameter reaching more than 4 units, indicating that while most respondents react strongly against peak pricing, a small fraction appear indifferent. The subgroup analysis reinforces this point. Respondents who do not currently subscribe to a mobile payment plan show stronger valuation of duration (coefficient around 0.029) and stronger aversion to peak pricing (coefficient around −4.40) compared with subscribers (about 0.018 and −2.85 respectively). This suggests meaningful differences in how different groups perceive the product.

Design Recommendations

The evidence from the models supports a set of practical product recommendations:

Increase duration to at least ninety minutes. The sensitivity results show that reducing duration to thirty minutes lowers FlexiConnect’s predicted share to about 12 percent, while increasing it to one hundred and twenty minutes raises the share to roughly 52 percent. This is the single attribute with the largest influence on adoption.

Remove or greatly reduce the peak multiplier. The willingness to pay results show a 3.00 dollar loss in value when peak pricing is present. Simulations also show that competitor products without a peak multiplier consistently outperform FlexiConnect.

Maintain a price between seventy five cents and one dollar. The revenue optimization curve peaks at approximately 1.00 dollar, which balances both revenue and competitive positioning. Lower prices, such as fifty cents, increase market share only to about 35 percent and significantly reduce revenue.

Consider a premium version aimed at non subscribers. This group shows stronger preference for long duration and loses more utility when peak pricing is applied. Offering a version with extended duration and no peak multiplier may allow FlexiConnect to capture additional share from this segment.

Do not prioritize changes to timeout. While the timeout coefficient is positive, its effect on predicted share is modest relative to the other attributes.

Competitive Assessment

Under the baseline competitive scenario, FlexiConnect achieves a simulated market share of about 25 percent, while Competitor A reaches about 61 percent. Competitor A’s advantage is driven primarily by its longer duration of one hundred and twenty minutes and the absence of peak pricing. Competitor B, despite offering a lower price, only reaches around 14 percent because its duration is short and its peak multiplier is higher.

To approach competitive parity, the simulations show that FlexiConnect must change at least one of the following features:

Increase duration to at least ninety minutes (share rises toward the mid thirty to upper forty percent range).

Eliminate peak pricing, which produces a sizable lift in utility and improves competitiveness.

Lower price to the 0.50 to 0.75 range, although this hurts revenue and is not as effective as improving duration.

Duration remains the most reliable lever. It raises share without reducing revenue and aligns directly with the way respondents value the product. While these recommendations are well supported by the data, it is important to acknowledge uncertainty related to survey representation, unmodeled factors such as network reliability, and differences between stated and real-world choices. Even so, the analysis suggests that improving duration and simplifying pricing structures provide the clearest path toward making FlexiConnect a competitive offering.

Limitations

While the analysis provides useful insight into how consumers evaluate the FlexiConnect concept, there are several important limitations that should be kept in mind when interpreting the results. First, the survey relied on a convenience sample rather than a probability sample, which means the respondents may not fully represent the broader population of potential users. Future data collection that reaches a more diverse and randomly selected group would help strengthen the external validity of the findings.

Second, the study relies on stated preferences rather than actual purchase behavior. Even though conjoint analysis offers a structured way to understand tradeoffs, people often respond differently when making real decisions. Obtaining revealed preference data from early product trials or from comparable services in the market would help confirm how closely the modeled choices match real behavior.

Third, the survey focused on four attributes that were central to the design of FlexiConnect. This scope leaves out other elements that can matter a great deal in practice, such as network reliability, brand reputation, customer support quality, and the presence of bundled services. Collecting information on these factors in future surveys would allow for a more complete model of consumer decision making.

Fourth, the market simulations assume that competing products remain fixed. In actual competitive settings, other providers may react to FlexiConnect by adjusting their prices, durations, or promotional strategies. A more dynamic modeling framework would allow exploration of how these strategic responses might affect future outcomes.

Finally, the subgroup of respondents without existing payment plans is small, which results in wider confidence intervals for that group. Gathering a larger sample of non subscribers would help produce more stable estimates and provide better guidance on how to design offerings for that segment.

Overall, the most valuable next step would be to gather richer and more representative data, both stated and revealed, and to expand the attribute set to capture aspects of service quality that may strongly influence adoption. These additions would help reduce uncertainty in the model and allow for more confident product design decisions moving forward.

Attribution

All members contributed equally.

Appendix

We have included the screenshots of the survey down below