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.
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>
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
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.
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
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.
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
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.
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.
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.
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
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
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
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
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.
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
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
IQR(insurance$bmi)
## [1] 8.3975
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")
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))
ggplot(insurance,aes(x=age,y=charges)) + geom_point()
ggplot(insurance,aes(x=age,y=bmi)) + geom_point()
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()