Para el desarrollo de este anĂ¡lisis de datos, se trabajarĂ¡ con el dataset Insurance el cual contiene informaciĂ³n sobre la pĂ³liza medica y datos personales de un grupo de personas detallado a continuaciĂ³n:

age/edad: Edad del beneficiario principal del seguro.

sex/sexo: Género del contratista del seguro - Masculino – femenino.

bmi/indice de masa corporal: Proporciona una comprensiĂ³n del cuerpo pesos relativamente altos o bajos en relaciĂ³n con la altura, Ă­ndice objetivo de peso corporal (kg / m ^ 2) utilizando la relaciĂ³n entre altura y peso, idealmente 18,5 a 24,9.

children/niño-niñas: NĂºmero de hijos cubiertos por el seguro mĂ©dico.

smoker/fumador: si fumador - no fumador.

regiĂ³n: Zona residencial del beneficiario en estados unidos.

charge/cargos: Costos médicos individuales facturados por el seguro médico.

1 Varias funciones para familiarizarse con el conjunto de datos.

seguro=insurance # Es opcional renombrar el conjunto de datos.

head(seguro) # Esta funciĂ³n presenta las primeras filas del conjunto de datos.
## # A tibble: 6 Ă— 7
##     age sex      bmi children smoker region    charges
##   <dbl> <chr>  <dbl>    <dbl> <chr>  <chr>       <dbl>
## 1    19 female  27.9        0 yes    southwest  16885.
## 2    18 male    33.8        1 no     southeast   1726.
## 3    28 male    33          3 no     southeast   4449.
## 4    33 male    22.7        0 no     northwest  21984.
## 5    32 male    28.9        0 no     northwest   3867.
## 6    31 female  25.7        0 no     southeast   3757.
str(seguro) # Muestra en pantalla el nĂºmero de filas (observaciones) y columnas (variables),adicionalmente el tipo de variable de cada uno de los datos.
## spc_tbl_ [1,338 Ă— 7] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ age     : num [1:1338] 19 18 28 33 32 31 46 37 37 60 ...
##  $ sex     : chr [1:1338] "female" "male" "male" "male" ...
##  $ bmi     : num [1:1338] 27.9 33.8 33 22.7 28.9 ...
##  $ children: num [1:1338] 0 1 3 0 0 0 1 3 2 0 ...
##  $ smoker  : chr [1:1338] "yes" "no" "no" "no" ...
##  $ region  : chr [1:1338] "southwest" "southeast" "southeast" "northwest" ...
##  $ charges : num [1:1338] 16885 1726 4449 21984 3867 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   age = col_double(),
##   ..   sex = col_character(),
##   ..   bmi = col_double(),
##   ..   children = col_double(),
##   ..   smoker = col_character(),
##   ..   region = col_character(),
##   ..   charges = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

2 Tidyverse

Es un conjunto de librerĂ­as desarrolladas para la ciencia de datos en R,la cual incluye un conjunto de librerĂ­as importante para manipulaciĂ³n de datos y graficarlos.

library(tidyverse)
glimpse(seguro) #Esta funciĂ³n muestra lo mismo de str, pero de una manera mĂ¡s estĂ©tica.
## Rows: 1,338
## Columns: 7
## $ age      <dbl> 19, 18, 28, 33, 32, 31, 46, 37, 37, 60, 25, 62, 23, 56, 27, 1…
## $ sex      <chr> "female", "male", "male", "male", "male", "female", "female",…
## $ bmi      <dbl> 27.900, 33.770, 33.000, 22.705, 28.880, 25.740, 33.440, 27.74…
## $ children <dbl> 0, 1, 3, 0, 0, 0, 1, 3, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0…
## $ smoker   <chr> "yes", "no", "no", "no", "no", "no", "no", "no", "no", "no", …
## $ region   <chr> "southwest", "southeast", "southeast", "northwest", "northwes…
## $ charges  <dbl> 16884.924, 1725.552, 4449.462, 21984.471, 3866.855, 3756.622,…
summary(seguro) # Ofrece un primer resumen descriptivo de cada una de las variables del conjunto de datos.
##       age            sex                 bmi           children    
##  Min.   :18.00   Length:1338        Min.   :15.96   Min.   :0.000  
##  1st Qu.:27.00   Class :character   1st Qu.:26.30   1st Qu.:0.000  
##  Median :39.00   Mode  :character   Median :30.40   Median :1.000  
##  Mean   :39.21                      Mean   :30.66   Mean   :1.095  
##  3rd Qu.:51.00                      3rd Qu.:34.69   3rd Qu.:2.000  
##  Max.   :64.00                      Max.   :53.13   Max.   :5.000  
##     smoker             region             charges     
##  Length:1338        Length:1338        Min.   : 1122  
##  Class :character   Class :character   1st Qu.: 4740  
##  Mode  :character   Mode  :character   Median : 9382  
##                                        Mean   :13270  
##                                        3rd Qu.:16640  
##                                        Max.   :63770

