1 Introducción

Nuevos Topicos de Logistica II

Analítica de Datos en Cadena de Suministros

UCB

1.0.0.1 Profesor Invitado


Material disponible en http://themys.sid.uncu.edu.ar/rpalma/UCB/

Markdown Monster icon

QR

Bibliografía

Para el desarrollo de este curso se recomienda consultar la siguiente bibliografía

Ver link en ventana separada

Bibliografía con galeradas

1.1 Herramientas Utilizadas

Te recomendamos descargar estos paquetes de software según tu microporcesador y sistema operativo.


R-Cran

R-Studio

2 Objetivos:

2.1 Objetivos Generales:

Como todo módulo de una maestría tan prestigiosa, este curso pretende lograr que el maestrando sea capaz de: Utilizar los elementos fundamentales del proceso de distribución y logística en la toma de decisiones vinculada con la cadena de suministro, para la identificación de asuntos relacionados con el abastecimiento de productos y el nivel de servicio en las organizaciones de manufactura y servicios y su impacto en las ventajas competitivas de la empresa.

2.2 Objetivos Específicos:

Por otro lado, recurriremos a los modelos y herramientas que cada faceta de la logística utiliza para apropiarnos de las herramientas que el mundo de la analítica de datos y la inteligencia artificial están apartando a casi todos las instancias de las empresas que operan sobre el soporte de una toma de decisiones basadas en ciencia.

No podemos intentar definir el curso si no somos capaces de entender primero que es la analítica de datos y que relación tiene con la MONTAÑA de datos que las tecnologías que han aparecido en este siglo han aportado a la logística.

La analítica es un campo incluyente y multidimensional que utiliza matemáticas, estadística, modelos predictivos y técnicas de aprendizaje basado en máquina para hallar patrones y conocimientos significativos en datos capturados de un proceso real.

Hoy en día, agregamos computadoras poderosas a la variedad datos e información para almacenar cantidades cada vez mayores de datos y ejecutar algoritmos de software avanzados, produciendo con ello los rápidos KPI (Key Performance Indicators) que se necesitan para tomar decisiones basadas en hechos. Poniendo a trabajar la ciencia de los números, datos y el descubrimiento analítico, podemos averiguar si lo que pensamos o creemos en en realidad cierto o falso. Gran parte del método de gestión y tradición que en latinoamérica se tien sobre la forma “intuitiva” de manejar una empresa está siendo día a día superada y dejada de lado por una forma de gestión con un matco teórico formal. Así mismo con entornos tan cambiantes no es posible superar sólo con experiencias del pasado los enormes desafíos que nos esperan. Producir respuestas a preguntas que nunca pensamos formular es parte del desafío que asumimos. Ése es el poder de la analítica en el entorno de la gestión de la cadena de suministros.

2.2.1 ¿Por qué es importante la analítica?

Desde el primer proyecto conocido de recopilación de datos de la población realizado por el gobierno sueco en 1749, hasta la grabación y análisis de Florence Nightingale de datos de mortalidad en la década de 1850, hasta el estudio de la relación entre tabaco y el cáncer pulmonar del académico británico Richard Doll en la década de 1950, la analítica de datos ha alimentado el descubrimiento de conocimientos por cientos de años. En nuestros dias la tecnología nos brinda posibilidades inimaginables. Pensemos en la automatización de la captura de datos que las ciudades inteligenste, la Smard Grid y la Industria 4.0 nos están abiendo y tendremos sólo una primera aproximación sobre lo que veremos en los próximos años.

Cada uno de los escenarios anteriores requería una respuesta a una pregunta hasta ahora sin respuesta. En la década de 1700, los suecos deseaban conocer la distribución geográfica de su población para aprender la mejor forma de sostener una fuerza militar apropiada. Nightingale deseaba conocer el rol que la higiene y los cuidados de enfermería desempañaba en los índices de mortalidad. Doll deseaba saber si las personas que fumaban eran más propensas a sufrir cáncer de pulmón.

Cada uno de estos pioneros sabía que el instinto no era suficiente. La analítica de datos puede descubrir correlaciones y patrones. Hay menos necesidad de recurrir a suposiciones o a la intuición. Y puede ayudar a responder los siguientes tipos de preguntas:

  • ¿Qué sucedió?
  • ¿Cómo o por qué sucedió?
  • ¿Qué sucede ahora?
  • ¿Qué es probable que suceda después?

Con computadoras más rápidas y poderosas, hay muchas oportunidades de utilizar la analítica y el big data. Ya sea para determinar riesgo de crédito, desarrollar nuevos medicamentos, hallar formas más eficientes de entregar productos y servicios, prevenir fraude, descubrir ciberamenazas o retener a los clientes más valiosos, la analítica le puede ayudar a entender a su organización – y al mundo que la rodea.

Quien presenta este curso es profesor de la Maestría en Logística de la Facultad de Ingeniería de la UNCUyo desde 1997. También es el profesor de Simulación de Negocios de la Facultad de Ciencias Económicas de la misma universidad desde 2003.
Utilizaremos el método de los minicasos para presentar la herramienta más importante con la que se están desarrollando simulaciones en estos momentos.
No se pretende que los asistentes dominen en tan corto tiempo todas las herramientas, sino mostrarles u ofrecerles alternativas mucho más poderosas y de calidad de software más alta que lo que se podría obtener de una simple hoja de cálculo.

Estado del arte en herramientas de Analítica de Datos
Con el advenimiento de la tecnología móvil es hoy más necesario que nunca que las aplicaciones que se desarrollen sean “responsivas”. Es decir que aún cuando no se ejecuten en un equipo sean capaces de adaptarse a pantallas de todo tipo y color. En ese sentido hay dos lenguajes que se han impuesto fuertemente en el ámbito académico. Estos son R-CRAN y Python.

R icon Python icon

2.2.2 Métodos analíticos populares

Existen tres tipos predominantes de analítica que se usan hoy día.

  • Estadística descriptiva. La estadística descriptiva ha estado entre nosotros la mayor cantidad de tiempo. ¿Recuerda a los suecos en 1749? La tabulación de la población fue una incursión temprana en el análisis descriptivo – el resumen de puntos de datos recopilados. Éstos son los modelos que le ayudarán a entender lo que sucedía y por qué. Se siguen utilizando muchas formas de analítica descriptiva hoy en día – todo, desde cuántos clics recibe una página hasta cuántas unidades se producen versus cuántas se venden.

  • Analítica predictiva. La analítica predictiva ha tenido un gran aumento de popularidad. El deseo de predecir el comportamiento del cliente ha sido un motor importante. El incremento en el poder de cómputo con la posibilidad de ejecutar cientos o miles de modelos con rapidez – y la adopción generalizada de técnicas predictivas como las máquinas de vectores de soporte, las redes neurales y los bosques aleatorios – impulsan el análisis predictivo al primer plano de operación de muchas organizaciones. Estos modelos usan datos pasados y algoritmos predictivos que le ayudan a determinar la probabilidad de lo que ocurrirá después.

  • Analítica prescriptiva. La analítica prescriptiva es el más nuevo chico de la cuadra. Saber lo que sucederá y saber qué hacer son dos cosas diferentes. La analítica prescriptiva responde la pregunta de qué hacer proporcionando información sobre decisiones óptimas basadas en los escenarios futuros anticipados. La clave para la analítica prescriptiva es poder utilizar el big data, datos contextuales y mucho poder de cómputo para producir respuestas en tiempo real.

2.3 El aporte de las ciencias de la computación

La idea de Susan Cholett
Programación

I.A.

3 Los Conceptos de Logística y Gestión de la Cadena de Suministros

  • La Sociedad Americana de Inventarios
  • APICS
  • Supply Chain Council

3.1 Los origenes de la logística

3.1.1 La Sociadad Amricana de Inventarios

Algunos años posteriores a la finalización de la segunda guerra mundial, Estados Unidos se convierte en el país cuyo signo monetario se establece como patrón común o divisa para el comercio internacional. Este rol que en economía lo posiciona como el “prestador de ultima instancia” lo obliga a tener estabilidad en su economía y la mayor parte de los economistas (ortodoxos y disidentes) coincidieron en que el enorme crecimiento de su industria no le permitía al gobierno conocer cuál era el verdadero estado de las cuentas nacionales. Al momento de cerrar los números de la macroeconomía se podía saber si había saldo positivo o negativo, pero una duda que no podía ser resuelta es si , por caso, un crecimiento del PBI se había conseguido gracias a sacrificar inventario del año anterior o se había conseguido con mayor productividad (lo que implicaba más producción sin disminución de inventario).

En tal sentido y para tener una medida del estado de inventarios de todos los sectores de la economía se creo la “Clasificación Industrial Internacional Uniforme de Todas las Actividades Económicas (CIIU)” y se establecieron tasas impositivas para que los ítems que fuesen mantenidos más de un año en inventario fuesen castigados con un impuesto extra.

Clasificación CIIU

Se les obligó a las empresas a realizar un cierre de ejercicio en Julio y remitir a las oficinas de estadística los resultados de sus cuentas de perdidas y ganancias y sobre todo el estado de inventario de productos terminados, semi elaborados y materias primas.

A efectos de evitar el costo del impuesto se implementarios dos períodos en los que las empresas y comercios organizaban rebajas para retirar de su inventario estos ítems y esto es lo que se conoce como “Gran Barata”, una de ellas que se realiza desúés de Navidad y la otra al promediar el verano boreal.

