[PYTHON] J'ai essayé de confirmer si l'estimation impartiale de l'écart-type était vraiment impartiale en "jetant des pièces 10 000 fois"

Quand j'étais étudiant [^ majeur], quand j'ai touché au domaine des statistiques en mathématiques, j'ai appris cela.

Lorsque vous choisissez certains échantillons de la population et en déduisez les tendances de la population ** (enquête par sondage) **

  • Probabilistiquement ** la moyenne de l'échantillon représente la moyenne de la population **, mais
  • Une mesure de ** «variation», comme l'écart type, ** a tendance à être moins probable que celle de la population ** de l'échantillon.

en bref,

** L'écart type de l'échantillon est inférieur à la population **! ΩΩΩ

à propos de ça.

Immédiatement après cela, on m'a appris la formule de la ** "dispersion non biaisée" ** en divisant par $ n -1 $ au lieu du nombre d'échantillons $ n $, mais à ce moment-là, les informations que j'avais entendues comme "Hmm", Avez-vous déjà voulu vous en assurer?

Même s'il est dit dans une preuve algébrique appropriée que "la valeur attendue de la variance sans biais est égale à la variance de la population", c'est certainement le cas, mais après tout ** je ne vois pas de données concrètes [^ attraction]. N'avez-vous pas vu que ce n'est pas si rafraîchissant **?

Cependant, ** il n'y a pas de données pour le confirmer **, et compte tenu du biais de l'échantillon, ** je ne peux pas être sûr si je le calcule une ou deux fois ** …….

attends une minute. N'est-ce pas la boîte (ou la planche) devant toi ** pour ça **? ~~ Je me sens différent. Mais au moins, il ne devrait pas être là pour s'encourager mutuellement sur ** 5ch **. ~~ Si vous avez un ordinateur, vous pouvez lancer des pièces 10 000 fois ** car c'est ** avant le petit-déjeuner **.

Une question simple qui a été volée dans l'enfance, ** Frappons-la avec l'informatique **.

[^ major]: Ma spécialité était les études fantômes. [^ abstraction]: Les mathématiques sont une étude qui met l'accent sur l'abstraction (généralisation) plutôt que sur le concret (exemple), donc cela ne peut pas être aidé.

Vivez dans le monde virtuel

Cette fois, nous utiliserons ** Python + JupyterLab ** pour exécuter la simulation. Cependant, peu importe ce que vous utilisez **. Pour le moment ** Je l'utilise pour les affaires ** Récemment, j'ai posté étrangement ** des articles Python sur Qiita **, donc cela ne veut rien dire de plus. Alors ** Arrêtez les batailles de montage et autres choses folles dans les langages de programmation maintenant **. Surtout pour les langues naturelles [^ English].

In[]


import math

import matplotlib.pyplot as plt
import numpy as np

Cette fois, la population est supposée suivre une distribution régulière ** avec une moyenne de 50 et un écart type de 10. En passant, ce $ \ mathcal {N} (50, 10 ^ 2) $ est également une ** définition de la valeur de l'écart **. Généralement, seule la partie "transformée pour que la moyenne devienne 50" est connue, mais la partie ** écart type 10 ** est ** assez importante . Grâce à cela, " à quel point les résultats sont exceptionnels **" peut être discuté de manière unifiée. De plus, il y a beaucoup de gens qui font un malentendu ridicule ** parce que la limite inférieure est 0 et la limite supérieure est 100 ** parce qu'ils choisissent un nombre significatif tel que 50 [^ écart].

In[]


mu = 50.
sigma = 10.

Le nombre d'échantillons à extraire est de ** 10 **. Cela dépend de la taille de la population, mais je pense que c'est ** assez petit ** pour l'enquête. À cette époque, il a été dit qu'il y avait au moins 2000 personnes dans les graines de trivia ** Hé, cet article est-il différent de trop de déraillements **? Même un si petit échantillon correspond-il correctement à la population quand on le regarde à la valeur attendue? J'ai hâte d'y être.

