Librerias que se usaran durante el tema de Medidas de Tendencia Central, Dispersion y de Posiciòn:

#install.packages("fdth")
library(fdth)
## 
## Attaching package: 'fdth'
## The following objects are masked from 'package:stats':
## 
##     sd, var
library(ggplot2)
library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(moments)
library(plotly)

Medidas de Tendencia Central

Las medidas de tendencia central son valores estadísticos que resumen un conjunto de datos mediante la identificación de un valor central o representativo. Estas medidas describen el punto alrededor del cual se distribuyen los datos, proporcionando una idea de su centro o tendencia típica.

Las tres medidas principales de tendencia central son:

Media (o promedio): Es la suma de todos los valores de un conjunto de datos dividida por el número total de valores. Se utiliza principalmente cuando los datos son numéricos y no presentan valores extremos que puedan distorsionar el promedio.

Para la explicación del tema tomemos los precios de 9 casas en millones de pesos

# Precio de 9 casas en millones de pesos
precio<-c(74, 82, 107, 92, 125, 130, 118, 140, 153)

Exploración de Datos

Para la exploración de datos, para obtener un resumen del vector “precio” usaremos summary , y ejecutamos str para saber de que tipo es el vector, y con head para ver el contenido del vector.

summary(precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    74.0    92.0   118.0   113.4   130.0   153.0
str(precio)
##  num [1:9] 74 82 107 92 125 130 118 140 153
head(precio)
## [1]  74  82 107  92 125 130
tail(precio)
## [1]  92 125 130 118 140 153

De los resultados mostrados con summary observamos que el precio mínimo es 74 millones y el máximo es 153 millones. El promedio “Mean” es 113.4 millones y el valor de la mediana “Median” es 118.

str nos indica que los datos contenidos en la lista son num, es decir del tipo numericos y que el vector contiene 9 elemento [1:9].

head muestra los primeros 5 valores del vector por default

Funcion mean

La funcion mean permite calcular la media de un vector de datos

mean(precio)
## [1] 113.4444

Caracteristica de la media

  • La media es afectada por la asimetría de la distribución de los datos y por la presencia de “outliers” . En el ejemplo anterior introduzca el valor de 500 ( el cual representa una casa de un valor de 500 millones)
# Precio1 introduciendo el valor de 500
precio1<-c(74, 82, 107, 92, 125, 130, 118, 140,500)
mean(precio1)
## [1] 152
  • El valor de la media debe estar entre el valor menor y mayor dato

  • Si a cada dato de la muestra se les suma( o resta) una constante entonces la media queda sumada ( o restada) por dicha constante.

mean(precio)
## [1] 113.4444
precio+6 # Se le adiciona 6 a cada valor del vector
## [1]  80  88 113  98 131 136 124 146 159
mean(precio+6)
## [1] 119.4444
  • Si a cada dato de la muestra se e multiplica ( o divide) por una constante entonces, la media queda multiplicada( o dividida) por dicha constante
mean(precio)
## [1] 113.4444
precio*6 # Se le multiplica 6 a cada valor del vector
## [1] 444 492 642 552 750 780 708 840 918
mean(precio*6)
## [1] 680.6667

Mediana

Es el valor central de un conjunto de datos ordenado. Si el número de datos es impar, la mediana es el valor que está en el medio; si es par, es el promedio de los dos valores centrales. La mediana es útil cuando hay valores extremos o datos atípicos, ya que no se ve afectada por ellos.

*Para un número par de datos: La mediana es el promedio de los dos valores centrales.

Funcion median

median(precio)
## [1] 118

La mediana es mas fuerte a valores atípicos. Esto es a diferencia de la media, la mediana no es afectada por la presencia de valores anormales

Moda

Es el valor o los valores que más se repiten en un conjunto de datos. Puede haber una moda (unimodal), más de una moda (bimodal o multimodal), o no haber ninguna si todos los valores son diferentes. La moda se usa principalmente para datos categóricos o cuando se busca identificar los valores más comunes.

Funcion mfv

Supongamos 10 calificaciones

# 10 calificaciones con valores enteros
calificaciones = c(5, 7, 8, 8, 10, 9, 7, 6, 8, 9)
mfv(calificaciones)
## [1] 8

Otra manera de observar la moda es mediante la funcion table()

table(calificaciones)
## calificaciones
##  5  6  7  8  9 10 
##  1  1  2  3  2  1

Calculo de las medidas de tendencia central usando bases de datos

Limpiar espacio de trabajo

#rm(list = ls())

Importar datos

notas <- read_delim("notas.csv", delim = ";",show_col_types = F)

Exploramos para conocer la naturaleza de nuestros datos

str(notas)
## spc_tbl_ [5,535 × 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Alumno      : num [1:5535] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Semestre    : num [1:5535] 12 13 10 13 10 10 13 11 11 10 ...
##  $ Cr.Aprobados: num [1:5535] 207 226 235 231 235 235 231 197 235 231 ...
##  $ Cr.Cursando : num [1:5535] 19 9 10 14 10 10 4 23 10 4 ...
##  $ Promedio    : num [1:5535] 79.8 82.5 95.2 79.3 92.7 ...
##  $ Carrera     : chr [1:5535] "SISTEMAS" "SISTEMAS" "SISTEMAS" "SISTEMAS" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Alumno = col_double(),
##   ..   Semestre = col_double(),
##   ..   Cr.Aprobados = col_double(),
##   ..   Cr.Cursando = col_double(),
##   ..   Promedio = col_double(),
##   ..   Carrera = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>
summary(notas)
##      Alumno         Semestre       Cr.Aprobados  Cr.Cursando      Promedio     
##  Min.   :  1.0   Min.   : 2.000   Min.   :  4   Min.   : 3.0   Min.   : 70.00  
##  1st Qu.:106.0   1st Qu.: 3.000   1st Qu.: 53   1st Qu.:23.0   1st Qu.: 83.25  
##  Median :239.0   Median : 6.000   Median :109   Median :28.0   Median : 86.36  
##  Mean   :262.2   Mean   : 5.826   Mean   :115   Mean   :26.1   Mean   : 86.60  
##  3rd Qu.:388.0   3rd Qu.: 8.000   3rd Qu.:172   3rd Qu.:30.0   3rd Qu.: 89.83  
##  Max.   :755.0   Max.   :17.000   Max.   :264   Max.   :42.0   Max.   :100.00  
##    Carrera         
##  Length:5535       
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

Si la base de datos tiene datos faltantes podemos eliminar

notas<-na.omit(notas)

Medidas de tendencia central para la base de datos

Para seleccionar una variable especifica de la base de datos, escribimos en nombre de la base de datos seguido del signo $ y se listaran todas las variables de la base de datos.

# media de la variable numero de semestre
mean(notas$Semestre)
## [1] 5.825836
# media de la variable creditos aprobados
mean(notas$Cr.Aprobados)
## [1] 114.9991
# mediana para la variable promedio
median(notas$Promedio)
## [1] 86.36
# moda para la variable carrera
mfv(notas$Carrera)
## [1] "INDUSTRIAL"

Funcio sapply()

La función sapply() en R es una de las funciones que se utiliza para aplicar una función a cada elemento de una lista, vector o marco de datos, y devuelve el resultado de manera simplificada, en la forma más compacta posible (por ejemplo, un vector o matriz).

Parametros de la funcion sapply

  • X: El objeto al que se le aplica la función (generalmente una lista, vector o dataframe).

  • FUN: La función que se desea aplicar(mean,median,mfv,sd).

  • simplify: Si es TRUE, intenta simplificar el resultado a un vector, matriz o lista. Si es FALSE, el resultado será una lista (similar a lapply()).

  • USE.NAMES: Si es TRUE y X tiene nombres, los preservará en el resultado.

sapply(notas[, sapply(notas, is.numeric)], mean, simplify = T, USE.NAMES = F)
##       Alumno     Semestre Cr.Aprobados  Cr.Cursando     Promedio 
##   262.233966     5.825836   114.999097    26.104246    86.595225
medias_numericas<-sapply(notas[, sapply(notas, is.numeric)], mean, simplify = F, USE.NAMES = F)

# Si deseo la salida como un data.frame
medias_df <- as.data.frame(t(medias_numericas))
medias_df
##    Alumno Semestre Cr.Aprobados Cr.Cursando Promedio
## 1 262.234 5.825836     114.9991    26.10425 86.59522

Calculo de la media usando la funcion Sumarice de dplyr

# suppressWarnings() evita mostrar los mensajes de advertencia
suppressWarnings(summarise_each(notas, funs(mean)))# Media para todas las variables
## # A tibble: 1 × 6
##   Alumno Semestre Cr.Aprobados Cr.Cursando Promedio Carrera
##    <dbl>    <dbl>        <dbl>       <dbl>    <dbl>   <dbl>
## 1   262.     5.83         115.        26.1     86.6      NA
suppressWarnings(summarise_each(notas[,c(3,4,5,6)], funs(mean)))# Media para las variables elegidas
## # A tibble: 1 × 4
##   Cr.Aprobados Cr.Cursando Promedio Carrera
##          <dbl>       <dbl>    <dbl>   <dbl>
## 1         115.        26.1     86.6      NA
suppressWarnings(summarise(notas, avg = mean(notas$Promedio)))# Calcula el promedio para una sola variable
## # A tibble: 1 × 1
##     avg
##   <dbl>
## 1  86.6

Promedio de notas por carreras usando la funcion gruop_by y summarize

notas %>%
  group_by(Carrera) %>%
  summarize(promedio = mean(Promedio))
## # A tibble: 14 × 2
##    Carrera        promedio
##    <chr>             <dbl>
##  1 ADMINISTRACION     90.2
##  2 ARQUITECTURA       87.0
##  3 BIOQUIMICA         86.4
##  4 CIVIL              84.5
##  5 ELECTRICA          85.8
##  6 ELECTRONICA        87.0
##  7 GESTION            88.3
##  8 INDUSTRIAL         85.9
##  9 INFORMATICA        87.4
## 10 MECANICA           83.5
## 11 MECATRONICA        85.2
## 12 QUIMICA            87.3
## 13 SISTEMAS           87.2
## 14 TIC                85.4

MEDIDAS DE DISPERSIÓN

Varianza( Se utiliza la funcion var)

Es una medida que da una idea del grado de concentración de los datos seria el promedio de las desviaciones al cuadrado con respecto a la media.

El problema mayor que tiene la varianza es que las unidades están expresadas al cuadrado.

#Se determina la varianza de las variable del conjunto de datos.

var_promedio<-var(notas$Promedio)
var_cr.cursando<-var(notas$Cr.Cursando)
var_cr.aprobados<-var(notas$Cr.Aprobados)

Calculo de la varianza usando la funcion Sumarice de dplyr

summarise_each(notas, funs(var))# Varianza para todas las variables
## Warning: `summarise_each()` was deprecated in dplyr 0.7.0.
## ℹ Please use `across()` instead.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
## 
## # Simple named list: list(mean = mean, median = median)
## 
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
## 
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `Carrera = var(Carrera)`.
## Caused by warning in `stats::var()`:
## ! NAs introduced by coercion
## # A tibble: 1 × 6
##   Alumno Semestre Cr.Aprobados Cr.Cursando Promedio Carrera
##    <dbl>    <dbl>        <dbl>       <dbl>    <dbl>   <dbl>
## 1 33255.     8.23        4807.        49.1     20.7      NA
summarise_each(notas[,c(3,4,5,6)], funs(var))# Varianza para las variables elegidas
## Warning: `summarise_each()` was deprecated in dplyr 0.7.0.
## ℹ Please use `across()` instead.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
## 
## # Simple named list: list(mean = mean, median = median)
## 
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
## 
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `Carrera = var(Carrera)`.
## Caused by warning in `stats::var()`:
## ! NAs introduced by coercion
## # A tibble: 1 × 4
##   Cr.Aprobados Cr.Cursando Promedio Carrera
##          <dbl>       <dbl>    <dbl>   <dbl>
## 1        4807.        49.1     20.7      NA
summarise(notas, avg = var(notas$Promedio))# Calcula la varianza para una sola variable
## # A tibble: 1 × 1
##     avg
##   <dbl>
## 1  20.7

Varianza de la variable promedio de notas por carreras usando la funcion gruop_by y summarize

notas %>%
  group_by(Carrera) %>%
  summarize(promedio_por_car = var(Promedio))
## # A tibble: 14 × 2
##    Carrera        promedio_por_car
##    <chr>                     <dbl>
##  1 ADMINISTRACION             14.1
##  2 ARQUITECTURA               16.4
##  3 BIOQUIMICA                 25.4
##  4 CIVIL                      18.5
##  5 ELECTRICA                  17.3
##  6 ELECTRONICA                18.8
##  7 GESTION                    16.4
##  8 INDUSTRIAL                 19.1
##  9 INFORMATICA                17.2
## 10 MECANICA                   17.1
## 11 MECATRONICA                13.0
## 12 QUIMICA                    21.7
## 13 SISTEMAS                   20.3
## 14 TIC                        18.7

Desviación Estandar( Se utiliza la funcion sd)

Es la raíz cuadrada positiva de la varianza y tiene la ventaja que esta en las mismas unidades de medida que los datos. Se representa por s.

De por si sola la desviación estándar no permite concluir si la muestra es muy variable o poco variable.

La desviación estándar tampoco es tan confiable para medir la variabilidad de los datos.

Ejemplo

Considere los siguientes conjuntos de datos:

c1=c(16,18,25,28,23,42,24,47,38,19,22,34) 
c2=c(116,118,125,128,123,142,124,147,138,119,122,134)

Calculemos la varianza y desviacion estandar para cada conjunto.

sd(c1)
## [1] 10.01817
sd(c2)
## [1] 10.01817

Observe que las medidas de variabilidad son iguales, pero es claro que los elementos del conjunto de datos primero tiene mayor variabilidad que el segundo conjunto de datos. La razón es que, aunque las desviaciones estándar son iguales, la media de los valores en el conjunto 1 es mucho menor que en el conjunto 2, lo que hace que la variabilidad sea más significativa en relación con la media en el primer conjunto.

Por lo cual lo mejor es hallar el coeficiente de variación

#Se determina la desviacion estandar de las variable del conjunto de datos.

des_promedio<-sd(notas$Promedio)
des_cr.cursando<-sd(notas$Cr.Cursando)
des_cr.aprobados<-sd(notas$Cr.Aprobados)

Desviacion estandar de la variable promedio de notas por carreras usando la funcion gruop_by y summarize

notas %>%
  group_by(Carrera) %>%
  summarize(Desviaciones_estandar = sd(Promedio))
## # A tibble: 14 × 2
##    Carrera        Desviaciones_estandar
##    <chr>                          <dbl>
##  1 ADMINISTRACION                  3.76
##  2 ARQUITECTURA                    4.05
##  3 BIOQUIMICA                      5.04
##  4 CIVIL                           4.30
##  5 ELECTRICA                       4.16
##  6 ELECTRONICA                     4.33
##  7 GESTION                         4.05
##  8 INDUSTRIAL                      4.36
##  9 INFORMATICA                     4.15
## 10 MECANICA                        4.14
## 11 MECATRONICA                     3.61
## 12 QUIMICA                         4.66
## 13 SISTEMAS                        4.51
## 14 TIC                             4.32

Coeficiente de variacion

El coeficiente de variación es el cociente entre la desviacion estandar y la media. Los datos se dan el porcentaje:

Se calcula y se puede interpretar que si CV es mayor que 30% la muestra es muy variable. Si CV es menor que 30% no existe mucha variabilidad ## Funcion para calcular el coeficiente de variacion

coeficiente_variacion <- function(x) {
  cv <- sd(x) / mean(x) * 100
  return(cv)
}

coeficiente_variacion(notas$Promedio)
## [1] 5.256737
coeficiente_variacion(c1)
## [1] 35.77916
coeficiente_variacion(c2)
## [1] 7.826692

Coeficiente de variacion de la variable promedio de notas por carreras usando la funcion gruop_by y summarize

notas %>%
  group_by(Carrera) %>%
  summarize(Coe_var = coeficiente_variacion(Promedio))
## # A tibble: 14 × 2
##    Carrera        Coe_var
##    <chr>            <dbl>
##  1 ADMINISTRACION    4.17
##  2 ARQUITECTURA      4.66
##  3 BIOQUIMICA        5.84
##  4 CIVIL             5.09
##  5 ELECTRICA         4.85
##  6 ELECTRONICA       4.98
##  7 GESTION           4.58
##  8 INDUSTRIAL        5.08
##  9 INFORMATICA       4.75
## 10 MECANICA          4.95
## 11 MECATRONICA       4.23
## 12 QUIMICA           5.34
## 13 SISTEMAS          5.17
## 14 TIC               5.05

GRAFICOS ESTADISTICO

Realizamos graficos(barras, histogramas, boxplot)

Graficos de barras para las variables categoricas o cualitativas

###Funcion barplot

Carrera<-table(notas$Carrera)

barplot(Carrera,              #B) Se aplica barplot a esa tabla
        main="TITULO GENERAL",          #C) Título principal     
        xlab="Eje X",                   #D) Tíulo del eje X
        ylab="Eje Y",                   #E) Título del eje Y
        legend = rownames(notas$Carrera),#F) Mostrar las leyendas
        col=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14),#G) Poner color
        ylim = c(0, 700)                #H) Ajustar límites en eje Y
        )                               #I) No olvidar cerrar el paréntesis

