[PYTHON] Ich möchte Variationen in verschiedenen Statistiken finden! Empfehlung für ein Resample (Bootstrap)

Die Datenanalyse scheint immer noch zu boomen. Unabhängig davon, welche Daten angegeben werden, ob es sich um maschinelles Lernen handelt oder was auch immer, visualisieren Sie zuerst die Daten und erhalten die Hypothese, um mit Ihrer Analyse zu beginnen. Um die Hypothese zu testen, führen wir verschiedene Analysen durch und berechnen verschiedene Statistiken.

Wenn Sie dies tun, stoßen Sie möglicherweise auf eine Situation, in der Sie ** die Variation in einer Statistikpopulation ** kennenlernen möchten.

Wenn es sich um den Durchschnittswert der Daten handelt, können Sie den Standardfehler des Mittelwerts berechnen. Dies ist die Standardabweichung geteilt durch die Quadratwurzel der Anzahl der Daten.

In der Analyse werden jedoch nicht nur der Mittelwert, sondern auch verschiedene Statistiken wie Median, Zentil und Korrelationskoeffizient betrachtet. Und es gibt keine einfache Formel für diese, die Variationen wie ** Standardfehler und Konfidenzintervall ** quantifizieren kann.

In einem solchen Fall ist ** Resampling **, insbesondere ** Bootstrap **, nützlich.

Was ist ein Stiefelriemen?

Bootstrap erstellt zuerst Tausende ähnlicher Datensätze aus den Originaldaten durch Resampling. Berechnen Sie dann für jeden Datensatz die gewünschten Statistiken. Dann wird die Verteilung der Statistik erstellt, und der Standardfehler der Statistik kann durch Berechnung der Standardabweichung der Verteilung erhalten werden.

Angenommen, Sie haben IQ-Daten für 20 Personen. Angenommen, die Werte sind 61, 88, 89, 89, 90, 92, 93, 94, 98, 98, 101, 102, 105, 108, 109, 113, 114, 115, 120, 138. Die Verteilung sieht folgendermaßen aus:

figure1.png

Zu diesem Zeitpunkt beträgt der Mittelwert 100,85 und der Standardfehler des Mittelwerts 3,45.

Die Verteilung dieser Werte wie des Einkommens ist jedoch so, dass der Medianwert eher das tatsächliche Gefühl der Person als den Mittelwert widerspiegelt. Dieses Mal möchte ich den Bootstrap verwenden, um die Variation des Medianwerts zu ermitteln, dh den ** Standardfehler des Medians **.

Bootstrap-Algorithmus

Der Boot Strap wird gemäß dem folgenden Ablauf ausgeführt.

1: Entscheiden Sie, wie oft ein Resample durchgeführt werden soll. Machen Sie eine große Zahl, z. B. 500, 1000, 10000, 100000. Dieses Mal werde ich 1000 versuchen.

2: Daten erneut abtasten und künstlich generieren. Zu diesem Zeitpunkt ** erlauben Sie das Duplizieren und extrahieren Sie so viele Datenproben wie die Anzahl der Proben der Originaldaten **.

Wenn die Originaldaten beispielsweise $ X_1, X_2, ..., X_5 $ und $ 5 $ waren, ist das folgende Beispiel ein Beispiel für den Datensatz, der bei jedem erneuten Abtasten generiert wird.

Resample 1 = $ X1, X2, X3, X3, X4 $ Resample 2 = $ X1, X1, X3, X4, X4 $ Resample 3 = $ X2, X2, X5, X5, X5 $ ...... Resample 998 = $ X1, X2, X3, X4, X5 $ Resample 999 = $ X1, X3, X4, X5, X5 $ Resample 1000 = $ X3, X3, X3, X3, X4 $

Auf diese Weise wird eine Duplizierung für die in Schritt 1 bestimmte Anzahl zugelassen, und Datenproben werden wiederholt für die Anzahl der Originaldaten extrahiert, und Daten werden künstlich erzeugt.

Welche Datenstichprobe in jeder erneuten Stichprobe enthalten ist, ist zufällig. Manchmal haben alle fünf den gleichen Wert, und manchmal haben alle fünf unterschiedliche Werte.

