1 Introduction

The Sustainability Framlingham group ran a survey in November 2021 intended to collect Framlingham residents’ views on a range of potential sustainability actions or initiatives.

The survey was distributed in two ways:

  • online (available during the whole of November 2021)
  • on paper at a market stall on the 6th November, timed to coincide with COP26

The online survey was communicated via various social media and the Town Council’s website/newsletter.

The market survey was available to all visitors to the stall on the 6th November and was also taken round to market visitors on that morning by students from Framlingham College. The market stall also offered information in the form of:

  • posters summarising evidence on climate change as well as national and local district/parish emissions footprints;
  • a leaflet on the Framlingham sustainability themes

The survey responses therefore represent the views of those who chose to respond online or who agreed to respond at the market. In both cases respondents are likely to be those who are already more engaged with sustainability issues and so should not be considered as representative of the views of all Framlingham residents. It is also likely that at least some responses came from non-Framlingham residents.

2 Data

# two sources, questions asked slightly differently :-(
onlineDT_wide <- data.table::fread(paste0(dataPath, "COP26@FRAMLINGHAM SURVEY.csv"))

onlineDT <- melt(onlineDT_wide[`Do you have any comments or further ideas we can consider?` != "answers from Ben - for test purposes!"], # remove
                 id.vars = "Timestamp")

onlineDT[, question := ifelse(variable %like% "improve energy efficiency",
                              "1",
                              NA)]
onlineDT[, question := ifelse(variable %like% "electric vehicle",
                              "2",
                              question)]
onlineDT[, question := ifelse(variable %like% "renewable electricity",
                              "3",
                              question)]
onlineDT[, question := ifelse(variable %like% "Reducing car journeys",
                              "4",
                              question)]
onlineDT[, question := ifelse(variable %like% "solar panel",
                              "5",
                              question)]
onlineDT[, question := ifelse(variable %like% "thermal imaging camera",
                              "6",
                              question)]
onlineDT[, question := ifelse(variable %like% "make space for nature",
                              "7",
                              question)]
onlineDT[, question := ifelse(variable %like% "wildlife corridors",
                              "8",
                              question)]
onlineDT[, question := ifelse(variable %like% "green space management",
                              "9",
                              question)]
onlineDT[, question := ifelse(variable %like% "native planting",
                              "10",
                              question)]
onlineDT[, question := ifelse(variable %like% "bigger recycling centre",
                              "11",
                              question)]
onlineDT[, question := ifelse(variable %like% "swap and mend",
                              "12",
                              question)]
onlineDT[, question := ifelse(variable %like% "single use plastic",
                              "13",
                              question)]
onlineDT[, question := ifelse(variable %like% "compostable bags",
                              "14",
                              question)]
onlineDT[, question := ifelse(variable %like% "rainwater",
                              "15",
                              question)]
onlineDT[, question := ifelse(variable %like% "flood plains",
                              "16",
                              question)]
onlineDT[, question := ifelse(variable %like% "summer shading",
                              "17",
                              question)]
onlineDT[, question := ifelse(variable %like% "overheating",
                              "18",
                              question)]
onlineDT[, question := ifelse(variable %like% "comments",
                              "comments",
                              question)]
onlineDT[, response_str := value]
onlineDT[, source := "On-line"]

paperDF <- readxl::read_xlsx(paste0(dataPath, "COP26@FramMarket-Survey-Data.xlsx"), sheet = "paper")
  
paperDT <- data.table::as.data.table(paperDF)

# code paper response for easier comparison
paperDT[, response_str := ifelse(response >= 1,
                                 "Yes (1+ ticks)",
                                 response)]
paperDT[, response_str := ifelse(is.na(response_str),
                                 "No (empty)",
                                 response_str)]
paperDT[, response_str := ifelse(response_str == -1,
                                 "No (cross)",
                                 response_str)]
paperDT[, response_str := ifelse(response_str == -99,
                                 "Don't know (stated)",
                                 response_str)]
# now code the final comments box
paperDT[, response_str := ifelse(question == "comments",
                                 comment,
                                 response_str)]
paperDT[, source := "Paper"]
# select the variables that match and rbind them into one data file

dataDT <- rbind(paperDT[, .(survey_id, question, response_str, source)],
      onlineDT[, .(survey_id = Timestamp, question, response_str, source)])

There were 118 survey responses. Of these:

  • 58 were on-line responses between 2021-10-19 and 2021-11-17;
  • 60 were paper-based responses collected at the market on 2021-11-06.

Table 2.1 shows the survey questions. These were worded identically in the online and paper-based surveys.

t <- unique(onlineDT[, .(variable)])
makeFlexTable(t, cap = "Survey questions")

However the potential responses for the paper-based and online surveys differed:

  • online: options were yes, no, maybe and there was only the opportunity to add comments at the end in a specific ‘further ideas or comments’ question;
  • paper: respondents were asked to tick boxes next to the options they would support - we have therefore coded empty tick boxes as ‘no’ but also coded boxes which were marked with an X as a more intentional ‘No.’ A number of paper respondents added comments beside their responses to each question. These are reported below each plot as a table - where the table is empty there were no specific comments.

In order to avoid confusion and maintain transparency the responses from the two forms of the survey are presented separately (but on the same plots) below.

3 Results

3.1 Emissions reduction

3.1.1 Q1: Initiatives to improve energy efficiency (e.g. insulation, double glazing) including listed buildings?

q <- "1"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.1.2 Q2: Installing publicly accessible electric vehicle charging points

q <- "2"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.1.3 Q3: Encouraging homes and businesses to switch to renewable electricity suppliers

q <- "3"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.1.4 Q4: Reducing car journeys - encourage local shopping, walk to school and car sharing schemes

