Última actualización: Edgar Rueda, Mayo 2016
Nota: no ha sido revisado por pares
Con este programa se pretende sensibilizar a los estudiantes en la importancia de elegir el error estándar correcto, priorizando la exactitud sobre la precisión.
El programa permite elegir el valor exacto y su dispersión debido a la aleatoriedad en la medida. Igualmente se puede elegir el número de datos de cada muestra, el número de muestras a observar, y la incerteza en la elección del valor de la corrección de t-student.
In [1]:
import numpy as np
import pylab as plt
from scipy import stats
%matplotlib inline
In [12]:
mu = 100. # Valor exacto
sigma = 3. # Dispersión de los datos debido a factores aleatorios
data = np.random.normal(mu,sigma,1000) # Generación de datos de la distribución normal
In [14]:
incerteza = 0.01 # Incerteza aceptada para la corrección de t-student
numdatos = 3 # Número de datos de la muestra
opc = numdatos # Numero de posibles resultados a comparar (número de muestras)
l1 = np.ones(numdatos) # para graficar los datos de cada muestra en una línea
plt.figure(figsize=(16,opc*3))
promu = 0.
devmu = np.zeros(opc)
for cont in range(0,opc):
d3 = data[cont*numdatos:cont*numdatos + numdatos] # datos de la muestra
md3 = np.mean(d3) # valor promedio de la muestra
sd3 = np.std(d3,ddof=1)/np.sqrt(numdatos) # error estándar de la muestra
sd = np.std(d3,ddof=1) # Desviación estándar de una muestra
sd3_3s = 3*sd3 # error estándar con tres sigma
aux = stats.t.interval(1-incerteza,numdatos-1,loc=0,scale=1) # para determinar la corrección de t-student
valor_t = aux[1] # corrección de t-student
sd3_t = valor_t*sd3 # error estándar con t-student
# Graficación de los resultados
plt.subplot(opc,1,cont+1)
plt.axvline(mu,linewidth=3, c="black",label='valor exacto')
plt.plot(d3,l1,linewidth=0,marker='.',ms=12,c='black',label='Datos')
plt.plot([md3-sd3, md3+sd3], [1, 1], linewidth=3, linestyle="-", color="red",solid_capstyle="butt",label='sigma')
plt.plot([md3-sd3_3s, md3+sd3_3s], [2, 2], linewidth=3, linestyle="-", color="blue",solid_capstyle="butt",label='3sigma')
plt.plot([md3-sd3_t, md3+sd3_t], [3, 3], linewidth=3, linestyle="-", color="green",solid_capstyle="butt",label='t-student')
plt.legend()
plt.xlim(mu-3*sigma,mu+3*sigma)
plt.ylim(0,4)
promu = promu + md3
devmu[cont] = md3
promu = promu/float(opc)
devmu = np.std(devmu,ddof=1)
print('Dato de una muestra:')
print('media = %.1f' % md3)
print('desviación estándar = %.1f' % sd)
print('error estándar = %.1f' % (sd/np.sqrt(numdatos)))
print('\nDatos conjunto de %d muestras:' % numdatos)
print('media = %.1f' % promu)
print('desviación estándar = %.1f' % (devmu))
print('\nParámetros:')
print('Valor exacto de la media de la distribución = %.f' % mu)
print('Dispersión de los datos de la distribución (desviación estándar) = +/- %.f' % sigma)
print('Incerteza para t-student = %.f%%' % (incerteza*100))
print('Número de datos por muestra = %.d' % numdatos)
print('Número de muestras a observar = %d' % opc)
In [ ]:
In [ ]: