You are on page 1of 26

Estadística Computacional - Análisis Exploratorio y Medidas de

Tendencial Central

Osnamir Bru

14 y 16 de abril 2020

En el análisis exploratorio de datos


Instalar las siguientes librerias
library(tidyverse)
library(dplyr)
library(ggplot2)
library(funModeling)
library(corrr)
library(Hmisc)
library(randomForest)

Adicionalmente;
library(tidyverse)
library(funModeling)
library(Hmisc)
# DataSet
#funModeling::heart_disease
# No se ve en el Global Envaironment
# Truco para verla
heart_disease=heart_disease

Analisis Exploratorio Inicial


df_status(heart_disease) # Análisis de la estructura del conjunto de datos

## variable q_zeros p_zeros q_na p_na q_inf p_inf type unique


## 1 age 0 0.00 0 0.00 0 0 integer 41
## 2 gender 0 0.00 0 0.00 0 0 factor 2
## 3 chest_pain 0 0.00 0 0.00 0 0 factor 4
## 4 resting_blood_pressure 0 0.00 0 0.00 0 0 integer 50
## 5 serum_cholestoral 0 0.00 0 0.00 0 0 integer 152
## 6 fasting_blood_sugar 258 85.15 0 0.00 0 0 factor 2
## 7 resting_electro 151 49.83 0 0.00 0 0 factor 3
## 8 max_heart_rate 0 0.00 0 0.00 0 0 integer 91
## 9 exer_angina 204 67.33 0 0.00 0 0 integer 2
## 10 oldpeak 99 32.67 0 0.00 0 0 numeric 40
## 11 slope 0 0.00 0 0.00 0 0 integer 3
## 12 num_vessels_flour 176 58.09 4 1.32 0 0 integer 4
## 13 thal 0 0.00 2 0.66 0 0 factor 3

1
## 14 heart_disease_severity 164 54.13 0 0.00 0 0 integer 5
## 15 exter_angina 204 67.33 0 0.00 0 0 factor 2
## 16 has_heart_disease 0 0.00 0 0.00 0 0 factor 2

Análisis univariado de variables categóricas y numéricas


plot_num(heart_disease) # Análisis para variables numéricas (gráficos)

age resting_blood_pressure serum_cholestoral


200
150
100
50
0
30 40 50 60 70 90 120 150 180 210
100 200 300 400 500 600

max_heart_rate exer_angina oldpeak


200
150
count

100
50
0
100 150 200 0.00 0.25 0.50 0.75 1.00 0 2 4 6

slope num_vessels_flour heart_disease_severity


200
150
100
50
0
1.0 1.5 2.0 2.5 3.0 0 1 2 3 0 1 2 3 4
value

Análisis cuantitativo
summary(heart_disease)

## age gender chest_pain resting_blood_pressure


## Min. :29.00 female: 97 1: 23 Min. : 94.0
## 1st Qu.:48.00 male :206 2: 50 1st Qu.:120.0
## Median :56.00 3: 86 Median :130.0
## Mean :54.44 4:144 Mean :131.7
## 3rd Qu.:61.00 3rd Qu.:140.0
## Max. :77.00 Max. :200.0
##
## serum_cholestoral fasting_blood_sugar resting_electro max_heart_rate
## Min. :126.0 0:258 0:151 Min. : 71.0
## 1st Qu.:211.0 1: 45 1: 4 1st Qu.:133.5
## Median :241.0 2:148 Median :153.0

2
## Mean :246.7 Mean :149.6
## 3rd Qu.:275.0 3rd Qu.:166.0
## Max. :564.0 Max. :202.0
##
## exer_angina oldpeak slope num_vessels_flour thal
## Min. :0.0000 Min. :0.00 Min. :1.000 Min. :0.0000 3 :166
## 1st Qu.:0.0000 1st Qu.:0.00 1st Qu.:1.000 1st Qu.:0.0000 6 : 18
## Median :0.0000 Median :0.80 Median :2.000 Median :0.0000 7 :117
## Mean :0.3267 Mean :1.04 Mean :1.601 Mean :0.6722 NA's: 2
## 3rd Qu.:1.0000 3rd Qu.:1.60 3rd Qu.:2.000 3rd Qu.:1.0000
## Max. :1.0000 Max. :6.20 Max. :3.000 Max. :3.0000
## NA's :4
## heart_disease_severity exter_angina has_heart_disease
## Min. :0.0000 0:204 no :164
## 1st Qu.:0.0000 1: 99 yes:139
## Median :0.0000
## Mean :0.9373
## 3rd Qu.:2.0000
## Max. :4.0000
##
describe(heart_disease) #Análisis numérico y categórico (cuantitativo)

