RESUMEN Y GRÁFICAS

1. OBJETIVO

El objetivo de este capítulo es que el alumno aprenda métodos para resumir los datos en tablas de resumen y pueda proyectarlos en gráficos que le permitan entender y analizar la tendencia de sus datos de una forma rápida y sencilla.

2. PUNTOS CLAVE

3. TEMARIO

4. RESUMEN DE DATOS

Para este capítulo trabajaremos con la base de datos sobre COVID que está en la página “https://ourworldindata.org/” y que es actualizada constantemente. Para descargar esta página es necesario cargar la librería “utils”, para lo cual es necesario escribir el siguiente código

library(utils)

Una vez cargada esta libería, podemos usar la función “read.csv” para importar la base de datos (esto va a tomar un par de minutos, espere…)

db <- read.csv("https://covid.ourworldindata.org/data/owid-covid-data.csv", na.strings = "", fileEncoding = "UTF-8-BOM")

Ahora que ya está importada podemos usar algunas funciones para explorar rapidamente nuestros datos, como por ejemplo las siguientes funciones:

summary(): que nos muestra un resumen de los principales descriptores estadísticos.

summary(db)
##     iso_code             continent            location             date      
##  AFG    :  260   Africa       :10147   Afghanistan:  260   2020-05-31:  212  
##  ARE    :  260   Asia         :10569   Algeria    :  260   2020-06-30:  212  
##  ARM    :  260   Europe       :11610   Armenia    :  260   2020-07-31:  212  
##  AUS    :  260   North America: 6821   Australia  :  260   2020-08-31:  212  
##  AUT    :  260   Oceania      : 1639   Austria    :  260   2020-09-01:  212  
##  (Other):42356   South America: 2610   Azerbaijan :  260   2020-09-02:  212  
##  NA's   :  260   NA's         :  520   (Other)    :42356   (Other)   :42644  
##   total_cases         new_cases      new_cases_smoothed   total_deaths     
##  Min.   :       0   Min.   : -8261   Min.   :  -552.00   Min.   :     0.0  
##  1st Qu.:      48   1st Qu.:     0   1st Qu.:     0.43   1st Qu.:     0.0  
##  Median :     895   Median :     9   Median :    13.71   Median :    16.0  
##  Mean   :   89994   Mean   :  1359   Mean   :  1345.06   Mean   :  3786.5  
##  3rd Qu.:    9501   3rd Qu.:   152   3rd Qu.:   156.57   3rd Qu.:   203.8  
##  Max.   :29309546   Max.   :310158   Max.   :276103.29   Max.   :928890.0  
##  NA's   :578        NA's   :774      NA's   :1556        NA's   :578       
##    new_deaths       new_deaths_smoothed total_cases_per_million
##  Min.   :-1918.00   Min.   :-232.143    Min.   :    0.00       
##  1st Qu.:    0.00   1st Qu.:   0.000    1st Qu.:   23.03       
##  Median :    0.00   Median :   0.143    Median :  261.39       
##  Mean   :   43.06   Mean   :  43.186    Mean   : 1718.37       
##  3rd Qu.:    3.00   3rd Qu.:   2.857    3rd Qu.: 1712.61       
##  Max.   :10491.00   Max.   :7456.571    Max.   :42336.85       
##  NA's   :774        NA's   :1556        NA's   :838            
##  new_cases_per_million new_cases_smoothed_per_million total_deaths_per_million
##  Min.   :-2212.545     Min.   :-269.978               Min.   :   0.000        
##  1st Qu.:    0.000     1st Qu.:   0.118               1st Qu.:   0.000        
##  Median :    1.429     Median :   2.773               Median :   4.444        
##  Mean   :   23.015     Mean   :  22.689               Mean   :  54.128        
##  3rd Qu.:   15.984     3rd Qu.:  17.579               3rd Qu.:  33.065        
##  Max.   : 4944.376     Max.   : 882.924               Max.   :1237.551        
##  NA's   :838           NA's   :1621                   NA's   :838             
##  new_deaths_per_million new_deaths_smoothed_per_million   new_tests      
##  Min.   :-67.9010       Min.   :-9.6780                 Min.   :  -3743  
##  1st Qu.:  0.0000       1st Qu.: 0.0000                 1st Qu.:    951  
##  Median :  0.0000       Median : 0.0180                 Median :   3169  
##  Mean   :  0.5593       Mean   : 0.5595                 Mean   :  21854  
##  3rd Qu.:  0.1960       3rd Qu.: 0.2690                 3rd Qu.:  11729  
##  Max.   :215.3820       Max.   :63.1400                 Max.   :1235835  
##  NA's   :838            NA's   :1621                    NA's   :28912    
##   total_tests       total_tests_per_thousand new_tests_per_thousand
##  Min.   :       1   Min.   :  0.000          Min.   :-0.398        
##  1st Qu.:   43108   1st Qu.:  2.512          1st Qu.: 0.059        
##  Median :  178189   Median : 13.390          Median : 0.275        
##  Mean   : 1345140   Mean   : 46.907          Mean   : 0.661        
##  3rd Qu.:  686260   3rd Qu.: 54.833          3rd Qu.: 0.802        
##  Max.   :96786798   Max.   :821.748          Max.   :16.574        
##  NA's   :28531      NA's   :28531            NA's   :28912         
##  new_tests_smoothed new_tests_smoothed_per_thousand tests_per_case    
##  Min.   :      0    Min.   : 0.000                  Min.   :    1.53  
##  1st Qu.:   1052    1st Qu.: 0.062                  1st Qu.:   11.92  
##  Median :   3566    Median : 0.298                  Median :   33.70  
##  Mean   :  20987    Mean   : 0.638                  Mean   :  180.27  
##  3rd Qu.:  12361    3rd Qu.: 0.801                  3rd Qu.:  109.56  
##  Max.   :1098274    Max.   :12.502                  Max.   :47299.00  
##  NA's   :27054      NA's   :27054                   NA's   :28254     
##  positive_rate                          tests_units    stringency_index
##  Min.   :0.000   people tested                : 4403   Min.   :  0.00  
##  1st Qu.:0.008   people tested (incl. non-PCR):  185   1st Qu.: 38.89  
##  Median :0.028   samples tested               : 3399   Median : 64.35  
##  Mean   :0.065   tests performed              : 9249   Mean   : 57.76  
##  3rd Qu.:0.081   units unclear                :  425   3rd Qu.: 79.63  
##  Max.   :0.651   NA's                         :26255   Max.   :100.00  
##  NA's   :27874                                         NA's   :7371    
##    population        population_density    median_age    aged_65_older   
##  Min.   :8.090e+02   Min.   :    0.137   Min.   :15.10   Min.   : 1.144  
##  1st Qu.:1.403e+06   1st Qu.:   39.497   1st Qu.:23.50   1st Qu.: 3.556  
##  Median :8.655e+06   Median :   88.125   Median :31.40   Median : 6.991  
##  Mean   :8.946e+07   Mean   :  362.191   Mean   :31.38   Mean   : 9.293  
##  3rd Qu.:3.107e+07   3rd Qu.:  214.243   3rd Qu.:39.70   3rd Qu.:14.799  
##  Max.   :7.795e+09   Max.   :19347.500   Max.   :48.20   Max.   :27.049  
##  NA's   :260         NA's   :2235        NA's   :4733    NA's   :5313    
##  aged_70_older    gdp_per_capita     extreme_poverty cardiovasc_death_rate
##  Min.   : 0.526   Min.   :   661.2   Min.   : 0.10   Min.   : 79.37       
##  1st Qu.: 2.142   1st Qu.:  5338.4   1st Qu.: 0.50   1st Qu.:153.51       
##  Median : 4.419   Median : 14103.5   Median : 1.80   Median :237.37       
##  Mean   : 5.880   Mean   : 21011.2   Mean   :11.99   Mean   :251.21       
##  3rd Qu.: 9.473   3rd Qu.: 32415.1   3rd Qu.:16.00   3rd Qu.:318.95       
##  Max.   :18.493   Max.   :116935.6   Max.   :77.60   Max.   :724.42       
##  NA's   :4936     NA's   :5231       NA's   :18082   NA's   :4718         
##  diabetes_prevalence female_smokers   male_smokers   handwashing_facilities
##  Min.   : 0.990      Min.   : 0.10   Min.   : 7.70   Min.   : 1.188        
##  1st Qu.: 5.310      1st Qu.: 1.90   1st Qu.:21.40   1st Qu.:21.222        
##  Median : 7.110      Median : 6.40   Median :31.40   Median :55.182        
##  Mean   : 8.046      Mean   :10.84   Mean   :32.64   Mean   :52.621        
##  3rd Qu.:10.180      3rd Qu.:19.60   3rd Qu.:40.90   3rd Qu.:83.741        
##  Max.   :23.360      Max.   :44.00   Max.   :78.10   Max.   :98.999        
##  NA's   :3347        NA's   :13126   NA's   :13513   NA's   :25626         
##  hospital_beds_per_thousand life_expectancy human_development_index
##  Min.   : 0.100             Min.   :53.28   Min.   :0.354          
##  1st Qu.: 1.300             1st Qu.:69.91   1st Qu.:0.606          
##  Median : 2.500             Median :75.49   Median :0.755          
##  Mean   : 3.117             Mean   :74.06   Mean   :0.726          
##  3rd Qu.: 4.200             3rd Qu.:79.93   3rd Qu.:0.853          
##  Max.   :13.800             Max.   :86.75   Max.   :0.953          
##  NA's   :8462               NA's   :806     NA's   :6099

