PRESENTACIÓN

Este blog ha sido creado como complemento al texto Laboratorio de Estadística y Probabilidad con R (puede verse aquí un extracto del libro), editado en enero de 2014 por Gami Editorial, y que puede adquirirse de tres modos distintos:
  1. Servicio de reprografía de la EUITI de Bilbao.
  2. En modo online a través de este enlace.
  3. Para pedidos superiores a 15 unidades (descuento del 25%) llamando al teléfono 944711352 o enviando un email a la dirección info@bbydigital.com
Los tópicos (véase el índice) que se abordan en el libro son los que habitualmente se desarrollan en un curso básico de estadística y probabilidad: estadística descriptiva, distribuciones de probabilidad e inferencia estadística. Con objeto de poder seguir el texto con mayor comodidad, se ha creado la presente página web en la que están disponibles los datos de gran parte de los ejercicios y los scripts correspondientes a las experiencias del capítulo 9. Se irá generando, además, una fe de erratas confeccionada con las aportaciones de los lectores. Habrá también ampliaciones de los temas con ulteriores experimentos, sugerencias, críticas, etc.

La práctica educativa adquirida a lo largo de varios años en la asignatura de Métodos Estadísticos de la Ingeniería ha puesto de manifiesto un cierto grado de desinterés hacia esta materia por parte de los estudiantes que aspiran a ser ingenieros, probablemente porque no la contemplan como una disciplina esencial en su preparación para el posterior desarrollo profesional. Nada más lejos de la realidad, pues es indiscutible que la estadística es una herramienta trascendental en ese ámbito, ya que en muchas ocasiones el ingeniero ha de manejar gran cantidad de datos y moverse en un ambiente de incertidumbre.

En el contexto descrito, parece ineludible disponer de instrumentos que traten de estimular al alumno en el estudio de la estadística y la probabilidad. Impulsado por esta idea, el objetivo principal que persigue el libro es que quien acometa por primera vez el estudio de estas materias lo haga de una forma más entusiasta; el título es toda una declaración de intenciones y se ajusta, fundamentalmente, a la materia que se aborda en la segunda parte. La primera parte es así mismo importante, pues se fija como meta constituirse en un manual básico de introducción a una herramienta imprescindible en el análisis de datos.

Las prácticas con ordenador se han convertido en los últimos años en una de las apuestas más sólidas de la innovación educativa en el área de matemáticas, y en concreto resultan de gran utilidad para facilitar el aprendizaje de la estadística, ya que posibilitan visualizar y resumir grandes conjuntos de datos y permiten experimentar y simular fenómenos aleatorios. El software presentado en el libro es R, un potente programa para hacer estadística, de libre distribución en Internet. Se trata de un programa versátil, muy apropiado para llevar a cabo trabajos de experimentación. La fortaleza de R no radica exclusivamente en su capacidad para efectuar análisis de datos y análisis estadísticos, sino en su enorme potencial para experimentar; el programa es un auténtico laboratorio donde poder efectuar cualquier experiencia en estadística y probabilidad, dado que dispone de un lenguaje de programación muy sencillo.

Esperamos que el texto contribuya a despertar el interés de los alumnos, desde la cooperación y el trabajo en equipo, por la estadística y el cálculo de probabilidades, propiciando un aprendizaje más activo y comprometido. Así mismo, deseamos que sirva para familiarizarse con una herramienta de uso muy extendido en el mundo de la investigación y en el mundo profesional.

Datos del texto:

Autor: Jose Mari Eguzkitza (profesor del Departamento de Matemática Aplicada de la Universidad del País Vasco/Euskal Herriko Unibertsitatea)
-  ISBN: 978-84-15956-10-5
-  Depósito legal: GR 142-2014
-  Páginas: 182
-  Formato: 190 x 250 mm

Fe de erratas

LISTA DE ERRATAS DETECTADAS HASTA EL MOMENTO:


- Pág. 32 (fila 7 desde abajo): donde pone "...DE CAJAS..." debe poner "...DE CAJA...".
- Pág. 32 (fila 6 desde abajo): donde pone "...de cajas..." debe poner "...de caja...".
- Pág. 35 (fila 11 desde arriba): donde pone "Clases" debe poner "Intervalos".
- Pág. 41 (fila 1 desde abajo): donde pone "...compañías." debe poner "...compañías con más ventas.".
- Pág. 41 (fila 4 desde abajo): donde pone "MASS" debe poner "HSAUR".
- Pág. 53 (fila 6 desde abajo): donde pone "...entre 0 y 100..." debe poner "...entre 1 y 100...".
- Pág. 64 (fila 2 desde abajo): donde pone "...histograma..." debe poner "...diagrama de barras...".
- Pág. 64 (fila 1 desde abajo): donde pone "hist(unosydoses)" debe poner "barplot(table(unosydoses)/length(unosydoses))".
- Pág. 65 (figura primera): donde aparece un histograma debe aparecer un diagrama de barras.
- Pág. 72 (fila 5 desde arriba): donde pone "histograma" debe poner "diagrama de barras".
- Pág. 102 (fila 14 desde abajo): donde pone "...es 0.05..." debe poner "...es 0.03...".
- Pág. 102 (fila 9 desde abajo): donde pone "...conf.level=0.95..." debe poner "...alfa=0.05..".
- Pág. 102 (fila 8 desde abajo): eliminar.
- Pág. 102 (fila 7 desde abajo): eliminar.
- Pág. 102 (fila 6 desde abajo): eliminar.
- Pág. 102 (fila 5 desde abajo): eliminar.
- Pág. 102 (fila 4 desde abajo): cambiar por lo siguiente:
               > var.test.una.población.normal<-function(x,alfa=0.05) {
                  + c((length(x)-1)*var(x)/qchisq(1-alfa/2,length(x)-1),
                  + (length(x)-1)*var(x)/qchisq(alfa/2,length(x)-1)) }
- Pág. 102 (entre filas 3 y 4): añadir lo siguiente:
                  var.test.una.población.normal(nivclor)
- Pág. 102 (fila 2 desde abajo): donde pone "...0.05..." debe poner "...0.03...".
- Pág. 102 (fila 1 desde abajo): donde pone "...es 0.05..." debe poner "...es 0.03...".
- Pág. 104 (fila 9 desde abajo): donde pone "-30.455" debe poner "2430.455".
- Pág. 110 (fila 11 desde arriba): se debe eliminar esta línea: "> alfa<-0.05".
- Pág. 154 (fila 7 desde arriba): donde pone "x<-numeric(g[i]);y<-numeric(g[i])" debe poner "x<-numeric(g[i]+1);y<-numeric(g[i]+1)". Esta errata ya está corregida en los scripts de este blog.


Cualquier errata observada puede ser enviada a los comentarios de este post.

Scripts

En este enlace están disponibles todos los scripts del capítulo 9.

Datos

En este enlace están disponibles los datos de algunos ejercicios del libro.

Instalación de R

Para descargar el programa y utilizarlo en Windows se debe proceder del siguiente modo: Programa R (lista de enlaces de este blog) --> CRAN: Mirrors (en la izquierda de la pantalla) --> Mirror cercano (France, Spain,...) --> Download and install R (aquí se puede elegir el sistema operativo): Download R for Windows --> base --> Descargar el archivo R-3.2.3 for Windows --> Descomprimir --> Instalar

Experiencia complementaria 1

Se lanza una moneda 500 veces. Obtener, exactamente y mediante simulación, la probabilidad de que el número de caras no difiera de 250 en más de 10.

El script correspondiente es:

#INICIO
rm(list=ls(all=TRUE)) #Se borra todo lo anterior

#Exactamente
pbinom(260,500,0.5)-pbinom(239,500,0.5)

#Mediante simulación
n<-1000000 #n es el número de pruebas
A<-replicate(n,abs(rbinom(1,500,0.5)-250))
f<-function(x) if(x<=10) 1 else 0
for (i in 1:n)
A[i]<-f(A[i])
sum(A)/n
#FIN

Experiencia complementaria 2