In[]


samples_num = 10

[^ Traduction]: Pourquoi un certain nombre de personnes qui dénoncent l'irrégularité de l'anglais comme la tête d'un démon surgissent? C'est désagréable. [^ déviation]: Quand j'étais enfant, je craignais que si je transformais en dessous de la moyenne de 0 à 50 et au-dessus de la moyenne de 50 à 100, ce serait une distribution très déformée. Je suis seul.

moyenne

Tout d'abord, jetons un coup d'œil à la ** moyenne **, qui est un indice dit "sans problème dans les enquêtes par sondage (probablement) tel quel".

In[]


np.random.seed(555)

mean_list = []
for _ in range(10000):
    samples = np.random.normal(mu, sigma, samples_num)
    mean_list.append(np.mean(samples))
mean = np.array(mean_list)

plt.hist(mean, bins=30, density=True, histtype='stepfilled')
plt.title(F'Mean: $\\mu = {np.mean(mean):.3f}$, $\\sigma = {np.std(mean):.3f}$')
plt.show()

mean.png

En conséquence, la moyenne des résultats de 10000 enquêtes par sondage était de ** 50,022 **. Puisque la moyenne de la population est de ** 50 **, elle peut être estimée ** correctement **. Je ne sais pas si l'écart type de 3,218 est grand ou petit, mais il est probable que ** plus d'échantillons réduiront la variation **.

écart-type

Vient ensuite le protagoniste d'aujourd'hui, ** Ecart type **.

In[]


np.random.seed(913)

std_list = []
for _ in range(10000):
    samples = np.random.normal(mu, sigma, samples_num)
    std_list.append(np.std(samples))
std = np.array(std_list)

plt.hist(std, bins=30, density=True, histtype='stepfilled')
plt.title(F'Standard Deviation: $\\mu = {np.mean(std):.3f}$, $\\sigma = {np.std(std):.3f}$')
plt.show()

std.png

En conséquence, la moyenne de 10 000 enquêtes par sondage était de ** 9,235 **. L'écart type de la population est de ** 10 **, il est donc certainement ** sous-estimé **.

Estimation impartiale de l'écart type [^ sans biais]

Le ** écart type ** est la ** (non négative) ** racine carrée ** de la ** variance. La ** variance ** est la ** moyenne ** de chaque donnée ** «la différence au carré de la moyenne». $ s = \sqrt{s^2} = \sqrt{\frac{1}{n}\sum_{i = 1}^n(x_i - \overline{x})^2} $ Lors de la sélection aléatoire d'échantillons **, il est peu probable que des valeurs grandes ou petites qui s'écartent trop de la moyenne soient sélectionnées ** (mis à part la variabilité uniforme et la distribution de merde), que dois-je faire? Il sera sous-estimé.

La raison pour laquelle cela se produit est que si vous faites référence à des livres et à des sites Web qui sont écrits plus sérieusement sur diverses statistiques, la valeur obtenue en divisant par $ n $ au lieu de diviser par $ n $ pour obtenir la moyenne ** $ n -1 $ ** correspond à la valeur attendue ** de la variance de la population **. $ u^2 = \frac{1}{n - 1}\sum_{i = 1}^{n}(x_i - \overline{x})^2 = \frac{n}{n - 1}s^2 $

E(u^2) = \sigma^2

Ensuite, ** la valeur attendue de la racine carrée ** correspond-elle à l'écart type de la population **? ** Elle est légèrement différente **, et elle est calculée par la formule suivante. $ D = \sqrt{\frac{n - 1}{2}}\frac{\Gamma\left(\frac{n - 1}{2}\right)}{\Gamma\left(\frac{n}{2}\right)}u = \sqrt{\frac{n}{2}}\frac{\Gamma\left(\frac{n - 1}{2}\right)}{\Gamma\left(\frac{n}{2}\right)}s $

E(D) = \sigma

** Quelle est cette formule **. Au fait, il semble que $ \ Gamma (n) = (n -1)! $ Dans la gamme des nombres naturels. ** Je ne sais pas **.

Quoi qu'il en soit, en me référant à cette description, j'écrirai une fonction pour trouver le coefficient de $ s $.

In[]


def ustd_coefficient(n):
    try:
        return math.sqrt(n / 2) * math.gamma((n - 1) / 2) / math.gamma(n / 2)
    except OverflowError:
        return math.sqrt(n / (n - 1.5))

In[]


np.random.seed(333)

D_list = []
for _ in range(10000):
    samples = np.random.normal(mu, sigma, samples_num)
    D_list.append(np.std(samples) * ustd_coefficient(len(samples)))
D = np.array(D_list)

plt.hist(D, bins=30, density=True, histtype='stepfilled')
plt.title(F'Unbiased Standard Deviation: $\\mu = {np.mean(D):.3f}$, $\\sigma = {np.std(D):.3f}$')
plt.show()

unbiased_std.png

En conséquence, la moyenne de 10 000 enquêtes par sondage était de ** 10 024 **. L'écart type de la population étant de ** 10 **, il semble que l'écart-type de la population puisse être estimé **.

[^ impartial]: Cette phrase ridiculement longue est due à la confusion des termes dans ce domaine. La variance de l'échantillon (écart-type) est-elle appelée «variance de l'échantillon (écart-type de l'échantillon)» ou l'estimation sans biais est-elle appelée «variance de l'échantillon (écart-type de l'échantillon)» parce qu'elle est utilisée pour les enquêtes par sondage? L'écart-type sans biais est-il «l'estimation sans biais de l'écart-type de la population» ou la «racine carrée de l'estimation sans biais de la variance de la population»? Ah, c'est foiré.

Médian

À partir de là, il y a un ** bonus **.

Il semble que les gens qui mordent un peu les statistiques sont teintés d'idées comme ** "La moyenne, c'est putain! Sortons de la dépendance moyenne!" ** [Source] </ sup>, mais de telles personnes ont été décidées La ** valeur médiane ** est mise en évidence. En ce moment, essayons cela aussi.

** Dans la distribution normale, la valeur moyenne et la valeur médiane correspondent **, de sorte que la valeur médiane de la population est également de 50 **.

Je vais essayer de prédire ce qui va m'arriver. Tout d'abord, ** médiane ** est une valeur qui divise toutes les valeurs en 1: 1 **. Ainsi, lors du prélèvement d'un échantillon, la ** probabilité de tomber sous la médiane ** de la population ** et la probabilité de ** dépasser ** sont clairement ** égales ** par définition. .. Ainsi, la valeur qui divise l'échantillon en 1: 1 continuerait ** à converger vers celle de la population **.

Vérifions-le.

In[]


np.random.seed(753)

median_list = []
for _ in range(10000):
    samples = np.random.normal(mu, sigma, samples_num)
    median_list.append(np.median(samples))
median = np.array(median_list)

plt.hist(median, bins=30, density=True, histtype='stepfilled')
plt.title(F'Median: $\\mu = {np.mean(median):.3f}$, $\\sigma = {np.std(median):.3f}$')
plt.show()

median.png

En conséquence, la moyenne de 10000 enquêtes par sondage était de ** 50,040 **. Comme la population médiane est de ** 50 **, comme prévu, elle peut être estimée correctement à partir de ** l'échantillon **.

Gamme de quadrants réguliers

Enfin, regardons la ** plage du quadrant régulier **. Comme confirmé dans Article précédent, ** l'écart type et la plage normale du quadrant correspondent dans la distribution normale **, donc ** population La plage du quadrant régulier est également de 10 **.

Oh, NumPy n'a pas de fonction pour calculer la plage de quadrant normale, alors je vais l'inventer.

In[]


