Executive Summary

To bridge the gap between marketing activity and financial performance, Marc must move beyond lagging sales data toward an integrated customer mindset analysis. At Café Dulcis, the relationship between marketing variables and brand perception reveals a significant strategic misalignment. Data suggests that current advertising efforts are counterproductive, as they negatively impact Brand Liking which is the sole mindset metric that successfully converts into sales. Because Liking is already highly saturated, the café’s brand strength is rooted more in its specialty coffee experience than in paid media.

Furthermore, Brand Consideration emerges as the primary growth engine due to its unique combination of high potential and high stickiness, ensuring that consumer interest is both attainable and enduring. Conversely, while Brand Awareness shows significant room for expansion, its low stickiness indicates that it is highly volatile and prone to rapid decay without constant reinforcement. Understanding these specific mindset dynamics is essential for optimizing marketing investment appeal and securing sustainable revenue growth in the Lappeenranta market.

Load the required libraries

library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.5.2
## Warning: package 'tidyr' was built under R version 4.5.2
## Warning: package 'readr' was built under R version 4.5.2
## Warning: package 'dplyr' was built under R version 4.5.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.0     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.2
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
install.packages("tseries")
## 
## The downloaded binary packages are in
##  /var/folders/7q/0037prxd67n6p7jc6_d61_r40000gn/T//RtmpVJybbR/downloaded_packages
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.2
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
install.packages("vars")
## 
## The downloaded binary packages are in
##  /var/folders/7q/0037prxd67n6p7jc6_d61_r40000gn/T//RtmpVJybbR/downloaded_packages
library(vars)
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## 
## The following object is masked from 'package:dplyr':
## 
##     select
## 
## Loading required package: strucchange
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.5.2
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Loading required package: sandwich
## 
## Attaching package: 'strucchange'
## 
## The following object is masked from 'package:stringr':
## 
##     boundary
## 
## Loading required package: urca
## Loading required package: lmtest
install.packages("R6")
## 
## The downloaded binary packages are in
##  /var/folders/7q/0037prxd67n6p7jc6_d61_r40000gn/T//RtmpVJybbR/downloaded_packages
library(R6)

Import the data

data_cafe <-read.csv ("CafeDulcis.csv", header = TRUE, sep = ",")
head (data_cafe)
##   Time Awareness Consideration Liking Advertising Promotion Price Sales
## 1    1     21.13         25.78  4.944      537.21     52.69 11.64   323
## 2    2     22.73         28.93  4.991      540.34     43.84 10.90   324
## 3    3     21.60         28.63  4.827      597.11     40.18 11.17   322
## 4    4     22.24         26.11  4.839      507.19     63.59 13.79   319
## 5    5     21.95         30.77  4.817      575.93     42.86 13.11   320
## 6    6     21.64         29.26  4.744      512.50     53.06 12.19   325
summary (data_cafe)
##       Time          Awareness     Consideration       Liking     
##  Min.   :  1.00   Min.   :21.01   Min.   :16.87   Min.   :4.733  
##  1st Qu.: 25.75   1st Qu.:21.59   1st Qu.:25.07   1st Qu.:5.004  
##  Median : 50.50   Median :22.14   Median :26.62   Median :5.148  
##  Mean   : 50.50   Mean   :22.37   Mean   :26.45   Mean   :5.186  
##  3rd Qu.: 75.25   3rd Qu.:23.26   3rd Qu.:28.93   3rd Qu.:5.394  
##  Max.   :100.00   Max.   :23.97   Max.   :33.31   Max.   :5.747  
##   Advertising      Promotion         Price           Sales      
##  Min.   :149.6   Min.   :40.18   Min.   :10.62   Min.   :315.0  
##  1st Qu.:251.2   1st Qu.:42.44   1st Qu.:14.67   1st Qu.:319.0  
##  Median :352.8   Median :44.48   Median :16.83   Median :322.0  
##  Mean   :352.8   Mean   :44.85   Mean   :16.83   Mean   :322.4  
##  3rd Qu.:454.3   3rd Qu.:46.80   3rd Qu.:19.18   3rd Qu.:325.0  
##  Max.   :597.1   Max.   :63.59   Max.   :21.52   Max.   :330.0

