2014-11-10

Test de normalidad Shapiro–Wilk en R

Title La prueba de Shapiro-Wilk es un test estadístico empleado para contrastar la normalidad de un conjunto de datos. Publicado en 1965 por Samuel Shapiro y Martin Wilk.

El test utiliza el contraste de hipótesis para rechazar la normalidad de la muestra. La hipótesis nula asume que la muestra proviene de una población distribuida normalmente. Si el valor p es menor al nivel de significación establecido (convencionalmente un 0.05) se rechaza la hipótesis nula y se considera que hay evidencia para concluir que la muestra no proviene de una distribución normal. Sin embargo, conviene recordar que en caso contrario —el valor p es mayor que el nivel de significación establecido— no se acepta la hipótesis alternativa, simplemente no se rechaza la hipótesis nula. No se demuestra nada.

Test Shapiro-Wilk

set.seed(2001)
serie <- rnorm(100)
qqnorm(serie)
qqline(serie)
shapiro.test(serie)
Shapiro-Wilk normality test

data:  serie
W = 0.9867, p-value = 0.4204
Como el valor p = 0.4204 es mayor que 0.05, no se rechaza la hipótesis nula.

Gráfico Q-Q

En general, el test está influenciado por el tamaño de la muestra. Para muestras muy pequeñas no se detectarán incluso grandes desviaciones de la normalidad, y para muestras muy grandes, incluso pequeñas desviaciones de la normalidad provocarán rechazar la hipótesis nula. Por ello, adicionalmente, es necesario contrastar la normalidad mediante otras pruebas o visualmente, como por ejemplo, con un gráfico Q-Q.

Referencias

2014-11-08

Consulta de parámetros en Ms Access

Title Una consulta de parámetros es una consulta que solicitará, mediante un cuadro de diálogo, información que empleará como criterios de una consulta. Los criterios de una consulta sirven para restringir o filtrar los registros que nos devolverá la consulta. Si cambiamos los criterios con frecuencia, este tipo de consulta es especialmente útil porque permite cambiar los mismos sin necesidad de abrirla repetidamente en vista de diseño. Las consultas de parámetros también valen como base para formularios e informes.

Elementos a tener en cuenta

- En el campo a filtrar, escribimos en el criterio entre corchetes el texto que deseamos que aparezca en el cuadro de diálogo solicitando la información.
- El texto escrito en la fila criterios no puede ser idéntico al nombre de ese campo. Una solución es rodearlo del símbolo de interrogación: [¿Nombre del campo?]
- Se pueden crear consultas de parámetros con múltiples criterios, por cada criterio aparecerá un cuadro de diálogo diferente.
- No se pueden usar ni puntos (.) ni signos de exclamación (!) como texto en el mensaje de petición de parámetros.
- Presionamos Mayús+F9 para ejecutar la consulta inmediatamente.

Consulta de un parámetro

  1. Abrimos la base de datos Neptuno
  2. Abrimos la consulta Facturas en Vista Diseño
  3. En la fila Criterios del campo País escribimos: [Escribe el país]
  4. En la pestaña Diseño presionamos Ejecutar
  5. En el cuadro de diálogo escribimos México y presionamos Entrar

Consulta comparando un parámetro

  1. Abrimos la base de datos Neptuno
  2. Abrimos la consulta Facturas en Vista Diseño
  3. En la fila Criterios del campo País escribimos: <>[Escribe el país]
  4. En la pestaña Diseño presionamos Ejecutar
  5. En el cuadro de diálogo escribimos México y presionamos Entrar
  6. Nos devolverá una tabla con todos los países salvo México
Para pedidos mayores de 100€, escribimos en la fila Criterios del campo Cargo: >[Cargo mayor de]. En el cuadro de diálogo escribimos 100 y devolverá aquellos pedidos mayores de 100€.

Consulta de parámetros entre dos fechas

  1. Abrimos la base de datos Neptuno
  2. Abrimos la consulta Facturas en Vista Diseño
  3. En la fila Criterios del campo FechaPedido escribimos: Entre [Escribe la fecha de inicio] Y [Escribe la fecha final]
  4. En la pestaña Diseño presionamos Ejecutar
  5. En el cuadro de diálogo [Escribe la fecha de inicio] escribimos 1/1/1997, en el cuadro de diálogo [Escribe la fecha de final] escribimos 1/1/1998 y presionamos Entrar

