forked from fhernanb/Manual-de-R
-
Notifications
You must be signed in to change notification settings - Fork 0
/
12_Med_Var.Rmd
228 lines (155 loc) · 9.9 KB
/
12_Med_Var.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# Medidas de variabilidad {#varia}
En este capítulo se mostrará cómo obtener las diferentes medidas de variabilidad con R.
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 ($m^2$),
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),
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).
A continuación se presenta el código para definir la url donde están los datos, para cargar la base de datos en R y para mostrar por pantalla un encabezado (usando `head`) de la base de datos.
```{r}
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
```
## Rango \index{rango} \index{range}
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.
```{r, eval=F}
range(x, na.rm = FALSE)
```
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 que se ingresó, para obtener el valor de rango se debe restar del valor máximo el valor mínimo.
### Ejemplo {-}
Suponga que queremos obtener el rango para la variable precio de los apartamentos.
__Solución__
Para obtener el rango usamos el siguiente código.
```{r}
range(datos$precio)
```
Otra forma de escribir el código anterior de forma secuencial es utilizando el operador pipe `%>%`. Este operador se puede leer como "entonces" y permite escribir código que cuenta una historia.
```{r message=FALSE}
library(dplyr) # Para cargar el paquete dplyr
datos %>% select(precio) %>% range()
```
```{block2, type='rmdnote'}
El código de arriba se puede leer así: Tome los datos, entonces seleccione el precio, entonces calcule el rango.
```
De la salida anterior podemos ver que los precios de los apartamentos van desde `r min(datos$precio)` hasta `r max(datos$precio)` millones de pesos, es decir, el rango de la variable precio es sería igual `r max(datos$precio)`-`r min(datos$precio)`=`r max(datos$precio)-min(datos$precio)` millones de pesos.
### Ejemplo {-}
Suponga que queremos obtener nuevamente el rango para la variable precio de los apartamentos pero diferenciando por el estrato.
__Solución__
Para calcular el rango (max-min) para el precio pero diferenciando por el estrato podemos usar el siguiente código.
```{r}
datos %>%
group_by(estrato) %>%
summarise(el_rango=max(precio)-min(precio))
```
```{block2, type='rmdnote'}
El código anterior se puede leer así: Tome los datos, entonces agrúpelos por estrato, entonces haga un resumen llamado el_rango que se obtiene como el resultado de restar el mínimo de precio al máximo de precio.
```
De los resultados podemos ver claramente que a medida que aumenta de estrato el rango 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.
## Varianza
La varianza es otra medida de qué tanto se alejan las observaciones $x_i$ en relación al promedio y se mide en unidades cuadradas. Existen dos formas de calcular la varianza dependiendo de si estamos trabajando con una muestra o con la población.
La varianza __muestral__ ($S^2$) se define así:
$$
S^2=\frac{\sum_{i=1}^{i=n}(x_i-\bar{x})^2}{n-1},
$$
donde $\bar{x}$ representa el promedio muestral.
La varianza __poblacional__ ($\sigma^2$) se define así:
$$
\sigma^2=\frac{\sum_{i=1}^{i=n}(x_i-\mu)^2}{n},
$$
donde $\mu$ representa el promedio poblacional.
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.
```{r, eval=F}
var(x, na.rm = FALSE)
```
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 {-}
Suponga que queremos determinar cuál ubicación en la ciudad presenta mayor varianza en los precios de los apartamentos y cuántos apartamentos hay en cada ubicación.
__Solución__
Como nos interesa calcular la varianza y hacer un conteo por cada ubicación, vamos a agrupar los datos por ubicación. Para realizar lo solicitado podemos utilizar el siguiente código.
```{r}
datos %>%
group_by(ubicacion) %>%
summarize(n=n(),
varianza=var(precio))
```
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, en la Figura \@ref(fig:box1) se muestra el boxplot y se ve claramente la dispersión de los precios en el Poblado. El código usado para generar la Figura \@ref(fig:box1) se presenta a continuación.
```{r box1, fig.cap='Boxplot para el precio de los apartamentos dada la ubicación.', fig.asp=0.5, fig.width =10}
with(datos, boxplot(precio ~ ubicacion, ylab='Precio (millones)'))
```
### Ejemplo {-}
¿Puedo aplicar la función `var` y la función `sd` a marcos de datos?
__Solución__
La respuesta es __NO__. La función `sd` se aplica sólo a vectores mientras que la función `var` de puede aplicar tanto a vectores como a marcos de datos. Al ser aplicada a marcos de datos numéricos se obtiene una matriz en que la diagonal representa las varianzas de las de cada una de las variables mientras que arriba y abajo de la diagonal se encuentran las covarianzas entre pares de variables.
Por ejemplo, si aplicamos la función `var` al marco de datos sólo con las variables precio, área y avaluo se obtiene una matriz de dimensión $3 \times 3$, a continuación el código usado.
```{r}
datos %>%
select(precio, mt2, avaluo) %>%
var()
```
De la salida anterior se observa que el resultado es una matriz de varianzas y covarianzas de dimensión $3 \times 3$.
## Desviación estándar
La desviación estándar es una medida de qué tanto se alejan las observaciones $x_i$ en relación al promedio y se mide en las mismas unidades de la variable de interés. Existen dos formas de calcular la desviación estándar dependiendo de si estamos trabajando con una muestra o con la población.
La desviación estándar __muestral__ ($S$) para $n$ observaciones se define así:
$$
S=\sqrt{\frac{\sum_{i=1}^{i=n}(x_i-\bar{x})^2}{n-1}},
$$
donde $\bar{x}$ representa el promedio muestral.
La desviación estándar __poblacional__ ($\sigma$) para $n$ observaciones se define así:
$$
\sigma=\sqrt{\frac{\sum_{i=1}^{i=n}(x_i-\mu)^2}{n}},
$$
donde $\mu$ representa el promedio de la población.
Para calcular en R la desviación muestral ($S$) de una variable cuantitativa se usa la función `sd`, los argumentos básicos de la función `sd` son dos y se muestran a continuación.
```{r, eval=F}
sd(x, na.rm = FALSE)
```
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 {-}
Calcular la desviación estándar muestral ($S$) para la variable precio de los apartamentos.
__Solución__
Para obtener la desviación estándar muestral ($S$) solicitada usamos el siguiente código:
```{r}
sd(x=datos$precio)
```
### Ejemplo {-}
Calcular la desviación estándar __poblacional__ ($\sigma$) para el siguiente conjunto de 5 observaciones: 12, 25, 32, 15, 26.
__Solución__
Recordemos que las expresiones matemáticas para obtener $S$ y $\sigma$ son muy similares, la diferencia está en el denominador, para $S$ el denominador es $n-1$ mientras que para $\sigma$ es $n$. Teniendo esto en cuenta podemos construir nuestra propia función llamada `Sigma` que calcule la desviación poblacional. A continuación el código para crear nuestra propia función.
```{r}
Sigma <- function(x) {
n <- length(x)
desvi <- sqrt(sum((x-mean(x))^2) / n)
return(desvi)
}
```
Ahora para obtener la desviación estándar __poblacional__ de los datos usamos el siguiente código.
```{r}
y <- c(12, 25, 32, 15, 26)
Sigma(y)
```
## Coeficiente de variación ($CV$) \index{coeficiente de variación}
El coeficiente de variación se define como $CV=s/\bar{x}$ y es muy sencillo de obtenerlo, la función `coef_var` mostrada abajo permite calcularlo.
```{r}
coef_var <- function(x, na.rm = FALSE) {
sd(x, na.rm=na.rm) / mean(x, na.rm=na.rm)
}
```
### Ejemplo {-}
Calcular el $CV$ para el vector `w` definido a continuación.
```{r}
w <- c(5, -3, NA, 8, 8, 7)
```
__Solución__
Vemos que el vector `w` tiene 6 observaciones y la tercera de ellas es un `NA`. Lo correcto aquí es usar la función `coef_var` definida antes pero indicándole que remueva los valores faltantes, para eso se usa el siguiente código.
```{r}
coef_var(x=w, na.rm=T)
```