Sustainable Finance Final Project

Author

Yin Guan

Introduction

In recent years, there has been a growing recognition of the importance of Environmental, Social and Governance (ESG) factors in the business world. As corporations face increasing pressure to address issues related to sustainability, social responsibility and ethical governance.Understanding the impact of ESG policies on financial stability necessitates an exploration of multifaceted ways in which factors influence corporate behavior and performance. Hence this report will address the question that How do firms’ Environmental, Social and Governance (ESG) policies affecr their capacity to remain financially stable?

Data

The data for ESG scores and the financial factors of companies was taken from FTSE Russell finance data publically posted on Github. These ratings offer perceptions on how a business handles and is exposed to environmental, social, and governance (ESG) concerns in a number of ways. Despite the fact that we may not consistently have the opportunity to view all the information we want, we can still learn a lot about how well firms are performing in terms of environmental sustainability by making use of the data that is already available, such as FTSE Russell’s ESG Scores.

Research Questions

Several important questions will be addressed by the data analysis:

1. How do businesses across various industries do when it comes to their ESG scores?

2. What are the general advancements and trends in the ESG performance of various sectors and geographical areas?

3. Does the financial performance criteria of profitability, management of risks, and return on investment correlate with high ESG scores?

Audience

The target audience for this analysis is Investors or Stakeholders of these companies. Nowaday, investors are increasingly considering environmental, social and governance aspects before making any investment.This report will hep investors to make more sustainable and educated investments. This report will delve into the relationship between farious financial key performer indicators and ESG practice by each company.

Sector Analysis

This analysis will focus on analyzing companies across various sectors, including:

* Financial Services

* Utilities

* Food

* Healthcare

* Real Estate

* Technology

*Transportation and Telecommunications

These industries were selected because of their importance to the world economy and because they may have an effect on long-term financial viability. We can uncover patterns, best practices, and opportunities for development by analyzing ESG performance in various industries, which will eventually help investors make more environmentally friendly choices.

Data cleaning Plan

Data Assessment:

First, I will open both datasets, ESG_data and Finance_data, to understand their contents. I’ll take note of the variables present in each dataset and their respective data types. Then, I’ll identify any common identifiers that can be used to merge the datasets, such as company names or ticker symbols.

Data Reading and Merging:

After understanding the structure of the datasets, I’ll load them into R Studio data analysis environment. Using appropriate functions or methods, I’ll merge the datasets based on the common identifiers in both the datasets.

Handling Missing Data:

I’ll check for missing values in the merged dataset and decide how to handle them. Depending on the extent of missing data, I’ll implement strategies like imputation or deletion to address them.

Duplicate Observations Removal:

Next, I’ll search for any duplicate entries representing the same company within the dataset. I’ll come up with a plan to remove duplicates while ensuring that relevant information is retained.

Selecting Industries of Interest:

As to measure the sustainable finance, I had chosen important industries from the data. Hence in the tidying process I will filter the above mentioned industries from the data to save in the new dataset.

ESG Rating Calculation:

To assess each company’s ESG performance, I’ll create a new variable to store the calculated ESG rating. This rating will be computed by averaging the environmental, social, and governance ratings provided in the dataset.

Final Dataset Preparation:

Finally, I’ll verify the formatting of variables to ensure consistency and accuracy. If necessary, I’ll rename variables and adjust labels for clarity. Once the dataset is cleaned and prepared, it will be ready for further analysis.

Data Tidying

Step 1: Data Reading

In this step, I first load all the necessary libraries that I will be using in this analysis. After that I load the ESG_data and Finance_data files using the readxl package.

library(readxl)
library(png)
library(summarytools)
library(readr)
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(ggplot2)
library(GGally)
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
ESG_data <- read_excel("Desktop/Rstudio Project/00_data_raw/ESG_data.xlsx")
Finance_data <- read_excel("Desktop/Rstudio Project/00_data_raw/Finance_data.xlsx")