Calculate the potential

# Awareness 
potential_awareness <- (100 - mean(data_cafe$Awareness)) / 100

# Consideration 
potential_consideration <- (100 - mean(data_cafe$Consideration)) / 100

# Liking
data_cafe$Liking_transformed <- data_cafe$Liking / 7
potential_liking <- (1 - mean(data_cafe$Liking_transformed))

# Create the table
table_potential <- data.frame(
  potential = c("awareness", "consideration", "liking"),
  value = c(potential_awareness, potential_consideration, potential_liking)
)

# Print the table
table_potential
##       potential     value
## 1     awareness 0.7763490
## 2 consideration 0.7354635
## 3        liking 0.2591694

Interpret the findings

  • Brand Awareness (77.6%): Has the highest potential. This means there is massive room for growth, making it our top marketing priority.

  • Brand Consideration (73.5%): Also has strong potential. Efforts to get people to consider the cafe will yield high returns.

  • Brand Liking (25.9%): Has the lowest potential because it is already close to its maximum level. Investing more here will likely result in diminishing returns.

Calculate stickiness

#awareness
ar1 <- ar (data_cafe$Awareness, aic = TRUE) 

#consideration
ar2 <- ar (data_cafe$Consideration, aic = TRUE) 

#Liking
ar3 <- ar (data_cafe$Liking, aic = TRUE) 

#Stickiness
stick_awareness <- ar1$ar[1] + ar1$ar[2] + ar1$ar[3] 
stick_consideration <- ar2$ar[1] + ar2$ar[2] + ar2$ar[3] 
stick_liking <- ar3$ar[1] + ar3$ar[2] + ar3$ar[3] 

#table
table_stickiness <- data.frame (
  stickiness = c("awareness", "consideration", "liking"),
  value = c(stick_awareness, stick_consideration, stick_liking)
)
table_stickiness
##      stickiness     value
## 1     awareness 0.4309032
## 2 consideration 0.7631340
## 3        liking 0.7597322

Findings

  • Brand Consideration (76.3%): Has the highest stickiness. Gains here are stable and enduring, don’t need to constantly spend money to maintain them.

  • Brand Liking (76.0%): Very high stickiness. Once customers like the cafe, that positive attitude remains strong over time.

  • Brand Awareness (43.1%): Has the lowest stickiness. If you stop advertising, people will forget about the brand.

Calculate Responsiveness

#calculate responsiveness by lagging a variable
data_cafe$lag_aware <- lag(data_cafe$Awareness)
data_cafe$lag_aware[1] <- 0

data_cafe$lag_consideration <- lag(data_cafe$Consideration)
data_cafe$lag_consideration[1] <- 0

data_cafe$lag_liking <- lag(data_cafe$Liking)
data_cafe$lag_liking[1] <- 0

data_cafe$lag_sales <- lag(data_cafe$Sales)
data_cafe$lag_sales[1] <- 0

#logarithmic model
response_aware <- lm(log(Awareness + 1) ~ log(lag_aware + 1) + log(Price + 1) + log(Promotion + 1) + log(Advertising + 1), data = data_cafe)

response_consideration <- lm(log(Consideration + 1) ~ log(lag_consideration + 1) + log(Price + 1) + log(Promotion + 1) + log(Advertising + 1), data = data_cafe)

response_liking <- lm(log(Liking + 1) ~ log(lag_liking + 1) + log(Price + 1) + log(Promotion + 1) + log(Advertising + 1), data = data_cafe)