## heart_disease
##
## 16 Variables 303 Observations
## --------------------------------------------------------------------------------
## age
## n missing distinct Info Mean Gmd .05 .10
## 303 0 41 0.999 54.44 10.3 40 42
## .25 .50 .75 .90 .95
## 48 56 61 66 68
##
## lowest : 29 34 35 37 38, highest: 70 71 74 76 77
## --------------------------------------------------------------------------------
## gender
## n missing distinct
## 303 0 2
##
## Value female male
## Frequency 97 206
## Proportion 0.32 0.68
## --------------------------------------------------------------------------------
## chest_pain
## n missing distinct
## 303 0 4
##
## Value 1 2 3 4
## Frequency 23 50 86 144
## Proportion 0.076 0.165 0.284 0.475
## --------------------------------------------------------------------------------
## resting_blood_pressure
## n missing distinct Info Mean Gmd .05 .10
## 303 0 50 0.995 131.7 19.41 108 110
## .25 .50 .75 .90 .95

3
## 120 130 140 152 160
##
## lowest : 94 100 101 102 104, highest: 174 178 180 192 200
## --------------------------------------------------------------------------------
## serum_cholestoral
## n missing distinct Info Mean Gmd .05 .10
## 303 0 152 1 246.7 55.91 175.1 188.8
## .25 .50 .75 .90 .95
## 211.0 241.0 275.0 308.8 326.9
##
## lowest : 126 131 141 149 157, highest: 394 407 409 417 564
## --------------------------------------------------------------------------------
## fasting_blood_sugar
## n missing distinct
## 303 0 2
##
## Value 0 1
## Frequency 258 45
## Proportion 0.851 0.149
## --------------------------------------------------------------------------------
## resting_electro
## n missing distinct
## 303 0 3
##
## Value 0 1 2
## Frequency 151 4 148
## Proportion 0.498 0.013 0.488
## --------------------------------------------------------------------------------
## max_heart_rate
## n missing distinct Info Mean Gmd .05 .10
## 303 0 91 1 149.6 25.73 108.1 116.0
## .25 .50 .75 .90 .95
## 133.5 153.0 166.0 176.6 181.9
##
## lowest : 71 88 90 95 96, highest: 190 192 194 195 202
## --------------------------------------------------------------------------------
## exer_angina
## n missing distinct Info Sum Mean Gmd
## 303 0 2 0.66 99 0.3267 0.4414
##
## --------------------------------------------------------------------------------
## oldpeak
## n missing distinct Info Mean Gmd .05 .10
## 303 0 40 0.964 1.04 1.225 0.0 0.0
## .25 .50 .75 .90 .95
## 0.0 0.8 1.6 2.8 3.4
##
## lowest : 0.0 0.1 0.2 0.3 0.4, highest: 4.0 4.2 4.4 5.6 6.2
## --------------------------------------------------------------------------------
## slope
## n missing distinct Info Mean Gmd
## 303 0 3 0.798 1.601 0.6291
##
## Value 1 2 3

4
## Frequency 142 140 21
## Proportion 0.469 0.462 0.069
## --------------------------------------------------------------------------------
## num_vessels_flour
## n missing distinct Info Mean Gmd
## 299 4 4 0.783 0.6722 0.9249
##
## Value 0 1 2 3
## Frequency 176 65 38 20
## Proportion 0.589 0.217 0.127 0.067
## --------------------------------------------------------------------------------
## thal
## n missing distinct
## 301 2 3
##
## Value 3 6 7
## Frequency 166 18 117
## Proportion 0.551 0.060 0.389
## --------------------------------------------------------------------------------
## heart_disease_severity
## n missing distinct Info Mean Gmd
## 303 0 5 0.832 0.9373 1.25
##
## lowest : 0 1 2 3 4, highest: 0 1 2 3 4
##
## Value 0 1 2 3 4
## Frequency 164 55 36 35 13
## Proportion 0.541 0.182 0.119 0.116 0.043
## --------------------------------------------------------------------------------
## exter_angina
## n missing distinct
## 303 0 2
##
## Value 0 1
## Frequency 204 99
## Proportion 0.673 0.327
## --------------------------------------------------------------------------------
## has_heart_disease
## n missing distinct
## 303 0 2
##
## Value no yes
## Frequency 164 139
## Proportion 0.541 0.459
## --------------------------------------------------------------------------------
profiling_num(heart_disease) # Análisis para variables numéricas (cuantitativas)