Step 2: Data Merging

In this step first i look for the common identifies that I can use to merge both the datasets. Using name function I examined the variable names in both datasets. I found that there are there are four common variables in both the datasets including - Company Name, Industry, country and Ticker Symbol. I merged the ESG_data and Finance_data datasets using “Ticker symbols” as it is a unique identifier and correct variable to merge these datasets.

# Check the name of the varibles in the dataset
names(ESG_data)
[1] "Company Name"  "Industry"      "Country"       "Ticker Symbol"
[5] "Enviornmental" "Social"        "Governance"   
names(Finance_data)
 [1] "Company Name"             "Industry"                
 [3] "Country"                  "Ticker Symbol"           
 [5] "EPS"                      "Profit_Margin"           
 [7] "Tobins_Q"                 "ROA"                     
 [9] "ROE"                      "Debt_To_Market_Cap_Ratio"
[11] "Total_Asset_Turnover"     "Price_to_Sales_Ratio"    
# Merge the datasets
FS_data <- merge(ESG_data, Finance_data)

Step 3: Handling Missing Data

Next, in this step I looked for any missing values in the data. I found that the total of 66 observations are missing in total of 12 columns. As the information we have for these missing values is the company name and Industry, it is difficult to impute the missing values in the datasets. The no of observations missing is less than 1% of the sample size, I removed the observation with missing value from my dataset using na.omit function.

# Check for missing values in the entire dataset
missing_values <- sum(is.na(FS_data))

# Check for missing values in each column
missing_values_per_column <- colSums(is.na(FS_data))

# Print the total number of missing values
print(paste("Total missing values:", missing_values))
[1] "Total missing values: 66"
# Print the number of missing values per column
print("Missing values per column:")
[1] "Missing values per column:"
print(missing_values_per_column)
            Company Name                 Industry                  Country 
                       0                        0                        5 
           Ticker Symbol            Enviornmental                   Social 
                       6                        5                        5 
              Governance                      EPS            Profit_Margin 
                       5                        5                        5 
                Tobins_Q                      ROA                      ROE 
                       5                        5                        5 
Debt_To_Market_Cap_Ratio     Total_Asset_Turnover     Price_to_Sales_Ratio 
                       5                        5                        5 
# Remove missing values from the data
FS_data1 <- na.omit(FS_data)

Step 4: Removing Duplicate Data

In this step I have examined if there are any duplicate company data we have in the dataset. For this I used duplictaed function to check for any duplicate company names in the dataset. I found that about 18 companies has duplicated data present in my dataset. Now after identifying these duplicates observations, I removed these duplicate entries using duplicated function.

# Check for duplicated rows in the entire dataset
duplicated_rows <- FS_data[duplicated(FS_data$`Company Name`), ]

# Print the duplicated rows
print("Duplicated rows:")
[1] "Duplicated rows:"
print(duplicated_rows$`Company Name`)
 [1] "AP Moller - Maersk A/S"              "Atlas Copco AB"                     
 [3] "Bayerische Motoren Werke AG"         "CNP Assurances"                     
 [5] "FUCHS PETROLUB SE"                   "Henkel AG & Co KGaA"                
 [7] "Liberty Global PLC"                  "Liberty Media Corp-Liberty SiriusXM"
 [9] "News Corp"                           "Roche Holding AG"                   
[11] "Royal Dutch Shell PLC"               "RWE AG"                             
[13] "Schibsted ASA"                       "Schindler Holding AG"               
[15] "Skandinaviska Enskilda Banken AB"    "Svenska Handelsbanken AB"           
[17] "Twenty-First Century Fox Inc"        "Volkswagen AG"                      
# Count the number of duplicated rows
num_duplicated <- sum(duplicated(FS_data$`Company Name`))
print(paste("Total duplicated rows:", num_duplicated))
[1] "Total duplicated rows: 18"
# Remove duplicate values from the data
FS_subset <- FS_data1[!duplicated(FS_data1[c('Company Name')]), ]