A efectos de determinar cuál era el nivel de inventario más conveniente a sostener a lo largo del año se creó un órgano de debate denominado “Sociedad Americana de Producción e Inventarios”. En la reunión de 1953 y luego de una revisión se revivió un modelo matemática crea en 1920 por Willson para la industria del acero (Paradigma de Taylor). Su clásica formulación es bien conocida por nosotros.

\[ EOQ^* = \sqrt{(\frac {2D * Ce} {Ca}})\] Expresión que se ha mantenido vigente por más de 100 años y no ha podido dar respuesta a las interrogantes de partida que pretendía debatir.

3.1.2 La creación de la APICS

Dada las dificultades que aparecen hacia finales de los 70 y sobre todo el enorme impacto que en occidente tienen las doctrinas que culpan al Estado de ineficiencia que sólo puede reducirse con la tercerización y nombrar gerentes en lugar de funcionarios públicos, apelando a conceptos mal aplicados proveniente del management Japonés (stock cero); se decide avanzar en los concepto y se crea la “American Production and Inventory Control Society”. Cuyas sigals son APICS.

A pesar de su interés en seguir dando respuestas a estos interrogantes que ya cumplían los 50 años sin respuesta.

Lo que no era APICS

Hacia finales de los 90 (1998) un grupo de empresas que habían emprendido el camino de la globalización, liderados fundamentalmente por Europa y Japón, sobre todo con industrias del sector automotriz establecen un diálogo que busca las causas primarias del fracaso del modelo de APICS.

Entre las causas raíz del diagrama de Ishikawa que realizan se puede citar

  • Días de Cobertura
  • Uso de costos no contables
  • Al menos 6 variable no contabilizadas en el modelo
  • La crítica de Cooper y Lambert
  • Analfabetismo digital (IBM)

3.1.3 El Nacimiento del Supply Chain Council

Entre los motivos señalados el tal vez el concepto de Gestión de la Cadena de Suministros, acuñado por Coopuer y Lambert el que dio respuesta a los nuevos interrogantes que los mercados mundiales estaban esperando.

Paper Cooper & Lambert

Este concepto de Supply Chain, con la habilidad de tener un ojo para mirar mi empresa y otro para ver todos los problemas y consecuencias de las consecuencias de la cadena entera han sido los factores de éxito de este paradigma.

La idea de cambiar el concepto de Nivel de Inventario a Días de Cobertura es mucho más realista y permeable a la realidad que se vivía.

Este concepto de Cadena de Suministros que supera al de Porter (Cadena de Valor) deja espacio para otros campos que aparecieron como:

  • Sostenibilidad
  • Sustentabilidad
  • Logística Verde
  • Logística Inversa
  • Responsabilidad Social Empresaria

Hacia finales de 2002 se calcula que casi el 70% de las empresas PyME y los profesionales certificados en logística del APICS habían cancelado sus membresías y ahora eran parte de SCC.

En América Latina y Caribe el impacto sobre las cadenas de las comodities y manufactura seriada por lotes o las del tipo Engineering to Order tuvieron un impacto de incremento en la productividad del orden del 4% al 9%.

Finalmente en 2009 APICS compra Supply Chain Council

Hoy APICS es SCC

  Actividad complementaria Realizar búsqueda y contabilización de bibliografía sobre estos paradigmas

4 Búsqueda Selección y Evaluación de Proveedores

4.1 Caso de estudios “Selección de un Operador Portuarios”

Metodología Utilizada : Medición de la Performance Logística

4.1.1 Análisis Exploratorio

Una de las cosas interesantes de uso del la Simulación de Sistemas de Manu- factura es la posibilidad de hacer Inteligencia de Negocios (BI por sus siglas en ingles – Business Intelligence) por la enorme cantidad de datos que nos genera. Este campo de la BI, requiere un dominio de técnicas como Machine Learning, Identificación de Patrones, operación de BigData o Minerı́a de Datos que en general dominan los expertos en informática, pero que cada dı́a son más acce- sibles a otros profesionales. Si bien serı́a posible poder hacer esto en excel, las limitaciones que tiene la hoja de cálculo nos imedirı́an trabajar con el volumen de datos que la simulación aportarı́a. Se quiere hacer notar que si bien no es imposible hacer el trabajo con hoja de cáculo, serı́a mejor utilizarla para apren- der y resignarse a trabajar con pocos datos. En esta serie de ejercicios, además de familiarizarnos con el lenguaje R-Cran que SI puede operar en entornos de BIGDATA, trataremos de ver como podemos valernos de las bondades del en- torno de trabajo y aprender de un sólo paso con las herramientas que se utilizan en la vida real. Hasta ahora tenemos claro temas referidos a los conceptos de Simulación, Modelo, Inferencia , y hemos insinuado algo sobre las estructuras y métodos de ajustes del modelo o del concepto de ingenierı́a inversa. Utilizaremos unas bases de datos ficticias (cualquier semejanza con la reali- dad es pura coincidencia). En ella se ha realizado un estudio sobre varias empresas que son contratistas o proveedores de servicios de alto valor agregado de grandes compañı́as manu- factureras. Se ha indagado el desempeño de unos 150 contratistas según cuadro dimensiones o indicadores. Comenzaremos estos ejercicios cargando los datos externos, que incluso po- drı́an venir de una hoja de cálculo.

Carga de datos desde archivos externos Si bien serı́a posible cargar datos a mano en R-CRAN, no serı́a práctico hacer lo ası́. Todos los datos que se utilizan en este entorno de trabajo se manejan

internamente como matrices. Estas matrices de datos (semejantes a bases de datos) se llaman data-frames. Un data frame podrı́a ser una matriz de una fila por una columna ası́ por ejemplo

Tanto X,Y y Z aparecen como variables, pero R-CRAN los trata como ma- trices de 1x1. Intente carga dos dataframes a y b con valores numéricos y realizamos la suma de ambos como se muestra en el código. Esto nos permitirı́a usar R-CRAN como si se tratase de una calculadora.

¿Desde dónde podemos cargar datos? Uno de los requisitos para poder cargar datos es que sepamos en que carpeta estamos trabajando. En este ejercicio veremos como hacer para saber donde estamos parados.

[1] "/media/rpalma/OS/AAA_Datos/2021/Posgrado/Catolica Bolivia/Materia_Curso"

Se puede cambiar la carpeta de trabajo con

  setwd("C:/Apuntes")

Puedes cambiar tu carpeta (directorio) de trabajo con el comando setwd() Debes poner entre comillas lo que va dentro del paréntesis Prepare un archivo en excel y guardelo con formato csv ”comma separated values” para capturarlo desde R-CRAN. Asegúrate de usar punto ”.” para indicar fracciones y coma para separar los campos o columnas de la tabla.

  Tarea: Crea una carpeta para tus datasets y descarga la base de proveedores desde https://themys.sid.uncu.edu.ar/r-cran/

Ejemplos

Con los siguientes comando importaremos una planilla generada con una hoja de cálculo que contiene las 150 respuestas de las encuestas que se realizaron

# Si aún no has cargado una biblioteca recuerda ejecutar
# install.packages("readr") o utiliza el menú de R-Studio
library(readr)
BSC_proveedores <- read_csv("~/BSC_proveedores.csv")
BSC_proveedores [c(1:5 ,70:73, 126:129) , ]
X1 Tecnologia Normas Capital Equipo Empresa
1 5.1 3.5 1.4 0.2 Tenaris
2 4.9 3.0 1.4 0.2 Tenaris
3 4.7 3.2 1.3 0.2 Tenaris
4 4.6 3.1 1.5 0.2 Tenaris
5 5.0 3.6 1.4 0.2 Tenaris
70 5.6 2.5 3.9 1.1 Tenova
71 5.9 3.2 4.8 1.8 Tenova
72 6.1 2.8 4.0 1.3 Tenova
73 6.3 2.5 4.9 1.5 Tenova
126 7.2 3.2 6.0 1.8 Ternium
127 6.2 2.8 4.8 1.8 Ternium
128 6.1 3.0 4.9 1.8 Ternium
129 6.4 2.8 5.6 2.1 Ternium

La biblioteca readr permite importar datos de excel en r-cran Podemos ver el contenido del dataframe BSC Proveedores que se llama igual que el archivo de texto separado por comas. Para ello ejecutamos el siguiente comando.

4.1.2 Analizando el contenido de un data.frame

Si quisiésemos ver el desempeño respecto a la variable TECNNOLOGIA tendríamos que interponer entre el nombre del dataset el signo pesos y luego el nombre de la columna

4.1.3 Contenido de Columnas

BSC_proveedores$Tecnologia
 [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
[20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
[39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3
[58] 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4
 [ reached getOption("max.print") -- omitted 75 entries ]

Repita todo el proceso con el resto de la dimensiones NORMA, CAPITAL, EQUIPO, EMPRESA.

4.1.4 Análisis de Histograma

Veremos como se comportan las muestras (contratistar) utilizando el histograma

hist(BSC_proveedores$Tecnologia)

El gráfico nos muestra que hay dos grupos de contratistas (casi 29 ocurrencias en cada uno) con un desempeño de 6 en la variable TECNOLOGÍA . La escala original era de 1 a 10. Utilizaremos el comando par() que permite dividir el área de ploteo en una matriz especificada por el comando Numero de Columna (nmfrow) Haga las interpretaciones de estos gráficos.

par(mfrow=c(2,2))
hist(BSC_proveedores$Tecnologia)
hist(BSC_proveedores$Normas)
hist(BSC_proveedores$Capital)
hist(BSC_proveedores$Equipo)

4.1.5 Gráficos de Densidad

Algunas personas prefieren utilizar la envolvente del histograma que es el gráfico de densidad

par(mfrow=c(1,1))
plot(density(BSC_proveedores$Equipo))

Gráficos 4x4 de Densidad

par(mfrow=c(2,2))
plot(density(BSC_proveedores$Tecnologia))
plot(density(BSC_proveedores$Normas))
plot(density(BSC_proveedores$Capital))
plot(density(BSC_proveedores$Equipo))

4.1.6 Análisis Mutivariado

Gráficas Ralas

library(car)
BSC_Rawdata <- BSC_proveedores[ ,c(2,3,4,5)]
BSC_Rawdata
Tecnologia Normas Capital Equipo
5.1 3.5 1.4 0.2
4.9 3.0 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
5.0 3.6 1.4 0.2
5.4 3.9 1.7 0.4
4.6 3.4 1.4 0.3
5.0 3.4 1.5 0.2
4.4 2.9 1.4 0.2
4.9 3.1 1.5 0.1
5.4 3.7 1.5 0.2
4.8 3.4 1.6 0.2
4.8 3.0 1.4 0.1
4.3 3.0 1.1 0.1
5.8 4.0 1.2 0.2
5.7 4.4 1.5 0.4
5.4 3.9 1.3 0.4
5.1 3.5 1.4 0.3
5.7 3.8 1.7 0.3
5.1 3.8 1.5 0.3
5.4 3.4 1.7 0.2
5.1 3.7 1.5 0.4
4.6 3.6 1.0 0.2
5.1 3.3 1.7 0.5
4.8 3.4 1.9 0.2
5.0 3.0 1.6 0.2
5.0 3.4 1.6 0.4
5.2 3.5 1.5 0.2
5.2 3.4 1.4 0.2
4.7 3.2 1.6 0.2
4.8 3.1 1.6 0.2
5.4 3.4 1.5 0.4
5.2 4.1 1.5 0.1
5.5 4.2 1.4 0.2
4.9 3.1 1.5 0.2
5.0 3.2 1.2 0.2
5.5 3.5 1.3 0.2
4.9 3.6 1.4 0.1
4.4 3.0 1.3 0.2
5.1 3.4 1.5 0.2
5.0 3.5 1.3 0.3
4.5 2.3 1.3 0.3
4.4 3.2 1.3 0.2
5.0 3.5 1.6 0.6
5.1 3.8 1.9 0.4
4.8 3.0 1.4 0.3
5.1 3.8 1.6 0.2
4.6 3.2 1.4 0.2
5.3 3.7 1.5 0.2
5.0 3.3 1.4 0.2
7.0 3.2 4.7 1.4
6.4 3.2 4.5 1.5
6.9 3.1 4.9 1.5
5.5 2.3 4.0 1.3
6.5 2.8 4.6 1.5
5.7 2.8 4.5 1.3
6.3 3.3 4.7 1.6
4.9 2.4 3.3 1.0
6.6 2.9 4.6 1.3
5.2 2.7 3.9 1.4
5.0 2.0 3.5 1.0
5.9 3.0 4.2 1.5
6.0 2.2 4.0 1.0
6.1 2.9 4.7 1.4
5.6 2.9 3.6 1.3
6.7 3.1 4.4 1.4
5.6 3.0 4.5 1.5
5.8 2.7 4.1 1.0
6.2 2.2 4.5 1.5
5.6 2.5 3.9 1.1
5.9 3.2 4.8 1.8
6.1 2.8 4.0 1.3
6.3 2.5 4.9 1.5
6.1 2.8 4.7 1.2
6.4 2.9 4.3 1.3
6.6 3.0 4.4 1.4
6.8 2.8 4.8 1.4
6.7 3.0 5.0 1.7
6.0 2.9 4.5 1.5
5.7 2.6 3.5 1.0
5.5 2.4 3.8 1.1
5.5 2.4 3.7 1.0
5.8 2.7 3.9 1.2
6.0 2.7 5.1 1.6
5.4 3.0 4.5 1.5
6.0 3.4 4.5 1.6
6.7 3.1 4.7 1.5
6.3 2.3 4.4 1.3
5.6 3.0 4.1 1.3
5.5 2.5 4.0 1.3
5.5 2.6 4.4 1.2
6.1 3.0 4.6 1.4
5.8 2.6 4.0 1.2
5.0 2.3 3.3 1.0
5.6 2.7 4.2 1.3
5.7 3.0 4.2 1.2
5.7 2.9 4.2 1.3
6.2 2.9 4.3 1.3
5.1 2.5 3.0 1.1
5.7 2.8 4.1 1.3
6.3 3.3 6.0 2.5
5.8 2.7 5.1 1.9
7.1 3.0 5.9 2.1
6.3 2.9 5.6 1.8
6.5 3.0 5.8 2.2
7.6 3.0 6.6 2.1
4.9 2.5 4.5 1.7
7.3 2.9 6.3 1.8
6.7 2.5 5.8 1.8
7.2 3.6 6.1 2.5
6.5 3.2 5.1 2.0
6.4 2.7 5.3 1.9
6.8 3.0 5.5 2.1
5.7 2.5 5.0 2.0
5.8 2.8 5.1 2.4
6.4 3.2 5.3 2.3
6.5 3.0 5.5 1.8
7.7 3.8 6.7 2.2
7.7 2.6 6.9 2.3
6.0 2.2 5.0 1.5
6.9 3.2 5.7 2.3
5.6 2.8 4.9 2.0
7.7 2.8 6.7 2.0
6.3 2.7 4.9 1.8
6.7 3.3 5.7 2.1
7.2 3.2 6.0 1.8
6.2 2.8 4.8 1.8
6.1 3.0 4.9 1.8
6.4 2.8 5.6 2.1
7.2 3.0 5.8 1.6
7.4 2.8 6.1 1.9
7.9 3.8 6.4 2.0
6.4 2.8 5.6 2.2
6.3 2.8 5.1 1.5
6.1 2.6 5.6 1.4
7.7 3.0 6.1 2.3
6.3 3.4 5.6 2.4
6.4 3.1 5.5 1.8
6.0 3.0 4.8 1.8
6.9 3.1 5.4 2.1
6.7 3.1 5.6 2.4
6.9 3.1 5.1 2.3
5.8 2.7 5.1 1.9
6.8 3.2 5.9 2.3
6.7 3.3 5.7 2.5
6.7 3.0 5.2 2.3
6.3 2.5 5.0 1.9
6.5 3.0 5.2 2.0
6.2 3.4 5.4 2.3
5.9 3.0 5.1 1.8
scatterplotMatrix(BSC_Rawdata)

Gráficas de matriz de co-varianza

Circulos

library(corrplot)
M <- cor(BSC_Rawdata)
corrplot(M, method="circle")

Cuadrados

library(corrplot)
M <- cor(BSC_Rawdata)
corrplot(M, method="square")

    Tarea: probar los gráficos "circle", "square", "ellipse", "number", "shade", "color", "pie" 

4.1.7 Clusterizacion básica

Transformaremos la columna Empresas en una variable categórica de tres niveles

BSC_proveedores[ ,7] <- factor(BSC_proveedores$Empresa) 
pairs(BSC_proveedores[2:5], main="Proveedores", pch=21, bg = c("red", "green3", "blue")[unclass(BSC_proveedores$...7)] )

5 La Gestión de Compras

5.1 Método de escenarios

5.2 Series de Tiempo

library(fpp)
library(ggplot2)
beer2 <- window(ausbeer, start=1992)
fit.beer <- tslm(beer2 ~ trend + season)
fcast <- forecast(fit.beer)

autoplot(beer2, xlab="Año", ylab="Millones de Galones") + ggtitle("Despacho de Cerveza en Australia")

# No funciona el uso de titulo del gráfico
#autoplot(fcast  , ggtitle("Despacho de Cerveza")  ,xlab("Year"), ylab("megalitres"))
autoplot(fcast, xlab="Año", ylab="Millones de Galones")

5.3 Regresión no lineal

Aunque la relación lineal asumida hasta ahora en este apartado es a menudo adecuada, hay muchos casos en los que una forma funcional no lineal es más adecuada. Para mantener las cosas simples en esta sección asumimos que sólo tenemos un predictor \(X\)

La forma más sencilla de modelar una relación no lineal es transformar la variable de previsión
\(y\) y/o la variable predictora \(X\) antes de estimar un modelo de regresión. Aunque esto proporciona una forma funcional no lineal, el modelo sigue siendo lineal en los parámetros. La transformación más utilizada es el logaritmo (natural) .

Se especifica un formulario funcional log-log como

\[log (y) = \beta_0 + \beta_1 * log (x) + \varepsilon \] En este modelo, la pendiente \(\beta_1\) puede interpretarse como una elasticidad:
Se puede decir que es el cambio porcentual promedio en \(y\) resultado de un
aumento porcentual de \(X\).

También se pueden especificar otras formulas útiles. La formulación log-linear se especifica transformando únicamente la variable de previsión y la formula de registro lineal se obtiene transformando el predictor.

Recuerde que para realizar una transformación logarítmica en una variable, todos sus valores observados deben ser mayores que cero. En el caso de que esa variable
\(X\) contiene ceros, usamos la transformación

\(log (X+1)\) ; Es decir, añadimos uno al valor de la variable y luego tomamos logaritmos. Esto tiene un efecto similar a tomar logaritmos, pero evita el problema de los ceros. También tiene el efecto secundario ordenado de ceros en la escala original ceros aparezcan en la escala transformada como ceros.

Hay casos para los que simplemente transformar los datos no seriá adecuado y puede ser necesaria una especificación más general. Entonces el modelo que usamos será

\[ y=f(x) + \varepsilon\]

Dónde \(F\) es una función no lineal. En regresión estándar (lineal),
$ F (X)=_0+_1 * X$. En la especificación de regresión no lineal que sigue, permitimos
\(F\) para ser una función no lineal más flexible de \(X\) , en comparación con simplemente una transformación logarítmica u otra transformación.

Una de las especificaciones más sencillas es \(F\) lineal por partes . Es decir, introducimos puntos donde la pendiente de
\(F\) puede cambiar. Estos puntos se llaman nodos. Esto se puede lograr dejando que
\(X_{1,t}\) = X , e introducir la variables
$ X_{2,t}$ tal que :

\[x_{2,t} = (x-c) =\]
\[x_{2,t} = (x-c) + =\left\{\begin{array}{l l} x=0 & x < c \\ (x-c) & x \geq c \end{array} \right\} \]

La notación
\((X − C) +\) significa que si el valor
\(X − C\) si es positivo y 0 de lo contrario. Esto obliga a la pendiente a doblarse en el punto \(C\) . Los pliegues adicionales se pueden incluir en la relación añadiendo otras variables la ecuación anterior.

Un ejemplo de esto sería
\(X= T\) y ajustar una tendencia lineal por tramos a una serie temporal.

Las relaciones lineales por partes construidas de esta manera son un caso especial de splines de regresión. En general, se obtiene una spline de regresión lineal utilizando

\[x_1 = x , x_2 =(x - c_1)_+ ... x_k=(x-c_{k-1})_+ \]

Dónde $ C_1, … c_{k-1} son los nodos (los puntos en los que la línea puede doblarse).

Selecciando del número de nudos \((K-1)\) y dónde deben posicionarse puede ser difícil y algo arbitrario. Algunos algoritmos automáticos de selección de nudos están disponibles en algún software, pero aún no son ampliamente utilizados.

Se puede obtener un resultado más suave utilizando expresiones cúbicas a piezas en lugar de líneas por piezas. Estos están limitados para ser continuos (se unen) y suaves (para que no haya cambios repentinos de dirección, como vemos con splines lineales por piezas). En general, una spline de regresión cúbica se escribe como

\[ x_1=x , x_2= x^2 , x_3=x^3 , x_4=(x - c_1), \ldots , x_k = (x-c_{k-3}) \]

5.4 Maraton de Boston

La cantidad de energía para una carga a pulso de un camión de 24 palets es equivalente a la que una persona gasta en una maratón. Hoy , con la existencia de carga mecanizada es inhumano pensar en esta alternativa, pero tomemos las datos a ejemplo ilustrativo.

La figura muestra los tiempos ganadores del maratón de Boston (en minutos). Según las estadística, ll curso se alargó (de 24,5 millas a 26,2 millas) en 1924, lo que condujo a un salto en los tiempos del ganadores, por lo que sólo consideramos datos a partir de esa fecha. La serie temporal muestra una tendencia general a la baja a medida que los tiempos de los ganadores han ido mejorando a lo largo de los años. El panel inferior muestra los residuos entre la correlación de una tendencia lineal a los datos y el tiempo verdadero. La gráfica muestra un patrón no lineal obvio que no ha sido capturado por la tendencia lineal. También hay algo de heteroscedasticidad, con variación decreciente con el tiempo.

library(fpp2)
boston_men <- window(marathon, start=1924)
h <- 10
fit.lin <- tslm(boston_men ~ trend)
fcasts.lin <- forecast(fit.lin, h = h)
fit.exp <- tslm(boston_men ~ trend, lambda = 0)
fcasts.exp <- forecast(fit.exp, h = h)

t <- time(boston_men)
t.break1 <- 1950
t.break2 <- 1980
tb1 <- ts(pmax(0, t - t.break1), start = 1924)
tb2 <- ts(pmax(0, t - t.break2), start = 1924)

fit.pw <- tslm(boston_men ~ t + tb1 + tb2)
t.new <- t[length(t)] + seq(h)
tb1.new <- tb1[length(tb1)] + seq(h)
tb2.new <- tb2[length(tb2)] + seq(h)

newdata <- cbind(t=t.new, tb1=tb1.new, tb2=tb2.new) %>%
  as.data.frame()
fcasts.pw <- forecast(fit.pw, newdata = newdata)

fit.spline <- tslm(boston_men ~ t + I(t^2) + I(t^3) +
  I(tb1^3) + I(tb2^3))
fcasts.spl <- forecast(fit.spline, newdata = newdata)

autoplot(boston_men) +
  autolayer(fitted(fit.lin), series = "Linear") +
  autolayer(fitted(fit.exp), series = "Exponential") +
  autolayer(fitted(fit.pw), series = "Piecewise") +
  autolayer(fitted(fit.spline), series = "Cubic Spline") +
  autolayer(fcasts.pw, series="Piecewise") +
  autolayer(fcasts.lin, series="Linear", PI=FALSE) +
  autolayer(fcasts.exp, series="Exponential", PI=FALSE) +
  autolayer(fcasts.spl, series="Cubic Spline", PI=FALSE) +
  xlab("Year") + ylab("Winning times in minutes") +
  ggtitle("Boston Marathon") +
  guides(colour = guide_legend(title = " "))

arriba muestra las líneas y pronósticos ajustados de las tendencias lineales, exponenciales, lineales por tramos y spline cúbicas. Las mejores previsiones parecen provenir de la tendencia lineal por partes, mientras que la spline cúbica da el mejor ajuste a los datos históricos, pero malas previsiones.

Hay una formulación alternativa de splines cúbicas (llamadas splines de suavizado cúbico natural) que impone algunas restricciones, por lo que la función spline es lineal al final, lo que generalmente da pronósticos mucho mejores sin comprometer el ajuste. En la Figura siguiente, hemos utilizado la función splinef() para producir las previsiones de spline cúbica. Esto utiliza muchos más nudos de los que usamos en la Figura 5.21, pero los coeficientes están restringidos para evitar el sobreajuste, y la curva es lineal en ambos extremos. Esto tiene la ventaja añadida de que la selección de nudos no es subjetiva. También hemos utilizado una transformación de registro (lambda=0) para manejar la heteroscedasticidad.

boston_men %>%
  splinef(lambda=0) %>%
  autoplot()

Los residuos trazados a continuación muestran que este modelo ha capturado bien la tendencia, aunque queda algo de heteroscedasticidad. El amplio intervalo de predicción asociado con las previsiones refleja la volatilidad observada en los tiempos históricos de victoria.

boston_men %>%
  splinef(lambda=0) %>%
  checkresiduals()

5.5 Árbol de escenario reducido

#Programación estocástica de varias etapas

EL objetivo de este apartado es presentarte el método de gas neural para la reducción de escenarios, y mostrarte cómo utilizar las funciones buildtree y checktree en el paquete de escenarios para construir árboles de escenario con estructuras nodales predefinidas.

para que puedas utilizarlo debes cargar la biblioteca:

  install.packages("scenario")

Muchos problemas de optimización deben permitir el la incorporación de control sobre recursos, o la capacidad del operador para cambiar las decisiones de control conforme la incertidumbre se reduce a través del tiempo (pasos).

Teniendo en cuenta este tipo de programación en estocástica se puede lograr transformando las entradas de escenarios con perturbación en el árbol de escenarios. Una manera de hacer esto es mediante la aplicación del método conocido como gas neural. Este enfoque difiere de otros métodos en que permite la usuario predefinir y establecer la estructura nodal del árbol y mediante la perturbación de las probabilidades agrupar los resultados o escenrio final simplificando el árbol que llamaremos realizaciones.

##¿Qué es un árbol de escenario?

Un árbol de escenarios es una forma reducida de un conjunto de escenarios o realizaciones de un proceso. Los cúmulos de árboles de esas realizaciones se graficon como un conjunto de ramas con probabilidades especificadas de ocurrencia. El árbol está formado por \(S\) escenarios, denotados como \(s_i , (i = 1, 2, . . , S )\). Cada escenario contiene nodos \(t\), denotados \(s_{i,t} , (t = 1, 2, . . , T )\). Una condición fáctica es que todos las realizaciones nacen de el mismo estado actual de situación. Esto implica que \(t = 1\) , todos los escenarios del árbol comparten el mismo nodo $s_{i,1} $ . A medida que \(t\) aumenta, el árbol comienza a ramificarse. Cuando \(t = T\) , todos los nodos pertenecen a un solo escenario. Cada escenario tiene una probabilidad \(P_i\) , y la suma de \(P_i\) en todos los escenarios debe ser igual a 1 .

Árbol ejemplo ficticio

La estructura de un árbol de escenarios se puede representar mediante una matriz de partición nodal de dicho árbol de escenario, con el número de columnas iguales al número de escenarios (4 en el caso anterior) y el número de filas igual al número de pasos de tiempo (3 en el caso anterior). Esta forma de matriz se introduce en las funciones buildtree y checktree del paquete escenario mediante el parámetro treeStruct.

En el ejemplo anterior la matriz que lo representa sería así.

\[ S = \begin{matrix} & [ ,1] & [ ,2] & [ ,3] & [ ,4] \\ a[1,] & S_{1,1} & S_{1,2} & S_{1,3} & S_{1,4} \\ b[2,] & S_{2,1} & S_{2,2} & S_{2,3} & S_{2,4} \\ c[3,] & S_{3,1} & S_{3,2} & S_{3,3} & S_{3,4} \end{matrix} \] Dato que todos los escenarios en \(t=1\) todos los escenarios comparten el mismo estado inicial (o tabula raza en caso de emprender) Se debe cumplir que \(S_{1,1} = S_{2,1} = S_{3,1} = S_{4,1}\) \(S\) Podría ser cualquier cantidad mesurable (capital, empleados, valor de acción , inflación, etc). Similarmente en el primer paso (estado 2) sólo existen dos escenarios posibles. Por lo tanto \(S{1,2}=S_{2,2}\) y \(S_{3,2} = S_{4,2}\) . De este modo la matris de estados asociados a la matriz nodal de partición del árbol sería escrita así.

\[ S = \begin{matrix} & [ ,1] & [ ,2] & [ ,3] & [ ,4] \\ a[1,] & 1 & 1 & 1 & 1 \\ b[2,] & 2 & 2 & 5 & 5 \\ c[3,] & 3 & 4 & 6 & 7 \end{matrix} \]

La forma más facil de armar la matrix en R-Cran es ir por filas. Sin embrago en el paper de Giorgio Consigli el autor sugiere otro método. Él propone escribir esta matriz avanzando columna por columna, elevando el entero de nodo por 1 para cada nodo que tienes (que aún has definido). Después de escribir una matriz de estructura de árbol, se puede comprobar si es correcta utilizando el comando checktree .

library(scenario)
treeStruct <- rbind(c(1,1,1,1),
c(2,2,5,5),
c(3,4,6,7))
scenario::checktree(treeStruct)

Si entonces quisieses que el árbol cambio o se requiere más o menos complejidad, simplemente hya que alterarlo y vuelver a comprobar antes de usar la estructura con la función buildtree. Por ejemplo:

5.6 El algoritmo del gas neural

El gas neural es un algoritmo simple para encontrar representaciones de datos óptimas basadas en Vectores. El algoritmo fue acuñado como “gas neural” debido a la dinámica de los vectores de características durante el proceso de adaptación, que se distribuyen como un gas dentro del espacio de datos. Remeda partes de la técnicas de las redes neuronales.

El algoritmo de gas neural se puede utilizar para definir los valores de nodo (y los probabilidades de escenario) de un escenario determinado estructura de un árbol para describir el mejor conjunto de escenarios a partir de una entrada y que satisface las restricciones final (que denominaremos realizaciones para distinguir de la escenarios intermedios pertenecientes al árbol de escenarios).

Cuando se aplica la generación de un árbol de escenario con un nodo inicial predefinido y cierta estructura, el algoritmo de gas neural requiere tres tipos de entrada.

En primer lugar, necesitamos un conjunto inicial de realizaciones de longitud T , que vamos a denominar \(X\) (X puede ser un conjunto de pronósticos, o simplemente un registro de histórico observado disturbios o el resultado de una ronda delphi).

En segundo lugar, necesitamos definir la estructura de árbol de escenario deseada y luego codificarla como un árbol de escenario , tal como hemos visto. Esta matriz de partición nodal, como se describió anteriormente. Es la parte más complicada de la metodología.

En tercer lugar, necesitamos algunos parámetros de entrada que definan la resolución de las iteraciones tomadas por el algoritmo. Estos se establecen de forma predeterminada en los valores recomendados en la función buildtree.

El parámetro que se llama jMax se puede modificar para cambiar la acumulación y el tiempo de cálculo.

Los pasos siguientes se corren el algoritmo con un ejemplo sencillo y estilizado. Aquí generamos el realizaciones artificialmente desde un árbol conocido, con el fin de ilustrar la eficacia del algoritmo.

Observe bien como hemos introducido ruido (disturbancia) al estilo de lo que hacemos en el método Montecarlo.

5.7 Paso 1 - Inicializar los parámetros del algorítmo

Para inicializar el árbol antes de ejecutar las iteraciones, los nodos de árbol deben recibir un valor inicial. Exactamente lo que estos valores reflejen serán relativamente poco importantes, ya que el algoritmo perturbará rápidamente el árbol a medida que comienza a encajar a las realizaciones.

Una forma sencilla de inicializar el árbol es asignar a cada escenario el valor de un realización, \(X_k ,(k = 1, 2, . . . , K)\) ; Donde \(K\) es el número total de realizaciones— 20 (escenarios finales) en el ejemplo dado anteriormente.

A continuación, se toman promedios para dar a los nodos pertenecientes a más de un escenario el mismo valor, lo que garantiza que se mantiene la estructura del árbol de escenario. A continuación se muestra un ejemplo de una posición inicial del árbol.

El algoritmo tiene una serie de parámetros que se pueden alterar, pero no complicaremos el ejemplo con esto valores ahora. Por defecto el algoritmo toma estos valores para los parámetro tal como se ha señalado en el paper.

\[ \lambda_0 =10 \] \[ \lambda_f = 0.01\] \[ \epsilon_0=0.5\] \[ \epsilon_f=0,05\] \[ \dot{\jmath}{_{max}} =40.000\]

5.8 Técnicas de Clustering

6 La Gestión de Inventarios

6.1 Modelos Deterministicos de Inventarios (repaso)

6.1.1 Simulación con Modelos Determinísticos

Minicaso 3 Freight Forwarder

Un caso de emprendedora exitoso en la región vitı́cola de Mednoza Argentina está ligado a una egresada de la carrera de ingenierı́a industrial que a comienzos de la década de 1990, ante la incertidumbre de las crisis económicas decidió, sin capital alguno, lanzarse como free lance en el negocio de mover containers con vino a los puertos de Valparaı́so y San Antonio - Chile. Su empresa actuaba como intgradora de servicios entre transportistas, despachantes de aduana, bodegas, navieras y clientes de brokers en el extranjero.
Un factor clave de éxito ( KPI ) era el tamaño de lote óptimo a transportar en cada envı́o. Es bien conocido el modelo de Wilson que data de la década de 1920, pero que hoy resulta casi una garantı́a al fracaso si se utiliza en contextos tan turbulentos como los que nos toca vivir. A pesar de ello el modelo aún se estudia y no es descartado, pués sirve de base para ser mejorado. El modelo tiene tres variables independientes y una dependiente, a saber:

El modelo de Wilson

Variables Independientes

  • Demanda Media Anual D (en Containers por año)

  • Costo de almacenamiento unitario Ca ($ por mes)

  • Costo de emisión o gestión Ce ($ por orden)

Variable Dependiente

  • Tamaño de Lote Mensual EOQ

Modelo Mateático

\[ {EOQ} = \sqrt {(\frac {2*D * Ce} {Ca} )}\]

El caso de la Bodega Torrenti operada por el Freight Forwarder

Esta bodega tiene tres destinos principales de exportación.

  • Estados Unidos demanda 500 TEUs al año
  • Brasil demanda 53 TEUs al año
  • Cadandá demand 28 TEUs al año

  • Costo de Almacenamiento U$D 2.500

  • Costo de Gestión U$D 750

Modelado numérico en R-CRAN

D1 <-500
D2 <-52
D3 <-28

D<- D1+D2+D3

Ca <- 2500
Ce <- 750

EOQ <- sqrt(2*D*Ce/Ca)

EOQ
[1] 18.65476

6.2 Inventarios Estocásticos con Simulación Montecarlo

** Simulación con modelos Estocásticos **

Cálculo del EOQ por Montecarlo

Este método no concibe a las variables independientes como fijas, sino que las considera variables aleatorias e introduce Ruido en el modelo matemático. En esta parte deberíaos analizar el comportamento de cada variable y asociarle una distribución (función paramétrica) de probabilidad. Por sencillez supondremos en este ejemplo que las varaibles siguen una distribución normal.
En rigor deberíamos estudiar que distribución siguen los datos con los que alimentaremos el modelo. <bR R-Cran tiene por defecto definidas las siguientes distribuciones de probabilidad.

  • Normal
  • Logística
  • Uniforme
  • Gamma
  • Lognormal
  • Weibull
  • Cauchy
  • Exponencial
  • Chi-cuadrado
  • F
  • T-Student.


Puede explorar el paquete rriskDistributions que le dará una idea más clara. Generaremos una muestra al azar de 47 valores con media 40 y desvio standard 5

%{r, echo=TRUE} library(rriskDistributions) muestra=rnorm(47,40,5) muestra fit.cont(muestra) %

Estocatización de Variables

  • Estados Unidos demanda promedio 500 TEUs al año con una varianza de 90

  • Cadandá demanda promedio 28 TEUs con una varianza de 6 al año

  • Brasil demanda promedio 93 TEUs al año con una varianza de 8


  • Costo de Almacenamiento U$D 2.500 Varianza 1.000

  • Costo de Gestión U$D 750 varianza 250

Cálculo del EOQ Montecarlo

#Genero tres variables aleatorias normales con 
#una cantidad de muestras m igual a tres veces #el tamaño de la media 

m1 <- 500*3
D1 <- rnorm(m1,500,90)
m2 <- 93*3
D2 <- rnorm(m2,93,8)
m3 <- 28*3
D3 <- rnorm(m3,28,6)
D <- c(D1,D2,D3)
# m_d muestras de demanda
m_d <- length(D)

#Generamos las variables aleatorias de costos igual a la cantidad de muestras de demanda que tenemos.

Ca <- rnorm(m_d,2500,1000)

Ce <- rnorm (m_d,750,250)

# Preparo área de graficos 3 filas 1 columna
#par(mfcol=c(1,3))

#Grafico 1
plot(density(D), 
xlab="Demanda TEU", #Change the x-axis label
ylab="Densidad", #y-axis label
main="Muestras de Demanda 5 años")#Main title

#Grafico 2
plot(density(Ca),
xlab="Costo Almacenamiento", #x-axis label
ylab="% eventos registrados", # y label
main="Población Costos Almacenamiento")     

#Grafico 3
plot(density(Ce),
xlab="Costo Gestión Inventario", #x-axis label
ylab="% eventos registrados", # y label
main="Población Costos Emisión")     

Cálculo de muestras de lote Económico EOQ

En este caso realizaremos las mismas operaciones que antes, pero las variables independientes ahora serán matrices y el resultado será un conjunto de valores con su propia distribución de probabilidades.

EOQ <- sqrt(2*D*Ce/Ca)
#Media del Lote Económico
mean(EOQ, na.rm=TRUE)
[1] 16.72763
#Varianza del Lote Económico
var(EOQ, na.rm=TRUE)
[1] 100.2345
#Desvio Estandard del Lote Económico
sd(EOQ, na.rm=TRUE)
[1] 10.01172
plot(density(EOQ,na.rm=TRUE))

Hallaremos los valores máximos y mínimos de las variables dependientes e independientes

[1] 1667
[1] 158
[1] 1783

Valores Mínimos

[1] -1098.941
[1] -54.99439
[1] 1.334413
[1] 529
[1] 404
[1] 962

6.3 Inventarios con la metodologís DES

Link a la biblioteca Simmer

6.4 Entrenamiento de Red Nueronla

6.5 Modelos de regresión múltiple con intervalos de confianza

7 El almacén dentro de la red logística

7.1 Técnicas de Modelos Regresión con si sin estacionalidad

Uno de los métodos más ampliamentes utilizados para predecir el futuro de una cadean de suministros es el relatico al uso de los modelos de regresión lineal. No es necesariamente el más confiable, pero su simplicidad hace que la mayor parte de los decisores, en especial los que tal vez por su formación no han tenido análisis matemático o cálculo como parte de su formación acepten sin mayor desconfianza.

El método recurre a aproximar la nube de puntos con una línea recta cuya ecuación es :

\[ y= a * x + b \] Donde \(a\) es la pendiente y \(b\) la ordenadad al origen

Para poder encontrar los valores de a y b tenemos que tener al menos un punto por el que pase la ecuación. Un buen estimados podría ser el promedio de los valores de \(x\) e \(y\).

El promedio de \(x\) sería:

\[ \hat x= \sum_{i=1}^{i=n} \frac {x_i } {n} \] El promedio de \(y\) sería:

\[ \hat y= \sum_{i=1}^{i=n} \frac {y_i } {n} \] En tanto la pendiente la podríamos calcular con le cociente de las varianzas

\[ \Delta (x) = \sqrt {(\frac {\sum (\hat x - x_i )^2} {n^2})} \] \[ \Delta (y) = \sqrt {(\frac {\sum (\hat y - y_i )^2} {n^2})} \]

\[ a = \frac{\Delta y } {\Delta x}\] Veremos una serie de herramientas que la analítica de datos nos aporta para que sin evitar el error inherente que el método tiene, al menos tengamos una idea aproximada del error que nuestra predicción tendrá.

eficiency <- read.table(
 "https://themys.sid.uncu.edu.ar/r-cran/Solar.txt",
 header = TRUE)
names(eficiency)
[1] "kWh"   "gas"   "solar"

Luego de ver la estructura de la tabla con el comando names, haremos un pequeño estudio de covarianza. Utilizaremos la matriz de covarianza clásica.

pairs(eficiency)

A continuación deberás tener instalado el paquete psych() para poder hacer estos gráficos que siguen ejecuta install.packages(”psych”) si no lo has hecho aun. Luego Este histograma nos muestra el resultado, con ello podemos ver la correlación que tiene con la eficiencia mediante una regresión lineal

  Puedes consultar que paquetes tienes instalados con **installed.packeges**
library(psych)
cor(eficiency)
            kWh       gas     solar
kWh   1.0000000 0.2400133 0.2652935
gas   0.2400133 1.0000000 0.8373534
solar 0.2652935 0.8373534 1.0000000

Estos mismos gráficos pueden se más facilmente interpretados si utilizamos una biblioteca que usan los psicologos.

library(psych)
pairs.panels(eficiency)

multi.hist(eficiency)

cor(eficiency)
            kWh       gas     solar
kWh   1.0000000 0.2400133 0.2652935
gas   0.2400133 1.0000000 0.8373534
solar 0.2652935 0.8373534 1.0000000

7.1.1 Construcción básica de la regresión lineal

Venos que el consumo de gas nos da una buena idea de la posibilidad de potencia instalada que los usuarios pueden tener, esto implica que el consumo de gas que es un dato que conocemos es un buen predictor de la cantidad de paneles solares que se podrían instalar.

regresion <- lm(solar ~ gas, data = eficiency)
summary(regresion)

Call:
lm(formula = solar ~ gas, data = eficiency)

Residuals:
    Min      1Q  Median      3Q     Max 
-63.478 -26.816  -3.854  28.315  90.881 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 102.5751    29.6376   3.461  0.00212 ** 
gas           5.3207     0.7243   7.346 1.79e-07 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 43.46 on 23 degrees of freedom
Multiple R-squared:  0.7012,    Adjusted R-squared:  0.6882 
F-statistic: 53.96 on 1 and 23 DF,  p-value: 1.794e-07

Veamos como se ven estos datos en un gráfico

plot(eficiency$gas, eficiency$solar, xlab = "gas m^3 propano/butano", ylab = "solar cm^2")
abline(regresion)

Como vemos el comando abline es capaz de dibujar la recta, pero no nos da idea del intervalo de confianza que deberíamos esperar ni nos permite dado un valor de \(x\) es el que obtendríamos de \(y\).

Para lograr estos armaremos el modelos linear que nos permita hacer la predicción.

7.1.2 Predicciónes del modelo e intervalos de confianza.

prediccion.gases <- data.frame(gas = seq(30, 50))
predict(regresion, prediccion.gases)
       1        2        3        4        5        6        7        8 
262.1954 267.5161 272.8368 278.1575 283.4781 288.7988 294.1195 299.4402 
       9       10       11       12       13       14       15       16 
304.7608 310.0815 315.4022 320.7229 326.0435 331.3642 336.6849 342.0056 
      17       18       19       20       21 
347.3263 352.6469 357.9676 363.2883 368.6090 

Como se observa creamos una secuencia de datos entre 30 y 50 \(m^3\) y usamos la regresión como predictor.

Indagaremos el nivel de confianza del modelo obtenido.

                2.5 %     97.5 %
(Intercept) 41.265155 163.885130
gas          3.822367   6.818986

7.1.3 Bandas de intervalos de confianza

Estableceremos qué tab bueno es el modelo obtenido extrapolando. Obtendremos una banda que contempla el valor más menos una vez la varianza y más menos trés veces la varianza.

produccion.gases <- data.frame(gas = seq(10, 90))

Gráfico de bandas

plot(eficiency$gas, eficiency$solar, xlab = "gas", ylab = "solar")

 abline(regresion)

 ic <- predict(regresion, prediccion.gases, interval = "confidence")

 lines(prediccion.gases$gas, ic[, 2], lty = 2)

 lines(prediccion.gases$gas, ic[, 3], lty = 2)

 ic <- predict(regresion, prediccion.gases, interval = "prediction")

 lines(prediccion.gases$gas, ic[, 2], lty = 2, col = "red")

 lines(prediccion.gases$gas, ic[, 3], lty = 2, col = "red")

7.2 Relación entre almacén y transporte

7.2.1 Métodos de árboles y bosques (ramdon forest)

Aprendizaje Supervisado

Entrenamiento de 'arboles de decisi'on.

Esta t'ecnica utiliza un set de datos representativos de una situaci'on y utilizando recursivamente el teor'ema de Bayes puede armar un pronosticador o clasificador de datos. Es una t'ecnica parecida a la de clustering, pero m'as refinada, pues no se basa en reglas sino en parendizaje del set de datos usado como entrenamento. En el paquete party existen dos funciones ctree que se utiliza para entrenar y predict que se usa para pronosticar o generar la regla de decici'on que debemos usar.

7.2.2 Muestreo de Proveedores

partners <- read.table("https://themys.sid.uncu.edu.ar/r-cran/BSC_proveedores.csv",header=TRUE,sep=",")
library(party)
attach(partners)
str(partners)    
'data.frame':   150 obs. of  6 variables:
 $ X         : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Tecnologia: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Normas    : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Capital   : num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Equipo    : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Empresa   : chr  "Tenaris" "Tenaris" "Tenaris" "Tenaris" ...
# describe al objeto transit
ind <- sample(2, nrow(partners), replace=TRUE, prob=c(0.7, 0.3))  
# toma una muestra 
ind  
 [1] 2 2 1 1 2 2 1 2 1 1 1 1 2 2 1 2 2 1 1 1 1 1 1 2 2 2 1 2 1 1 2 2 1 1 1 1 1 1
[39] 2 1 1 2 1 2 1 2 1 1 2 1 1 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 1 1 1 2 2 2 1 2 1
 [ reached getOption("max.print") -- omitted 75 entries ]
# nos imprime la muestra tomada.

Generaré un nueva columna que tiene valores 1 2 o3 según la empresa con la que está vinculada. La técnica de árboles necesita valores numéricos y no characteres para poder trabajar.

T1 <- which(partners$Empresa == "Tenaris")
T2 <- which(partners$Empresa == "Tenova")
T3 <- which(partners$Empresa == "Ternium")
partners[T1,7] <-1
partners[T2,7] <-2
partners[T3,7] <-3
attach(partners)

7.2.3 Entrenamiento con la muestra TrainData

trainData <- partners [ind==1,]    
# genero un set de entrenamiento 
testData <- partners [ind==2,]    
# genero un set de datos de prueba
myFormula <- X ~ Tecnologia + Normas + Capital + Equipo 
transit_ctree <- ctree(myFormula, data=trainData)    
# creo el motor de entrenamiento
# Verificar las prediciones 
table(predict(transit_ctree), trainData$Empresa) 
                  
                   Tenaris Tenova Ternium
  26.9                  30      0       0
  80.2894736842105       0     34       4
  122.416666666667       0      0      36
print(transit_ctree) 

     Conditional inference tree with 3 terminal nodes

Response:  X 
Inputs:  Tecnologia, Normas, Capital, Equipo 
Number of observations:  104 

1) Equipo <= 0.4; criterion = 1, statistic = 81.694
  2)*  weights = 30 
1) Equipo > 0.4
  3) Equipo <= 1.6; criterion = 1, statistic = 34.852
    4)*  weights = 38 
  3) Equipo > 1.6
    5)*  weights = 36 

7.2.4 Ploteo del arbol entrenado

plot(transit_ctree)

<<entrenamiento3,echo=TRUE>>= trainData <- partners [ind==1,]
# genero un set de entrenamiento testData <- partners [ind==2,]
# genero un set de datos de prueba myFormula <- Empresa ~ Tecnologia + Normas + Capital + Equipo transit_ctree <- ctree(myFormula, data=trainData)
# creo el motor de entrenamiento # Verificar las prediciones table(predict(transit_ctree), trainData$Empresa) print(transit_ctree) @

8 La gestión del transporte

8.1 Uso de redes Neuronales

Ejemplo de emprendedores Latinoamericanos

8.2 Gestiometría para el transporte

9 Casos de Estacionalidad

Exploramos la cabecera de datos importados de excel:

library(readxl)
Vino_Fiscal <- read_excel("MetodoPolinomialSenCosen.xls", sheet = "Hoja4")
head("Vino_Fiscal")
[1] "Vino_Fiscal"
#head(Vino_Fiscal)

Exploramos los datos finales de la tabla

tail(Vino_Fiscal)
Mes Exportaciones Mwh
31 179337.5 0.3600083
32 178217.7 0.2500069
33 272545.6 0.1600140
34 240951.6 0.0900140
35 360435.2 0.0400140
36 307519.3 0.0100140

Estos datos reflejan la estacionalidad en los despachos de vinos de alta gama que se exportan desde la provincia de Mendoza, Argentina; y son fiscalizados por el INV (Instituto Nacional de Viticultura).

10 Exportaciones de Vino Mensuales Fiscalizadas

plot(Vino_Fiscal$Mes, Vino_Fiscal$Exportaciones, main="Millones de hl Exportado 3 años", ylab=" hl",xlab="mes",type="b" )
abline(v=mean(Vino_Fiscal$Mes),h=mean(Vino_Fiscal$Exportaciones),lty=2)

10.1 Regresión Lineal

Es una primera aproximación, tiene errores pero de es mejor que no tener nada.

Este comando construye el típico modelo de regresión lineal.

Asignaremos valores a las variables Xv que representa el mes , Yv que representa los valores reales de exportaciones y Ys que tiene los datos aproximados del modelo de regresión lineal.

coef(lm(Yv ~ Xv ))
(Intercept)          Xv 
  82655.235    4409.053 

Esto debe leerse como “Construye un modelo de regresión linea que explique Yv en función de Xv”. La función nos devuelve la ordenada al origen y la pendiente de la recta.

modelo_vino <- lm(Yv ~ Xv)

Una buena aproximación podría obtenerse con la media de los valores X y Y (la recta denería pasar por el promedio de X e Y) y la pendiente podría obtenerse de la varianza de Y dividido la varianza de X