2.1 CREAR SUBCONJUNTO DE DATOS

Es posible que en ocasiones no queramos analizar todo el conjunto de datos, si no una parte de este el cual sea de nuestro interés.

2.1.1 Subconjunto de variables

Este se puede realizar mediante la funciĂ³n select

variablesdemograficas <- seguro%>%select(age,sex,region)
head(variablesdemograficas)
## # A tibble: 6 Ă— 3
##     age sex    region   
##   <dbl> <chr>  <chr>    
## 1    19 female southwest
## 2    18 male   southeast
## 3    28 male   southeast
## 4    33 male   northwest
## 5    32 male   northwest
## 6    31 female southeast

2.1.2 Subconjunto de registros.

Este se puede realizar mediante la funciĂ³n filter por ejemplo, tomemos todos los registros que coinciden son mujeres.

seguromujeres<-seguro%>%filter(sex=="female")
head(seguromujeres)
## # A tibble: 6 Ă— 7
##     age sex      bmi children smoker region    charges
##   <dbl> <chr>  <dbl>    <dbl> <chr>  <chr>       <dbl>
## 1    19 female  27.9        0 yes    southwest  16885.
## 2    31 female  25.7        0 no     southeast   3757.
## 3    46 female  33.4        1 no     southeast   8241.
## 4    37 female  27.7        3 no     northwest   7282.
## 5    60 female  25.8        0 no     northwest  28923.
## 6    62 female  26.3        0 yes    southeast  27809.

Tomemos todos los registros excepto el que indiquemos.

nosuroeste<-seguro%>%filter(region != "southwest") 
head(nosuroeste)
## # A tibble: 6 Ă— 7
##     age sex      bmi children smoker region    charges
##   <dbl> <chr>  <dbl>    <dbl> <chr>  <chr>       <dbl>
## 1    18 male    33.8        1 no     southeast   1726.
## 2    28 male    33          3 no     southeast   4449.
## 3    33 male    22.7        0 no     northwest  21984.
## 4    32 male    28.9        0 no     northwest   3867.
## 5    31 female  25.7        0 no     southeast   3757.
## 6    46 female  33.4        1 no     southeast   8241.

Tomemos todos los registros de las personas que tienen entre 30 y 60 años.

entre30y60<-seguro%>%filter(age >= 30 & age <=60)
head(entre30y60)
## # A tibble: 6 Ă— 7
##     age sex      bmi children smoker region    charges
##   <dbl> <chr>  <dbl>    <dbl> <chr>  <chr>       <dbl>
## 1    33 male    22.7        0 no     northwest  21984.
## 2    32 male    28.9        0 no     northwest   3867.
## 3    31 female  25.7        0 no     southeast   3757.
## 4    46 female  33.4        1 no     southeast   8241.
## 5    37 female  27.7        3 no     northwest   7282.
## 6    37 male    29.8        2 no     northeast   6406.

Tomemos los registros de todas las personas que viven en el sur, es decir sureste y suroeste.

sur <- seguro %>% filter(region == "southwest" | region == "southheast")
head(sur)
## # A tibble: 6 Ă— 7
##     age sex      bmi children smoker region    charges
##   <dbl> <chr>  <dbl>    <dbl> <chr>  <chr>       <dbl>
## 1    19 female  27.9        0 yes    southwest  16885.
## 2    23 male    34.4        0 no     southwest   1827.
## 3    19 male    24.6        1 no     southwest   1837.
## 4    56 male    40.3        0 no     southwest  10602.
## 5    30 male    35.3        0 yes    southwest  36837.
## 6    30 female  32.4        1 no     southwest   4150.

También podemos filtrar utilizando varias columnas, por ejemplo, tomemos los registros que corresponden a mujeres entre 30 y 45 años, con 2 o 4 hijos.

