3 Data

This section pertains to ESG data: what it is, how it is constructed, who sells it, and why it is imperfect.

The notebook relies on some code, in the R programming language.
The code makes use of packages, or modules (just like in Python, for instance).
These packages are called via the library() function like that:

library(tidyverse)  # This is the package for data manipulation & plotting

Of course, in order to be able to access these modules, you need to install them first (if you have never done it). Usually, you install packages only once, except if you want to update them.

install.packages("tidyverse") # This installs the suite of packages called the tidyverse

The course is not a coding course and does not requiring coding skills. The code is left for the data science-savvy readers.
Code averse readers should of course skip it.

3.1 What is ESG data?

3.1.1 ESG fields

ESG data pertains to numerical fields that assess an entity’s (e.g., firm or country) performance with regard to one of the three thematic pillars: Environment, Social and Governance. Each pillar has several dimensions, also known as issues. The latter can even be further decomposed into sub-issues.

Raw numbers are simply fields (ex: CO2 emissions). Fields are processed or aggregated into synthetic scores at the issue and pillar level. These scores give a rough idea of the performance of the entity with respect to each pillar or issue.

NOTE: aggregation is much more complex than it seems (see below). Some fields are beneficial, others detrimental and others should be compared to industry standard. Moreover, aggregation is very complex in the presence of missing fields which happens all the time!

Another classification, from the ISO 26000 framework: it provides recommendations, but is not a certification.

Of course, as will be recalled multiple times, access to ESG data depends on firms’ will to accurately calculate figures and disclose them to the public. Because of the push for transparency, more and more firms are incentivized to do so. For instance, the CDP Project is an initiative that gathers data on carbon emissions of companies. The coverage of their dataset increases in time:

Thanks to new regulations, this trend is poised to continue. In particular, the Net-Zero Data Public Utility seeks to provide a free platform with access to ESG-related fields for a large number of firms. Such initiatives will help standardize disclosure and hopefully increase transparency.

3.1.2 Materiality

An important concept in ESG fields is that of materiality. Basically, materiality refers to fields that matter for an organization’s business (in the sense: way of functioning). For instance:
- for a hospital, the ability to treat patients with equal care matters (S pillar);
- in a farm, reducing the use of pesticides is important (E pillar);
- in the printing industry, optimizing upstream & downstream paper recycling is crucial (E pillar). Basically this means printing on recycling paper & in turn recycling a maximum of paper waste.

Therefore material indicators depend very much on the way the entity works. Paper recycling is not a major issue in a farm - it is not material.

