# Alejandra Ciria
# Clase: Aprendizaje, Motivación y Cognición I
# Ciencias Cognitivas y del Comportamiento
# Facultad de PsicologÃa, UNAM
# Set working directory: Session - Set working directory - Choose directory
# En esta clase veremos en R
# Medidas de tendencia central, medidas de dispersión
# Estadistica descriptiva:
# Su propósito es describir o caracterizar los datos
# Para eso usaremos los siguientes datos de los alumnos de la clase:
# Edad (primero mujeres, luego hombres)
# Género
# Edad y género de los participantes, se asigna a la variable edad y a género
# Se crean las dos variables con sus vectores datos
# Para asignarle vectores a una variable se concatenan mediante: <- c()
edad <- c(20,20,22,19,20,21,22,22,27,21,21,20,24,23,20,20,25,22,20,21,23,22,20,20,20,24,22,27)
genero_num <- c(2,1,1,2,1,1,1,1,1,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1)
# Imrpimir en consola los datos asignados a edad
print(edad)
## [1] 20 20 22 19 20 21 22 22 27 21 21 20 24 23 20 20 25 22 20 21 23 22 20 20 20
## [26] 24 22 27
edad
## [1] 20 20 22 19 20 21 22 22 27 21 21 20 24 23 20 20 25 22 20 21 23 22 20 20 20
## [26] 24 22 27
# Género es un factor con dos niveles
genero <- as.factor(genero_num)
levels(genero) <- c("mujer", "hombre")
# Imrpimir en consola los datos asignados a genero
print(genero)
## [1] hombre mujer mujer hombre mujer mujer mujer mujer mujer hombre
## [11] hombre mujer hombre mujer mujer mujer mujer mujer mujer hombre
## [21] mujer hombre mujer mujer mujer mujer mujer mujer
## Levels: mujer hombre
#Ver resumen de datos
str(edad)
## num [1:28] 20 20 22 19 20 21 22 22 27 21 ...
str(genero)
## Factor w/ 2 levels "mujer","hombre": 2 1 1 2 1 1 1 1 1 2 ...
# Agregar los datos a un data.frame
df <- data.frame(edad, genero)
df
## edad genero
## 1 20 hombre
## 2 20 mujer
## 3 22 mujer
## 4 19 hombre
## 5 20 mujer
## 6 21 mujer
## 7 22 mujer
## 8 22 mujer
## 9 27 mujer
## 10 21 hombre
## 11 21 hombre
## 12 20 mujer
## 13 24 hombre
## 14 23 mujer
## 15 20 mujer
## 16 20 mujer
## 17 25 mujer
## 18 22 mujer
## 19 20 mujer
## 20 21 hombre
## 21 23 mujer
## 22 22 hombre
## 23 20 mujer
## 24 20 mujer
## 25 20 mujer
## 26 24 mujer
## 27 22 mujer
## 28 27 mujer
# Resumen estadÃsticos descriptivos del data.frame
summary(df)
## edad genero
## Min. :19.00 mujer :21
## 1st Qu.:20.00 hombre: 7
## Median :21.00
## Mean :21.71
## 3rd Qu.:22.25
## Max. :27.00
# Tip: para ver la estadÃstica descritiva por grupo
# utiliza la función: by()
by(df, df$genero, summary)
## df$genero: mujer
## edad genero
## Min. :20.0 mujer :21
## 1st Qu.:20.0 hombre: 0
## Median :22.0
## Mean :21.9
## 3rd Qu.:23.0
## Max. :27.0
## ------------------------------------------------------------
## df$genero: hombre
## edad genero
## Min. :19.00 mujer :0
## 1st Qu.:20.50 hombre:7
## Median :21.00
## Mean :21.14
## 3rd Qu.:21.50
## Max. :24.00
# Media
# Es el promedio de los datos
# La suma de todos los datos divididos por el número de datos
sum(edad)/length(edad)
## [1] 21.71429
# En R, la función para calcular la media es: mean()
media_edad <- mean(edad)
media_edad
## [1] 21.71429
# ¿Cómo podemos calcular la media por grupo?
#install.packages("doBy")
library(doBy)
# Una manera de hacerlo es mediante la función de summaryBy de la librerÃa doBy
# Función para calcular estadÃsticas resumidas por grupos
medias <- summaryBy(edad~genero, data= df, FUN=c(mean))
medias
## genero edad.mean
## 1 mujer 21.90476
## 2 hombre 21.14286
# ¿Qué hicimos con esta función?
# Calculamos la media para cada nivel del factor
# Primero le decimos cuál es nuestra VD y VI, los datos y las funciones que queremos usar
# El operador tilde ~ se usa para definir la relación entre
# la variable dependiente y la independiente en un modelo estadÃstico
# La variable en el lado izquierdo del operador es la dependiente
# la variable del lado derecho es la independiente
# FUN contiene la lista de funciones que se van a aplicar, en este caso mean
# Graficar la media por grupo
plot(medias)

