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.
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"
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
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?
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.
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
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))
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?
plot(db$new_cases[db$continent=="South America"])
plot(db$new_cases[db$continent=="South America"], type = "l")
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
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")