## variable mean std_dev variation_coef p_01 p_05


## 1 age 54.4389439 9.0386624 0.1660330 35.00 40.0
## 2 resting_blood_pressure 131.6897690 17.5997477 0.1336455 100.00 108.0
## 3 serum_cholestoral 246.6930693 51.7769175 0.2098840 149.00 175.1
## 4 max_heart_rate 149.6072607 22.8750033 0.1529004 95.02 108.1
## 5 exer_angina 0.3267327 0.4697945 1.4378558 0.00 0.0
## 6 oldpeak 1.0396040 1.1610750 1.1168436 0.00 0.0

5
## 7 slope 1.6006601 0.6162261 0.3849825 1.00 1.0
## 8 num_vessels_flour 0.6722408 0.9374383 1.3944978 0.00 0.0
## 9 heart_disease_severity 0.9372937 1.2285357 1.3107265 0.00 0.0
## p_25 p_50 p_75 p_95 p_99 skewness kurtosis iqr range_98
## 1 48.0 56.0 61.0 68.0 71.00 -0.2080241 2.465477 13.0 [35, 71]
## 2 120.0 130.0 140.0 160.0 180.00 0.7025346 3.845881 20.0 [100, 180]
## 3 211.0 241.0 275.0 326.9 406.74 1.1298741 7.398208 64.0 [149, 406.74]
## 4 133.5 153.0 166.0 181.9 191.96 -0.5347844 2.927602 32.5 [95.02, 191.96]
## 5 0.0 0.0 1.0 1.0 1.00 0.7388506 1.545900 1.0 [0, 1]
## 6 0.0 0.8 1.6 3.4 4.20 1.2634255 4.530193 1.6 [0, 4.2]
## 7 1.0 2.0 2.0 3.0 3.00 0.5057957 2.363050 1.0 [1, 3]
## 8 0.0 0.0 1.0 3.0 3.00 1.1833771 3.234941 1.0 [0, 3]
## 9 0.0 0.0 2.0 3.0 4.00 1.0532483 2.843788 2.0 [0, 4]
## range_80
## 1 [42, 66]
## 2 [110, 152]
## 3 [188.8, 308.8]
## 4 [116, 176.6]
## 5 [0, 1]
## 6 [0, 2.8]
## 7 [1, 2]
## 8 [0, 2]
## 9 [0, 3]

Para variables categoricas


freq(heart_disease) # Análisis categórico (cuantitativo y gráfico)

6
male 206 (67.99%)
gender

female 97 (32.01%)

Frequency / (Percentage %)

## gender frequency percentage cumulative_perc


## 1 male 206 67.99 67.99
## 2 female 97 32.01 100.00

7
4 144 (47.52%)

3 86 (28.38%)
chest_pain

2 50 (16.5%)

1 23 (7.59%)

Frequency / (Percentage %)

## chest_pain frequency percentage cumulative_perc


## 1 4 144 47.52 47.52
## 2 3 86 28.38 75.90
## 3 2 50 16.50 92.40
## 4 1 23 7.59 100.00

8
0 258 (85.15%)
fasting_blood_sugar

1 45 (14.85%)

Frequency / (Percentage %)

## fasting_blood_sugar frequency percentage cumulative_perc


## 1 0 258 85.15 85.15
## 2 1 45 14.85 100.00

9
0 151 (49.83%)
resting_electro

2 148 (48.84%)

1 4 (1.32%)

Frequency / (Percentage %)

## resting_electro frequency percentage cumulative_perc


## 1 0 151 49.83 49.83
## 2 2 148 48.84 98.67
## 3 1 4 1.32 100.00

10
NA 2 (0.66%)

3 166 (54.79%)
thal

7 117 (38.61%)

6 18 (5.94%)

Frequency / (Percentage %)

## thal frequency percentage cumulative_perc


## 1 3 166 54.79 54.79
## 2 7 117 38.61 93.40
## 3 6 18 5.94 99.34
## 4 <NA> 2 0.66 100.00

11
0 204 (67.33%)
exter_angina

1 99 (32.67%)

Frequency / (Percentage %)

## exter_angina frequency percentage cumulative_perc


## 1 0 204 67.33 67.33
## 2 1 99 32.67 100.00

12
no 164 (54.13%)
has_heart_disease

yes 139 (45.87%)

Frequency / (Percentage %)

## has_heart_disease frequency percentage cumulative_perc


## 1 no 164 54.13 54.13
## 2 yes 139 45.87 100.00
## [1] "Variables processed: gender, chest_pain, fasting_blood_sugar, resting_electro, thal, exter_angin
freq(heart_disease$chest_pain)

13
4 144 (47.52%)

3 86 (28.38%)
var

2 50 (16.5%)

1 23 (7.59%)

Frequency / (Percentage %)

## var frequency percentage cumulative_perc


## 1 4 144 47.52 47.52
## 2 3 86 28.38 75.90
## 3 2 50 16.50 92.40
## 4 1 23 7.59 100.00
tbl=freq(heart_disease$chest_pain,path_out="graficos")

Medidas de Tendencia Central


En esta clase se mostrará como obtener las diferentes medidas de tendencia central. Las indicaciones se darán
mediante un DataSet llamado medidas del cuerpo, dicho DataSet contiene 6 variables registradas a un grupo
de 36 estudiantes de una Universidad en particular.
Las variables son:
1. Edad del estudiante en años.

2. Peso del estudiante (kilogramos).

3. Altura del estudiante (centímetros).

4. Género del estudiante (Hombre, Mujer).

5. Muneca perímetro de la muñeca derecha (centímetros).

14
6. Biceps perímetro del biceps derecho (centímetros).

A continuación se carga el DataSet:


url <- 'https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo'
datos <- read.table(file=url, header=T)
head(datos) # Para ver el encabezado de la base de datos

## edad peso altura sexo muneca biceps


## 1 43 87.3 188.0 Hombre 12.2 35.8
## 2 65 80.0 174.0 Hombre 12.0 35.0
## 3 45 82.3 176.5 Hombre 11.2 38.5
## 4 37 73.6 180.3 Hombre 11.2 32.2
## 5 55 74.1 167.6 Hombre 11.8 32.9
## 6 33 85.9 188.0 Hombre 12.4 38.5

La media
Para calcular la media de una variable cuantitativa se usa la función mean. Los argumentos básicos de la
función mean son dos y se muestran a continuación.
x=c(1,2,3,4,5) # vector para ilustrar
mean(x, na.rm = FALSE)

## [1] 3
En el parámetro x se indica la variable de interés para la cual se quiere calcular la media, el parámetro
na.rm es un valor lógico que en caso de ser TRUE, significa que se deben remover las observaciones con
NA, el valor por defecto para este parámetro es FALSE.

Ejemplo 1
Suponga que queremos obtener la altura media del grupo de estudiantes. Para encontrar la media general se
usa la función mean sobre el vector númerico datos$altura.
mean(x=datos$altura)

## [1] 171.5556
Del anterior resultado podemos decir que la estatura media o promedio de los estudiantes es 171.5556
centímetros.

Ejemplo 2
Suponga que ahora queremos la altura media pero diferenciando por sexo.

Para hacer esto se debe primero dividir o partir el vector de altura según los niveles de la variable sexo, esto
se consigue por medio de la función split y el resultado será una lista con tantos elementos como niveles
tenga la variable sexo. Luego a cada uno de los elementos de la lista se le aplica la función mean con la
ayuda de sapply o tapply. A continuación el código completo para obtener las alturas medias para hombres
y mujeres.
sapply(split(x=datos$altura, f=datos$sexo), mean)

## Hombre Mujer
## 179.0778 164.0333

15
El resultado es un vector con dos elementos, vemos que la altura media para hombres es 179.0778 centímetros
y que para las mujeres es de 164.0333 centímetros.
¿Qué sucede si se usa tapply en lugar de sapply? Substituya en el código anterior la función sapply por
tapply y observe la diferencia entre los resultados.

Ejemplo 3
Suponga que se tiene el vector edad con las edades de siete personas y supóngase que para el individuo cinco
no se tiene información de su edad, eso significa que el vector tendrá un NA en la quinta posición.
¿Cuál será la edad promedio del grupo de personas?
edad <- c(19, NA, 36, 38, 20, 32, 17)
mean(x=edad)

## [1] NA
Al correr el código anterior se obtiene un error y es debido al símbolo NA en la segunda posición. Para
calcular la media sólo con los datos de los cuales se tiene información, se incluye el argumento na.rm =
TRUE para que R remueva los NA. El código correcto a usar en este caso es:
mean(x=edad, na.rm=TRUE)

## [1] 27
De este último resultado se obtiene que la edad promedio de los individuos es 27 años.

