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ürmiles 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()
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()
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
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()
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()
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 [ ]: