Sys.setlocale("LC_ALL", "es_ES.UTF-8")
## [1] "LC_COLLATE=es_ES.UTF-8;LC_CTYPE=es_ES.UTF-8;LC_MONETARY=es_ES.UTF-8;LC_NUMERIC=C;LC_TIME=es_ES.UTF-8"

Si la variable aleatoria X tiene una distribución normal con parámetros μ=2 y σ=1.1

Calcula:

1 - La probabilidad de que X sea menor o igual que 3

mu = 2
sigma = 1.1

# x = seq(mu - 4 * sigma, mu + 4 * sigma, 0.05)
x = seq(-3, 7, 0.05)
df = data.frame(x = x,
                f_densidad = dnorm(x, mu, sigma),
                f_distribucion = pnorm(x, mu, sigma))

head(df, 5)
##       x   f_densidad f_distribucion
## 1 -3.00 1.183053e-05   2.740841e-06
## 2 -2.95 1.453067e-05   3.397673e-06
## 3 -2.90 1.781025e-05   4.203556e-06
## 4 -2.85 2.178498e-05   5.190272e-06
## 5 -2.80 2.659174e-05   6.395907e-06
x_menor3 = round(pnorm(3, mu, sigma),2)
x_menor3
## [1] 0.82
valor_x = 3
probabilidad = filter(df, x == valor_x)
probabilidad
##   x f_densidad f_distribucion
## 1 3  0.2399147      0.8183489
x_menor3_v2 = round(filter(df, x == valor_x)$f_distribucion,2)
x_menor3_v2
## [1] 0.82

Respuesta:
La probabilidad de que X sea menor o igual que 3 es 0.82 \[P(X \leq 3) = 0.82\]

Volver al inicio

2 - La probabilidad de que X sea mayor o igual que 3

x_mayor3 = round(pnorm(3, mu, sigma, lower.tail = FALSE),2)
x_mayor3
## [1] 0.18

Respuesta:
La probabilidad de que X sea mayor o igual que 3 es 0.18 \[P(X \geq 3) = 0.18\] \[P(X \geq 3) = 1 - P(X \leq 3) = 1 - 0.82 = 0.18\]

Volver al inicio

3 - Realiza un gráfico para su función de densidad

Respuesta:

grafico1 = ggplot(df, aes(x = x, y = f_densidad)) + 
  geom_line(color = "darkorange") + 
  ggtitle("Funcion de densidad N(μ=2 y σ=1.1)") + 
  labs (x = "x", y = "f(x)") + 
  theme_gray()

ggplotly(grafico1)

Volver al inicio

4 - Realiza un gráfico para su función de distribución

Respuesta:

grafico2 = ggplot(df, aes(x = x, y = f_distribucion)) + 
  geom_line(color = "darkorange") + 
  ggtitle("Funcion de distridución N(μ=2 y σ=1.1)") + 
  labs (x = "x", y = "f(x)") + 
  theme_gray()

ggplotly(grafico2)

Volver al inicio

5 - Realiza un gráfico para los cuantiles

Respuesta:

q = seq(0.01, 0.99, 0.01)
data = data.frame(x = q,
                  cuantiles = qnorm(q, mu, sigma))

head(data, 5)
##      x   cuantiles
## 1 0.01 -0.55898266
## 2 0.02 -0.25912380
## 3 0.03 -0.06887297
## 4 0.04  0.07424532
## 5 0.05  0.19066101
grafico3 = ggplot(data, aes(x = q, y = cuantiles)) + 
  geom_line(color = "darkorange") + 
  ggtitle("Funcion para cuantiles N(μ=2 y σ=1.1)") + 
  labs (x = "x", y = "f(x)") + 
  theme_gray()

ggplotly(grafico3)

Volver al inicio

6 - El valor de k tal que:

1. P(X ≥ k) = 0.83

alpha1 = 0.83

1 - alpha1
## [1] 0.17
quantil = data[q == 0.17, ]
quantil
##       x cuantiles
## 17 0.17 0.9504182
resultado6_1 = round(qnorm(1 - alpha1, mu, sigma),3)
resultado6_1
## [1] 0.95

El valor de k tal que P(X ≥ k) = 0.83
Respuesta: k = 0.95
\[P(X \geq 0.95) = 0.83\]

2. P(X ≤ k) = 0.95

