Air Quality Assignment

Author

A Warsaw

Airquality Tutorial and Homework Assignment

Load in the Library

Load library tidyverse in order to access dplyr and ggplot2

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.2     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     
── 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

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.

Load the Dataset Into Your Global Environment

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

data("airquality")

Look at the Structure of the Data

In the global environment, click on the row with the airquality dataset and it will take you to a “spreadsheet” view of the data.

View the Data Using the “head” Function

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

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

Notice that all the variables are classified as either integers or continuous values .

Calculate Summary Statistics

If you 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

For the second way to calculate the mean, the matrix [row,column] is looking for column #4, which is the Temp column and we all use rows.

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

Sometimes we prefer the months to be numerical, but here, we need them as the month names. There are MANY ways to do this. Here is one way to convert numbers 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 characteristics instead of numbers (it is now classified as “character” rather than “integer”)

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 aphabetical. You 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 temperaature appears to be about 75 degrees.

  • fill = Month colors the histogram by minths between May - Sept
  • scale_fill_discrete(name = “Month”…) provides the month names on the right side as a legend in chronological order. This is a different way to order than what was shown above
  • labs allows us to add a title, axes labels, and a captionfor the data source

Plot 1 Code

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 Temperature 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

Plot 1 Output

p1
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

is this plot useful in answering questions about monthly temperature values?

Plot 2: Improve the Histogram of Average Temperature by Month

  • Outline the bars in white using the color = “white” command
  • Use alpha to add some transparency (values between 0 and 1)
  • Change the bandwidth
  • Add some transparency and white borders around the histogram bars

Plot 2 Code

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 Temperature 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")

Plot 2 Output

p2

Here July stands out for having high frequency of 85 degree temperatures. The dark purple color indicates overlaps of months due to the transparency.

Did this improve the readability of the plot?

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"))

Plot 3 Output

p3

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

Plot 4: Side by Side Boxplots in Gray Scale

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

Plot 4 Code

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

p4 <- 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_grey(name = "Month", labels = c("May", "June", "July", "August", "September"))

Plot 4 Output

p4

Plot 5 Code

What if we would like to see the relationship between months and a month’s mean wind rate using a combination of a line graph and a scatter point graph?

First we need to create a data point for the mean wind rate to make each x-value one point

monthly_wind <- airquality |>
  group_by(Month) |>
  summarize(Wind = mean(Wind, na.rm = TRUE)) |>
  ungroup()
##credit Chatgpt for the assistance

And now to confirm that the newly created tibble is ready for plot 5

str(monthly_wind)
tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
 $ Month: Factor w/ 5 levels "May","June","July",..: 1 2 3 4 5
 $ Wind : num [1:5] 11.62 10.27 8.94 8.79 10.18

Now we create the plot including monthly_wind , geom_line , and geom_point

p5 <- monthly_wind |>
  ggplot(aes(x = Month,y = Wind, group = 1)) +
  labs(x = "Months", y = "Mean Wind Rate", 
       title = "Connected Scatterpoint of Mean Change in Wind by Month",
       caption = "New York State Department of Conservation and the National Weather Service") +
  geom_line(color = "brown") +
  geom_point(shape = 21, color = "black", fill = "orange", size = 6) ##credit r-graph-gallery.com for customization

Plot 5 Output

p5

Plot 5 Analysis

To reinstate what this plot is, it is a connected scatter plot, or in other words a combination between a scatter plot and line graph, showing the relationship between the months and the mean monthly wind rates. The initial purpose of this plot was to prove that average wind rates increase as the months progress into the latter end of the year. However, upon plotting the graph, I was shocked to see that the later months show a strikingly lower mean rate than the warmer, earlier months. This now creates new questions. Is it due to the year the data was retrieved being an anomaly? Or could their be other environmental factors playing a part in why this occurred? And what exactly occurred in August, as the mean wind rate appears to be very low at the time. It is also fair to conclude that as the mean wind rate began to show a positive incline between August and September that possibly if we were to plot more data for the months after September, the trends would prove my initial hypothesis.

Now to break down how I created this plot:

  • Created a new tibble titled “monthly_wind” where I grouped the “Wind” variables from the air quality data set by Month in order to create a mean value for the wind values for each corresponding month
  • Ensured the values for months were accurately showcasing as categorical utilizing “str(monthly_wind)” after creating the new tibble “monthly_wind”
  • Created the plot, identifying the plot as “p5” where I used a similar setup as previous plots above, but replaced the data set with monthly_wind and the plots with geom_line() and geom_point()
  • Customized the plot, adding colors, changing the size and shape of the scatter points and colors of the scatter points and line graph
  • Finally, I ran the graph under “p5”

Credits

I have used AI for one specific portion (mentioned in the chunks above) in the following ways:

  • I used ChatGPT to generate a solution I was having regarding grouping my data properly to view the mean wind rates in a neat manner. It also generated a solution to a conflict I had with showcasing my x-values as categorical months. For the monthly_wind variable chunk, ChatGPT assisted with the “group_by(Month)”, and the “ungroup()” sections. Other resources helped me with syntax but I was missing a few key factors that ChatGPT was able to catch for me.

Outside of AI, I would also love to give credit to “r-graph-gallery.com” who inspired me to customize my plot and also for the idea to utilize the connected scatter point for plot 5.