Code
rm(list=ls())
This file brings together estimates of per country EU consumption of Sea bream, Sea bass, Carp, Salmon and Rainbow Trout into a single dataset in long format.
rm(list=ls())
library(readxl)
library(tidyverse)
library(scales)
library(DT)
sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS 14.3.1
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.11.0
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
time zone: Europe/London
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] DT_0.28 scales_1.2.1 lubridate_1.9.2 forcats_1.0.0
[5] stringr_1.5.0 dplyr_1.1.2 purrr_1.0.1 readr_2.1.4
[9] tidyr_1.3.0 tibble_3.2.1 ggplot2_3.4.2 tidyverse_2.0.0
[13] readxl_1.4.2
loaded via a namespace (and not attached):
[1] gtable_0.3.3 jsonlite_1.8.4 compiler_4.3.0 tidyselect_1.2.0
[5] yaml_2.3.7 fastmap_1.1.1 R6_2.5.1 generics_0.1.3
[9] knitr_1.43 htmlwidgets_1.6.2 munsell_0.5.0 pillar_1.9.0
[13] tzdb_0.4.0 rlang_1.1.1 utf8_1.2.3 stringi_1.7.12
[17] xfun_0.39 timechange_0.2.0 cli_3.6.1 withr_2.5.0
[21] magrittr_2.0.3 digest_0.6.31 grid_4.3.0 rstudioapi_0.14
[25] hms_1.1.3 lifecycle_1.0.3 vctrs_0.6.2 evaluate_0.21
[29] glue_1.6.2 cellranger_1.1.0 fansi_1.0.4 colorspace_2.1-0
[33] rmarkdown_2.22 tools_4.3.0 pkgconfig_2.0.3 htmltools_0.5.5
This file contains data on:
EU country codes (from Eurostat)
EUFOMA apparent consumption estimates (live weight equivalent) in various EU countries of Seabass (2016), Seabream (2019) and Carp(2018)
Portion trout and large trout estimates come from the EUFOMA large trout in the EU (2020) study, using apparent consumption estimates for large trout and all trout respectively
Salmon consumption estimates are extracted from the chart from page 42 of the Mowi (2023) industry report for France, Germany, Italy, Spain and Sweden only.
Population data for EU27 countries to estimate salmon consumption (from Eurostat)
<-"../1_input_data/EUFOMA_consumption_data.xlsx"
xl_data <- read_excel(xl_data,sheet = "country_codes")
country_codes <- read_excel(xl_data,sheet = "seabass_2016")
bass <- read_excel(xl_data,sheet = "seabream_2019")
bream <- read_excel(xl_data,sheet = "carp_2018")
carp <- read_excel(xl_data,sheet = "trout_2020")
trout <- read_excel(xl_data,sheet = "salmon_2022_raw")
salmon <- read_excel("../1_input_data/country populations.xlsx",sheet = "EU27populations2022") population
Mowi industry report only provides salmon consumption estimates for 5 EU countries. For other countries, we need estimate salmon consumption. I do this by assuming:
per capita consumption in the Denmark and Finland is equal to per capita consumption in Sweden
per capita consumption in Netherlands, Belgium, Austria, Luxembourg and Ireland is equal to per capita consumption in Germany
per capita consumption in Portugal, Greece, Cyprus and Malta is equal to per capita consumption in Italy
the remainder is equally distributed across the rest of the EU
I also assume that the Mowi industry reports estimate for EU+UK market size actually excludes the UK, based on comparisons with EUFOMA balance sheet data (https://www.eumofa.eu/supply-balance).
I first extract aggregate EU consumption of salmon…
<- salmon %>% filter(Country=="EU27") %>% pull(Tons) %>%mean()
EU_salmon EU_salmon
[1] 1141000
I then estimate per capita consumption of salmon (in Tons) for the three reference countries, Sweden, Italy and Germany.
<-
per_capita_salmon %>%
salmon filter(Country %in% c("Sweden","Germany","Italy")) %>%
left_join(population,by="Country") %>%
mutate(per_capita=Tons/pop) %>%
select(Country,per_capita) %>%
rename(ref_country=Country)
per_capita_salmon
# A tibble: 3 × 2
ref_country per_capita
<chr> <dbl>
1 Germany 0.00285
2 Italy 0.00235
3 Sweden 0.00555
I then assign these per capita consumption values to selected other countries, and calculate aggregate consumption in those countries.
#Assign country groups
<- c("Denmark","Finland")
nordic <- c("Austria","Netherlands","Belgium","Luxembourg","Ireland")
germanic <- c("Portugal","Greece","Malta","Cyprus")
italian
#Estimate salmon consumption in these countries
<- population %>%
salmon_ref_countries filter(Country %in% c(nordic,germanic,italian)) %>%
mutate(
ref_country=
case_when(
%in% nordic ~ "Sweden",
Country %in% germanic ~ "Germany",
Country %in% italian ~ "Italy",
Country TRUE ~ "Error"
%>%
)) left_join(per_capita_salmon,by="ref_country") %>%
mutate(
Tons=pop*per_capita,
Estimate=str_c("ref country per capita - ",str_to_lower(ref_country))) %>%
select(Country,Tons,Estimate)
salmon_ref_countries
# A tibble: 11 × 3
Country Tons Estimate
<chr> <dbl> <chr>
1 Belgium 33079. ref country per capita - germany
2 Denmark 32592. ref country per capita - sweden
3 Ireland 14407. ref country per capita - germany
4 Greece 24630. ref country per capita - italy
5 Cyprus 2130. ref country per capita - italy
6 Luxembourg 1838. ref country per capita - germany
7 Malta 1227. ref country per capita - italy
8 Netherlands 50086. ref country per capita - germany
9 Austria 25566. ref country per capita - germany
10 Portugal 24376. ref country per capita - italy
11 Finland 30787. ref country per capita - sweden
I then estimate consumption in the remainder of EU countries, by assuming per capita consumption in these countries is equal.
#Estimate residual aggregate salmon consumption
<- EU_salmon*2-sum(salmon$Tons)-sum(salmon_ref_countries$Tons)
salmon_residual_aggregate
#Calculate consumption in each country by multiplying aggregate by their population share
<- population %>%
salmon_residual_countries filter(!(Country %in% c(salmon$Country,germanic,italian,nordic))) %>%
mutate(
Tons=pop/sum(pop)*salmon_residual_aggregate,
Estimate="residual EU per capita"
%>%
) select(-pop)
salmon_residual_countries
# A tibble: 11 × 3
Country Tons Estimate
<chr> <dbl> <chr>
1 Bulgaria 4549. residual EU per capita
2 Czechia 6995. residual EU per capita
3 Estonia 886. residual EU per capita
4 Croatia 2569. residual EU per capita
5 Latvia 1248. residual EU per capita
6 Lithuania 1866. residual EU per capita
7 Hungary 6444. residual EU per capita
8 Poland 25045. residual EU per capita
9 Romania 12666. residual EU per capita
10 Slovenia 1402. residual EU per capita
11 Slovakia 3615. residual EU per capita
Finally I combine the data into final table
#Combined table
<-salmon %>%
salmonfilter(Country!="EU27") %>%
mutate(Estimate="mowi industry report") %>%
rbind(salmon_ref_countries,salmon_residual_countries)
salmon
# A tibble: 27 × 3
Country Tons Estimate
<chr> <dbl> <chr>
1 France 269000 mowi industry report
2 Germany 237000 mowi industry report
3 Italy 139000 mowi industry report
4 Spain 130000 mowi industry report
5 Sweden 58000 mowi industry report
6 Belgium 33079. ref country per capita - germany
7 Denmark 32592. ref country per capita - sweden
8 Ireland 14407. ref country per capita - germany
9 Greece 24630. ref country per capita - italy
10 Cyprus 2130. ref country per capita - italy
# ℹ 17 more rows
And check that the values look reasonable (TRUE means working ok).
#Check
near(EU_salmon,sum(salmon$Tons))
[1] TRUE
Finally I plot some charts for reference.
Estimated salmon consumption in each EU country
%>%
salmon ggplot(
aes(
x=Tons,
y=reorder(Country,Tons),
fill=Estimate
+
)) geom_col()+
labs(
title = "Estimated Atlantic Salmon consumption in the EU (2022)",
y="Country",
fill="Source/method") +
scale_fill_brewer(palette="Dark2") +
theme_light() +
scale_x_continuous(labels = label_number(suffix = "K", scale = 1e-3))
Per capita Atlantic salmon production
%>%
salmon left_join(population,by="Country") %>%
mutate(per_capita=Tons*1000/pop) %>%
ggplot(
aes(
x=per_capita,
y=reorder(Country,per_capita),
fill=Estimate
+
)) geom_col()+
labs(
title = "Assumed per capita Atlantic Salmon consumption (2022)",
y="Country",
x="Kg/capita/year",
fill="Source/method") +
scale_fill_brewer(palette="Dark2") +
theme_light()
We now prepare/clean the country species consumption data and assemble to into a “long” dataframe. Steps involved are:
linking country code and country code data
adding species names
apportioning consumption by portion trout and large trout share (iv) combining the species data into a single data frame
making column names lower case for ease of matching
# Add country codes and species name
<- left_join(bream,country_codes,by="Code") %>% mutate(Species="Sea Bream")
bream<- left_join(bass,country_codes,by="Country") %>% mutate(Species="Sea Bass")
bass<- left_join(carp,country_codes,by="Code") %>% mutate(Species="Carp")
carp<- left_join(salmon,country_codes,by="Country") %>% mutate(Species="Atlantic Salmon")
salmon
# Add country codes and fish size and separate into two observations
<- trout %>%
troutleft_join(country_codes,by="Code") %>%
pivot_longer(
cols=c("Rainbow Trout (Small)","Rainbow Trout (Large)"),
names_to="Species",values_to="Tons"
%>%
) select(-Notes,-Total)
# combine into single dataframe
<- bind_rows(bream,bass,carp,trout) %>%
cons_data mutate(Estimate="EUFOMA") %>%
bind_rows(salmon)
# make column names lower case and reorder
names(cons_data) <- str_to_lower(names(cons_data))
<- relocate(cons_data, species, country, code, tons) cons_data
We do a simple plot of the data to make sure it looks reasonable.
<- cons_data %>%
cons_data group_by(country) %>%
mutate(total_cons=sum(tons)) %>%
ungroup()
%>%
cons_data ggplot(
aes(
x=tons,
y=reorder(country,total_cons),
fill=species
+
)) geom_col() +
labs(
title = "Annual consumption of salmon, carp, trout and seabream/bass in EU",
x = "Metric tons (live weight equivalent)",
y = "",
fill = "Species"
+
) scale_x_continuous(labels = label_number(suffix = "K", scale = 1e-3)) +
scale_fill_brewer(palette = "Dark2") +
theme_light() +
theme(legend.position = "top")
saveRDS(cons_data,file= "../3_intermediate_data/cons_data.rds")