1. ¿Cuál será el resultado de ejecutar las siguientes instrucciones?
  1. Creación del vector ‘x’
x = c(1,3,5,7,9)
  1. Creación del vector ‘y’
y = c(2,4,6,7,11,12) 
  1. Suma 1 a cada elemento de ‘x’.
x+1 
## [1]  2  4  6  8 10
  1. Multiplica por 2 cada elemento de ‘y’.
y*2
## [1]  4  8 12 14 22 24
  1. Devuelve la longitud de los vectores.
length(x) 
## [1] 5
length(y) 
## [1] 6
  1. Suma los elmentos de ‘x’ y ‘y’ elemento por elemento.
x + y
## [1]  3  7 11 14 20 13

Los vectores no tiene la misma longitud. Por lo tanto, R empareja los elementos de ambos vectores, reciclando los elementos de ‘x’ para igualar la longitud de ‘y’.

sum(x>5)
## [1] 2
sum(x[x>5]) 
## [1] 16
  1. Calcula la cantidad de elementos en ‘x’ que son mayores que 5 o menores que 3.
sum(x>5|x<3) 
## [1] 3
  1. Devuelve el segundo elemento de ‘y’.
y[2]
## [1] 4
  1. Devuelve ‘y’ sin el segundo elemento.
y[-2]
## [1]  2  6  7 11 12
  1. Usa los valores de x como índices para seleccionar elementos de y.
y[x]
## [1]  2  6 11 NA NA
  1. ¿Que significa NA?: Representa un valor desconocido.NA (“not available”)

  2. Selecciona los elementos de y que son mayores o iguales a 8.

y[y>=8]
## [1] 11 12
  1. 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)
millas
##  [1] 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 (una milla son 1,609 km).
kms = millas * 1.609 # Millas a Kilómetros 
kms
##  [1] 104972.8 105655.0 106190.8 106216.5 107074.1 107572.9 107843.2 108522.2
##  [9] 107735.4 107806.2
  1. ¿Qué resultado produce la función diff aplicada sobre los datos anteriores? Calcula la diferencia entre elementos sucesivos de un vector.
diffm = diff(millas)
diffm
## [1]  424  333   16  533  310  168  422 -489   44
diffk = diff(kms)
diffk
## [1]  682.216  535.797   25.744  857.597  498.790  270.312  678.998 -786.801
## [9]   70.796
  1. ¿Qué funciones son adecuadas para resumir estos datos?
total_millas = sum(millas)
total_millas
## [1] 664754
prom_millas = mean(millas)
prom_millas
## [1] 66475.4
median(millas)
## [1] 66702
min(millas)
## [1] 65241
max(millas)
## [1] 67447
summary(millas)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   65241   66002   66702   66475   66991   67447
  1. 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:
pagos = c(47,32,40,36,49,31,49,30,49,35,48,32)
pagos
##  [1] 47 32 40 36 49 31 49 30 49 35 48 32
  1. ¿Cuánto le ha costado la factura del último año?
total_pagos = sum(pagos)
total_pagos
## [1] 478
  1. ¿Cuánto ha pagado en promedio cada mes?
prom_mes = mean(pagos)
prom_mes
## [1] 39.83333
  1. ¿Cuáles son las cantidades mínimas y máximas pagadas?
min(pagos)
## [1] 30
max(pagos)
## [1] 49
  1. ¿En qué mes se realizó cada pago?
meses = c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
pagos_por_mes = data.frame(Mes = meses, Pago = pagos)
pagos_por_mes
##           Mes Pago
## 1       Enero   47
## 2     Febrero   32
## 3       Marzo   40
## 4       Abril   36
## 5        Mayo   49
## 6       Junio   31
## 7       Julio   49
## 8      Agosto   30
## 9  Septiembre   49
## 10    Octubre   35
## 11  Noviembre   48
## 12  Diciembre   32
  1. ¿Cuantos meses pagó más de 40 euros?
meses_mas40 = sum(pagos>40)
meses_mas40
## [1] 5
  1. ¿Qué porcentaje del gasto total representa esta cantidad?
porcentaje = (meses_mas40/length(pagos))*100
sprintf("%.2f%%", porcentaje)
## [1] "41.67%"
  1. Con los datos siguientes: 61 88 73 49 41 72 99 07 12 13 87 91 05 17 97
  1. Haz un diagrama de porcentual
datos = c(61, 88, 73, 49, 41, 72, 99, 7, 12, 13, 87, 91, 5, 17, 97)