mujeres30y40con2o4hijos <- seguro %>%filter(sex=="female", age >=30 & age <=45, children ==2 | children ==4) 
head(mujeres30y40con2o4hijos)
## # A tibble: 6 Ă— 7
##     age sex      bmi children smoker region    charges
##   <dbl> <chr>  <dbl>    <dbl> <chr>  <chr>       <dbl>
## 1    31 female  36.6        2 no     southeast   4950.
## 2    37 female  30.8        2 no     southeast   6314.
## 3    34 female  37.3        2 no     northwest   5990.
## 4    37 female  34.8        2 yes    southwest  39837.
## 5    37 female  23.4        2 no     northwest   6686.
## 6    32 female  17.8        2 yes    northwest  32734.

2.2 TABLAS DE FRECUENCIA

Las tablas de frecuencia permiten conocer la distribuciĂ³n de las variables categĂ³ricas, indicando su frecuencia absoluta. La forma mĂ¡s sencilla de realizarla es mediante la funciĂ³n table, y se vincula la columna donde estĂ¡n los datos que se quieren conocer.

table(insurance$region)
## 
## northeast northwest southeast southwest 
##       324       325       364       325

Como se puede observar se tiene la frecuencia absoluta de cada uno de los registros o personas que viven en cada regiĂ³n, en ocasiones es mĂ¡s sencillo analizar las frecuencias relativas en vez de la absoluta para extraer conclusiones. una forma de conseguir rĂ¡pido las frecuencias relativas y acumuladas es mediante la funciĂ³n tab1 de la librerĂ­a epidisplay.

library(epiDisplay)
tab1(seguro$region,graph = F) # A menos que le digamos que no, la funcion realiza por defecto un histograma.
## seguro$region : 
##           Frequency Percent Cum. percent
## northeast       324    24.2         24.2
## northwest       325    24.3         48.5
## southeast       364    27.2         75.7
## southwest       325    24.3        100.0
##   Total        1338   100.0        100.0

Otra forma no tan directa de obtener estas frecuencias, es mediante las funciones tidyvers_group, summarize y mutate.

seguro%>%group_by(region)%>%summarize(Frec.Absoluta=n())%>%mutate(Frec.Relativa=Frec.Absoluta/nrow(seguro))
## # A tibble: 4 Ă— 3
##   region    Frec.Absoluta Frec.Relativa
##   <chr>             <int>         <dbl>
## 1 northeast           324         0.242
## 2 northwest           325         0.243
## 3 southeast           364         0.272
## 4 southwest           325         0.243

SĂ­ se quisiera ordenar los resultados por su frecuencia basta con agregar la funciĂ³n arrange al final y adentro la variable, la cual se ordenara de mayor a menor

seguro%>%group_by(region)%>%summarize(Frec.Absoluta=n())%>%mutate(Frec.Relativa=Frec.Absoluta/nrow(seguro))%>%arrange(desc(Frec.Relativa))
## # A tibble: 4 Ă— 3
##   region    Frec.Absoluta Frec.Relativa
##   <chr>             <int>         <dbl>
## 1 southeast           364         0.272
## 2 northwest           325         0.243
## 3 southwest           325         0.243
## 4 northeast           324         0.242

2.3 HISTOGRAMAS

Teniendo en cuenta que su utilidad principal es para las variables cuantitativas continuas.

library(ggpubr)

gghistogram(seguro,x="bmi",bins = 10) # variable cuantitativa continua.

gghistogram(seguro,x="children") # variable cuantitativa discreta.

2.4 FUNCIONES DE DENSIDAD

A pesar que los histogramas son herramientas Ăºtiles para analizar cĂ³mo se distribuye una variable, son altamente dependientes del nĂºmero de grupos o intervalos definidos. Ante esta situaciĂ³n existen las funciones de densidad, que no son mĂ¡s que las curvas que obtendrĂ­amos si tuviĂ©ramos infinitas barras en el histograma.

ggdensity(seguro,x="bmi")

ggdensity(seguro,x="charges")

Las funciones de densidad pueden tomar diferentes formas. entenderlas y caracterizarlas nos ayudara a comprender como se distribuyen nuestros datos, lo que nos serĂ¡ muy Ăºtil para obtener conclusiones.

2.5 MEDIDAS DE POSICIÓN

Las medidas de posiciĂ³n son el primer indicador a la hora de describir una distribuciĂ³n y en particular se utilizan las medidas de tendencia central, dado que normalmente los valores se concentran en torno a un valor central. Las principales medidas de tendencia central son media, moda y mediana, pero existen otras medidas de posiciĂ³n como los percentiles y cuartiles.

2.5.1 Media

La media se define como la suma de todos los valores divido entre el numero de ellos, se considera la mejor medida para caracterizar la tendencia central, de distribuciones normales en datos cuantitativos, dado que estos siguen una distribuciĂ³n de campana de gauss simĂ©trica.