X2 <- mean(Xv)
X2
[1] 18.5
Y2 <- mean(Yv)
Y2
[1] 164222.7
Delta_y <- var(Yv)
Delta_x <- var(Xv)

m <- Delta_y/Delta_x
m
[1] 51013413

Sin embargo este modelo que hemos construido es más preciso ya que no usa estimadores sino que se basa en el concepto de valores residuales.

plot(Vino_Fiscal$Mes, Vino_Fiscal$Exportaciones, main="Millones de hl Exportado 3 años", ylab=" hl",xlab="mes",type="b", ylim = c(70000, 380000), xlim = c(1,36) ) 

abline(modelo_vino, col="red")

** Residuales

par(mfrow=c(2,2))
plot(lm(Vino_Fiscal$Mes ~ Vino_Fiscal$Exportaciones , data=Vino_Fiscal))

library(ggplot2)
library(plotly)
library(plyr)

dat <- data.frame(Vino_Fiscal)
                 

p <- ggplot(dat, aes(x=Xv, y=Yv )) + 
  xlab("Julio 2016 a Julio 2019") +
  ylab("Hl Vino") +
            geom_point(shape=1) +     # Use hollow circles
            geom_smooth()            

ggplotly(p)

Uso de Bibliotecas en R

R-CRAN es un leguaje que originalmente se desarrolló para el campo disciplinar de la estadística. No es de sorprender entonces que haya mucho material de simulación basado en Montecarlo. Si bien hemos visto que es relativamente sencillo hacer el trabajo a mano (programado), esto muchas veces no es compatible con el tiempo disponible ni con los criterios de calidad del software que es requerido por la actividad profesional o científica. Una alternativa para evadir este inconveniente, es el uso de bibliotecas (library). Existen más de 20.000 bibliotecas específica oficiales. Cada una de ellas está avalada generalmente por más de cinco publicaciones con referato y sueles ser un alternativa segura y rápida para enfocarnos en el problema del modelado y la simulación sin tener que preocuparnos por el código.