Step 5: Selecting Industries of Interest

Based on my research objectives, I filtered the dataset to include only companies belonging to Financial Services, Utilities, Food, Healthcare, Real Estate, Technology, Transportation and Telecommunications specific industries.

# Filtering data using specific industries for further analysis
Final_data <- FS_subset[FS_subset$Industry %in% c('Financial Services', 'Utilities', 'Food', 'Healthcare', 'Real Estate', 'Technology', 'Transportation and Telecommunication'), ]

Step 6: Calculating ESG Rating

Now the important variable for this analysis and the dependent variable of the study is ESG score for each company. I calculated the ESG score by Taking average of environmental, social, and governance ratings of companies in the data. I used mutate function from dplyr package to create a new variable by taking average of the existing variables.

library(dplyr)

# Taking average to create ESG score variable
Final_data <- Final_data %>% rowwise() %>% mutate(ESG = mean(c(Enviornmental,Social,Governance)))

Step 7: Exploratory data analysis

The process for tidying the dataset has been completed using the above all steps. Now before saving the data as our final data, I did some exploratory data analysis to make sure my dataset is properly cleaned to use for analysis. The ESG variable follows normal distribution but the independent variables follows non-normal distribution. This can be because of difference in company size, turnover etc. Thus in order to use these variable in the analysis, I took logarithm of some of the independent variables.

# Histogram for ESG
hist(Final_data$ESG, main = "Histogram of ESG", xlab = "ESG")

# Histograms for independent variables
par(mfrow = c(2, 4)) # Arrange plots in a 2x4 grid
hist(Final_data$Profit_Margin, main = "Histogram of Profit Margin", xlab = "Profit Margin")
hist(Final_data$Tobins_Q, main = "Histogram of Tobin's Q", xlab = "Tobin's Q")
hist(Final_data$ROA, main = "Histogram of ROA", xlab = "ROA")
hist(Final_data$ROE, main = "Histogram of ROE", xlab = "ROE")
hist(Final_data$Debt_To_Market_Cap_Ratio, main = "Histogram of Debt To Market Cap Ratio", xlab = "Debt To Market Cap Ratio")
hist(Final_data$Total_Asset_Turnover, main = "Histogram of Total Asset Turnover", xlab = "Total Asset Turnover")
hist(Final_data$Price_to_Sales_Ratio, main = "Histogram of Price to Sales Ratio", xlab = "Price to Sales Ratio")

Final_data$logProfit_Margin <- log(Final_data$Profit_Margin)
Warning in log(Final_data$Profit_Margin): NaNs produced
Final_data$logTobins_Q <- log(Final_data$Tobins_Q)
Final_data$logDebt_To_Market_Cap_Ratio <- log(Final_data$Debt_To_Market_Cap_Ratio)
Final_data$logTotal_Asset_Turnover <- log(Final_data$Total_Asset_Turnover)
Final_data$logPrice_to_Sales_Ratio <- log(Final_data$Price_to_Sales_Ratio)

Step 8 Descriptive analysis

In this step I conducted the descriptive statistics to know more about the data. the descrpitive statistics shows that the average profit margin is 11.258, tobins_q is 1.9395, average ROA is 5.068, average ROE is 11.35 and average debt to market capital ratio is 0.9328. Moreover, average total turnover asset is 0.5350, average price to sales ratio is 4.8010 and most importantly average ESG score is 2.68. I had further categorized ESG as poor when 0 to 2, fair when 2 to 4 and good when more than 4. I further calculated average score of all the financial variable in comparison to different category of ESG. I found that the companies with good ESG ahs average profit margin very low i.e 13.76, low tobin’s Q and ROA. However, good ESG score companies has high average ROE and Price to sale ratio.