#La podemos calcular mediante la funciĂ³n mean

mean(insurance$bmi)
## [1] 30.6634
mean(insurance$charges)
## [1] 13270.42

2.5.2 Mediana

La mediana representa el valor central de un listado de los valores ordenados de menor a mayor. Por lo tanto, difiere sustancialmente de la media a la hora de calcularla, ya que en este caso se ordenan todos los registros de una variable y se toma el que queda justo en el medio si el numero de valores es impar y la media de los centrales si el numero de los valores es par. La mediana es mĂ¡s apropiada que la media cuando tenemos una variable que no sigue una distribuciĂ³n normal, ya que se ve menos afectada por los valores extremos.

median(insurance$bmi)
## [1] 30.4
median(insurance$charges)
## [1] 9382.033

2.5.3 Moda

La moda es el valor mas frecuente de la variable. Es utilizada sobre todo en variables cualitativas, ya que caracteriza la categorĂ­a mĂ¡s comĂºn. Sin embargo, tambiĂ©n se puede calcular en las variables cuantitativa. Es curioso que un paquete de R no tenga una funciĂ³n para calcularla, sin embargo, es fĂ¡cil construir la funciĂ³n para hacerlo.

getmode=function(v){
  uniqv=unique(v)
  uniqv[which.max(tabulate(match(v,uniqv)))]
}
getmode(insurance$region)
## [1] "southeast"
getmode(insurance$children)
## [1] 0

2.5.4 Percentiles y Cuartiles

Son una medida de posiciĂ³n dentro de una distribuciĂ³n que no necesariamente describen la tendencia central. Un percentil es el valor que, si ordenamos todos los registros de menor a mayor, deja un determinado porcentaje de registros por debajo.

quantile(insurance$age)
##   0%  25%  50%  75% 100% 
##   18   27   39   51   64
quantile(insurance$age,c(0.15,0.85))
## 15% 85% 
##  22  56

2.6 MEDIDAS DE VARIABILIDAD

Una vez caracterizada la tendencia central de una variable, el siguiente paso es entender la variabilidad de los datos que existe en torno a esa media central. Este indicado complementa a la tendencia central y es clave para comprender la distribuciĂ³n. Para analizar la variabilidad de los datos existen diferentes medidas.

2.6.1 Rango

Es la medida de variabilidad mas sencilla y mide la distancia entre los registros con menor y mayor valor.

max(insurance$age)-min(insurance$age)
## [1] 46

2.6.2 Varianza y desviaciĂ³n tĂ­pica

La varianza es el sumatorio del cuadrado de la diferencia entre cada valor y la media, dividido en el nĂºmero de valores. La desviaciĂ³n tĂ­pica es la raĂ­z cuadrada de la varianza.

# desviaciĂ³n tĂ­pica
sd(insurance$bmi)
## [1] 6.098187
#Varianza
sd(insurance$bmi)^2
## [1] 37.18788

2.6.3 Intervalo intercuartĂ­lico o intervalos intercuartil IQR

IQR(insurance$bmi)
## [1] 8.3975

2.7 MEDIDAS DE FORMA

2.7.1 Modalidad

2.7.2 AsimetrĂ­a

2.7.3 Kurtosis

2.8 VISUALIZACIÓN DE DATOS

2.8.1 Grafico de barras

insurance%>%group_by(smoker)%>%summarize(frec.absoluta=n())%>%
  ggbarplot(x="smoker",y="frec.absoluta")

insurance%>%ggbarplot(x="smoker",y="charges",color="smoker",add="mean")

insurance%>%ggbarplot(x="smoker",y="charges",color="smoker",add="mean_sd")

2.8.2 Boxplot

ggboxplot(insurance,y="charges",color = "#00AFBB",title = "charges",xlab = "")

ggviolin(insurance,y="charges",color = "black",fill = "#00AFBB",title = "charges",add="boxplot",add.params = list(fill="white"),xlab = "")

ggboxplot(insurance,y="charges",x="smoker",color="smoker",add="violin",add.params = list(alpha=0.4))

2.8.3 Scatterplot

ggplot(insurance,aes(x=age,y=charges)) + geom_point()

ggplot(insurance,aes(x=age,y=bmi)) + geom_point()

2.8.4 Pie chart

insurance%>%group_by(region)%>%summarize(N=n())%>%
  ggplot(aes(x="",y=N,fill=region)) + geom_bar(stat="identity",
                                               width=1) + 
  coord_polar("y",start=0) + theme_void()