This notebook presents an exploratory data analysis (EDA) of the built-in mtcars dataset in R.

The objective of this analysis is to understand how different vehicle characteristics

(such as weight, horsepower, and engine configuration) relate to fuel efficiency (mpg).

The analysis focuses on identifying patterns and relationships between variables,

particularly examining how factors like the number of cylinders and vehicle weight

impact miles per gallon.

To achieve this, we apply data transformation techniques using the tidyverse package

and generate multiple visualizations using ggplot2. These visualizations include

and grouped summaries.

Key steps in this project:

1. Data preparation and transformation (factor conversion, grouping, summarization)

2. Exploratory visualization of relationships between variables

3. Comparative analysis across different cylinder categories

This analysis aims to provide clear visual insights into the structure of the dataset

and highlight the main factors that influence fuel efficiency.

plot(cars)

install.packages("tidyverse")
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/sys_3.4.3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/bit_4.6.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/ps_1.9.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/farver_2.1.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/labeling_0.4.3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/RColorBrewer_1.1-3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/viridisLite_0.4.3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/rematch_2.0.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/askpass_1.2.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/bit64_4.6.0-1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/prettyunits_1.2.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/processx_3.8.6.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/backports_1.5.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/generics_0.1.4.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/blob_1.3.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/DBI_1.3.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/tidyselect_1.2.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/withr_3.0.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/data.table_1.18.2.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/gtable_0.3.6.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/isoband_0.3.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/S7_0.2.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/scales_1.4.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/gargle_1.6.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/uuid_1.2-2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/cellranger_1.1.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/curl_7.0.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/ids_1.0.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/rematch2_2.1.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/cpp11_0.5.3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/pkgconfig_2.0.3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/openssl_2.3.5.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/timechange_0.4.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/utf8_1.2.6.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/systemfonts_1.3.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/textshaping_1.0.5.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/clipr_0.8.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/crayon_1.5.3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/vroom_1.7.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/tzdb_0.5.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/progress_1.2.3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/callr_3.7.6.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/selectr_0.5-1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/broom_1.0.12.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/conflicted_1.2.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/dbplyr_2.5.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/dplyr_1.2.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/dtplyr_1.3.3.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/forcats_1.0.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/ggplot2_4.0.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/googledrive_2.1.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/googlesheets4_1.1.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/haven_2.5.5.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/hms_1.1.4.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/httr_1.4.8.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/lubridate_1.9.5.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/modelr_0.1.11.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/pillar_1.11.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/purrr_1.2.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/ragg_1.5.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/readr_2.2.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/readxl_1.4.5.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/reprex_2.1.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/rstudioapi_0.18.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/rvest_1.0.5.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/tibble_3.3.1.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/tidyr_1.3.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/xml2_1.5.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/tidyverse_2.0.0.tar.gz'

The downloaded source packages are in
    ‘/tmp/RtmpHTbFc4/downloaded_packages’
library(tidyverse) # Load the tidyverse package for data manipulation and visualization
library(ggplot2) # Load ggplot2 for creating plots

# Load the mtcars dataset (built into R)
data_mtcars <- mtcars

# View the first few rows to understand the data
head(data_mtcars)
# Convert 'am' (transmission type) and 'cyl' (number of cylinders) to factors for categorical plotting
data_mtcars$am <- as.factor(data_mtcars$am)
data_mtcars$cyl <- as.factor(data_mtcars$cyl)
# Create a scatter plot of car weight vs. miles per gallon, colored by cylinder count
ggplot(data_mtcars, aes(x = wt, y = mpg, color = cyl)) +
  geom_point() + # Add points to the plot
  labs(title = "Weight vs. Miles Per Gallon", x = "Weight (1000 lbs)", y = "Miles Per Gallon") # Add plot labels

#Create a line graph of ordered mpg by the row number.
data_mtcars_line <- data_mtcars %>% mutate(index = row_number()) #add index column so we can plot it