alpha2 = 0.95
alpha2
## [1] 0.95
index = which.min(abs(q - 0.95))  # Encuentra el índice más cercano a 0.95
index
## [1] 95
quantil = data[index, ]
quantil
##       x cuantiles
## 95 0.95  3.809339
resultado6_2 = round(qnorm(alpha2, mu, sigma),3)
resultado6_2
## [1] 3.809

El valor de k tal que P(X ≤ k) = 0.95
Respuesta: k = 3.809
\[P(X \leq 3.809) = 0.95\]

3. P(k < X < 3.1) = 0.75

P(X ≤ 3.1) = 0.75

alpha3 = 0.75
x_menor_3_1 = pnorm(3.1, mu, sigma)
x_menor_3_1
## [1] 0.8413447
valor_meta = x_menor_3_1 - alpha3
valor_meta
## [1] 0.09134475
resultado6_3 = round(qnorm(valor_meta, mu, sigma),3)
resultado6_3
## [1] 0.534

El valor de k tal que P(k < X < 3.1) = 0.75
Respuesta: k = 0.534

\[P(0.534 < x < 3.1 ) = 0.75\]

Crear una secuencia de valores alrededor de la media para el gráfico

x_values = seq(mu-4*sigma, mu+4*sigma, length.out = 1000)
# k = qnorm(valor_meta, mu, sigma)


plot_data = data.frame(
  x = x_values,
  y = dnorm(x_values, mu, sigma))

area = ggplot(plot_data, aes(x = x, y = y)) + 
  geom_line() + 
  stat_function(fun = dnorm, args = list(mean = mu, sd = sigma), geom = "area",
                xlim = c(resultado6_3, 3.1), fill="turquoise", alpha = 0.5) +
  geom_vline(xintercept = resultado6_3, color = "navy", linetype = "dot") +
  geom_vline(xintercept = 3.1, color = "orange", linetype = "dot") +
  labs(title = paste("Distribución normal con area marcada para P(x < k < 3.1)",
                     paste0("\n", "k = ", round(resultado6_3, 2), ", Area = 0.75")),
       x = "x",
       y = "Densidad") + 
  theme_gray()
  
ggplotly(area)

\[P(k < x < 3.1) = 0.75\] \[P(k < 0.534) = 0.75\] \[P(0.534 < x < 3.1) = 0.75\]

Volver al inicio

Si la v.a. X tiene una distribución normal con parámetros μ=50 y σ2=100, utilizando la distribución normal estándar

Para obtener la distribución normal estándar con media 0 y varianza 1 se realizara una estandarización, se crea una nueva variable llamada z \[P(k \leq x ) = P(z\leq\frac{x-\mu}{\sigma})\] Calcula:

7 - La probabilidad de que X sea menor o igual que 40

x = seq(0, 90, 0.05)
df = data.frame(x = x,
                f_densidad = dnorm(x, 50, sqrt(100)),
                f_distribucion =pnorm(x, 50, sqrt(100)))

head(df, 5)
##      x   f_densidad f_distribucion
## 1 0.00 1.486720e-07   2.866516e-07
## 2 0.05 1.524337e-07   2.941788e-07
## 3 0.10 1.562867e-07   3.018965e-07
## 4 0.15 1.602331e-07   3.098091e-07
## 5 0.20 1.642751e-07   3.179214e-07
grafico2 = ggplot(df, aes(x = x, y = f_distribucion)) + 
  geom_line(color = "darkorange") + 
  ggtitle("Funcion de distridución N(μ=50 y σ=√100)") + 
  labs (x = "x", y = "f(x)") + 
  theme_gray()

ggplotly(grafico2)
valor_x = 40
mu = 50
sigma = sqrt(100)

z = (valor_x - mu)/sigma

resultado_7 = round(pnorm(z),2)
resultado_7
## [1] 0.16

Respuesta:
La probabilidad de que X sea menor o igual que 40 luego de la estandarización es de 0.16

\[P(k \leq 40 ) = P(z\leq\frac{40-50}{10}) = P(z \leq 40) = 0.16\]

Volver al inicio

8 - La probabilidad de que X se encuentre entre -60 y 60 (ambos incluidos)

x = seq(-100, 90, 0.05)
df = data.frame(x = x,
                f_densidad = dnorm(x, 50, sqrt(100)),
                f_distribucion =pnorm(x, 50, sqrt(100)))