Consulta con caracteres comodín

Este tipo de consultas nos permiten más flexibilidad con búsquedas no exactas.

Un solo asterisco:

Para campos que empiezan por una letra o cadena de texto. En nuestro ejemplo todos los países que empiezan por la letra b.

  • En el campo País escribimos: Como [Escribe el país] & "*"
  • En el cuadro de diálogo escribimos: b
  • Como resultado tendremos una tabla con los pedidos de Bélgica y Brasil
  • Si en el cuadro de diálogo escribimos *, nos devolverá todos los registros.
    Si rodeamos una cadena de texto con *cadena*, como por ejemplo *ia* nos devolverá todos los países que contienen la misma.
    Para el resultado opuesto, excluir registros que empiecen por esa cadena, escribimos: No como [Escribe el país] & "*"

    Dos asteriscos:

    Para campos que contienen una letra o cadena de texto. En nuestro ejemplo todos los países que contienen la cadena ar.

  • En el campo País escribimos: Como "*" & [Escribe el país] & "*"
  • En el cuadro de diálogo escribimos: ar
  • Devuelve todos los registros si dejamos el cuadro de diálogo en blanco o los registros que contengan la cadena de texto especificada. Es una alternativa al ejemplo anterior con un asterisco, en la que no es necesario escribir los asteriscos ya incluidos en el criterio.

    Para el resultado opuesto, excluir registros que contengan la cadena, escribimos: No como "*" & [Escribe el país] & "*"

    Caracteres comodín

    Aunque no podamos emplear ! entre los corchetes del texto de la consulta de parámetro, sí que se pueden emplear caracteres comodín en el cuadro de dialogo.

    CARÁCTER DESCRIPCIÓN EJEMPLO
    * Hace coincidir cualquier número de caracteres. Puede ser utilizado como el primero o el último carácter de la cadena de caracteres. qu* encuentra quién, quiero y quieto
    ? Hace coincidir cualquier carácter alfabético individual. B?l encuentra bala, billete y bola
    [ ] Hace coincidir cualquier carácter individual situado entre los corchetes. B[ao]l encuentra bala y bola pero no billete
    [! ] Hace coincidir cualquier carácter que no se encuentre entre los corchetes. r[!oc]a encuentra risa y runa pero no roca ni rosa
    - Hace coincidir cualquier carácter de un intervalo de caracteres. Debe especificar el intervalo en orden ascendente (A a Z, no Z a A). b[a-c]d encuentra bad, bbd y bcd
    # Hace coincidir cualquier carácter numérico individual. 1#3 encuentra 103, 113 y 123

    Ejemplos:

    En el campo País escribimos: Como [Escribe el país]
    Si deseamos todos los países que no tengan como segunda letra la r:

    En el cuadro de diálogo escribimos ?[!r]*
    Sin consulta de parámetro, simplemente escribimos en la fila Criterios: Como "?[!r]*"
    De los resultados habremos eliminado los países Argentina, Brasil, Francia e Irlanda.

    Si deseamos todos los países que no tengan como última letra la a, á, u o:

    En el cuadro de diálogo escribimos *[!a, á, o]
    Sin consulta de parámetro, simplemente escribimos en la fila Criterios: Como "*[!a, á, o]"
    De los resultados habremos seleccionado Brasil, Estados Unidos y Portugal.

    Referencias:
    Utilizar caracteres comodín
    Actualizar datos de una consulta o formulario inmediatamente

    2014-11-06

    Desactivar actualización de pantalla en VBA

    Title En Excel mientras ejecutamos una macro la pantalla se actualiza generando a veces un parpadeo. Para evitarlo y acelerar la ejecución del código, desactivamos la propiedad Application.ScreenUpdating antes del mismo y la volvemos a activar al finalizar.

    Solución

    Sub Macro()
    Application.ScreenUpdating = False
     ' Nuestro código
    Application.ScreenUpdating = True
    End Sub
    

    Comparativa

    He modificado el código propuesto por Microsoft aquí pues antes del segundo bucle es necesario mostrar todas las columnas ocultadas tras el primero, o el código no tendría nada que hacer.

    Sub Comparativa()
    Dim stopTime As Single, startTime As Single
    Dim elapsedtime(2) As Single
    Application.ScreenUpdating = True
    For i = 1 To 2
         ActiveSheet.Cells.EntireColumn.Hidden = False
         If i = 2 Then Application.ScreenUpdating = False
         startTime = Time
         Worksheets(1).Activate
         For Each c In ActiveSheet.Columns
         If c.Column Mod 2 = 0 Then
         c.Hidden = True
         End If
         Next c
         stopTime = Time
         elapsedtime(i) = (stopTime - startTime) * 24 * 60 * 60
    Next i
    Application.ScreenUpdating = True
    MsgBox "Segundos, ScreenUpdating activado: " & elapsedtime(1) & _
     Chr(13) & _
     "Segundos, ScreenUpdating desactivado: " & elapsedtime(2)
    End Sub
    

    Ejemplos por separado

    Sub Activado()
    Dim t As Single
    t = Timer
    ActiveSheet.Cells.EntireColumn.Hidden = False
    Application.ScreenUpdating = True
    Worksheets(1).Activate
     For Each c In ActiveSheet.Columns
     If c.Column Mod 2 = 0 Then
     c.Hidden = True
     End If
     Next c
    Application.ScreenUpdating = True
    MsgBox Timer - t
    End Sub
    
    Sub Desactivado()
    Dim t As Single
    t = Timer
    ActiveSheet.Cells.EntireColumn.Hidden = False
    Application.ScreenUpdating = False
     Worksheets(1).Activate
     For Each c In ActiveSheet.Columns
     If c.Column Mod 2 = 0 Then
     c.Hidden = True
     End If
     Next c
    Application.ScreenUpdating = True
    MsgBox Timer - t
    End Sub
    

    2014-11-04

    Construir un gráfico Q-Q desde cero en R

    Title En esta entrada vamos a construir un gráfico Q-Q (cuantil-cuantil) y la línea para evaluar la relación lineal sin recurrir a las funciones qqnorm y qqline de Quantile-Quantile Plots.

    Vamos a utilizar los datos de rivers incluidos dentro del paquete datasets, cargado por defecto en R.

    Gráfico Q-Q

    # Usando qqnorm
    qqnorm(rivers, col = 'dodger blue', pch = 19) 
    
    # Cálculos gráfico Q-Q 
    n <- max(length(rivers))
    p = (1:n - 1/2)/n  
    zscores <- qnorm(p)
    
    n - número de observaciones
    p - secuencia de puntos de probabilidad.
         qqnorm, mediante ppoints genera los puntos siguiendo la fórmula (1:m - a)/(m + (1-a)-a).
         m = length(n), el nº de observaciones
         a = 3/8 si n <= 10 . En caso contrario 1/2. Si n > 10: (1:m - 1/2)/m = (1:m - a)/(m + (1-a)-a)
    zscores - asociados a la secuencia de probabilidad p

    # Gráfico Q-Q
    plot(zscores, 
         sort(rivers), 
         xlab = 'Theoretical Quantiles', 
         ylab = 'Sample Quantiles', 
         main = "Normal Q-Q Plot",
         col ='dodger blue',
         pch = 19)
    
    x - en el eje de abscisas los cuantiles teóricos: zscores
    y - en el eje de ordenadas, los datos de la muestra rivers ordenados ascendentemente

    Línea qqline

    # Usando qqline
    qqline(rivers, col = 'orange', lwd =2)
    
    Cálculos qqline:

    # Opción 1
    x <- c(qnorm(.25), qnorm(.75)) 
    y <- quantile(rivers,c(.25, .75)) 
    recta <- lm(y ~ x)
    # qqline
    abline(reg = recta, col = 'orange', lwd =2)
    

    x - en el eje de abscisas los cuantiles teóricos: zscores
    y - en el eje de ordenadas, los cuantiles de la muestra rivers
    recta - usamos la función lm para crear una recta de regresión lineal
    abline -añadimos la recta de regresión creada, dado un reg (regression object).

    # Opción 2
    x <- c(qnorm(.25), qnorm(.75)) 
    y <- quantile(rivers, c(.25, .75))
    pdte <- diff(y)/diff(x)
    int <- y[1] - pdte * x[1] # O int <- y[2] - pdte * x[2]
    # qqline
    abline(a = int, b = pdte,  col = 'orange', lwd =2)
    

    x - en el eje de abscisas los cuantiles teóricos: zscores
    y - en el eje de ordenadas, los cuantiles de la muestra rivers
    pdte - pendiente de la recta: (y2 - y1)/(x2 - x1).
    int - intesección con el eje y
    abline - añadimos la recta dado un punto de intersección y la pendiente

    Referencias

    2014-11-02

    Regresión lineal simple para principiantes en R

    Title La regresión lineal simple sirve para evaluar la relación entre dos variables, una variable independiente X o predictora y una variable dependiente o explicada Y. Se trata de encontrar una ecuación lineal con fines predictivos.

    Datos

    Como ejemplo, usamos los datos cats del peso corporal y del corazón de una muestra gatos machos y hembras del paquete MASS en R.

    install.packages("MASS") # Si no está instalado
    library(MASS)
    str(cats)
    summary(cats)
    
    str(cats)
    
    'data.frame': 144 obs. of  3 variables:
     $ Sex: Factor w/ 2 levels "F","M": 1 1 1 1 1 1 1 1 1 1 ...
     $ Bwt: num  2 2 2 2.1 2.1 2.1 2.1 2.1 2.1 2.1 ...
     $ Hwt: num  7 7.4 9.5 7.2 7.3 7.6 8.1 8.2 8.3 8.5 ...
    
    Sex - sexo - factor con los niveles hembras "F" y machos "M"
    Bwt - Body Weight, peso corporal
    Hwt - Heart Weight, peso del corazón

    summary(cats)
    
     Sex         Bwt             Hwt       
     F:47   Min.   :2.000   Min.   : 6.30  
     M:97   1st Qu.:2.300   1st Qu.: 8.95  
            Median :2.700   Median :10.10  
            Mean   :2.724   Mean   :10.63  
            3rd Qu.:3.025   3rd Qu.:12.12  
            Max.   :3.900   Max.   :20.50 
    

    Diagrama de dispersión

    with(cats, plot(Hwt ~ Bwt)) # Alternativa 1
    plot(cats$Bwt, cats$Hwt, xlab = "Bwt", ylab = "Hwt") # Alternativa 2
    plot(Hwt ~ Bwt, cats)  # Alternativa 3
    

    Recta de regresión y R²

    reglineal <- lm(cats$Hwt ~ cats$Bwt) # Alternativa 1
    reglineal <- lm(Hwt ~ Bwt, cats) # Alternativa 2
    abline(reglineal, col = "red") # Añadimos recta de regresión
    
    # Pendiente e intersección
    reglineal
       # Alternativas:
      reglineal[[1]]
      summary(reglineal)$coef[, 1]
      reglineal$coef
    
    Call:
    lm(formula = cats$Hwt ~ cats$Bwt)
    
    Coefficients:
    (Intercept)     cats$Bwt  
        -0.3567       4.0341  
    
    (Intercept) - b, intersección Y
    cats$Bwt - m, pendiente

    Más información:

    summary(reglineal)
    
     Call:
    lm(formula = cats$Hwt ~ cats$Bwt)
    
    Residuals:
        Min      1Q  Median      3Q     Max 
    -3.5694 -0.9634 -0.0921  1.0426  5.1238 
    
    Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
    (Intercept)  -0.3567     0.6923  -0.515    0.607    
    cats$Bwt      4.0341     0.2503  16.119   <2e-16 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 1.452 on 142 degrees of freedom
    Multiple R-squared:  0.6466, Adjusted R-squared:  0.6441 
    F-statistic: 259.8 on 1 and 142 DF,  p-value: < 2.2e-16
    

    Aplicación del modelo

    Con la ecuación de la recta de regresión podemos calcular el valor de la variable dependiente Y introduciendo un valor de la variable independiente X en la misma: y = mx + b

    Accedemos a la pendiente y la intersección en Y:

    # Intersección
      # coef o coefficients son intercambiables
    summary(reglineal)$coef[1, 1]
    reglineal$coef[1]  
    coef(reglineal)[1] # Sintaxis recomendada
    
    (Intercept) 
     -0.3566624 
    
    # Pendiente
    summary(reglineal)$coef[2, 1]
    reglineal$coef[2] 
    coef(reglineal)[2] 
    
    cats$Bwt 
    4.034063
    

    Ejemplos:

    Si un gato pesa 5 Kg, ¿cuál es el peso estimado de su corazón?

    # Gato de 5kg
    pesocorazon <- 5*coef(reglineal)[2]+coef(reglineal)[1] 
    pesocorazon
    
         Bwt 
    19.81365 
    
    Si un gato pesa 3 Kg, ¿cuál es el peso estimado de su corazón?

    # Gato de 3kg
    pesocorazon <- 3*coef(reglineal)[2]+coef(reglineal)[1] 
    pesocorazon
    
         Bwt 
    11.74553 
    

    Función

    Creamos una sencilla función que nos pregunte el peso del gato en la consola y calcule el peso estimado de su corazón.

    fun <- function(){
      x1 <- as.numeric(readline("¿Cuál es peso del gato en kg?"))
        # Check if is NA instead of lenght >1 as we did with  
      if (is.na(x1))  {
        x1 <- 0
      }
      reglineal <- lm(cats$Hwt ~ cats$Bwt)
      pesocorazon <- x1*coef(reglineal)[2]+coef(reglineal)[1]
      print(c("El peso estimado del corazón en gramos es:", 
              round(unname(pesocorazon), 5)), quote = FALSE)
    }
    
    ¿Cuál es peso del gato en kg?3
    [1] El peso estimado del corazón en gramos es:
    [2] 11.74553  
    

    Bondad del modelo

    El Coeficiente de correlación de Pearson r, nos indica el grado de correlación lineal entre la dos variables. Es la covarianza dividida por el producto de las desviaciones típicas de las dos variables

      -1 - correlación negativa perfecta
      0 - no existe relación lineal
      1 - correlación positiva perfecta

    # Coeficiente de correlación de Pearson
    cor(cats$Bwt, cats$Hwt)
    
    [1] 0.8041274
    
    Como es próximo a 1, concluimos que existe una correlación lineal positiva entre ambas variables.

    El coeficiente de determinación R², nos informa de la bondad del ajuste del modelo. Se calcula elevando al cuadrado el coeficiente de correlación de Pearson. Varía entre 0 y 1. Podemos acceder a él mediante la función summary.lm, como hicimos anteriormente.

      0 - las variables son independientes
      1 - existe una relación perfecta entre las variables

    # Coeficiente de determinación
    cor(cats$Bwt, cats$Hwt)^2
    summary(reglineal)$r.squared  # Mediante summary.lm
    
    [1] 0.6466209
    
    En nuestro ejemplo es 0,6466. Indica que conociendo el peso de un gato mejoramos un 64,66% nuestra estimación del peso del corazón, si usamos nuestro modelo en lugar del peso medio del corazón de un gato.

    Referencias

    2014-11-01

    Importar datos desde la web a Excel

    Title Excel nos permite importar datos actualizables de una página web, como por ejemplo cotizaciones, tipos de cambio, o datos financieros. Después, podremos analizarlos o emplearlos en nuestros cálculos. En esta entrada vamos a importar las cotizaciones de las acciones del IBEX 35, el principal índice bursátil de referencia de la bolsa española.

    Obtener datos externos

    1. En la ficha Datos, en el grupo Obtener datos externos, hacemos clic en Desde Web.
    2. En el cuadro de diálogo Nueva consulta Web, escribimos o pegamos la dirección URL de la página Web deseada.
    3. Clic en Ir.
    4. Clic en Importar.
    5. En el cuadro de diálogo Importar datos seleccionamos el destino y clic en Aceptar.

    Editar propiedades

    Es posible que necesitemos modificar las propiedades de una consulta. Por ejemplo, si ajustamos el ancho de las columnas y queremos evitar Excel cambie de nuevo el ancho cada vez que actualicemos la consulta.

    1. Clic sobre una celda que pertenezca a la consulta.
    2. En la ficha Datos, en el grupo Conexiones, hacemos clic en Propiedades.
    3. Modificamos las opciones oportunas. En este ejemplo, desmarcamos la selección de Ajustar el ancho de la columna.
    4. Clic en Aceptar.

    Creamos nuestras tablas

    La consulta web anterior la dejamos separada en una hoja de datos. En otra hoja vinculamos las celdas con la hoja de datos y las formateamos. Incluimos formato condicional para mostrar las subidas y bajadas en verde o rojo. Empleamos el tipo de fuente Wingdings para crear las flechas: é (hacia arriba) y ê (hacia abajo).

    Resultado final

    Referencias:
    Obtener datos externos de una página web
    Nube de datos