def np_iqr(a, axis=None, out=None, overwrite_input=False, keepdims=False):
    q1 = np.quantile(a, q=0.25, axis=axis, overwrite_input=overwrite_input, keepdims=keepdims)
    q3 = np.quantile(a, q=0.75, axis=axis, overwrite_input=overwrite_input, keepdims=keepdims)
    return np.subtract(q3, q1, out=out)

def np_niqr(a, axis=None, out=None, overwrite_input=False, keepdims=False):
    return np.divide(np.iqr(a, axis=axis, overwrite_input=overwrite_input, keepdims=keepdims), 1.3489795003921634, out=out)

np.iqr = np_iqr
np.niqr = np_niqr

Je vais essayer de prédire ce qui va m'arriver. Premièrement, le ** quadrant régulier ** est la ** différence entre les tuiles quantiques du haut et du bas **. À l'extrême des carreaux quantiques, lorsqu'on considère le ** minimum et le maximum **, le ** minimum de l'échantillon ** est souvent ** supérieur au minimum de population ** * * Probablement, le ** maximum de l'échantillon ** sera très probablement ** plus petit ** que le maximum de population **. Autrement dit, ** les quanttiles de l'échantillon ont tendance à être biaisés vers l'intérieur de celui de la population ** (la médiane n'était que le quantite intermédiaire et n'était pas affectée). En conséquence, on peut s'attendre à ce que la ** plage du quadrant régulier soit sous-estimée ** celle de la population.

Vérifions-le.

In[]


np.random.seed(315)

niqr_list = []
for _ in range(10000):
    samples = np.random.normal(mu, sigma, samples_num)
    niqr_list.append(np.niqr(samples))
niqr = np.array(niqr_list)

plt.hist(niqr, bins=30, density=True, histtype='stepfilled')
plt.title(F'Normalized Interquartile Range: $\\mu = {np.mean(niqr):.3f}$, $\\sigma = {np.std(niqr):.3f}$')
plt.show()

niqr.png

En conséquence, la moyenne de 10 000 enquêtes par sondage était de ** 8,640 **. Puisque la fourchette du quadrant régulier de la population est ** 10 **, elle est encore ** sous-estimée ** comme prévu **.

Épilogue

Comment trouvez-vous une estimation non biaisée de la plage normale du quadrant?

Recommended Posts

J'ai essayé de confirmer si l'estimation impartiale de l'écart-type était vraiment impartiale en "jetant des pièces 10 000 fois"
J'ai essayé d'analyser les émotions si Hinatazaka 46 est vraiment une "aura heureuse"
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé de vérifier à l'aide du réseau neuronal si «japonais» uniquement «polices illisibles» ne peuvent vraiment être lus que par le japonais
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [-1]. (La zone cachée est-elle vraiment visible?)
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
Django super introduction par les débutants Python! Partie 6 J'ai essayé d'implémenter la fonction de connexion
J'ai réfléchi un peu car Trace Plot du paramètre de stan est difficile à voir
J'ai essayé de créer une API RESTful en connectant l'API rapide du framework Python explosif à MySQL.
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
J'ai essayé de prédire les ventes de logiciels de jeux avec VARISTA en me référant à l'article du Codexa
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai fait une fonction pour vérifier le modèle de DCGAN
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé un peu le comportement de la fonction zip
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
Y a-t-il un secret dans la fréquence des nombres de rapport de circonférence?
J'ai essayé de déverrouiller l'entrée 2 lock sésame d'une simple pression sur le bouton AWS IoT
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 1
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 2
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé de résumer le contenu de chaque paquet enregistré par Python pip en une seule ligne
Une petite histoire addictive avec les permissions du répertoire spécifié par expdp (pour les débutants)
[Vous devez le savoir! ] J'ai essayé de mettre en place un environnement Python de manière rentable en utilisant pleinement les privilèges des étudiants universitaires.
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
J'ai essayé de créer un pointage de crédit simple avec régression logistique.
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