The SASB (Sustainability Accounting Standards Board) provides a mapping that helps assess materiality in ESG fields (http://sasb.s3-website-us-east-1.amazonaws.com/).

Originally, materiality came from the accounting world. Some accounting fields were deemed financially material if they were expected to have an effect on the financial performance of the firm. Thus, in the original definition, ESG materiality inherited this notion of financial impact, but for ESG fields. The effect that matters is ESG \(\rightarrow\) finances / corporate performance.

However, it is clear that this is narrow, from an ESG perspective. Indeed, in a modern context, the social & environmental consequences should also be examined. This is where double materiality kicks in (see diagram below, from the report entitled Guidelines on Reporting Climate-Related Information, by European Commission)

One way to interpret this is: ESG dimensions (climate incidents, social unrest) are likely to deteriorate business activity and hence financial performance. But reversely, business activity obviously has repercussions on the environment and social welfare (think: strikes in France!). The relationship goes both ways. However, some institutions like the International Sustainable Standards Board (ISSB), only advocate financial materiality…

In What information is relevant for sustainability reporting? The concept of materiality and the EU Corporate Sustainability Reporting Directive, from the Sustainable Finance Research Platform even advocate wider notions of materiality.

Stakeholders (clients, employees) are again put forward.

3.1.3 Greenwashing?

Strictly speaking, greenwashing relates to the marketing sphere. The Wikipedia definition is: a form of advertising or marketing spin in which green PR and green marketing are deceptively used to persuade the public that an organization’s products, aims and policies are environmentally friendly. One of the most common examples is H&M, with is clothing line “Conscious”, which misused the Higg Materials Sustainability Index.

It is possible that the term be “recycled” to attempts to artificially improve sustainable reporting in order for the firm to appear greener than it actually is. One adjacent issue is the labeling of “sustainable” financial products, like funds. In August 2021, the financial regulators in the US (Securities and Exchange Commission - SEC) and Germany (BaFin) revealed they were investigating DWS, a subsidiary of Deutsche Bank, and the second largest fund manager in Europe. In May 2022, DWS offices were raided by the German police. In 2020, DWS claimed to have 459B€ of green assets under management (funds incorporating ESG criteria for investment decisions). The figure sank to 115B€ in 2021…

This example shows that it has become very risky (and will become riskier) to dupe investors into buying wrongly labelled green funds. This is very beneficial for the industry - and maybe, at the end of the line, for the environment & society.
Lastly, though it’s not necessarily related, new terms have emerged:
-“greenwishing”: this refers to firms that publicly set very ambitious environmental targets, but fail to provide rigorous explanations on how they will achieve their goals. Cheap talk is not binding, but investors are not (always) fools either… - “grennhushing”: (NOTE: the definition is not unambiguous!) this is either when a green company engages in some form of sustainability but refrains from communicating about it, OR when a brown company under-reports on purpose because its numbers are bad. Be careful: people can disagree on this one!
- greenlighting: communicating excessively on a green feature of a product. Possibly in order to take attention away from browner product lines. - see also: greenrinsing, greenshifting, etc.

3.2 The playing field

3.2.1 Landscape of providers

First, we present the players: the rating agencies.

A bit of history. For a relatively long period of time (until 2015-2020), the traditional data providers (Bloomberg, Thomson-Reuters) and agencies (Moodys, S&P) did not care much about sustainability scores and ratings. Thus, it was turf of a few specialized actors, like KLD and Vigeo Eiris. Then, the field started consolidating (see below) and big players acquired the smaller specialists.

However, this raises new concerns of conflicts of interests. For instance, what happens when Trucost (which belong to S&P Global) must rate IHS Markit or S&P Dow Jones Indices, which are all subsidiaries of S&P Global?


A table with some links below:

Big players Smaller providers
Factset (with TruValue Labs) Carbon Disclosure Project
ISS (Deutsche Börse) Carbon4 Finance
FTSE Russel (London Stock Exchange) Covalence
Moody’s (with Vigeo Eiris) EthiFinance
MSCI (with Riskmetrics) Global ESG Benchmark for Real Assets
Refinitiv (London Stock Exchange) Iceberg Datalab
Sustainalytics (Morningstar) Maplecroft
TruCost (S&P) RepRisk

Other players include CSRHUB, Equileap (for gender parity), Ethos ESG, Inrate

3.2.2 Consolidation

NOTE: The field has consolidated, some firms diluted in larger groups: 427 (Moody’s), Truvalue Labs (Factset), Oekom (ISS), RiskMetrics-KLD-Carbon Delta (MSCI), Solaron (Sustainalytics).

For a detailed view, we refer to the report Provision of non-financial data: mapping of stakeholders, products and services by Anne Demartini for the French AMF (autorité des marchés financiers).

Year Month Target Acquirer
2009 February Innovest (US) Riskmetrics (US)
September Merger of Sustainalytics (Netherlands) and Jantzi Research Inc. (CND)
November Asset 4 (Switzerland) Thomson Reuters (US)
KLD (US) Riskmetrics (US)
December New Energy Finance (UK) Bloomberg (US)
2010 March Riskmetrics (US) MSCI (US)
2012 June Responsible Research (Singapore) Sustainalytics (Netherlands)
2014 June GMI Rating (US) MSCI (US)
July zRating (Switzerland)
2015 September Ethix SRI Advisors (Denmark) ISS (US)
ESG Analytics (Switzerland) Sustainalytics (Netherlands)
October Fusion Vigeo (FR) / Eiris (UK)
2016 October Trucost (UK) S&P Global (US)
2017 June South Pole / Investment Climate Data Division (Switzerland) ISS (US)
July Sustainalytics (Netherlands) – acquisition of a 40% stake Morningstar (US)
2018 March Oekom (Germany) ISS (US)
Solaron (India) Sustainalytics (Netherlands)
2019 January GES International (Sweden) Sustainalytics (Netherlands)
March Vigeo-Eiris (FR) Moody’s Corp (US)
June Beyond Ratings (FR) London Stock Exchange (UK)
July Four Twenty Seven (US) Moody’s Corp (US)
August Refinitiv (formerly Thomson Reuters, US) London Stock Exchange (UK)
September Carbon Delta (Switzerland) MSCI (US)
October Ethical Corp (US) Thomson Reuters (US)
November Robecosam AG-ESG Ratings Business (Switzerland) S&P Global (US)
2020 January Ecovadis (FR)- Acquisition on a non-controlling interest CVC Growth Partners (US)
April Sustainalytics (Netherlands) – 100% stake Morningstar (US)
October TrueValueLab (US) Factset (US)
November ISS (US) Deutsche Börse
Merger of IHS Markit (US) and S&P Global (US)

3.2.3 A booming industry

The increasing demand for ESG data incites providers to spend more on the research & acquisition side:


One reason is that investors want information that is reliable, i.e., that accurately reflects the policies of firms. But this is very costly. The main explanation for this is that, as of 2022, no coercive framework forces corporations to report precise non-financial metrics, as is the case for standard accounting via balance sheets and income and cash-flow statements (EBIT, Total assets, investments, revenue, etc.).

3.2.4 Diversity in raters

We refer here to the insightful report Rate the raters: ESG ratings at crossroads. This report compiles results from a survey carried out by the Sustainability institute. A few enlightening graphs below, especially with regard to quality perception (by respondents).


The CDP makes it to the top 2 spots on all criteria.

Some differences between raters:


NOTE: active means that in order to be rated, companies need to respond to lengthy questionnaires.
Also: the CDP only focused on carbon, water and forests (hence, the environment): thus it is specialized. Generalized raters take into account all three pillars.

3.3 How are ESG data collected or constructed?

The raw material that is used to craft firm-specific metrics is of two types:
- internal: the rater trusts documents disclosed by the company (e.g.: in annual reports, especially those dedicated to sustainability which are mostly compiled by large firms).
- external: the rater gathers data from outside the firm, such as: whistleblowers, social media, digital surveys (ex: synthesio), etc.; or try to estimate values from trustworthy fields, like accounting fields (which are regulated by norms & standards).

In some cases, there might not be the choice, as some fields are not provided by companies. Typically, each firm chooses which item it wishes to communicate in its (often CSR-ESG-dedicated) annual report. This is a major issue for providers because the lack of norm can make it hard to compare figures (e.g., GHG vs carbon emissions).

3.3.1 European regulation

Thus, the topic of non-financial (or sustainability) reporting is crucial. In Europe, under the original (chronologically) Non-Financial Reporting Directive (NFRD), large firms (>500 employees) with public interest must already provide basic ESG-related information. But fields and metrics were not standardized, and companies were free with respect to the methodology. This made comparisons impossible, so that data was not optimally useful.

The objective, via the Corporate Sustainability Reporting Directive (CSRD), is to extend this to all large companies. Listed small and medium-sized enterprises (SMEs) have until 2026 to comply. Non-European companies with substantial activity in Europe are also involved.

Basically, this means corporation will have to provide much more sustainability-related information. Just like for financial disclosures, it will be warranted (e.g., by assurance providers) and possibly audited.

Also, the reform puts forward the EU Taxonomy, which is a set of classifications that determines which activities are sustainable and which are not.

Finally, for the financial sector, the European Supervisory Authorities (“ESAs”) have also validated the regulatory technical standards (RTSs) after crafting the Sustainable Finance Disclosure Regulation (SFDR). This will allow investors to better understand the goals and purposes of financial instruments, such as funds for instance. The text proposes a classification of funds and mandates into three categories, which are defined in articles:

  • Article 6: investment vehicles that do not integrate any kind of sustainability in their construction process. They are not forbidden but must clearly be labelled as non-sustainable.
  • Article 8: for environmental and socially promoting funds. Also know as light green funds: funds which promotes, among other characteristics, environmental or social characteristics, or a combination of those characteristics, provided that the companies in which the investments are made follow good governance practices. The fund manager must use the sustainability indicators (see below) actively in the allocation process.
  • Article 9: products targeting sustainable investments. Here, greeness is the objective, it’s not just a tool. Typically, a fund that focuses on GHG emission reduction can be Article 9, but in this case, it must thoroughly prove how it will achieve its goal, especially in comparisons of benchmarks.

The latter two are of course more constraining, as they require active reporting on the following dimensions: summary of the fund, monitoring of synthetic ESG characteristics, investment strategy, proportion of ESG vs non-ESG assets.

Morningstar now tracks A8 and A9 funds (& flows) actively.

A snapshot of the amount of green funds under SFDR (source: Deloitte, based on Morningstar data):


Examples of compulsory environmental fields, a.k.a., PASI “principal adverse sustainability indicators” (source: Deloite):


3.3.2 A dive into corporate documents

Let’s first have a look at annual reports. Take Total Energies for instance. (All major firms have environment-related disclosure, see Apple for instance).

From the 2020 Universal Registration Document, we extract:


NOTE: there are more than 200 mentions of CO2 in the reports. Finding the same graph in the 2021 report is hard. You have to go page 304 (out of 664!) to get precise figures:


This is a typical illustration of why gathering data from reports is incredibly time-consuming because of formatting inconsistencies from one report to the next one. Training a bot or a supervised algorithm to do the work is very hard. Best results are probably reached by fetching the numbers manually - but this makes many numbers, for many companies, each quarter or year. In turn, this daunting task augments the risk of human failure.

In the 2021 report, Total mentions its intent to “Reduce the indirect emissions related to its products (Scope 3), together with society – i.e., its customers, its suppliers, its partners and public authorities – by helping to transform its customers’ energy demand.” Tying its goals with society is a prudent commitment… basically: they will do their best, but not alone. That can be referred to as greenwishing.

Naturally, each firm is free to write its report more or less in its chosen terms - and difference arise from country to country. Take Apple: the company even has an ESG page/platform: https://investor.apple.com/esg/default.aspx. It has a dedicated Environmental Progress Report and, more generally, an ESG report as well and both are updated annually. In the latter, the social pillar is a lot focused on gender and race - for equality, diversity & inclusion purposes. In the former (& the latter too), we get a good overview of emissions:


FUN FACT: in corporate reports, companies often mention “targets” (e.g., with respect to 5-20 years in the future) more than actual figures… This is a well known trick (also works for governments) because long term goals are often not implemented by those who decide and fix them. Pious wishes! Greenwishing again.

3.3.3 Aggregating fields

ESG is by essence multi-dimensional - if only because there are at least the 3 pillars! In practice, there are many issues that one would want to include into the analysis, but in the end, we often need one synthetic score that captures all the information. Thus, we have to aggregate figures, and this is hard - for two reasons:

  • First, there is the diversity in fields. For instance, some are numerical, some categorical (e.g., binary: does the firm have an ESG officer, or a anti-child labor policy?). Moreover, sometimes, some numerical fields are greener if they are high (% of recycling), sometimes it’s better when they are small (emissions). Even worse, there are some fields for which average values are preferred. For instance: CEO tenure. Typically, short tenure is not great (less experience in the firm), but long tenure is also not a good signal (firms need fresh new ideas and CEO rotation is healthy, up to a point). Thus, a huge amount of coding, standardizing and weighting is required. First, all fields must be:
    1. digitized (translated into numbers - this may require one-hot encoding in rare cases),
    2. ordered (so that high values are preferred - this may mean being close to an (industry?) average value, as for CEO tenure) and
    3. standardized, so that they all have the same (or similar) scale
  • Then, it’s all a matter of weighting, and this will depend on preferences. For instance, given synthetic scores for each pillar, it is customary to take the simple average of the three (E+S+G)/3, but it is entirely possible to give more weight to one pillar in particular (1/2 + 1/4 + 1/4 for instance).
  • The second issue is missing data, a real pain in the discipline. One partial solution is simply to include a coverage score, wherein the amount of data disclosed by the company is a field of its own - and can have a substantial impact on the overall score. The other alternative is imputation, whereby we attribute a “fake” (or guessed) score to the company for a given field. There are many ways to perform imputation, depending on preferences and beliefs. The most conservative option is to give the firm the worst possible score, in order to strongly penalize the corporations that refuse to disclose (but sometimes it’s also a question of lack of resource to do so… large firms clearly have an advantage here). A common option is to give an average (or median) value - either over all firms, or over all the firms of the same sector. Finally, it is also possible to resort to exposure estimation, as with the carbon beta.

In the end, the methodology that rating agencies use to compute synthetic scores is often considered as intellectual property, though some of them are quite transparent about how they proceed (white papers are sometimes available). But in the end, it is the gathering of granular data that is the most time-consuming. Aggregation is a matter of many choices, but is easily automated.

3.4 Exploring a dataset on US corporations

3.4.1 Introduction

ESG data that is:

  1. free,
  2. updated,
  3. available for many companies

is rare. One exception is Yahoo: https://finance.yahoo.com/quote/AAPL/sustainability/, which provides Sustainalytics’ ESG Risk Ratings. However, it provides the current score only and the history is not available. Moreover, scrapping Yahoo takes a lot of time (hours & hours), even with automated scripts.

Another interesting source is the Science Based Targets, which provides an up to date dashboard. Again, there is only static data, and the number of firms is about 830+ at the end of 2022 (with only 150 from the US).

This is where ESG data vendors come in handy. Their databases are useful, but quite expensive.

We extracted data from two traditional vendors, which are anonymized. We make important comments about the dataset:

  • data from Provider A is sampled monthly, while Provider B data is sampled yearly of each firm, though points may change quarterly, depending on which firm is covered.
  • Data starts in Dec. 2005 for Provider A, and in 2001 for Provider B.
  • Market_Cap is absent from Provider B, and E, S and G pillars are absent from Provider A.
  • Missing points were imputed: when an absent field is preceded by a number, the latter replaces the former.
  • We use ESG_Metric for both providers, but it is a score for Provider B, and in contrast a risk score for Provider A. Hence, in the latter, a high score is bad. ESG data for Provider A starts very late (2021).
  • Scopes for Provider A refer to total GHG (in thousands of metric tons of carbon dioxide equivalent (kmtCO2e)), while for Provider B, they are CO2 emissions (originally in mtCO2e, but manually changed to kmtCO2e). In some cases, the distinction may be subtle, as CO2 is the major source of GHG.
  • Many fields are missing. For instance, the closing price of American Airlines (AAL) is only available from 2013 onwards. This comes from the merger with US Airways. In many other cases, e.g., for Scope data, the values are simply not known (e.g., not disclosed by firms).

The data is available on Github, in R format (.RData) as well as in Excel (.xlsx) format.
\(\rightarrow\) It is meant to play with, and for pedagogical purposes only!

load("ESG_data.RData")  # This is to import the file (in the present directory)
ESG_data |> tail(10)    # This is to see the last 10 rows of the data
Source Tick CUSIP ISIN Name Date Close Market_Cap ESG_Metric E_Score S_Score G_Score Scope_1 Scope_2 Scope_3 Sector
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2011-12-31 NA NA NA NA NA NA NA NA NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2012-12-31 32.69 NA NA NA NA NA NA NA NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2013-12-31 43.03 NA 46.51 21.08 38.86 76.59 NA NA NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2014-12-31 47.92 NA 32.97 21.44 39.01 32.41 NA NA NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2015-12-31 53.53 NA 35.56 25.69 44.83 28.94 NA NA NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2016-12-31 72.04 NA 44.68 24.56 54.30 45.06 NA NA NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2017-12-31 85.54 NA 51.10 22.51 64.73 51.71 NA NA NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2018-12-31 132.35 NA 58.61 37.88 65.92 62.87 70.26 206.15 NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2019-12-31 165.50 NA 58.90 52.10 65.56 53.94 71.74 213.86 NA Health
Provider_B ZTS 98978V103 US98978V1035 ZOETIS INC 2020-12-31 244.03 NA 65.23 55.84 77.62 53.62 76.13 222.07 NA Health

3.4.2 Coverage and missing data

To evaluate the state of missing data, we resort to a dedicated package called visdat - it needs to be installed to be used.

library(visdat) # Missing data visualization
vis_dat(ESG_data, warn_large_data = F)

E, S, G and ESG metrics are quite empty (grey zones) because only available in the shorter Provider B sample at the end.

Let us now look at coverage. We define coverage as the number of firms for which a given field is provided.
For instance, below, we look at the ESG metric.

ESG_data |> 
    group_by(Source, Date) |>
    summarize(n = sum(is.finite(ESG_Metric))) |>
    ggplot(aes(x = Date, y = n, color = Source)) + geom_line() +

The time scale is the most granular one, i.e., monthly because of Provider A data. Hence the spikes for Provider B (values are not defined every month).
Unfortunately, ESG data for Provider A is only available very lately (change in their offering 👎 😞). It seems they decided to change their approach (business model) and require additional licensing for sustainable fields…

For Scope 1 emissions, more data is available.

ESG_data |> 
    group_by(Source, Date) |>
    summarize(n = sum(is.finite(Scope_1))) |>
    ggplot(aes(x = Date, y = n, color = Source)) + geom_line() +
    theme_bw() + 
    scale_color_manual(values = c("#EE9911", "#1199EE"))

3.4.3 Descriptive statistics

Most people/students hate the word “statistics”. Yet, statistics offer huge amounts of very useful tools, especially to rapidly understand & characterize data.
Let us take a first look at the distribution (across all years) of Scope 1 emissions taken from the dataset of Provider 1.

ESG_data |>
    filter(Source == "Provider_A") |>
    ggplot(aes(x = Scope_1)) + geom_histogram()

We see that the tail of the distribution is “fat”, meaning that there are observations (firms), which have huge Scope 1 emissions (> 100,000 ktCO2e). Nevertheless, a large majority of firms have emissions < 20,000 ktCO2e.

In order to have a plot that is easier to exploit, it is possible to use a logarithmic scale for the x-axis.
Let us try this for Scope 3 emissions.

ESG_data |>
    filter(Source == "Provider_A") |>
    ggplot(aes(x = Scope_3)) + geom_histogram(fill = "#2266EE", alpha = 0.7) + 
    scale_x_log10() + theme_bw() + ylab("") +
    xlab("Scope 3 emissions in ktCO2e")

In the above graph, we see the scale goes even further: one million to the right!
One important question is the relative importance of scopes.
Below, we select the observations for which we have all 3 scopes, compute average values for each firm and compare the average of the 3 scopes.

ESG_data |>
    filter(is.finite(Scope_1 + Scope_2 + Scope_3),
           Source == "Provider_A") |>
    summarise(Scope_1 = mean(Scope_1),
              Scope_2 = mean(Scope_2),
              Scope_3 = mean(Scope_3)) |>
    pivot_longer(cols = everything(),
                 names_to = "Scope", 
                 values_to = "Average_Emissions") |>
    ggplot(aes(x = Average_Emissions, y = reorder(Scope, Average_Emissions))) + geom_col() +
    ylab("") + theme_bw()

In the dataset, we have access to industry codes. Let’s have a look at what happens if we group by industry.

ESG_data |>
           Source == "Provider_A") |>
    pivot_longer(Scope_1:Scope_3, names_to = "Scope", values_to = "value") |>
    group_by(Sector, Scope) |>
    summarise(avg_emission = mean(value)) |>
    ggplot(aes(y = reorder(Sector, avg_emission), x = avg_emission, fill = Scope)) + 
    geom_col(position = "dodge")  + theme_bw() + ylab("") + scale_x_log10()