str(): que nos dice cual es la estructura de nuestra base de datos.

str(db)
## 'data.frame':    43916 obs. of  41 variables:
##  $ iso_code                       : Factor w/ 211 levels "ABW","AFG","AGO",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ continent                      : Factor w/ 6 levels "Africa","Asia",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ location                       : Factor w/ 212 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ date                           : Factor w/ 260 levels "2019-12-31","2020-01-01",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ total_cases                    : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ new_cases                      : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ new_cases_smoothed             : num  NA NA NA NA NA NA 0 0 0 0 ...
##  $ total_deaths                   : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ new_deaths                     : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ new_deaths_smoothed            : num  NA NA NA NA NA NA 0 0 0 0 ...
##  $ total_cases_per_million        : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ new_cases_per_million          : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ new_cases_smoothed_per_million : num  NA NA NA NA NA NA 0 0 0 0 ...
##  $ total_deaths_per_million       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ new_deaths_per_million         : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ new_deaths_smoothed_per_million: num  NA NA NA NA NA NA 0 0 0 0 ...
##  $ new_tests                      : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ total_tests                    : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ total_tests_per_thousand       : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ new_tests_per_thousand         : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ new_tests_smoothed             : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ new_tests_smoothed_per_thousand: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ tests_per_case                 : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ positive_rate                  : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ tests_units                    : Factor w/ 5 levels "people tested",..: NA NA NA NA NA NA NA NA NA NA ...
##  $ stringency_index               : num  NA 0 0 0 0 0 0 0 0 0 ...
##  $ population                     : num  38928341 38928341 38928341 38928341 38928341 ...
##  $ population_density             : num  54.4 54.4 54.4 54.4 54.4 ...
##  $ median_age                     : num  18.6 18.6 18.6 18.6 18.6 18.6 18.6 18.6 18.6 18.6 ...
##  $ aged_65_older                  : num  2.58 2.58 2.58 2.58 2.58 ...
##  $ aged_70_older                  : num  1.34 1.34 1.34 1.34 1.34 ...
##  $ gdp_per_capita                 : num  1804 1804 1804 1804 1804 ...
##  $ extreme_poverty                : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ cardiovasc_death_rate          : num  597 597 597 597 597 ...
##  $ diabetes_prevalence            : num  9.59 9.59 9.59 9.59 9.59 9.59 9.59 9.59 9.59 9.59 ...
##  $ female_smokers                 : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ male_smokers                   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ handwashing_facilities         : num  37.7 37.7 37.7 37.7 37.7 ...
##  $ hospital_beds_per_thousand     : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ life_expectancy                : num  64.8 64.8 64.8 64.8 64.8 ...
##  $ human_development_index        : num  0.498 0.498 0.498 0.498 0.498 0.498 0.498 0.498 0.498 0.498 ...