q <- "4"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.1.5 Q5: Promoting community solar panel and heat pump purchase schemes

q <- "5"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.1.6 Q6: Providing a thermal imaging camera free for residents to borrow to identify heat loss from homes

q <- "6"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.2 Biodiversity enhacement

3.2.1 Q7: Calling for new buildings to ‘make space for nature’ by designing for natural plant and wildlife habitats

q <- "7"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.2.2 Q8: Working to create linked green wildlife corridors through and around the town

q <- "8"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.2.3 Q9: Ensuring that green space management boosts local wildlife and encourage local land owners to do the same

q <- "9"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.2.4 Q10: Allocating land to native planting, wildlife habitats and ‘re-wilding’ via the Neighbourhood Plan

q <- "10"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.3 Least Trace Living

3.3.1 Q11: Having a bigger recycling centre on the edge of Framlingham for a wider range of materials

q <- "11"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.3.2 Q12: Encouraging swap and mend initiatives

q <- "12"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.3.3 Q13: Aiming to get rid of all single use plastic (starting with bags & take away packaging)

q <- "13"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.3.4 Q14: Aiming to supply compostable bags at cost price, or free at point of use

q <- "14"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.4 Resilience

3.4.1 Q15: Calling for new buildings and renovations to be designed to reduce or store rainwater run-off

q <- "15"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.4.2 Q16: Working to prevent unsustainable development on local flood plains

q <- "16"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.4.3 Q17: Encouraging native tree planting to provide summer shading throughout the town

q <- "17"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.4.4 Q18: Exploring options for reducing the risk of overheating in buildings

q <- "18"

makeBarPlot(dataDT, q)

t <- paperDT[question == q & !is.na(comment), .(comment)]

makeFlexTable(t, cap = "Specific comments for this question (paper survey only)")

3.5 General comments

The table below shows all general comments made at the end of the survey. No attempt has yet been made to cluster these by theme.

Please flag any that you consider disclosive (i.e. could identify the respondent) and these will be redacted in some way!

q <- "comments"

t <- dataDT[question == q & !is.na(response_str) &
              response_str != "", .(Comment = response_str, source)]

# remove anything that looks like an email address
pattern <- "[a-z]*@[a-z]*[.][a-z]*"
t[, Comment := stringr::str_replace(Comment, pattern, " <XX email redacted XX> ")]

makeFlexTable(t, cap = "General comments for this question (both surveys)")

3.6 Additional comments

In addition to the above the following general comments were also made.

  • investigate a tree & woodland strategy - c.f. Stonehouse Town Council’s Arboretum - strategy prepared by Barcham (local contact)
  • investigate Debenham Repairs shed - Friday afternoons
  • electric car chargers - could make 2 types available (fast & standard) but consider implications of each for how long vehicle would ‘need’ to be plugged in
  • old oil tank comment?
  • investigate Enterprise @ Badingham

4 Summary

Overall the respondents to the survey were generally supportive of all actions proposed.

dataDT[, yes_response := ifelse(response_str %like% "Yes",
                                "Yes", "Other")]
dataDT[, no_response := ifelse(response_str %like% "No",
                                "No", "Other")]

yesDT <- dataDT[question != "comments", .(count = .N), keyby = .(question, yes_response)]
noDT <- dataDT[question != "comments", .(count = .N), keyby = .(question, no_response)]

nResponses <- uniqueN(dataDT$survey_id)

questionText <- data.table::as.data.table(table(onlineDT$variable))
questionText$question <- as.character(1:nrow(questionText))

yesDT[, pc_yes := 100*count/nResponses]
setkey(questionText, question)
setkey(yesDT, question)
yes_t <- yesDT[questionText[question != 19, # avoid comments question
                            .(question, text = V1)]]

noDT[, pc_no := 100*count/nResponses]
setkey(questionText, question)
setkey(noDT, question)
no_t <- noDT[questionText[question != 19, .(question, text = V1)]]

Actions that were most strongly supported (> 80% of responses were ‘yes’) are shown in Table 4.1.

t <- yes_t[yes_response == "Yes" & pc_yes > 80][order(-pc_yes)]

makeFlexTable(head(t[, .(Question = text, `% yes` = pc_yes)]), cap = "Most strongly supported")

Actions that were least strongly supported (> 10% of responses were ‘no’) are shown in Table 4.2.

t <- no_t[no_response == "No" & pc_no > 10][order(-pc_no)]

makeFlexTable(head(t[, .(Question = text, `% no` = pc_no)]), cap = "Least strongly supported")

5 Annex

5.1 Data processing

This analysis was created using R embedded in Rmarkdown in RStudio.

5.2 R packages used

  • base R (R Core Team 2016)
  • bookdown (Xie 2016a)
  • data.table (Dowle et al. 2015)
  • ggplot2 (Wickham 2009)
  • flextable (Gohel 2021)
  • knitr (Xie 2016b)
  • rmarkdown (Allaire et al. 2018)

References

Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, and Winston Chang. 2018. Rmarkdown: Dynamic Documents for r. https://CRAN.R-project.org/package=rmarkdown.
Dowle, M, A Srinivasan, T Short, S Lianoglou with contributions from R Saporta, and E Antonyan. 2015. Data.table: Extension of Data.frame. https://CRAN.R-project.org/package=data.table.
Gohel, David. 2021. Flextable: Functions for Tabular Reporting. https://CRAN.R-project.org/package=flextable.
R Core Team. 2016. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Wickham, Hadley. 2009. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. http://ggplot2.org.
Xie, Yihui. 2016a. Bookdown: Authoring Books and Technical Documents with R Markdown. Boca Raton, Florida: Chapman; Hall/CRC. https://github.com/rstudio/bookdown.
———. 2016b. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://CRAN.R-project.org/package=knitr.