3: Berechnen Sie für jedes Resample die Statistiken, die Sie finden möchten. Unabhängig vom Median werden alle neu abgetasteten Daten verwendet, um die Statistiken zu finden. Wenn Sie 1000 Mal neu abtasten, können Sie 1000 Statistiken erhalten.

Resample 1 = $ X1, X2, X3, X3, X4 $ $ \ bis $ Statistics = $ S1 $ Resample 2 = $ X1, X1, X3, X4, X4 $ $ \ bis $ Statistics = $ S2 $ Resample 3 = $ X2, X2, X5, X5, X5 $ $ \ bis $ Statistics = $ S3 $ ...... Resample 998 = $ X1, X2, X3, X4, X5 $ $ \ bis $ Statistics = $ S998 $ Resample 999 = $ X1, X3, X4, X5, X5 $ $ \ bis $ Statistics = $ S999 $ Resample 1000 = $ X3, X3, X3, X3, X4 $ $ \ bis $ Statistics = $ S1000 $

Sie haben viele Statistiken. Und denk so.

"Sie können sich die Verteilung dieser vielen Statistiken als ** fast gleich der Bevölkerungsverteilung dieser Statistik ** vorstellen! Weil ** nach mehr Experimenten und mehr Daten ähnlich ist Nur die Wertdaten erhöhen sich ** Weil !! "

Bootstrap verwendet also statistische Tricks, um die Anzahl der Daten zu erhöhen, nicht experimentell. Und wenn die Anzahl der Daten bis zu einem gewissen Grad groß ist, sollte die Verteilung so nahe wie möglich an der Verteilung der Bevölkerung liegen.   4: Berechnen Sie die Abweichung (Standardfehler, Konfidenzintervall usw.) anhand der erhaltenen Statistikverteilung. Beispiel: ** Standardfehler ist die Standardabweichung der Bevölkerungsverteilung **, sodass Sie einfach die Standardabweichung der erhaltenen statistischen Verteilung ermitteln können.

Auf diese Weise ist es möglich, die Variation in den Statistiken zu finden, an denen Sie interessiert sind.

Bootstrap-Übung

Lass es uns mit Python machen (Matlab / Octave ist auch unten).

Holen Sie sich zuerst die Bibliothek, die Sie benötigen.


# import librarys
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Verwenden Sie Numpy, um die Daten in das Array einzufügen.


# get data
iq = np.array([61, 88, 89, 89, 90, 92, 93, 
               94, 98, 98, 101, 102, 105, 108,
               109, 113, 114, 115, 120, 138])

Berechnen Sie als Basisstatistik den Durchschnittswert, den Standardfehler des Durchschnittswerts und den Medianwert.


# compute mean, SEM (standard error of the mean) and median
mean_iq = np.average(iq)
sem_iq = np.std(iq)/np.sqrt(len(iq))
median_iq = np.median(iq)

Wir konnten den Mittelwert berechnen: 100,85, den Standardfehler des Mittelwerts: 3,45 bzw. den Median: 99,5.

Führen Sie einen Bootstrap aus, um den Standardfehler des Medians zu ermitteln. Zur Überprüfung der Richtigkeit, ob der Bootstrap korrekt ist, wird auch der Standardfehler des Durchschnittswerts berechnet.

Gehen Sie wie folgt vor, um aufeinanderfolgende Ganzzahlwerte von 1 bis n zufällig mit Duplikaten in Python zu sortieren.


np.random.choice(n,n,replace=True)

Verwenden Sie diese Option, um den Bootstrap erneut abzutasten.


# bootstrap to compute sem of the median
def bootstrap(x,repeats):
    # placeholder (column1: mean, column2: median)
    vec = np.zeros((2,repeats))
    for i in np.arange(repeats):
        # resample data with replacement
        re = np.random.choice(len(x),len(x),replace=True)
        re_x = x[re]
            
        # compute mean and median of the "new" dataset
        vec[0,i] = np.mean(re_x)
        vec[1,i] = np.median(re_x)
    
    # histogram of median from resampled datasets
    sns.distplot(vec[1,:], kde=False)
    
    # compute bootstrapped standard error of the mean,
    # and standard error of the median
    b_mean_sem = np.std(vec[0,:])
    b_median_sem = np.std(vec[1,:])
    
    return b_mean_sem, b_median_sem   