Mediana
Para calcular la mediana de una variable cantitativa se usa la función median. Los argumentos básicos de la
función median son dos y se muestran a continuación.
x=c(1,2,3,4,5)
median(x, na.rm = FALSE)

## [1] 3
En el parámetro x se indica la variable de interés para la cual se quiere calcular la mediana, el parámetro
na.rm es un valor lógico que en caso de ser TRUE, significa que se deben remover las observaciones con
NA, el valor por defecto para este parámetro es FALSE.

Ejemplo 4
Calcular la edad mediana para los estudiantes de la base de datos.Para obtener la mediana usamos el siguiente
código:
median(x=datos$edad)

## [1] 28
y obtenemos que la mitad de los estudiantes tienen edades mayores o iguales a 28 años. El resultado anterior
se pudo haber obtenido con la función quantile e indicando que se desea el cuantil 50 así:
quantile(x=datos$edad, probs=0.5)

## 50%
## 28

16
Moda
La moda de una variable cuantitativa corresponde a valor o valores que más se repiten, una forma sencilla de
encontrar la moda es construir una tabla de frecuencias y observar los valores con mayor frecuencia.

Ejemplo 5
Calcular la moda para la variable edad de la base de datos de estudiantes. Se construye la tabla con la
función table y se crea el objeto tabla para almacenarla.
tabla <- table(datos$edad)
tabla

##
## 19 20 21 22 23 24 25 26 28 29 30 32 33 35 37 40 43 45 51 55 65
## 1 1 1 3 2 1 5 3 2 1 2 1 1 2 3 1 2 1 1 1 1
Al mirar con detalle la tabla anterior se observa que el valor que más se repite es la edad de 25 años en
5 ocasiones. Si la tabla hubiese sido mayor, la inspección visual nos podría tomar unos segundos o hasta
minutos y podríamos equivocarnos, por esa razón es mejor ordenar los resultados de la tabla. Para observar
los valores con mayor frecuencia de la tabla se puede ordenar la tabla usando la función sort de la siguiente
manera:
sort(tabla, decreasing=TRUE)

##
## 25 22 26 37 23 28 30 35 43 19 20 21 24 29 32 33 40 45 51 55 65
## 5 3 3 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
De esta manera se ve fácilmente que la variable edad es unimodal con valor de 25 años.

Medidas de variabilidad
Para ilustrar el uso de las funciones se utilizará la base de datos llamada aptos2015, esta base de datos
cuenta con 11 variables registradas a apartamentos usados en la ciudad de Medellín. Las variables de la base
de datos son:
1. precio: precio de venta del apartamento (millones de pesos).

2. mt2: área del apartamento (m2 ).

3. ubicacion: lugar de ubicación del aparamentos en la ciudad (cualitativa).

4. estrato: nivel socioeconómico donde está el apartamento (2 a 6).

5. alcobas: número de alcobas del apartamento.


6. banos: número de baños del apartamento.

7. balcon: si el apartamento tiene balcón (si o no).

8. parqueadero: si el apartamento tiene parqueadero (si o no).

17
9. administracion: valor mensual del servicio de administración (millones de pesos).

10. avaluo: valor del apartamento en escrituras (millones de pesos).

11. terminado: si el apartamento se encuentra terminado (si o no).\


Para cargar la base de datos en R y para mostrar por pantalla un encabezado (usando head) de la base de
datos.
url <- 'https://raw.githubusercontent.com/fhernanb/datos/master/aptos2015'
datos <- read.table(file=url, header=T)
head(datos) # Para ver el encabezado de la base de datos

## precio mt2 ubicacion estrato alcobas banos balcon parqueadero


## 1 79 43.16 norte 3 3 1 si si
## 2 93 56.92 norte 2 2 1 si si
## 3 100 66.40 norte 3 2 2 no no
## 4 123 61.85 norte 2 3 2 si si
## 5 135 89.80 norte 4 3 2 si no
## 6 140 71.00 norte 3 3 2 no si
## administracion avaluo terminado
## 1 0.050 14.92300 no
## 2 0.069 27.00000 si
## 3 0.000 15.73843 no
## 4 0.130 27.00000 no
## 5 0.000 39.56700 si
## 6 0.120 31.14551 si

Rango
Para calcular el rango de una variable cuantitativa se usa la función range. Los argumentos básicos de la
función range son dos y se muestran abajo.
x=c(1,2,3,4,5)
range(x, na.rm = FALSE)