Now, there is an important issue with Scope 3 emissions: they are very hard to assess
Some companies have internal models to evaluate them, but the methodology is often opaque, as (again!) there is no regulatory framework that sets rules (e.g., formulae for each sector/industry - see below).

Some third party agencies have decided to create their own methodologies, based on accounting figures and industry standards in terms of business models.

Out of curiosity: who are the biggest polluters?

ESG_data |>
    filter(Source == "Provider_A", Date > "2022-06-01") |>
    arrange(desc(Scope_3)) |>
    head(19) # Just extracting the top 19...
Source Tick CUSIP ISIN Name Date Close Market_Cap ESG_Metric E_Score S_Score G_Score Scope_1 Scope_2 Scope_3 Sector
Provider_A CMI 231021106 US2310211063 CUMMINS INC 2022-06-30 193.53 27306.66 19.36 NA NA NA 258.44 440.62 757353.0 Manufacturing
Provider_A XOM 30231G102 US30231G1022 EXXON MOBIL 2022-06-30 85.64 360762.20 36.46 NA NA NA 108000.00 7000.00 650000.0 Energy
Provider_A CVX 166764100 US1667641005 CHEVRON 2022-06-30 144.78 284465.69 43.00 NA NA NA 57000.00 1000.00 621000.0 Energy
Provider_A MPC 56585A102 US56585A1025 MARTHN PETRO 2022-06-30 82.21 44475.19 28.70 NA NA NA 32200.00 8000.00 417000.0 Energy
Provider_A CBRE 12504L109 US12504L1098 CBRE GROUP INC 2022-06-30 73.61 24060.21 6.99 NA NA NA 60.38 22.64 361250.0 MoneyFinance
Provider_A PSX 718546104 US7185461040 PHILLIPS 66 2022-06-30 81.99 39445.39 29.35 NA NA NA 30300.00 4500.00 350000.0 Energy
Provider_A GM 37045V100 US37045V1008 GENERAL MOTORS 2022-06-30 31.76 46306.81 30.89 NA NA NA 1252.91 2881.77 254440.0 ConsumerDurables
Provider_A PG 742718109 US7427181091 PROCTER & GAMB 2022-06-30 143.79 344994.89 26.61 NA NA NA 2218.00 2566.62 247240.0 Chemicals
Provider_A BKR 05722G100 US05722G1004 BAKER HUGHES O 2022-06-30 28.87 29596.57 21.34 NA NA NA 391.35 247.99 237010.0 Manufacturing
Provider_A EXC 30161N101 US30161N1019 EXELON CORPRTN 2022-06-30 45.32 44419.81 24.39 NA NA NA 8493.00 5228.00 182391.0 Utilities
Provider_A WMT 931142103 US9311421039 WALMART INC 2022-06-30 121.58 333269.02 24.63 NA NA NA 7236.50 11031.80 171269.0 Shops
Provider_A COP 20825C104 US20825C1045 CONOCOPHILLIPS 2022-06-30 89.81 116164.70 34.92 NA NA NA 17720.00 667.66 162700.0 Energy
Provider_A BA 097023105 US0970231058 BOEING CO 2022-06-30 136.72 80888.45 34.68 NA NA NA 560.00 800.00 158092.0 Manufacturing
Provider_A OXY 674599105 US6745991058 OCCIDENTAL PET 2022-06-30 58.88 55181.80 43.53 NA NA NA 18508.80 4614.45 135000.0 Energy
Provider_A MCK 58155Q103 US58155Q1031 MCKESSON CRP 2022-06-30 326.21 46837.51 15.17 NA NA NA 114.72 147.45 114419.0 Shops
Provider_A DE 244199105 US2441991054 DEERE & CO 2022-06-30 299.47 91528.71 17.18 NA NA NA 403.30 NA 112453.0 Manufacturing
Provider_A ADM 039483102 US0394831020 ARCHER-DANIELS 2022-06-30 77.60 43666.12 36.40 NA NA NA 13700.00 2300.00 67401.2 ConsumerNondurables
Provider_A SRE 816851109 US8168511090 SEMPRA ORD 2022-06-30 150.27 47230.57 24.72 NA NA NA 6800.00 376.00 66200.0 Utilities
Provider_A TGT 87612E106 US87612E1064 TARGET CORP 2022-06-30 141.23 65487.84 14.79 NA NA NA 699.88 1492.21 64789.0 Shops
ESG_data |>
    filter(Source == "Provider_A", Date > "2022-06-01") |>
    arrange(desc(Scope_1)) |>
    head(19) # Just extracting the top 19...
Source Tick CUSIP ISIN Name Date Close Market_Cap ESG_Metric E_Score S_Score G_Score Scope_1 Scope_2 Scope_3 Sector
Provider_A XOM 30231G102 US30231G1022 EXXON MOBIL 2022-06-30 85.64 360762.20 36.46 NA NA NA 108000.0 7000.00 650000.00 Energy
Provider_A DUK 26441C204 US26441C2044 NA 2022-06-30 107.21 82551.70 27.63 NA NA NA 75365.2 3.72 29851.30 Utilities
Provider_A SO 842587107 US8425871071 SOUTHERN 2022-06-30 71.31 75768.63 33.09 NA NA NA 75112.0 204.60 36614.70 Utilities
Provider_A CVX 166764100 US1667641005 CHEVRON 2022-06-30 144.78 284465.69 43.00 NA NA NA 57000.0 1000.00 621000.00 Energy
Provider_A AEP 025537101 US0255371017 AMRCN ELCTRC O 2022-06-30 95.94 49269.43 30.55 NA NA NA 49271.4 409.22 40440.50 Utilities
Provider_A NEE 65339F101 US65339F1012 NA 2022-06-30 77.46 152170.15 27.53 NA NA NA 43027.2 17.20 2392.32 Utilities
Provider_A AES 00130H105 US00130H1059 THE AES CORP 2022-06-30 21.01 14031.73 34.16 NA NA NA 42961.0 254.00 7269.20 Utilities
Provider_A XEL 98389B100 US98389B1008 XCEL ENERGY IN 2022-06-30 70.76 38539.67 23.70 NA NA NA 39500.0 700.00 6445.59 Utilities
Provider_A ETR 29364G103 US29364G1031 ENTERGY CP 2022-06-30 112.64 22908.08 29.77 NA NA NA 35500.0 90.00 3995.26 Utilities
Provider_A D 25746U109 US25746U1097 DOMINON ENRG I 2022-06-30 79.81 64747.49 25.69 NA NA NA 33237.1 4576.14 17093.30 Utilities
Provider_A MPC 56585A102 US56585A1025 MARTHN PETRO 2022-06-30 82.21 44475.19 28.70 NA NA NA 32200.0 8000.00 417000.00 Energy
Provider_A PSX 718546104 US7185461040 PHILLIPS 66 2022-06-30 81.99 39445.39 29.35 NA NA NA 30300.0 4500.00 350000.00 Energy
Provider_A NRG 629377508 US6293775085 NRG ENERGY 2022-06-30 38.17 9057.11 31.62 NA NA NA 29767.5 241.46 3.29 Utilities
Provider_A EVRG 30034W106 US30034W1062 EVERGY INC 2022-06-30 65.25 14973.46 34.52 NA NA NA 26540.4 NA 7.77 Utilities
Provider_A PPL 69351T106 US69351T1060 PPL CORP 2022-06-30 27.13 19965.05 33.53 NA NA NA 26436.0 199.84 3793.19 Utilities
Provider_A AEE 023608102 US0236081024 AMEREN CORP 2022-06-30 90.36 23321.15 29.16 NA NA NA 25967.2 58.11 13769.70 Utilities
Provider_A DAL 247361702 US2473617023 NA 2022-06-30 28.97 18571.45 26.46 NA NA NA 24561.3 246.22 2353.04 Other
Provider_A DTE 233331107 US2333311072 DTE ENERGY 2022-06-30 126.75 24556.78 25.56 NA NA NA 24558.2 279.00 20340.80 Utilities
Provider_A VLO 91913Y100 US91913Y1001 VALERO ENERGY 2022-06-30 106.28 43372.49 30.94 NA NA NA 23000.0 4500.00 NA Energy