Para poder invocar una biblioteca desde R es necesario descargarla de internet. Para ello se puede ejecutar en R-Studio la secuencia “Tools” “Install packages” y elegir el nombre del paquete que quieras instalar. También es posible hacer esto desde la línea de comando con:

    install.packages("nombre_paquete")

Una vez que la bibliotea se ha bajado y copiado en tu PC o teléfono, no deberás volver a hacer este proceso y para usarla sólo bastará con invocarla con el comando:

    library(nombre_paquete)

Esto agrega al lenguaje unos comandos nuevos que permiten resolver nuevos problemas. En el sitio https://cran.r-project.org/ la hoja específica de uso de todos los paquetes oficiales.

Usaremos una biblioteca llamada psycho debería instalarla así:

    install.packages("psycho")
library(psych)
pairs.panels(Vino_Fiscal)

Esto muestra la matriz de correlación o matriz de covarianza de las variables que intervienen. Note como se ha registrado una mayor eficiencia energética o lo que es lo mismo, un descenso de en lo que dentro de los ODS 2030 se llama intensidad energética.

Uso de Time Sieries como biblioteca

Estacionalidad en la energía

#VAN y TIR por el método Montecarlo

Recurriremos al uso de una biblioteca llamada FinCal, para repetir el proceso que ya ensayamos con el modelo del lote económico EOQ. Es decir veremos como usar R-CRAN para operar sobre un vector que tiene los flujos de fondos descontados e un proyecto utilizando una biblioteca específicamente diseñada para ello. Luego alimentaremos al modelo no con un vector de datos sino con un vector que contiene dos filas. La primera será el flujo de fondo tal como se usó en el primer caso y la segunda es una componente que representa la volatilidad. Este concepto de “volatilidad” hace referencia al riesgo que sumimos en pronosticar ingresos y egresos a futuro. Nuestra certeza sobre los flujos de hace menos confiable conforme transcurre más tiempo en el desarrollo del proyecto. Por lo tanto la segundo componente del nuevo vector tiene algo así como la varianza creciente por la que afectaremos a los pronósticos de fondos futuros.

Uso de la biblioteca FinCal

Tal como se señalo más arriba deberemos instalar la biblioteca usanso el comando respectivo solo la primera vez que deseemos instalar en unestro computador. Ejecuteremos entonces:

    install.packages("FinCal")
    

A partir de este momento podemos invocar a la biblioteca como ya sabemos.

library(FinCal)