head(df, 5)
##         x   f_densidad f_distribucion
## 1 -100.00 5.530710e-51   3.670966e-51
## 2  -99.95 5.961390e-51   3.958135e-51
## 3  -99.90 6.425446e-51   4.267661e-51
## 4  -99.85 6.925454e-51   4.601278e-51
## 5  -99.80 7.464184e-51   4.960852e-51
grafico2 = ggplot(df, aes(x = x, y = f_distribucion)) + 
  geom_line(color = "darkorange") + 
  ggtitle("Funcion de distridución N(μ=50 y σ=√100)") + 
  labs (x = "x", y = "f(x)") + 
  theme_gray()

ggplotly(grafico2)
valor_x1 = -60
valor_x2 = 60

z1 = (valor_x1 - mu)   / sigma
z1
## [1] -11
z2 = (valor_x2 - mu)   / sigma
z2
## [1] 1

Respuesta:

resultado_8 = round(pnorm(z2) - pnorm(z1),2)
resultado_8
## [1] 0.84

La probabilidad de que X se encuentre entre -60 y 60 (ambos incluidos) es de 0.84

Volver al inicio

Realiza un análisis exploratorio del dataset “iris” calculando todo lo que consideres interesante (aplicando lo que se ha explicado desde el principio del módulo)

Respuesta:

data(iris) 

data = iris

attach(data)

data %>%
  head(5) %>%
  kable() %>%
  kable_styling("striped", full_width = FALSE, position = "center", font_size = 16) %>%
  row_spec(0, monospace = TRUE, bold = TRUE, color = "navy", background = "grey") %>%
  row_spec(1:ncol(data), color = "black", background = "lightgrey")
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa
head(data, 5)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa

Revisión de los datos

str(data)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
variables_numericas_df = data %>%
  select(where(is.numeric)) %>%
  names()

variables_numericas_df
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"

Calculo de estadísticos de variables numéricas

variables_numericas_df = data %>%
  select(where(is.numeric))

estadisticos_numericos_df = data.frame(Variable = character(), 
                                       Media = numeric(), 
                                       Mediana = numeric(), 
                                       IQR = numeric(),
                                       Sigma = numeric())

for (i in names(variables_numericas_df)) {
  media = round(mean(variables_numericas_df[[i]], na.rm = TRUE), 2)
  mediana = round(median(variables_numericas_df[[i]], na.rm = TRUE), 2)
  IQR = round(IQR(variables_numericas_df[[i]], na.rm = TRUE), 2)
  sigma = round(sd(variables_numericas_df[[i]], na.rm = TRUE), 2)
  
  temp_df <- data.frame(Variable = i,
                        Media = media, 
                        Mediana = mediana,
                        IQR = IQR,
                        Sigma = sigma)
  estadisticos_numericos_df <- rbind(estadisticos_numericos_df, temp_df)
}

  num_filas <- min(5, nrow(estadisticos_numericos_df))

  estadisticos_numericos_df %>%
    head(num_filas) %>%
    kable() %>%
    kable_styling("striped", full_width = FALSE, position = "center", font_size = 16) %>%
    row_spec(0, monospace = TRUE, bold = TRUE, color = "navy", background = "grey") %>%
    row_spec(1:num_filas, color = "black", background = "lightgrey")
Variable Media Mediana IQR Sigma
Sepal.Length 5.84 5.80 1.3 0.83
Sepal.Width 3.06 3.00 0.5 0.44
Petal.Length 3.76 4.35 3.5 1.77
Petal.Width 1.20 1.30 1.5 0.76

Solo variables Factor

variables_factor_df = data %>%
  select(where(is.factor))

estadisticos_factor_df = data.frame()

for(i in names(variables_factor_df)){
  niveles <- levels(variables_factor_df[[i]])
  frecuencias <- table(variables_factor_df[[i]])
  
  df_temp <- data.frame(Variable = i,
                        Nivel = niveles,
                        Frecuencia = as.numeric(frecuencias))
  
  estadisticos_factor_df <- rbind(estadisticos_factor_df, df_temp)
}
    
print(estadisticos_factor_df)
##   Variable      Nivel Frecuencia
## 1  Species     setosa         50
## 2  Species versicolor         50
## 3  Species  virginica         50

Dataset “iris”: Boxplot y Outliers

data_long <- gather(variables_numericas_df, key = "variable", value = "value")

p <- ggplot(data_long, aes(x = variable, y = value, fill = variable)) +
  geom_boxplot() + 
  theme_minimal() + 
  theme(axis.text.x = element_text(angle = 90, hjust =1),
        axis.text.y = element_blank(),  
        axis.ticks.y = element_blank()) +
  labs(title = "Boxplot para cada variable númerica",
       x = "Variable",
       y = "Valor")
p_interactive <- ggplotly(p) 

p_interactive

Comprueba si las variables numéricas siguen una distribución normal

comprobar_normalidad <-function(data){
  resultado <- data.frame()
  
  for (nombre_variable in names(data)) {
    if(is.numeric(data[[nombre_variable]])){
      test <-   shapiro.test(data[[nombre_variable]])
      es_normal <- ifelse(test$p.value > 0.05, "Si", "No")
      temp_df <- data.frame(variable = nombre_variable, p.value = test$p.value, Distribucion_normal = es_normal)
      resultado <- rbind(resultado, temp_df)
    }
  }
  
  return(resultado)
}

resultado <- comprobar_normalidad(variables_numericas_df)
print(resultado)
##       variable      p.value Distribucion_normal
## 1 Sepal.Length 1.018116e-02                  No
## 2  Sepal.Width 1.011543e-01                  Si
## 3 Petal.Length 7.412263e-10                  No
## 4  Petal.Width 1.680465e-08                  No

histograma para las variables numéricas

histograma <- function(df){
  columnas_numericas <- sapply(df, is.numeric)
  for(nombre_columna in names(df) [columnas_numericas]){
    p <- ggplot(df, aes_string(nombre_columna)) +
      geom_histogram(binwidth = 10, fill= "darkmagenta", color ="black") +
      labs(title  = paste("Histograma de", nombre_columna),
           x = nombre_columna,
           y = "Recurrencia")
    print(p)
  }
}


histograma(data)

estadisticos_numericos_df
##       Variable Media Mediana IQR Sigma
## 1 Sepal.Length  5.84    5.80 1.3  0.83
## 2  Sepal.Width  3.06    3.00 0.5  0.44
## 3 Petal.Length  3.76    4.35 3.5  1.77
## 4  Petal.Width  1.20    1.30 1.5  0.76
variable = estadisticos_numericos_df[1, "Variable"]
mu = estadisticos_numericos_df[1, "Media"]
sigma = estadisticos_numericos_df[1, "Sigma"]

print(paste("Variable:", variable, "Media (mu):", mu, "Desviación estándar (sigma):", sigma))
## [1] "Variable: Sepal.Length Media (mu): 5.84 Desviación estándar (sigma): 0.83"

Distribución normal y estandarizada de la variable Sepal.length

variable <- estadisticos_numericos_df[1, "Variable"]  # Nombre de la variable
data_variable <- variables_numericas_df[[variable]]  # Extraer la columna

# Calcular media y desviación estándar
mu <- mean(data_variable, na.rm = TRUE)  # Media
sigma <- sd(data_variable, na.rm = TRUE)  # Desviación estándar

# Generar valores para ambas distribuciones
x_original <- seq(mu - 4 * sigma, mu + 4 * sigma, length.out = 1000)  # Original

x_standardized <- (x_original - mu) / sigma # calculo de z
y_standardized <- dnorm(x_standardized, mean = 0, sd = 1)

# Crear dataframes para las dos distribuciones
data_original <- data.frame(
  x = x_original,
  y = dnorm(x_original, mean = mu, sd = sigma),
  type = "Distribución Original"
)

data_standardized <- data.frame(
  x = x_standardized,
  y = dnorm(x_standardized, mean = 0, sd = 1),
  type = "Distribución Estandarizada"
)

# Combinar ambas distribuciones en un solo dataframe
plot_data <- bind_rows(data_original, data_standardized)
head(plot_data, 5)
##          x            y                  type
## 1 2.531069 0.0001616178 Distribución Original
## 2 2.537700 0.0001668732 Distribución Original
## 3 2.544331 0.0001722884 Distribución Original
## 4 2.550962 0.0001778680 Distribución Original
## 5 2.557593 0.0001836165 Distribución Original
# Crear el gráfico con ambas distribuciones
area <- ggplot(plot_data, aes(x = x, y = y, color = type, fill = type)) + 
  geom_line(size = 1) + 
  labs(
    title = paste("Distribución Normal: ", variable),
    x = "Valores (Original o Z-score)",
    y = "Densidad",
    color = "Distribución",
    fill = "Distribución"
  ) + 
  scale_color_manual(values = c("Distribución Original" = "blue", 
                                "Distribución Estandarizada" = "turquoise")) +
  scale_fill_manual(values = c("Distribución Original" = "blue", 
                               "Distribución Estandarizada" = "turquoise")) +
  theme_gray() +
  theme(legend.position = "top")

# Convertir a un gráfico interactivo
ggplotly(area)

Volver al inicio