Al tener una base de datos se requiere resumirlos en una tabla o en indicadores que faciliten su análisis, dependiendo el tipo de variable ( cualitativas o cuantitativas) la tabla puede tener diferentes columnas.
En el caso de los indicadores las variables cualitativas se les resumen en el nivel con mayor frecuencias a la que se le llama MODA
Las variables cuantitativas tiene un gran número de indicadores que se dividien en tres categorias:
A continuación se indica como realizar el proceso utilizando RStudio, bajo el supuesto que se cuenta con una base de datos que se ha importado en RStudio.
Uno de los paquetes de R utilizados para la construcción de tablas de frecuencia e indicadores descriptivos es summarytools, a continuación se comparte código para su instalación :
install.packages("remotes") # se puede tambien utulizar el paquete devtools library(remotes) install_github("rapporter/pander") # repositorio recomendado install_github("dcomtois/summarytools", build_vignettes = TRUE)
# install.packages("remotes") # se puede tambien utulizar el paquete devtools
# library(remotes)
# install_github("rapporter/pander") # repositorio recomendado
# install_github("dcomtois/summarytools", build_vignettes = TRUE)
Resumir los datos en tablas facilita su análisis y también su representación gráfica. Varios gráficos están basados en tablas de frecuencia como veremos en la unidad 1.3
Iniciaremos con la construcción de tablas para variables cualitativas en escala nominal. Recordemos que las variables medidas en esta escala no presentan orden especial y en algunos casos son ordenadas de mayor a menor frecuencia
Utilizaremos en este caso la función table()
# Colombia=readRDS(file = "data/Colombia23.RDS")
table(Colombia23$ubicacion)
casa Casa Fallecido Hospital Hospital UCI N/A
12 9150 69 331 33 41
data(iris)
table(iris$Species)
setosa versicolor virginica
50 50 50
library(readr)
ventas <- read_csv("data/ventas.csv")
table(ventas$Metodo_Pago)
American Express Discover MasterCard Star Card
4 8 28 140
Visa
20
En todos los casos podemos elaborar una tabla acompañada con los porcentajes (frecuencia relativa)
install.packages("flextable")
library(flextable)
ft1=table(ventas$Metodo_Pago)%>%
as.data.frame()
colnames(ft1)=c("Tipo de tarjeta", "Frecuencia Absoluta")
ft1=flextable(ft1)
set_flextable_defaults(
font.size = 10, font.family = "Helvetica",
font.color = "#333333",
table.layout = "fixed",
border.color = "gray",
padding.top = 3, padding.bottom = 3,
padding.left = 4, padding.right = 4)
ft1 <- ft1 %>%
width(j = 1, width = 2) %>%
width(j = 2, width = 1)
ft1
Tipo de tarjeta | Frecuencia Absoluta |
---|---|
American Express | 4 |
Discover | 8 |
MasterCard | 28 |
Star Card | 140 |
Visa | 20 |
El resultado corresponde a un conteo de cada uno de los valores de la
variable. En caso de que se requiera calcular la proporción que
corresponde cada caso utilizamos la función : prop.table()
y se la aplicamos a la tabla anterior
ft2=table(ventas$Metodo_Pago)%>%
prop.table() %>%
as.data.frame()
colnames(ft2)=c("Tipo de tarjeta", "Frecuencia relativa")
ft2=flextable(ft2)
set_flextable_defaults(
font.size = 10, font.family = "Helvetica",
font.color = "#333333",
table.layout = "fixed",
border.color = "gray",
padding.top = 3, padding.bottom = 3,
padding.left = 4, padding.right = 4)
ft2 <- ft2 %>%
width(j = 1, width = 2) %>%
width(j = 2, width = 1)
ft2
Tipo de tarjeta | Frecuencia relativa |
---|---|
American Express | 0.02 |
Discover | 0.04 |
MasterCard | 0.14 |
Star Card | 0.70 |
Visa | 0.10 |
Si utilizamos la función freq
del paquete
summarytools
, la salida es una tabla más elaborada
summarytools::freq(ventas$Metodo_Pago, cumul = F)
Error in match.call(f, call): ... used in a situation where it does not exist
Frequencies
Freq % Valid % Total
---------------------- ------ --------- ---------
American Express 4 2.00 2.00
Discover 8 4.00 4.00
MasterCard 28 14.00 14.00
Star Card 140 70.00 70.00
Visa 20 10.00 10.00
<NA> 0 0.00
Total 200 100.00 100.00
Para el caso de las variables cuantitativas que presentan muchos valores difentes construir una tabla como las anteriores no tiene sentido, pues salen muchas categorias probablemente con frecuencia uno.
En este caso es necesario construir rangos que den sentido y que permitan resumir la información para una facil interpretación.
El ejemplo a continuación da cuenta de ello.
Supongamos que queremos analizar la variable edad y para ello debemos establecer los limites y cuantos intervalo vamos aconstruir. En este caso tenemos tres alternativas posible_
En el caso de la variable Edad podríamos proceder así:
Consultados los ciclos de la vida tenemos: + Primera Infancia (0-5 años) + Infancia (6 - 11 años) + Adolescencia (12 - 17 años) + Juventud (18 - 26 años) + Adultez (27- 59 años) + Persona Mayor (60 años o mas) envejecimiento y vejez
Colombia23$edadR[Colombia23$edad<=5]="1. (0 a 5 años]"
Colombia23$edadR[Colombia23$edad>5 & Colombia23$edad<=11]="2. (5 a 11 años]"
Colombia23$edadR[Colombia23$edad>11 & Colombia23$edad<=17]="3. (11 a 17 años]"
Colombia23$edadR[Colombia23$edad>17 & Colombia23$edad<=26]="4. (17 a 26 años]"
Colombia23$edadR[Colombia23$edad>26 & Colombia23$edad<=59]="5. (26 a 59 años]"
Colombia23$edadR[Colombia23$edad>59]="6. (Más de 59 años]"
summarytools::freq(Colombia23$edadR)
Error in match.call(f, call): ... used in a situation where it does not exist
Frequencies
Freq % Valid % Valid Cum. % Total % Total Cum.
------------------------- ------ --------- -------------- --------- --------------
1. (0 a 5 años] 310 3.22 3.22 3.22 3.22
3. (11 a 17 años] 114 1.18 4.40 1.18 4.40
4. (17 a 26 años] 993 10.31 14.71 10.31 14.71
5. (26 a 59 años] 4094 42.49 57.19 42.49 57.19
6. (Más de 59 años] 4125 42.81 100.00 42.81 100.00
<NA> 0 0.00 100.00
Total 9636 100.00 100.00 100.00 100.00
Esta tabla nos permite identificar los rangos de mayor frecuencia
Tambien podemo realizar una tabla sin tener que realizar la recodificación. Esto se logra con la función hist()
Colombia23$edad <- as.numeric(Colombia23$edad)
h=hist(Colombia23$edad)
h$breaks # puntos de corte
[1] 0 10 20 30 40 50 60 70 80 90 100 110 120
h$counts # frecuencias absolutas en cada intervalo
[1] 953 344 1157 1165 1061 1214 1417 1283 842 195 4 1
h$density # densidad en cada intervalo
[1] 9.889996e-03 3.569946e-03 1.200706e-02 1.209008e-02 1.101079e-02
[6] 1.259859e-02 1.470527e-02 1.331465e-02 8.738066e-03 2.023661e-03
[11] 4.151100e-05 1.037775e-05
Seria de interés tambien construir una tabla con las edades de las personas fallecidas por covid en Colombia, para lo cual debemos primero seleccionar la base de datos de las fallecidas y luego en ello construir la tabla
En este caso vamos a seleccionar los rangos de edad y luego construimos la tabla
Fallecidos=subset(Colombia23, estado=="fallecido")
breaks=seq(0,110, by=20)
Edad.fallecidos=cut(Fallecidos$edad, breaks)
summarytools::freq(Edad.fallecidos)
Error in match.call(f, call): ... used in a situation where it does not exist
Frequencies
Freq % Valid % Valid Cum. % Total % Total Cum.
-------------- ------ --------- -------------- --------- --------------
(0,20] 0
(20,40] 0
(40,60] 0
(60,80] 0
(80,100] 0
<NA> 0
Total 0 0.00 100.00 100.00 100.00
O tambien
h=hist(Colombia23$edad, breaks = c(0,4.9, 11.9,17.9,26.9, 59.9,115))
# Con los valores contenidos en el objeto h construimos la tabla
LI=h$breaks[1:6]
LS=h$breaks[2:7]
FreAbs=h$counts
FreRel=round(h$counts/sum(h$counts),4)
FreAbAc=cumsum(FreAbs)
FreRAc=cumsum(FreRel)
data.frame(LI,LS,FreAbs,FreRel, FreAbAc, FreRAc)
LI LS FreAbs FreRel FreAbAc FreRAc
1 0.0 4.9 568 0.0589 568 0.0589
2 4.9 11.9 418 0.0434 986 0.1023
3 11.9 17.9 113 0.0117 1099 0.1140
4 17.9 26.9 867 0.0900 1966 0.2040
5 26.9 59.9 3797 0.3940 5763 0.5980
6 59.9 115.0 3873 0.4019 9636 0.9999
table(Colombia23$ubicacion, Colombia23$estado)
Fallecido Grave leve Leve Moderado N/A
casa 0 0 12 0 0 0
Casa 0 0 0 9150 0 0
Fallecido 69 0 0 0 0 0
Hospital 0 0 0 0 331 0
Hospital UCI 0 33 0 0 0 0
N/A 0 0 0 0 0 41
tabla1=table(Colombia23$ubicacion, Colombia23$estado) %>%
prop.table()*100
tabla1
Fallecido Grave leve Leve Moderado
casa 0.0000000 0.0000000 0.1245330 0.0000000 0.0000000
Casa 0.0000000 0.0000000 0.0000000 94.9564134 0.0000000
Fallecido 0.7160648 0.0000000 0.0000000 0.0000000 0.0000000
Hospital 0.0000000 0.0000000 0.0000000 0.0000000 3.4350353
Hospital UCI 0.0000000 0.3424658 0.0000000 0.0000000 0.0000000
N/A 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
N/A
casa 0.0000000
Casa 0.0000000
Fallecido 0.0000000
Hospital 0.0000000
Hospital UCI 0.0000000
N/A 0.4254878
Un indicador es un numero que resumen o representa un grupo de valores. El poder resumir una gran cantidad de valores en unos pocos, facilita el realizar un análisis de ellos
En el caso de las variables cualitativas en escala nominal, se pueden representar por el valor mas frecuente. A este valor se le conoce como Moda y lo podemos ver claramente en una tabla de frecuencias
En el caso de las variables cuantitativas tenemos varias alternativas para construirlos
Utilizando la función summary
:
summary(Colombia23$edad)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 30.00 52.00 49.44 70.00 112.00
Utilizando la función describe del pquete psych :
psych::describe(Colombia23$edad)
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 9636 49.44 24.99 52 50.4 29.65 1 112 111 -0.24 -0.91 0.25
Utilizando la función describe.by
del paquete
psych
, que nos permite el calculo de las descritivas para
varios grupos :
psych::describe.by(Colombia23$edad, group = Colombia23$ubicacion)
Descriptive statistics by group
group: casa
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 12 54.08 16.08 47.5 54.2 18.53 29 78 49 0.19 -1.42 4.64
------------------------------------------------------------
group: Casa
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 9150 49.02 24.59 51 49.91 28.17 1 103 102 -0.22 -0.88 0.26
------------------------------------------------------------
group: Fallecido
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 69 76.9 14.51 81 78.51 8.9 31 99 68 -1.25 1.52 1.75
------------------------------------------------------------
group: Hospital
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 331 52.1 32.43 65 53.47 31.13 1 112 111 -0.42 -1.37 1.78
------------------------------------------------------------
group: Hospital UCI
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 33 55.33 30.24 70 57.67 17.79 2 91 89 -0.7 -1.23 5.26
------------------------------------------------------------
group: N/A
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 41 69.98 18.39 74 72.03 16.31 18 96 78 -0.92 0.06 2.87
Utilizando la función descr
del paquete
summaytools
:
summarytools::descr(Colombia23$edad)
Error in match.call(f, call): ... used in a situation where it does not exist
Descriptive Statistics
Colombia23$edad
----------------- -----------------
Mean 49.44
Std.Dev 24.99
Min 1.00
Q1 30.00
Median 52.00
Q3 70.00
Max 112.00
MAD 29.65
IQR 40.00
CV 0.51
Skewness -0.24
SE.Skewness 0.02
Kurtosis -0.91
N.Valid 9636.00
N 9636.00
Pct.Valid 100.00
YA ESTAMOS LISTOS PARA INTERPRETAR LA INFORMACIÓN !!
A través de RStudio se pueden construir documentos en formatos PDF, DOC, HTML entre otros. En esta ocasión se describe como realizar un informe utilizando para ello un archivo Rmd en RStudio.
Inicialmente en RStudio abrimos un nuevo archivo en formato Rmd
File/New File/ R Markdown…
Al hacerlo se despliega la siguiente ventana
En este caso seleccionamos PDF para abrir una plantilla que nos ofrece el programa para orientar nuestros primeros pasos
---
title: "Untitled"
author: "dgonzalez"
date: "3/2/2022"
output: pdf_document
---
El primer bloque contiene información sobre el titulo del documento, el autor, la fecha y el formato de salida
Podemos tambien abregar un subtitulo: subtitle: “Subtitulo”
Despues de este bloque encontramos el cuerpo del documento que puede contener texto escrito de manera normal, código html, código Markdown y LaTeX
Algunas de las principales instrucciones para empezar son
# Título 1
## Título 2
### Título 3
#### Título 4
##### Título 5
##### Títuñlo 6
+ Punto 1
+ Punto 2
+ Punto 3
+ Punto 3.1
+ Punto 3.2
Tambien se pueden hacer numerada
1. Punto 1
2. Punto 2
3. Punto 3
Permite tambien escribir ecuaciones en codigo LaTeX, como por ejemplo
$$\dfrac{1}{n}\sum_{i=1}^{n} x_{i} = \bar{x}$$
\[\dfrac{1}{n}\sum_{i=1}^{n} x_{i} = \bar{x}\]
Una de sus principales ventajas es el de permitir correr código R y de otros lenguajes como Phyton, SQL, entre otros
Para ello utilizamos el botón +c ubicado en la barra superior de la ventana Source
Dentro de este bloque podemos correr codigo R y asi ubicar dentro del documento tablas, indicadores o gráficos
En la siguiente página pueden encotrar resumen de varios paquetes de R dentro de los cuales está RMardown
https://www.rstudio.com/resources/cheatsheets/
df <- data.frame(
id = 1:10,
nombre = c("Juan", "Carlos", "James", "David", "Jenny", "Harold", "Leonardo", "John", "Ana", "Luz"),
edad = c(20, 25, 22, 28, 21, 23, 25, 20, 21, 20),
grado = c("C", "A", "A", "C", "B", "B", "A", "C", "C", "C"),
Examen1 = c(3.8, 4.1, 4.0, 3.9, 4.0, 4.3, 3.6, 3.7, 3.8, 3.8),
Examen2 = c(3.9, 3.9, 4.0, 3.9, 3.8, 3.6, 4.0, 4.0, 3.9, 3.8),
Promedio = c(3.9, 4.0, 4.1, 3.6, 3.7, 4.6, 3.5, 3.6, 3.8, 3.7),
Entrevista = c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE),
stringsAsFactors = FALSE
)
df
id nombre edad grado Examen1 Examen2 Promedio Entrevista
1 1 Juan 20 C 3.8 3.9 3.9 TRUE
2 2 Carlos 25 A 4.1 3.9 4.0 FALSE
3 3 James 22 A 4.0 4.0 4.1 TRUE
4 4 David 28 C 3.9 3.9 3.6 FALSE
5 5 Jenny 21 B 4.0 3.8 3.7 TRUE
6 6 Harold 23 B 4.3 3.6 4.6 TRUE
7 7 Leonardo 25 A 3.6 4.0 3.5 TRUE
8 8 John 20 C 3.7 4.0 3.6 FALSE
9 9 Ana 21 C 3.8 3.9 3.8 FALSE
10 10 Luz 20 C 3.8 3.8 3.7 FALSE
# colnames(df1)=c("Id", "Nombre", "Edad","grado", "Nota1", "Nota2", "Nota_Final", "Entrevista")
df1=flextable(df)
df1
id | nombre | edad | grado | Examen1 | Examen2 | Promedio | Entrevista |
---|---|---|---|---|---|---|---|
1 | Juan | 20 | C | 3.8 | 3.9 | 3.9 | TRUE |
2 | Carlos | 25 | A | 4.1 | 3.9 | 4.0 | FALSE |
3 | James | 22 | A | 4.0 | 4.0 | 4.1 | TRUE |
4 | David | 28 | C | 3.9 | 3.9 | 3.6 | FALSE |
5 | Jenny | 21 | B | 4.0 | 3.8 | 3.7 | TRUE |
6 | Harold | 23 | B | 4.3 | 3.6 | 4.6 | TRUE |
7 | Leonardo | 25 | A | 3.6 | 4.0 | 3.5 | TRUE |
8 | John | 20 | C | 3.7 | 4.0 | 3.6 | FALSE |
9 | Ana | 21 | C | 3.8 | 3.9 | 3.8 | FALSE |
10 | Luz | 20 | C | 3.8 | 3.8 | 3.7 | FALSE |
library(formattable)
formattable(df, list(
edad = color_tile("transparent", "lightpink"),
Examen1 = color_bar("lightgreen"),
Examen2 = color_bar("lightblue"),
Promedio = color_bar("lightgreen"))
)
id | nombre | edad | grado | Examen1 | Examen2 | Promedio | Entrevista |
---|---|---|---|---|---|---|---|
1 | Juan | 20 | C | 3.8 | 3.9 | 3.9 | TRUE |
2 | Carlos | 25 | A | 4.1 | 3.9 | 4.0 | FALSE |
3 | James | 22 | A | 4.0 | 4.0 | 4.1 | TRUE |
4 | David | 28 | C | 3.9 | 3.9 | 3.6 | FALSE |
5 | Jenny | 21 | B | 4.0 | 3.8 | 3.7 | TRUE |
6 | Harold | 23 | B | 4.3 | 3.6 | 4.6 | TRUE |
7 | Leonardo | 25 | A | 3.6 | 4.0 | 3.5 | TRUE |
8 | John | 20 | C | 3.7 | 4.0 | 3.6 | FALSE |
9 | Ana | 21 | C | 3.8 | 3.9 | 3.8 | FALSE |
10 | Luz | 20 | C | 3.8 | 3.8 | 3.7 | FALSE |