In [1]:
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as scipy
import seaborn as sns
In [2]:
# Laden vom Datensatz
df = sns.load_dataset('mpg')

# Datensatz zeigen
df.head()
Out[2]:
mpg cylinders displacement horsepower weight acceleration model_year origin name
0 18.0 8 307.0 130.0 3504 12.0 70 usa chevrolet chevelle malibu
1 15.0 8 350.0 165.0 3693 11.5 70 usa buick skylark 320
2 18.0 8 318.0 150.0 3436 11.0 70 usa plymouth satellite
3 16.0 8 304.0 150.0 3433 12.0 70 usa amc rebel sst
4 17.0 8 302.0 140.0 3449 10.5 70 usa ford torino
  • mpg steht für miles per gallon und ist eine übliche Maßeinheit für den Treibstoffverbrauch von Fahrzeugen.
  • cylinders beschreibt den Zylinder.
  • displacement beschreibt den Hubraum.
  • horsepower beschreibt die Pferdestärke (PS).
  • weight beschreibt das Gewicht des Autos.
  • acceleration beschreibt die Beschleunigung.
  • model_year beschreibt das Modelljahr.
  • origin beschreibt die Herkunft des Autos.
  • name gibt den Namen des Autos an.

describe() gibt die Standardmetriken wie den Mittelwert mean, die Standardabweichung std, Minimum, Maximum und die Quantile (25 %, 50 % und 75 %) zurück. Falls include='all' gesetzt wird, zeigt die deskriptive Statistik auch die nominalen Variablen an. Für jene Variablen werden die Werte unique, top (häufigster Wert) und feq (Häufigkeit des häufigsten Wertes) angezeigt.

In [3]:
# Deskriptive Statistik für numerische Spalten
deskriptive_statistik = df.describe()
deskriptive_statistik
Out[3]:
mpg cylinders displacement horsepower weight acceleration model_year
count 398.000000 398.000000 398.000000 392.000000 398.000000 398.000000 398.000000
mean 23.514573 5.454774 193.425879 104.469388 2970.424623 15.568090 76.010050
std 7.815984 1.701004 104.269838 38.491160 846.841774 2.757689 3.697627
min 9.000000 3.000000 68.000000 46.000000 1613.000000 8.000000 70.000000
25% 17.500000 4.000000 104.250000 75.000000 2223.750000 13.825000 73.000000
50% 23.000000 4.000000 148.500000 93.500000 2803.500000 15.500000 76.000000
75% 29.000000 8.000000 262.000000 126.000000 3608.000000 17.175000 79.000000
max 46.600000 8.000000 455.000000 230.000000 5140.000000 24.800000 82.000000
In [4]:
# Deskriptive Statistik für alle Spalten (inkl. nicht-numerische)
komplette_statistik = df.describe(include='all')
komplette_statistik
Out[4]:
mpg cylinders displacement horsepower weight acceleration model_year origin name
count 398.000000 398.000000 398.000000 392.000000 398.000000 398.000000 398.000000 398 398
unique NaN NaN NaN NaN NaN NaN NaN 3 305
top NaN NaN NaN NaN NaN NaN NaN usa ford pinto
freq NaN NaN NaN NaN NaN NaN NaN 249 6
mean 23.514573 5.454774 193.425879 104.469388 2970.424623 15.568090 76.010050 NaN NaN
std 7.815984 1.701004 104.269838 38.491160 846.841774 2.757689 3.697627 NaN NaN
min 9.000000 3.000000 68.000000 46.000000 1613.000000 8.000000 70.000000 NaN NaN
25% 17.500000 4.000000 104.250000 75.000000 2223.750000 13.825000 73.000000 NaN NaN
50% 23.000000 4.000000 148.500000 93.500000 2803.500000 15.500000 76.000000 NaN NaN
75% 29.000000 8.000000 262.000000 126.000000 3608.000000 17.175000 79.000000 NaN NaN
max 46.600000 8.000000 455.000000 230.000000 5140.000000 24.800000 82.000000 NaN NaN

