lunes, 15 de noviembre de 2010

Lenguajes funcionales (Reporte #4)

Los lenguajes funcionales, son los lenguajes basados en el uso de funciones, entre ellos se encuentran, los lenguajes R, Scheme, Haskell, Miranda, Erlang, Lisp, etc.

Lenguaje Funcional R
R es un lenguaje que tiene muchas funciones para lo que son análisis estadísticos y gráficos
.
Es un buen lenguaje para realizar gráficas, de tipo: histogramas, circulares, de líneas, etc.

El programa que realice en R, es una gráfica con ciertas características, que más adelante les explicare. Este programa se basa en ciertos datos, de un problema de probabilidad y estadíca; además de la gráfica, obtuve las medidas de tendencia central, las cuales son, la media, la mediana y la moda (en este caso, solo obtuve la media y la mediana). Además obtuve también la varianza y la desviación estándard, que son las medidas de dispersión. Esto, como ya lo mencione es de un problema de probabilidad; de alli me base para realizar la gráfica y las diferentes medidas en R.

Problema
Se listan los precios de 19 marcas diferentes de zapatos para caminar. Construya una gráfica para mostrar la distribución de los datos.
90, 70, 70, 70, 75, 70
65, 68, 60, 74, 70, 95
75, 70, 68, 65, 40, 65
70
Bueno, si ya tenemos instalado R, en nuestra terminal escribibimos R, y nos aparecerá un símbolo como este >, lo cual significa que ya podemos comenzar a realizar la gráfica. Colocaremos lo que en la imagen les muestro:

En R, la asignación de un valor a una variable, se hace asi: a <- 5, en donde a es la variable y 5 es el valor que se le asigna a la variable a. Bueno, como vemos en la imagen, escribi Marcas <- 1:19, esto indica que Marcas tiene un rango de 1 a 19, ya que 19 son el número de datos que tenemos. En R, para asignar varios datos a una variable, se hace asi: a <- c(4, 5, 6). Es por esto que después escribi Precios <- c(90, 70, 70, 70, 75, 70, 65, 68, 60, 74, 70, 95, 75, 70, 68, 65, 40, 65, 70). Después escribi plot(Marcas, Precios), esto es para que se realice la gráfica de distribución de Marcas y Precios. Al colocar esto, se muestra una ventana con la gráfica siguiente:

Como vemos, solo se muestra la distribución de los datos de Marcas y Precios; Marcas se encuentra en el eje de las x y Precios en el eje de las y, esto sucede al haber escrito plot(Marcas, Precios), ya que si hubiera escrito plot(Precios, Marcas), entonces Marcas estaría en el eje de las y y Precios en el eje de las x; en si para realizar una gráfica se utiliza así la función: plot(x,y).

Hay una función en R que permite ordenar los datos en orden ascendente y otra función que permite ordenarlos en orden descendente. Dichas funciones son, sort() y rev(sort()) respectivamente.
A continuación les muestro la imagen en donde use estas funciones, solo para que se muestre como quedan los datos de Precios ordenados ascendente y descendentemente.

Después le agregue ciertas características a la gráfica como lo son, las figuras que se muestran, el color del relleno de las figuras, el color del contorno de dichas figuras, el título de la gráfica, el estilo de dicho título, y el ancho del contorno de las figuras. La imagen siguiente, muestra lo que escribi para realizar la gráfica con las características que les mencione.

Como vemos se muestra que escribi sort(Precios), que es como les mencione anteriormente, para ordenar los datos de Precios, en forma ascendente (para verlos asi en la gráfica). Utilice pch = 21, para elegir la el símbolo o figura que quiero que se muestre en la gráfica, en este caso escogí el número 21 del cuadro siguiente:

Después utilice bg = 619, para determinar el color de relleno de los símbolos. El número del color que se desea poner al relleno de los símbolos, se encuentra, escribiendo en la termial (estando dentro de R), colors(), y así se despliegan todos los números de los colores junto con el nombre del color (hay 657 colores). Después escribi col = 644, esto indica el color del contorno de los símbolos, que igualmente el número del color se obtiene al escribir colors() en la terminal. También se puede escribir el nombre del color en vez del número de este, por ejemplo, col = "red". Vemos que después escribi main = "Distribución de precios y marcas", main indica el título que queremos que se muestre en nuestra gráfica, el cual deberá ir entre comillas. Después escribi font.main = 4, font.main controla el estilo del título. Si colocamos el 1 es para que el texto del título se vea normal, el 2 es para que se vea en negritas, el 3 para que se vea en cursiva y el 4 para que el texto del título de vea en negritas y cursiva. En este caso escogí el 4. Y por último escribí lwd = 1, que esto indica la anchura del contorno de los símbolos, en este caso le puse 1. Sí le hubiese puesto 2, simplemente, el ancho del contorno de los símbolos aumenta. Y aquí les muestro como quedó la gráfica, ya con las características anteriores.


Ahora les explicaré como obtuve las medidas de tendencia central y la varianza y la desviación estándard de los datos del problema.

Bueno ahora les mostraré la imagen en donde calculo la media, que la media es el promedio de los datos, es decir la suma de todos los datos sobre el número total de datos.

Como vemos escribi Media <- sum(Precios)/Marcas. Utilice la función sum(), ya que realiza la suma de todos los datos que se encuentren, en este caso en Precios. Después esa suma la dividí entre Marcas, y luego escribi Media, esto es para imprimir lo que resulta de la operación que se le asigno a Media, y de esta manera se obtuvieron varios resultados, siendo el último de ellos, la Media, que es 70. Todos los demás resultados que se obtuvieron, fue porque dividi entre Marcas es decir, se realizaba la suma de los datos de Precios y se iba dividiendo esa suma entre 1, entre 2, entre 3, hasta llegar al 19. Pero otra manera más directa que realice para calcular la Media, fue, como lo vemos en la imagen, Media <- sum(Precios)/19, y asi escribiendo después Media, se imprime directo el resultado de esta, (que es 70), ya que se dividió directamente entre el número total de datos, es decir 19.

La varianza representa la variación que tienen los datos respecto a la media.
Normalmente se calcula asi:

Donde Xi, representa a cada uno de los datos, () representa la media, y n representa el total de datos que se tienen en una muestra.

La desviación estándard es el promedio de la distancia que hay de cada dato con respecto a la media. Normalmente se calcula así: Es decir, la desviación estándar es la raíz cuadrada de la varianza.

Ahora, les coloco la imagen en donde se muestran las funciones que utilice para obtener la varianza y la desviación estándard.


Como vemos, es sencillo calcular la varianza y la desviación estándard, ya que solo se utilizan funciones. Para calcular la varianza se utiliza la función var() y para calcular la desviación estándard se utiliza la función sd(). En este caso escribi var(Precios) y sd(Precios), para que se calcularán la varianza y la desviación estándard de los datos que se asignaron a Precios siendo la varianza igual a 120.7778 y la desviación estándar igual a 10.98989.

La mediana es el dato central que se encuentra en un conjunto de datos ordenados en forma ascendente.
En este caso la mediana es 70, ya que tenemos 19 datos, entonces ordenamos estos datos en forma ascend
ente y nos vamos al dato que se encuentra en el centro, es decir el dato #10. y vemos que este dato es el 70. Si el número total de datos hubiera sido 20, entonces la mediana seria la suma del dato 10 y del dato 11 sobre 2.

Y ya por último les coloco la imagen en donde se muestra la función que se utiliza para calcular la mediana y además también en esta imagen se muestra una fución que hay en R para calcular la media, aunque esta ya la realice anteriormente pero sin el uso de esta función.

Como vemos la función que se utiliza para calcular la mediana, es median() y para calcular la media es mean(). En este caso escribi, median(Precios) y mean(Precios), para obtener la mediana y la media de los datos asignados a Precios, siendo la mediana igual a 70 y la media igual a 70 como lo mencione anteriormente.

Lenguaje Erlang
Erlang es otro lenguaje funcional, que tiene una característica, que se dice que es la mayor fortaleza de este lenguaje, la cual es la concurrencia, que es cuando se llevan a cabo o se ejecutan varios threads (procesos) al mismo tiempo.

Los archivos en Erlang tienen la extensión .erl
Los programas en Erlang contienen funciones junto con su aridad. La aridad es el número de datos de entrada que la función permitirá que el usuario ingrese.
Las funciones se exportan en el programas de la manera siguiente: -export(nombre_función/aridad).

Realice tres programas en Erlang sencillos, uno de ellos calcula la potencia y esta en forma recursiva, el otro realiza las diferentes operaciones básicas (suma, resta, multiplicación y división), con el uso del case, y de acuerdo a la opción que el usuario eliga, será la operación que se realizará y el otro calcula las areas de diferentes figuras geométricas (cuadrado, triángulo, rombo, trapecio, círculo y rectángulo).

El primer programa que les mostraré, lo llame potencia.erl y como ya lo mencione anteriormente calcula potencia en forma recursiva.

Código
-module(potencia).
-export([pot/2]).

pot(N, K) when K == 0 -> 1;
pot(N, K) when K > 0 -> N*pot(N, K-1).
En esta parte:
-module(potencia).
-export([pot/2]).
Se colocan en el programa el módulo y la función que se utilizará. El nombre del módulo, deberá ser el mismo nombre que el del programa, en este caso es potencia. La función que utilice en este programa la llame pot y su aridad es de 2, es decir el usuario solo podrá ingresar dos datos de entrada en esta función.
Al final de colocar el módulo y la funcion o funciones se colocará un punto .

En esta otra parte:
pot(N, K) when K == 0 -> 1;
pot(N, K) when K > 0 -> N*pot(N, K-1).
Vemos que escribi pot(N, K), bueno esta es la función pot que contiene a las variables N y K, siendo N el número al cual se le calculará la potencia y K la potencia.

Las variables en Erlang van en mayúscula.

Sabemos que todo número elevado a la 0 es 1, es por eso que coloque la función when con la condición de que cuando K == 0, enonces el resultado que se imprimirá será 1.
Y ya después coloque nuevamente la función de when con la condición de que cuando K > 0, entonces se calculara la potencia de forma recursiva.
Vemos que al final de la instrucción de la potencia recursiva, se coloca un .
Hay que poner mucha atención en la sintaxis cuando se utilizan las funciones if, when, y case.

Para ejecutar este programa, colocamos primreamente erl en nuestra terminal y después escribimos lo siguiente:
c(potencia).
Donde potencia es el nombre del programa. Y como el programa esta correcto, en la terminal se mostrara: {ok,potencia}. Y ahora si se puede realizar la potencia K de un número N. Esto es de la siguiente manera: se coloca primero el nombre del programa y después : y luego se escribe el nombre de la función, que en este caso es pot y seguido de la función se colocan entre paréntesis N y K y al final un punto . Aquí les muestro la imagen de la ejecución de este programa, comprobando los casos de K == 0 y K >0.


Ahora les colocaré el código del programa que realiza las operaciones básicas con el uso del case, en donde se elige la opción de la operacón a realizar. Ese programa lo llame opc.erl.

Código
-module(opc).
-export([opciones/3]).

opciones(N, A, B) ->
case N of
1 -> A+B;
2 -> A-B;
3 -> A*B;
4 -> A/B;
N when N > 4 -> "Ingresa otra opcion (1-4)"
end.
Ahora, este programa como lo mencione anteriormente, realiza las operaciones básicas, pero utilice el case, para que el usuario eligiera la opción de la operación a realizar.

Igualmente en la parte de:
opciones(N, A, B) ->
case N of
1 -> A+B;
2 -> A-B;
3 -> A*B;
4 -> A/B;
N when N > 4 -> "Ingresa otra opcion (1-4)"
end.
se encuentran el módulo llamado opc y la función que utilice a la cual llame opciones y le puse una aridad de 3.
En opciones(N, A, B), N es el número de opción que el usuario elegirá, A y B son los dos datos que el usuario introducirá, con los cuales se realizará la operación. Y ya en la parte donde se encuentra el case N of, pues sencillamente ya se presentan las opciones junto con su operación a realizar, es decir, si se ingresa el 1 como opción, entonces se realizará una suma, si se ingresa el 2, una resta, si se ingresa el 3, se realiza una multiplicación, si se ingresa un 4, se realiza una divisón. Y si se ingresa un número mayor a 4, entonces en la terminal se imprime que se ingrese otra opción de 1-4. La función case al final termina con end.

Para ejecutar este programa colocamos erl en la terminal y después:
c(opc). 
Aquí les muestro la imagen de la ejecución de este programa, en donde elijo las diferentes opciones y la opción de cuando N > 4.


Y el otro programa que realice lo llame areas.erl. Y es el siguiente:

Código
-module(areas).
-export([cuadrado/1]).
-export([triangulo/2]).
-export([rombo/2]).
-export([trapecio/3]).
-export([circulo/1]).
-export([rectangulo/2]).

cuadrado(L) ->
L*L.

triangulo(B, H) ->
(B*H) / 2.

rombo(DM, D) ->
(DM*D) / 2.

trapecio(BM, B, H) ->
((BM+B)*H) / 2.

circulo(R) ->
3.141592*(R*R).

rectangulo(B, A) ->
B*A.
Pues este programa también es muy sencillo, calculas las áreas de ciertas figuras geométricas.
Como vemos coloque el módulo con su nombre, areas, y además exporte cada una de las funciones por separado, las cuales se pueden exportar juntas, de la siguiente manera:
-export([cuadrado/1, triangulo/2, rombo/2, trapecio/3, circulo/1, rectangulo/2]).
A cada función le di una cierta aridad, según los datos que se necesitan para calcular las diferentes areas.
Y ya después coloque a cada función con su instrucción correspondiente.
Como vemos las areas que calcula son: la del cuadrado, la del triángulo, la del rombo, la del trapecio, la del círculo y la del rectángulo. Las cuales se calculan mediante las fórmulas:

Área del cuadrado = Lado * Lado
Área del triángulo = Base * Altura / 2
Área del rombo = Diámetro mayor * Diámetro menor / 2
Área de l trapecio = ((Base mayor + Base menor ) * Altura) / 2
Área del círculo = 3.141592 * radio al cuadrado
Área del rectángulo = Base por Altura

Al final de cada instrucción se colocará un punto .

Para ejecutar este programa, escribiremos erl en la terminal y después lo siguiente:
c(areas).
Y aquí les muestro la imagen de la ejecución de este programa, donde utilice todas las funciones.


Saludos.





2 comentarios:

Rolando Benitez dijo...

Muy buena entrada Gemma, algo larga, pero de gran ayuda para resolver problemas de Probabilidad y Estadística.
Me encanto la tablita de las diferentes figuras de las gráficas en R xD no me imagine (en realidad no lo busque jeje) que podrías cambiarle el estilo y el color.
También muy buenos ejemplos de Erlang y gracias por incluir los códigos para descargar.

Elisa dijo...

Muy buena, sí, pero también ya bien tarde. +3 en puntos extra.

Publicar un comentario