samples-nyc

inference
story
yacsda
Published

September 10, 2024

1 Aufgabe

Drei Studierende arbeiten für die New Yorker Flughafenbehörde als Werkstudenten. Fragt ihre Chefin eines Tages: “Welcher der drei New Yorker Flughäfen hat im Schnitt die höchste Verspätung?”

Studi A überlegt: “Ich schaue mir mal die Verspätung vom 1. Januar an, das geht am schnellsten, den Wert nehme ich dann als Schätzwert für die Verspätung des ganzen Jahres.”

Studi B argumentiert so: “Hm, ich schaue mir mal die ersten 1000 Flüge des Jahres und diesen Mittelwert nehme ich als Schätzwert für die Verspätung des ganzen Jahres.”

Studi C hingegen ist folgender Meinung: “Ich ziehe mal eine Zufallsstichprobe, habe ich in der Statistik-Vorlesung gelernt. N=100 sollte genügen.”

Die Chefin bezieht sich übrigens auf das Jahr 2023.

Aufgabe: Welcher der drei Studis macht die beste Vorhersage? Rechnen Sie nach und begründen Sie Ihre Meinung!

2 Lösung

2.1 Setup

library(nycflights23)
data("flights")
library(tidyverse)

Wie viele Flüge gab es?

nrow(flights)
[1] 435352

Viele!

Welche Variablens gibt es im Datensatz?

glimpse(flights)
Rows: 435,352
Columns: 19
$ year           <int> 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2…
$ month          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ day            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ dep_time       <int> 1, 18, 31, 33, 36, 503, 520, 524, 537, 547, 549, 551, 5…
$ sched_dep_time <int> 2038, 2300, 2344, 2140, 2048, 500, 510, 530, 520, 545, …
$ dep_delay      <dbl> 203, 78, 47, 173, 228, 3, 10, -6, 17, 2, -10, -9, -7, -…
$ arr_time       <int> 328, 228, 500, 238, 223, 808, 948, 645, 926, 845, 905, …
$ sched_arr_time <int> 3, 135, 426, 2352, 2252, 815, 949, 710, 818, 852, 901, …
$ arr_delay      <dbl> 205, 53, 34, 166, 211, -7, -1, -25, 68, -7, 4, -13, -14…
$ carrier        <chr> "UA", "DL", "B6", "B6", "UA", "AA", "B6", "AA", "UA", "…
$ flight         <int> 628, 393, 371, 1053, 219, 499, 996, 981, 206, 225, 800,…
$ tailnum        <chr> "N25201", "N830DN", "N807JB", "N265JB", "N17730", "N925…
$ origin         <chr> "EWR", "JFK", "JFK", "JFK", "EWR", "EWR", "JFK", "EWR",…
$ dest           <chr> "SMF", "ATL", "BQN", "CHS", "DTW", "MIA", "BQN", "ORD",…
$ air_time       <dbl> 367, 108, 190, 108, 80, 154, 192, 119, 258, 157, 164, 1…
$ distance       <dbl> 2500, 760, 1576, 636, 488, 1085, 1576, 719, 1400, 1065,…
$ hour           <dbl> 20, 23, 23, 21, 20, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 6, 6,…
$ minute         <dbl> 38, 0, 44, 40, 48, 0, 10, 30, 20, 45, 59, 0, 59, 0, 0, …
$ time_hour      <dttm> 2023-01-01 20:00:00, 2023-01-01 23:00:00, 2023-01-01 2…

Nehmen wir dep_delay als Zielvariable. Die Chefin hat nicht genau gesagt, welche Variable sie meint. Da sieht man es mal wieder: Man muss Annahmen treffen. Ist aber auch schön, denn man kann selber entscheiden, was einem besser gefällt.

2.2 Los geht’s

2.3 Studentin A

flights |> 
  filter(month == 1, day == 1) |> 
  select(dep_delay, origin) |> 
  drop_na() |> 
  group_by(origin) |> 
  summarise(dep_delay = mean(dep_delay))
# A tibble: 3 × 2
  origin dep_delay
  <chr>      <dbl>
1 EWR        23.7 
2 JFK        18.8 
3 LGA         9.07

“Klares (?) Ergebnis! EWR, also Newark, hat die größte Verspätung!”

2.3.1 Student B

flights |> 
  select(dep_delay, origin) |> 
  drop_na() |> 
  slice(1:1000) |> 
  group_by(origin) |> 
  summarise(dep_delay = mean(dep_delay))
# A tibble: 3 × 2
  origin dep_delay
  <chr>      <dbl>
1 EWR        26.1 
2 JFK        19.9 
3 LGA         9.41

“Glasklares (?) Ergebnis! EWR, also Newark, hat die größte Verspätung!”

2.3.2 Studentin C

set.seed(73)
flights |> 
  select(dep_delay, origin) |> 
  drop_na() |> 
  sample_n(size = 100)  |> 
  group_by(origin) |> 
  summarise(dep_delay = mean(dep_delay))
# A tibble: 3 × 2
  origin dep_delay
  <chr>      <dbl>
