Analysis and Visualization of the Built-in Air Quality Dataset Using R

 

Experiment

Analysis and Visualization of the Built-in Air Quality Dataset Using R

Aim

To explore, analyze, and visualize the built-in airquality dataset in R and export the cleaned data to a CSV file.


Objectives

  1. To load and inspect the built-in airquality dataset.
  2. To identify and handle missing values.
  3. To compute summary statistics and averages.
  4. To determine the days with maximum temperature and ozone concentration.
  5. To study monthly temperature variations.
  6. To visualize the data using different plots.
  7. To export the cleaned dataset to a CSV file.

Theory

The airquality dataset is a built-in dataset in R that contains daily air quality measurements in New York from May to September 1973.

The dataset contains 153 observations and 6 variables.

VariableDescription
OzoneMean ozone concentration (ppb)
Solar.RSolar radiation (langleys)
WindAverage wind speed (mph)
TempMaximum daily temperature (°F)
MonthMonth (5–9 corresponding to May–September)
DayDay of month

Some observations contain missing values (NA), making this dataset suitable for learning data cleaning techniques.

Exploratory Data Analysis (EDA) involves:

  • Examining data structure.
  • Computing summary statistics.
  • Detecting missing values.
  • Visualizing distributions and relationships.
  • Cleaning data and exporting results.

Algorithm

  1. Load the built-in airquality dataset.
  2. Display the dataset structure and summary statistics.
  3. Find missing values in each column.
  4. Compute average values of Ozone, Solar Radiation, Wind, and Temperature.
  5. Identify the days with maximum temperature and ozone concentration.
  6. Compute average temperature for each month.
  7. Remove missing values.
  8. Identify days having temperature above 90°F and ozone concentration above average.
  9. Create various plots to visualize the data.
  10. Write the cleaned dataset to a CSV file.

Program

# Load dataset
data(airquality)

# Display first six records
head(airquality)

# Structure of dataset
str(airquality)

# Summary statistics
summary(airquality)

# Dimensions
dim(airquality)

# ----------------------------------------
# Missing values
# ----------------------------------------
cat("Missing values in each column\n")
colSums(is.na(airquality))

# ----------------------------------------
# Average values
# ----------------------------------------
cat("Average Ozone = ",
mean(airquality$Ozone, na.rm=TRUE), "\n")

cat("Average Solar Radiation = ",
mean(airquality$Solar.R, na.rm=TRUE), "\n")

cat("Average Wind = ",
mean(airquality$Wind), "\n")

cat("Average Temperature = ",
mean(airquality$Temp), "\n")

# ----------------------------------------
# Maximum temperature day
# ----------------------------------------
max_temp_day <- airquality[
airquality$Temp == max(airquality$Temp), ]

cat("\nMaximum Temperature Record\n")
print(max_temp_day)

# ----------------------------------------
# Maximum ozone day
# ----------------------------------------
max_ozone_day <- airquality[
airquality$Ozone ==
max(airquality$Ozone, na.rm=TRUE), ]

cat("\nMaximum Ozone Record\n")
print(max_ozone_day)

# ----------------------------------------
# Average temperature by month
# ----------------------------------------
avg_temp_month <- aggregate(
Temp ~ Month,
data=airquality,
mean)

print(avg_temp_month)

# ----------------------------------------
# Remove missing values
# ----------------------------------------
clean_data <- na.omit(airquality)

# ----------------------------------------
# Summary after cleaning
# ----------------------------------------
summary(clean_data)

# ----------------------------------------
# Days with Temp >90 and Ozone > average
# ----------------------------------------
avg_ozone <- mean(clean_data$Ozone)

high_days <- clean_data[
clean_data$Temp > 90 &
clean_data$Ozone > avg_ozone, ]

print(high_days)

# ----------------------------------------
# Export cleaned data
# ----------------------------------------
write.csv(clean_data,
"airquality_cleaned.csv",
row.names=FALSE)

# ========================================
# Visualization
# ========================================

par(mfrow=c(2,2))

# Histogram
hist(airquality$Temp,
col="skyblue",
main="Temperature Distribution",
xlab="Temperature")

# Box Plot
boxplot(airquality$Ozone,
col="lightgreen",
main="Ozone Distribution")

# Scatter Plot
plot(airquality$Temp,
airquality$Ozone,
pch=19,
col="red",
main="Temperature vs Ozone",
xlab="Temperature",
ylab="Ozone")

# Bar Plot
barplot(avg_temp_month$Temp,
names.arg=avg_temp_month$Month,
col="orange",
main="Average Temperature by Month",
xlab="Month",
ylab="Temperature")

par(mfrow=c(1,1))

# Pie Chart
month_count <- table(airquality$Month)

pie(month_count,
labels=names(month_count),
col=rainbow(length(month_count)),
main="Observations by Month")

Sample Output

> # Load dataset
> data(airquality)

> # Display first six records
> 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

> # Structure of dataset
> str(airquality)
'data.frame':	153 obs. of  6 variables:
 $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
 $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
 $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...

> # Summary statistics
> summary(airquality)
     Ozone           Solar.R           Wind             Temp      
 Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
 1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
 Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
 Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
 3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
 Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
 NAs    :37       NAs    :7                                       
     Month            Day      
 Min.   :5.000   Min.   : 1.0  
 1st Qu.:6.000   1st Qu.: 8.0  
 Median :7.000   Median :16.0  
 Mean   :6.993   Mean   :15.8  
 3rd Qu.:8.000   3rd Qu.:23.0  
 Max.   :9.000   Max.   :31.0  
                               

> # Dimensions
> dim(airquality)
[1] 153   6

> # ----------------------------------------
> # Missing values
> # ----------------------------------------
> cat("Missing values in each column\n")
Missing values in each column

> colSums(is.na(airquality))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0 

> # ----------------------------------------
> # Average values
> # ----------------------------------------
> cat("Average Ozone = ",
+     mean(airq .... [TRUNCATED] 
Average Ozone =  42.12931 

> cat("Average Solar Radiation = ",
+     mean(airquality$Solar.R, na.rm=TRUE), "\n")
Average Solar Radiation =  185.9315 

> cat("Average Wind = ",
+     mean(airquality$Wind), "\n")
Average Wind =  9.957516 

> cat("Average Temperature = ",
+     mean(airquality$Temp), "\n")
Average Temperature =  77.88235 

> # ----------------------------------------
> # Maximum temperature day
> # ----------------------------------------
> max_temp_day <- airquality[
+  .... [TRUNCATED] 

> cat("\nMaximum Temperature Record\n")

Maximum Temperature Record

> print(max_temp_day)
    Ozone Solar.R Wind Temp Month Day
120    76     203  9.7   97     8  28

> # ----------------------------------------
> # Maximum ozone day
> # ----------------------------------------
> max_ozone_day <- airquality[
+   air .... [TRUNCATED] 

> cat("\nMaximum Ozone Record\n")

Maximum Ozone Record

> print(max_ozone_day)
      Ozone Solar.R Wind Temp Month Day
NA       NA      NA   NA   NA    NA  NA
NA.1     NA      NA   NA   NA    NA  NA
NA.2     NA      NA   NA   NA    NA  NA
NA.3     NA      NA   NA   NA    NA  NA
NA.4     NA      NA   NA   NA    NA  NA
NA.5     NA      NA   NA   NA    NA  NA
NA.6     NA      NA   NA   NA    NA  NA
NA.7     NA      NA   NA   NA    NA  NA
NA.8     NA      NA   NA   NA    NA  NA
NA.9     NA      NA   NA   NA    NA  NA
NA.10    NA      NA   NA   NA    NA  NA
NA.11    NA      NA   NA   NA    NA  NA
NA.12    NA      NA   NA   NA    NA  NA
NA.13    NA      NA   NA   NA    NA  NA
NA.14    NA      NA   NA   NA    NA  NA
NA.15    NA      NA   NA   NA    NA  NA
NA.16    NA      NA   NA   NA    NA  NA
NA.17    NA      NA   NA   NA    NA  NA
NA.18    NA      NA   NA   NA    NA  NA
NA.19    NA      NA   NA   NA    NA  NA
NA.20    NA      NA   NA   NA    NA  NA
NA.21    NA      NA   NA   NA    NA  NA
NA.22    NA      NA   NA   NA    NA  NA
NA.23    NA      NA   NA   NA    NA  NA
NA.24    NA      NA   NA   NA    NA  NA
NA.25    NA      NA   NA   NA    NA  NA
NA.26    NA      NA   NA   NA    NA  NA
NA.27    NA      NA   NA   NA    NA  NA
NA.28    NA      NA   NA   NA    NA  NA
NA.29    NA      NA   NA   NA    NA  NA
NA.30    NA      NA   NA   NA    NA  NA
NA.31    NA      NA   NA   NA    NA  NA
NA.32    NA      NA   NA   NA    NA  NA
NA.33    NA      NA   NA   NA    NA  NA
NA.34    NA      NA   NA   NA    NA  NA
117     168     238  3.4   81     8  25
NA.35    NA      NA   NA   NA    NA  NA
NA.36    NA      NA   NA   NA    NA  NA

> # ----------------------------------------
> # Average temperature by month
> # ----------------------------------------
> avg_temp_month <- aggrega .... [TRUNCATED] 

> print(avg_temp_month)
  Month     Temp
1     5 65.54839
2     6 79.10000
3     7 83.90323
4     8 83.96774
5     9 76.90000

> # ----------------------------------------
> # Remove missing values
> # ----------------------------------------
> clean_data <- na.omit(airquality .... [TRUNCATED] 

> # ----------------------------------------
> # Summary after cleaning
> # ----------------------------------------
> summary(clean_data)
     Ozone          Solar.R           Wind            Temp      
 Min.   :  1.0   Min.   :  7.0   Min.   : 2.30   Min.   :57.00  
 1st Qu.: 18.0   1st Qu.:113.5   1st Qu.: 7.40   1st Qu.:71.00  
 Median : 31.0   Median :207.0   Median : 9.70   Median :79.00  
 Mean   : 42.1   Mean   :184.8   Mean   : 9.94   Mean   :77.79  
 3rd Qu.: 62.0   3rd Qu.:255.5   3rd Qu.:11.50   3rd Qu.:84.50  
 Max.   :168.0   Max.   :334.0   Max.   :20.70   Max.   :97.00  
     Month            Day       
 Min.   :5.000   Min.   : 1.00  
 1st Qu.:6.000   1st Qu.: 9.00  
 Median :7.000   Median :16.00  
 Mean   :7.216   Mean   :15.95  
 3rd Qu.:9.000   3rd Qu.:22.50  
 Max.   :9.000   Max.   :31.00  

> # ----------------------------------------
> # Days with Temp >90 and Ozone > average
> # ----------------------------------------
> avg_ozone <- me .... [TRUNCATED] 

> high_days <- clean_data[
+   clean_data$Temp > 90 &
+     clean_data$Ozone > avg_ozone, ]

> print(high_days)
    Ozone Solar.R Wind Temp Month Day
69     97     267  6.3   92     7   8
70     97     272  5.7   92     7   9
120    76     203  9.7   97     8  28
121   118     225  2.3   94     8  29
122    84     237  6.3   96     8  30
123    85     188  6.3   94     8  31
124    96     167  6.9   91     9   1
125    78     197  5.1   92     9   2
126    73     183  2.8   93     9   3 

127 91 189 4.6 93 9 4

Visualizations

1. Histogram of Temperature

Shows the frequency distribution of temperature values.

2. Box Plot of Ozone

Displays spread and outliers in ozone concentration.

3. Scatter Plot of Temperature vs Ozone

Shows the relationship between temperature and ozone concentration.

4. Bar Plot of Monthly Average Temperature

Compares average temperatures across months.

5. Pie Chart of Monthly Observations

Shows the proportion of observations belonging to each month.






Result

The built-in airquality dataset was successfully explored and analyzed using R. Missing values were identified and removed using the na.omit() function. Statistical measures such as averages and maximum values were computed. Various graphical techniques including histograms, box plots, scatter plots, bar charts, and pie charts were used to visualize the data. Finally, the cleaned dataset was exported to a CSV file named airquality_cleaned.csv.


Functions Used

FunctionPurpose
data()Load built-in dataset
head()Display first records
str()Structure of dataset
summary()Statistical summary
is.na()Check missing values
colSums()Count missing values
mean()Compute average
max()Find maximum value
aggregate()Group-wise analysis
na.omit()Remove missing values
write.csv()Export data
hist()Histogram
boxplot()Box plot
plot()Scatter plot
barplot()Bar chart
pie()Pie chart
table()Frequency table
par()Display multiple graphs

Comments

Popular posts from this blog

Statistical Methods Lab ( R Language) PCCBL308 Semester 3 KTU BTech CB and CU 2024 Scheme - Dr Binu V P

Programs in R - using control statements - Assignment 2

Basic R Programs to Try - Assignment 1