Full text
Grado en Estadística TRABAJO FIN DE GRADO Diseño y desarrollo de una aplicación software didáctica para el aprendizaje en el ámbito del Grado en Estadística Autor: Samuel Pérez Tinoco Tutor: Luis Valencia Cabrera Sevilla, junio de 2023
Índice general Prólogo ....................................... iii Resumen....................................... v Abstract....................................... vi ÍndicedeFiguras.................................. vii ÍndicedeTablas................................... ix 1. Introducción 1 1.1. Motivación................................... 1 1.2. Enfoque .................................... 2 1.3. Estructura de la memoria . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2. Preliminares 5 2.1. Técnicas estadísticas y matemáticas . . . . . . . . . . . . . . . . . . . . . 5 2.1.1. Primercurso ............................. 5 2.1.2. Segundocurso............................. 16 2.1.3. Tercercurso.............................. 32 2.1.4. Cuartocurso ............................. 38 2.2. Herramientas software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3. Aplicación desarrollada 43 3.1. Esqueleto de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.2. Esquemageneral ............................... 47 3.3. Descripción curso a curso . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.3.1. Primercurso ............................. 51 3.3.2. Segundocurso............................. 62 3.3.3. Tercercurso.............................. 66 3.3.4. Cuartocurso ............................. 68 4. Conclusiones 71 4.1. Aportaciones ................................. 71 4.2. Reflexiones .................................. 72 4.3. Trabajofuturo................................. 72 A. Apéndice: Tablas 75 A.1. Ajuste hiperparámetros regresión grid aleatorio . . . . . . . . . . . . . . 75 A.2. Ajuste hiperparámetros clasificación . . . . . . . . . . . . . . . . . . . . . 78 B. Apéndice: Código R de la aplicación 81 B.1. AplicacionEstadística.Rmd . . . . . . . . . . . . . . . . . . . . . . . . . . 81 i
B.1.1.IMPORT ............................... 102 B.1.1.1. app.R ............................ 102 B.1.2.CP................................... 102 B.1.2.1. index.R ........................... 102 B.1.2.2. comb.R ........................... 102 B.1.2.3. mod.R............................ 108 B.1.2.4. vect.R............................ 125 B.1.3.ME................................... 129 B.1.3.1. app.R ............................ 129 B.1.4.AIE .................................. 129 B.1.4.1. app.R ............................ 130 Bibliografía 152 ii
Prólogo Esta memoria de Trabajo Fin de Grado tratará de transmitir la labor teórico-práctica que he llevado a cabo a lo largo de todo el curso, repasando mi viaje por todo el grado y desarrollando una aplicación de utilidad para estudiantes que, como yo, estén emprendiendo o emprendan este camino. En general, el diseño y desarrollo de una aplicación software didáctica para el aprendizaje en el ámbito del Grado en Estadística, es un proceso complejo que requiere un enfoque cuidadoso y metódico, que puede tener un impacto significativo en la educación y en la experiencia de aprendizaje de los estudiantes.De esta forma, el enfoque esencial de la aplicación es que ayude a promover y potenciar el aprendizaje y la comprensión de los conceptos fundamentales de la estadística. Agradecer a mi familia y tutor de este trabajo por estar en los buenos y no tan buenos momentos elaborando la aplicación y la memoria. iii
Resumen En este proyecto se plantea como objetivo fundamental el de proporcionar una herramienta útil para estudiantes e interesados en el aprendizaje de los aspectos fundamentales relacionados con el grado en estadística. Para la creación de una aplicación hay que tener bien definidas cual va a ser su funcionalidad y la necesidad de la aplicación además de contar con una buena base de conocimientos que permitan llevarla a cabo. Durante el presente curso he realizado un viaje completo a lo largo de los cursos que he ido pasando a través de toda la carrera, analizando aspectos de interés dentro de cada uno, y planteando el diseño de diversas herramientas que pudieran recoger una muestra significativa de funcionalidades del grado. Esta memoria contiene los aspectos funcionales y las cuestiones que llevan a crearla así como las herramientas necesarias, una breve descripción del contenido de la aplicación, la programación de distinguidos objetos de las que está compuesta la aplicación, unas conclusiones personales, reflexiones y un trabajo futuro. v
Abstract In this project, the main objective is to provide an useful tool for students, and those interested in learning the fundamental aspects related to the statistics degree. In order to create an app, it is necessary to know really well the definition of the app’s function and its need, as well as having good knowledge of the base that will allow it to be carried out. During this course, I have gone through a complete journey and taken all the courses of the degree, analyzing aswell interesting aspects within each one and designing various tools that could encompass a significant set of different functionalities of the degree. This report includes the functional aspects and the issues that led to its creation, the necessary tools, a brief description of the application’s content and the programming of distinguished objects which make it up, personal conclusions, reflexions and future work. vi
Índice de figuras 3.1. Accediendo a plantilla flexdashboard 1ªparte................ 44 3.2. Accediendo a plantilla flexdashboard 2ªparte................ 45 3.3. Plantilla flexdashboard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.4. Plantilla flexdashboard interactiva. . . . . . . . . . . . . . . . . . . . . . 46 3.5. Esqueleto de la aplicación. . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.6. Barradenavegación.............................. 48 3.7. Pestaña Inicio. Opciones de menú incluidas. . . . . . . . . . . . . . . . . 48 3.8. Galería de imágenes vista usuario. . . . . . . . . . . . . . . . . . . . . . . 48 3.9. Código R de galería de imágenes. . . . . . . . . . . . . . . . . . . . . . . 49 3.10. Pestaña 1er curso. Opciones de menú incluidas. . . . . . . . . . . . . . . 50 3.11. Pestaña 2ºcurso. Opciones de menú incluidas. . . . . . . . . . . . . . . . 50 3.12. Pestaña 3er. Opciones de menú incluidas. curso. . . . . . . . . . . . . . . 50 3.13. Pestaña 4º. Opciones de menú incluidas. curso. . . . . . . . . . . . . . . 50 3.14. Ventana tras clic del segundo botón del ratón en la aplicación. . . . . . . 51 3.15. Vista previa del diseño de los nºcombinatorios. . . . . . . . . . . . . . . 52 3.16. Código R para incluir latex en shiny. . . . . . . . . . . . . . . . . . . . . 53 3.17. Código R de botón que oculta contenido, iniciándose en oculto. . . . . . 54 3.18. Vista previa del diseño de los nºcombinatorios cambiando el parámetro. 55 3.19. Código R para obtener salida dinámica. . . . . . . . . . . . . . . . . . . . 55 3.20. Código R para cambiar la clase de un textInput. . . . . . . . . . . . . . . 56 3.21. Vista previa del diseño de los modelos aleatorios. . . . . . . . . . . . . . 57 3.22. Vista previa del diseño de función de probabilidad. . . . . . . . . . . . . 58 3.23. Código R para obtener graficos interactivos y manipular archivos externos. 59 3.24. Vista previa del diseño de vectores aleatorios. . . . . . . . . . . . . . . . 60 3.25. Vista previa del diseño de vectores aleatorios importando archivo. . . . . 61 3.26. Código R para obtener captura de pantalla. . . . . . . . . . . . . . . . . 61 3.27. Vista previa del diseño de muestreo estadístico. Parte 1. . . . . . . . . . 62 3.28. Vista previa del diseño de la asignatura de muestreo estadístico. Parte 2. 63 3.29. Vista previa del diseño de muestreo estadístico. Parte 3. . . . . . . . . . 64 3.30. Código R de botón para descargar de datos. . . . . . . . . . . . . . . . . 65 3.31. Código R de aviso de notificación. . . . . . . . . . . . . . . . . . . . . . . 65 3.32. Código R para obtener color de fondo. . . . . . . . . . . . . . . . . . . . 66 3.33. Vista previa del diseño de ampliación de inferencia estadística. Parte 1. . 67 3.34. Vista previa del diseño de ampliación de inferencia estadística. Parte 2 . 68 3.35. Vista previa del diseño de inteligencia artificial y estadística. . . . . . . . 70 NOTA: Todas las imágenes son de elaboración propia vii
Capítulo 2 Preliminares Para a la creación de una aplicación, ya sea estadística o no, el primer paso es definir claramente su funcionalidad y las necesidades de crearla. Al ser una aplicación estadística, en términos de funcionalidad debemos decidir los tipos de análisis y técnicas estadísticas que se utilizarán y cómo se presentarán los resultados al usuario final. En cuanto a la necesidad que viene a cubrir, es la que se ha descrito en la introducción. En resumen, la creación de una aplicación estadística implica definir claramente la funcionalidad y necesidades así como utilizar las herramientas y tecnologías adecuadas para implementarla y desarrollar un prototipo inicial. 2.1. Técnicas estadísticas y matemáticas Con respecto a técnicas estadísticas, hay una amplia variedad de herramientas disponibles para la investigación y análisis de datos. Estas técnicas incluyen la estadística descriptiva, la inferencia estadística, análisis de varianza, análisis de regresión, análisis de series de tiempo, y muchos más. En cuanto a la matemática, las herramientas matemáticas incluyen el cálculo, la teoría de conjuntos, la optimización, la teoría de la probabilidad, y otras disciplinas que son fundamentales para la estadística. Estas técnicas se utilizan para modelar y simular situaciones en las cuales no se dispone de información empírica, permitiendo a los investigadores explorar y comprender diferentes escenarios y predecir resultados futuros. Entre la amalgama de técnicas que se podrían cubrir para satisfacer la necesidad comentada y proporcionar una batería de funcionalidades útiles para el público objetivo del proyecto, se fueron eligiendo algunos temas clave para el alumnado en cada curso del grado. 2.1.1. Primer curso En particular, de primer curso se decidió cubrir en nuestra aplicación la asignatura de cálculo de probabilidades. Dentro de todas sus funcionalidades, vamos a describir con especial atención en esta memoria algunos fundamentos de ciertas técnicas estadísticas y matemáticas que se han expuesto en la aplicación. Todos los conceptos que se aportan y se analizan de la asignatura del cálculo de probabilidad viene recogidos en [7], [8], [15] y [2]. 5
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS En primer lugar, expondré los principios básicos de la combinatoria, así como las estructuras combinatorias más elementales. El objetivo de la combinatoria es contar el número de elementos que tiene un conjunto finito. El cardinal de un conjunto finito Ω = {ω1, ω2, . . . , ωN}es el número de elementos que contiene y se denota card(Ω) o también #(Ω). Por convenio, el conjunto vacío tiene cardinal 0, i.e., card ( ∅ ) = 0. Definimos a continuación algunos principios básicos de este conjunto: Principio de la adición. Si un conjunto finito ω puede descomponerse en k partes disjuntas entre sí, A1, A2, . . . , Aky tales que su unión sea todo Ω, entonces card(Ω) = card(A1) + . . . +card(Ak) Principio de la multiplicación. Si los elementos de un conjunto finito Ωpueden contarse en k etapas, de tal manera que en la primera etapa haya n1 posibilidades, en la segunda n2,..., y en la k-ésima etapa nkposibilidades, entonces: card(Ω) = n1n2. . . nk A partir de un conjunto finito Ω = {ω1, ω2, . . . , ωN} se pueden formar otros conjuntos o estructuras más complejas. Es interesante contar cuántos elementos tienen estas estructuras. Secuencias Una secuencia de longitud n es un elemento del producto cartesiano Ωn. Las secuencias son por lo tanto de la forma (a1, . . . , an),con ai∈Ω, i = 1, . . . , n. Nótese que si dos secuencias contienen los mismos elementos pero difieren en su orden, entonces ambas secuencias son distintas. En otras palabras, el orden en que aparecen los elementos de una secuencia es importante. Aplicando el principio de la multiplicación, le número total de secuencias de longitud nque pueden formarse a partir de un conjunto Ωcon Nelementos es: card(Ωn) = Nn Permutaciones Una secuencia de longitud n de un conjunto finito Ωcon N elementos que no contenga elementos repetidos se denomina n -permutación o permutación de longitud n. Obviamente N≥n. Las n-permutaciones son pues de la forma (a1, a2, . . . , an)∈Ωn,tales que ai6=aj,para i6=j. Nótese que las n -permutaciones son elementos especiales (que no contienen elementos repetidos) del producto cartesiano Ω n y por lo tanto dos n -permutaciones que contengan los mismos elementos pero en diferente orden son distintas, es decir, el orden en que aparecen los elementos en una n-permutación es importante. Las permutaciones son las secuencias que no tienen elementos repetidos. El número de n-permutaciones de un conjunto finito con Nelementos es PN,n =N(N−1) . . . (N−n+ 1) 6CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Subconjuntos. Un subconjunto con n elementos de Ω = {ω1, . . . , ωN} es una colección de n elementos distintos seleccionados de Ω. En los subconjuntos el orden en que aparecen los elementos no es relevante, por lo tanto dos subconjuntos son iguales si y solo si contienen los mismos elementos, aunque posiblemente estén dispuestos en distinto orden. Los subconjuntos se denotan. {a1, . . . , an}, ai∈Ω, i = 1, . . . , n • El número de subconjuntos con n -elementos de un conjunto finito Ωcon N elementos es N n!=N(N−1). . . (N−n+ 1) n!=N! (N−n)!n! • El número total de subconjuntos (propios e impropios) de un conjunto finito Ω con Nelementos es 2N En segundo lugar, redactaré sobre los modelos de variables aleatorias discretas, los cuales permiten observar el comportamiento de los datos, es decir, la representación de las funciones de probabilidad y de distribución. Adicionalmente se ha estudiado el comportamiento de vectores aleatorios. Para llegar a comprender qué es un modelo de variable aleatoria discreta, así como un vector aleatorio, se detallarán una serie de conceptos de antemano. Definición 2.1.1 Una variable aleatoria (v.a.), X , es una aplicación que transforma los elementos del espacio muestral, Ω, en números reales, es decir, X: Ω −→ R ω∈Ω7−→ X(ω)∈R. Definición 2.1.2 Una variable aleatoria X : Ω −→ R es discreta si Im ( X )es un conjunto numerable. En el caso en que una variable aleatoria sea discreta, los posibles valores que toma la variable se pueden numerar. Sea pues, Im(X) = {x1, x2, . . .}. Definimos los subconjuntos de Ω Ai={ω∈Ω : X(ω) = xi}, i ≥1. Nótese que Ai , es el subconjunto de elementos del espacio muestral, Ω, que se transforman en xi∈R . Estos subconjuntos (sucesos) forman una partición de Ω, es decir, Ai∩Aj = ∅, i 6 = j y S i≥1Ai = Ω. La partición {Ai}i≥1 también se denomina sistema completo de sucesos asociado a la variable aleatoria X. Los sucesos Ai⊂ Ωaparecen con frecuencia en el desarrollo de la teoría, por lo que se adopta una notación más simple para ellos: Ai={X=xi}, i ≥1 CAPÍTULO 2. PRELIMINARES 7
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Considerando ahora las probabilidades de los sucesos Ai: pi=P(Ai) = P(X=xi), i ≥1 Debido a que {Ai}i≥1es una partición, se tiene: a) pi≥0, i ≥1 b) P i≥1pi= 1 Definición 2.1.3 El conjunto de todas las probabilidades {pi}i≥1 con pi = P ( X = xi ) , i ≥ 1, se denomina función (de masa) de probabilidad de la variable aleatoria discreta X. Pueden construirse nuevas variables aleatorias mediante operaciones básicas. Concretamente: Si X es una variable aleatoria y g es una función, entonces g ( X )es una variable aleatoria. Por ejemplo, si Xes una variable aleatoria, entonces también lo son Xn, eX, . . . Si X e Y son variables aleatorias, también lo son: X + Y , X−Y , XY , X/Y (siempre que Y6= 0). De forma general, se supondrá que se trabaja en un espacio de probabilidad (Ω ,F,P )y supondremos que tenemos definida una v.a. X discreta, que toma los valores en el conjunto {x1, x2, . . .} y con función de masa de probabilidad pi = P ( X = xi ) , i = 1 , 2 , . . . Definición 2.1.4 La función de distribución (fdD) de una variable aleatoria X es la función FX:R−→ [0,1] x∈R7−→ FX(x) = P(X≤x). En particular la función de distribución de una variable aleatoria discreta es: F(x) = P(X≤x) = X i:xi≤x P(X=xi) A continuación también aportamos algunos teoremas esenciales para sentar las bases de las funciones de distribución que se han incluido en la aplicación. Teorema 2.1.1 La función de distribución asociada a una variable aleatoria X , FX , verifica: a)Fes una función no decreciente, es decir, x<y⇒F(x)≤F(y). b)l´ım x→+∞F(x)=1yl´ım x→−∞ F(x)=0. c)Fes continua por la derecha en cada punta a∈R, es decir, l´ım x→a+F(x) = F(a). 8CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Teorema 2.1.2 Mas propiedades de la función de distribución son: a)P(x<X≤y) = F(y)−F(x). b)P(X > x) = 1 −F(x). c)FXes continua en un punto xsii P(X=x) = 0. d) Si FX es discontinua en un punto x , entonces el salto de la fdD en x es precisamente P(X=x). Además se expondrá también las definiciones y teoremas que permiten sentar las bases sobre la esperanza, la varianza, y otros elementos que tienen su implicación en la aplicación. Definición 2.1.5 La esperanza matemática de la v.a. Xes: E(X) = X i xiP(X=xi) siempre que la serie de convergente, es decir, que se pueda sumar y que sea finita. La esperanza matemática también se denomina valor esperado o media. La interpretación física de la esperanza matemática es que ésta es el centro de gravedad de la variable aleatoria. De forma más general, si X es una v.a. discreta y g : R−→ R es una función se tiene, E[g(X)] = X i g(xi)P(X=xi). Teorema 2.1.3 Algunas propiedades de la esperanza matemática: a) Si c∈R, entonces E(c) = c. b) Si c∈R, entonces E(X+c) = E(X) + c. c) Si b∈R, entonces E(bX) = bE(X). d) Si XeYson variables aleatorias, entonces E(X+Y) = E(X) + E(Y). Definición 2.1.6 Se define, en caso de que exista, el momento de orden rde la v.a. Xcomo mr=E(Xr) = X i xr iP(X=xi), y el momento central de orden rde la v.a. Xcomo µr=E(X−µ)r=X i (xi−µ)rP(X=xi), donde µ=E(X). CAPÍTULO 2. PRELIMINARES 9
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Definición 2.1.7 Se define la varianza de una variable aleatoria, X, como V ar(X) = E(X−µ)2=X i (xi−µX)2P(X=xi), donde µ=E(X). Definición 2.1.8 La desviación típica de la variable aleatoria X, es σX= +qV ar(X). Teorema 2.1.4 Propiedades de la varianza a)V ar(X)≥0 b)V ar ( X ) = 0 si y sólo si X es una v.a. degenerada, es decir, se trata de una variable aleatoria que toma un único valor con probabilidad 1. c) (Teorema de koning) V ar(X) = E(X2)−(E(X))2 d) Sean a y b números reales, entoces V ar(aX +b) = a2V ar(X) e) Considérese la función f(a) = E(X−a)2, a ∈R m´ın a∈R E(X−a) = E(X−µX)2=σ2. En la práctica hay situaciones experimentales que aparecen frecuentemente y se ajustan razonablemente bien a alguno de los modelos que se exponen a continuación. Variable aleatoria de bernouilli: este modelo se utiliza en el caso de experimentos con dos posibles resultados, denominados E (éxito) y F (fracaso), con probabilidades respectivas p y q = 1 −p . El espacio muestral es Ω = {E, F} . La variable aleatoria de Bernouilli se define como: X(E) = 1, X(F) = 0. La función de probabilidad asociada es: p=P(X= 1), q =P(X= 0). Una variable aleatoria X de Bernouilli definida en un experimento donde la probabilidad de éxito es pse denota X∼Be(p). Variable aleatoria binomial: sea un experimento de tipo Bernouilli, es decir con dos posibles resultados E (éxito) y F (fracaso). Supongamos que este experimento es repetido nveces bajo las siguientes condiciones: a) Las probabilidades de éxito y de fracaso son respectivamente pyq= 1 −p, y permanecen constantes en los nensayos. b) Los ensayos o repeticiones del experimento son independientes entre sí, lo cual quiere decir que la realización de un ensayo no afecta a las probabilidades de los futuros ensayos. 10 CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Entonces, la variable aleatoria X=número de éxitos en los nensayos, es una variable aleatoria binomial con parámetros n (número de repeticiones) y p∈(0,1) (probabilidad de éxito en cada ensayo). Se denota X∼Bi(n, p). Si asociamos al éxito el valor 1 y al fracaso el valor 0, un elemento genérico del espacio muestral sería de la forma ω = ( ω1, . . . , ωn ), donde ωi es 1 o 0 según el ensayo i -ésimo resulte ser un éxito o un fracaso, respectivamente. Nótese que la variable aleatoria Xes X(ω) = n X i=1 ωi. Nótese que Im ( X ) = { 0 , 1 , . . . , n} es un conjunto numerable. Por lo tanto, X es una variable aleatoria discreta. La probabilidad asociada a cada suceso elemental, según los supuestos a) y b) del experimento binomial, sería: P(ω1, . . . , ωn) = p n P i=1 ωiq n− n P i=1 ωi. El sistema completo de sucesos asociado a la variable aleatoria está formado por los sucesos: Ak={X=k}={ω∈Ω : n X i=1 ωi=k}, k = 0, . . . , n. Obviamente Ak es el suceso correspondiente a obtener k éxitos en los n ensayos, y su cardinal es card ( Ak ) = n k . La función de masa de probabilidad de la variable aleatoria Xes: P(X=k) = P(Ak) = n k!pkqn−k, k = 0, . . . , n. Variable aleatoria geométrica: supongamos un experimento de tipo Bernouilli con dos posibles resultados: E (éxito) y F (fracaso). Este experimento se repite hasta que por primera vez se obtiene un éxito. Se supone además: a) Las probabilidades de éxito y de fracaso son respectivamente p y q = 1 −p y permanecen constantes. b) Los ensayos o repeticiones del experimento son independientes entre sí, lo cual quiere decir que la realización de un ensayo no afecta a las probabilidades de los sucesivos ensayos. Entonces, la variable aleatoria X=número de fracasos hasta obtener el primer éxito, (2.1) es una variable aleatoria geométrica con un sólo parámetros p∈ (0 , 1) (probabilidad de éxito en cada ensayo). Se denota X∼Ge ( p ). Como en los casos anteriores notaremos q= 1 −p. Nuevamente, como en el caso anterior, el conjunto de posibles valores que toma la variable aleatoria X es Im ( X ) = { 0 , 1 , . . .} , que es un conjunto numerable (en este caso infinito). Por lo tanto Xes una variable aleatoria discreta. El espacio muestral asociado a un experimento geométrico es: Ω = {E, (F, E),(F, F, E),(F, F, F, E), . . .}. CAPÍTULO 2. PRELIMINARES 11
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS La probabilidad asociada a cada suceso elemental de este espacio, de acuerdo con los supuestos a) y b), sería: P((F, . . . , F, E | {z } k fracasos )) = qkp, k = 0,1. Los sucesos fundamentales asociados a la variable aleatoria geométrica son: Ak={X=k}={(F, . . . , F, E) | {z } k fracasos }, k = 0,1, . . . y la función de masa de probabilidad es: P(X=k) = P(Ak) = qkp, k = 0,1, . . . Nota: Algunos autores definen la variable aleatoria geométrica de una forma diferente, como: X∗=número de ensayos hasta obtener el primer éxito. (2.2) La variable definida en 2.2 está relacionada con la definida en 2.1 mediante la relación X∗=X+ 1. Notaremos X∗∼Ge∗ ( p )a la variable que cuenta el número de ensayos hasta el primer éxito. Variable aleatoria de Poisson: la variable aleatoria de Poisson aparece con frecuencia en las aplicaciones y en la naturaleza. Fenómenos como el número de accidentes en un periodo determinado, número de llamadas a una centralita telefónica en un intervalo de tiempo, el número de partículas emitidas por una substancia radiactiva por segundo, son ejemplos de variables aleatorias que se ajustan razonablemente bien a la distribución de Poisson. Dado λ > 0, se dice que una variable aleatoria, X , que toma valores enteros no negativas sigue una distribución de Poisson si su función de probabilidad es P(X=k) = e−λλk k!, k = 0,1, . . . y se denota X∼Po ( λ ). La distribución de Poisson es un caso límite de la distribución binomial: Si Xn∼Bi(n, pn)es tal que l´ım n→∞ npn=λ > 0entonces P(Xn=k) = n k!pk n(1 −pn)n−k−→ e−λλk k!,si n−→ ∞ (2.3) La propiedad 2.3 es útil para obtener aproximaciones numéricas a probabilidades binomiales mediante probabilidades de Poisson. Variable aleatoria uniforme discreta: supongamos que un experimento tiene un espacio muestral con N elementos, Ω = {ω1, . . . , ωN} y que el experimento consiste 12 CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS en extraer al azar, siendo todos los sucesos elementales son igualmente probables, un elemento del conjunto Ω. Se tiene: P({ωk}) = 1 N, k = 1, . . . , N. Definimos la variable aleatoria X(wk) = k, k = 1, . . . , N. Esta variable aleatoria toma los valores Im ( X ) = { 1 , 2 , . . . , N} , que es un conjunto finito, por lo que se trata de una variable aleatoria discreta. El sistema completo de sucesos es: Ak={X=k}={ωk}, k = 1, . . . , N, la función de masa de probabilidad es P(X=k) = 1 N, k = 1, . . . , N y se denota X∼UD(1, . . . , N). Variable aleatoria hipergeométrica: supongamos que los N elementos de un conjunto, que denominaremos población, son de dos tipos: Tipo A y Tipo B. Si hay N1 elementos de Tipo A, es obvio que entonces hay N−N1 de Tipo B. El experimento consiste en seleccionar al azar un subconjunto (muestra) de n elementos de la población, de forma que los N n posibles subconjuntos tengan la misma probabilidad de ser seleccionados (probabilidad uniforme). Se considera la variable aleatoria X=número de elementos de Tipo A en la muestra seleccionada. La variable aleatoria así definida es una variable aleatoria hipergeométrica, y se denota X∼ H(n;N1, N). Esta variable toma un número finito de valores, por lo que es una variable aleatoria discreta. La función de masa de probabilidad de la variable Xes: P(X=k) = N1 k! N−N1 n−k! N n!. para m´ax{ 0 , n−N + N1} ≤ k≤m´ın{n, N1} . Otra forma habitual en la que aparece la distribución hipergeométrica es en el muestreo sin reemplazamiento en una población finita de N elementos. En dicha población se supone que hay N1 elementos de tipo A y N−N1 de tipo B. Se extraen al azar sucesivamente n elementos de la población de tal forma que tras cada extracción el elemento seleccionado no es devuelto a la población. La variable aleatoria X =número de elementos de Tipo A seleccionados en las nextracciones sigue una distribución H(n;N1, N). En un mismo experimento aleatorio es usual observar más de una variable. Esa situación conduce al concepto de vector aleatorio. CAPÍTULO 2. PRELIMINARES 13
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Diseño Π PS : Estos muestreos se realizan empleando una variable de tamaño, de tal forma que los elementos “más grandes” tengan más probabilidad de ser seleccionados. Definición 2.1.25 Sea U = { 1 , . . . , N} , población finita y sea X = {x1, . . . , xN} una variable de información auxiliar (conocida) con xi > 0, ∀i Se dirá que un diseño muestral es PROPORCIONAL (ΠPS) respecto de Xsi: ∃α > 0/πi=α xi,∀i NOTA •ΠPS: viene del inglés (π-proportional - to - size.) •X: Variable tamaño Proposición 2.1.7 En un diseño Π PS de tamaño muestral constante, n , se verifica que π=n xi tX ,∀i En este caso se usará la notación ΠPS(N, n;X) NOTA Nótese que se ha de verificar que: πi=n xi tX ≤1,∀i Si esta condición no se verifica, se podría actuar de alguna de las siguientes formas: 1. Asignar πk = 1 a los elementos para los que n xk tX > 1y seleccionar una muestra con probabilidades proporcionales a Xsobre el resto de la población. 2. Reducir el tamaño muestral. Cuando se habla de un diseño ΠPS: • No queda determinado el procedimiento utilizado para la selección de la muestra. • Hace referencia a una propiedad que verifican las probabilidades de inclusión de primer orden. Muestreo con reemplazamiento. Dada una población finita, U = { 1 , . . . , N} , y dada una distribución de probabilidad {p1, p2...,pN|pi>0∀i, N X i pi= 1}, un diseño muestral con reemplazamiento de tamaño n es aquel en el que la muestra está formada por los elementos resultantes de realizar n extracciones independientes de la población, siendo pi la probabilidad de seleccionar al elemento i -ésimo en cada ocasión. Utilizaremos la notación mr para indicar una muestra con reemplazamiento (donde pueden aparecer elementos repetidos, y por tanto, se ha de tener en cuenta el número de veces que aparece cada elemento). Con respectos a técnicas inferenciales para la obtención de estimadores que pretenden acercarse al verdadero valor del parámetro. Si la variable de estudio es de naturaleza 20 CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS cuantitativa, tomando pues valores de tipo numérico, los parámetros más usuales son los que se aportan a continuación. Total poblacional: ty= N X i=1 yi=X i∈U yi Media poblacional: yU=1 N N X i=1 yi=1 NX i∈U yi Cuasivarianza poblacional: S2 yU=1 N−1X i∈U (yi−yU)2=1 N−1 X i∈U y2 i−1 N X i∈U yi!2 Varianza poblacional: σ2 yU=1 NX i∈U (yi−yU)2=1 N−1 X i∈U y2 i−1 N X i∈U yi!2 =y2U−y2 U=N−1 NS2 yU Otros parámetros menos usuales, pero también empleados para analizar las poblaciones, son la mediana poblacional, los percentiles poblacionales, el índice de concentración de Gini poblacional o el coeficiente de variación poblacional. Si la variable de estudio es de naturaleza cualitativa, el parámetro más usual es la proporción asociada a cada uno de los valores o modalidades. P=número de elementos de la modalidad N En dicho caso, definiendo: yi= 1si elto. ipresenta modalidad bajo estudio 0en caso contrario Se tiene que: yU=P σ2 yU=P−P2=P(1 −P) S2 yU=N N−1P(1 −P) Ya hemos visto la fase de muestreo, es decir, cómo construir una muestra de algunos diseños muestrales como el aleatorio simple, el de Bernouilli, Poisson, etc. Ahora estudiaremos la fase de estimación, es decir, cómo emplear los datos de esta muestra para obtener información de la población completa. Definición 2.1.26 Sea U = { 1 , . . . , N} una población finita. Sea ( M, Pr ( · )) un diseño sobre U. Un estimador ˆ θes una función: ˆ θ:M−→ R m−→ ˆ θ(m) = ˆ θ(yi:i∈m) CAPÍTULO 2. PRELIMINARES 21
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Media muestral ym=1 n(m)X i∈m yi Varianza muestral σ2 ym =1 n(m)X i∈m (yi−ym)2=y2m−y2 m Cuasivarianza muestral S2 ym =1 n(m)−1X i∈m (yi−ym)2=n(m) n(m)−1σ2 ym NOTA Los estimadores ˆ θ son variables aleatorias (discretas). Por tanto tiene sentido hablar de su esperanza, varianza y otras características de las variables aleatorias. En particular: E(ˆ θ) = P m∈M ˆ θ(m)Pr(m) V(ˆ θ) = P m∈Mˆ θ(m)−E(ˆ θ)2 Pr(m) P m∈M ˆ θ2(m)Pr(m)−E(ˆ θ)2 A continuación se darán los estimadores en el diseño MAS ( N, n ), así como conceptos previos para su obtención. Para los demás diseños, se hará de forma análoga Estimación en el MAS(N, n) Proposición 2.1.8 En el MAS(N, n), se verifica que πi=n N=f, (fracción de muestreo) ∀i∈ U πij =n(n−1) N(N−1),∀i6=j∈ U ∆ij =−f(1 −f) N−1,∀i6=j∈ U Proposición 2.1.9 En el MAS(N, n), se verifica que 1. ymes un estimador insesgado de yU 2. Su varianza: V(ym) = 1−f nS2 yU 3. S2 ym es insesgado de S2 yU 4. Un estimador insesgado de V(ym)viene dado por: ˆ V(ym) = 1−f nS2 ym Si en lugar de la media poblacional, lo que se quiere estimar es el total poblacional, ty = P i∈U yi , basta tener en cuenta que ty = NyU , para obtener los siguientes resultados, •ˆ ty=Nym •V(ym) = N21−f nS2 yU •ˆ V(ym) = N21−f nS2 ym 22 CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Si el parámetro a estimar es una proporción, θ=P=proporción de elementos que presentan cierta cualidad Se tiene que: yU=P, y por tanto: •ˆ P=ˆ yU=ym=p(proporción muestral) •V(ˆ P) = 1−f nS2 yU=1−f n N N−1P(1 −P) •ˆ V(P) = 1−f nS2 ym =1−f n−1p(1 −p) Ya hemos visto cómo estimar un parámetro y como estimar la varianza de la estimación. Ahora veremos cómo combinar estos resultados para dar una interpretación de los mismos que resulte útil a efectos prácticos. Definición 2.1.27 Sea la población U = { 1 , . . . , N} la característica bajo estudio Y = {y1, . . . , yN} y el parámetro de interés θ = θ ( Y ). Sean T1 = T1 ( m )y T2 = T2 ( m )dos estadísticos muestrales con T1 ( m ) ≤T2 ( m ) ,∀m . Se dirá que [ T1, T2 ]es un intervalo de confianza para θ, con nivel de confianza 1−α(0 < α < 1) si, P([T1, T2]3θ)≥1−α y se denotará [T1, T2]≡IC(θ; 1 −α) Proposición 2.1.10 Sea ˆ θun estimador de θde forma que ˆ θL −→ Nθ;V(ˆ θ) y sea ˆ V(ˆ θ)un estimador de V(ˆ θ)de forma que ˆ V(ˆ θ)P −→ V(ˆ θ) Entonces, ˆ θ−θ qˆ V(ˆ θ) L −→ Z∼N(0,1) Proposición 2.1.11 Bajo las condiciones anteriores (de forma aproximada) IC(θ; 1 −α) = ˆ θ−Z1−α/2qˆ V(ˆ θ),ˆ θ+Z1−α/2qˆ V(ˆ θ)! El radio del intervalo de confianza, es decir, la cantidad Z1−α/2qˆ V(·) se suele denominar error de muestreo. Intervalos de confianza en el MAS •IC(yU; 1 −α) = ym−Z1−α/2s1−f nS2 ym , ym+Z1−α/2s1−f nS2 ym ! •IC(P; 1 −α) = p−Z1−α/2s1−f n−1p(1 −p), p +Z1−α/2s1−f np(1 −p)! CAPÍTULO 2. PRELIMINARES 23
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS •IC ( ty ;1 −α ) = Nym−Z1−α/2sN21−f nS2 ym , Nym + Z1−α/2sN21−f nS2 ym! NOTA •Si V(ˆ θ)fuese conocido, entonces, IC(θ; 1 −α) = ˆ θ∓Z1−α/2qV(ˆ θ) •En el caso particular del MAS yθ=P, V(ˆ P) = 1−f n N N−1P(1 −P)≤1−f n N (N−1) 1 4 y por tanto, IC(P; 1 −α) = ˆ P∓Z1−α/2s1−f n N N−1 1 4 La elección del tamaño muestral es una de las cuestiones más relevantes del muestreo en poblaciones finitas. Se trata de decidir cuál va a ser el tamaño de la muestra, o sea n , que vamos a extraer de la población. En principio nos guiaremos por criterios de precisión, es decir, buscamos una exactitud o precisión en la estimación, predeterminada de antemano. Dependiendo del tipo de parámetro a estimar (adimensional o dimensional), se plantea el problema: Parámetro adimensional Fijados un error (absoluto) máximo admisible ( δ )y un nivel (1 −α), determinar nde forma que Prh|ˆ P−P| ≤ δi= 1 −α Parámetro dimensional Fijados un error relativo máximo admisible ( δ )y un nivel (1 −α), determinar nde forma que Pr ˆ θ θ−1≤δ = 1 −α Determinación del tamaño muestral en el MAS para P : el problema que se plantea es determinar el tamaño muestral necesario para que Prh|ˆ P−P| ≤ δi= 1 −α es equivalente a decir que (ˆ P∓δ)es un IC(P, 1−α). A partir de los resultados ya obtenidos en el MAS, ˆ P=proporción muestral V(ˆ P) = 1−f n N N−1P(1 −P)≡1−f nP(1 −P)≤1−f n 1 4 Así pues, considerando que IC(P, 1−α) = ˆ P∓Z1−α/2s1−f n 1 4 24 CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS se deduce que n=n0 1 + n0 N con n0=Z2 1−α/2 4δ2 Observaciones 1. n0está determinado por los valores fijados para δy(1 −α). 2. Para (1 −α) = 0.955 se obtiene que n0=1 δ2. 3. Se verifica que n≤n0,∀N. Determinación del tamaño muestral en el MAS para yU : ahora el problema que se plantea es determinar el tamaño muestral necesario para que Pr ˆ θ θ−1≤δ = 1 −α lo cual es equivalente a decir que (ˆ θ∓δ|θ|)es un IC(θ, 1−α). A partir del resultado obtenido en el MAS, IC(yU; 1 −α) = ym−Z1−α/2s1−f nS2 ym , ym+Z1−α/2s1−f nS2 ym ! Se deduce que n=n0 1 + n0 N con n0=Z2 1−α/2CV 2 yU δ2con CVyU=SyU yU OBSERVACIONES 1. n0 depende de parámetros desconocidos, por lo que hay varias formas de resolver este problema. Una de ellas consiste en emplear, si existe, información obtenida en otros estudios, extrapolando algunos resultados. Otra posibilidad es obtener una muestra preliminar o muestra piloto, m1 , de tamaño n1 , y una vez calculado CVym1 con dicha muestra, determinar n0 . Posteriormente se vuelve a realizar un muestreo de n−n1elementos para obtener la información deseada Otros estimadores de interés son lo que se presentan a continuación: Definición 2.1.28 Dado un diseño muestral probabilístico, se define el estimador de Horvitz-Thompson oπ-estimador de tycomo: ˆ ty=X i∈m yi πi Proposición 2.1.12 El estimador de Horvitz-Thompson es insesgado, su varianza se puede expresar como: V(ˆ ty) = X i∈UX j∈U ∆ij yi πi yj πj Si el diseño es cuantificable , es decir πij > 0 ∀i, j ∈U , entonces un estimador insesgado de la varianza es: ˆ V(ˆ ty) = X i∈mX j∈m ∆ij πij yi πi yj πj CAPÍTULO 2. PRELIMINARES 25
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Proposición 2.1.13 Si el diseño muestral es de tamaño fijo, se obtiene una expresión alternativa de la varianza del π-estimador ˆ V(ˆ ty) = −1 2X i∈UX j∈U ∆ij yi πi −yj πj!2 (Esta expresión es conocida con el nombre de Yates-Grundy-Sen). Se Obtiene, por tanto, si el diseño es cuantificable, el siguiente estimador insesgado de la varianza: ˆ V(ˆ ty) = −1 2X i∈mX j∈m ∆ij πij yi πi −yj πj!2 NOTA esta expresión de la varianza justifica que, si existe un variable auxiliar X relacionada con la variable Y , un diseño muestral Π PS reduciría la varianza del estimador. Definición 2.1.29 Considerando la media poblacional como un cociente o razón entre el total ty y N , se define el estimador de Hajek como el cociente de los respectivos π-estimadores, ˆ yU,HJ =ˆ tyπ ˆ Nπ =P i∈m yi πi P i∈m 1 πi Definición 2.1.30 Dado un diseño muestral con reemplazamiento, se define el estimador de Hansen-Hurwitz de tycomo: ˆ ty,HH = N X i=1 yi n pi fi=X i∈mr yi n pi Proposición 2.1.14 El estimador de Hansen-Hurwitz es insesgado, su varianza se puede expresar como: V(ˆ ty,HH ) = 1 n X i∈U y2 i pi −t2 y! siendo un estimador insesgado de dicha varianza ˆ V(ˆ ty,HH ) = 1 n(n−1) X i∈mr yi pi −ˆ t2 y,HH !2 Haciendo el cambio de variable zi=yi pi , se obtiene: ˆ ty,HH =zmr ˆ V(ˆ ty,HH ) = 1 n(n−1) P i∈mr (zi−zmr) = 1 nS2 z,mr NOTA El estimador de Hansen-Hurwitz de yUse define como: yU,HH =1 N N X i=1 yi npi fi=1 NX i∈mr yi npi 26 CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS Proposición 2.1.15 En un diseño muestral con reemplazamiento de tamaño n, sea fi=num. de veces que iaparece en mr, i = 1, . . . , N Entonces: 1. (f1, . . . , fN)sigue una distribución multinomial, M(n;p1, . . . , pN). 2. fies una variable aleatoria discreta con distribución binomial, Bi(n, pi). 3. E[fi] = npi,V(fi) = npi(1 −pi). 4. Cov(fi, fj) = −npipj,∀i6=j. Dado cualquier diseño muestral, y un estimador θ , especialmente en aquellos en los que no sea posible obtener un estimador insesgado de la varianza bajo el diseño realizado, se puede conseguir un estimación conservadora de dicha varianza tomando el estimador para un muestreo con reemplazamiento. Si ˆ θ=zmentonces un estimador de V(ˆ θ)podría ser: ˆ V(ˆ θ) = ˆ VCR(zm) = 1 nS2 z,m El estimador de la varianza resultante no es insesgado, pero es mucho más fácil de usar, tiene una expresión mucho más simple y no depende de las piij Habitualmente en un estudio por muestreo hay más de una variable objetivo. Por ejemplo: Ingresos de la unidad familiar: y1 Miembros de la unidad familiar: y2 Gastos en alimentación de la unidad familiar: y3 Gastos escolares de la unidad familiar: y4 ... Hasta ahora me he centrado en el estudio de cada variable por separado. Pero existen otros parámetros de interés: ingresos por individuo, gastos totales, proporción de gastos respecto a ingresos, proporción de gastos en alimentación respecto a ingresos, etc. En general, se puede decir que el parámetro de interés se puede expresar como: θ=f(ty1, ty2, . . . , typ)con f conocida Un estimador de dicho parámetro sería de la forma: ˆ θ=f(ˆ ty1,ˆ ty2,...,ˆ typ) Analizaremos el estimador obtenido según sea una función lineal o no. θ≡FUNCION LINEAL: Si θ=p P k=1 tyk, entonces ˆ θ= p X k=1 ˆ tyk=ˆ tz,π z= p X k=1 yk El estimador resultante es el estimador HT y se pueden aplicar las expresiones de varianza y estimador de la varianza. CAPÍTULO 2. PRELIMINARES 27
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS θ≡ FUNCION NO LINEAL: Utilizaremos el método de aproximación lineal para obtener un estimador de la varianza. Sea f ( x, y )una función de 2 variables. Sea ( x0, y0 )un punto fijo de forma que existen las derivadas de f de cualquier orden en ( x0 ; y0 ). Por el desarrollo de Taylor, f(x, y) = f(x0, y0) + f0 x(x0, y0)·(x−x0) + f0 y(x0, y0)·(y−y0)+ +1 2f00 xx(x0, y0)·(x−x0)2+1 2f00 yy(x0, y0)·(y−y0)2+f00 xy(x0, y0)·(x−x0)(y−y0) + . . . Utilizaremos la aproximación lineal, f(x, y)≈f(x0, y0) + f0 x(x0, y0)·(x−x0) + f0 y(x0, y0)·(y−y0) Consideremos en particular la función f(x, y) = y x, cuya aproximación lineal sería: f(x, y) = y x≈y0 x0+ −y0 x0!(x−x0) + 1 x0(y−y0) = y0 x0+y−y0 x0·x x0 Teniendo en cuenta lo anterior, un parámetro de interés y de aplicación de función no lineal, así como sus estimaciones, es el que se aporta a continuación. Definición 2.1.31 Se define el parámetro razón como el cociente de dos totales poblacionales: R=tyU txU Proposición 2.1.16 Dado el estimador del parámetro razón, ˆ Rπ=ˆ tyU ˆ txU aplicando la linealización se obtiene: ˆ Rπ≈R+ˆ ty,π −R·ˆ tx,π txU =R+X i∈m zi πi con zi=yi−Rxi txU . Por tanto, V(ˆ Rπ)≈V R+X i∈m zi πi!=V X i∈m zi πi! La estimación de esta varianza se puede obtener por alguno de los siguientes procedimientos: a) Aplicando expresiones del estimador de HT ˆ V(ˆ Rπ) = X i∈mX j∈m zi πi zj πj ∆ij πij con zi=yi−ˆ Rπxi ˆ tx,π 28 CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS b) Considerando el estimador del muestreo con reemplazamiento, ˆ VCR(ˆ Rπ) = 1 nS2 z∗,m , z∗ i=n zi πi =n πi yi−ˆ Rπxi ˆ tx,π NOTA ˆ Rπyˆ V(ˆ Rπ)no son estimadores insesgados de RπyV(ˆ Rπ) OBSERVACIÓN aplicando resultados del apartado anterior ˆ VCR(ˆ yHJ ) = 1 nS2 z∗,m , z∗ i=n zi πi =n πi yi−ˆ yHJ ˆ Nπ En ocasiones se dispone de información adicional conocida para todos los elementos de U, X={x1, . . . , xN} Este tipo de variable de información auxiliar ha sido utilizada en algún diseño muestral, como el Π PS . Nos planteamos en este tema el uso de esta variable X en la fase de estimación, construyendo otro tipo de estimadores alternativos al de Horvitz-Thompson. En general, supondremos que entre las variables Y y X existe cierta relación expresada de la forma yi≈f(xi) siendo f una función de la que supondremos conocida de qué tipo es, pero no su expresión exacta. Por ejemplo: a) yi≈xi+dcon ddesconocido. b) yi≈α+βxicon α,βdesconocidos. c) yi≈βxicon βdesconocido. Este tipo de relaciones se suele expresar como un modelo: yi=f(xi) + εicon E(εi)=0, V (εi) = σ2 i(2.4) Por ejemplo: a) yi=xi+d+εicon E(εi) = 0, V (εi) = σ2. b) yi≈α+βxi+εicon E(εi) = 0, V (εi) = σ2. c) yi≈βxi+εicon E(εi) = 0, V (εi) = σ2 i. Supuesto alguna relación del tipo 2.4, se deben en primer lugar, determinar los parámetros del modelo {d, ( α, β ) , β} . El método usual es el de mínimos cuadrados ponderados, es decir, determinar los parámetros que minimicen la siguiente función: m´ın X i∈myi−f(xi)2 πiV(εi) Una vez resuelto el problema, se pueden definir los valores ajustados y los residuos asociados al problema Valores ajustados: ˆyi=ˆ f(xi) Residuos: ei=yi−ˆyi CAPÍTULO 2. PRELIMINARES 29
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS ◦ Variables cuantitativas: si las variables, X e Y , que se desean comparar son de tipo cuantitativo, basta considerar la variable D = X−Y y, a continuación, aplicar las técnicas para el estudio de una sola población. ◦ Variables Bernouilli: si las variables o experimentos son de tipo Bernouilli, el método que se aplica es el test de McNemar. En esta situación, el objetivo es comparar pX con pY , siendo pX y pY , respectivamente, las probabilidades de que ocurra un éxito en cada experimento (antes/después, izquierda/derecha, etc.). La hipótesis H0 : pX = pY es equivalente a H0 : P ( X = 1 , Y = 0) = P ( X = 0 , Y = 1). Por lo tanto, basta considerar un nuevo experimento Bernouilli, en el cual, son posibles los siguientes resultados: E0={Pasar de éxito a fracaso}y F0={Pasar de fracaso a éxito} y representando por p=P(E0), la hipótesis a analizar es equivalente a: H0:p= 1/2 la cual puede ser analizada por el test Binomial. Desde el punto de vista práctico, los resultados pueden recogerse en una tabla de frecuencias del tipo: X/Y éxito fracaso éxito n11 n12 fracaso n21 n22 siendo n12 =número de individuos que han pasado de éxito a fracaso n21 =número de individuos que han pasado de fracaso a éxito Por tanto, el estadístico a utilizar será Texp =n12, siendo el tamaño de la muestra, en el test de McNemar, n12 + n21 = número de individuos que presentan cambios en la muestra, de modo que el resto de los individuos no intervienen en los resultados. Consideraciones: Dado que el test Binomial permite estudiar contrastes unilaterales, el test de McNemar también sirve para hipótesis del tipo H0 : px≤py o H0:px≥py. • Comparación con muestras independientes: dadas dos m.a.s. independientes una procedente de una variable aleatoria X , con función de distribución FX desconocida, y otra procedente de una variable aleatoria Y , con función de distribución FY desconocida, el objetivo que se plantea es la comparación de ambas variables (tratamientos, poblaciones, etc.). El contraste que se desea analizar es: H0:FX(t) = FY(t)∀t H1:∃t/FX(t)6=FY(t) 36 CAPÍTULO 2. PRELIMINARES
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS A continuación, se recogen una de las técnicas para dicho contraste , si bien a lo largo del trabajo se han analizado e incluido en la aplicación realizada algunas más. La aplicación de las mismas dependerá del tipo de variables que se desean comparar. ◦ Test de Kolmogorov-Smirnov: para el estudio del contraste anterior (comparación de poblaciones o, más formalmente, homogeneidad de poblaciones) el test de Kolmogorov-Smirnov, al igual que en el estudio de bondad de ajuste, se basa en el teorema Central, por lo que, el estadístico propuesto es: Dn,m = m´ax t|Sn(t)−Tm(t)| siendo Sn ( t )y Tm ( t ), respectivamente, las funciones de distribución empírica de cada una de las muestras. Si las variables son continuas, el estadístico Dn,m es de distribución libre. La región crítica viene dada por: Dn,m ≥Dn,m,α siendo Dn,m,α los correspondientes puntos críticos, tabulados en las tablas de Kolmogorov- Smirnov para dos poblaciones. Si al aplicar el test la hipótesis de homogeneidad es rechazada, es decir, las poblaciones son diferentes, este test nos permitir averiguar el porqué. Contrastes para la comparación de más de dos poblaciones: la extensión natural de los objetivos planteados en la sección anterior es la comparación de k (k > 2) tratamientos, poblaciones, etc. Si se representan por X 1 , . . . , Xk las k variables aleatorias que se desean comparar, con funciones de distribución, respectivamente, Fi ( x ) i = 1 , . . . , k , la hipótesis a analizar es: H0:F1(x) = . . . =Fk(x)∀x Al igual que en el estudio de dos poblaciones, las técnicas a aplicar dependerán del tipo de variable bajo estudio (cuantitativa o cualitativa) y del tipo de experimento (muestras relacionadas o independientes). Alguna de las técnicas no paramétricas para este estudio son generalizaciones naturales de las técnicas vistas en la sección anterior, como por ejemplo, el test chi-cuadrado para el estudio de homogeneidad de k poblaciones multinomiales con s categorías cada una, cuando las muestras son independientes. A continuación se recogen una de las técnicas para el estudio del contraste anterior cuando las variables a analizar son continuas. • Test de Kruskal-Wallis: la técnica no paramétrica más usual, para el contraste anterior, cuando se trabaja con muestras independientes. El procedimiento a seguir por esta técnica es: CAPÍTULO 2. PRELIMINARES 37
2.1. TÉCNICAS ESTADÍSTICAS Y MATEMÁTICAS ◦ Se ordenan conjuntamente (de menor a mayor) las observaciones muestrales. ◦Se asignan los rangos (de forma natural) a dichas observaciones. ◦Se calcula para cada muestra: Ri=suma de los rangos que le ha correspondido a la i-ésima muestra. Los estadísticos Ri,i= 1, . . . , k cumplen la siguiente relación: k X i=1 Ri=N(N+ 1)/2 siendo N = k P i=1 ni =número total de observaciones muestrales, donde por ni , se representa el tamaño de la i-ésima muestra, i= 1, . . . , k ◦ Si H0 es cierta, la suma total de rangos deberá estar repartida proporcionalmente entre las k muestras, en función de sus tamaños, por lo tanto el estadístico propuesto es: k X i=1 Ri−ni N+ 1 22 por lo que la hipótesis nula, será rechazada para valores grandes del estadístico. ◦ Para el cálculo de los puntos críticos, previamente a dicho estadístico hay que aplicarle una modificación (tipificación), obteniéndose el siguiente estadístico: H=12 N(N+ 1)Pk i=1 R2 i ni −3(N+ 1) ◦La región crítica viene dada por H≥Hn1,...,nk,1−α. Consideraciones: ◦ Desde el punto de vista práctico, en caso de empate entre observaciones de diferentes muestras, a cada una de ellas se le asigna rango medio. ◦ Asintóticamente, el estadístico H se distribuye, bajo H0 , según una χk−1 . En esta situación, la región crítica vendrá dada por H≥χ2 k−1,1−α ◦ Si la hipótesis nula es rechazada, se debería de recurrir a alguna técnica de comparaciones múltiples, como por ejemplo, el test de Kruskal-Nemenyi, para poder obtener más información sobre los diferentes tratamientos. 2.1.4. Cuarto curso De cuarto curso se ha programado una pequeña aplicación representado una pequeña parte de lo que es posible hacer con la asignatura de inteligencia artificial y estadística. Esta aplicación ha seguido los pasos típicos de la ciencia de datos, donde se enumeraran con una breve descripción tanto genérica como de la parte correspondiente al trabajo de inteligencia artificial y estadística 38 CAPÍTULO 2. PRELIMINARES
2.2. HERRAMIENTAS SOFTWARE 1. Definición del problema: se debe analizar la situación y definir claramente el problema que se quiere abordar. En el trabajo la definición consistió en comprobar si a partir de un modelo estadístico es posible clasificar o predecir bien los niveles de obesidad, o medir bien el índice de masa corporal a partir de una serie de respuestas. Nótese que aunque en realidad el índice de masa corporal ya tiene una fórmula IMC =peso altura ×altura, quitando sentido a crear un modelo para desentrañar este cálculo del IMC a partir de ejemplos, el plantear este sencillo estudio permite al usuario seguir de forma asequible el aprendizaje del proceso y las técnicas en sí, y ver su capacidad para obtener un modelo que prediga correctamente la variable objetivo. 2. Recopilación de datos. Asegurarse de que tiene todos los datos relevantes que se necesitan para resolver el problema. Los datos se tomaron de la siguiente fuente: https://archive.ics.uci.edu/ 3. Análisis exploratorio de datos. Ayuda a comprender mejor los datos, detectar patrones y tendencias para identificar relaciones entre diferentes variables. Los datos fueron depurados, se eliminaron observaciones con varias respuestas faltantes, se agruparon observaciones con poco volumen para hacerla más representativas, etc. 4. Modelización. Es la creación de un modelo de predicción que se usará para pronosticar o clasificar sobre una base de datos nueva. Para construir el modelo se deben elegir técnicas matemáticas desde la estadística inferencial, junto con otras de IA. Se hizo una división de los datos en conjunto de prueba y entrenamiento con un “initial_split()”, una ingeniería de características para eliminar variables con varianza nula, clasificando los datos categóricos faltantes “NA” como “desconocidos” y reemplazando observaciones numéricas con la mediana. Se especificaron los modelos de regresión y clasificación con “decision_tree()” del paquete “rpart” haciendo tuning de hiperparámetros e integrándose en un workflow. Se comenzó con un grid aleatorio y luego se utilizó un grid_regular con ayuda de filter. se analizaron las métricas con la validación cruzada y con el tuning y se seleccionaron a los mejores candidatos. 5. Evaluación. Una vez que se ha entrenado el modelo, se deben evaluar su capacidad para predecir resultados con un nivel de precisión. Posteriormente se contrastó el rendimiento sobre el conjunto de prueba. 6. Despliegue: Si el modelo satisface los requisitos de calidad, entonces puede ser desplegado como una aplicación en producción para resolver el problema empresarial para el que fue creado. Este paso no se llevó a cabo porque se trata de plantear un estudio sencillo sobre técnicas de IA. 2.2. Herramientas software Una vez que se ha definido la funcionalidad, se puede comenzar el proceso de diseño y desarrollo. Para tal fin se pueden utilizar una variedad de lenguajes de programación, bibliotecas y frameworks, dependiendo de los requisitos y preferencias. Algunas opciones comunes incluyen Python, con las bibliotecas de análisis de datos Pandas, NumPy, SciPy, ScikitLearn, Matplotlib, Keras, Tensorflow y Pytorch, o R, con los ecosistemas de paquetes Tidyverse y Tidymodels, entre muchos otros. Las opciones para crear un panel de aplicación estadística a día de hoy son incontables, tanto gratuitas como de pago. Pese a todas las opciones, la solución ha sido desarrollar CAPÍTULO 2. PRELIMINARES 39
2.2. HERRAMIENTAS SOFTWARE dicho cuadro de mandos con R, un lenguaje de programación para computación estadística y visualización gráfica, y como entorno de desarrollo integrado (IDE) RStudio. Este entorno nos aporta el hecho de tener un uso muy ampliamente extendido, con una comunidad enorme detrás, y facilita visualmente muchas tareas como la adición de librerías o la importación de datos, que amplían la funcionalidad existente, a parte de estar bajo licencia de software libre. Teniendo presente lo anterior, se ha hecho uso de este lenguaje debido a la versatilidad que posee, ya que permitía tanto un tratamiento en profundidad de los datos como la posibilidad de crear interfaces operativas. De entre las distinguidas librerías usadas en el trabajo cabe destacar las siguientes renv, para hacer el proyecto más aislado, portátil y reproducible pues, crea una biblioteca privada de paquetes R, por lo que puede actualizar y cambiar las versiones de los paquetes en un proyecto sin preocuparse por romper otros proyectos. Captura el estado de las paquetes R dentro de un archivo de bloqueo, de forma que puede compartir y colaborar más fácilmente en proyectos con otros, y asegurarse de que todos trabajen desde una base común. Al guardar el estado de la biblioteca en el archivo de bloqueo, permite restaurar la biblioteca R exactamente como se especifica en dicho archivo. flexdashboard, que es una de las librerías que se encarga de generar la interfaz gráfica con la que el cliente va a interactuar. Ha facilitado la creación empleando Rmarkdown de los paneles interactivos, siendo compatible con una amplia variedad de componentes como el uso de la barra de navegación y librerías. Usa diseños basados en filas y columnas flexibles fáciles de especificar, diseños basados en storyboards para presentar secuencias de visualizaciones y comentarios relacionados, diseños basados en columnas de fichas, que muestra conjunto de pestañas, diseños basados en múltiples páginas. Los componentes se redimensionan de forma inteligente para llenar el navegador. Shiny, la librería fundamental para la interacción con servidor en R, que se encarga de generar la interfaz gráfica con la que el cliente va a interactuar, dotando al tablero creado por flexdasboard de visualizaciones dinámicas diferentes. La aplicación shiny tiene tres componentes esenciales: un objeto de interfaz usuario, una función de servidor y una llamada a la aplicación. El objeto de la interfaz de usuario controla el diseño y la apariencia, y la función de servidor contiene las instrucciones que la computadora necesita para construir la aplicación, recibiendo parámetros input y output contenidos en una función de render, patrón que se repetirá siempre que se quiera realizar procesamiento en el servidor y generar una salidad interactiva. Los input traerán aquellos datos que dependen de la interacción del usuario, y el output se generará a partir de estos como salida. Esto conectará con la salida presente en el usuario. Finalmente, la llamada a la aplicación crea objetos de aplicación shiny a partir de un par explícito de interfaz de usuario/servidor. Shinyjs, ha permitido realizar operaciones JavaScript sin tener que saber nada de JavaScript como ocultando o mostrando un elemento. DT, para la representación de tablas interactivas. 40 CAPÍTULO 2. PRELIMINARES
2.2. HERRAMIENTAS SOFTWARE Tidyverse, es una colección de paquetes diseñados para la ciencia de datos. Este ecosistema incluye muchos otros paquetes con un uso más especializado. La mayoría se cargan automáticamente con “library(tidyverse)”, los paquetes más habitualmente usados se cargan con esa propia llamada a “library(” · “)”, aunque la instalación de tidyverse incluye paquetes adicionales que es necesario cargar aparte con “library”. Los usados a destacar en la aplicación son: • ggplot2, basados en la llamada “layered grammar of graphics”, propuesta por Hadley Wickham como aplicación y extensión de la “grammar of graphics” definida por Wilkinson [20]. ◦ plotly, para pasar de gráficos estáticos a interactivos a través de la biblioteca de gráficos JavaScript de código abierto. No forma parte del núcleo de Tidyverse. • dplyr, que proporciona una “gramática para la manipulación y operaciones con”data.frames”. • tydr, que permite ordenar datos sin depurar para obtener objetos de datos en R (“tbl_df”, muy parecidos a “data.frame”) en formato ordenado. •readxl, para la importación de los archivos con extensión “.xlsx” •openxlsx, para escribir datos en excel. Tidymodels, que es una colección de paquetes para el modelado y aprendizaje automático utilizando los principios de tidyverse, ha permitido montar la aplicación de la asignatura de inteligencia artificial. Paquetes usados que forman parte de este ecosistema son: •rsample, para validar los modelos por métodos de resampling. • recipes, ayuda a realizar ingeniería de características para preparar las datos para el modelado. • parsnip, es el que se encarga de la especificación de los modelos, llamando internamente a paquetes dedicados a aplicar los distintos tipos de modelos, dependiendo de los motores empleados. • tune, cuyo objetivo es facilitar el ajuste de hiperparámetros para tener un buen ajuste del modelo. • workflows, para combinar todos los pasos del preprocesado y modelado en un único objeto. • dials, que contiene las infraestructuras para crear y administrar las métricas deseadas. • yardstick, para la evaluación del modelo, dotando de métricas que podemos aplicar tras el aprendizaje, pudiendo dejarlas predeterminadas sampling, para los estimadores de Horvitz-Thompson y Hajek así como la obtención de muestras. car, para el test de levene. DescTools, es una colección extensa de diversas funciones estadísticas básicas y contenedores básicos que no están disponibles en el sistema básico R para una descripción eficiente de los datos. ayudó con el test de los signos y el test de Siegel-Tukey. KScorrect, para la correción de lilliefors en el test de kolmogorov-Smirnov de CAPÍTULO 2. PRELIMINARES 41
2.2. HERRAMIENTAS SOFTWARE bondad de ajuste. BSDA, para el uso del test de los signos. PMCMRplus, para las comparaciones multiples. 42 CAPÍTULO 2. PRELIMINARES
Capítulo 3 Aplicación desarrollada En primer lugar, este capítulo presenta el principal resultado del trabajo, enfocado en el desarrollo de una aplicación para el alumnado del grado en estadística. Cabe destacar que en dicho grado no se han cursado asignaturas destinadas al desarrollo de un proyecto ni la creación de un producto software. No es el objetivo del mismo el de cubrir la formación que en una ingeniería informática se tendría de aspectos de dirección y planificación del mismo, elección de una metodología de desarrollo de proyectos ni llevar a cabo dentro de la misma de forma exhaustiva fases del ciclo de vida de un proyecto software, estudiados en ingeniería del software, como elicitación de requisitos, análisis, diseño e implementación, posiblemente organizados temporalmente mediante metodologías ágiles como SCRUM. Al igual que tampoco se han estudiado asignatura que tengan que ver con usabilidad o con gestión de la configuración de un proyecto. No obstante, pese a las limitaciones que esos aspectos podrían imponer sobre nuestro desarrollo, también partíamos de muchas fortalezas, incluyendo el haber recibido una formación completa en materias de estadística y matemáticas, objeto del proyecto, y haber trabajado con muchas de las herramientas software que nos planteamos emplear en este desarrollo. Como se ha introducido en apartados anteriores de la memoria, y pese a no haber estudiado materias relacionadas con usabilidad, el enfoque del trabajo ha tenido en todo momento un trasfondo orientado a satisfacer las necesidades de un usuario final, y en ese sentido fue fundamental conocer la base de los potenciales interesados al cursar cada una de las materias del grado. Con todo esto en mente, nos embarcamos en el proyecto y fuimos desarrollando una aplicación visual estructurada en cursos académicos. A lo largo de este capítulo, en lugar de orientar la memoria a un público que vea diseños de los elementos software interconectados que formarán parte de la aplicación, lo que se va a tratar es de presentar una muestra de las principales funcionalidades que se han proporcionado, y se acompañará a las explicaciones y las capturas de pantalla ilustrando la misma de explicaciones más técnicas para permitir al lector entender los distintos tipos de elementos tecnológicos incorporados en la aplicación, con algunos fragmentos de código ilustrando el uso de los mismos, de forma que potenciales lectores interesados no solo en utilizar sino también en extender estas herramientas puedan tener una guía sobre cómo trabajar con según qué tipos de elementos. Por ello, no se encuentran detalladas en este capítulo ni mucho menos todas las funcionalidades, sino una muestra de ellas que puedan resultar de interés no únicamente funcional sino también tecnológico, quedando la aplicación completa a disposición para poder consultar y probar toda la funcionalidad 43
3.1. ESQUELETO DE LA APLICACIÓN proporcionada. 3.1. Esqueleto de la aplicación La aplicación toma la forma de un cuadro de mando, desplegado como una aplicación web, con una serie de opciones de menú con diferentes menús desplegables que constan de varias opciones cada uno, y cuyo destino de cada opción lleva a la carga en la misma página principal de las funcionalidades solicitadas. Para ello empleo un tablero de flexdashboard 1 junto con la interactividad y dinamismo de shiny, permitiendo un mecanismo para la introducción de controles visuales, y de salidas que refrescan su contenido cada vez que se modifican los valores seleccionados por el usuario mediante los controles permitiendo así hacer la aplicación aún más atractiva. Una aplicación de este tipo puede generarse de diversas maneras en [3] se comenta un poco acerca de las opciones de crear cuadros de mando, pero para esta se ha optado por partir de un archivo con extensión .Rmd (que es el tablero flexdashboard integrado con shiny) al que en algunas ocasiones se le añadirá el código necesario para la creación de una asignatura y en otras se le anexionará archivos que le dotarán de contenido al tablero de flexdashboard, este último recurso ha sido el más usado pues así se evita la extensión de un archivo distribuyéndola en varias. Por tanto uno de las primeras librerías que ha de instalarse es flexdasboard install.packages("flexdashboard") library(flexdashboard) Posteriormente, acceder a la plantilla de flexdasboard desde la interfaz de Rstudio. A continuación se muestra una batería de imágenes, con recuadros numerados que indican donde clicar, siendo el color rojo el primer clic, el color azul el segundo clic y el color verde el tercer clic, en vez de dejar una descripción. Figura 3.1: Accediendo a plantilla flexdashboard 1ªparte. 1Para más información acudir a: [14] 44 CAPÍTULO 3. APLICACIÓN DESARROLLADA
3.1. ESQUELETO DE LA APLICACIÓN Figura 3.2: Accediendo a plantilla flexdashboard 2ªparte. Figura 3.3: Plantilla flexdashboard. CAPÍTULO 3. APLICACIÓN DESARROLLADA 45
3.3. DESCRIPCIÓN CURSO A CURSO Cálculos con vectores aleatorios discretos. Todos estos contenidos, así como las bases para su aplicación están descritas en la sección 2.1.1. Como funcionalidades desarrolladas dentro de la asignatura de Cálculo de Probabilidades, cabe destacar: Las estructuras combinatorias con un ejemplo práctico. Para utilizar estas estructuras, solo hay que seleccionar la operación deseada e introducir el/los parámetro/s correspondiente/s y la aplicación devolverá el resultado. Las estructuras combinatorias disponibles son: •Permutación sin repetición. •Permutación con repetición. •Permutación circular. •Permutación de longitud n. •Combinación sin repetición. •Todas las combinaciones posibles de Nelementos. Una vista previa de este subapartado es la Figura 3.15. Figura 3.15: Vista previa del diseño de los nºcombinatorios. En esta pantalla si el usuario quisiera obtener el resultado de alguna de las estructuras combinatorias anteriormente mencionadas, solo tendría que clicar en "Selecciona una operación" y posteriormente introducir el valor correspondiente en su casilla. Si quisiera obtener un ejemplo práctico que le sirve de ayuda sobre esa estructura combinatoria pincharía en el botón "Ejemplo" y obtendría el resultado. En la Figura 3.15 la estructura que se muestra en el bloque superior es la que se genera mediante el ".storyboard" ilustrado en la Figura 3.5, y da una medida de secuencialidad, de modo que es esperable que el usuario vaya pasando por los contenidos de izquierda a derecha si quiere realizar un avance progresivo en su aprendizaje. 52 CAPÍTULO 3. APLICACIÓN DESARROLLADA
3.3. DESCRIPCIÓN CURSO A CURSO Códigos a destacar, en esta subsección son: • El uso de látex tanto en la interfaz usuario, ya sea en una etiqueta (exceptuando las opciones de un "selectInput"), título o texto como en el servidor. Una muestra de código es la que se proporciona en la Figura 3.16, Figura 3.16: Código R para incluir latex en shiny. En la Figura 3.16 vemos que se establece la herramienta particular como una página fluida (adaptable en tamaño dinámicamente) con una disposición en columna lateral y principal, lo que realiza sidebarLayout y sus correspondientes panel sidebar y main. A modo de muestra, se puede observar un ejemplo de entrada de usuario, con el numericInput, radioButtons y actionButtons con semántica látex incluida en ellas. La instrucción tags$script( HTML( "MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$']]} });")) añade un script que configura el modo matemático en línea, pues por defecto solo está configurado el modo matemático resaltado que usa dos símbolos dólar para abrir y dos para cerrar, y en vez de usa una barra diagonal deben usarse dos. • El botón "Ejemplo" que si se clica sobre él se mostrará/ocultará un ejemplo, iniciándose siempre en oculto. Esto ha sido posible con la ayuda de la librería shinyjs. Unas instrucciones mínimas para la ejecución de esta funcionalidad pueden observarse en la siguiente Figura 3.17. CAPÍTULO 3. APLICACIÓN DESARROLLADA 53
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.17: Código R de botón que oculta contenido, iniciándose en oculto. La función "useShinyjs()" dota a la página que se crea de interactividad de forma que se le puedan modificar atributos a los objetos ya creados. Para inicializar el texto como oculto hay que decírselo, esto es lo que hace el siguiente trozo de código tags$head( tags$style( HTML(".foo { display: none; }"))) que crea en la cabecera de la página una instrucción de estilo que contenga el atributo "class" del objeto que se desea modificar seguido de "display:none" propiedad para indicarle que inicie en oculte el contenido • La salida del resultado de la operación es dinámica, es decir, si el valor del parámetro cambia, también cambia su salida, en la siguiente Figura 3.18 puede verse más claramente, teniendo en cuenta que en la Figura 3.10 se calculó el valor para 10! y ahora está para 9! además de clicar sobre el botón "Ejemplo". 54 CAPÍTULO 3. APLICACIÓN DESARROLLADA
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.18: Vista previa del diseño de los nºcombinatorios cambiando el parámetro. Instrucciones de código como muestra para lograr dicha interactividad se muestran en la siguiente Figura 3.19 Figura 3.19: Código R para obtener salida dinámica. • La captura de varios números introducidos por el usuario a través de un "textInput" y convertirlos en un vector numérico pues, por defecto se almacenan como carácter y no se pueden operar con ellos, para ello, hay que realizar un pequeño tratamiento de datos. En la siguiente Figura 3.20 puede apreciarse una pequeña aplicación de cómo es este tratamiento de los datos, para pasar de carácter a numérico a través de un "textInput". CAPÍTULO 3. APLICACIÓN DESARROLLADA 55
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.20: Código R para cambiar la clase de un textInput. La instrucción a=as.numeric( strsplit(c(input$text0),",")[[1]]) captura mediante el “input$text0” lo que el usuario escribe en un vector cadena de longitud uno. Al indicarle al usuario que separe por comas, la función “strsplit” divide la cadena en subcadenas con argumentos divididos, haciendo divisiones, con el segundo argumento que en este caso es la coma (“,”), de forma que almacena en una lista un vector carácter de longitud igual a la cantidad de número que haya introducidos correctamemte separados por comas. Finalmente con la función “as.numeric” convierte el vector carácter en vector numérico. Los diferentes modelos de variables aleatorios discretos (uniforme, bernouilli, binomial, etc.) así como sus momentos, varianzas y probabilidades, los cuales fueron introducidos en la sección 2.1.1 Una imagen que permite ver el diseño de este subloque es la Figura 3.21 56 CAPÍTULO 3. APLICACIÓN DESARROLLADA
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.21: Vista previa del diseño de los modelos aleatorios. En esta pantalla si el usuario quisiera obtener resultados sobre los modelos anteriormente mencionadas, solo tendría que clicar en "Selecciona un modelo" y posteriormente introducir el valor del parámetro correspondiente en su casilla. En este caso, como se trata de una variable uniforme solo tendría que proporcionar el valor del parámetro x(1) que se corresponde con el valor más pequeño del conjunto de datos y el valor x(N) el más grande del conjunto de datos. Por defecto, están definidos los valores 1 y 10, por lo que obtiene una tabla con la probabilidad de cada valor, continua con el valor esperado, la varianza, el momento de orden 2 o el que se desee, como las distintas probabilidades del conjunto proporcionado. Finalmente se encuentra la representación de las funciones de probabilidad y de distribución, que pueden observarse en cierta froma en la Figura 3.22. CAPÍTULO 3. APLICACIÓN DESARROLLADA 57
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.22: Vista previa del diseño de función de probabilidad. Códigos a destacar de esta parte son: • La captura de un archivo externo para su posterior manipulación. Para conseguir capturar un archivo externo hay que darle la posibilidad al usuario de que pueda subir dicho archivo a la aplicación y posteriormente generar el código para su manipulación. • El uso de plotly para obtener gráficos interactivos. Instrucciones de código como muestra para ilustrar estas distinguidas características se observan en la siguiente imagen 58 CAPÍTULO 3. APLICACIÓN DESARROLLADA
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.23: Código R para obtener graficos interactivos y manipular archivos externos. Con respecto al cálculo con vectores aleatorios, las funcionalidades de la aplicación son el calculo de independencia, de las distribuciones marginales, de sus momentos esperados, varianzas, así como la relación entre ambos. En la Figura 3.24 puede observarse el diseño que se muestra cuando un usuario accede a este subbloque. CAPÍTULO 3. APLICACIÓN DESARROLLADA 59
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.24: Vista previa del diseño de vectores aleatorios. Para que la aplicación devuelva resultados, el usuario debe importar un archivo con extensión ".xlsx" en la forma explicada en el texto justo debajo de "Parámetro de entrada" que se encuentra en el "sidebarPanel". Una vez importado el archivo la aplicación devolverá resultados con el diseño que se muestra en la Figura 3.25. 60 CAPÍTULO 3. APLICACIÓN DESARROLLADA
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.25: Vista previa del diseño de vectores aleatorios importando archivo. Código a destacar en este subbloque es la realización de una fotografía sobre la parte que se está visualizando, si es que el usuario desea almacenar la información que proporciona la aplicación. Una pequeña aplicación como muestra de esta acción es la siguiente Figura 3.26 sobre código R. Figura 3.26: Código R para obtener captura de pantalla. CAPÍTULO 3. APLICACIÓN DESARROLLADA 61
3.3. DESCRIPCIÓN CURSO A CURSO Figura 3.34: Vista previa del diseño de ampliación de inferencia estadística. Parte 2 3.3.4. Cuarto curso En las asignaturas de cuarto curso está como optativa Inteligencia Artificial y Estadística, la cual permite adquirir los conocimientos para llevar a cabo este proyecto reunificando las diversas materias del grado en estadística en una aplicación estadística inteligente. Como abarcar todos los contenidos supone extender demasiado esta memoria se va a exponer, como resumen y en representación de lo que se estudia en la asignatura, parte del proyecto final. Cuya finalidad consistía en reunir los conocimientos aprendidos en la misma para crear una aplicación. Algo similar es lo que se ha hecho en este trabajo pero siendo el proyecto final de Inteligencia Artificial y Estadística menos extenso, tal que así es posible recogerse en este trabajo, aunque omitiéndose muchas técnicas de visualización, depuración y modelación de datos, los cuales se han trabajado ampliamente en la aplicación estadística o puede observarse en en el código del apéndice. Lo que se presenta del proyecto final de Inteligencia Artificial y Estadística es una pequeña aplicación que clasifica y calcula según los datos introducidos el tipo de indice de masa corporal (IMC). Se especifica si se posee un indice de masa corporal con bajo peso, normal, obeso o sobrepeso. Para ello, se siguieron los pasos típicos de la ciencia del dato mencionados en la sección 2.1.4 donde se definió el problema, se hizo un proceso de búsqueda de datos desde distintas fuentes5 Una vez que los datos fueron obtenidos, se empleo el ecosistema Tidyverse desde R, que posee una colección de paquetes orientados a la importación, manipulación, exploración y visualización de datos y que se utiliza exhaustivamente en ciencia de datos. Al ser el conjunto de datos un archivo “.csv” separados por comas, se llamó a la función ´read_csv´del paquete readr, ya cargado debido a que pertenece a tidyverse. Se continuó 5 Algunas fuentes de datos consultadas fueron datos.gob, data.europa, archive.ics.uci.edu, datahub.io/search, etc. 68 CAPÍTULO 3. APLICACIÓN DESARROLLADA
3.3. DESCRIPCIÓN CURSO A CURSO con la recodificación de las variables ya que el mismo R no interpretaba bien la codificación de las variables debido a que los datos no estaban depurados. Posteriormente se pasó al proceso de manipulación y ordenación con el paquete “dplyr”, conduciendo a procedimientos de limpieza de los valores, que implican realizar eliminación o generación de nuevos datos. Este proceso es relevante ya que sin datos eficientes y veraces todos los procesos posteriores serán erróneos o poco eficaces. Tal que así, se agruparon observaciones comunes con poca frecuencia de datos con varias variables coincidentes para que estuvieran bien representadas, al igual que se eliminaron aquellas que no podían agruparse a otras observaciones debido a la gran cantidad de datos desconocidos que poseía. A continuación se pasó al proceso de Visualización, para tratar de entender los datos que tenemos, dentro del Análisis Exploratorio de Datos y para tratar de transmitir conclusiones que ya hemos observado a partir de los datos, de modo que podamos facilitar esa transmisión o comunicación de conclusiones a una audiencia. Se continuó llevando a cabo el proceso de modelización. Para ello nos apoyamos en el ecosistema Tidymodels. Específicamente se hicieron dos modelos, uno de regresión y otro de clasificación. En ambos casos se hizo una partición del conjunto de datos en entrenamiento y prueba. Empleando, para ello, la función ´initial_split´junto con el el argumento ´strata´, que mantiene la misma proporción del conjunto total, de cada una de las clases, en cada subconjunto (entrenamiento y prueba), en el caso de clasificación, y en el caso de regresión dividía la variable objetivo en cuatro intervalos similares para ambos subconjuntos. Por otro lado, se especificó el tipo de modelo a utilizar. En los dos casos se ha hecho un modelo sencillo pero con suficientes variables predictoras. Se estableció un árbol de decisión, con la función ´decision_tree´y se fijo como motor “rpart”. Para el modelo de regresión además se prepararó una receta con secuencias canalizables de pasos de ingeniería de características para preparar los datos para el modelado, lo cual no era necesario para el modelo de clasificación. A continuación se creó un workflow. En este workflow incorporamos la receta (que ya lleva incluida la formula qué nos dice que predecir y a partir de que variables) y la especificación del modelo anterior. Como los árboles de decisión son un tipo de modelo muy susceptibles a cambios de la muestra elegida, en lugar de establecer unos parámetros concretos en el modelo especificado antes, a estos parámetros se les marcan con la función ´tune´que deja los valores abiertos a un proceso de ajuste de hiperparámetros. Para ello, necesitamos apoyarnos en el proceso de validación cruzada generando múltiples conjuntos de análisis y validación a partir del conjunto de entrenamiento. Específicamente se hizo validación cruzada con 10 pliegues, por lo que los datos se dividían en 10 subconjuntos. Por cada una de estas 10 iteracciones uno de los conjuntos se toma como validación y el otro como análisis. Finalmente se realiza la media aritmética de los resultados de las métricas de cada iteracción para obtener un único resultado. Este proceso de validación cruzada, se repite, al emplearse dentro de un proceso de ajuste de hiperparámetros, para una serie de combinaciones de valores de los parámetros que habíamos marcado con tune. Este proceso de ajuste lo lleva a cabo ´tune_grid´, que además de las particiones de validación cruzada y el workflow explicado antes, esta función necesita recibir que combinaciones de valores de los parámetros (o bien que cantidad de las mismas) deben probarse en ese proceso iterativo. CAPÍTULO 3. APLICACIÓN DESARROLLADA 69
3.3. DESCRIPCIÓN CURSO A CURSO En nuestro caso particular, hemos configurado nuestro proceso de dos formas distintas, mediante el paquete “dials”, específicamente un ´grid_regular´(que nos permite controlar esa configuración) y un grid aleatorio, cuyas mejores métricas se pueden observar en las tablas A.1, A.2, A.3, A.4, A.5 y A.6 del Apéndice A. De estas métricas se sacaron las mejores métricas y se compararon. Del grid_regular se sacaron dos métricas tanto del “rsq” como del “rmse” dado que la mejor seleccionada por “select_best” tenía una “min_n=2”, en ambos casos, lo que podía dar lugar a un sobreajuste, y por tanto, se optó por tomar otra con el mismo coste de complejidad pero con una “min_n=11” y también en ambos casos. En clasificación no hubo inconvenientes la función “select_best” seleccionó la mejor métrica. Con la mejor configuración de parámetros encontrada para cada modelo, lo siguiente que hacemos es la finalización del workflow, que aplica esos mejores parámetros encontrados a los parámetros que inicialmente habíamos marcado con ´tune´. Teniendo ya los modelos ajustados por el proceso anterior, en los nuevos workflows, que empleamos llevar a cabo el proceso completo de entrenamiento, predicción y evaluación sobre la partición inicial “clásica” de entrenamiento y prueba (la que obtuvimos con ´inital_split´). Esto último lo lleva a cabo ´last_fit´. Del objeto generado por ´last_fit´se puede extraer información útil sobre las métricas obtenidas, bien manualmente o con las funciones ´collect_metrics´y´collect_predictions´. En el modelo de regresión se obtuvo como mejor combinación de parámetros los generados por el grid aleatorio no siendo así en el caso de clasificación, por una centésima. En la predicción para nuevos datos se dejo la combinación de parámetros del grid aleatorio Finalmente, deben comunicarse y presentarse los resultados, tratando de ofrecer mucha información, con pocas aportaciones. Esta es la parte que se muestra en la aplicación. La predicción del IMC o nivel de obesidad con las respuesta que aporta el usuario y según el modelo que elija. En la Figura 3.35 puede verse el diseño y las funcionalidades. A través de “Source Code” puede el usuario puede ver el diseño de página de esta sección y todos los pasos antes descrito. Figura 3.35: Vista previa del diseño de inteligencia artificial y estadística. 70 CAPÍTULO 3. APLICACIÓN DESARROLLADA
Capítulo 4 Conclusiones Este capítulo va a presentar una recopilación de las principales contribuciones realizadas a lo largo del trabajo. A continuación se resumirán las lecciones aprendidas. Finalmente se comentarán algunas posibles vías para continuar ampliando o extendiendo el trabajo realizado. 4.1. Aportaciones Las principal aportación que he realizado ha sido el diseño y desarrollo de una aplicación software didáctica para el aprendizaje en el ámbito de la estadística, con la herramienta de software R y como entorno de desarrollo integrado (IDE) RStudio. Como segunda aportación he realizado un repaso completo a los contenidos cursados a lo largo de todo el grado, aunque en esta memoria se ha mostrado un pequeño subconjunto de todo lo analizado. Las aportaciones estadísticas en la aplicación han sido la programación de: 1. Estructuras combinatorias. Cálculos de permutaciones, de subconjuntos y todas las combinaciones posibles de un conjunto finito de elementos, describiendo tanto la fórmula como un ejemplo. 2. Modelo aleatorio y clásicos de variables aleatorias discretas (uniforme, bernouilli, binomial, poisson, geométrica e hipergeométrica). En este caso, se obtienen sus momentos esperados, varianzas, probabilidades, funciones de distribución y funciones de probabilidad. 3. Vectores aleatorios discretos. A partir de una tabla de probabilidad conjunta se obtienen las distribuciones marginales, los momentos y varianzas, así como el grado de relación entre ambos con la covarianza y el coeficiente de correlación y si son independientes o no. 4. Obtención de muestras según diseños muestrales aleatorios o clásicos (muestreo aleatorio simple, muestreo sistemático, muestreo de bernouilli, muestreo de poisson, muestreo de midzuno y el diseño Π PS ) a partir de un archivo excel importado o indicando el tamaño de la población o las probabilidades de selección de cada individuo, según el caso. Además, se lleva a cabo la obtención de estimadores del total poblacional, de la media poblacional, del parámetro razón, de razón, de diferencia y de regresión, así como intervalos de confianza según los diseños muestrales dados. 5. Solución a contrastes de hipótesis paramétrica y no paramétricas a partir de un archivo excel importado, así como la descripción de las hipótesis en cada caso y una 71
4.2. REFLEXIONES regla para decidir si se rechaza o no la hipótesis nula. 6. Aplicación de muestra de las herramientas de interacción y modelización que se pueden llegar a realizar con la asignatura de inteligencia artificial y estadística. 7. Provisión al usuario final de aspectos adicionales como la visualización de gráficos interactivos, la generación dinámica de las fórmulas y expresiones en LaTeX o la posibilidad de realizar capturas de pantalla de los resultados obtenidos con las distintas herramientas, entre otros. 4.2. Reflexiones El diseño y desarrollo de una aplicación software didáctica para el aprendizaje en el ámbito de la estadística me ha supuesto varios retos personales. El primero de ellos es el de medir si de verdad he adquirido los conceptos que se enseñan en las asignaturas, al tener que programar funciones para obtener resultados deseados sin tener que mirar los apuntes. En los casos en los que no disponía de ese dominio al afrontar alguna funcionalidad, el trabajo me ha brindado una nueva oportunidad para volver a aprenderlo, madurarlo y ponerlo en práctica. Otro desafío afrontado ha sido el de ser capaz de diseñar una aplicación para un usuario externo, que principalmente es un estudiante, dotándole de herramientas útiles, usables e informativas para facilitar el estudio de la estadística, implicando el plantearme muchas cuestiones didácticas y prácticas que me eran ajenas y eran esenciales para esa utilidad perseguida.. Es un trabajo que ha requerido mucho esfuerzo y dedicación, necesitando compaginar el conocimiento de la teoría y práctica de las asignaturas (con una comprensión mucho mayor de la misma que cuando cursé las mismas) con la capacidad técnica y funcional para diseñar y presentar la aplicación, con saberse la teoría y la práctica de las asignaturas pues también entra en juego el diseño y presentación de la aplicación de tal forma que se consiga que sea intuitiva, moderna, accesible para todos los usuarios y al alcance de los clics del ratón, así como didáctica que sirva de ayuda al usuario. No obstante, creo que el esfuerzo ha merecido mucho la pena, independientemente de la valoración objetiva que se pueda hacer del trabajo por parte del lector, por el aprendizaje teórico-práctico que me han proporcionado todos estos meses de trabajo, y la satisfacción de irme demostrando a mí mismo el crecimiento experimentado. Por otro lado, por supuesto soy consciente de que habrá aspectos que mejorar y mucho que poder ampliar, pero sinceramente creo que esta aplicación puede ser muy útil para los usuarios objetivo de la misma. 4.3. Trabajo futuro Como espero haber podido transmitir a lo largo de la memoria, se planteó un trabajo consistente en diseñar y desarrollar una aplicación útil para el estudio de la estadística, recopilando una batería de funcionalidades extraídas de diversas asignaturas del grado. En este sentido, se fue seleccionando una muestra de funcionalidades de asignaturas de los distintos cursos. Ahora bien, por más herramientas que fuimos incorporando, la cantidad de contenidos del grado a analizar, madurar e incorporar, con aspectos de interacción, cálculo, recopilación 72 CAPÍTULO 4. CONCLUSIONES
4.3. TRABAJO FUTURO de ejemplos, visualización, presentación, etc., haría que cualquier muestra que tomáramos nos implicara dejar mucha funcionalidad fuera del trabajo. Así, es inmediato pensar que la primera posible extensión de este trabajo sería completar de manera exhaustiva los contenidos de todas las asignaturas de todo el grado. No es para nada una tarea baladí, pero sin duda sí muy enriquecedora, y me gustaría continuar con este proyecto en el futuro, o facilitar los medios para que otros futuros compañeros puedan ampliar esta aplicación. Por otro lado, sería interesante pulir algunos detalles y subir el proyecto a shinyapps, una plataforma gratuita para poner a disposición la aplicación, aunque con una cuota reducida de tráfico y recursos de computación, como por ejemplo dotar a la aplicación de instrucciones o una guía que explique cómo la aplicación obtiene los resultados, dotarla aún más de contenido didáctico programando otras asignaturas o añadiendo a las que ya están aspectos que puedan ser de ayuda al usuario. Así como de actualizar librerías que queden obsoletas. Para continuar este proyecto es necesario conocer el lenguaje de programación R y de las librerías de las que dispone, con especial atención a los aspectos interactivos de R Shiny y los ecosistemas tidyverse y tidymodels, entre otros. CAPÍTULO 4. CONCLUSIONES 73
Apéndice A Apéndice: Tablas Este apéndice recopila alguna tablas que se mencionan en el documento, de las mejores combinaciones de parámetros en procesos de ajuste de regresión y clasificación A.1. Ajuste hiperparámetros regresión grid aleatorio 75
A.1. AJUSTE HIPERPARÁMETROS REGRESIÓN GRID ALEATORIO Tabla A.1: Métricas rsq con grid aleatorio. Modelo regresión cost_complexity tree_depth min_n .metric .estimator mean n std_err .config 0.0000000 13 3 rsq standard 0.9888833 10 0.0025567 Preprocessor1_Model06 0.0001205 15 12 rsq standard 0.9853473 10 0.0027743 Preprocessor1_Model01 0.0003035 6 16 rsq standard 0.9810145 10 0.0027349 Preprocessor1_Model08 0.0000141 9 26 rsq standard 0.9806476 10 0.0021922 Preprocessor1_Model03 0.0000005 10 30 rsq standard 0.9788397 10 0.0026442 Preprocessor1_Model07 Tabla A.2: Métricas rmse con grid aleatorio. Modelo regresión cost_complexity tree_depth min_n .metric .estimator mean n std_err .config 0.0000000 13 3 rmse standard 0.9023734 10 0.0999615 Preprocessor1_Model06 0.0001205 15 12 rmse standard 1.0459539 10 0.0981750 Preprocessor1_Model01 0.0003035 6 16 rmse standard 1.2018259 10 0.0876201 Preprocessor1_Model08 0.0000141 9 26 rmse standard 1.2192760 10 0.0688396 Preprocessor1_Model03 0.0000005 10 30 rmse standard 1.2706342 10 0.0745986 Preprocessor1_Model07 Tabla A.3: Métricas rsq con grid regular. Modelo regresión cost_complexity tree_depth min_n .metric .estimator mean n std_err .config 0.0e+00 8 2 rsq standard 0.9878522 10 0.0026003 Preprocessor1_Model12 0.0e+00 8 2 rsq standard 0.9878518 10 0.0026003 Preprocessor1_Model11 3.2e-06 8 2 rsq standard 0.9878322 10 0.0026217 Preprocessor1_Model13 3.2e-06 8 11 rsq standard 0.9875325 10 0.0025914 Preprocessor1_Model28 0.0e+00 8 11 rsq standard 0.9875324 10 0.0025909 Preprocessor1_Model26 76 APÉNDICE A. APÉNDICE: TABLAS
A.1. AJUSTE HIPERPARÁMETROS REGRESIÓN GRID ALEATORIO Tabla A.4: Métricas rmse con grid regular. Modelo regresión cost_complexity tree_depth min_n .metric .estimator mean n std_err .config 3.2e-06 8 2 rmse standard 0.9450787 10 0.0998126 Preprocessor1_Model13 0.0e+00 8 2 rmse standard 0.9452990 10 0.0989206 Preprocessor1_Model12 0.0e+00 8 2 rmse standard 0.9453126 10 0.0989210 Preprocessor1_Model11 3.2e-06 8 11 rmse standard 0.9608879 10 0.0947964 Preprocessor1_Model28 0.0e+00 8 11 rmse standard 0.9609312 10 0.0947629 Preprocessor1_Model26 APÉNDICE A. APÉNDICE: TABLAS 77
B.1. APLICACIONESTADÍSTICA.RMD fluidRow(responsive = FALSE, column(12, style = "overflow: auto; height: calc(70vh - 20px) !important;", selectInput("basic1", h3("Selecciona un modelo"), choices = list( "Modelo aleatorio"=1, "Modelo uniforme"=2, "Modelo bernoulli"=3, "Modelo binomial"=4, "Modelo poisson"=5, "Modelo geométrico"=6, "Modelo hipergeométrico"=7), selected = "Modelo Uniforme"), renderUI({ uiMod(as.numeric(input$basic1)) }) ) ) #``` ### Vectores aleatorios discretos #```{r} runVec(1) #``` # Estadística descriptiva {data-navmenu="1er curso" data-orientation=rows} #```{r} h2("Próximamente...") #``` # Teoría de la probabilidad I {data-navmenu="1er curso" data-orientation=rows} #```{r} h2("Próximamente...") #``` # Muestreo estadístico {data-navmenu="2ºcurso" data-orientation=rows} #```{r} # eval(parse("ME/index.R", encoding="UTF-8")) #``` #```{r} # runMe(1) fluidRow( style = " overflow: auto; height: calc(95vh - 45px) !important;", 84 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD shinyAppDir( file.path("ME"), # enter valid file path here options=list( width="100 %",height="100 %", style="display:flex;" ) ) ) #``` # Teoria de la probabilidad II {data-navmenu="2ºcurso" data-orientation=rows} #```{r} eval(parse("TP/index.R",encoding="UTF-8")) #``` #```{r} runTp2(1) #``` # Ampliación de inferencia estadística {data-navmenu="3er curso" data-orientation=rows} #```{r} # runMe(1) fluidRow( style = " overflow: auto; height: calc(95vh - 45px) !important;", shinyAppDir( file.path("AIE"), # enter valid file path here options=list( width="100 %",height="100 %", style="display:flex;" ) ) ) #``` # Analisis multivariante {data-navmenu="3er curso" data-orientation=rows} #```{r} h2("Próximamente...") #``` # Modelos lineales {data-navmenu="3er curso" data-orientation=rows} #```{r} h2("Próximamente...") #``` APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 85
B.1. APLICACIONESTADÍSTICA.RMD # Diseño de experimentos {data-navmenu="4ºcurso" data-orientation=rows} #```{r} h2("Próximamente...") #``` # Inteligencia artificial y estadística {data-navmenu="4ºcurso" data-orientation=rows} #```{r results='hide'} obesity <- read_csv("IAE/ObesityDataSet_raw_and_data_sinthetic.csv") obesity$Gender<-parse_factor(obesity$Gender) # levels(obesity$Gender) #para ver las etiquetas obesity$Gender =fct_recode(obesity$Gender, "Mujer" ="Female","Hombre" ="Male") # levels(obesity$Gender) #para ver las etiquetas obesity$family_history_with_overweight <- parse_factor(obesity$family_history_with_overweight) # levels(obesity$family_history_with_overweight)#para ver las etiquetas obesity$family_history_with_overweight <- fct_recode(obesity$family_history_with_overweight, "si" ="yes") # levels(obesity$family_history_with_overweight)#para ver las etiquetas obesity$FAVC<-parse_factor(obesity$FAVC, levels = c("yes","no")) # levels(obesity$FAVC)#para ver las etiquetas obesity$FAVC<-fct_recode(obesity$FAVC, "si" ="yes") # levels(obesity$FAVC)#para ver las etiquetas obesity$CAEC<-parse_factor( obesity$CAEC, levels=c("no","Sometimes","Frequently","Always")) # levels(obesity$CAEC)#para ver las etiquetas obesity$CAEC<-fct_recode( obesity$CAEC, "no"="no","algunas_veces" ="Sometimes", "frecuentemente" ="Frequently","siempre" ="Always") # levels(obesity$CAEC)#para ver las etiquetas obesity$SMOKE<-parse_factor(obesity$SMOKE, levels = c("yes","no")) # levels(obesity$SMOKE)#para ver las etiquetas obesity$SMOKE<-fct_recode(obesity$SMOKE, "si" ="yes") # levels(obesity$SMOKE)#para ver las etiquetas obesity$SCC<-parse_factor(obesity$SCC, levels = c("yes","no")) # levels(obesity$SCC)#para ver las etiquetas obesity$SCC<-fct_recode(obesity$SCC, "si" ="yes") # levels(obesity$SCC)#para ver las etiquetas 86 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD obesity$CALC<-parse_factor( obesity$CALC, levels=c("no","Sometimes","Frequently","Always")) # levels(obesity$CALC)#para ver las etiquetas obesity$CALC<-fct_recode( obesity$CALC, "no"="no","algunas_veces" ="Sometimes", "frecuentemente" ="Frequently","siempre" ="Always") # levels(obesity$CALC)#para ver las etiquetas obesity$MTRANS<-parse_factor(obesity$MTRANS) # levels(obesity$MTRANS)#para ver las etiquetas obesity$MTRANS <- fct_recode( obesity$MTRANS, "transporte_publico" ="Public_Transportation", "caminando" ="Walking", "automovil" ="Automobile", "moto" ="Motorbike", "bicicleta" ="Bike") # levels(obesity$MTRANS)#para ver las etiquetas obesity$NObeyesdad<-parse_factor(obesity$NObeyesdad, levels=c("Insufficient_Weight", "Normal_Weight", "Overweight_Level_I", "Overweight_Level_II", "Obesity_Type_I", "Obesity_Type_II", "Obesity_Type_III")) # levels(obesity$NObeyesdad)#para ver las etiquetas obesity$NObeyesdad<-fct_recode(obesity$NObeyesdad, "bajo peso" ="Insufficient_Weight", "normal" ="Normal_Weight", "sobrepeso I" ="Overweight_Level_I", "sobrepeso II" ="Overweight_Level_II", "obesidad I" ="Obesity_Type_I", "obesidad II" ="Obesity_Type_II", "obesidad III" ="Obesity_Type_III") # levels(obesity$NObeyesdad)#para ver las etiquetas obesity$Age <- trunc(obesity$Age) obesity <- obesity %> % filter(Age<=27 & Age>=16) obesity$FCVC <- trunc(obesity$FCVC) obesity$FCVC <- parse_factor(as.character(obesity$FCVC), levels = c("1","2","3")) obesity$FCVC<-fct_recode(obesity$FCVC, "nunca" ="1", "algunas_veces" ="2", APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 87
B.1. APLICACIONESTADÍSTICA.RMD "siempre" ="3") conver<-function(x){ for(i in 1:length(x)){ if(x[i]>=2& x[i]<2.5){ x[i]=1; } else if(x[i]>=2.5 & x[i]<3){ x[i]=3; } } return(x) } obesity$NCP <- fct_lump(parse_factor(as.character(obesity$NCP)), n = 3) # levels(obesity$NCP)#para ver las etiquetas obesity$NCP<- fct_recode(obesity$NCP, "entre_1_y_2"="1","tres"="3","mas_de_3"="4") # levels(obesity$NCP)#para ver las etiquetas obesity$NCP<- fct_relevel(obesity$NCP, c("entre_1_y_2","tres","mas_de_3","Other")) # levels(obesity$NCP)#para ver las etiquetas obesity$CH2O <- fct_lump(parse_factor(as.character(obesity$CH2O)), n = 3) obesity$CH2O<- fct_recode(obesity$CH2O, "menos_de_1l"="1", "entre_1l_y_2l"="2", "mas_de_2l"="3") # levels(obesity$CH2O)#para ver las etiquetas obesity$CH2O<- fct_relevel( obesity$CH2O, c("menos_de_1l","entre_1l_y_2l","mas_de_2l","Other")) # levels(obesity$CH2O)#para ver las etiquetas obesity$FAF <- fct_lump(parse_factor(as.character(obesity$FAF)), n = 4) obesity$FAF<- fct_recode(obesity$FAF, "no_tengo"="0", "1_o_2_dias"="1", "2_o_4_dias"="2", "4_o_5_dias"="3") # levels(obesity$FAF)#para ver las etiquetas obesity$FAF<- fct_relevel( obesity$FAF, c("no_tengo","1_o_2_dias","2_o_4_dias","4_o_5_dias")) # levels(obesity$FAF)#para ver las etiquetas obesity$TUE <- fct_lump(parse_factor(as.character(obesity$TUE)), n = 3) obesity$TUE <- fct_recode(obesity$TUE, 88 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD "0_2_horas"="0", "3_5_horas"="1", "mas_de_5_horas"="2") # levels(obesity$TUE)#para ver las etiquetas obesity$TUE <- fct_relevel(obesity$TUE , c("0_2_horas","3_5_horas")) # levels(obesity$TUE)#para ver las etiquetas obesidad <- obesity %> % rename(genero = Gender, edad = Age, altura = Height, peso = Weight, familiar_sobrepeso = family_history_with_overweight, consume_hipercaloricos= FAVC, consume_vegetales=FCVC, comidas_principales = NCP, consume_entre_comidas = CAEC, fuma = SMOKE, consume_agua_dia = CH2O, controla_calorias = SCC, frecuencia_actividad_fisica = FAF, tiempo_en_consolas = TUE, consume_alcohol= CALC, transporte = MTRANS, nivel_obesidad=NObeyesdad) nivel=function(x){ if(x<18.5){ y="bajo peso"; return(y) }else if(x>=18.5 & x<25){ y="normal"; return(y) }else if(x>=25 & x<27){ y="sobrepeso I"; return(y) }else if(x>=27 & x<30){ y="sobrepeso II"; return(y) }else if(x>=30 & x<35){ y="obesidad I"; return(y) }else if(x>=35 & x<40){ y="obesidad II"; return(y) }else if(x>=40){ y="obesidad III"; return(y) } } IMC <- obesidad %> % transmute(imc = peso/(altura*altura), nivel_obesidad) IMC<- IMC %> % APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 89
B.1. APLICACIONESTADÍSTICA.RMD mutate(real=map_chr(IMC$imc,nivel)) IMC$real<-parse_factor(IMC$real, levels = c("bajo peso","normal","sobrepeso I", "sobrepeso II","obesidad I", "obesidad II","obesidad III")) IMC<- IMC %> % mutate(coinci=IMC$real==IMC$nivel_obesidad) IMCT <- IMC %> % group_by(coinci) %> % count() IMCf <- IMC %> % filter(coinci=="FALSE") #Los quito del estudio obesidadq <- obesidad obesidadq$coinci=IMC$coinci obesidadq <-obesidadq %> % filter(coinci==TRUE) %> % select(-coinci) obesidad <- obesidad %> % mutate(IMC=peso/(altura*altura)) obesidadq <- obesidadq %> % mutate(IMC=peso/(altura*altura)) obesidadn <- obesidad %> % select(-c(fuma, controla_calorias,IMC)) %> % filter(consume_entre_comidas!="no", comidas_principales!="mas_de_3", consume_alcohol!="siempre", consume_alcohol!="frecuentemente", transporte!="bicicleta",transporte!="moto", transporte!="caminando") obesidadn$frecuencia_actividad_fisica <- fct_recode( obesidadn$frecuencia_actividad_fisica, "mas_de_2_dias"="2_o_4_dias","mas_de_2_dias"="4_o_5_dias") obesidadn$tiempo_en_consolas <- fct_recode( obesidadn$tiempo_en_consolas, "mas_de_3_horas"="3_5_horas", "mas_de_3_horas"="mas_de_5_horas") obesidadn$consume_entre_comidas <- fct_recode( obesidadn$consume_entre_comidas, "casi_siempre"="frecuentemente", "casi_siempre"="siempre") obesidadqn <- obesidadq %> % select(-c(fuma, controla_calorias, nivel_obesidad)) %> % filter(consume_entre_comidas!="no", comidas_principales!="mas_de_3", consume_alcohol!="siempre", consume_alcohol!="frecuentemente", 90 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD transporte!="bicicleta",transporte!="moto", transporte!="caminando") obesidadqn$frecuencia_actividad_fisica <- fct_recode( obesidadqn$frecuencia_actividad_fisica, "mas_de_2_dias"="2_o_4_dias", "mas_de_2_dias"="4_o_5_dias") obesidadqn$tiempo_en_consolas <- fct_recode( obesidadqn$tiempo_en_consolas, "mas_de_3_horas"="3_5_horas", "mas_de_3_horas"="mas_de_5_horas") obesidadqn$consume_entre_comidas <- fct_recode( obesidadqn$consume_entre_comidas, "casi_siempre"="frecuentemente", "casi_siempre"="siempre") # Arbol de regresion set.seed(123) obesidadqn_split_reg <- obesidadqn %> % initial_split(prop = 0.6,strata = "IMC") # obesidadqn_split_reg test_reg <- testing(obesidadqn_split_reg) train_reg <- training(obesidadqn_split_reg) set.seed(123) val_folds_reg <- vfold_cv(train_reg, strata = IMC) # Arbol de clasificación set.seed(123) obesidadn_split_clas <- obesidadn %> % initial_split(prop = 0.6,strata = "nivel_obesidad") # obesidadn_split_clas test_clas <- testing(obesidadn_split_clas) train_clas <- training(obesidadn_split_clas) test_clas %> % count(nivel_obesidad) %> % mutate(prop = n/sum(n)) train_clas %> % count(nivel_obesidad) %> % mutate(prop = n/sum(n)) set.seed(123) val_folds_clas <- vfold_cv(train_clas, strata=nivel_obesidad) # Receta ### regresión obesidadqn_rec_reg <- APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 91
B.1. APLICACIONESTADÍSTICA.RMD recipe(IMC ~ ., data = train_reg) %> % # < # %> % # eliminar variables con varianza cero step_novel(all_nominal()) %> % # prepara datos de prueba para manejar #niveles de factor nunca antes vistos step_unknown(all_nominal()) %> % # clasifica los datos categóricos #faltantes (NA) como "desconocidos" step_impute_median(all_numeric(), -all_outcomes())# reemplaza las #observaciones numéricas faltantes con la mediana # summary(obesidadqn_rec_reg) #receta ### clasificación obesidadqn_rec_clas <- recipe(nivel_obesidad ~ ., data = train_clas) %> % step_nzv(all_predictors()) %> % # eliminar variables con varianza cero # step_novel(all_nominal()) %> % # prepara datos de prueba para manejar #niveles de factor nunca antes vistos # step_unknown(all_nominal()) %> % # clasifica los datos categóricos #faltantes (NA) como "desconocidos" step_impute_median(all_numeric(), -all_outcomes())# reemplaza las #observaciones numéricas faltantes con la mediana # summary(obesidadqn_rec_clas) #receta # Modelo ### regresion tree_mod_reg <- decision_tree(min_n = tune(), tree_depth = tune(), cost_complexity = tune()) %> % set_engine("rpart") %> % #, num.threads = cores set_mode("regression") ### clasificacion tree_mod_clas <- decision_tree(min_n = tune(), tree_depth = tune(), cost_complexity = tune()) %> % set_engine("rpart") %> % #, num.threads = cores set_mode("classification")#modelo # Workflow ### regresion obesidadqn_wflow_reg <- workflow() %> % add_recipe(obesidadqn_rec_reg) %> % add_model(tree_mod_reg) #workflow ### clasificacion obesidadqn_wflow_clas <- workflow() %> % 92 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD add_recipe(obesidadqn_rec_clas) %> % #workflow # add_formula(nivel_obesidad ~ .) %> % add_model(tree_mod_clas) ### Regresion load("metricas.RData") # grid_reg <- grid_regular(cost_complexity(),tree_depth(), # min_n(),levels = 5,filter = min_n<=20 & tree_depth<=10) # obesidadqn_res_reg_aleat <- obesidadqn_wflow_reg %> % # tune_grid(resamples = val_folds_reg, grid=10) metric_aleat_reg <- obesidadqn_res_reg_aleat %> % collect_metrics() # obesidadqn_res_reg <- obesidadqn_wflow_reg %> % # tune_grid(resamples = val_folds_reg, grid=grid_reg) metric_regular_reg <- obesidadqn_res_reg %> % collect_metrics() best_rmse_reg_aleat <- obesidadqn_res_reg_aleat %> % show_best(metric = "rmse",n=5) best_rsq_reg_aleat <- obesidadqn_res_reg_aleat %> % show_best(metric = "rsq",n=5) best0_rmse_reg <- obesidadqn_res_reg_aleat %> % select_best(metric = "rmse") best0_rsq_reg <- obesidadqn_res_reg_aleat %> % select_best(metric = "rsq") best_rmse_reg <- obesidadqn_res_reg %> % show_best(metric = "rmse",n=5) best_rsq_reg <- obesidadqn_res_reg %> % show_best(metric = "rsq",n=5) best1_rmse_reg <- obesidadqn_res_reg %> % select_best(metric = "rmse") best1_rsq_reg <- obesidadqn_res_reg %> % select_best(metric = "rsq") best2_rmse_reg <- best_rmse_reg %> % slice(4) %> % select(cost_complexity,tree_depth, min_n, .config) best2_rsq_reg <- best_rsq_reg %> % slice(4) %> % select(cost_complexity,tree_depth, min_n, .config) APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 93
B.1. APLICACIONESTADÍSTICA.RMD comidas_principales<-"tres" }else if(input$NCP=="mas de 3"){ comidas_principales<-"mas_de_3" }else if(input$NCP=="Otro"){ comidas_principales<-"Other" } consume_entre_comidas <- NULL if(input$CEC=="algunas veces"){ consume_entre_comidas<-"algunas_veces" }else if(input$CEC!="no"){ consume_entre_comidas<-"no" }else if(input$CEC!="casi siempre"){ consume_entre_comidas<-"casi_siempre" } consume_agua_dia <- NULL if(input$Agua=="menos de 1l"){ consume_agua_dia<-"menos_de_1l" }else if(input$Agua=="entre 1l y 2l"){ consume_agua_dia<-"entre_1l_y_2l" }else if(input$Agua=="mas de 2l"){ consume_agua_dia<-"mas_de_2l" }else if(input$Agua=="Otro"){ consume_agua_dia<-"Other" } frecuencia_actividad_fisica <- NULL if(input$Actividad=="no tengo"){ frecuencia_actividad_fisica<-"no_tengo" }else if(input$Actividad=="1 o 2 dias"){ frecuencia_actividad_fisica<-"1_o_2_dias" }else if(input$Actividad=="mas de 2 dias"){ frecuencia_actividad_fisica<-"mas_de_2_dias" }else if(input$Actividad=="Otro"){ frecuencia_actividad_fisica<-"Other" } tiempo_en_consolas <- NULL if(input$Consolas=="de 0 a 2 horas"){ tiempo_en_consolas<-"0_2_horas" }else if(input$Consolas=="mas de 3 horas"){ tiempo_en_consolas<-"mas_de_3_horas" }else if(input$Consolas=="Otro"){ tiempo_en_consolas<-"Other" } 100 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD consume_alcohol<-NULL if(input$Alcohol=="algunas veces"){ consume_alcohol<-"algunas_veces" }else { consume_alcohol<-input$Alcohol } transporte<-NULL if(input$Transporte=="transporte publico"){ transporte<-"transporte_publico" }else { transporte<-input$Transporte } nuevo <- tibble(edad, genero, altura, peso, familiar_sobrepeso, consume_hipercaloricos, consume_vegetales, comidas_principales, consume_entre_comidas, consume_agua_dia, frecuencia_actividad_fisica, tiempo_en_consolas, consume_alcohol, transporte) if(colnames(datasetInput3())[15]!="IMC"){ prediccion_3 <- predict(tree_fit_clas0, new_data = nuevo, type = "class") myvalor_clas$data1 <- prediccion_3$.pred_class }else { prediccion_4 <- predict(tree_fit_reg0, new_data = nuevo, type = "numeric") myvalor_reg$data1 <- prediccion_4$.pred } }) output$mytext1 <- renderText({ if(colnames(datasetInput3())[15]=="IMC" & !is.null(myvalor_reg$data1)) { return(paste("El IMC es de:",myvalor_reg$data1,sep=" ")) }else if(colnames(datasetInput3())[15]!="IMC" & !is.null(myvalor_clas$data1)) { return(paste("El nivel de obesidad es de:", myvalor_clas$data1,sep=" ")) }else if(colnames(datasetInput3())[15]=="IMC" & is.null(myvalor_reg$data1)) { return("Calcule su IMC") }else if(colnames(datasetInput3())[15]!="IMC" & is.null(myvalor_clas$data1)) { return("Calcule su nivel de obesidad")} }) #``` #```{r} fluidRow( tags$script(type="module", APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 101
B.1. APLICACIONESTADÍSTICA.RMD "document.getElementsByClassName('dropdown-item')[2].href='#' document.getElementsByClassName('dropdown-item')[3].href='#' document.getElementsByClassName('dropdown-item')[5].href='#' document.getElementsByClassName('dropdown-item')[7].href='#' document.getElementsByClassName('dropdown-item')[8].href='#' document.getElementsByClassName('dropdown-item')[9].href='#' document.getElementsByClassName('dropdown-item')[2].parentNode.className='disabled' document.getElementsByClassName('dropdown-item')[3].parentNode.className='disabled' document.getElementsByClassName('dropdown-item')[5].parentNode.className='disabled' document.getElementsByClassName('dropdown-item')[7].parentNode.className='disabled' document.getElementsByClassName('dropdown-item')[8].parentNode.className='disabled' document.getElementsByClassName('dropdown-item')[9].parentNode.className='disabled'") ) #``` B.1.1. IMPORT Esta sección se corresponde con la carpeta IMPORT de la aplicación estadística, la cual contiene un archivo “app.R” B.1.1.1. app.R library(shiny) library(slickR) ui <- fluidPage( slickROutput("slickr",width = "90 %") ) server <- function(input, output) { output$slickr <- renderSlickR({ imgs <- list.files("imagenes/",pattern=".png",full.names = TRUE) slickR(imgs,width = "80 %") }) } shinyApp(ui=ui, server = server) B.1.2. CP Esta subsección contiene cuatro apartados, los cuales corresponden, a los cuatro archivos de códigos de la carpeta CP. B.1.2.1. index.R source("CP/comb.R") source("CP/mod.R") source("CP/vect.R") B.1.2.2. comb.R library(shiny) library(shinyjs) 102 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD uiComb <- function(n){ ui <- switch (n, fluidPage( withMathJax(), tags$script(HTML("MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$']]} });")), useShinyjs(), titlePanel("Combinación de números"), sidebarLayout( sidebarPanel( h4("Parámetros de entrada"), p(withMathJax("$P_n=n!=n\\cdot(n-1)\\cdot\\ldots\\cdot 1$")), numericInput("PerSin0","Tamaño n", 10,0, Inf), actionButton("boton0","Ejemplo") ), mainPanel( tags$head(tags$style(HTML(".foo { display: none; }"))), tags$div(id="texto",class = "foo", tags$h3("Ejemplo"), tags$p("En una estantería tenemos 10 libros diferentes, cada uno de una asignatura distinta. ¿De cuántas formas los podemos colocar?"), tags$p(tags$strong("Solución")),tags$p("En la primera posición se pueden colocar cualquiera de los 10 libros. Una vez colocado este, en la segunda posición tan solo se pueden poner 9 libros. Para la tercera posición 8 libros, así sucesivamente. Por lo tanto las formas de colocar 10 libros en 10 posiciones es 10! = 3628800.")), textOutput("salida0") ) ) ), fluidPage( withMathJax(), tags$script(HTML("MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$']]} });")), useShinyjs(), titlePanel("Combinación de números"), sidebarLayout( sidebarPanel( h4("Parámetros de entrada"), p(withMathJax("$PR_nˆ{a,b,c,...}= \\dfrac{P_n}{a!\\cdot b! \\cdot c! \\cdot \\ldots}: n=a+b+c+\\ldots$")), numericInput("PerCon0","Tamaño n", 10,0, Inf), helpText("Escriba el tamaño de cada subgrupo separado por comas, por ejemplo, 1,2,3"), textInput("grupo","Introduzca el tamaños de los subgrupos, a, b, c, ..."), actionButton("boton1","Ejemplo") ), mainPanel( tags$head(tags$style(HTML(".foo { display: none; }"))), tags$div(id="texto0",class = "foo", tags$h3("Ejemplo"), tags$p("En el palo de señales de un barco se pueden izar APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 103
B.1. APLICACIONESTADÍSTICA.RMD tres banderas rojas, dos azules y cuatro verdes. ¿Cuántas señales distintas pueden indicarse con la colocación de las nueve banderas?"), tags$p(tags$strong("Solución")), tags$p("Primero formemos grupos con los elementos de la misma clase. El primero es formado por las 3 banderas rojas, el segundo por las 2 banderas azules y el ultimo por las 4 verdes. Si a,b,c denotan el número de banderas en cada grupo tenemos que"), tags$p(withMathJax("$$a=3,\\; b=2,\\; c=4, \\; n=a+b+c=9$$")), tags$p("Las permutaciones de estos elementos cumplen los siguiente. Sí entran todos los elementos. Sí importa el orden. Sí se repiten los elementos"), tags$p("Luego se pueden realizar 1260 combinaciones")), uiOutput("salida1") ) ) ), fluidPage( withMathJax(), tags$script(HTML("MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$']]} });")), useShinyjs(), titlePanel("Combinación de números"), sidebarLayout( sidebarPanel( h4("Parámetros de entrada"), p(withMathJax("$PC_n=P_{n-1}=(n-1)!$")), numericInput("PerCir0","Tamaño n", 10,0, Inf), actionButton("boton3","Ejemplo") ), mainPanel( tags$head(tags$style(HTML(".foo { display: none; }"))), tags$div(id="texto1",class = "foo", tags$h3("Ejemplo"), tags$p("Determine cuantas pulsera circulares pueden hacerse con 7 bolas de diferentes colores (los colores no se repiten)."), tags$p(tags$strong("Solución")), tags$p("Dos pulseras se consideran iguales si es posible rotar una de ellas de manera que coincida con la otra. Supongamos, por ejemplo, que dos pulseras contienen el color rojo. Para comprobar si son iguales o no, colocamos ambas pulseras de tal manera que el color rojo aparezca en la misma posición en ambas pulseras (por ejemplo arriba del todo). Si tras hacer esto el resto de bolas aparecen en la misma posición, entonces las pulseras son iguales y en caso contrario son distintas."), tags$p("Teniendo en cuenta lo anterior, podemos contar el número de pulseras diferentes que se pueden hacer con n bolas de n colores diferentes. Para ello fijamos una posición (por ejemplo, arriba) y en ella ponemos un color rojo (por ejemplo, rojo). Las restantes n-1 posiciones se rellenan con los n-1 colores restantes. El orden es importante (pues diferentes ordenaciones dan lugar a pulseras distintas) y no hay repeticiones, por tanto hay (n-1)! 104 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD pulseras diferentes.")), textOutput("salida2") ) ) ), fluidPage( withMathJax(), tags$script(HTML("MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$']]} });")), useShinyjs(), titlePanel("Combinación de números"), sidebarLayout( sidebarPanel( h4("Parámetros de entrada"), p(withMathJax("$P_{N,n}=N(N-1)\\cdot\\ldots\\cdot (N-n+1)$")), numericInput("Perlong0","Tamaño N",10,1, Inf), numericInput("Perlong1","Tamaño n",4,1, Inf), actionButton("boton4","Ejemplo") ), mainPanel( tags$head(tags$style(HTML(".foo { display: none; }"))), tags$div(id="texto2",class = "foo", tags$h3("Ejemplo"), tags$p("Si no se permiten repeticiones. ¿Cuántos números de tres cifras se pueden formar con los seis dígitos 2, 3, 5, 6, 7, 9 ?."), tags$p(tags$strong("Solución")), tags$p("Hay 6 dígitos diferentes, no pueden repetirse e importa el orden. Se trata de permutaciones de longitud 3 de un conjunto de 6 elementos, por tanto hay 6 x 5 x 4 = 120.")), uiOutput("salida3") ) ) ), fluidPage( withMathJax(), tags$script(HTML("MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$']]} });")), useShinyjs(), titlePanel("Combinación de números"), sidebarLayout( sidebarPanel( h4("Parámetros de entrada"), p(withMathJax("$C_{m}ˆ{n}=\\binom{m}{n}= \\dfrac{m!}{n!\\cdot(m-n)!}$")), numericInput("Comb0","Tamaño N", 10,0, Inf), numericInput("Comb1","Tamaño n", 10,0, Inf), actionButton("boton5","Ejemplo") ), mainPanel( tags$head(tags$style(HTML(".foo { display: none; }"))), tags$div(id="texto3",class = "foo", tags$h3("Ejemplo"), tags$p("Un examen tipo test se compone de 15 cuestiones. Todas las cuestiones tienen el mismo valor y las APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 105
B.1. APLICACIONESTADÍSTICA.RMD respuestas incorrectas no restan nota. Determine el número de formas posibles en las que un alumno puede obtener la calificación de 6 puntos sobre 10."), tags$p(tags$strong("Solución")), tags$p("Para conseguir 6 puntos debe responder correctamente 9 de las 15 preguntas. No importa el orden en que se respondan las preguntas y no pueden repetirse las respuestas (combinaciones). Hay 5005 formas de responder")), uiOutput("salida4") ) ) ), fluidPage( withMathJax(), tags$script(HTML("MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$']]} });")), useShinyjs(), titlePanel("Combinación de números"), sidebarLayout( sidebarPanel( h4("Parámetros de entrada"), p(withMathJax("$2ˆ{n}$")), numericInput("TodComb0","Tamaño n", 10,0, Inf), actionButton("boton6","Ejemplo") ), mainPanel( tags$head(tags$style(HTML(".foo { display: none; }"))), tags$div(id="texto4",class = "foo", tags$h3("Ejemplo"), tags$p("Un químico posee en su laboratorio una balanza que tiene las siguientes pesas: 1 gr., 5 gr., 10 gr., 25 gr. y 50 gr. ¿Cuántas pesadas diferentes puede hacer?"), tags$p(tags$strong("Solución")), tags$p("Suponemos que para cada pesada puede usarse cada una de las pesas disponibles a lo sumo una vez. El orden en que las pesas son seleccionadas no importa. Entonces, cada posible pesada se corresponde con un único subconjunto del conjunto de pesas {1, 5, 10, 25, 50}. Por ejemplo a una pesada de 31 gr. le corresponde el subconjunto {1, 5, 25} y a una pesada de 15 gr. el subconjunto {5, 10}. El conjunto {1, 5, 10, 25, 50} tiene 2",tags$sup(5), "= 32 subconjuntos, luego hay 32 posibles pesadas diferentes (admitiendo que el conjunto vacío; corresponde con una pesada de 0 gr.)")), uiOutput("salida5") ) ) ) ) server <- switch (n, function(input, output) { observeEvent(input$boton0, { toggle("texto") }) 106 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD output$salida0 <- renderText({ paste("El resultado de", paste0(input$PerSin0,"! es"), factorial(input$PerSin0)) }) }, function(input, output){ Pr<-function(n,k){ if (n==sum(k)){ Pr<-paste0(factorial(n)/prod(factorial(k))) } else{ Pr<-paste0( "La suma de los subgrupos no coincide con el tamaño ", n) } return(Pr) } observeEvent(input$boton1, { toggle("texto0") }) output$salida1 <- renderUI({ a=as.numeric(strsplit(c(input$grupo),",")[[1]]) n=input$PerCon0 if (n==sum(a)){ div("El resultado de ", withMathJax("$PR_{",input$PerCon0,"}ˆ{",input$grupo,"}$"), " es ", Pr(input$PerCon0,a)) }else{Pr(input$PerCon0,a)} }) }, function(input, output) { observeEvent(input$boton3, { toggle("texto1") }) output$salida2 <- renderText({ paste("El resultado de", paste0("(",input$PerCir0,"-1)! es"), factorial(input$PerCir0-1)) })}, function(input, output) { observeEvent(input$boton4, { toggle("texto2") }) output$salida3 <- renderUI({ if(input$Perlong0<input$Perlong1){ div("El tamaño", withMathJax("$n$"), "no puede ser mayor que", withMathJax("$N$")) }else{ n=max(cumprod(c(input$Perlong0:(input$Perlong0-input$Perlong1+1)))) div("El resultado de ", withMathJax("$P_{",input$Perlong0,",",input$Perlong1,"}$"), "es",n)} })}, function(input, output) { observeEvent(input$boton5, { toggle("texto3") }) output$salida4 <- renderUI({ APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 107
B.1. APLICACIONESTADÍSTICA.RMD div("El resultado de", withMathJax("$\\dbinom{",input$Comb0,"}{",input$Comb1,"}$"), "es", choose(input$Comb0,input$Comb1)) })}, function(input, output) { observeEvent(input$boton6, { toggle("texto4") }) output$salida5 <- renderUI({ div("El resultado de", withMathJax("$2ˆ{",input$TodComb0,"}$"),2ˆ(input$TodComb0)) })} ) shinyApp(ui,server) } B.1.2.3. mod.R library(shiny) library(readxl) library(ggplot2) library(plotly) uiMod <- function(n){ ui <- switch (n, fluidPage( titlePanel("Modelos de variables aleatorias"), sidebarLayout( sidebarPanel( h4("Parámetros de entrada"), helpText("Cargue un archivo '.xlsx'con los valores de la variable en la primera columna y la probabilidad de cada valor en la segunda columna, sin encabezado"), fileInput("arch0", "Selecciona el excel",accept=".xlsx"), numericInput("moment0", "Momento de orden:",2,0, Inf), numericInput("Probigual0", "Probabilidad igual a:",1,0, Inf), numericInput("Probmenorigual0", "Probabilidad menor o igual que:", 1,0, Inf), numericInput("Probmayorigual0", "Probabilidad mayor o igual que:", 1,0, Inf), numericInput("Probmenor0", "Probabilidad menor que:",1,0, Inf), numericInput("Probmayor0", "Probabilidad mayor que:",1,0, Inf), sliderInput("Probentrecer0", "Probabilidad entre [,]:",min = 0, max = 1000,value = c(0,5)), sliderInput("Probentreabi0", "Probabilidad entre (,):",min = 0, max = 1000,value = c(0,5)), sliderInput("Probentrecerabi0", 108 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD "Probabilidad entre [,):",min = 0, max = 1000,value = c(0,5)), sliderInput("Probentreabicer0", "Probabilidad entre (,]:",min = 0, max = 1000,value = c(0,5)), ), mainPanel( uiOutput("salida0") ) ) ), fluidPage( withMathJax(), tags$script(HTML("MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$']]} });")), titlePanel("Modelos de variables aleatorias"), sidebarLayout( sidebarPanel( h4("Parámetros de entrada"), sliderInput("n0", withMathJax("Valores de $x_{(1)}$ y $x_{(N)}$"), 1,500,value = c(1,10),step=1,animate=TRUE), numericInput("moment1", "Momento de orden:",2,0, Inf), numericInput("Probigual1", "Probabilidad igual a:",1,0, Inf), numericInput("Probmenorigual1", "Probabilidad menor o igual que:", 1,0, Inf), numericInput("Probmayorigual1", "Probabilidad mayor o igual que:", 1,0, Inf), numericInput("Probmenor1", "Probabilidad menor que:",2,0, Inf), numericInput("Probmayor1"," Probabilidad mayor que:",2,0, Inf), sliderInput("Probentrecer1", "Probabilidad entre [,]:",min = 1, max = 1000,value = c(1,5)), sliderInput("Probentreabi1", "Probabilidad entre (,):",min = 1, max = 1000,value = c(1,5)), sliderInput("Probentrecerabi1", "Probabilidad entre [,):",min = 1, max = 1000,value = c(1,5)), sliderInput("Probentreabicer1", "Probabilidad entre (,]:",min = 1, max = 1000,value = c(1,5)), ), mainPanel( uiOutput("salida1") ) ) ), fluidPage( titlePanel("Modelos de variables aleatorias"), APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 109
B.1. APLICACIONESTADÍSTICA.RMD round(sum(tabl()[tabl()$Valor>=input$Probmayorigual1,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor que ", input$Probmenor1," es ", round(sum(tabl()[tabl()$Valor<input$Probmenor1,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor que ", input$Probmayor1," es ", round(sum(tabl()[tabl()$Valor>input$Probmayor1,][,2]), 4))}), renderText({ a=strsplit( paste0(input$Probentrecer1, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderText({ a=strsplit( paste0(input$Probentreabi1, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit( paste0(input$Probentrecerabi1, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit( paste0(input$Probentreabicer1, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderPlotly({ 116 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD p=ggplot(data=tabl(), aes(x=Valor,y=Probabilidad)) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de probabilidad", x="Valor",y="Probabilidades") }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=cumsum(Probabilidad))) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de distribución", x="Valor",y="Probabilidades") }) ) }) }, function(input, output) { tabl<-reactive({ tabla<-data.frame( Valor=c(0:1), Probabilidad=c(1-input$p0,input$p0)) }) output$salida2 <-renderUI({ div( renderDataTable({tabl()}), renderText({paste("El valor esperado es", sum(tabl()[1]*tabl()[2]))}), renderText({ paste("La varianza es", sum((tabl()[1]ˆ2)*tabl()[2])- (sum(tabl()[1]*tabl()[2]))ˆ2)}), renderText({ paste("El momento de orden ", input$moment2," es ", sum((tabl()[1]ˆinput$moment2)*tabl()[2]))}), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor, y=Probabilidad)) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de probabilidad", x="Valor",y="Probabilidades") }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=cumsum(Probabilidad))) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de distribución", x="Valor",y="Probabilidades") }) ) }) }, function(input, output) { APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 117
B.1. APLICACIONESTADÍSTICA.RMD tabl<-reactive({ Probabilidad=NULL for(i in 0:input$n1){ Probabilidad=c(Probabilidad, dbinom(i,input$n1,input$p1)) } tabla<-data.frame( Valor=c(0:input$n1), Probabilidad=round(Probabilidad,8)) }) output$salida3 <-renderUI({ div( renderDataTable({tabl()},options=list(digits=8)), renderText({ paste("El valor esperado es", round(sum(tabl()[1]*tabl()[2]),4))}), renderText({ paste("La varianza es", round(sum((tabl()[1]ˆ2)*tabl()[2])- (sum(tabl()[1]*tabl()[2]))ˆ2,4))}), renderText({ paste("El momento de orden ", input$moment3," es ", round(sum((tabl()[1]ˆinput$moment3)*tabl()[2]), 4))}), renderText({ paste("La probabilidad de que sea igual a ", input$Probigual2," es ", round(sum(tabl()[tabl()$Valor==input$Probigual2,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor o igual que ", input$Probmenorigual2," es ", round(sum(tabl()[tabl()$Valor<=input$Probmenorigual2,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor o igual que ", input$Probmayorigual2," es ", round(sum(tabl()[tabl()$Valor>=input$Probmayorigual2,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor que ", input$Probmenor2," es ", round(sum(tabl()[tabl()$Valor<input$Probmenor2,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor que ", input$Probmayor2," es ", round(sum(tabl()[tabl()$Valor>input$Probmayor2,][,2]), 4))}), renderText({ a=strsplit(paste0(input$Probentrecer2, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],"] es ", 118 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentreabi2, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentrecerabi2, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentreabicer2, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor, y=Probabilidad)) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de probabilidad", x="Valor",y="Probabilidades") }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=cumsum(Probabilidad))) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de distribución", x="Valor",y="Probabilidades") }) ) }) }, function(input, output) { tabl<-reactive({ Probabilidad=NULL for(i in 0:input$n2){ Probabilidad=c(Probabilidad,dpois(i,input$p2)) APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 119
B.1. APLICACIONESTADÍSTICA.RMD } tabla<-data.frame( Valor=c(0:input$n2), Probabilidad=round(Probabilidad,8)) }) output$salida4 <-renderUI({ div( renderDataTable({tabl()}), renderText({ paste("El valor esperado es", round(sum(tabl()[1]*tabl()[2]),4))}), renderText({ paste("La varianza es", round(sum((tabl()[1]ˆ2)*tabl()[2])- (sum(tabl()[1]*tabl()[2]))ˆ2,4))}), renderText({ paste("El momento de orden ", input$moment4," es ", round(sum((tabl()[1]ˆinput$moment4)*tabl()[2]), 4))}), renderText({ paste("La probabilidad de que sea igual a ", input$Probigual3," es ", round(sum(tabl()[tabl()$Valor==input$Probigual3,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor o igual que ", input$Probmenorigual3," es ", round(sum(tabl()[tabl()$Valor<=input$Probmenorigual3,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor o igual que ", input$Probmayorigual3," es ", round(sum(tabl()[tabl()$Valor>=input$Probmayorigual3,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor que ", input$Probmenor3," es ", round(sum(tabl()[tabl()$Valor<input$Probmenor3,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor que ", input$Probmayor3," es ", round(sum(tabl()[tabl()$Valor>input$Probmayor3,][,2]), 4))}), renderText({ a=strsplit(paste0(input$Probentrecer3, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentreabi3, 120 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentrecerabi3, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentreabicer3, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=Probabilidad)) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de probabilidad", x="Valor",y="Probabilidades") }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=cumsum(Probabilidad))) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de distribución", x="Valor",y="Probabilidades") }) ) }) }, function(input, output) { tabl<-reactive({ Probabilidad=NULL for(i in 0:input$n3){ Probabilidad=c(Probabilidad,dgeom(i,input$p3)) } tabla<-data.frame( Valor=c(0:input$n3), Probabilidad=round(Probabilidad,8)) }) APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 121
B.1. APLICACIONESTADÍSTICA.RMD output$salida5 <-renderUI({ div( renderDataTable({tabl()}), renderText({ paste("El valor esperado es", round(sum(tabl()[1]*tabl()[2]),4))}), renderText({ paste("La varianza es", round(sum((tabl()[1]ˆ2)*tabl()[2])- (sum(tabl()[1]*tabl()[2]))ˆ2,4))}), renderText({ paste("El momento de orden ", input$moment5," es ", round(sum((tabl()[1]ˆinput$moment5)*tabl()[2]), 4))}), renderText({ paste("La probabilidad de que sea igual a ", input$Probigual4," es ", round(sum(tabl()[tabl()$Valor==input$Probigual4,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor o igual que ", input$Probmenorigual4," es ", round(sum(tabl()[tabl()$Valor<=input$Probmenorigual4,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor o igual que ", input$Probmayorigual4," es ", round(sum(tabl()[tabl()$Valor>=input$Probmayorigual4,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor que ", input$Probmenor4," es ", round(sum(tabl()[tabl()$Valor<input$Probmenor4,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor que ", input$Probmayor4," es ", round(sum(tabl()[tabl()$Valor>input$Probmayor4,][,2]), 4))}), renderText({ a=strsplit(paste0(input$Probentrecer4, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentreabi4, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],") es ", 122 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentrecerabi4, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentreabicer4, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=Probabilidad)) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de probabilidad", x="Valor",y="Probabilidades") }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=cumsum(Probabilidad))) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de distribución", x="Valor",y="Probabilidades") }) ) }) }, function(input, output) { tabl<-reactive({ Probabilidad=NULL for(i in 0:input$n4){ Probabilidad=c(Probabilidad, dhyper(i,input$n5, input$n6-input$n5, input$n4)) } tabla<-data.frame( Valor=c(0:input$n4), Probabilidad=round(Probabilidad,8)) }) output$salida6 <-renderUI({ div( APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 123
B.1. APLICACIONESTADÍSTICA.RMD renderDataTable({tabl()}), renderText({ paste("El valor esperado es", round(sum(tabl()[1]*tabl()[2]),4))}), renderText({ paste("La varianza es", round(sum((tabl()[1]ˆ2)*tabl()[2])- (sum(tabl()[1]*tabl()[2]))ˆ2,4))}), renderText({ paste("El momento de orden ", input$moment6," es ", round(sum((tabl()[1]ˆinput$moment6)*tabl()[2]), 4))}), renderText({ paste("La probabilidad de que sea igual a ", input$Probigual5," es ", round(sum(tabl()[tabl()$Valor==input$Probigual5,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor o igual que ", input$Probmenorigual5," es ", round(sum(tabl()[tabl()$Valor<=input$Probmenorigual5,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor o igual que ", input$Probmayorigual5," es ", round(sum(tabl()[tabl()$Valor>=input$Probmayorigual5,][,2]), 4))}), renderText({ paste("La probabilidad de que sea menor que ", input$Probmenor5," es ", round(sum(tabl()[tabl()$Valor<input$Probmenor5,][,2]), 4))}), renderText({ paste("La probabilidad de que sea mayor que ", input$Probmayor5," es ", round(sum(tabl()[tabl()$Valor>input$Probmayor5,][,2]), 4))}), renderText({ a=strsplit(paste0(input$Probentrecer5, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentreabi5, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) 124 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD }), renderText({ a=strsplit(paste0(input$Probentrecerabi5, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre [", a[1],",",a[2],") es ", round(sum(tabl()[tabl()$Valor<=c,][,2])- sum(tabl()[tabl()$Valor<b,][,2]),4)) }), renderText({ a=strsplit(paste0(input$Probentreabicer5, collapse = ", "),", ")[[1]] b=as.numeric(a[1]) c=as.numeric(a[2]) paste("La probabilidad de que esté entre (", a[1],",",a[2],"] es ", round(sum(tabl()[tabl()$Valor<c,][,2])- sum(tabl()[tabl()$Valor<=b,][,2]),4)) }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=Probabilidad)) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de probabilidad", x="Valor",y="Probabilidades") }), renderPlotly({ p=ggplot(data=tabl(), aes(x=Valor,y=cumsum(Probabilidad))) + geom_bar(stat="identity",fill="lightblue", alpha=0.8) + theme_minimal() + labs(title="Función de distribución", x="Valor",y="Probabilidades") }) ) }) } ) shinyApp(ui,server) } B.1.2.4. vect.R library(shinyscreenshot) runVec <- function(n){ ui <- switch (n, fluidPage( style = "overflow: auto; height: calc(100vh - 50px) !important;", sidebarLayout( sidebarPanel( tags$head(tags$style( HTML( "#foto{position:fixed; top:450px; margin-left:110px}"))), h4("Parámetros de entrada"), APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 125
B.1. APLICACIONESTADÍSTICA.RMD "Aplicar corrección de Lilliefors")) ) ), conditionalPanel( condition = "input.oper==5", fluidRow( column(6,"$\\begin{cases}H_0: m_X= m_0 \\text{ y distribución simétrica} \\\\ H_1: m_X\\neq m_0 \\text{ o distribución no simétrica}\\end{cases} \\\\[0.5cm] \\text{Si alguna observación coincide con } \\; m_0\\;\\text{se elimina del estudio}$") ) ), conditionalPanel( condition = "input.oper==6", fluidRow( column(6,"$\\begin{cases}H_0: m_X= m_0 \\\\ H_1: m_X\\neq m_0 \\end{cases} \\\\[0.5cm] \\text{La variable } X \\text{ tiene que ser continua en un entorno de la mediana} \\\\[0.5cm] P(X>m)=P(X<m)=\\frac{1}{2}\\;;\\quad P(X=m)=0 \\\\[0.5cm] \\text{Si alguna observación coincide con } \\; m_0\\;\\text{ se elimina del estudio}$") ), fluidRow( column(4, checkboxInput("contuni4", "Realizar contraste unilateral")), conditionalPanel( condition = "input.contuni4==1", column(4, radioButtons("signouni", "Selecciona el tipo de contraste unilateral", choices=list("$H_0: m_X\\geq m_0$"=1, "$H_0: m_X\\leq m_0$"=2))), column(4, uiOutput("salidasignouni")))) ), conditionalPanel( condition = "input.oper==7", fluidRow( column(4,"$\\begin{cases}H_0: p_X= p_0 \\\\ H_1: p_X\\neq p_0 \\end{cases}$", radioButtons("forma","Realizar el contraste", choices = list( "Suponiendo que un porcentaje de los datos sea menor a un cierto valor"=1, "Introduciendo el número de exitos, el tamaño muestral y la probabilidad de exito"=2))), conditionalPanel( condition = "input.forma==1", column(4, textInput("prob","Introduce el porcentaje", placeholder = "Usa el punto como separador decimal, como por ejemplo, 0.7"), textInput("val0","Introduce el valor a comparar", placeholder = "Usa el punto como separador decimal, como por ejemplo, 1.7")), column(4,uiOutput("salidabinom1")) 132 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD ), conditionalPanel( condition = "input.forma==2", column(4, textInput("totexit", "Introduce el total de acierto"), textInput("tamn","Introduce el tamaño muestral"), textInput("prob0","Introduce el porcentaje", placeholder = "Usa el punto como separador decimal, como por ejemplo, 0.7")), column(4,uiOutput("salidabinom2")) ) ), fluidRow( column(4,checkboxInput("contuni3", "Realizar contraste unilateral")), conditionalPanel( condition = "input.contuni3==1", column(4, radioButtons("binomuni", "Selecciona el tipo de contraste unilateral", choices=list("$H_0:p_X\\geq p_0$"=1, "$H_0:p_X\\leq p_0$"=2))), column(4, uiOutput("salida8")))) ), fluidRow( column(10,"$\\begin{array}{l}\\\\ \\text{Cómo regla para decidir si se rechaza o no una hipóstesis nula se tendrá en cuenta:} \\end{array} \\\\$") ), fluidRow( column(10,tags$ul(tags$li("$\\text{Si el estudio se realiza con un nivel de significación del 10 % y se obtiene un p-valor inferior al 0.1 se rechaza la hipótesis nula,}\\\\ \\text{en caso contrario, se dice que no hay evidencias en contra para rechazar la hipótesis nula o que los datos no aportan suficiente}\\\\ \\text{evidencia para dudar de su validez.}$"))) ), fluidRow( column(10,tags$ul(tags$li("$\\text{Si el estudio se realiza con un nivel de significación del 5 % y se obtiene un p-valor inferior al 0.05 se rechaza la hipótesis nula, }\\\\ \\text{en caso contrario, se dice que no hay evidencias en contra para rechazar la hipótesis nula o que los datos no aportan suficiente}\\\\ \\text{evidencia para dudar de su validez}$"))) ) ), tabPanel( "Dos muestras independientes", fluidRow( column(6, helpText("Introduce los valores de cada variable en cada columna con encabezados"), fileInput("arch1","Selecciona el excel",accept=".xlsx"), div(id="foto",screenshotButton(label="cap"))), column(6,uiOutput("salidatabla1")) ), APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 133
B.1. APLICACIONESTADÍSTICA.RMD fluidRow( column(4, selectInput("oper0", h4("Selecciona el tipo de operación"), choices = list( "Test de Shapiro-Wilk"=1, "Test de Levene"=2, "Test de Student's"=3, "Test de Fisher"=4, "Test de kolmogorov-Smirnov de homogeneidad"=5, "Test de Wilcoxon-Mann-Whitney"=6, "Test de Siegel-Tukey"=7, "Test chi-cuadrado de independencia"=8), selected = "Shapiro-Wilk")), conditionalPanel( condition = "input.oper0==4", column(2,checkboxInput("discret", "Los datos son continuos")), conditionalPanel( condition = "input.discret==1", column(3, textInput("val1", "Introduce un valor tal que se le asignará 1 si el valor muestral es mayor que el valor indicado")) ) ), column(3, uiOutput("salida3")) ), conditionalPanel( condition = "input.oper0==1", fluidRow( column(6,"$\\begin{cases}H_0: X\\sim \\text{Normal} \\\\ H_1: X\\not\\sim \\text{Normal}\\end{cases} \\\\ \\begin{cases}H_0: Y\\sim \\text{Normal} \\\\ H_1: Y\\not\\sim \\text{Normal}\\end{cases}$") ) ), conditionalPanel( condition = "input.oper0==2", fluidRow( column(6,"$\\begin{cases}H_0: \\sigma_Xˆ2 = \\sigma_Yˆ2 \\\\ H_1: \\sigma_Xˆ2 \\neq \\sigma_Yˆ2 \\end{cases}$") ) ), conditionalPanel( condition = "input.oper0==3", fluidRow( column(6,"$\\begin{cases}H_0: \\mu_X = \\mu_Y \\\\ H_1: \\mu_X \\neq \\mu_Y\\end{cases}$") ), fluidRow( column(4,checkboxInput("contuni0", "Realizar contraste unilateral")), conditionalPanel( condition = "input.contuni0==1", column(4, radioButtons("ttestuni2mu", 134 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD "Selecciona el tipo de contraste unilateral", choices=list("$H_0:\\mu_X \\geq \\mu_Y$"=1, "$H_0:\\mu_X \\leq \\mu_Y$"=2))), column(4, uiOutput("salida4")))) ), conditionalPanel( condition = "input.oper0==4", fluidRow( column(6,"$\\begin{cases}H_0: p_X = p_Y \\\\ H_1: p_X \\neq p_Y\\end{cases}$") ) ), conditionalPanel( condition = "input.oper0==5", fluidRow( column(6,"$\\begin{cases}H_0: F_X(x) = F_Y(x) \\; \\forall x\\\\ H_1: F_X(x) \\neq F_Y(x) \\text{ para algún } x\\end{cases}$", checkboxInput("asintotic", "Obtener p-valor asintótico")) ) ), conditionalPanel( condition = "input.oper0==6", fluidRow( column(6,"$\\begin{cases}H_0: m_X = m_Y \\\\ H_1: m_X \\neq m_Y \\end{cases}$") ), fluidRow( column(4,checkboxInput("contuni1", "Realizar contraste unilateral")), conditionalPanel( condition = "input.contuni1==1", column(4, radioButtons("wiluni", "Selecciona el tipo de contraste unilateral", choices=list("$H_0: m_X \\geq m_Y$"=1, "$H_0: m_X \\leq m_Y$"=2))), column(4, uiOutput("salida5")))) ), conditionalPanel( condition = "input.oper0==7", fluidRow( column(4,"$\\begin{cases}H_0: \\text{Medidas de dispersión iguales} \\\\ H_1: \\text{Medidas de dispersión diferentes} \\end{cases}$", checkboxInput("contuni2", "Realizar contraste unilateral")), conditionalPanel( condition = "input.contuni2==1", column(4, radioButtons("sieguni", "Selecciona el tipo de contraste unilateral", choices=list("$H_0: m_X \\geq m_Y$"=1, "$H_0: m_X \\leq m_Y$"=2))), column(4, uiOutput("salida6"))) ) ), APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 135
B.1. APLICACIONESTADÍSTICA.RMD fluidRow( column(10,"$\\begin{array}{l}\\\\ \\text{Cómo regla para decidir si se rechaza o no una hipóstesis nula se tendrá en cuenta:} \\end{array} \\\\$") ), fluidRow( column(10,tags$ul(tags$li("$\\text{Si el estudio se realiza con un nivel de significación del 10 % y se obtiene un p-valor inferior al 0.1 se rechaza la hipótesis nula,}\\\\ \\text{en caso contrario, se dice que no hay evidencias en contra para rechazar la hipótesis nula o que los datos no aportan suficiente}\\\\ \\text{evidencia para dudar de su validez.}$"))) ), fluidRow( column(10,tags$ul(tags$li("$\\text{Si el estudio se realiza con un nivel de significación del 5 % y se obtiene un p-valor inferior al 0.05 se rechaza la hipótesis nula, }\\\\ \\text{en caso contrario, se dice que no hay evidencias en contra para rechazar la hipótesis nula o que los datos no aportan suficiente}\\\\ \\text{evidencia para dudar de su validez.}$"))) ) ), tabPanel( "Dos muestras relacionadas", fluidRow( column(6, helpText("Introduce los valores de cada variable en cada columna con encabezados"), fileInput("arch3","Selecciona el excel", accept=".xlsx"), div(id="foto",screenshotButton(label="cap"))), column(6, uiOutput("salidatabla3"))), fluidRow( column(4, selectInput("oper2", h4("Selecciona el tipo de operación"), choices = list("Test de McNemar"=1))), column(4,textInput("val3","Introduce un valor tal que se le asignará 1 si el valor muestral es menor que el valor indicado")), column(4,uiOutput("salida9")) ), fluidRow( column(10,"$\\begin{array}{l}\\\\ \\text{Cómo regla para decidir si se rechaza o no una hipóstesis nula se tendrá en cuenta:} \\end{array} \\\\$") ), fluidRow( column(10,tags$ul(tags$li("$\\text{Si el estudio se realiza con un nivel de significación del 10 % y se obtiene un p-valor inferior al 0.1 se rechaza la hipótesis nula,}\\\\ \\text{en caso contrario, se dice que no hay evidencias en contra para rechazar la hipótesis nula o que los datos no aportan suficiente}\\\\ \\text{evidencia para dudar de su validez.}$"))) 136 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD ), fluidRow( column(10,tags$ul(tags$li("$\\text{Si el estudio se realiza con un nivel de significación del 5 % y se obtiene un p-valor inferior al 0.05 se rechaza la hipótesis nula, }\\\\ \\text{en caso contrario, se dice que no hay evidencias en contra para rechazar la hipótesis nula o que los datos no aportan suficiente}\\\\ \\text{evidencia para dudar de su validez.}$"))) ) ), tabPanel( "K muestras", fluidRow( column(6, helpText("Introduce los valores de cada variable en cada columna con encabezados"), fileInput("arch2","Selecciona el excel",accept=".xlsx"), div(id="foto",screenshotButton(label="cap"))), column(6, uiOutput("salidatabla2"))), fluidRow( column(3, selectInput("oper1", h4("Selecciona el tipo de operación"), choices = list( "Test chi-cuadrado de homegeneidad"=1, "Test de Kruskal-Wallis (muestras independientes)"=2, "Test de Friedman (muestras dependientes)"=3), selected = "Test chi-cuadrado de homegeneidad")), conditionalPanel( condition = "input.oper1==1", column(2,checkboxInput("discret0","Los datos son continuos")), conditionalPanel( condition = "input.discret0==1", column(3,textInput("val2","Introduce un valor tal que se le asignará 1 si el valor muestral es mayor que el valor indicado")) ) ), conditionalPanel( condition = "input.oper1==2", column(3, checkboxInput("comp", "Comparaciones múltiples de Kruskal-Nemenyi")) ), conditionalPanel( condition = "input.oper1==3", column(3,checkboxInput("comp0", "Comparaciones múltiples de Friedman-Nemenyi")) ), column(4, uiOutput("salida7")) ), fluidRow( conditionalPanel( condition = "input.oper1==1", column(12,"$\\begin{cases}H_0: p_1 = \\ldots =p_k \\\\ H_1: APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 137
B.1. APLICACIONESTADÍSTICA.RMD \\exists i \\setminus p_i \\neq p_j \\;\\;\\forall \\, i\\neq j \\end{cases}$") ), conditionalPanel( condition = "input.oper1==2 || input.oper1==3", column(6,"$\\begin{cases}H_0: F_1(x) = \\ldots =F_k(x) \\forall x \\in I\\!R \\\\ H_1: F_i(x) \\neq F_j(x) \\;\\;\\forall\\, i\\neq j \\text{ y para algún } x\\end{cases} \\Leftrightarrow \\\\[0.3cm] \\Leftrightarrow \\begin{cases}H_0: \\text{Todas las muestras tienen el mismo comportamiento} \\\\ H_1: \\text{Existe alguna muestra para el cuál la distribución es distinta} \\end{cases}\\\\[0.5cm]$", conditionalPanel( condition = "(input.oper1==2 && input.comp==1) || (input.oper1==3 && input.comp0==1)", fluidRow( column(6,"$\\begin{cases}H_0: \\mu_1 = \\ldots = \\mu_k \\\\ H_1: \\exists i\\,\\setminus \\,\\mu_i \\neq \\mu_j \\; \\;\\forall\\, i\\neq j \\end{cases}$") ) )), conditionalPanel( condition = "input.oper1==2 && input.comp==1", column(6,uiOutput("salidacomp")) ), conditionalPanel( condition = "input.oper1==3 && input.comp0==1", column(6,uiOutput("salidacomp0")) ) ) ), fluidRow( column(10,"$\\begin{array}{l}\\\\ \\text{Cómo regla para decidir si se rechaza o no una hipóstesis nula se tendrá en cuenta:} \\end{array} \\\\$") ), fluidRow( column(10,tags$ul(tags$li("$\\text{Si el estudio se realiza con un nivel de significación del 10 % y se obtiene un p-valor inferior al 0.1 se rechaza la hipótesis nula,}\\\\ \\text{en caso contrario, se dice que no hay evidencias en contra para rechazar la hipótesis nula o que los datos no aportan suficiente}\\\\ \\text{evidencia para dudar de su validez.}$"))) ), fluidRow( column(10,tags$ul(tags$li("$\\text{Si el estudio se realiza con un nivel de significación del 5 % y se obtiene un p-valor inferior al 0.05 se rechaza la hipótesis nula, }\\\\ \\text{en caso contrario, se dice que no hay evidencias en contra para rechazar la hipótesis nula o que los datos no aportan suficiente}\\\\ \\text{evidencia para dudar de su validez.}$"))) ) ) ) 138 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD ) server <- function(input,output){ path <- reactive({input$arch}) tabl <-reactive({ file <- path() ext <- tools::file_ext(file$datapath) req(file) validate(need(ext == "xlsx","Por favor cargue un archivo xlsx")) tabla<-read_excel(file$datapath,col_types = c("numeric")) }) # observeEvent(input$imp, # screenshot( # scale = 1, # filename = "prueba" # )) output$salidatabla <- renderUI({ if(!is.null(path())){ if(input$oper!=3){ renderDataTable({tabl()}) } }else { p("Por favor seleccione un archivo") } }) normal <- reactive({ datosmuestrales=tabl()[[1]] shapiro.test(datosmuestrales) }) ttestbi<- reactive({ datosmuestrales=tabl()[[1]] a=as.numeric(c(input$val)) t.test(datosmuestrales,mu=a) }) ttestles<- reactive({ datosmuestrales=tabl()[[1]] a=as.numeric(c(input$val)) t.test(datosmuestrales,mu=a, alternative="less") }) ttestge<- reactive({ datosmuestrales=tabl()[[1]] a=as.numeric(c(input$val)) t.test(datosmuestrales,mu=a, alternative="greater") }) kolmogo <- reactive({ datosmuestrales=tabl()[[1]] media=mean(datosmuestrales) ks.test(datosmuestrales,pexp,1/media) }) lillief <- reactive({ set.seed(123) datosmuestrales=tabl()[[1]] LcKS(datosmuestrales,cdf = "pexp",nreps = 2000) }) wilco1mu <- reactive({ datosmuestrales=tabl()[[1]] mediana=as.numeric(input$val) APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 139
B.1. APLICACIONESTADÍSTICA.RMD pos<-which(datosmuestrales==mediana) if(length(pos)>0){ datos=datosmuestrales[-pos] }else{ datos=datosmuestrales } wilcox.test(datos,mu=mediana) }) signos <- reactive({ datosmuestrales=tabl()[[1]] mediana=as.numeric(input$val) SIGN.test(datosmuestrales,md=mediana) }) signosless<- reactive({ datosmuestrales=tabl()[[1]] mediana=as.numeric(input$val) SIGN.test(datosmuestrales,md=mediana, alternative="less") }) signosgreater<- reactive({ datosmuestrales=tabl()[[1]] mediana=as.numeric(input$val) SIGN.test(datosmuestrales,md=mediana, alternative="greater") }) testbinom<-reactive({ if(!is.null(path()) && input$forma==1 && input$prob!="" && input$val0!=""){ datosmuestrales=tabl()[[1]] comp=as.numeric(input$val0) t_X=sum(datosmuestrales<comp) tamn=length(datosmuestrales) prob=as.numeric(input$prob) binom.test(t_X,n=tamn,p=prob) } else if (input$forma==2&& input$prob0!="" && input$totexit!="" && input$tamn!=""){ prob=as.numeric(input$prob0) totalExi=as.numeric(input$totexit) tamn=as.numeric(input$tamn) binom.test(totalExi,n=tamn,p=prob) } }) testbinomless<-reactive({ if(!is.null(path()) && input$forma==1){ datosmuestrales=tabl()[[1]] comp=as.numeric(input$val0) t_X=sum(datosmuestrales<comp) tamn=length(datosmuestrales) prob=as.numeric(input$prob) binom.test(t_X,n=tamn,p=prob,alternative = "less") } else{ prob=as.numeric(input$prob0) totalExi=as.numeric(input$totexit) tamn=as.numeric(input$tamn) binom.test(totalExi,n=tamn,p=prob,alternative = "less") } }) 140 APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN
B.1. APLICACIONESTADÍSTICA.RMD testbinomgreater<-reactive({ if(!is.null(path()) && input$forma==1){ datosmuestrales=tabl()[[1]] comp=as.numeric(input$val0) t_X=sum(datosmuestrales<comp) tamn=length(datosmuestrales) prob=as.numeric(input$prob) binom.test(t_X,n=tamn,p=prob,alternative = "greater") } else{ prob=as.numeric(input$prob0) totalExi=as.numeric(input$totexit) tamn=as.numeric(input$tamn) binom.test(totalExi,n=tamn,p=prob,alternative = "greater") } }) pathchiq <- reactive({input$arch0}) tablchiq <-reactive({ file <- pathchiq() ext <- tools::file_ext(file$datapath) req(file) validate(need(ext == "xlsx","Por favor cargue un archivo xlsx")) tabla<-read_excel(file$datapath,col_types = c("numeric","numeric")) }) chisqbond <- reactive({ freq=tablchiq()[[1]] propor=tablchiq()[[2]] chisq.test(freq,p=propor) }) output$salidatabla0 <- renderUI({ if(!is.null(pathchiq()) && input$oper==3){ renderDataTable({tablchiq()}) }else { p("Por favor seleccione un archivo") } }) output$salida0 <- renderUI({ if(!is.null(path())){ if(input$oper==1){ div(h4("Test de normalidad de Shapiro-Wilk"), p("p-valor ", round(normal()$p.value,3)), p("Estadístico ",round(normal()$statistic,3)) ) }else if(input$oper==2){ div(h4("Prueba t de una muestra"), p("p-valor ", round(ttestbi()$p.value,3)), p("Estadístico ",round(ttestbi()$statistic,3))) } else if(input$oper==4&& input$lilliefor==1){ div(h4("Prueba de bondad de ajuste de Kolmogorov-Smirnov corregida por Lilliefors"), p("p-valor ", round(lillief()$p.value,3)), p("Estadístico ",round(lillief()$D.obs,3))) }else if(input$oper==4){ div(h4("Prueba de Kolmogorov-Smirnov para una muestra"), p("p-valor ", round(kolmogo()$p.value,3)), p("Estadístico ",round(kolmogo()$statistic,3))) APÉNDICE B. APÉNDICE: CÓDIGO R DE LA APLICACIÓN 141