#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
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
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
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')
# 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.
# 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. ]]
# 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