library(tidyverse)
library(openintro)

Exercise 1

Answer to Exercise 1: The default bin width set by ggplot2 shows the overall shape of the histogram but the smaller bin width of 15 provides a better look at the variability in the data. The larger bin width of 150 is very broad and doesn’t show much variation.

ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram(binwidth = 15)

ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram(binwidth = 150)

Exercise 2

Create a new data frame that includes flights headed to SFO in February, and save this data frame as sfo_feb_flights. How many flights meet these criteria?

sfo_feb_flights <- nycflights %>%
  filter(dest == "SFO", month == 2)
sfo_feb_flights %>%
  summarise (n=n())
## # A tibble: 1 × 1
##       n
##   <int>
## 1    68

… ### Exercise 3 Describe the distribution of the arrival delays of these flights using a histogram and appropriate summary statistics. Hint: The summary statistics you use should depend on the shape of the distribution.

sfo_feb_flights <- nycflights %>%
  filter(dest == "SFO", month == 2)
ggplot(data = sfo_feb_flights, aes(x = arr_delay)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

sfo_feb_flights %>%
  summarise (mean_ad   = mean(arr_delay), median_ad = median(arr_delay), n=n())
## # A tibble: 1 × 3
##   mean_ad median_ad     n
##     <dbl>     <dbl> <int>
## 1    -4.5       -11    68

Exercise 4

Calculate the median and interquartile range for arr_delays of flights in in the sfo_feb_flights data frame, grouped by carrier. Which carrier has the most variable arrival delays?

sfo_feb_flights %>%
  group_by(carrier) %>%
  summarise(median_ad = median(arr_delay), iqr_ad = IQR(arr_delay), n_flights = n())
## # A tibble: 5 × 4
##   carrier median_ad iqr_ad n_flights
##   <chr>       <dbl>  <dbl>     <int>
## 1 AA            5     17.5        10
## 2 B6          -10.5   12.2         6
## 3 DL          -15     22          19
## 4 UA          -10     22          21
## 5 VX          -22.5   21.2        12

Exercise 5

Suppose you really dislike departure delays and you want to schedule your travel in a month that minimizes your potential departure delay leaving NYC. One option is to choose the month with the lowest mean departure delay. Another option is to choose the month with the lowest median departure delay. What are the pros and cons of these two choices? Answer: I am not sure how to fix the median values in this code but from my understanding, median is a better choice when the data is skewed because of outliers etc.

nycflights %>%
  group_by(month) %>%
  summarise(mean_dd = mean(dep_delay), median_dd = median(dep_delay)) %>%
  arrange(desc(mean_dd))
## # A tibble: 12 × 3
##    month mean_dd median_dd
##    <int>   <dbl>     <dbl>
##  1     7   20.8          0
##  2     6   20.4          0
##  3    12   17.4          1
##  4     4   14.6         -2
##  5     3   13.5         -1
##  6     5   13.3         -1
##  7     8   12.6         -1
##  8     2   10.7         -2
##  9     1   10.2         -2
## 10     9    6.87        -3
## 11    11    6.10        -2
## 12    10    5.88        -3

Exercise 6

If you were selecting an airport simply based on on time departure percentage, which NYC airport would you choose to fly out of? Answer: LGA appears to have the highest on-time departure percentage.

nycflights <- nycflights %>%
  mutate(dep_type = ifelse(dep_delay < 5, "on time", "delayed"))
nycflights %>%
  group_by(origin) %>%
  summarise(ot_dep_rate = sum(dep_type == "on time") / n()) %>%
  arrange(desc(ot_dep_rate))
## # A tibble: 3 × 2
##   origin ot_dep_rate
##   <chr>        <dbl>
## 1 LGA          0.728
## 2 JFK          0.694
## 3 EWR          0.637
ggplot(data = nycflights, aes(x = origin, fill = dep_type)) +
  geom_bar()

### Exercise 7 Mutate the data frame so that it includes a new variable that contains the average speed, avg_speed traveled by the plane for each flight (in mph). Hint: Average speed can be calculated as distance divided by number of hours of travel, and note that air_time is given in minutes.

nycflights <- nycflights %>%
  mutate(avg_speed = distance/(air_time/60))

Exercise 8

Make a scatterplot of avg_speed vs. distance. Describe the relationship between average speed and distance. Hint: Use geom_point().

ggplot(data = nycflights, aes(x = distance, y = avg_speed)) +
  geom_point()

LS0tCnRpdGxlOiAiTGFiIDEiCmF1dGhvcjogIlNoaWxwYSBTYW5hcGFsYSIKZGF0ZTogIkp1bmUgMjQsIDIwMjQiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkob3BlbmludHJvKQpgYGAKCiMjIyBFeGVyY2lzZSAxCgpBbnN3ZXIgdG8gRXhlcmNpc2UgMTogVGhlIGRlZmF1bHQgYmluIHdpZHRoIHNldCBieSBnZ3Bsb3QyIHNob3dzIHRoZSBvdmVyYWxsIHNoYXBlIG9mIHRoZSBoaXN0b2dyYW0gYnV0IHRoZSBzbWFsbGVyIGJpbiB3aWR0aCBvZiAxNSBwcm92aWRlcyBhIGJldHRlciBsb29rIGF0IHRoZSB2YXJpYWJpbGl0eSBpbiB0aGUgZGF0YS4gVGhlIGxhcmdlciBiaW4gd2lkdGggb2YgMTUwIGlzIHZlcnkgYnJvYWQgYW5kIGRvZXNuJ3Qgc2hvdyBtdWNoIHZhcmlhdGlvbi4KCmBgYHtyIGNvZGUtY2h1bmstbGFiZWx9CmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oKQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTUpCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNTApCgpgYGAKCiMjIyBFeGVyY2lzZSAyCkNyZWF0ZSBhIG5ldyBkYXRhIGZyYW1lIHRoYXQgaW5jbHVkZXMgZmxpZ2h0cyBoZWFkZWQgdG8gU0ZPIGluIEZlYnJ1YXJ5LCBhbmQgc2F2ZSB0aGlzIGRhdGEgZnJhbWUgYXMgc2ZvX2ZlYl9mbGlnaHRzLiBIb3cgbWFueSBmbGlnaHRzIG1lZXQgdGhlc2UgY3JpdGVyaWE/CgpgYGB7cn0Kc2ZvX2ZlYl9mbGlnaHRzIDwtIG55Y2ZsaWdodHMgJT4lCiAgZmlsdGVyKGRlc3QgPT0gIlNGTyIsIG1vbnRoID09IDIpCnNmb19mZWJfZmxpZ2h0cyAlPiUKICBzdW1tYXJpc2UgKG49bigpKQoKCmBgYAoKLi4uCiMjIyBFeGVyY2lzZSAzCkRlc2NyaWJlIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGFycml2YWwgZGVsYXlzIG9mIHRoZXNlIGZsaWdodHMgdXNpbmcgYSBoaXN0b2dyYW0gYW5kIGFwcHJvcHJpYXRlIHN1bW1hcnkgc3RhdGlzdGljcy4gSGludDogVGhlIHN1bW1hcnkgc3RhdGlzdGljcyB5b3UgdXNlIHNob3VsZCBkZXBlbmQgb24gdGhlIHNoYXBlIG9mIHRoZSBkaXN0cmlidXRpb24uCgpgYGB7cn0Kc2ZvX2ZlYl9mbGlnaHRzIDwtIG55Y2ZsaWdodHMgJT4lCiAgZmlsdGVyKGRlc3QgPT0gIlNGTyIsIG1vbnRoID09IDIpCmdncGxvdChkYXRhID0gc2ZvX2ZlYl9mbGlnaHRzLCBhZXMoeCA9IGFycl9kZWxheSkpICsKICBnZW9tX2hpc3RvZ3JhbSgpCnNmb19mZWJfZmxpZ2h0cyAlPiUKICBzdW1tYXJpc2UgKG1lYW5fYWQgICA9IG1lYW4oYXJyX2RlbGF5KSwgbWVkaWFuX2FkID0gbWVkaWFuKGFycl9kZWxheSksIG49bigpKQoKYGBgCgojIyMgRXhlcmNpc2UgNApDYWxjdWxhdGUgdGhlIG1lZGlhbiBhbmQgaW50ZXJxdWFydGlsZSByYW5nZSBmb3IgYXJyX2RlbGF5cyBvZiBmbGlnaHRzIGluIGluIHRoZSBzZm9fZmViX2ZsaWdodHMgZGF0YSBmcmFtZSwgZ3JvdXBlZCBieSBjYXJyaWVyLiBXaGljaCBjYXJyaWVyIGhhcyB0aGUgbW9zdCB2YXJpYWJsZSBhcnJpdmFsIGRlbGF5cz8KYGBge3J9CnNmb19mZWJfZmxpZ2h0cyAlPiUKICBncm91cF9ieShjYXJyaWVyKSAlPiUKICBzdW1tYXJpc2UobWVkaWFuX2FkID0gbWVkaWFuKGFycl9kZWxheSksIGlxcl9hZCA9IElRUihhcnJfZGVsYXkpLCBuX2ZsaWdodHMgPSBuKCkpCmBgYAojIyMgRXhlcmNpc2UgNQpTdXBwb3NlIHlvdSByZWFsbHkgZGlzbGlrZSBkZXBhcnR1cmUgZGVsYXlzIGFuZCB5b3Ugd2FudCB0byBzY2hlZHVsZSB5b3VyIHRyYXZlbCBpbiBhIG1vbnRoIHRoYXQgbWluaW1pemVzIHlvdXIgcG90ZW50aWFsIGRlcGFydHVyZSBkZWxheSBsZWF2aW5nIE5ZQy4gT25lIG9wdGlvbiBpcyB0byBjaG9vc2UgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWFuIGRlcGFydHVyZSBkZWxheS4gQW5vdGhlciBvcHRpb24gaXMgdG8gY2hvb3NlIHRoZSBtb250aCB3aXRoIHRoZSBsb3dlc3QgbWVkaWFuIGRlcGFydHVyZSBkZWxheS4gV2hhdCBhcmUgdGhlIHByb3MgYW5kIGNvbnMgb2YgdGhlc2UgdHdvIGNob2ljZXM/CkFuc3dlcjogSSBhbSBub3Qgc3VyZSBob3cgdG8gZml4IHRoZSBtZWRpYW4gdmFsdWVzIGluIHRoaXMgY29kZSBidXQgZnJvbSBteSB1bmRlcnN0YW5kaW5nLCBtZWRpYW4gaXMgYSBiZXR0ZXIgY2hvaWNlIHdoZW4gdGhlIGRhdGEgaXMgc2tld2VkIGJlY2F1c2Ugb2Ygb3V0bGllcnMgZXRjLiAgCmBgYHtyfQpueWNmbGlnaHRzICU+JQogIGdyb3VwX2J5KG1vbnRoKSAlPiUKICBzdW1tYXJpc2UobWVhbl9kZCA9IG1lYW4oZGVwX2RlbGF5KSwgbWVkaWFuX2RkID0gbWVkaWFuKGRlcF9kZWxheSkpICU+JQogIGFycmFuZ2UoZGVzYyhtZWFuX2RkKSkKCmBgYAojIyMgRXhlcmNpc2UgNgpJZiB5b3Ugd2VyZSBzZWxlY3RpbmcgYW4gYWlycG9ydCBzaW1wbHkgYmFzZWQgb24gb24gdGltZSBkZXBhcnR1cmUgcGVyY2VudGFnZSwgd2hpY2ggTllDIGFpcnBvcnQgd291bGQgeW91IGNob29zZSB0byBmbHkgb3V0IG9mPwpBbnN3ZXI6IExHQSBhcHBlYXJzIHRvIGhhdmUgdGhlIGhpZ2hlc3Qgb24tdGltZSBkZXBhcnR1cmUgcGVyY2VudGFnZS4KYGBge3J9Cm55Y2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUKICBtdXRhdGUoZGVwX3R5cGUgPSBpZmVsc2UoZGVwX2RlbGF5IDwgNSwgIm9uIHRpbWUiLCAiZGVsYXllZCIpKQpueWNmbGlnaHRzICU+JQogIGdyb3VwX2J5KG9yaWdpbikgJT4lCiAgc3VtbWFyaXNlKG90X2RlcF9yYXRlID0gc3VtKGRlcF90eXBlID09ICJvbiB0aW1lIikgLyBuKCkpICU+JQogIGFycmFuZ2UoZGVzYyhvdF9kZXBfcmF0ZSkpCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBvcmlnaW4sIGZpbGwgPSBkZXBfdHlwZSkpICsKICBnZW9tX2JhcigpCmBgYAojIyMgRXhlcmNpc2UgNwpNdXRhdGUgdGhlIGRhdGEgZnJhbWUgc28gdGhhdCBpdCBpbmNsdWRlcyBhIG5ldyB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBhdmVyYWdlIHNwZWVkLCBhdmdfc3BlZWQgdHJhdmVsZWQgYnkgdGhlIHBsYW5lIGZvciBlYWNoIGZsaWdodCAoaW4gbXBoKS4gSGludDogQXZlcmFnZSBzcGVlZCBjYW4gYmUgY2FsY3VsYXRlZCBhcyBkaXN0YW5jZSBkaXZpZGVkIGJ5IG51bWJlciBvZiBob3VycyBvZiB0cmF2ZWwsIGFuZCBub3RlIHRoYXQgYWlyX3RpbWUgaXMgZ2l2ZW4gaW4gbWludXRlcy4KYGBge3J9Cm55Y2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUKICBtdXRhdGUoYXZnX3NwZWVkID0gZGlzdGFuY2UvKGFpcl90aW1lLzYwKSkKYGBgCiMjIyBFeGVyY2lzZSA4Ck1ha2UgYSBzY2F0dGVycGxvdCBvZiBhdmdfc3BlZWQgdnMuIGRpc3RhbmNlLiBEZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYXZlcmFnZSBzcGVlZCBhbmQgZGlzdGFuY2UuIEhpbnQ6IFVzZSBnZW9tX3BvaW50KCkuCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGlzdGFuY2UsIHkgPSBhdmdfc3BlZWQpKSArCiAgZ2VvbV9wb2ludCgpCmBgYAoK