Puede encontrar el código completo aquí en GitHub .
El teorema del límite central captura el siguiente fenómeno:
¡Toma cualquier distribución! (digamos una distribución del número de pases en un partido de fútbol)
Comience a tomar n muestras de esa distribución (digamos n = 5) varias veces [digamos m = 1000] veces.
Tome la media de cada conjunto de muestras (así tendríamos m = 1000 medias)
La distribución de medios sería (más o menos) normalmente distribuida . (Obtendrá esa famosa curva de campana si traza las medias en el eje x y su frecuencia en el eje y).
Aumente n para obtener una desviación estándar más pequeña y aumente m para obtener una mejor aproximación a la distribución normal.
¿No puede cargar todos los datos para su procesamiento? No hay problema, tome varias muestras de los datos y utilice el teorema del límite central para estimar los parámetros de los datos como la media, la desviación estándar, la suma, etc.
Puede ahorrarle recursos en términos de tiempo y dinero. ¡Porque ahora podemos trabajar con muestras significativamente más pequeñas que la población y hacer inferencias para toda la población!
¿Pertenece una determinada muestra a una determinada población (o a un conjunto de datos)? Comprobemos eso usando la media muestral, la media poblacional, la desviación estándar muestral y la desviación estándar poblacional.
Dado un conjunto de datos con una distribución desconocida (podría ser uniforme, binomial o completamente aleatoria), las medias muestrales se aproximarán a la distribución normal.
Si tomamos cualquier conjunto de datos o una población y comenzamos a tomar muestras de la población, digamos que tomamos 10 muestras y tomamos la media de esas muestras, y seguimos haciendo esto, unas cuantas veces, digamos 1000 veces, después de hacer esto, obtenemos 1000 medias y cuando las trazamos, obtenemos una distribución llamada distribución muestral de medias muestrales.
¡Esta distribución muestral (más o menos) sigue una distribución normal! Este es el teorema del límite central. Una distribución normal tiene una serie de propiedades que son útiles para el análisis.
Fig.1 Distribución muestral de las medias muestrales (siguiendo una distribución normal)
Propiedades de una distribución normal:
La media, la moda y la mediana son todas iguales.
El 68% de los datos se encuentran dentro de una desviación estándar de la media.
El 95% de los datos se encuentran dentro de dos desviaciones estándar de la media.
La curva es simétrica en el centro (es decir, alrededor de la media, μ).
Además, la media de la distribución muestral de las medias muestrales es igual a la media poblacional. Si μ es la media poblacional y μX̅ es la media de la muestra, significa entonces:
Fig.2 media poblacional = media muestral
Y la desviación estándar de la población (σ) tiene la siguiente relación con la distribución muestral de desviación estándar (σX̅):
Si σ es la desviación estándar de la población y σX̅ es la desviación estándar de las medias muestrales, y n es el tamaño de la muestra, entonces tenemos
Fig.3 Relación entre la desviación estándar de la población y la desviación estándar de la distribución muestral
Dado que estamos tomando varias muestras de la población, las medias serían iguales (o cercanas) a la media poblacional real la mayoría de las veces. Por lo tanto, podemos esperar un pico (moda) en la distribución muestral de las medias muestrales igual a la media poblacional real.
Múltiples muestras aleatorias y sus medias se ubicarían alrededor de la media poblacional real. Por lo tanto, podemos suponer que el 50% de las medias sería mayor que la media poblacional y el 50% sería menor que eso (mediana).
Si aumentamos el tamaño de la muestra (de 10 a 20 a 30), cada vez más medias muestrales se acercarían más a la media poblacional. Por lo tanto, el promedio (media) de esas medias debería ser más o menos similar a la media poblacional.
Considere el caso extremo en el que el tamaño de la muestra es igual al tamaño de la población. Entonces, para cada muestra, la media sería la misma que la media poblacional. Esta es la distribución más estrecha (la desviación estándar de las medias muestrales, aquí es 0).
Por lo tanto, a medida que aumentamos el tamaño de la muestra (de 10 a 20 a 30), la desviación estándar tendería a disminuir (porque la dispersión en la distribución muestral sería limitada y una mayor parte de las medias muestrales se centraría en la media poblacional).
Este fenómeno se refleja en la fórmula de la "Fig. 3", donde la desviación estándar de la distribución de la muestra es inversamente proporcional a la raíz cuadrada del tamaño de la muestra.
Si tomamos más y más muestras (de 1.000 a 5.000 a 10.000), entonces la distribución muestral sería una curva más suave, porque más muestras se comportarían de acuerdo con el teorema del límite central y el patrón sería más limpio.
Entonces, simulemos el teorema del límite central mediante código:
Algunas importaciones:
import random from typing import List import matplotlib.pyplot as plt import matplotlib import statistics import pandas as pd import math
Crea una población usando random.randint()
. Puedes probar diferentes distribuciones para generar datos. El siguiente código genera una (más o menos) distribución monótonamente decreciente:
def create_population(sample_size: int) -> List[int]: """Generate a population of sample_size Args: sample_size (int): The size of the population Returns: List[int]: a list of randomly generated integers """ population = [] for _ in range(sample_size): random_number = (random.randint(0, random.randint(1, 1000))) population.append(random_number) return population
Cree muestras y tome su número medio sample_count
varias veces:
def generate_sample_mean_list(population: List[int], sample_size: int, sample_count: int) -> List[int]: """From the population generate samples of sample_size, sample_count times Args: population (List[int]): List of random numbers sample_size (int): Number of elements in each sample sample_count (int): Number of sample means in sample_mean_list Returns: List[int]: a list of sample means """ sample_mean_list = [] for _ in range(sample_count): sample = random.sample(population, sample_size) sample_mean = statistics.mean(sample) sample_mean_list.append(sample_mean) return sample_mean_list
Función para trazar la distribución de datos junto con algunas etiquetas.
def plot_hist(data: List[int], ax: matplotlib.axes.Axes, xlabel: str, ylabel: str, title: str, texts: List[str]) -> None: """Plot a histogram with labels and additional texts Args: data (List[int]): the list of data points to be plotted ax (matplotlib.axes.Axes): Axes object for text plotting xlabel (str): label on x axis ylabel (str): label on y axis title (str): title of the plot texts (List[str]): Additional texts to be plotted """ plt.hist(data, 100) plt.xlabel(xlabel) plt.ylabel(ylabel) plt.title(title) i = 0.0 for text in texts: plt.text(0.8, 0.8 - i, text, horizontalalignment="center", verticalalignment="center", transform=ax.transAxes) i += 0.05 plt.grid(True) plt.show()
La función principal para ejecutar el código:
def main(plot=True): """Driver Function Args: plot (bool, optional): Decide whether to plot or not. Defaults to True. """ fig, ax = plt.subplots() population_size = int(1E5) population = create_population(population_size) if plot: plot_hist(population, ax, "Value", "Frequency", "Histogram of Population of Random Numbers", [f"population_size={population_size}"]) population_mean = statistics.mean(population) population_stdev = statistics.stdev(population) sample_size_list = [50, 500] sample_count_list = [500, 5000] records = [] for sample_size in sample_size_list: for sample_count in sample_count_list: sample_mean_list = generate_sample_mean_list( population, sample_size, sample_count) # also called as mean of sample distribution of sample means mean_of_sample_means = round(statistics.mean(sample_mean_list), 2) # also called standard dev of sample distribution of sample means std_error = round(statistics.stdev(sample_mean_list), 2) if plot: plot_hist(sample_mean_list, ax, "Mean Value", "Frequency", "Sampling Distribution of Sample Means", [ f"sample_count={sample_count}", f"sample_size={sample_size}", f"mean_of_sample_means={mean_of_sample_means}", f"std_error={std_error}"]) record = { "sample_size": sample_size, "sample_count": sample_count, "population_mean": population_mean, "sample_mean": mean_of_sample_means, "population_stdev": population_stdev, "population_stdev_using_formula": std_error*math.sqrt(sample_size), "sample_stdev": std_error, } records.append(record) df = pd.DataFrame(records) print(df) if __name__ == "__main__": main(plot=True)
Puede encontrar el código completo aquí en GitHub .
Estadísticas de ciencia de datos de aprendizaje automático
También publicado aquí