Vector de medias

#leer las primeras 10 filas de la base
library(readr)
datos <- read_csv("BMIData.csv")
## Rows: 516 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (4): EpiUnderweight, EpiHealthyWeight, EpiOverweight, EpiObese
## 
## ℹ 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.
head(datos,10)
## # A tibble: 10 × 4
##    EpiUnderweight EpiHealthyWeight EpiOverweight EpiObese
##             <dbl>            <dbl>         <dbl>    <dbl>
##  1              2              334            54       28
##  2              5              301            63       42
##  3             12              728           133      106
##  4             17              681           124      114
##  5             17             1361           231      155
##  6             24             1365           244      219
##  7             57             2280           319      287
##  8             72             2231           347      281
##  9             10              634           125      107
## 10             23              611           126      105
# Calcular el vector de medias
mean_vector <- colMeans(datos)

# Imprimir el resultado
print(mean_vector)
##   EpiUnderweight EpiHealthyWeight    EpiOverweight         EpiObese 
##         21.74225       1304.72093        208.10271        175.56395

Estos resultados muestran la media de diferentes variables que estan relacionadas con lo que el índice de masa corporal. Para EpiOverweight (Niños con sobrepeso) el promedio de niños con sobrepeso es de 208.10271, para EpiUnderweight (Niños con indice de masa corporal bajo) el promedio fue de 21.74225, para EpiHealthyWeight(Niños con peso saludable) el promedio es de 1304.72093 esto es un numero considerablemente alto esto significa que esta en un rando de peso adecuado, para EpiObese (Niños con obesidad) el promedio es de 175.5639 este valor esta cercano al sobrepeso al ser alto.

# Cargar reticulate
import pandas as pd

df = pd.read_csv('BMIData.csv')
print(df.head())
##    EpiUnderweight  EpiHealthyWeight  EpiOverweight  EpiObese
## 0               2               334             54        28
## 1               5               301             63        42
## 2              12               728            133       106
## 3              17               681            124       114
## 4              17              1361            231       155
# Vector de Medias
vector_medias=df.mean()
print("Vector de Medias:",vector_medias)
## Vector de Medias: EpiUnderweight        21.742248
## EpiHealthyWeight    1304.720930
## EpiOverweight        208.102713
## EpiObese             175.563953
## dtype: float64

Matriz de Varianzas y Covarianzas

#matriz de varianzas y covarianzas
cov_matrix <- cov(datos)
det(cov_matrix)
## [1] 1.652975e+14
# Imprimir la matriz
print(cov_matrix)
##                  EpiUnderweight EpiHealthyWeight EpiOverweight   EpiObese
## EpiUnderweight         635.3956         22132.66      3176.211   2831.753
## EpiHealthyWeight     22132.6580       1218616.56    181946.736 158157.340
## EpiOverweight         3176.2110        181946.74     27953.327  24243.010
## EpiObese              2831.7534        158157.34     24243.010  21857.369

Para nuestras varianzas

.EpiUnderweight (Nilños con Indice de Masa Corporal baja) es de 635.40 indica que los valores de esta variable tiene una baja dispersion

.EpiHealthyWeight(Niños con peso saludable) es de 1218616.56 lo que significa que tiene una varianza alta lo que inidca que existen una gran cantidad de niños que tienen peso saludable

.EpiOverweight(Niños con sobrepeso Indice de Masa Corporal) su varianza fue de 27953.327 lo que inidca que hay una dispesion significativa(acumulacion de grandes cantidades de datos)al igual que EpiObese que fue de 21857.369

Para las covarianzas

EpiHealthyWeight(Niños con peso saludable) y EpiOverweight(Niños con sobrepeso Indice de Masa Corporal) su covarianza es de 181946.74 por lo que tiene covarianza positiva y alta lo que significa que a medida que aumenta la cantidad de niños con peso saludable tambien aumenta la cantidad de niños con sobrepeso

EpiOverweight(Niños con sobrepeso Indice de Masa Corporal) y EpiObese (Niños con obesidad) su covarianza es de 24243.01, tienen covarianza positiva por lo que existe una relacion entre el sobrepeso y la obesidad

EpiUnderweight (Nilños con Indice de Masa Corporal baja) y otras categorias antes mencionada tiene covarianza relativamente bajos por lo que el bajo peso no tiene una relacion tan fuerte con las demas categorias.

# Matriz de Covarianzas
cov_matrix = df.cov()
print("\nMatriz de Covarianzas:\n", cov_matrix)
## 
## Matriz de Covarianzas:
##                    EpiUnderweight  ...       EpiObese
## EpiUnderweight        635.395571  ...    2831.753409
## EpiHealthyWeight    22132.658027  ...  158157.340212
## EpiOverweight        3176.210992  ...   24243.009923
## EpiObese             2831.753409  ...   21857.368718
## 
## [4 rows x 4 columns]

Matriz de Correlaciones

#matriz de correlaciones
cor_matrix <- cor(datos)

# Imprimir la matriz
print(cor_matrix)
##                  EpiUnderweight EpiHealthyWeight EpiOverweight  EpiObese
## EpiUnderweight        1.0000000        0.7953860     0.7536514 0.7598614
## EpiHealthyWeight      0.7953860        1.0000000     0.9858117 0.9690739
## EpiOverweight         0.7536514        0.9858117     1.0000000 0.9807783
## EpiObese              0.7598614        0.9690739     0.9807783 1.0000000

EpiUnderweight (Nilños con Indice de Masa Corporal baja) y EpiHealthyWeight(Niños con peso saludable) tiene una correlacion de 0.7953 lo que significa que existe una correlacion fuerte positiva por lo que si EpiUnderweight (Nilños con Indice de Masa Corporal baja) aumenta entonces EpiHealthyWeight(Niños con peso saludable) aumenta tambien.

EpiHealthyWeight(Niños con peso saludable) y EpiOverweight(Niños con sobrepeso Indice de Masa Corporal) tienen una correlacion de 0.9858 por lo que estan fuertemente relacionadas ya que es muy cercano a 1

EpiOverweight(Niños con sobrepeso Indice de Masa Corporal) y EpiObese (Niños con obesidad) tienen una correlacion de 0.9808 por lo que tambien indica una fuerte relacion positiva.

# Matriz de Correlaciones

corr_matrix = df.corr()
print("\nMatriz de Correlaciones:\n", corr_matrix)
## 
## Matriz de Correlaciones:
##                    EpiUnderweight  EpiHealthyWeight  EpiOverweight  EpiObese
## EpiUnderweight          1.000000          0.795386       0.753651  0.759861
## EpiHealthyWeight        0.795386          1.000000       0.985812  0.969074
## EpiOverweight           0.753651          0.985812       1.000000  0.980778
## EpiObese                0.759861          0.969074       0.980778  1.000000

Matriz de Correlaciones Parciales

library(ppcor)
## Warning: package 'ppcor' was built under R version 4.3.3
## Loading required package: MASS
## Warning: package 'MASS' was built under R version 4.3.2
# matriz de correlaciones parciales
partial_cor_matrix <- pcor(datos)$estimate

# Imprimir la matriz
print(partial_cor_matrix)
##                  EpiUnderweight EpiHealthyWeight EpiOverweight    EpiObese
## EpiUnderweight        1.0000000       0.47155146    -0.3233382  0.14728222
## EpiHealthyWeight      0.4715515       1.00000000     0.7653536 -0.01056794
## EpiOverweight        -0.3233382       0.76535364     1.0000000  0.62277855
## EpiObese              0.1472822      -0.01056794     0.6227785  1.00000000

EpiUnderweight (Nilños con Indice de Masa Corporal baja) y EpiHealthyWeight(Niños con peso saludable) tiene una correlacion de 0.4715 por lo que existe casi una correlacion moderada positiva por lo que seria una correlacion debil

EpiUnderweight (Nilños con Indice de Masa Corporal baja) y EpiOverweight(Niños con sobrepeso Indice de Masa Corporal) tienen una correlacion de -0.3233 por lo que tienen una relacion negativa baja por que una aumenta la otra tiende a disminuir

EpiOverweight(Niños con sobrepeso Indice de Masa Corporal) y EpiObese (Niños con obesidad) tienen una correlacion de 0.6227 por lo que tienen una correlacion positiva fuerte ya que pasa de 0.5, así que decimos que estas dos variables estan relacionadas fuertemente

EpiHealthyWeight(Niños con peso saludable) y EpiObese (Niños con obesidad) tienen una correlacion de -0.0106 por lo que existe una correlacion negativa demasiado debil, casi nula (no hay correlacion), por lo que no existe relacion directa.

Para mayor comprension los visualizaremos por medio de una mapa de calor

library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.3.3
## Loading required package: ggplot2
ggcorrplot(partial_cor_matrix, lab = TRUE)

#import pandas as pd
#import numpy as np
#import pingouin as pg

#corrp= pg.pairwise_corr(df,x=df['EpiUnderweight'],y=df['EpiHealthyWeight'],covar#=[['EpiOverweight ','EpiObese']],method='pearson')

Outliers Multivariante

# Calcular la distancia de Mahalanobis

# Matriz de covarianza
cov_matrix <- cov(datos) 

 # Media de cada columna
center <- colMeans(datos)

#Distancia de Mahalanobis
mahal_dist <- mahalanobis(datos, center, cov_matrix)


# Determinar el umbral con la distribución Chi-cuadrado (p < 0.01)
#Chi-cuadrado con un nivel de confianza del 99% 
threshold <- qchisq(0.99, df = ncol(datos))

# Identificar outliers (valores mayores al umbral)
outliers <- which(mahal_dist > threshold)

# Mostrar los outliers
print(outliers)
##  [1]  16  28  38  42 119 120 134 146 160 173 174 199 202 215 227 230 255 283 284
## [20] 286 312 339 367 383 420 422 423 424 431 432 457 458 459 460 474 486 502 513
## [39] 514

Este resultado muestra las observaciones o tambien conocidas como outliers para ellos observamos que se detectaron varios valores atipicos, por lo que estos valores se alejan significativamente del patron general de los datos. A continuacion mediante un plot los visualizaremos mejor para mayor comprension.

plot(mahal_dist, pch = 19, col = ifelse(mahal_dist > threshold, "red", "black"))
abline(h = threshold, col = "blue", lty = 2)

El eje x (Index) representa el Indice de cada observación en el conjunto de los datos, el eje y (maha_dist) representa la distancia de Mahalanobis para cada observacion. Los puntos de color rojo son los outliers que representan datos atípicos y los puntos negros que son observaciones dentro de umbral o datos relevantes para el analisis. La linea que se observa de azul punteada representa el umbral de corte.

import pandas as pd
import numpy as np
from scipy.spatial.distance import mahalanobis
from scipy.stats import chi2


# Calcular la matriz de covarianza e inversa
inv_cov_matrix = np.linalg.inv(cov_matrix)


# Calcular la distancia de Mahalanobis para cada fila
mahal_dist = df.apply(lambda row: mahalanobis(row, vector_medias, inv_cov_matrix), axis=1)

# Determinar el umbral con la distribución Chi-cuadrado (p < 0.01 = 99% de confianza)
threshold = chi2.ppf(0.99, df.shape[1])

# Identificar outliers
outliers = df[mahal_dist > threshold]

print(outliers)
## Empty DataFrame
## Columns: [EpiUnderweight, EpiHealthyWeight, EpiOverweight, EpiObese]
## Index: []

Se calcula la Distancia de Mahalanobis para detectar lo que son valores atípicos en este conjunto de datos que son númericos ya que se esta estudiando el Análisis Multivariante.

Matriz de Distancias Euclideas

# Calcular la matriz de distancias euclidianas
euclidean_matrix <- as.matrix(dist(datos, method = "euclidean"))

# Imprimir la matriz
print(euclidean_matrix[1:10, 1:10])
##             1          2          3          4          5          6          7
## 1     0.00000   37.08099  409.46428  364.59567 1049.95809 1065.84520 1981.72829
## 2    37.08099    0.00000  437.46314  391.72567 1079.22982 1093.86791 2011.14544
## 3   409.46428  437.46314    0.00000   48.77499  642.43210  656.50819 1574.19376
## 4   364.59567  391.72567   48.77499    0.00000  689.58683  702.37454 1620.60328
## 5  1049.95809 1079.22982  642.43210  689.58683    0.00000   65.80274  933.45005
## 6  1065.84520 1093.86791  656.50819  702.37454   65.80274    0.00000  921.17479
## 7  1981.72829 2011.14544 1574.19376 1620.60328  933.45005  921.17479    0.00000
## 8  1937.36083 1966.51112 1529.38877 1575.79916  888.40137  875.62149   58.70264
## 9   318.34887  344.93913   94.36631   48.04165  736.28663  749.17421 1667.80125
## 10  297.12455  323.05108  117.72850   70.85901  758.98682  771.64564 1690.29287
##             8          9         10
## 1  1937.36083  318.34887  297.12455
## 2  1966.51112  344.93913  323.05108
## 3  1529.38877   94.36631  117.72850
## 4  1575.79916   48.04165   70.85901
## 5   888.40137  736.28663  758.98682
## 6   875.62149  749.17421  771.64564
## 7    58.70264 1667.80125 1690.29287
## 8     0.00000 1622.90265 1645.18023
## 9  1622.90265    0.00000   26.51415
## 10 1645.18023   26.51415    0.00000

Al observar la matriz podemos tomar la observacion tiene una distancia de 37.08099 con la observacion 2 que indican que con relativamente cercanas al igual la observacion 1 tiene una distancia de 409.46428. En cambio si tomamos la distancia entre la observacion 1 y la observacion 7 es de 1981.72829 lo que nos indica una diferencia mucho mas grande.

Al ver la matriz en la diagonal son ceros ya que la distancia que existe de una observacion con ella misma siempre es cero.

import pandas as pd
import numpy as np
from scipy.spatial.distance import pdist, squareform

# Calcular la matriz de distancias euclidianas
euclidean_matrix = squareform(pdist(df, metric='euclidean'))

# Imprimir la matriz
print(euclidean_matrix)
## [[   0.           37.08099244  409.46428416 ... 3908.34786067
##   1971.93255463 1999.70047757]
##  [  37.08099244    0.          437.4631413  ... 3937.10070991
##   2000.56616986 2028.11809321]
##  [ 409.46428416  437.4631413     0.         ... 3499.75056254
##   1563.1420281  1590.88497384]
##  ...
##  [3908.34786067 3937.10070991 3499.75056254 ...    0.
##   1937.96568597 1909.6169773 ]
##  [1971.93255463 2000.56616986 1563.1420281  ... 1937.96568597
##      0.           67.85278181]
##  [1999.70047757 2028.11809321 1590.88497384 ... 1909.6169773
##     67.85278181    0.        ]]

Varianza Generalizada

# Matriz de covarianza
cov_matrix <- cov(datos)

# Calcular la varianza generalizada (determinante de la matriz de covarianza)
generalized_variance <- det(cov_matrix)

# Imprimir el resultado
print(generalized_variance)
## [1] 1.652975e+14

La varianza genaralizada mide lo que es la dispersion total en un conjunto de variables multivariantes. El resultado que nos dio es de 1.652975e+14 lo que significa que existe una gran dispersion en los datos ya que si un valor es muy alto puede indicar que los datos tienen una alta variabilidad, por otro lado un valor cercano a cero sigifica que hay colinealidad(dos o maá variables están correlacionadas entre si) o dependencia entre las variables.

import pandas as pd
import numpy as np

# Calcular la varianza generalizada (determinante de la matriz de covarianza)
generalized_variance = np.linalg.det(cov_matrix)

# Imprimir el resultado
print(generalized_variance)
## 165297532592680.78