head(): que nos muestra los primeros cinco registros de la base de datos.

head(db)
##   iso_code continent    location       date total_cases new_cases
## 1      AFG      Asia Afghanistan 2019-12-31           0         0
## 2      AFG      Asia Afghanistan 2020-01-01           0         0
## 3      AFG      Asia Afghanistan 2020-01-02           0         0
## 4      AFG      Asia Afghanistan 2020-01-03           0         0
## 5      AFG      Asia Afghanistan 2020-01-04           0         0
## 6      AFG      Asia Afghanistan 2020-01-05           0         0
##   new_cases_smoothed total_deaths new_deaths new_deaths_smoothed
## 1                 NA            0          0                  NA
## 2                 NA            0          0                  NA
## 3                 NA            0          0                  NA
## 4                 NA            0          0                  NA
## 5                 NA            0          0                  NA
## 6                 NA            0          0                  NA
##   total_cases_per_million new_cases_per_million new_cases_smoothed_per_million
## 1                       0                     0                             NA
## 2                       0                     0                             NA
## 3                       0                     0                             NA
## 4                       0                     0                             NA
## 5                       0                     0                             NA
## 6                       0                     0                             NA
##   total_deaths_per_million new_deaths_per_million
## 1                        0                      0
## 2                        0                      0
## 3                        0                      0
## 4                        0                      0
## 5                        0                      0
## 6                        0                      0
##   new_deaths_smoothed_per_million new_tests total_tests
## 1                              NA        NA          NA
## 2                              NA        NA          NA
## 3                              NA        NA          NA
## 4                              NA        NA          NA
## 5                              NA        NA          NA
## 6                              NA        NA          NA
##   total_tests_per_thousand new_tests_per_thousand new_tests_smoothed
## 1                       NA                     NA                 NA
## 2                       NA                     NA                 NA
## 3                       NA                     NA                 NA
## 4                       NA                     NA                 NA
## 5                       NA                     NA                 NA
## 6                       NA                     NA                 NA
##   new_tests_smoothed_per_thousand tests_per_case positive_rate tests_units
## 1                              NA             NA            NA        <NA>
## 2                              NA             NA            NA        <NA>
## 3                              NA             NA            NA        <NA>
## 4                              NA             NA            NA        <NA>
## 5                              NA             NA            NA        <NA>
## 6                              NA             NA            NA        <NA>
##   stringency_index population population_density median_age aged_65_older
## 1               NA   38928341             54.422       18.6         2.581
## 2                0   38928341             54.422       18.6         2.581
## 3                0   38928341             54.422       18.6         2.581
## 4                0   38928341             54.422       18.6         2.581
## 5                0   38928341             54.422       18.6         2.581
## 6                0   38928341             54.422       18.6         2.581
##   aged_70_older gdp_per_capita extreme_poverty cardiovasc_death_rate
## 1         1.337       1803.987              NA               597.029
## 2         1.337       1803.987              NA               597.029
## 3         1.337       1803.987              NA               597.029
## 4         1.337       1803.987              NA               597.029
## 5         1.337       1803.987              NA               597.029
## 6         1.337       1803.987              NA               597.029
##   diabetes_prevalence female_smokers male_smokers handwashing_facilities
## 1                9.59             NA           NA                 37.746
## 2                9.59             NA           NA                 37.746
## 3                9.59             NA           NA                 37.746
## 4                9.59             NA           NA                 37.746
## 5                9.59             NA           NA                 37.746
## 6                9.59             NA           NA                 37.746
##   hospital_beds_per_thousand life_expectancy human_development_index
## 1                        0.5           64.83                   0.498
## 2                        0.5           64.83                   0.498
## 3                        0.5           64.83                   0.498
## 4                        0.5           64.83                   0.498
## 5                        0.5           64.83                   0.498
## 6                        0.5           64.83                   0.498

