Air_quality_HW

Author

O Nseyo

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.1     ✔ 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 of this dataset is the New York sttate 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 airauality dataset and it will take you ti a “spreadsheet” view of the data.

View the data using the “head” function

The function, head, will only display the first 6 rows of the data set. Noitice 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 two different ways to calculate the “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 loooking for column #4, which is the Temp column and we use all 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 wasy 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 data set

See how Month has changed to have characters 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 alphabetical (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 the first attempt at viewing a histogram of temperature by the months May though September. We will see that temperatures increase over these months. The median temperature appears to be about 75 degrees

  • 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 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 caption for 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 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")

Plot 1 output

print(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 binwidth
  • 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 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")

Plot 2 Output

print(p2)

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

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

print(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-byside 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 = "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"))

Plot 4

jmgyf

print(p4)

Plot 5 code

p5 <- airquality |>
  ggplot(aes(x = Day, y = factor(Month), fill = Temp)) +
  geom_tile() + 
  scale_fill_viridis_c(name = "Temperature (ºF)", option = "plasma") +
  labs(
  x = "Day of the Month",
  y = "Month",
  title = "Heatmap of Daily Temperatures from May to september, 1973",
  caption = "New York State Department Of Conservation and the National weather service"
  )

Plot 5

print(p5)

Here I utilized a heatmap to visualize the dataset. I chose this method because, first of all, the data pertains to temperature, making it possible to visually observe changes over time, from colder to hotter temperatures. This dataset is also a time series, so it is time-dependent and often has continuous updates. As this is a large dataset, the heatmap proved to be a versatile option for visualizing the dense dataset, allowing patterns across days and months to be seen. From this heatmap, you can see the gradual increase in temperatures from the early days of May, the hotter temperatures as the months go through, and then the cooler temperatures returning at the end of September.

In plotting the heatmap, I utilized the Viridis color palette because it is said to be colorblind-friendly, simple to look at without distortions or confusion from many colors. In class, the professor says 10 is many enough to distort the data. The scale_fill_viridis function with the option “plasma’ provides consistent colors and variations in temperature, proportional to the changes in the dataset.