# Usando ggplot para graficar las medias
# Una forma es usando la función stat_summary del paquete Hmisc
# install.packages("Hmisc")
# Definimos la estética
library(ggplot2)
pl <- ggplot(df, aes(x = genero, y = edad))
# Gráfica de barras
pl + stat_summary(fun = "mean", geom = "bar") + ylim(0, 30)

# Gráfica de puntos
pl + stat_summary(fun = "mean", colour = "red", size = 3, geom = "point") + ylim(0, 30)

# Varianza
# La varianza toma en cuenta la diferencia entre el valor
# de cada dato y la media, esto es cuánto se desvÃa cada valor de la media
# Primero, entendamos una propiedad de la media
# La suma de las desviaciones alrededor de la media es igual a cero
suma_des <- c((media_edad-edad[1])+(media_edad-edad[2])+(media_edad-edad[3])+(media_edad-edad[4])
+(media_edad-edad[5])+(media_edad-edad[6])+(media_edad-edad[7])+(media_edad-edad[8])
+(media_edad-edad[9])+(media_edad-edad[10])+(media_edad-edad[11])+(media_edad-edad[12])
+(media_edad-edad[13])+(media_edad-edad[14])+(media_edad-edad[15])+(media_edad-edad[16])
+(media_edad-edad[17])+(media_edad-edad[18])+(media_edad-edad[19])+(media_edad-edad[20])
+(media_edad-edad[21])+(media_edad-edad[22])+(media_edad-edad[23])+(media_edad-edad[24])
+(media_edad-edad[25])+(media_edad-edad[26])+(media_edad-edad[27])+(media_edad-edad[28]))
# Para cambiar notación cientÃfica a decimales
options(scipen=999)
suma_des
## [1] 0.00000000000002842171
round(suma_des)
## [1] 0
# Por lo tanto, tenemos que elevar las desviaciones de la media al cuadrado
# Esto es lo que se conoce como varianza
suma_des_cuadrado <- c((media_edad-edad[1])^2+(media_edad-edad[2])^2+(media_edad-edad[3])^2+(media_edad-edad[4])^2
+(media_edad-edad[5])^2+(media_edad-edad[6])^2+(media_edad-edad[7])^2+(media_edad-edad[8])^2
+(media_edad-edad[9])^2+(media_edad-edad[10])^2+(media_edad-edad[11])^2+(media_edad-edad[12])^2
+(media_edad-edad[13])^2+(media_edad-edad[14])^2+(media_edad-edad[15])^2+(media_edad-edad[16])^2
+(media_edad-edad[17])^2+(media_edad-edad[18])^2+(media_edad-edad[19])^2+(media_edad-edad[20])^2
+(media_edad-edad[21])^2+(media_edad-edad[22])^2+(media_edad-edad[23])^2+(media_edad-edad[24])^2
+(media_edad-edad[25])^2+(media_edad-edad[26])^2+(media_edad-edad[27])^2+(media_edad-edad[28])^2)
suma_des_cuadrado
## [1] 119.7143
# Después se necesita dividir ese valor entre el tamaño de la muestra menos uno (n-1)
# La división entre n - 1 provoca que la varianza muestral iguale el valor de
# la varianza poblacional
varianza <- suma_des_cuadrado/27
varianza
## [1] 4.433862
# La función en R para la varianza es: var
var(edad)
## [1] 4.433862
# Desviación estándar
# Conocida también como desviación tÃpica es una medida del grado de
# dispersión de los datos con respecto al valor promedio (media)
# Dicho de otra manera, la desviación estándar es simplemente el "promedio"
# o variación esperada con respecto a la media aritmética
#La varianza es la raÃz cuadrada de la desviación estándar
# La desviación estándar (DE) en inglés (SD) se vincula con la varianza
# Porque es la raÃz cuadrada de ésta
# Función de R para sacar raÃz cuadrada es sqrt
ds <- sqrt(varianza)
ds
## [1] 2.105674
# La función en R para la desviación estádar es: sd
sd(edad)
## [1] 2.105674
# Veamos la media más ds y menos la ds
media_edad-ds
## [1] 19.60861
media_edad+ds
## [1] 23.81996
# ¿Cómo podemos calcular la media, la varianza, y la desviación estándar por grupo?
#library(doBy)
# De nuevo, samos la función de summaryBy de la librerÃa doBy
# Primero le decimos cuál es nuestra VD y VI
# FUN contiene la lista de funciones que se van a aplicar
# Podemos ver que ahora le pedimos que realice las funciones mean, var, sd
summaryBy(edad~genero, data= df, FUN=c(mean, var, sd))
## genero edad.mean edad.var edad.sd
## 1 mujer 21.90476 5.090476 2.256208
## 2 hombre 21.14286 2.476190 1.573592
#?summaryBy
#Graficar media y desviación estándar por grupo
# Se necesita paquete Hmisc para usar la función stat_summary
# Gráfica de barras
# Definimos la estética del gráfico, graficamos la media y definimos los lÃmites del eje y
pl <- ggplot(df, aes(x = genero, y = edad)) + stat_summary(fun = "mean", geom = "bar") + ylim(0,30)
pl