fivenum(): que nos muestra los “cinco números de Tukey” com son:

fivenum(db$total_cases)
## [1]        0       48      895     9501 29309546

IQR(): que nos muestra la rango intercuartil

IQR(db$total_cases, na.rm = T)
## [1] 9452.75

dim(): que nos muestra la dimensión de nuestra base de datos [nfilas, ncolumnas]

dim(db)
## [1] 43916    41

names(): que nos muestra los nombres de las variables/columnas

names(db)
##  [1] "iso_code"                        "continent"                      
##  [3] "location"                        "date"                           
##  [5] "total_cases"                     "new_cases"                      
##  [7] "new_cases_smoothed"              "total_deaths"                   
##  [9] "new_deaths"                      "new_deaths_smoothed"            
## [11] "total_cases_per_million"         "new_cases_per_million"          
## [13] "new_cases_smoothed_per_million"  "total_deaths_per_million"       
## [15] "new_deaths_per_million"          "new_deaths_smoothed_per_million"
## [17] "new_tests"                       "total_tests"                    
## [19] "total_tests_per_thousand"        "new_tests_per_thousand"         
## [21] "new_tests_smoothed"              "new_tests_smoothed_per_thousand"
## [23] "tests_per_case"                  "positive_rate"                  
## [25] "tests_units"                     "stringency_index"               
## [27] "population"                      "population_density"             
## [29] "median_age"                      "aged_65_older"                  
## [31] "aged_70_older"                   "gdp_per_capita"                 
## [33] "extreme_poverty"                 "cardiovasc_death_rate"          
## [35] "diabetes_prevalence"             "female_smokers"                 
## [37] "male_smokers"                    "handwashing_facilities"         
## [39] "hospital_beds_per_thousand"      "life_expectancy"                
## [41] "human_development_index"