I had further explored the ESG score for different industries. The transportation and telecommunication industry has highest average ESG score of 2.80, with standard deviation of 1.02, minimum of 0.6 and maximum of 5. The lowest ESG score of 2.24 is for real estate with standard deviation of 0.92, minimum of 0.03 and maximum of 4.6. the three industries with highest average ESG scores are telecommunication and transportation , utilities industry and finnacial services industry.

# Create Categorical ESG Variable
Final_data$ESG_cat <- cut(Final_data$ESG, breaks = c(0, 2, 4, Inf), labels = c("Poor", "Fair", "Good"))

# Creating summary statistics
Summary <- summary(Final_data, measures = list(Profit_Margin, Tobins_Q, ROA, ROE, Debt_To_Market_Cap_Ratio, Total_Asset_Turnover, Price_to_Sales_Ratio))
print(Summary)
 Company Name         Industry           Country          Ticker Symbol     
 Length:989         Length:989         Length:989         Length:989        
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Enviornmental       Social        Governance         EPS          
 Min.   :0.000   Min.   :0.000   Min.   :0.000   Min.   :-1466.00  
 1st Qu.:1.000   1st Qu.:1.300   1st Qu.:2.700   1st Qu.:    0.32  
 Median :2.500   Median :2.300   Median :3.300   Median :    1.06  
 Mean   :2.518   Mean   :2.264   Mean   :3.261   Mean   :  172.81  
 3rd Qu.:3.800   3rd Qu.:3.200   3rd Qu.:4.000   3rd Qu.:   12.35  
 Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :55299.23  
                                                                   
 Profit_Margin          Tobins_Q            ROA               ROE        
 Min.   : -165.394   Min.   : 0.5761   Min.   :-29.338   Min.   :-84.34  
 1st Qu.:    4.489   1st Qu.: 1.0295   1st Qu.:  1.139   1st Qu.:  7.10  
 Median :   11.258   Median : 1.3566   Median :  3.919   Median : 11.35  
 Mean   :   39.945   Mean   : 1.9395   Mean   :  5.068   Mean   : 15.10  
 3rd Qu.:   22.799   3rd Qu.: 2.0684   3rd Qu.:  7.421   3rd Qu.: 17.93  
 Max.   :19779.900   Max.   :41.8726   Max.   : 58.013   Max.   :470.25  
                                                                         
 Debt_To_Market_Cap_Ratio Total_Asset_Turnover Price_to_Sales_Ratio
 Min.   : 0.0000          Min.   :0.001528     Min.   :  0.0737    
 1st Qu.: 0.1106          1st Qu.:0.120541     1st Qu.:  1.1719    
 Median : 0.3118          Median :0.403958     Median :  2.3291    
 Mean   : 0.9328          Mean   :0.535022     Mean   :  4.8010    
 3rd Qu.: 0.7857          3rd Qu.:0.722121     3rd Qu.:  4.4441    
 Max.   :30.7604          Max.   :4.414300     Max.   :922.2709    
                                                                   
      ESG          logProfit_Margin  logTobins_Q      
 Min.   :0.03333   Min.   :-3.534   Min.   :-0.55142  
 1st Qu.:1.90000   1st Qu.: 1.735   1st Qu.: 0.02904  
 Median :2.66667   Median : 2.533   Median : 0.30499  
 Mean   :2.68119   Mean   : 2.479   Mean   : 0.45928  
 3rd Qu.:3.53333   3rd Qu.: 3.194   3rd Qu.: 0.72676  
 Max.   :5.00000   Max.   : 9.892   Max.   : 3.73463  
                   NA's   :74                         
 logDebt_To_Market_Cap_Ratio logTotal_Asset_Turnover logPrice_to_Sales_Ratio
 Min.   :   -Inf             Min.   :-6.4840         Min.   :-2.6078        
 1st Qu.:-2.2018             1st Qu.:-2.1158         1st Qu.: 0.1586        
 Median :-1.1654             Median :-0.9064         Median : 0.8455        
 Mean   :   -Inf             Mean   :-1.2573         Mean   : 0.8257        
 3rd Qu.:-0.2412             3rd Qu.:-0.3256         3rd Qu.: 1.4916        
 Max.   : 3.4262             Max.   : 1.4848         Max.   : 6.8268        
                                                                            
 ESG_cat   
 Poor:304  
 Fair:570  
 Good:115  
           
           
           
           
