Seit ihrer Erstausstrahlung im Jahr 1963 hat sich die britische Science-Fiction-Serie Doctor Who nicht nur zu einer der am längsten laufenden Science-Fiction-Serien überhaupt entwickelt, sondern auch zu einer der bekanntesten (vgl. Kosmala 2022; Tardis Fandom 2025b). Mit über sechzig Jahren Sendezeit und zahlreichen Schauspieler:innen in der Hauptrolle des Doctors bietet die Serie viel Datenmaterial zur Analyse. Die große Anzahl an Episoden erlaubt es, langfristige Trends und Muster im Hinblick auf Erstausstrahlungen, Zuschauerzahlen und Bewertungen zu untersuchen.
Ziel der vorliegenden Arbeit ist es, ausgewählte Daten zur Serie Doctor Who im Zeitraum von 1963 bis 2019 im Hinblick auf zeitliche Entwicklungen und qualitative Merkmale zu analysieren. Besonders im Fokus stehen dabei die Zuschauerzahlen und Publikumsbewertungen (Appreciation Index) über mehrere Jahre und Ären (klassisch und modern) hinweg.
Wie wirken sich die Ären (klassisch vs. modern) und die Doctor Versionen (Darsteller) auf die Zuschauerzahlen und Bewertungen der Fernsehserie Doctor Who aus?
Der Datensatz “Doctor Who” wurde vor 2019 von dem User Jean-Michel D. auf Kaggle hochgeladen (Jean-Michel D. 2019). Der Datensatz beinhaltet Daten zu der Serie Doctor Who zwischen den Jahren 1963 - 2019, mit einer Sendepause zwischen 1989 und 2005 (vgl. Wikipedia 2025). In dieser Pause wurde 1996 ein Doctor Who Fernsehfilm ausgestrahlt, welcher ebenfalls miteinbezogen wird. Diese Daten sind in vier Dateien unterteilt, hier wird nur die Datei dwguide.csv genutzt. Um die Daten dieser Datei mit den Populationszahlen Großbritanniens zu vergleichen, wird der Datensatz “Großbritannien: Gesamtbevölkerung von 1950 bis 2023 und Prognosen bis 2050” von Statista genutzt (Statista 2023).
Der Datensatz Doctor Who dwguides umfasst 13 Variablen, welche im Folgenden kurz erläutert werden:
Zur Bearbeitung wird der Datensatz in doctorwho umbenannt.
Der Datensatz “Großbritannien: Gesamtbevölkerung von 1950 bis 2023 und Prognosen bis 2050” beinhaltet zwei Variablen, das Jahr (kardinal) und die Bevölkerungszahl (kardinal) in Millionen.
#Laden der Bibliotheken
library(readr)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ purrr 1.0.2
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
library(ggplot2)
library(lubridate)
library(jsonlite)
##
## Attaching package: 'jsonlite'
##
## The following object is masked from 'package:purrr':
##
## flatten
library(purrr)
# Library für Excel-Dateien
#install.packages("readxl")
library(readxl)
#install.packages("zoo")
library(zoo)
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
# Doctor Who Datensatz: Laden des Datensatz aus Archive-Datei, Datei dwguide
doctorwho <- read_csv("archive/dwguide.csv",
col_types = cols(episodenbr = col_double(),
broadcasthour = col_character(),
duration = col_time(format = "%H:%M:%S"),
share = col_character()))
# Laden des Datensatzes zur Population von GB
bevoelkerung <- read_delim(
"statistic_id19319_gesamtbevoelkerung-in-grossbritannien-bis-2050.csv",
delim = ";",
escape_double = FALSE,
col_names = c("Jahr", "Bevoelkerung"), # eigene Spaltennamen setzen, da es in der csv-Datei keine gibt
skip = 3, # ersten drei Spalten werden entfernt, da diese keine relevanten Daten beinhalten
trim_ws = TRUE,
show_col_types = FALSE,
locale = locale(decimal_mark = ",") # Sonst wird das Komma entfernt und aus 53,67 werden 5367
# (Chatgpt Chat-Protokoll)
)
# Entfernen nicht relevanter Werte aus doctorwho
doctorwho <- doctorwho %>%
select(-episodenbr, -share, -summary, -duration, -chart, -crew, -title)
# M aus der Varaible views entfernen, damit diese später als Zahl ausgelesen wird
doctorwho$views <- gsub("m", "", doctorwho$views) # m (für Millionen) aus views entfernen
doctorwho$views <- as.numeric(doctorwho$views) # bestehende Werte in numerisch umwandeln
# Farbcode für die Grafiken vergeben
tardis <- "#003865" # (myperfectcolor)
tardis_light <- "#0092ff" # (Color Hex)
Zunächst werden Kennzahlen über den Datensatz doctorwho ermittelt. Hierzu wird die Funktion summary genutzt.
#Kennzahlen für doctorwho
summary(doctorwho)
## weekday broadcastdate broadcasthour views
## Length:851 Length:851 Length:851 Min. : 3.100
## Class :character Class :character Class :character 1st Qu.: 6.685
## Mode :character Mode :character Mode :character Median : 7.700
## Mean : 7.932
## 3rd Qu.: 9.100
## Max. :16.100
##
## AI cast
## Min. :30.00 Length:851
## 1st Qu.:55.00 Class :character
## Median :61.00 Mode :character
## Mean :64.44
## 3rd Qu.:75.00
## Max. :91.00
## NA's :225
Dies zeigt unter anderem den Mittelwert, Median, Minimum und Maximum an. So kann man beispielsweise über den Maximal- und Minimalwert sehen, dass der niedrigste Appreciation Index bei 30 und der höchste bei 91 liegt.
Da die Daten im Doctorwho Datensatz sich auf eine Zeitspanne von 1963 bis 2019 beziehen, ist es sinnvoll, die zeitliche Entwicklung genauer zu betrachten.
Zunächst wird für die Variable broadcastdate das Format angepasst, damit der Inhalt (Bsp. 16 Marc 1963) als Tag, Monat, Jahr erkannt wird (vgl. tjohannsen 2022). Danach kann der Monat und Tag aus ebendieser Variable herausgefiltert werden.
#Variable broadcastdate anpassen, da Daten so angegeben sind 16 March 1963
doctorwho$broadcastdate <- dmy(doctorwho$broadcastdate)
# Episodenanzahl pro Monat oder Tag
doctorwho$month <- month(doctorwho$broadcastdate, label = TRUE) # Monat aus Broadcastdate filtern
doctorwho$weekday <- wday(doctorwho$broadcastdate, label = TRUE) # Tag aus Broadcastdate filtern
Um sich die Episodenanzahl pro Monat anzusehen, wird der Monat gezählt (vgl. Rdocumentation). Da jede Episode im Datensatz eine Spalte einnimmt, kann so die Anzahl von Episoden pro Monat errechnet werden. Diese Zählung wird als Säulendiagramm (vgl. Alby; Holtz) dargestellt.
# Nach Monat
month_counts <- doctorwho %>% #Nach Monat zählen
count(month)
# Darstellung als Säulendiagramm
ggplot(month_counts, aes(x = month, y = n)) +
geom_col(fill = tardis) +
labs(title = "Anzahl der Episoden pro Monat",
x = "Monat", y = "Anzahl Episoden") +
theme_minimal()
Hier lässt sich erkennen, dass besonders viele Episoden im Januar ausgestrahlt wurden, und die Anzahl in den Folgemonaten abnimmt. Besonders die Monate Juni und August weisen vergleichsweise sehr niedrige Zahlen auf. Dieser Unterschied könnte bspw. aufgrund einer Sommerpause im Programm entstehen, wodurch weniger Erstausstrahlungen und mehr Wiederholungen ausgestrahlt werden.
Für die Episodenzahl pro Wochentag wird ein ähnlicher Code genutzt, mit dem Unterschied, dass hier die Wochentage gezählt werden.
# Nach Wochentag
weekday_counts <- doctorwho %>% #Nach Wochentag zählen
count(weekday)
# Darstellung als Balkendiagramm
ggplot(weekday_counts, aes(x = weekday, y = n)) +
geom_col(fill = tardis) +
labs(title = "Anzahl der Episoden pro Wochentag",
x = "Wochentag", y = "Anzahl Episoden") +
theme_minimal()
Der bei weitem am höchste Wert ist der Samstag. Die Werte der sechs anderen Wochentage sind nahezu identisch. Überwiegend wurden neue Folgen so am Samstag ausgestrahlt.
Um nun Monate und Wochentage miteinander in Verbindung zu setzten, werden beide zusammen gezählt und als Heatmap (vgl. Alby; Holtz) dargestellt.
# Nach Wochentag und Monat
# Zählen der Episoden nach Wochentag und Monat
counts <- doctorwho %>%
count(weekday, month)
# Als Heatmap darstellen
ggplot(counts, aes(x = weekday, y = month, fill = n)) +
geom_tile() +
labs(title = "Anzahl der Episoden nach Wochentag und Monat",
x = "Wochentag", y = "Monat", fill = "Anzahl") +
theme_minimal()
Auch hier lässt sich die zuvor genannte Sommerpause wieder erkennen, auch der Hauptausstrahlungstag ist klar erkennbar. Zusätzlich wird deutlich, dass im Monat Januar, April und Mai am Samstag die meisten Folgen erstmals ausgestrahlt wurden.
Zunächst wird aus der Variable broadcastdate, das Jahr herausgefiltert, damit die Zuschauerzahlen hiernach sortiert werden können.
# Zeitliche Entwicklung der Zuschauer pro Jahr
doctorwho$year <- as.numeric(format(doctorwho$broadcastdate, "%Y")) # Jahr herausfiltern, damit später hiernach sortiert werden kann
Mit dem Jahr (year) und der Summierung der Zuschauerzahlen (views) wird der Datensatz views_pro_jahr erstellt und als Säulendiagramm dargestellt.
# Vektor aller Jahre von 1963 bis 2019, damit auch Jahre ohne Folgen (Pausen) mit einbezogen werden
alle_jahre <- data.frame(year = 1963:2019)
views_pro_jahr <- doctorwho %>%
filter(!is.na(year)) %>% # NA nicht miteinbeziehen
group_by(year) %>%
summarise(views_summe = sum(views, na.rm = TRUE)) %>% # views pro Jahr summieren
right_join(alle_jahre, by = "year") %>% # Alle Jahre behalten, auch die ohne Daten
replace_na(list(views_summe = 0)) %>% # NA ist gleich der Wert 0
# (Chatgpt Chat-Protokoll)
arrange(year) #aufsteigend nach Jahr sortieren
# Grafische Darstellung als Säulendiagramm
ggplot(views_pro_jahr, aes(x = factor(year), y = views_summe)) +
geom_col(fill = tardis) +
labs(title = "Zuschauerzahlen pro Jahr",
x = "Jahr", y = "Insgesamte Zuschauerzahlen in Millionen") + # Beschriftung
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) # (Chatgpt Chat-Protokoll)
Hier kann man erkennen, dass die Jahre vor den 2000ern weitaus mehr Zuschauer hatten als die darauffolgenden Jahre. Besonders niedrig liegen die Werte bei den Jahren 1963, 1996, 2016 und 2019. Auch die Sendepause von 1989 bis 2005, mit der Ausnahme des Fernsehfilms im Jahr 1996, ist deutlich erkennbar.
Um zu überprüfen, ob die Anzahl der Folgen pro Jahr die Zuschauerzahlen pro Jahr beeinflusst, wird der Datensatz views_pro_episode_pro_jahr erstellt. Hier werden die views pro Jahr summiert und durch die Anzahl von Folgen pro Jahr geteilt. Dies wird als Säulendiagramm dargestellt.
#Zeitliche Entwicklung der Zuschauer pro Jahr, Folgen pro Jahr werden mit einbezogen
views_pro_episode_pro_jahr <- doctorwho %>%
filter(!is.na(year)) %>%
group_by(year) %>%
summarise(
views_summe = sum(views, na.rm = TRUE), # views summieren
anzahl_folgen = n(), #Folgen zählen
durchschnitt_views = views_summe / anzahl_folgen
) %>%
right_join(alle_jahre, by = "year") %>% # Alle Jahre behalten, auch die ohne Daten
replace_na(list(views_summe = 0)) %>% # NA ist gleich der Wert 0
arrange(year) # nach Jahr sortieren
# Darstellung als Säulendiagramm
ggplot(views_pro_episode_pro_jahr, aes(x = factor(year), y = durchschnitt_views)) +
geom_col(fill = tardis) +
labs(title = "Durchschnittliche Zuschauer pro Jahr",
x = "Jahr", y = "Durchschnittliche Zuschauer (in Millionen)") + #Beschriftung
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
## Warning: Removed 14 rows containing missing values or values outside the scale range
## (`geom_col()`).
In diesem Diagramm liegen die Werte im Vergleich weitaus dichter beieinander. Es ist nur ein geringer Unterschied zwischen den Jahren vor 2000 und den danach zuerkennen. Dennoch gibt es ein paar Jahre, die auffallend niedrige Werte aufweisen, so zum Beispiel 1986, 1987 und 1989. Der Fernsehfilm im Jahr 1996 hat wiederum im Durchschnitt eine höhere Einschaltquote, da dieser die einzige Ausstrahlung des Jahres war (Wikipedia 2025).
Es sollte jedoch erwähnt werden, dass auch der Wandel in der Medienlandschaft und der Verfall des linearen Fernsehens einen Einfluss auf die Zuschauerzahlen hat, so steigen immer mehr Menschen vom traditionellen Fernsehen auf Streamingdienste um (vgl. BARB 2025; Maione 2024; Simon-Kucher & Partners 2025). Der Sender BBC plant bereits einen voraussichtlichen Ausstieg aus dem klassischen Fernsehen (vgl. Horzenek 2025). Diese Veränderungen betreffen insbesondere die letzten Jahre und Werte des Datensatzes, genauere Aussagen über diesen Einfluss können ohne weitere Daten jedoch nicht getroffen werden.
Der Appreciation Index (AI) ist eine statistische Darstellung des Vergnügens und der Wertschätzung einer TV-Ausstrahlung. Der Sender BBC nutzt diese Art der Bewertung für die Serie Doctor Who (vgl. BBC 2013). Um den durchschnittlichen Appreciation Index pro Jahr zu ermitteln, wird dieser zunächst pro Jahr summiert, durch die Anzahl von Folgen geteilt und dann in einem Säulendiagramm dargestellt. Für den Datensatz bewertung_pro_jahr, werden die Sendepausen ausgelassen, da hier kein Appreciation Index ermittelt werden konnte.
# Bewertung über die Jahre
bewertung_pro_jahr <- doctorwho %>%
filter(!is.na(year)) %>% # NA Werte herausfiltern
group_by(year) %>%
summarise(
bewertung_summe = sum(AI, na.rm = TRUE), # AI summieren
anzahl_folgen = n(), #Folgen zählen
durchschnitt_bewertung = bewertung_summe / anzahl_folgen
) %>%
arrange(year) # nach Jahr sortieren
# Darstellung als Säulendiagramm
ggplot(bewertung_pro_jahr, aes(x = factor(year), y = durchschnitt_bewertung)) +
geom_col(fill = tardis) +
labs(title = "Durchschnittlicher Appreciation Index pro Jahr",
x = "Jahr", y = "Appreciation Index") + #Beschriftung
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Hier lässt sich erkennen, dass der Appreciation Index zwischen den Jahren 1973 bis 1981 am niedrigsten lag, und dass dieser ab dem Jahr 1983 leicht anstieg. Und ab dem Jahr 2005 nochmal deutlich weiter anstieg. Auch gibt es einige Jahre ganz ohne Wert, dies betrifft 1971, 1972 und 1982. Der Anstieg des AI ab 1983 könnte damit zusammenhängen, dass der Sender BBC die Datensammlung ab 1981 nicht mehr selbst durchgeführt hat, sondern das Broadcasters’ Audience Research Board (BARB) dies übernommen hat (vgl. BBC 2013; Tardis Fandom 2025a). Auch die Veränderung ab 2005 ist durch eine Veränderung der Methode der Datensammlung betroffen. Seit diesem Jahr werden zusätzlich zu BARB auch die Daten von der Organisation GfK NOP ausgewertet (ebd.). Erwähnenwert ist auch die Veränderung der Befragungsmethode. Bis 2012 wurde dies zunächst persönlich bei Zuschauer:innen erfragt, dann folgten schriftliche und Telefonbefragungen. Und seit 2012 werden die Daten über ein online Portal gesammelt (vgl. Tardis Fandom 2025a).
Die durchschnittliche Zuschauerzahl und die durchschnittliche Bewertung wird mit einem Korrelationstest überprüft und als Scatterplot dargestellt.
# Vergleich durchschnittliche Bewertung und Zuschauerzahlen
#Pro Jahr
vergleich_views_bewertung <- left_join(
views_pro_episode_pro_jahr %>% select(year, durchschnitt_views),
bewertung_pro_jahr %>% select(year, durchschnitt_bewertung),
by = "year"
)
#Korrelations Test
cor.test(vergleich_views_bewertung$durchschnitt_views,vergleich_views_bewertung$durchschnitt_bewertung)
##
## Pearson's product-moment correlation
##
## data: vergleich_views_bewertung$durchschnitt_views and vergleich_views_bewertung$durchschnitt_bewertung
## t = -1.7808, df = 41, p-value = 0.08235
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.5259622 0.0352338
## sample estimates:
## cor
## -0.2679455
# Darstellung als Scatterplot
plot(vergleich_views_bewertung$durchschnitt_views,vergleich_views_bewertung$durchschnitt_bewertung, col = tardis_light)
Da der p-Wert mit 0.08 über 0.05 liegt, lässt sich keine Signifikanz erkennen. Auch der Korrelationskoeffizient nach Pearson zeigt mit -0.2679455 eine schwache negative Korrelation (vgl. STHDA; Turney 2022; Walther 2024b). Es lässt sich ein leichter negativ Trend erkennen, wenn die Bewertung steigt, sinkt die Zuschauerzahl, aber der Zusammenhang ist nicht signifikant.
Durch den Datensatz zur Population Großbritanniens ergibt sich die Möglichkeit, die Zuschauerzahlen pro Jahr mit der Population zu vergleichen. Da nur Daten zwischen den Jahren 1963 bis 2019 relevant sind, werden alle anderen Jahre aus dem Datensatz entfernt.
# Population Großbritanniens über die Jahre
# Jahre vor und nach dem Doctorwho Datensatz entfernen
bevoelkerung <- bevoelkerung %>%
filter(Jahr >= 1963 & Jahr <= 2019)
# Kennzahlen für Bevoelkerung
summary(bevoelkerung)
## Jahr Bevoelkerung
## Min. :1965 Min. :54.36
## 1st Qu.:1978 1st Qu.:56.25
## Median :1990 Median :57.37
## Mean :1990 Mean :58.43
## 3rd Qu.:2002 3rd Qu.:59.83
## Max. :2015 Max. :65.38
Views_bevoelkerung wird erstellt, um sowohl die durchschnittlichen Zuschauerzahlen pro Jahr und die Bevölkerungszahlen in einem Datensatz zu vereinen. Das Ergebnis wird als Line Chart (vgl. Alby; Holtz) dargestellt.
#Vergleich Population und Zuschauerzahlen pro Jahr
# Umbenennen, damit beide Spalten (year & Jahr) gleich heißen
views_pro_episode_pro_jahr <- views_pro_episode_pro_jahr %>%
rename(Jahr = year)
# Datensätze zusammenführen
views_bevoelkerung <- left_join(views_pro_episode_pro_jahr, bevoelkerung, by = "Jahr") # Left Join verhindert Verlust von Daten
# Daten zur Bevölkerung interpolieren
views_bevoelkerung <- views_bevoelkerung %>%
arrange(Jahr) %>%
mutate(Bevoelkerung = zoo::na.approx(Bevoelkerung, Jahr, rule = 2))
# Darstellung als Line Chart
ggplot(views_bevoelkerung, aes(x = Jahr)) +
geom_line(aes(y = durchschnitt_views, color = "Zuschauer")) +
geom_line(aes(y = Bevoelkerung, color = "Bevölkerung")) +
scale_color_manual(values = c("Zuschauer" = tardis, "Bevölkerung" = tardis_light)) +
labs(
title = "Durschnittliche Doctor Who Zuschauer vs. Bevölkerung in Großbritannien",
x = "Jahr",
y = "Werte (in Millionen)",
color = "Legende" ) +
theme_minimal()
Die Line Chart zeigt den zeitlichen Verlauf der durchschnittlichen Zuschauerzahlen pro Jahr im Vergleich zur Gesamtbevölkerung Großbritanniens. Hier wird deutlich, wie sich die Reichweite der Serie relativ zur Populationsentwicklung über die Jahre verändert hat. Während die Bevölkerung stetig zunimmt, schwanken die Zuschauerzahlen teils stark. Die Sendepause 1989 bis 2005 ist klar erkennbar, aber auch ein Anstieg der Zuschauer nach dieser ist sichtbar. Ein deutlicher Zusammenhang zwischen den durchschnittlichen Zuschauerzahlen pro Jahr und den Bevölkerungszahlen Großbritanniens ist aus der Grafik nicht zu erkennen.
In der TV-Serie Doctor Who wird der Hauptcharakter Doctor Who über die Jahre und Jahrzehnte von verschiedenen Schauspieler:innen dargestellt. Jede:r Schauspieler:in ist eine eigenen Doctor Who Version. Im Zeitraum 1963 bis 2019 gab es so 13 Doctor Who Versionen (Wikipedia 2025).
Aus der Variable Cast werden die Doctor Versionen extrahiert. Hier sind die Daten wie folgt angegeben: “[{”“role”“:”“The Doctor”“,”“name”“:”“Peter Davison”“}
Um Irregularitäten in der Betitelung der Doctor Rolle, also bspw. Doctor Who, Dr. Who, The Doctor usw. trotzdem mit einzubeziehen, wird eine JSON Funktion (vgl. Chatgpt Chat-Protokoll; Sonigara 2024; Smeet002 2025; tjohannsen 2023) erstellt.
#Doctor Who Versionen
#Doctor Version aus cast extrahieren
extract_doctor <- function(cast_json) { #Funktion mit der Variable cast_json erstellt
if (is.na(cast_json) || cast_json == "") return(NA) #Leere Felder werden als NA ausgelesen
parsed <- tryCatch(fromJSON(cast_json), error = function(e) return(NULL)) #Versuch Text mit fromJSON() in Datenstruktur umzuwandeln. Bei einem Error NA zurückgeben
if (is.null(parsed) || !"role" %in% names(parsed)) return(NA) #Wenn role nicht angegeben ist, wird NA zurückgegeben
# Alle gängigen Varianten von Doctor z.B. Dr. Who, Doctor Who, The Doctor, Doctor
pattern <- "\\b(dr\\.?\\s*who|doctor(\\s*who)?|the doctor)\\b"
# Alle Zeilen mit passender Rolle
doctor_entry <- parsed[grepl(pattern, parsed$role, ignore.case = TRUE), ]
# Nur Schauspielername zurückgeben
if (nrow(doctor_entry) > 0 && "name" %in% names(doctor_entry)) {
return(doctor_entry$name[1]) #erster Name wird ausgegeben
}
return(NA) #falls nichts zutrifft, wird NA zurückgegeben
}
doctorwho <- doctorwho %>% # auf Datensatz anwenden
mutate(doctor_actor = map_chr(cast, extract_doctor))
Nach der Extraktion wird die durchschnittliche Zuschauerzahl pro Schauspieler:in errechnet und als Balkendiagramm (vgl. Alby; Holtz) dargestellt.
# Zuschauerzahlen pro Doctor Version mit doctor_actor
views_pro_doctor <- doctorwho %>%
filter(doctor_actor != "Dr. Who") %>%
group_by(doctor_actor) %>%
summarise(
folgen = n(),
views_summe = sum(views, na.rm = TRUE),
views_durchschnitt = mean(views, na.rm = TRUE)
) %>%
arrange(desc(views_summe))
#Darstellung als Balkendiagramm
ggplot(views_pro_doctor, aes(x = reorder(doctor_actor, views_durchschnitt), y = views_durchschnitt)) +
geom_col(fill = tardis) +
coord_flip() +
labs(title = "Durchschnittliche Zuschauerzahlen pro Doctor",
x = "Doctor Schauspieler*in", y = "Durchschnittliche Zuschauer (in Mio)") +
theme_minimal()
Da die Schauspieler:innen absteigend sortiert sind, lässt sich direkt erkennen, dass Tom Baker die meisten Zuschauer:innen hatte und, dass Sylvester McCoy die wenigsten aufweist.
Als Nächstes wird der durchschnittliche Appreciation Index für jede Doctor Who Version betrachtet. Hierfür wird der Mittelwert der Bewertungen (Appreciation Index), die Anzahl der Folgen und der Datensatz doctor_actor genutzt. Das Ergebnis wird als Balkendiagramm dargestellt.
# Bewertung per Doctor
bewertung_pro_doctor <- doctorwho %>%
filter(!is.na(AI), !is.na(doctor_actor)) %>% # Keine NA Werte miteinbeziehen
filter(doctor_actor != "Dr. Who") %>%
group_by(doctor_actor) %>%
summarise(
folgen = n(),
durchschnitt_bewertung = mean(AI, na.rm = TRUE) #Mittelwert Bewertungen
) %>%
arrange(desc(durchschnitt_bewertung)) # Nach Bewertung sortieren
#Darstellung durchschnittliche Bewertung pro Doctor als Balkendiagram
ggplot(bewertung_pro_doctor, aes(x = reorder(doctor_actor, durchschnitt_bewertung), y = durchschnitt_bewertung)) +
geom_col(fill = tardis) +
coord_flip() +
labs(
title = "Durchschnittlicher Appreciation Index pro Doctor",
x = "Doctor Schauspieler*in",
y = "Durchschnittliche Bewertung (AI)"
) +
theme_minimal()
Da die einzelnen Werte hier absteigend sortiert wurde, kann man schnell erkennen, dass die Folgen, in denen der Schauspieler David Tennant die Rolle des Doctors übernahm, die durchschnittlich höchste Bewertung im Appreciation Index erhalten haben. Im Gegensatz dazu wurden die Folgen mit Patrick Thoughton am schlechtesten bewertet.
Der Ausstrahlungszeitraum von Doctor Who weist eine Pause von neun Jahren auf, welche die Sendung in zwei Ären eingeteilt. Hier werden diese als klassische Ära (1963-1996) und moderne Ära (ab 2005) betitelt.
Der Datensatz aera wird erstellt, um die Jahre (year) entsprechend in Klassisch und Modern einzuteilen.
#Vergeleich Ära Alt (Klassisch) vs Neu (Modern)
doctorwho <- doctorwho %>% #betrifft den Datensatz Doctor Who
mutate(aera = case_when( #Jahre (year) in Ära aufteilen
year >= 1963 & year <= 1996 ~ "Klassisch", #Bennenung Ära 1
year >= 2005 & year <= 2019 ~ "Modern", #Benennung Ära 2
TRUE ~ NA_character_
)) %>%
filter(!is.na(aera)) # NA rausfiltern
Um die Zuschauerzahlen zwischen den Ären zu vergleichen, wird der Datensatz vergleich_views erstellt. Hierfür wird die Anzahl der Folgen mit dem Mittelwert der Zuschauerzahlen (views) pro Ära verrechnet. Dies wird als Balkendiagramm dargestellt.
#Vergeleich Ären mit den Zuschauerzahlen
vergleich_views <- doctorwho %>% #Neuer Datensatz für den Vergeleich der Zuschauerzahlen
group_by(aera) %>%
summarise(
folgen = n(), #Anzahl der Folgen miteinbeziehen
durchschnitt_views = mean(views, na.rm = TRUE), # Mittelwert der Zuschauerzahlen
)
#Darstellung als Säulendiagramm
ggplot(vergleich_views, aes(x = factor(aera), y = durchschnitt_views)) +
geom_col(fill = tardis) + # Farbe grau
labs(title = "Durchschnittliche Zuschauerzahlen pro Ära",
x = "Ära", y = "Zuschauerzahlen (in Millionen)") + #Beschriftung
theme_minimal()
Dieses Diagramm lässt erkennen, dass die klassische Ära im Durchschnitt mehr Zuschauer hatte als die moderne Ära, obwohl beide sehr dicht beieinander liegen.
Für den Vergleich der Bewertung pro Ära wird ein Boxplot (vgl. Alby; DATAtab Team 2025; Holtz) erstellt.
#Vergleich der Bewertungen (AI) pro Ära
#Darstellung als Boxplot
ggplot(doctorwho, aes(x = aera, y = AI)) +
geom_boxplot(fill = tardis_light) +
labs(title = "Verteilung des Appreciation Index nach Ära", x = "Ära", y = "Appreciation Index")
## Warning: Removed 225 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
Der Median der modernen Ära liegt weitaus höher als der Median der klassischen Ära. Auch die Min und Max Antennen liegen bei der moderne Ära höher. Die moderne Ära wurde demnach mit dem AI positiver bewertet als die klassische Ära.
Um die durchschnittliche Bewertung des Appreciation Index der jeweiligen Ära zu vergleichen, wird der Datensatz vergleich_bewertung erstellt. Hierfür wird die Anzahl der Folgen mit dem Mittelwert der Bewertung pro Ära verrechnet. Das Ganze wird als Balkendiagramm dargestellt.
#Vergeleich der durchschnittlichen Bewertungen
vergleich_bewertung <- doctorwho %>% #Neue Variable für den Vergeleich der Bewertungen (AI)
group_by(aera) %>%
summarise(
folgen = n(), #Anzahl der Folgen miteinbeziehen
durchschnitt_AI = mean(AI, na.rm = TRUE) # Mittelwert der Bewertungen
)
#Darstellung als Säulendiagramm
ggplot(vergleich_bewertung, aes(x = factor(aera), y = durchschnitt_AI)) +
geom_col(fill = tardis) + # Farbe grau
labs(title = "Durchschnittlicher Appreciation Index pro Ära",
x = "Ära", y = "Appreciation Index") + #Beschriftung
theme_minimal()
Auch hier lässt sich erkennen, dass die durchschnittliche Bewertung des Appreciation Index bei der modernen Ära weitaus höher ist, als die der klassischen Ära.
H1: Die durchschnittliche Bewertung (AI) in der modernen Ära ist signifikant höher als in der klassischen Ära.
# T-Test Appreciation Index pro Ära
doctorwho %>%
filter(!is.na(AI), !is.na(aera)) %>%
t.test(AI ~ aera, data = .)
##
## Welch Two Sample t-test
##
## data: AI by aera
## t = -66.916, df = 606.77, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Klassisch and group Modern is not equal to 0
## 95 percent confidence interval:
## -27.55079 -25.97976
## sample estimates:
## mean in group Klassisch mean in group Modern
## 57.80892 84.57419
Hypothese 1 wird über einen Welch Two Sample T-Test (vgl. StatistikGuru; Walther 2024c) überprüft. Dieser Test ist geeignet, da er keine Varianzgleichheit voraussetzt und robust gegenüber unterschiedlich großen Gruppen ist.
Die Ergebnisse zeigen einen hoch signifikanten Unterschied der Mittelwerte: t(606.77) = -66.92, p < 2.2e-16 oder 0.00000000000000022
Die durchschnittliche Bewertung (Mittelwert) in der klassischen Ära liegt bei 57.81, während er in der modernen Ära 84.57 liegt. Das 95%-Konfidenzintervall (vgl. Bevans 2020b) für die Differenz liegt zwischen -27.55 und -25.98, somit kann man davon ausgehen, dass der Unterschied im Mittelwert zwischen diesen beiden Werten liegt. Dies bedeutet, dass die AI-Werte der modernen Episoden im Durchschnitt um etwa 26 Punkte höher als die klassischen Episoden liegen.
Daraus lässt sich schließen, dass die Nullhypothese verworfen werden kann. Demnach, kann die Hypothese 1 angenommen werden. Also ist die durchschnittliche Bewertung in der modernen Ära signifikant höher als in der klassischen Ära.
H2: Es gibt signifikante Unterschiede in den Bewertungen (AI) je Doctor.
Hypothese 2 kann über eine einfaktorielle Varianzanalyse oder ANOVA überprüft werden (vgl. Bevans 2020a; Smigierski 2018; StatistikProfis 2023; Walther 2024a). Hierbei werden drei oder mehr Mittelwerte überprüft. Eine Bedingung für diese Analyse ist eine Normalverteilung (ebd.).
Um zu überprüfen, ob dieses vorliegt, werden ein Histogramm (vgl. Alby; Holtz; Statistik am PC 2021; Walther 2025b) und zwei Q-Q-Diagramme (vgl. Walther 2022b) erstellt.
# Überprüfen, ob eine Normalverteilung vorliegt mit einem Histogramm
ggplot(doctorwho, aes(x = AI)) +
geom_histogram(aes (y = ..density..), binwidth = 2, fill = tardis_light, color = "white") +
labs(title = "Histogramm des Appreciation Index (AI)", x = "AI", y = "Häufigkeit") +
stat_function(fun = dnorm, args = list(mean = mean(doctorwho$AI, na.rm = TRUE), sd = sd (doctorwho$AI, na.rm = TRUE))) + # Normalverteilung einzeichnen
theme_minimal()
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Removed 225 rows containing non-finite outside the scale range
## (`stat_bin()`).
# Überprüfung, ob eine Normalverteilung vorliegt mit einem Q-Q Plot
qqnorm(doctorwho$AI)
qqline(doctorwho$AI)
# Überprüfung der Normalverteilung der Residuen
H2_AOV <- aov(AI ~ doctor_actor, data = doctorwho) # ANOVA
H2_residuen <- residuals(H2_AOV) #Residuen (vgl. Walther 2022a)
#Darstellung als Q-Q-Diagramm
qqnorm(H2_residuen)
qqline(H2_residuen, col = tardis_light)
Das Histogramm und die Q-Q-Diagramme zeigen eine Verteilung, die dicht
genug an einer Normalverteilung liegt, dass mit einer einfaktoriellen
Varianzanalyse weitergearbeitet wird.
# Überprüfung der Hypothese mit ANOVA
summary(H2_AOV)
## Df Sum Sq Mean Sq F value Pr(>F)
## doctor_actor 15 98557 6570 388.7 <2e-16 ***
## Residuals 610 10311 17
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 225 observations deleted due to missingness
Das Ergebnis der ANOVA zeigt, dass der Einfluss der Doctor Schauspieler:in (doctor actor) auf die Bewertung (AI) statistisch signifikant ist, F value Pr(>F)388.7 < 2.2e-16 (vgl. Stack Exchange 2021). Dies bedeutet, dass sich die Bewertungen signifikant zwischen mindestens zwei Schauspieler:innen unterscheiden. Somit kann die Hypothese 2 angenommen werden.
#Grafische Darstellung als Boxplot
doctorwho %>%
filter(doctor_actor != "Dr. Who") %>%
ggplot(aes(x = doctor_actor, y = AI, fill = doctor_actor)) +
geom_boxplot() +
labs(
title = "Verteilung des AI pro Doctor",
x = "Doctor Schauspieler*in",
y = "Bewertung (AI)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Removed 225 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
Um die Bewertungen pro Doctor grafisch darzustellen, wird ein Boxplot verwendet. Die Darstellungsform verdeutlicht klare Unterschiede in der Verteilung der AI-Werte je Doctor. So liegt der Median von David Tennant, Matt Smith und Peter Capaldi beispielsweise sehr hoch, während der Median von Patrick Troughton sehr niedrig liegt.
Um die Unterschiede genauer zu bestimmen, wird ein Post-Hoc-Test nach Tukey (vgl. Jyotijb23 2024; Smigierski 2018) durchgeführt. In diesem Test werden alle möglichen Doctor Versionen in Paaren miteinander verglichen. Der diff-Wert zeigt die Differenz zwischen den Mittelwerten, und der p adj -Wert gibt die Signifikanz an. Für eine bessere Übersicht wird das Ergebnis in einer Tabelle dargestellt.
# Durchführugn Post-Hoc-Test
tukey_H2 <- TukeyHSD(H2_AOV) # mit den Werten aus ANOVA
#print(tukey_H2)
# In Dataframe umwandeln um p-Werte zu sehen:
tukey_dataframe <- as.data.frame(tukey_H2$doctor_actor)
tukey_dataframe$comparison <- rownames(tukey_dataframe)
tukey_dataframe$`p adj` <- round(as.numeric(tukey_dataframe$`p adj`), 4) # p-Werte als Dezimalzahl angeben und runden (vgl. OpenAI Chatprotokoll; Wikibooks)
tukey_dataframe
Der Test zeigt signifikante Unterschiede in der Bewertung einzelner Schauspieler:innen auf. Besonders deutlich sind die negativen Abweichungen von Patrick Troughton, z.B. gegenüber Matt Smith: diff = -33.76185771, p adj = 3.649013e-10 ~ 0.0000, sowie die positiven Differenzen bei David Tennant im Vergleich zu Colin Baker diff = 19.78789894, p adj = 3.649013e-10 ~ 0.000. Einige Unterschiede, zum Beispiel zwischen David Tennant und Christopher Eccleston diff = 4.08837971, p adj = 1.096160e-01 ~ 0.1096, erwiesen sich hingegen als nicht signifikant.
Als zweites Testverfahren wird der Kruskal-Wallis-Test verwendet (Walther 2025a). Auch hier wird überprüft, ob sich die Bewertungen zwischen den Doctor Schauspieler:innen signifikant unterscheiden.
# Kruskal-Wallis-Test
kruskal.test(doctorwho$AI~doctorwho$doctor_actor)
##
## Kruskal-Wallis rank sum test
##
## data: doctorwho$AI by doctorwho$doctor_actor
## Kruskal-Wallis chi-squared = 525.38, df = 15, p-value < 2.2e-16
H 2 = 525.38 p < 2.2e-16 ~ 0.000.
Das Ergebnis weist darauf hin, dass mindestens eine Gruppe sich signifikant von mindestens einer anderen unterscheidet.
Die Hypothese 2 wird angenommen, da es signifikante Unterschiede in den Bewertungen je Doctor gibt.
Ziel dieser Arbeit war es, zu untersuchen, wie sich die Ären der Serie Doctor Who und die verschiedenen Doctor Schauspieler:innen auf die Zuschauerzahlen und Bewertungen ausgewirkt haben. Die Ergebnisse zeigen, dass sich beide Faktoren signifikant auf die Bewertung der Zuschauer bei der Erstausstrahlung auswirken.
Die durchschnittliche Zuschauerbewertung der modernen Ära ist deutlich höher als die der klassischen Ära. Auch zwischen den Doctor Versionen gibt es hohe Bewertungsunterschiede. Die ANOVA und der Kruskal-Wallis-Test belegen, dass diese Unterschiede statistisch signifikant sind. In Bezug auf die Zuschauerzahlen pro Ära lasst sich jedoch kein klarer Trend erkennen und auch ein Zusammenhang zwischen Zuschauerzahlen und Bewertungen konnte nicht deutlich festgestellt werden.
Um aktueller Werte und Prognosen, besonders in Bezug auf Wandel der Medienlandschaft und den möglichen zukünftigen Umzug des Senders BBC auf einen Streamingdienst, zu erhalten, müssten aktueller Datensätze genutzt werden.
Alby, Tom (o. J.): Data Visualization Overview v1.4, [online] https://tom.alby.de/wp-content/uploads/2025/01/Data-Visualization-Overview-v1.4.pdf [28.06.2025].
BARB (2025): Number of households subscribing to video on-demand services in the United Kingdom (UK) from 3rd quarter 2014 to 1st quarter 2025, [online] https://www.statista.com/statistics/895590/households-with-a-subscription-service-in-the-uk/ [29.06.2025].
BBC (2013): BBC Audience Information Context & Glossary (Document 2), [online] https://downloads.bbc.co.uk/aboutthebbc/insidethebbc/howwework/accountability/pdf/context_document_january_march_2013.pdf [28.06.2025].
Bevans, Rebecca (2020): ANOVA in R | A Complete Step-by-Step Guide with Examples, [online] https://www.scribbr.com/statistics/anova-in-r/ [29.06.2025].
Bevans, Rebecca (2020): Understanding Confidence Intervals | Easy Examples & Formulas, [online] https://www.scribbr.com/statistics/confidence-interval/ [28.06.2025].
Color Hex (o. J.): Tardis Blues Color Palette, [online] https://www.color-hex.com/color-palette/13067 [28.06.2025].
D., Jean-Michel (2019): Doctor Who, [online] https://www.kaggle.com/datasets/jeanmidev/doctor-who [28.06.2025].
DATAtab Team (2025): Boxplot, [online] https://datatab.de/tutorial/boxplot [28.06.2025].
Horzenek, Marcel (2025): Britische TV-Sender wollen das klassische Fernsehen abschaffen, [online] https://www.t-online.de/digital/aktuelles/id_100741864/grossbritannien-bbc-will-klassisches-fernsehen-bis-2034-abschaffen.html [29.06.2025].
Jyotijb23 (2024): How to Classify Post-Hoc Test Results in R, [online] https://www.geeksforgeeks.org/r-language/how-to-classify-post-hoc-test-results-in-r/ [29.06.2025].
Kosmala, Karina (2022): 13 Longest Running Sci-Fi TV Shows, Ranked, [online] https://collider.com/longest-running-sci-fi-shows-ranked/ [28.06.2025].
Maione, Ines (2024): Fernsehgewohnheiten im Wandel: Lineares Fernsehen versus Streaming-Dienste, [online] https://www.resonio.de/blog/fernsehgewohnheiten-im-wandel/ [29.06.2025].
Minitab (o. J.): Interpretieren der wichtigsten Ergebnisse für Streudiagramm, [online] https://support.minitab.com/de-de/minitab/help-and-how-to/graphs/scatterplot/interpret-the-results/key-results/ [28.06.2025].
myperfectcolor (o. J.): Match of Dr. Who Tardis Blue, [online] https://www.myperfectcolor.com/paint/385241-myperfectcolor-match-of-dr.-who-tardis-blue [28.06.2025].
OpenAI’s ChatGPT AI language model (2025): persönliche Kommunikation, Chat-Protokoll [28.06.2025].
Rdocumentation (o. J.): count: Count observations by group, [online] https://www.rdocumentation.org/packages/dplyr/versions/1.0.10/topics/count [28.06.2025].
Simon-Kucher & Partners (2025): Ersetzen Streaming-Dienste das traditionelle Fernsehen?, [online] Ersetzen Streaming-Dienste das traditionelle Fernsehen? [29.06.2025].
Smeet002 (2025): How to read this JSON file with jsonlite in R?, [online] https://www.geeksforgeeks.org/r-language/how-to-read-this-json-file-with-jsonlite-in-r/ [28.06.2025]. Smigierski, Jakob (2018): Varianzanalyse mit R (ANOVA), [online] https://www.beratung-statistik.de/statistik-beratung-infos/r-tutorial/r-varianzanalyse-post-hoc/ [29.06.2025].
Sonigara, Nikunj (2024): How to Catch JSON Parse Error in JavaScript?, [online] https://www.geeksforgeeks.org/javascript/how-to-catch-json-parse-error-in-javascript/ [28.06.2025].
Stack Exchange (2021): What is the interpretation of the p-value of 2.2e-16? [duplicate], [online] https://stats.stackexchange.com/questions/403343/what-is-the-interpretation-of-the-p-value-of-2-2e-16 [29.06.2025].
Statista (2023): Großbritannien - Einwohner bis 2050, [online] https://de.statista.com/statistik/daten/studie/19319/umfrage/gesamtbevoelkerung-in-grossbritannien/ [28.06.2025].
Statistical tools for high-throughput data analysis (STHDA) (o. J.): Correlation Test Between Two Variables in R, [online] https://www.sthda.com/english/wiki/correlation-test-between-two-variables-in-r [28.06.2025].
Statistik am PC (2021): Histogramm mit Normalverteilungskurve (ggplot) - Daten visualisieren in R (48), [YouTube Video], https://www.youtube.com/watch?v=dJ-O7aXzyw4 [29.06.2025].
StatistikGuru (o. J.): Ungepaarter t-Test mit R: Auswertung Interpretation des Welch-Test (bei mangelnder Varianzhomogenität), [online] https://statistikguru.de/r/ungepaarter-t-test-r/auswertung-interpretation-welch-test-2.html [28.06.2025].
StatistikProfis (2023): Varianzanalyse (ANOVA) in R, [online] https://www.statistikprofis.com/post/varianzanalyse-in-r [29.06.2025].
Tardis Fandom (2025): Appreciation Index, [online] https://tardis.fandom.com/wiki/Appreciation_Index [28.06.2025]. (Tardis Fandom 2025a)
Tardis Fandom (2025): Guinnes World Records, [online] https://tardis.fandom.com/wiki/Guinness_World_Records [28.06.2025].
tjohannsen (2022): Das lubridate Package, [online] https://r-coding.de/blog/das-lubridate-package/ [28.06.2025].
tjohannsen (2023): JSON-Dateien in R, [online] https://r-coding.de/blog/json-dateien-in-r/ [28.06.2025].
Turney, Shaun (2022): Pearson Correlation Coefficient (r) | Guide & Examples, [online] https://www.scribbr.com/statistics/pearson-correlation-coefficient/ [28.06.2025].
Walther, Björn (2022): Normalverteilung der Residuen bei der Regression in R testen, [online] https://bjoernwalther.com/normalverteilung-der-residuen-bei-der-regression-in-r-testen/ [01.07.2025].
Walther, Björn (2022): Q-Q-Plot in R erstellen, [online] https://bjoernwalther.com/q-q-plot-in-r-erstellen/ [29.06.2025].
Walther, Björn (2024): Einfaktorielle Varianzanalyse (ANOVA) in R rechnen, [online] https://bjoernwalther.com/einfaktorielle-varianzanalyse-anova-in-r-rechnen/ [29.06.2025].
Walther, Björn (2024): Pearson-Korrelationskoeffizient in R berechnen, [online] https://bjoernwalther.com/pearson-korrelationskoeffizient-in-r-berechnen/ [28.06.2025].
Walther, Björn (2024): Welch-Test in R durchführen, [online] https://bjoernwalther.com/welch-test-in-r-durchfuehren/ [28.06.2025].
Walther, Björn (2025): Kruskal-Wallis-Test in R rechnen, [online] https://bjoernwalther.com/kruskal-wallis-test-in-r-rechnen/ [29.06.2025].
Walther, Björn (2025): Normalverteilung in SPSS testen, [online] https://bjoernwalther.com/test_normalverteilung/ [29.06.2025].
Wikibooks (o. J.): GNU R: round, [online] https://de.wikibooks.org/wiki/GNU_R:_round [29.06.2025].
Wikipedia (2025): Doctor Who/Episodenliste, [online] https://de.wikipedia.org/w/index.php?title=Doctor_Who/Episodenliste&oldid=256545435 [28.06.2025].
Yan Holtz (o. J.): The R Graph Gallery, [online] https://r-graph-gallery.com/ [28.06.2025].