# Graficos de barras con ggplot2

# Grafica de barra de la variable promedio por carrera
plot_ly(data = notas, x = ~Carrera, y = ~Promedio, color = ~Carrera, type = "bar" )
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

Grafico de Boxplot

boxplot(notas$Promedio)

## Agregando parametros al boxplot

boxplot(airquality$Ozone,
main = "Boxplot de nota promedio",
xlab = "",
ylab = "Promedio",
col = "orange",
border = "brown",
horizontal = F,
notch = T
)

### Boxplot con ggplot2

# Grafica de boxplot de la variable promedio por carrera
plot_ly(data = notas, x = ~Carrera, y = ~Promedio, color = ~Carrera, type = "box" )
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

Crear Histogramas para variables numericas

hist(notas$Cr.Cursando, col = "blue")

hist(notas$Cr.Aprobados, col = "blue")

hist(notas$Promedio, col = "blue")

hist(notas$Semestre, col = "blue")

## Histogramas en un solo grafico

par(mfrow=c(2,2))
hist(notas$Cr.Cursando, 
    col = "blue",breaks = 10, 
    main="His.Creditos Cursando", 
    xlab="Intervalos")
hist(notas$Cr.Aprobados, 
     col = "blue",breaks = 10, 
     main="His.Creditos Aprobados", 
     xlab="Intervalos")
hist(notas$Promedio, 
     col = "blue",breaks = 10, 
     main="His.Nota promedio", 
     xlab="Intervalos")
hist(notas$Semestre, 
     col = "blue",breaks = 10, 
     main="His.Semestre", 
     xlab="Intervalos")

Histobramas con ggplot

ggplot(data.frame(notas$Promedio), aes(x = notas$Promedio)) + 
       geom_histogram(aes(y = ..density..),color = "red",fill = "green")+
  geom_density(fill = "black", alpha = 0.25) #con alpha elegimos el grado de transparencia
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.