[PYTHON] Beziehungs- und Approximationsfehler der Binomialverteilung, Poisson-Verteilung, Normalverteilung, supergeometrische Verteilung

Überblick

Nachschlagewerk

Grundlegende Statistik

Ungefähr die Beziehung jeder Verteilung

Supergeometrische Verteilung und Binomialverteilung

In supergeometrischer Verteilung

Andererseits in der Binomialverteilung

Die hypergeometrische Verteilung kann durch eine Binomialverteilung gut angenähert werden, wenn die Gesamtzahl (die Anzahl der Kugeln in der Schachtel) ausreichend größer als die Anzahl der Extrakte ist.

Binäre Verteilung, Poisson-Verteilung und Normalverteilung

Die Binomialverteilung ist

Berechnung der Verteilung und Bestätigung des Approximationsfehlers

Python-Code (Funktionsteil)

import scipy as sc
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

# functions ------------------------
def binomial(n, x, p):
    '''
Binäre Verteilung
Ereignisse mit der Wahrscheinlichkeit p treten in n Versuchen x-mal auf
Jeder Versuch ist unabhängig
Beispiel: Ein Ereignis, das 3 auf einen Würfel gibt (Wahrscheinlichkeit p)=1/6) aber n Würfel=X beim 10-maligen Schütteln=5 mal)
        nCx * p^x * (1-p)^(n-x)
    '''
    return (
        sc.special.comb(n, x)
        * np.power(p, x)
        * np.power(1 - p, n - x)
    )

def poisson(n, x, p):
    '''
Poisson-Verteilung
        p->Bei 0 wird die Binomialverteilung zu einer Poisson-Verteilung.
    '''
    mean = n * p
    return (
        np.power(mean, x)
        * np.exp(-mean)
        / sc.special.factorial(x)
    )

def gaussian(n, x, p):
    '''
Normalverteilung
        n->Wenn oo, wird die Binomialverteilung zu einer Normalverteilung
    '''
    mean = n * p
    variance = np.power(n * p * (1 - p), 1/2)
    return (
        1.0 
        / (np.power(2 * np.pi, 1/2) * variance)
        / np.exp(
            np.power(x - mean, 2)
            / (2 * np.power(variance, 2))
            )
    )

def hypergeometric(n, x, p, N):
    '''
Super geometrische Verteilung
Jeder Versuch ist nicht unabhängig
Es ist notwendig, alle N für die nicht wiederherstellende Extraktion zu berücksichtigen
    '''
    target_size = N * p  #Anzahl der Treffer im Ganzen
    return (
        sc.special.comb(target_size, x)  #X Kombinationen pro
        * sc.special.comb(N - target_size, n - x)  #Verloren n-x Kombinationen
        / sc.special.comb(N, n)  #Alle Kombinationen von n
    )


def calc_distributions(n, p, cols, N=0):
    '''
    ex.:
    n = 30  #Anzahl von Versuchen
    p = 0.16  #Prozentsatz der Treffer
    N = 1000  #Alle (nur in der supergeometrischen Verteilung verwendet)
    '''
    #Bereiten Sie ein Array zum Speichern der Ergebnisse vor
    bi_arr = np.zeros(n + 1, dtype=np.float)
    po_arr = np.zeros(n + 1, dtype=np.float)
    ga_arr = np.zeros(n + 1, dtype=np.float)

    for x in np.arange(n + 1):
        #Speichern Sie die Ergebnisse in einem Array
        bi_arr[x] = binomial(n, x, p) 
        po_arr[x] = poisson(n, x, p) 
        ga_arr[x] = gaussian(n, x, p) 

    #Speichern Sie das Ergebnis in einem Datenrahmen
    df = pd.DataFrame()
    df['Binäre Verteilung'] = bi_arr
    df['Poisson-Verteilung'] = po_arr
    df['Normalverteilung'] = ga_arr

    if N > 0:
        hy_arr = np.zeros(n + 1, dtype=np.float)
        for x in np.arange(n + 1):
            hy_arr[x] = hypergeometric(n, x, p, N)
        df['Super geometrische Verteilung'] = hy_arr

    return df[cols]


def visualize(df,n, p, N=0):
    plot_params = {
        'linestyle':'-', 
        'markersize':5,
        'marker':'o'
    }
    colors = [
        'black',
        'blue',
        'green',
        'purple',
    ]
    
    plt.close(1)
    figure_ = plt.figure(1, figsize=(8,4))    
    axes_ = figure_.add_subplot(111)  #Achsen erstellen
    for i, col in enumerate(df.columns):
        if i == 0:
            plot_params['linewidth'] = 2
            plot_params['alpha'] = 1.0
        else:
            plot_params['linewidth'] = 1
            plot_params['alpha'] = 0.4
        plot_params['color'] = colors[i]
        axes_.plot(
            df.index.values, df[col].values,
            label = col,
            **plot_params,
        )

    plt.legend()
    plt.xlabel('Anzahl der Treffer x')
    plt.ylabel('Wahrscheinlichkeit, x mal n mal zu gewinnen')
    title = 'Prozentsatz der Treffer p:{p:.2f},Anzahl der Versuche n:{n}'.format(p=p, n=n)
    if 'Super geometrische Verteilung' in df.columns:
        title += ',Alle n:{N}'.format(N=N)
    plt.title(title)
    xmax = n * p * 2
    if xmax<10: xmax = 10;
    plt.xlim([0, xmax])
    #(Der Ausdruck "Anzahl der Male" ist nicht gut, wenn man die Extraktion ohne Restauration berücksichtigt.)

Unter verschiedenen Bedingungen ausführen, Fehler prüfen

Wirf die Würfel 100 Mal und wie oft kommt 1 heraus

n = 100; p = 0.167
df = calc_distributions(n, p, cols=['Binäre Verteilung', 'Poisson-Verteilung', 'Normalverteilung'])
visualize(df, n, p)

image.png Binärverteilung und Normalverteilung stimmen gut überein

Schütteln Sie die 100 Facetten 100 Mal und wie oft 1 erscheint

n = 100; p = 0.01
df = calc_distributions(n, p, cols=['Binäre Verteilung', 'Poisson-Verteilung', 'Normalverteilung'])
visualize(df, n, p)

image.png Binärverteilung und Poisson-Verteilung stimmen gut überein

10% der 5000 Einwohner sind Kinder. Wie viele Kinder gibt es von 100 ausgewählten?

n = 100; p = 0.1; N = 5000
df = calc_distributions(n, p, cols=['Super geometrische Verteilung','Binäre Verteilung'], N=N)
visualize(df, n, p, N)

image.png Supergeometrische Verteilung und Binomialverteilung stimmen gut überein

10% der 500 Einwohner sind Kinder. Wie viele Kinder gibt es von 100 ausgewählten?

n = 100; p = 0.1; N = 500
df = calc_distributions(n, p, cols=['Super geometrische Verteilung','Binäre Verteilung'], N=N)
visualize(df, n, p, N)

image.png Der Fehler ist im Vergleich zu N = 5000 erkennbar

Ende

Recommended Posts

Beziehungs- und Approximationsfehler der Binomialverteilung, Poisson-Verteilung, Normalverteilung, supergeometrische Verteilung
Überprüfung der Normalverteilung
[Statistik] Lassen Sie uns die Beziehung zwischen der Normalverteilung und der Chi-Quadrat-Verteilung visualisieren.
pix2pix tensorflow2 Aufzeichnung von Versuch und Irrtum