From 3d002efe967adf25853fbab6fe1be5801180d4a9 Mon Sep 17 00:00:00 2001 From: Kaviraj Singh Date: Thu, 3 Oct 2024 13:36:25 -0400 Subject: [PATCH] Delete CSBC_Shiny_app directory --- CSBC_Shiny_app/expected_to_change_server.R | 173 ---- CSBC_Shiny_app/global.R | 336 -------- CSBC_Shiny_app/obstacle_server_newQuarter.R | 834 -------------------- CSBC_Shiny_app/outlook_server.R | 353 --------- CSBC_Shiny_app/server.R | 49 -- CSBC_Shiny_app/talent_server_newQuarter.R | 300 ------- CSBC_Shiny_app/ui.R | 138 ---- CSBC_Shiny_app/www/Logo.PNG | Bin 34370 -> 0 bytes CSBC_Shiny_app/www/chamber_theme.css | 59 -- 9 files changed, 2242 deletions(-) delete mode 100644 CSBC_Shiny_app/expected_to_change_server.R delete mode 100644 CSBC_Shiny_app/global.R delete mode 100644 CSBC_Shiny_app/obstacle_server_newQuarter.R delete mode 100644 CSBC_Shiny_app/outlook_server.R delete mode 100644 CSBC_Shiny_app/server.R delete mode 100644 CSBC_Shiny_app/talent_server_newQuarter.R delete mode 100644 CSBC_Shiny_app/ui.R delete mode 100644 CSBC_Shiny_app/www/Logo.PNG delete mode 100644 CSBC_Shiny_app/www/chamber_theme.css diff --git a/CSBC_Shiny_app/expected_to_change_server.R b/CSBC_Shiny_app/expected_to_change_server.R deleted file mode 100644 index c6c93ce..0000000 --- a/CSBC_Shiny_app/expected_to_change_server.R +++ /dev/null @@ -1,173 +0,0 @@ -expected_to_change_server <- function(input, output, session) { - - output$change1<- renderPlot({ - - # Business or organization expectations over the next three months, fourth quarter of 2022 - # Question: Over the next three months, how are the following expected to change for your business? - - last_quarter <- "Q4 2022" - last_quarter_expecation_table <- "33100602" - - # read tables - #============= - - Slide37_Q4_22 <- cansim::get_cansim(last_quarter_expecation_table)%>% dplyr::mutate(Quarter = "Q4 2022") - Slide37_Q3_22 <- cansim::get_cansim("33100533")%>% dplyr::mutate(Quarter = "Q3 2022") - Slide37_Q2_22 <- cansim::get_cansim("33100503")%>% dplyr::mutate(Quarter = "Q2 2022") - Slide37_Q1_22 <- cansim::get_cansim("33100468")%>% dplyr::mutate(Quarter = "Q1 2022") - - - # plot without Q3 2021 - #======================= - - data_expected_change <- rbind(Slide37_Q4_22, - Slide37_Q3_22, - Slide37_Q2_22, - Slide37_Q1_22 - ) - - - data_expected_change <- Data_cleaning_function_round1(data_expected_change) - - colnames(data_expected_change) - - data_expected_change <- data_expected_change%>% - dplyr::rename(Business_information = Business_or_organization_information , - Expected_change = Expected_change_over_the_next_three_months )%>% - mutate(Expected_change=gsub("Expected change over the next three months, ","", as.character(Expected_change)), - Business_information1 = gsub("Business or organization information, ","", as.character(Business_information)), - font_size=ifelse(Quarter == last_quarter , "bold","plain"), - Business_information = case_when(Business_information1 == "number of employees" ~ "Number of employees", - Business_information1 == "vacant positions" ~ "Vacant positions", - Business_information1 == "sales of goods and services offered by the business or organization" ~ "Sales", - Business_information1 == "selling price of goods and services offered by the business or organization" ~ "Selling price", - Business_information1 == "demand for goods and services offered by the business or organization" ~ "Demand", - Business_information1 == "imports" ~ "Imports", - Business_information1 == "exports" ~ "Exports", - Business_information1 == "operating income" ~ "Operating income", - Business_information1 == "operating expenses" ~ "Operating expenses", - Business_information1 == "profitability" ~ "Profitability", - Business_information1 == "cash reserves" ~ "Cash reverves", - Business_information1 == "capital expenditures" ~ "Capital expenditures", - Business_information1 == "training expenditures" ~ "Training expenditures", - Business_information1 == "marketing and advertising budget" ~ "Marketing budget", - Business_information1 == "expenditures in research and development" ~ "Research expenditures", - TRUE ~ "Error"))%>% - filter(Expected_change %in% c("increase","decrease"))%>% - left_join(Business_characterisitcs_mapping, by="Business_characteristics") - - - if(input$business_characteristics == "All industries"){ - - data_expected_change<- data_expected_change%>% - dplyr::filter(Clean == input$specific_business_characteristics) - - - }else if(input$business_characteristics == "All employment sizes"){ - - data_expected_change<- data_expected_change%>% - dplyr::filter(Clean == input$specific_business_characteristics) - - }else if(input$business_characteristics == "All ownerships"){ - data_expected_change<- data_expected_change%>% - dplyr::filter(Clean == input$specific_business_characteristics) - - - }else if(input$business_characteristics == "All visible minorities"){ - - data_expected_change <- data_expected_change%>% - dplyr::filter(Clean == input$specific_business_characteristics) - - }else{ - data_expected_change <- data_expected_change%>% - dplyr::filter(Clean == input$specific_business_characteristics) - - } - - - plot1 <- data_expected_change %>% - tidyr::pivot_wider(names_from = Expected_change, values_from = VALUE)%>% - dplyr::mutate(VALUE = round(increase - decrease))%>% - filter(Business_information %in% c("Sales","Selling price","Operating expenses","Profitability","Capital expenditures","Number of employees")) - - - - level_order <- c( "Q1 2022", "Q2 2022", "Q3 2022", "Q4 2022") - - this_family <- "sans" - - - plot_canada <- plot1 %>% filter(GEO=="Canada") - plot1<- plot1 %>% filter(GEO==input$geo) - - - - ggplot(data = transform(plot1, Business_information= factor(Business_information, levels=c("Sales","Selling price","Operating expenses","Profitability","Capital expenditures","Number of employees"))) , - aes(x = factor(Quarter, level = level_order), y = VALUE , fill = Quarter)) + - geom_bar(stat = "identity", position = position_dodge(), alpha = 0.85, width=1)+ - geom_point(data= transform(plot_canada, Business_information= factor(Business_information, levels=c("Sales","Selling price","Operating expenses","Profitability","Capital expenditures","Number of employees"))),aes(x = factor(Quarter, level = level_order), y = VALUE ), shape=21, fill="#FE4812",color="#FE4812" ,size=2)+ - geom_hline(yintercept=0, color="#4F4E4E")+ - # with contrast - #=============== - scale_fill_manual("",values = c("#06fff8","#00d3cd","#00a09b", "#006d6a" ),labels=level_order, breaks=level_order)+ # turquoise color - ordered least to most pigmentation with contrast - geom_text(aes(y=VALUE+2*sign(VALUE),label=paste0(round(VALUE,2),"%"), fontface=font_size), size=3, color="#4F4E4E")+ - ylab("") + xlab("")+ - labs(title = paste0(input$geo, ": Expected change, next three months") , - subtitle = "Balance of opinion, percentage points*", - caption = paste("Sources: Canadian Chamber of Commerce Business Data Lab; Statistics Canada, Canadian Survey on Business Conditions."))+ - theme( - panel.background = element_blank(), - axis.text.y = element_blank(), - axis.text.x = element_blank(), - panel.spacing = unit(2, "lines"), - - plot.title = element_text(size = 14, face="bold", family = this_family, color="#4F4E4E"), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0, color="#4F4E4E"), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.minor.x = element_blank(), - panel.grid.major.y = element_blank(), - - axis.ticks.x=element_blank(), - axis.ticks.y=element_blank(), - - - legend.text =element_text(family = this_family, face="bold", color="#4F4E4E") , - legend.title = element_text(family = this_family, face="bold", color="#4F4E4E"), - - strip.placement = "outside", - strip.background = element_blank(), - strip.text.x = element_text(face="bold", color="#4F4E4E"), - - legend.position = "bottom")+ - facet_wrap(~Business_information, nrow = 1, strip.position = "bottom") - - }) - - - - observeEvent(input$geo, { - if (input$geo == "Canada") { - - output$cityControls <- renderUI({ - plotOutput("change1", height = 400, width= 900) - }) - }else{ - - output$cityControls <- renderUI({ - plotOutput("change1", height = 600, width= 900) - }) - - } - - - - }) - - - -} \ No newline at end of file diff --git a/CSBC_Shiny_app/global.R b/CSBC_Shiny_app/global.R deleted file mode 100644 index 66bb3a8..0000000 --- a/CSBC_Shiny_app/global.R +++ /dev/null @@ -1,336 +0,0 @@ -#========================================================================================================== -# 2022 Q2 table for this question: Is your business in a better overall position today than it was in 2019? -#========================================================================================================== - -# Installing and Loading Packages - -# required_packages <- c("tidyverse","formattable", "ggplot2","keras","MLmetrics", "Shiny","plotly", -# "tidyr","knitr","janitor","data.table","tidyxl","jsonline","tidyquant","lubridate","zoo", -# "cansim","hrbrthemes","viridis", "ggplot2", "ggcorr", "openxlsx","zoo", "ggExtra", -# "stringr", "statcanR","plyr","moonbook", "sf","rgdal","geojsonio","spdplyr","rmapshaper", -# "GGally","corrplot", "ggrepel", "tidytext", "heatmapply","ztable","magrittr","mapcan", "readxl", "stringr") -# need_install <- required_packages[!(required_packages) %in% installed.packages()] -# if(length(need_install)>0){ -# install.packages(need_install) -# } -# -# lapply(required_packages, require, character.only = TRUE) - - - -################################################################################################################################################################ -library(dplyr) -library(stringr) -library(cansim) -library(tidyr) -library(tidyverse) -library(readxl) - - -# setwd("path to app folder") -# getwd() - -latest_quarter_table_obstacle <- "table Q3.2022" -last_quarter <- "Q2 2022" - -#Basic classifications#### -options(encoding = 'UTF-8') - - -Industries <- c("North American Industry Classification System (NAICS), all industries", - "Agriculture, forestry, fishing and hunting [11]", - "Mining, quarrying, and oil and gas extraction [21]", - "Construction [23]" , - "Manufacturing [31-33]" , - "Wholesale trade [41]" , - "Retail trade [44-45]" , - "Transportation and warehousing [48-49]" , - "Information and cultural industries [51]" , - "Finance and insurance [52]" , - "Real estate and rental and leasing [53]" , - "Professional, scientific and technical services [54]" , - "Administrative and support, waste management and remediation services [56]" , - "Health care and social assistance [62]" , - "Arts, entertainment and recreation [71]" , - "Accommodation and food services [72]" , - "Other services (except public administration) [81]" ) - -Industries_clean <-c( - "All Industries", - "Agriculture, forestry, fishing", - "Mining, quarrying, oil, gas extraction", - "Construction", - "Manufacturing", - "Wholesale trade", - "Retail trade", - "Transportation, warehousing", - "Information and culture", - "Finance and insurance", - "Real estate, rental, leasing", - "Professional services", - "Administration and support services" , - "Health care, social assistance", - "Arts, entertainment, recreation" , - "Accomodation and food services" , - "Other services" - ) - - - -Industries2 <- c("North American Industry Classification System (NAICS), all industries", - "Agriculture, forestry, fishing and hunting", - "Mining, quarrying, and oil and gas extraction", - "Construction" , - "Manufacturing" , - "Wholesale trade" , - "Retail trade" , - "Transportation and warehousing" , - "Information and cultural industries" , - "Finance and insurance" , - "Real estate and rental and leasing" , - "Professional, scientific and technical services" , - "Administrative and support, waste management and remediation services" , - "Health care and social assistance" , - "Arts, entertainment and recreation" , - "Accommodation and food services" , - "Other services (except public administration)" ) - - -Employment_size <- c("Business or organization size of employment, all employment sizes" , - "1 to 4 employees" , - "5 to 19 employees" , - "20 to 99 employees" , - "100 or more employees" ) -Employment_size_clean <- c("All employment sizes" , - "1 to 4 employees" , - "5 to 19 employees" , - "20 to 99 employees" , - "100 or more employees" ) - - - - -Majority_Ownership <- c("Majority ownership, all ownerships", - "Majority ownership, woman", - "Majority ownership, First Nations, Metis or Inuit", - "Majority ownership, immigrant to Canada", - "Majority ownership, person with a disability", - "Majority ownership, member of LGBTQ2 community") -Majority_Ownership_clean <- c("All ownerships", - "Majority woman", - "Majority First Nations, Metis or Inuit", - "Majority immigrant to Canada", - "Majority person with a disability", - "Majority member of LGBTQ2") - - - -Ownership_minority <- c("Ownership by visible minority, all visible minorities", - "Ownership by visible minority, South Asian", - "Ownership by visible minority, Chinese", - "Ownership by visible minority, Black", - "Ownership by visible minority, Filipino", - "Ownership by visible minority, Latin American", - "Ownership by visible minority, Arab", - "Ownership by visible minority, Southeast Asian", - "Ownership by visible minority, West Asian", - "Ownership by visible minority, Korean", - "Ownership by visible minority, Japanese", - "Ownership by visible minority, other visible minority", - "Ownership by visible minority, preferred not to say" ) - -Ownership_minority_clean <- c("Ownership by all visible minorities", - "Ownership by South Asian", - "Ownership by Chinese", - "Ownership by Black", - "Ownership by Filipino", - "Ownership by Latin American", - "Ownership by Arab", - "Ownership by Southeast Asian", - "Ownership by West Asian", - "Ownership by Korean", - "Ownership by Japanese", - "Ownership by other visible minority", - "Ownership by preferred not to say" ) - - - -Business_activity <- c("Business or organization activity in the last 12 months, all business or organization activities", - "Exported goods outside of Canada", - "Exported services outside of Canada", - "Made investments outside of Canada", - "Sold goods to businesses in Canada who then resold them outside of Canada", - "Imported goods from outside of Canada", - "Imported services from outside of Canada", - "Relocated any business or organizational activities or employees from another country into Canada", - "Engaged in other international business activities", - "Business or organization activity, none or other") - - -Business_activity_clean <- c("All business activities in the last 12 months", - "Exported goods outside of Canada", - "Exported services outside of Canada", - "Made investments outside of Canada", - "Sold goods to businesses in Canada who then resold them outside of Canada", - "Imported goods from outside of Canada", - "Imported services from outside of Canada", - "Relocated any business activities or employees from another country into Canada", - "Engaged in other international business activities", - "Business or organization activity, none or other") - - -Business_characterisitcs_mapping = data.frame(Business_characteristics = c(Industries, Employment_size,Majority_Ownership,Ownership_minority,Business_activity), - Clean=c(Industries_clean,Employment_size_clean,Majority_Ownership_clean,Ownership_minority_clean,Business_activity_clean)) - - -Geography <- c("Canada", "Newfoundland and Labrador", "Prince Edward Island", "Nova Scotia", - "New Brunswick", "Quebec", "Ontario", "Manitoba", "Saskatchewan", "Alberta", "British Columbia", "Yukon", "Northwest Territories", - "Nunavut") - - - -round2 = function(x, digits) { - posneg = sign(x) - z = abs(x)*10^digits - z = z + 0.5 + sqrt(.Machine$double.eps) - z = trunc(z) - z = z/10^digits - z*posneg -} - -Data_cleaning_function <- function(data){ - - - names(data) <- str_replace_all(names(data), " ", "_") - names(data) <- str_replace_all(names(data), ",", "") - names(data) <- str_replace_all(names(data), "-", "_") - output <- data %>% dplyr::ungroup() %>% - dplyr::select(-c("REF_DATE","DGUID","UOM","UOM_ID","SCALAR_FACTOR","SCALAR_ID","VECTOR", - "COORDINATE","val_norm","STATUS","SYMBOL","TERMINATED","DECIMALS","GeoUID", - "Hierarchy_for_GEO", "Date")) %>% - dplyr::select(-contains(c("Hierarchy","Classification")))%>% - mutate(VALUE=round2(VALUE,0))%>% - replace_na(list(VALUE = 0)) - return(output) -} - - - -Data_cleaning_function_round1 <- function(data){ - - - names(data) <- str_replace_all(names(data), " ", "_") - names(data) <- str_replace_all(names(data), ",", "") - names(data) <- str_replace_all(names(data), "-", "_") - output <- data %>% dplyr::ungroup() %>% - dplyr::select(-c("REF_DATE","DGUID","UOM","UOM_ID","SCALAR_FACTOR","SCALAR_ID","VECTOR", - "COORDINATE","val_norm","STATUS","SYMBOL","TERMINATED","DECIMALS","GeoUID", - "Hierarchy_for_GEO", "Date")) %>% - dplyr::select(-contains(c("Hierarchy","Classification")))%>% - mutate(VALUE=round(VALUE,1))%>% - replace_na(list(VALUE = 0)) - return(output) -} - - - -Canada_data_filter <- function(data){ - output <- data %>% dplyr::ungroup() %>% - dplyr::filter(GEO == "Canada") - return(output) -} - -lm_eqn <- function(df){ - m <- lm(y ~ x, df); - eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, - list(a = format(unname(coef(m)[1]), digits = 2), - b = format(unname(coef(m)[2]), digits = 2), - r2 = format(summary(m)$r.squared, digits = 3))) - as.character(as.expression(eq)); -} - -wrapper <- function(x, ...) -{ - paste(strwrap(x, ...), collapse = "\n") -} - - -firstup <- function(x) { - substr(x, 1, 1) <- toupper(substr(x, 1, 1)) - x -} - - -# list of obstacle -#================== - -# Get Q3_2022 -Slide12_Q3_22 <- cansim::get_cansim("3310053401") %>% - dplyr::rename("Obstacles" =`Obstacles for the business or organization`) -# Get Q2_2022 -Slide12_Q2_22 <- cansim::get_cansim("3310050401") %>% - dplyr::rename("Obstacles" =`Obstacles for the business or organization`) - - -Slide12_Q2_22_clean = Data_cleaning_function_round1(Slide12_Q2_22) -Slide12_Q3_22_clean = Data_cleaning_function_round1(Slide12_Q3_22) - -Slide12_Q2_22_can = Slide12_Q2_22_clean %>% - dplyr::filter(Business_characteristics == "North American Industry Classification System (NAICS), all industries", - GEO == "Canada") -Slide12_Q3_22_can = Slide12_Q3_22_clean %>% - dplyr::filter(Business_characteristics == "North American Industry Classification System (NAICS), all industries", - GEO == "Canada") - -Required_dataset_12 <- dplyr::left_join(x = Slide12_Q3_22_can, y= Slide12_Q2_22_can, - by= c("Obstacles","GEO","Business_characteristics"))%>% - dplyr::mutate(Obstacles = case_when( - Obstacles == "Cost of personal protective equipment (PPE), additional cleaning or implementing distancing requirements" ~ "Cost of personal protective equipment (PPE)", - TRUE ~ as.character(Obstacles) - - )) - - - -Costs = c("Rising cost of inputs", - "Cost of insurance", - "Transportation costs", - "Rising costs in real estate, leasing or property taxes", - "Rising interest rates and debt costs") -Labour = c("Shortage of labour force", - "Recruiting skilled employees", - "Retaining skilled employees") -Supply_chain = c("Difficulty acquiring inputs, products or supplies domestically", - "Difficulty acquiring inputs, products or supplies from abroad", - "Maintaining inventory levels") -Customer_demand = c("Insufficient demand for goods or services offered", - "Fluctuations in consumer demand", - "Attracting new or returning customers") -Operations = c("Obtaining financing", - "Maintaining sufficient cash flow or managing debt") -Finance = c("Increasing competition") - -Inflation = c("Rising inflation") - - - -data_obstacle <- Required_dataset_12 %>% - dplyr::mutate( Percent_change = VALUE.x -VALUE.y) %>% - dplyr::rename("VALUE_NOW" = "VALUE.x") %>% - dplyr::rename("VALUE_THEN" = "VALUE.y") %>% - dplyr::mutate(Categories = "NONE", - Categories = ifelse(Obstacles %in% Costs, "Costs", Categories), - Categories = ifelse(Obstacles %in% Labour, "Labour", Categories), - Categories = ifelse(Obstacles %in% Supply_chain, "Supply chain", Categories), - Categories = ifelse(Obstacles %in% Customer_demand, "Customer demand", Categories), - Categories = ifelse(Obstacles %in% Operations, "Operations", Categories), - Categories = ifelse(Obstacles %in% Finance, "Finance", Categories), - Categories = ifelse(Obstacles %in% Inflation, "Inflation", Categories), - Percent_change1 = round2(Percent_change,0), - Percent_change = ifelse(is.na(Percent_change1), "NA", as.character(Percent_change1)), - color_perc1 = ifelse(as.integer(Percent_change1)>0, "red", ifelse(as.integer(Percent_change1)<0, "green", "none")), - color_perc = ifelse(Percent_change=="NA", "none", as.character(color_perc1)), - VALUE_NOW=round2(VALUE_NOW,0) - )%>% - dplyr::filter(Categories!= "NONE", VALUE_NOW>=19) -list_obstacles <- data_obstacle$Obstacles diff --git a/CSBC_Shiny_app/obstacle_server_newQuarter.R b/CSBC_Shiny_app/obstacle_server_newQuarter.R deleted file mode 100644 index 5cdbbb4..0000000 --- a/CSBC_Shiny_app/obstacle_server_newQuarter.R +++ /dev/null @@ -1,834 +0,0 @@ - -obstacle_server_newQuarter <- function(input, output, session) { - -output$obstacle1_newQ <- renderPlot({ - - last_quarter <- "2022 Q3" - - - # Get Q4_2022 - Slide12_Q4_22 <- cansim::get_cansim("3310060301") %>% - dplyr::rename("Obstacles" =`Obstacles for the business or organization`) - # Get Q3_2022 - Slide12_Q3_22 <- cansim::get_cansim("3310053401") %>% - dplyr::rename("Obstacles" =`Obstacles for the business or organization`) - - - Slide12_Q3_22_clean = Data_cleaning_function_round1(Slide12_Q3_22) - Slide12_Q4_22_clean = Data_cleaning_function_round1(Slide12_Q4_22) - - Slide12_Q3_22_can = Slide12_Q3_22_clean %>% - left_join(Business_characterisitcs_mapping, by="Business_characteristics")%>% - dplyr::filter(Clean == input$specific_business_characteristics, - GEO == input$geo) - Slide12_Q4_22_can = Slide12_Q4_22_clean %>% - left_join(Business_characterisitcs_mapping, by="Business_characteristics")%>% - dplyr::filter(Clean == input$specific_business_characteristics, - GEO == input$geo) - - Required_dataset_12 <- dplyr::left_join(x = Slide12_Q4_22_can, y= Slide12_Q3_22_can, - by= c("Obstacles","GEO","Business_characteristics")) - - - Costs = c( "Rising cost of inputs", - "Cost of insurance", - "Transportation costs", - "Rising interest rates and debt costs", - "Rising costs in real estate, leasing or property taxes", - "Rising inflation") - - Labour = c("Shortage of labour force", - "Recruiting skilled employees", - "Retaining skilled employees") - - Supply_chain = c("Difficulty acquiring inputs, products or supplies domestically", - "Difficulty acquiring inputs, products or supplies from abroad", - "Difficulty acquiring inputs, products or supplies from within Canada", - "Maintaining inventory levels") - - Customer_demand = c("Insufficient demand for goods or services offered", - "Fluctuations in consumer demand", - "Attracting new or returning customers") - - Operations = c("Obtaining financing", - "Maintaining sufficient cash flow or managing debt") - - Finance = c("Increasing competition") - - - - data_obstacle <- Required_dataset_12 %>% - dplyr::mutate( Percent_change = VALUE.x -VALUE.y) %>% - dplyr::rename("VALUE_NOW" = "VALUE.x") %>% - dplyr::rename("VALUE_THEN" = "VALUE.y") %>% - dplyr::mutate(Categories = "NONE", - Categories = ifelse(Obstacles %in% Costs, "Costs", Categories), - Categories = ifelse(Obstacles %in% Labour, "Labour", Categories), - Categories = ifelse(Obstacles %in% Supply_chain, "Supply chain", Categories), - Categories = ifelse(Obstacles %in% Customer_demand, "Customer demand", Categories), - Categories = ifelse(Obstacles %in% Operations, "Operations", Categories), - Categories = ifelse(Obstacles %in% Finance, "Finance", Categories), - Percent_change1 = round2(Percent_change,0), - Percent_change = ifelse(is.na(Percent_change1), "NA", as.character(Percent_change1)), - color_perc1 = ifelse(as.integer(Percent_change1)>0, "red", ifelse(as.integer(Percent_change1)<0, "green", "#4F4E4E")), - color_perc = ifelse(Percent_change=="NA", "#4F4E4E", as.character(color_perc1)), - VALUE_NOW=round2(VALUE_NOW,0) - ) %>% - dplyr::filter(Categories!= "NONE")%>% - arrange(-VALUE_NOW)%>% - head(10) - - nb <- length(unique(data_obstacle$Obstacles)) - - this_family <- "sans" - max_value <- as.integer(max(data_obstacle$VALUE_NOW)+0.1*max(data_obstacle$VALUE_NOW)) - - ggplot(data_obstacle, aes(fill = reorder(Categories, -VALUE_NOW), y = VALUE_NOW, - x=reorder(Obstacles, +VALUE_NOW), - label=paste0(VALUE_NOW,"%"))) + - geom_bar(stat="identity")+ - scale_fill_manual("Categories",values = c("#00B9B4", "#F8A12C", "#FE4812","#4F4E4E", "#0C3163", "#005753","#B8E4F1","#DCDFDA"))+ - geom_text(position = position_dodge(1),hjust=-0.2, color="#4F4E4E")+ - expand_limits(y= c(1, max_value),x= c(1, nb+2))+ - geom_text(aes(label= ifelse(color_perc == "red", paste0("+",Percent_change,"%"), ifelse(Percent_change=="NA", paste0(Percent_change), paste0(Percent_change,"%"))), color= color_perc), - hjust=-0.1, - size=3, position = position_fill(vjust = -4, reverse=TRUE))+ - annotate(geom="text", label=paste("Change since\n ", "last survey"), x= nb+1, y=-7.5, color="#4F4E4E", hjust=0, - family="sans", size=3) + - scale_color_manual(values = c('red' = 'red', 'green' = 'green3', 'none' = '#4F4E4E'), guide = "none")+ - coord_flip()+ - ylab("") + - xlab("")+ - labs(title = paste0(input$geo, ": Top 10 business Obstacles expected, next three month"), - subtitle = "% of respondents, by obstacle", - caption = paste("*Top 10 obstacles. \n\nSources: Canadian Chamber of Commerce Business Data Lab; Statistics Canada, Canadian Survey on Business Conditions.") - )+ - theme_minimal()+ - theme( - axis.text.y = element_text( size=11, margin=margin(r=-10), color= "#4F4E4E", family = this_family), - axis.text.x = element_blank(), - - plot.title = element_text(size = 14, face="bold", family = this_family, color="#4F4E4E"), - plot.subtitle = element_text(size = 12, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0, color="#4F4E4E"), - plot.title.position = "plot", - plot.caption.position = "plot", - - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - - - legend.text =element_text(family = this_family, face="bold", color="#4F4E4E") , - legend.title = element_text(family = this_family, face="bold", color="#4F4E4E"), - - legend.position = c(.9, .1), - legend.box ="vertical" - ) - -}) - - -data_on_obstacle1 <- reactive({ - - # data on obstacle for Q4 2022 simulation - #========================================= - Slide12_Q4_22 <-cansim::get_cansim("3310060301") %>% - dplyr::rename("Obstacles" =`Obstacles for the business or organization`) - - - Slide12_Q4_22_clean <- Data_cleaning_function_round1(Slide12_Q4_22) - - if(input$business_characteristics == "All industries"){ - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Industries, - GEO == input$geo)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "North American Industry Classification System (NAICS), all industries" ~ "All Industries", - Business_characteristics == "Agriculture, forestry, fishing and hunting [11]" ~ "Agriculture, forestry, fishing", - Business_characteristics == "Mining, quarrying, and oil and gas extraction [21]" ~ "Mining, oil, gas extraction", - Business_characteristics == "Construction [23]" ~ "Construction", - Business_characteristics == "Manufacturing [31-33]" ~ "Manufacturing", - Business_characteristics == "Wholesale trade [41]" ~ "Wholesale trade", - Business_characteristics == "Retail trade [44-45]" ~ "Retail trade", - Business_characteristics == "Transportation and warehousing [48-49]" ~ "Transportation, warehousing", - Business_characteristics == "Information and cultural industries [51]" ~ "Information and culture", - Business_characteristics == "Finance and insurance [52]" ~ "Finance and insurance", - Business_characteristics == "Real estate and rental and leasing [53]" ~ "Real estate, rental, leasing", - Business_characteristics == "Professional, scientific and technical services [54]" ~ "Professional services", - Business_characteristics == "Administrative and support, waste management and remediation services [56]" ~ "Administration and support services" , - Business_characteristics == "Health care and social assistance [62]" ~ "Health care, social assistance", - Business_characteristics == "Arts, entertainment and recreation [71]" ~ "Arts, entertainment, recreation" , - Business_characteristics == "Accommodation and food services [72]" ~ "Accommodation and food services" , - Business_characteristics == "Other services (except public administration) [81]" ~ "Other services", - TRUE ~ "Error"))%>% - arrange(VALUE) - }else if(input$business_characteristics == "All employment sizes"){ - - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Employment_size, - GEO == input$geo)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Business or organization size of employment, all employment sizes" ~ "All employment sizes", - TRUE ~ as.character(Business_characteristics)))%>% - arrange(VALUE) - - }else if(input$business_characteristics == "All ownerships"){ - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Majority_Ownership, - GEO == input$geo)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Majority ownership, all ownerships" ~ "All ownerships", - Business_characteristics == "Majority ownership, woman" ~ "Majority woman", - Business_characteristics == "Majority ownership, First Nations, Metis or Inuit" ~ "Majority First Nations, Metis or Inuit", - Business_characteristics == "Majority ownership, immigrant to Canada" ~ "Majority immigrant to Canada", - Business_characteristics == "Majority ownership, person with a disability" ~ "Majority person with a disability", - Business_characteristics == "Majority ownership, member of LGBTQ2 community" ~ "Majority member of LGBTQ2", - TRUE ~ "Error"))%>% - arrange(VALUE) - - - }else if(input$business_characteristics == "All visible minorities"){ - - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Ownership_minority , - GEO == input$geo)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Ownership by visible minority, all visible minorities" ~ "Ownership by all visible minorities", - Business_characteristics == "Ownership by visible minority, South Asian" ~ "Ownership by South Asian", - Business_characteristics == "Ownership by visible minority, Chinese" ~ "Ownership by Chinese", - Business_characteristics == "Ownership by visible minority, Black" ~ "Ownership by Black", - Business_characteristics == "Ownership by visible minority, Filipino" ~ "Ownership by Filipino", - Business_characteristics == "Ownership by visible minority, Latin American" ~ "Ownership by Latin American", - Business_characteristics == "Ownership by visible minority, Arab" ~ "Ownership by Arab", - Business_characteristics == "Ownership by visible minority, Southeast Asian" ~ "Ownership by Southeast Asian", - Business_characteristics == "Ownership by visible minority, West Asian" ~ "Ownership by West Asian", - Business_characteristics == "Ownership by visible minority, Korean" ~ "Ownership by Korean", - Business_characteristics == "Ownership by visible minority, Japanese" ~ "Ownership by Japanese", - Business_characteristics == "Ownership by visible minority, other visible minority" ~ "Ownership by other visible minority", - Business_characteristics == "Ownership by visible minority, preferred not to say" ~ "Ownership by preferred not to say", - TRUE ~ "Error"))%>% - arrange(VALUE) - }else{ - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Business_activity , - GEO == input$geo)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Business or organization activity in the last 12 months, all business or organization activities" ~ "All business activities in the last 12 months", - Business_characteristics == "Sold goods to businesses in Canada who then resold them outside of Canada" ~ paste("Sold goods to businesses in Canada who \nthen resold them outside of Canada"), - Business_characteristics == "Relocated any business or organizational activities or employees from another country into Canada" ~ paste("Relocated any business activities or \nemployees from another country into Canada"), - TRUE ~ as.character(Business_characteristics)))%>% - arrange(VALUE) - - } - - Slide12_Q4_22_can%>% - mutate(VALUE=round(VALUE,0)) - - -}) - - - -data_on_obstacle2 <- reactive({ - - # data on obstacle for Q4 2022 simulation - #========================================= - - Slide12_Q4_22 <-cansim::get_cansim("3310060301") %>% - dplyr::rename("Obstacles" =`Obstacles for the business or organization`) - - - - Slide12_Q4_22_clean <- Data_cleaning_function_round1(Slide12_Q4_22) - - if(input$business_characteristics == "All industries"){ - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Industries)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "North American Industry Classification System (NAICS), all industries" ~ "All Industries", - Business_characteristics == "Agriculture, forestry, fishing and hunting [11]" ~ "Agriculture, forestry, fishing", - Business_characteristics == "Mining, quarrying, and oil and gas extraction [21]" ~ "Mining, oil, gas extraction", - Business_characteristics == "Construction [23]" ~ "Construction", - Business_characteristics == "Manufacturing [31-33]" ~ "Manufacturing", - Business_characteristics == "Wholesale trade [41]" ~ "Wholesale trade", - Business_characteristics == "Retail trade [44-45]" ~ "Retail trade", - Business_characteristics == "Transportation and warehousing [48-49]" ~ "Transportation, warehousing", - Business_characteristics == "Information and cultural industries [51]" ~ "Information and culture", - Business_characteristics == "Finance and insurance [52]" ~ "Finance and insurance", - Business_characteristics == "Real estate and rental and leasing [53]" ~ "Real estate, rental, leasing", - Business_characteristics == "Professional, scientific and technical services [54]" ~ "Professional services", - Business_characteristics == "Administrative and support, waste management and remediation services [56]" ~ "Administration and support services" , - Business_characteristics == "Health care and social assistance [62]" ~ "Health care, social assistance", - Business_characteristics == "Arts, entertainment and recreation [71]" ~ "Arts, entertainment, recreation" , - Business_characteristics == "Accommodation and food services [72]" ~ "Accommodation and food services" , - Business_characteristics == "Other services (except public administration) [81]" ~ "Other services", - TRUE ~ "Error"))%>% - arrange(VALUE) - }else if(input$business_characteristics == "All employment sizes"){ - - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Employment_size)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Business or organization size of employment, all employment sizes" ~ "All employment sizes", - TRUE ~ as.character(Business_characteristics)))%>% - arrange(VALUE) - - }else if(input$business_characteristics == "All ownerships"){ - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Majority_Ownership)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Majority ownership, all ownerships" ~ "All ownerships", - Business_characteristics == "Majority ownership, woman" ~ "Majority woman", - Business_characteristics == "Majority ownership, First Nations, Metis or Inuit" ~ "Majority First Nations, Metis or Inuit", - Business_characteristics == "Majority ownership, immigrant to Canada" ~ "Majority immigrant to Canada", - Business_characteristics == "Majority ownership, person with a disability" ~ "Majority person with a disability", - Business_characteristics == "Majority ownership, member of LGBTQ2 community" ~ "Majority member of LGBTQ2", - TRUE ~ "Error"))%>% - arrange(VALUE) - - - }else if(input$business_characteristics == "All visible minorities"){ - - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Ownership_minority)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Ownership by visible minority, all visible minorities" ~ "Ownership by all visible minorities", - Business_characteristics == "Ownership by visible minority, South Asian" ~ "Ownership by South Asian", - Business_characteristics == "Ownership by visible minority, Chinese" ~ "Ownership by Chinese", - Business_characteristics == "Ownership by visible minority, Black" ~ "Ownership by Black", - Business_characteristics == "Ownership by visible minority, Filipino" ~ "Ownership by Filipino", - Business_characteristics == "Ownership by visible minority, Latin American" ~ "Ownership by Latin American", - Business_characteristics == "Ownership by visible minority, Arab" ~ "Ownership by Arab", - Business_characteristics == "Ownership by visible minority, Southeast Asian" ~ "Ownership by Southeast Asian", - Business_characteristics == "Ownership by visible minority, West Asian" ~ "Ownership by West Asian", - Business_characteristics == "Ownership by visible minority, Korean" ~ "Ownership by Korean", - Business_characteristics == "Ownership by visible minority, Japanese" ~ "Ownership by Japanese", - Business_characteristics == "Ownership by visible minority, other visible minority" ~ "Ownership by other visible minority", - Business_characteristics == "Ownership by visible minority, preferred not to say" ~ "Ownership by preferred not to say", - TRUE ~ "Error"))%>% - arrange(VALUE) - }else{ - Slide12_Q4_22_can <- Slide12_Q4_22_clean %>% - dplyr::filter(Obstacles == input$obstacles, - Business_characteristics %in% Business_activity)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Business or organization activity in the last 12 months, all business or organization activities" ~ "All business activities in the last 12 months", - Business_characteristics == "Sold goods to businesses in Canada who then resold them outside of Canada" ~ paste("Sold goods to businesses in Canada who \nthen resold them outside of Canada"), - Business_characteristics == "Relocated any business or organizational activities or employees from another country into Canada" ~ paste("Relocated any business activities or \nemployees from another country into Canada"), - TRUE ~ as.character(Business_characteristics)))%>% - arrange(VALUE) - - } - - Slide12_Q4_22_can%>% - mutate(VALUE=round(VALUE,0)) - - -}) - - - - - -output$obstacle2_newQ <- renderPlot({ - thisData <- data_on_obstacle1()%>% - filter(VALUE>=10) - - if(input$business_characteristics == "All industries"){ - fac_order <- thisData %>% - filter( - Business_characteristics != "All Industries") %>% - arrange(VALUE) %>% - pull(Business_characteristics) - - fac_order <- c(fac_order, "All Industries") - - this_face <- ifelse(fac_order == "All Industries", "bold", "plain") - this_color <- ifelse(fac_order == "All Industries", "#4F4E4E", "gray25") - - business_char <- "by industry" - - }else if(input$business_characteristics == "All employment sizes"){ - fac_order <- c("1 to 4 employees" ,"5 to 19 employees","20 to 99 employees","100 or more employees", "All employment sizes") - this_face <- ifelse(fac_order == "All employment sizes", "bold", "plain") - this_color <- ifelse(fac_order == "All employment sizes", "#4F4E4E", "gray25") - business_char <- "by employment size" - - }else if(input$business_characteristics == "All ownerships"){ - fac_order <- thisData %>% - filter(Business_characteristics != "All ownerships") %>% - arrange(VALUE) %>% - pull(Business_characteristics) - - fac_order <- c(fac_order, "All ownerships") - - this_face <- ifelse(fac_order == "All ownerships", "bold", "plain") - this_color <- ifelse(fac_order == "All ownerships", "#4F4E4E", "gray25") - - business_char <- "by majority owned" - - }else if(input$business_characteristics == "All visible minorities"){ - fac_order <- thisData %>% - filter(Business_characteristics != "Ownership by all visible minorities") %>% - arrange(VALUE) %>% - pull(Business_characteristics) - - - fac_order <- c(fac_order, "Ownership by all visible minorities") - - - this_face <- ifelse(fac_order == "Ownership by all visible minorities", "bold", "plain") - this_color <- ifelse(fac_order == "Ownership by all visible minorities", "#4F4E4E", "gray25") - business_char <- "by visible minority" - - }else{ - fac_order <- thisData %>% - filter( Business_characteristics != "All business activities in the last 12 months") %>% - arrange(VALUE) %>% - pull(Business_characteristics) - - - fac_order <- c(fac_order, "All business activities in the last 12 months") - - - this_face <- ifelse(fac_order == "All business activities in the last 12 months", "bold", "plain") - this_color <- ifelse(fac_order == "All business activities in the last 12 months", "black", "gray25") - business_char <- "by all business activities" - - } - - this_family <- "sans" - - max_value <- as.integer(max(thisData$VALUE)+0.1*max(thisData$VALUE)) - - ggplot(thisData , aes(y=VALUE, x=factor(Business_characteristics, levels = fac_order))) + - geom_bar(stat="identity", fill = "#00B9B4", width=0.6, colour="#4F4E4E")+ - geom_text(aes(label = paste0(VALUE,"%")), colour = "#4F4E4E", hjust=-0.1)+ - coord_flip()+ - expand_limits(y= c(1, max_value))+ - ylab("") + - xlab("")+ - labs(title = paste0(input$geo, ": Expected obstacles, next three months" ), - subtitle = paste( "% of respondents with",tolower(input$obstacles), "as an obstacle"), - caption = paste("*",input$business_characteristics, "by less than 10% of respondents are not reported. \n\nSources: Canadian Chamber of Commerce Business Data Lab; Statistics Canada, Canadian Survey on Business Conditions."))+ - theme_minimal()+ - theme( - axis.text.y = element_text(face = this_face, size=11, color= "#4F4E4E", family = this_family), - axis.text.x = element_blank(), - - plot.title = element_text(size = 14, face="bold", family = this_family, color="#4F4E4E"), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - - - legend.text =element_text(family = this_family, face="bold", color="#4F4E4E") , - legend.title = element_text(family = this_family, face="bold", color="#4F4E4E"), - - legend.position = c(.9, .1), - legend.box ="vertical" - ) - -}) - - - - -output$obstacle3_newQ <- renderPlot({ - - thisData <- data_on_obstacle2() - - if(input$business_characteristics == "All industries"){ - thisData <- thisData%>% - filter(Business_characteristics == "All Industries")%>% - mutate(fill_color= ifelse(GEO=="Canada", "yes", "no")) - - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - business_char <- "all industries" - - }else if(input$business_characteristics == "All employment sizes"){ - thisData <- thisData%>%filter(Business_characteristics == "All employment sizes")%>% - mutate( fill_color= ifelse(GEO=="Canada", "yes", "no")) - - business_char <- "all employment sizes" - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - }else if(input$business_characteristics == "All ownerships"){ - thisData <- thisData%>%filter(Business_characteristics == "All ownerships")%>% - mutate( fill_color= ifelse(GEO=="Canada", "yes", "no")) - - business_char <- "all ownerships" - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - }else if(input$business_characteristics == "All visible minorities"){ - thisData <- thisData%>%filter(Business_characteristics == "Ownership by all visible minorities")%>% - mutate( fill_color= ifelse(GEO=="Canada", "yes", "no")) - - business_char <- "ownership by all visible minorities" - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - }else { - thisData <- thisData%>%filter(Business_characteristics == "All business activities in the last 12 months")%>% - mutate( fill_color= ifelse(GEO=="Canada", "yes", "no")) - - business_char <- "all business activities" - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - } - - - - fac_order <- thisData %>% - arrange(VALUE) %>% - pull(GEO) - - - this_face <- ifelse(fac_order == "Canada", "bold", "plain") - this_color <- ifelse(fac_order == "Canada", "#4F4E4E", "gray25") - - - this_family <- "sans" - - max_value <- as.integer(max(thisData$VALUE)+0.1*max(thisData$VALUE)) - - ggplot(thisData, aes(y=VALUE, x=factor(GEO, levels = fac_order), fill=fill_color)) + - geom_bar(stat="identity", width=0.6, colour="#4F4E4E")+ - geom_text(aes(label = paste0(VALUE,"%")), colour = "#4F4E4E", hjust=-0.1)+ - scale_fill_manual(values = c('no'="#00B9B4", 'yes'="#0C3163", 'other'= "#F8A12C"))+ - coord_flip()+ - expand_limits(y= c(1, max_value))+ - ylab("") + - xlab("")+ - labs(title = paste("Over the next three months, which of the following are expected to be obstacles for your business in",input$geo , "?" ), - subtitle = paste0("% of respondents that identify ",tolower(input$obstacles), " as an obstacle for ", business_char,", by province"), - caption = paste("Sources: Canadian Chamber of Commerce Business Data Lab; Statistics Canada, Canadian Survey on Business Conditions."))+ - theme_minimal()+ - theme( - axis.text.y = element_text(face = this_face, size=11, color= "#4F4E4E", family = this_family), - axis.text.x = element_blank(), - - plot.title = element_text(size = 14, face="bold", family = this_family, color="#4F4E4E"), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - - - legend.text =element_text(family = this_family, face="bold", color="#4F4E4E") , - legend.title = element_text(family = this_family, face="bold", color="#4F4E4E"), - - legend.position = "none" - ) - -}) - - - - output$obstacle4_newQ <- renderPlot({ - - thisData <- data_on_obstacle2()%>% - mutate(GEO1 = case_when(GEO == "Canada" ~ "CA", - GEO == "Ontario"~ "ON", - GEO == "Alberta"~ "AB", - GEO == "British Columbia" ~ "BC", - GEO == "Newfoundland and Labrador" ~ "NL", - GEO == "Saskatchewan" ~ "SK", - GEO == "Nova Scotia" ~ "NS", - GEO == "New Brunswick" ~ "NB", - GEO == "Quebec" ~ "QC", - GEO == "Yukon" ~ "YT", - GEO == "Manitoba" ~ "MA", - GEO == "Prince Edward Island" ~ "PEI", - GEO == "Nunavut" ~ "NU", - GEO == "Northwest Territories" ~ "NT", - )) - - if(input$business_characteristics == "All industries"){ - thisData <- thisData%>% - filter(Business_characteristics == "All Industries")%>% - mutate(fill_color= ifelse(GEO=="Canada", "yes", "no")) - - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - business_char <- "all industries" - - }else if(input$business_characteristics == "All employment sizes"){ - thisData <- thisData%>%filter(Business_characteristics == "All employment sizes")%>% - mutate( fill_color= ifelse(GEO=="Canada", "yes", "no")) - - business_char <- "all employment sizes" - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - }else if(input$business_characteristics == "All ownerships"){ - thisData <- thisData%>%filter(Business_characteristics == "All ownerships")%>% - mutate( fill_color= ifelse(GEO=="Canada", "yes", "no")) - - business_char <- "all ownerships" - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - }else if(input$business_characteristics == "All visible minorities"){ - thisData <- thisData%>%filter(Business_characteristics == "Ownership by all visible minorities")%>% - mutate( fill_color= ifelse(GEO=="Canada", "yes", "no")) - - business_char <- "ownership by all visible minorities" - if(input$geo != "Canada"){thisData [thisData $GEO == input$geo,]$fill_color<- "other"} - - }else { - thisData <- thisData%>%filter(Business_characteristics == "All business activities in the last 12 months")%>% - mutate( fill_color= ifelse(GEO=="Canada", "yes", "no")) - - business_char <- "all business activities" - if(input$geo != "Canada"){thisData [thisData$GEO == input$geo,]$fill_color<- "other"} - - } - - - - fac_order <- thisData %>% - arrange(VALUE) %>% - pull(GEO1) - - this_face <- ifelse(fac_order == "Canada", "bold", "plain") - this_color <- ifelse(fac_order == "Canada", "#4F4E4E", "gray25") - - this_family <- "sans" - - max_value <- as.integer(max(thisData$VALUE)+0.2*max(thisData$VALUE)) - - ggplot(thisData, aes(y=VALUE, x=factor(GEO1, levels = fac_order), fill=fill_color)) + - geom_bar(stat="identity", width=0.6, colour="#4F4E4E")+ - geom_text(aes(label = paste0(VALUE,"%")), colour = "#4F4E4E", vjust=-0.4)+ - scale_fill_manual(values = c('no'="#00B9B4", 'yes'="#0C3163", 'other'= "#F8A12C"))+ - expand_limits(y= c(1, max_value))+ - ylab("") + - xlab("")+ - geom_hline(yintercept=0, color = "#4F4E4E", size=1)+ - labs(title = paste("Regional benchmarking: obstacles by region" ), - subtitle = paste0("% of respondents with ",tolower(input$obstacles), " as an obstacle for ",business_char,", by province"), - caption = paste("Sources: Canadian Chamber of Commerce Business Data Lab; Statistics Canada, Canadian Survey on Business Conditions."))+ - theme_minimal()+ - theme( - axis.text.x = element_text(face = this_face, size=11, color= "#4F4E4E", family = this_family), - axis.text.y = element_blank(), - - plot.title = element_text(size = 14, face="bold", family = this_family, color="#4F4E4E"), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - - - legend.text = element_text(family = this_family, face="bold", color="#4F4E4E") , - legend.title = element_text(family = this_family, face="bold", color="#4F4E4E"), - - legend.position = "none" - ) - -}) - - - data_on_obstacle3 <- reactive({ - - Slide13_Q2_22 <- cansim::get_cansim("3310050401") %>% dplyr::mutate(Period = "Q2 2022", Quarter = "Q2", Year = "2022") - Slide13_Q1_22 <- cansim::get_cansim("3310046901") %>% dplyr::mutate(Period = "Q1 2022", Quarter = "Q1", Year = "2022") - Slide13_Q4_21 <- cansim::get_cansim("3310040001") %>% dplyr::mutate(Period = "Q4 2021", Quarter = "Q4", Year = "2021") - Slide13_Q3_21 <- cansim::get_cansim("3310036401") %>% dplyr::mutate(Period = "Q3 2021", Quarter = "Q3", Year = "2021") - Slide13_Q2_21 <- cansim::get_cansim("3310033801") %>% dplyr::mutate(Period = "Q2 2021", Quarter = "Q2", Year = "2021") - Slide13_Q1_21 <- cansim::get_cansim("3310030801") %>% dplyr::mutate(Period = "Q1 2021", Quarter = "Q1", Year = "2021") - - - Slide13_Q2_22_clean = Data_cleaning_function(Slide13_Q2_22) - Slide13_Q1_22_clean = Data_cleaning_function(Slide13_Q1_22) - Slide13_Q4_21_clean = Data_cleaning_function(Slide13_Q4_21) - Slide13_Q3_21_clean = Data_cleaning_function(Slide13_Q3_21) - Slide13_Q2_21_clean = Data_cleaning_function(Slide13_Q2_21) - Slide13_Q1_21_clean = Data_cleaning_function(Slide13_Q1_21) - - - data_obs <- rbind(Slide13_Q2_22_clean, - Slide13_Q1_22_clean, - Slide13_Q4_21_clean, - Slide13_Q3_21_clean, - Slide13_Q2_21_clean, - Slide13_Q1_21_clean)%>% - dplyr::rename(Obstacles = Obstacles_for_the_business_or_organization)%>% - dplyr::mutate(Business_characteristics = case_when( - Business_characteristics == "North American Industry Classification System (NAICS), all industries" ~ "All Industries", - Business_characteristics == "Agriculture, forestry, fishing and hunting [11]" ~ "Agriculture, forestry, fishing", - Business_characteristics == "Mining, quarrying, and oil and gas extraction [21]" ~ "Mining, quarrying, oil, gas extraction", - Business_characteristics == "Construction [23]" ~ "Construction", - Business_characteristics == "Manufacturing [31-33]" ~ "Manufacturing", - Business_characteristics == "Wholesale trade [41]" ~ "Wholesale trade", - Business_characteristics == "Retail trade [44-45]" ~ "Retail trade", - Business_characteristics == "Transportation and warehousing [48-49]" ~ "Transportation, warehousing", - Business_characteristics == "Information and cultural industries [51]" ~ "Information and culture", - Business_characteristics == "Finance and insurance [52]" ~ "Finance and insurance", - Business_characteristics == "Real estate and rental and leasing [53]" ~ "Real estate, rental, leasing", - Business_characteristics == "Professional, scientific and technical services [54]" ~ "Professional services", - Business_characteristics == "Administrative and support, waste management and remediation services [56]" ~ "Administration and support services" , - Business_characteristics == "Health care and social assistance [62]" ~ "Health care, social assistance", - Business_characteristics == "Arts, entertainment and recreation [71]" ~ "Arts, entertainment, recreation" , - Business_characteristics == "Accommodation and food services [72]" ~ "Accomodation and food services" , - Business_characteristics == "Other services (except public administration) [81]" ~ "Other services", - TRUE ~ "Error") )%>% - dplyr::filter(Business_characteristics == input$specific_business_characteristics, - GEO == input$geo) - - - obstacles_last_quarter <- data_obs %>% - dplyr::filter(Period == last_quarter, VALUE > 10, !str_detect(Obstacles, "none") )%>%pull(Obstacles) - - - obstacles_timeSeries <- data_obs%>% - dplyr::filter(Obstacles %in% obstacles_last_quarter)%>% - dplyr::select(Period, Obstacles) - - count_obstacles <- obstacles_timeSeries%>% - dplyr::group_by(Obstacles) %>% - dplyr::summarise(count = n()) - - data_obs <- data_obs%>% - left_join(count_obstacles, by = "Obstacles")%>% - filter(#Obstacles %in% input$many_obstacles, - count %in% input$nb_quarter) - - data_obs - - }) - - - output$obstacle5_newQ <- renderPlot({ - - thisData <- data_on_obstacle3() - - level_order <- c("Q1 2021", "Q2 2021", "Q3 2021", "Q4 2021", "Q1 2022", "Q2 2022") - this_family <- "sans" - - ggplot(thisData, aes(x = factor(Period, level = level_order), y = VALUE, - group = Obstacles, colour = Obstacles, label = Obstacles)) + - geom_line(size=1) + - geom_point(data=filter(thisData, Period %in% last_quarter))+ - geom_dl(data = subset(thisData, Period == last_quarter),aes(label = Obstacles, colour=Obstacles), method = list(dl.trans(x = x + .2), "last.bumpup"), size=2)+ - xlab("")+ - ylab("")+ - expand_limits(x= c(1, 10))+ - scale_colour_viridis_d()+ - scale_y_continuous(labels = function(x) paste0(x, "%"))+ - labs(title = paste("Over the next three months, which of the following are expected to be obstacles for your business in",input$geo , "?" ), - subtitle = paste0("% of respondents that identify", tolower(input$obstacles) ,"by obstacle "), - caption = paste("*",input$business_characteristics, "by less than 10% of respondents are not reported. \n\nSources:Canadian Chamber of Commerce Business Data Lab, Statistics Canada"))+ - theme( - panel.background = element_blank(), - axis.text.y = element_text( size=11, margin=margin(r=+10), color= "black", family = this_family), - - plot.title = element_text(size = 14, face="bold", family = this_family), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0, face= "italic"), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.minor.x = element_blank(), - panel.grid.major.y = element_line(color="grey"), - - axis.ticks.x=element_blank(), - axis.ticks.y=element_blank(), - - - legend.text = element_text(family = this_family, face="bold") , - legend.title = element_text(family = this_family, face="bold"), - - legend.position = "none" - - - ) - - }) - - - - output$obstacle6_newQ <- renderPlot({ - - thisData <- data_on_obstacle3()%>% arrange(Period) - - this_family <- "sans" - - data_test <- thisData%>% - dplyr::filter(Obstacles == input$obstacles)%>% - unique()%>% - ungroup() - - - ggplot(data = data_test , - aes(x = factor(Quarter), y = VALUE , fill = Year)) + - geom_bar(stat = "identity", position = position_dodge(preserve = "single"), alpha = 0.85, width=0.9)+ - geom_text(aes(label = paste0(round(VALUE,2),"%")))+ - geom_hline(yintercept=0, color="black")+ - scale_fill_manual("",values = c("#FDE7C9","#FBCC8D","#FAB65C","#F8A12C" ))+ - xlab("")+ - ylab("")+ - expand_limits(x= c(1, 5))+ - scale_colour_viridis_d()+ - labs(title = paste("Over the next three months, which of the following are expected to be obstacles for your business in",input$geo , "?" ), - subtitle = paste("% of respondents that identify",tolower(input$obstacles), "as an obstacle, ", input$specific_business_characteristics), - caption = paste("*",input$business_characteristics, "by less than 10% of respondents are not reported. \n\nSources:Canadian Chamber of Commerce Business Data Lab, Statistics Canada"))+ - theme( - panel.background = element_blank(), - axis.text.y = element_blank(), - - plot.title = element_text(size = 14, face="bold", family = this_family), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0, face= "italic"), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.minor.x = element_blank(), - panel.grid.minor.y = element_blank(), - - axis.ticks.x=element_blank(), - axis.ticks.y=element_blank(), - - - legend.text = element_text(family = this_family, face="bold") , - legend.title = element_text(family = this_family, face="bold"), - - legend.position = "none" - - - ) - - - }) - -} - diff --git a/CSBC_Shiny_app/outlook_server.R b/CSBC_Shiny_app/outlook_server.R deleted file mode 100644 index bc6cefa..0000000 --- a/CSBC_Shiny_app/outlook_server.R +++ /dev/null @@ -1,353 +0,0 @@ -outlook_server <- function(input, output, session) { - - data_outlook1 <- reactive({ - - - # Search question at StatCan - #================================ - # Future outlook for the business or organization over the next 12 months, fourth quarter of 2022 - outlook_Q3_2022_table <- "33-10-0630" - this_quarter <- "Q4 2022" - - # read tables - #============= - # check that outlook options are correctly spelled (i.e.somewhat pessimistic and not soemwhat pessimistic ) - outlook_Q4_22 <- cansim::get_cansim("33100630")%>% dplyr::mutate(Quarter = "Q4 2022") - outlook_Q3_22 <- cansim::get_cansim("33100567")%>% dplyr::mutate(Quarter = "Q3 2022") - outlook_Q1_22 <- cansim::get_cansim("33100488")%>% dplyr::mutate(Quarter = "Q1 2022") - outlook_Q4_21 <- cansim::get_cansim("33100426")%>% dplyr::mutate(Quarter = "Q4 2021") - outlook_Q3_21 <- cansim::get_cansim("33100393")%>% dplyr::mutate(Quarter = "Q3 2021") - - colnames(outlook_Q4_22)= colnames(outlook_Q1_22) - colnames(outlook_Q3_22)= colnames(outlook_Q1_22) - - - # combine data - #======================= - - data_outlook <- rbind(outlook_Q4_22, - outlook_Q3_22, - outlook_Q1_22, - outlook_Q4_21, - outlook_Q3_21) - - - data_outlook1 <- Data_cleaning_function_round1(data_outlook)%>% - dplyr::rename(Outlook = Future_outlook_of_the_business_or_organization)%>% - left_join(Business_characterisitcs_mapping, by="Business_characteristics")%>% - dplyr::filter(GEO==input$geo, - )%>% - mutate(Outlook = gsub("Future outlook of the business or organization, ","", as.character(Outlook)), - Outlook = gsub("Future outlook, ","", as.character(Outlook)), - Outlook = ifelse(Outlook == "Future outlook of the business or organization is unknown", "Unknown", Outlook), - Outlook = ifelse(Outlook == "soemwhat pessimistic", "somewhat pessimistic", Outlook), - Outlook1 = ifelse(Outlook == "very optimistic"| Outlook == "somewhat optimistic", "Optimistic", ifelse(Outlook == "very pessimistic"| Outlook == "somewhat pessimistic","Pessimistic", "Unknown")) - )%>% - group_by(Business_characteristics, Outlook1, Quarter)%>% - mutate(sum_value = sum(VALUE)) - - data_outlook1 - - - }) - - - output$outlook1 <- renderPlot({ - - # Plot line for combined Optimistic - #=================================== - #outlook_Q3_2022_table <- "33-10-0567" - # data with both optimistic and pessimistic - thisData <- data_outlook1()%>% - select(-Outlook, -VALUE)%>% - unique()%>% - dplyr::filter(#Business_characteristics == "All Industries", - Clean ==input$specific_business_characteristics, - Outlook1 %in% c("Optimistic", "Pessimistic"))%>% - unique()%>% - mutate(label1 = paste0(Outlook1,", ", round(sum_value),"%")) - - - - last_quarter = "Q4 2022" - level_order <- c("Q3 2021", "Q4 2021", "Q1 2022", "Q3 2022", "Q4 2022") - this_family <- "sans" - - - ggplot(thisData, aes(x = factor(Quarter, level = level_order), y = sum_value, - group = Outlook1, colour = Outlook1, label = Outlook1)) + - geom_line(size=1.2)+ - geom_point(size=2.5)+ - geom_hline(yintercept=0, color="#4F4E4E")+ - geom_dl(data = subset(thisData, Quarter== last_quarter),aes(label = label1, colour=Outlook1), method = list(dl.trans(x = x + .2), "last.bumpup",cex = 1.2, color="#4F4E4E"))+ - xlab("")+ - ylab("")+ - expand_limits(x= c(1, 6), y=c(60,80))+ - scale_color_manual("", values = c("#00B9B4", "#FE4812"))+ - scale_y_continuous(labels = function(x) paste0(x, "%"))+ - labs(title = paste0("Over the next 12 months, what is the future outlook for your business in ", input$geo, "?" ), - subtitle = paste0("% of respondents"), - caption = paste0("Note: Optimistic includes 'Somewhat optimistic' and 'Very optimistic'; Pessimistic includes 'Somewhat pessimistic' and 'Very pessimistic'. Responses do not sum up to 100% because\n of 'Unknown' responses. Question not included in Q2 2022.\n\nSources: Canadian Chamber of Commerce Business Data Lab; Statistics Canada, Canadian Survey on Business Conditions."))+ - theme( - panel.background = element_blank(), - axis.text.y = element_text( size=11, margin=margin(r=+10), color= "#4F4E4E", family = this_family), - axis.text.x = element_text( size=11, margin=margin(r=+10), color= "#4F4E4E", family = this_family), - - plot.title = element_text(size = 14, face="bold", family = this_family, color="#4F4E4E"), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0, color="#4F4E4E"), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.minor.x = element_blank(), - panel.grid.major.y = element_line(color="#4F4E4E"), - - axis.ticks.x=element_blank(), - axis.ticks.y=element_blank(), - - - legend.text = element_text(family = this_family, face="bold", color="#4F4E4E") , - legend.title = element_text(family = this_family, face="bold", color="#4F4E4E"), - - legend.position = "none" - - - ) - - - }) - - - - output$outlook2 <- renderPlot({ - this_quarter <- "Q4 2022" - - # outlook Bar chart by top/bottom 3 industries - #============================================== - - - # data_outlook2 <- data_outlook1%>% - data_outlook2 <- data_outlook1()%>% - filter(Quarter == this_quarter, - Outlook %in% c("very optimistic", "somewhat optimistic"), - sum_value >0) %>% - ungroup()%>% - mutate(this_font_face = case_when(Clean == "All Industries"~ 2, - Clean == "All employment sizes"~2, - Clean == "All ownerships" ~ 2, - Clean == "Ownership by all visible minorities" ~ 2, - Clean == "All business activities in the last 12 months"~ 2, - TRUE ~1), - Outlook = firstup(Outlook))%>% - select(-Outlook1, -sum_value)%>% - group_by(Business_characteristics)%>% - mutate(tot=sum(VALUE))%>% - arrange(desc(tot)) - - - - #==== - if(input$business_characteristics == "All industries"){ - data_outlook2 <- data_outlook2 %>% - dplyr::filter( Business_characteristics %in% Industries)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "North American Industry Classification System (NAICS), all industries" ~ "All Industries", - Business_characteristics == "Agriculture, forestry, fishing and hunting [11]" ~ "Agriculture, forestry, fishing", - Business_characteristics == "Mining, quarrying, and oil and gas extraction [21]" ~ "Mining, oil, gas extraction", - Business_characteristics == "Construction [23]" ~ "Construction", - Business_characteristics == "Manufacturing [31-33]" ~ "Manufacturing", - Business_characteristics == "Wholesale trade [41]" ~ "Wholesale trade", - Business_characteristics == "Retail trade [44-45]" ~ "Retail trade", - Business_characteristics == "Transportation and warehousing [48-49]" ~ "Transportation, warehousing", - Business_characteristics == "Information and cultural industries [51]" ~ "Information and culture", - Business_characteristics == "Finance and insurance [52]" ~ "Finance and insurance", - Business_characteristics == "Real estate and rental and leasing [53]" ~ "Real estate, rental, leasing", - Business_characteristics == "Professional, scientific and technical services [54]" ~ "Professional services", - Business_characteristics == "Administrative and support, waste management and remediation services [56]" ~ "Administration and support services" , - Business_characteristics == "Health care and social assistance [62]" ~ "Health care, social assistance", - Business_characteristics == "Arts, entertainment and recreation [71]" ~ "Arts, entertainment, recreation" , - Business_characteristics == "Accommodation and food services [72]" ~ "Accommodation and food services" , - Business_characteristics == "Other services (except public administration) [81]" ~ "Other services", - TRUE ~ "Error"))%>% - arrange(VALUE) - }else if(input$business_characteristics == "All employment sizes"){ - - data_outlook2 <- data_outlook2 %>% - dplyr::filter(Business_characteristics %in% Employment_size)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Business or organization size of employment, all employment sizes" ~ "All employment sizes", - TRUE ~ as.character(Business_characteristics)))%>% - arrange(VALUE) - - }else if(input$business_characteristics == "All ownerships"){ - data_outlook2 <- data_outlook2 %>% - dplyr::filter( Business_characteristics %in% Majority_Ownership)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Majority ownership, all ownerships" ~ "All ownerships", - Business_characteristics == "Majority ownership, woman" ~ "Majority woman", - Business_characteristics == "Majority ownership, First Nations, Metis or Inuit" ~ "Majority First Nations, Metis or Inuit", - Business_characteristics == "Majority ownership, immigrant to Canada" ~ "Majority immigrant to Canada", - Business_characteristics == "Majority ownership, person with a disability" ~ "Majority person with a disability", - Business_characteristics == "Majority ownership, member of LGBTQ2 community" ~ "Majority member of LGBTQ2", - TRUE ~ "Error"))%>% - arrange(VALUE) - - - }else if(input$business_characteristics == "All visible minorities"){ - - data_outlook2 <- data_outlook2 %>% - dplyr::filter(Business_characteristics %in% Ownership_minority)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Ownership by visible minority, all visible minorities" ~ "Ownership by all visible minorities", - Business_characteristics == "Ownership by visible minority, South Asian" ~ "Ownership by South Asian", - Business_characteristics == "Ownership by visible minority, Chinese" ~ "Ownership by Chinese", - Business_characteristics == "Ownership by visible minority, Black" ~ "Ownership by Black", - Business_characteristics == "Ownership by visible minority, Filipino" ~ "Ownership by Filipino", - Business_characteristics == "Ownership by visible minority, Latin American" ~ "Ownership by Latin American", - Business_characteristics == "Ownership by visible minority, Arab" ~ "Ownership by Arab", - Business_characteristics == "Ownership by visible minority, Southeast Asian" ~ "Ownership by Southeast Asian", - Business_characteristics == "Ownership by visible minority, West Asian" ~ "Ownership by West Asian", - Business_characteristics == "Ownership by visible minority, Korean" ~ "Ownership by Korean", - Business_characteristics == "Ownership by visible minority, Japanese" ~ "Ownership by Japanese", - Business_characteristics == "Ownership by visible minority, other visible minority" ~ "Ownership by other visible minority", - Business_characteristics == "Ownership by visible minority, preferred not to say" ~ "Ownership by preferred not to say", - TRUE ~ "Error"))%>% - arrange(VALUE) - }else{ - data_outlook2 <- data_outlook2 %>% - dplyr::filter(Business_characteristics %in% Business_activity)%>% - mutate(Business_characteristics = case_when( - Business_characteristics == "Business or organization activity in the last 12 months, all business or organization activities" ~ "All business activities in the last 12 months", - Business_characteristics == "Sold goods to businesses in Canada who then resold them outside of Canada" ~ paste("Sold goods to businesses in Canada who \nthen resold them outside of Canada"), - Business_characteristics == "Relocated any business or organizational activities or employees from another country into Canada" ~ paste("Relocated any business activities or \nemployees from another country into Canada"), - TRUE ~ as.character(Business_characteristics)))%>% - arrange(VALUE) - - } - #==== - - - if(input$business_characteristics == "All industries"){ - fac_order <- data_outlook2 %>% - filter(Business_characteristics != "All Industries") %>% - arrange(tot) %>% - select(Business_characteristics)%>%unique()%>% - pull(Business_characteristics) - - fac_order <- c(fac_order, "All Industries") - - this_face <- ifelse(fac_order == "All Industries", "bold", "plain") - this_color <- ifelse(fac_order == "All Industries", "#4F4E4E", "gray25") - - business_char <- "by industry" - - }else if(input$business_characteristics == "All employment sizes"){ - fac_order <- c("1 to 4 employees" ,"5 to 19 employees","20 to 99 employees","100 or more employees", "All employment sizes") - this_face <- ifelse(fac_order == "All employment sizes", "bold", "plain") - this_color <- ifelse(fac_order == "All employment sizes", "#4F4E4E", "gray25") - business_char <- "by employment size" - - }else if(input$business_characteristics == "All ownerships"){ - fac_order <- data_outlook2 %>% - filter(Business_characteristics != "All ownerships") %>% - arrange(tot) %>% select(Business_characteristics)%>%unique()%>% - pull(Business_characteristics) - - - fac_order <- c(fac_order, "All ownerships") - - this_face <- ifelse(fac_order == "All ownerships", "bold", "plain") - this_color <- ifelse(fac_order == "All ownerships", "#4F4E4E", "gray25") - - business_char <- "by majority owned" - - }else if(input$business_characteristics == "All visible minorities"){ - fac_order <- data_outlook2 %>% - filter(Business_characteristics != "Ownership by all visible minorities") %>% - arrange(tot) %>% select(Business_characteristics)%>%unique()%>% - pull(Business_characteristics) - - - fac_order <- c(fac_order, "Ownership by all visible minorities") - - - this_face <- ifelse(fac_order == "Ownership by all visible minorities", "bold", "plain") - this_color <- ifelse(fac_order == "Ownership by all visible minorities", "#4F4E4E", "gray25") - business_char <- "by visible minority" - - }else{ - fac_order <- data_outlook2 %>% - filter( Business_characteristics != "All business activities in the last 12 months") %>% - arrange(tot) %>% select(Business_characteristics)%>%unique()%>% - pull(Business_characteristics) - - - fac_order <- c(fac_order, "All business activities in the last 12 months") - - - this_face <- ifelse(fac_order == "All business activities in the last 12 months", "bold", "plain") - this_color <- ifelse(fac_order == "All business activities in the last 12 months", "black", "gray25") - business_char <- "by all business activities" - - } - - - data_outlook2 <- data_outlook2%>% filter(Business_characteristics %in% fac_order) - - - data_total <- data_outlook2 %>% group_by(Business_characteristics)%>%mutate(tot=sum(VALUE))%>% - select(Business_characteristics, tot)%>% - unique()%>%filter(Business_characteristics %in% fac_order)%>% - arrange(desc(tot)) - - this_family <- "sans" - - ggplot(data_outlook2, aes(fill = Outlook, y = VALUE, - x=factor(Business_characteristics, levels = fac_order) )) + - geom_bar(stat="identity", width=0.6, position="stack")+ - - geom_text(aes(label=paste0(round(VALUE),"%")), position = position_stack(vjust = 0.5), size=5, color="white", fontface=2) + - geom_text(aes(x=factor(Business_characteristics, levels = fac_order), y= tot + 3.5, fontface= rev(this_face), label = paste0(round(tot), "%"), fill = NULL),size=5, data = data_total) + - scale_fill_manual("",values = c("Very optimistic"="#00a09b" ,"Somewhat optimistic"="#00d3cd"))+ - expand_limits(x= c(-0.5, 7), y =c(0, 110 ))+ - scale_color_manual(values = c('red' = 'red', 'green' = 'green3', 'black' = 'black'), guide = "none")+ - coord_flip()+ - ylab("") + - xlab("")+ - labs(title = paste0("Over the next 12 months, what is the future outlook for your business in ", input$geo, "?" ), - subtitle = paste0("% of respondents, by top to bottom most optimistic industries"), - caption = paste0("Sources: Canadian Chamber of Commerce Business Data Lab; Statistics Canada, Canadian Survey on Business Conditions."))+ - theme_minimal()+ - theme( - axis.text.y = element_text(face = this_face, size=11, margin=margin(r=-10), color= "black", family = this_family), - axis.text.x = element_blank(), - - plot.title = element_text(size = 14, face="bold", family = this_family), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0), - plot.title.position = "plot", - plot.caption.position = "plot", - - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - - - legend.text =element_text(family = this_family, face="bold") , - legend.title = element_text(family = this_family, face="bold"), - - legend.position =c(0.4, 0) , - legend.direction = "horizontal" - ) #+ - # annotate("text", x=5, y=100, label= paste("Most Optimistic\n(top 3)"), colour = "#00B9B4", fontface = "bold")+ - # annotate("text", x=2, y=100, label= paste("Least Optimistic\n(bottom 3)"), colour = "#FE4812", fontface = "bold" ) - - - - - }) - - -} \ No newline at end of file diff --git a/CSBC_Shiny_app/server.R b/CSBC_Shiny_app/server.R deleted file mode 100644 index 25d4caa..0000000 --- a/CSBC_Shiny_app/server.R +++ /dev/null @@ -1,49 +0,0 @@ - -library(dplyr) -library(stringr) -library(ggplot2) -library(cansim) -library(tidyr) -library(tidyverse) -library(directlabels) -library(ggrepel) - -source("expected_to_change_server.R") -source("obstacle_server_newQuarter.R") -source("outlook_server.R") -source("talent_server_newQuarter.R") - - -server <- function(input, output, session) { - - updateTabItems(session, "sidebar", "obstacles_newQ") - - observeEvent(input$business_characteristics, { - if (input$business_characteristics == "All industries") { - choices <-Industries_clean - updateSelectInput(inputId = "specific_business_characteristics", choices = choices, selected = "All Industries") - } else if (input$business_characteristics == "All employment sizes") { - choices <-Employment_size_clean - updateSelectInput(inputId = "specific_business_characteristics", choices = choices, selected = "All employment sizes") - } else if (input$business_characteristics == "All ownerships") { - choices <- Majority_Ownership_clean - updateSelectInput(inputId = "specific_business_characteristics", choices = choices, selected = "All ownerships") - - } else if (input$business_characteristics == "All visible minorities") { - choices <- Ownership_minority_clean - updateSelectInput(inputId = "specific_business_characteristics", choices = choices, selected = "Ownership by all visible minorities") - } else { - choices <- Business_activity_clean - updateSelectInput(inputId = "specific_business_characteristics", choices = choices, selected = "All business activities in the last 12 months") - } - - - }) - - expected_to_change_server(input, output, session) - obstacle_server_newQuarter(input, output, session) - outlook_server(input, output, session) - talent_server_newQuarter(input, output, session) - - -} diff --git a/CSBC_Shiny_app/talent_server_newQuarter.R b/CSBC_Shiny_app/talent_server_newQuarter.R deleted file mode 100644 index e0f24fe..0000000 --- a/CSBC_Shiny_app/talent_server_newQuarter.R +++ /dev/null @@ -1,300 +0,0 @@ -talent_server_newQuarter <- function(input, output, session) { - - - output$talent1_newQ <- renderPlot({ - - Slide19_Q4_22 <- cansim::get_cansim("3310060301") - Slide19_Q3_22 <- cansim::get_cansim("3310053401") - Slide19_Q2_22 <- cansim::get_cansim("3310050401") - Slide19_Q1_22 <- cansim::get_cansim("3310046901") - - Slide19_Q4_22_clean = Data_cleaning_function(Slide19_Q4_22)%>% dplyr::mutate(Quarter = "Q4 2022") - Slide19_Q3_22_clean = Data_cleaning_function(Slide19_Q3_22)%>% dplyr::mutate(Quarter = "Q3 2022") - Slide19_Q2_22_clean = Data_cleaning_function(Slide19_Q2_22)%>% dplyr::mutate(Quarter = "Q2 2022") - Slide19_Q1_22_clean = Data_cleaning_function(Slide19_Q1_22)%>% dplyr::mutate(Quarter = "Q1 2022") - - Required_dataset_19_plot1 <- rbind(Slide19_Q4_22_clean, - Slide19_Q3_22_clean, - Slide19_Q2_22_clean, - Slide19_Q1_22_clean - )%>% - left_join(Business_characterisitcs_mapping, by = "Business_characteristics")%>% - dplyr::filter( Clean == input$specific_business_characteristics, - Obstacles_for_the_business_or_organization %in% c("Recruiting skilled employees","Retaining skilled employees", - "Shortage of labour force"), - GEO == input$geo)%>% - mutate(font_size=ifelse(Quarter == "Q4 2022", "bold", "plain"))%>% - rename(Obstacles = Obstacles_for_the_business_or_organization) - - - - level_order <- c( "Q1 2022", "Q2 2022", "Q3 2022", "Q4 2022") - - this_family <- "sans" - - - ggplot(data = Required_dataset_19_plot1 , - aes(x = factor(Quarter, level = level_order), y = VALUE , fill = Quarter)) + - geom_bar(stat = "identity", position = position_dodge(), alpha = 0.85, width=1)+ - geom_hline(yintercept=0, color="black")+ - scale_fill_manual("",values = c("#FDE7C9","#FBCC8D","#FAB65C","#F8A12C" , "green"),labels=level_order, breaks=level_order)+ - geom_text(aes(label = paste0(round(VALUE,2),"%"), fontface=font_size), colour = "black", - position = position_stack(vjust = 1.05, reverse = TRUE))+ - ylab("") + xlab("")+ - labs(title = paste0("Over the next three months, which are expected to be obstacles for your business in ", input$geo, "?"), - subtitle = "% of respondents, by labour obstacle")+ - theme( - panel.background = element_blank(), - axis.text.y = element_blank(), - axis.text.x = element_blank(), - - plot.title = element_text(size = 14, face="bold", family = this_family), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0, face= "italic"), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.minor.x = element_blank(), - panel.grid.major.y = element_blank(), - - axis.ticks.x=element_blank(), - axis.ticks.y=element_blank(), - - - legend.text =element_text(family = this_family, face="bold") , - legend.title = element_text(family = this_family, face="bold"), - - strip.placement = "outside", - strip.background = element_blank(), - strip.text.x = element_text(face="bold"), - - panel.spacing = unit(6, "lines"), - - legend.position = "bottom" - - - )+ - facet_wrap(~Obstacles, nrow = 1, strip.position = "bottom") - - }) - - - - - output$talent3_newQ <- renderPlot({ - - - - # Q3 2022 table - #============== - - Q4_2022_tableNumber <- "33100603" - tableNumber <- "33-10-0534" - - Slide22_Q4_22 <- cansim::get_cansim(Q4_2022_tableNumber) - - Slide22_Q4_22_clean = Data_cleaning_function(Slide22_Q4_22) - - # Similar plot as report - #======================= - - - required_table <- Slide22_Q4_22_clean %>% - dplyr::filter(Business_characteristics %in% Industries, - GEO == input$geo) %>% - dplyr::filter(grepl("skilled|labour", Obstacles_for_the_business_or_organization)) %>% - dplyr::mutate(VALUE = tidyr::replace_na(VALUE,0), - Business_characteristics = case_when( - Business_characteristics == "North American Industry Classification System (NAICS), all industries" ~ "All Industries*", - Business_characteristics == "Agriculture, forestry, fishing and hunting [11]" ~ "Agriculture, forestry, fishing", - Business_characteristics == "Mining, quarrying, and oil and gas extraction [21]" ~ "Mining, oil and gas", - Business_characteristics == "Construction [23]" ~ "Construction", - Business_characteristics == "Manufacturing [31-33]" ~ "Manufacturing", - Business_characteristics == "Wholesale trade [41]" ~ "Wholesale trade", - Business_characteristics == "Retail trade [44-45]" ~ "Retail trade", - Business_characteristics == "Transportation and warehousing [48-49]" ~ "Transportation, warehousing", - Business_characteristics == "Information and cultural industries [51]" ~ "Information, culture", - Business_characteristics == "Finance and insurance [52]" ~ "Finance, insurance", - Business_characteristics == "Real estate and rental and leasing [53]" ~ "Real estate", - Business_characteristics == "Professional, scientific and technical services [54]" ~ "Professional services", - Business_characteristics == "Administrative and support, waste management and remediation services [56]" ~ "Administrative services" , - Business_characteristics == "Health care and social assistance [62]" ~ "Health care, social assistance", - Business_characteristics == "Arts, entertainment and recreation [71]" ~ "Arts, entertainment, recreation" , - Business_characteristics == "Accommodation and food services [72]" ~ "Accommodation, food services" , - Business_characteristics == "Other services (except public administration) [81]" ~ "Other services", - TRUE ~ "Error") )%>% - rename(Obstacles = Obstacles_for_the_business_or_organization)%>% - select(-"GEO")%>% - group_by(Business_characteristics)%>% - mutate(order = mean(VALUE), - bin = ifelse(order>41 | order < 24, "yes", "no"), - font_size=ifelse(Business_characteristics == 'All Industries*', "bold","plain"))%>% - arrange(order)%>% - ungroup() - - # Order business characteristics by the average of obstacles - #============================================================ - fac_order <- required_table %>% - dplyr::filter(Business_characteristics != "All Industries*") %>% - pull(Business_characteristics) - - - fac_order <- unique(c(fac_order, "All Industries*")) - this_face <- ifelse(fac_order == "All Industries*", "bold", "plain") - this_family <- "sans" - - min_value <- min(required_table$VALUE) - max_value <- max(required_table$VALUE) - avr <- mean(min_value, max_value) - - ggplot(required_table, aes(x = factor(Obstacles, levels=c("Shortage of labour force",'Recruiting skilled employees',"Retaining skilled employees")), - y = factor(Business_characteristics, levels = fac_order))) + - geom_tile(aes(fill = VALUE), colour = "white") + - geom_text(aes(label = paste0(VALUE, "%"), fontface=font_size), color = "black", size=4) + - scale_x_discrete(position = "top") + - scale_fill_gradientn(colours = c("#FE4812","yellow", "green3"), - breaks=c(min_value, 30, max_value), - labels=c("Lower % of businesses","","Highest % of businesses"), - values = scales::rescale(c(100, 35, 0)))+ - theme_minimal()+ - theme( - axis.text.y = ggtext::element_markdown(face = this_face, size=11, margin=margin(r=-10), color= "black", family = this_family), - axis.text.x = element_text( size=11, color="black"), - - plot.title = element_text(size = 14, face="bold", family = this_family), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - - legend.text =element_text(family = this_family, face="bold", color="black", size=9) , - legend.title = element_blank(), - - legend.key.height = unit(0.3, 'cm'), #change legend key height - legend.key.width = unit(3, 'cm'), #change legend key width - legend.position ="bottom" - )+ - labs(y ="", - x="", - title= paste0("Over the next three months, which of the following are expected to be obstacles for your business", input$geo, "?"), - subtitle="% of respondents, by industry", - caption = paste0("*Note: Industies sorted in descending order based on the average across the three responses. \n\nSources: Canadian Chamber of Commerce Business Data Lab; Statistics Canada, Canadian Survey on Business Conditions (Table: ",tableNumber, ").")) - - }) - - - - - output$talent5_newQ <- renderPlot({ - - - Slide_25 = get_cansim("3310056601") # Q3 2022 data - Slide_25_clean = Data_cleaning_function(Slide_25)%>% - rename(workArrangement = "Work_arrangements_anticipated_in_the_next_three_months")%>% - dplyr::filter(Business_characteristics %in% Industries, - GEO == input$geo) - - - dt1 <- Slide_25_clean %>% - mutate(workArrangement = case_when( - workArrangement %in% c("Average percentage of workforce anticipated to work on-site most hours", - "Average percentage of workforce anticipated to work the same amount of hours on-site and remotely", - "Average percentage of workforce anticipated to work remotely most hours")~ "Hybird work", - workArrangement == "Average percentage of workforce anticipated to work on-site exclusively" ~ "Work exclusively on-site" , - TRUE ~ "Work remotely exclusively"), - Business_characteristics = case_when( - Business_characteristics == "North American Industry Classification System (NAICS), all industries" ~ "All Industries", - Business_characteristics == "Agriculture, forestry, fishing and hunting [11]" ~ "Agriculture, forestry, fishing", - Business_characteristics == "Mining, quarrying, and oil and gas extraction [21]" ~ "Mining, quarrying, oil, gas extraction", - Business_characteristics == "Construction [23]" ~ "Construction", - Business_characteristics == "Manufacturing [31-33]" ~ "Manufacturing", - Business_characteristics == "Wholesale trade [41]" ~ "Wholesale trade", - Business_characteristics == "Retail trade [44-45]" ~ "Retail trade", - Business_characteristics == "Transportation and warehousing [48-49]" ~ "Transportation, warehousing", - Business_characteristics == "Information and cultural industries [51]" ~ "Information and culture", - Business_characteristics == "Finance and insurance [52]" ~ "Finance and insurance", - Business_characteristics == "Real estate and rental and leasing [53]" ~ "Real estate, rental, leasing", - Business_characteristics == "Professional, scientific and technical services [54]" ~ "Professional services", - Business_characteristics == "Administrative and support, waste management and remediation services [56]" ~ "Administration and support services" , - Business_characteristics == "Health care and social assistance [62]" ~ "Health care, social assistance", - Business_characteristics == "Arts, entertainment and recreation [71]" ~ "Arts, entertainment, recreation" , - Business_characteristics == "Accommodation and food services [72]" ~ "Accomodation and food services" , - Business_characteristics == "Other services (except public administration) [81]" ~ "Other services", - TRUE ~ "Error"))%>% - filter(Business_characteristics != "Error")%>% - group_by(GEO, Business_characteristics, workArrangement)%>% - mutate(VALUE = sum(VALUE))%>% - unique() - - - - # - data1_sum <- dt1 %>% - dplyr::group_by(Business_characteristics)%>% - dplyr::mutate(VALUE=sum(VALUE))%>%slice(n()) - - # - fac_order <- dt1 %>% - filter(workArrangement == "Work remotely exclusively", - Business_characteristics != "All Industries") %>% - arrange(VALUE) %>% - pull(Business_characteristics) - - fac_order <- c(fac_order, "All Industries") - - this_face <- ifelse(fac_order == "All Industries", "bold", "plain") - this_color <- ifelse(fac_order == "All Industries", "black", "gray25") - this_family <- "sans" - - thisLevel <- c("Work remotely exclusively", "Hybird work", "Work exclusively on-site" ) - thisLevels1 <- thisLevel[!thisLevel %in% "Work remotely exclusively"] - thisLevels1 <- c("Work remotely exclusively", thisLevels1) - - - ggplot(dt1, aes(fill = factor(workArrangement, levels= thisLevels1), - y=VALUE, (x=factor(Business_characteristics, levels = fac_order)))) + - geom_bar(position=position_fill(reverse = TRUE), stat="identity", width=0.8)+ - scale_fill_manual("", values = c("#FE4812","#00B9B4","#F8A12C"))+ - geom_text(aes(label = paste0(VALUE,"%")), position = position_fill(vjust = 0.6, reverse=TRUE), colour = "white", size=4, fontface =2)+ - #geom_text(data=data1_sum, aes(label=paste0(VALUE,"%")),hjust=0.5, colour="grey", size=3, position = position_fill(vjust = -0.05, reverse=TRUE))+ - coord_flip()+ - ylab("") + - xlab("")+ - labs(title = paste0("Over the next three months, what percentage of the employees of your business is anticipated to do each of the following for ",input$geo , "?"), - subtitle = "% of respondents, by industry")+ - theme_minimal()+ - theme( - axis.text.y = element_text(face = this_face, size=11, color= "black", family = this_family), - axis.text.x = element_blank(), - - plot.title = element_text(size = 14, face="bold", family = this_family), - plot.subtitle = element_text(size = 14, color="gray58", family = this_family), - - plot.caption = element_text(hjust = 0, face= "italic"), - plot.title.position = "plot", - plot.caption.position = "plot", - - - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - - legend.text =element_text(family = this_family), - legend.position ="bottom" , - legend.box ="horizontal" - ) - - - - - - - - }) -} \ No newline at end of file diff --git a/CSBC_Shiny_app/ui.R b/CSBC_Shiny_app/ui.R deleted file mode 100644 index b37c084..0000000 --- a/CSBC_Shiny_app/ui.R +++ /dev/null @@ -1,138 +0,0 @@ -library(shiny) -library(shinydashboard) -library(dplyr) -library(tidyr) -library(tidyverse) -library(DT) - - -sidebar <- dashboardSidebar( - sidebarMenu(id = "sidebar", - # recurring survey questions - #============================ - menuItem("Business expectations", tabName = "expectation", icon = icon("dashboard")), - - menuItem("Business obstacles", tabName = "obstacles_newQ", icon = icon("dashboard")), - - menuItem("Business outlook", tabName = "outlook", icon = icon("dashboard")), - - menuItem("Competition for talent", tabName = "talents_newQ", icon = icon("dashboard")) - ) -) - - -body <- dashboardBody( - - includeCSS("www/chamber_theme.css"), - fluidRow(column(4, selectInput("geo", "Select province or territory", choices = Geography)), - column(4, selectInput("business_characteristics", "Select industry", - selected= "All industries", - choices = c("All industries", "All employment sizes", "All ownerships", "All visible minorities", "All business activities")) ), - column(4,selectInput("specific_business_characteristics", "Select specific business characteristic", choices = NULL,selected = "All Industries") )), - - tags$script(HTML(' - $(document).ready(function() { - $("header").find("nav").append(\' Canadian Survey on Business Conditions - Q4 2022 \'); - }) - ')), - tabItems( - tabItem(tabName = "obstacles", - fluidRow( - box(width=12, plotOutput("obstacle1")), - box(width=12, plotOutput("obstacle2")) - ) - ), - tabItem(tabName = "obstacles_newQ", - - fluidRow( - column(11,box(width=12, plotOutput("obstacle1_newQ")))), - fluidRow( - column(1, ""), - column(6, selectInput("obstacles", "Investigate obstacles by industry", choices = list_obstacles)), - column(5, "")), - fluidRow( - column(11, box(width=12, plotOutput("obstacle2_newQ"))), - column(11, box(width=12, plotOutput("obstacle4_newQ"))) - ) - ), - tabItem(tabName = "outlook", - fluidRow( - column(2,""), - column(8,""), - column(2,"") - ), - fluidRow( - box(plotOutput("outlook1"), width=12), - box(plotOutput("outlook2"), width=12) - ) - ), - tabItem(tabName = "expectation", - uiOutput("cityControls") - ), - tabItem(tabName = "labourShortages", - h2("Labour shortages") - ), - - tabItem(tabName = "recovery", - fluidRow( - column(2,""), - column(8, - radioButtons( - "sort", "Sort businesses by --->", - choices = c("Better position", "Same position", "Worse position", - "Unknown"), - selected = "Better position", - inline = TRUE)), - column(2, ""), - box( plotOutput("plot1"), width=12) - ), - fluidRow( - box(plotOutput("plot2"), width=6), - box(plotOutput("plot3"), width=6)) - - ), - - tabItem(tabName = "debt", - fluidRow( - column(2,""), - column(8, - radioButtons( - "sort_debt", "Sort by debt tolerance --->", - choices = c("Cannot take on more debt", "Can take on more debt", "Unknown"), - selected = "Cannot take on more debt", - inline = TRUE)), - column(2, ""), box(width=12,plotOutput("plot_debt3"))), - fluidRow( - box(width=6, plotOutput("plot_debt1")), - box(width=6, plotOutput("plot_debt2")) - ) - ), - tabItem(tabName = "pressures", - fluidRow( - box(width=12, plotOutput("pressure1")), - box(width=12, plotOutput("pressure2")) - ) - ), - - tabItem(tabName = "talents_newQ", - fluidRow( - column(12, box(width=12, plotOutput("talent1_newQ"))) - ) - ), - tabItem(tabName = "challenges", - h2("Supply chain challenges tab content") - ), - tabItem(tabName = "digital", - h2("Digital tab content") - ), - tabItem(tabName = "strategy", - h2("Business strategy tab content")) - ) -) - -# Put them together into a dashboardPage -dashboardPage( - dashboardHeader(title = tags$img(src='Logo.PNG', height = '60', width ='200')), - sidebar, - body -) diff --git a/CSBC_Shiny_app/www/Logo.PNG b/CSBC_Shiny_app/www/Logo.PNG deleted file mode 100644 index cac05eefe7160988a782942bc5efb902ff3e6fea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34370 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.active>a, .skin-blue .sidebar-menu>li:hover>a { - color: blue; - background: #1e282c; - border-left-color: #3c8dbc;*/ -}