Aufgabe 1: Berechne die Korrelation zwischen mpg und horsepower und stelle diese grafisch dar.¶

In [5]:
# Berechnung der Korrelation
korrelation = df['mpg'].corr(df['horsepower'])
print(f"Die Korrelation zwischen mpg und horsepower beträgt {korrelation.round(2)}")
Die Korrelation zwischen mpg und horsepower beträgt -0.78
In [6]:
# Grafische Darstellung: Scatterplot mit Regressionslinie
plt.figure(figsize=(8, 6))
sns.regplot(data=df, x='horsepower', y='mpg', scatter_kws={'alpha': 0.6}, line_kws={'color': 'red'}, ci=95)
plt.title(f"Korrelation zwischen mpg und horsepower: {korrelation:.2f}")
plt.xlabel('Horsepower')
plt.ylabel('Miles per Gallon')
plt.grid(True)
plt.show()
No description has been provided for this image

Aufgabe 2: Berechne die Spannweite und den Interquartilsabstand von mpg.¶

In [7]:
Q3 = deskriptive_statistik.mpg.iloc[-2] # Alternativ df['mpg'].quantile(0.75) 
Q1 = deskriptive_statistik.mpg.iloc[4] # Alternativ df['mpg'].quantile(0.25) 
IQA = Q3 - Q1

print(f"Der Interquartilsabstand von mpg beträgt {IQA}")
Der Interquartilsabstand von mpg beträgt 11.5
In [8]:
MAX = deskriptive_statistik.mpg.iloc[-1] # Alternativ df['mpg'].max()
MIN = deskriptive_statistik.mpg.iloc[3] # Alternativ df['mpg'].min()
SW = MAX - MIN

print(f"Die Spannweite von mpg beträgt {SW}.")
print(f"Demnach benötigt jenes Auto mit dem höchsten Verbrauch {SW} Miles per Gallon mehr als das Auto mit dem niedrigsten Verbrauch.")
Die Spannweite von mpg beträgt 37.6.
Demnach benötigt jenes Auto mit dem höchsten Verbrauch 37.6 Miles per Gallon mehr als das Auto mit dem niedrigsten Verbrauch.

Aufgabe 3: Bestimme die Ausreißer von Miles per Gallon mpg mit dem IQA.¶

In [9]:
# Grenzen für Ausreißer
untere_grenze = Q1 - 1.5 * IQA
obere_grenze = Q3 + 1.5 * IQA

# Identifikation der Ausreißer
ausreißer = df[(df['mpg'] < untere_grenze) | (df['mpg'] > obere_grenze)]

print(f"Untere Grenze: {untere_grenze}")
print(f"Obere Grenze: {obere_grenze}")
print(f"Anzahl der Ausreißer: {len(ausreißer)}")
print("Ausreißer:")
ausreißer
Untere Grenze: 0.25
Obere Grenze: 46.25
Anzahl der Ausreißer: 1
Ausreißer:
Out[9]:
mpg cylinders displacement horsepower weight acceleration model_year origin name
322 46.6 4 86.0 65.0 2110 17.9 80 japan mazda glc
In [10]:
plt.figure(figsize=(8, 6))
sns.boxplot(data=df, y='mpg')
plt.title('Boxplot von MPG mit Ausreißern')
plt.ylabel('MPG')
plt.show()
No description has been provided for this image

Aufgabe 4: Berechne die mittlere absolute Abweichung bezüglich Mittelwert von horsepower und die empirische Varianz der cylinders. Bezüglich der empirischen Varianz kann angenommen werden, dass es sich um eine Stichprobe handelt.¶

In [11]:
# Berechnung des Mittelwerts von horsepower
mean_horsepower = df['horsepower'].mean()

# Berechnung der mittleren absoluten Abweichung (MAD)
mad_horsepower = np.mean(np.abs(df['horsepower'] - mean_horsepower))