porcentajes = datos / sum(datos) * 100
barplot(porcentajes, names.arg = datos, ylab = "Porcentaje (%)", main = "Diagrama Porcentual")

  1. Obtén resúmenes numéricos de los datos.
resumen = summary(datos)
cat("Resúmene numérico:\n")
## Resúmene numérico:
resumen
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5.00   15.00   61.00   54.13   87.50   99.00
cuartiles = quantile(datos)
cat("Cuartiles:\n")
## Cuartiles:
cuartiles
##   0%  25%  50%  75% 100% 
##  5.0 15.0 61.0 87.5 99.0
  1. ¿Qué diferencias hay entre summary(x) y fivenum(x)?
## summary(x):
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5.00   15.00   61.00   54.13   87.50   99.00
## fivenum(x):
## [1]  5.0 15.0 61.0 87.5 99.0

Summary(x) da resumen más completo que incluye la media, mientras que fivenum(x) proporciona un resumen más conciso de los valores mínimo, máximo y los cuartiles.Ademas fivenum(x) solo los ubica en un vector sin mencionar que representan estos valores.

  1. R permite generar datos aleatorios con gran facilidad mediante instrucciones específicas que empiezan con “r” (rnorm, rpois, rbinom,…).
  1. Genera 100 valores de una distribución normal con rnorm(100).
valores = rnorm(100)
valores
##   [1] -0.673738913  0.542990890 -0.060067777  0.507715429 -0.717973034
##   [6] -2.622243920  1.067898669 -0.351992466 -0.342954864  0.364633234
##  [11] -0.027521225  1.817800312 -0.413237842 -0.960132028 -0.193274989
##  [16] -1.386462876  1.123904887 -1.382951698 -0.711545528 -0.343136927
##  [21] -1.693225707  0.598291336  0.480146319 -0.156024017 -0.853248662
##  [26]  1.210807345  1.437460174 -0.171067344 -2.113359546 -0.909689373
##  [31]  0.419588914 -1.164340137  0.348763184 -1.762059378  0.136181156
##  [36]  1.065898181 -0.505434040 -0.948213368  0.565789861 -0.590966520
##  [41] -0.068096748 -0.019790670  0.390058858 -0.494651592 -0.914758740
##  [46] -1.567216836  0.416193408  0.944727170  1.951133217 -0.004451143
##  [51]  0.666883935 -1.082570577  2.058536143 -1.747817356  1.430256116
##  [56] -0.289838277 -0.707468193  0.656096113 -0.504501004  1.164747479
##  [61] -1.007114455  0.313943228 -1.513278106 -1.409101871 -0.247454446
##  [66]  0.339716436  0.676050926 -0.093087256  0.041539872  0.832995977
##  [71]  1.202781950  0.599714230 -0.156813808 -0.825877113 -1.723120352
##  [76] -0.472175597 -1.132740758  0.453189983 -0.174341630 -1.679567525
##  [81]  0.306290495 -0.332383798 -2.273903291  1.660038107  0.704225205
##  [86]  0.559551745  0.538478244  0.099635223 -1.212690937  0.765711637
##  [91]  1.232176373 -0.297763513 -0.334999570 -0.464677986 -0.392984558
##  [96] -0.895003647  0.179194783  1.163546872  0.637815736  0.324691618
  1. Realiza un histograma de los valores. Repite el proceso un par de veces. ¿Qué observas?
hist(valores, main = "Histograma de valores aleatorios", xlab = "Valor", ylab = "Frecuencia")

# Repetir el proceso 
for (i in 1:2) {
  valores = rnorm(100)
  hist(valores, main = paste("Histograma", i+1, "de valores aleatorios"), xlab = "Valor", ylab = "Frecuencia")
}

Se observa que cada histograma es diferente, ya que los valores generados son aleatorios y siguen una distribución normal, pero con diferentes valores.

  1. Realiza un resumen numérico de los datos.
resumen = summary(valores)
resumen
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -3.1440 -0.8307 -0.2181 -0.1467  0.4859  2.2698
  1. De forma similar al ejercicio genera 30 valores de una distribución binomial de parámetros (n=5 y p=0,9).
valores_binomiales = rbinom(30, size = 5, prob = 0.9)
valores_binomiales
##  [1] 5 5 5 5 4 5 5 5 5 5 4 5 5 5 4 5 5 5 4 5 5 5 4 5 5 4 4 4 5 5
  1. Representa los resultados con un diagrama de barras o de pastel.
barplot(table(valores_binomiales), main = "Distribución Binomial (n=5, p=0.9)", xlab = "Número de éxitos", ylab = "Frecuencia")

  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 distribución binomial:
summary(valores_binomiales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.000   4.250   5.000   4.733   5.000   5.000

Resumen distribución normal:

summary(valores)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -3.1440 -0.8307 -0.2181 -0.1467  0.4859  2.2698
  1. El número de fallos en los 23 primeros intentos de puesta en órbita de un satélite fue: 0 1 0 NA 0 0 0 0 0 1 1 1 0 0 3 0 0 0 0 0 2 0 1 (NA significa ”not available” – se ha perdido el dato).
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)
fallos
##  [1]  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.
# Diagrama de barras
barplot(table(fallos), main = "Número de fallos en intentos de puesta en órbita", 
        xlab = "Número de fallos", ylab = "Frecuencia")

# Diagrama boxplot
boxplot(fallos, main = "Número de fallos en intentos de puesta en órbita",
        ylab = "Número de fallos" )

Depende de lo que se quiera visualizar. Un diagrama de barras es útil para mostrar la frecuencia de cada valor individual, mientras que un diagrama boxplot muestra la distribución de los datos, incluyendo información sobre la mediana, los cuartiles y los valores atípicos.

  1. Tabula los datos y calcula el número medio de errores (Puedes tener que probar con mean(x,na.rm=TRUE) o x[!is.na(x)] para prescindir de los valores faltantes.
tabla_fallos = table(fallos)
tabla_fallos
## fallos
##  0  1  2  3 
## 15  5  1  1
# Calcular el número medio de errores
media_fallos = mean(fallos, na.rm = TRUE)
media_fallos
## [1] 0.4545455
  1. 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().
# Mediante c()
est = 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 = data.frame(
  Estudiante = est,
  P1 = p1,
  P2 = p2,
  P3 = p3
)

print(t(datos))
##            [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## Estudiante    1    2    3    4    5    6    7    8    9    10
## P1            3    3    3    4    3    4    3    4    4     3
## P2            5    5    2    2    5    2    2    5    5     2
## P3            1    3    1    3    3    3    1    3    1     1
# Mediante scan()
# cat("Ingrese las respuestas de los estudiantes para P1, separadas por espacios:\n")
# p1 = scan()
# 
# cat("Ingrese las respuestas de los estudiantes para P2, separadas por espacios:\n")
# p2 = scan()
# 
# cat("Ingrese las respuestas de los estudiantes para P3, separadas por espacios:\n")
# p3 = scan()
# 
# datos = data.frame(
#   Estudiante = est,
#   P1 = p1,
#   P2 = p2,
#   P3 = p3
# )
# 
# print(t(datos))
# Mediante read.table()
datos = read.table(text = "Estudiante E1 E2 E3 E4 E5 E6 E7 E8 E9 E10
        P1 3 3 3 4 3 4 3 4 4 3
        P2 5 5 2 2 5 2 2 5 5 2
        P3 1 3 1 3 3 3 1 3 1 1", header = TRUE)

tabla = data.frame(datos)
tabla
##   Estudiante E1 E2 E3 E4 E5 E6 E7 E8 E9 E10
## 1         P1  3  3  3  4  3  4  3  4  4   3
## 2         P2  5  5  2  2  5  2  2  5  5   2
## 3         P3  1  3  1  3  3  3  1  3  1   1
# Mediante data.entry()
# datos_vacios = data.frame(
#   Estudiante = 1:10,
#   P1 = rep(0, 10),
#   P2 = rep(0, 10),
#   P3 = rep(0, 10)
# )
# 
# data.entry(datos_vacios)
# 
# print(datos_vacios)
  1. Tabula los resultados de cada pregunta por separado.
datos = data.frame(Estudiante = est, P1 = p1, P2 = p2, P3 = p3)

tabla_P1 = table(datos$P1)
tabla_P2 = table(datos$P2)
tabla_P3 = table(datos$P3)

# Convertir las tablas en marcos de datos
tabla_P1_df = data.frame(P1 = names(tabla_P1), Frecuencia = as.vector(tabla_P1))
tabla_P2_df = data.frame(P2 = names(tabla_P2), Frecuencia = as.vector(tabla_P2))
tabla_P3_df = data.frame(P3 = names(tabla_P3), Frecuencia = as.vector(tabla_P3))

tabla_P1_df
##   P1 Frecuencia
## 1  3          6
## 2  4          4
tabla_P2_df
##   P2 Frecuencia
## 1  2          5
## 2  5          5
tabla_P3_df
##   P3 Frecuencia
## 1  1          5
## 2  3          5
  1. Realiza tablas de contingencia cruzadas para cada pregunta, de 2 en 2 y las 3 a la vez.
# Tablas de contingencia cruzadas de 2 en 2
tabla_P1_P2 = table(datos$P1, datos$P2)
tabla_P1_P3 = table(datos$P1, datos$P3)
tabla_P2_P3 = table(datos$P2, datos$P3)

Tabla de contingencia cruzada entre P1 y P2:

##    
##     2 5
##   3 3 3
##   4 2 2

Tabla de contingencia cruzada entre P1 y P3:

##    
##     1 3
##   3 4 2
##   4 1 3

Tabla de contingencia cruzada entre P2 y P3:

##    
##     1 3
##   2 3 2
##   5 2 3
# Tabla de contingencia cruzada de las 3 preguntas
tabla_3_en_1 <- table(datos$P1, datos$P2, datos$P3)

Tabla de contingencia cruzada de las 3 preguntas:

## , ,  = 1
## 
##    
##     2 5
##   3 3 1
##   4 0 1
## 
## , ,  = 3
## 
##    
##     2 5
##   3 0 2
##   4 2 1
  1. Haz un diagrama de barras apiladas de las preguntas 2 y 3.
library(ggplot2)
library(tidyr)

datos = data.frame(est, p2, p3)
conj_datos = gather(datos, pregunta, calificacion, -est)

ggplot(conj_datos, aes(x = est, y = calificacion, fill = pregunta)) +
  geom_bar(stat = "identity", color = "black") +  # Agregar bordes negros a las barras
  labs(
    title = "Diagrama de Barras Apiladas Preguntas 2 y 3",
    x = "Estudiante",
    y = "Calificación",
    fill = "Pregunta"
  ) +
  geom_text(aes(label = calificacion), position = position_stack(vjust = 0.5))  # Agregar etiquetas en el centro de las barras

  1. Haz un diagrama de barras con las tres preguntas simultáneamente.
datos = data.frame(est, p1, p2, p3)
conj_datos = gather(datos, pregunta, calificacion, -est)

ggplot(conj_datos, aes(x = est, y = calificacion, fill = pregunta)) +
  geom_bar(stat = "identity", color = "black") +  # Agregar bordes negros a las barras
  labs(
    title = "Diagrama de Barras Apiladas con las 3 Preguntas",
    x = "Estudiante",
    y = "Calificación",
    fill = "Pregunta"
  ) +
  scale_fill_brewer(palette = "Set2") +  # Cambiar la paleta de colores
  geom_text(aes(label = calificacion), position = position_stack(vjust = 0.5))  # Agregar etiquetas en el centro de las barras

  1. Genera 2 vectores de 50 valores cada de una distribución normal con rnorm (50).
vector1 = rnorm(50)
vector2 = rnorm(50)

vector1
##  [1] -1.35198472  0.35875227 -0.77463405  1.67709502 -1.00146565  0.09160137
##  [7]  1.12512922  0.82401736  2.01217706  0.41343879  1.08054585 -1.99095553
## [13] -1.40338994 -0.83919476 -0.22501328 -1.26217400  0.50612500 -2.17795671
## [19]  1.46878958  1.01368586  0.29072572  0.61615666  1.21449200 -0.66187292
## [25] -1.11045853 -1.23652716  0.51893143 -0.01263138 -0.48348951 -1.26927245
## [31] -0.61131010  0.80100448  1.31064354 -0.17892631 -1.77975361  0.78761123
## [37]  0.94497826 -0.26877044  1.18582833  0.64469547  0.35393955 -0.40563572
## [43] -0.49504036  1.79451742 -2.30543010  1.17275518  1.04603132  1.28330488
## [49]  0.30762272 -1.35341058
vector2
##  [1] -1.99644887 -0.03028230  0.06601498 -0.13182710  2.53013654 -1.04327399
##  [7]  1.05046484  0.10003869  1.93579290 -1.19131821 -0.42595988  0.19695516
## [13]  0.53936464  0.91582706  0.28147532  1.81243211 -0.14389206 -0.20734590
## [19] -0.57678150 -2.10840908  0.26446181 -0.84182413 -0.07565269  0.53170265
## [25] -0.28380488 -1.71316476 -1.02656064 -0.15526924  0.14964907  0.02730889
## [31] -0.38129113 -1.44662890  1.58253749  0.16304055  1.24418638  0.02936859
## [37]  0.60906701 -0.34286485 -0.30009136 -0.17413763  0.17207406  2.34177119
## [43] -0.83307141  0.17712769 -0.87363153 -1.87531052 -0.76026961  0.95082690
## [49]  0.76730008 -1.69036900
  1. Realiza una prueba de normalidad mediante Shapiro-Wilk de cada vector

Prueba de normalidad Shapiro-Wilk para el Vector 1:

prueba_V1 = shapiro.test(vector1)
prueba_V1
## 
##  Shapiro-Wilk normality test
## 
## data:  vector1
## W = 0.9639, p-value = 0.1295

Prueba de normalidad Shapiro-Wilk para el Vector 2:

prueba_V2 = shapiro.test(vector2)
prueba_V2
## 
##  Shapiro-Wilk normality test
## 
## data:  vector2
## W = 0.9729, p-value = 0.3024
  1. Determine si entre los vectores hay o no diferencias significativas, t-student test
test_tStudent = t.test(vector1, vector2)
test_tStudent
## 
##  Welch Two Sample t-test
## 
## data:  vector1 and vector2
## t = 0.35162, df = 97.645, p-value = 0.7259
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.3562755  0.5097097
## sample estimates:
##   mean of x   mean of y 
##  0.03290596 -0.04381113

El valor p es mayor que el nivel de significancia de 0.05, lo que indica que no hay suficiente evidencia para rechazar la hipótesis nula de que no hay diferencia significativa entre las medias de los dos grupos. Por lo tanto, en este caso, no se puede concluir que haya diferencias significativas entre los dos vectores.

  1. Genera un vector de 50 valores por medio de rnorm y un vector de 50 valores por medio rbinom.
v_normal = rnorm(50)
v_normal
##  [1] -1.70102161  0.90576724 -0.59921563  2.10646458 -0.48071241  1.23792517
##  [7] -2.16109228 -1.98250084 -0.65579388  0.26062646 -1.25699711  0.32262040
## [13] -0.70393428  1.25640898  0.58424357 -0.60212748 -0.43585073 -4.79954741
## [19]  0.97325282  0.12913863 -1.45169844  0.31993549 -0.11207574  0.39265001
## [25] -0.10371664 -1.21679229  0.49075604  0.01360331 -0.33944583  2.01609938
## [31] -1.80603913  0.64329851  0.63073856  0.02904724  2.28897825  0.58759525
## [37]  0.67860555  1.42602073 -0.02282185  0.34193496  0.72158949 -0.13826197
## [43] -1.72034089  0.48583684  0.29793850  0.80483952  1.69654986  0.52654444
## [49]  1.76935268  1.03131405
v_binomial = rbinom(50, size = 1, prob = 0.5)
v_binomial
##  [1] 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 1
## [39] 1 0 0 1 0 1 0 0 0 0 0 0
  1. Realiza una prueba de normalidad mediante Shapiro-Wilk de cada vector

Prueba de normalidad de Shapiro-Wilk para el vector normal:

prueba_vn = shapiro.test(v_normal)
prueba_vn
## 
##  Shapiro-Wilk normality test
## 
## data:  v_normal
## W = 0.93073, p-value = 0.005892

En este caso, el valor p es mayor que 0.05, lo que indica que no hay suficiente evidencia para rechazar la hipótesis nula de normalidad. Por lo tanto, se puede concluir que los datos en v_normal se ajustan a una distribución normal.

Prueba de normalidad de Shapiro-Wilk para el vector binomial:

prueba_vb = shapiro.test(v_binomial)
prueba_vb
## 
##  Shapiro-Wilk normality test
## 
## data:  v_binomial
## W = 0.62213, p-value = 4.21e-10

En este caso, el valor extremadamente bajo del valor p (prácticamente cero) indica que hay evidencia significativa para rechazar la hipótesis nula de normalidad. Por lo tanto, se concluye que los datos en v_binomial no siguen una distribución normal.

  1. Determine si entre los vectores hay o no diferencias significativas, t-student test
test_tStudent2 = t.test(v_normal, v_binomial)
test_tStudent2
## 
##  Welch Two Sample t-test
## 
## data:  v_normal and v_binomial
## t = -1.7851, df = 63.332, p-value = 0.07904
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.73415601  0.04134361
## sample estimates:
## mean of x mean of y 
## 0.0535938 0.4000000

El valor de p es menor que el nivel de significancia de 0.05, lo que significa que hay evidencia suficiente para rechazar la hipótesis nula de que no hay diferencia significativa entre las medias de los dos grupos. Por lo tanto, en este caso, podemos concluir que hay diferencias significativas entre los dos vectores.