3.4.4 ESG disagreement In the literature

There is now abundant evidence that depending on your ESG data provider, your results/performance may change drastically.
Below, we cite a few papers that deal & have documented this effect. We point to the SSRN versions of the papers, as they are publicly available.

For instance, in the latter, the authors compute the correlation between ratings from 6 providers (see below). Some raters seem to somewhat agree with a few peers, and strongly disagree with others.

Roughly speaking, a rule of thumb is:

  • strong agreement if correlation above 0.7
  • weak agreement if correlation between 0.3 and 0.7
  • no agreement if correlation between -0.3 and 0.3
  • weak disagreement if correlation between -0.7 and -0.3
  • strong disagreement is unlikely… Example of third party (external) evaluation

In a paper in collaboration with Carbon4 Finance, we also document a strong divergence between two raters. One one hand, we have data from a major player, Refinitiv; on the other, we rely on emission scopes computed from Carbon4 Finance methodologies.

For instance, for the airline industry, the evaluation of Scope 3 (downstream) emissions for one given aircraft is:

\[E=C\sum_i U_ie_i,\] where \(U_i\) are the units sold of each type of aircraft and \(e_i\) are induced emissions over the lifetime of the item. The figure is normalized by \(C\), which is the company-specific added-values, measured as the ratio of operating income divided by revenue. The rationale for this scaling is that the firm under consideration is not solely responsible for these downstream emissions. Thus, the responsibility is shared with other entities (e.g., airline companies). The annual emissions of each aircraft \(e_i\) are decomposed as \(e_i=A_iB_iC_iD_iE_i\), where:

  • \(A_i\) is the GHG content of jet fuel (tCO2e/L)
  • \(B_i\) is the average consumption of aircraft \(i\) (in L/p.km)
  • \(C_i\) is the average annual distance traveled (km/year)
  • \(D_i\) is the average lifetime of aircraft (years)
  • \(E_i\) is the average occupancy (passengers / aircraft).

For the oil and gas sector, the formula is based on the downstream fossil fuel combustion: \[E=\sum_{i,j}V_{i,j}e_{i}v_j,\] where

  • \(i\) is the index of the product type, either liquid (from crude oil to petroleum products, including gasoline, diesel, jet fuel, natural gas liquids (NGLs), heavy fuel oil and others) and gas (conventional, shale, liquefied natural gas (LNG)).
  • \(j\) is the index of the activity carried out along the oil & gas value chain, from upstream (exploration & production) to final energy supply to consumers.
  • \(V_{i,j}\) is the volume of product \(i\) handled in activity \(j\), in tons of oil equivalent (toe).
  • \(e_i\) is the emission factor, i.e., the total amount of CO\(_2\) emissions stemming from the combustion of 1 toe of product type \(i\) (or other non-energy use in the case of petroleum coke).
  • \(v_j\) is the value added, approximated here by the ratio of the cost of activity \(j\) divided by the final price paid by the consumer. Again, this scaling reflects the fact that the downstream emissions are not attributable at 100% to the oil or gas extractor.

At the firm-level, we obtain a rather strong divergence between rating providers:

Clearly, scores are all over the place. It is even a bit worse for Scope 3 compared to Scope 1 + Scope 2. In the data?

ESG_data |>
    mutate(year = year(Date)) |>
    group_by(Source, Tick, year) |>
    summarise(Scope_3 = mean(Scope_3, na.rm = T)) |>
    pivot_wider(names_from = "Source", values_from = "Scope_3") |>
    na.omit() |>
    ggplot(aes(x = Provider_A, y = Provider_B, label = Tick)) + geom_point() +
    scale_y_log10() + scale_x_log10() + theme_bw() + 
    geom_function(fun = function(x) x, color = "#1199EE") +
    annotate("rect", xmin = 5*10^3, xmax = 10^6, ymin = 0, ymax = 15, alpha = .2) +
    annotate("text", x = 10^5, y = 0.5, label = "Strong disagreement")

The correlation between the two providers is high. The reason?

They probably take most of their numbers from the same source! (corporate reports!)

3.5 Sovereign ESG

3.5.1 Data sources

In contrast with corporate data, sovereign data is much easy to access for free.
There are many organizations that gather and aggregate indicators at the country level, for instance, we can mention:

Most of the time, an analyst will need fields from multiple sources, which will require joining datasets… a practice that is very commonplace in data science. Even though some sources (e.g., the World Bank, gapminder) provide exhaustive fields.

Lastly, it is important to mention other sources, like:
- the Carbon monitor initiative. Their aim is to provide almost real-time carbon emissions at a relatively granular level (country). The methodology is outlined in several research papers, from 2020 to late 2022. The updated dataset is available at: https://datas.carbonmonitor.org/API/downloadFullDataset.php?source=carbon_global.
- Germanwatch, and their Climate Change Performance Index (CCPI).
- The ECB: this is news & developing…

3.5.2 Which pillars?

One example below is taken from the paper Tuning Trend Following Strategies with Macro ESG Data - available upon request.

3.5.3 Geospatial examples

We start with a first example, based on one popular indicator, CO2 emissions (in metric tons per capita).
The data comes from the World Bank: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
A list of available indicators is provided here: https://data.worldbank.org/indicator.
The fetching of data will require several packages. Notably, the one, called WDI, that allows to extract data from the World Bank API. So first, we pull the data and prepare some variables for the map we want to plot.

library(tmap)                         # Geographical plotting
library(countrycode)                  # Package for country codes
library(leaflet)                      # Package for maps
library(sf)                           # Shape files (sf) are a common geographical format  

data("World")                         # From tmap!
names(World)[2] <- "country"          # Change the column name
emissions <- WDI(indicator = "EN.ATM.CO2E.PC", start = 2018, end = 2018) |>
    na.omit()                         # Remove missing data
names(emissions)[3] <- "emi_per_cap"  # Change column name

datamap <- World |> 
    mutate(country = country |> recode_factor(`Czech Rep.` = "Czech Republic")) |>
    left_join(emissions, by = "country") |>
    mutate(emi_per_cap = round(emi_per_cap,1))                      # We round numbers
# Below we code the color palette for the map
palet <- colorBin("YlGnBu",                                         # Yellow-Green-Blue palette
                  domain = datamap |> pull(emi_per_cap),            # Domain of labels: emi_per_cap
                  bins = c(0, 1, 2, 5, 10, 15, 20))                 # intervals for CO2 emissions
# Below we code the labels on the map
labels <- sprintf(                                                  # Below we define the labels
  "<strong>%s</strong><br/>%g MtCO2/inhab.",                        # Adding text to label
  datamap$country,                                                  # We show the country name...
  datamap$emi_per_cap                                               # ... and the life expectancy
) |> lapply(htmltools::HTML)                                        # Embedded all into html language

The next chunk of code is one very long call that specifies all the details of the map (no need to look!).

datamap |> 
  data.frame() |>                                 # Turn into dataframe (technical)
  sf::st_sf() |>                                  # Format in sf
  st_transform("+init=epsg:4326") |>              # Convert in particular coordinate reference 
  leaflet() |>                                    # Call leaflet
  setView(lng = 0, lat = 20, zoom = 2) |>         # Centering & zooming
  addPolygons(fillColor = ~palet(emi_per_cap),    # Create the map (colored polygons)
              weight = 2,                         # Width of separation line
              opacity = 1,                        # Opacity of separation line
              color = "white",                    # Color of separation line
              dashArray = "3",                    # Dash size of separation line
              fillOpacity = 0.7,                  # Opacity of polygon colors
              highlight = highlightOptions(       # 5 lines below control the cursor impact
                weight = 2,                       # Width of line
                color = "#EEEEEE",                # Color of line
                dashArray = "",                   # No dash
                fillOpacity = 0.9,                # Opacity
                bringToFront = TRUE),
              label = labels,                     # LABEL! Defined above!
              labelOptions = labelOptions(        # Label options below...
                style = list("font-weight" = "normal", padding = "3px 8px"),
                textsize = "15px",
                direction = "auto")
  ) |>
  leaflet::addLegend(pal = palet,           # Legend: comes from palet colors defined above
            values = ~emi_per_cap,          # Values come from lifeExp variable
            opacity = 0.9,                  # Opacity of legend
            title = "Map Legend",           # Title of legend
            position = "bottomright")       # Position of legend

Massive discrepancy between Europe and North America.

3.5.4 Time-series analyses

Maps often mostly a static view. It is interesting to have a look at values’ evolution.
We extract other variables below. Several splits thereof are available (male/female, urban/rural).

library(WDI)                          # Package that accesses World Bank data
country_list <- c("AF", "AR", "AU", "BR", "CA", "IN", 
                  "CN", "DE", "DZ", "EG", "FR", "GB", # DZ = Algeria
                  "ID", "IR", "JP", "NG", "TR", "US") 
wb_data <- WDI(                                       # World Bank data
    indicator = c("co2_percap" = "EN.ATM.CO2E.PC",    # Emissions per capita
                  "corrupt_control" = "CC.EST",       # Corruption control
                  "life_exp" = "SP.DYN.LE00.IN",      # Life expectancy
                  "cpi" = "FP.CPI.TOTL",              # Consumer Price Index (2010=100) = inflation
                  "educ_spend" = "SE.XPD.TOTL.GD.ZS", # Government expenditure on education (%GDP)
                  "gdp" = "NY.GDP.MKTP.CD",           # Gross Domestic Product (GDP)
                  "gdp_growth" = "NY.GDP.MKTP.KD.ZG", # Annual GDP growth
                  "pop" = "SP.POP.TOTL"),             # Total population
    country = country_list,                           # Zones: world, US, France, etc.
    start = 2000, 
    end = 2021)

This allows us to have a dynamic look of some variables, with geographical focus.

(wb_data |>
    ggplot(aes(x = year, y = educ_spend, color = country)) + 
    geom_line() +
    theme_bw() +
    ylab("Education spending")) |> ggplotly()
wb_data |>
    ggplot(aes(x = year, y = gdp_growth, fill = country)) + 
    geom_col() +
    facet_wrap(vars(country)) + 
    theme_bw() +
    theme(legend.position = "none",
          axis.title.x = element_blank()) +
    ylab("GDP growth")

Some discontinuities in the data: it is far from perfect! No provider is.

3.5.5 Sorting

Ranking is a widely used technique in sustainable finance (more on that later).
Let’s have a look at the corruption control indicator.

wb_data |> 
    filter(year == 2020, country != "World", is.finite(corrupt_control)) |>
    mutate(med = median(corrupt_control, na.rm = T),
           corruption = if_else(corrupt_control > med, "High control", "Low control")) |>
    ggplot(aes(x = corrupt_control, y = reorder(country, corrupt_control), fill = corruption)) +
    geom_col() + theme_bw() +
    theme(legend.position = c(0.6,0.3),
          legend.title = element_text(face = "bold"),
          axis.title = element_blank())
# <span style="color:#FF002B">**Exercise**</span>:

3.6 Wrap-up

The key takeaway from this session is that data is one (if not the) cornerstone of sustainable finance.
Measurement accuracy (& availability) is the main issue. Citizens (and investors) want trustworthy data.
Europe seems to be ahead in terms of regulation, but hopefully the US and Asia will follow.

3.7 Exercises

  1. Pick two (or three) large firms you know or like and try to find ESG related data in one of their annual reports. Can you find common fields, like carbon/GHG emissions?
  2. With the (excel) dataset from the course, compute carbon intensities (emissions/market cap) with figures from Provider A. With a pivot-table, compute the evolution through time of these intensities. Compare to total emissions. It can typically be the case that total emissions increase while intensities decrease: this would come from the fact that market capitalization grows faster than emissions.