Se lanza una moneda equilibrada hasta que se obtiene cara (éxito). Se trata de simular un gran número de veces esta experiencia y calcular, por simulación y teóricamente (mediante la distribución geométrica), la probabilidad de obtener el primer éxito en una determinada repetición. El script, realizado por el alumno Alvaro Sellart, pide primero en qué repetición se desea el primer éxito y, después, cuántas simulaciones se van a realizar:

#INICIO
#Para cargar el script usar el comando source("directorio del script")

n<-as.numeric(readline("Número de lanzamiento en el que aparece por primera vez éxito: "))
n2<-as.numeric(readline("Introduzca el número total de repeticiones del experimento: "))
moneda<-0:1 #éxito = 1
cont<-0 #contador para ver las veces que se tiene éxito en la tirada n

for (i in 1:n2)
{
        X<-0 #v.a "número de lanzamiento en el que aparece por primera vez éxito"
        while(sample(moneda,1)!=1){
                X<-X+1
        }
        if(X+1==n){
                cont<-cont+1
        }
}

cat("Resultado del experimento: ",cont/n2,"\n")
cat("Resultado teórico",dgeom(n-1,1/2),"\n")
#FIN

Experiencia complementaria 3

Un algoritmo genera ceros y unos con probabilidades respectivas 0,2 y 0,8. Generamos 1000 bits y obtenemos 836 unos. Nos preguntamos si el algoritmo está funcionando correctamente. Podemos simular la situación del siguiente modo, repetidas veces, para tratar de obtener empíricamente una respuesta:

rm(list=ls(all=TRUE)) #Se borra todo lo anterior
x<-c(0,1)
prob<-c(0.2,0.8)
a<-replicate(100,sum(sample(x,1000,replace=T,prob)))
hist(a)
max(a)

Experiencia complementaria 4

En esta experiencia se trata de ver el significado de los intervalos de confianza (véase apartado 9.15 del libro) en el caso de desconocer la desviación típica de la población de partida.

rm(list=ls(all=TRUE))

#Generaremos 100 muestras de tamaño 200; tendremos en total 20000 valores aleatorios de una #N(0,1), aunque se supone que desconocemos la desviación típica
valores.aleatorios<-rnorm(20000)

#Organizamos los valores anteriores en una matriz de 100 filas (y 200 columnas)
x<-matrix(valores.aleatorios,nrow=100)
#Formamos un vector con todas las medias muestrales
medias.muestrales<-margin.table(x,1)/200
xraya<-c(medias.muestrales)

#Calculamos, a continuación, las cuasidesviaciones típicas de cada una de las muestras
sds<-apply(x,1,sd)

li<-numeric(100)
ls<-numeric(100)

for (j in 1:100)
{
#Calculamos los límites inferiores (li) y superiores (ls) de los intervalos de confianza (IC) al nivel del 95%
li[j]<-c(xraya[j]-qt(0.975,199)*sds[j]/sqrt(200))
ls[j]<-c(xraya[j]+qt(0.975,199)*sds[j]/sqrt(200))
}

#Formamos todos los intervalos de confianza
IC<-matrix(c(li,ls),nrow=100)
IC
       
plot(li,type="n",ylim=c(-0.3,0.3),xlab=" ",ylab=" ")
#Con la opción type="n" no dibujamos el gráfico, solo los ejes
#A continuación dibujamos los segmentos que representan los diferentes IC
coordx<-1:100 #Situamos los IC en las verticales de los primeros 100 números naturales
segments(coordx,li,coordx,ls)
abline(h=0) #Dibujamos la línea de la media (cero)
#El gráfico de los 200 IC es

#Calculemos cuántos IC no contienen a la media
a<-c(rep(0,100))
for (i in 1:100) {if (IC[i,1]>0 | IC[i,2]<0) a[i]<-1 else 0}
a

#El número de IC que no contienen a la media es, en este caso:
sum(a)

Experiencia complementaria 5

Si se eligen valores al azar entre 0 y 1 hasta que la suma sea mayor que 1, el número medio de valores seleccionados es e

rm(list=ls(all=TRUE))

contador<-replicate(1000000,
{A<-runif(20)
AA<-cumsum(A)
f<-function(x) if(x<1) 1 else 0
sum(sapply(AA,f))+1})
mean(contador)

#El siguiente valor será, por tanto, próximo a 0:
abs(exp(1)-mean(contador))

Experiencia complementaria 6

La ley de Benford es una distribución de probabilidad que expresa cómo se distribuyen las primeras cifras de conjuntos grandes de números. Esta ley es seguida por valores que aparecen en diversas situaciones reales, como facturas (de hecho se suele utilizar para contrastar su falsedad), precios de acciones, números de habitantes, superficies de islas, etc. De acuerdo a esta ley, la probabilidad de que el primer dígito sea 1 es mayor que la de que sea 2 y esta es mayor que la de que sea 3, y así sucesivamente. En concreto, las probabilidades se calculan con la fórmula siguiente: logaritmo decimal de (1 +1/n), n=1,2,...9. 

En esta experiencia comprobamos el funcionamiento de esta ley aplicada a datos sobre poblaciones de los países del mundo (el archivo "Population.txt" se puede descargar aquí). Comparamos la distribución de frecuencias de los dígitos del 1 al 9 con las correspondientes probabilidades dadas por la ley de Benford.

rm(list=ls(all=TRUE))

#Cargamos el paquete "utils"
local({pkg <- select.list(sort(.packages(all.available = TRUE)),graphics=TRUE)
+ if(nchar(pkg)) library(pkg, character.only=TRUE)})

#Leemos datos sobre la población de los países del mundo en la página web:
#http://www.worldometers.info/world-population/population-by-country/
#Generamos el archivo 'Population.txt' con los valores de la columna 'Population (2014)'
#Lo guardamos, por ejemplo, en el disco D

#Leemos solo la primera cifra de cada valor
A<-read.fwf('D:/Population.txt',widths=c(1))
pc<-A$V1
primcif<-as.numeric(pc)
AA<-table(primcif)

split.screen(c(1,2))

#Dibujamos el diagrama de barras de frecuencias y la función de probabilidad de la ley de Benford

screen(1)
barplot(AA/length(primcif))

screen(2)
n<-1:9
plot(n,log(1+1/n,10),type='h')

#Ampliaciones sobre el tema en el paquete "benford.analysis"

Experiencia complementaria 7

Los jugadores A y B juegan a lanzar una moneda equilibrada un gran número de veces. Diremos que A va ganando si hasta el momento han salido más caras que cruces y que B va ganando si hasta el momento han salido más cruces que caras. Aun cuando la intuición pueda sugerir lo contrario, la proporción de tiempo que gana A (o B) rara vez se acerca al 50%.

rm(list=ls(all=TRUE))

#Elegimos el nº de lanzamientos n
n<-100000

#Cara=1; Cruz=0
val<-0:1

#El nº de fases del juego es x
x<-1:n

#La serie de lanzamientos es y
y<-sample(val,n,replace=T)

#El nº de caras hasta el momento es z
z<-cumsum(y)

#El nº de cruces hasta el momento es t
t<-x-z

#La diferencia entre el nº de caras y de cruces que van
#apareciendo, para cada lanzamiento, es u
u<-z-t

#Si u es positivo va ganando A (el de caras); si u es negativo
#va ganando B (el de cruces). Si u=0 van empatando

f<-function(x) {
if(x>0) {
'A'} else if (x==0) {
'-'} else if (x<0) {
'B'}
}

M<-sapply(u,f)

#Si se quiere ver la serie de resultados obtenida ejecutar
#la siguiente línea
#Resultado<-paste(M,collapse="");Resultado

MM<-sub("B","",M);MMM<-sub("-","",MM)

#Nº de veces que va ganando A
a<-nchar(paste(MMM,collapse=""));a

#Porcentaje de tiempo que ha ido ganando A
paste(round((a/n)*100,2),"%")

#El tiempo que ha ido ganando A es la zona en la que la curva está por encima del eje X
#El tiempo que ha ido ganando B es la zona en la que la curva está por debajo del eje X
plot(u,type='l')
abline(h=0)