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
- To load and inspect the built-in airquality dataset.
- To identify and handle missing values.
- To compute summary statistics and averages.
- To determine the days with maximum temperature and ozone concentration.
- To study monthly temperature variations.
- To visualize the data using different plots.
- 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.
| Variable | Description |
|---|---|
| Ozone | Mean ozone concentration (ppb) |
| Solar.R | Solar radiation (langleys) |
| Wind | Average wind speed (mph) |
| Temp | Maximum daily temperature (°F) |
| Month | Month (5–9 corresponding to May–September) |
| Day | Day 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
- Load the built-in airquality dataset.
- Display the dataset structure and summary statistics.
- Find missing values in each column.
- Compute average values of Ozone, Solar Radiation, Wind, and Temperature.
- Identify the days with maximum temperature and ozone concentration.
- Compute average temperature for each month.
- Remove missing values.
- Identify days having temperature above 90°F and ozone concentration above average.
- Create various plots to visualize the data.
- 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
| Function | Purpose |
|---|---|
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
Post a Comment