1. ACTIVIDADES

2.1. ¿Cuál será el resultado de ejecutar las siguientes instrucciones?:

x = c(1, 3, 5, 7, 9)
y = c(2, 4, 6, 7, 11, 12)
x + 1
## [1]  2  4  6  8 10
y * 2
## [1]  4  8 12 14 22 24
length(x)
## [1] 5
length(y)
## [1] 6
x + y
## Warning in x + y: longitud de objeto mayor no es múltiplo de la longitud de uno
## menor
## [1]  3  7 11 14 20 13
sum(x > 5)
## [1] 2
sum(x[x > 5])
## [1] 16
sum(x > 5 | x < 3)
## [1] 3
y[2]
## [1] 4
y[-2]
## [1]  2  6  7 11 12
y[x]
## [1]  2  6 11 NA NA
NA
## [1] NA

NA representa “Not Available” y se utiliza en R para indicar valores faltantes o no disponibles.

y[y >= 8]
## [1] 11 12

2.2. Un conductor europeo de viaje por Estados Unidos apunta las millas recorridas por su coche cada vez que llena el tanque de gasolina. La relación de las últimas 10 veces que lo ha llenado es la siguiente:

  1. Crea una variable llamada “millas” que contenga los datos anotados.
millas = c(65241, 65665, 65998, 66014, 66547, 66857, 67025, 67447, 66958, 67002)
  1. Crea una nueva variable “kms” y asígnale el valor de “millas” transformado en kms
kms = millas * 1.609
  1. ¿Qué resultado produce la función diff aplicada sobre los datos anteriores?
diferencias_kms = diff(kms)
diferencias_millas = diff(millas) 
print(diferencias_kms)
## [1]  682.216  535.797   25.744  857.597  498.790  270.312  678.998 -786.801
## [9]   70.796
print(diferencias_millas)
## [1]  424  333   16  533  310  168  422 -489   44
  1. ¿Qué funciones son adecuadas para resumir estos datos?
summary(kms)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  104973  106197  107324  106959  107789  108522
summary(millas)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   65241   66002   66702   66475   66991   67447

2.3. Una persona dispone de un contrato de pago mínimo telefónico, con el que cuenta poder controlar sus gastos. A pesar de esto cada mes tiene que pagar cantidades diferentes, que finalmente decide revisar. En el último año estas cantidades, en euros, han sido las siguientes:

  1. ¿Cuánto le ha costado la factura del último año?
facturas = c(47, 32, 40, 36, 49, 31, 49, 30, 49, 35, 48, 32)
total_facturas <- sum(facturas)
print(paste("El total gastado en el ultimo ano es:", total_facturas, "euros"))
## [1] "El total gastado en el ultimo ano es: 478 euros"
  1. ¿Cuánto ha pagado en promedio cada mes?
promedio_mensual = mean(facturas)
print(paste("El promedio mensual de gastos es:", promedio_mensual, "euros"))
## [1] "El promedio mensual de gastos es: 39.8333333333333 euros"
  1. ¿Cuáles son las cantidades mínimas y máximas pagadas?
minimo = min(facturas)
maximo = max(facturas)
print(paste("El minimo pago realizado fue:", minimo, "euros"))
## [1] "El minimo pago realizado fue: 30 euros"
print(paste("El maximo pago realizado fue:", maximo, "euros"))
## [1] "El maximo pago realizado fue: 49 euros"
  1. ¿En qué mes se realizó cada pago?
meses = c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
for (i in 1:length(meses)) {
  print(paste("En", meses[i], "se realiz0 un pago de", facturas[i], "euros"))
}
## [1] "En Enero se realiz0 un pago de 47 euros"
## [1] "En Febrero se realiz0 un pago de 32 euros"
## [1] "En Marzo se realiz0 un pago de 40 euros"
## [1] "En Abril se realiz0 un pago de 36 euros"
## [1] "En Mayo se realiz0 un pago de 49 euros"
## [1] "En Junio se realiz0 un pago de 31 euros"
## [1] "En Julio se realiz0 un pago de 49 euros"
## [1] "En Agosto se realiz0 un pago de 30 euros"
## [1] "En Septiembre se realiz0 un pago de 49 euros"
## [1] "En Octubre se realiz0 un pago de 35 euros"
## [1] "En Noviembre se realiz0 un pago de 48 euros"
## [1] "En Diciembre se realiz0 un pago de 32 euros"
  1. ¿Cuantos meses pagó más de 40 euros?
meses_mas_40 = sum(facturas > 40)
print(paste("Número de meses en los que se pagaron más de 40 euros:", meses_mas_40))
## [1] "Número de meses en los que se pagaron más de 40 euros: 5"
  1. ¿Qué porcentaje del gasto total representa esta cantidad?
gasto_mas_40 = sum(facturas[facturas > 40])
porcentaje_gasto_mas_40 <- (gasto_mas_40 / total_facturas) * 100
print(paste("El porcentaje del gasto total representado por pagos superiores a 40 euros es:", round(porcentaje_gasto_mas_40, 2), "%"))
## [1] "El porcentaje del gasto total representado por pagos superiores a 40 euros es: 50.63 %"

2.4. Con los datos siguientes:

datos = c(61, 88, 73, 49, 41, 72, 99, 7, 12, 13, 87, 91, 5, 17, 97)
  1. Haz un diagrama de porcentual
porcentaje = prop.table(table(datos)) * 100
pie(porcentaje, main = "Diagrama de porcentual")

  1. Obtén resúmenes numéricos de los datos.
resumen_num = summary(datos)
print("Resumen numérico:")
## [1] "Resumen numérico:"
print(resumen_num)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5.00   15.00   61.00   54.13   87.50   99.00
  1. ¿Qué diferencias hay entre summary(x) y fivenum(x)?
resumen_summary = summary(datos)
print("Resumen numerico con summary():")
## [1] "Resumen numerico con summary():"
print(resumen_summary)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5.00   15.00   61.00   54.13   87.50   99.00
resumen_fivenum = fivenum(datos)
print("Resumen numerico con fivenum():")
## [1] "Resumen numerico con fivenum():"
print(resumen_fivenum)
## [1]  5.0 15.0 61.0 87.5 99.0

summary(x) proporciona un resumen más completo de los datos, incluyendo la media, mediana, mínimo, máximo y los cuartiles. Por otro lado, fivenum(x) proporciona solo cinco números resumen: mínimo, primer cuartil, mediana, tercer cuartil y máximo.

2.5. R permite generar datos aleatorios con gran facilidad mediante instrucciones específicas que empiezan con “r”

  1. Genera 100 valores de una distribución normal con rnorm(100).
datos_ram = rnorm(100)
  1. Realiza un histograma de los valores. Repite el proceso un par de veces. ¿Qué observas?
hist(datos_ram, main = "Histograma de distribucion normal", xlab = "Valores", ylab = "Frecuencia", col = "darkred")

Cada vez que se ejecuta rnom(100) nuevos datos ocupa la variabale datos_ram, por lo que el histograma y el resumen cambian

  1. Realiza un resumen numérico de los datos.
resumen_num1 = summary(datos_ram)
print("Resumen numerico:")
## [1] "Resumen numerico:"
print(resumen_num1)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -3.83903 -0.54859  0.12365  0.06544  0.73338  2.74110

2.6. De forma similar al ejercicio genera 30 valores de una distribución binomial de parámetros (n=5 y p=0,9).

datos_binomiales = rbinom(30, size = 5, prob = 0.9)
  1. Representa los resultados con un diagrama de barras o de pastel.
frecuencia = table(datos_binomiales)
porcentajes = prop.table(frecuencia) * 100
pie(porcentajes, main = "Distribucion binomial")

  1. Realiza un resumen numérico de los datos y compáralo con el del ejercicio anterior. ¿Qué deberías hacer para obtener un resumen similar?
resumen_numerico_binomial = summary(datos_binomiales)
print("Resumen numerico:")
## [1] "Resumen numerico:"
print(resumen_numerico_binomial)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.000   4.000   5.000   4.467   5.000   5.000
print("Resumen numerico del ejercicio anterior:")
## [1] "Resumen numerico del ejercicio anterior:"
print(resumen_num1)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -3.83903 -0.54859  0.12365  0.06544  0.73338  2.74110

Para obtener un resumen similar entre los datos generados con la distribución binomial y los datos generados con la distribución normal, podrías ajustar los parámetros de la distribución binomial de tal manera que su forma y dispersión se asemejen más a los datos generados con la distribución normal.

2.7. El número de fallos en los 23 primeros intentos de puesta en órbita de un satélite fue:

fallos = c(0, 1, 0, NA, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 3, 0, 0, 0, 0, 0, 2, 0, 1)
  1. Representa gráficamente estos datos. Qué representación es más adecuada una diagrama boxplot o un diagrama de barras?
par(mfrow = c(1, 2))

barplot(table(fallos, useNA = "ifany"), main = "Diagrama de barras de fallos", xlab = "Numero de fallos", ylab = "Frecuencia", col = "skyblue")

boxplot(fallos, main = "Diagrama de caja de fallos", ylab = "Numero de fallos", col = "darkblue")

El diagrama de barras es más adecuado porque estamos interesados en visualizar la frecuencia de cada valor de fallo. Cada barra representa un valor de fallo y su altura muestra con claridad cuántas veces ocurrió ese valor en los intentos de poner en órbita el satélite. Esto nos permite una fácil comparación entre los diferentes valores de fallo y una comprensión rápida de la distribución de los fallos en los intentos.

  1. Tabula los datos y calcula el número medio de errores
tabla_fallos = table(fallos, useNA = "ifany")
print("Tabla de fallos:")
## [1] "Tabla de fallos:"
print(tabla_fallos)
## fallos
##    0    1    2    3 <NA> 
##   15    5    1    1    1
media_fallos = mean(fallos, na.rm = TRUE)
print("Numero medio de errores:")
## [1] "Numero medio de errores:"
print(media_fallos)
## [1] 0.4545455

2.8. En una encuesta en la que se evalúa el funcionamiento de un curso se han recogido las siguientes respuestas de 10 estudiantes a tres preguntas P1, P2 y P3:

  1. Entra los datos mediante c(), scan(), read.table() y data.entry().
# Datos mediante c()
estudiante = 1:10
P1 = c(3, 3, 3, 4, 3, 4, 3, 4, 4, 3)
P2 = c(5, 5, 2, 2, 5, 2, 2, 5, 5, 2)
P3 = c(1, 3, 1, 3, 3, 3, 1, 3, 1, 1)

# Datos mediante scan()
cat("Introduce los datos para P1: ") #  3 3 3 4 3 4 3 4 4 3
## Introduce los datos para P1:
P1_scan = scan()
cat("Introduce los datos para P2: ") #  5 5 2 2 5 2 2 5 5 2
## Introduce los datos para P2:
P2_scan = scan()
cat("Introduce los datos para P3: ") #  1 3 1 3 3 3 1 3 1 1
## Introduce los datos para P3:
P3_scan = scan()

