2014-09-29

Gráfico de la función de distribución acumulada de la distribución normal en R

Title En R, vamos a crear el gráfico de la función de distribución de la distribución normal usando tres funciones: plot, curve y plot.ecdf. En esta entrada anterior vimos el gráfico de la función de densidad de la distribución normal.

Función plot

Creamos un vector con las coordenadas x, en los argumentos de seq (secuencia) especificamos los límites y el número de valores intermedios o el incremento. En las coordenadas y, la función de distribución pnorm, por defecto una distribución normal estándar, N(0, 1), con una media de 0 y una varianza de 1.

x <- seq(-3, 3, 0.001) # Incremento de la secuencia: 6001 valores
# O bien
x <- seq(-3, 3, length = 1000) # 1000 valores intermedios

Usamos la función plot:

plot(x,          # Coordenadas x
     pnorm(x),   # Coordenadas y
     type = "l", # Tipo de gráfico líneas
     las = 1)    # Etiquetas alineadas horizontalmente

Función curve

No es necesario crear un vector con las coordinadas x. Solamente especificar el nombre de la función que evaluará: pnorm. Por defecto, curve evalua 101 valores (n = 101).

curve(pnorm(x), xlim = c(-3, 3), las = 1)

Función ecdf

La función ecdf, empirical cumulative distribution function, computa la distribución acumulada. Y plot.ecdf implementa el método plot para representarla gráficamente.

plot.ecdf(rnorm(10000)) # O más intrincadamente
plot(ecdf(rnorm(10000)))

plot.ecdf(rnorm(10000), 
xlim = c(-3, 3), # Extremos del eje x
las = 1) # Etiquetas alineadas horizontalmente

Más ejemplos

Dos ejemplos con distribuciones distintas de la distribución normal estándar. En este caso, sí es necesario suministrar los argumentos media y desviación típica (raíz cuadrada de la varianza). Añadimos el parámetro xaxp para forzar el número de marcas del eje x entre las dos coordinadas de los extremos.

N(-2, 0.5)

x <- seq(-5, 5, 0.001)
plot(x, pnorm(x, -2, sqrt(.5)), type = "l", las = 1, xaxp =c(-5, 5, 10))
N(0, 0.2)

curve(pnorm(x, 0, sqrt(.2)), -5, 5, las = 1, 
xaxp = c(-5, 5, 10))
Referencias:

2014-09-26

Importar HTML en R: Películas más taquilleras IMDb

Title Continuamos practicando la importación de tablas HTML en R. En el siguiente ejemplo importamos los resultados de las películas más taquilleras.

Importación

library(XML) # Función readHTMLTable
library(reshape2) # Función colsplit
url <- "http://www.imdb.com/chart"
peliculas <- readHTMLTable(url, which = 1, stringsAsFactors = FALSE)

Manipulación

peliculas <- transform(peliculas, peliculas = colsplit(peliculas[[2]], pattern = "\n", names = c("rank", "title", "year")))
peliculas[, c(1, 2, 6, 7)] <- list(NULL)
colnames(peliculas) <- c("weekend", "gross", "weeks", "title", "year")
peliculas$title <- gsub("^ +|+ $", "", peliculas$title) 
peliculas$year <- gsub("[[:punct:]]|[[:space:]]", "", peliculas$year)
peliculas$gross <- as.numeric(gsub("\\$|M", "", peliculas$gross))
peliculas$weekend <- as.numeric(gsub("\\$|M", "", peliculas$weekend))
peliculas$weeks <- as.integer(peliculas$weeks)
peliculas$year <- as.integer(peliculas$year)
peliculas <- peliculas[c(4, 5, 1, 2, 3)]
peliculas
# 2014/09/22
                          title year weekend gross weeks
1               The Maze Runner 2014    32.5  32.5     1
2   A Walk Among the Tombstones 2014    13.1  13.1     1
3     This Is Where I Leave You 2014    11.9  11.9     1
4                  No Good Deed 2014    10.2  40.1     2
5                Dolphin Tale 2 2014     9.0  27.1     2
6       Guardians of the Galaxy 2014     5.2 313.7     8
7                 Let's Be Cops 2014     2.7  77.2     6
8  Teenage Mutant Ninja Turtles 2014     2.6 185.0     7
9                      The Drop 2014     2.0   7.7     2
10                    If I Stay 2014     1.8  47.7     5

Recaudación del fin de semana

# Especificamos los márgenes del área del gráfico
par(mar = c(5, 15, 4, 2))
# Creamos el gráfico de barras horizontal
bp <- barplot(rev(peliculas$weekend), 
              names.arg = rev(peliculas$title),
              horiz = TRUE, 
              col = "lightskyblue", border= "white", 
              xlim = c(0, 35), xlab = "USD $ Millions",
              las = 1)
# Añadimos etiquetas a las barras
text(y = bp, x = 0, round(rev(peliculas$weekend), 1), pos = 4) 

Recaudación acumulada

# Ordenamos descendentemente por recaudación acumulada (gross)
peliculas <- peliculas[order(-peliculas[,4]), ] 
# 2014/09/22
                          title year weekend gross weeks
6       Guardians of the Galaxy 2014     5.2 313.7     8
8  Teenage Mutant Ninja Turtles 2014     2.6 185.0     7
7                 Let's Be Cops 2014     2.7  77.2     6
10                    If I Stay 2014     1.8  47.7     5
4                  No Good Deed 2014    10.2  40.1     2
1               The Maze Runner 2014    32.5  32.5     1
5                Dolphin Tale 2 2014     9.0  27.1     2
2   A Walk Among the Tombstones 2014    13.1  13.1     1
3     This Is Where I Leave You 2014    11.9  11.9     1
9                      The Drop 2014     2.0   7.7     2
# Márgenes del área del gráfico
par(mar = c(5, 15, 4, 2))
Gráfico de barras
bp <- barplot(rev(gross), 
              names.arg = rev(title), 
              horiz = TRUE, 
              col = "lightsalmon", border= "white", 
              xlim = c(0, 350), xlab = "USD $ Millions",
              las = 1)
# Etiquetas de las barras
text(y = bp, x = 0, round(rev(gross), 1), pos = 4) 

Entradas relacionadas

2014-09-24

Gráfico de la función de densidad de la distribución normal en R

Title En R, vamos a crear el gráfico de la función de densidad de la distribución normal usando dos funciones: plot y curve.

Función plot

Creamos un vector con las coordenadas x, en los argumentos de seq (secuencia) especificamos los límites y el número de valores intermedios o el incremento. En las coordenadas y, la función de densidad dnorm, por defecto una distribución normal estándar, N(0, 1), con una media de 0 y una varianza de 1.

x <- seq(-3, 3, 0.001) # Incremento de la secuencia: 6001 valores
# O bien
x <- seq(-3, 3, length = 1000) # 1000 valores intermedios

Usamos la función plot:

plot(x,          # Coordenadas x
     dnorm(x),   # Coordenadas y
     type = "l", # Tipo de gráfico líneas
     las = 1)    # Alineación horizontal de etiquetas

Función curve

No es necesario crear un vector con las coordenadas x. Solamente especificar el nombre de la función que evaluará: dnorm. Por defecto, curve evalua 101 valores (n = 101).

curve(dnorm(x), xlim = c(-3, 3), las = 1)

Más ejemplos

Dos ejemplos con distribuciones distintas de la distribución normal estándar. En este caso, sí es necesario suministrar los argumentos: media y desviación típica (raíz cuadrada de la varianza). Añadimos el parámetro xaxp para forzar el número de marcas del eje x entre las dos coordenadas de los extremos.

N(-2, 0.5)

x <- seq(-5, 5, 0.001)
plot(x, dnorm(x, -2, sqrt(.5)), type = "l", las = 1, xaxp =c(-5, 5, 10))
N(0, 0.2)

curve(dnorm(x, 0, sqrt(.2)), -5, 5, las = 1, xaxp = c(-5, 5, 10))
Referencias:

2014-09-21

Insertar un reloj en un formulario de Access

