[PYTHON] Je veux trouver des variations dans diverses statistiques! Recommandation de rééchantillonnage (Bootstrap)

L'analyse des données semble toujours en plein essor. Compte tenu des données, qu'il s'agisse d'apprentissage automatique ou autre, la première chose à faire est de visualiser les données et d'obtenir l'hypothèse pour lancer l'analyse. Pour tester l'hypothèse, nous effectuons diverses analyses et calculons diverses statistiques.

Si vous faites cela, vous pouvez rencontrer une situation où vous voulez connaître ** la variation d'une population de statistiques **.

S'il s'agit de la moyenne des données, vous pouvez calculer l'erreur standard de la moyenne. C'est l'écart type divisé par la racine carrée du nombre de données.

Cependant, dans l'analyse, non seulement la moyenne, mais également diverses statistiques telles que la médiane, le centile et le coefficient de corrélation seront examinées. Et il n'y a pas de formule simple pour ceux-ci qui puisse quantifier des variations telles que ** l'erreur standard et l'intervalle de confiance **.

Dans un tel cas, le ** rééchantillonnage **, en particulier ** Bootstrap **, est utile.

Qu'est-ce qu'une sangle de démarrage?

Bootstrap crée d'abord des milliers d'ensembles de données similaires à partir des données d'origine par rééchantillonnage. Ensuite, pour chaque jeu de données, calculez les statistiques souhaitées. Ensuite, la distribution de la statistique est créée et l'erreur standard de la statistique peut être obtenue en calculant l'écart-type de la distribution.

À titre d'exemple, disons que vous avez des données de QI pour 20 personnes. Disons que les valeurs sont respectivement 61, 88, 89, 89, 90, 92, 93, 94, 98, 98, 101, 102, 105, 108, 109, 113, 114, 115, 120, 138. La distribution ressemble à ceci:

figure1.png

À ce moment, la valeur moyenne est de 100,85 et l'erreur standard de la moyenne est de 3,45.

Cependant, la distribution de ces valeurs, comme le revenu, est que la valeur médiane reflète le sentiment réel de la personne plutôt que la valeur moyenne. Donc, cette fois, j'aimerais utiliser le bootstrap pour trouver la variation de la valeur médiane, c'est-à-dire ** erreur standard de la médiane **.

Algorithme de bootstrap

La sangle de démarrage est réalisée selon le flux suivant.

1: Décidez combien de fois vous souhaitez rééchantillonner. Faites-en un grand nombre, tel que 500, 1000, 10000, 100000. Cette fois, j'essaierai 1000.

2: Rééchantillonner et générer artificiellement des données. À ce stade, ** autorisez la duplication et extrayez autant d'échantillons de données que le nombre d'échantillons des données d'origine **.

Par exemple, si les données d'origine étaient $ X_1, X_2, ..., X_5 $ et $ 5 $, voici un exemple de l'ensemble de données généré chaque fois qu'il est rééchantillonné.

Rééchantillonner 1 = $ X1, X2, X3, X3, X4 $ Rééchantillonner 2 = $ X1, X1, X3, X4, X4 $ Rééchantillonner 3 = $ X2, X2, X5, X5, X5 $ ...... Rééchantillonner 998 = $ X1, X2, X3, X4, X5 $ Rééchantillonner 999 = $ X1, X3, X4, X5, X5 $ Rééchantillonner 1000 = $ X3, X3, X3, X3, X4 $

De cette manière, la duplication est autorisée pour le nombre déterminé à l'étape 1, et des échantillons de données sont extraits à plusieurs reprises pour le nombre de données d'origine, et les données sont créées artificiellement.

L'échantillon de données inclus dans chaque rééchantillonnage est aléatoire. Parfois, les cinq auront la même valeur, et parfois les cinq auront des valeurs différentes.

3: Pour chaque rééchantillonnage, calculez les statistiques que vous souhaitez trouver. Quelle que soit la médiane, chaque donnée rééchantillonnée est utilisée pour trouver les statistiques. Si vous rééchantillonnez 1000 fois, vous pouvez obtenir 1000 statistiques.

Rééchantillonner 1 = $ X1, X2, X3, X3, X4 $ $ \ en $ Statistiques = $ S1 $ Rééchantillonner 2 = $ X1, X1, X3, X4, X4 $ $ \ to $ Statistics = $ S2 $ Rééchantillonner 3 = $ X2, X2, X5, X5, X5 $ $ \ à $ Statistics = $ S3 $ ...... Rééchantillonner 998 = $ X1, X2, X3, X4, X5 $ $ \ à $ Statistics = $ S998 $ Rééchantillonner 999 = $ X1, X3, X4, X5, X5 $ $ \ en $ Statistics = $ S999 $ Rééchantillonner 1000 = $ X3, X3, X3, X3, X4 $ $ \ en $ Statistiques = $ S1000 $

Vous avez beaucoup de statistiques. Et pensez comme ça.

«Vous pouvez considérer la distribution de ce lot de statistiques comme ** presque la même que celle de la population de cette statistique **! Parce que ** après plus d'expérimentation et beaucoup de données, c'est similaire. Seules les données de valeur augmenteront ** Parce que !! "

Ainsi, bootstrap utilise des astuces statistiques pour augmenter le nombre de données, pas expérimentalement. Et si le nombre de données est important dans une certaine mesure, la distribution doit être aussi proche que possible de la distribution de la population.   4: Calculez la variation (erreur standard, intervalle de confiance, etc.) en utilisant la distribution statistique obtenue Par exemple, ** l'erreur standard est l'écart type de la distribution de la population **, vous pouvez donc simplement trouver l'écart-type de la distribution statistique obtenue.

De cette façon, il est possible de trouver la variation des statistiques qui vous intéresse.

Pratique Bootstrap

Faisons-le avec python (Matlab / Octave est également ci-dessous).

Tout d'abord, procurez-vous la bibliothèque dont vous avez besoin.


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

Utilisez Numpy pour placer les données dans le tableau.


# 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])

En tant que statistiques de base, calculez la valeur moyenne, l'erreur standard de la valeur moyenne et la valeur médiane.


# 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)

Nous avons pu calculer la moyenne: 100,85, l'erreur standard de la moyenne: 3,45 et la médiane: 99,5, respectivement.

Exécutez un bootstrap pour trouver l'erreur standard de la médiane. Pour vérifier si le bootstrap est correct, l'erreur standard de la valeur moyenne est également calculée.

Pour trier les valeurs entières consécutives de 1 à n de manière aléatoire avec des doublons en python, procédez comme suit.


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

Utilisez ceci pour rééchantillonner le bootstrap.


# 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   

Si vous exécutez cette fonction avec x = iq, repeats = 1000, vous pouvez voir la distribution des 1000 valeurs médianes trouvées par le bootstrap.

figure2.png

...... Je pense qu'il aurait été préférable d'avoir plus de répétitions.

Pour le moment, l'erreur standard de la valeur médiane peut être obtenue à partir de cette distribution. Calculez simplement l'écart type de ** 1000 valeurs médianes **.

De même, calculez l'erreur standard de la valeur moyenne.

Premièrement, l'erreur standard de la valeur moyenne obtenue à partir des données d'origine est de 3,45, donc c'est assez proche. Le bootstrap semble avoir correctement estimé la variation des statistiques.

point important Le bootstrap ** rééchantillonne au hasard, donc les résultats seront légèrement différents à chaque fois que vous exécutez **. Pour réduire la variation des résultats et effectuer des estimations plus précises, vous devez augmenter le nombre d'itérations (~ 10 000).

Résumé du résumé

Bootstrap vous permet d'estimer les variations des statistiques d'intérêt par rééchantillonnage.

À la fin

Je pense que quiconque pense au rééchantillonnage dans les statistiques, y compris le bootstrap, est un génie. En augmentant artificiellement les données et en rapprochant la répartition de la population, vous serez libéré des pénalités de continuer à collecter des données pour le moment! Bien sûr, peu importe combien vous rééchantillonnez, vous ne pourrez jamais approcher la population à moins de collecter réellement des données et de collecter des exemples représentatifs de la population.

Le code source est répertorié ci-dessous.

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 est ci-dessous.

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,:));

Référence

Recommended Posts

Je veux trouver des variations dans diverses statistiques! Recommandation de rééchantillonnage (Bootstrap)
Je veux juste trouver l'intervalle de confiance à 95% de la différence de ratio de population en Python
Je veux imprimer dans la notation d'inclusion
Je veux intégrer Matplotlib dans PySimpleGUI
J'ai analysé les données Airbnb pour ceux qui veulent rester à Amsterdam
Je souhaite me connecter à PostgreSQL à partir de plusieurs langues
Je veux corriger Datetime.now dans le test de Django
Je veux créer une fenêtre avec Python
Je souhaite stocker les informations de la base de données dans la liste
Je veux fusionner des dictionnaires imbriqués en Python
Je veux trouver facilement une délicieuse boutique
Je veux afficher la progression en Python!
Je veux configurer un serveur fictif pour python-flask en quelques secondes en utilisant swagger-codegen.
Je veux écrire en Python! (1) Vérification du format de code
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Je veux faire la transition avec un bouton sur le ballon
Je veux utiliser self avec Backpropagation (tf.custom_gradient) (tensorflow)
Je veux écrire en Python! (2) Écrivons un test
Même avec JavaScript, je veux voir Python `range ()`!
Je veux trouver un package populaire sur PyPi
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
Je veux écrire en Python! (3) Utiliser des simulacres
Lorsque vous voulez plt.save dans l'instruction for
Je veux utiliser le jeu de données R avec python
Je veux faire quelque chose avec Python à la fin
Je veux manipuler des chaînes dans Kotlin comme Python!
[Pour les débutants] Je souhaite expliquer le nombre d’apprentissage d’une manière facile à comprendre.
Je veux échanger des cadeaux même pour moi! [Christmas Hackason]
Je veux déplacer le sélénium pour le moment [pour mac]
Je souhaite supprimer facilement une colonne contenant NA dans R
Je veux faire quelque chose comme sort uniq en Python
[NetworkX] Je souhaite rechercher des nœuds avec des attributs spécifiques
[Django] Je souhaite me connecter automatiquement après une nouvelle inscription
Je veux rendre le type de dictionnaire dans la liste unique
Référence de référence pour ceux qui veulent coder avec Rhinoceros / Grasshopper
[Introduction à Pytorch] Je souhaite générer des phrases dans des articles de presse
Je veux compter des valeurs uniques dans un tableau ou un tuple
Je veux aligner les nombres valides dans le tableau Numpy
Je veux pouvoir exécuter Python avec VS Code
Je veux ajouter un joli complément à input () en python
Je veux créer un Dockerfile pour le moment.
Je ne voulais pas écrire la clé AWS dans le programme
Je veux résoudre SUDOKU
Je veux trouver automatiquement des pièces de haute qualité à partir des vidéos que j'ai tournées
[Linux] Je souhaite connaître la date à laquelle l'utilisateur s'est connecté
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
Je veux utiliser des rails avec des rails même dans un environnement vagabond
Développement LINEbot, je souhaite vérifier le fonctionnement dans l'environnement local
[Couches Python / AWS Lambda] Je souhaite réutiliser uniquement le module dans AWS Lambda Layers
Gratter et manger des bûches - je veux trouver un bon restaurant! ~ (Travail)
Je veux créer un fichier pip et le refléter dans le menu fixe
Je veux faire de la deuxième ligne le nom de la colonne dans pandas
Pour le moment, je veux convertir n'importe quel fichier avec ffmpeg !!
Je veux réussir le test G dans un mois Jour 1
Je veux connaître la population de chaque pays du monde.
Je souhaite utiliser l'environnement de bureau d'Ubuntu même sur Android pour le moment (entrée version japonaise de Termux dans l'environnement de bureau)