En clase y en el libro vimos que trabajar con datos implica manejar muchísimos números, tantos que resulta difícil analizarlos uno por uno. Para simplificar, usamos estadística descriptiva, que nos permite resumir toda esa información en uno o dos valores representativos. Así podemos entender mejor el comportamiento general de los datos sin perdernos en los detalles. En R, hay varias funciones básicas que nos ayudan a calcular estas medidas. La idea es repasar esas funciones y luego aplicarlas para responder preguntas con datos reales.
Para realizar estadística descriptiva de debemos introducir números en una variable de la siguiente manera:
• Usamos c()
para combinar valores.
• Usamos seq()
para crear secuencias.
• Usamos rep()
para repetir valores.
one_to_one_hundred <- seq(1,100,1)
Se pueden ir repitiendo cosas usando rep.
rep(10,5)
## [1] 10 10 10 10 10
rep(1,25)
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
all_together_now <- c(rep(10,5),rep(1,2))
one_to_one_hundred <- seq(1,100,1)
sum(one_to_one_hundred)
## [1] 5050
Si tenemos un conjunto de 100 números guardados en la variable one_to_one_hundred, podemos contar cuántos elementos contiene con la función length().
one_to_one_hundred <- seq(1,100,1)
length(one_to_one_hundred)
## [1] 100
##2.2.2 Medidas de Tendencia Central
La media de un conjunto de números se obtiene al dividr la suma total de valores entre la cantidad de números.
En R se puede calcular manualmente:
one_to_one_hundred <- seq(1,100,1)
sum(one_to_one_hundred) / length(one_to_one_hundred)
## [1] 50.5
Usando Mean sería de la siguiente manera:
mean(one_to_one_hundred)
## [1] 50.5
#2.2.2.2 Mediana La mediana es el número que se encuentra en el centro exacto de los números de menos a mayor.
Cuando hay un número par de números (ningún número en el centro), tomamos el número intermedio (0,5).
median(c(1,2,3))
## [1] 2
Es el número o dato qué más se repite en un conjunto de datos.
Como R no tiene una dunción base para calcularla. Es necesario escribir una por nuestra cuenta o, en este caso, sacarla de internet.
Ejemplo:
my_mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
my_mode(c(1,1,1,1,1,1,1,2,3,4))
## [1] 1
Entrando a ver medidas de dispersión, cuando queremos saber qué tan variables son los números es que usamos el rango, la varianza, la desviación estándar, etc.
La variación nos indica qué tan diferentes son los números dentro de un conjunto de datos.
Tomando una muestra de 100 números aleatorios de una distribución normal con media = 10 y desviación estándar = 5. Esto nos permite visualizar cómo se dispersan los datos alrededor de la media.
sample_numbers <- rnorm(100,10,5)
hist(sample_numbers)
#2.2.3.1 Rango
Son aquellos valores mínimo y máximo del conjunto, utilizamos la función range.
range(sample_numbers)
## [1] -0.6571013 23.9100803
#2.2.3.2 var = varianza
También podemos hallar la varianza muestral utlizando var. Nota: se divide entre (n-1)
var(sample_numbers)
## [1] 23.7009
Calculamos la desviación estándar de la muestra. Nota: Se divide entre (n-1)
sd(sample_numbers)
## [1] 4.868357
La desviación estándar es la raíz cuadrada de la varianza.
sqrt(var(sample_numbers))
## [1] 4.868357
Pongamos en un mismo lugar todos los descriptivos y otras funciones.
sample_numbers <- rnorm(100,10,5)
sum(sample_numbers)
## [1] 981.976
length(sample_numbers)
## [1] 100
mean(sample_numbers)
## [1] 9.81976
median(sample_numbers)
## [1] 10.18024
my_mode(sample_numbers)
## [1] 10.48366
range(sample_numbers)
## [1] -2.911156 22.527952
var(sample_numbers)
## [1] 27.96219
sd(sample_numbers)
## [1] 5.287928
Creamos un marco de fechas con 10 números en cada condición. Hay 10 condiciones, cada una etiquetada como A, B, C, D, E, F, G, H, I, J En otras palabras, se crean 10 grupos, cada grupo es una “condición”, y ese grupo es cada letra, o sea, A es un grupo/condición, B es otro grupo/condición y así sucesivamente hasta completar los 10 grupos. Cada grupo/condición se repite 10 veces con un score distinto cada vez. Esos son los datos que componen nuestra base.
scores <- rnorm(100,10,5)
conditions <- rep(c("A","B","C","D","E","F","G","H","I","J"), each =10)
my_df <- data.frame(conditions,scores)
Vamos a tratar de encontrar la media para cada condición, es decir, la media del score del grupo, la media del score del grupo B y así sucesivamente; pero primero de la forma lenta:
mean(my_df[my_df$conditions=="A",]$scores)
## [1] 8.737068
mean(my_df[my_df$conditions=="B",]$scores)
## [1] 10.83224
mean(my_df[my_df$conditions=="C",]$scores)
## [1] 7.416073
Y así seguiría y seguiría, pero no es lo que buscamos. Vamos a hacerlo ahora de la forma eficiente usando agrupar y resumir
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
my_df %>%
group_by(conditions) %>%
summarise(means = mean(scores))
## # A tibble: 10 × 2
## conditions means
## <chr> <dbl>
## 1 A 8.74
## 2 B 10.8
## 3 C 7.42
## 4 D 8.86
## 5 E 10.2
## 6 F 10.1
## 7 G 13.0
## 8 H 12.0
## 9 I 13.2
## 10 J 8.77
Para hacerlo más estético vamos a crear una variable nueva que contenga los resultados anteriores y usaremos el comando knitr
summary_df <- my_df %>%
group_by(conditions) %>%
summarise(means = mean(scores))
knitr::kable(summary_df)
conditions | means |
---|---|
A | 8.737068 |
B | 10.832237 |
C | 7.416073 |
D | 8.858991 |
E | 10.165285 |
F | 10.142674 |
G | 13.012756 |
H | 12.034849 |
I | 13.186767 |
J | 8.771618 |
#Descriptivos Múltiples
Siguiendo con dplyr, agregaremos más funciones para obtener resultados más completos, por ejemplo, en este caso, agregando la desviación estándar.
summary_df <- my_df %>%
group_by(conditions) %>%
summarise(means = mean(scores),
sds = sd(scores))
knitr::kable(summary_df)
conditions | means | sds |
---|---|---|
A | 8.737068 | 3.536784 |
B | 10.832237 | 5.574790 |
C | 7.416073 | 5.595073 |
D | 8.858991 | 4.670323 |
E | 10.165285 | 4.159205 |
F | 10.142674 | 5.871412 |
G | 13.012756 | 6.317362 |
H | 12.034849 | 3.975971 |
I | 13.186767 | 3.047313 |
J | 8.771618 | 5.970681 |
Además, también agregaremos el mínimo y máximo como dice el laboratorio:
summary_df <- my_df %>%
group_by(conditions) %>%
summarise(means = mean(scores),
sds = sd(scores),
min = min(scores),
max = max(scores))
knitr::kable(summary_df)
conditions | means | sds | min | max |
---|---|---|---|---|
A | 8.737068 | 3.536784 | 2.4463834 | 15.51674 |
B | 10.832237 | 5.574790 | 2.5832394 | 18.83093 |
C | 7.416073 | 5.595073 | -0.6015067 | 17.04223 |
D | 8.858991 | 4.670323 | -0.7449633 | 16.09298 |
E | 10.165285 | 4.159205 | 5.0084679 | 17.81393 |
F | 10.142674 | 5.871412 | -3.4122152 | 15.58288 |
G | 13.012756 | 6.317362 | 5.7107482 | 26.57300 |
H | 12.034849 | 3.975971 | 7.2871111 | 19.66143 |
I | 13.186767 | 3.047313 | 9.0613325 | 19.55585 |
J | 8.771618 | 5.970681 | -1.1122139 | 19.48155 |
#Descripción de gapminder
Ahora bien, superados estos ejercicios de práctica y saber cómo funciona, es hora de aplicarlo a un conjunto de datos como es Gapminder:
(En este caso en la segunda línea de código estamos creando una copia del objeto ¿por qué? para mayor organización. Además, existirán casos en los que sea necesario convertir la base en data frames para que los paquetes funcionen de la mejor forma posible. Esta es una aclaración para dudas propias.)
library(gapminder)
## Warning: package 'gapminder' was built under R version 4.4.3
gapminder_df <- gapminder
#2.2.5.1 ¿Cuáles son algunos indicadores de esperanza de vida por continenete?
A continuación, usaremos los mismos comandos que anteriormente para hacer las descripciones, solo que reemplazamos los llamados a gapminder.
summary_df <- gapminder_df %>%
group_by(continent) %>%
summarise(means = mean(lifeExp),
sds = sd(lifeExp),
min = min(lifeExp),
max = max(lifeExp))
knitr::kable(summary_df)
continent | means | sds | min | max |
---|---|---|---|---|
Africa | 48.86533 | 9.150210 | 23.599 | 76.442 |
Americas | 64.65874 | 9.345088 | 37.579 | 80.653 |
Asia | 60.06490 | 11.864532 | 28.801 | 82.603 |
Europe | 71.90369 | 5.433178 | 43.585 | 81.757 |
Oceania | 74.32621 | 3.795611 | 69.120 | 81.235 |
mean(gapminder_df$lifeExp) # media = 59.47444
## [1] 59.47444
sd(gapminder_df$lifeExp) # desviación estándar = 12.91711
## [1] 12.91711
min(gapminder_df$lifeExp) # valor mínimo = 23.599
## [1] 23.599
max(gapminder_df$lifeExp) # valor máximo = 82.603
## [1] 82.603
Para responder a esta pregunta primero filtraremos los datos como es la indicación y luego si usaremos nuevamente los comandos aprendidos.
continentes_2007 <- filter(gapminder_df, year==2007) %>%
group_by(continent) %>%
summarise(means = mean(lifeExp),
sds = sd(lifeExp),
min = min(lifeExp),
max = max(lifeExp))
knitr::kable(continentes_2007)
continent | means | sds | min | max |
---|---|---|---|---|
Africa | 54.80604 | 9.6307807 | 39.613 | 76.442 |
Americas | 73.60812 | 4.4409476 | 60.916 | 80.653 |
Asia | 70.72848 | 7.9637245 | 43.828 | 82.603 |
Europe | 77.64860 | 2.9798127 | 71.777 | 81.757 |
Oceania | 80.71950 | 0.7290271 | 80.204 | 81.235 |
La moda es el valor que aparece con mayor frecuencia en un conjunto de datos. Es decir, es el número que más veces se repite.
Un conjunto de números tiene dos modas, se dice que es bimodal y es cuando existen dos valores diferentes que se repiten con la misma frecuencia y más veces que los demás.
La mediana es el valor central de un conjunto de datos cuando estos están ordenados de menor a mayor. Si hay un número impar de datos, es el del centro; si hay un número par, es el promedio de los dos valores centrales.
La media o media aritmética (promedio) es el resultado de sumar todos los valores de un conjunto y dividir esa suma entre la cantidad total de valores.
El rango es la diferencia que existe entre el valor mínimo y máximo de la muestra o un conjunto de datos. Por ejemplo, en un conjunto de datos que tiene las edades de cierto número de edades, la máxima podría ser 89 y la mínima 13. Por tanto el rango sería igual a la distancia existente entre ambos valores, es decir, 76. Hay que recalcar que de acuerdo con _____ esta medida no es “robusta” pues es fácilmente influenciada por los datos extremos o atípicos.
Las puntuaciones de diferencia al calcular la desviación estándar indican cuánto se alejan los datos de la media. Sin embargo, no es tan sencilla la interpretación como leer valores absolutos, en cambio la desviación estándar me muestra que tan alejados están los datos pero en medida de 1 desviación estándar, o 2 desviación estándar, o 3, etc.
Las puntuaciones de diferencia se elevan al cuadrado para: i) evitar valores negativos, pues técnicamente las distancias no son negativas; y ii) porque los estadísticos decidieron que al elevar al cuadrado añadían un mayor peso a la distancia, haciéndola crecer exponencialmente para los datos que más se alejan.
Para responder esta pregunta basta con saber que la desviación estándar es la raíz cuadrada de la varianza, por tanto, en este caso, elevamos estos valores al cuadrado y obtendremos la respuesta. 5 2 = 25 10 2 = 100 De esta forma tenemos que la mayor varianza es la segunda, 100, debido a que estos datos están más dispersos.