# Datos mediante read.table()
datos = read.table(text = "Estudiante P1 P2 P3
1 3 5 1
2 3 5 3
3 3 2 1
4 4 2 3
5 3 5 3
6 4 2 3
7 3 2 1
8 4 5 3
9 4 5 1
10 3 2 1", header = TRUE)
P1_readtable = datos$P1
P2_readtable = datos$P2
P3_readtable = datos$P3

# Datos mediante data.entry()
datos_entry = data.frame(Estudiante = 1:10, P1 = P1, P2 = P2, P3 = P3)
data.entry(datos_entry)

# Imprimir los datos ingresados
print("Datos ingresados mediante c():")
## [1] "Datos ingresados mediante c():"
print(P1)
##  [1] 3 3 3 4 3 4 3 4 4 3
print(P2)
##  [1] 5 5 2 2 5 2 2 5 5 2
print(P3)
##  [1] 1 3 1 3 3 3 1 3 1 1
print("Datos ingresados mediante scan():")
## [1] "Datos ingresados mediante scan():"
print(P1_scan)
## numeric(0)
print(P2_scan)
## numeric(0)
print(P3_scan)
## numeric(0)
print("Datos ingresados mediante read.table():")
## [1] "Datos ingresados mediante read.table():"
print(P1_readtable)
##  [1] 3 3 3 4 3 4 3 4 4 3
print(P2_readtable)
##  [1] 5 5 2 2 5 2 2 5 5 2
print(P3_readtable)
##  [1] 1 3 1 3 3 3 1 3 1 1
print("Datos ingresados mediante data.entry():")
## [1] "Datos ingresados mediante data.entry():"
print(datos_entry$P1)
##  [1] 3 3 3 4 3 4 3 4 4 3
print(datos_entry$P2)
##  [1] 5 5 2 2 5 2 2 5 5 2
print(datos_entry$P3)
##  [1] 1 3 1 3 3 3 1 3 1 1
  1. Tabular los resultados de cada pregunta por separado
print("Tabla de P1:")
## [1] "Tabla de P1:"
tabla_P1 = table(P1)
print(tabla_P1)
## P1
## 3 4 
## 6 4
print("Tabla de P2:")
## [1] "Tabla de P2:"
tabla_P2 = table(P2)
print(tabla_P2)
## P2
## 2 5 
## 5 5
print("Tabla de P3:")
## [1] "Tabla de P3:"
tabla_P3 = table(P3)
print(tabla_P3)
## P3
## 1 3 
## 5 5
  1. Realiza tablas de contingencia cruzadas para cada pregunta, de 2 en 2 y las 3 a la vez
tabla_P1_P2 = table(P1, P2)
print("Tabla de contingencia cruzada entre P1 y P2:")
## [1] "Tabla de contingencia cruzada entre P1 y P2:"
print(tabla_P1_P2)
##    P2
## P1  2 5
##   3 3 3
##   4 2 2
tabla_P1_P3 = table(P1, P3)
print("Tabla de contingencia cruzada entre P1 y P3:")
## [1] "Tabla de contingencia cruzada entre P1 y P3:"
print(tabla_P1_P3)
##    P3
## P1  1 3
##   3 4 2
##   4 1 3
tabla_P2_P3 = table(P2, P3)
print("Tabla de contingencia cruzada entre P2 y P3:")
## [1] "Tabla de contingencia cruzada entre P2 y P3:"
print(tabla_P2_P3)
##    P3
## P2  1 3
##   2 3 2
##   5 2 3
tabla_P1_P2_P3 = table(P1, P2, P3)
print("Tabla de contingencia cruzada entre P1, P2 y P3:")
## [1] "Tabla de contingencia cruzada entre P1, P2 y P3:"
print(tabla_P1_P2_P3)
## , , P3 = 1
## 
##    P2
## P1  2 5
##   3 3 1
##   4 0 1
## 
## , , P3 = 3
## 
##    P2
## P1  2 5
##   3 0 2
##   4 2 1
  1. Haz un diagrama de barras apiladas de las preguntas 2 y 3.
barplot(rbind(P2, P3), beside = TRUE, legend = TRUE, col = c("purple", "lightgreen"), main = "Diagrama de barras apiladas de P2 y P3", xlab = "Estudiantes", ylab = "Respuestas")

  1. Haz un diagrama de barras con las tres preguntas simultáneamente.
barplot(rbind(P1, P2, P3), beside = TRUE, legend = TRUE, col = c("lightcoral","purple", "lightgreen"), main = "Diagrama de barras de las 3 Preguntas", xlab = "Estudiantes", ylab = "Respuestas")

2.9. Genera 2 vectores de 50 valores cada de una distribución normal con rnorm (50).

vector1 = rnorm(50)
vector2 = rnorm(50)
  1. Realiza una prueba de normalidad mediante Shapiro-Wilk de cada vector.
shapiro_testv1 = shapiro.test(vector1)
print("Prueba de normalidad de Shapiro-Wilk para el primer vector:")
## [1] "Prueba de normalidad de Shapiro-Wilk para el primer vector:"
print(shapiro_testv1)
## 
##  Shapiro-Wilk normality test
## 
## data:  vector1
## W = 0.97483, p-value = 0.3595
shapiro_testv2 = shapiro.test(vector2)
print("Prueba de normalidad de Shapiro-Wilk para el segundo vector:")
## [1] "Prueba de normalidad de Shapiro-Wilk para el segundo vector:"
print(shapiro_testv2)
## 
##  Shapiro-Wilk normality test
## 
## data:  vector2
## W = 0.97999, p-value = 0.5513
  1. Determine si entre los vectores hay o no diferencias significativas, t-student test
t_test = t.test(vector1, vector2)
print(t_test)
## 
##  Welch Two Sample t-test
## 
## data:  vector1 and vector2
## t = -0.88963, df = 95.289, p-value = 0.3759
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.5773098  0.2200035
## sample estimates:
##   mean of x   mean of y 
## -0.09990845  0.07874467

2.10. Genera un vector de 50 valores por medio de rnorm y un vector de 50 valores por medio rbinom.

vector_rnorm = rnorm(50)
vector_rbinom = rbinom(50, size = 10, prob = 0.5)
  1. Realiza una prueba de normalidad mediante Shapiro-Wilk de cada vector.
shapiro_rnorm = shapiro.test(vector_rnorm)
print("Prueba de normalidad de Shapiro-Wilk para el vector generado por rnorm:")
## [1] "Prueba de normalidad de Shapiro-Wilk para el vector generado por rnorm:"
print(shapiro_rnorm)
## 
##  Shapiro-Wilk normality test
## 
## data:  vector_rnorm
## W = 0.95029, p-value = 0.03507
shapiro_rbinom = shapiro.test(vector_rbinom)
print("Prueba de normalidad de Shapiro-Wilk para el vector generado por rbinom:")
## [1] "Prueba de normalidad de Shapiro-Wilk para el vector generado por rbinom:"
print(shapiro_rbinom)
## 
##  Shapiro-Wilk normality test
## 
## data:  vector_rbinom
## W = 0.95679, p-value = 0.06524
  1. Determine si entre los vectores hay o no diferencias significativas, t-student test
t_test2 <- t.test(vector_rnorm, vector_rbinom)
print(t_test2)
## 
##  Welch Two Sample t-test
## 
## data:  vector_rnorm and vector_rbinom
## t = -16.866, df = 79.626, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -5.453291 -4.302123
## sample estimates:
## mean of x mean of y 
## 0.2022932 5.0800000