# Creating summary statistics by group
descr_table <- Final_data %>%
  group_by(ESG_cat) %>%
  summarise(
    mean_Profit_Margin = mean(Profit_Margin),
    mean_Tobins_Q = mean(Tobins_Q),
    mean_ROA = mean(ROA),
    mean_ROE = mean(ROE),
    mean_Debt_To_Market_Cap_Ratio = mean(Debt_To_Market_Cap_Ratio),
    mean_Total_Asset_Turnover = mean(Total_Asset_Turnover),
    mean_Price_to_Sales_Ratio = mean(Price_to_Sales_Ratio),
    .groups = "drop"
  )
print(descr_table)
# A tibble: 3 × 8
  ESG_cat mean_Profit_Margin mean_Tobins_Q mean_ROA mean_ROE
  <fct>                <dbl>         <dbl>    <dbl>    <dbl>
1 Poor                  86.6          2.00     5.00     12.7
2 Fair                  20.3          1.98     5.40     16.3
3 Good                  13.8          1.60     3.60     15.4
# ℹ 3 more variables: mean_Debt_To_Market_Cap_Ratio <dbl>,
#   mean_Total_Asset_Turnover <dbl>, mean_Price_to_Sales_Ratio <dbl>
# Creating summary statistics by industry
Final_data %>%
  group_by(Industry) %>%
  summarise(
    mean = mean(ESG),
    SD = sd(ESG),
   Median = median(ESG),
    Minimum = min(ESG),
   Maximum = max(ESG),
    .groups = "drop"
  )
# A tibble: 7 × 6
  Industry                              mean    SD Median Minimum Maximum
  <chr>                                <dbl> <dbl>  <dbl>   <dbl>   <dbl>
1 Financial Services                    2.78 1.12    2.73  0.233     4.73
2 Food                                  2.61 1.00    2.73  0.333     4.73
3 Healthcare                            2.58 0.996   2.57  0.333     4.83
4 Real Estate                           2.24 0.923   2.17  0.0333    4.6 
5 Technology                            2.75 0.953   2.67  0.867     4.67
6 Transportation and Telecommunication  2.80 1.02    2.85  0.533     5   
7 Utilities                             2.78 0.871   2.77  0.6       4.77
# Creating a subset of data
subset_df <- Final_data %>% select("ESG","Profit_Margin", "Tobins_Q", "ROA", "ROE", "Debt_To_Market_Cap_Ratio", "Total_Asset_Turnover", "Price_to_Sales_Ratio")

# Creating a scatter plot matrix using subset data
ggpairs(subset_df)

The elaborate scatter plot matrix not only shows correlation between ESG and independent financial variable bust also among the independent factors. It is important to know the relationship among independent variables, as it helps to avoid potential multicollinearity in the regression model. The plot shows the ESG is positively correlated with debt to market ratio (0.083) and return on equity (ROE) (0.068). However, the correlation coefficient was very small, which means the correlation was very weak. Also there was a negative correlation between ESG and price to sales ration, but with very small magnitude (-0.080). It can also be notices that there was a good correlation between some if the independent variable like return on assets and tobin’s Q(0.448). Similarly between ROA and ROE (0.467). Hence we will be not be using these three variables all togther in the regression model as it will result in multicollinearity which is a strict assumption for regression model. Thus in further analysis based on the impact of these variables on ESG, the important variable will be chosen among these three to avoid any multicollinearity.

Step 9 Saving the data

Now the data is cleaned and ready to use for further analysis and I stored the data using csv format in the specified folder.

# Save data in csv file
write_csv(Final_data,"Desktop/Rstudio Project/03_data_processed/Final_data.csv")