Airquality Assignment

Author

Duchelle K

Airquality Assignment

Source: https://www.deq.ok.gov/wp-content/uploads/air-division/aqi_mini-1200x675.png

Source: https://www.deq.ok.gov/wp-content/uploads/air-division/aqi_mini-1200x675.png

Load in the library

Because airquality is a pre-built dataset, we can write it to our data directory to store it for later use.

The source for this dataset is the New York State Department of Conservation and the National Weather Service of 1973 for five months from May to September recorded daily.

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.0     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.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

Load the dataset into the global environment

data("airquality")

Look at the structure of the data

The function, head, will only display the first 6 rows of the dataset. Notice in the global environment to the right, there are 153 observations (rows)

View the data using the “head” function

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

Calculate Summary Statistics

If we want to look at specific statistics, here are some variations on coding. Here are 2 different ways to calculate “mean.”

mean(airquality$Temp)
[1] 77.88235
mean(airquality[,4])
[1] 77.88235

Calculate Median, Standard Deviation, and Variance

median(airquality$Temp)
[1] 79
sd(airquality$Wind)
[1] 3.523001
var(airquality$Wind)
[1] 12.41154

Rename the Months from number to names

Number 5 - 9 to May through September

airquality$Month[airquality$Month == 5]<- "May"
airquality$Month[airquality$Month == 6]<- "June"
airquality$Month[airquality$Month == 7]<- "July"
airquality$Month[airquality$Month == 8]<- "August"
airquality$Month[airquality$Month == 9]<- "September"

Now look at the summary statistics of the dataset

See how Month has changed to have characters instead of numbers

summary(airquality$Month)
   Length     Class      Mode 
      153 character character 

Month is a categorical variable with different levels, called factors.

This is one way to reorder the Months so they do not default to alphabetical (we will see another way to reorder DIRECTLY in the chunk that creates the plot below in Plot 1)

airquality$Month<-factor(airquality$Month, levels=c("May", "June", "July", "August", "September"))

Plot 1: Create a histogram categorized by Month

Here is a first attempt at viewing a histogram of temperature by the months May through September. We will see that temperatures increase over these months. The median temperature appears to be about 75 degrees.

Reorder the legend so that it is not the default (alphabetical), but rather in chronological order.

fill = Month colors the histogram by months between May - Sept.

scale_fill_discrete(name = “Month”…) provides the month names on the right side as a legend.

p1 <- airquality |>
  ggplot(aes(x=Temp, fill=Month)) +
  geom_histogram(position = "identity") +
  scale_fill_discrete(name = "Month",
                      labels = c("May", "June", "July", "August", "September")) +
  labs(x = "Monthly Temperatures from May - Sept", 
       y = "Frequency of Temps",
       title = "Histogram of Monthly Temperatures from May - Sept, 1973",
       caption = "New York State Department of Conservation and the National Weather Service")  #provide the data source
p1
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Plot 2: Improve the histogram using ggplot

Outline the bars in white using the color = “white” command

Use alpha to add some transparency (values between 0 and 1)

Change the binwidth

Histogram of Average Temperature by Month

Add some transparency and white borders around the histogram bars. Here July stands out for having high frequency of 85 degree temperatures. The dark purple color indicates overlaps of months due to the transparency.

p2 <- airquality |>
  ggplot(aes(x=Temp, fill=Month)) +
  geom_histogram(position="identity", alpha=0.5, binwidth = 5, color = "white")+
  scale_fill_discrete(name = "Month", labels = c("May", "June","July", "August", "September")) +
  labs(x = "Monthly Temperatures from May - Sept", 
       y = "Frequency of Temps",
       title = "Histogram of Monthly Temperatures from May - Sept, 1973",
       caption = "New York State Department of Conservation and the National Weather Service")
p2

Plot 3: Create side-by-side boxplots categorized by Month

We can see that August has the highest temperatures based on the boxplot distribution.

p3 <- airquality |>
  ggplot(aes(Month, Temp, fill = Month)) + 
  labs(x = "Months from May through September", y = "Temperatures", 
       title = "Side-by-Side Boxplot of Monthly Temperatures",
       caption = "New York State Department of Conservation and the National Weather Service") +
  geom_boxplot() +
  scale_fill_discrete(name = "Month", labels = c("May", "June","July", "August", "September"))
p3 

The points above and below the boxplots in June and July are outliers.

Plot 4: Make the same side-by-side boxplots, but in grey-scale

Use the scale_fill_grey command for the grey-scale legend, and again, use fill=Month in the aesthetics

Side by Side Boxplots in Grey Scale

Here we just changed the color palette to gray scale using scale_fill_grey

p4 <- airquality |>
  ggplot(aes(Month, Temp, fill = Month)) + 
  labs(x = "Monthly Temperatures", y = "Temperatures", 
       title = "Side-by-Side Boxplot of Monthly Temperatures",
       caption = "New York State Department of Conservation and the National Weather Service") +
  geom_boxplot()+
  scale_fill_grey(name = "Month", labels = c("May", "June","July", "August", "September"))
p4

Plot 5: Create a scatterplot of solar radiation vs wind speed

In the following scatterplot, the smooth lines help to highlight the evolution of solar radiations and the average wind speed from May to September.

Unlike the other months where we observe an increase, decrease, then an increase of the average wind speed while solar radiation was increasing through May, July, August, and September, June stands out due to its unique behavior.

During June, We progressively observe a reduction in wind speed early in the month. However, as June progresses, the wind speed gradually increases until the end of the month.

Additionally, we can see 3 outliers in May and June, 2 above the scatterplot and one below. One outlier represents a day with the second-highest average wind speed but relatively low solar radiation. Another outlier corresponds to a day with the highest average wind speed combined with one of the highest solar radiation levels.The third outlier is the day with the smallest average wind speed and minimal solar radiation.

Use geom_point to get layer of points which creates the scatterplot and geom_smooth to get the smooth curves that display the relationship between solar radiations and average wind speed.

Use color = “Month” to color the plots and curves by month to help differentiate the trends between the months.

Scatterplot of the relationship between solar radiation and wind speed

Subtitle = “From May - Sept, 1973” adds additional detail in a smaller font beneath the title

p5 <- airquality |>
  ggplot(aes(Solar.R, Wind, colour = Month)) +
  geom_point() +
  geom_smooth() +
  labs(x = "Solar radiation", y = "Average wind speed",
       title = "Scatterplot of Relationship between Solar Radiation and Wind Speed",
       subtitle = "From May - Sept, 1973",
       caption = "New York State Department of Conservation and the National Weather Service")
p5
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Warning: Removed 7 rows containing non-finite outside the scale range
(`stat_smooth()`).
Warning: Removed 7 rows containing missing values or values outside the scale range
(`geom_point()`).