5. DISTRIBUCIÓN DE FRECUENCIAS

5.1 Distribución de frecuencias absolutas

Una distribución de frecuencias nos permite resumir nuestros datos en una tabla para poder evaluar el peso de cada categoría en multitud de nuestros datos.
Definición: La distribución de frecuecias es construcción de una tabla donde se listan las diferentes categorías de una variable y se calculan el número de ocurrencias de dicha variable en la base de datos

En R, esta operación es bastante sencilla y se realiza con la fucnión tapply(). tapply() es una función poderosa de R y es una herramienta de uso constante. Esta función tiene 3 parámetros: + X= donde consignamos el vector númerico sobre el que se va a hacer los cáluculos definidos en el parámetro FUN= + INDEX= donde se define el factor por el cual se va agrupar los datos. + FUN= donde se define la función.

En este caso vamos a hacer una tabla de distribución de frecuencias absolutas del número de muertes por continente.

tapply(X = db$new_deaths,INDEX = db$continent, FUN = sum, na.rm = T)
##        Africa          Asia        Europe North America       Oceania 
##         32789        166470        213161        286673           879 
## South America 
##        228911

Tambien podríamos ver la cantidad de registros por pais, para ver que paises tienen el mayor número de registros, con ayuda de la función table(). Para no mostrar todos los paises, seleccionaremos los 5 paises con menor número de registros, para lo cual usaremos la función sort() para ordenar la tabla de mayor a menor y luego la función head() para seleccionar los primeros 5 registros de la tabla.

head(sort(table(db$location)))
## 
##      Hong Kong        Lesotho        Comoros     Tajikistan Western Sahara 
##             16            124            137            138            143 
##          Yemen 
##            159

5.2 Distribución de frecuencias relativas

Hasta aquí podríamos pensar erroneamente que America del norte es el continente más afectado, pero veamos que pasa si expresamos esta tabla de contingencia como frecuencias relativas, para lo cual necesitamos dividir estos datos entre la población por continente. Sabiendo que:

Continente población
Africa 1.216 * 109
Asia 4.463 * 109
Europa 0.7414 * 109
America del norte 0.579 * 109
Oceania 0.042 * 109
America del sur 0.4225 * 109

Entonces debemos dividir el resultado anterior entre las poblaciones. Para que los números no sean tan pequeños podemos expresarlo como: “X 100,000 habitantes”

tapply(X = db$new_deaths,INDEX = db$continent, FUN = sum, na.rm = T)/
  c(1.216 * 10^4, 4.463  * 10^4,0.7414 *10^4,0.579 *10^4,0.042 *10^4,0.4225 *10^4)
##        Africa          Asia        Europe North America       Oceania 
##      2.696464      3.730002     28.751146     49.511744      2.092857 
## South America 
##     54.180118

