# Read S&P500 stock data present in a Google Sheet.
library(gsheet)
<- "https://docs.google.com/spreadsheets/d/"
prefix <- "11ahk9uWxBkDqrhNm7qYmiTwrlSC53N1zvXYfv7ttOCM"
sheetID <- paste(prefix,sheetID) # Form the URL to connect to
url500 <- gsheet2tbl(url500) # Read it into a tibble called sp500 sp500
Live Case: S&P500 (2 of 3)
Aug 7, 2023
ISSUE: Understanding the S&P500 as a whole Aug 06, 2023 -=- This chapter is being heavily edited
S&P 500 Data - PRELIMINARY SETUP
- We will continue our analysis of the S&P 500. Load the data, as described in the chapter Live Case: S&P500 (1 of 3)
- Rename columns, as described in the chapter Live Case: S&P500 (1 of 3).
suppressPackageStartupMessages(library(dplyr))
# Define a mapping of new column names
<- c(
new_names "Date", "Stock", "StockName", "Sector", "Industry",
"MarketCap", "Price", "Low52Wk", "High52Wk",
"ROE", "ROA", "ROIC", "GrossMargin",
"OperatingMargin", "NetMargin", "PE",
"PB", "EVEBITDA", "EBITDA", "EPS",
"EBITDA_YOY", "EBITDA_QYOY", "EPS_YOY",
"EPS_QYOY", "PFCF", "FCF",
"FCF_QYOY", "DebtToEquity", "CurrentRatio",
"QuickRatio", "DividendYield",
"DividendsPerShare_YOY", "PS",
"Revenue_YOY", "Revenue_QYOY", "Rating"
)# Rename the columns using the new_names vector
<- sp500 %>%
sp500 rename_with(~ new_names, everything())
- Remove Rows containing no data or Null values, as described in the chapter Live Case: S&P500 (1 of 3).
# Check for blank or null values in the "Stock" column
<- any(sp500$Stock == "" | is.null(sp500$Stock))
hasNull if (hasNull) {
# Remove rows with null or blank values from the dataframe tibble
<- sp500[!(is.null(sp500$Stock) | sp500$Stock == ""), ]
sp500 }
- The S&P500 shares are divided into multiple Sectors. Thus, model Sector as a factor() variable, as described in the chapter Live Case: S&P500 (1 of 3).
$Sector <- as.factor(sp500$Sector) sp500
- Stock Ratings: The S&P500 shares have Technical Ratings such as {Buy, Sell, ..}. Model the data column Rating as a factor() variable, as described in the chapter Live Case: S&P500 (1 of 3).
$Rating <- as.factor(sp500$Rating) sp500
- Low52WkPerc: Create a new column to track Share Prices relative to their 52 Week Low, as described in the chapter Live Case: S&P500 (1 of 3).
<- sp500 %>% mutate(Low52WkPerc = round((Price - Low52Wk)*100 / Low52Wk,2))
sp500 colnames(sp500)
[1] "Date" "Stock" "StockName"
[4] "Sector" "Industry" "MarketCap"
[7] "Price" "Low52Wk" "High52Wk"
[10] "ROE" "ROA" "ROIC"
[13] "GrossMargin" "OperatingMargin" "NetMargin"
[16] "PE" "PB" "EVEBITDA"
[19] "EBITDA" "EPS" "EBITDA_YOY"
[22] "EBITDA_QYOY" "EPS_YOY" "EPS_QYOY"
[25] "PFCF" "FCF" "FCF_QYOY"
[28] "DebtToEquity" "CurrentRatio" "QuickRatio"
[31] "DividendYield" "DividendsPerShare_YOY" "PS"
[34] "Revenue_YOY" "Revenue_QYOY" "Rating"
[37] "Low52WkPerc"
Well done! Our data is now ready for analysis!!
- TODO: Create a new column MarketCapBillions = MarketCap/1000,000,000
ANALYSIS OF S&P500 SECTORS
TODO: Use addmargins() and kableextra etc code to show a table, listing each sector name; no of shares within each sector; Grand Total below showing 502
TODO: Count Shares by Sector, use table(), use addmargins()
Visuaize using Bar Chart (counts), horizontal 19 bars, with display of counts
TODO: Count Shares by Rating
Visualize using Pie Chart – 5 pies split across 500 companies
TODO: Count Shares by Sector*Rating ftable()
The table() function allows us to count how many stocks have each Rating.
use ggpie(), ggbarplot(), table(), addmargins(), ftable()
MARKET CAP
TODO: Work in Billions; 1. Market Cap of all companies by Sector
library(janitor) # This package helps us auto generate the total at the bottom of a table.
library(kableExtra)
# Market Cap by Sector
<- sp500 %>%
MCap group_by(Sector) %>%
summarise(
MarketCapCr = sum(na.omit(MarketCap)/10000000))
# Total Market Cap of the entire S&P 500 (in Millions)
<- sum(sp500$MarketCap/10000000)
SP500MarketCap
# calculating % market cap
<- round(MCap$MarketCapCr*100/SP500MarketCap,2)
PercentMarketCap <- cbind(MCap,PercentMarketCap)
MCapTab
# sorting by PercentMarketCap
<- MCapTab %>% arrange(desc(PercentMarketCap))
MCapTab
# Use package janitor to add sums at the bottom of the table
<- MCapTab %>%
MCapTab adorn_totals("row")
# Use package knittr to format the appearance of the table
<- knitr::kable(MCapTab, "html") %>% kable_styling()
MCapTab MCapTab
Sector | MarketCapCr | PercentMarketCap |
---|---|---|
Technology Services | 938967 | 22.63 |
Electronic Technology | 688189 | 16.59 |
Finance | 481787 | 11.61 |
Health Technology | 390467 | 9.41 |
Retail Trade | 308419 | 7.43 |
Consumer Non-Durables | 213055 | 5.14 |
Producer Manufacturing | 140697 | 3.39 |
Consumer Services | 140352 | 3.38 |
Energy Minerals | 136410 | 3.29 |
Commercial Services | 127259 | 3.07 |
Consumer Durables | 108698 | 2.62 |
Utilities | 98002 | 2.36 |
Health Services | 94370 | 2.27 |
Process Industries | 79145 | 1.91 |
Transportation | 70013 | 1.69 |
Industrial Services | 40570 | 0.98 |
Communications | 39800 | 0.96 |
Distribution Services | 31000 | 0.75 |
Non-Energy Minerals | 21747 | 0.52 |
Total | 4148947 | 100.00 |
TODO: Work in Billions; Show “Sum”, “Median”, “Mean” Delete Q1, Q3 all others 2. Summary Statistics of Market Cap (in Cr of USD) by each Sector of S&P500
<- sp500 %>%
SectorMC group_by(Sector) %>%
summarise(
Mean = mean(na.omit(MarketCap/10000000)),
Median= sd(na.omit(MarketCap/10000000)),
Median= median(na.omit(MarketCap/10000000)),
Q1 = quantile(na.omit(MarketCap/10000000), probs = 0.25, na.rm = TRUE),
Q3 = quantile(na.omit(MarketCap/10000000), probs = 0.75, na.rm = TRUE),
Min = min(na.omit(MarketCap/10000000)),
max = max(na.omit(MarketCap/10000000))
)
<- cbind(Sector = SectorMC$Sector, round(SectorMC[,2:7],2))
tab
<- knitr::kable(tab, "html") %>% kable_styling()
SMcap SMcap
Sector | Mean | Median | Q1 | Q3 | Min | max |
---|---|---|---|---|---|---|
Commercial Services | 9789.15 | 3110 | 1630.0 | 7210.0 | 799 | 48500 |
Communications | 13266.67 | 13800 | 11950.0 | 14850.0 | 10100 | 15900 |
Consumer Durables | 9058.17 | 1915 | 1455.0 | 4412.5 | 783 | 80800 |
Consumer Non-Durables | 6872.74 | 4370 | 2000.0 | 6245.0 | 719 | 37000 |
Consumer Services | 4839.72 | 2150 | 1500.0 | 5330.0 | 781 | 21200 |
Distribution Services | 3444.44 | 3250 | 2180.0 | 3890.0 | 1040 | 7450 |
Electronic Technology | 14044.67 | 4370 | 1940.0 | 7370.0 | 919 | 301000 |
Energy Minerals | 8525.62 | 4825 | 2527.5 | 6002.5 | 1260 | 42400 |
Finance | 5236.82 | 2560 | 1615.0 | 4870.0 | 486 | 76900 |
Health Services | 7864.17 | 3775 | 1705.0 | 7687.5 | 854 | 46900 |
Health Technology | 8307.81 | 3700 | 1890.0 | 10700.0 | 551 | 44400 |
Industrial Services | 4507.78 | 3880 | 3530.0 | 4770.0 | 2870 | 8200 |
Non-Energy Minerals | 3106.71 | 2970 | 2270.0 | 3745.0 | 667 | 6080 |
Process Industries | 3297.71 | 1815 | 1340.0 | 3895.0 | 642 | 18600 |
Producer Manufacturing | 4538.61 | 3430 | 1380.0 | 5600.0 | 440 | 14600 |
Retail Trade | 13409.52 | 3690 | 1970.0 | 9760.0 | 416 | 131000 |
Technology Services | 18779.34 | 3415 | 1665.0 | 11100.0 | 410 | 243000 |
Transportation | 4667.53 | 2850 | 1805.0 | 5895.0 | 603 | 15800 |
Utilities | 3161.35 | 2390 | 1785.0 | 3510.0 | 860 | 14200 |
- Top 10 companies having highest Market Cap
<- sp500 %>% arrange(desc(MarketCap)) %>% head(10)
Top10 <- Top10[,c(1:4, 6,10:13)]
Top10
<- knitr::kable(Top10, "html") %>% kable_styling()
Top10 Top10
Date | Stock | StockName | Sector | MarketCap | ROE | ROA | ROIC | GrossMargin |
---|---|---|---|---|---|---|---|---|
8/7/2023 | AAPL | Apple Inc. | Electronic Technology | 3.01e+12 | 146.00 | 27.600 | 57.177930 | 43.18103 |
8/7/2023 | MSFT | Microsoft Corporation | Technology Services | 2.43e+12 | 38.80 | 18.600 | 28.062340 | 68.92009 |
8/7/2023 | GOOG | Alphabet Inc. | Technology Services | 1.62e+12 | 23.30 | 16.500 | 21.184760 | 55.37940 |
8/7/2023 | GOOGL | Alphabet Inc. | Technology Services | 1.62e+12 | 23.30 | 16.500 | 21.184760 | 55.37940 |
8/7/2023 | AMZN | Amazon.com, Inc. | Retail Trade | 1.31e+12 | 2.98 | 0.981 | 1.581103 | 44.72763 |
8/7/2023 | NVDA | NVIDIA Corporation | Electronic Technology | 1.10e+12 | 18.90 | 10.700 | 13.098850 | 56.31424 |
8/7/2023 | TSLA | Tesla, Inc. | Consumer Durables | 8.08e+11 | 28.00 | 15.400 | 25.481890 | 21.48615 |
8/7/2023 | META | Meta Platforms, Inc. | Technology Services | 8.06e+11 | 17.40 | 12.000 | 14.518990 | 79.42716 |
8/7/2023 | BRK.B | Berkshire Hathaway Inc. New | Finance | 7.69e+11 | 1.43 | 0.735 | 1.143973 | 19.49809 |
8/7/2023 | V | Visa Inc. | Commercial Services | 4.85e+11 | 43.60 | 18.600 | 28.104180 | 76.95643 |
PRICE RELATIVE TO 52 WEEK LOW
- Summary Statistics of Low52WkPerc by Sector
<- sp500 %>%
SM group_by(Sector) %>%
summarise(
Mean = mean(na.omit(Low52WkPerc)),
Median= sd(na.omit(Low52WkPerc)),
Median= median(na.omit(Low52WkPerc)),
Q1 = quantile(na.omit(Low52WkPerc), probs = 0.25, na.rm = TRUE),
Q3 = quantile(na.omit(Low52WkPerc), probs = 0.75, na.rm = TRUE),
Min = min(na.omit(Low52WkPerc)),
Max = max(na.omit(Low52WkPerc))
)
<- cbind(Sector = SM$Sector, round(SM[,2:7],2))
tab
<- tab %>% arrange(Median)
tab
<- knitr::kable(tab, "html") %>% kable_styling()
SM SM
Sector | Mean | Median | Q1 | Q3 | Min | Max |
---|---|---|---|---|---|---|
Communications | 6.03 | 5.23 | 5.02 | 6.65 | 4.80 | 8.07 |
Utilities | 16.13 | 13.69 | 6.99 | 17.31 | 1.06 | 58.39 |
Consumer Non-Durables | 19.43 | 16.04 | 9.46 | 30.20 | 0.35 | 59.45 |
Health Services | 27.11 | 18.76 | 13.33 | 35.51 | 8.30 | 64.45 |
Health Technology | 28.40 | 22.86 | 13.80 | 39.69 | 0.17 | 111.43 |
Retail Trade | 26.64 | 23.90 | 17.26 | 34.77 | 6.53 | 57.65 |
Finance | 27.26 | 24.67 | 17.13 | 34.60 | 1.03 | 98.69 |
Transportation | 36.79 | 27.79 | 17.34 | 53.84 | 8.28 | 86.95 |
Process Industries | 28.55 | 28.07 | 20.78 | 39.65 | 2.62 | 56.08 |
Energy Minerals | 31.46 | 29.77 | 23.82 | 38.72 | 10.09 | 54.33 |
Industrial Services | 41.68 | 30.48 | 24.23 | 68.84 | 8.78 | 75.34 |
Distribution Services | 33.82 | 34.99 | 28.41 | 42.30 | 6.66 | 55.92 |
Technology Services | 45.16 | 35.26 | 21.77 | 55.13 | 0.73 | 255.51 |
Commercial Services | 34.66 | 35.48 | 29.81 | 40.59 | 9.60 | 69.34 |
Consumer Services | 50.27 | 35.97 | 25.94 | 58.61 | 1.91 | 190.10 |
Electronic Technology | 48.08 | 38.84 | 17.85 | 60.86 | 1.62 | 311.70 |
Consumer Durables | 58.17 | 42.84 | 18.51 | 79.84 | 15.13 | 150.04 |
Producer Manufacturing | 50.00 | 43.22 | 29.05 | 62.26 | 5.62 | 132.17 |
Non-Energy Minerals | 44.31 | 51.04 | 35.05 | 57.78 | 7.74 | 65.74 |
Sector Communications and Utilities are closest to its 52 week low.
- Box Plot for Low52WkPerc by Sector TODO: Truncate at 100; Rotate by 90 degrees; Sort Sectors by Median(Low52WkPerc)
library(ggplot2)
ggplot(sp500, aes(Sector, Low52WkPerc)) + geom_boxplot() +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
PROFITABILITY BY SECTOR
ROE
- Summary Statistics of ROE by each Sector of S&P500
<- sp500 %>%
SectorROE group_by(Sector) %>%
summarise(
Mean = mean(na.omit(ROE)),
Median= sd(na.omit(ROE)),
Median= median(na.omit(ROE)),
Q1 = quantile(na.omit(ROE), probs = 0.25, na.rm = TRUE),
Q3 = quantile(na.omit(ROE), probs = 0.75, na.rm = TRUE),
Min = min(na.omit(ROE)),
max = max(na.omit(ROE))
)
cbind(Sector = SectorROE$Sector, round(SectorROE[,2:7],2))
Sector Mean Median Q1 Q3 Min max
1 Commercial Services 37.60 26.40 13.40 43.60 3.50 175.0
2 Communications 8.08 9.05 0.52 16.12 -8.01 23.2
3 Consumer Durables 13.56 17.75 8.11 25.38 -51.40 45.2
4 Consumer Non-Durables 132.99 18.15 7.45 32.12 -10.80 2880.0
5 Consumer Services 25.25 10.90 1.82 38.68 -186.00 360.0
6 Distribution Services 81.18 39.15 32.17 62.62 13.50 295.0
7 Electronic Technology 31.39 18.90 9.63 35.40 -14.20 157.0
8 Energy Minerals 90.99 33.80 26.62 41.25 19.30 954.0
9 Finance 22.29 10.80 7.64 15.97 -30.00 714.0
10 Health Services 20.26 16.10 11.82 19.65 8.31 60.0
11 Health Technology 23.04 13.30 6.89 24.25 -51.00 253.0
12 Industrial Services 20.71 22.50 9.42 31.10 7.67 36.3
13 Non-Energy Minerals 13.64 13.50 2.69 21.80 -3.83 36.8
14 Process Industries 27.85 18.00 13.85 26.80 -11.70 151.0
15 Producer Manufacturing 23.96 18.00 12.80 29.40 -13.60 95.9
16 Retail Trade 30.05 25.50 15.10 40.00 2.98 66.9
17 Technology Services 53.07 18.85 11.17 31.83 -70.60 844.0
18 Transportation 37.20 34.60 19.90 50.20 4.13 104.0
19 Utilities 7.96 8.70 7.64 10.60 -45.60 44.6
- Box Plot for ROE by Sector
library(ggplot2)
ggplot(sp500, aes(Sector, ROE)) + geom_boxplot() +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
ROA
- Summary Statistics of ROA by each Sector of S&P500
<- sp500 %>%
SectorROA group_by(Sector) %>%
summarise(
Mean = mean(na.omit(ROA)),
Median= sd(na.omit(ROA)),
Median= median(na.omit(ROA)),
Q1 = quantile(na.omit(ROA), probs = 0.25, na.rm = TRUE),
Q3 = quantile(na.omit(ROA), probs = 0.75, na.rm = TRUE),
Min = min(na.omit(ROA)),
max = max(na.omit(ROA))
)
cbind(Sector = SectorROA$Sector, round(SectorROA[,2:7],2))
Sector Mean Median Q1 Q3 Min max
1 Commercial Services 10.10 6.60 4.61 18.10 1.74 27.20
2 Communications 2.14 2.93 0.41 4.27 -2.11 5.61
3 Consumer Durables 9.10 9.73 1.54 15.53 -8.81 27.90
4 Consumer Non-Durables 7.37 6.81 3.63 11.07 -5.57 18.90
5 Consumer Services 5.90 2.83 1.06 11.72 -10.80 29.00
6 Distribution Services 10.74 6.49 4.93 17.48 1.08 24.50
7 Electronic Technology 9.52 8.75 5.00 13.18 -6.73 27.60
8 Energy Minerals 15.90 15.80 13.65 18.35 7.39 23.70
9 Finance 3.21 2.38 1.10 4.08 -2.94 24.70
10 Health Services 5.75 5.52 4.30 6.36 2.96 11.00
11 Health Technology 7.46 7.07 3.71 12.70 -33.10 28.90
12 Industrial Services 6.48 5.47 3.71 8.99 3.30 10.60
13 Non-Energy Minerals 7.01 4.46 1.08 11.72 -2.18 21.20
14 Process Industries 7.24 6.92 5.14 7.69 -4.31 25.40
15 Producer Manufacturing 8.93 8.69 5.15 10.90 -3.10 25.10
16 Retail Trade 9.99 9.01 5.12 13.45 0.98 24.20
17 Technology Services 8.66 8.09 5.54 13.13 -35.40 41.50
18 Transportation 8.91 7.20 3.93 10.90 1.08 26.20
19 Utilities 2.32 2.55 2.00 3.21 -6.25 6.49
- Box Plot for ROA by Sector
library(ggplot2)
ggplot(sp500, aes(Sector, ROA)) + geom_boxplot() +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
Live Case: S&P500 (2b of 3)
Aug 06, 2023 -=- This chapter is being heavily edited
ISSUE: Analysis of a particular SECTOR We have chosen to deeply analyze the HEALTH TECHNOLOGY Sector
SECTOR LEVEL ANALYSIS begins here
Filter the data by sector Health Services, and display the number of stocks in the sector
<- sp500 %>%
ts filter(Sector=='Health Services')
nrow(ts)
[1] 12
There are 12 number of of stocks in the sector Health Services
Select the Specific Coulumns from the filtered dataframe ts
(Health Services)
<- ts %>%
ts2 select(Date, Stock, StockName,Sector, Industry, MarketCap, Price,Low52Wk, High52Wk,
ROE, ROA,ROIC,GrossMargin, GrossMargin,
NetMargin, Rating)
colnames(ts2)
[1] "Date" "Stock" "StockName" "Sector" "Industry"
[6] "MarketCap" "Price" "Low52Wk" "High52Wk" "ROE"
[11] "ROA" "ROIC" "GrossMargin" "NetMargin" "Rating"
Arrange the Dataframe by ROE
<- ts2 %>% arrange(desc(ROE)) ts3
Mutate a data column called (Low52WkPerc), then show top 10 ROE stocks
<- ts3 %>% mutate(Low52WkPerc = round((Price - Low52Wk)*100 / Low52Wk,2))
ts4 head(ts4[,c(1:3,10,16)],10)
# A tibble: 10 × 5
Date Stock StockName ROE Low52WkPerc
<chr> <chr> <chr> <dbl> <dbl>
1 8/7/2023 DVA DaVita Inc. 60 56.4
2 8/7/2023 MOH Molina Healthcare Inc 28.4 18.2
3 8/7/2023 IQV IQVIA Holdings, Inc. 19.7 30.2
4 8/7/2023 HUM Humana Inc. 19.5 14.4
5 8/7/2023 ELV Elevance Health, Inc. 17.3 13.5
6 8/7/2023 CI The Cigna Group 14.9 19.3
7 8/7/2023 DGX Quest Diagnostics Incorporated 12.5 12.0
8 8/7/2023 UHS Universal Health Services, Inc. 11.6 64.4
9 8/7/2023 CNC Centene Corporation 10.4 8.3
10 8/7/2023 LH Laboratory Corporation of America Holdings 8.31 24.4
Summary Statistics of ROE
<- na.omit(ts3)
ts3
<- ts3 %>%
ROESum summarise(
Mean = mean(ROE),
Median= sd(ROE),
Median= median(ROE),
Q1 = quantile(ROE, probs = 0.25, na.rm = TRUE),
Q3 = quantile(ROE, probs = 0.75, na.rm = TRUE),
Min = min(ROE),
max = max(ROE)
)
<- round(ROESum,2)
ROESum ROESum
# A tibble: 1 × 6
Mean Median Q1 Q3 Min max
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 22.4 12.5 11.6 19.7 8.31 60
Summary Statistics of All key variables in Sector Health Services
<- na.omit(ts3)
ts3
<- ts3 %>%
ROESum summarise(
Mean = mean(ROE),
Median= sd(ROE),
Median= median(ROE),
Q1 = quantile(ROE, probs = 0.25, na.rm = TRUE),
Q3 = quantile(ROE, probs = 0.75, na.rm = TRUE),
Min = min(ROE),
max = max(ROE)
)
<- round(ROESum,2)
ROESum
<- ts3 %>%
ROASum summarise(
Mean = mean(ROA),
Median= sd(ROA),
Median= median(ROA),
Q1 = quantile(ROA, probs = 0.25, na.rm = TRUE),
Q3 = quantile(ROA, probs = 0.75, na.rm = TRUE),
Min = min(ROA),
max = max(ROA)
)
<- round(ROASum,2)
ROASum
<- ts3 %>%
ROICSum summarise(
Mean = mean(ROIC),
Median= sd(ROIC),
Median= median(ROIC),
Q1 = quantile(ROIC, probs = 0.25, na.rm = TRUE),
Q3 = quantile(ROIC, probs = 0.75, na.rm = TRUE),
Min = min(ROIC),
max = max(ROIC)
)
<- round(ROICSum,2)
ROICSum
<- ts3 %>%
GrossMarginSum summarise(
Mean = mean(GrossMargin),
Median= sd(GrossMargin),
Median= median(GrossMargin),
Q1 = quantile(GrossMargin, probs = 0.25, na.rm = TRUE),
Q3 = quantile(GrossMargin, probs = 0.75, na.rm = TRUE),
Min = min(GrossMargin),
max = max(GrossMargin)
)
<- round(GrossMarginSum,2)
GrossMarginSum
<- ts3 %>%
NetMarginSum summarise(
Mean = mean(NetMargin),
Median= sd(NetMargin),
Median= median(NetMargin),
Q1 = quantile(NetMargin, probs = 0.25, na.rm = TRUE),
Q3 = quantile(NetMargin, probs = 0.75, na.rm = TRUE),
Min = min(NetMargin),
max = max(NetMargin)
)
<- round(NetMarginSum,2)
NetMarginSum
<- c("ROE","ROA","ROIC","GrossMargin","NetMargin")
Metrics
<- rbind(ROESum, ROASum, ROICSum, GrossMarginSum, NetMarginSum)
ftab <- cbind(Metrics, ftab)
ftab ftab
Metrics Mean Median Q1 Q3 Min max
1 ROE 22.42 12.50 11.60 19.70 8.31 60.00
2 ROA 4.50 4.34 4.18 5.12 2.96 5.91
3 ROIC 5.81 5.98 5.14 6.35 4.20 7.37
4 GrossMargin 23.27 25.55 22.96 27.09 7.94 32.83
5 NetMargin 6.15 5.65 5.01 7.48 4.29 8.33
Summary Statistics of ROE by each Sector of S&P500
<- sp500 %>%
SectorROE group_by(Sector) %>%
summarise(
Mean = mean(na.omit(ROE)),
Median= sd(na.omit(ROE)),
Median= median(na.omit(ROE)),
Q1 = quantile(na.omit(ROE), probs = 0.25, na.rm = TRUE),
Q3 = quantile(na.omit(ROE), probs = 0.75, na.rm = TRUE),
Min = min(na.omit(ROE)),
max = max(na.omit(ROE))
)
cbind(Sector = SectorROE$Sector, round(SectorROE[,2:7],2))
Sector Mean Median Q1 Q3 Min max
1 Commercial Services 37.60 26.40 13.40 43.60 3.50 175.0
2 Communications 8.08 9.05 0.52 16.12 -8.01 23.2
3 Consumer Durables 13.56 17.75 8.11 25.38 -51.40 45.2
4 Consumer Non-Durables 132.99 18.15 7.45 32.12 -10.80 2880.0
5 Consumer Services 25.25 10.90 1.82 38.68 -186.00 360.0
6 Distribution Services 81.18 39.15 32.17 62.62 13.50 295.0
7 Electronic Technology 31.39 18.90 9.63 35.40 -14.20 157.0
8 Energy Minerals 90.99 33.80 26.62 41.25 19.30 954.0
9 Finance 22.29 10.80 7.64 15.97 -30.00 714.0
10 Health Services 20.26 16.10 11.82 19.65 8.31 60.0
11 Health Technology 23.04 13.30 6.89 24.25 -51.00 253.0
12 Industrial Services 20.71 22.50 9.42 31.10 7.67 36.3
13 Non-Energy Minerals 13.64 13.50 2.69 21.80 -3.83 36.8
14 Process Industries 27.85 18.00 13.85 26.80 -11.70 151.0
15 Producer Manufacturing 23.96 18.00 12.80 29.40 -13.60 95.9
16 Retail Trade 30.05 25.50 15.10 40.00 2.98 66.9
17 Technology Services 53.07 18.85 11.17 31.83 -70.60 844.0
18 Transportation 37.20 34.60 19.90 50.20 4.13 104.0
19 Utilities 7.96 8.70 7.64 10.60 -45.60 44.6
ANALYSIS OF HEALTH SERVICES SECTOR
- Market Cap of all companies in Sector Health Services
library(janitor)
library(kableExtra)
# Market Cap by Stock
<- ts3 %>%
MCap group_by(Stock) %>%
summarise(
MarketCapCr = sum(na.omit(MarketCap)/10000000))
# Sp500 Market Cap
<- sum(ts3$MarketCap/10000000)
SP500MarketCap
# calculating % market cap
<- round(MCap$MarketCapCr*100/SP500MarketCap,2)
PercentMarketCap <- cbind(MCap,PercentMarketCap)
MCapTab
# sorting by PercentMarketCap
<- MCapTab %>% arrange(desc(PercentMarketCap))
MCapTab
<- MCapTab %>%
MCapTab adorn_totals("row")
<- knitr::kable(MCapTab, "html") %>% kable_styling()
MCapTab MCapTab
Stock | MarketCapCr | PercentMarketCap |
---|---|---|
IQV | 3950 | 43.22 |
LH | 1900 | 20.79 |
DGX | 1510 | 16.52 |
DVA | 926 | 10.13 |
UHS | 854 | 9.34 |
Total | 9140 | 100.00 |
- Shares which are most attractively priced in Sector Health Services
<- ts4 %>% arrange(Low52WkPerc)
AttrShares <- AttrShares[, c(2:4,7,8,10,11,16)]
AttrShares
<- knitr::kable(AttrShares, "html") %>% kable_styling()
AttrShares AttrShares
Stock | StockName | Sector | Price | Low52Wk | ROE | ROA | Low52WkPerc |
---|---|---|---|---|---|---|---|
CNC | Centene Corporation | Health Services | 66.430 | 61.3400 | 10.40 | 3.31 | 8.30 |
DGX | Quest Diagnostics Incorporated | Health Services | 134.830 | 120.4000 | 12.50 | 5.91 | 11.99 |
UNH | UnitedHealth Group Incorporated | Health Services | 503.250 | 445.6800 | NA | 8.27 | 12.92 |
ELV | Elevance Health, Inc. | Health Services | 467.445 | 412.0000 | 17.30 | 6.10 | 13.46 |
HUM | Humana Inc. | Health Services | 484.165 | 423.2900 | 19.50 | 6.16 | 14.38 |
MOH | Molina Healthcare Inc | Health Services | 302.885 | 256.1900 | 28.40 | 6.98 | 18.23 |
CI | The Cigna Group | Health Services | 286.890 | 240.5000 | 14.90 | 4.65 | 19.29 |
LH | Laboratory Corporation of America Holdings | Health Services | 214.060 | 172.0895 | 8.31 | 4.18 | 24.39 |
IQV | IQVIA Holdings, Inc. | Health Services | 215.880 | 165.7500 | 19.70 | 4.34 | 30.24 |
HCA | HCA Healthcare, Inc. | Health Services | 269.820 | 178.3200 | NA | 11.00 | 51.31 |
DVA | DaVita Inc. | Health Services | 102.100 | 65.2800 | 60.00 | 2.96 | 56.40 |
UHS | Universal Health Services, Inc. | Health Services | 135.670 | 82.5000 | 11.60 | 5.12 | 64.45 |
PROFITABILITY OF HEALTH SERVICES SECTOR
- Shares have highest ROE within Sector Technology Services
<- ts4 %>% arrange(desc(ROE))
AttrShares <- AttrShares[, c(2:4,7,8,10,11,16)]
AttrShares
<- knitr::kable(AttrShares, "html") %>% kable_styling()
AttrShares AttrShares
Stock | StockName | Sector | Price | Low52Wk | ROE | ROA | Low52WkPerc |
---|---|---|---|---|---|---|---|
DVA | DaVita Inc. | Health Services | 102.100 | 65.2800 | 60.00 | 2.96 | 56.40 |
MOH | Molina Healthcare Inc | Health Services | 302.885 | 256.1900 | 28.40 | 6.98 | 18.23 |
IQV | IQVIA Holdings, Inc. | Health Services | 215.880 | 165.7500 | 19.70 | 4.34 | 30.24 |
HUM | Humana Inc. | Health Services | 484.165 | 423.2900 | 19.50 | 6.16 | 14.38 |
ELV | Elevance Health, Inc. | Health Services | 467.445 | 412.0000 | 17.30 | 6.10 | 13.46 |
CI | The Cigna Group | Health Services | 286.890 | 240.5000 | 14.90 | 4.65 | 19.29 |
DGX | Quest Diagnostics Incorporated | Health Services | 134.830 | 120.4000 | 12.50 | 5.91 | 11.99 |
UHS | Universal Health Services, Inc. | Health Services | 135.670 | 82.5000 | 11.60 | 5.12 | 64.45 |
CNC | Centene Corporation | Health Services | 66.430 | 61.3400 | 10.40 | 3.31 | 8.30 |
LH | Laboratory Corporation of America Holdings | Health Services | 214.060 | 172.0895 | 8.31 | 4.18 | 24.39 |
HCA | HCA Healthcare, Inc. | Health Services | 269.820 | 178.3200 | NA | 11.00 | 51.31 |
UNH | UnitedHealth Group Incorporated | Health Services | 503.250 | 445.6800 | NA | 8.27 | 12.92 |
- Shares have highest ROA within Sector Health Services
<- ts4 %>% arrange(desc(ROA))
AttrShares <- AttrShares[, c(2:4,7,8,10,11,16)]
AttrShares
<- knitr::kable(AttrShares, "html") %>% kable_styling()
AttrShares AttrShares
Stock | StockName | Sector | Price | Low52Wk | ROE | ROA | Low52WkPerc |
---|---|---|---|---|---|---|---|
HCA | HCA Healthcare, Inc. | Health Services | 269.820 | 178.3200 | NA | 11.00 | 51.31 |
UNH | UnitedHealth Group Incorporated | Health Services | 503.250 | 445.6800 | NA | 8.27 | 12.92 |
MOH | Molina Healthcare Inc | Health Services | 302.885 | 256.1900 | 28.40 | 6.98 | 18.23 |
HUM | Humana Inc. | Health Services | 484.165 | 423.2900 | 19.50 | 6.16 | 14.38 |
ELV | Elevance Health, Inc. | Health Services | 467.445 | 412.0000 | 17.30 | 6.10 | 13.46 |
DGX | Quest Diagnostics Incorporated | Health Services | 134.830 | 120.4000 | 12.50 | 5.91 | 11.99 |
UHS | Universal Health Services, Inc. | Health Services | 135.670 | 82.5000 | 11.60 | 5.12 | 64.45 |
CI | The Cigna Group | Health Services | 286.890 | 240.5000 | 14.90 | 4.65 | 19.29 |
IQV | IQVIA Holdings, Inc. | Health Services | 215.880 | 165.7500 | 19.70 | 4.34 | 30.24 |
LH | Laboratory Corporation of America Holdings | Health Services | 214.060 | 172.0895 | 8.31 | 4.18 | 24.39 |
CNC | Centene Corporation | Health Services | 66.430 | 61.3400 | 10.40 | 3.31 | 8.30 |
DVA | DaVita Inc. | Health Services | 102.100 | 65.2800 | 60.00 | 2.96 | 56.40 |
- Shares have highest NetMargin within Sector Health Services
<- ts4 %>% arrange(desc(NetMargin))
AttrShares <- AttrShares[, c(2:4,7,8,10,11,14,16)]
AttrShares
<- knitr::kable(AttrShares, "html") %>% kable_styling()
AttrShares AttrShares
Stock | StockName | Sector | Price | Low52Wk | ROE | ROA | NetMargin | Low52WkPerc |
---|---|---|---|---|---|---|---|---|
HCA | HCA Healthcare, Inc. | Health Services | 269.820 | 178.3200 | NA | 11.00 | 9.320090 | 51.31 |
DGX | Quest Diagnostics Incorporated | Health Services | 134.830 | 120.4000 | 12.50 | 5.91 | 8.326307 | 11.99 |
IQV | IQVIA Holdings, Inc. | Health Services | 215.880 | 165.7500 | 19.70 | 4.34 | 7.478166 | 30.24 |
UNH | UnitedHealth Group Incorporated | Health Services | 503.250 | 445.6800 | NA | 8.27 | 6.056554 | 12.92 |
LH | Laboratory Corporation of America Holdings | Health Services | 214.060 | 172.0895 | 8.31 | 4.18 | 5.654312 | 24.39 |
UHS | Universal Health Services, Inc. | Health Services | 135.670 | 82.5000 | 11.60 | 5.12 | 5.011623 | 64.45 |
DVA | DaVita Inc. | Health Services | 102.100 | 65.2800 | 60.00 | 2.96 | 4.289510 | 56.40 |
ELV | Elevance Health, Inc. | Health Services | 467.445 | 412.0000 | 17.30 | 6.10 | 3.867553 | 13.46 |
CI | The Cigna Group | Health Services | 286.890 | 240.5000 | 14.90 | 4.65 | 3.693735 | 19.29 |
HUM | Humana Inc. | Health Services | 484.165 | 423.2900 | 19.50 | 6.16 | 3.256937 | 14.38 |
MOH | Molina Healthcare Inc | Health Services | 302.885 | 256.1900 | 28.40 | 6.98 | 2.807577 | 18.23 |
CNC | Centene Corporation | Health Services | 66.430 | 61.3400 | 10.40 | 3.31 | 1.834062 | 8.30 |