{"id":1045,"date":"2016-05-14T20:21:26","date_gmt":"2016-05-15T02:21:26","guid":{"rendered":"http:\/\/agiltools.com\/blogsp\/?p=1045"},"modified":"2016-05-14T20:28:19","modified_gmt":"2016-05-15T02:28:19","slug":"anylogic_r_qchart","status":"publish","type":"post","link":"https:\/\/agiltools.com\/blogsp\/anylogic_r_qchart\/","title":{"rendered":"Integrando AnyLogic y R: Gr\u00e1fico de control"},"content":{"rendered":"<div id=\"dslc-theme-content\"><div id=\"dslc-theme-content-inner\"><script type=\"text\/javascript\"> jQuery(document).ready(function() { jQuery(\"#ffs-tabbed-1\").easyResponsiveTabs({     type: \t\"default\",     width:  \"100%\",     fit: \t false}); var cont_width = jQuery(\"#ffs-tabbed-1.resp-vtabs\").outerWidth() - jQuery(\"#ffs-tabbed-1.resp-vtabs .resp-tabs-list\").outerWidth() - 3;jQuery(\"#ffs-tabbed-1.resp-vtabs .resp-tabs-container\").css({\"width\":cont_width});}); <\/script><style type=\"text\/css\">\n#ffs-tabbed-1 li.resp-tab-active,\n#ffs-tabbed-1.resp-tabs-list li:hover{border-top-color:#71AFFF; border-bottom-color:#71AFFF;}\n#ffs-tabbed-1.resp-vtabs li.resp-tab-active,\n#ffs-tabbed-1.resp-vtabs .resp-tabs-list li:hover{border-left-color:#71AFFF; border-top-color:#C1C1C1; border-right-color:#71AFFF;  border-bottom-color:#C1C1C1;}\n<\/style><div id=\"ffs-tabbed-1\" class=\"ffs-tabbed-nav\"><ul class=\"resp-tabs-list\"><li>Intro<\/li><li>Modelo AnyLogic<\/li><li>Resultados<\/li><li>Qu\u00e9 hacer<\/li><\/ul><div class=\"resp-tabs-container\">\n<div class=\"fruitful_tab tab-intro\"><\/p>\n<p>Un concepto com\u00fan en la ingenier\u00eda industrial es\u00a0el control estad\u00edstico de procesos, el cu\u00e1l consiste en la\u00a0definici\u00f3n de un proceso a partir de rendimientos est\u00e1ndares de manera que el control\u00a0de calidad de los productos no requiera de una precisa medici\u00f3n de cada unidad, sino de la revisi\u00f3n de los estad\u00edsticos del proceso. Si estos tuvieron alguna desviaci\u00f3n frente a sus est\u00e1ndares (media y desviaci\u00f3n t\u00edpica), se sospecha\u00a0que pueden haber fallas de calidad en los productos y solo entonces se procede a la\u00a0revisi\u00f3n individual de los productos, lo que reduce sustancialmente los tiempos de ciclo en la producci\u00f3n (ver <a href=\"https:\/\/es.wikipedia.org\/wiki\/Control_estad%C3%ADstico_de_procesos\">link<\/a>).<\/p>\n<p>Una herramienta fundamental para esto es el gr\u00e1fico de control el cu\u00e1l permite visualizar para una actividad o proceso espec\u00edfico,\u00a0el hist\u00f3rico de tiempos de proceso en secuencia, de manera que se establezca el tiempo promedio y los l\u00edmites superiores e inferiores del proceso. Estos l\u00edmites marcan la frontera del control\u00a0estad\u00edstico,\u00a0as\u00ed un ciclo cuyo tiempo est\u00e9 por encima del l\u00edmite superior o por debajo del inferior, se presume an\u00f3malo desde el punto de vista estad\u00edstico. Los administradores de procesos deciden entonces si se trata de un hecho puntual para una unidad at\u00edpica o si es una tendencia del proceso y por ende se requieren tomar medidas bien sea frente al lote de producci\u00f3n, al recurso (un operario fatigado o una m\u00e1quina pr\u00f3xima a mantenimiento) o a la materia prima entre otras.<\/p>\n<p>Los l\u00edmites de control son usualmente definidos en funci\u00f3n de la desviaci\u00f3n estandar del proceso, en general tres desviaciones hacia arriba y hacia abajo son la norma, lo que entre otras es la base de la metodolog\u00eda six sigma.<\/p>\n<p>El gr\u00e1fico siguiente es una muestra de c\u00f3mo luce un gr\u00e1fico de control, donde se evidencia que los\u00a0ciclos de 4:30 y 6:00 estan por encima del l\u00edmite superior. Adicionalmente se evidencia que el proceso en general est\u00e1 aumentando su tiempo promedio de ciclo lo cu\u00e1l puede ser debido a una fatiga del recurso y por tanto requiere de una acci\u00f3n preventiva.<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1046\" src=\"http:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/qchart.png\" alt=\"qchart\" width=\"630\" height=\"629\" srcset=\"https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/qchart.png 630w, https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/qchart-150x150.png 150w, https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/qchart-300x300.png 300w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/><\/p>\n<p>En ocasiones los l\u00edmites son controlados artificialmente para aumentar o reducir la variabilidad. Esto sucede cuando uno o varios componentes no son homog\u00e9neos o bien cuando se quieren fijar controles espec\u00edficos (ejemplo reducir los l\u00edmites a dos desviaciones est\u00e1ndares para los pedidos de un cliente espec\u00edfico o para los productos de exportaci\u00f3n).<\/p>\n<p>En este tutorial mostraremos c\u00f3mo generar estos gr\u00e1ficos de manera autom\u00e1tica en AnyLogic con la ayuda de R y c\u00f3mo hacer uso de ellos para controlar un proceso.<\/p>\n<p><\/div>\n<div class=\"fruitful_tab tab-modelo-anylogic\"><\/p>\n<p>El modelo a simular ser\u00e1 una estaci\u00f3n de trabajo con una fuente y una salida. El tiempo de procesamiento ser\u00e1 una funci\u00f3n que explicaremos mas adelante. Adicionalmente se requiere\u00a0una imagen sin contenido, un dataset y combobox y dos sliders (ver imagen).<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1059\" src=\"http:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/alscreenshot_qcc.png\" alt=\"alscreenshot_qcc\" width=\"907\" height=\"546\" srcset=\"https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/alscreenshot_qcc.png 907w, https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/alscreenshot_qcc-300x181.png 300w, https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/alscreenshot_qcc-768x462.png 768w\" sizes=\"(max-width: 907px) 100vw, 907px\" \/><\/p>\n<p>Agregamos a la lista de dependencias del modelo la librer\u00eda RCaller-2.5.jar<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1052\" src=\"http:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/Rcaller_dependency.png\" alt=\"Rcaller_dependency\" width=\"721\" height=\"487\" srcset=\"https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/Rcaller_dependency.png 721w, https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/Rcaller_dependency-300x203.png 300w\" sizes=\"(max-width: 721px) 100vw, 721px\" \/><\/p>\n<p>La siguiente es la funci\u00f3n para controlar el tiempo de proceso <strong>tProc()<\/strong><\/p>\n<pre class=\"lang:java decode:true\">double t = 0;\r\ndouble val = round(getExperiment().getProgress()*100);\r\nif(val&lt;30){\r\nt=triangular(0.5, 8, 2);\r\n}\r\nelse if(val&lt;60){\r\nt=triangular(1.5, 11, 3);\r\n}\r\nelse{\r\nt=triangular(2.5, 14, 4);\r\n}\r\nreturn t;<\/pre>\n<p>La cu\u00e1l integramos en el servicio como tiempo de espera (ver imagen). Adicionalmente agregamos el c\u00f3digo que permite actualizar el gr\u00e1fico de control cada cierta cantidad de piezas procesadas (variable each)<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1060\" src=\"http:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/delay_qcc.png\" alt=\"delay_qcc\" width=\"729\" height=\"433\" srcset=\"https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/delay_qcc.png 729w, https:\/\/agiltools.com\/blogsp\/wp-content\/uploads\/2016\/05\/delay_qcc-300x178.png 300w\" sizes=\"(max-width: 729px) 100vw, 729px\" \/><\/p>\n<p>La funci\u00f3n <strong>updateControlChart() <\/strong>conecta AnyLogic\u00a0con el ejecutable de R (RScript), transmite datos y realiza operaciones, en este caso crea el gr\u00e1fico de control, el cu\u00e1l se guarda en una direcci\u00f3n temporal del ordenador. La direcci\u00f3n es usada para cambiar peri\u00f3dicamente la fuente del objeto imagen lo que\u00a0actializa el gr\u00e1fico de control.<\/p>\n<pre class=\"lang:java decode:true\">try {\r\n\tRCaller caller = new RCaller();\r\n    RCode code = new RCode();  \r\n    caller.setRscriptExecutable(rPath);\r\n    code.clear();\r\n    code.R_require(\"qcc\");            \r\n    double[] numbers = new double[DatasetServiceTime.size()];\r\n\tfor(int i=0; i&lt;DatasetServiceTime.size(); i++) numbers[i]=DatasetServiceTime.getY(i);\r\n\tcode.addDoubleArray(\"Service_Time\", numbers);\r\n\tFile file = code.startPlot();\r\n\tString ss = \"\";\r\n\tif(iterations&gt;0 &amp;&amp; fixLimits){\r\n\t\tss = \"st &lt;- qcc(Service_Time, type='xbar.one', limits = c(\";\r\n\t\tss = ss + lowerLimit + \", \" + upperLimit + \") ,title='\";\r\n\t\tss = ss + \"Gr\u00e1fico de control del\\ntiempo de servicio')\";\r\n\t}\r\n\telse{\r\n\t\tss = \"st &lt;- qcc(Service_Time, type='xbar.one', title='\";\r\n\t\tss = ss + \"Gr\u00e1fico de control del\\ntiempo de servicio')\";\r\n\t}\r\n\tcode.addRCode(ss); \r\n\tcode.addRCode(\"s &lt;- list(ll=st$limits[1], ul=st$limits[2], v=st$violations[1]$beyond.limits, w=st$statistics)\");\r\n\tcaller.setRCode(code);\r\n\tcaller.runAndReturnResult(\"s\");\r\n\tdouble ll = caller.getParser().getAsDoubleArray(\"ll\")[0];\r\n\tdouble ul = caller.getParser().getAsDoubleArray(\"ul\")[0];\r\n\tint[] v_id = caller.getParser().getAsIntArray(\"v\");\r\n\tdouble[] v_val = caller.getParser().getAsDoubleArray(\"w\");\r\n\tviolations=v_id;\r\n\tviolations_val=v_val;\r\n\t\t\tif(image1.getImageFileNames().size()&gt;0) image1.remove(0);\r\n  \t\t\timage1.add(file.getPath());\r\n  \t\t\timage1.setIndex(0);\r\n  \t\t\titerations++;\r\n  \t\t\tif(iterations&gt;0){\r\n  \t\t\t\tif(!fixLimits){\r\n  \t\t\t\t\tif(ll&lt;0)lowerLimit=0;\r\n  \t\t\t\t\telse lowerLimit=ll;\r\n  \t\t\t\t}\r\n  \t\t\t\tupperLimit=ul;\r\n  \t\t\t}\r\n        } catch (Exception e) {\r\n        System.out.println(e.toString());\r\n\t}<\/pre>\n<p>Esta funci\u00f3n permite adem\u00e1s identificar las piezas cuyo tiempo est\u00e1n por encima de los l\u00edmites de control (variable violations). Si hay al menos una pieza en esta categor\u00eda, el ID de la pieza y el tiempo de proceso pueden ser\u00a0conocidos haciendo click en el bot\u00f3n \"Defectos\".\nLos l\u00edmites de control tambi\u00e9n pueden ser fijados haciendo click en el combobox \"Fijar L\u00edmites\" y variando los sliders.<\/p>\n<p><\/div>\n<div class=\"fruitful_tab tab-resultados\"><\/p>\n<p>El siguiente es un video demostrando el modelo de simulaci\u00f3n en funcionamiento.\n<iframe width=\"420\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/wjW_yP3r898\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<h4>Los archivos pueden descarcarse en el siguiente <a href=\"http:\/\/agiltools.com\/Resources\/PLE_RCaller_qqc.zip\"><strong>link<\/strong><\/a>.<\/h4>\n<p>Este modelo fue hecho usando AnyLogic 7.3.3 y Microsoft R Open V 3.2.4, sin embargo como se muestra en el video, es posible cambiar el origen de RScript para usar el script original de R.<\/p>\n<p><\/div><\/p>\n<p><div class=\"fruitful_tab tab-que-hacer\"><\/p>\n<p>Este modelo es solo una muestra de las posibles aplicaciones que se pueden hacer integrando AnyLogic y R, sin embargo R cuenta con una serie de paquetes\u00a0especializados en muchos campos que permiten ampliar la gama de aplicaciones. Un ejemplor puede ser utiizar paquetes de an\u00e1lisis estad\u00edstico (ejemplo\u00a0<span style=\"text-decoration: underline;\">MASS<\/span>, <span style=\"text-decoration: underline;\">statmod<\/span>) para identificar distribuciones de probabilidad at\u00edpicas y generar predicciones sobre tiempos de operaci\u00f3n en las estaciones para mejorar la alocaci\u00f3n de tareas, o aplicar miner\u00eda de datos \u00a0(paquetes\u00a0<span style=\"text-decoration: underline;\">car <\/span>y <span style=\"text-decoration: underline;\">caret<\/span>) para clasificar actividades seg\u00fan rendimiento, o incluso utilizar aprendizaje aut\u00f3nomo (machine learning) para predecir comportamientos que mejoren la programaci\u00f3n y sequenciaci\u00f3n (<span style=\"text-decoration: underline;\">nnet<\/span>, <span style=\"text-decoration: underline;\">neuralnet<\/span>, <span style=\"text-decoration: underline;\">RSNNS<\/span>, <span style=\"text-decoration: underline;\">deepnet<\/span>, <span style=\"text-decoration: underline;\">darch<\/span>).<\/p>\n<p>Tambi\u00e9n es posible utilizar librer\u00edas especializadas para dise\u00f1ar gr\u00e1ficos m\u00e1s avanzados que los suministrados por AnyLigic (<span style=\"text-decoration: underline;\">ggplot<\/span>).<\/p>\n<p>En el pr\u00f3ximo post de esta serie se explicar\u00e1 un ejemplo aplicando miner\u00eda de datos y aprendizaje aut\u00f3nomo en R para optimizar un proceso de mediana complejidad.<\/p>\n<p><\/div>\n<\/div><\/div><div class=\"clearfix\"><\/div>\n<p>&nbsp;<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><div class=\"sd-content\"><ul><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-1045\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/agiltools.com\/blogsp\/anylogic_r_qchart\/?share=twitter\" target=\"_blank\" title=\"Click to share on Twitter\"><span>Twitter<\/span><\/a><\/li><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-1045\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/agiltools.com\/blogsp\/anylogic_r_qchart\/?share=facebook\" target=\"_blank\" title=\"Click to share on Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>&nbsp;<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><div class=\"sd-content\"><ul><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-1045\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/agiltools.com\/blogsp\/anylogic_r_qchart\/?share=twitter\" target=\"_blank\" title=\"Click to share on Twitter\"><span>Twitter<\/span><\/a><\/li><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-1045\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/agiltools.com\/blogsp\/anylogic_r_qchart\/?share=facebook\" target=\"_blank\" title=\"Click to share on Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"spay_email":""},"categories":[3,2,136,10,129,7],"tags":[108,161,25,160],"jetpack_featured_media_url":"","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/posts\/1045"}],"collection":[{"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/comments?post=1045"}],"version-history":[{"count":11,"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/posts\/1045\/revisions"}],"predecessor-version":[{"id":1062,"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/posts\/1045\/revisions\/1062"}],"wp:attachment":[{"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/media?parent=1045"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/categories?post=1045"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/agiltools.com\/blogsp\/wp-json\/wp\/v2\/tags?post=1045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}