Title 1. Creamos un cuadro de texto independiente dentro del formulario en cuestión.

2. Doble clic sobre el cuadro de texto (o lo seleccionamos y presionamos F4) para abrir la hoja de propiedades.

3. En la pestaña Datos escribimos: =HoraActual()

4. Haz doble clic sobre el selector de formulario (esquina superior izquierda) para abrir la hoja de propiedades.

5. En pestaña Eventos modificamos dos propiedades:

Al cronómetro (OnTimer) - Clic sobre el botón de puntos suspensivos y en el cuadro de diálogo seleccionamos generador de código.

Private Sub Form_Timer()
Me.Texto0.Requery 'Texto0: nombre del cuadro de texto
End Sub
Intervalo de cronómetro (TimerInterval) - Escribimos 1000 para que se actualice cada segundo.

6. Abrimos el formulario en Vista Formulario o Vista Presentación:

Referencias:

2014-09-17

Insertar un reloj en Excel usando VBA

Title Nuestro objetivo es crear el siguiente reloj en una hoja de Excel:

Planteamiento

1. Partimos de la siguiente idea:

Una celda, A1 en el ejemplo, en la que insertaremos mediante VBA la fórmula AHORA, que devuelve la fecha y hora actuales. La formateamos para que muestre solamente la hora.
La cámara vinculada a la celda anterior, que nos aporta más flexibilidad para modificar su tamaño y posición dentro del hoja.
Un botón creado con una forma que vincularemos al código que iniciará y detendrá el reloj.

VBA

Sub Boton() 
  With ActiveSheet
      If .Shapes("Forma").TextFrame.Characters.Text = "Iniciar" Then
          .Shapes("Forma").TextFrame.Characters.Text = "Parar" 'Texto
          .Shapes("Forma").Fill.ForeColor.RGB = RGB(255, 0, 0) 'Color
          .Shapes("Forma").TextFrame.Characters.Font.ColorIndex = 2 'Fuente
      Call Reloj
      Else
          .Shapes("Forma").TextFrame.Characters.Text = "Iniciar"
          .Shapes("Forma").Fill.ForeColor.RGB = RGB(153, 204, 0) 
          .Shapes("Forma").TextFrame.Characters.Font.ColorIndex = 1 ?
      End If
  End With
End Sub
Con el código anterior creamos un único botón con dos alternativas en función del texto de la forma. Si el texto es Iniciar, cambia el texto a Parar, el color de la forma a rojo y el color de la fuente a blanco y ejecuta la macro Reloj. En caso contrario, cambia el texto a Iniciar, el color de la forma a verde y no ejecuta la subrutina Reloj.

Sub Reloj()
  If ActiveSheet.Shapes("Forma").TextFrame.Characters.Text = "Parar" Then
    Range("A1") = Now
    Application.OnTime Now + TimeValue("00:00:01"), "Reloj"
  End If
End Sub
En la subrutina anterior si el texto de la forma es Parar, es decir, la acabamos de iniciar, inserta en la celda A1 la función AHORA (NOW). Y con Application.OnTime programamos que se ejecute la propia subrutina Reloj cada segundo. Si apretamos de nuevo el botón anterior y el texto de la forma es Iniciar, es decir, la acabamos de parar, se detendrá esta macro.

Toques finales

Formateamos la celda en la que insertamos AHORA para mostrar la hora sin fecha. Presionamos CTRL+1 para mostrar el cuadro de diálogo Formato de celdas y aplicar el formato correspondiente de Hora.

Asignamos la subrutina Boton a la forma:

1. Cambiamos el nombre de la forma al que especifiquemos en nuestro código, Forma en nuestro ejemplo. Seleccionamos la forma y en el cuadro Nombre de la barra de fórmulas escribimos el nombre correspondiente.

2. Seleccionamos la forma, clic con el botón secundario del ratón y luego en Asignar macro. En el cuadro de diálogo, elegimos el nombre de la macro correspondiente y clic en aceptar.

Referencias:
Método Application.OnTime (Excel)

2014-09-14

Duplicar libro de Excel mediante VBA