Ahora con cuando “escalamos” los datos ¿Cuál es el continente más afectado?

5.2 Frecuencias por clases

breaks <- seq(from=0,to=4000,by = 250)
p <- hist(db$new_deaths[db$continent=="South America"],breaks = breaks)
data.frame(clase = paste(breaks[1:(length(breaks)-1)],
                         breaks[2:(length(breaks))],
                         sep="-"),
           n = p$counts)
##        clase    n
## 1      0-250 2347
## 2    250-500   82
## 3    500-750   36
## 4   750-1000   25
## 5  1000-1250   41
## 6  1250-1500   22
## 7  1500-1750    2
## 8  1750-2000    0
## 9  2000-2250    0
## 10 2250-2500    0
## 11 2500-2750    0
## 12 2750-3000    0
## 13 3000-3250    0
## 14 3250-3500    0
## 15 3500-3750    0
## 16 3750-4000    3

Los resultados muestran que el número de casos reportados es principalmente menor a 250 casos por día en los reportes por pais de sudamerica.

5.3 Frecuencias acumuladas

Ahora veamos la frecuencia acumulada de muertes reportadas por día en Perú. Para ello, lo primero que haremos es construir un vector numérico a partir de una seleción de datos de nuestra base de datos principal. Para ello usaremos la función subset(). La función subset() tiene tres parámetros: + x= donde se pone la base de datos de donde será extraid o seleccionada la información. + subset= donde se colocará las condiciones lógicas para filtrar los datos. + select= donde se define que columnas se desea extraer.

Entonces construyamos nuestro vector:

peru <- subset(x = db,
               subset = location == "Peru",
               select = c(date,new_deaths))
tail(peru)
##             date new_deaths
## 31315 2020-09-10        113
## 31316 2020-09-11        108
## 31317 2020-09-12        126
## 31318 2020-09-13        123
## 31319 2020-09-14        117
## 31320 2020-09-15        102

Ahora, para construir nuestra tabla de frecuencia acumulada, usaremos la función cut() y luego la función table() para luego hacer la calcular la frecuencia acumulada con la función cumsum()

peru.cut <- cut(x = peru$new_deaths,breaks = breaks,right = FALSE)
peru.freq <- table(peru.cut)
peru.cum <- cumsum(peru.freq)
cbind(peru.cum)
##                    peru.cum
## [0,250)                 188
## [250,500)               190
## [500,750)               190
## [750,1e+03)             190
## [1e+03,1.25e+03)        190
## [1.25e+03,1.5e+03)      190
## [1.5e+03,1.75e+03)      190
## [1.75e+03,2e+03)        190
## [2e+03,2.25e+03)        190
## [2.25e+03,2.5e+03)      190
## [2.5e+03,2.75e+03)      190
## [2.75e+03,3e+03)        190
## [3e+03,3.25e+03)        190
## [3.25e+03,3.5e+03)      190
## [3.5e+03,3.75e+03)      190
## [3.75e+03,4e+03)        192

6. HISTOGRAMAS

Una herramienta gráfica muy útil para estudiar la frecuencia de los datos son los histogramas. Ellos agrupan los datos en clases y los muestran en un gráfico de barras adyacentes. Aquí será claramente visible si la distribución de nuestros datos es normal o no es normal. Características importantes que nos permite ver los histogramas: + Distribución de los datos. + Evidencia el centro de nuestros datos. + Muestra la dispersión de nuestros datos. + Indentificar valores atípicos.

En R, está gráfica se realiza con la función hist().

hist(peru$new_deaths)

Podemos definir los límites de las clases con el parámetro break.

breaks <- c(seq(from = 0,to= 300,by = 10), 4000)
hist(peru$new_deaths, breaks = breaks)

Existen datos atípicos, que están sesgando nuestros resultados, para ellos vamos a usar summary() para una inspección rápida

summary(peru)
##          date       new_deaths     
##  2020-02-28:  1   Min.   :   0.00  
##  2020-02-29:  1   1st Qu.:  45.75  
##  2020-03-01:  1   Median : 136.50  
##  2020-03-02:  1   Mean   : 160.48  
##  2020-03-03:  1   3rd Qu.: 189.00  
##  2020-03-04:  1   Max.   :3935.00  
##  (Other)   :195   NA's   :9