Esta biblioteca ha agregado 62 comandos de matemática financiera a nuestra computadora. para saber cuales son ejecutamos la siguiente línea.

ls("package:FinCal")
 [1] "bdy"                   "bdy2mmy"               "candlestickChart"     
 [4] "cash.ratio"            "coefficient.variation" "cogs"                 
 [7] "current.ratio"         "ddb"                   "debt.ratio"           
[10] "diluted.EPS"           "discount.rate"         "ear"                  
[13] "ear.continuous"        "ear2bey"               "ear2hpr"              
[16] "EIR"                   "EPS"                   "financial.leverage"   
[19] "fv"                    "fv.annuity"            "fv.simple"            
[22] "fv.uneven"             "geometric.mean"        "get.ohlc.google"      
[25] "get.ohlc.yahoo"        "get.ohlcs.google"      "get.ohlcs.yahoo"      
[28] "gpm"                   "harmonic.mean"         "hpr"                  
[31] "hpr2bey"               "hpr2ear"               "hpr2mmy"              
[34] "irr"                   "irr2"                  "iss"                  
[37] "lineChart"             "lineChartMult"         "lt.d2e"               
[40] "mmy2hpr"               "n.period"              "npm"                  
[43] "npv"                   "pmt"                   "pv"                   
[46] "pv.annuity"            "pv.perpetuity"         "pv.simple"            
[49] "pv.uneven"             "quick.ratio"           "r.continuous"         
[52] "r.norminal"            "r.perpetuity"          "sampling.error"       
[55] "SFRatio"               "Sharpe.ratio"          "slde"                 
[58] "total.d2e"             "twrr"                  "volumeChart"          
[61] "was"                   "wpr"                  

Si necesito conocer que hace cada comando nuevo puedo usar el signo de pregunta para ver la página de ayuda interna. Asi:

    ?npv

Esto debería darle información sobre cada comando nuevo. Veremos algunos ejemplos simples para que tome experiencia en el caso de simulación determinística de flujo de fondos.

Minicaso

Un inversionista coloca $100 durante un año a una tasa de interés simple de 1.5% mensual pagadera mensualmente
¿Qué retribución obtiene durante el año?

I= 100*0.015*12
F=100 + I
F
[1] 118

Minicaso Reinversión de Dividendos

Considere el caso del inversionista del ejemplo anterior, pero suponiendo que recibe los intereses al final de cada mes y que los reinvierte inmediatamente en las mismas condiciones de la inversión inicial.
¿Qué cantidad de dinero recibirá al cabo de un año ?

fv.simple(r = 0.015, n=12, pv = -100)
[1] 119.5618

Convertir de tasa Anual a Mensual

¿Cuál es la tasa de interés nominal anual de una inversión que ofrece el 1.5% de interés pagado al final de cada mes?

r.norminal(r = 0.015, 12) * 12
[1] 0.1801125

Plazo fijo

¿Cuál es la tasa efectiva anual de rendimiento de una inversión que ofrece un interés nominal anual del 8%, pagadero cada semestre vencido, pero que el interesado procede a reinvertirlo?

ear(r = 0.08, 2)
[1] 0.0816

Minicaso flujo de fondos

Crearemo un flujo de fondos consolidado de un proyecto hipotético de la creación de una bodega boutique con destino enoturístico que compite contra otro proyecto similar pero del terreno de la cervezería artesanal. Cada uno de estos proyectos será identificado por los flujos totales FFN1 y FFN2. El proyecto comienza en 2019 y se puede recuperar la inversión hasta 2028


Crearemos el primer flujo de fondos:

#Enoturismo
año<-
c(2019,2020,2021,2022,2023,2024,2025,2026,2027,2028)
FFN1<-c(-940693, 186255, 186255, 186255,
37323,37323,37323,37323, 116482, 280651)
plot(año,FFN1,pch=19,cex=3,col="dark red")
abline(0,0)

Ahora crearemos el flujo de fondo correspondientes a la actividad de la cerveza. Este proyecto tiene equipos de frío que no sirven más a partir del año 2024.

#Cerveza artesanal
FFN2<-c(-19132841, 5691206, -14230711,
16387818, 24645898)
plot(año[2:6],FFN2,pch=19,cex=3,col=rgb(.25,
0.5, .3))
abline(0,0)

Selección de proyecto más conveniente

Comparemos los VAN de ambos proyectos

# Enoturismo
FinCal::pv.uneven(0.3339,-FFN1)
[1] -414627.2

Este proyecto se realiza en un país riesgozo de modo que lo castigo con una tasa más alta.

# Creveza artesanal
FinCal::pv.uneven(0.18,-FFN2)
[1] -1562583

Selección de mejor proyecto

    Proyecto del Enoturismo

Comparación por TIR

TIR1 = irr(FFN1)
TIR2 = irr(FFN2)
TIR1
[1] 0.03481718
TIR2
[1] 0.1487625

Según el TIR el proyecto más conveniente es:

  Proyecto de creveza artesanal.
  

¿Que proyecto elegirías tu?

TIR y VAN con Montecarlo

Determinaremos cuantos períodos tiene cada proyecto y le asignaremos una varianza creciente a sus flujos de fondos. Esto podría hacerse con la distribución de probalilidades F se Snedecor (Senedorv o Snedecorf). Pero por sencillez tomaremos valores estimados por nosotros.

Vector de Volatilidad

length(FFN1)
[1] 10
Volatilidad <- c( 0.1 ,0.2, 0.3, 0.4, 0.5,
0.6, 0.7, 0.8, 0.9, 1.0)

Flujo de Fondos Estocástico

VAN con Montecarlo

Las funciones de FinCal pueden aplicarse a una variable sola (que en realidad es una matriz de uno por uno), pero también a una matriz de mayores dimensiones. En lugar de darnos un valor nos dará una campana de Gauss de valores de salida.

Para ello crearemos un dataset.

FFN_S <- matrix(rnorm(144,FFN1,Volatilidad),
ncol=12, nrow=12, byrow=TRUE )
FFN_S[ ,1] <- rnorm(12, FFN1[1],
100*Volatilidad[1])

En este caso FFN_S representa el flujo de fondos Estocástico de 12 alternativas tomadas aleatoriamente usando la volatilidad como generador estocástico.

Histograma del VAN Enoturismo

#creo una variable auxiliar

VAN_S <- c(0,0,0,0,0,0,0,0,0,0,0,0)

# cargo en esa variable los valores de flujos aleatorios 
for (i in 1:12) { (VAN_S[i] <-
# calculo para cada uno de los 12 fondos un VAN
                     FinCal::npv(0.18,FFN_S[i,] ))}
# imprimo el histograma
hist(VAN_S)

Densidad de valores en el VAN Montecarlo

density(VAN_S)

Call:
    density.default(x = VAN_S)

Data: VAN_S (12 obs.);  Bandwidth 'bw' = 9.327e+04

       x                  y            
 Min.   :-1255836   Min.   :8.592e-09  
 1st Qu.:-1004409   1st Qu.:2.485e-07  
 Median : -752981   Median :1.167e-06  
 Mean   : -752981   Mean   :9.928e-07  
 3rd Qu.: -501554   3rd Qu.:1.561e-06  
 Max.   : -250126   Max.   :2.021e-06  

Gráfica de densidad del VAN Montecarlo

plot(density(VAN_S))

11 Anexo uso de R-Cran

11.1 Syntax highlighting

Here is a sample code chunk, just to show that syntax highlighting works as expected.

11.2 Exploración de datos

Here is the structure of the iris dataset.

str(iris)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

11.3 Escritura de fórmulas

Estilo Latex :

\[\bar{x} = \frac{1}{n} \sum_{i=1}^n x_i\]

12 Tablas

Here is a sample table output.

(4.3,5.5] (5.5,6.7] (6.7,7.9]
(2,2.6] 11 12 1
(2.6,3.2] 18 49 16
(3.2,3.8] 26 8 3
(3.8,4.4] 4 2 0

Here we display a crosstab displayed in several different ways with a “pills” interface. To do this, just pass your table() result to the pilltabs() function.

         (4.3,5.5] (5.5,6.7] (6.7,7.9]

setosa 47 3 0 versicolor 11 36 3 virginica 1 32 17

Sepal.Length Sepal.Width Petal.Length Petal.Width Species seplc
5.1 3.5 1.4 0.2 setosa (4.3,5.5]
4.9 3.0 1.4 0.2 setosa (4.3,5.5]
4.7 3.2 1.3 0.2 setosa (4.3,5.5]
4.6 3.1 1.5 0.2 setosa (4.3,5.5]
5.0 3.6 1.4 0.2 setosa (4.3,5.5]
5.4 3.9 1.7 0.4 setosa (4.3,5.5]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species seplc
5.1 3.5 1.4 0.2 setosa (4.3,5.5]
4.9 3.0 1.4 0.2 setosa (4.3,5.5]
4.7 3.2 1.3 0.2 setosa (4.3,5.5]
4.6 3.1 1.5 0.2 setosa (4.3,5.5]
5.0 3.6 1.4 0.2 setosa (4.3,5.5]
5.4 3.9 1.7 0.4 setosa (4.3,5.5]

13 Figuras

13.1 Base graphics

A base graphics histogram :

13.2 ggplot2

Same with ggplot2 :

Beautiful ggplot2 histogram, really

Figure 13.1: Beautiful ggplot2 histogram, really