1 EWR         2.04
2 JFK        14.3 
3 LGA         8.85

“Glasklares (?) Ergebnis! JFK, also John-F-Kennedy, hat die größte Verspätung! Newark ist hingegen superpünktlich!”

2.4 Moment

Leider entbrennt hier ein Streit. Vermutlich einige Eifersuchtsmomente hinter den Kulissen, aber wir wissen nichts Genaues.

Studentin A: “So ein Quatsch, C, du hast die Zufallszahl auf 73 festgelegt, warum gerade diese Zahl?! Bei einer anderen Zahl könnte ein ganz andere Stichprobe und damit ein ganz anderes Ergebnis herauskommen!”

Studentin C: “Ich habe kürzlich gelernt, dass nicht 42, sondern 73 die beste Zahl ist. Also musste ich 73 nehmen!

Student B: “Aber was käme heraus, wenn du 42 als Zufallszahl nehmen würdest, nur mal theoretisch?”

Studentin C: “Äh…”

set.seed(42)
flights |> 
  select(dep_delay, origin) |> 
  drop_na() |> 
  sample_n(size = 100)  |> 
  group_by(origin) |> 
  summarise(dep_delay = mean(dep_delay))
# A tibble: 3 × 2
  origin dep_delay
  <chr>      <dbl>
1 EWR        28.3 
2 JFK         7.52
3 LGA         9.94

Studentin C: “Äh, also… Das spielt doch gar keine Rolle, was rauskommt, denn bei jeder Zahl kann ja was anderes rauskommen.”

A: “Du müsstest also dein Vorgehen ändern… Jede Zahl ausprobieren oder so.”

C: “Liebe A, du mit deinem 1. Januar, das ist doch totaler Quatsch, an deiner Stelle wäre ich lieber still.”

A: “Aber es kommt was Gutes raus mit meiner Methode!”

B: “Woher willst du überhaupt wissen, ob es was Gutes ist?”

A: “Wirst schon sehen!”

C: “Puh, also gut, ich rechne noch mal. Ich zieh einfach ne Menge Stichproben, mit zufälligen Seed-Nummern …”

A: “Whatever!”

C: “Moment.., hier kommt Newark, EWR.”

n_reps <- 100  # Anzahl von Stichproben
sample_size <- 100  # Umfang jeder Stichprobe

ewr_viele_schaetzwerte <-
 replicate(n_reps, flights |> 
                      select(dep_delay, origin) |> 
                      filter(origin == "EWR") |> 
                      drop_na() |> 
                      sample_n(size = sample_size) |> 
                      summarise(dep_delay = mean(dep_delay))) |> 
  as.numeric() |> 
  mean()

ewr_viele_schaetzwerte
[1] 15.035

B: “Wow, C, du bist halt schon die Statistik-Checkerin…”.

A: “Hey B, hör gefälligst mit diesen Schmeicheleien auf!”

B: “Jedenfalls ist das Ergebnis … anders als unsere!”

C: “Hier noch mal für die anderen Flughäfen. JFK:”

jfk_viele_schaetzwerte <-
 replicate(n_reps, flights |> 
                      select(dep_delay, origin) |> 
                      filter(origin == "JFK") |> 
                      drop_na() |> 
                      sample_n(size = sample_size) |> 
                      summarise(dep_delay = mean(dep_delay))) |> 
  as.numeric() |> 
  mean()

jfk_viele_schaetzwerte
[1] 16.1487

C: “Und LaGuardia:”

lga_viele_schaetzwerte <-
 replicate(n_reps, flights |> 
                      select(dep_delay, origin) |> 
                      filter(origin == "LGA") |> 
                      drop_na() |> 
                      sample_n(size = sample_size) |> 
                      summarise(dep_delay = mean(dep_delay))) |> 
  as.numeric() |> 
  mean()

lga_viele_schaetzwerte
[1] 10.7901

C: “Also, unterm Strich, LGA rules! LGA hat die geringste Verspätung im Schnitt, nach meiner Rechnung.”

lga_viele_schaetzwerte
[1] 10.7901
ewr_viele_schaetzwerte
[1] 15.035
jfk_viele_schaetzwerte
[1] 16.1487

2.5 Fazit?

A: “Okay, meine Methode war ein bisschen zu einfach. Aber hat auch am wenigsten Arbeit gemacht. Das nennt man wirtschaftlich vorgehen, nur darum geht’s im Business. Also hab ich trotzdem gewonnen!”

B: “Nope, mein Vorgehen ist in Wirklichkeit das Beste. Zumindest wenn ich von jedem Monat 100 Flüge genommen hätte, dann hätte sich sicher alles super ausgeglichen, Jahreszeiten und so. Und es wäre nicht so viel Aufwand wie die zich Tausend Stichproben, die C gezogen hat.”

C: “Kann ja alles sein, aber mein Vorgehen hat am meisten Spaß gemacht. Übrigens B, deine neue Idee müsste man mal untersuchen. Wollen wir zwei uns das mal zusammen anschauen, nur wir zwei?”