print(f"Mittelwert von horsepower: {mean_horsepower.round(2)}")
print(f"Mittlere absolute Abweichung (MAD) von horsepower: {mad_horsepower.round(2)}")
Mittelwert von horsepower: 104.47
Mittlere absolute Abweichung (MAD) von horsepower: 30.36
In [12]:
# Berechnung der empirischen Varianz der 'cylinders' Spalte
var_cylinders = df['cylinders'].var(ddof=1)

print(f"Empirische Varianz von cylinders : {var_cylinders.round(4)}")
Empirische Varianz von cylinders : 2.8934

Aufgabe 5: Wie hoch ist die Wahrscheinlichkeit, dass ein zufällig ausgewähltes Auto aus dem Datensatz nicht aus den USA stammt?¶

In [13]:
# Gesamte Anzahl an Autos
total_cars = len(df)

# Autos nicht aus den USA
not_usa_cars = len(df[df['origin'] != 'usa'])

# Wahrscheinlichkeit
p_not_usa = not_usa_cars / total_cars
print(f"P(NotUSA): {p_not_usa:.2f}")
P(NotUSA): 0.37

Aufgabe 6: Falls ein Auto 6 Zyklinder hat, wie hoch ist die Wahrscheinlichkeit, dass es mehr als 30 Miles per Gallon braucht?¶

In [14]:
# Autos mit 6 Zylindern
cars_6_cyl = df[df['cylinders'] == 6]

# Autos mit 6 Zylindern und mehr als 30 mpg
cars_6_cyl_30mpg = cars_6_cyl[cars_6_cyl['mpg'] > 30]

# Bedingte Wahrscheinlichkeit
p = len(cars_6_cyl_30mpg) / len(cars_6_cyl)
print(f"P(MPG > 30 | Zylinder = 6): {p:.2f}")
P(MPG > 30 | Zylinder = 6): 0.04

Aufgabe 7: Wie sieht die diskrete Verteilung der Zylinderanzahl aus? Hinweis: Verwende value_counts().¶

In [15]:
# Häufigkeitsverteilung der Zylinder
cyl_freq = df['cylinders'].value_counts()

# Wahrscheinlichkeitsverteilung
cyl_prob = cyl_freq / total_cars
print(cyl_prob.sort_index())

# Bin-Grenzen definieren (rechts offen, links geschlossen)
bins = np.arange(cyl_prob.index.min(), cyl_prob.index.max() + 2) # + 2, um das letzte Intervall abzudecken

# Histogramm
df['cylinders'].hist(density=True, bins=bins, align='left', rwidth=0.98)

# Achsentitel und Beschriftungen hinzufügen
plt.xlabel('Zylinder')
plt.ylabel('p')
plt.title('Histogramm der Zylinder')
plt.xticks(bins)
plt.show()
cylinders
3    0.010050
4    0.512563
5    0.007538
6    0.211055
8    0.258794
Name: count, dtype: float64
No description has been provided for this image

Aufgabe 8: Wie hoch ist die Wahrscheinlichkeit, dass ein Auto höchstens x Zylinder hat? Anmerkung: Stelle die kumulative Verteilungsfunktion dar.¶

In [16]:
# Histogramm-Werte und Häufigkeiten
hist, edges = np.histogram(df['cylinders'], bins=bins, density=True)

# Die kumulative Verteilungsfunktion berechnen
cdf = np.cumsum(hist * np.diff(edges))  # Wahrscheinlichkeiten aufsummieren

# cdf plotten
plt.step(edges[:-1], cdf, where='post', label='cdf', color='red')

# Zusätzliche Achsentitel und Beschriftungen
plt.xlabel('Zylinder')
plt.ylabel('cdf')
plt.title('Kumulative Verteilungsfunktion')
plt.xticks(bins)
plt.show()
No description has been provided for this image

Aufgabe 9: Wie hoch ist die Wahrscheinlichkeit, dass ein Auto 4 Zyklinder hat und aus Europa stammt?¶

In [17]:
# Autos mit 4 Zylindern und aus Europa
cars_4_cyl_europa = df[(df['cylinders'] == 4) & (df['origin'] == 'europe')]

