#leer las primeras 10 filas de la base
library(readr)
winequality_white <- read_delim("Rstudio/winequality-white.csv",
delim = ";", escape_double = FALSE, trim_ws = TRUE)
## Rows: 4898 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## dbl (12): fixed acidity, volatile acidity, citric acid, residual sugar, chlo...
##
## ℹ 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.
View(winequality_white)
head(winequality_white,10)
## # A tibble: 10 × 12
## `fixed acidity` `volatile acidity` `citric acid` `residual sugar` chlorides
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 7 0.27 0.36 20.7 0.045
## 2 6.3 0.3 0.34 1.6 0.049
## 3 8.1 0.28 0.4 6.9 0.05
## 4 7.2 0.23 0.32 8.5 0.058
## 5 7.2 0.23 0.32 8.5 0.058
## 6 8.1 0.28 0.4 6.9 0.05
## 7 6.2 0.32 0.16 7 0.045
## 8 7 0.27 0.36 20.7 0.045
## 9 6.3 0.3 0.34 1.6 0.049
## 10 8.1 0.22 0.43 1.5 0.044
## # ℹ 7 more variables: `free sulfur dioxide` <dbl>,
## # `total sulfur dioxide` <dbl>, density <dbl>, pH <dbl>, sulphates <dbl>,
## # alcohol <dbl>, quality <dbl>
sum(is.na(winequality_white))
## [1] 0
Como se puede observar no hay datos perdidos entonces podemos proceder con los analisis
# Eliminar la columna 'quality'
winequality_white <- subset(winequality_white, select = -quality)
# Verificar que la columna se eliminó
head(winequality_white)
## # A tibble: 6 × 11
## `fixed acidity` `volatile acidity` `citric acid` `residual sugar` chlorides
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 7 0.27 0.36 20.7 0.045
## 2 6.3 0.3 0.34 1.6 0.049
## 3 8.1 0.28 0.4 6.9 0.05
## 4 7.2 0.23 0.32 8.5 0.058
## 5 7.2 0.23 0.32 8.5 0.058
## 6 8.1 0.28 0.4 6.9 0.05
## # ℹ 6 more variables: `free sulfur dioxide` <dbl>,
## # `total sulfur dioxide` <dbl>, density <dbl>, pH <dbl>, sulphates <dbl>,
## # alcohol <dbl>
#Vector de medias
# Calcular el vector de medias
vector_de_media <- colMeans(winequality_white)
# Imprimir el resultado
print(vector_de_media)
## fixed acidity volatile acidity citric acid
## 6.85478767 0.27824112 0.33419151
## residual sugar chlorides free sulfur dioxide
## 6.39141486 0.04577236 35.30808493
## total sulfur dioxide density pH
## 138.36065741 0.99402738 3.18826664
## sulphates alcohol
## 0.48984688 10.51426705
El análisis del vector de medias de la base de datos Wine Quality - White Wine muestra que los vinos blancos en la muestra tienen una acidez moderada (pH = 3.19) y un ligero dulzor (azúcar residual = 6.39 g/L), con un contenido alcohólico promedio del 10.51%. La acidez volátil es baja (0.278 g/L), lo que contribuye a una buena estabilidad aromática.
Los niveles de dióxido de azufre libre (35.31 mg/L) y total (138.36 mg/L) están dentro de los rangos habituales para la conservación del vino, y la densidad promedio (0.9940 g/cm³) es la esperada en vinos blancos ligeros.
En términos de calidad, la puntuación promedio es de 5.88, lo que indica que la mayoría de los vinos son aceptables. En general, estos vinos presentan un perfil equilibrado y acorde con los estándares enológicos.
import pandas as pd
# Cargar la base de datos
wine_data = pd.read_csv("Rstudio/winequality-white.csv", delimiter=";")
# Ver las primeras filas para confirmar que se cargó correctamente
print(wine_data.head(10))
## fixed acidity volatile acidity citric acid ... sulphates alcohol quality
## 0 7.0 0.27 0.36 ... 0.45 8.8 6
## 1 6.3 0.30 0.34 ... 0.49 9.5 6
## 2 8.1 0.28 0.40 ... 0.44 10.1 6
## 3 7.2 0.23 0.32 ... 0.40 9.9 6
## 4 7.2 0.23 0.32 ... 0.40 9.9 6
## 5 8.1 0.28 0.40 ... 0.44 10.1 6
## 6 6.2 0.32 0.16 ... 0.47 9.6 6
## 7 7.0 0.27 0.36 ... 0.45 8.8 6
## 8 6.3 0.30 0.34 ... 0.49 9.5 6
## 9 8.1 0.22 0.43 ... 0.45 11.0 6
##
## [10 rows x 12 columns]
# Vector de Medias
vector_medias=wine_data.mean()
print("Vector de Medias:",vector_medias)
## Vector de Medias: fixed acidity 6.854788
## volatile acidity 0.278241
## citric acid 0.334192
## residual sugar 6.391415
## chlorides 0.045772
## free sulfur dioxide 35.308085
## total sulfur dioxide 138.360657
## density 0.994027
## pH 3.188267
## sulphates 0.489847
## alcohol 10.514267
## quality 5.877909
## dtype: float64
# Eliminar la columna 'quality'
wine_data = wine_data.drop(columns=['quality'])
# Verificar que la columna se eliminó
print(wine_data.head())
## fixed acidity volatile acidity citric acid ... pH sulphates alcohol
## 0 7.0 0.27 0.36 ... 3.00 0.45 8.8
## 1 6.3 0.30 0.34 ... 3.30 0.49 9.5
## 2 8.1 0.28 0.40 ... 3.26 0.44 10.1
## 3 7.2 0.23 0.32 ... 3.19 0.40 9.9
## 4 7.2 0.23 0.32 ... 3.19 0.40 9.9
##
## [5 rows x 11 columns]
#matriz de varianzas y covarianzas
matrix_de_covarianza <- cov(winequality_white)
det(matrix_de_covarianza )
## [1] 1.701408e-11
# Imprimir la matriz
print(matrix_de_covarianza )
## fixed acidity volatile acidity citric acid
## fixed acidity 0.7121135857 -1.930571e-03 0.0295325116
## volatile acidity -0.0019305706 1.015954e-02 -0.0018232776
## citric acid 0.0295325116 -1.823278e-03 0.0146457930
## residual sugar 0.3810218137 3.286533e-02 0.0578289265
## chlorides 0.0004256255 1.552775e-04 0.0003023838
## free sulfur dioxide -0.7089186424 -1.663005e-01 0.1936297767
## total sulfur dioxide 3.2660133926 3.823539e-01 0.6229887081
## density 0.0006696773 8.173933e-06 0.0000541138
## pH -0.0542648260 -4.857531e-04 -0.0029923451
## sulphates -0.0016509923 -4.109902e-04 0.0008608829
## alcohol -0.1255328219 8.399723e-03 -0.0112782389
## residual sugar chlorides free sulfur dioxide
## fixed acidity 0.381021814 4.256255e-04 -0.708918642
## volatile acidity 0.032865334 1.552775e-04 -0.166300459
## citric acid 0.057828926 3.023838e-04 0.193629777
## residual sugar 25.725770164 9.827502e-03 25.800577899
## chlorides 0.009827502 4.773337e-04 0.037674498
## free sulfur dioxide 25.800577899 3.767450e-02 289.242719999
## total sulfur dioxide 86.531302970 1.846875e-01 444.865890947
## density 0.012727165 1.680754e-05 0.014965532
## pH -0.148683661 -2.983649e-04 -0.001586555
## sulphates -0.015434743 4.179687e-05 0.114937934
## alcohol -2.812740332 -9.684235e-03 -5.234508674
## total sulfur dioxide density pH
## fixed acidity 3.26601339 6.696773e-04 -5.426483e-02
## volatile acidity 0.38235390 8.173933e-06 -4.857531e-04
## citric acid 0.62298871 5.411380e-05 -2.992345e-03
## residual sugar 86.53130297 1.272717e-02 -1.486837e-01
## chlorides 0.18468749 1.680754e-05 -2.983649e-04
## free sulfur dioxide 444.86589095 1.496553e-02 -1.586555e-03
## total sulfur dioxide 1806.08549085 6.735203e-02 1.489422e-02
## density 0.06735203 8.945524e-06 -4.226861e-05
## pH 0.01489422 -4.226861e-05 2.280118e-02
## sulphates 0.65264458 2.542747e-05 2.687523e-03
## alcohol -23.47660460 -2.871430e-03 2.256505e-02
## sulphates alcohol
## fixed acidity -1.650992e-03 -0.125532822
## volatile acidity -4.109902e-04 0.008399723
## citric acid 8.608829e-04 -0.011278239
## residual sugar -1.543474e-02 -2.812740332
## chlorides 4.179687e-05 -0.009684235
## free sulfur dioxide 1.149379e-01 -5.234508674
## total sulfur dioxide 6.526446e-01 -23.476604603
## density 2.542747e-05 -0.002871430
## pH 2.687523e-03 0.022565052
## sulphates 1.302471e-02 -0.002448356
## alcohol -2.448356e-03 1.514426982
La matriz de varianzas y covarianzas nos cuenta que el total de SO₂ tiene una varianza muy alta, de alrededor de 444, lo que indica que sus valores se dispersan mucho más que los de otras variables. En contraste, variables como el pH y el alcohol muestran varianzas bajas, lo que significa que sus mediciones están más concentradas alrededor de sus promedios. Mientras que la covarianza negativa entre el pH y la acidez fija confirma que a medida que la acidez aumenta, el pH disminuye. También destaca la alta covarianza entre el SO₂ libre y el total, lo que indica que ambos compuestos varían de forma muy similar en la muestra. Estos datos nos ayudan a ver que, pese a las diferencias en dispersión, existen relaciones consistentes entre las variables que explican aspectos importantes de la calidad del vino.
# Matriz de Covarianzas
cov_matrix = wine_data.cov()
print("\nMatriz de Covarianzas:\n", cov_matrix)
##
## Matriz de Covarianzas:
## fixed acidity volatile acidity ... sulphates alcohol
## fixed acidity 0.712114 -0.001931 ... -0.001651 -0.125533
## volatile acidity -0.001931 0.010160 ... -0.000411 0.008400
## citric acid 0.029533 -0.001823 ... 0.000861 -0.011278
## residual sugar 0.381022 0.032865 ... -0.015435 -2.812740
## chlorides 0.000426 0.000155 ... 0.000042 -0.009684
## free sulfur dioxide -0.708919 -0.166300 ... 0.114938 -5.234509
## total sulfur dioxide 3.266013 0.382354 ... 0.652645 -23.476605
## density 0.000670 0.000008 ... 0.000025 -0.002871
## pH -0.054265 -0.000486 ... 0.002688 0.022565
## sulphates -0.001651 -0.000411 ... 0.013025 -0.002448
## alcohol -0.125533 0.008400 ... -0.002448 1.514427
##
## [11 rows x 11 columns]
#matriz de correlaciones
cor_matrix <- cor(winequality_white)
# Imprimir la matriz
print(cor_matrix)
## fixed acidity volatile acidity citric acid residual sugar
## fixed acidity 1.00000000 -0.02269729 0.28918070 0.08902070
## volatile acidity -0.02269729 1.00000000 -0.14947181 0.06428606
## citric acid 0.28918070 -0.14947181 1.00000000 0.09421162
## residual sugar 0.08902070 0.06428606 0.09421162 1.00000000
## chlorides 0.02308564 0.07051157 0.11436445 0.08868454
## free sulfur dioxide -0.04939586 -0.09701194 0.09407722 0.29909835
## total sulfur dioxide 0.09106976 0.08926050 0.12113080 0.40143931
## density 0.26533101 0.02711385 0.14950257 0.83896645
## pH -0.42585829 -0.03191537 -0.16374821 -0.19413345
## sulphates -0.01714299 -0.03572815 0.06233094 -0.02666437
## alcohol -0.12088112 0.06771794 -0.07572873 -0.45063122
## chlorides free sulfur dioxide total sulfur dioxide
## fixed acidity 0.02308564 -0.0493958591 0.091069756
## volatile acidity 0.07051157 -0.0970119393 0.089260504
## citric acid 0.11436445 0.0940772210 0.121130798
## residual sugar 0.08868454 0.2990983537 0.401439311
## chlorides 1.00000000 0.1013923521 0.198910300
## free sulfur dioxide 0.10139235 1.0000000000 0.615500965
## total sulfur dioxide 0.19891030 0.6155009650 1.000000000
## density 0.25721132 0.2942104109 0.529881324
## pH -0.09043946 -0.0006177961 0.002320972
## sulphates 0.01676288 0.0592172458 0.134562367
## alcohol -0.36018871 -0.2501039415 -0.448892102
## density pH sulphates alcohol
## fixed acidity 0.26533101 -0.4258582910 -0.01714299 -0.12088112
## volatile acidity 0.02711385 -0.0319153683 -0.03572815 0.06771794
## citric acid 0.14950257 -0.1637482114 0.06233094 -0.07572873
## residual sugar 0.83896645 -0.1941334540 -0.02666437 -0.45063122
## chlorides 0.25721132 -0.0904394560 0.01676288 -0.36018871
## free sulfur dioxide 0.29421041 -0.0006177961 0.05921725 -0.25010394
## total sulfur dioxide 0.52988132 0.0023209718 0.13456237 -0.44889210
## density 1.00000000 -0.0935914935 0.07449315 -0.78013762
## pH -0.09359149 1.0000000000 0.15595150 0.12143210
## sulphates 0.07449315 0.1559514973 1.00000000 -0.01743277
## alcohol -0.78013762 0.1214320987 -0.01743277 1.00000000
Este análisis de correlaciones nos da una idea clara de cómo se relacionan las distintas propiedades del vino. Uno de los hallazgos más fuertes es que el azúcar residual tiene una alta relación con la densidad (0.8389), lo que indica que vinos más dulces tienden a ser más densos. En contraste, el alcohol muestra una relación inversa con la densidad (-0.7801) y con el azúcar residual (-0.4506), lo que sugiere que los vinos con mayor contenido alcohólico suelen ser menos densos y menos dulces. Esto tiene sentido, ya que durante la fermentación, el azúcar se convierte en alcohol, reduciendo la cantidad de azúcar residual y, por ende, la densidad del vino.
Otro punto interesante es la relación entre el pH y la acidez fija (-0.4258), donde un pH más alto (menos ácido) está asociado con una menor acidez fija, lo que es común en la química del vino. Además, aunque en menor medida, la cantidad de dióxido de azufre total parece influir en la densidad (0.5298), lo que podría estar relacionado con su papel en la conservación del vino. Finalmente, aunque los sulfatos y el alcohol tienen una leve relación positiva (0.1559), su impacto no es tan significativo. En general, estos patrones ayudan a entender mejor la composición del vino y cómo los distintos componentes afectan sus propiedades.
# Matriz de Correlaciones
corr_matrix = wine_data.corr()
print("\nMatriz de Correlaciones:\n", corr_matrix)
##
## Matriz de Correlaciones:
## fixed acidity volatile acidity ... sulphates alcohol
## fixed acidity 1.000000 -0.022697 ... -0.017143 -0.120881
## volatile acidity -0.022697 1.000000 ... -0.035728 0.067718
## citric acid 0.289181 -0.149472 ... 0.062331 -0.075729
## residual sugar 0.089021 0.064286 ... -0.026664 -0.450631
## chlorides 0.023086 0.070512 ... 0.016763 -0.360189
## free sulfur dioxide -0.049396 -0.097012 ... 0.059217 -0.250104
## total sulfur dioxide 0.091070 0.089261 ... 0.134562 -0.448892
## density 0.265331 0.027114 ... 0.074493 -0.780138
## pH -0.425858 -0.031915 ... 0.155951 0.121432
## sulphates -0.017143 -0.035728 ... 1.000000 -0.017433
## alcohol -0.120881 0.067718 ... -0.017433 1.000000
##
## [11 rows x 11 columns]
library(ppcor)
## Warning: package 'ppcor' was built under R version 4.3.3
## Loading required package: MASS
# Instalar y cargar el paquete ppcor
#install.packages("ppcor")
library(ppcor)
# Calcular la matriz de correlaciones parciales
matriz_cor_parcial <- pcor(winequality_white)$estimate
# Mostrar la matriz de correlaciones parciales
print(matriz_cor_parcial)
## fixed acidity volatile acidity citric acid residual sugar
## fixed acidity 1.0000000000 -0.09177263 0.12265107 -0.67491264
## volatile acidity -0.0917726327 1.00000000 -0.17348652 -0.06557784
## citric acid 0.1226510715 -0.17348652 1.00000000 -0.04507215
## residual sugar -0.6749126426 -0.06557784 -0.04507215 1.00000000
## chlorides -0.1709109899 0.09904437 0.10690945 -0.19717515
## free sulfur dioxide -0.0006842353 -0.18930514 0.03657815 0.17843406
## total sulfur dioxide -0.0388679308 0.19763096 0.04063530 -0.13361933
## density 0.7043664073 0.10614760 0.06764097 0.94153651
## pH -0.6661276194 -0.10955425 -0.08255467 -0.63555052
## sulphates -0.1765522452 -0.06548969 0.04088718 -0.26691222
## alcohol 0.6045902659 0.18100688 0.09410972 0.78095720
## chlorides free sulfur dioxide total sulfur dioxide
## fixed acidity -0.170910990 -0.0006842353 -0.038867931
## volatile acidity 0.099044371 -0.1893051352 0.197630961
## citric acid 0.106909446 0.0365781543 0.040635296
## residual sugar -0.197175153 0.1784340632 -0.133619329
## chlorides 1.000000000 0.0292937057 0.009562664
## free sulfur dioxide 0.029293706 1.0000000000 0.593206957
## total sulfur dioxide 0.009562664 0.5932069568 1.000000000
## density 0.163780328 -0.1555386433 0.196045940
## pH -0.164066249 0.0520636863 -0.019294025
## sulphates -0.037354845 0.0104257743 0.069470082
## alcohol -0.008965184 -0.0992961359 0.041463583
## density pH sulphates alcohol
## fixed acidity 0.70436641 -0.66612762 -0.17655225 0.604590266
## volatile acidity 0.10614760 -0.10955425 -0.06548969 0.181006877
## citric acid 0.06764097 -0.08255467 0.04088718 0.094109718
## residual sugar 0.94153651 -0.63555052 -0.26691222 0.780957197
## chlorides 0.16378033 -0.16406625 -0.03735485 -0.008965184
## free sulfur dioxide -0.15553864 0.05206369 0.01042577 -0.099296136
## total sulfur dioxide 0.19604594 -0.01929403 0.06947008 0.041463583
## density 1.00000000 0.62772454 0.26821045 -0.886725282
## pH 0.62772454 1.00000000 -0.06069657 0.565640272
## sulphates 0.26821045 -0.06069657 1.00000000 0.246627014
## alcohol -0.88672528 0.56564027 0.24662701 1.000000000
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(matriz_cor_parcial, lab = TRUE)
La matriz de correlación parcial nos permite analizar la relación entre dos variables eliminando el efecto de las demás, ayudando a identificar conexiones directas y evitando correlaciones engañosas. Es útil porque permite comprender mejor la influencia real de cada factor en un conjunto de datos.
En esta matriz, la relación más fuerte es entre residual sugar y density (0.94), lo que indica que el azúcar residual tiene un impacto directo en la densidad del vino, ya que a mayor cantidad de azúcar, mayor es la densidad. También destaca la relación negativa entre alcohol y density (-0.86), lo que significa que los vinos con mayor contenido de alcohol tienden a ser menos densos. Estos resultados permiten entender mejor cómo se comportan las variables y ayudan en la toma de decisiones en la producción y análisis del vino.
import pingouin as pg
# Calcular la matriz de correlaciones parciales
matriz_cor_parcial = pg.pairwise_corr(wine_data, method='pearson').round(3)
# Mostrar la matriz de correlaciones parciales
print(matriz_cor_parcial)
## X Y ... BF10 power
## 0 fixed acidity volatile acidity ... 0.063 0.355
## 1 fixed acidity citric acid ... 1.149e+91 1.000
## 2 fixed acidity residual sugar ... 5.108e+06 1.000
## 3 fixed acidity chlorides ... 0.066 0.365
## 4 fixed acidity free sulfur dioxide ... 7.066 0.933
## 5 fixed acidity total sulfur dioxide ... 1.27e+07 1.000
## 6 fixed acidity density ... 6.809e+75 1.000
## 7 fixed acidity pH ... 8.1e+210 1.000
## 8 fixed acidity sulphates ... 0.037 0.224
## 9 fixed acidity alcohol ... 7.876e+13 1.000
## 10 volatile acidity citric acid ... 1.842e+22 1.000
## 11 volatile acidity residual sugar ... 450.842 0.995
## 12 volatile acidity chlorides ... 3547.482 0.999
## 13 volatile acidity free sulfur dioxide ... 2.004e+08 1.000
## 14 volatile acidity total sulfur dioxide ... 5.677e+06 1.000
## 15 volatile acidity density ... 0.108 0.475
## 16 volatile acidity pH ... 0.217 0.608
## 17 volatile acidity sulphates ... 0.408 0.706
## 18 volatile acidity alcohol ... 1372.676 0.997
## 19 citric acid residual sugar ... 5.341e+07 1.000
## 20 citric acid chlorides ... 1.755e+12 1.000
## 21 citric acid free sulfur dioxide ... 5.018e+07 1.000
## 22 citric acid total sulfur dioxide ... 9.151e+13 1.000
## 23 citric acid density ... 1.885e+22 1.000
## 24 citric acid pH ... 1.372e+27 1.000
## 25 citric acid sulphates ... 245.408 0.992
## 26 citric acid alcohol ... 2.318e+04 1.000
## 27 residual sugar chlorides ... 4.409e+06 1.000
## 28 residual sugar free sulfur dioxide ... 7.049e+97 1.000
## 29 residual sugar total sulfur dioxide ... 1.005e+185 1.000
## 30 residual sugar density ... inf 1.000
## 31 residual sugar pH ... 1.199e+39 1.000
## 32 residual sugar sulphates ... 0.102 0.463
## 33 residual sugar alcohol ... 2.992e+239 1.000
## 34 chlorides free sulfur dioxide ... 1.717e+09 1.000
## 35 chlorides total sulfur dioxide ... 1.426e+41 1.000
## 36 chlorides density ... 9.855e+70 1.000
## 37 chlorides pH ... 9.573e+06 1.000
## 38 chlorides sulphates ... 0.036 0.217
## 39 chlorides alcohol ... 8.451e+145 1.000
## 40 free sulfur dioxide total sulfur dioxide ... inf 1.000
## 41 free sulfur dioxide density ... 2.943e+94 1.000
## 42 free sulfur dioxide pH ... 0.018 0.050
## 43 free sulfur dioxide sulphates ... 96.871 0.986
## 44 free sulfur dioxide alcohol ... 7.912e+66 1.000
## 45 total sulfur dioxide density ... inf 1.000
## 46 total sulfur dioxide pH ... 0.018 0.053
## 47 total sulfur dioxide sulphates ... 4.7e+17 1.000
## 48 total sulfur dioxide alcohol ... 2.465e+237 1.000
## 49 density pH ... 4.007e+07 1.000
## 50 density sulphates ... 1.468e+04 0.999
## 51 density alcohol ... inf 1.000
## 52 pH sulphates ... 2.623e+24 1.000
## 53 pH alcohol ... 1.097e+14 1.000
## 54 sulphates alcohol ... 0.038 0.230
##
## [55 rows x 10 columns]
La matriz de correlaciones parciales muestra qué tan relacionadas están algunas variables, controlando otras. Se ve que algunas relaciones son fuertes y significativas, como entre pH y alcohol o sulphates y quality, mientras que otras, como fixed acidity y volatile acidity, no parecen estar tan conectadas. También, algunos valores muy altos en BF10 indican que ciertas correlaciones son bastante confiables. En general, hay algunas relaciones clave que vale la pena considerar en el análisis.
# Calcular la distancia de Mahalanobis
# Matriz de covarianza
cov_matrix <- cov(winequality_white)
# Media de cada columna
center <- colMeans(winequality_white)
#Distancia de Mahalanobis
mahal_dist <- mahalanobis(winequality_white, 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(winequality_white))
# Identificar outliers (valores mayores al umbral)
outliers <- which(mahal_dist > threshold)
# Mostrar los outliers
print(outliers)
## [1] 18 21 24 41 42 55 99 170 179 195 196 197 208 246 295
## [16] 326 373 485 532 601 660 684 688 730 746 759 760 772 773 831
## [31] 835 860 874 927 947 949 980 981 1025 1035 1037 1041 1052 1153 1159
## [46] 1164 1218 1240 1246 1255 1256 1264 1273 1305 1370 1373 1374 1387 1395 1408
## [61] 1418 1424 1437 1456 1477 1488 1497 1527 1552 1576 1578 1579 1584 1591 1599
## [76] 1600 1639 1654 1664 1689 1723 1745 1776 1818 1836 1849 1857 1866 1887 1926
## [91] 1927 1932 1933 1952 2025 2026 2027 2051 2093 2128 2155 2163 2187 2258 2260
## [106] 2280 2287 2288 2322 2335 2337 2350 2360 2395 2404 2409 2418 2441 2442 2580
## [121] 2595 2626 2630 2635 2638 2669 2705 2706 2731 2732 2749 2751 2782 2821 2850
## [136] 2873 2875 2894 2931 3023 3044 3051 3095 3096 3098 3140 3153 3166 3219 3221
## [151] 3266 3284 3289 3308 3462 3471 3498 3521 3524 3529 3538 3572 3620 3621 3624
## [166] 3711 3736 3738 3774 3849 3862 3869 3870 3880 3902 3903 3905 3912 3916 3938
## [181] 3973 3999 4000 4001 4013 4040 4174 4214 4240 4248 4260 4300 4301 4345 4347
## [196] 4402 4474 4481 4498 4504 4566 4568 4583 4592 4598 4627 4633 4649 4650 4651
## [211] 4697 4699 4746 4793 4794 4795 4816 4846 4878 4887
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.stats import chi2
# Cargar la base de datos (si no está cargada)
wine_data = pd.read_csv("Rstudio/winequality-white.csv", delimiter=";")
# Eliminar la columna 'quality' (si es necesario)
wine_data = wine_data.drop(columns=['quality'])
# Calcular la matriz de covarianza
cov_matrix = wine_data.cov()
# Calcular la inversa de la matriz de covarianza
inv_cov_matrix = np.linalg.inv(cov_matrix)
# Calcular la media de cada variable
mean_vector = wine_data.mean()
# Calcular la distancia de Mahalanobis para cada observación
mahalanobis_dist = wine_data.apply(lambda row: np.sqrt(
(row - mean_vector).T @ inv_cov_matrix @ (row - mean_vector)
), axis=1)
# Añadir las distancias de Mahalanobis al dataframe
wine_data['Mahalanobis'] = mahalanobis_dist
# Calcular el valor crítico de chi-cuadrado
critical_value = chi2.ppf(0.975, df=wine_data.shape[1]) # 95% de confianza
# Identificar outliers
outliers = wine_data[mahalanobis_dist > critical_value]
# Mostrar los outliers
print("Número de outliers:", len(outliers))
## Número de outliers: 1
print(outliers)
## fixed acidity volatile acidity ... alcohol Mahalanobis
## 2781 7.8 0.965 ... 11.7 41.71394
##
## [1 rows x 12 columns]
python detecta un solo outliers.
# Calcular la matriz de distancias euclídeas
distancias_euclideas <- dist(winequality_white, method = "euclidean")
# Convertir a una matriz cuadrada
matriz_distancias <- as.matrix(distancias_euclideas)
# Mostrar la matriz de distancias
print(head(matriz_distancias, 10)[, 1:50])
## 1 2 3 4 5 6 7 8
## 1 0.00000 52.63918 75.81167 20.25172 20.25172 75.81167 39.62380 0.00000
## 2 52.63918 0.00000 38.89342 63.66793 63.66793 38.89342 17.35591 52.63918
## 3 75.81167 38.89342 0.00000 90.62795 90.62795 0.00000 39.05044 75.81167
## 4 20.25172 63.66793 90.62795 0.00000 0.00000 90.62795 52.84296 20.25172
## 5 20.25172 63.66793 90.62795 0.00000 0.00000 90.62795 52.84296 20.25172
## 6 75.81167 38.89342 0.00000 90.62795 90.62795 0.00000 39.05044 75.81167
## 7 39.62380 17.35591 39.05044 52.84296 52.84296 39.05044 0.00000 39.62380
## 8 0.00000 52.63918 75.81167 20.25172 20.25172 75.81167 39.62380 0.00000
## 9 52.63918 0.00000 38.89342 63.66793 63.66793 38.89342 17.35591 52.63918
## 10 48.42258 14.50939 32.52655 60.50649 60.50649 32.52655 9.42894 48.42258
## 9 10 11 12 13 14 15 16
## 1 52.63918 48.42258 113.96064 69.14224 101.24788 33.46745 4.974075 63.47159
## 2 0.00000 14.50939 69.13479 23.45476 57.07416 35.85515 51.427524 24.48949
## 3 38.89342 32.52655 39.37512 17.90880 26.70344 49.76745 76.804439 16.19028
## 4 63.66793 60.50649 128.37445 82.76180 115.48441 43.65499 18.683039 76.73750
## 5 63.66793 60.50649 128.37445 82.76180 115.48441 43.65499 18.683039 76.73750
## 6 38.89342 32.52655 39.37512 17.90880 26.70344 49.76745 76.804439 16.19028
## 7 17.35591 9.42894 75.69863 30.19406 62.88926 20.28461 39.645733 24.77362
## 8 52.63918 48.42258 113.96064 69.14224 101.24788 33.46745 4.974075 63.47159
## 9 0.00000 14.50939 69.13479 23.45476 57.07416 35.85515 51.427524 24.48949
## 10 14.50939 0.00000 68.16209 23.02703 55.31916 24.50147 48.321575 17.07121
## 17 18 19 20 21 22 23 24
## 1 75.176474 98.37769 34.28702 40.805403 98.37769 74.98054 51.80884 27.81125
## 2 36.679734 59.03576 39.17579 20.878138 59.03576 30.47931 28.81487 37.66936
## 3 6.427007 22.99019 75.36977 36.267806 22.99019 12.87314 27.83768 71.38851
## 4 88.959570 112.72946 34.37738 54.586627 112.72946 88.73119 64.64407 29.28785
## 5 88.959570 112.72946 34.37738 54.586627 112.72946 88.73119 64.64407 29.28785
## 6 6.427007 22.99019 75.36977 36.267806 22.99019 12.87314 27.83768 71.38851
## 7 37.468329 61.36878 37.85783 5.035176 61.36878 35.99824 18.61224 32.88529
## 8 75.176474 98.37769 34.28702 40.805403 98.37769 74.98054 51.80884 27.81125
## 9 36.679734 59.03576 39.17579 20.878138 59.03576 30.47931 28.81487 37.66936
## 10 30.159380 54.07543 43.42547 9.638709 54.07543 28.54598 14.83392 39.15942
## 25 26 27 28 29 30 31 32
## 1 44.75645 76.71712 32.64573 34.015318 51.18801 59.68300 38.97215 130.23460
## 2 10.22011 120.78520 25.25864 21.375474 3.86039 29.35812 14.78336 85.31590
## 3 47.48312 150.28547 49.62157 44.097989 37.82055 19.17712 46.23239 55.34220
## 4 54.30725 59.68714 42.43136 47.439440 62.23926 73.02140 51.67526 144.83490
## 5 54.30725 59.68714 42.43136 47.439440 62.23926 73.02140 51.67526 144.83490
## 6 47.48312 150.28547 49.62157 44.097989 37.82055 19.17712 46.23239 55.34220
## 7 16.27675 112.08174 12.71874 5.782572 15.01184 23.79904 12.37228 92.13975
## 8 44.75645 76.71712 32.64573 34.015318 51.18801 59.68300 38.97215 130.23460
## 9 10.22011 120.78520 25.25864 21.375474 3.86039 29.35812 14.78336 85.31590
## 10 17.78576 119.57356 18.45941 14.606069 11.44629 17.57404 17.70251 84.65175
## 33 34 35 36 37 38 39 40
## 1 73.810698 56.41385 25.42895 56.232849 32.81583 38.19766 21.18364 21.18364
## 2 36.278368 32.65451 49.51770 11.913290 20.61003 24.81158 38.97645 38.97645
## 3 5.874514 24.55687 82.81401 28.142088 52.28642 42.18959 55.26304 55.26304
## 4 87.718049 69.48300 26.78996 68.554179 43.16421 49.39684 38.26238 38.26238
## 5 87.718049 69.48300 26.78996 68.554179 43.16421 49.39684 38.26238 38.26238
## 6 5.874514 24.55687 82.81401 28.142088 52.28642 42.18959 55.26304 55.26304
## 7 36.392698 23.67998 44.46091 17.018177 14.02989 10.24228 22.71970 22.71970
## 8 73.810698 56.41385 25.42895 56.232849 32.81583 38.19766 21.18364 21.18364
## 9 36.278368 32.65451 49.51770 11.913290 20.61003 24.81158 38.97645 38.97645
## 10 29.169150 19.40803 52.18158 9.430096 20.68452 13.50560 31.08075 31.08075
## 41 42 43 44 45 46 47 48
## 1 28.27948 28.46630 23.81007 29.00362 27.80560 20.78780 43.44480 43.87991
## 2 55.48023 55.02676 31.84740 27.58894 29.07267 42.45629 88.79736 89.08972
## 3 69.51156 68.61124 63.04433 55.37955 57.36381 70.67380 113.92983 114.60372
## 4 32.81045 33.59896 32.22231 37.45610 35.64901 22.19190 25.95945 26.15140
## 5 32.81045 33.59896 32.22231 37.45610 35.64901 22.19190 25.95945 26.15140
## 6 69.51156 68.61124 63.04433 55.37955 57.36381 70.67380 113.92983 114.60372
## 7 39.92035 39.33445 24.10090 17.22087 19.09581 32.52701 77.43280 77.92198
## 8 28.27948 28.46630 23.81007 29.00362 27.80560 20.78780 43.44480 43.87991
## 9 55.48023 55.02676 31.84740 27.58894 29.07267 42.45629 88.79736 89.08972
## 10 45.51437 44.89460 31.59914 23.63363 25.57854 39.31318 84.66138 85.16781
## 49 50
## 1 23.81007 28.57687
## 2 31.84740 25.69098
## 3 63.04433 53.08637
## 4 32.22231 39.15850
## 5 32.22231 39.15850
## 6 63.04433 53.08637
## 7 24.10090 14.30440
## 8 23.81007 28.57687
## 9 31.84740 25.69098
## 10 31.59914 21.72920
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 euclídeas
distancias_euclideas = pdist(wine_data, metric='euclidean')
# Convertir a una matriz cuadrada
matriz_distancias = squareform(distancias_euclideas)
# Mostrar la matriz de distancias
print(matriz_distancias)
## [[ 0. 52.64117492 75.81184783 ... 63.92880683 68.02639121
## 78.22546926]
## [52.64117492 0. 38.8945376 ... 26.41191597 23.06180055
## 35.01531331]
## [75.81184783 38.8945376 0. ... 15.22181668 17.79651232
## 10.46740388]
## ...
## [63.92880683 26.41191597 15.22181668 ... 0. 10.66738328
## 15.47451237]
## [68.02639121 23.06180055 17.79651232 ... 10.66738328 0.
## 12.22199009]
## [78.22546926 35.01531331 10.46740388 ... 15.47451237 12.22199009
## 0. ]]
# Calcular la matriz de covarianzas
matriz_covarianza <- cov(winequality_white)
# Calcular la varianza generalizada
varianza_generalizada <- det(matriz_covarianza)
# Mostrar la varianza generalizada
print(varianza_generalizada)
## [1] 1.701408e-11
import pandas as pd
import numpy as np
# Calcular la matriz de covarianzas
matriz_covarianza = wine_data.cov()
# Calcular la varianza generalizada
varianza_generalizada = np.linalg.det(matriz_covarianza)
# Mostrar la varianza generalizada
print(varianza_generalizada)
## 1.4866507045497337e-11
Un valor alto indica que las variables tienen una dispersión amplia en este caso el valor bajo indica que las variables están más concentradas alrededor de la media.