## [1] 1 5
En el parámetro x se indica la variable de interés para la cual se quiere calcular el rango, el parámetro na.rm
es un valor lógico que en caso de ser TRUE, significa que se deben remover las observaciones con NA, el
valor por defecto para este parámetro es FALSE. La función range entrega el valor mínimo y máximo de la
variable ingresada y el valor de rango se puede obtener restando del valor máximo el valor mínimo.

Ejemplo 6
Suponga que queremos obtener el rango para la variable precio de los apartamentos. Para obtener el rango
usamos el siguiente código.
range(datos$precio)

## [1] 25 1700
max(datos$precio) - min(datos$precio)

## [1] 1675

18
Del resultado anterior podemos ver que los precios de todos los apartamentos van desde 25 hasta 1700 millones
de pesos, es decir, el rango de la variable precio es 1675 millones de pesos.

Ejemplo 7
myrange <- function(x) max(x) - min(x)
precios <- split(datos$precio, f=datos$estrato)
sapply(precios, myrange)

## 2 3 4 5 6
## 103 225 610 1325 1560
De los resultados podemos ver claramente que a medida que aumenta de estrato el rango (variabilidad) del
precio de los apartamentos aumenta. Apartamentos de estrato bajo tienden a tener precios similares mientras
que los precios de venta para apartamentos de estratos altos tienden a ser muy diferentes entre si.

Desviación estándar muestral (S)


Para calcular la desviación muestral de una variable cuantitativa se usa la función sd. Los argumentos básicos
de la función sd son dos y se muestran abajo.
x=c(1,2,3,4,5)
sd(x, na.rm = FALSE)

## [1] 1.581139
En el parámetro x se indica la variable de interés para la cual se quiere calcular la desviación estándar
muestral, el parámetro na.rm es un valor lógico que en caso de ser TRUE, significa que se deben remover
las observaciones con NA, el valor por defecto para este parámetro es FALSE.

Ejemplo 8
Suponga que queremos obtener la desviación estándar muestral para la variable precio de los apartamentos.
Para obtener la desviación solicitada usamos el siguiente código:
sd(x=datos$precio)

## [1] 247.6149

Ejemplo 9
Calcular la desviación estándar poblacional σ para el siguiente conjunto de 5 observaciones: 12, 25, 32, 15, 26.
Recordemos que las expresiones matemáticas para obtener S y σ son muy similares, la diferencia está en el
denominador, para S el denominador es n − 1 mientras que para σ es n. Teniendo esto en cuenta podemos
calcular la desviación poblacional apoyándonos en la función sd, para esto podemos construir una función
llamada Sigma que calcule la desviación poblacional, a continuación el código necesario.
Sigma <- function(x) {
n <- length(x)
sd(x) * (n-1) / n
}

Ahora para obtener la desviación estándar poblacional de los datos usamos el siguiente código.
y <- c(12, 25, 32, 15, 26)
Sigma(y)

19
## [1] 6.621178

Varianza muestral (S 2 )
Para calcular la varianza muestral de una variable cuantitativa se usa la función var. Los argumentos básicos
de la función var son dos y se muestran abajo.
x=c(1,2,3,4,5)
var(x, na.rm = FALSE)

## [1] 2.5
En el parámetro x se indica la variable de interés para la cual se quiere calcular la varianza muestral, el
parámetro na.rm es un valor lógico que en caso de ser TRUE, significa que se deben remover las observaciones
con NA, el valor por defecto para este parámetro es FALSE.

Ejemplo 10
Suponga que queremos determinar cuál región en la ciudad presenta mayor varianza en los precios de los
apartamentos.
Para realizar esto debemos usar en conjunto la función split, sapply y var ya que se quiere la varianza de
una variable (precio) dado los valores de otra variable (ubicacion). El código para obtener las varianzas es el
siguiente.
precios <- split(datos$precio, f=datos$ubicacion)
sapply(precios, var)

## aburra sur belen guayabal centro laureles norte


## 4169.413 2527.876 2588.208 25351.197 1009.333
## occidente poblado
## 3596.244 84496.674
De los resultados anteriores se nota que los apartamentos ubicados en el Poblado tienen la mayor variabilidad
en el precio, este resultado se confirma al dibujar un boxplot para la variable precio dada la ubicación.
with(datos, boxplot(precio ~ ubicacion, ylab='Precio (millones)'))

20
1500
Precio (millones)

1000
500
0

aburra sur centro laureles norte occidente

ubicacion

Coeficiente de variación (CV )


El coeficiente de variación se define como CV = (s/x) ∗ 100% y es muy sencillo de obtenerlo, la función CV
mostrada abajo permite calcularlo.
CV <- function(x, na.rm = FALSE) {
sd(x, na.rm=na.rm) / mean(x, na.rm=na.rm)
}

