Objective:
You will use R to analyze the built-in airquality dataset, applying descriptive statistics techniques to explore environmental data. The assignment covers measures of central tendency, spread, histograms, boxplots, scatterplots, correlations, and summary tables, aligning with the Week 6 agenda on Descriptive Statistics.
Dataset
Source: Built-in R dataset airquality.
Description: Contains 153 observations of daily air quality measurements in New York from May to September 1973.
Variables (selected for this assignment):
Notes
-The airquality dataset has missing values in Ozone and Solar.R. The code uses na.rm = TRUE or use = “complete.obs” to handle them.
-If you encounter errors, check that tidyverse and corrplot are installed and loaded.
-Feel free to modify plot aesthetics (e.g., colors, binwidth) to enhance clarity.
Instructions:
Complete the following tasks using R to analyze the airquality dataset. Submit your Rpubs link that includes code, outputs (tables and plots), and written interpretations for each task. Ensure you load the dataset using data(airquality) and install/load the tidyverse and corrplot packages.
#Load your dataset
# Load packages
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.1 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.3 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(corrplot)
## corrplot 0.95 loaded
# Load dataset
data("airquality")
# View the dataset
head(airquality)
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
library(tidyverse)
library(corrplot)
data("airquality")
Tasks and Questions
Using functions you learned this week, compute mean, median, standard deviation, min, and max separately for Ozone, Temp, and Wind.
#Your code for Ozone goes here
mean(airquality$Ozone, na.rm = TRUE)
## [1] 42.12931
median(airquality$Ozone, na.rm = TRUE)
## [1] 31.5
sd(airquality$Ozone, na.rm = TRUE)
## [1] 32.98788
min(airquality$Ozone, na.rm = TRUE)
## [1] 1
max(airquality$Ozone, na.rm = TRUE)
## [1] 168
#Your code for Temp goes here
mean(airquality$Temp, na.rm = TRUE)
## [1] 77.88235
median(airquality$Temp, na.rm = TRUE)
## [1] 79
sd(airquality$Temp, na.rm = TRUE)
## [1] 9.46527
min(airquality$Temp, na.rm = TRUE)
## [1] 56
max(airquality$Temp, na.rm = TRUE)
## [1] 97
#Your code for Wind goes here
mean(airquality$Wind, na.rm = TRUE)
## [1] 9.957516
median(airquality$Wind, na.rm = TRUE)
## [1] 9.7
sd(airquality$Wind, na.rm = TRUE)
## [1] 3.523001
min(airquality$Wind, na.rm = TRUE)
## [1] 1.7
max(airquality$Wind, na.rm = TRUE)
## [1] 20.7
Question: Compare the mean and median for each variable. Are they similar or different, and what does this suggest about the distribution (e.g., skewness)? What does the standard deviation indicate about variability?
The mean and median values are different for ozone, temperature, and wind. Ozone has a higher mean than median, which suggests that its distribution is right-skewed because some days have much higher ozone levels. Temperature has a mean and median that are fairly close, suggesting a more balanced distribution. Wind also has a mean slightly higher than its median. The standard deviation shows how spread out the values are. Ozone has the largest variability, while temperature and wind have less variation.
Generate the histogram for Ozone.
#Your code goes here
# Create a histogram of ozone levels
ggplot(airquality, aes(x = Ozone)) +
geom_histogram(binwidth = 10, fill = "skyblue", color = "black", na.rm = TRUE) +
labs(
title = "Distribution of Ozone Levels",
x = "Ozone Concentration (ppb)",
y = "Frequency"
) +
theme_minimal()
Question: Describe the shape of the ozone distribution (e.g., normal, skewed, unimodal). Are there any outliers or unusual features?
The ozone distribution is right-skewed, meaning most days had lower ozone levels while a smaller number of days had much higher levels. The histogram shows that ozone levels were not evenly distributed. There are also a few unusually high ozone measurements that may be considered outliers. These higher values could be related to environmental conditions such as hot weather and air pollution.
Create a boxplot of ozone levels (Ozone) by month, with months
displayed as names (May, June, July, August, September) instead of
numbers (5–9).Recode the Month variable into a new column called
month_name with month names using case_when
from week 4.Generate a boxplot of Ozone by month_name.
# Your code here
# Create month names
airquality <- airquality %>%
mutate(month_name = case_when(
Month == 5 ~ "May",
Month == 6 ~ "June",
Month == 7 ~ "July",
Month == 8 ~ "August",
Month == 9 ~ "September"
))
# Set the correct month order
airquality$month_name <- factor(
airquality$month_name,
levels = c("May", "June", "July", "August", "September")
)
# Create boxplot
ggplot(airquality, aes(x = month_name, y = Ozone)) +
geom_boxplot(fill = "lightgreen", na.rm = TRUE) +
labs(
title = "Ozone Levels by Month",
x = "Month",
y = "Ozone Concentration (ppb)"
) +
theme_minimal()
Question: How do ozone levels vary across months? Which month has the highest median ozone? Are there outliers in any month, and what might they indicate?
Ozone levels varied throughout the five months. July and August generally had higher ozone levels than May and June. July had the highest median ozone level. The boxplot also shows several outliers, especially during the summer months. These unusually high readings may indicate days with increased air pollution or weather conditions that contribute to higher ozone concentrations.
Produce the scatterplot of Temp vs. Ozone, colored by Month.
# Your code goes here
# Create scatterplot of temperature and ozone
ggplot(airquality, aes(x = Temp, y = Ozone, color = factor(Month))) +
geom_point(size = 3, na.rm = TRUE) +
labs(
title = "Temperature vs. Ozone Levels",
x = "Temperature (Fahrenheit)",
y = "Ozone Concentration (ppb)",
color = "Month"
) +
theme_minimal()
Question: Is there a visible relationship between temperature and ozone levels? Do certain months cluster together (e.g., higher ozone in warmer months)? Describe any patterns.
The scatterplot shows a positive relationship between temperature and ozone levels. As temperatures increase, ozone levels generally tend to increase as well. The warmer months, especially July and August, have more points with higher ozone concentrations. May and June generally have lower ozone readings. This suggests that warmer weather may contribute to higher ozone levels.
Compute and visualize the correlation matrix for Ozone, Temp, and Wind.
# Your code goes here
# Select variables and remove missing observations
cor_data <- airquality %>%
select(Ozone, Temp, Wind) %>%
drop_na()
# Calculate correlation matrix
cor_matrix <- cor(cor_data)
# Display correlation values
print(cor_matrix)
## Ozone Temp Wind
## Ozone 1.0000000 0.6983603 -0.6015465
## Temp 0.6983603 1.0000000 -0.5110750
## Wind -0.6015465 -0.5110750 1.0000000
# Visualize correlation matrix
corrplot(
cor_matrix,
method = "color",
addCoef.col = "black",
tl.col = "black",
title = "Correlation Matrix",
mar = c(0, 0, 2, 0)
)
Question: Identify the strongest and weakest correlations. For example, is ozone more strongly correlated with temperature or wind speed? Explain what the correlation values suggest about relationships between variables.
The strongest correlation is between ozone and temperature, with a positive correlation of approximately 0.698. This suggests that higher temperatures are generally associated with higher ozone levels. The relationship between ozone and wind is negative, at approximately -0.602, meaning ozone levels tend to decrease as wind speed increases. Temperature and wind also have a negative correlation of approximately -0.458. Overall, ozone has a stronger relationship with temperature than with wind speed.
Generate the summary table grouped by Month.Generate the summary table grouped by Month. It should include count, average mean of ozone, average mean of temperature, and average mean of wind per month.
# your code goes here
# Create summary table grouped by month
monthly_summary <- airquality %>%
group_by(Month) %>%
summarise(
count = n(),
average_ozone = mean(Ozone, na.rm = TRUE),
average_temp = mean(Temp, na.rm = TRUE),
average_wind = mean(Wind, na.rm = TRUE)
)
# Display summary table
monthly_summary
## # A tibble: 5 × 5
## Month count average_ozone average_temp average_wind
## <int> <int> <dbl> <dbl> <dbl>
## 1 5 31 23.6 65.5 11.6
## 2 6 30 29.4 79.1 10.3
## 3 7 31 59.1 83.9 8.94
## 4 8 31 60.0 84.0 8.79
## 5 9 30 31.4 76.9 10.2
Question: Which month has the highest average ozone level? How do temperature and wind speed vary across months? What environmental factors might explain these differences?
The summary table shows that August had the highest average ozone level, followed closely by July. May had the lowest average ozone level. Temperatures were also highest in July and August, while wind speeds were generally lower during those months. These patterns suggest that warmer temperatures and lower wind speeds may contribute to higher ozone levels. Weather conditions and seasonal changes could help explain why ozone levels were higher during the summer.
Submission Requirements
Publish it to Rpubs and submit your link on blackboard