En esta entrada vamos a ver la forma de tabular y resolver un ejercicio tipo de 2º de CCSS en el que se pide comprobar que con m.a.s. se verifica que en la distribución de las medias muestrales se tiene que:
Aunque las tablas que se obtienen de solución se pueden realizar con pandas de forma más fácil (de forma similar a como se hace en Tabla de derivadas e integrales usando LyX y pythontex), he optado por hacerlas de forma constructiva. De esa forma se pueden tener varios ejemplos de cómo mezclar LateX con funciones de python para obtener tablas tras compilar nuestro fichero con pdflatex. A partir de ellas se pueden coger ideas para realizar otro tipo de tablas con pythontex.
En la solución propuesta se ha trabajado con numpy, una librería imprescindible para el trabajo de problemas que impliquen el uso de vectores o matrices. También se usa la librería de python itertools. En ejemplos que veremos después sobre probabilidad, comprobaremos que también se podría hacer son sympy.
La solución de este ejercicio está parametrizada y en él solo hay que establecer tres variables en el inicio del código, se trata de:
#redondeo r=4 #tamaño de las muestras n=2 #valores para el muestreo pos=[3,5,7,8,9,10]
A partir de esos datos de entrada podemos resolver todo tipo de problemas con un enunciado similar a:
Ejercicio
Se dispone de tornillos de 3 , 5 , 7 , 8 , 9 , 10 gramos de peso respectivamente.
- Mediante muestreo aleatorio simple, exprese todas las muestras posibles de tamaño .
- Halla la media, la varianza y la desviación típica de los pesos medios muestrales.
- Halla la media y la desviación típica de la población.
- ¿Qué relación existe entre los resultados de los dos apartados anteriores?
y obtendríamos de:
Solución
Suponemos que hay reemplazamiento, por tanto el número de muestras posibles es y se obtiene de espacio muestral:
{ (3, 3) , (3, 5) , (3, 7) , (3, 8) , (3, 9) , (3, 10) , (5, 3) , (5, 5) , (5, 7) , (5, 8) , (5, 9) , (5, 10) , (7, 3) , (7, 5) , (7, 7) , (7, 8) , (7, 9) , (7, 10) , (8, 3) , (8, 5) , (8, 7) , (8, 8) , (8, 9) , (8, 10) , (9, 3) , (9, 5) , (9, 7) , (9, 8) , (9, 9) , (9, 10) , (10, 3) , (10, 5) , (10, 7) , (10, 8) , (10, 9) , (10, 10) }
Tenemos que obtener todas las medias muestrales a partir de las muestras anteriores:
{ 3.0 , 4.0 , 5.0 , 5.5 , 6.0 , 6.5 , 4.0 , 5.0 , 6.0 , 6.5 , 7.0 , 7.5 , 5.0 , 6.0 , 7.0 , 7.5 , 8.0 , 8.5 , 5.5 , 6.5 , 7.5 , 8.0 , 8.5 , 9.0 , 6.0 , 7.0 , 8.0 , 8.5 , 9.0 , 9.5 , 6.5 , 7.5 , 8.5 , 9.0 , 9.5 , 10.0 }
3.00 1 3.00 9.00 4.00 2 8.00 32.00 5.00 3 15.00 75.00 5.50 2 11.00 60.50 6.00 4 24.00 144.00 6.50 4 26.00 169.00 7.00 3 21.00 147.00 7.50 4 30.00 225.00 8.00 3 24.00 192.00 8.50 4 34.00 289.00 9.00 3 27.00 243.00 9.50 2 19.00 180.50 10.00 1 10.00 100.00 36 252.00 1866.00 Por tanto:
Hagamos una tabla para calcularlas:
3 9 5 25 7 49 8 64 9 81 10 100 42 328 Por tanto
De lo anterior se puede ver que (hay que tener en cuenta que es el tamaño de las muestras):
El código python usado es:
\begin{pycode} #se usa para obtener el espacio muestral de las muestras import itertools import math import numpy as np #redondeo r=4 #tamaño de las muestras n=2 #valores para el muestreo pos=[3,5,7,8,9,10] #tamaño población tp=len(pos) #hallo el espacio muestral em=list(itertools.product(pos,repeat=n)) #número de elementos del espacio muestral nm=len(em) #para mostrar el espacio muestral elemento a elemento y que no se muestre en una línea def imprEM(): print(r"\{") for i in range(nm-1): print(em[i]) print(", ") else: print(em[i+1]) print(r"\}") #medias muestrales xm=[] for i in em: aux=i[0] for j in range(1,n): aux=aux+i[j] xm.append(aux/n) #lo paso a lista y con los valores redondeados xm=list(np.round(xm,r)) #para mostrar las medias muestrales elemento a elemento y que no se muestre en una línea def imprMM(): print(r"\{") for i in range(len(xm)-1): print(xm[i]) print(", ") else: print(xm[i+1]) print(r"\}") #paso pos a array de numpy x=np.array(pos) #hallo xi*xi para la varianza de la población x2=x*x #medias, varianza y desviación típica poblacionales, se pueden usar las funciones de numpy mu=round(np.mean(x),r) s2=round((x2.sum()/tp)-mu**2,r) s=round(math.sqrt(s2),r) #este se calcula solo para comprobar que sale lo mismo que #el valor obtenido después de dtp (desviación típica poblacional) sp=round(s/math.sqrt(n),r) #obtengo los valores y las frecuencias de las muestras fM=np.array(np.unique(xm, return_counts=True)).T #creo dos arrays para tener solo los #valores de la primera columna fMv=fM[:,0] #frecuencias de la segunda columna fMf=fM[:,1] #hallo fi*xi y fi*xi**2 xf=fMv*fMf x2f=xf*fMv #media y varianza poblacionales #uso las funciones de numpy para la media, varianza y la desviación típica mp=round(np.mean(xm),r) vp=round(np.var(xm),r) dtp=round(np.std(xm),r) #para mostrar la lista de elementos bien def imprDatos(): print(pos[0]) for i in range(1,tp): print(", "+str(pos[i])) #crea la tabla para la población def creaTablaP(): print(r"\begin{tabular}{c|r}") print(r"$x_i$ & $x_i^2$ \\ \hline") for i in range(tp): print(r"%d & %d \\ \hline" % (pos[i], pos[i]**2)) print(r" \hline %d & %d \\ \hline" % (x.sum(),x2.sum())) print(r"\end{tabular}") #crea la tabla para la distribución de las medias muestrales def creaTablaM(): print(r"\begin{tabular}{c|r|r|r}") print(r"$\bar{x}_i$ & $f_i$ & $f_i \cdot \bar{x}_i$ & $f_i \cdot \bar{x}_i^2$ \\ \hline") for i in range(len(fM)): print(r"%.2f & %d & %.2f & %.2f \\ \hline" % (fMv[i], fMf[i], xf[i], x2f[i] )) print(r" \hline %s & %d & %.2f & %.2f \\ \hline" % ("",fMf.sum(), xf.sum(), x2f.sum())) print(r"\end{tabular}") \end{pycode}