ggplot(data_mtcars_line, aes(x = index, y = mpg)) +
  geom_line() + # add a line to the plot
  labs(title = "Miles Per Gallon by Index", x = "Index", y = "Miles Per Gallon") # add plot labels

# Create a horizontal bar chart of the average horsepower grouped by cylinder count
hp_by_cyl <- data_mtcars %>% group_by(cyl) %>% summarize(avg_hp = mean(hp)) # Calculate average horsepower for each cylinder group

ggplot(hp_by_cyl, aes(y = cyl, x = avg_hp)) +
  geom_bar(stat = 'identity') + # Create bars based on the calculated averages
  labs(title = "Average HP by Cylinder Count", y = "Cylinder Count", x = "Average Horsepower") # Add plot labels

#Create a stacked bar chart of average mpg, disp, hp, and wt, grouped by cyl.
bar_data_mtcars <- data_mtcars %>% group_by(cyl) %>% summarize(mpg = mean(mpg), disp = mean(disp), hp = mean(hp), wt = mean(wt)) %>% pivot_longer(cols = c("mpg", "disp", "hp", "wt"), names_to = "Measurement", values_to = "Average") #Calculate average values for each measurement, and pivot the data into a long format.

ggplot(bar_data_mtcars, aes(x = cyl, fill = Measurement, y = Average)) +
  geom_bar(stat = "identity") + #Create bars based on the calculated averages
  labs(title = "Average Measurements by Cylinder Count", x = "Cylinder Count", y = "Average Measurement") #add plot labels

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBUaGlzIG5vdGVib29rIHByZXNlbnRzIGFuIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgKEVEQSkgb2YgdGhlIGJ1aWx0LWluIG10Y2FycyBkYXRhc2V0IGluIFIuCiMgVGhlIG9iamVjdGl2ZSBvZiB0aGlzIGFuYWx5c2lzIGlzIHRvIHVuZGVyc3RhbmQgaG93IGRpZmZlcmVudCB2ZWhpY2xlIGNoYXJhY3RlcmlzdGljcyAKIyAoc3VjaCBhcyB3ZWlnaHQsIGhvcnNlcG93ZXIsIGFuZCBlbmdpbmUgY29uZmlndXJhdGlvbikgcmVsYXRlIHRvIGZ1ZWwgZWZmaWNpZW5jeSAobXBnKS4KCiMgVGhlIGFuYWx5c2lzIGZvY3VzZXMgb24gaWRlbnRpZnlpbmcgcGF0dGVybnMgYW5kIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB2YXJpYWJsZXMsIAojIHBhcnRpY3VsYXJseSBleGFtaW5pbmcgaG93IGZhY3RvcnMgbGlrZSB0aGUgbnVtYmVyIG9mIGN5bGluZGVycyBhbmQgdmVoaWNsZSB3ZWlnaHQgCiMgaW1wYWN0IG1pbGVzIHBlciBnYWxsb24uCgojIFRvIGFjaGlldmUgdGhpcywgd2UgYXBwbHkgZGF0YSB0cmFuc2Zvcm1hdGlvbiB0ZWNobmlxdWVzIHVzaW5nIHRoZSB0aWR5dmVyc2UgcGFja2FnZSAKIyBhbmQgZ2VuZXJhdGUgbXVsdGlwbGUgdmlzdWFsaXphdGlvbnMgdXNpbmcgZ2dwbG90Mi4gVGhlc2UgdmlzdWFsaXphdGlvbnMgaW5jbHVkZSAKIyBzY2F0dGVyIHBsb3RzLCBsaW5lIGdyYXBocywgYW5kIGJhciBjaGFydHMgdG8gZXhwbG9yZSBib3RoIGluZGl2aWR1YWwgdHJlbmRzIAojIGFuZCBncm91cGVkIHN1bW1hcmllcy4KCiMgS2V5IHN0ZXBzIGluIHRoaXMgcHJvamVjdDoKIyAxLiBEYXRhIHByZXBhcmF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiAoZmFjdG9yIGNvbnZlcnNpb24sIGdyb3VwaW5nLCBzdW1tYXJpemF0aW9uKQojIDIuIEV4cGxvcmF0b3J5IHZpc3VhbGl6YXRpb24gb2YgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHZhcmlhYmxlcwojIDMuIENvbXBhcmF0aXZlIGFuYWx5c2lzIGFjcm9zcyBkaWZmZXJlbnQgY3lsaW5kZXIgY2F0ZWdvcmllcwoKIyBUaGlzIGFuYWx5c2lzIGFpbXMgdG8gcHJvdmlkZSBjbGVhciB2aXN1YWwgaW5zaWdodHMgaW50byB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhc2V0IAojIGFuZCBoaWdobGlnaHQgdGhlIG1haW4gZmFjdG9ycyB0aGF0IGluZmx1ZW5jZSBmdWVsIGVmZmljaWVuY3kuCgpgYGB7cn0KcGxvdChjYXJzKQpgYGAKCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQpgYGAKCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpICMgTG9hZCB0aGUgdGlkeXZlcnNlIHBhY2thZ2UgZm9yIGRhdGEgbWFuaXB1bGF0aW9uIGFuZCB2aXN1YWxpemF0aW9uCmxpYnJhcnkoZ2dwbG90MikgIyBMb2FkIGdncGxvdDIgZm9yIGNyZWF0aW5nIHBsb3RzCgojIExvYWQgdGhlIG10Y2FycyBkYXRhc2V0IChidWlsdCBpbnRvIFIpCmRhdGFfbXRjYXJzIDwtIG10Y2FycwoKIyBWaWV3IHRoZSBmaXJzdCBmZXcgcm93cyB0byB1bmRlcnN0YW5kIHRoZSBkYXRhCmhlYWQoZGF0YV9tdGNhcnMpCmBgYAoKCmBgYHtyfQojIENvbnZlcnQgJ2FtJyAodHJhbnNtaXNzaW9uIHR5cGUpIGFuZCAnY3lsJyAobnVtYmVyIG9mIGN5bGluZGVycykgdG8gZmFjdG9ycyBmb3IgY2F0ZWdvcmljYWwgcGxvdHRpbmcKZGF0YV9tdGNhcnMkYW0gPC0gYXMuZmFjdG9yKGRhdGFfbXRjYXJzJGFtKQpkYXRhX210Y2FycyRjeWwgPC0gYXMuZmFjdG9yKGRhdGFfbXRjYXJzJGN5bCkKYGBgCgoKYGBge3J9CiMgQ3JlYXRlIGEgc2NhdHRlciBwbG90IG9mIGNhciB3ZWlnaHQgdnMuIG1pbGVzIHBlciBnYWxsb24sIGNvbG9yZWQgYnkgY3lsaW5kZXIgY291bnQKZ2dwbG90KGRhdGFfbXRjYXJzLCBhZXMoeCA9IHd0LCB5ID0gbXBnLCBjb2xvciA9IGN5bCkpICsKICBnZW9tX3BvaW50KCkgKyAjIEFkZCBwb2ludHMgdG8gdGhlIHBsb3QKICBsYWJzKHRpdGxlID0gIldlaWdodCB2cy4gTWlsZXMgUGVyIEdhbGxvbiIsIHggPSAiV2VpZ2h0ICgxMDAwIGxicykiLCB5ID0gIk1pbGVzIFBlciBHYWxsb24iKSAjIEFkZCBwbG90IGxhYmVscwpgYGAKCgpgYGB7cn0KI0NyZWF0ZSBhIGxpbmUgZ3JhcGggb2Ygb3JkZXJlZCBtcGcgYnkgdGhlIHJvdyBudW1iZXIuCmRhdGFfbXRjYXJzX2xpbmUgPC0gZGF0YV9tdGNhcnMgJT4lIG11dGF0ZShpbmRleCA9IHJvd19udW1iZXIoKSkgI2FkZCBpbmRleCBjb2x1bW4gc28gd2UgY2FuIHBsb3QgaXQKCmdncGxvdChkYXRhX210Y2Fyc19saW5lLCBhZXMoeCA9IGluZGV4LCB5ID0gbXBnKSkgKwogIGdlb21fbGluZSgpICsgIyBhZGQgYSBsaW5lIHRvIHRoZSBwbG90CiAgbGFicyh0aXRsZSA9ICJNaWxlcyBQZXIgR2FsbG9uIGJ5IEluZGV4IiwgeCA9ICJJbmRleCIsIHkgPSAiTWlsZXMgUGVyIEdhbGxvbiIpICMgYWRkIHBsb3QgbGFiZWxzCmBgYAoKCmBgYHtyfQojIENyZWF0ZSBhIGhvcml6b250YWwgYmFyIGNoYXJ0IG9mIHRoZSBhdmVyYWdlIGhvcnNlcG93ZXIgZ3JvdXBlZCBieSBjeWxpbmRlciBjb3VudApocF9ieV9jeWwgPC0gZGF0YV9tdGNhcnMgJT4lIGdyb3VwX2J5KGN5bCkgJT4lIHN1bW1hcml6ZShhdmdfaHAgPSBtZWFuKGhwKSkgIyBDYWxjdWxhdGUgYXZlcmFnZSBob3JzZXBvd2VyIGZvciBlYWNoIGN5bGluZGVyIGdyb3VwCgpnZ3Bsb3QoaHBfYnlfY3lsLCBhZXMoeSA9IGN5bCwgeCA9IGF2Z19ocCkpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAjIENyZWF0ZSBiYXJzIGJhc2VkIG9uIHRoZSBjYWxjdWxhdGVkIGF2ZXJhZ2VzCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEhQIGJ5IEN5bGluZGVyIENvdW50IiwgeSA9ICJDeWxpbmRlciBDb3VudCIsIHggPSAiQXZlcmFnZSBIb3JzZXBvd2VyIikgIyBBZGQgcGxvdCBsYWJlbHMKYGBgCgoKYGBge3J9CiNDcmVhdGUgYSBzdGFja2VkIGJhciBjaGFydCBvZiBhdmVyYWdlIG1wZywgZGlzcCwgaHAsIGFuZCB3dCwgZ3JvdXBlZCBieSBjeWwuCmJhcl9kYXRhX210Y2FycyA8LSBkYXRhX210Y2FycyAlPiUgZ3JvdXBfYnkoY3lsKSAlPiUgc3VtbWFyaXplKG1wZyA9IG1lYW4obXBnKSwgZGlzcCA9IG1lYW4oZGlzcCksIGhwID0gbWVhbihocCksIHd0ID0gbWVhbih3dCkpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMoIm1wZyIsICJkaXNwIiwgImhwIiwgInd0IiksIG5hbWVzX3RvID0gIk1lYXN1cmVtZW50IiwgdmFsdWVzX3RvID0gIkF2ZXJhZ2UiKSAjQ2FsY3VsYXRlIGF2ZXJhZ2UgdmFsdWVzIGZvciBlYWNoIG1lYXN1cmVtZW50LCBhbmQgcGl2b3QgdGhlIGRhdGEgaW50byBhIGxvbmcgZm9ybWF0LgoKZ2dwbG90KGJhcl9kYXRhX210Y2FycywgYWVzKHggPSBjeWwsIGZpbGwgPSBNZWFzdXJlbWVudCwgeSA9IEF2ZXJhZ2UpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgI0NyZWF0ZSBiYXJzIGJhc2VkIG9uIHRoZSBjYWxjdWxhdGVkIGF2ZXJhZ2VzCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIE1lYXN1cmVtZW50cyBieSBDeWxpbmRlciBDb3VudCIsIHggPSAiQ3lsaW5kZXIgQ291bnQiLCB5ID0gIkF2ZXJhZ2UgTWVhc3VyZW1lbnQiKSAjYWRkIHBsb3QgbGFiZWxzCmBgYAoK