Wenn Sie diese Funktion mit x = iq, repeats = 1000 ausführen, können Sie die Verteilung der 1000 vom Bootstrap gefundenen Medianwerte sehen.

figure2.png

...... Ich denke, es wäre besser gewesen, mehr Wiederholungen zu haben.

Aus dieser Verteilung kann vorerst der Standardfehler des Medianwertes ermittelt werden. Berechnen Sie einfach die Standardabweichung von ** 1000 Medianwerten **.

Berechnen Sie in ähnlicher Weise den Standardfehler des Mittelwerts.

Erstens beträgt der Standardfehler des aus den Originaldaten erhaltenen Durchschnittswerts 3,45, also ist er ziemlich nahe. Der Bootstrap scheint die Abweichungen in der Statistik korrekt geschätzt zu haben.

wichtiger Punkt Der Bootstrap ** wird nach dem Zufallsprinzip neu abgetastet, sodass die Ergebnisse bei jeder Ausführung leicht abweichen **. Um die Variation der Ergebnisse zu verringern und genauere Schätzungen vorzunehmen, müssen Sie die Anzahl der Iterationen erhöhen (~ 10.000).

Zusammenfassung Zusammenfassung

Mit Bootstrap können Sie Abweichungen in den interessierenden Statistiken durch erneutes Abtasten abschätzen.

Am Ende

Ich denke, dass jeder, der über Resampling in Statistiken nachdenkt, einschließlich Bootstrap, ein Genie ist. Indem Sie die Daten künstlich erhöhen und die Bevölkerungsverteilung approximieren, werden Sie von den Strafen befreit, die entstehen, wenn Sie vorerst weiterhin Daten sammeln! Wenn Sie tatsächlich keine Daten und repräsentativen Beispiele der Bevölkerung sammeln, können Sie sich der Bevölkerung natürlich nie für immer nähern, egal wie viel Sie erneut abtasten.

Der Quellcode ist unten aufgeführt.

bootstrap_demo.py



# import librarys
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# get data
iq = np.array([61, 88, 89, 89, 90, 92, 93, 
               94, 98, 98, 101, 102, 105, 108,
               109, 113, 114, 115, 120, 138])

# compute mean, SEM (standard error of the mean) and median
mean_iq = np.average(iq)
sem_iq = np.std(iq)/np.sqrt(len(iq))
median_iq = np.median(iq)

# bootstrap to compute sem of the median
def bootstrap(x,repeats):
    # placeholder (column1: mean, column2: median)
    vec = np.zeros((2,repeats))
    for i in np.arange(repeats):
        # resample data with replacement
        re = np.random.choice(len(x),len(x),replace=True)
        re_x = x[re]
            
        # compute mean and median of the "new" dataset
        vec[0,i] = np.mean(re_x)
        vec[1,i] = np.median(re_x)
    
    # histogram of median from resampled datasets
    sns.distplot(vec[1,:], kde=False)
    
    # compute bootstrapped standard error of the mean,
    # and standard error of the median
    b_mean_sem = np.std(vec[0,:])
    b_median_sem = np.std(vec[1,:])
    
    return b_mean_sem, b_median_sem   

# execute bootstrap
bootstrapped_sem = bootstrap(iq,1000)    

Matlab / Ovctave ist unten.

bootstrap_demo.m



function bootstrap_demo

% data
iq = [61, 88, 89, 89, 90, 92, 93,94, 98, 98, 101, 102, 105, 108,109, 113, 114, 115, 120, 138];

% compute mean, SEM (standard error of the mean) and median
mean_iq = mean(iq);
sem_iq = std(iq)/sqrt(length(iq));
median_iq = median(iq);
disp(['the mean: ' num2str(mean_iq)])
disp(['the SE of the mean: ' num2str(sem_iq)])
disp(['the median: ' num2str(median_iq)])
disp('---------------------------------')

[b_mean_sem, b_median_sem] = bootstrap(iq, 1000);
disp(['bootstrapped SE of the mean: ' num2str(b_mean_sem)])
disp(['bootstrapped SE of the median: ' num2str(b_median_sem)])

% bootstrap to compute sem of the median
function [b_mean_sem, b_median_sem] = bootstrap(x, repeats)

% placeholder (column1: mean, column2: median)
vec = zeros(2,repeats);
for i = 1:repeats
    % resample data with replacement
    re_x = x(datasample(1:length(x),length(x),'Replace',True));
    
    % compute mean and median of the "new" dataset
    vec(1,i) = mean(re_x);
    vec(2,i) = median(re_x);
    
end

% histogram of median from resampled dataset
histogram(vec(2,:))

% compute bootstrapped standard error of the mean, and standard error of
% the median
b_mean_sem = std(vec(1,:));
b_median_sem = std(vec(2,:));

Referenz

Recommended Posts

Ich möchte Variationen in verschiedenen Statistiken finden! Empfehlung für ein Resample (Bootstrap)
Ich möchte nur das 95% -Konfidenzintervall des Unterschieds im Bevölkerungsverhältnis in Python ermitteln
Ich möchte in der Einschlussnotation drucken
Ich möchte Matplotlib in PySimpleGUI einbetten
Ich habe Airbnb-Daten für diejenigen analysiert, die in Amsterdam bleiben möchten
Ich möchte aus verschiedenen Sprachen eine Verbindung zu PostgreSQL herstellen
Ich möchte Datetime.now in Djangos Test reparieren
Ich möchte mit Python ein Fenster erstellen
Ich möchte DB-Informationen in einer Liste speichern
Ich möchte verschachtelte Dicts in Python zusammenführen
Ich möchte leicht einen leckeren Laden finden
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte mit swagger-codegen in Sekundenschnelle einen Mock-Server für Python-Flask einrichten.
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte mich mit Backpropagation (tf.custom_gradient) (Tensorflow) selbst verwenden.
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Auch mit JavaScript möchte ich Python `range ()` sehen!
Ich möchte ein beliebtes Paket auf PyPi finden
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Wenn Sie in der for-Anweisung plt.save möchten
Ich möchte R-Datensatz mit Python verwenden
Ich möchte am Ende etwas mit Python machen
Ich möchte Strings in Kotlin wie Python manipulieren!
[Für Anfänger] Ich möchte die Anzahl der Lernerfahrungen leicht verständlich erklären.
Ich möchte Geschenke auch für mich selbst austauschen! [Weihnachten Hackason]
Ich möchte vorerst Selen bewegen [für Mac]
Ich möchte eine Spalte mit NA in R einfach löschen
Ich möchte so etwas wie Uniq in Python sortieren
[NetworkX] Ich möchte nach Knoten mit bestimmten Attributen suchen
[Django] Ich möchte mich nach einer neuen Registrierung automatisch anmelden
Ich möchte den Wörterbuchtyp in der Liste eindeutig machen
Referenz Referenz für diejenigen, die mit Rhinoceros / Grasshopper codieren möchten
[Einführung in Pytorch] Ich möchte Sätze in Nachrichtenartikeln generieren
Ich möchte eindeutige Werte in einem Array oder Tupel zählen
Ich möchte die gültigen Zahlen im Numpy-Array ausrichten
Ich möchte Python mit VS-Code ausführen können
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Ich möchte vorerst eine Docker-Datei erstellen.
Ich wollte den AWS-Schlüssel nicht in das Programm schreiben
Ich möchte SUDOKU lösen
Ich möchte automatisch hochwertige Teile aus den von mir aufgenommenen Videos finden
[Linux] Ich möchte das Datum wissen, an dem sich der Benutzer angemeldet hat
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Ich möchte Rails mit Rails auch in einer vagabundierenden Umgebung betreiben
LINEbot-Entwicklung möchte ich den Betrieb in der lokalen Umgebung überprüfen
[Python / AWS Lambda-Ebenen] Ich möchte nur Module in AWS Lambda-Ebenen wiederverwenden
Holz kratzen und essen - ich möchte ein gutes Restaurant finden! ~ (Arbeit)
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
Ich möchte die zweite Zeile zum Spaltennamen in Pandas machen
Vorerst möchte ich jede Datei mit ffmpeg konvertieren !!
Ich möchte den G-Test in einem Monat Tag 1 bestehen
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
Ich möchte die Desktop-Umgebung von Ubuntu vorerst auch unter Android verwenden (Termux-Version - japanische Eingabe in der Desktop-Umgebung).