Note que existen 9 datos atípicos en nuestra base de datos que son NAs, y además un registro que dice que registramos 3935 muertes en un solo día, lo cual es una cantidad irreal. Para encontrarlos usaremos la función is.na() y veremos donde se encuentran.

peru[is.na(peru$new_deaths),]
##             date new_deaths
## 31120 2020-02-28         NA
## 31121 2020-02-29         NA
## 31122 2020-03-01         NA
## 31123 2020-03-02         NA
## 31124 2020-03-03         NA
## 31125 2020-03-04         NA
## 31126 2020-03-05         NA
## 31127 2020-03-06         NA
## 31129 2020-03-08         NA

Para encontrar si tenemos si 3935 muertes en un día es irreal, ordenemos el número de muertes y veamos si hay valores cercanos.

head(sort(peru$new_deaths, decreasing = T))
## [1] 3935 3887  359  260  228  225

Existen dos valores atípicos de 3935 y 3887, para ver las fechas de estos registros podemos usar la función %in% para buscarlos directamente en la base de datos.

peru[peru$new_deaths%in%c(3935,3887),]
##             date new_deaths
## 31267 2020-07-24       3887
## 31288 2020-08-14       3935

Aparentemnete son dos datos aislados el 24 de julio y el 14 de agosto. Podemos explorar estos datos mas tarde con la gráfica de dispersión (que la convertiremos a líneas) Si consideramos que estos datos son erroneos y queremos tener una gráfica de de 0 a 300 casos nuevos por día, podemo usar el parámetro xlim para definir los límites.

hist(peru$new_deaths, breaks = breaks, xlim = c(0,300), freq = T, las = 2)
## Warning in plot.histogram(r, freq = freq1, col = col, border = border, angle =
## angle, : the AREAS in the plot are wrong -- rather use 'freq = FALSE'

Expresar esta gráfica en frecuencias relativas, es muy facil solo se tiene que cambiar el parámetro freq

hist(peru$new_deaths, breaks = breaks, xlim = c(0,300), freq = F, las = 2)

Lo que muestra esta gráfica es que el número de casos nuevos reportados por día en Perú es bimodal, tiene una moda en la clase [0,10) y otra entre [180,200). Tal vez si quitamos los primeros días que no hubo registro, nuestra gráfica cambie. Para ver en que día comenzó a registrarse, veamos los primeros 30 días de registros.

head(peru, 30)
##             date new_deaths
## 31120 2020-02-28         NA
## 31121 2020-02-29         NA
## 31122 2020-03-01         NA
## 31123 2020-03-02         NA
## 31124 2020-03-03         NA
## 31125 2020-03-04         NA
## 31126 2020-03-05         NA
## 31127 2020-03-06         NA
## 31128 2020-03-07          0
## 31129 2020-03-08         NA
## 31130 2020-03-09          0
## 31131 2020-03-10          0
## 31132 2020-03-11          0
## 31133 2020-03-12          0
## 31134 2020-03-13          0
## 31135 2020-03-14          0
## 31136 2020-03-15          0
## 31137 2020-03-16          0
## 31138 2020-03-17          0
## 31139 2020-03-18          0
## 31140 2020-03-19          0
## 31141 2020-03-20          2
## 31142 2020-03-21          1
## 31143 2020-03-22          2
## 31144 2020-03-23          0
## 31145 2020-03-24          0
## 31146 2020-03-25          2
## 31147 2020-03-26          1
## 31148 2020-03-27          1
## 31149 2020-03-28          2

Aparentemente, nuestro primer registro es con fecha 20 de Marzo, así que cortaremos nuestros datos a ese rango de fechas

peru2 <- peru[21:nrow(peru),]
hist(peru2$new_deaths, breaks = breaks, xlim = c(0,300), freq = F, las = 2)

Aparentemente la distribución de nuestros datos no sigue una distribución normal, podemos ayudarnos de la función density para que esto sea mas evidente. La función density nos ayuda a graficar una línea que calcula la densidad kernel de nuestros datos.