# Gemeinsame Wahrscheinlichkeit
p_cyl_4_and_europa = len(cars_4_cyl_europa) / total_cars
print(f"P(4 Zylinder und Europa): {p_cyl_4_and_europa:.2f}")
P(4 Zylinder und Europa): 0.16

Aufgabe 10: Wir wissen, dass ein Auto weniger als 20 Miles per Gallon verbraucht. Wie hoch ist die Wahrscheinlichkeit, dass das Auto aus den USA stammt?¶

In [18]:
# Alle Autos, die weniger als 20 mpg verbrauchen
mpg_low = df[df['mpg'] < 20]

# Berechnung der bedingten Wahrscheinlichkeit P(B | A)
p_usa_given_mpg_low = len(mpg_low[mpg_low['origin'] == 'usa']) / len(mpg_low)

print(f"P(USA | MPG < 20): {p_usa_given_mpg_low:.2f}")
P(USA | MPG < 20): 0.94
In [19]:
# Alternativ: Satz von Bayes

# Autos die nicht aus den USA stammen
not_usa_cars = df[df['origin'] != 'usa']

# 1. P(B): Wahrscheinlichkeit, dass ein Auto aus den USA stammt
usa_cars = df[df['origin'] == 'usa']
p_usa = len(usa_cars) / len(df)

# 2. P(A | B)
p_mpg_low_given_usa = len(usa_cars[usa_cars['mpg'] < 20]) / len(usa_cars)

# 3. P(A | B^c)
p_mpg_low_given_not_usa = len(not_usa_cars[not_usa_cars['mpg'] < 20]) / len(not_usa_cars)

# 4. P(A): Wahrscheinlichkeit, dass ein Auto weniger als 20 mpg verbraucht
p_mpg_low = len(df[df['mpg'] < 20]) / len(df)

# 5. P(B | A): Satz von Bayes
p_usa_given_mpg_low = (p_mpg_low_given_usa * p_usa) / (p_usa * p_mpg_low_given_usa + (1 - p_usa) * p_mpg_low_given_not_usa)

print(f"P(USA | MPG < 20): {p_usa_given_mpg_low:.2f}")
P(USA | MPG < 20): 0.94

Aufgabe 11: Berechne die Schiefe und Wölbung der Variable weights und interpretiere die Ergebnisse.¶

In [20]:
# Funktion zur Berechnung der Schiefe
def calculate_skewness(data):
    n = len(data)
    mean = np.mean(data)
    std = np.std(data, ddof=1)  # Stichprobenstandardabweichung
    skewness = (1 / n) * np.sum(((data - mean) / std) ** 3)
    return skewness

# Funktion zur Berechnung der Wölbung
def calculate_kurtosis(data):
    n = len(data)
    mean = np.mean(data)
    std = np.std(data, ddof=1)  # Stichprobenstandardabweichung
    kurtosis = (1 / n) * np.sum(((data - mean) / std) ** 4)
    return kurtosis

skewness = calculate_skewness(df['weight'])
kurtosis = calculate_kurtosis(df['weight'])
    
print(f"Die Schiefe ist {skewness} und größer 0 bedeutet, dass eine rechtsschiefe bzw. linkssteile Verteilung vorliegt.")
print(f"Die Wölbung ist {kurtosis} und kleiner 3 bedeutet, dass die vorliegende Verteilung flachgipfliger als die Normalverteilung ist.")
Die Schiefe ist 0.5270662340015831 und größer 0 bedeutet, dass eine rechtsschiefe bzw. linkssteile Verteilung vorliegt.
Die Wölbung ist 2.1981794047193333 und kleiner 3 bedeutet, dass die vorliegende Verteilung flachgipfliger als die Normalverteilung ist.

Aufgabe 12: Simuliere den zentralen Grenzwertsatz anhand von weight, indem eine zufällige Stichprobe der Größe 10 gezogen wird und anschließend die Verteilung der Mittelwerte gezeigt wird. Anmerkung: Wir ziehen in diesem Beispiel Stichproben aus einer Stichprobe.¶