# Le agregamos la desviación estándar
pl + stat_summary(fun.data = "mean_sdl", geom = "errorbar", width = 0.4)

# Podemos usar una gráfica de puntos
pl <- ggplot(df, aes(x = genero, y = edad)) + stat_summary(fun = "mean", geom = "point") + ylim(0,30)
pl

pl + stat_summary(fun.data = "mean_sdl", geom = "errorbar", width = 0.4)

# Datos nominales
# Variables con niveles en una escala categórica
# Por ejemplo: ver el número de personas en cada categorÃa
# Fracciones y proporciones
# N = el número total de individuos en la muestra
# x = el número de personas en la categorÃa
# La fracción de ese: x/N
# Veamos el dataframe
df
## edad genero
## 1 20 hombre
## 2 20 mujer
## 3 22 mujer
## 4 19 hombre
## 5 20 mujer
## 6 21 mujer
## 7 22 mujer
## 8 22 mujer
## 9 27 mujer
## 10 21 hombre
## 11 21 hombre
## 12 20 mujer
## 13 24 hombre
## 14 23 mujer
## 15 20 mujer
## 16 20 mujer
## 17 25 mujer
## 18 22 mujer
## 19 20 mujer
## 20 21 hombre
## 21 23 mujer
## 22 22 hombre
## 23 20 mujer
## 24 20 mujer
## 25 20 mujer
## 26 24 mujer
## 27 22 mujer
## 28 27 mujer
# N = 28
summary(df)
## edad genero
## Min. :19.00 mujer :21
## 1st Qu.:20.00 hombre: 7
## Median :21.00
## Mean :21.71
## 3rd Qu.:22.25
## Max. :27.00
# mujeres = 21
# hombres = 7
# ¿Cuál es la proporción de hombres y mujeres?
prop_total_mujeres <- 21/28 *100
prop_total_mujeres
## [1] 75
prop_total_hombres <- 7/28 *100
prop_total_hombres
## [1] 25
# El 75% son mujeres y el 25% son hombres
# El total de las proporciones siempre debe ser 100
prop_total_genero <- c(prop_total_mujeres, prop_total_hombres)
prop_total_genero
## [1] 75 25
# Hacemos una gráfica de pastel
pie(prop_total_genero)

# Como no es informativa podemos cambiarla según lo que busquemos
pie(prop_total_genero,labels= df$genero, col = c("purple", "cyan"), main = "Total edad")

pie(prop_total_genero,labels= prop_total_genero, col = c("purple", "cyan"), main = "Total edad")
# Le agregamos una leyenda a la gráfica de pastel
legend("topright", c("Mujer","Hombre"), cex=0.8, fill= c("purple", "cyan"))

# Si preferimos usar el factor para determinar el color según los niveles
pie(prop_total_genero,labels= prop_total_genero, col = df$genero, main = "Total edad")
legend("topright", c("Mujer","Hombre"), cex=0.8, fill= df$genero)

# Proporciones por variable y nivel: edad y género
# Primero es necesario poner los datos del data frame en una tabla
# La función table en R:
# Usa los factores para crear una tabla de contingencia
# Cuenta los datos en cada combinación de los niveles del factor
# Con el operador signo de dólar $ podemos extraer subconjuntos usando nombres
# En otras palabras, permite extraer los elementos de una lista basado en sus nombres
# Primero veamos la distribución de frecuencia de edades en una tabla
tabla_edad <- table(df$edad)
tabla_edad
##
## 19 20 21 22 23 24 25 27
## 1 10 4 6 2 2 1 2
# Ahora, veamos proporciones por edad y género
# Hacemos una tabla
# Primero, toma el factor género para establecer las lÃneas de la tabla
# Y toma el factor edad para establecer las columnas de la tabla
tabla <- table(df$genero, df$edad)
tabla
##
## 19 20 21 22 23 24 25 27
## mujer 0 9 1 5 2 1 1 2
## hombre 1 1 3 1 0 1 0 0
# Si queremos cambiar el orden de las lÃneas y las columnas de la tabla de contingencia
# Entonces:
tabla <- table(df$edad, df$genero)
tabla
##
## mujer hombre
## 19 0 1
## 20 9 1
## 21 1 3
## 22 5 1
## 23 2 0
## 24 1 1
## 25 1 0
## 27 2 0
# Proporciones en la tabla
# La función prop.table nos da las proporciones de los datos asignados a tabla
# margin = 1, calcula la proporción de cada lÃnea de la tabla
# margin = 2, calcula las proporciones por columna
proptabla <- prop.table(tabla, margin = 2)
proptabla
##
## mujer hombre
## 19 0.00000000 0.14285714
## 20 0.42857143 0.14285714
## 21 0.04761905 0.42857143
## 22 0.23809524 0.14285714
## 23 0.09523810 0.00000000
## 24 0.04761905 0.14285714
## 25 0.04761905 0.00000000
## 27 0.09523810 0.00000000
# Porcentaje de edad por grupo
# Mujeres: en nuestra tabla, están en la primera columna [lÃnea, columna]
prop_mujeres <- proptabla[ , 1] * 100
prop_mujeres
## 19 20 21 22 23 24 25 27
## 0.000000 42.857143 4.761905 23.809524 9.523810 4.761905 4.761905 9.523810
# El total debe sumar 100
sum(prop_mujeres)
## [1] 100
# Hacer una gráfica de pastel
pie(prop_mujeres, col = prop_mujeres)

# Hombres: están en la segunda columna
prop_hombres <- proptabla[ ,2] * 100
prop_hombres
## 19 20 21 22 23 24 25 27
## 14.28571 14.28571 42.85714 14.28571 0.00000 14.28571 0.00000 0.00000
sum(prop_hombres)
## [1] 100
# Hacer una gráfica de pastel
pie(prop_hombres, col = prop_hombres)

# Didstribuciones de frecuencia
# Distribución de frecuencia de edades de toda la muestra
# Nos permite conocer el múmero de personas que dentro de un rango de edad
# Primero necesitamos conocer el valor mÃnimo y máximo
range(edad)
## [1] 19 27
# Dividir el rango en sub-intervalos con la función seq
# Primero le decimos el rango (from, to) y el número de incrementos (by)
intervalos <- seq(from= 19,to = 27, by= 2)
intervalos
## [1] 19 21 23 25 27
# Clasificamos las edades según los intervalos con la función cut
# Cut divide la variable edad según los intervalos en los que caen
# Los intervalos van a estar cerrados a la izquierda y abiertos a la derecha (right= FLASE)
edad.intervalos <- cut(edad, intervalos, right= FALSE)
edad.intervalos
## [1] [19,21) [19,21) [21,23) [19,21) [19,21) [21,23) [21,23) [21,23) <NA>
## [10] [21,23) [21,23) [19,21) [23,25) [23,25) [19,21) [19,21) [25,27) [21,23)
## [19] [19,21) [21,23) [23,25) [21,23) [19,21) [19,21) [19,21) [23,25) [21,23)
## [28] <NA>
## Levels: [19,21) [21,23) [23,25) [25,27)
# Para ver la frecuencia de cada intervalo lo ponemos en una tabla
edad.frec <- table(edad.intervalos)
edad.frec
## edad.intervalos
## [19,21) [21,23) [23,25) [25,27)
## 11 10 4 1
# Revisemos las frecuencias por intervalo en la variable edad
sort(edad)
## [1] 19 20 20 20 20 20 20 20 20 20 20 21 21 21 21 22 22 22 22 22 22 23 23 24 24
## [26] 25 27 27
# ¿Porqué no está incluyendo al 27? Necesitamos incluir el valor mayor
# include.lowest -logical, indicating if an ‘x[i]’ equal to the lowest
# (or highest, for right = FALSE)
edad.intervalos <- cut(edad, intervalos, right= FALSE, include.lowest = TRUE)
edad.intervalos
## [1] [19,21) [19,21) [21,23) [19,21) [19,21) [21,23) [21,23) [21,23) [25,27]
## [10] [21,23) [21,23) [19,21) [23,25) [23,25) [19,21) [19,21) [25,27] [21,23)
## [19] [19,21) [21,23) [23,25) [21,23) [19,21) [19,21) [19,21) [23,25) [21,23)
## [28] [25,27]
## Levels: [19,21) [21,23) [23,25) [25,27]
edad.frec <- table(edad.intervalos)
edad.frec
## edad.intervalos
## [19,21) [21,23) [23,25) [25,27]
## 11 10 4 3
# La función cbind combina las datos por columna y lÃnea, respectivamente
cbind(edad.frec)
## edad.frec
## [19,21) 11
## [21,23) 10
## [23,25) 4
## [25,27] 3
# Graficar la frecuencia de distribución de edad en una gráfica de pastel (o de sectores)
pie(edad.frec)

pie(edad.frec,labels= edad.frec, col = c("purple", "cyan", "red", "yellow"), main = "Frecuencias edad")
legend("topright", c("[19,21)", "[21,23)", "[23,25)", "[25,27]"), cex=0.8, fill= c("purple", "cyan", "red", "yellow"))