hist(peru2$new_deaths, breaks = breaks, xlim = c(0,300), freq = F, las = 2)
lines(density(peru2$new_deaths))
polygon(density(peru2$new_deaths), col = rgb(1,0,0,0.5))

7. POLÍGONO DE FRECUENCIAS

Otra forma de observar los datos, es con un polígono de frecuencia, este lo podemos graficar encima de un histograma o lo podemos graficar independientemente. Si lo graficamos encima del histograma anterior, podemos verlos así.

p <- hist(peru2$new_deaths, breaks = breaks, xlim = c(0,300), freq = F, las = 2)
p$counts
##  [1] 21  8  3  3  4  3  2  5  5  6  5  4 11  8  6  4  3 10 26 21 12  3  4  0  0
## [26]  1  0  0  0  0  3
p$density
##  [1] 1.160221e-02 4.419890e-03 1.657459e-03 1.657459e-03 2.209945e-03
##  [6] 1.657459e-03 1.104972e-03 2.762431e-03 2.762431e-03 3.314917e-03
## [11] 2.762431e-03 2.209945e-03 6.077348e-03 4.419890e-03 3.314917e-03
## [16] 2.209945e-03 1.657459e-03 5.524862e-03 1.436464e-02 1.160221e-02
## [21] 6.629834e-03 1.657459e-03 2.209945e-03 0.000000e+00 0.000000e+00
## [26] 5.524862e-04 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [31] 4.479618e-06
p$breaks
##  [1]    0   10   20   30   40   50   60   70   80   90  100  110  120  130  140
## [16]  150  160  170  180  190  200  210  220  230  240  250  260  270  280  290
## [31]  300 4000
p$mids
##  [1]    5   15   25   35   45   55   65   75   85   95  105  115  125  135  145
## [16]  155  165  175  185  195  205  215  225  235  245  255  265  275  285  295
## [31] 2150
lines(p$density~p$mids, col = "blue")

Tambien podemos graficarlo como un gráfico independiente

plot(p$density~p$mids, col = "blue", type = "l", xlim = c(0,300))

Tambien podemos graficar la frecuencia acumulad de los casos nuevos reportados para Perú con la función cumsum

plot(cumsum(peru2$new_deaths), type = "l", las = 1)

Ahora comparemos la frecuencia acumulada de muertes nuevas reportadas por día en tres paises: USA, Mexico y Perú.

USA <- db$new_deaths[db$location=="United States"]
USA <- USA[!is.na(USA)]
plot(cumsum(USA), type = "l", las = 1, col = "red")
lines(cumsum(db$new_deaths[db$location=="Mexico"][!is.na(db$new_deaths[db$location=="Mexico"])]),col = "green")
lines(cumsum(db$new_deaths[db$location=="Peru"][!is.na(db$new_deaths[db$location=="Peru"])]),col = "blue")

¿Ud. que opina?

8. GRÁFICA DE DISPERSIÓN

plot(db$new_cases[db$continent=="South America"])

plot(db$new_cases[db$continent=="South America"], type = "l")

9. GRÁFICO DE TALLO Y HOJAS

stem(peru2$new_deaths)
## 
##   The decimal point is 2 digit(s) to the right of the |
## 
##    0 | 00000000000000111111111112222233344455555667777888999990000001111112+61
##    2 | 00000000000000000000001111111112233366
##    4 | 
##    6 | 
##    8 | 
##   10 | 
##   12 | 
##   14 | 
##   16 | 
##   18 | 
##   20 | 
##   22 | 
##   24 | 
##   26 | 
##   28 | 
##   30 | 
##   32 | 
##   34 | 
##   36 | 
##   38 | 94

10. GRÁFICO DE PASTEL

p <- tapply(X = db$new_cases, INDEX = db$continent, FUN = sum, na.rm = T)/
  c(1.216 * 10^4, 4.463  * 10^4,0.7414 *10^4,0.579 *10^4,0.042 *10^4,0.4225 *10^4)

pie(x = p,
    labels = paste(names(p), round(p,2), sep = "\n"),
    init.angle = 12, 
    main = "Casos nuevos reportados por 100,000 habitantes")

11. INTRODUCCIÓN A GGPLOT