Tener presente
w <- c(5, -3, NA, 8, 8, 7)
CV(x=w, na.rm=T)

## [1] 0.9273618

Medidas de posición
Cuantiles
Para obtener cualquier cuantil (cuartiles, deciles y percentiles) se usa la función quantile. Los argumentos
básicos de la función quantile son tres y se muestran a continuación.

quantile(x, probs, na.rm = F ALSE)

En el parámetro x se indica la variable de interés para la cual se quieren calcular los cuantiles, el parámetro

21
probs sirve para definir los cuantiles de interés y el parámetro na.rm es un valor lógico que en caso de ser
TRUE, significa que se deben remover las observaciones con NA, el valor por defecto para este parámetro
es FALSE.

Ejemplo 11
Suponga que queremos obtener el percentil 5, la mediana y el decil 8 pa la altura del grupo de estudiantes.
Se solicita el percentil 5, la mediana que es el percentil 50 y el decil 8 que corresponde al percentil 80, por lo
tanto es necesario indicarle a la función quantile que calcule los cuantiles para las ubicaciones 0.05, 0.5 y
0.8, el código para obtener las tres medidas solicitadas es el siguiente.
quantile(x=datos$precio, probs=c(0.05, 0.5, 0.8), na.rm=TRUE)

## 5% 50% 80%
## 90 245 422

Medidas de correlación
Función cor
cor(x, y, use = ”everything”, method = c(”pearson”, ”kendall”, ”spearman”))

Los parámetos de la función son:


1. x e y: vectores cuantitativos.

2. use: parámetro que indica lo que se debe hacer cuando se presenten registros NA en alguno de los
vectores. Las diferentes posibilidades son: everything, all.obs, complete.obs, na.or.complete y
pairwise.complete.obs, el valor por defecto es everything.

3. method: tipo de coeficiente de correlación a calcular, por defecto es pearson, otros valores posibles
son kendall y spearman.

Ejemplo 12
Calcular el coeficiente de correlación de Pearson para las variables área y precio de la base de datos sobre
apartamentos usados.
cor(x=datos$mt2, y=datos$precio)

## [1] 0.8582585
El resultado anterior vemos que existe una correlación de 0.8583 entre las dos variables, eso significa que
apartamentos de mayor área tienden a tener precios de venta más alto.
with(datos, plot(x=mt2, y=precio, pch=20, col='red',
xlab='Área del apartamento', las=1,
ylab='Precio del apartamento (millones COP)'))

22
Precio del apartamento (millones COP)

1500

1000

500

100 200 300 400 500

Área del apartamento

Se nota claramente que la nube de puntos tiene un pendiente positiva y por eso el signo del coeficiente de
correlación.
cor(x=datos$mt2, y=datos$precio, method='pearson')

## [1] 0.8582585
cor(x=datos$mt2, y=datos$precio, method='kendall')

## [1] 0.6911121
cor(x=datos$mt2, y=datos$precio, method='spearman')

## [1] 0.860306

Ejemplo 13
Para la base de datos de apartamentos usados, ¿cuáles de las variables cuantitativas tienen mayor correlación?
Lo primero que debemos hacer es determinar cuáles son las cuantitativas de la base de datos. Para obtener
información de las variables que están almacenadas en el marco de datos llamado datos usamos la función
str que muestra la estructura interna de objeto.
str(datos)

## 'data.frame': 694 obs. of 11 variables:


## $ precio : num 79 93 100 123 135 140 145 160 160 175 ...
## $ mt2 : num 43.2 56.9 66.4 61.9 89.8 ...
## $ ubicacion : Factor w/ 7 levels "aburra sur","belen guayabal",..: 5 5 5 5 5 5 5 5 5 5 ...
## $ estrato : int 3 2 3 2 4 3 3 3 4 4 ...

