Test auf Normalverteilung | Normalverteilung mit Python testen

Bei einem Test auf die Normalverteilung der Residuen lässt sich erahnen, ob im vorliegenden Datensatz Ausreißer vorhanden sind. Bei einer linearen Regression nehmen wir an, dass die Residuen normalverteilt sind. Das spiegelt sich in zwei für den Test relevanten Größen wider:

(1) Schiefe = Maß der Symmetrie der Verteilung
(2) Kurtosis = Grad der Wölbung der Verteilung

Für den angewandten Jarque-Bera-Test wird es noch einen entsprechenden Theorie-Beitrag unter “Basics” geben.

Für die Anwendung des Skripts wird eine Numpy-Matrix der OLS-Parameter sowie X und y benötigt (Theorie zur multiplen Regression).

Jarque-Bera-Test in Python

Nötige Imports:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import chi2
from numpy.linalg import matrix_rank
import math
# Jarque-Bera-Test
# Test auf Normalverteilung der Residuen

def JB(type=0):
    
    # Gefittete Werte    
        
    fitted_values = X*OLS_parameters
    
    # Residuen
    
    residuals = y - fitted_values
    
    # Für die Darstellung in der Häufigkeitsverteilung
    
    residuals_in_array = numpyExtractor(residuals)
            
    # Für die Darstellung im Scatterplot 
    
    fitted_in_array = numpyExtractor(fitted_values)
    
    plt.hist(residuals_in_array,bins=10,density=True,edgecolor="#cccccc",color="#000000") 
    
    plt.title('Häufigkeitsverteilung der Residuen')
    
    plt.show()
            
    skewness = 0; 
    kurtosis = 0;
    
    for x in residuals: 
        
        skewness += (x**3)
        kurtosis += (x**4)
           
    estimated_variance_exp_3 = np.sqrt((np.transpose(residuals)*residuals)/(n-k))**3
    estimated_variance_exp_4 = np.sqrt((np.transpose(residuals)*residuals)/(n-k))**4
    
    S = skewness/estimated_variance_exp_3
    K = kurtosis/estimated_variance_exp_4
    
    print("Schiefe (S) beträgt " + str(S))
    print("Kurtosis (K) beträgt " + str(K))
    
    # Kompletter Test auf Symmetrie & Kurtosis
    
    TYPE0_JB_VALUE = (n-k)*((S**2/6)+((K-3)**2/24))
    
    # Ausschließlich Test auf breite Ränder
    
    TYPE1_JB_VALUE = (n-k)*((K-3)**2/24)
     
    # Kritischer Chi-Quadrat-Wert mit 2 Freiheitsgraden auf 5% Signifikanzniveau
    
    df2chi = chi2.isf(q=0.05, df=2)
    
    # Kritischer Chi-Quadrat-Wert mit 1 Freiheitsgrad auf 5% Signifikanzniveau
    
    df1chi = chi2.isf(q=0.05, df=1)
    
    # Kompletter JB-Test
    
    if (type==0):
        
        print("JB: " + str(TYPE0_JB_VALUE))
                      
        if (TYPE0_JB_VALUE > df2chi):
            print("Jarque-Bera-Wert ist größer als kritischer Wert. Hinweis auf Ausreißer!")
        
        if (TYPE0_JB_VALUE < df2chi):
            print("Jarque-Bera-Wert ist kleiner als kritischer Wert. Kein Hinweis auf Ausreißer!")
            
        return TYPE0_JB_VALUE
        
    # Ausschließlich Test auf breite Ränder

    if (type==1):
        
        print("JB (Breite Ränder): " + str(TYPE1_JB_VALUE))
                      
        if (TYPE1_JB_VALUE > df1chi):
            print("Jarque-Bera-Wert ist größer als kritischer Wert. Steilgipflig!")
        
        if (TYPE1_JB_VALUE < df1chi):
            print("Jarque-Bera-Wert ist kleiner als kritischer Wert. Flachgipflig!")
            
        return TYPE1_JB_VALUE

Marvin Jörs

Marvin Jörs ist Gründer und geschäftsführender Gesellschafter der Skyscraper Marketing GmbH. Bereits mit 14 Jahren absolvierte Jörs sein erstes Schulpraktikum bei der Deutschen Telekom mit Aspekten aus der Suchmaschinenoptimierung. Seitdem erfolgten mehrere berufliche Stationen sowie Aktivitäten als freiberuflicher Webdesigner. Er hat an der Technischen Universität in Darmstadt einen B.Sc. in Wirtschaftsinformatik abgeschlossen. Seit 2019 ist Jörs Lehrbeauftragter für Online-Marketing an der Hochschule in Darmstadt.