Data Analysis Homework: Week 3

Author

Joe Aumuller

##Intro

Load in the data & packages

library(tidyverse)
Warning: package 'tidyverse' was built under R version 4.2.2
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
✔ ggplot2 3.4.0     ✔ purrr   1.0.1
✔ tibble  3.1.8     ✔ dplyr   1.1.0
✔ tidyr   1.3.0     ✔ stringr 1.5.0
✔ readr   2.1.3     ✔ forcats 1.0.0
Warning: package 'ggplot2' was built under R version 4.2.2
Warning: package 'tidyr' was built under R version 4.2.2
Warning: package 'readr' was built under R version 4.2.2
Warning: package 'purrr' was built under R version 4.2.2
Warning: package 'dplyr' was built under R version 4.2.2
Warning: package 'stringr' was built under R version 4.2.2
Warning: package 'forcats' was built under R version 4.2.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
# assign the url to `github_raw_csv_url`
github_raw_csv_url <- "https://raw.githubusercontent.com/t-emery/sais-susfin_data/main/datasets/blackrock_etf_screener_2022-08-30.csv"

# read in the data, and assign it to the object `blackrock_etf_data`
blackrock_etf_data <- read_csv(github_raw_csv_url)
Rows: 393 Columns: 22
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (14): ticker, name, incept_date, net_assets_as_of, asset_class, sub_asse...
dbl  (8): gross_expense_ratio_percent, net_expense_ratio_percent, net_assets...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

###Initial Data Cleaning

blackrock_etf_data <- blackrock_etf_data |> 
  # we are transforming both date columns (currently character strings) into date objects
  # so we can work with them.
  # this syntax is a bit confusing, but selects all columns containing `date` and applies
  # lubridate::mdy() function to them to turn them into date objects. 
  mutate(across(contains("date"), lubridate::mdy)) |>
  # Billions is a more useful magnitude than millions, so we'll create a column with 
  # the assets in billions by dividing by `net_assets_millions` by 1,000 (10^3)
  # If we wanted trillions, we could divide by 1,000,000 (10^6)
  mutate(net_assets_usd_bn = net_assets_usd_mn/10^3) |> 
  # this column doesn't add anything to our analysis - it says that the data is from 8/30/22
  select(-net_assets_as_of)

###Create Mini Data Set

mini_blackrock_data <- blackrock_etf_data |> 
  # group by whether the fund is an ESG fund or not
  group_by(is_esg) |> 
  # take the top 5 from each group, by net assets
  slice_max(order_by = net_assets_usd_bn, n = 5) |> 
  # select the following columns 
  select(ticker, fund_name = name_wo_ishares_etf, asset_class, sub_asset_class, region, incept_date, net_assets_usd_bn,
         msci_weighted_average_carbon_intensity_tons_co2e_m_sales) |> 
  # rename to `co2_intensity` because the full name is a mouthful, if descriptive.
  rename(co2_intensity = msci_weighted_average_carbon_intensity_tons_co2e_m_sales) |> 
  # always good to ungroup() if you've used a group_by().  We'll discuss later.
  ungroup()
Adding missing grouping variables: `is_esg`
mini_blackrock_data
# A tibble: 10 × 9
   is_esg       ticker fund_…¹ asset…² sub_a…³ region incept_d…⁴ net_a…⁵ co2_i…⁶
   <chr>        <chr>  <chr>   <chr>   <chr>   <chr>  <date>       <dbl>   <dbl>
 1 ESG Fund     ESGU   ESG Aw… Equity  Large/… North… 2016-12-01   22.4    104. 
 2 ESG Fund     ESGD   ESG Aw… Equity  Large/… Global 2016-06-28    6.43   104. 
 3 ESG Fund     ICLN   Global… Equity  All Cap Global 2008-06-24    5.63   266. 
 4 ESG Fund     ESGE   ESG Aw… Equity  Large/… Global 2016-06-28    4.23   168. 
 5 ESG Fund     DSI    MSCI K… Equity  Large/… North… 2006-11-14    3.69    72.7
 6 Regular Fund IVV    Core S… Equity  Large … North… 2000-05-15  298.     148. 
 7 Regular Fund IEFA   Core M… Equity  All Cap Global 2012-10-18   84.2    127. 
 8 Regular Fund AGG    Core U… Fixed … Multi … North… 2003-09-22   82.3    283. 
 9 Regular Fund IJR    Core S… Equity  Small … North… 2000-05-22   66.5    133. 
10 Regular Fund IEMG   Core M… Equity  All Cap Global 2012-10-18   64.9    369. 
# … with abbreviated variable names ¹​fund_name, ²​asset_class, ³​sub_asset_class,
#   ⁴​incept_date, ⁵​net_assets_usd_bn, ⁶​co2_intensity

##Blackrock ETF Screener Findings

###Finding 1: Is bigger better?

North America dominates the ESG market with almost $300B USD in assets. Looking more closely, these ESG assets are almost entirely held within the U.S. When looking at BlackRock’s ESG ETF business it is important to note that assets are majority US held. Might this affect the scoring or carbon intensity of assets worldwide?

blackrock_etf_data |> 
  select(region, net_assets_usd_bn) |> 
  group_by(region) |> 
  ggplot(aes(x = region, fill = region)) +
    geom_bar(aes(y = net_assets_usd_bn), stat = "identity", position = 'dodge')

blackrock_etf_data |> 
  select(region, location, net_assets_usd_bn) |> 
  group_by(region, location) |> 
  filter(region == 'North America') |> 
  ggplot(aes(x = region, fill = location)) +
    geom_bar(aes(y = net_assets_usd_bn), stat = "identity", position = 'dodge')

###Finding 2: North America, efficient or score bias?

Interestingly, the North America region is the second lowest for carbon intensity per $ invested in assets. It is much less carbon intensive in comparison to other regional ESG markets (seen in Graph 2). As mentionned in their scoring methodology, MSCI ESG scores can often bias against regional assets where oil and coal production are still prevalent. This might affect how emerging markets are scored and capital flows to developing economies…

blackrock_etf_data |> 
  rename(co2_intensity = msci_weighted_average_carbon_intensity_tons_co2e_m_sales) |> 
  select(region, co2_intensity) |> 
  group_by(region) |> 
  summarize(co2_intensity_region = mean(co2_intensity, na.rm = TRUE)) |> 
  ggplot(aes(x = region,fill = region)) +
    geom_bar(aes(y = co2_intensity_region), stat = "identity", position = 'dodge')

###Finding 3: Emerging Markets more CO2 Intensive

These other regional markets are overwhelmingly emerging markets which brings into question the CO2 intensity of investments in emerging markets and their ESG quality. These appear to be largely concentrated in oil producing regions like Kuwait, the Middle East, and Latin America. This chart highlights how the three most carbon intensive ESG ETFs are located in entirely emerging markets. When looking at carbon intensity amongst BlackRock’s ESG ETF business its important to note the correlation between carbon intensity and developed vs emerging markets. From the second plot, it appears that

blackrock_etf_data |> 
  rename(co2_intensity = msci_weighted_average_carbon_intensity_tons_co2e_m_sales) |> 
  select(region, market, co2_intensity) |> 
  group_by(region, market) |> 
  summarize(co2_intensity_region = mean(co2_intensity, na.rm = TRUE)) |> 
  ggplot(aes(x = region,fill = market)) +
    geom_bar(aes(y = co2_intensity_region), stat = "identity", position = 'dodge')
`summarise()` has grouped output by 'region'. You can override using the
`.groups` argument.
Warning: Removed 1 rows containing missing values (`geom_bar()`).

blackrock_etf_data |> 
  ggplot(aes(x = net_assets_usd_bn, y = msci_weighted_average_carbon_intensity_tons_co2e_m_sales, color = market)) +
    geom_point(alpha = 1 / 10, aes(color = market)) + 
    geom_smooth(se = FALSE)
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Warning: Removed 62 rows containing non-finite values (`stat_smooth()`).
Warning: Removed 62 rows containing missing values (`geom_point()`).

##Part 2

###Load in data & packages

etf_comparison_data_github_url <- "https://raw.githubusercontent.com/t-emery/sais-susfin_data/main/datasets/etf_comparison-2022-10-03.csv"

etf_comparison <- read_csv(etf_comparison_data_github_url)
Rows: 537 Columns: 14
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (4): ticker, company_name, sector, esg_uw_ow
dbl (7): esg_etf, standard_etf, esg_tilt, esg_tilt_z_score, esg_tilt_rank, e...
lgl (3): in_esg_only, in_standard_only, in_on_index_only

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
etf_comparison |> 
glimpse()
Rows: 537
Columns: 14
$ ticker              <chr> "PRU", "GIS", "K", "ADP", "ECL", "JCI", "ES", "PEG…
$ company_name        <chr> "PRUDENTIAL FINANCIAL INC", "GENERAL MILLS INC", "…
$ sector              <chr> "Financials", "Consumer Staples", "Consumer Staple…
$ esg_etf             <dbl> 0.5366803, 0.5522180, 0.4534279, 0.6486836, 0.4407…
$ standard_etf        <dbl> 0.10574313, 0.15134370, 0.05920732, 0.31168123, 0.…
$ in_esg_only         <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, F…
$ in_standard_only    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, F…
$ in_on_index_only    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, F…
$ esg_tilt            <dbl> 0.4309371, 0.4008743, 0.3942206, 0.3370024, 0.3222…
$ esg_uw_ow           <chr> "Overweight", "Overweight", "Overweight", "Overwei…
$ esg_tilt_z_score    <dbl> -3.396231, -3.159305, -3.106867, -2.655928, -2.539…
$ esg_tilt_rank       <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,…
$ esg_tilt_percentile <dbl> 0.000000000, 0.001865672, 0.003731343, 0.005597015…
$ esg_tilt_quantile_5 <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
view(etf_comparison)

###Fund Holdings Data

####Finding 1: Which are the top 5 sectors for ESG investment?

The ESG Tilt Ranking appears highest in the Financial sector, but not in other sectors that may need to demonstrate high ESG scores for actual change in emissions reductions like the Energy sector. Is the higher ESG Tilt Ranking of the financial sector and relatively ranking of energy and materials indicative of “greenwashing” ?

etf_comparison |> 
  group_by(sector) |> 
  slice_max(order_by = esg_tilt_rank, n =1) |> 
  select(sector, esg_tilt_rank) |> 
  arrange(esg_tilt_rank |>  desc())
# A tibble: 11 × 2
# Groups:   sector [11]
   sector                 esg_tilt_rank
   <chr>                          <dbl>
 1 Financials                       537
 2 Consumer Staples                 536
 3 Health Care                      535
 4 Industrials                      531
 5 Consumer Discretionary           530
 6 Utilities                        528
 7 Communication                    521
 8 Information Technology           520
 9 Energy                           514
10 Materials                        509
11 Real Estate                      503

####Finding 2: What portion of Financial Sector are actually ESG?

On average, while the Financial sector has a much higher ESG ranking, it is comprised of a relatively low percentage of ESG funds. This calls into question whether or not the scoring is accurately reflecting proper ESG funds and offsets.

etf_comparison |> 
  group_by(sector) |>
  filter(sector == "Financials") |> 
  summarize(esg = mean(esg_etf, na.rm = TRUE), 
            stan_etf = mean(standard_etf, na.rm = TRUE))
# A tibble: 1 × 3
  sector       esg stan_etf
  <chr>      <dbl>    <dbl>
1 Financials 0.153    0.162

####Finding 3:Who are the 10 highest ranked ESG fund holders in the financial sector?

Here we can clearly see the top 10 investors and their respective ranking. When looking at this we should also consider what other assets do these investors hold? Are they truly fueling the proper transition or just taking advantage of loose scoring systems?

etf_comparison |> 
  group_by(sector) |>
  filter(sector == "Financials") |> 
  slice_max(order_by = esg_tilt_rank, n =10) |> 
  select(company_name, sector, esg_tilt_rank) |> 
  ungroup()
# A tibble: 10 × 3
   company_name               sector     esg_tilt_rank
   <chr>                      <chr>              <dbl>
 1 BERKSHIRE HATHAWAY INC     Financials           537
 2 WELLS FARGO                Financials           526
 3 AON PLC                    Financials           515
 4 US BANCORP                 Financials           512
 5 METLIFE INC                Financials           493
 6 ARTHUR J GALLAGHER         Financials           488
 7 CAPITAL ONE FINANCIAL CORP Financials           484
 8 MSCI INC                   Financials           479
 9 AFLAC INC                  Financials           473
10 CHARLES SCHWAB CORP        Financials           469