├── C00. Google y las matemáticas..ipynb ├── Mod1_Espacios_Multivariantes ├── C01. El Espacio multivariante.ipynb ├── C02.1 Visualización de datos (boxplots).ipynb ├── C02.2 Visualización de datos (histogramas).ipynb ├── C02.3 Visualización de datos (Densidades Kernel).ipynb ├── C02.4 Visualización de datos (scatterplots).ipynb ├── C02.5 Visualización de datos (matriz de correlación).ipynb ├── C02.6 Visualización de datos (coordenadas paralelas).ipynb ├── C03. Estadística Descriptiva.ipynb ├── bagplot.png ├── barreras.png ├── boxplot2.png ├── boxplot_iris1.png ├── boxplot_iris2.png ├── cancer.csv ├── coordenadas1.png ├── coordenadas2.png ├── coordenadas3.png ├── correlacion1.png ├── empty.gitkeep ├── hist1.png ├── hist2.png ├── hist3.png ├── kernel1.png ├── kernel2.png ├── kernel3.png ├── logo.png ├── mediana1.png ├── practica_Python.py ├── practica_Python_Final.py ├── practica_RStudio.R ├── practica_RStudio_Final.R ├── quartiles.png ├── scatter1.png ├── scatter2.png ├── scatter3.png ├── scatter4.png └── scatter5.png ├── Mod2. Probabilidad en varias variables ├── C04. Variables aleatorias.ipynb ├── C05.1 Distribuciones principales (Normales).ipynb ├── C05.2 Distribuciones principales (distancia de Mahalanobis).ipynb ├── C05.3 Distribuciones importantes (elípticas y circulares).ipynb ├── C05.4 Distribuciones importantes (Mixturas y cópulas).ipynb ├── C06.1 Inferencia Estadística (introducción).ipynb ├── C06.2 Inferencia Estadística (Máxima verosimilitud).ipynb ├── C06.3 Inferencia Estadística (test de hipótesis).ipynb ├── C06.4 Inferencia Estadística (test de hipótesis--matriz de covarianas).ipynb ├── C06.5 Inferencia Estadística (ANOVA multivariante).ipynb ├── contornos.R ├── copulas.png ├── copulas.py ├── esp_cond.png ├── logo.png ├── mahalanobis1.png ├── mahalanobis2.png ├── mahalanobis3.png ├── mixturas.R ├── normal1.png ├── normal2.png ├── normales_multivariantes.py ├── normales_multivariantes.r ├── observaciones.png ├── student1.png └── t_student_multivariante.R ├── Mod3. Introducción al ML ├── C07. Componentes principales .ipynb ├── C08. Análisis de factores.ipynb ├── C09. Escalado multidimensional.ipynb ├── C10.1 Clusters (Introducción).ipynb ├── C10.2 Clusters (Partición de datos).ipynb ├── C10.3 Clusters (Métodos jerárquicos).ipynb ├── C10.4 Clusters (clusters basados en modelos).ipynb ├── C11. Clasificación.ipynb ├── clasificaciones.R ├── cluster_jerarquizacion.R ├── cluster_modelos.R ├── cluster_particion.R ├── dendograma_complete.png ├── dendograma_single.png ├── dis_grupos_11.png ├── dis_grupos_12.png ├── dis_grupos_22.png ├── distancias_mex1.csv ├── distancias_mex2.csv ├── distancias_mex3.csv ├── escalado_metrico.R ├── escalado_metrico1.png ├── indices.csv ├── logo.png ├── mixturas3.csv ├── mixturas4.csv ├── mx.csv ├── mx_extendido.csv ├── paises.csv ├── pca.png ├── pca_indices.R └── regiones.csv ├── Practica.01 (cancer).py ├── Practica.01 (cáncer).ipynb ├── Practica.02 (atipicos_companias).R ├── Practica.02 (atipicos_companias).py ├── Tarea01_companias.pdf ├── Tarea02-03_companias.pdf ├── Tarea04_contraste_varianzas.pdf ├── Tarea05_CPA.pdf ├── cancer.csv ├── companies79.csv ├── fna.png ├── google.png ├── iris.csv ├── logo.png ├── matriz1.png ├── matriz_ady.png └── tabla1.png /Mod1_Espacios_Multivariantes/C01. El Espacio multivariante.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 | "# Datos Multivariantes\n", 15 | "\n", 16 | "Las características físicas de nosotros como personas: la altura, el peso, la edad, el sexo, el lugar donde hemos nacido, el lugar donde vivimos actualmente, que son variables entre las personas, nos definen como individuos dentro de toda la población.\n", 17 | "\n", 18 | "Pensemos en las propiedades de una imagen: su color,su brillo,su contraste. Son características que la definen y la hacen única. Estos son dos ejemplos sencillos de lo que serían datos multivariantes; es decir, observaciones sobre las que se miden varias variables. \n", 19 | "\n", 20 | "El análisis multivariante es entonces todo el conjunto de métodos, que veremos en este curso, y que nos permitirán explorar y describir las características de nuestros datos en función del conjunto de variables.\n", 21 | "\n", 22 | "Por ejemplo, podremos resumir el conjunto de variables en unas pocas nuevas variables construidas como transformaciones de las variables originales, pero con la mínima pérdida de información para poder trabajar con ellos de una forma más eficiente. \n", 23 | "\n", 24 | "También encontrar grupos entre los datos, si existen. Clasificar nuevas observaciones en grupos que ya han sido\n", 25 | "definidos. Estas técnicas para describir, resumir y condensar información, clasificar datos, relacionar variables, se conocen a veces como técnicas de exploración de datos.\n", 26 | "\n", 27 | "Sin embargo, estas herramientas no permiten directamente obtener conclusiones generales respecto al proceso o sistema que genera los datos. Para ello necesitamos otro tipo de métodos para crear conocimiento respecto al problema mediante un modelo estadístico y la construcción de un modelo estadístico requiere del concepto de probabilidad. Las herramientas básicas para la construcción de modelos requieren estimar los parámetros del modelo a partir de los datos disponibles, contrastar hipótesis respecto a su estructura para lo cual es necesario conocer los fundamentos de la inferencia multivariante.\n", 28 | "\n", 29 | "Así que los métodos van a estar agrupados en estos dos tipos de análisis: el análisis univariante, el más simple, que es cuando tenemos n observaciones (el tamaño muestral) pero de una sola variable. Por ejemplo, si nuestra variable es la altura de 100 estudiantes, la altura sería la variable aleatoria que estamos midiendo sobre esos 100 estudiantes, y 100 es el tamaño de nuestra muestra. Otra variable aleatoria podría ser el nivel de llenado de 50 botellas o por ejemplo la ciudad de nacimiento de los 1000 participantes de una encuesta.\n", 30 | "\n", 31 | "Pero cuando hablamos de datos multivariantes vamos a tener $n$ observaciones, pero más de una variable aleatoria a la vez, es decir, que sobre mis observaciones vamos a estar midiendo más de una sola variable, más de una característica. Y esas variables aleatorias van a ser características que se pueden medir simultáneamente sobre los $n$ elementos.\n", 32 | "\n", 33 | "Por ejemplo, las características que se miden sobre las personas cuando se les hace una encuesta, que se les preguntan varias cosas a la misma persona: altura, peso, edad, lugar de residencia, etc. Todas esas son características que van a ser medidas sobre cada uno de los elementos de mi muestra.\n", 34 | "\n", 35 | "Entonces el aspecto de nuestros datos, en el caso multivariante, vamos a tener $n$ filas en nuestra matriz de datos y vamos a tener $p$ columnas, que van a ser las $p$ variables." 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "## Notación\n", 43 | "\n", 44 | "Esta matriz de datos se puede denotar de la siguiente manera:\n", 45 | "$$\\boldsymbol{X=[x_1,x_2,...,x_p]}$$ donde $\\boldsymbol{x_i}\\in\\mathbb{R}^n$ (es decir, $\\boldsymbol{x_i}$ tiene $n$ coordenadas, que son los valores de la variable $i$ en los $n$ registros)." 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "## Tipos de variables\n", 53 | "\n", 54 | "Vamos a ver que existen dos tipos de variables que se pueden mezclar en nuestros datos cuando tenemos varias variables. Podemos encontrarnos **variables cuantitativas**, que son datos numéricos, por ejemplo, cuando nos preguntan la edad, la altura, los ingresos que tenemos. O **variables cualitativas**, que son atributos o categorías, como por ejemplo si nos preguntan el sexo o el color de ojos o la ciudad donde hemos nacido, todas esas variables toman valores que son categorías o atributos, no son\n", 55 | "números.\n", 56 | "\n", 57 | "Ahora respecto a las variables cuantitativas, pueden ser **continuas** o **discretas**. \n", 58 | "\n", 59 | "Las continuas van a ser valores reales dentro de un intervalo. Es decir, es muy raro que se repitan, por ejemplo, en el peso de las personas puede haber varias coincidencias, pero no muchas coincidencias y siempre van a estar definidas dentro de un intervalo de manera continua.\n", 60 | "\n", 61 | "Sin embargo, las variables discretas son valores numerables o contables. Por ejemplo, el número de hermanos. Se puede tener cero hermanos, un hermano, dos hermanos, etc. Son valores que llegan hasta un límite y además son contables, numerables, es decir, nadie va a tener 1,5 hermanos.\n", 62 | "\n", 63 | "Por tanto, vamos a asumir que estamos observando $p$ variables aleatorias, cada una de ellas es una variable univariante, y se miden en un conjunto de elementos que son nuestra muestra. Luego, ese conjunto de variables aleatorias forma una variable aleatoria multivariante. " 64 | ] 65 | } 66 | ], 67 | "metadata": { 68 | "kernelspec": { 69 | "display_name": "Python 3", 70 | "language": "python", 71 | "name": "python3" 72 | }, 73 | "language_info": { 74 | "codemirror_mode": { 75 | "name": "ipython", 76 | "version": 3 77 | }, 78 | "file_extension": ".py", 79 | "mimetype": "text/x-python", 80 | "name": "python", 81 | "nbconvert_exporter": "python", 82 | "pygments_lexer": "ipython3", 83 | "version": "3.7.7" 84 | } 85 | }, 86 | "nbformat": 4, 87 | "nbformat_minor": 4 88 | } 89 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/C02.1 Visualización de datos (boxplots).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 | "# Visualización de los datos\n", 15 | "\n", 16 | "¿Por qué es importante visualizar? Porque es una manera mucho más sencilla de obtener información. ¿Sobre qué vamos a obtener información? Sobre la distribución, sobre si hay simetría o asimetría, si hay multimodalidad, si hay presencia de atípicos o outliers, sobre si nuestros datos pueden agruparse, etc. Entonces la información gráfica va a ser un complemento de la información numérica que podemos obtener en un análisis exploratorio.\n", 17 | "\n", 18 | "Ahora bien, el sistema de precepción humano, el que tenemos nosotros, tiene estas características importantes: somos capaces de entender e interpretar gráficos en dos o tres dimensiones, pero más de tres dimensiones no pueden visualizarse de manera tan sencilla.\n", 19 | "\n", 20 | "Por lo tanto, los gráficos que vamos a ver van a estar dibujados en dos o en tres dimensiones, pero aprenderemos también cómo representar datos de más de tres dimensiones en este tipo de gráficos.\n", 21 | "\n", 22 | "Vamos a graficar las variables de tipo cuantitativas, porque las cualitativas nos van a dar información adicional en los gráficos, no vamos a graficarlas como tal, sino que vamos a utilizar esa información, por ejemplo, para agrupar los datos." 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "# Boxplots (diagramas de caja)\n", 30 | "\n", 31 | "## Caso de una variable" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "Un boxplot es un gráfico que nos da información sobre localización, desviación, asimetría y valores atípicos. Para construirlo \"a mano\" es necesario calcular algunos estadísticos (un estadístico solo es una medida de los datos)\n", 39 | "\n", 40 | "Supongamos que tenemos solamente una variable y $n$ registros (es decir, hicimos $n$ observaciones de una misma característica). Sea $x=(x_1,x_2,...,x_n)$ el vector de los $n$ valores observados. Supongamos que los ordenamos de menor a menor como $$x_{(1)}=\\min\\{x_1,x_2,...,x_n\\}\\le x_{(2)}\\le x_{(3)}\\le...\\le x_{(n)}=\\max\\{x_1,x_2,...,x_n\\}$$ \n", 41 | "\n", 42 | "La **mediana** es aquél número que divide a los datos ordenados en dos parte de igual tamaño. Se define como $$x_{\\left(\\frac{n+1}{2}\\right)}$$ si $n$ es impar y $$\\frac{x_{\\left(\\frac{n}{2}\\right)}+x_{\\left(\\frac{n}{2}+1\\right)}}{2}$$ si $n$ es par.\n", 43 | "\n", 44 | "Por ejemplo, si las observaciones fueron $(2,1,6,1,6,2,1,1,5)$, al ordenarlos de menor a mayor tenemos $(1,1,1,1,2,2,5,6,6)$, que son 9 datos. Como 9 es impar, entonces la mediana es $x_{(\\frac{9+1}{2})}=x_{(5)}$. Es decir 2.\n", 45 | "\n", 46 | "Los **cuartiles** dividen al conjunto de datos ordenados en 4 partes iguales.\n", 47 | "\n", 48 | "" 49 | ] 50 | }, 51 | { 52 | "cell_type": "markdown", 53 | "metadata": {}, 54 | "source": [ 55 | "El rango intercuartílico se define como el bloque que recoge el 50% mas central. Es decir $RI=Q3-Q1$.\n", 56 | "\n", 57 | "Las barreras se definen como $B1=Q1-1.5RI$ y $B2=Q3+1.5RI$.\n", 58 | "\n", 59 | "" 60 | ] 61 | }, 62 | { 63 | "attachments": {}, 64 | "cell_type": "markdown", 65 | "metadata": {}, 66 | "source": [ 67 | "### ¿Cómo hacemos el boxplot?\n", 68 | "\n", 69 | "" 70 | ] 71 | }, 72 | { 73 | "cell_type": "markdown", 74 | "metadata": {}, 75 | "source": [ 76 | "## Caso de varias variables\n", 77 | "\n", 78 | "En el caso de varias variables, podemos hacer en un mismo gráfico, los boxplots para todas las variables y dividirlos por grupos en dependencia de valores de variables categóricas." 79 | ] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "metadata": {}, 84 | "source": [ 85 | "\n", 86 | "\n", 87 | "\n", 88 | "También existen los [bagplots](https://stats.stackexchange.com/questions/465054/tukey-depth-intuition)" 89 | ] 90 | } 91 | ], 92 | "metadata": { 93 | "kernelspec": { 94 | "display_name": "Python 3", 95 | "language": "python", 96 | "name": "python3" 97 | }, 98 | "language_info": { 99 | "codemirror_mode": { 100 | "name": "ipython", 101 | "version": 3 102 | }, 103 | "file_extension": ".py", 104 | "mimetype": "text/x-python", 105 | "name": "python", 106 | "nbconvert_exporter": "python", 107 | "pygments_lexer": "ipython3", 108 | "version": "3.7.7" 109 | } 110 | }, 111 | "nbformat": 4, 112 | "nbformat_minor": 4 113 | } 114 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/C02.2 Visualización de datos (histogramas).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 | "# Histogramas\n", 15 | "\n", 16 | "Es un gráfico que nos da información sobre la distribución de una variable aleatoria, posible multimodalidad, asimetría, dispersión y atípicos.\n", 17 | "\n", 18 | "El histograma es una representación gráfica de frecuencias. \n", 19 | "" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": {}, 25 | "source": [ 26 | "## Caso multivariante\n", 27 | "\n", 28 | "En el caso multivariante tenemos dos alternativas" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "**Alternativa 1**\n", 36 | "\n", 37 | "Podemos comparar los histogramas de todas las variables que tenemos\n", 38 | "\n", 39 | " " 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "**Alternativa 2**\n", 47 | "\n", 48 | "Podemos comparar los histogramas de una variable dividida en los subgrupos que tenemos\n", 49 | " " 50 | ] 51 | } 52 | ], 53 | "metadata": { 54 | "kernelspec": { 55 | "display_name": "Python 3", 56 | "language": "python", 57 | "name": "python3" 58 | }, 59 | "language_info": { 60 | "codemirror_mode": { 61 | "name": "ipython", 62 | "version": 3 63 | }, 64 | "file_extension": ".py", 65 | "mimetype": "text/x-python", 66 | "name": "python", 67 | "nbconvert_exporter": "python", 68 | "pygments_lexer": "ipython3", 69 | "version": "3.7.7" 70 | } 71 | }, 72 | "nbformat": 4, 73 | "nbformat_minor": 4 74 | } 75 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/C02.3 Visualización de datos (Densidades Kernel).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 | "# Densidades kernel\n", 15 | "\n", 16 | "Es un gráfico que aporta la misma información que un histograma. Además de estimar la función de densidad de la variable aleatoria y dibujarla sobre el histograma.\n", 17 | "\n", 18 | "La densidad kernel está basada en una función que se llama kernel. Por ejemplo: Kernel Gaussiano, Uniforme, Triangular, Epanechnikov, etc\n", 19 | "\n", 20 | "" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "La forma general en que se calcula la función de densidad $f_n$ a través de un kernel dado $K$ si tenemos las $n$ observaciones $x_1,x_2,...,x_n$ es $$f_h(x)=\\frac{1}{nh}\\sum_{i=1}^nK\\left(\\frac{x-x_i}{h}\\right),$$ donde $h$ es el ancho de banda.\n", 28 | "\n", 29 | "Los kernel mas usados son:\n", 30 | "\n", 31 | "* Uniforme: $K(t)=\\frac{1}{2}I_{[-1,1)}(t)$\n", 32 | "\n", 33 | "* Guassiano $K(t)=\\frac{1}{\\sqrt{2\\pi}}\\exp\\left(-\\frac{t^2}{2}\\right)$\n", 34 | "\n", 35 | "**Ejemplo**\n", 36 | "\n", 37 | "Aquí usamos un kernel uniforme con diferentes anchos de banda\n", 38 | "\n", 39 | "" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "En general, $h$ se elige de tal manera que el error cuadrático medio integral se minimice: $$MISE(h)=E\\left[\\int|f_h(x)-f(x)|^2\\,\\mathrm{d}x\\right],$$ donde $f$ es la función de densidad real de las observaciones." 47 | ] 48 | }, 49 | { 50 | "cell_type": "markdown", 51 | "metadata": {}, 52 | "source": [ 53 | "## Caso bidimensional\n", 54 | "\n", 55 | "También podemos estimar la densidad kernel bivariada entre dos variables aleatorias y verlo en un gráfico bidimensional.\n", 56 | "\n", 57 | "" 58 | ] 59 | } 60 | ], 61 | "metadata": { 62 | "kernelspec": { 63 | "display_name": "Python 3", 64 | "language": "python", 65 | "name": "python3" 66 | }, 67 | "language_info": { 68 | "codemirror_mode": { 69 | "name": "ipython", 70 | "version": 3 71 | }, 72 | "file_extension": ".py", 73 | "mimetype": "text/x-python", 74 | "name": "python", 75 | "nbconvert_exporter": "python", 76 | "pygments_lexer": "ipython3", 77 | "version": "3.7.7" 78 | } 79 | }, 80 | "nbformat": 4, 81 | "nbformat_minor": 4 82 | } 83 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/C02.4 Visualización de datos (scatterplots).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 | "# Scatterplot\n", 15 | "\n", 16 | "Es un gráfico que aporta:\n", 17 | "\n", 18 | "• Visualizar la distribución bivariada (entre dos variables aleatorias)\n", 19 | "\n", 20 | "• También se conoce como Diagrama de Dispersión.\n", 21 | "\n", 22 | "• Nos ayuda a entender las relaciones entre pares de variables.\n", 23 | "\n", 24 | "• Si se añade una 3ra variable puede hacerse un scatterplot 3-\n", 25 | "dimensional.\n", 26 | "\n", 27 | "• El “scatterplot matrix” es un gráfico con múltiples 2D-scatterplots\n", 28 | "\n", 29 | "\n", 30 | "\n", 31 | "" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "Podemos diferenciar por grupos, y en vez de poner histogramas poner estimaciones de kernel densities.\n", 46 | "\n", 47 | "" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "Si ponemos en los tres ejes de coordenadas tres variables aleatorias de las que tengamos, podemos obtener un scatterplot 3-dimensional, incluso con movimiento.\n", 55 | "\n", 56 | "" 57 | ] 58 | } 59 | ], 60 | "metadata": { 61 | "kernelspec": { 62 | "display_name": "Python 3", 63 | "language": "python", 64 | "name": "python3" 65 | }, 66 | "language_info": { 67 | "codemirror_mode": { 68 | "name": "ipython", 69 | "version": 3 70 | }, 71 | "file_extension": ".py", 72 | "mimetype": "text/x-python", 73 | "name": "python", 74 | "nbconvert_exporter": "python", 75 | "pygments_lexer": "ipython3", 76 | "version": "3.7.7" 77 | } 78 | }, 79 | "nbformat": 4, 80 | "nbformat_minor": 4 81 | } 82 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/C02.5 Visualización de datos (matriz de correlació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 | "# Matriz de correlación\n", 15 | "\n", 16 | "La correlación es una medida numérica estadística que permite medir el grado de relación lineal entre un par de variables aleatorias. Cumple las siguientes propiedades:\n", 17 | "\n", 18 | "• Toma valores en el rango de -1 a 1.\n", 19 | "\n", 20 | "• Si vale -1 significa que la relación lineal es fuerte y negativa o\n", 21 | "inversa.\n", 22 | "\n", 23 | "• Si vale 1 significa que la relación lineal es fuerte y positiva o directa.\n", 24 | "\n", 25 | "• Si vale 0 significa que no hay relación lineal entre las dos variables." 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "Supongamos que tenemos la matriz de $p$ variables $\\boldsymbol{X=[x_1,x_2,...,x_p]}$, donde $\\boldsymbol{x_i}\\in\\mathbb{R}^n$.\n", 33 | "\n", 34 | "% La correlación de las variables $\\boldsymbol{x_i}$ y $\\boldsymbol{x_j}$ se define como $$corr(\\boldsymbol{x_i},\\boldsymbol{x_j})=\\frac{cov(\\boldsymbol{x_i},\\boldsymbol{x_j})}{sd_{\\boldsymbol{x_i}}sd_{\\boldsymbol{x_j}}}$$" 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": {}, 40 | "source": [ 41 | "La matriz de correlaciones se define con cada elemento igual a la correlación entre las variables $\\boldsymbol{x_i}$ y $\\boldsymbol{x_j}$. En la diagonal vale 1 porque es la correlación entre cada variable consigo misma, y es simétrica.\n", 42 | "\n", 43 | "\n", 44 | "Convirtiendo cada valor de correlación en un color dentro de una escala de colores en el rango de -1 a 1, la matriz de correlaciones se puede representar gráficamente:\n", 45 | "\n", 46 | "" 47 | ] 48 | } 49 | ], 50 | "metadata": { 51 | "kernelspec": { 52 | "display_name": "Python 3", 53 | "language": "python", 54 | "name": "python3" 55 | }, 56 | "language_info": { 57 | "codemirror_mode": { 58 | "name": "ipython", 59 | "version": 3 60 | }, 61 | "file_extension": ".py", 62 | "mimetype": "text/x-python", 63 | "name": "python", 64 | "nbconvert_exporter": "python", 65 | "pygments_lexer": "ipython3", 66 | "version": "3.7.7" 67 | } 68 | }, 69 | "nbformat": 4, 70 | "nbformat_minor": 4 71 | } 72 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/C02.6 Visualización de datos (coordenadas paralelas).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 | "# Coordenadas paralelas\n", 15 | "\n", 16 | "\n", 17 | "\n", 18 | "\n", 19 | "En vez de graficar las observaciones en un sistema de coordenadas ortogonales, podríamos poner cada coordenada en ejes paralelos y conectarlos con líneas:\n", 20 | "\n", 21 | "• Las variables estarán en el eje horizontal y las observaciones en el eje\n", 22 | "vertical.\n", 23 | "\n", 24 | "• Esta representación es muy útil en alta dimensión.\n", 25 | "\n", 26 | "• Pero tiene la desventaja de que el orden de las variables influye en los posibles patrones que podrían mostrarse.\n", 27 | "\n", 28 | "\n", 29 | "Podemos dibujar todas las observaciones con un mismo color, o diferenciar por subgrupos si se dispone de una variable categórica. En el ejemplo vemos que el comportamiento de las variables depende fuertemente de la especie de flor." 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "## Curvas de Andrews\n", 37 | "\n", 38 | "Es una versión suavizada de la representación en coordenadas paralelas. Cada observación se representa como una función de $−\\pi$ a $\\pi$. Las funciones se pueden interpretar como proyecciones de los datos en el espacio de las Series de Fourier. Si hay alguna estructura entre los datos, puede ser visible con este gráfico.\n", 39 | "\n", 40 | "" 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": {}, 46 | "source": [ 47 | "## Radares\n", 48 | "\n", 49 | "Es un gráfico bidimensional de tres o más variables cuantitativas representadas en ejes que comienzan desde el mismo punto. Es equivalente a una gráfica de coordenadas paralelas, con los ejes dispuestos radialmente.\n", 50 | "\n", 51 | "También se conoce como gráfico web, gráfico de araña, gráfico de estrellas, o gráfico polar.\n", 52 | "\n", 53 | "Se pueden observar las formas de las diferentes observaciones y las diferencias entre las magnitudes para cada variable.\n", 54 | "\n", 55 | "" 56 | ] 57 | } 58 | ], 59 | "metadata": { 60 | "kernelspec": { 61 | "display_name": "Python 3", 62 | "language": "python", 63 | "name": "python3" 64 | }, 65 | "language_info": { 66 | "codemirror_mode": { 67 | "name": "ipython", 68 | "version": 3 69 | }, 70 | "file_extension": ".py", 71 | "mimetype": "text/x-python", 72 | "name": "python", 73 | "nbconvert_exporter": "python", 74 | "pygments_lexer": "ipython3", 75 | "version": "3.7.7" 76 | } 77 | }, 78 | "nbformat": 4, 79 | "nbformat_minor": 4 80 | } 81 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/C03. Estadística Descriptiva.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 | "# Estadística Descriptiva\n", 15 | "\n", 16 | "Para describir numéricamente los datos en el caso univariante usualmente se utilizan los siguientes estadísticos muestrales:\n", 17 | "\n", 18 | "* Media muestral\n", 19 | "\n", 20 | "* Desviación típica \n", 21 | "\n", 22 | "* Varianza muestral\n", 23 | "\n", 24 | "* Covarianza muestral\n", 25 | "\n", 26 | "* Correlación muestral\n", 27 | "\n", 28 | "En general, nos interesa conocer información como la localización, la dispersión o la dependencia." 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "## Localización \n", 36 | "\n", 37 | "En el caso de una variable, si tenemos las observaciones $x=(x_1,x_2,...,x_n)$ de una característica para $n$ elementos de la población, su media se calcula simplemente como $$\\overline{x}=\\frac{1}{n}\\sum_{i=1}^nx_i=\\frac{x_1+x_2+...+x_n}{n}.$$ Es decir, se trata del promedio de los valores que tiene esa característica en toda la muestra.\\\\\n", 38 | "\n", 39 | "La medida de localización clásica para describir datos multivariantes es el **vector de medias**, que tiene dimensión igual a la cantidad de variables que tengamos (la $p$). Si $\\boldsymbol{X=[x_1,x_2,...,x_p]}$, entonces el vector de medias es $$\\boldsymbol{\\overline{x}}=(\\overline{x_1},\\overline{x_2},...,\\overline{x_p})$$\n", 40 | "\n", 41 | "También existe un vector de medianas. Sin embargo, pensemos un momento: el concepto univariante de la mediana se basa en nuestra capacidad para ordenar los datos. En el caso de datos multivariantes no hay un orden natural de los puntos de datos. Para desarrollar el concepto de la mediana en este caso, primero tenemos que acordar alguna convención para definir el \"orden\".\n", 42 | "\n", 43 | "Una manera de definir orden es utilizando distancias. El caso mas simple es usar la fórmula usual de distancia: si $\\vec{u}=(u_1,u_2,...,u_p)$ y $\\vec{v}=(v_1,v_2,...,v_p)$, se define su distancia como $$d(\\vec{u},\\vec{v})=\\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2}.$$\n", 44 | "\n", 45 | "En el espacio univariante, la mediana tiene una propiedad importante: minimiza la suma de los valores absolutos. Es decir, si $x=(x_1,x_2,...,x_n)$ son las $n$ observaciones de una característica, entonces $med(x)=argmin_{y\\in\\mathbb{R}}\\sum_{i=1}^n|x_i-y|$.\n", 46 | "\n", 47 | "Esta idea nos sirve para definir la **mediana espacial** o **mediana geométrica** (o mediana $L^1$ para los matemáticos) como $$med_G(\\boldsymbol{X})=argmin_{\\boldsymbol{y}\\in\\mathbb{R}^p}\\sum_{i=1}^nd(\\boldsymbol{x},\\boldsymbol{y})$$\n", 48 | "\n", 49 | "Si no entendiste lo anterior, no te preocupes. Para fijar ideas, tomemos $p=2$ (es decir, solo nos interesa hacer investigación sobre dos características) y $n=6$. Entonces se buscaría el punto azul tal que la suma de sus distancias a los puntos rojos sea mínima. Es decir, el que se encuentra uniformemente más cerca de todos.\n", 50 | "\n", 51 | "" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "Otra manera de definir los datos es utilizando la noción de **profundidad**. La medida de profundidad de una observación, relativa a las otras observaciones, mide cuán profunda es esa observación dentro de la nube de datos. Esto proporciona un ordenamiento de las observaciones desde el centro hacia afuera, mientras mayor es la profundidad, más cerca del centro de los datos, y mientras menor es la profundidad, más alejada estará del centro. La observación más profunda (con profundidad máxima) puede definirse como la mediana multivariante." 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "## Dispersión \n", 66 | "\n", 67 | "En el caso univariante, la varianza es la media de las distancias al cuadrado de los valores a la media (QUÉ?). En símbolos: $$var(x)=s^2=\\frac{1}{n-1}\\sum_{i=1}^n(x_i-\\overline{x})^2.$$ Aquí, recordemos que se trata de observar una sola característica de una muestra de $n$ elementos, la cual guardamos en el vector $x=(x_1,x_2,...,x_n)$. Básicamente la varianza es una medida de, en promedio, cómo se alejan las observaciones de su media.\n", 68 | "\n", 69 | "La desviación típica es simplemente la raíz cuadrada de la varianza, y se denota por $sd(x)$\n", 70 | "\n", 71 | "En el caso multivariante, cada característica tiene su propia varianza y desviación típica. Sin embargo, nos interesará también cómo se relacionan las variables entre sí.\n", 72 | "\n", 73 | "La covarianza es un valor que indica el grado de variación conjunta de dos características $\\boldsymbol{x_1}$ y $\\boldsymbol{x_1}$ respecto a sus medias, lo cual permite determinar si existe una **dependencia lineal** entre ambas variables: $$cov(\\boldsymbol{x_1},\\boldsymbol{x_2})=\\frac{1}{n-1}\\sum_{i=1}^n(x_{i1}-\\boldsymbol{\\overline{x_1}})(x_{i2}-\\boldsymbol{\\overline{x_2}})$$\n", 74 | "\n", 75 | "Para cada par de características de nuestro estudio existe una covarianza.\n", 76 | "\n", 77 | "Un concepto íntimamante asociado a la covarianza es el **coeficiente de correlación lineal** (o de Fisher), que se define como $$\\rho(\\boldsymbol{x_1},\\boldsymbol{x_2})=\\frac{cov(\\boldsymbol{x_1},\\boldsymbol{x_2})}{sd(\\boldsymbol{x_1})sd(\\boldsymbol{x_2})}=\\frac{\\sum_{i=1}^n(x_{i1}-\\boldsymbol{\\overline{x_1}})(x_{i2}-\\boldsymbol{\\overline{x_2}})}{\\sqrt{\\sum_{i=1}^n(x_{i1}-\\boldsymbol{\\overline{x_1}})}\\sqrt{\\sum_{i=1}^n(x_{i2}-\\boldsymbol{\\overline{x_2}})}}$$\n", 78 | "\n", 79 | "\n", 80 | "El coeficiente de correlación siempre es un número entre -1 y 1. Su interpretación es la siguiente:\n", 81 | "\n", 82 | "* Si vale 1, entonces hay una relación lineal **directa** entre las dos características. Es decir, existe un número positivo $a$ y un número $b$ tal que, para cualquier individuo de la población, se tiene \"característica1 $=$ $a*$característica2 + b\".\n", 83 | "\n", 84 | "\n", 85 | "* Si vale -1, entonces hay una relación lineal **inversa** entre las dos características. Es decir, existe un número negativo $a$ y un número $b$ tal que, para cualquier individuo de la población, se tiene \"característica1 $=$ $a*$característica2 + b\".\n", 86 | "\n", 87 | "\n", 88 | "* Si vale 0, entonces no existe números $a$ y $b$ tales que característica1 $=$ $a*$característica2 + b **uniformemente**.\n", 89 | "\n", 90 | "**Observación MUY IMPORTANTE.** El hecho de que la correlación lineal sea 0 solo significa que no hay relación lineal entre las variables. Sin embargo, se puede tener relación no lineal." 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "Es claro que existe un coeficiente de correlación para cada par de característica (y la correlación de una característica consigo misma es 1). " 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "Una vez que tenemos las varianzas,covarianzas y correlaciones, se puede construir la **matriz de covarianzas**:\n", 105 | "\n", 106 | "$$\\boldsymbol{S_X}=\\left(\\begin{array}{ccccc}var(\\boldsymbol{x_1})&cov(\\boldsymbol{x_1},\\boldsymbol{x_2})&cov(\\boldsymbol{x_1},\\boldsymbol{x_3})&\\cdots&cov(\\boldsymbol{x_1},\\boldsymbol{x_p})\\\\cov(\\boldsymbol{x_2},\\boldsymbol{x_1})&var(\\boldsymbol{x_2})&cov(\\boldsymbol{x_2},\\boldsymbol{x_3})&\\cdots&cov(\\boldsymbol{x_2},\\boldsymbol{x_p})\\\\cov(\\boldsymbol{x_3},\\boldsymbol{x_1})&cov(\\boldsymbol{x_3},\\boldsymbol{x_2})&var(\\boldsymbol{x_3})&\\cdots&cov(\\boldsymbol{x_3},\\boldsymbol{x_p})\\\\\\vdots&\\vdots&\\vdots&\\vdots&\\vdots\\\\cov(\\boldsymbol{x_p},\\boldsymbol{x_1})&cov(\\boldsymbol{x_p},\\boldsymbol{x_2})&cov(\\boldsymbol{x_p},\\boldsymbol{x_3})&\\cdots&var(\\boldsymbol{x_p})\\end{array}\\right)$$" 107 | ] 108 | }, 109 | { 110 | "cell_type": "markdown", 111 | "metadata": {}, 112 | "source": [ 113 | "Así como tenemos la matriz de covarianzas, también tendremos de manera análoga la matriz de correlaciones $\\boldsymbol{R_X}$. Esta tiene propiedades importantes: si su determinante es 0, entonces hay variables que son combinación lineal de otras, y su rango indica cuántas son linealmente independientes." 114 | ] 115 | } 116 | ], 117 | "metadata": { 118 | "kernelspec": { 119 | "display_name": "Python 3", 120 | "language": "python", 121 | "name": "python3" 122 | }, 123 | "language_info": { 124 | "codemirror_mode": { 125 | "name": "ipython", 126 | "version": 3 127 | }, 128 | "file_extension": ".py", 129 | "mimetype": "text/x-python", 130 | "name": "python", 131 | "nbconvert_exporter": "python", 132 | "pygments_lexer": "ipython3", 133 | "version": "3.7.7" 134 | } 135 | }, 136 | "nbformat": 4, 137 | "nbformat_minor": 4 138 | } 139 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/bagplot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/bagplot.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/barreras.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/barreras.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/boxplot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/boxplot2.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/boxplot_iris1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/boxplot_iris1.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/boxplot_iris2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/boxplot_iris2.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/coordenadas1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/coordenadas1.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/coordenadas2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/coordenadas2.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/coordenadas3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/coordenadas3.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/correlacion1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/correlacion1.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/empty.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/hist1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/hist1.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/hist2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/hist2.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/hist3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/hist3.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/kernel1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/kernel1.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/kernel2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/kernel2.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/kernel3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/kernel3.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/logo.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/mediana1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/mediana1.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/practica_Python.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Thu Nov 19 13:21:23 2020 4 | 5 | @author: hp 6 | """ 7 | 8 | 9 | import numpy as np 10 | import pandas as pd 11 | import matplotlib.pyplot as plt 12 | import seaborn as sns 13 | import plotly.express as px 14 | import plotly.offline as ply 15 | 16 | 17 | from plotly.offline import plot 18 | 19 | 20 | #%% 21 | 22 | iris = pd.read_csv("C:/Users/hp master/Documents/SciData/Est_Mult\Mod01. Espacios multivariantes/C01. Mediciones con multiples variables/iris.csv") 23 | iris.head() 24 | 25 | iris = iris.drop("Unnamed: 0",axis=1) 26 | iris.head() 27 | 28 | 29 | #%% 30 | 31 | iris.shape 32 | 33 | iris["Species"].value_counts() 34 | 35 | #%% 36 | 37 | '''BOXPLOTS''' 38 | 39 | sns.set(style="ticks", palette="muted") 40 | ax = sns.boxplot(x="Species", y="Petal.Length", data=iris) 41 | ax 42 | 43 | #%% 44 | 45 | '''boxplots para cada variable divididos por especie''' 46 | 47 | iris.boxplot(by="Species",figsize=(12,6)) 48 | 49 | #%% 50 | 51 | '''HISTOGRAMAS''' 52 | 53 | iris.hist(edgecolor="black",linewidth=0.2,grid=False,figsize=(12,6)) 54 | 55 | #%% 56 | 57 | iris.describe() 58 | 59 | #%% 60 | '''Histograma de una variable por categorías''' 61 | 62 | plt.hist(iris[iris["Species"]=="setosa"]["Petal.Length"],alpha=0.5,bins=10) 63 | plt.hist(iris[iris["Species"]=="versicolor"]["Petal.Length"],alpha=0.5,bins=10) 64 | plt.hist(iris[iris["Species"]=="virginica"]["Petal.Length"],alpha=0.5,bins=10) 65 | plt.show() 66 | #%% 67 | 68 | '''Densidad kernel''' 69 | 70 | ## UNIVARIABLE 71 | 72 | sns.distplot(iris["Petal.Length"],bins=10) 73 | plt.show() 74 | 75 | ## Varias columnas 76 | sns.distplot(iris[iris["Species"]=="setosa"]["Petal.Length"],bins=10) 77 | sns.distplot(iris[iris["Species"]=="versicolor"]["Petal.Length"],bins=10) 78 | sns.distplot(iris[iris["Species"]=="virginica"]["Petal.Length"],bins=10) 79 | 80 | #%% 81 | 82 | '''Scatterplot''' 83 | 84 | colores = pd.DataFrame({"Cod":["red","blue","green"],"Species":["setosa","versicolor","virginica"]}) 85 | iris = iris.join(colores.set_index(["Species"]),on=["Species"],how="inner") 86 | 87 | plt.scatter(iris["Petal.Length"],iris["Petal.Width"], s=200,c=iris["Cod"],marker='.',alpha=0.5) 88 | 89 | ######### alternativa 90 | sns.FacetGrid(iris,hue="Species",height=5).map(plt.scatter,"Petal.Length","Petal.Width").add_legend() 91 | 92 | ######### scatter con histogramas 93 | 94 | sns.jointplot(x="Petal.Length",y="Petal.Width",data=iris) 95 | 96 | ######## scatter 3d 97 | 98 | fig = px.scatter_3d(iris,x="Sepal.Length",y="Sepal.Width",z="Petal.Width",color="Species") 99 | plot(fig) 100 | 101 | ######## scatter matrix 102 | 103 | sns.pairplot(iris,hue="Species") 104 | 105 | 106 | sns.pairplot(iris,hue="Species",diag_kind="hist") 107 | 108 | #%% 109 | '''Medidas descriptivas''' 110 | 111 | cov_iris = iris.cov() 112 | corr_iris = iris.corr() 113 | 114 | plt.figure(figsize=(8,6)) 115 | ax = sns.heatmap(iris.corr(), annot=True, linecolor='white',linewidths=0.3, fmt='.2f', cbar=True, cmap="GnBu") 116 | 117 | #%% 118 | '''Coordenadas paralelas''' 119 | 120 | from pandas.plotting import parallel_coordinates 121 | from pandas.plotting import andrews_curves 122 | 123 | parallel_coordinates(iris,"Species",colormap="rainbow") 124 | 125 | ''' Curvas de Andrews ''' 126 | 127 | andrews_curves(iris, "Species", colormap="rainbow") 128 | 129 | '''Radar: ver https://python-graph-gallery.com/radar-chart/''' 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/practica_Python_Final.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Thu Nov 19 13:21:23 2020 4 | 5 | @author: hp 6 | """ 7 | 8 | 9 | 10 | import numpy as np 11 | import pandas as pd 12 | import matplotlib.pyplot as plt 13 | import seaborn as sns 14 | import plotly.express as px 15 | import plotly.offline as ply 16 | 17 | from plotly.offline import plot 18 | #%% 19 | 20 | 21 | #%% 22 | 23 | iris = pd.read_csv("C:/Users/hp master/Documents/SciData/Est_Mult/Mod01. Espacios multivariantes/C01. Mediciones con multiples variables/iris.csv") 24 | iris.head() 25 | 26 | iris.drop("Unnamed: 0",axis=1,inplace=True) 27 | iris.head() 28 | 29 | #%% 30 | 31 | iris.shape 32 | 33 | iris["Species"].value_counts() 34 | 35 | #%% 36 | 37 | '''BOXPLOTS''' 38 | 39 | sns.set(style="ticks", palette="muted") 40 | ax = sns.boxplot(x="Species", y="Petal.Length", data=iris) 41 | ax 42 | 43 | #%% 44 | 45 | '''boxplots para cada variable divididos por especie''' 46 | 47 | iris.boxplot(by="Species",figsize=(12,6)) 48 | 49 | #%% 50 | 51 | '''HISTOGRAMAS''' 52 | 53 | iris.hist(edgecolor="black",linewidth=0.2,grid=False,figsize=(12,6)) 54 | 55 | #%% 56 | 57 | # Hola a todos 58 | iris.describe() 59 | 60 | #%% 61 | '''Histograma de una variable por categorías''' 62 | 63 | #iris[iris["Species"]=="versicolor"].head(15) 64 | #print(iris) 65 | plt.hist(iris[iris["Species"]=="setosa"]["Petal.Length"],alpha=0.5,bins=10) 66 | plt.hist(iris[iris["Species"]=="versicolor"]["Petal.Length"],alpha=0.5,bins=10) 67 | plt.hist(iris[iris["Species"]=="virginica"]["Petal.Length"],alpha=0.5,bins=10) 68 | plt.show() 69 | #%% 70 | 71 | '''Densidad kernel''' 72 | 73 | ## UNIVARIABLE 74 | 75 | sns.distplot(iris["Petal.Length"],bins=10) 76 | plt.show() 77 | 78 | ## Varias columnas 79 | sns.distplot(iris[iris["Species"]=="setosa"]["Petal.Length"],bins=10) 80 | sns.distplot(iris[iris["Species"]=="versicolor"]["Petal.Length"],bins=10) 81 | sns.distplot(iris[iris["Species"]=="virginica"]["Petal.Length"],bins=10) 82 | 83 | #%% 84 | 85 | '''Scatterplot''' 86 | 87 | colores = pd.DataFrame({"Cod":["red","blue","green"], 88 | "Species":["setosa","versicolor","virginica"]}) 89 | iris = iris.join(colores.set_index(["Species"]),on=["Species"],how="inner") 90 | 91 | iris.head() 92 | 93 | plt.scatter(iris["Petal.Length"],iris["Petal.Width"], 94 | s=200,c=iris["Cod"],marker='.',alpha=0.5) 95 | 96 | ######### alternativa 97 | sns.FacetGrid(iris,hue="Species",height=5).map(plt.scatter, 98 | "Petal.Length", 99 | "Petal.Width").add_legend() 100 | 101 | ######### scatter con histogramas 102 | 103 | sns.jointplot(x="Petal.Length",y="Petal.Width",data=iris) 104 | 105 | ######## scatter 3d 106 | 107 | fig = px.scatter_3d(iris,x="Sepal.Length", 108 | y="Sepal.Width", 109 | z="Petal.Width", 110 | color="Species") 111 | plot(fig) 112 | 113 | ######## scatter matrix 114 | 115 | sns.pairplot(iris,hue="Species") 116 | 117 | 118 | sns.pairplot(iris,hue="Species",diag_kind="hist",) 119 | 120 | #%% 121 | '''Medidas descriptivas''' 122 | 123 | cov_iris = iris.cov() 124 | corr_iris = iris.corr() 125 | 126 | plt.figure(figsize=(8,6)) 127 | ax = sns.heatmap(iris.corr(), 128 | annot=True, 129 | linecolor='white', 130 | linewidths=0.3, 131 | fmt='.2f', 132 | cbar=True, 133 | cmap="GnBu") 134 | 135 | #%% 136 | '''Coordenadas paralelas''' 137 | 138 | from pandas.plotting import parallel_coordinates 139 | from pandas.plotting import andrews_curves 140 | 141 | iris[iris.columns[0:5]].head() 142 | 143 | iris[["Sepal.Length","Petal.Length","Sepal.Width","Petal.Width","Species"]] 144 | 145 | parallel_coordinates(iris[iris.columns[0:5]],"Species",colormap="rainbow") 146 | 147 | parallel_coordinates(iris[["Sepal.Length","Petal.Length","Sepal.Width","Petal.Width","Species"]], 148 | "Species",colormap="rainbow") 149 | 150 | ''' Curvas de Andrews ''' 151 | 152 | andrews_curves(iris, "Species", colormap="rainbow") 153 | 154 | '''Radar: ver https://python-graph-gallery.com/radar-chart/''' 155 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/practica_RStudio.R: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/practica_RStudio.R -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/practica_RStudio_Final.R: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/practica_RStudio_Final.R -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/quartiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/quartiles.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/scatter1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/scatter1.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/scatter2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/scatter2.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/scatter3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/scatter3.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/scatter4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/scatter4.png -------------------------------------------------------------------------------- /Mod1_Espacios_Multivariantes/scatter5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod1_Espacios_Multivariantes/scatter5.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C04. Variables aleatorias.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 | "# Variables aleatorias\n", 15 | "\n", 16 | "Una variable aleatoria univariante es simplemente una medida que hacemos de una característica de una población en cada elemento de nuestra muestra.\n", 17 | "\n", 18 | "Por su parte, cuando se mide un conjunto de características en cada elemento, diremos que se ha definido una **variable aleatoria multivariante**. \n", 19 | "\n", 20 | "Estas pueden ser cualitativas o cuantitativas. Algunos ejemplos son:\n", 21 | "\n", 22 | "* Para cada estudiante de una universidad, medimos la edad, el sexo, la nota media de un curso, la ciudad de residencia.\n", 23 | "\n", 24 | "* Para cada empresa de una zona industrial medimos el número de trabajadores, la facturación, el sector industrial.\n", 25 | "\n", 26 | "* Para cada país medimos 10 indicadores de desarrollo.\n", 27 | "\n", 28 | "Como antes, en la matriz de datos cada fila representa un elemento de la población y cada columna es el valor de una característica en ese elemento de la población. Típicamente tendremos $n$ elementos y $p$ características, de modo que trataremos con matrices de $n$ filas con $p$ columnas. \n", 29 | "\n", 30 | "**Notación**\n", 31 | "\n", 32 | "Usaremos letras mayúsculas (sin negrita) para representar variables aleatorias univariantes y sus respectivas letras minúsculas para denotar un valor observado.\n", 33 | "\n", 34 | "Por ejemplo, $X$ y $Y$ pueden representar la edad y el sexo de un estudiante *en abstracto*, en tanto que $x_1=17$ y $y_1=$hombre son las características observadas en el primer elemento de nuestra muestra." 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": {}, 40 | "source": [ 41 | "## Distribución conjunta y marginales\n", 42 | "\n", 43 | "La distribución conjunta de una variable aleatoria multivariante es la regla matemática que sirve para calcular las probabilidades de que la variable (multivariante) tome valores en un cierto conjunto. Esto es: la ley de probabilidades que siguen conjuntamente las observaciones.\n", 44 | "\n", 45 | "Por ejemplo, digamos que lanzamos tres dados justos. Sea $(X_1,X_2,X_3)$ el vector multivariante que mide las tres posibles salidas. Decimos que conocemos la distribución conjunta de los tres dados si, para cada tripleta de números $(a,b,c)$, sabemos $P((X_1,X_2,X_2)=(a,b,c))$. Es decir, si conocemos la probabilidad de obtener cualquier resultado del experimento. \n", 46 | "\n", 47 | "Consideremos un caso simple: únicamente mediremos dos características de nuestro estudio. Sea $(X,Y)$ el vector aleatorio. Si $(u,v)$ es una pareja de números, entonces se define la **distribución conjunta de $(X,Y)$** en el punto $(u,v)$ como la función $F_{X,Y}(u,v)$ dada por\n", 48 | "\n", 49 | "$$F_{X,Y}(u,v)=P(X\\le u,Y\\le v).$$\n", 50 | "\n", 51 | "Por su parte, como las mismas $X$ y $Y$ son variables aleatorias, tiene sus propias leyes de probabilidad. Se definen las **distribuciones marginales** de $X$ y $Y$, respectivamente, como $F_X(u)=P(X\\le u)$ y $F_Y(v)=P(Y\\le v)$.\n", 52 | "\n", 53 | "Esta tiene las siguienes propiedades:\n", 54 | "\n", 55 | "* $0\\le F_{X,Y}(u,v)\\le$ para cualquier pareja $(u,v)$.\n", 56 | "\n", 57 | "\n", 58 | "* $F_{X,Y}(u,v)$ es monótona creciente en cualquiera de sus variables. Es decir, si $u_1\\le u_2$ entonces $F_{X,Y}(u_1,v)\\le F_{X,Y}(u_2,v)$ para cualquier $v$. Y lo mismo para la segunda variable.\n", 59 | "\n", 60 | "\n", 61 | "* $\\lim_{u,v\\to-\\infty}F_{X,Y}(u,v)=\\lim_{u\\to-\\infty}F_{X,Y}(u,v)=\\lim_{v\\to-\\infty}F_{X,Y}(u,v)=0$\n", 62 | "\n", 63 | "\n", 64 | "* $\\lim_{u,v\\to\\infty}F_{X,Y}(u,v)=1$\n", 65 | "\n", 66 | "\n", 67 | "* $\\lim_{u\\to-\\infty}F_{X,Y}(u,v)=F_Y(v)$ y $\\lim_{v\\to-\\infty}F_{X,Y}(u,v)=F_X(u)$ (que son las distribuciones marginales).\n", 68 | "\n", 69 | "\n", 70 | "\n" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "### Caso continuo \n", 78 | "\n", 79 | "El vector aleatorio $(X,Y)$ se dice **continuo** si existe una función $f_{X,Y}$ que cumpla, para cualquier pareja de números $(u,v)$ la siguiente igualdad: \n", 80 | "\n", 81 | "$$F_{X,Y}(u,v)=\\int_{-\\infty}^u\\int_{-\\infty}^v f_{X,Y}(x,y)\\,\\mathrm{d}y\\mathrm{d}x.$$\n", 82 | "\n", 83 | "A esta función se le conoce como **densidad del vector aleatorio (X,Y)**. Las densidades marginales se definen como \n", 84 | "\n", 85 | "$$f_X(u)=\\int_{-\\infty}^\\infty f_{X,Y}(u,v)\\,\\mathrm{d}v\\,\\,y\\,\\,f_Y(v)=\\int_{-\\infty}^\\infty f_{X,Y}(u,v)\\,\\mathrm{d}u$$" 86 | ] 87 | }, 88 | { 89 | "cell_type": "markdown", 90 | "metadata": {}, 91 | "source": [ 92 | "**Ejemplo.**\n", 93 | "\n", 94 | "Supongamos que $(X,Y)$ tienen función de densidad conjunta dada por $$f_{X,Y}(u,v)=\\left\\{\\begin{array}{cc}4uv&si\\,\\,\\,0\\le u,v\\le 1\\\\0&e.o.c\\end{array}\\right.$$\n", 95 | "\n", 96 | "* Las densidades marginales serían: $$f_X(u)=\\int_{-\\infty}^\\infty f_{X,Y}(u,v)\\,\\mathrm{d}v=\\int_0^14uv\\,\\mathrm{d}v=4u\\left.\\frac{v^2}{2}\\right|_{v=0}^1=2u$$ si $0\\le u\\le v$. De la misma manera obtenemos $f_Y(v)=2v$ si $0\\le v\\le 1$.\n", 97 | "\n", 98 | "\n", 99 | "* La función de distribución conjunta es $$F_{X,Y}(u,v)=\\int_{-\\infty}^u\\int_{-\\infty}^v f_{X,Y}(x,y)\\,\\mathrm{d}y\\mathrm{d}x= \\int_{0}^u\\int_{0}^v 4xy\\,\\mathrm{d}y\\mathrm{d}x=u^2v^2$$ si $0\\le u,v\\le1$\n", 100 | "\n" 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "## Distribución condicional e independencia\n", 108 | "\n", 109 | "Sean $(X,Y)$ dos variables aleatorias con densidades $f_X$ y $f_Y$, y conjunta $f_{X,Y}$. Se define la **densidad condicional de X dado Y** como $$f_{X|Y}(u|v)=\\frac{f_{X,Y}(u,v)}{f_Y(v)}.$$ De manera análoga se define la densidad condicional de Y dado X.\n", 110 | "\n", 111 | "Intuitivamente, partimos del concepto de probabilidad condicional: si $A$ y $B$ son eventos que pueden ocurrir en nuestro experimento, entonces $P(A|B)=\\frac{P(A\\cap B)}{P(B)}$ es la probabilidad de que suceda el evento $A$ si sabemos que ocurrió el evento $B$.\n", 112 | "\n", 113 | "De esta manera, tenemos $F_{X|Y}(u,v)=\\frac{F_{X,Y}(u,v)}{F_Y(v)}=P(X\\le u|Y\\le v)$." 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "### Independencia\n", 121 | "\n", 122 | "Se dice que $X$ y $Y$ son independientes si $f_{X,Y}(u,v)=f_X(u)f_Y(v)$ para cualesquiera $u,v$. Esto equivale a que $F_{X,Y}(u,v)=F_X(u)F_Y(v)$. Además se tiene $f_{Y|X}(u|v)=f_Y(v)$ y $f_{X|Y}(u|v)=f_X(u)$. \n", 123 | "\n", 124 | "Es decir, si son independientes, condicionar una respecto de la otra no produce cambios (en cristiano: lo que pasa con una característica no afecta de ninguna manera lo que sucede con la otra).\n", 125 | "\n", 126 | "**Observación:** esto no significa que sean \"variables disjuntas\". Es decir, se pueden tener dos variables $X,Y$ independientes, pero el evento $\\{X\\le a\\}\\cap\\{Y\\le b\\}\\neq\\emptyset$. " 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "## Esperanza, covarianza y correlación.\n", 134 | "\n", 135 | "Sea $\\boldsymbol{X}=(X_1,X_2,\\cdots,X_p)$ un vector aleatorio formado por $p$ variables aleatorias univariantes. Para cada $i$ fijo, se define la **esperanza de la variable aleatoria $i$** como $E[X_i]=\\int_{-\\infty}^\\infty xf_{X_i}(x)\\,\\mathrm{d}x$. Este, es el valor de equilibrio de la variable aleatoria.\n", 136 | "\n", 137 | "Por su parte, el **vector de esperanza** de $\\boldsymbol{X}$ es simplemente $$E[\\boldsymbol{X}]=(E[X_1],E[X_2],...,E[X_p]).$$ Este vector representa las coordenadas del punto de equilibrio del vector aleatorio.\n", 138 | "\n", 139 | "Por otra parte, si $X$ es una variable aleatoria univariante, su varianza se define como $Var(X)=E[(X-E[X])^2]=E[X^2]-E[X]^2$, y siempre es un número mayor o igual a 0 (solo es 0 si la variable aleatoria es constante; es decir, si todos los elementos de la muestra tienen exactamente la misma característica). A su vez, si $X$ y $Y$ son dos variables aleatorias, entonces $Cov(X,Y)=E[(X-E[X])(Y-E[Y])]=E[XY]-E[X]E[Y]$, en tanto que $Corr(X,Y)=\\frac{Var(X,Y)}{sd(X)sd(Y)}$, donde $sd$ de una variable aleatoria es la raíz cuadrada de su varianza.\n", 140 | "\n", 141 | "La **matriz de covarianza** de un vector aleatorio (es decir, una variable aleatoria multivariante) $X=(X_1,X_2,...,X_m)$ es una matriz simétrica y semidefinida positiva donde los elementos de la diagonal principal son las varianzas de las $X_i$ y los elementos fuera de la diagonal principal son las covarianzas.\n", 142 | "\n", 143 | "Más aún, si $X=(X_1,X_2,...,X_p)$ y $Y=(Y_1,Y_2,...,Y_m)$ son dos vectores aleatorios (notar que no necesariamente del mismo tamaño) entonces la matriz de covarianza de $X$ y $Y$ es de tamaño $p\\times m$ se define con $Cov(X_i,Y_j)$. En símbolos concretos, si $p=2$ y $q=3$, entonces: \n", 144 | "\n", 145 | "$$Cov(X,Y)=\\left(\\begin{array}{ccc}Cov(X_1,Y_1)&Cov(X_1,Y_2)&Cov(X_1,Y_3)\\\\Cov(X_2,Y_1)&Cov(X_2,Y_2)&Cov(X_2,Y_3)\\end{array}\\right)$$\n", 146 | "\n", 147 | "Análogamente se define su correlación.\n" 148 | ] 149 | }, 150 | { 151 | "cell_type": "markdown", 152 | "metadata": {}, 153 | "source": [ 154 | "### Esperanza condicional\n", 155 | "\n", 156 | "Si $X,Y$ son dos variables aleatorias unidimensionales, el valor esperado de $X$ dado $Y$ se define como $$E_{X|Y}[u|v]=\\int xf_{x|y}(v|x)\\,\\mathrm{d}x,$$ y es una función que depende de $v$.\n", 157 | "\n", 158 | "Esta tiene varias propiedades interesantes, que son mas o menos claras cuando se le ve desde el punto de vista totalmente matemático: si $(\\Omega,\\mathcal{F},P)$ es un espacio de probabilidad, $X$ es una variable aleatorio *con varianza finita* (es decir, $X\\in L^2(\\Omega)$, y $\\mathcal{G}$ es una subálgebra de $\\mathcal{F}$, entonces $E[X|\\mathcal{G}]$ es la única variable aleatoria tal que $$\\int_G X\\,\\mathrm{d}P=\\int_G E[X|\\mathcal{G}]\\,\\mathrm{d}P$$ para toda $G\\in\\mathcal{G}$.\n", 159 | "\n", 160 | "Esto es: $E[X|\\mathcal{G}]$ es la proyección ortogonal (en el espacio de Hilbert $L^2(\\Omega)$) de $X$ sobre las funciones $\\mathcal{G}$-medibles." 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": {}, 166 | "source": [ 167 | "" 168 | ] 169 | }, 170 | { 171 | "cell_type": "markdown", 172 | "metadata": {}, 173 | "source": [ 174 | "**Observaciones teóricas**\n", 175 | "\n", 176 | "" 177 | ] 178 | } 179 | ], 180 | "metadata": { 181 | "kernelspec": { 182 | "display_name": "Python 3", 183 | "language": "python", 184 | "name": "python3" 185 | }, 186 | "language_info": { 187 | "codemirror_mode": { 188 | "name": "ipython", 189 | "version": 3 190 | }, 191 | "file_extension": ".py", 192 | "mimetype": "text/x-python", 193 | "name": "python", 194 | "nbconvert_exporter": "python", 195 | "pygments_lexer": "ipython3", 196 | "version": "3.7.7" 197 | } 198 | }, 199 | "nbformat": 4, 200 | "nbformat_minor": 4 201 | } 202 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C05.1 Distribuciones principales (Normales).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 | "# Distribuciones normales\n", 15 | "\n", 16 | "La función de densidad de una variable aleatoria $X$ **normal** o **gaussiana** (univariante) con media $\\mu_X=E[X]$ y varianza $Var(X)=\\sigma_X$ viene dada por $$f_X(u)=\\frac{e^{-\\frac{(u-\\mu_X)^2}{2\\sigma_X^2}}}{\\sqrt{2\\pi\\sigma_X^2}}.$$ Que $X$ sea normal con esos parámetros se denota por $X\\sim N(\\mu_X,\\sigma^2_X)$.\n", 17 | "\n", 18 | "En la siguiente imagen, a la izquierda se muestran tres normales con la misma media pero diferente varianza (a menor varianza, la curva se vuelve mas flaca). A la derecha se muestran tres normales con la misma varianza pero diferente media (la media mueve horizontalmente a la gráfica pero no altera su forma)\n", 19 | "\n", 20 | "\n", 21 | "\n", 22 | "Cuando $\\mu_X=0$ y $Var(X)=1$, se dice que $X$ es una normal estándar (o que está estandarizada).\n", 23 | "\n", 24 | "**Observación:** toda variable $X$ se puede estandarizar. Es decir, existe manera de obtener una variable $X^\\prime$ a partir de $X$ y cuya media es 0 y varianza es 1. A saber: $$X^\\prime=\\frac{X-E[X]}{sd(X)}.$$" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "## Normal multivariante\n", 32 | "\n", 33 | "El vector aleatorio $X=(X_1,X_2,...,X_p)$ es **normal multivariante** si $a_1X_1+a_2X_2+...+a_pX_p$ es una variable aleatoria normal sin importar quiénes sean los números $a_1,a_2,\\cdots,a_p$.\n", 34 | "\n", 35 | "Esto implica, en particular, que si $X$ es un vector normal multivariante, entonces cada una de sus componentes es una variable aleatoria normal (pero **ojo**: al revés no es cierto; puedes tener que $X_1,X_2,...,X_p$ sean normales pero $X=(X_1,X_2,...,X_p)$ no sea una normal multivariante).\n", 36 | "\n", 37 | "Es **muy importante** notar que si $X$ es una normal multivariante de dimensión $p$, entonces existen un vector aleatorio $Z=(Z_1,Z_2,...,Z_m)$, con $Z_i\\sim N(0,1)$ y cuyas componentes son independientes, un vector de números $\\mu=(\\mu_1,\\mu_2,...,\\mu_p)$, y una matriz $A$ de $p\\times m$ tales que $X=AZ+\\mu$. Es decir, toda normal multivariante es una transformación afín de una normal multivariante donde cada componente es normal estándar y sus componentes son independientes.\n", 38 | "\n" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "### Función de densidad multivariante.\n", 46 | "\n", 47 | "Si $X$ es una normal multivariante de $p$ dimensiones, entonces la densidad de $X$ viene dada por $$f_X(\\vec{u})=\\frac{1}{(2\\pi)^{p/2}|\\Sigma|^{1/2}}e^{-\\frac{1}{2}\\langle \\vec{u}-\\vec{\\mu},\\Sigma^{-1}(\\vec{u}-\\vec{\\mu})\\rangle},$$ donde $\\vec{u}=(u_1,u_2,...,u_p)$ es un vector de $p$ números (es la variable independiente de la función), $\\vec{\\mu}=(\\mu_1,\\mu_2,...,\\mu_p)$ es un vector fijo de $p$ números y $\\Sigma$ es una matriz invertible simétrica y definida positiva.\n", 48 | "\n", 49 | "En este caso, resulta que $\\vec{\\mu}$ es el vector de medias de $X$ y $\\Sigma$ es la matriz de covarianzas de $X$. Esto se denota por $X\\sim N_p(\\vec{\\mu_X},\\Sigma_X)$.\n", 50 | "\n", 51 | "De lo anterior se sigue que si $X_1,X_2,...,X_p$ son normales incorrelacionadas, entonces son independientes." 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "## Normal estándar multivariante\n", 59 | "\n", 60 | "Si el vector aleatorio $X$ es normal, se dice que es estándar si su vector de medias consiste únicamente en ceros y su matriz de covarianzas es la matriz identidad (esto es: si $X=(X_1,X_2,\\cdots,X_p)$ es tal que $E[X_i]=0$ y $\\Sigma_X$ es la matriz con $p$ filas y $p$ columnas donde todos sus elementos son 0 excepto los de la diagonal principal, cuyos valores son iguales a 1). Esto es lo mismo que decir que las $X_i$ son variables aleatorias estándar e independientes.\n", 61 | "\n", 62 | "El hecho de que $X$ sea una normal multivariante estándar lo denotamos entonces por $X\\sim N_p(\\textbf{0}_p,I_p)$\n", 63 | "\n", 64 | "¿Cómo estandarizamos una normal multivariante? Si $X\\sim N_p(\\vec{\\mu_X},\\Sigma_X)$, entonces $Z=\\Sigma_X^{-1/2}(X-\\vec{\\mu_X})$ es una normal estándar multivariante.\n", 65 | "\n", 66 | "Y de hecho el proceso inverso también es importante: si queremos obtener una $X\\sim N_p(\\vec{\\mu_X},\\Sigma_X)$, basta con tomar una $Z\\sim N_p(\\textbf{0}_p,I_p)$ y definir $X$ como $X=\\Sigma_X^{1/2}Z+\\vec{\\mu_X}$." 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "## Transformaciones afines\n", 74 | "\n", 75 | "Otra propiedad de las normales univariantes, y que hemos ocupado implícitamente, es que si $X\\sim N(\\mu,\\sigma^2)$, entonces $aX+b\\sim N(a\\mu+b,a^2\\sigma^2)$ para cualesquiera números $a$ y $b$. Es decir, las transformaciones afines de una normal vuelven a ser normales y los nuevos parámetros son fácilmente calculables a partir de la original.\n", 76 | "\n", 77 | "Con las normales multivariantes se mantiene dicha propiedad: si $X\\sim N_p(\\vec{\\mu},\\Sigma)$, $A$ es una matriz de $q\\times p$ y $b$ es un vector, entonces $AX+b\\sim N_q(A\\vec{\\mu}+b,A\\Sigma A^T)$." 78 | ] 79 | }, 80 | { 81 | "cell_type": "markdown", 82 | "metadata": {}, 83 | "source": [ 84 | "## Representaciones gráficas (caso de dos variables)\n", 85 | "\n", 86 | "En el caso de dos variables $X,Y$ tales que $(X,Y)$ es una normal bivariante, podemos observar gráficamente cómo cambian los scatterplots cuando variamos su matriz de correlaciones.\n", 87 | "\n", 88 | "\n" 89 | ] 90 | } 91 | ], 92 | "metadata": { 93 | "kernelspec": { 94 | "display_name": "Python 3", 95 | "language": "python", 96 | "name": "python3" 97 | }, 98 | "language_info": { 99 | "codemirror_mode": { 100 | "name": "ipython", 101 | "version": 3 102 | }, 103 | "file_extension": ".py", 104 | "mimetype": "text/x-python", 105 | "name": "python", 106 | "nbconvert_exporter": "python", 107 | "pygments_lexer": "ipython3", 108 | "version": "3.7.7" 109 | } 110 | }, 111 | "nbformat": 4, 112 | "nbformat_minor": 4 113 | } 114 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C05.2 Distribuciones principales (distancia de Mahalanobis).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 | "# Distancia de Mahalanobis\n", 15 | "\n", 16 | "Dados dos puntos en un espacio $p$-dimensional, digamos $\\vec{x}=(x_1,x_2,x_3,...,x_p)$ y $\\vec{y}=(y_1,y_2,y_3,...,y_p)$ (recordemos que las $x_i$ y las $y_i$ son números), se define la **distancia euclídea** entre estos como $$d(\\vec{x},\\vec{y})=\\sqrt{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_p-y_p)^2}.$$\n", 17 | "\n", 18 | "Aunque útil, esta manera de medir la distancia entre dos puntos presenta dos inconvenientes, muy comunes en Estadística: las unidades y, peor aún, si las características están correlacionadas.\n", 19 | "\n", 20 | "Para solventar estos problemas, se utiliza la llamada **distancia de Mahalanobis**. Es decir, siempre que sepamos que hay existencia de características correlacionadas, utilizaremos esta forma de medir distancias.\n", 21 | "\n", 22 | "Supongamos que una variable aleatoria $p$-dimensional con vector de medias $\\vec{\\mu}$ y matriz de covarianzas $\\Sigma$. \n", 23 | "\n", 24 | "Es decir, $X=(X_1,X_2,...,X_p)$. Si $\\vec{x}=(x_1,x_2,...,x_p)$ es una observación de $X$, se define su distancia de Mahalanobis como \n", 25 | "\n", 26 | "$$d_M(\\vec{x})=\\sqrt{(\\vec{x}-\\vec{\\mu})\\Sigma^{-1}(\\vec{x}-\\vec{\\mu})}$$\n", 27 | "\n", 28 | "Notemos que si $\\Sigma = I$, entonces Mahalanobis y euclídea son el mismo valor. \n", 29 | "\n", 30 | "\n", 31 | "\n", 32 | "\n", 33 | "En la práctica no conocemos el centro o la estructura de la distribución poblacional de la que obtuvimos los datos. Por lo tanto se usan los estimadores muestrales para estimar las distancias, la media de la muestra y la matriz de covarianza muestral. Es decir, si $\\boldsymbol{X=[x_1,x_2,...,x_p]}$ son $n$ observaciones de nuestro experimento, entonces la distancia de Mahalanobis de una observación $\\vec{x}=(x_1,...,x_p)$ se calcula como $$d_M(\\vec{x})=\\sqrt{(\\vec{x}-\\boldsymbol{\\overline{x}})\\boldsymbol{S}^{-1}(\\vec{x}-\\boldsymbol{\\overline{x}})}$$\n", 34 | "\n" 35 | ] 36 | }, 37 | { 38 | "attachments": {}, 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "## ¿Cómo detectar datos atípicos?\n", 43 | "\n", 44 | "Si $d_M$ es muy grande, signfica que estamos posiblemente en presencia de datos atípicos. \n", 45 | "\n", 46 | "Primero necesitamos saber a partir de qué momento un valor de la distancia Mahalanobis podría ser considerado como un valor muy alto. Se sabe que para datos normalmente distribuidos, la distribución de la distancia Mahalanobis al cuadrado, con los estimadores clásicos media muestral y matriz de covarianza muestral, es aproximadamente una chi-cuadrado con $p$ grados de libertad, donde $p$ es el número de variables que tenemos.\n", 47 | "\n", 48 | "Por lo general, el valor de corte es el cuantil 97.5% de la chi cuadarada con $p$ grados de libertad. Este valor de corte (y cualquier otro) se pueden observar en el caso bidimensional como elipses centradas en el vector de medias de nuestros datos (y como elipsoides en el caso $p=3$).\n", 49 | "\n", 50 | "Por lo tanto, **en principio**, las observaciones cuya $d_M$ al cuadrado es mas alta que $\\chi^2_{p,9.875}$ se etiquetan como valores atípicos.\n", 51 | "\n", 52 | "\n", 53 | "\n", 54 | "" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": {}, 60 | "source": [ 61 | "### ¿Que tan confiable es usar la distancia de Mahalanobis para hallar atípicos?\n", 62 | "\n", 63 | "Al depender de la media y matriz de covarianzas muestrales, presenta un gran inconveniente. Dado que estos estadísticos se dejan influenciar por la presencia de atípicos, al calcular $d_M$ los valores se calculan incorrectamente porque dependen de los valores afectados por los atípicos, así que no siempre se logran identificar correctamente.\n", 64 | "\n", 65 | "" 66 | ] 67 | } 68 | ], 69 | "metadata": { 70 | "kernelspec": { 71 | "display_name": "Python 3", 72 | "language": "python", 73 | "name": "python3" 74 | }, 75 | "language_info": { 76 | "codemirror_mode": { 77 | "name": "ipython", 78 | "version": 3 79 | }, 80 | "file_extension": ".py", 81 | "mimetype": "text/x-python", 82 | "name": "python", 83 | "nbconvert_exporter": "python", 84 | "pygments_lexer": "ipython3", 85 | "version": "3.7.7" 86 | } 87 | }, 88 | "nbformat": 4, 89 | "nbformat_minor": 4 90 | } 91 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C05.3 Distribuciones importantes (elípticas y circulares).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 | "# Distribución t de Student\n", 15 | "\n", 16 | "La **t de Student** es un tipo de variable aleatoria cuyo objetivo es brindarnos un mejor entendimiento de las normales. Depende de un parámetro $n$ llamado *grados de libertad*. Su gráfico es simétrico y en forma de campana, parecido al de la Normal. Pero tiene mayor dispersión que la Normal. Su varianza tiende a 1 a medida que $n$ aumenta. Se acerca a la Normal, a medida que $n$ aumenta. Si $X$ es una variable aleatoria con distribución t de Student con $n$ grados de libertad, lo denotaremos por $X\\sim t_{n}$\n", 17 | "\n", 18 | "Su valor esperado es siempre 0, y su varianza es $\\frac{n}{n-2}$.\n", 19 | "\n", 20 | "\n", 21 | "\n", 22 | "La t-student multivariante pertenece a la familia de distribuciones elípticas. El valor de $n$ también significa los \"grados de libertad\". La distribución t-student es de la familia de distribuciones de cola pesada, o heavy-tailed, porque tiene mayor densidad de probabilidad en la cola comparada con una Normal con igual vector de medias y matriz de covarianza. Hay más distribuciones de cola pesada, por ejemplo: mixturas de distribuciones.\n", 23 | "\n" 24 | ] 25 | }, 26 | { 27 | "cell_type": "markdown", 28 | "metadata": {}, 29 | "source": [ 30 | "# Distribuciones elípticas y esféricas\n", 31 | "\n", 32 | "Una variable aleatoria multivariante $X=(X_1,X_2,...,X_p)$ sigue una distribución elíptica si su función de densidad solo depende de la variable $\\vec{u}=(u_1,u_2,...,u_p)$, la variable en que se evalúa la densidad, a través de $$(\\vec{u}-\\vec{m})V^{-1}(\\vec{u}-\\vec{m}),$$ donde $\\vec{m}$ es un vector, de números, de dimensión $p$ y $V$ es una matriz invertible (no necesariamente son la media y la covarianza). \n", 33 | "\n", 34 | "Las curvas de nivel de las distribuciones elípticas son elipsoides centrados en $m$. En el caso bidimensional, serían elipses centradas en $m$. La distribución Gaussiana o Normal multivariante es un caso de distribución elíptica: $N_p(\\vec{\\mu},\\Sigma)$.\n", 35 | "\n", 36 | "Por otra parte, una variable aleatoria multivariante $X=(X_1,X_2,...,X_p)$ sigue una distribución esférica si su función de densidad solo depende de la variable a través de $u_1^2+u_2^2+...+u_p^2$.\n", 37 | "\n", 38 | "Las curvas de nivel de las distribuciones esféricas son esferas centrados en el origen. La distribución es invariante por rotaciones. En el caso bidimensional, las curvas de nivel serían circunferencias centradas en $(0,0)$. La distribución Normal estándar multivariante es un caso de distribución esférica: $N_p(\\boldsymbol{0}_p,I_p)$.\n", 39 | "\n", 40 | "Algunas de las propiedades de las distribuciones elípticas y esféricas son las siguientes:\n", 41 | "\n", 42 | "* Las marginales y las condicionales son también elípticas.\n", 43 | "\n", 44 | "* Las medias condicionales son una función lineal de las variables que la determinan.\n", 45 | "\n", 46 | "* Sin embargo, la Normal es la única distribución en la familia que tiene la propiedad de que si la matriz de covarianza es diagonal (covarianzas cero) todas las variables que componen al vector aleatorio son independientes.\n", 47 | "\n", 48 | "\n" 49 | ] 50 | } 51 | ], 52 | "metadata": { 53 | "kernelspec": { 54 | "display_name": "Python 3", 55 | "language": "python", 56 | "name": "python3" 57 | }, 58 | "language_info": { 59 | "codemirror_mode": { 60 | "name": "ipython", 61 | "version": 3 62 | }, 63 | "file_extension": ".py", 64 | "mimetype": "text/x-python", 65 | "name": "python", 66 | "nbconvert_exporter": "python", 67 | "pygments_lexer": "ipython3", 68 | "version": "3.7.7" 69 | } 70 | }, 71 | "nbformat": 4, 72 | "nbformat_minor": 4 73 | } 74 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C05.4 Distribuciones importantes (Mixturas y cópulas).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 | "# Mixtura de distribuciones\n", 15 | "\n", 16 | "Es una técnica que consiste en representar una distribución multivariante como mediante una suma ponderada (mixtura) de diferentes distribuciones. Así, decimos que una variable aleatoria multivariante $X=(X_1,X_2,...X_p)$ tiene una mixtura de distribuciones si \n", 17 | "\n", 18 | "$$f_X(\\vec{u})=\\sum_{k=1}^Kw_kf_X(\\vec{u};k)$$ \n", 19 | "\n", 20 | "donde $w_k\\ge0$ son números tales que $w_1+w_2+...+w_K=1$ y $f_X(\\cdot;k)$, para cada $k$, es la densidad de alguna variable aleatoria multivariante.\n" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "## Interpretación\n", 28 | "\n", 29 | "Puede interpretarse en términos de una población heterogénea. Asumiendo que la variable aleatoria multivariante $X$ está definida en una población heterogénea que se puede subdividir en $K$ grupos homogéneos. Entonces $w_1,w_2,...,w_K$ puede verse como la proporción de elementos de los grupos $1,2,...,K$ mientras que $f_X(\\cdot;1),f_X(\\cdot;2),\\cdots,f_X(\\cdot;K)$ son las funciones de densidad asociadas a cada subgrupo de la población." 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "# Cópulas.\n", 37 | "\n", 38 | "Si tenemos un vector aleatorio $X$ cuya función de distribución conjunta es $F_X$, podemos marginalizar y obtener las funciones de distribución marginales de cada una de sus componentes (que son variables aleatorias univariantes).\n", 39 | "\n", 40 | "Sin embargo, a partir de conocer las marginales no se puede obtener, en general, la distribución conjunta (a menos que tengamos independencia, pues recordemos que en ese caso la distribución conjunta es el producto de las distribuciones marginales).\n", 41 | "\n", 42 | "El concepto de **cópula** sirve para conectar funciones de densidad marginales con funciones de densidad conjunta. Por simplicidad vamos a centrarnos en el caso bidimensional $p=2$. Una cópula bidimensional es una función $C:[0,1]^2\\to[0,1]$ con las siguientes propiedades:\n", 43 | "\n", 44 | "* Para cada $u,v\\in [0,1]$ se tiene $C(u,0)=C(0,v)=0$.\n", 45 | "\n", 46 | "* Para cada $u,v\\in [0,1]$ se tiene $C(u,1)=u$ y $C(1,v)=v$.\n", 47 | "\n", 48 | "* Para cada $(u_1,v_1),(u_2,v_2)\\in [0,1]^2$ con $u_1\\le u_2$ y $v_1\\le v_2$ se cumple $C(u_2,v_2)+C(u_1,v_1)\\ge C(u_2,v_1)+C(u_1,v_2)$\n", 49 | "\n", 50 | "\n", 51 | "\n", 52 | "**Teorema de Sklar.** Consideremos el vector aleatorio bidimensional $(X,Y)$. Sea $F_{X,Y}$ la función de distribución conjunta con marginales $F_X$ y $F_Y$. Entonces existe una función cópula $C_{X,Y}$ tal que: \n", 53 | "\n", 54 | "$F_{X,Y}(u,v)=C_{X,Y}(F_X(u),F_Y(v))$\n", 55 | "\n", 56 | "Es decir, **siempre existe una cópula que enlaza a través de la cual se puede recuperar la distribución conjunta a través de las marginales**. Además, si $F_X$ y $F_Y$ son continuas, la cópula es única.\n" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "## Independencia\n", 64 | "\n", 65 | "Si $X$ y $Y$ son variables aleatorias univariantes, entonces son independientes si y solo si $C_{X,Y}(F_X,F_Y)=F_XF_Y$ donde $C_{X,Y}$ es la cópula del Teorema de Sklar. Esta cópula se llama **cópula de independencia.**\n", 66 | "\n", 67 | "## Cópula Gaussiana\n", 68 | "\n", 69 | "Consideremos $F_Z$ la función de distribución de una Normal univariante estándar.\n", 70 | "\n", 71 | "Sea $F_X$ la función de distribución conjunta de $X$, un vector aleatorio $p$-dimensional, con vector de medias $\\mu$ y matriz de correlaciones $R$.\n", 72 | "\n", 73 | "Entonces la función: $C^{(G)}$ dada por \n", 74 | "\n", 75 | "$$C^{(G)}(\\vec{u})=F_X(F_Z^{-1}(u_1),F_Z^{-1}(u_2),...,F_Z^{-1}(u_p))$$\n", 76 | "\n", 77 | "se llama **cópula gaussiana** $p$ dimensional con matriz de correlaciones $R$, donde $\\vec{u}=(u_1,u_2,...,u_p)\\in [0,1]^p$." 78 | ] 79 | } 80 | ], 81 | "metadata": { 82 | "kernelspec": { 83 | "display_name": "Python 3", 84 | "language": "python", 85 | "name": "python3" 86 | }, 87 | "language_info": { 88 | "codemirror_mode": { 89 | "name": "ipython", 90 | "version": 3 91 | }, 92 | "file_extension": ".py", 93 | "mimetype": "text/x-python", 94 | "name": "python", 95 | "nbconvert_exporter": "python", 96 | "pygments_lexer": "ipython3", 97 | "version": "3.7.7" 98 | } 99 | }, 100 | "nbformat": 4, 101 | "nbformat_minor": 4 102 | } 103 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C06.1 Inferencia Estadística (introducció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 | "# Inferencia Estadística\n", 15 | "\n", 16 | "En la práctica, los datos que vamos a tener conforman una muestra. La Inferencia Estadística se basa en obtener información sobre la población, a partir de esos datos muestrales. Usualmente no sabremos cuál es la distribución de nuestros datos. En el caso multivariante vamos a tener más de una variable, con lo cual, se dificulta más el proceso. \n", 17 | "\n", 18 | "El promedio, o la media, de una muestra no tiene por qué coincidir con la media poblacional. Eso es porque es una estimación puntual. No sabemos cuán lejos o cerca está de la media poblacional.\n", 19 | "\n", 20 | "¿Y si queremos tener más seguridad sobre el valor real del parámetro poblacional?\n", 21 | "\n", 22 | "* Podríamos usar estimadores muestrales con buenas propiedades que nos aseguren que esa estimación puntual está bastante cerca de ese valor poblacional.\n", 23 | "\n", 24 | "\n", 25 | "* Podríamos dar un rango de valores en el que, con una determinada “confianza” el valor real poblacional va a estar incluido en ese intervalo. Eso sería obtener un “intervalo de confianza” para el parámetro que estamos estimando.\n", 26 | "\n", 27 | "\n", 28 | "* Otra idea es contrastar una hipótesis en base a la información muestral que tenemos." 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "## Estadísticos muestrales\n", 36 | "\n", 37 | "Supogamos que $X=(X_1,X_2,...,X_p)$ es una variable aleatoria multivariante, de la cual tenemos una *muestra de tamaño $n$*. Esto significa que tenemos una tabla de $n$ filas (registros), donde cada fila representa un individuo (u observación) que estuadiamos. El alumno $i$ lo denotamos por $\\boldsymbol{x_i}=(x_{i1},x_{i2},...,x_{ip})$ (cada $x_{ik}$ representa el valor observado de la característica $k$ en el individuo $i$). Llamemos $\\boldsymbol{X}$ a la matriz de datos.\n", 38 | "\n", 39 | "Si no sabemos la distribución de $X$, podemos usar alguna función de la muestra para obtener información sobre las propiedades de la distribución en la población.\n", 40 | "\n", 41 | "Esas funciones de la muestra son los estadísticos muestrales:\n", 42 | "* Los estadísticos van a ser también variables aleatorias con su propia distribución.\n", 43 | "* Necesitamos su distribución para saber la relación entre el estadístico y su contraparte poblacional." 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": {}, 49 | "source": [ 50 | "# Teorema Central del Límite\n", 51 | "\n", 52 | "## Caso univariante\n", 53 | "\n", 54 | "Tomemos $n$ variables aleatorias univariantes $X_1,X_2,...,X_n$, independientes entre sí, todas con la misma distribución, la misma media $\\mu$ y la misma varianza $\\sigma^2$. Si $n$ es suficientemente grande ($n\\ge 30$), entonces $$\\frac{X_1+X_2+...+X_n}{n}$$ es aproximadamente una normal con media $\\mu$ y varianza $\\frac{\\sigma^2}{n}$.\n", 55 | "\n", 56 | "En cristiano: si tomas una característica de una población, y de esa población te tomas una muestra de tamaño $n$, entonces, si el valor de la característica de un individuo no afecta el valor de la característica en ningún otro de tu muestra, se cumplirá que el valor promedio de la característica en toda tu muestra es una normal. \n", 57 | "\n", 58 | "**Ejemplo univariante**\n", 59 | "\n", 60 | "Supongamos que en una población de gente que paga una renta de vivienda, la renta sigue una distribución uniforme en el entre 4,000 y 10,000 al mes. Veamos que si tomamos muestras de tamaño $n=100$, el pago promedio de las rentas de cada muestra sigue una distribución normal. " 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": null, 66 | "metadata": {}, 67 | "outputs": [], 68 | "source": [ 69 | "# Tomaremos 2020 muestras de tamaño 100; cada una de ellas de una distribución uniforme U(4000,10000)\n", 70 | "\n", 71 | "x = replicate(100000,runif(n=100,min=4000,max=10000))" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": null, 77 | "metadata": {}, 78 | "outputs": [], 79 | "source": [ 80 | "colMeans(x)" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": null, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "hist(colMeans(x),xlab=\"\",freq=FALSE,col=\"blue\",breaks = \"Sturges\")" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": null, 95 | "metadata": {}, 96 | "outputs": [], 97 | "source": [ 98 | "hist(colMeans(x),xlab=\"\",freq=FALSE,col=\"blue\",breaks = \"Sturges\")\n", 99 | "curve(dnorm(x, mean=7000,sd=173), 4000, 10000, add=T, col=\"red\")" 100 | ] 101 | }, 102 | { 103 | "cell_type": "markdown", 104 | "metadata": {}, 105 | "source": [ 106 | "¿Para qué nos sirve esto?\n", 107 | "\n", 108 | "Supongamos que queremos saber la probabilidad de que el promedio de renta mensual (en muestras de tamaño 100) no supere los 6,800.00. Como las rentas mensuales siguen una distribución uniforme, entonces el promedio de rentas mensuales no siguen una distribución fácil de describir, por lo que el cálculo no se puede hacer directamente.\n", 109 | "\n", 110 | "Sin embargo, gracias a este teorema, sabemos que el promedio es una normal con media $\\mu=7000$ y $sd=173$.\n", 111 | "\n", 112 | "Por lo tanto $P(promedio < 6800)$ es fácilmente calculable:" 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": null, 118 | "metadata": {}, 119 | "outputs": [], 120 | "source": [ 121 | "pnorm(6800,mean=7000,sd=173)" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": {}, 127 | "source": [ 128 | "**Ejemplo 2. Univariante**\n", 129 | "\n", 130 | "Consideremos iris. Elijamos varias muestras de tamaño 50 y elijamos cualquiera de las cuatro características que describe la tabla. Observemos que el valor promedio de esa característica en cada una de las muestras nos forma un histograma con cierta distribución normal." 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": null, 136 | "metadata": {}, 137 | "outputs": [], 138 | "source": [ 139 | "col_iris=1" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": null, 145 | "metadata": {}, 146 | "outputs": [], 147 | "source": [ 148 | "medias = replicate(1000,mean(iris[sample(1:150,50),col_iris]))" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": null, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "hist(medias,xlab=\"\",main = colnames(iris)[col_iris],freq=FALSE,col=\"blue\",breaks = \"Sturges\")" 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": {}, 163 | "source": [ 164 | "## Caso multivariante\n", 165 | "\n", 166 | "Dada una colección de vectores aleatorios $X_1,X_2,...,X_n$ independientes e idénticamente distribuidos, con vector medio $\\vec{\\mu}$ y matriz de covarianza $\\Sigma$, entonces el vector medio muestral $$\\frac{X_1+X_2+...+X_n}{n}$$ se distribuye aproximadamente como una Normal multivariante para muestras suficientemente grandes: $$N\\left(\\vec{\\mu},\\frac{1}{n}\\Sigma\\right)$$\n", 167 | "\n", 168 | "**Ejemplo multivariante**\n", 169 | "\n", 170 | "Seleccionemos muestras de tamaño 50 de iris. Escojamos dos columnas numéricas arbitrarias de iris. Veamos que el vector bidimensional de los promedios de esas dos columnas, calculados en cada muestra, sigue una distribución normal bivariante. " 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": {}, 176 | "source": [ 177 | "``col1_iris=1\n", 178 | "col2_iris=2``\n", 179 | "\n", 180 | "``resumen = t(replicate(10,colMeans(iris[sample(1:150,50),c(col1_iris,col2_iris)])))``\n", 181 | "\n", 182 | "``library(MASS)``\n", 183 | "\n", 184 | "``resumen.kde = kde2d(resumen[,1],resumen[,2],n=50)``\n", 185 | "\n", 186 | "``image(resumen.kde) \n", 187 | "contour(resumen.kde, add = TRUE)`` \n", 188 | "\n", 189 | "``library(rgl)``\n", 190 | "\n", 191 | "``col1 <- heat.colors(length(resumen.kde$z))[rank(resumen.kde$z)]\n", 192 | "persp3d(x=resumen.kde, col = col1)``\n" 193 | ] 194 | } 195 | ], 196 | "metadata": { 197 | "kernelspec": { 198 | "display_name": "R", 199 | "language": "R", 200 | "name": "ir" 201 | }, 202 | "language_info": { 203 | "codemirror_mode": "r", 204 | "file_extension": ".r", 205 | "mimetype": "text/x-r-source", 206 | "name": "R", 207 | "pygments_lexer": "r", 208 | "version": "3.6.1" 209 | } 210 | }, 211 | "nbformat": 4, 212 | "nbformat_minor": 4 213 | } 214 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C06.2 Inferencia Estadística (Máxima verosimilitud).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 | "# Estimadores de máxima verosimilitud\n", 15 | "\n", 16 | "Si suponemos que conocemos la distribución de nuestra variable aleatoria multivariante $X$ entonces, el objetivo principal de la inferencia estadística es estimar los parámetros que sean desconocidos de esta distribución.\n", 17 | "\n", 18 | "Sea $\\Theta = (\\Theta_1,\\Theta_2,...,\\Theta_r)$ el vector de parámetros de una distribución determinada con función de densidad $f_X(\\cdot;\\Theta)$. El objetivo es estimar el valor verdadero de $\\Theta$ a partir de una muestra.\n", 19 | "\n", 20 | "El método mas usual para hacer esto es el de **estimador de máxima verosimilitud** (MLE).\n", 21 | "\n", 22 | "Dada una muestra $x_1,x_2,...,x_n$ (recordemos que aquí, los elementos de la muestra son las observaciones de cada una de las características del vector aleatorio $X$), se define la **función de máxima verosimilitud** de $\\Theta$ como \n", 23 | "\n", 24 | "$$l(\\theta)=f_X(x_1;\\theta)f_X(x_2;\\theta)...f_X(x_n;\\theta).$$\n", 25 | "\n", 26 | "El estimador de máxima verosimilitud del parámetro verdadero $\\Theta$ es el vector $\\widehat{\\theta}$ si $l(\\widehat{\\theta})$ es un valor máximo de la función $l$. Esto significa que $\\widehat{\\theta}$ es el valor que maximiza la probabilidad de obtener la muestra que obtuvimos.\n", 27 | "\n", 28 | "**Observación.** A veces trabajar con la función $l$ para tratar de maximizarla es complicado. Muchas veces, en lugar de la función de máxima verosimilitud, se ocupa la **función log de máxima verosimilitud** que se define como \n", 29 | "\n", 30 | "$$L(\\theta)=\\log(l(\\theta)).$$ \n", 31 | "\n", 32 | "El valor que maximiza a $L$ es igual al valor que maximiza a $l$ y viceversa, de modo que el estimador de máxima verosimilitud $\\widehat{\\theta}$ no se ve alterado." 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "**Teorema.** Supongamos que tenemos nuestra muestra $x_1,x_2,...,x_n$ (es una muestra independiente e idénticamente distribuida). Si $\\widehat{\\theta}\\in\\mathbb{R}^r$ es el estimador de máxima verosimilitud del parámetro verdadero $\\Theta$, *bajo condiciones de regularidad*, si $n$ es grande,se tiene \n", 40 | "\n", 41 | "$$\\sqrt{n}(\\widehat{\\theta}-\\Theta)\\sim N_r(\\boldsymbol{0_d},F^{-1})$$ \n", 42 | "\n", 43 | "donde $F$ es la información de Fisher: $$F=-\\frac{1}{n}E\\left[\\frac{\\partial^2}{\\partial\\theta\\partial\\theta^T}L(\\theta)\\right]$$\n", 44 | "\n", 45 | "Algunas consecuencias de este teorema son que para $n$ grande, $\\widehat{\\theta}$ es el mejor estimador de $\\Theta$." 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "## MLE de una normal\n", 53 | "\n", 54 | "Sean $x_1,x_2,...,x_n$ una muestra aleatoria de una normal multivariante $N_p(\\vec{\\mu},\\Sigma)$. Bajo la notación de la sección de arriba se tiene $\\Theta=(\\vec{\\mu},\\Sigma)$.\n", 55 | "\n", 56 | "En este caso, la función $L$ (el logaritmo de la función de verosimilitud) viene dada de la siguientes maneras:\n", 57 | "\n", 58 | "$$\\begin{eqnarray}L(\\vec{\\mu},\\Sigma)&=&-\\frac{np}{2}\\log(2\\pi)-\\frac{n}{2}\\log(|\\Sigma|)-\\frac{1}{2}\\sum_{i=1}^n(x_{i,\\cdot}-\\vec{\\mu})^T\\Sigma^{-1}(x_{i,\\cdot}-\\vec{\\mu})\\\\&=&-\\frac{n}{2}\\log(|\\Sigma|)-\\frac{n}{2}tr(\\Sigma^{-1}S)-\\frac{n}{2}(\\overline{x}-\\vec{\\mu})^T\\Sigma^{-1}(\\overline{x}-\\vec{\\mu})\\end{eqnarray}$$\n", 59 | "\n", 60 | "donde $S=\\sum_{i=1}^n(x_{i\\cdot}-\\vec{\\mu})^T(x_{i\\cdot}-\\vec{\\mu})$.\n", 61 | "\n", 62 | "Entonces los estimadores de máxima verosimilitud de $\\vec{\\mu}$ y $\\Sigma$ son \n", 63 | "\n", 64 | "$$\\widehat{\\vec{\\mu}}=\\overline{x}\\,\\,\\,\\,y$$\n", 65 | "\n", 66 | "$$\\widehat{\\Sigma}=\\frac{1}{n}\\sum_{j=1}^n(x_{i\\cdot}-\\overline{x})(x_{i\\cdot}-\\overline{x})^T.$$" 67 | ] 68 | } 69 | ], 70 | "metadata": { 71 | "kernelspec": { 72 | "display_name": "Python 3", 73 | "language": "python", 74 | "name": "python3" 75 | }, 76 | "language_info": { 77 | "codemirror_mode": { 78 | "name": "ipython", 79 | "version": 3 80 | }, 81 | "file_extension": ".py", 82 | "mimetype": "text/x-python", 83 | "name": "python", 84 | "nbconvert_exporter": "python", 85 | "pygments_lexer": "ipython3", 86 | "version": "3.7.7" 87 | } 88 | }, 89 | "nbformat": 4, 90 | "nbformat_minor": 4 91 | } 92 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C06.3 Inferencia Estadística (test de hipótesis).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 | "# Test de hipótesis\n", 15 | "\n", 16 | "Con frecuencia se desea comprobar si una muestra dada puede provenir de una distribución con ciertos parámetros conocidos.\n", 17 | "\n", 18 | "Por ejemplo, en control de calidad se contrasta si el proceso está en estado de control, lo que supone contrastar si las muestras provienen de una población normal con ciertos valores de los parámetros.\n", 19 | "\n", 20 | "También puede interesar comprobar si varias muestras multivariantes provienen o no de la misma población. Por ejemplo, comprobar si ciertos mercados son igualmente rentables o si varios medicamentos producen efectos similares.\n", 21 | "\n", 22 | "Otro test muy útil es realizar un contraste para ver si la hipótesis de Normalidad no es rechazada por los datos observados, porque estos test de inferencia se basan en la hipótesis de Normalidad de los datos.\n", 23 | "\n", 24 | "Es importante saber:\n", 25 | "* Todo lo que estamos asumiendo sobre nuestros datos.\n", 26 | "* La información muestral que nos proporcionan los datos.\n", 27 | "\n" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "## Método de razón de verosimilitudes\n", 35 | "\n", 36 | "Para realizar contrastes de hipótesis sobre parámetros vectoriales se suele aplicar el método de razón de verosimilitudes. Esta teoría proporciona pruebas estadísticas con buenas propiedades para tamaños muestrales grandes. Lo cual significa que usualmente se obtienen resultados buenos y fiables.\n", 37 | "\n", 38 | "Vamos a asumir que los datos provienen de una población con distribución Normal Multivariante con parámetro vectorial $\\Theta$ y que $\\Theta$ toma valores posibles en un conjunto $\\Omega$, llamado *espacio paramétrico*.\n", 39 | "\n", 40 | "Queremos contrastar la hipótesis nula $H_0$ sobre que $\\Theta$ está contenido en una región $\\Omega_0$ del espacio paramétrico, frente a una hipótesis alternativa $H_1$ de que no se encuentra allí:\n", 41 | "\n", 42 | "$$\\left\\{\\begin{array}{c}H_0:\\Theta\\in\\Omega_0\\\\H_1:\\Theta\\notin\\Omega_0\\end{array}\\right.$$" 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "Para comparar estas dos hipótesis, hay que comparar las probabilidades de obtener los datos bajo ambas hipótesis. El método de razón de verosimilitudes resuelve este problema tomando el valor que hace más probable obtener la muestra observada y que es compatible con la hipótesis.\n", 50 | "\n", 51 | "En concreto, la máxima probabilidad de obtener la muestra observada bajo $H_0$ se obtiene como sigue:\n", 52 | "\n", 53 | "* Si $\\Omega_0$ determina un valor único para el vector de parámetros (es decir, $\\Omega_0=\\{\\Theta_0\\}$), entonces se calcula la probabilidad de los datos suponiendo $\\Theta=\\Theta_0$.\n", 54 | "\n", 55 | "* Si $\\Omega_0$ permite muchos valores, se elige el valor del parámetro que haga máxima la probabilidad de obtener la muestra.\n", 56 | "\n", 57 | "Como la probabilidad de la muestra observada es proporcional a la distribución conjunta de las observaciones, al sustituir en esta función los datos, lo que resulta es la función de verosimilitud. Calculando el máximo de esta función en $\\Omega_0$, se obtiene el máximo valor de la verosimilitud compatible con $H_0$ que representaremos por $f(H_0)$. Es decir, $f(H_0)$ es el valor de máximo de la función de verosimilitud cuando la evaluamos en todo el dominio $\\Omega_0$. \n", 58 | "\n", 59 | "La máxima probabilidad de obtener la muestra observada bajo $H_1$ se calcula obteniendo el máximo absoluto de la función sobre todo el espacio paramétrico $\\Omega$ (estrictamente debería calcularse en el conjunto $\\Omega-\\Omega_0$, pero es más simple hacerlo sobre todo el espacio ya que en general se obtiene el mismo resultado). Particularizando la función de verosimilitud en su máximo, que corresponde al MLE de los parámetros, se obtiene una cantidad que representaremos como $f(H_1)$. Es decir, $f(H_1)$ es el valor máximo de la función de verosimilitud cuando la evaluamos en todo el dominio $\\Omega$.\n", 60 | "\n", 61 | "Sea $RV=\\frac{f(H_0)}{f(H_1)}$ (por construcción $RV\\le1$). **Rechazamos $H_0$ si $RV$ es suficientemente pequeño**. \n", 62 | "\n", 63 | "La región de rechazo se define como $RV\\le\\alpha$ donde $\\alpha$ se llama *nivel de significación del test*. Este es determinado a priori por el investigador y se relaciona con *el nivel de confianza* $NC$ como $NC+\\alpha=1$. \n" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "En la práctica, conocer cómo se distribuye $RV$ es difícil (dado que $RV$ depende de $f(H_0)$ y $f(H_1)$, que a su vez dependen de la muestra, de modo que $RV$ puede considerarse por su propio derecho como una variable aleatoria). \n", 71 | "\n", 72 | "Sin embargo si llamamos $\\lambda$ a $-2\\log(RV)$, cuando $n$ es grande, tenemos:\n", 73 | "\n", 74 | "$$\\lambda=2(L(H_1)-L(H_0))\\sim\\chi^2_m,$$\n", 75 | "\n", 76 | "donde el número de grados de libertad $m$ es igual al número de restricciones lineales sobre el vector de parámetros impuestas por $H_0$." 77 | ] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "metadata": {}, 82 | "source": [ 83 | "## Contraste para la media\n", 84 | "\n", 85 | "Consideremos la muestra $x_1,x_2,...,x_n$, tomada de una población $N_p(\\vec{\\mu},\\Sigma)$. Supongamos que queremos contrastar las hipótesis\n", 86 | "\n", 87 | "$$\\left\\{\\begin{array}{c}H_0:\\vec{\\mu}=\\vec{\\mu_0}\\\\H_1:\\vec{\\mu}\\neq\\vec{\\mu_0}\\end{array}\\right.$$ Es decir, $\\Omega_0=\\{\\vec{\\mu_0}\\}$. No supondremos nada sobre $\\Sigma$.\n", 88 | "\n", 89 | "Dado que conocemos (de la sección C06.1) la función de verosimilitud para $\\vec{\\mu}$, nos resulta que \n", 90 | "\n", 91 | "$$L(H_1)=-\\frac{n}{2}\\log|S|-\\frac{np}{2}\\,\\,y\\,\\,L(H_0)=-\\frac{n}{2}\\log|S_0|-\\frac{np}{2},$$\n", 92 | "\n", 93 | "donde $S$ es la covarianza muestral y $S_0=\\frac{1}{n}\\sum_{j=1}^n(x_{i\\cdot}-\\vec{\\mu_0})(x_{i\\cdot}-\\vec{\\mu_0})^T.$ \n", 94 | "\n", 95 | "Por lo tanto $$\\lambda=n\\log\\left(\\frac{|S_0|}{|S|}\\right).$$\n", 96 | "\n", 97 | "Rechazamos $H_0$ si $RV$ es pequeño, lo que significa que $\\lambda$ sea grande. Como $\\lambda\\sim\\chi^2_m$, se puede demostrar que en este caso $m=p$ (el número de características que estamos estudiando).\n", 98 | "\n", 99 | "Si $n$ no es grande, se sabe que $\\frac{|S_0|}{|S|}=1+\\frac{T^2}{n-1}$ donde $T^2$ es una *distribución de Hotelling* con $p$ y $n-1$ grados de libertad. En este caso, $T^2=(n-1)(\\overline{x}-\\vec{\\mu_0})^TS^{-1}(\\overline{x}-\\vec{\\mu_0})$.\n", 100 | "\n", 101 | "**Observación.** La $T^2$ de Hotelling se relaciona con la F de Fisher de la siguiente manera: $$F_{p,n-p}=\\frac{n-p}{p(n-1)}T^2.$$\n", 102 | "\n", 103 | "Por lo tanto $\\lambda=n\\log\\left(1+\\frac{T^2}{n-1}\\right)$ y rechazamos $H_0$ cuando $T^2$ sea grande." 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "**Ejemplo.**\n", 111 | "\n", 112 | "Un proceso industrial fabrica elementos cuyas características de calidad se miden por un vector de tres variables $X=(X_1,X_2,X_3)$. Cuando el proceso está en estado de control, los valores medios de las variables deben ser $(12,4,2)$. Para comprobar si el proceso funciona adecuadamente, se toma una muestra de $n=20$ elementos y se miden las tres características. \n", 113 | "\n", 114 | "Supongamos que hemos obtenido como media muestral a $\\overline{x}=(11.5,4.3,1.2)$ y matriz de covarianzas \n", 115 | "\n", 116 | "$$\\Sigma=\\left(\\begin{array}{ccc}10&4&-5\\\\4&12&-3\\\\-5&-3&4\\end{array}\\right).$$\n", 117 | "\n", 118 | "¿Estará el proceso en estado de control?" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": {}, 124 | "source": [ 125 | "**Solución.**\n", 126 | "\n", 127 | "Estar en estado de control significa que la media verdadera del proceso es $(12,4,2)$. Por lo tanto queremos contrastar\n", 128 | "\n", 129 | "$$\\left\\{\\begin{array}{c}H_0:\\vec{\\mu}=(12,4,2)\\\\H_1:\\vec{\\mu}\\neq(12,4,2).\\end{array}\\right.$$\n", 130 | "\n", 131 | "La información muestral que tenemos es $n=20$ y los valores de $\\overline{x}$ y $\\Sigma$. Además, " 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": null, 137 | "metadata": {}, 138 | "outputs": [], 139 | "source": [ 140 | "mu0 = c(12,4,2)\n", 141 | "n=20\n", 142 | "p=3\n", 143 | "media_muestral = c(11.5,4.3,1.2)\n", 144 | "S = matrix(c(10,4,-5,4,12,-3,-5,-3,4),3)" 145 | ] 146 | }, 147 | { 148 | "cell_type": "markdown", 149 | "metadata": {}, 150 | "source": [ 151 | "Calculamos $T^2$ (recordemos que $T^2=(n-1)(\\overline{x}-\\vec{\\mu_0})^TS^{-1}(\\overline{x}-\\vec{\\mu_0})$)" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": null, 157 | "metadata": {}, 158 | "outputs": [], 159 | "source": [ 160 | "library(matlib) # para poder calcular matrices inversas" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": null, 166 | "metadata": {}, 167 | "outputs": [], 168 | "source": [ 169 | "T2 = (n-1)*(media_muestral - mu0) %*% inv(S) %*% matrix(media_muestral - mu0)\n", 170 | "T2" 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": {}, 176 | "source": [ 177 | "Usamos ahora la relación entre la $T^2$ de Hotelling y la F de Fisher: $F_{p,n-p}=\\frac{n-p}{p(n-1)}T^2.$" 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": null, 183 | "metadata": {}, 184 | "outputs": [], 185 | "source": [ 186 | "F=(n-p)*T2/(p*(n-1))\n", 187 | "F" 188 | ] 189 | }, 190 | { 191 | "cell_type": "markdown", 192 | "metadata": {}, 193 | "source": [ 194 | "Supongamos que queremos una significación $\\alpha=0.05$. Entonces queremos hallar $c$ tal que $P(F_{p,n-p}c$." 195 | ] 196 | }, 197 | { 198 | "cell_type": "code", 199 | "execution_count": null, 200 | "metadata": {}, 201 | "outputs": [], 202 | "source": [ 203 | "c = qf(0.95,3,17)\n", 204 | "c" 205 | ] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "metadata": {}, 210 | "source": [ 211 | "**Observación.** Filosofee un poco sobre la matriz de correlaciones:\n", 212 | "\n", 213 | "$$\\left(\\begin{array}{ccc}1&0.37&-0.79\\\\0.37&1&-0.43\\\\-0.79&-0.43&1\\end{array}\\right)$$" 214 | ] 215 | } 216 | ], 217 | "metadata": { 218 | "kernelspec": { 219 | "display_name": "R", 220 | "language": "R", 221 | "name": "ir" 222 | }, 223 | "language_info": { 224 | "codemirror_mode": "r", 225 | "file_extension": ".r", 226 | "mimetype": "text/x-r-source", 227 | "name": "R", 228 | "pygments_lexer": "r", 229 | "version": "3.6.1" 230 | } 231 | }, 232 | "nbformat": 4, 233 | "nbformat_minor": 4 234 | } 235 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C06.4 Inferencia Estadística (test de hipótesis--matriz de covarianas).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 | "# Contrastes de matriz de covarianzas\n", 15 | "\n", 16 | "El contraste de razón de verosimilitudes también se aplica para contrastes de matrices de covarianzas, de forma similar a cuando lo hicimos para contraste de medias.\n", 17 | "\n", 18 | "Vamos a ver tres contrastes en este caso:\n", 19 | "\n", 20 | "1. En el primero se contrasta que la matriz tome un valor específico.\n", 21 | "2. En el segundo, que la matriz es diagonal y las variables están incorreladas (contraste de independencia).\n", 22 | "3. En el tercero, que las variables además tienen la misma varianza (contraste de esfericidad)." 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "## Contraste de un valor específico\n", 30 | "\n", 31 | "Supongamos que tenemos una muestra de una Normal multivariante $N_p(\\vec{\\mu},\\Sigma)$. Se desea hacer el constraste \n", 32 | "\n", 33 | "$$\\left\\{\\begin{array}{c}H_0:\\Sigma=\\Sigma_0\\\\H_1:\\Sigma\\neq\\Sigma_0\\end{array}\\right.$$\n", 34 | "\n", 35 | "No asumiremos nada sobre $\\vec{\\mu}$. \n", 36 | "\n", 37 | "Usando la expresión de $L(\\vec{\\mu},\\Sigma)$ de [C06.2](https://github.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/blob/main/Mod2.%20Probabilidad%20en%20varias%20variables/C06.2%20Inferencia%20Estad%C3%ADstica%20(M%C3%A1xima%20verosimilitud).ipynb), tenemos $$L(H_1)=-\\frac{n}{2}\\log|S|-\\frac{np}{2}\\,\\,y\\,\\,L(H_0)=-\\frac{n}{2}\\log|S|-\\frac{n}{2}tr(\\Sigma_0^{-1}S)$$\n", 38 | "\n", 39 | "Por lo tanto $\\lambda=n\\log\\left(\\frac{|\\Sigma_0|}{|S|}\\right)+n\\,tr(\\Sigma_0^{-1}S)-np$. La distribución de $\\lambda$ es una chi cuadrada con $\\frac{p(p+1)}{2}$ grados de libertad.\n", 40 | "\n", 41 | "**Observación.** Si queremos contrastar con la matriz identidad $\\Sigma_0=I$, tenemos $\\lambda=-n\\log|S|+n\\,tr(S)-np$" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "## Contraste de independencia\n", 49 | "\n", 50 | "Otro contraste de interés es el de independencia, donde suponemos que la matriz $\\Sigma_0$ es diagonal. Supongamos que tenemos una muestra de una Normal multivariante $N_p(\\vec{\\mu},\\Sigma)$. Se desea hacer el constraste \n", 51 | "\n", 52 | "$$\\left\\{\\begin{array}{c}H_0:\\Sigma=\\Sigma_0\\,(diagonal)\\\\H_1:\\Sigma\\neq\\Sigma_0\\,(diagonal)\\end{array}\\right.$$\n", 53 | "\n", 54 | "No asumiremos nada sobre $\\vec{\\mu}$. En este caso, la estimación máximo verosímil de $\\Sigma_0$ es $\\widehat{\\Sigma_0}=diag(S)$, que es la matriz diagonal cuyas entradas de la diagonal son las mismas que la de la matriz de covarianza muestral.\n", 55 | "\n", 56 | "Así, $\\lambda=-n\\log|R|$ donde $R=\\widehat{\\Sigma_0}^{-1/2}S\\widehat{\\Sigma_0}^{-1/2}$. Su distribución, para $n$ grande, es una chi cuadrada con $\\frac{p(p-1)}{2}$ grados de libertado." 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "## Contraste de esfericidad\n", 64 | "\n", 65 | "Un caso particular importante del contraste anterior es suponer que todas las variables tienen la misma varianza y están incorreladas. En este caso no ganamos nada por analizarlas conjuntamente, ya que no hay información común. Este contraste equivale a suponer que la matriz $\\Sigma_0$ es escalar; es decir $\\Sigma_0=\\sigma^2I$ para algún número $\\sigma^2$. \n", 66 | "\n", 67 | "Se desea hacer el constraste \n", 68 | "\n", 69 | "$$\\left\\{\\begin{array}{c}H_0:\\Sigma=\\sigma^2I\\\\H_1:\\Sigma\\neq\\sigma^2I\\end{array}\\right.$$\n", 70 | "\n", 71 | "En este caso, el estimador de máxima verosimilitud para $\\sigma^2$ es $\\widehat{\\sigma}^2=\\frac{tr(S)}{p}$ y obtenemos $\\lambda=np(\\log(\\widehat{\\sigma}^2)-\\log|S|)$, que tiene una distribución, para $n$ grande, de chi cuadrada con $\\frac{(p+2)(p-1)}{2}$ grados de libertad.\n", 72 | "\n" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "**Observacion.** En R, el cálculo de los elemntos de la diagonal de una matriz cuadrada $A$ y su traza es hace con las siguientes instrucciones:\n", 80 | "\n", 81 | "elementos de la diagonal: ``diag(A)``\n", 82 | "\n", 83 | "traza: ``sum(diag(A))``\n" 84 | ] 85 | } 86 | ], 87 | "metadata": { 88 | "kernelspec": { 89 | "display_name": "R", 90 | "language": "R", 91 | "name": "ir" 92 | }, 93 | "language_info": { 94 | "codemirror_mode": "r", 95 | "file_extension": ".r", 96 | "mimetype": "text/x-r-source", 97 | "name": "R", 98 | "pygments_lexer": "r", 99 | "version": "3.6.1" 100 | } 101 | }, 102 | "nbformat": 4, 103 | "nbformat_minor": 4 104 | } 105 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/C06.5 Inferencia Estadística (ANOVA multivariante).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 | "# Contraste de igualdad de varias medias\n", 15 | "\n", 16 | "Supongamos que tenemos una muestra de tamaño $n$ de una variable aleatoria $p$-dimensional $\\boldsymbol{X=[x_1,x_2,...,x_n]}$. Digamos que esta muestra se puede clasificar en $G$ grupos de tamaño $n_1,n_2,...,n_G$. Por lo tanto $n_1+n_2+...+n_G=n$.\n", 17 | "\n", 18 | "Asumamos que cada grupo sigue una normal, y todos los grupos tienen la misma varianza $\\Sigma$. Nos interesa saber si todos los grupos tienen la misma media poblacional:\n", 19 | "\n", 20 | "$$\\left\\{\\begin{array}{c}H_0:\\vec{\\mu_1},\\vec{\\mu_2},...,\\vec{\\mu_G}=\\vec{\\mu_0}\\\\H_1:\\mbox{no todas son iguales}\\end{array}\\right.$$\n", 21 | "\n", 22 | "Este problema también se conoce como **análisis de varianza multivariante.** \n", 23 | "\n", 24 | "En este caso tenemos $L(H_0)=-\\frac{n}{2}\\log|S|-\\frac{np}{2}$ y, para $H_1$ debemos considerar los grupos en que clasificamos la muestra, de donde se obtiene $L(H_1)=-\\frac{n}{2}\\log|S_W|-\\frac{np}{2}$ donde $$S_W=\\frac{1}{n}\\sum_{g=1}^G\\sum_{h=1}^{n_g}(x_{h,g}-\\overline{x_g})(x_{h,g}-\\overline{x_g})^T$$ \n", 25 | "\n", 26 | "De esta manera, $\\lambda=n\\log\\left(\\frac{|S|}{|S_W|}\\right)$. Como siempre, rechazamos $H_0$ cuando $\\lambda$ sea suficientemente grande. Es decir, cuando la variabilidad suponiendo que todas las medias son iguales, medida por $|S|$, sea mucho mayor que la variabilidad cuando permitimos que las medias de los grupos sean distintas, medida por $|S_W|$.\n", 27 | "\n", 28 | "Su distribución, para $n$ grande, es una chi cuadrada con $p(G-1)$ grados de libertad.\n" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "**Ejemplo.** Tomemos la tabla de iris. Por lo tanto $n=150$, $p=4$ y $G=3$ (hay tres grupos). Además $n_1=n_2=n_3=50$. El contraste que haremos será\n", 36 | "\n", 37 | "$$\\left\\{\\begin{array}{c}H_0:\\vec{\\mu_1},\\vec{\\mu_2},\\vec{\\mu_3}=\\vec{\\mu_0}\\\\H_1:\\mbox{no todas son iguales}\\end{array}\\right.$$" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": null, 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "## x1=largo del sépalo; x2=ancho del sépalo; x3=largo del pétalo; x4=ancho del pétalo\n", 47 | "n=150\n", 48 | "p=4\n", 49 | "G=3\n", 50 | "n1=50\n", 51 | "n2=50\n", 52 | "n3=50" 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "metadata": {}, 58 | "source": [ 59 | "Calculemos el vector de medias muestrales de cada grupo:" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": null, 65 | "metadata": {}, 66 | "outputs": [], 67 | "source": [ 68 | "setosa <- iris[iris$Species == \"setosa\", ]\n", 69 | "versicolor <- iris[iris$Species == \"versicolor\",]\n", 70 | "virginica <- iris[iris$Species == \"virginica\",]" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [ 79 | "medias_setosa = colMeans(setosa[,1:4])\n", 80 | "medias_versicolor = colMeans(versicolor[,1:4])\n", 81 | "medias_virginica = colMeans(virginica[,1:4])\n", 82 | "\n", 83 | "medias_setosa\n", 84 | "medias_versicolor\n", 85 | "medias_virginica\n" 86 | ] 87 | }, 88 | { 89 | "cell_type": "markdown", 90 | "metadata": {}, 91 | "source": [ 92 | "Calculamos $S$ y $S_W$" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": null, 98 | "metadata": {}, 99 | "outputs": [], 100 | "source": [ 101 | "S = cov(iris[,1:4])\n", 102 | "S" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": null, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": [ 111 | "SW = ((n1-1)*cov(setosa[,1:4])+(n2-1)*cov(versicolor[,1:4])+(n3-1)*cov(virginica[,1:4]))/n\n", 112 | "SW" 113 | ] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": {}, 118 | "source": [ 119 | "Calculamos $\\lambda=n\\log\\left(\\frac{|S|}{|S_W|}\\right)$" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": null, 125 | "metadata": {}, 126 | "outputs": [], 127 | "source": [ 128 | "lambda = n * log(det(S)/det(SW))\n", 129 | "lambda" 130 | ] 131 | }, 132 | { 133 | "cell_type": "markdown", 134 | "metadata": {}, 135 | "source": [ 136 | "Finalmente elegimos el valor de significación $\\alpha$ (recordemos que $NC+\\alpha=1$). En este ejemplo tomemos $\\alpha=0.01$\n", 137 | "\n" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": null, 143 | "metadata": {}, 144 | "outputs": [], 145 | "source": [ 146 | "alpha = 0.01\n", 147 | "\n", 148 | "umbral = qchisq(alpha,p*(G-1))\n", 149 | "umbral" 150 | ] 151 | }, 152 | { 153 | "cell_type": "markdown", 154 | "metadata": {}, 155 | "source": [ 156 | "Como $\\lambda>>\\mbox{umbral}$, rechazamos $H_0$." 157 | ] 158 | }, 159 | { 160 | "cell_type": "markdown", 161 | "metadata": {}, 162 | "source": [ 163 | "Gráficamente podemos ver las medias deben ser diferentes. Con el contraste vimos analíticamente que esto es cierto." 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": null, 169 | "metadata": {}, 170 | "outputs": [], 171 | "source": [ 172 | "library(ggplot2)\n", 173 | "pairs(iris[,1:4],pch=19,col=c(\"blue\",\"green\",\"orange\")[iris[,5]])" 174 | ] 175 | } 176 | ], 177 | "metadata": { 178 | "kernelspec": { 179 | "display_name": "R", 180 | "language": "R", 181 | "name": "ir" 182 | }, 183 | "language_info": { 184 | "codemirror_mode": "r", 185 | "file_extension": ".r", 186 | "mimetype": "text/x-r-source", 187 | "name": "R", 188 | "pygments_lexer": "r", 189 | "version": "3.6.1" 190 | } 191 | }, 192 | "nbformat": 4, 193 | "nbformat_minor": 4 194 | } 195 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/contornos.R: -------------------------------------------------------------------------------- 1 | install.packages("graphics") 2 | install.packages("grDevices") 3 | install.packages("MASS") 4 | install.packages("mvtnorm") 5 | install.packages("ellipse") 6 | library(ellipse) 7 | library(graphics) 8 | library(grDevices) 9 | library(MASS) 10 | library(mvtnorm) 11 | 12 | #################################### Example 1 13 | x.points <- seq(-3,4,length.out=100) 14 | y.points <- x.points 15 | z <- matrix(0,nrow=100,ncol=100) 16 | mu <- c(1,1) 17 | sigma <- matrix(c(2,1,1,2),nrow=2) 18 | for (i in 1:100) { 19 | for (j in 1:100) { 20 | z[i,j] <- dmvnorm(c(x.points[i],y.points[j]), 21 | mean=mu,sigma=sigma) 22 | } 23 | } 24 | contour(x.points,y.points,z) 25 | 26 | 27 | #################################### Example 2 28 | x.points <- seq(-3,3,length.out=100) 29 | y.points <- x.points 30 | z <- matrix(0,nrow=100,ncol=100) 31 | mu <- c(0,0) 32 | sigma <- matrix(c(1,0,0,1),nrow=2) 33 | for (i in 1:100) { 34 | for (j in 1:100) { 35 | z[i,j] <- dmvnorm(c(x.points[i],y.points[j]), 36 | mean=mu,sigma=sigma) 37 | } 38 | } 39 | contour(x.points,y.points,z) 40 | 41 | 42 | 43 | 44 | #################################### Example 3 45 | bivn <- mvrnorm(5000, mu = c(0,0), Sigma = matrix(c(1, 0, 0, 1), 2) ) # utiliza Mass package 46 | bivn.kde <- kde2d(bivn[,1], bivn[,2], n = 50) 47 | filled.contour(x = bivn.kde$x, y = bivn.kde$y , z = bivn.kde$z,plot.axes = { axis(1); axis(2); points(0, 0) }) 48 | image(bivn.kde) # from base graphics package 49 | contour(bivn.kde, add = TRUE) # from base graphics package 50 | 51 | 52 | 53 | #################################### Example 4 54 | mu = c(0,0) 55 | Sigma = matrix(c(1, 0, 0, 1), 2) 56 | bivn4 <- mvrnorm(5000, mu , Sigma ) 57 | 58 | rho <- cor(bivn4) 59 | plot(bivn4, xlab = "X", ylab = "Y", 60 | col = "cyan", 61 | main = "Bivariate Normal with ellipses") 62 | 63 | lines(ellipse(rho, level = .90), col="blue") 64 | lines(ellipse(rho, level = .95), col="red") 65 | lines(ellipse(rho, level = .99), col="green") 66 | 67 | plot_legend <- c("99% CI green", "95% CI red","90% CI blue") 68 | legend(-4,-2,legend=plot_legend,cex = 1, bty = "n") 69 | 70 | 71 | #################################### Example 5 72 | # Library 73 | install.packages("tidyverse") 74 | library(tidyverse) 75 | 76 | #Generar datos Normales estandar: 77 | bivn = mvrnorm(5000, mu = c(0,0), Sigma = matrix(c(1, 0, 0, 1), 2) ) 78 | a <- data.frame( x=bivn[,1], y=bivn[,2] ) 79 | #Generar datos Normales correlacionados: 80 | bivn2 = mvrnorm(5000, mu = c(0,0), Sigma = matrix(c(1, 0.7, 0.7, 1), 2) ) 81 | b <- data.frame( x=bivn2[,1], y=bivn2[,2] ) 82 | # Caso 1 83 | # Grafico de contornos 84 | # Solo contorno 85 | ggplot(a, aes(x=x, y=y) ) + 86 | geom_density_2d() 87 | # Solo area 88 | ggplot(a, aes(x=x, y=y) ) + 89 | stat_density_2d(aes(fill = ..level..), geom = "polygon") 90 | # Area + contorno 91 | ggplot(a, aes(x=x, y=y) ) + 92 | stat_density_2d(aes(fill = ..level..), geom = "polygon", colour="white") 93 | 94 | # Caso 2 95 | # Grafico de contornos 96 | # Solo contorno 97 | ggplot(b, aes(x=x, y=y) ) + 98 | geom_density_2d() 99 | # Solo area 100 | ggplot(b, aes(x=x, y=y) ) + 101 | stat_density_2d(aes(fill = ..level..), geom = "polygon") 102 | # Area + contorno 103 | ggplot(b, aes(x=x, y=y) ) + 104 | stat_density_2d(aes(fill = ..level..), geom = "polygon", colour="white") 105 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/copulas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/copulas.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/copulas.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Mon Nov 30 12:10:10 2020 4 | 5 | @author: hp 6 | """ 7 | 8 | '''Digamos que medimos dos variables que no están Normalmente distribuidas. 9 | Por ejemplo, observamos varios ríos y para cada río observamos el nivel máximo 10 | de ese río durante un cierto período de tiempo. Además, también contamos 11 | cuántos meses cada río causó inundaciones. La distribución de probabilidad del 12 | nivel máximo del río es una Gumbel. La cantidad de veces que se produjo una 13 | inundación se modela de acuerdo con una distribución Beta. 14 | 15 | Es bastante razonable suponer que el nivel máximo y el número de inundaciones 16 | van a estar correlacionados. Si un río crece demasiado es probable que también 17 | haya inundaciones. Sin embargo, aquí nos encontramos con un problema: ¿cómo 18 | debemos modelar esa distribución de probabilidad? Arriba solo especificamos 19 | las distribuciones para las variables individuales, independientemente de la 20 | otra (es decir, las marginales). En realidad, estamos lidiando con una 21 | distribución conjunta de ambas variables juntas.''' 22 | 23 | #%% 24 | 25 | # Veamos la utilidad de las funciones cópulas. 26 | import scipy as sc 27 | import seaborn as sns 28 | import matplotlib.pyplot as plt 29 | from scipy import stats 30 | # Vamos a generar datos uniformemente distribuidos 31 | x = stats.uniform(0, 1).rvs(10000) 32 | sns.distplot(x, kde=False, norm_hist=True) 33 | 34 | #%% 35 | 36 | '''A continuación, queremos transformar estas muestras para que, en lugar de 37 | uniformes, ahora estén Normalmente distribuidas. La transformación que hace 38 | esto es la inversa de la función de distribución (o densidad acumulada) (CDF) 39 | de la distribución normal (que podemos obtener en scipy.stats con ppf):''' 40 | 41 | norm = stats.distributions.norm() 42 | x_trans = norm.ppf(x) 43 | sns.distplot(x_trans) 44 | 45 | #%% 46 | 47 | ''' 48 | Si trazamos ambas juntas, podemos obtener una intuición de cómo se ve la CDF 49 | inversa y cómo funciona: 50 | ''' 51 | 52 | h = sns.jointplot(x, x_trans, stat_func=None) 53 | h.set_axis_labels('original', 'transformed', fontsize=16) 54 | 55 | ''' 56 | La CDF inversa estira las regiones externas de la uniforme para producir una 57 | normal. 58 | ''' 59 | 60 | #%% 61 | ''' 62 | Podemos hacer esto para distribuciones de probabilidad arbitrarias 63 | (univariadas), como la Beta:''' 64 | 65 | beta = stats.distributions.beta(a=10, b=3) 66 | x_trans = beta.ppf(x) 67 | h = sns.jointplot(x, x_trans, stat_func=None) 68 | h.set_axis_labels('orignal', 'transformed', fontsize=16) 69 | 70 | 71 | #%% 72 | 73 | ''' 74 | O la Gumbel: 75 | ''' 76 | 77 | gumbel = stats.distributions.gumbel_l() 78 | x_trans = gumbel.ppf(x) 79 | h = sns.jointplot(x, x_trans, stat_func=None) 80 | h.set_axis_labels('original', 'transformed', fontsize=16) 81 | 82 | #%% 83 | 84 | ''' 85 | Para hacer la transformación opuesta de una distribución arbitraria a la 86 | Uniforme(0, 1) simplemente aplicamos la inversa de la CDF inversa, es decir, 87 | la CDF: 88 | ''' 89 | 90 | x_trans_trans = gumbel.cdf(x_trans) 91 | h = sns.jointplot(x_trans, x_trans_trans, stat_func=None) 92 | h.set_axis_labels('original', 'transformed', fontsize=16); 93 | 94 | #%% 95 | ''' 96 | Bien, entonces sabemos cómo transformar de cualquier distribución a una 97 | uniforme, y viceversa. En matemáticas, esto se llama la transformación 98 | integral de probabilidad. 99 | 100 | ¿Cómo nos ayuda esto con nuestro problema de crear una distribución de 101 | probabilidad conjunta personalizada? En realidad ya casi hemos terminado. 102 | Sabemos cómo convertir cualquier cosa distribuida uniformemente en una 103 | distribución de probabilidad arbitraria. Eso significa que solo necesitamos 104 | generar datos distribuidos uniformemente con las correlaciones que queremos. 105 | 106 | ¿Como hacemos eso? 107 | 108 | 1) Simulamos a partir de una Gaussiana multivariante con la estructura de 109 | correlación específica que queremos. 110 | 2) Transformamos para que las marginales sean uniformes. 111 | 3) Transformamos las marginales uniformes a lo que queramos. 112 | 113 | Vamos a crear muestras a partir de una Normal multivariante correlacionada: 114 | ''' 115 | 116 | # Generando la Normal multivariante con correlaciones .5 117 | mvnorm = stats.multivariate_normal(mean=[0, 0], cov=[[1., 0.5], 118 | [0.5, 1.]]) 119 | 120 | x = mvnorm.rvs(100000) 121 | 122 | h = sns.jointplot(x[:, 0], x[:, 1], kind='kde', stat_func=None) 123 | h.set_axis_labels('X1', 'X2', fontsize=16) 124 | 125 | #%% 126 | 127 | ''' 128 | Ahora usaremos lo que aprendimos arriba para "uniformizar" las marginales. 129 | Este diagrama conjunto suele ser cómo se visualizan las cópulas. 130 | ''' 131 | 132 | norm = stats.norm() 133 | x_unif = norm.cdf(x) 134 | h = sns.jointplot(x_unif[:, 0], x_unif[:, 1], kind='hex', stat_func=None) 135 | h.set_axis_labels('Y1', 'Y2', fontsize=16); 136 | 137 | #%% 138 | 139 | ''' 140 | Ahora solo transformamos los marginales nuevamente a lo que queremos 141 | (Gumbel y Beta): 142 | ''' 143 | 144 | m1 = stats.gumbel_l() 145 | m2 = stats.beta(a=10, b=2) 146 | 147 | x1_trans = m1.ppf(x_unif[:, 0]) 148 | x2_trans = m2.ppf(x_unif[:, 1]) 149 | 150 | h = sns.jointplot(x1_trans, x2_trans, kind='kde', xlim=(-6, 2), ylim=(.6, 1.0), stat_func=None) 151 | h.set_axis_labels('Maximum river level', 'Probablity of flooding', fontsize=16) 152 | 153 | #%% 154 | 155 | ''' 156 | Contrastemos eso con la distribución conjunta sin correlaciones: 157 | ''' 158 | 159 | x1 = m1.rvs(10000) 160 | x2 = m2.rvs(10000) 161 | 162 | h = sns.jointplot(x1, x2, kind='kde', xlim=(-6, 2), ylim=(.6, 1.0), stat_func=None) 163 | h.set_axis_labels('Maximum river level', 'Probablity of flooding', fontsize=16) 164 | 165 | #%% 166 | ''' 167 | Entonces, al usar la distribución Uniforme como nuestra base, podemos inducir 168 | fácilmente correlaciones y construir de manera flexible distribuciones de 169 | probabilidad complejas. Todo esto se extiende directamente a distribuciones de 170 | dimensiones superiores también. 171 | ''' 172 | -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/esp_cond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/esp_cond.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/logo.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/mahalanobis1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/mahalanobis1.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/mahalanobis2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/mahalanobis2.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/mahalanobis3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/mahalanobis3.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/mixturas.R: -------------------------------------------------------------------------------- 1 | library(mixtools) 2 | library(MASS) 3 | library(tidyverse) 4 | library(ggplot2) 5 | library(rgl) 6 | 7 | #Generando datos bidimensionales Normales con media (0,0) y S=I_2 8 | ## x ~ N_2(0, diag(2)) 9 | bivn <- mvrnorm(1000, mu = c(0, 0), Sigma = matrix(c(1, 0, 0, 1), 2)) 10 | plot(bivn) 11 | #Generando datos bidimensionales Normales con diferente media y cov 12 | ## x ~ N_2(mu, diag(2)) 13 | bivn2 <- mvrnorm(800, mu = c(2,3), Sigma = matrix(c(1, 0.7, 0.7, 1), 2)) 14 | plot(bivn2) 15 | #Mixtura 16 | mix <- rbind(bivn,bivn2) 17 | plot(mix) 18 | 19 | # Calcular densidades kernel 20 | mix.kde <- kde2d(mix[,1], mix[,2], n = 50) # MASS package 21 | # Superficie 3-dimensional de la densidad 22 | # RGL interactive plot 23 | 24 | col1 <- heat.colors(length(mix.kde$z))[rank(mix.kde$z)] 25 | persp3d(mix.kde, col = col1) 26 | 27 | #Contornos 28 | filled.contour(x = mix.kde$x, y = mix.kde$y , z = mix.kde$z,plot.axes = { axis(1); axis(2); points(0, 0) }) 29 | image(mix.kde) # from base graphics package 30 | contour(mix.kde, add = TRUE) # from base graphics package 31 | #Contornos 32 | a <- data.frame( a1=mix[,1], a2=mix[,2] ) 33 | # Caso 1 34 | # Grafico de contornos 35 | # Solo contorno 36 | ggplot(a, aes(x=a1, y=a2) ) + 37 | geom_density_2d() 38 | # Solo area 39 | ggplot(a, aes(x=a1, y=a2) ) + 40 | stat_density_2d(aes(fill = ..level..), geom = "polygon") 41 | # Area + contorno 42 | ggplot(a, aes(x=a1, y=a2) ) + 43 | stat_density_2d(aes(fill = ..level..), geom = "polygon", colour="white") 44 | 45 | 46 | ################################################################################################### 47 | #Una mixtura menos compleja 48 | #Generando datos bidimensionales Normales con media (0,0) y S=I_2 49 | ## x ~ N_2(0, diag(2)) 50 | bivn <- mvrnorm(1000, mu = c(0, 0), Sigma = matrix(c(1, 0, 0, 1), 2)) 51 | plot(bivn) 52 | #Generando datos bidimensionales Normales con media mu=(5,5) y S=I_2 53 | ## x ~ N_2(mu, diag(2)) 54 | bivn2 <- mvrnorm(1000, mu = c(5, 5), Sigma = matrix(c(1, 0, 0, 1), 2)) 55 | plot(bivn2) 56 | #Mixtura 57 | mix <- rbind(bivn,bivn2) 58 | plot(mix) 59 | 60 | # Calcular densidades kernel 61 | mix.kde <- kde2d(mix[,1], mix[,2], n = 50) # MASS package 62 | # Superficie 3-dimensional de la densidad 63 | # RGL interactive plot 64 | col1 <- heat.colors(length(mix.kde$z))[rank(mix.kde$z)] 65 | persp3d(mix.kde, col = col1) 66 | 67 | #Contornos 68 | filled.contour(x = mix.kde$x, y = mix.kde$y , z = mix.kde$z,plot.axes = { axis(1); axis(2); points(0, 0) }) 69 | image(mix.kde) # from base graphics package 70 | contour(mix.kde, add = TRUE) # from base graphics package 71 | 72 | 73 | #Contornos 74 | a <- data.frame( a1=mix[,1], a2=mix[,2] ) 75 | # Caso 1 76 | # Grafico de contornos 77 | # Solo contorno 78 | ggplot(a, aes(x=a1, y=a2) ) + 79 | geom_density_2d() 80 | # Solo area 81 | ggplot(a, aes(x=a1, y=a2) ) + 82 | stat_density_2d(aes(fill = ..level..), geom = "polygon") 83 | # Area + contorno 84 | ggplot(a, aes(x=a1, y=a2) ) + 85 | stat_density_2d(aes(fill = ..level..), geom = "polygon", colour="white") -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/normal1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/normal1.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/normal2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/normal2.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/normales_multivariantes.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Mon Nov 30 11:48:32 2020 4 | 5 | @author: hp 6 | """ 7 | import numpy as np 8 | import scipy as sc 9 | import pandas as pd 10 | import seaborn as sns 11 | import matplotlib.pyplot as plt 12 | from sklearn.datasets import load_iris 13 | 14 | #%% 15 | 16 | mean = [0, 0] 17 | cov = [[1, 0], [0, 1]] 18 | 19 | x, y = np.random.multivariate_normal(mean, cov, 5000).T 20 | plt.plot(x, y, 'o',alpha=0.2) 21 | plt.axis('equal') 22 | plt.show() 23 | 24 | 25 | #%% 26 | 27 | sns.set_style("white") 28 | sns.kdeplot(x, y) 29 | 30 | #%% 31 | 32 | sns.kdeplot(x, y, cmap="Blues", shade=True, shade_lowest=True,n_levels=5) 33 | 34 | 35 | #%% 36 | 37 | # Contour plot with Iris dataset 38 | df = sns.load_dataset('iris') 39 | 40 | # Contour plot 2D básico 41 | sns.set_style("white") 42 | sns.kdeplot(df.sepal_width, df.sepal_length) 43 | 44 | #%% 45 | 46 | sns.kdeplot(df.sepal_width, df.sepal_length, cmap="Reds", shade=True, bw=.15,shade=True) 47 | 48 | #%% 49 | 50 | sns.kdeplot(df.sepal_width, df.sepal_length, cmap="Blues", shade=True) 51 | 52 | #%% 53 | 54 | from scipy.stats import multivariate_normal 55 | from mpl_toolkits.mplot3d import Axes3D 56 | 57 | mu_x = 0 58 | mu_y = 0 59 | 60 | x = np.linspace(-5,5,500) 61 | y = np.linspace(-5,5,500) 62 | X, Y = np.meshgrid(x,y) 63 | pos = np.empty(X.shape + (2,)) 64 | pos[:, :, 0] = X; pos[:, :, 1] = Y 65 | rv = multivariate_normal([mu_x, mu_y], [[1, 0], [0, 1]]) 66 | 67 | fig = plt.figure(figsize=(10,5)) 68 | ax = fig.gca(projection='3d') 69 | ax.plot_surface(X, Y,rv.pdf(pos),cmap='viridis',linewidth=0) 70 | ax.set_xlabel('X axis') 71 | ax.set_ylabel('Y axis') 72 | ax.set_zlabel('Z axis') 73 | ax.auto_scale_xyz([-5, 5], [-5, 5], [0, 0.5]) 74 | plt.show() 75 | 76 | CS = plt.contour(X, Y, rv.pdf(pos)) 77 | 78 | #%% 79 | 80 | mu_x = 0 81 | mu_y = 0 82 | 83 | x = np.linspace(-5,5,500) 84 | y = np.linspace(-5,5,500) 85 | X, Y = np.meshgrid(x,y) 86 | pos = np.empty(X.shape + (2,)) 87 | pos[:, :, 0] = X; pos[:, :, 1] = Y 88 | rv = multivariate_normal([mu_x, mu_y], [[1, 0.7], [0.7, 1]]) 89 | 90 | fig = plt.figure(figsize=(10,5)) 91 | ax = fig.gca(projection='3d') 92 | ax.plot_surface(X, Y, rv.pdf(pos),cmap='viridis',linewidth=0) 93 | ax.set_xlabel('X axis') 94 | ax.set_ylabel('Y axis') 95 | ax.set_zlabel('Z axis') 96 | ax.auto_scale_xyz([-5, 5], [-5, 5], [0, 0.5]) 97 | plt.show() 98 | 99 | CS = plt.contour(X, Y, rv.pdf(pos)) -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/normales_multivariantes.r: -------------------------------------------------------------------------------- 1 | library(MASS) 2 | 3 | # Generar una muestra distribuida N(mu, Sigma) con correlacion moderada 4 | bivn <- mvrnorm(5000, mu = c(0,0), Sigma = matrix(c(1, .5, .5, 1), 2) ) # utiliza Mass package 5 | 6 | # Variables independientes: corr=0 7 | bivn2 <- mvrnorm(1000, mu = c(0, 5), Sigma = matrix(c(1, 0, 0, 1), 2)) 8 | 9 | # Alta correlacion 10 | bivn3 <- mvrnorm(1000, mu = c(0, 5), Sigma = matrix(c(1, 0.9, 0.9, 1), 2)) 11 | 12 | # Plots 13 | plot(bivn[,1],bivn[,2]) 14 | plot(bivn2[,1],bivn2[,2]) 15 | plot(bivn3[,1],bivn3[,2]) 16 | 17 | # Calcular densidades kernel 18 | bivn.kde <- kde2d(bivn[,1], bivn[,2],n=150) # MASS package 19 | bivn2.kde <- kde2d(bivn2[,1], bivn2[,2], n = 50) 20 | bivn3.kde <- kde2d(bivn3[,1], bivn3[,2], n = 50) 21 | 22 | # Contour plot 23 | image(bivn.kde) # base graphics package 24 | contour(bivn.kde, add = TRUE) # graphics package 25 | 26 | plot(bivn[,1],bivn[,2]) 27 | contour(bivn.kde, add = TRUE,col=par("fg")) 28 | 29 | #### Superficie 3-dimensional 30 | # Basic perspective plot 31 | persp(bivn.kde, phi = 45, theta = 30, shade = .1, border = NA) # base graphics package 32 | 33 | # RGL interactive plot 34 | library(rgl) 35 | col1 <- heat.colors(length(bivn.kde$z))[rank(bivn.kde$z)] 36 | persp3d(x=bivn.kde, col = col1) 37 | 38 | col2 <- rainbow(length(bivn2.kde$z))[rank(bivn2.kde$z)] 39 | persp3d(x=bivn2.kde, col = col2) 40 | 41 | col3 <- rainbow(length(bivn3.kde$z))[rank(bivn3.kde$z)] 42 | persp3d(x=bivn3.kde, col = col3) 43 | 44 | ### Distribucion de alta dimension 45 | install.packages("corrplot") 46 | install.packages("clusterGeneration") 47 | library(corrplot) 48 | library(clusterGeneration) 49 | mu <- rep(0,10) 50 | pdMat <- genPositiveDefMat(10,lambdaLow=10) #Generar auna matriz sigma def positiva 51 | Sigma <- pdMat$Sigma 52 | dim(Sigma) #cuadrada de 10x10 53 | mvn <- mvrnorm(5000, mu = mu, Sigma = Sigma ) 54 | 55 | corrplot(cor(mvn), 56 | method="ellipse", 57 | tl.pos="n", 58 | ) -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/observaciones.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/observaciones.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/student1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scidatmath2020/Python-y-R-en-Estadistica-Multivariante/c906e555849b563a51bfd5bbbbf2662190cff12d/Mod2. Probabilidad en varias variables/student1.png -------------------------------------------------------------------------------- /Mod2. Probabilidad en varias variables/t_student_multivariante.R: -------------------------------------------------------------------------------- 1 | install.packages("mixtools") 2 | library(mixtools) 3 | library(mvtnorm) 4 | 5 | #Generando datos bidimensionales t-student con 3 grados de libertad 6 | ## x ~ t_3(0, diag(2)) 7 | bivn <- rmvt(1000, sigma = diag(2), df = 3) 8 | plot(bivn) 9 | # Media y matriz de cov 10 | clcenter <- colMeans(bivn) 11 | clcov <- cov(bivn) 12 | # 97.5%, 75%, 50% elipses de tolerancia 13 | ellipse(mu = clcenter, sigma = clcov, alpha = 0.025,col = "blue", lty = 2) 14 | ellipse(mu = clcenter, sigma = clcov, alpha = 0.25,col = "green", lty = 3) 15 | ellipse(mu = clcenter, sigma = clcov, alpha = 0.5,col = "red", lty = 3) 16 | 17 | # Calcular densidades kernel 18 | library(MASS) 19 | bivn.kde <- kde2d(bivn[,1], bivn[,2], n = 50) # MASS package 20 | 21 | # Superficie 3-dimensional de la densidad 22 | # RGL interactive plot 23 | library(rgl) 24 | col1 <- heat.colors(length(bivn.kde$z))[rank(bivn.kde$z)] 25 | persp3d(bivn.kde, col = col1) 26 | 27 | #Contornos 28 | bivn.kde <- kde2d(bivn[,1], bivn[,2], n = 150) 29 | filled.contour(x = bivn.kde$x, y = bivn.kde$y , z = bivn.kde$z,plot.axes = { axis(1); axis(2); points(0, 0) }) 30 | image(bivn.kde) # from base graphics package 31 | contour(bivn.kde, add = TRUE) # from base graphics package 32 | 33 | library(tidyverse) 34 | library(ggplot2) 35 | a <- data.frame( a1=bivn[,1], a2=bivn[,2] ) 36 | # Caso 1 37 | # Grafico de contornos 38 | # Solo contorno 39 | ggplot(a, aes(x=a1, y=a2) ) + 40 | geom_density_2d() 41 | # Solo area 42 | ggplot(a, aes(x=a1, y=a2) ) + 43 | stat_density_2d(aes(fill = ..level..), geom = "polygon") 44 | # Area + contorno 45 | ggplot(a, aes(x=a1, y=a2) ) + 46 | stat_density_2d(aes(fill = ..level..), geom = "polygon", colour="white") 47 | 48 | 49 | 50 | 51 | ############################################################################################################ 52 | #Generando datos bidimensionales t-student con 10 grados de libertad 53 | ## x ~ t_10(0, diag(2)) 54 | bivn2 <- rmvt(1000, sigma = diag(2), df = 10) 55 | plot(bivn2) 56 | # Media y matriz de cov 57 | clcenter <- colMeans(bivn2) 58 | clcov <- cov(bivn2) 59 | # 97.5%, 75%, 50% elipses de tolerancia 60 | ellipse(mu = clcenter, sigma = clcov, alpha = 0.025,col = "blue", lty = 2) 61 | ellipse(mu = clcenter, sigma = clcov, alpha = 0.25,col = "green", lty = 3) 62 | ellipse(mu = clcenter, sigma = clcov, alpha = 0.5,col = "red", lty = 3) 63 | 64 | 65 | # Superficie 3-dimensional de la densidad 66 | # RGL interactive plot 67 | library(rgl) 68 | col1 <- heat.colors(length(bivn2.kde$z))[rank(bivn2.kde$z)] 69 | persp3d(bivn2.kde, col = col1) 70 | 71 | #Contornos 72 | bivn2.kde <- kde2d(bivn2[,1], bivn2[,2], n = 50) 73 | filled.contour(x = bivn2.kde$x, y = bivn2.kde$y , z = bivn2.kde$z,plot.axes = { axis(1); axis(2); points(0, 0) }) 74 | image(bivn2.kde) # from base graphics package 75 | contour(bivn2.kde, add = TRUE) # from base graphics package 76 | 77 | b <- data.frame( b1=bivn2[,1], b2=bivn2[,2] ) 78 | # Caso 2 79 | # Grafico de contornos 80 | # Solo contorno 81 | ggplot(b, aes(x=b1, y=b2) ) + 82 | geom_density_2d() 83 | # Solo area 84 | ggplot(b, aes(x=b1, y=b2) ) + 85 | stat_density_2d(aes(fill = ..level..), geom = "polygon") 86 | # Area + contorno 87 | ggplot(b, aes(x=b1, y=b2) ) + 88 | stat_density_2d(aes(fill = ..level..), geom = "polygon", colour="white") -------------------------------------------------------------------------------- /Mod3. Introducción al ML/C07. Componentes principales .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 | "# Componentes principales\n", 15 | "\n", 16 | "Supongamos que tenemos $n$ datos de una Normal $p$-dimensional $N_p(\\vec{\\mu},\\Sigma)$. Si desonocemos tanto $\\vec{\\mu}$ como $\\Sigma$, entonces debemos estimar $p+\\frac{p(p+1)}{2}$ parámetros diferentes (las $p$ entradas de $\\vec{\\mu}$ y las $\\frac{p(p+1)}{2}$ de $\\Sigma$). Si $p=5$, entonces son 20 parámetros. Y si $p=10$ ya tenemos 65 parámetros.\n", 17 | "\n", 18 | "Mientras más alto sea $p$, mucho mayor tiene que ser el número de observaciones para poder obtener estimaciones fiables.\n", 19 | "\n", 20 | "Hay varias técnicas de reducción de la dimensión que tratan de contestar la misma pregunta:\n", 21 | "¿Es posible describir con precisión los valores de las $p$ variables mediante un número menor de variables $r\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\n", 65 | "\n", 66 | "No obstante, una vez obtenida $Q^*$, la estimación de $Q$, en el recuadro 2, se puede demostrar que $Q^*=YY^T$ para cierta matriz $Y$. ¿Es esta la matriz que buscamos $\\overline{\\boldsymbol{X}}$?\n", 67 | "\n", 68 | "Notemos que si $A$ es una matriz ortogonal, entonces $Q=\\overline{\\boldsymbol{X}}\\overline{\\boldsymbol{X}}^T=(\\overline{\\boldsymbol{X}}A)(A^T\\overline{\\boldsymbol{X}}^T))=(\\overline{\\boldsymbol{X}}A)(\\overline{\\boldsymbol{X}}A)^T$. Por lo tanto, $Q$ no determina una única matriz $\\overline{\\boldsymbol{X}}$.\n", 69 | "\n", 70 | "No obstante, esto no es grave: lo anterior nos dice que de $D$ solo es posible obtener una rotación de los datos $\\overline{\\boldsymbol{X}}$ dada por la matriz $Y$ la cual llamaremos matriz de **coordenadas principales**.\n", 71 | "\n" 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "**Ejemplo.** Consideremos $D$ como la matriz de distancias (en km) entre 30 ciudades de México. El problema que queremos resolver es crear un mapa con el que se han generado estas distancias. " 79 | ] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "metadata": {}, 84 | "source": [ 85 | "``data <- read.csv(\"distancias_mex.csv\")\n", 86 | "muestra = sample(1:1991,100)\n", 87 | "data = data[muestra,muestra+1]``\n", 88 | "\n", 89 | "1) La función ``cmdscale`` escala nuestros datos y no solo eso: hace el cálculo de las coordenadas principales.\n", 90 | "\n", 91 | "``mds.cities <- cmdscale(data,eig=TRUE)``\n", 92 | "\n", 93 | "2) Hacemos el gráfico de eigenvalores (siempre nos fijaremos solo en los que son positivos).\n", 94 | "\n", 95 | "``plot(mds.cities$eig,pch=19,col=\"blue\",xlab=\"Number\",\"ylab\"=\"Eigenvalor\",type=\"o\")\n", 96 | "abline(a=0,b=0,col=\"red\")``\n", 97 | "\n", 98 | "3) Calculamos la medida de precisión (en este caso para 2 eigenvalores)\n", 99 | "\n", 100 | "``m <- sum(abs(mds.cities$eig[1:2])) / sum(abs(mds.cities$eig))\n", 101 | "m``\n", 102 | "\n", 103 | "4) Repetimos el cálculo de las coordenadas principales pero solo con 2 eigenvalores\n", 104 | "\n", 105 | "\n", 106 | "``mds.cities <- cmdscale(data,eig=TRUE,k=2)``\n", 107 | "\n", 108 | "5) Guardamos las dos coordenadas principales\n", 109 | "\n", 110 | "``x1 <- mds.cities$points[,1]\n", 111 | "x2 <- mds.cities$points[,2]``\n", 112 | "\n", 113 | "6) Graficamos\n", 114 | "\n", 115 | "``plot(-x1,x2,pch=19,xlim=range(x1)+c(-1000,600),ylim=range(x2)+c(-500,500),col=\"red\")\n", 116 | "text(-x1,x2,pos=4,labels=colnames(data),col=\"blue\")``\n" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "metadata": {}, 122 | "source": [ 123 | "## Escalado no métrico\n", 124 | "\n", 125 | "En los problemas de escalado no métrico se parte de una matriz de diferencias o disimilitudes entre objetos que se ha obtenido generalmente por consultas a jueces, o a partir de procedimientos de ordenación de los elementos.\n", 126 | "\n", 127 | "Por ejemplo, el escalado no métrico se ha aplicado para:\n", 128 | "\n", 129 | "* Estudiar las semejanzas entre las actitudes, preferencias o percepciones de personas sobre asuntos políticos o sociales.\n", 130 | "\n", 131 | "* Evaluar las preferencias respecto a productos y servicios en marketing y en calidad.\n", 132 | "\n", 133 | "Los valores de una tabla de similaridades o distancias se obtienen habitualmente por alguno de los procedimientos siguientes:\n", 134 | "\n", 135 | "1. **Estimación directa.** Un juez, o un conjunto de jueces, estiman directamente las distancias entre los elementos. Una escala muy utilizada es la escala 0−100, de manera que la distancia o disimilaridad entre un elemento y sí mismo sea cero y la distancia entre dos elementos distintos refleje la percepción de sus diferencias. Con $n$ elementos esto requiere $\\frac{n(n-1)}{2}$ evaluaciones.\n", 136 | "\n", 137 | "\n", 138 | "2. **Estimación de rangos.** Se selecciona un elemento y se pide al juez, o grupo de jueces, que ordene los $n-1$ restantes por mayor o menor proximidad al seleccionado. A continuación, se selecciona el siguiente y se ordenan los $n-2$ restantes, y así sucesivamente. Existen algoritmos de cálculo que transforman estas ordenaciones en una matriz de distancias.\n", 139 | "\n", 140 | "Se supone que la matriz de similaridades está relacionada con una matriz de distancias, pero de una manera compleja. Es decir, se acepta que los jueces utilicen en las valoraciones ciertas variables o dimensiones, pero los datos incluyen elementos de error y variabilidad personal." 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "**Ejemplo.** Vamos a considerar un conjunto de datos que muestra la cantidad de veces que 15 congresistas de Nueva Jersey votaron de manera diferente en la Cámara de Representantes sobre 19 proyectos de ley ambientales. Las abstenciones no se registran. La pregunta es si las afiliaciones de los partidos se pueden detectar en los datos." 148 | ] 149 | }, 150 | { 151 | "cell_type": "markdown", 152 | "metadata": {}, 153 | "source": [ 154 | "El paquete ``HSAUR2`` contiene la tabla que usaremos.\n", 155 | "\n", 156 | "``library(MASS)\n", 157 | "install.packages(\"HSAUR2\")\n", 158 | "library(HSAUR2)``\n", 159 | "\n", 160 | "Llamamos a la tabla:\n", 161 | "\n", 162 | "``data(\"voting\",package=\"HSAUR2\")``\n", 163 | "\n", 164 | "1) Hacemos el escalado no métrico\n", 165 | "\n", 166 | "``voting.mds = isoMDS(voting) \n", 167 | "voting.mds$points``\n", 168 | "\n", 169 | "2) Graficamos\n", 170 | "\n", 171 | "``\n", 172 | "plot(voting.mds$points[,1],voting.mds$points[,2],main=\"Escalamiento no métrico\",pch=19,col=\"blue\",\n", 173 | "xlab=\"Primera coordenada\",ylab=\"Segunda coordenada\")\n", 174 | "text(voting.mds$points[,1],voting.mds$points[,2],labels=rownames(voting.mds$points),pos=1,col=\"red\")\n", 175 | "``" 176 | ] 177 | } 178 | ], 179 | "metadata": { 180 | "kernelspec": { 181 | "display_name": "R", 182 | "language": "R", 183 | "name": "ir" 184 | }, 185 | "language_info": { 186 | "codemirror_mode": "r", 187 | "file_extension": ".r", 188 | "mimetype": "text/x-r-source", 189 | "name": "R", 190 | "pygments_lexer": "r", 191 | "version": "3.6.1" 192 | } 193 | }, 194 | "nbformat": 4, 195 | "nbformat_minor": 4 196 | } 197 | -------------------------------------------------------------------------------- /Mod3. Introducción al ML/C10.1 Clusters (Introducció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 | "# 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 --------------------------------------------------------------------------------