response_sales <- lm(log(Sales + 1) ~ log(lag_sales + 1) + log(Price + 1) + log(Promotion + 1) + log(Advertising + 1), data = data_cafe)

#summary
summary(response_aware)
## 
## Call:
## lm(formula = log(Awareness + 1) ~ log(lag_aware + 1) + log(Price + 
##     1) + log(Promotion + 1) + log(Advertising + 1), data = data_cafe)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.064112 -0.032055 -0.005093  0.040784  0.062260 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          2.514229   0.463118   5.429 4.34e-07 ***
## log(lag_aware + 1)   0.019063   0.013364   1.426    0.157    
## log(Price + 1)       0.087000   0.072010   1.208    0.230    
## log(Promotion + 1)   0.001024   0.095661   0.011    0.991    
## log(Advertising + 1) 0.055691   0.035517   1.568    0.120    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03982 on 95 degrees of freedom
## Multiple R-squared:  0.07181,    Adjusted R-squared:  0.03273 
## F-statistic: 1.837 on 4 and 95 DF,  p-value: 0.128
summary(response_consideration)
## 
## Call:
## lm(formula = log(Consideration + 1) ~ log(lag_consideration + 
##     1) + log(Price + 1) + log(Promotion + 1) + log(Advertising + 
##     1), data = data_cafe)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.38851 -0.09074  0.01923  0.08806  0.25870 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)                 3.934319   1.567083   2.511   0.0137 *
## log(lag_consideration + 1)  0.047457   0.040839   1.162   0.2481  
## log(Price + 1)              0.184306   0.242478   0.760   0.4491  
## log(Promotion + 1)         -0.330519   0.322146  -1.026   0.3075  
## log(Advertising + 1)       -0.008968   0.117999  -0.076   0.9396  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1346 on 95 degrees of freedom
## Multiple R-squared:  0.1786, Adjusted R-squared:  0.144 
## F-statistic: 5.164 on 4 and 95 DF,  p-value: 0.0008291
summary(response_liking)
## 
## Call:
## lm(formula = log(Liking + 1) ~ log(lag_liking + 1) + log(Price + 
##     1) + log(Promotion + 1) + log(Advertising + 1), data = data_cafe)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.066539 -0.021356  0.001838  0.020272  0.054949 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           2.227791   0.337328   6.604 2.29e-09 ***
## log(lag_liking + 1)   0.001224   0.017292   0.071   0.9437    
## log(Price + 1)        0.038035   0.052595   0.723   0.4714    
## log(Promotion + 1)   -0.055505   0.069992  -0.793   0.4297    
## log(Advertising + 1) -0.052610   0.025632  -2.053   0.0429 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.02896 on 95 degrees of freedom
## Multiple R-squared:  0.5043, Adjusted R-squared:  0.4835 
## F-statistic: 24.17 on 4 and 95 DF,  p-value: 8.282e-14
summary(response_sales)
## 
## Call:
## lm(formula = log(Sales + 1) ~ log(lag_sales + 1) + log(Price + 
##     1) + log(Promotion + 1) + log(Advertising + 1), data = data_cafe)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.023836 -0.011129 -0.000738  0.010369  0.023744 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           5.7339902  0.1508148  38.020   <2e-16 ***
## log(lag_sales + 1)   -0.0007524  0.0023926  -0.314    0.754    
## log(Price + 1)        0.0111018  0.0234080   0.474    0.636    
## log(Promotion + 1)    0.0011341  0.0311244   0.036    0.971    
## log(Advertising + 1)  0.0022093  0.0115235   0.192    0.848    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01296 on 95 degrees of freedom
## Multiple R-squared:  0.006575,   Adjusted R-squared:  -0.03525 
## F-statistic: 0.1572 on 4 and 95 DF,  p-value: 0.9593
#extracting the coefficients to create a table
table_response_aware <- data.frame(round(response_aware$coefficients, 4))
table_response_consideration <- data.frame(round(response_consideration$coefficients, 4))
table_response_liking <- data.frame(round(response_liking$coefficients, 4))
table_response_sales <- data.frame(round(response_sales$coefficients, 4))

