#Descripción
Se utiliza un conjunto de datos de personas para ilustrar la regresión logística. El conjunto de datos denominado “adultos.csv” se utiliza tanto para la tarea de clasificacióny predicción.
#Objetivo
Predecir si el ingreso anual en dólares de un individuo excederá los $ 50,000.
#Las librerías
library(tidyverse) # varias
## -- Attaching packages ------------------------------------------------------------------------------------------------ tidyverse 1.3.0 --
## v ggplot2 3.3.1 v purrr 0.3.4
## v tibble 3.0.1 v dplyr 0.8.5
## v tidyr 1.1.0 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.5.0
## -- Conflicts --------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(dplyr) # select filter mutate ...
library(ggplot2) # Gráficas
library(fdth) # Para tablas de distribución y frecuencias
##
## Attaching package: 'fdth'
## The following objects are masked from 'package:stats':
##
## sd, var
library(knitr) # Para ver tablas mas amigables en formato html markdown
library(caret) # Pra particionar datos
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
library(reshape) # Para renombrar columnas en caso de necesitarse
##
## Attaching package: 'reshape'
## The following object is masked from 'package:dplyr':
##
## rename
## The following objects are masked from 'package:tidyr':
##
## expand, smiths
library(scales) # Para escalar datos
##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
#Los datos
Se identifica la ruta en donde están los datos
En la variable datos se carga el conjunto de datos de adultos.csv
datos <- read.csv("C:/Users/memow/OneDrive/Escritorio/PracticasR/adultos.csv")
#Explorando datos Los primeros diez registros
kable(head(datos, 10))
| x | age | workclass | education | educational.num | marital.status | race | gender | hours.per.week | income |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 25 | Private | 11th | 7 | Never-married | Black | Male | 40 | <=50K |
| 2 | 38 | Private | HS-grad | 9 | Married-civ-spouse | White | Male | 50 | <=50K |
| 3 | 28 | Local-gov | Assoc-acdm | 12 | Married-civ-spouse | White | Male | 40 | >50K |
| 4 | 44 | Private | Some-college | 10 | Married-civ-spouse | Black | Male | 40 | >50K |
| 5 | 18 | ? | Some-college | 10 | Never-married | White | Female | 30 | <=50K |
| 6 | 34 | Private | 10th | 6 | Never-married | White | Male | 30 | <=50K |
| 7 | 29 | ? | HS-grad | 9 | Never-married | Black | Male | 40 | <=50K |
| 8 | 63 | Self-emp-not-inc | Prof-school | 15 | Married-civ-spouse | White | Male | 32 | >50K |
| 9 | 24 | Private | Some-college | 10 | Never-married | White | Female | 40 | <=50K |
| 10 | 55 | Private | 7th-8th | 4 | Married-civ-spouse | White | Male | 10 | <=50K |
| #Los | último | s diez registros |
kable(tail(datos,10))
| x | age | workclass | education | educational.num | marital.status | race | gender | hours.per.week | income | |
|---|---|---|---|---|---|---|---|---|---|---|
| 48833 | 48833 | 32 | Private | 10th | 6 | Married-civ-spouse | Amer-Indian-Eskimo | Male | 40 | <=50K |
| 48834 | 48834 | 43 | Private | Assoc-voc | 11 | Married-civ-spouse | White | Male | 45 | <=50K |
| 48835 | 48835 | 32 | Private | Masters | 14 | Never-married | Asian-Pac-Islander | Male | 11 | <=50K |
| 48836 | 48836 | 53 | Private | Masters | 14 | Married-civ-spouse | White | Male | 40 | >50K |
| 48837 | 48837 | 22 | Private | Some-college | 10 | Never-married | White | Male | 40 | <=50K |
| 48838 | 48838 | 27 | Private | Assoc-acdm | 12 | Married-civ-spouse | White | Female | 38 | <=50K |
| 48839 | 48839 | 40 | Private | HS-grad | 9 | Married-civ-spouse | White | Male | 40 | >50K |
| 48840 | 48840 | 58 | Private | HS-grad | 9 | Widowed | White | Female | 40 | <=50K |
| 48841 | 48841 | 22 | Private | HS-grad | 9 | Never-married | White | Male | 20 | <=50K |
| 48842 | 48842 | 52 | Self-emp-inc | HS-grad | 9 | Married-civ-spouse | White | Female | 40 | >50K |
*La estructrua de los datos -Resumen de los datos: -x Variable de consecutivo de los datos -age la edad de la persona -workclass es un tipo o clase de trabajo de la persona, privado, gobierno, por su cuenta, -education indica el nivel educativo de la persona -educational es el valor numérico de education -marital es su estado civil -race es el tipo de raza de persona -gender es el género de la persona -hours.per.week son las horas que trbaja por semana -income son los ingresos
#Estructura y resumen de los datos
-datos[-1]. Excepto la columna x que no interesa
str(datos)
## 'data.frame': 48842 obs. of 10 variables:
## $ x : int 1 2 3 4 5 6 7 8 9 10 ...
## $ age : int 25 38 28 44 18 34 29 63 24 55 ...
## $ workclass : chr "Private" "Private" "Local-gov" "Private" ...
## $ education : chr "11th" "HS-grad" "Assoc-acdm" "Some-college" ...
## $ educational.num: int 7 9 12 10 10 6 9 15 10 4 ...
## $ marital.status : chr "Never-married" "Married-civ-spouse" "Married-civ-spouse" "Married-civ-spouse" ...
## $ race : chr "Black" "White" "White" "Black" ...
## $ gender : chr "Male" "Male" "Male" "Male" ...
## $ hours.per.week : int 40 50 40 40 30 30 40 32 40 10 ...
## $ income : chr "<=50K" "<=50K" ">50K" ">50K" ...
kable(summary(datos[-1]))
| age | workclass | education | educational.num | marital.status | race | gender | hours.per.week | income | |
|---|---|---|---|---|---|---|---|---|---|
| Min. :17.00 | Length:48842 | Length:48842 | Min. : 1.00 | Length:48842 | Length:48842 | Length:48842 | Min. : 1.00 | Length:48842 | |
| 1st Qu.:28.00 | Class :character | Class :character | 1st Qu.: 9.00 | Class :character | Class :character | Class :character | 1st Qu.:40.00 | Class :character | |
| Median :37.00 | Mode :character | Mode :character | Median :10.00 | Mode :character | Mode :character | Mode :character | Median :40.00 | Mode :character | |
| Mean :38.64 | NA | NA | Mean :10.08 | NA | NA | NA | Mean :40.42 | NA | |
| 3rd Qu.:48.00 | NA | NA | 3rd Qu.:12.00 | NA | NA | NA | 3rd Qu.:45.00 | NA | |
| Max. :90.00 | NA | NA | Max. :16.00 | NA | NA | NA | Max. :99.00 | NA | |
| #Proc | eso para analiza | r los datos |
-De los pasos 1 al 4 se pueden integrar en fases de ciencia de los datos como de carga, limpieza y exploración de los datos.
-A partir del paso 5 se construye un modelo de regresión lógistica para predicciones.
-paso 1: Identificar variables numéricas
-paso 2: Identificar variables factor
-paso 3: Ingeniería de datos
-paso 4: Estadísticos descriptivos
-paso 5: Conjunto de datos de entrenamiento y de validación Train/test set
-paso 6: Modelo de regresión logística
-paso 7: Evaluar el modelo
-paso 8: Predicciones con datos de entrenamiento
#paso 1: Identificar variables numéricas
-Se utiliza select_if() para seleccionar ciertas variables del conjunto de datos -select_if() es un función de la librería dplyr -Se analizan dos variables numéricas: hours.per.week age education.num es un valor numérico del factor education por lo que se analiza en las variables tipo factor mas adelante
numericas <-select_if(datos, is.numeric)
kable(summary(numericas[-1]))
| age | educational.num | hours.per.week | |
|---|---|---|---|
| Min. :17.00 | Min. : 1.00 | Min. : 1.00 | |
| 1st Qu.:28.00 | 1st Qu.: 9.00 | 1st Qu.:40.00 | |
| Median :37.00 | Median :10.00 | Median :40.00 | |
| Mean :38.64 | Mean :10.08 | Mean :40.42 | |
| 3rd Qu.:48.00 | 3rd Qu.:12.00 | 3rd Qu.:45.00 | |
| Max. :90.00 | Max. :16.00 | Max. :99.00 | |
| #Anál | isis de la varia | ble hours.per.week |
Se visualiza un histograma Se determina la tabla de distribucion de frecuencia con la función fdt() de la variable hours.per.week *La mayoría de la gente trabaja entre 36 y 42 horas por semana
ggplot(numericas, aes(x = hours.per.week)) +
geom_density(alpha = .2, fill = "#FF6666")
distribucion <- fdt(numericas$hours.per.week,breaks="Sturges")
kable(distribucion)
|
|
barplot(height = distribucion$table$f, names.arg = distribucion$table$`Class limits`)
#Análisis de la variable age
-Se visualiza un histograma -Se determina la tabla de distribucion de frecuencia con la función fdt() de la variable age -La mayoría tiene entre 30 y 34 años y de igual forma una gran población en edades de 43 y 47 años de edad
ggplot(numericas, aes(x = age)) +
geom_density(alpha = .2, fill = "#FF6666")
distribucion <- fdt(numericas$age, breaks="Sturges")
kable(distribucion)
|
|
barplot(height = distribucion$table$f, names.arg = distribucion$table$`Class limits`)
-Estandarizar los valores numéricos
*Escalar los valores numéricos de datos con la función rescale() de la librería scales -La finalidad de estandarizar los datos numéricos escalando o centrando los mismos es para mejorar el rendimiento en los análisis -teniendo en cuenta que se establecen valores numéricos bajo los mismos criterios -Se dejan los datos escalados en un nuevo conjunto de datos excepto la variable x [-1] que no interesa -Se visualzan los primeros diez registros -Se visualizan los últimos diez registros -Observar que las variables numéricas age y hours.per.week están centradas y escaladas. -Se generan tres nuevas variables por medio de mutate() con datos numéricos escalados -Se retomará en el análisis más adelante el conjunto de datos datos.Escalados generado en esta apartado
escalados <- datos[-1] %>%
mutate(age.scale = rescale(age),educational.num.scale = rescale(educational.num), hours.per.week.scale = rescale(hours.per.week) )
head(escalados, 10)
## age workclass education educational.num marital.status race
## 1 25 Private 11th 7 Never-married Black
## 2 38 Private HS-grad 9 Married-civ-spouse White
## 3 28 Local-gov Assoc-acdm 12 Married-civ-spouse White
## 4 44 Private Some-college 10 Married-civ-spouse Black
## 5 18 ? Some-college 10 Never-married White
## 6 34 Private 10th 6 Never-married White
## 7 29 ? HS-grad 9 Never-married Black
## 8 63 Self-emp-not-inc Prof-school 15 Married-civ-spouse White
## 9 24 Private Some-college 10 Never-married White
## 10 55 Private 7th-8th 4 Married-civ-spouse White
## gender hours.per.week income age.scale educational.num.scale
## 1 Male 40 <=50K 0.10958904 0.4000000
## 2 Male 50 <=50K 0.28767123 0.5333333
## 3 Male 40 >50K 0.15068493 0.7333333
## 4 Male 40 >50K 0.36986301 0.6000000
## 5 Female 30 <=50K 0.01369863 0.6000000
## 6 Male 30 <=50K 0.23287671 0.3333333
## 7 Male 40 <=50K 0.16438356 0.5333333
## 8 Male 32 >50K 0.63013699 0.9333333
## 9 Female 40 <=50K 0.09589041 0.6000000
## 10 Male 10 <=50K 0.52054795 0.2000000
## hours.per.week.scale
## 1 0.39795918
## 2 0.50000000
## 3 0.39795918
## 4 0.39795918
## 5 0.29591837
## 6 0.29591837
## 7 0.39795918
## 8 0.31632653
## 9 0.39795918
## 10 0.09183673
tail(escalados, 10)
## age workclass education educational.num marital.status
## 48833 32 Private 10th 6 Married-civ-spouse
## 48834 43 Private Assoc-voc 11 Married-civ-spouse
## 48835 32 Private Masters 14 Never-married
## 48836 53 Private Masters 14 Married-civ-spouse
## 48837 22 Private Some-college 10 Never-married
## 48838 27 Private Assoc-acdm 12 Married-civ-spouse
## 48839 40 Private HS-grad 9 Married-civ-spouse
## 48840 58 Private HS-grad 9 Widowed
## 48841 22 Private HS-grad 9 Never-married
## 48842 52 Self-emp-inc HS-grad 9 Married-civ-spouse
## race gender hours.per.week income age.scale
## 48833 Amer-Indian-Eskimo Male 40 <=50K 0.20547945
## 48834 White Male 45 <=50K 0.35616438
## 48835 Asian-Pac-Islander Male 11 <=50K 0.20547945
## 48836 White Male 40 >50K 0.49315068
## 48837 White Male 40 <=50K 0.06849315
## 48838 White Female 38 <=50K 0.13698630
## 48839 White Male 40 >50K 0.31506849
## 48840 White Female 40 <=50K 0.56164384
## 48841 White Male 20 <=50K 0.06849315
## 48842 White Female 40 >50K 0.47945205
## educational.num.scale hours.per.week.scale
## 48833 0.3333333 0.3979592
## 48834 0.6666667 0.4489796
## 48835 0.8666667 0.1020408
## 48836 0.8666667 0.3979592
## 48837 0.6000000 0.3979592
## 48838 0.7333333 0.3775510
## 48839 0.5333333 0.3979592
## 48840 0.5333333 0.3979592
## 48841 0.5333333 0.1938776
## 48842 0.5333333 0.3979592
#paso 2: Identificar variables factor
*Este paso tiene la finalidad de dentificar variales categóricas o factor -Se hace para identificar valores NA, valores con alguna incertidubre o duda de que es o que significa -workclass. Son 9 niveles y hay un nivel cuya etiqueta es ‘?’; habrá que considerar para modificar el valor. ? : 2799. Pendiente esta clase -education son 16 niveles -marital.status que represnta estado civil aparece con 7 niveles -race o raza de persona aparecen con valores de NA, es -gender que representa género (Female=1, Male=2) de la persona también aparecen con valores NA -Finalmente la variable income tiene de igual forma valores NA -Con lo anterior, como analista de datos, habrá que decidir que hacer con los registros que existe NA o el nivel de ? en workclass
factores <- data.frame(select_if(datos, is.factor))
summary(factores)
## < table of extent 0 x 0 >
kable(summary(factores) )
## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)
|| || || ||
str(factores)
## 'data.frame': 48842 obs. of 0 variables
#Frecuencias de cada variable factores
Se utiliza la función fdt_cat() para determinar frecuencias de variables categóricas o tipo factor Se muestran las tablas de distribución de cada variable tipo factor
kable(distribucion$workclass)
## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)
|| || || ||