In [21]:
weights = df['weight'].dropna()

# Parameter für die Simulation
num_samples = 100000  # Anzahl der Stichproben
sample_size = 10    # Größe jeder Stichprobe

# Mittelwerte der Stichproben berechnen
sample_means = []
for _ in range(num_samples):
    sample = np.random.choice(weights, size=sample_size, replace=True)
    sample_means.append(np.mean(sample))

# Histogramm der Mittelwerte plotten
plt.figure(figsize=(10, 6))
plt.hist(sample_means, bins=30, color="skyblue", edgecolor="black", density=True)
plt.title("Verteilung der Stichprobenmittelwerte")
plt.xlabel("Stichprobenmittelwert")
plt.ylabel("f(x)")
plt.show()
No description has been provided for this image

Der zentrale Grenzwertsatz zeigt, dass die Verteilung der Stichprobenmittelwerte näherungsweise normal verteilt ist, selbst wenn die ursprüngliche Verteilung nicht normal ist.

Aufgabe 13: Berechne das 95 % Konfidenzintervall für den Erwartungswert der Stichprobenmittelwerte aus Aufgabe 12. In anderen Worten sind wir an einem Konfidenzintervall für den Erwartungswert der Verteilung aus Aufgabe 12 interessiert.¶

In [22]:
alpha = 0.05  # Signifikanzniveau (1 - 0.95)
n = len(sample_means)  # Stichprobengröße
mean_sample_means = np.mean(sample_means)  # Stichprobenmittelwert
std_sample_means = np.std(sample_means, ddof=1)  # Stichprobenstandardabweichung

# Kritischer Wert aus der t-Verteilung
t_critical = scipy.t.ppf(1 - alpha / 2, df=n-1)

# Standardfehler des Mittelwerts
std_error = std_sample_means / np.sqrt(n)

# Konfidenzintervall berechnen
lower_bound = mean_sample_means - t_critical * std_error
upper_bound = mean_sample_means + t_critical * std_error

print(f"95 %-Konfidenzintervall: ({lower_bound:.2f}, {upper_bound:.2f})")
95 %-Konfidenzintervall: (2967.98, 2971.30)

Aufgabe 14: Wir sind daran interessiert, ob das durchschnittliche Gewicht von Autos aus den USA signifikant höher ist als das von Autos aus Europa. Prüfe dies zum Signifikanzniveau von 0.05.¶

In [23]:
# Filtern der Daten nach Herkunft
usa_weights = df[df['origin'] == 'usa']['weight'].dropna()
europe_weights = df[df['origin'] == 'europe']['weight'].dropna()

n = len(usa_weights)
alpha = 0.05

# H0: Autos aus USA sind leichter oder gleich schwer als Autos aus Europa
# H1: Autos aus USA sind schwerer als Autos aus Europa

usa_mean = np.mean(usa_weights)
europe_mean = np.mean(europe_weights)

# H0: usa_mean <= europe_mean
# H1: usa_mean > europe_mean

# Stichprobenstandardabweichung von Autos aus den USA (an diesen sind wir interessiert)
std_usa = np.std(usa_weights, ddof=1) 

# Teststatistik
t = (1 / std_usa) * np.sqrt(n) * (usa_mean - europe_mean)

# Kritischer Wert aus der t-Verteilung
t_critical = scipy.t.ppf(1 - alpha, df=n-1)

# Wir lehnen H0 ab, falls t > t_critical ist 
if t > t_critical:
    print("Die Nullhypothese wird abgelehnt und die Alternativhypothese wird angenommen.")
    print("Demnach sind die Autos aus den USA signifikant schwerer als die Autos aus Europa")
else: 
    print("Die Nullhypothese kann nicht abgelehnt werden.")
Die Nullhypothese wird abgelehnt und die Alternativhypothese wird angenommen.
Demnach sind die Autos aus den USA signifikant schwerer als die Autos aus Europa
In [ ]: