\n" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "La figura muestra los puntos en un diagrama de dispersión, y una recta. Esta recta, intuitivamente, proporciona un buen resumen de los datos, ya que las proyecciones de los puntos sobre ella indican aproximadamente la situación de los puntos en el plano. La representación es buena porque la recta pasa cerca de todos los puntos y estos se deforman poco al proyectarlos.\n", 82 | "\n", 83 | "Al proyectar cada punto sobre la recta se forma un triángulo rectángulo. La hipotenusa es la distancia del punto al origen $(x_i^Tx_i)^{1/2}$. Los catetos son la proyección del punto sobre la recta, $z_i$, y la distancia entre el punto y su proyección es $r_i$. Por el Teorema de Pitágoras tenemos $x_i^Tx_i=z_i^2+r_i^2$." 84 | ] 85 | }, 86 | { 87 | "cell_type": "markdown", 88 | "metadata": {}, 89 | "source": [ 90 | "Sumando sobre todos los puntos, tenemos $$\\sum_{i=1}^nx_i^Tx_i=\\sum_{i=1}^nz_i^2+\\sum_{i=1}^nr_i^2$$\n", 91 | "\n", 92 | "Minimizar la suma de las distancias a la recta de todos los puntos es equivalente a maximizar la suma al cuadrado de los valores de las proyecciones (pues la suma de las distancias de los puntos al origen es una constante).\n", 93 | "\n", 94 | "Ahora bien, maximizar la suma de sus cuadrados equivale a maximizar su varianza. Este resultado es intuitivo: la recta parece adecuada porque conserva lo más posible la variabilidad original de los puntos. Si consideramos una dirección de proyección perpendicular a la de la recta en esta figura, los puntos tendrían muy poca variabilidad y perderíamos la información sobre sus distancias en el espacio.\n", 95 | "\n", 96 | "En la figura anteriormente vista, **la recta no es la línea de regresión de ninguna de las variables con respecto a la otra**, que se obtienen minimizando las distancias verticales u horizontales, sino que al minimizar las distancias ortogonales o de proyección se encuentra entre ambas rectas de regresión." 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": {}, 102 | "source": [ 103 | "### De vuelta al caso general: cualquier $p\\ge 2$\n", 104 | "\n", 105 | "Este enfoque puede extenderse para obtener el mejor subespacio resumen de los datos de dimensión 2. Para ello calcularemos el plano que mejor aproxima a los puntos. Estadísticamente esto equivale a encontrar una segunda variable $z_2$, incorrelada con la anterior, y que tenga varianza máxima. \n", 106 | "\n", 107 | "En general, la componente $r$, con $r
"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "**Ejemplo.** Supongamos que se realiza una encuesta para determinar qué similitudes encuentran los consumidores entre $n$ productos. \n",
15 | "\n",
16 | "Esa información se resume en una matriz cuadrada de similitudes entre los productos. Supongamos que descubrimos que esas similitudes pueden generarse por dos motivos.\n",
17 | "\n",
18 | "Entonces, es natural suponer que los consumidores han estimado la similitud entre los dos productos utilizando esos dos motivos."
19 | ]
20 | },
21 | {
22 | "cell_type": "markdown",
23 | "metadata": {},
24 | "source": [
25 | "# Escalado multidimensional\n",
26 | "\n",
27 | "El escalado multidimensional es una generalización del análisis por componentes principales. \n",
28 | "\n",
29 | "En lugar de disponer de una matriz de observaciones por variables de tamaño $n\\times p$, como en componentes principales, se dispone de una matriz $D$, de $n\\times n$, de distancias, valores de proximidad, similaridades, o disimilaridades entre los $n$ elementos.\n",
30 | "\n",
31 | "Por ejemplo, esa matriz $D$ puede representar:\n",
32 | "\n",
33 | "1. Las similitudes o distancias entre $n$ productos fabricados por una empresa.\n",
34 | "2. Las distancias percibidas entre $n$ candidatos políticos.\n",
35 | "3. Las diferencias entre $n$ preguntas de un cuestionario.\n",
36 | "4. Las distancias o similitudes entre $n$ sectores industriales.\n",
37 | "\n",
38 | "Estas distancias en $D$ pueden haberse obtenido a partir de ciertas variables. O pueden ser el resultado de una estimación directa, por ejemplo, opiniones de ciertos jueces sobre las similaridades entre los elementos considerados. \n",
39 | "\n",
40 | "El objetivo que se pretende es representar esta matriz mediante un conjunto de variables incorrelacionadas $Y_1,Y_2,...,Y_p$ donde $p"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "# Análisis por clusters (o conglomerados)\n",
15 | "\n",
16 | "El análisis de clúster o conglomerados tiene como objetivo agrupar elementos en grupos homogéneos en función de las similitudes o similaridades entre ellos. Normalmente se agrupan las observaciones, aunque puede también aplicarse para agrupar variables. Estos métodos se conocen también con el nombre de métodos de clasificación automática o no supervisada, o de reconocimiento de patrones sin supervisión.\n",
17 | "\n",
18 | "En general existen tres métodos:\n",
19 | "\n",
20 | "* Partición de los datos:\n",
21 | " * Algoritmo k-medias\n",
22 | "* Métodos jerárquicos:\n",
23 | " * Métodos aglomerativos\n",
24 | " * Métodos divisivos\n",
25 | "* Clúster basado en modelos"
26 | ]
27 | },
28 | {
29 | "cell_type": "markdown",
30 | "metadata": {},
31 | "source": [
32 | "El análisis de conglomerados estudia tres tipos de problemas:\n",
33 | "\n",
34 | "**Partición de los datos:** Disponemos de datos que sospechamos son heterogéneos y se desea dividirlos en un número de grupos prefijado, de manera que:\n",
35 | "\n",
36 | "1. cada elemento pertenezca a uno y solo uno de los grupos.\n",
37 | "2. todo elemento quede clasificado.\n",
38 | "3. cada grupo sea internamente homogéneo.\n",
39 | "\n",
40 | "Por ejemplo: se dispone de una base de datos de compras de clientes y se desea hacer una tipología de estos clientes en función de sus pautas de consumo.\n",
41 | "\n",
42 | "Este método se basa fuertemente en la matriz de los datos.\n",
43 | "\n",
44 | "**Construcción de jerarquías:** Deseamos estructurar los elementos de un conjunto de forma jerárquica por su similitud.\n",
45 | "\n",
46 | "Por ejemplo: tenemos una encuesta de atributos de distintas profesiones y queremos ordenarlas por similitud. Una clasificación jerárquica implica que los datos se ordenan en niveles, de manera que los niveles superiores contienen a los inferiores. Este tipo de clasificación es muy frecuente en biología, al clasificar animales, plantas etc. Estrictamente, estos métodos no definen grupos, sino la estructura de asociación en cadena que pueda existir entre los elementos. Sin embargo, como veremos, la jerarquía construida permite obtener también una partición de los datos en grupos.\n",
47 | "\n",
48 | "Estos métodos se basa fuertemente en una matriz de distancias o similaridades.\n",
49 | "\n",
50 | "**Clúster basado en modelos:** En este caso, se parte de la hipótesis de que los datos han sido generados de una mixtura de distribuciones. Entonces lo que hay que estimar son los parámetros desconocidos de esta mixtura usando el método de máxima verosimilitud. Las observaciones son asignadas al grupo que tiene mayor probabilidad de haberlas generado.\n",
51 | "\n",
52 | "Estos métodos utilizan algoritmos de optimización para estimar los parámetros desconocidos."
53 | ]
54 | },
55 | {
56 | "cell_type": "markdown",
57 | "metadata": {},
58 | "source": [
59 | "## Siluetas\n",
60 | "\n",
61 | "Para saber si una solución de clústeres es apropiada o no, podemos usar las siluetas. Estas se definen de la siguiente manera:\n",
62 | "\n",
63 | "Sean $a(\\boldsymbol{x_i})$ y $b(\\boldsymbol{x_i})$ las distancias medias de la observación $\\boldsymbol{x_i}$ a todos los elementos de su grupo y a todos los elementos que no están en su grupo. Se define la *silueta* de $\\boldsymbol{x_i}$ como \n",
64 | "\n",
65 | "$$sil(\\boldsymbol{x_i})=\\frac{a(\\boldsymbol{x_i})-b(\\boldsymbol{x_i})}{\\max\\{a(\\boldsymbol{x_i}),b(\\boldsymbol{x_i})\\}}$$\n",
66 | "\n",
67 | "La silueta varía entre -1 y 1; un valor positivo significa que el elemento está bien identificado con su clúster, y un valor negativo, lo contrario.\n",
68 | "\n",
69 | "La media de las silhouettes nos da una medida global de cuán buena es la configuración (mientras más próxima a 1, mejor)."
70 | ]
71 | }
72 | ],
73 | "metadata": {
74 | "kernelspec": {
75 | "display_name": "R",
76 | "language": "R",
77 | "name": "ir"
78 | },
79 | "language_info": {
80 | "codemirror_mode": "r",
81 | "file_extension": ".r",
82 | "mimetype": "text/x-r-source",
83 | "name": "R",
84 | "pygments_lexer": "r",
85 | "version": "3.6.1"
86 | }
87 | },
88 | "nbformat": 4,
89 | "nbformat_minor": 4
90 | }
91 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/C10.2 Clusters (Partición de datos).ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "
"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "# Partición de datos: $K$-medias\n",
15 | "\n",
16 | "Supongamos que tenemos una muestra de $n$ elementos con $p$ variables. El objetivo es dividir esta muestra en un número de grupos prefijado $K$.\n",
17 | "\n",
18 | "El algoritmo de $K$-medias requiere de las siguientes cuatro etapas:\n",
19 | "\n",
20 | "1. Seleccionar $K$ puntos como centros de los grupos iniciales. Esto puede hacerse:\n",
21 | " * Asignando aleatoriamente los objetos a los grupos y tomando los centros de los grupos formados\n",
22 | " \n",
23 | " * Tomando como centros los $K$ puntos más alejados entre sí\n",
24 | " \n",
25 | " * Construyendo los grupos con información a priori, o bien seleccionando los centros a priori.\n",
26 | " \n",
27 | " \n",
28 | "2. Calcular las distancias euclídeas de cada elemento al centro de los $K$ grupos, y asignar cada elemento al grupo más próximo. La asignación se realiza secuencialmente y al introducir un nuevo elemento en un grupo se recalculan las coordenadas de la nueva media de grupo.\n",
29 | "\n",
30 | "\n",
31 | "3. Definir un criterio de optimalidad y comprobar si reasignando uno a uno cada elemento de un grupo a otro mejora el criterio.\n",
32 | "\n",
33 | "\n",
34 | "4. Si no es posible mejorar el criterio de optimalidad, terminar el proceso."
35 | ]
36 | },
37 | {
38 | "cell_type": "markdown",
39 | "metadata": {},
40 | "source": [
41 | "## Criterio de homogeneidad\n",
42 | "\n",
43 | "El criterio de homogeneidad que se utiliza en el algoritmo de $K$-medias es la suma de cuadrados dentro de los grupos (SCDG) para todas las variables, que es equivalente a la suma ponderada de las varianzas de las variables en los grupos:\n",
44 | "\n",
45 | "$$SCDG=\\sum_{k=1}^K\\sum_{j=1}^p\\sum_{i=1}^{n_k}(x_{ijk}-\\overline{x_{jk}})^2$$\n",
46 | "\n",
47 | "Si llamamos $W$ a $\\sum_{k=1}^K\\sum_{i=1}^{n_k}(x_{ik}-\\overline{x_k})(x_{ik}-\\overline{x_k})^T$, se tiene que $\\min(tr(W))=\\min(SCDG)$.\n",
48 | "\n",
49 | "La varianza de cada variable en cada grupo es claramente una medida de la heterogeneidad del grupo y al minimizar las varianzas de todas las variables en los grupos obtendremos grupos más homogéneos.\n",
50 | "\n",
51 | "Cuando las variables vayan en unidades distintas conviene estandarizarlas, para evitar que el resultado del algoritmo dependa de cambios irrelevantes en la escala de medida. Cuando vayan en las mismas unidades suele ser mejor no estandarizar, ya que es posible que una varianza mucho mayor que el resto sea precisamente debida a que existen dos grupos de observaciones en esa variable, y si estandarizamos podemos ocultar la presencia de los grupos.\n",
52 | "\n",
53 | "Otra propiedad del criterio de la traza es que minimizar la distancia euclídea produce grupos aproximadamente esféricos. Por otro lado, este criterio está pensado para variables cuantitativas."
54 | ]
55 | },
56 | {
57 | "cell_type": "markdown",
58 | "metadata": {},
59 | "source": [
60 | "El algoritmo de $K$-medias busca la partición óptima con la restricción de que en cada iteración sólo se permite mover un elemento de un grupo a otro. El algoritmo funciona como sigue:\n",
61 | "\n",
62 | "1. Partir de una asignación inicial.\n",
63 | "2. Comprobar si moviendo algún elemento se reduce $tr(W)$.\n",
64 | "3. Si es posible reducir $tr(W)$, mover el elemento, recalcular las medias de los dos grupos afectados por el cambio y volver al punto 2. Si no es posible reducir $tr(W)$ terminar.\n",
65 | "\n",
66 | "En consecuencia, el resultado del algoritmo puede depender de la asignación inicial y del orden de los elementos. Por eso siempre conviene repetir el algoritmo con distintos valores iniciales y permutando los elemento de la muestra.\n",
67 | "\n"
68 | ]
69 | },
70 | {
71 | "cell_type": "markdown",
72 | "metadata": {},
73 | "source": [
74 | "## Elección de $K$: el número de grupos\n",
75 | "\n",
76 | "Sin embargo, la cantidad óptima de centroides k a utilizar no necesariamente se conoce de antemano, por lo que es necesario aplicar una técnica conocida como el Método del Codo o Elbow Method a fin de determinar dicho valor. Básicamente, este método busca seleccionar la cantidad ideal de grupos a partir de la optimización de la WCSS (Within Clusters Summed Squares)."
77 | ]
78 | },
79 | {
80 | "cell_type": "markdown",
81 | "metadata": {},
82 | "source": [
83 | "# Partición de datos: $K$-medoides\n",
84 | "\n",
85 | "La partición alrededor de los “medoides” (se suele llamar también Partition around medoids - PAM) es otro algoritmo de partición. Esencialmente, PAM es una modificación del algoritmo $K$-medias. Este algoritmo busca $K$ \"objetos representativos\" en lugar de los centroides entre las observaciones en el conjunto de datos. Entonces, se espera que el método sea más robusto ante anomalías o atípicos."
86 | ]
87 | }
88 | ],
89 | "metadata": {
90 | "kernelspec": {
91 | "display_name": "R",
92 | "language": "R",
93 | "name": "ir"
94 | },
95 | "language_info": {
96 | "codemirror_mode": "r",
97 | "file_extension": ".r",
98 | "mimetype": "text/x-r-source",
99 | "name": "R",
100 | "pygments_lexer": "r",
101 | "version": "3.6.1"
102 | }
103 | },
104 | "nbformat": 4,
105 | "nbformat_minor": 4
106 | }
107 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/C10.3 Clusters (Métodos jerárquicos).ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "
"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "# Métodos jerárquicos\n",
15 | "\n",
16 | "Los métodos jerárquicos parten de una matriz de distancias o similaridades entre los elementos de la muestra y construyen una jerarquía basada en las distancias. \n",
17 | "\n",
18 | "Hay dos tipos de métodos jerárquicos para Clusterización:\n",
19 | "\n",
20 | "1. **Aglomerativos.** empezamos con $n$ (el número de observaciones) clústeres y los vamos agrupando en menos cantidad de clústeres que serán de mayor tamaño porque los iniciales solo contienen una observación.\n",
21 | "\n",
22 | "2. **Divisivos.** empezamos con un solo clúster que contiene a todas las observaciones, y vamos dividiendo en clústeres más pequeños.\n",
23 | "\n",
24 | "Los resultados dependen de las distancias consideradas. En particular, si los datos tienen diferentes unidades de medida, y la distancia usada no tiene en cuenta esto, es mejor estandarizar las variables.\n",
25 | "\n",
26 | "Para decidir si estandarizar las variables o no antes del análisis conviene tener en cuenta el objetivo del estudio. Si no estandarizamos, la distancia euclídea dependerá sobre todo de las variables con valores más grandes, y el resultado del análisis puede cambiar completamente al modificar su escala de medida. Si estandarizamos, estamos dando a priori un peso semejante a las variables, con independencia de su variabilidad original, lo que puede no ser siempre adecuado.\n",
27 | "\n",
28 | "Al final del análisis jerárquico, nos encontraremos con un gráfico llamado dendograma."
29 | ]
30 | },
31 | {
32 | "cell_type": "markdown",
33 | "metadata": {},
34 | "source": [
35 | "## Método aglomerativo (agnes)\n",
36 | "\n",
37 | "Siempre tienen la misma estructura y sólo se diferencian en la forma de calcular las distancias entre grupos. Su estructura es:\n",
38 | "\n",
39 | "1. Comenzar con tantas clases como elementos, $n$. Las distancias entre clases son las distancias entre los elementos originales.\n",
40 | "\n",
41 | "\n",
42 | "2. Seleccionar los dos elementos más próximos en la matriz de distancias y formar con ellos una clase.\n",
43 | "\n",
44 | "\n",
45 | "3. Sustituir los dos elementos utilizados en el punto (2) para definir la clase, por un nuevo elemento que represente la clase construida. Las distancias entre este nuevo elemento y los anteriores se calculan con uno de los criterios para definir distancias entre grupos que comentaremos luego.\n",
46 | "\n",
47 | "\n",
48 | "4. Volver a (2), y repetir (2) y (3) hasta que tengamos todos los elementos agrupados en una clase única."
49 | ]
50 | },
51 | {
52 | "cell_type": "markdown",
53 | "metadata": {},
54 | "source": [
55 | "### Criterios para decidir las distancias entre grupos\n",
56 | "\n",
57 | "Supongamos que tenemos un grupo $A$ con $n_A$ elementos, y un grupo $B$ con $n_B$ elementos, y que ambos se fusionan para crear un grupo $AB$ con $n_A+n_B$ elementos.\n",
58 | "\n",
59 | "La distancia del nuevo grupo, $AB$, a otro grupo $C$ con $n_C$ elementos, se calcula habitualmente por alguna de las cinco reglas siguientes:\n",
60 | "\n"
61 | ]
62 | },
63 | {
64 | "cell_type": "markdown",
65 | "metadata": {},
66 | "source": [
67 | "1. **Single linkage.** Encadenamiento simple o vecino más próximo: La distancia entre los dos nuevos grupos es la menor de las distancias entre grupos antes de la fusión. Es decir:\n",
68 | "$$d(C,AB)=\\min\\{d(C,A),d(C,B)\\}$$\n",
69 | "\n",
70 | "Este criterio es invariante ante transformaciones monótonas. Tiende a producir grupos alargados.\n",
71 | "\n",
72 | "
\n",
73 | "\n",
74 | "
\n",
75 | "\n",
76 | "
"
77 | ]
78 | },
79 | {
80 | "cell_type": "markdown",
81 | "metadata": {},
82 | "source": [
83 | "2. **Complete linkage.** Encadenamiento completo o vecino más alejado: La distancia entre los dos nuevos grupos es la mayor de las distancias entre grupos antes de la fusión. Es decir:\n",
84 | "$$d(C,AB)=\\max\\{d(C,A),d(C,B)\\}$$\n",
85 | "\n",
86 | "Este criterio es invariante ante transformaciones monótonas. Tiende a producir grupos esféricos.\n",
87 | "\n",
88 | "
\n",
89 | "\n",
90 | "
\n",
91 | "\n",
92 | "
"
93 | ]
94 | },
95 | {
96 | "cell_type": "markdown",
97 | "metadata": {},
98 | "source": [
99 | "3. **(Average linkage) Media de grupos.** La distancia entre los dos nuevos grupos es la media ponderada entre las distancias entre grupos antes de la fusión:\n",
100 | "$$d(C,AB)=\\frac{n_A}{n_A+n_B}d(C,A)+\\frac{n_B}{n_A+n_B}d(C,B)$$\n",
101 | "\n",
102 | "Este criterio no es invariante ante transformaciones monótonas de las distancias.\n",
103 | "\n",
104 | "\n",
105 | "4. **(Centroid linkage) Método del centroide.** Se aplica generalmente sólo con variables continuas. La distancia entre dos grupos se hace igual a la distancia euclídea entre sus centros, donde se toman como centros los vectores de medias de las observaciones que pertenecen al grupo. Cuando se unen dos grupos se pueden calcular las nuevas distancias entre ellos sin utilizar los elementos originales. Puede demostrarse que el cuadrado de la distancia euclídea de un grupo $C$ a la unión de los grupos A, con $n_A$ elementos y $B$ con $n_B$ es:\n",
106 | "$$d^2(C,AB)=\\frac{n_A}{n_A+n_B}d^2(C,A)+\\frac{n_B}{n_A+n_B}d^2(C,B)-\\frac{n_An_B}{(n_A+n_B)^2}d^2(A,B)$$\n",
107 | "\n",
108 | "\n",
109 | "5. **(Ward linkage) Método de Ward.** $d(C,AB)$ es la distancia euclídea al cuadrado entre el vector media muestral de los elementos en ambos clústeres."
110 | ]
111 | },
112 | {
113 | "cell_type": "markdown",
114 | "metadata": {},
115 | "source": [
116 | "## Método divisivo (diana)\n",
117 | "\n",
118 | "En análisis de clúster divisivo (diana: divisive analysis), la idea es que en cada paso, las observaciones se dividan en un grupo $A$ y otro grupo $B$.\n",
119 | "\n",
120 | "1. El grupo $A$ se inicializa extrayendo la observación que tiene la mayor distancia media hacia las otras observaciones. En un primer paso esa observación es la que conforma el nuevo clúster $A$, y el resto conforman el clúster $B$.\n",
121 | "\n",
122 | "\n",
123 | "2. Dada la separación entre $A$ y $B$, para cada observación en $B$ se calculan las siguientes cantidades:\n",
124 | "\n",
125 | " a) La distancia media entre esa observación concreta de $B$ y las demás observaciones en $B$.\n",
126 | " \n",
127 | " b) La distancia media de esa observación concreta de $B$ y todas las observaciones de $A$.\n",
128 | "\n",
129 | "\n",
130 | "3. Luego, se calculan las diferencias entre los resultados de (a) y (b) del punto (2) para cada observación de $B$.\n",
131 | "\n",
132 | "\n",
133 | "4. Van a haber dos posibilidades:\n",
134 | "\n",
135 | " i. Si todas las diferencias son negativas, detendremos el algoritmo.\n",
136 | " \n",
137 | " ii. Si alguna diferencia es positiva, tomaremos la observación de $B$ con la diferencia positiva más grande y la moveremos al clúster $A$ y repetiremos todos los cálculos.\n",
138 | " \n",
139 | " \n",
140 | "Este algoritmo proporciona una división binaria, es decir, en clústeres $A$ y $B$, pero luego se puede aplicar dentro de los propios clústeres $A$ y $B$ para dividirlos."
141 | ]
142 | }
143 | ],
144 | "metadata": {
145 | "kernelspec": {
146 | "display_name": "Python 3",
147 | "language": "python",
148 | "name": "python3"
149 | },
150 | "language_info": {
151 | "codemirror_mode": {
152 | "name": "ipython",
153 | "version": 3
154 | },
155 | "file_extension": ".py",
156 | "mimetype": "text/x-python",
157 | "name": "python",
158 | "nbconvert_exporter": "python",
159 | "pygments_lexer": "ipython3",
160 | "version": "3.7.7"
161 | }
162 | },
163 | "nbformat": 4,
164 | "nbformat_minor": 4
165 | }
166 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/C10.4 Clusters (clusters basados en modelos).ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "
"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "# Clusters basados en modelos\n",
15 | "\n",
16 | "Este análisis es también conocido como clúster basado en mixturas. Para ello, se asume que los datos han sido generados por una mixtura de $K$ distribuciones desconocidas. Para estimar los parámetros desconocidos de la mixtura se utiliza el método de máxima verosimilitud. Más específicamente, un algoritmo que se llama Expectation-Maximization (EM). Una vez que se estiman los parámetros de la mixtura, cada observación es asignada al cluster con mayor probabilidad de generar esa observación."
17 | ]
18 | }
19 | ],
20 | "metadata": {
21 | "kernelspec": {
22 | "display_name": "R",
23 | "language": "R",
24 | "name": "ir"
25 | },
26 | "language_info": {
27 | "codemirror_mode": "r",
28 | "file_extension": ".r",
29 | "mimetype": "text/x-r-source",
30 | "name": "R",
31 | "pygments_lexer": "r",
32 | "version": "3.6.1"
33 | }
34 | },
35 | "nbformat": 4,
36 | "nbformat_minor": 4
37 | }
38 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/C11. Clasificación.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "
"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "# Introducción a algoritmos de clasificación\n",
15 | "\n",
16 | "Clasificar datos es asignar a las observaciones un grupo determinado asumiendo que los datos son heterogéneos y se pueden dividir en grupos. El problema es el siguiente:\n",
17 | "\n",
18 | "* Tenemos un conjunto de elementos que provienen de dos o más poblaciones.\n",
19 | "\n",
20 | "* Observamos una variable $p$-dimensional $X=(X_1,X_2,...,X_p)$ en estos elementos.\n",
21 | "\n",
22 | "* Queremos clasificar un nuevo elemento, con valores conocidos para esta variable pero desconocemos de cuál población proviene.\n",
23 | "\n",
24 | "## Definición del problema\n",
25 | "\n",
26 | "Tenemos una variable aleatoria $p$-dimensional $X=(X_1,X_2,...,X_p)$ definida sobre elementos muestrales que pertenecen a $G$ poblaciones, $P_g$, para $g=1,2,...,G$. La variable respuesta $Y$ contiene las clasificaciones de los elementos muestrales, es decir, toma valores en $g=1,2,...,G$.\n",
27 | "\n",
28 | "Tenemos una matriz de datos $\\boldsymbol{X}$ de tamaño $n\\times p$ con observaciones $\\boldsymbol{x_i}$ para $i=1,2,...,n$.\n",
29 | "\n",
30 | "Desconocemos las probabilidades $\\pi_g$ para $g=1,2,...,G$, de que un elemento seleccionado al azar provenga de la población $g$. Se cumple que $\\pi_1+\\pi_2+...+\\pi_G=1$. Queremos clasificar un nuevo elemento con valores conocidos $\\boldsymbol{x_0}=(x_{01},x_{02},...,x_{0p})$ dentro de alguna población $g$."
31 | ]
32 | },
33 | {
34 | "cell_type": "markdown",
35 | "metadata": {},
36 | "source": [
37 | "Hay muchas técnicas de clasificación para abordar este problema. Vamos a estudiar las tres técnicas más conocidas:\n",
38 | "\n",
39 | "1) $K$ vecinos más cercanos (kNN: k-Nearest Neighbors)\n",
40 | "\n",
41 | "2) Clasificador bayesiano\n",
42 | "\n",
43 | "3) Regresión logística"
44 | ]
45 | },
46 | {
47 | "cell_type": "markdown",
48 | "metadata": {},
49 | "source": [
50 | "## KNN: $K$-Nearest Neighbors o $K$ vecinos más cercanos\n",
51 | "\n",
52 | "Es un método de clasificación no paramétrico; es decir, **no requiere asumir ninguna distribución para la variable aleatoria $X=(X_1,X_2,...,X_p)$**. Este método no requiere estimar las probabilidades desconocidas $\\pi_g$ de que un elemento seleccionado al azar provenga de la población $g$.\n",
53 | "\n",
54 | "La idea es buscar, para la nueva observación que queremos clasificar, sus $K$ vecinos más cercanos, es decir, las $K$ observaciones más cercanas respecto a una medida de distancia.\n",
55 | "\n",
56 | "El algoritmo es el siguiente:\n",
57 | "\n",
58 | "1) Definimos una medida de distancia adecuada para las observaciones.\n",
59 | "\n",
60 | "2) Calculamos la distancia entre la nueva observación $\\boldsymbol{x_0}$ que queremos clasificar, y las observaciones que tenemos en nuestra matriz de datos.\n",
61 | "\n",
62 | "3) Seleccionamos las $K$ observaciones más cercanas a $\\boldsymbol{x_0}$, y miramos a qué grupo pertenecen.\n",
63 | "\n",
64 | "4) Clasificamos $\\boldsymbol{x_0}$ en la población a la que pertenece una mayor proporción de sus $K$ vecinos."
65 | ]
66 | },
67 | {
68 | "cell_type": "markdown",
69 | "metadata": {},
70 | "source": [
71 | "## Clasificación bayesiana\n",
72 | "\n",
73 | "La idea es: clasificar o asignar la nueva observación a la población con mayor probabilidad de haberla generado. En otras palabras, clasificamos a $\\boldsymbol{x_0}$ en la población $g$-ésima $P_g$ si $P(y_0=g|x=\\boldsymbol{x_0})$ es la probabilidad máxima dentro de todas las posibles considerando el total de $G$ poblaciones.\n",
74 | "\n",
75 | "Supongamos que cada uno de los $G$ grupos son gaussianos. Sea $f_g(\\cdot;\\theta_g)$ su respectiva densidad (es decir, $f_g$ es una gaussiana $p$ dimensional).\n",
76 | "\n",
77 | "Entonces $$P(y_0=g|x=\\boldsymbol{x_0})=\\frac{\\pi_gf_g(\\boldsymbol{x_0})}{\\sum_{i=1}^G\\pi_if_i(\\boldsymbol{x_0})}$$\n",
78 | "\n",
79 | "1) Si suponemos que $\\mu_1,\\mu_2,...,\\mu_G$ no son todos iguales, pero tienen la misma matriz de covarianza, se dice que se hace un **análisis discriminante lineal.**\n",
80 | "\n",
81 | "2) Por el contrario, si suponemos que $\\mu_1,\\mu_2,...,\\mu_G$ no son todos igualesy cada población tiene su propia matriz de covarianza, se dice que se hace un **análisis discriminante cuadrático.**"
82 | ]
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "metadata": {},
87 | "source": [
88 | "## Regresión logística\n",
89 | "\n",
90 | "Uno de los problemas de la clasificación bayesiana es que se asume que la variable aleatoria tiene una distribución específica en la población $P_g$. Esto restringe el tipo de variables que pueden usarse en las reglas discriminantes lineal y cuadrática. Sin embargo, un marco probabilístico aporta un soporte muy fuerte a las decisiones; la pregunta es si se podrían calcular las probabilidades $P(y_0=g|x=\\boldsymbol{x_0})$ sin tener conocimiento a priori de las densidades.\n",
91 | "\n",
92 | "Consideremos el problema de discriminación o clasificación entre dos poblaciones. Y supongamos que además de las variables explicativas tenemos una variable respuesta que toma valor cero para una de esas poblaciones y valor uno para la otra. En caso de que sean clases no numéricas siempre se pueden transformar a estos valores.\n",
93 | "\n",
94 | "El método más usual para llevar a cabo regresión logística es el **multilogit** (cuando hay mas de dos poblaciones).\n",
95 | "\n",
96 | "Aquí, $$P(y_0=g|x=\\boldsymbol{x_0})=\\frac{e^{\\beta_{0g}+\\beta_{1g}\\boldsymbol{x_0}}}{1+\\sum_{i=1}^{G-1} e^{\\beta_{0i}+\\beta_{1i}\\boldsymbol{x_0}}}$$ para $g=1,2,...,G-1$ y $$P(y_0=G|x=\\boldsymbol{x_0})=\\frac{1}{1+\\sum_{i=1}^{G-1} e^{\\beta_{0i}+\\beta_{1i}\\boldsymbol{x_0}}}$$\n",
97 | "\n",
98 | "\n",
99 | "\n",
100 | "\n",
101 | "\n",
102 | "\n",
103 | "Así, el modelo logístico puede aplicarse cuando las variables explicativas no son Normales, incluyendo variables discretas y variables categóricas que pueden incluirse en el modelo vía variables dummy"
104 | ]
105 | }
106 | ],
107 | "metadata": {
108 | "kernelspec": {
109 | "display_name": "R",
110 | "language": "R",
111 | "name": "ir"
112 | },
113 | "language_info": {
114 | "codemirror_mode": "r",
115 | "file_extension": ".r",
116 | "mimetype": "text/x-r-source",
117 | "name": "R",
118 | "pygments_lexer": "r",
119 | "version": "3.6.1"
120 | }
121 | },
122 | "nbformat": 4,
123 | "nbformat_minor": 4
124 | }
125 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/clasificaciones.R:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/clasificaciones.R
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/cluster_jerarquizacion.R:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/cluster_jerarquizacion.R
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/cluster_modelos.R:
--------------------------------------------------------------------------------
1 | rm(list=ls())
2 | library(MASS)
3 | library(mclust)
4 | library(cluster)
5 |
6 | muestra <- read.csv("mixturas3.csv")
7 | plot(muestra$u.1,muestra$u.2)
8 |
9 | names(muestra)
10 |
11 | mclust.muestra <- Mclust(muestra[,2:3],modelNames = c("VVV"))
12 | grupos.muestra <- mclust.muestra$classification
13 | summary(as.factor(grupos.muestra))
14 |
15 | colores.grupos <- c("blue","red","green")[grupos.muestra]
16 | pairs(muestra[,2:3],col=colores.grupos)
17 |
18 | clusplot(muestra[,2:3],grupos.muestra)
19 |
20 | mclust.muestra$parameters
21 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/cluster_particion.R:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/cluster_particion.R
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/dendograma_complete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/dendograma_complete.png
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/dendograma_single.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/dendograma_single.png
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/dis_grupos_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/dis_grupos_11.png
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/dis_grupos_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/dis_grupos_12.png
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/dis_grupos_22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/dis_grupos_22.png
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/escalado_metrico.R:
--------------------------------------------------------------------------------
1 | setwd("C:\\Users\\hp master\\OneDrive\\Escritorio\\distancias")
2 |
3 | coordenadas <- read.csv("mx.csv")
4 | names(coordenadas)
5 |
6 | library(geosphere)
7 |
8 | coordenadas <- coordenadas[,c(1,3,2)]
9 | dim(coordenadas)
10 |
11 | distancias <- function(x){
12 | t(distm(coordenadas[x,2:3],
13 | coordenadas[,2:3], fun = distHaversine)/1000)}
14 |
15 | D <- as.data.frame(do.call(cbind,lapply(1:1991,distancias)))
16 | colnames(D) <- coordenadas$city
17 |
18 | D <- as.data.frame(cbind(coordenadas[,1],D))
19 | colnames(D)[1] <- "ciudades"
20 |
21 | ###############################
22 |
23 | data <- D[,2:1992]
24 |
25 | mds.cities <- cmdscale(data,eig=TRUE)
26 |
27 | plot(mds.cities$eig,pch=19,col="blue",xlab="Number","ylab"="Eigenvalor",type="o")
28 | abline(a=0,b=0,col="red")
29 |
30 | m <- sum(abs(mds.cities$eig[1:2])) / sum(abs(mds.cities$eig))
31 | m
32 |
33 | mds.cities <- cmdscale(data,eig=TRUE,k=2)
34 |
35 | x1 <- mds.cities$points[,1]
36 | x2 <- mds.cities$points[,2]
37 |
38 |
39 | plot(x1,x2,pch=19,xlim=range(x1)+c(-1000,600),ylim=range(x2)+c(-500,500),col="red")
40 | text(x1,x2,pos=4,labels=colnames(data),col="blue")
41 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/escalado_metrico1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/escalado_metrico1.png
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/indices.csv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/indices.csv
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/logo.png
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/mx_extendido.csv:
--------------------------------------------------------------------------------
1 | "","city","lat","lng","capital","population","cod_entidad"
2 | "16","Jaltipan de Morelos.VER",17.9703,-94.7144,0,41644,"30"
3 | "11","Tepetlaoxtoc.EMX",19.5731,-98.8203,0,25523,"15"
4 | "29","Hunucma.YUC",21.0153,-89.8744,0,24910,"31"
5 | "1","Cuernavaca.MOR",18.9186,-99.2342,1,366321,"17"
6 | "12","Aldama.TAM",22.9194,-98.0736,0,13661,"28"
7 | "27","Carichi.CHI",27.9167,-107.05,0,1672,"6"
8 | "18","San Joaquin.QUE",20.9833,-99.5,0,8865,"22"
9 | "2","Chihuahua.CHI",28.6353,-106.0889,1,878062,"6"
10 | "17","San Pedro del Gallo.DUR",25.55,-104.3,0,634,"10"
11 | "19","Coatepec Harinas.EMX",18.9,-99.7167,0,31860,"15"
12 | "26","Santiago.NVL",25.4333,-100.1333,0,37886,"19"
13 | "20","San Pedro.COA",25.7589,-102.9844,0,53688,"8"
14 | "9","Ciudad de Huitzuco.GUE",18.3,-99.35,0,16025,"12"
15 | "24","Totolapan.MOR",18.9869,-98.9197,0,10790,"17"
16 | "5","Oaxaca.OAX",17.0833,-96.75,1,300050,"20"
17 | "14","Fronteras.SON",30.8961,-109.5583,0,874,"26"
18 | "28","San Blas.NAY",21.5397,-105.2856,0,37478,"18"
19 | "30","Cihuatlan.JAL",19.25,-104.5667,0,30241,"14"
20 | "21","Cuautla.MOR",18.8167,-98.95,0,175208,"17"
21 | "8","Pachuca.HID",20.1,-98.75,1,277375,"13"
22 | "6","Guanajuato.GUA",21.0178,-101.2567,1,171709,"11"
23 | "13","Calimaya.EMX",19.1608,-99.6172,0,47033,"15"
24 | "23","Ciudad Lopez Mateos.EMX",19.55,-99.2833,0,489937,"15"
25 | "15","Lopez.CHI",27,-105.0333,0,2184,"6"
26 | "3","Chilpancingo.GUE",17.55,-99.5,1,187251,"12"
27 | "4","Merida.YUC",20.97,-89.62,1,892363,"31"
28 | "22","Santa Maria Huazolotitlan.OAX",16.3014,-97.9125,0,11400,"20"
29 | "10","Papalotla.EMX",19.5622,-98.8578,0,3766,"15"
30 | "25","Arivechi.SON",28.9333,-109.1833,0,1280,"26"
31 | "7","Aguascalientes.AGS",21.876,-102.296,1,934424,"1"
32 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/paises.csv:
--------------------------------------------------------------------------------
1 | country,m0,m25,m50,m75,w0,w25,w50,w75
2 | Algeria,63,51,30,13,67,54,34,15
3 | Cameroon,34,29,13,5,38,32,17,6
4 | Madagascar,38,30,17,7,38,34,20,7
5 | Mauritius,59,42,20,6,64,46,25,8
6 | Reunion,56,38,18,7,62,46,25,10
7 | Seychelles,62,44,24,7,69,50,28,14
8 | South Africa(C),50,39,20,7,55,43,23,8
9 | South Africa (W),65,44,22,7,72,50,27,9
10 | Tunisia,56,46,24,11,63,54,33,19
11 | Canada,69,47,24,8,75,53,29,10
12 | Costa Rica,65,48,26,9,68,50,27,10
13 | Dominican Rep,64,50,28,11,66,51,29,11
14 | El Salvador,56,44,25,10,61,48,27,12
15 | Greenland,60,44,22,6,65,45,25,9
16 | Grenada,61,45,22,8,65,49,27,10
17 | Guatemala,49,40,22,9,51,41,23,8
18 | Honduras,59,42,22,6,61,43,22,7
19 | Jamaica,63,44,23,8,67,48,26,9
20 | Mexico,59,44,24,8,63,46,25,8
21 | Nicaragua,65,48,28,14,68,51,29,13
22 | Panama,65,48,26,9,67,49,27,10
23 | Trinidad(62),64,63,21,7,68,47,25,9
24 | Trinidad(67),64,43,21,6,68,47,24,8
25 | United(66),67,45,23,8,74,51,28,10
26 | United(NW66),61,40,21,10,67,46,25,11
27 | United(W66),68,46,23,8,75,52,29,10
28 | United(67),67,45,23,8,74,51,28,10
29 | Argentina,65,46,24,9,71,51,28,10
30 | Chile,59,43,23,10,66,49,27,12
31 | Columbia,58,44,24,9,62,47,25,10
32 | Ecuador,57,46,28,9,60,49,28,11
33 |
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/pca.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/pca.png
--------------------------------------------------------------------------------
/Mod3. Introducción al ML/pca_indices.R:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod3. Introducción al ML/pca_indices.R
--------------------------------------------------------------------------------
/Practica.01 (cancer).py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | """
3 | Created on Sun Nov 22 17:48:08 2020
4 |
5 | @author: hp
6 | """
7 |
8 | import numpy as np
9 | import scipy as sc
10 | import pandas as pd
11 | import seaborn as sns
12 | import matplotlib.pyplot as plt
13 | import plotly.express as px
14 |
15 | from math import pi
16 | from pandas.plotting import scatter_matrix
17 | from pandas.plotting import andrews_curves
18 |
19 | #%%
20 |
21 |
22 | cancer = pd.read_csv("C:/Users/hp master/Documents/SciData/Est_Mult/Mod01. Espacios multivariantes/C01. Mediciones con multiples variables/cancer.csv",index_col="id")
23 | cancer.head()
24 |
25 | #%%
26 |
27 | '''¿Cuántos individuos tienen cáncer maligno y cuántos no?
28 |
29 | Mostrar esta información gráficamente.'''
30 |
31 | cancer["diagnosis"].value_counts()
32 |
33 | #%%
34 |
35 | sns.countplot("diagnosis",data=cancer)
36 | plt.show()
37 |
38 | #%%
39 |
40 | cancer["diagnosis"] = cancer["diagnosis"].astype("category")
41 | cancer.info()
42 |
43 | #%%
44 |
45 | '''Observamos que las variable 32 no nos sirve. Procedemos a eliminarla:'''
46 |
47 | cancer.drop("Unnamed: 32",axis=1,inplace=True)
48 | cancer.info()
49 |
50 |
51 | #%%
52 |
53 | '''¿Hay valores nulos?'''
54 |
55 | print("Hay valores nulos?\n",cancer.isnull().values.any())
56 |
57 |
58 | #%%
59 |
60 | ##########
61 | ########## BOXPLOTS
62 | ##########
63 |
64 |
65 | plt.figure(figsize=(20,20)) #controla el tamaño del gráfico
66 | sns.boxplot(data = cancer)
67 | plt.xticks(rotation=90) #controla la rotación de las etiquetas en el eje X
68 | plt.show()
69 |
70 |
71 | #%%
72 |
73 | '''Como se puede observar, hay muchos valores atípicos que dificultan la lectura de la gráfica.
74 | Estandaricemos cada característica para obtener una mejor visualización.'''
75 |
76 | #crea una nueva tabla, cancer_estandarizado, que no contiene diagnosis
77 | cancer_numerico = cancer[cancer.columns[1:]]
78 |
79 | cancer_numerico.head()
80 |
81 | #pip install sklearn
82 |
83 | from sklearn.preprocessing import StandardScaler
84 |
85 | scaler = StandardScaler()
86 | caracteristicas_escaladas = scaler.fit_transform(cancer_numerico.values)
87 | cancer_estandarizado = pd.DataFrame(caracteristicas_escaladas,
88 | index = cancer_numerico.index,
89 | columns=cancer_numerico.columns)
90 | cancer_estandarizado
91 |
92 | #%%
93 |
94 | plt.figure(figsize=(14,8)) #controla el tamaño del gráfico
95 | sns.boxplot(data = cancer_estandarizado)
96 | plt.xticks(rotation=90) #controla la rotación de las etiquetas en el eje X
97 | plt.show()
98 |
99 | #%%
100 |
101 | '''Un enfoque estadístico robusto habría considerado valores atípicos a todos los valores
102 | que superan 3 (o 2.5) en el eje Y. sin embargo, dado el rango limitado de distribución de datos
103 | (de aproximadamente -2.5 a aproximadamente +11) y la disponibilidad de datos que no es muy alta
104 | (solo 569 observaciones), se podría utilizar un enfoque "visual" para la detección de los valores
105 | atípicos (basado en densidad de los puntos por encima de un umbral específico).
106 |
107 | Por ejemplo, eliminar las observaciones que superan el valor 6.
108 |
109 | Los valores atípicos podrían ser indicativos de datos incorrectos, procedimientos erróneos o áreas
110 | experimentales donde algunas teorías pueden no ser válidas. Antes de eliminarlos, deberíamos
111 | discutir con expertos en este dominio para entender por qué estos datos no son válidos
112 | (por ejemplo, el equipo de medición falló, el método de medición fue poco confiable por alguna razón,
113 | había contaminantes, etc).'''
114 |
115 |
116 | #Eliminar atípicos
117 |
118 | cancer_limpio=cancer_estandarizado[cancer_estandarizado.apply(lambda x: np.abs(x - x.mean()) / x.std() < 6).all(axis=1)]
119 | cancer_limpio.shape
120 |
121 | cancer_limpio["Id"] = cancer_limpio.index
122 | cancer["Id"] = cancer.index
123 |
124 |
125 | cancer_limpio.info()
126 | cancer.info()
127 |
128 | plt.figure(figsize=(14,8))
129 | sns.boxplot( data = cancer_limpio[cancer_limpio.columns[:30]])
130 | plt.xticks(rotation=90)
131 | plt.show()
132 |
133 | #%%
134 |
135 | #########
136 | ######### BOXPLOT PARA CADA CADA VARIABLE DIVIDIDO POR ESPECIE DE CÁNCER
137 | #########
138 |
139 |
140 | cancer[["Id","diagnosis"]]
141 |
142 | cancer_limpio_diagnostico = cancer_limpio.join(cancer[["Id","diagnosis"]].set_index(["Id"]),
143 | on=["Id"],
144 | how="inner")
145 | cancer_limpio_diagnostico.head()
146 |
147 | cancer_limpio_diagnostico.drop("Id",axis=1,inplace = True)
148 | cancer_limpio_diagnostico.info()
149 |
150 | plt.figure(figsize=(14,8))
151 | cancer_limpio_diagnostico.boxplot(by="diagnosis",figsize=(24,12))
152 | plt.xticks(rotation=90)
153 | plt.show()
154 |
155 | cancer_limpio_diagnostico.shape
156 |
157 | #%%
158 |
159 | '''Convertimos la variable diagnostico a una representación numérica'''
160 |
161 | cancer["diagnosis"] = cancer["diagnosis"].map({"M":1,"B":0})
162 | cancer["diagnosis"].value_counts()
163 |
164 | #%%
165 |
166 | '''Dividimos la tabla en tres tablas dependiendo del tipo de medida de las características.'''
167 |
168 | caracteristicas_media = list(cancer.columns[1:11])
169 | caracteristicas_sd = list(cancer.columns[11:21])
170 | caracteristicas_max = list(cancer.columns[21:31])
171 |
172 | print(caracteristicas_media, "\n",caracteristicas_sd,"\n",caracteristicas_max)
173 |
174 | #%%
175 |
176 | from pandas.plotting import scatter_matrix
177 |
178 |
179 | colores = {0:"blue",1:"red"}
180 | colors = cancer["diagnosis"].map(lambda x: colores.get(x))
181 |
182 | sm = scatter_matrix(cancer[caracteristicas_media],c=colors,alpha=0.5,figsize=(15,15))
183 |
184 | #Orientación de los letreros
185 |
186 | [s.xaxis.label.set_rotation(45) for s in sm.reshape(-1)]
187 | [s.yaxis.label.set_rotation(0) for s in sm.reshape(-1)]
188 | [s.get_yaxis().set_label_coords(-0.9,0.5) for s in sm.reshape(-1)]
189 | [s.set_xticks(()) for s in sm.reshape(-1)]
190 | [s.set_yticks(()) for s in sm.reshape(-1)]
191 |
192 |
193 | plt.show()
194 |
195 | #%%
196 |
197 | caracteristicas_media.append("diagnosis")
198 | sns.pairplot(cancer[caracteristicas_media],hue="diagnosis",height=1.5)
199 | plt.show()
200 |
201 | caracteristicas_media = caracteristicas_media[:10]
202 |
203 |
204 | #%%
205 |
206 | ############
207 | ############ COVARIANZAS Y CORRELACIONES
208 | ############
209 |
210 |
211 | cov_matrix = cancer_numerico.cov()
212 | corr_matrix = cancer_numerico.corr()
213 |
214 | plt.figure(figsize=(20,20))
215 | ax = sns.heatmap(corr_matrix,
216 | vmax=1,
217 | vmin=-1,
218 | cbar_kws={"shrink":.8},
219 | square=True,
220 | annot=True,
221 | fmt=".2f",
222 | cmap="GnBu",
223 | center=0)
224 | plt.show()
225 |
226 | #%%
227 |
228 | # Para medias, sd y máximos
229 |
230 | plt.figure(figsize=(15,7))
231 |
232 | plt.subplot(1, 3, 1)
233 | ax1=sns.heatmap(cancer_numerico[caracteristicas_media].corr(),
234 | xticklabels=False,
235 | yticklabels=False,
236 | cbar = False,
237 | square = True,
238 | annot=True,
239 | fmt= '.2f',
240 | annot_kws={'size': 8},
241 | vmax=1, vmin=-1,
242 | cmap ='GnBu',
243 | center=0)
244 | bottom, top = ax1.get_ylim()
245 | ax1.set_ylim(bottom + 0.5, top - 0.5)
246 |
247 | plt.subplot(1, 3, 2)
248 | ax2=sns.heatmap(cancer_numerico[caracteristicas_sd].corr(),xticklabels=False, yticklabels=False , cbar = False, square = True, annot=True, fmt= '.2f',annot_kws={'size': 8},vmax=1, vmin=-1, cmap ='GnBu',center=0)
249 | bottom, top = ax2.get_ylim()
250 | ax2.set_ylim(bottom + 0.5, top - 0.5)
251 |
252 | plt.subplot(1, 3, 3)
253 | ax3=sns.heatmap(cancer_numerico[caracteristicas_max].corr(),xticklabels=False, yticklabels=False , cbar = False, square = True, annot=True, fmt= '.2f',annot_kws={'size': 8},vmax=1, vmin=-1, cmap ='GnBu',center=0)
254 | bottom, top = ax2.get_ylim()
255 | ax2.set_ylim(bottom + 0.5, top - 0.5)
256 |
257 |
258 | #%%
259 |
260 | ####### COORDENADAS PARALELAS
261 |
262 | from pandas.plotting import parallel_coordinates
263 |
264 | caracteristicas_media.append("diagnosis")
265 | parallel_coordinates(cancer_limpio_diagnostico[caracteristicas_media],
266 | "diagnosis",
267 | colormap='cool',
268 | xticks=None)
269 | plt.show()
270 |
271 | #%%
272 |
273 | ####### CURVAS DE ANDREWS
274 |
275 | from pandas.plotting import andrews_curves
276 | andrews_curves(cancer_limpio_diagnostico[caracteristicas_media],
277 | "diagnosis",
278 | colormap='rainbow')
279 | plt.show()
280 |
281 |
282 |
--------------------------------------------------------------------------------
/Practica.02 (atipicos_companias).R:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Practica.02 (atipicos_companias).R
--------------------------------------------------------------------------------
/Practica.02 (atipicos_companias).py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | """
3 | Created on Mon Nov 30 14:31:48 2020
4 |
5 | @author: hp
6 | """
7 | import numpy as np
8 | import pandas as pd
9 | import seaborn as sns
10 | import matplotlib.pyplot as plt
11 | import scipy as sc
12 | #%%
13 | companias = pd.read_csv("C:/Users/hp master/Documents/SciData/Est_Mult/companies79.csv")
14 |
15 | companias.drop("Unnamed: 0",axis=1,inplace=True)
16 |
17 | companias.head()
18 |
19 | #%%
20 |
21 | Xf = companias.drop(["V1","V8"],axis=1)
22 |
23 | Xlog = np.log(Xf)
24 |
25 | #%%
26 |
27 | sns.kdeplot(Xf["V4"], Xf["V5"], cmap="Blues", shade=False, shade_lowest=True)
28 |
29 | sns.kdeplot(Xlog["V4"], Xlog["V5"], cmap="Blues", shade=False, shade_lowest=True)
30 |
31 | Xf[["V4","V5"]].describe()
32 |
33 | Xlog[["V4","V5"]].describe()
34 |
35 | #%%
36 |
37 | plt.plot(Xf["V4"], Xf["V5"], 'o',alpha=0.2)
38 | plt.plot(Xlog["V4"], Xlog["V5"], 'o',alpha=0.2)
39 |
40 | #%%
41 |
42 | mu = np.mean(Xf)
43 | SX = Xf.cov()
44 |
45 | Xf.loc[0]
46 | Xf.head(1)
47 |
48 | d_M = []
49 |
50 | for i in range(0,79):
51 | d_M.append(sc.spatial.distance.mahalanobis(Xf.loc[i], mu, np.linalg.inv(SX)) ** 2)
52 |
53 | sorted(d_M,reverse=True)
54 |
55 | #%%
56 |
57 | umbral = sc.stats.chi2.ppf(0.975, 6)
58 | umbral
59 |
60 | companias["d_M"] = d_M
61 |
62 | companias[companias["d_M"]>umbral].head()
63 |
64 | companias["atipico"] = np.where(companias["d_M"]>umbral,"Sí atípico","No atípico")
65 | companias["color"] = np.where(companias["d_M"]>umbral,"red","blue")
66 |
67 | companias.head()
68 |
69 | #%%
70 |
71 | plt.scatter(companias["V2"],companias["V3"],
72 | s=200,c=companias["color"],marker='.',alpha=0.5)
73 |
74 | #%%
75 |
76 | out = companias[companias["d_M"]>umbral]
77 |
78 | companias_clean = companias[companias["d_M"]<=umbral]
79 |
80 | #%%
81 |
82 | Xclean = companias_clean[["V2","V3","V4","V5","V6","V7"]]
83 |
84 | mu_clean = np.mean(Xclean)
85 |
86 | mu_clean
87 | mu
88 |
89 | SX_clean = Xclean.cov()
90 |
91 | SX_clean
92 |
93 | #%%
94 |
95 | Xclean.shape
96 | Xclean.set_index(pd.Index(list(range(0,69))),inplace=True)
97 | d_M_clean = []
98 |
99 | for i in range(0,69):
100 | d_M_clean.append(sc.spatial.distance.mahalanobis(Xclean.loc[i],
101 | mu_clean,
102 | np.linalg.inv(SX_clean)) ** 2)
103 |
104 | companias_clean["d_M_clean"] = d_M_clean
105 |
106 | companias_clean["atipico_clean"] = np.where(companias_clean["d_M_clean"]>umbral,
107 | "Sí atípico","No atípico")
108 |
109 | companias_clean["color_clean"] = np.where(companias_clean["d_M_clean"]>umbral,
110 | "red","blue")
111 |
112 | #%%
113 |
114 | plt.scatter(companias_clean["V2"],companias_clean["V3"],
115 | s=200,c=companias_clean["color_clean"],marker='.',alpha=0.5)
116 |
117 |
--------------------------------------------------------------------------------
/Tarea01_companias.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Tarea01_companias.pdf
--------------------------------------------------------------------------------
/Tarea02-03_companias.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Tarea02-03_companias.pdf
--------------------------------------------------------------------------------
/Tarea04_contraste_varianzas.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Tarea04_contraste_varianzas.pdf
--------------------------------------------------------------------------------
/Tarea05_CPA.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Tarea05_CPA.pdf
--------------------------------------------------------------------------------
/companies79.csv:
--------------------------------------------------------------------------------
1 | "","V1","V2","V3","V4","V5","V6","V7","V8"
2 | "1","BellAtlantic",19788,9084,10636,1092.9,2576.8,79.4,"Communication"
3 | "2","ContinentalTelecom",5074,2557,1892,239.9,578.3,21.9,"Communication"
4 | "3","AmericanElectricPower",13621,4848,4572,485,898.9,23.4,"Energy"
5 | "4","BrooklynUnionGas",1117,1038,478,59.7,91.7,3.8,"Energy"
6 | "5","CentralIllinoisPublicService",1633,701,679,74.3,135.9,2.8,"Energy"
7 | "6","ClevelandElectricIlluminating",5651,1254,2002,310.7,407.9,6.2,"Energy"
8 | "7","ColumbiaGasSystem",5835,4053,1601,93.8,173.8,10.8,"Energy"
9 | "8","FloridaProgress",3494,1653,1442,160.9,320.3,6.4,"Energy"
10 | "9","IdahoPower",1654,451,779,84.8,130.4,1.6,"Energy"
11 | "10","KansasPower&Light",1679,1354,687,93.8,154.6,4.6,"Energy"
12 | "11","MesaPetroleum",1257,355,181,167.5,304,0.6,"Energy"
13 | "12","MontanaPower",1743,597,717,121.6,172.4,3.5,"Energy"
14 | "13","PeoplesEnergy",1440,1617,639,81.7,126.4,3.5,"Energy"
15 | "14","PhillipsPetroleum",14045,15636,2754,418,1462,27.3,"Energy"
16 | "15","PublicServiceCoofNewMexico",3010,749,1120,146.3,209.2,3.4,"Energy"
17 | "16","SanDiegoGas&Electric",3086,1739,1507,202.7,335.2,4.9,"Energy"
18 | "17","ValeroEnergy",1995,2662,341,34.7,100.7,2.3,"Energy"
19 | "18","AmericanSavingsBankFSB",3614,367,90,14.1,24.6,1.1,"Finance"
20 | "19","BankSouth",2788,271,304,23.5,28.9,2.1,"Finance"
21 | "20","H&RBlock",327,542,959,54.1,72.5,2.8,"Finance"
22 | "21","CaliforniaFirstBank",5401,550,376,25.6,37.5,4.1,"Finance"
23 | "22","Cigna",44736,16197,4653,732.5,651.9,48.5,"Finance"
24 | "23","Dreyfus",401,176,1084,55.6,57,0.7,"Finance"
25 | "24","FirstAmerican",4789,453,367,40.2,51.4,3,"Finance"
26 | "25","FirstEmpireState",2548,264,181,22.2,26.2,2.1,"Finance"
27 | "26","FirstTennesseeNational",5249,527,346,37.8,56.2,4.1,"Finance"
28 | "27","MarineCorp",3720,356,211,26.6,34.8,2.4,"Finance"
29 | "28","MellonBank",33406,3222,1413,201.7,246.7,15.8,"Finance"
30 | "29","NationalCity",12505,1302,702,108.4,131.4,9,"Finance"
31 | "30","NorstarBancorp",8998,882,988,93,119,7.4,"Finance"
32 | "31","Norwest",21419,2516,930,107.6,164.7,15.6,"Finance"
33 | "32","SoutheastBanking",11052,1097,606,64.9,97.6,7,"Finance"
34 | "33","SovranFinancial",9672,1037,829,92.6,118.2,8.2,"Finance"
35 | "34","UnitedFinancialGroup",4989,518,53,3.1,0.3,0.8,"Finance"
36 | "35","AppleComputer",1022,1754,1370,72,119.5,4.8,"HiTech"
37 | "36","DigitalEquipment",6914,7029,7957,400.6,754.7,87.3,"HiTech"
38 | "37","Eg&G",430,1155,1045,55.7,70.8,22.5,"HiTech"
39 | "38","GeneralElectric",26432,28285,33172,2336,3562,304,"HiTech"
40 | "39","Hewlett-Packard",5769,6571,9462,482,792,83,"HiTech"
41 | "40","IBM",52634,50056,95697,6555,9874,400.2,"HiTech"
42 | "41","NCR",3940,4317,3940,315.2,566.3,62,"HiTech"
43 | "42","Telex",478,672,866,67.1,101.6,5.4,"HiTech"
44 | "43","ArmstrongWorldIndustries",1093,1679,1070,100.9,164.5,20.8,"Manufacturing"
45 | "44","CBIIndustries",1128,1516,430,47,26.7,13.2,"Manufacturing"
46 | "45","Fruehauf",1804,2564,483,70.5,164.9,26.6,"Manufacturing"
47 | "46","Halliburton",4662,4781,2988,28.7,371.5,66.2,"Manufacturing"
48 | "47","LTV",6307,8199,598,771.5,524.3,57.5,"Manufacturing"
49 | "48","Owens-CorningFiberglas",2366,3305,1117,131.2,256.5,25.2,"Manufacturing"
50 | "49","PPGIndustries",4084,4346,3023,302.7,521.7,37.5,"Manufacturing"
51 | "50","Textron",10348,5721,1915,223.6,322.5,49.5,"Manufacturing"
52 | "51","Turner",752,2149,101,11.1,15.2,2.6,"Manufacturing"
53 | "52","UnitedTechnologies",10528,14992,5377,312.7,710.7,184.8,"Manufacturing"
54 | "53","CommunityPsychiatricCenters",278,205,853,44.8,50.5,3.8,"Medical"
55 | "54","HospitalCorpofAmerica",6259,4152,3090,283.7,524.5,62,"Medical"
56 | "55","AHRobins",707,706,275,61.4,77.8,6.1,"Medical"
57 | "56","SharedMedicalSystems",252,312,883,41.7,60.6,3.3,"Medical"
58 | "57","AirProducts",2687,1870,1890,145.7,352.2,18.2,"Other"
59 | "58","AlliedSignal",13271,9115,8190,279,83,143.8,"Other"
60 | "59","BallyManufactoring",1529,1295,444,25.6,137,19.4,"Other"
61 | "60","CrownCork&Seal",866,1487,944,71.7,115.4,12.6,"Other"
62 | "61","Ex-Cell-0",799,1140,683,57.6,89.2,15.4,"Other"
63 | "62","LizClaiborne",223,557,1040,60.6,63.7,1.9,"Other"
64 | "63","WarnerCommunications",2286,2235,2306,195.3,219,8,"Other"
65 | "64","Dayton-Hudson",4418,8793,4459,283.6,456.5,128,"Retail"
66 | "65","DillardDepartmentStores",862,1601,1093,66.9,106.8,16,"Retail"
67 | "66","GiantFood",623,2247,797,57,93.8,18.6,"Retail"
68 | "67","GreatA&PTea",1608,6615,829,56.1,134,65,"Retail"
69 | "68","Kroger",4178,17124,2091,180.8,390.4,164.6,"Retail"
70 | "69","MayDepartmentStores",3442,5080,2673,235.4,361.5,77.3,"Retail"
71 | "70","Stop&ShopCos",1112,3689,542,30.3,96.9,43.5,"Retail"
72 | "71","SupermarketsGeneral",1104,5123,910,63.7,133.3,48.5,"Retail"
73 | "72","WickesCos",2957,2806,457,40.6,93.5,50,"Retail"
74 | "73","FWWoolworth",2535,5958,1921,177,288,118.1,"Retail"
75 | "74","AMR",6425,6131,2448,345.8,682.5,49.5,"Transportation"
76 | "75","IUInternational",999,1878,393,173.5,108.1,23.3,"Transportation"
77 | "76","PanAm",2448,3484,1036,48.8,257.1,25.4,"Transportation"
78 | "77","RepublicAirlines",1286,1734,361,69.2,145.7,14.3,"Transportation"
79 | "78","TWA",2769,3725,663,208.4,12.4,29.1,"Transportation"
80 | "79","WesternAirLines",952,1307,309,35.4,92.8,10.3,"Transportation"
81 |
--------------------------------------------------------------------------------
/fna.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/fna.png
--------------------------------------------------------------------------------
/google.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/google.png
--------------------------------------------------------------------------------
/iris.csv:
--------------------------------------------------------------------------------
1 | "","Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species"
2 | "1",5.1,3.5,1.4,0.2,"setosa"
3 | "2",4.9,3,1.4,0.2,"setosa"
4 | "3",4.7,3.2,1.3,0.2,"setosa"
5 | "4",4.6,3.1,1.5,0.2,"setosa"
6 | "5",5,3.6,1.4,0.2,"setosa"
7 | "6",5.4,3.9,1.7,0.4,"setosa"
8 | "7",4.6,3.4,1.4,0.3,"setosa"
9 | "8",5,3.4,1.5,0.2,"setosa"
10 | "9",4.4,2.9,1.4,0.2,"setosa"
11 | "10",4.9,3.1,1.5,0.1,"setosa"
12 | "11",5.4,3.7,1.5,0.2,"setosa"
13 | "12",4.8,3.4,1.6,0.2,"setosa"
14 | "13",4.8,3,1.4,0.1,"setosa"
15 | "14",4.3,3,1.1,0.1,"setosa"
16 | "15",5.8,4,1.2,0.2,"setosa"
17 | "16",5.7,4.4,1.5,0.4,"setosa"
18 | "17",5.4,3.9,1.3,0.4,"setosa"
19 | "18",5.1,3.5,1.4,0.3,"setosa"
20 | "19",5.7,3.8,1.7,0.3,"setosa"
21 | "20",5.1,3.8,1.5,0.3,"setosa"
22 | "21",5.4,3.4,1.7,0.2,"setosa"
23 | "22",5.1,3.7,1.5,0.4,"setosa"
24 | "23",4.6,3.6,1,0.2,"setosa"
25 | "24",5.1,3.3,1.7,0.5,"setosa"
26 | "25",4.8,3.4,1.9,0.2,"setosa"
27 | "26",5,3,1.6,0.2,"setosa"
28 | "27",5,3.4,1.6,0.4,"setosa"
29 | "28",5.2,3.5,1.5,0.2,"setosa"
30 | "29",5.2,3.4,1.4,0.2,"setosa"
31 | "30",4.7,3.2,1.6,0.2,"setosa"
32 | "31",4.8,3.1,1.6,0.2,"setosa"
33 | "32",5.4,3.4,1.5,0.4,"setosa"
34 | "33",5.2,4.1,1.5,0.1,"setosa"
35 | "34",5.5,4.2,1.4,0.2,"setosa"
36 | "35",4.9,3.1,1.5,0.2,"setosa"
37 | "36",5,3.2,1.2,0.2,"setosa"
38 | "37",5.5,3.5,1.3,0.2,"setosa"
39 | "38",4.9,3.6,1.4,0.1,"setosa"
40 | "39",4.4,3,1.3,0.2,"setosa"
41 | "40",5.1,3.4,1.5,0.2,"setosa"
42 | "41",5,3.5,1.3,0.3,"setosa"
43 | "42",4.5,2.3,1.3,0.3,"setosa"
44 | "43",4.4,3.2,1.3,0.2,"setosa"
45 | "44",5,3.5,1.6,0.6,"setosa"
46 | "45",5.1,3.8,1.9,0.4,"setosa"
47 | "46",4.8,3,1.4,0.3,"setosa"
48 | "47",5.1,3.8,1.6,0.2,"setosa"
49 | "48",4.6,3.2,1.4,0.2,"setosa"
50 | "49",5.3,3.7,1.5,0.2,"setosa"
51 | "50",5,3.3,1.4,0.2,"setosa"
52 | "51",7,3.2,4.7,1.4,"versicolor"
53 | "52",6.4,3.2,4.5,1.5,"versicolor"
54 | "53",6.9,3.1,4.9,1.5,"versicolor"
55 | "54",5.5,2.3,4,1.3,"versicolor"
56 | "55",6.5,2.8,4.6,1.5,"versicolor"
57 | "56",5.7,2.8,4.5,1.3,"versicolor"
58 | "57",6.3,3.3,4.7,1.6,"versicolor"
59 | "58",4.9,2.4,3.3,1,"versicolor"
60 | "59",6.6,2.9,4.6,1.3,"versicolor"
61 | "60",5.2,2.7,3.9,1.4,"versicolor"
62 | "61",5,2,3.5,1,"versicolor"
63 | "62",5.9,3,4.2,1.5,"versicolor"
64 | "63",6,2.2,4,1,"versicolor"
65 | "64",6.1,2.9,4.7,1.4,"versicolor"
66 | "65",5.6,2.9,3.6,1.3,"versicolor"
67 | "66",6.7,3.1,4.4,1.4,"versicolor"
68 | "67",5.6,3,4.5,1.5,"versicolor"
69 | "68",5.8,2.7,4.1,1,"versicolor"
70 | "69",6.2,2.2,4.5,1.5,"versicolor"
71 | "70",5.6,2.5,3.9,1.1,"versicolor"
72 | "71",5.9,3.2,4.8,1.8,"versicolor"
73 | "72",6.1,2.8,4,1.3,"versicolor"
74 | "73",6.3,2.5,4.9,1.5,"versicolor"
75 | "74",6.1,2.8,4.7,1.2,"versicolor"
76 | "75",6.4,2.9,4.3,1.3,"versicolor"
77 | "76",6.6,3,4.4,1.4,"versicolor"
78 | "77",6.8,2.8,4.8,1.4,"versicolor"
79 | "78",6.7,3,5,1.7,"versicolor"
80 | "79",6,2.9,4.5,1.5,"versicolor"
81 | "80",5.7,2.6,3.5,1,"versicolor"
82 | "81",5.5,2.4,3.8,1.1,"versicolor"
83 | "82",5.5,2.4,3.7,1,"versicolor"
84 | "83",5.8,2.7,3.9,1.2,"versicolor"
85 | "84",6,2.7,5.1,1.6,"versicolor"
86 | "85",5.4,3,4.5,1.5,"versicolor"
87 | "86",6,3.4,4.5,1.6,"versicolor"
88 | "87",6.7,3.1,4.7,1.5,"versicolor"
89 | "88",6.3,2.3,4.4,1.3,"versicolor"
90 | "89",5.6,3,4.1,1.3,"versicolor"
91 | "90",5.5,2.5,4,1.3,"versicolor"
92 | "91",5.5,2.6,4.4,1.2,"versicolor"
93 | "92",6.1,3,4.6,1.4,"versicolor"
94 | "93",5.8,2.6,4,1.2,"versicolor"
95 | "94",5,2.3,3.3,1,"versicolor"
96 | "95",5.6,2.7,4.2,1.3,"versicolor"
97 | "96",5.7,3,4.2,1.2,"versicolor"
98 | "97",5.7,2.9,4.2,1.3,"versicolor"
99 | "98",6.2,2.9,4.3,1.3,"versicolor"
100 | "99",5.1,2.5,3,1.1,"versicolor"
101 | "100",5.7,2.8,4.1,1.3,"versicolor"
102 | "101",6.3,3.3,6,2.5,"virginica"
103 | "102",5.8,2.7,5.1,1.9,"virginica"
104 | "103",7.1,3,5.9,2.1,"virginica"
105 | "104",6.3,2.9,5.6,1.8,"virginica"
106 | "105",6.5,3,5.8,2.2,"virginica"
107 | "106",7.6,3,6.6,2.1,"virginica"
108 | "107",4.9,2.5,4.5,1.7,"virginica"
109 | "108",7.3,2.9,6.3,1.8,"virginica"
110 | "109",6.7,2.5,5.8,1.8,"virginica"
111 | "110",7.2,3.6,6.1,2.5,"virginica"
112 | "111",6.5,3.2,5.1,2,"virginica"
113 | "112",6.4,2.7,5.3,1.9,"virginica"
114 | "113",6.8,3,5.5,2.1,"virginica"
115 | "114",5.7,2.5,5,2,"virginica"
116 | "115",5.8,2.8,5.1,2.4,"virginica"
117 | "116",6.4,3.2,5.3,2.3,"virginica"
118 | "117",6.5,3,5.5,1.8,"virginica"
119 | "118",7.7,3.8,6.7,2.2,"virginica"
120 | "119",7.7,2.6,6.9,2.3,"virginica"
121 | "120",6,2.2,5,1.5,"virginica"
122 | "121",6.9,3.2,5.7,2.3,"virginica"
123 | "122",5.6,2.8,4.9,2,"virginica"
124 | "123",7.7,2.8,6.7,2,"virginica"
125 | "124",6.3,2.7,4.9,1.8,"virginica"
126 | "125",6.7,3.3,5.7,2.1,"virginica"
127 | "126",7.2,3.2,6,1.8,"virginica"
128 | "127",6.2,2.8,4.8,1.8,"virginica"
129 | "128",6.1,3,4.9,1.8,"virginica"
130 | "129",6.4,2.8,5.6,2.1,"virginica"
131 | "130",7.2,3,5.8,1.6,"virginica"
132 | "131",7.4,2.8,6.1,1.9,"virginica"
133 | "132",7.9,3.8,6.4,2,"virginica"
134 | "133",6.4,2.8,5.6,2.2,"virginica"
135 | "134",6.3,2.8,5.1,1.5,"virginica"
136 | "135",6.1,2.6,5.6,1.4,"virginica"
137 | "136",7.7,3,6.1,2.3,"virginica"
138 | "137",6.3,3.4,5.6,2.4,"virginica"
139 | "138",6.4,3.1,5.5,1.8,"virginica"
140 | "139",6,3,4.8,1.8,"virginica"
141 | "140",6.9,3.1,5.4,2.1,"virginica"
142 | "141",6.7,3.1,5.6,2.4,"virginica"
143 | "142",6.9,3.1,5.1,2.3,"virginica"
144 | "143",5.8,2.7,5.1,1.9,"virginica"
145 | "144",6.8,3.2,5.9,2.3,"virginica"
146 | "145",6.7,3.3,5.7,2.5,"virginica"
147 | "146",6.7,3,5.2,2.3,"virginica"
148 | "147",6.3,2.5,5,1.9,"virginica"
149 | "148",6.5,3,5.2,2,"virginica"
150 | "149",6.2,3.4,5.4,2.3,"virginica"
151 | "150",5.9,3,5.1,1.8,"virginica"
152 |
--------------------------------------------------------------------------------
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/logo.png
--------------------------------------------------------------------------------
/matriz1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/matriz1.png
--------------------------------------------------------------------------------
/matriz_ady.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/matriz_ady.png
--------------------------------------------------------------------------------
/tabla1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/tabla1.png
--------------------------------------------------------------------------------