# Combine them all into one clean view
table_responsiveness_all <- data.frame(
  Metric = c("Intercept", "Lagged_Metric", "Price", "Promotion", "Advertising"),
  Awareness = round(response_aware$coefficients, 4),
  Consideration = round(response_consideration$coefficients, 4),
  Liking = round(response_liking$coefficients, 4),
  Sales = round(response_sales$coefficients, 4)
)

print(table_responsiveness_all)
##                             Metric Awareness Consideration  Liking   Sales
## (Intercept)              Intercept    2.5142        3.9343  2.2278  5.7340
## log(lag_aware + 1)   Lagged_Metric    0.0191        0.0475  0.0012 -0.0008
## log(Price + 1)               Price    0.0870        0.1843  0.0380  0.0111
## log(Promotion + 1)       Promotion    0.0010       -0.3305 -0.0555  0.0011
## log(Advertising + 1)   Advertising    0.0557       -0.0090 -0.0526  0.0022

Findings

  • Awareness & Consideration: None of marketing variables have a statistically significant short-term impact, all p-values are well above 0.05.

  • Brand Liking: Advertising has a negative and statistically significant impact on Liking (coefficient = -0.0526, p = 0.0429). This suggests that current advertising efforts are slightly harming how much people like the cafe.

  • Sales: Direct responsiveness is flat. Neither significantly drives short-term sales volume directly.

Log transformations

# Calculate Conversion
conversion_model <- lm(log(Sales + 1) ~ log(lag_sales + 1) + log(Awareness) + log(Consideration) + log(Liking), data = data_cafe)

# View the results
summary(conversion_model)
## 
## Call:
## lm(formula = log(Sales + 1) ~ log(lag_sales + 1) + log(Awareness) + 
##     log(Consideration) + log(Liking), data = data_cafe)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.026010 -0.010043 -0.001408  0.011256  0.022169 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         5.6964570  0.1075106  52.985   <2e-16 ***
## log(lag_sales + 1) -0.0008229  0.0022440  -0.367   0.7147    
## log(Awareness)      0.0007010  0.0305746   0.023   0.9818    
## log(Consideration) -0.0042678  0.0090292  -0.473   0.6375    
## log(Liking)         0.0600024  0.0286839   2.092   0.0391 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01271 on 95 degrees of freedom
## Multiple R-squared:  0.04526,    Adjusted R-squared:  0.005057 
## F-statistic: 1.126 on 4 and 95 DF,  p-value: 0.349

Marketing Strategies

Stop current Ads

Current advertising has a negative responsiveness (-0.05) on brand liking. It is actively hurting our brand. In the competitive Lappeenranta specialty coffee market, these campaigns are actively hurting the brand’s perception.

=> Action: immediately pause all current ad spend and redesign the creative content to better reflect the premium, high-quality coffee experience.

Drive Consideration (best ROI)

Consideration has high growth Potential (73.5%) and high Stickiness (76.3%). Gains made here will be substantial and long-lasting.

=> Action: shift budget to new, compelling trial promotions (first-time discounts, local partnerships, etc.), since current promotions show zero responsiveness.

Maintain continuous Awareness

Awareness has the highest Potential (77.6%) but very low Stickiness (43.1%). If we stop marketing, people forget us quickly.

=> Action: Use low-cost, continuous visibility tactics (local SEO, steady social media presence) rather than expensive, short-term ads to keep Café Dulcis top-of-mind.

Leverage Brand Liking

Liking is saturated (low Potential: 25.9%). Spending money to increase it will result in diminishing returns.

=> Action: lean into the strengths as a specialty coffee shop and rely on the excellence of the product itself. Implement referral programs to incentivize our already-satisfied customers to act as organic lead generators for the café.