23
## $ alcobas : int 3 2 2 3 3 3 2 3 4 3 ...
## $ banos : int 1 1 2 2 2 2 2 2 2 2 ...
## $ balcon : Factor w/ 2 levels "no","si": 2 2 1 2 2 1 2 2 2 2 ...
## $ parqueadero : Factor w/ 2 levels "no","si": 2 2 1 2 1 2 2 2 1 2 ...
## $ administracion: num 0.05 0.069 0 0.13 0 0.12 0.14 0.127 0 0.123 ...
## $ avaluo : num 14.9 27 15.7 27 39.6 ...
## $ terminado : Factor w/ 2 levels "no","si": 1 2 1 1 2 2 2 2 2 2 ...
Del anterior resultado vemos que las variables precio, mt2, alcobas, banos, administracion y avaluo son
las variables cuantitativas, las restantes son cualitativas (nominal u ordinal). Las posiciones de las variables
cuantitativas en el objeto datos son 1, 2, 5, 6, 9, 10, así podemos construir un marco de datos sólo con la
información cuantitativa, a continuación el código usado.
datos.cuanti <- datos[, c(1, 2, 5, 6, 9, 10)]
# La siguiente instrucción para editar los nombres de la variables
colnames(datos.cuanti) <- c('Precio', 'Área', 'Alcobas',
'Baños', 'Admon', 'Avaluo')
M <- round(cor(datos.cuanti), digits=2)
M

## Precio Área Alcobas Baños Admon Avaluo


## Precio 1.00 0.86 0.19 0.63 0.75 0.79
## Área 0.86 1.00 0.31 0.67 0.77 0.75
## Alcobas 0.19 0.31 1.00 0.35 0.16 0.15
## Baños 0.63 0.67 0.35 1.00 0.55 0.53
## Admon 0.75 0.77 0.16 0.55 1.00 0.70
## Avaluo 0.79 0.75 0.15 0.53 0.70 1.00
El anterior resultado representa la matriz de correlaciones entre las variables cuantitativas, se observa que la
mayor correlación es entre las variables precio y área del apartamento.
Es posible representar gráficamente la matriz de correlaciones M por medio de la función corrplot del
paquete corrplot (Wei and Simko 2017), a continuación el código para obtener su representación gráfica.
library('corrplot') # Para cargar el paquete corrplot

## corrplot 0.84 loaded


corrplot.mixed(M)

24
1

Precio 0.8

0.6
0.86 Área
0.4

0.2
0.19 0.31 Alcobas

0.63 0.67 0.35 Baños −0.2

−0.4
0.75 0.77 0.16 0.55 Admon
−0.6

−0.8
0.79 0.75 0.15 0.53 0.7 Avaluo

−1

En la diagonal de la Figura están las variables, por encima están unos círculos de colores, entre más intensidad
del color, ya sea azul o rojo, mayor es la correlación, colores ténues significan correlación baja; el tamaño de
los círculos está asociado al valor absoluto de correlación. Por debajo de la diagonal se observan los valores
exactos de correlación en colores.

Ejemplo 14
Construya dos vectores hipotéticos con el gasto y ahorro de un grupo de 10 familias, incluya dos N A. Calcule
el coeficiente de correlación entre ahorro y gasto, use el parámetro use para manejar los N A.
A continuación se presenta el código para crear los objetos ahorro y gasto con datos ficticios. Observe que en
el primer caso donde se calcula la correlación no es posible obtener un resultado debido a que por defecto
use=‘everything’ y por lo tanto usa todas las observaciones incluyendo los NA. En el segundo caso si se
obtiene un valor para la correlación debido a que se usó use=‘complete.obs’.
gasto <- c(170, 230, 120, 156, 256, NA, 352, 450, 670, 234)
ahorro <- c(45, 30, NA, 35, 15, 65, 15, 30, 48, 67)

cor(gasto, ahorro)

## [1] NA
# correcto
cor(gasto, ahorro, use='complete.obs')

## [1] 0.03612179

25
EJERCICIOS
Use funciones o procedimientos (varias líneas) de R para responder cada una de las siguientes preguntas.
1. Para cada uno de los estratos socioeconómicos, calcular el coeficiente de correlación lineal de Pearson
para las variables precio y área de la base de datos de los apartamentos usados.

2. Calcular los coeficientes de correlación Pearson, Kendall y Spearman para las variables cuantitativas
de la base de datos sobre medidas del cuerpo. La url con la información es la siguiente: https:
//raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo/
3. Represente gráficamente las matrices de correlación obtenidas en el ejercicio anterior.
4. Datos juventud de Medellín, hacer todo lo visto con esos datos.

Referencias
1. Wei, Taiyun, and Viliam Simko. 2017. Corrplot: Visualization of a Correlation Matrix. https:
//CRAN.R-project.org/package=corrplot.
2. Xie, Yihui. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman;
Hall/CRC. http://yihui.name/knitr/.
3. Xie, Yihui. 2018. Bookdown: Authoring Books and Technical Documents with R Markdown. https:
//CRAN.R-project.org/package=bookdown.

26

You might also like