Para duplicar el fichero de Excel activo usamos la siguiente macro:

Option Explicit
Sub DuplicaLibro()
    ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & "\" & _
    Format(Now, "yyyymmdd") & Chr(32) & ThisWorkbook.Name
    MsgBox "Fichero duplicado", vbInformation
End Sub
Guardará una copia del libro activo en la misma ruta del libro, con el nombre precedido de la fecha y un espacio. P. ej.: Libro1.xlsm se guardará como 20140519 Libro1.xlsm.Si también queremos la hora reemplazamos por "yyyymmdd" por "yyyymmdd-hhmmss" u otro formato deseado.

Aparecerá esta ventana emergente al finalizar:

En el caso de que el fichero ya cuente con una fecha y espacio delante del nombre del fichero, empleamos este macro:

Option Explicit
Sub DuplicaLibro2()
    Dim sNomb As String, sNombSinFecha As String ' Nombres con y sin fecha
    sNomb = ThisWorkbook.Name 
    sNombSinFecha = Right(sNomb, Len(sNomb) - InStr(1, sNomb, " ")) 
    ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & "\" & _
    Format(Now, "yyyymmdd-hh.mm.ss") & Chr(32) & sNombSinFecha
    MsgBox "Fichero duplicado", vbInformation
End Sub
Extrae el nombre del fichero sin fecha y le añade la fecha actualizada.

2014-09-12

Crear macro autoejecutable al abrir Access

Title Si deseamos crear una macro autoejecutable, que se inicie cada vez que abramos la base de datos, basta con renombrar la macro en cuestión como AutoExec:

Clic sobre la macro y F2.
O bien, botón secundario sobre la macro y clic sobre Cambiar nombre.

También se autoejecutará si compactamos y reparamos la base de datos. Si deseamos que al abrir la base de datos la macro no se ejecute, mantenemos presionada la tecla MAYÚS.

Otras alternativa para autoejecutar macros o código al abrir una base de datos es seleccionar en opciones de Access que muestre un formulario al abrirse. Después en las propiedades del formulario asociamos una macro o un procedimiento de evento Al Abrir o Al Cargar.

2014-09-10

Ley de Benford en Excel

Title La ley de Benford, también conocida como la ley del primer dígito, se refiere a la frecuencia de distribución del primer dígito en muchos de los números que aparecen en la vida real. En esta distribución, el 1 aparece con una frecuencia aproximada del 30% mientras que el 9 aparece con una frecuencia menor del 5%. Por primer dígito se refiere al primer dígito no nulo o significativo.

Esta ley se puede aplicar a una gran variedad de fuentes de datos: facturas de electricidad, direcciones de calles, precios de acciones, cifras de población, tasas de mortalidad, longitud de los ríos o constantes físicas y matemáticas. Se ha aplicado en la detección de fraudes en contabilidad, resultados electorales y científicos.

Gráficos convencionales

En Excel elaboramos el siguiente gráfico de barras, donde d es el dígito y P(d) la probabilidad de ocurrencia del mismo. Para calcular P(d), asumiendo que el 1 está en la celda A2, escribimos en B2 la fórmula =LOG(1+1/A2) y arrastramos el controlador de relleno hacia abajo.

Minigráficos

En Excel 2013, también podemos utilizar la herramienta Analizar los datos al instante y añadir un gráfico en miniatura.

Para ello, debemos transponer los datos de la tabla, seleccionar las celdas que contienen los datos y hacer clic en el botón Análisis rápido.

Como se puede apreciar el gráfico creado es demasiado pequeño en este caso. Para ampliarlo lo arrastramos a otra celda y cambiamos el ancho y alto de la celda.

Si necesitamos calcular la frecuencia de ocurrencias de unos datos:

1. Extraemos el primer dígito empezando por la izquierda: =IZQUIERDA(A1;1)
2. Creamos la tabla de frecuencias usando la fórmula matricial FRECUENCIA. En el argumento datos incluimos el rango con el primer dígito y en grupos los dígitos del 1 al 9.

Entradas relacionadas

2014-09-08

