Implicit Tax Rates on Consumption and Labor in Europe

[This article was first published on Macroeconomic Observatory - R, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

The aim of this blog post is to compute the implicit tax rates (ITR) on consumption, labour and corporate income for France, Italy, Spain, Germany and the Euro Area since 1995. We use as reference the report on Taxation trends in the European Union (2019) from the European Commission, and the previous reports since 2014.

This database is built and updated through DBnomics using the rdbnomics package. All the code is written in R, thanks to the RCoreTeam (2016) and RStudioTeam (2016).

Implicit tax rate on consumption

The ITR on consumption is defined as all consumption taxes divided by the final consumption expenditure of households (domestic concept). The DG Taxation & Customs Union of the European Commission proposes a detailed calculation methodology here. We follow this general methodology using Eurostat’s data for the 19 countries composing the Euro Area, and we will add some specificities for France, Germany, Italy and Spain using national tax lists. Given that the ITR is a ratio, we structure this section in 4 steps. We begin by gathering all data on consumption taxes (the numerator), we add the specificities for France, Germany, Italy and Spain, then we retrieve data on the final consumption expenditure of households on the economic territory (the denominator), and we finish by constituting the Euro Area GDP-weighted average.

Step 1: taxes on consumption

Following the DG Taxation & Customs Union’s methodology, we consider as taxes on consumption the following aggregates (values in parenthesis represent the ESA 2010 nomenclature):

  1. Value added type taxes (D211)

  2. Taxes and duties on imports excluding VAT (D212)

  3. Taxes on products except VAT and import duties (D214), excluding:
    a. Stamp taxes (D214B)
    b. Taxes on financial and capital transactions (D214C)
    c. Export duties and monetary compensatory amounts on exports (D214K)

  4. From other taxes on production:
    a. Taxes on international transactions (D29D)
    b. Taxes on pollution (D29F)
    c. Under-compensation of VAT (flat rate system) (D29G)

  5. From other current taxes:
    a. Poll taxes (D59B)
    b. Expenditure taxes (D59C)
    c. Payments by households for licences (D59D)

These aggregates can be found in Eurostat’s database, using the dataset “Main national accounts tax aggregates” (gov_10a_taxag).

url_country <- paste(c("AT","BE","CY","EE","FI","FR","DE","EL","IE","IT",
                       "LV","LT","LU","MT","NL","PT","SK","SI","ES"),
                     collapse = "+")
url_taxes <- paste(c("D211","D212",
                     "D214","D214B","D214C","D214K",
                     "D29D","D29F","D29G",
                     "D59B","D59C","D59D"),
                   collapse = "+")
filter <- paste0("A.MIO_NAC.S13_S212.",url_taxes,".",url_country)

ITR_cons_num <- 
  rdb("Eurostat","gov_10a_taxag", mask = filter) %>%
  filter(year(period)>=1995 & year(period)<yearmax) %>% 
  select(country=geo,period,var=na_item,value)

We check the beginning and the end of the data series we have just obtained from Eurostat’s database:

Taxes on consumption: beginning of the sample
country D211 D212 D214 D214B D214C D214K D29D D29F D29G D59B D59C D59D
AT 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
BE 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
CY 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
DE 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
EE 1995 1995 1995 NA NA NA NA 1995 NA NA NA NA
EL 2006 2006 2006 2006 2006 2006 2006 2006 2006 2006 2006 2006
ES 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
FI 1995 1995 1995 1995 1997 NA NA 1996 NA NA NA 1995
FR 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
IE 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
IT 1995 1995 1995 1995 1995 NA NA 1995 NA NA NA 1995
LT 1995 1995 1995 1995 NA NA NA 1995 NA NA NA 1995
LU 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
LV 1995 1995 1995 NA 1995 1995 NA 1995 NA NA NA 2007
MT 1995 1995 1995 1995 1995 NA NA 2007 NA NA 1995 1995
NL 1995 1995 1995 NA 1995 NA NA 1995 NA NA NA NA
PT 1995 1995 1995 1995 1995 NA NA 2006 NA 2015 NA 1995
SI 1999 1995 1995 NA 1995 NA NA 1995 1999 NA NA 1995
SK 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 1995
Note:
The following taxes are not applicable for some countries (in a determined period of time): D214B, D214C, D214K, D29D, D29F, D29G, D59B, D59C, D59D. Thus we replace their NA values by 0 for the calculation.
1 D214B is not applicable for: EE, LV, SI.
2 D214C is not applicable for: EE, LV, SI; it is applicable for FI since 1997.
3 D214K is not applicable for: EE, FI, IT, LT, MT PT, SI,SK.
4 D29D is not applicable for: EE, FI, IT, LT, LV, MT, PT, SI, SK.
5 D29F is applicable since: 1996 for FI, 2007 for MT, and 2006 for PT.
6 D29G is not applicable for: EE, FI, IT, LT, LV, MT, PT; it is applicable for SI since 1999.
7 D59B is not applicable for: EE, FI, IT, LT, LV, MT, SI, SK; it is applicable for PT since 2015.
8 D59C is not applicable for: EE, FI, IT, LT, LV, PT, SI, SK.
9 D59D is not applicable for: EE; it is applicable for LV since 2007.

Taxes on consumption: end of the sample
country D211 D212 D214 D214B D214C D214K D29D D29F D29G D59B D59C D59D
AT 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
BE 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
CY 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
DE 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
EE 2017 2017 2017 NA NA NA NA 2017 NA NA NA NA
EL 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
ES 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
FI 2017 2017 2017 2002 2017 NA NA 2017 NA NA NA 2017
FR 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
IE 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
IT 2017 2017 2017 2017 2017 NA NA 2017 NA NA NA 2017
LT 2017 2017 2017 2017 NA NA NA 2017 NA NA NA 2017
LU 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
LV 2017 2017 2017 NA 2017 1999 NA 2017 NA NA NA 2017
MT 2017 2017 2017 2017 2017 NA NA 2017 NA NA 1995 2017
NL 2017 2017 2017 NA 2017 NA NA 2017 NA NA NA NA
PT 2017 2017 2017 2017 2017 NA NA 2017 NA 2017 NA 2017
SI 2017 2017 2017 NA 2017 NA NA 2017 2017 NA NA 2017
SK 2017 2017 2017 2015 2017 2015 2015 2017 2015 2015 2015 2017
Note:
The following taxes are not applicable for some countries (in a determined period of time): D214B, D214C, D214K, D29D, D29F, D29G, D59B, D59C, D59D. Thus we replace their NA values by 0 for the calculation.
1 D214B is not applicable for: EE, LV, SI; it is applicable for FI until 2002, and for SK until 2004.
2 D214C is not applicable for: EE, LV, SI.
3 D214K is not applicable for: EE, FI, IT, LT, MT PT, SI,SK. it is applicable for MT until 1999.
4 D29D is not applicable for: EE, FI, IT, LT, LV, MT, PT, SI, SK.
5 D29G is not applicable for: EE, FI, IT, LT, LV, MT, PT.
6 D59B is not applicable for: EE, FI, IT, LT, LV, MT, SI, SK.
7 D59C is not applicable for: EE, FI, IT, LT, LV, PT, SI, SK; it is applicable for MT until 1995
8 D59D is not applicable for: EE.

Step 2: taxes on consumption – example of specificities for France, Germany, Italy and Spain

We pay special attention to France, Italy, Spain & Germany, and following the DG Taxation & Customs Union we add some specificities using a detailed list of taxes and social contributions according to national classification (NTLs – national tax lists), as follows:

France:

  1. From council tax (D59A):
    a. (C05):part raised on consumption.

  2. From capital transfers from general government to relevant sectors representing taxes and social contributions assessed but unlikely to be collected (D995):
    a. part raised on consumption.

Germany:

  1. From other current taxes n.e.c. (D59F):
    a. (C03): tax on radio and TV.

Italy:

  1. From stamp taxes (D214B):
    a. (C01): excise duty on tobacco.
    b. (C02): excise duty on spirits.
    c. (C03): receipts from sale of denaturing agents and govemment seals

  2. From other current taxes on production n.e.c. (D29H):
    a. (C02): other taxes on production.
    b. (C05): fees to national & local economic bodies.

Spain:

  1. From taxes on products except VAT and import duties (D214) exclude also:
    a. (D214L_C01): tax on building, equipment and works.

  2. From other taxes on production assessed but unlikely to be collected (D995B):
    a. part raised on consumption.

To find more information about other EU country specificities, check the National Tax Lists online in the DG Taxation and Customs Union website, or Eurostat’s dedicated website on Tax Revenue Statistics.

conso_specificities <- 
  read_xlsx("s_conso.xlsx") %>%
  mutate(period=as.Date(period)) %>% 
  select(country, period, var, value=total) %>%
  filter(year(period)>=1995 & year(period)<yearmax) %>%
  spread(var,value)

ITR_cons_num <-
  ITR_cons_num %>%
  spread(var,value) %>% 
  left_join(conso_specificities,by=c("country","period"))

ITR_cons_num[is.na(ITR_cons_num)] <- 0

ITR_cons_num <-
  ITR_cons_num %>%
  transmute(period,
            country,
            value=D211+D212+(D214-D214B-D214C-D214K)+(D29D+D29F+D29G)+(D59B+D59C+D59D)+spec) %>%
  add_column(var="tx_cons")

Step 3: final consumption expenditure of households on the economic territory

The denominator of the ratio we are constituting is defined as the final consumption expenditure of households on the economic territory – domestic concept (P31_S14_DC). This aggregate can be retrieved from Eurostat’s dataset “Final consumption aggregates by durability” (nama_10_fcs).

filter <- paste0("A.CP_MNAC.","P31_S14_DC",".",url_country)

ITR_cons_den <- 
  rdb("Eurostat","nama_10_fcs",mask = filter) %>%
  filter(year(period)>=1995 & year(period)<yearmax) %>% 
  select(country=geo,period,value,var=na_item)
Final consumption expenditure of households: beginning and end of the sample
country mindate maxdate
AT 1995 2017
BE 1995 2017
CY 1995 2017
DE 1995 2017
EE 1995 2017
EL 1995 2017
ES 1995 2017
FI 1995 2017
FR 1995 2017
IE 1995 2017
IT 1995 2017
LT 1995 2017
LU 1995 2017
LV 1995 2017
MT 1995 2017
NL 1995 2017
PT 1995 2017
SI 1995 2017
SK 1995 2017

Step 4: Euro Area GDP-weighted average

After setting up the ITR on consumption for the 19 countries that compose the Euro Area, it is possible to build the GDP-weighted average for the Euro Area. First, it is necessary to establish the weights that will be used for this purpose, using the GDP of each country (million purchasing power standards). Data series for each country is available since 1995.

filter <- paste0("A.CP_MPPS.","B1GQ",".",url_country)

gdp <- 
  rdb("Eurostat","nama_10_gdp",mask = filter) %>% 
  select(period,value,country=geo) %>%
  add_column(var="gdp") %>% 
  filter(year(period)>=1995 & year(period)<yearmax)

EA_gdp <-
  gdp %>%
  group_by(period) %>%
  summarize(value=sum(value))

weights <-
  gdp %>%
  left_join(EA_gdp,by="period") %>%
  ungroup() %>%
  transmute(country, period, weight=value.x/value.y)

Now we apply these weights to our country data in order to build the Euro Area GDP-weighted average. The figure below shows the final series for France, Germany, Italy, Spain and the Euro Area.

ITR_consumption_EA_na <-
  ITR_consumption %>%
  left_join(weights,by=c("country","period"))

ITR_consumption_EA_na[is.na(ITR_consumption_EA_na)] <- 0

ITR_consumption_EA <-
  ITR_consumption_EA_na %>%
  transmute(period,value=value*weight) %>%
  group_by(period) %>%
  summarize(value =sum(value)) %>%
  add_column(country="EA19")

ITR_consumption_4 <- 
  ITR_consumption %>%
  filter(grepl('FR|DE|IT|ES', country))

ITR_consumption_FIN <- 
  bind_rows(ITR_consumption_4,ITR_consumption_EA) %>%
  add_column(var="Consumption tax")

ITR_consumption_FIN$country <- factor(ITR_consumption_FIN$country)                  
levels(ITR_consumption_FIN$country) <- listcountry

ggplot(ITR_consumption_FIN,aes(period,value,colour=country))+
  geom_line()+
  scale_x_date(expand = c(0.01,0.01)) +
  theme + xlab(NULL) + ylab(NULL) + 
  theme(legend.title=element_blank()) +
  ggtitle("Implicit Tax Rate on Consumption")

plot of chunk unnamed-chunk-8

Implicit tax rate on labour

The ITR on employed labour is defined as the sum of all direct and indirect taxes and employees’ and employers’ social contributions levied on employed labour income, divided by the total compensation of employees working in the economic territory. As for the ITR on consumption, the DG Taxation & Customs Union of the European Commission proposes a detailed calculation methodology here. We follow this general methodology using Eurostat data. Given the nature of the ITR, we structure this section in 5 steps. We begin by gathering all data on employed labour taxes (the numerator), we add the specificities for France, Germany, Italy and Spain, then we deal with the special case of the personal income tax. After that we retrieve data on the total compensation of employees & wage bill and payroll taxes, and finally we constitute the Euro Area GDP-weighted average.

Step 1: taxes on employed labour

Following the DG Taxation & Customs Union’s methodology, we consider as taxes on employed labour the following aggregates:

  1. From taxes on income:
    a. Taxes on individual or household income including holding gains - part raised on labour income (D51A_C1). We deduce the part raised on labor income in the next step
  2. From other current taxes:
    a. Total wage bill and payroll taxes (D29C)
  3. From employers’ actual social contributions:
    a. Compulsory employers’ actual social contributions (D611C)
  4. From households’ actual social contributions:
    a. Compulsory employees’ actual social contributions (D613CE)

These aggregates can be can be retrieved from Eurostat’s dataset “Main national accounts tax aggregates” (gov_10a_taxag).

url_taxes <- paste(c("D51A_C1","D29C","D611C","D613CE"),
                   collapse = "+")
filter <- paste0("A.MIO_NAC.S13_S212.",url_taxes,".",url_country)

ITR_lab_num_raw <- 
  rdb("Eurostat","gov_10a_taxag",mask = filter)

ITR_lab_num1 <-
  ITR_lab_num_raw %>%
  transmute(country=geo,period,var=na_item,value) %>%
  filter(year(period)>=1995 &  year(period)<yearmax & !grepl('D51A_C1', var))

Step 2: taxes on employed labour - example of specificities for France, Germany, Italy and Spain:

We pay special attention to France, Italy, Spain & Germany, and following the DG Taxation & Customs Union we add some specificities using a detailed list of taxes and social contributions according to national classification (NTLs - national tax lists), as follows:

France:

  1. From contributions on the value added of the corporations (D29A):
    a. part raised on employers’ labour tax.

  2. From capital transfers from general government to relevant sectors representing taxes and social contributions assessed but unlikely to be collected (D995):
    a. part raised on employers’ labour tax.
    b. part raised on employees’ labour tax.

  3. From taxes on individual or household income including holding gains - part raised on labour income (D51A_C1), exclude the following for the calculation of the personal income tax:
    a. (D51A_C02): used dividend imputation (positive).
    b. (D51A_C05): civil servants contribution to the unemployment insurance regime.
    c. (D51A_C06): other social levies.
    d. (D51A_C08): levies on the income from financial assets (PRCM).

  4. From taxes on individual or household income including holding gains - part raised on labour income (D51A_C1), include the following for the calculation of the Employees’ SSC:
    a. (D51A_C05): civil servants contribution to the unemployment insurance regime.

Spain:

  1. Taxes on income assessed but unlikely to be collected (D995C).
    a. part raised on personal income tax.

For Italy and Germany, it is also possible to apply some specificities, e.g. for Germany the trade tax (D51M_C4) can be excluded from D51A_C1, and for Italy part of the Revenu from IRAP tax can be included to labour and employers’ SSC. However, the general formula was already sufficient to recover the general trend of the implicit tax rate. To find more information about other EU country specificities, check the National Tax Lists online in the DG Taxation and Customs Union website, or Eurostat’s dedicated website on Tax Revenue Statistics.

labour_specificities <- 
  read_xlsx("s_labour.xlsx") %>%
  mutate(period=as.Date(period)) %>% 
  select(country, period, corr_pit=total_split1,corr_leyrs=total_leyrs, corr_lees=total_lees) %>%
  filter(year(period)>=1995 & year(period)<yearmax)

Step 3: personal income tax, part raised on labour income

The fundamental methodological problem in calculating the ITR on labour relies in this part: the personal income tax is broad-based and relates to multiple sources of income (i.e. employed labour, self-employed labour, income from capital and income in the form of social benefits and pensions received). For constituting this ITR, it is then only necessary to use the part raised on labour income. The DG Taxation & Customs Union uses disaggregated taxpayers’ data in order to allocate the personal income tax revenue across different sources of income. It provides data for estimating the part of the revenue from personal income tax that can be attributed to labour income. The tables below can be found in the reports on Taxation Trends in the European Union in its 2019, 2018, 2017, 2016 and 2014 editions (pages 292, 292, 276, 330 and 303 respectively). We will chain the tables by averaging the data points when they differ from table to table, in order to get the (1995-2017) series on the percentage of personal income tax revenue allocated to employed labour income. We use these percentages to obtain the final series on personal income tax raised on labour income.

url_country_pit <- paste(c("AT","BE","CY","EE","FI","FR","DE","EL","IE","IT",
                           "LV","LT","LU","MT","NL","PT","SK","SI","ES"),
                         collapse = "|")

pit_2019_raw <- read_csv("pit_2019.csv") %>% 
  filter(grepl(url_country_pit, country))
Personal income tax revenue allocated to employed labour income, in % of total revenue of personal income tax (2004–2017)
country 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
AT 60.7 61.1 62.2 62.8 63.1 62.0 61.7 62.5 62.6 62.2 61.7 61.7 60.3 60.3
BE 76.7 76.7 77.0 77.3 77.6 77.9 78.0 78.1 77.3 77.0 76.1 75.3 73.9 73.9
CY 91.5 91.5 91.5 91.5 91.5 91.5 91.5 91.5 91.5 91.5 91.5 91.5 91.5 91.5
DE 75.0 72.1 71.9 70.3 71.2 73.2 72.7 72.7 72.7 72.8 72.6 72.5 71.7 72.0
EE 90.2 86.4 88.6 90.4 90.4 89.3 88.8 89.2 90.7 91.2 91.3 90.7 90.9 90.9
EL 50.7 51.9 51.0 50.7 50.0 50.3 50.5 47.7 50.2 50.2 50.2 50.2 50.2 50.2
ES 70.9 69.9 67.2 68.2 70.9 72.4 73.0 72.1 70.7 69.5 68.4 67.6 67.3 66.6
FI 68.8 68.2 67.3 66.3 69.1 69.1 67.3 66.7 66.4 65.5 63.5 62.3 61.8 61.0
FR 59.3 59.4 58.2 58.4 58.1 57.8 54.2 54.2 56.8 55.4 55.4 55.2 55.8 55.8
IE 80.4 80.4 80.4 80.5 80.5 80.5 80.5 82.9 83.4 83.2 83.7 80.9 83.6 83.6
IT 55.4 55.2 54.4 54.4 55.6 55.1 54.7 54.5 55.0 54.4 53.5 53.9 53.8 53.8
LT 91.3 90.1 89.6 88.0 86.2 84.3 85.9 85.4 85.8 86.3 85.5 84.9 83.3 83.3
LU 72.6 72.3 72.8 71.8 74.5 73.3 73.4 72.7 72.5 73.7 73.4 73.9 73.5 73.5
LV 97.2 95.5 95.7 96.6 96.3 94.4 89.0 87.1 87.1 86.8 86.1 86.5 85.8 84.7
MT 69.4 68.4 69.5 69.2 69.7 69.3 69.7 69.8 70.4 70.3 70.5 69.7 70.4 74.1
NL 71.6 70.8 70.3 69.6 68.7 73.2 71.4 72.4 71.7 69.5 63.9 66.7 66.2 61.8
PT 63.7 63.5 63.6 60.6 58.9 59.1 61.2 59.1 54.8 55.6 55.4 57.3 59.0 59.0
SI 90.0 89.4 87.6 82.2 83.7 87.2 87.8 87.9 86.4 89.8 88.4 87.3 88.0 88.0
SK 82.6 84.8 85.4 86.5 88.1 93.9 94.3 93.8 94.4 93.8 93.9 94.3 95.0 96.4
pit_2019 <-
  pit_2019_raw %>%
  gather(period,r_2019,-country)

pit_2018 <- read_csv("pit_2018.csv") %>%
  filter(grepl(url_country_pit, country)) %>% 
  gather(period,r_2018,-country)

pit_2017 <- read_csv("pit_2017.csv") %>%
  filter(grepl(url_country_pit, country)) %>% 
  gather(period,r_2017,-country)

pit_2016 <- read_csv("pit_2016.csv") %>%
  filter(grepl(url_country_pit, country)) %>% 
  gather(period,r_2016,-country)

pit_2014 <- read_csv("pit_2014.csv") %>%
  filter(grepl(url_country_pit, country)) %>% 
  gather(period,r_2014,-country)

pit <-
  pit_2014 %>%
  full_join(pit_2016,by=c("country","period")) %>%
  mutate(r_2016=ifelse(is.na(r_2016),r_2014,r_2016)) %>%
  full_join(pit_2017,by=c("country","period")) %>%
  mutate(r_2017=ifelse(is.na(r_2017),r_2016,r_2017)) %>%
  full_join(pit_2018,by=c("country","period")) %>%
  mutate(r_2018=ifelse(is.na(r_2018),r_2017,r_2018)) %>%
  full_join(pit_2019,by=c("country","period")) %>%
  mutate(r_2019=ifelse(is.na(r_2019),r_2018,r_2019)) %>%
  transmute(country,period=ymd(period),a_weight=r_2019/100)

ITR_lab_num2 <-
  ITR_lab_num_raw %>%
  transmute(country=geo,period,var=na_item,value) %>%
  filter(year(period)>=1995 & year(period)<yearmax & var=="D51A_C1") %>%
  left_join(labour_specificities, by=c("country","period"))%>%
  left_join(pit,by=c("country","period"))

ITR_lab_num2[is.na(ITR_lab_num2)] <- 0

ITR_lab_num2<-
  ITR_lab_num2 %>%
  transmute(country,period,var,value=((value+corr_pit)*a_weight))

ITR_lab_num <-
  bind_rows(ITR_lab_num1,ITR_lab_num2)

Step 4: compensation of employees, wage bill and payroll taxes

The total compensation of employees (D1) is part of the denominator of the ratio we are constituting. Following the DG Taxation & Customs Union’s methodology, it is defined as total remuneration, in cash or in kind, payable by an employer to an employee in return for work done. It consists of gross wages (in cash or in kind) and thus also the amount paid as social insurance contributions and wage withholding tax. In addition, employers’ social contributions (including imputed social contributions) as well as to private pensions and related schemes are included. Personal income taxes and social contributions paid by EU civil servants to the EU Institutions are not included. Compensation of employees is thus a broad measure of the gross economic income from employment before any charges are withheld. This aggregate can be retrieved from Eurostat’s database, using the dataset “GDP and main components (output, expenditure and income)” (nama_10_gdp).

filter <- paste0("A.CP_MNAC.","D1",".",url_country)

ITR_lab_den<- 
  rdb("Eurostat","nama_10_gdp", mask = filter) %>%
  transmute(country=geo,period,value,var=na_item) %>%
  filter(year(period)>=1995 & year(period)<yearmax)

ITR_labour_na <- 
  bind_rows(ITR_lab_num,ITR_lab_den) %>%
  spread(var,value)
Taxes on employed labour: beginning of the sample
country D1 D29C D51A_C1 D611C D613CE
AT 1995 1995 1995 1995 1995
BE 1995 1995 1995 1995 1995
CY 1995 1995 1995 1995 1995
DE 1995 1995 1995 1995 1995
EE 1995 NA 1995 1995 2002
EL 1995 2006 2006 2006 2006
ES 1995 1995 1995 1995 1995
FI 1995 1995 1995 1995 1995
FR 1995 1995 1995 1995 1995
IE 1995 1995 1995 1995 1995
IT 1995 1995 1995 1995 1995
LT 1995 2002 1995 1995 1995
LU 1995 1995 1995 1995 1995
LV 1995 2003 1995 1995 1995
MT 1995 NA 1995 1995 1995
NL 1995 1995 1995 1995 1995
PT 1995 1995 1995 NA 1996
SI 1995 1995 1995 1995 1995
SK 1995 1995 1995 1995 1995
Note:
The following aggregates are not applicable for some countries (in a determined period of time): D51A_C1, D29C, D611C, D613CE. Thus we replace their NA values by 0 for the calculation.
1 D1 has not been collected for IE before 1998. We will omit these points in the estimation.
2 D29C is not applicable for: EE, MT and SK; it is applicable for LT since 2002 and for LV since 2003.
3 D611C is not available, exists but has not been transmitted/collected for PT.
4 D613C is applicable for EE since 2002; it is not available, exists but has not been collected for PT before 2010
Taxes on employed labour: end of the sample
country D1 D29C D51A_C1 D611C D613CE
AT 2017 2017 2017 2017 2017
BE 2017 2017 2017 2017 2017
CY 2017 2017 2017 2017 2017
DE 2017 2017 2017 2017 2017
EE 2017 NA 2017 2017 2017
EL 2017 2017 2017 2017 2017
ES 2017 2017 2017 2017 2017
FI 2017 2014 2017 2017 2017
FR 2017 2017 2017 2017 2017
IE 2017 2017 2017 2017 2017
IT 2017 2017 2017 2017 2017
LT 2017 2016 2017 2017 2017
LU 2017 2017 2017 2017 2017
LV 2017 2017 2017 2017 2017
MT 2017 NA 2017 2017 2017
NL 2017 2017 2017 2017 2017
PT 2017 2002 2017 NA 2017
SI 2017 2017 2017 2017 2017
SK 2017 2015 2017 2017 2017
Note:
The following aggregates are not applicable for some countries (in a determined period of time): D51A_C1, D29C, D611C, D613CE. Thus we replace their NA values by 0 for the calculation.
1 D1 has not been collected for IE before 1998. We will omit these points in the estimation.
2 D29C is not applicable for: EE, MT and SK; it is applicable for LT since 2002 and for LV since 2003.
3 D611C is not available, exists but has not been transmitted/collected for PT.
4 D613C is applicable for EE since 2002; it is not available, exists but has not been collected for PT before 2010
ITR_labour_na <- 
  ITR_labour_na %>%
  left_join(labour_specificities, by=c("country","period"))

ITR_labour_na[is.na(ITR_labour_na)] <- 0 

ITR_labour <-
  ITR_labour_na %>%
  transmute(country,period,
            ITR_labour=(D51A_C1+D29C+D611C+D613CE+corr_leyrs+corr_lees)/(D1+D29C),
            ITR_pi=D51A_C1/(D1+D29C),
            ITR_essc=(D613CE+corr_lees)/(D1+D29C),
            ITR_esscprt=(D611C+D29C+corr_leyrs)/(D1+D29C))

Step 5: Euro Area GDP-weighted average

After setting up the ITR on labour for the 19 countries that compose the Euro Area, it is possible to build the GDP-weighted average for the Euro Area. We use the same weights that were established for the ITR on consumption. The chart below shows the final series for France, Germany, Italy, Spain and the Euro Area.

ITR_labour_EA <-
  ITR_labour %>%
  left_join(weights,by=c("country"="country","period"="period")) %>%
  filter(ITR_labour<1) %>%
  transmute(period,
            ITR_labour=ITR_labour*weight,
            ITR_pi=ITR_pi*weight,
            ITR_essc=ITR_essc*weight,
            ITR_esscprt=ITR_esscprt*weight) %>%
  group_by(period) %>%
  summarize(ITR_labour=sum(ITR_labour),
            ITR_pi=sum(ITR_pi),
            ITR_essc=sum(ITR_essc),
            ITR_esscprt=sum(ITR_esscprt)) %>%
  add_column(country="EA19")

ITR_labour_4 <- 
  ITR_labour%>%
  filter(grepl('FR|DE|IT|ES', country))

ITR_labour_FIN1 <- 
  bind_rows(ITR_labour_4,ITR_labour_EA)

ITR_labour_FIN1$country <- factor(ITR_labour_FIN1$country)                  
levels(ITR_labour_FIN1$country)<-listcountry

ggplot(ITR_labour_FIN1,aes(period,ITR_labour,colour=country))+
  geom_line()+
  scale_x_date(expand = c(0.01,0.01)) +
  theme + xlab(NULL) + ylab(NULL) + 
  theme(legend.title=element_blank()) +
  ggtitle("Implicit Tax Rate on Labour")

plot of chunk unnamed-chunk-17

For the analysis, it is possible to recover the evolution of the personal income tax, the employees’ SSC and the employers’ SSC as a share of the ITR on labour. The chart below shows this evolution:

ITR_labour_shares <- 
  ITR_labour_FIN1 %>%
  transmute(country,period,
            w_pi=ITR_pi/ITR_labour,
            w_essc=ITR_essc/ITR_labour,
            w_esscprt=ITR_esscprt/ITR_labour) %>%
  gather(var,value,-period,-country)

listVar <- list("Personal Income Tax"  = "w_pi",
                "Employees' SSC"  = "w_essc",
                "Employers' SSC and payroll taxes" = "w_esscprt")

ITR_labour_shares$var <- factor(ITR_labour_shares$var)
levels(ITR_labour_shares$var)<-listVar

ggplot(ITR_labour_shares,aes(period,value,colour=var))+
  geom_line()+
  facet_wrap(~country ,scales ="fixed",ncol = 2)+
  scale_x_date(expand = c(0.01,0.01)) +
  theme + xlab(NULL) + ylab(NULL) + 
  theme(plot.title=element_text(size=16),
        legend.title=element_blank()) +
  ggtitle("Personal Income Tax, Employees' SSC and Employers' SSC & payroll taxes \n (as a share of the ITR on Labour)")

plot of chunk unnamed-chunk-18

The chart below shows the evolution of the composition of the ITR on labour:

ITR_labour_FIN <-
  ITR_labour_FIN1 %>%
  select(-ITR_labour) %>%
  gather(var,value, -period, -country)

listVar <- list("Labour income tax"  = "ITR_pi",
                "Employees' SSC"= "ITR_essc",
                "Employers' SSC and payroll taxes" = "ITR_esscprt")

ITR_labour_FIN$var <- factor(ITR_labour_FIN$var)
levels(ITR_labour_FIN$var)<-listVar

ggplot(ITR_labour_FIN, aes(fill=var, y=value, x=period)) + 
  geom_bar(stat="identity")+
  facet_wrap(~country ,scales ="fixed",ncol = 3)+
  scale_x_date(expand = c(0.01,0.01)) +
  theme + xlab(NULL) + ylab(NULL) + 
  theme(legend.title=element_blank()) +
  ggtitle("Composition of the Implicit Tax Rate on Labour")

plot of chunk unnamed-chunk-19

And the last chart shows all the ITRs for a multi-country comparison:

ggplot(ITR_labour_FIN,aes(period,value,colour=country))+
  geom_line()+
  facet_wrap(~var ,ncol = 3)+
  scale_x_date(expand = c(0.01,0.01)) +
  theme + xlab(NULL) + ylab(NULL) + 
  theme(legend.title=element_blank()) +
  ggtitle("Implicit Tax Rates on Labour (%)")

plot of chunk unnamed-chunk-20

Implicit tax rate on corporate income

The methodology for calculating the ITR on corporate income that proposes the DG Taxation & Customs Union may exceed the statutory corporate tax rate, for instance, on the payment by corporation of taxes referring to profits earned earlier, or on taxes paid on capital gains (which are not included in the ITR denominator due to a lack of statistics). That is why, in this section we choose the top statutory corporate income tax rate (including surcharges) as a proxy. Data can be downloaded directly from the DG Taxation & Customs Union here. Concerning the GDP-weighted average for the Euro Area, we will use these country tax rates and the same weights that were established for the ITR on consumption to constitute it. The chart below shows the final series for France, Germany, Italy, Spain and the Euro Area.

ITR_corporate_income <- 
  read_csv("ITR_corporate_income.csv") %>%
  gather(period,value,-country) %>%
  transmute(country,period=ymd(period),value=value/100) %>%
  filter(year(period)>=1995 & year(period)<yearmax)

ITR_corporate_income_EA <-
  ITR_corporate_income %>%
  left_join(weights,by=c("country","period")) %>%
  transmute(period,value=value*weight) %>%
  group_by(period) %>%
  summarize(value =sum(value)) %>%
  add_column(country="EA19")

ITR_corporate_income_4 <- 
  ITR_corporate_income%>%
  filter(grepl('FR|DE|IT|ES', country))

ITR_corporate_income_FIN <- 
  bind_rows(ITR_corporate_income_4,ITR_corporate_income_EA) %>%
  add_column(var="Corporate income tax")

ITR_corporate_income_FIN$country <- factor(ITR_corporate_income_FIN$country)                  
levels(ITR_corporate_income_FIN$country)<-listcountry

ggplot(ITR_corporate_income_FIN,aes(period,value,colour=country))+
  geom_line()+
  scale_x_date(expand = c(0.01,0.01)) +
  theme + xlab(NULL) + ylab(NULL) + 
  theme(legend.title=element_blank()) +
  ggtitle("Implicit Tax Rate on Corporate Income")

plot of chunk unnamed-chunk-21

Average values

We summarize the average values of the implicit tax rates in the following table:

ITR <- 
  bind_rows(ITR_corporate_income_FIN,ITR_labour_FIN,ITR_consumption_FIN) %>% 
  na.omit() %>%
  mutate(value=round(value,3))

ss_ITR<-
  ITR %>%
  group_by(var,country) %>% 
  summarize(steady_state =mean(value)) %>% 
  mutate(steady_state=round(steady_state,3)) %>% 
  spread(country, steady_state) %>%
  ungroup() 
Implicit tax rates - average values
var France Germany Italy Spain Euro Area
Consumption tax 0.211 0.195 0.175 0.146 0.191
Corporate income tax 0.369 0.389 0.374 0.322 0.353
Employees’ SSC 0.081 0.122 0.060 0.038 0.085
Employers’ SSC and payroll taxes 0.234 0.132 0.223 0.175 0.169
Labour income tax 0.080 0.124 0.157 0.100 0.117
ss_ITR_plot <-
  ss_ITR%>%
  gather(country,value,-var)

ggplot(ss_ITR_plot,aes(country, value, fill=country))+
  geom_bar(stat="identity")+
  facet_wrap(~var ,scales ="free_y",ncol = 3)+
  theme + xlab(NULL) + ylab(NULL) + 
  theme(legend.title=element_blank(),
        strip.text=element_text(size=12)) +
  ggtitle("Implicit tax rates - average values")

plot of chunk unnamed-chunk-24

We can download ready-to-use data for France, Germany, Italy, Spain and the Euro Area in csv format here.

listtau <- list("taun" = "Labour income tax" ,
                "tauwh" = "Employees' SSC",
                "tauwf" = "Employers' SSC and payroll taxes",
                "tauc" = "Consumption tax", 
                "tauk" = "Corporate income tax")

list_country <- list("FR"="France",
                     "DE"="Germany",
                     "IT"="Italy",
                     "ES"= "Spain",
                     "EA"="Euro Area")

ITR$country <- factor(ITR$country)                  
levels(ITR$country)<-list_country

ITR$var <- factor(ITR$var)                  
levels(ITR$var)<-listtau

ITR_eurodata <- 
  ITR %>% 
  unite("var",c("country","var")) %>%
  mutate(period=year(period)) %>%
  spread(var,value)

write.csv(ITR_eurodata,"ITR_eurodata.csv",row.names = FALSE)

Comparison

The Directorate-General for Taxation & Customs Union of the European Commission provides data on the implicit tax rates on consumption and labour since 2005, using detailed revenue data provided by member states. You can find this data here. We compare in this section our series with the ones of the European Commission in the charts below.

The main steps, together with some specificities, allow to recover the general trend of the implicit tax rates. Some differences remain, and they stem mainly from the last update of National Tax Lists, which was on October 2019, whereas the last update of the Taxation Trends Report was on January 2019. Other minimal differences could stem from taxes assessed but unlikely to be collected when the data was released, or eventually discretionary adjustments or specificities applied by the DG Taxation and Customs Union.

labour_comp <-
  ITR_labour_FIN1%>%
  select(country,period,value=ITR_labour) %>%
  add_column(var="Labour tax")

conso_labour_comp <-
  bind_rows(labour_comp,ITR_consumption_FIN) %>%
  add_column(data_s="Updated")

eucom <- read_csv("eucom.csv") %>%
  rename(value=eucom) %>% 
  mutate(value=value/100)

eucom$country <- factor(eucom$country)                  
levels(eucom$country) <- listcountry

comparison <-bind_rows(conso_labour_comp,eucom)

comparison1 <-
  comparison %>%
  filter(var=="Consumption tax")

ggplot(comparison1,aes(period,value,colour=data_s))+
  geom_line()+
  facet_wrap(~country ,scales ="fixed",ncol = 3)+
  scale_x_date(expand = c(0.01,0.01)) +
  theme + xlab(NULL) + ylab(NULL) + 
  theme(legend.title=element_blank()) +
  ggtitle(expression(atop("Consumption tax", atop(italic("Comparison: European Commission vs. Updated Data"), ""))))

plot of chunk unnamed-chunk-27

comparison2 <-
  comparison %>%
  filter(var=="Labour tax")

ggplot(comparison2,aes(period,value,colour=data_s))+
  geom_line()+
  facet_wrap(~country ,scales ="fixed",ncol = 3)+
  scale_x_date(expand = c(0.01,0.01)) +
  theme + xlab(NULL) + ylab(NULL) + 
  theme(legend.title=element_blank()) +
  ggtitle(expression(atop("Labour tax", atop(italic("Comparison: European Commission vs. Updated Data"), ""))))

plot of chunk unnamed-chunk-28


Bibliography

R Core Team. R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria, 2016. URL: https://www.R-project.org.

RStudio Team. RStudio: Integrated Development Environment for R. RStudio, Inc., Boston, MA, 2016. URL: http://www.rstudio.com/.

To leave a comment for the author, please follow the link and comment on their blog: Macroeconomic Observatory - R.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)