# Cargar las bibliotecas necesarias
library(cluster)
library(tree)
## Warning: package 'tree' was built under R version 4.2.3
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Cargar los datos
library(readr)
datos <- read_csv("survey.csv")
## Rows: 1259 Columns: 18
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (18): Age, Gender, self_employed, family_history, remote_work, tech_comp...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Estandarizar los datos con todas las variables
datos_estandarizados <- scale(datos)

# Crear una matriz con los datos estandarizados
matriz_estandarizada <- as.matrix(datos_estandarizados)



# Estandarizar los datos con algunas variables
datos_estandarizados <- scale(datos[, c("Age", "Gender", "self_employed")])

# Calcular la distancia euclídea entre las filas de la matriz
distancia <- dist(matriz_estandarizada, method = "euclidean")


# Realizar el análisis de conglomerados
set.seed(123) # Para reproducibilidad
kmeans_resultado <- kmeans(datos, centers=3) # Supongamos que queremos 3 grupos

# Añadir los resultados del análisis de conglomerados a los datos
datos$grupo <- kmeans_resultado$cluster

# Seleccionar un grupo específico para el árbol de decisión
grupo_seleccionado <- datos[datos$grupo == 1,] # Supongamos que seleccionamos el grupo 1

# Crear un gráfico de puntos con los datos y los grupos
library(ggplot2)
ggplot(datos, aes(x = Age, y = Gender, color = factor(kmeans_resultado$cluster))) +
  geom_point()

# Generar la gráfica de conglomerados sin etiquetas
clusplot(datos, kmeans_resultado$cluster, color=TRUE, shade=TRUE, labels=0, main="Gráfica de conglomerados")

# Dividir los datos en conjuntos de entrenamiento y prueba
set.seed(123) # Para reproducibilidad
train <- sample(seq(nrow(grupo_seleccionado)), nrow(grupo_seleccionado)*0.7, replace=FALSE)
test <- setdiff(seq(nrow(grupo_seleccionado)), train)

# Crear el árbol de decisión
arbol <- tree(treatment ~ ., data = grupo_seleccionado, subset=train)

# Resumen del árbol
summary(arbol)
## 
## Regression tree:
## tree(formula = treatment ~ ., data = grupo_seleccionado, subset = train)
## Variables actually used in tree construction:
## [1] "family_history" "care_options"   "supervisor"     "Gender"        
## [5] "Age"            "remote_work"   
## Number of terminal nodes:  7 
## Residual mean deviance:  0.184 = 54.1 / 294 
## Distribution of residuals:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -0.7593 -0.2115 -0.1333  0.0000  0.2407  0.8667
# Visualizar el árbol de decisión
plot(arbol); text(arbol, pretty=0)

Explicación del arbol de decisión:

El nodo raíz es “family_history < 0.5”. Esto significa que la primera decisión se toma en función de si el valor de “family_history” es menor que 0.5.

El primer nivel del árbol tiene dos nodos: “care_options < 0.5” y “0.7593”. Esto significa que, dependiendo de la decisión tomada en el nodo raíz, se toma una decisión adicional basada en si “care_options” es menor que 0.5 o se llega a una hoja con el valor “0.7593”.

El segundo nivel del árbol tiene tres nodos: “supervisor < 0.5”, “0.5294”, y “Gender < 0.5”. Esto significa que, dependiendo de las decisiones tomadas en los nodos anteriores, se toma una decisión adicional basada en si “supervisor” es menor que 0.5, se llega a una hoja con el valor “0.5294”, o se toma una decisión basada en si “Gender” es menor que 0.5.

El tercer nivel del árbol tiene dos nodos: “Age < 22.5” y “remote_work < 0.5”. Esto significa que, dependiendo de las decisiones tomadas en los nodos anteriores, se toma una decisión adicional basada en si “Age” es menor que 22.5 o si “remote_work” es menor que 0.5.

# Predecir el conjunto de prueba
prediccion <- predict(arbol, grupo_seleccionado[test,], type="vector")

# Ver los resultados
print(prediccion)
##         1         2         3         4         5         6         7         8 
## 0.1333333 0.2115385 0.7592593 0.1333333 0.5294118 0.7592593 0.1333333 0.2115385 
##         9        10        11        12        13        14        15        16 
## 0.7592593 0.2115385 0.7592593 0.5294118 0.5000000 0.1333333 0.1333333 0.5000000 
##        17        18        19        20        21        22        23        24 
## 0.2115385 0.7592593 0.7592593 0.7592593 0.7592593 0.7592593 0.5294118 0.2115385 
##        25        26        27        28        29        30        31        32 
## 0.1333333 0.7592593 0.7592593 0.7592593 0.2115385 0.2115385 0.2115385 0.7592593 
##        33        34        35        36        37        38        39        40 
## 0.1333333 0.1333333 0.2115385 0.7592593 0.7592593 0.2115385 0.7592593 0.7592593 
##        41        42        43        44        45        46        47        48 
## 0.2115385 0.2115385 0.7592593 0.5294118 0.7592593 0.7592593 0.2115385 0.5000000 
##        49        50        51        52        53        54        55        56 
## 0.7592593 0.5294118 0.7592593 0.7592593 0.3636364 0.5294118 0.7592593 0.3636364 
##        57        58        59        60        61        62        63        64 
## 0.7592593 0.7592593 0.7592593 0.5294118 0.1333333 0.1333333 0.5294118 0.7592593 
##        65        66        67        68        69        70        71        72 
## 0.5294118 0.7592593 0.7592593 0.5294118 0.7592593 0.7592593 0.1333333 0.7592593 
##        73        74        75        76        77        78        79        80 
## 0.7592593 0.7592593 0.7592593 0.7592593 0.7592593 0.7592593 0.7592593 0.2115385 
##        81        82        83        84        85        86        87        88 
## 0.2115385 0.2115385 0.7592593 0.7592593 0.3636364 0.7592593 0.1333333 0.3636364 
##        89        90        91        92        93        94        95        96 
## 0.2115385 0.1333333 0.5294118 0.5000000 0.2115385 0.2115385 0.7592593 0.3636364 
##        97        98        99       100       101       102       103       104 
## 0.1333333 0.7592593 0.7592593 0.5294118 0.1333333 0.1333333 0.1333333 0.7592593 
##       105       106       107       108       109       110       111       112 
## 0.7592593 0.1333333 0.2115385 0.7592593 0.1333333 0.7592593 0.7592593 0.1333333 
##       113       114       115       116       117       118       119       120 
## 0.1333333 0.5000000 0.7592593 0.5294118 0.7592593 0.2115385 0.7592593 0.7592593 
##       121       122       123       124       125       126       127       128 
## 0.7592593 0.2115385 0.7592593 0.2115385 0.5294118 0.1333333 0.1333333 0.7592593 
##       129       130 
## 0.5294118 0.7592593

En este reporte se presenta el resultado de un modelo de clasificación binaria que asigna cada una de las 130 observaciones a una de las dos clases posibles: la clase 1, que representa el resultado positivo de interés, y la clase 0, que representa el resultado negativo. El modelo estima la probabilidad de que cada observación pertenezca a la clase 1, basándose en las características de las mismas. Estas probabilidades se pueden ver como el grado de confianza que tiene el modelo en asignar cada observación a la clase 1. A mayor probabilidad, mayor confianza. A menor probabilidad, menor confianza.

Para facilitar la interpretación de las probabilidades, se usa un umbral de probabilidad que determina a qué clase se asigna cada observación. Si la probabilidad es mayor o igual que el umbral, se asigna la observación a la clase 1. Si la probabilidad es menor que el umbral, se asigna la observación a la clase 0. El valor del umbral puede variar según el criterio que se quiera aplicar, pero un valor común es 0.5. En este reporte se usa ese valor como umbral de probabilidad.

# Matriz de confusión
with(grupo_seleccionado[test,], table(prediccion, treatment))
##                    treatment
## prediccion           0  1
##   0.133333333333333 21  2
##   0.211538461538462 18  5
##   0.363636363636364  2  3
##   0.5                4  1
##   0.529411764705882  6  9
##   0.759259259259259 17 42