Función Partición en Ms Access: distribución de frecuencias

Title Anteriormente vimos cómo crear una distribución de frecuencias en Access. En aquella ocasión empleamos combinación cruzada entre la tabla con los datos y la tabla con los intervalos. En esta ocasión utilizamos la función Partición, que tiene la siguiente sintaxis:

Partición(número, iniciar, detener, intervalo)

número: campo con el número evaluado con los intervalos.
iniciar: el inicio del intervalo. El número no puede ser menor que 0.
detener: el fin del intervalo. El número no puede ser igual ni menor que el valor de iniciar.
intervalo: número entero que especifica el tamaño de las particiones en el intervalo (entre iniciar y detener).

Ejemplo

Empleamos la tabla Pedidos de la base de datos Neptuno. Deseamos agrupar los cargos en intervalos de 10 euros y contar el número de clientes y la suma de cargos para cada intervalo. Creamos la siguiente consulta de selección:

Creamos tres campos: Intervalo, Clientes y Cargos.

1. Intervalo: Partición([Cargo];0;1100;100)

[Cargo]: campo evaluamos para crear los intervalos.
0 : inicio del intervalo.
1100: final del intervalo.
100: tamaño del intervalo.

2. Clientes: IdCliente
3. Cargos: Cargo

A continuación creamos una consulta de totales:

- En la Vista Diseño, en el grupo Mostrar u ocultar de la ficha Diseño, hacemos clic en Totales.
- La fila Total aparece en la cuadrícula de diseño y, en esa fila, Agrupar por aparece en las tres columnas.
- Seleccionamos el valor de la celda en la fila Total: en Intervalo dejamos Agrupar por (campo por el que agrupamos), en Clientes seleccionamos Cuenta y en Cargos Suma.

El resultado final será:

SQL:

SELECT Partition([Cargo],0,1100,100) AS Intervalo, Count(Pedidos.IdCliente) AS Clientes, Sum(Pedidos.Cargo) AS Cargos
FROM Pedidos
GROUP BY Partition([Cargo],0,1100,100);
Entradas relacionadas:
Distribución de frecuencias en Ms Access

2014-09-05

Calcular el número de transbordos en una ruta con igraph

Title Anteriormente calculamos el trayecto recomendado entre dos estaciones. En concreto, el camino más corto sin tener en cuenta el número de transbordos. En esta entrada retomamos el ejemplo para calcular el número de transbordos entre dos estaciones.

Datos

El primer paso es introducir la información en nuestros datos. Para ello introducimos una tercera columna con la variable línea.

Importación

require(igraph)
estaciones <- read.csv2("estaciones.csv")

Cálculos

g <- graph.data.frame(estaciones, directed = FALSE) # Creamos el igraph
# Indicamos en el output que devuelva ambos: edges y vertices
gsp <- get.shortest.paths(g, from = "Quevedo", to = "O'Donnell", output = "both" ) 
# Vértices de la ruta
V(g)[gsp$vpath[[1]]] 
Vertex sequence:
[1] "Quevedo"           "Canal"         "Alonso Cano"   "Gregorio Marañón"  
[5] "Avenida de América""Diego de León" "Manuel Becerra" "O'Donnell"    
# Aristas de la ruta
E(g)[gsp$epath[[1]]]
Edge sequence:
                                              
[50]  Canal              -- Quevedo           
[169] Alonso Cano        -- Canal             
[168] Alonso Cano        -- Gregorio Marañón  
[167] Gregorio Marañón   -- Avenida de América
[136] Avenida de América -- Diego de León     
[135] Diego de León      -- Manuel Becerra    
[134] O'Donnell          -- Manuel Becerra 
# Líneas de la ruta
lineas <- E(g)[gsp$epath[[1]]]$linea
data.frame(lineas)
  lineas
1 Linea2
2 Linea7
3 Linea7
4 Linea7
5 Linea6
6 Linea6
7 Linea6
# Número de transbordos
num.transbordos <- sum(head(lineas,-1) != tail(lineas,-1))
num.transbordos
[1] 2
Referencias:
Nube de datos