Estadística Básica con Mathematica

En este post mostraré el uso de los estadísticos mas básicos y las funciones para llamarlos en Mathematica.

Para esto he creado dos variables sencillas, bSales y bPrice, suponiendo que se trata de ventas en MXN o USD (es irrelevante) o bien podrían ser unidades vendidas al precio bPrice, que definitivamente si tiene que estar en unidades monetarias.

bSales = {100, 80, 63, 45, 21};
 bPrice = {1, 2, 3, 4, 5};

Estos dos vectores muy sencillos nos ayudarán a dar un ejemplo de las funciones incluidas en Mathematica para estadística. Lo que haré será usarlas todas y luego usaré las fórmulas para verificar su veracidad (no es que dude de lo que los de Wolfram hayan programado, simplemente es buena idea y puede resultar bastante didáctico).

Mean[bSales] // N
 Variance[bSales] // N
 StandardDeviation[bSales] // N
 Covariance[bSales, bPrice] // N
 Correlation[bSales, bPrice] // N

Y sus respectivos outputs:

61.8
934.7
30.5729
-48.25
-0.998139

Hay que notar que he puesto al final de todas las funciones N, para poder mostrar el dato en modo numérico. Y bien, primero comprobamos la media, esto es bastante sencillo:

mean = Sum[bSales[[i]], {i, 1, Length[bSales]}]/Length[bSales] // N

Que es la suma de las Xi de 1 a n (mido las unidades del vector con Lenght) todo esto sobre n. La función Sum hace super fácil hacer este programita, sin tener que llegar a usar un For o algo por el estilo, simplemente hay que saberle indicar el tamaño de la suma, lo cual se hace en el segundo argumento de la función. Note que he usado bSales[[i]], que es lo mismo que Part[bSales,i] o el iésimo elemento del vector.

Uso una forma similar para la varianza:

variance = 
  Sum[(bSales[[i]] - mean)^2, {i, 1, Length[bSales]}]/(Length[bSales] - 1)

Y hay que notar que aquí se usa n-1, es decir, es la varianza muestral.

Para la desviación estándar la pereza me ha invadido y simplemente le he sacado raíz cuadrada a la varianza:

sd = Sqrt[variance]

La covarianza usa un proceso similar, hay que recordar que la fórmula de la covarianza es, en palabras, la suma de 1 a n de los productos de las diferencias entre el iésimo elemento y su media, todo esto sobre n-1:

covariance = 
  Sum[(bSales[[i]] - mean)*(bPrice[[i]] - Mean[bPrice]), {i, 1, 
     Length[bSales]}]/(Length[bPrice] - 1)

Como no he realizado la fórmula de la media del precio he usado la función de Mathematica, ya que ya comprobamos que si da lo mismo. Hice lo mismo para la desviación estándar del precio al sacar la correlación:

correlation = covariance/(sd*StandardDeviation[bPrice])
Anuncios

Tabla ordenada de tasas de interés

La tasa de interés activa es un dato cuya comparación resulta interesante en muchos aspectos. He tomado los datos del banco mundial en formato Excel, los he acomodado para sólo tener el vector del promedio en las tasas de interés activas de 2007 a 2011.

lendingR = 
  First[Import["/Users/M/(...)/lendingrate.xls"]];

La razón por la que antes de que pase el valor a la variable haya usado First es por que he puesto los datos que quería en la hoja 1, la hoja 2 mantiene todos los datos originales para usos posteriores.

En la segunda parte del programa me aseguro de limpiar los datos vacíos:

temp = {};
For[i = 1, i < Length[lendingR], i++,
 If[Head[lendingR[[i, 2]]] === Real,
  temp = Append[temp, lendingR[[i]]],
  Null]
 ]
lendingR = temp;

Muchos países no proporcionan algunos datos y aparecen en blanco en lo que no proporcionan, por lo que al crear los promedios en excel, en tales países aparece un mensaje de error. Queremos que a estos países no los incluya en la tabla final. Para esto he usado la función Head, que devuelve el encabezado. Si el dato que contiene la posición que evaluamos en la matriz tiene como encabezado que es un número real, lo podemos incluir a la tabla, de lo contrario lo ignoramos. Finalmente, pasamos los datos  de la matriz temporal a la originaria.

Usaremos a continuación la matriz transpuesta para poder trabajar con el vector que contiene únicamente los datos. De ahí obtendremos el orden, el cual alojaremos en la variable order y que usaremos para crear una matriz con los vectores ordenados, para luego pasar su valor a la matriz original.

temp = {};
tlR = Transpose[lendingR];
order = Ordering[tlR[[2]]];
temp = Append[temp, tlR[[1]][[order]]];
temp = Append[temp, tlR[[2]][[order]]];
lendingR = Transpose[temp];

Por último, agregaremos a cada elemento de la lista su número correspondiente, así la tabla final nos presentará el País, su tasa de interés y su Ranking. Presentamos la matriz con TableForm.

For[i = 1, i < Length[lendingR], i++,
 lendingR[[i]] = Append[lendingR[[i]], i]
 ]
Clear[temp, tlR, order];
TableForm[lendingR]

Regresiones Lineares con Mathematica: m1 vs INPC

Entiéndase por M1 la emisión monetaria primaria e INPC es el índice de precios, i.e. la inflación. Los datos los tomé de banxico (nota: la aplicación en web que tienen en su página está muy buena, punto para ellos):

(*Importar la lista de m1, limpiar los datos y presentarlos en gráfica*)
Clear[m1];
m1 = Import[
   "/Users/Marius/Google Drive/COPYME/Mathematica/Ejercicios/tm/m1.xls"];
m1 = First[m1];
temp = {};
For[i = 1, i < Length[m1], i++,
 temp = Append[temp, First[m1[[i]]]]
 ]
m1 = temp;
Clear[temp];

y además

*Importar datos de INPC, limpiarlos y presentarlos en gráfico *)
Clear[inpc];
inpc = Import[
   "/Users/Marius/Google Drive/COPYME/Mathematica/Ejercicios/tm/inpc.xls"];
inpc = First[inpc];
temp = {};
For[i = 1, i < Length[inpc], i++,
 temp = Append[temp, First[inpc[[i]]]]
 ]
inpc = temp;
Clear[temp];
inpc = Most[inpc];

He limpiado los datos, hay que notar que Banxico, por muy genial que sea su aplicación, sólo me dejó descargar los archivos en Excel y éstos venían con toda la información que le podría pedir al respecto, de modo que he modificado el archivo en Excel antes de importarlo para asegurarme de que ya no tiene la información extra que luego es complicado limpiar y todo quedó en un hermoso vector.

Ahora conjuntaremos los datos en una matriz:

temp = {};
For[i = 1, i < Length[m1], i++,
 t1 = {};
 t1 = Append[t1, m1[[i]]];
 t1 = Append[t1, inpc[[i]]];
 temp = Append[temp, t1];
 Clear[t1];
 ]
m1inpc = temp;
Clear[temp];
Length[m1inpc]
ListPlot[m1inpc]

La razón de hacer esto es que podrán trabajarse como las variables independientes x, i.e. en un modelo y=a x1+ b x2 + j la matriz representa las x. En nuestro caso, en realidad lo que queremos lograr hacer es una regresión donde y sea el diferencial del m1 y las x sean el m1 mismo y el inpc.

Para esto tenemos que generar el vector del resultado y con m1(i)-m1(i-1):

(*Crear la lista de las diferencias de M1, que establezca el crecimiento*)
m1G = {};
For[i = 0, i < Length[m1], i++,
 
 If[Head[m1[[i]]] =!= Real,
  (*j=i+1;
  m1G=Append[m1G,Minus[m1[[j]]]];
  Clear[j];*)Null
  ,
  j = i + 1;
  temp = m1[[j]] - m1[[i]];
  m1G = Append[m1G, temp];
  Clear[temp];
  Clear[j];
  ]
 ]

Ya tenemos lo que necesitamos. Para hacer la regresión usaremos LinearModelFit. En una de sus descripciones:

LinearModelFit: LinearModelFit[{m, v}]
constructs a linear model from the design matrix m and response vector v.

lm = LinearModelFit[{m1inpc, m1G}]
lm["DurbinWatsonD"]
lm["AdjustedRSquared"]
lm["RSquared"]
lm["ANOVATable"]
ListPlot[lm["MeanPredictionErrors"]]

Como podemos ver, es sumamente sencillo hacer una regresión en Mathematica una vez teniendo los datos acomodados de la forma correcta.

Además es super sencillo pedirle que entregue los estadísticos que necesitas, por ejemplo, aquí le hemos pedido el Durbin Watson, la R cuadrada, la R cuadrada ajustada y la tabla ANOVA. Además, he puesto en gráfica los errores de predicción promedio.

 

Funciones de Producción a la Mexicana

Estaba creando una función de producción Cobb-Douglas, y me puse a buscar diferentes patrones de colores para mostrar (El patrón estándar me parece horrible) y encontré “RedGreenSplit”, el cual forma una bonita bandera de México. Aquí el código. (Noten que k empieza en 1 y no en cero, esto es una conveniencia necesaria para lo que yo quería hacer)

Manipulate[
 ContourPlot[k^α l^(1 - α), {k, 1, 10}, {l, 0, 10},
  ColorFunction -> "RedGreenSplit",
  PlotLabel ->
   Style["Función de producción", FontSize -> 20, FontFamily -> "Arial"],
  AxesLabel -> {"Trabajo"},
  LabelStyle -> Directive[Bold, FontFamily -> "Arial", FontSize -> 12],
  FrameLabel -> Style["α=0.47"], ImageSize -> Medium], {α, 0, 1}]

Imagen

 

PS: Para conocer los diferentes tipos de colores en gradientes con los que cuenta Mathematica, sólo es necesario escribir:

ColorData["Gradients"]

Manipulación de datos en Mathematica

Ayer quería un dato sencillo: El promedio del tipo de cambio de MXN a USD durante el 2012.

Probablemente haya alguna aplicación en web en el que hubiera podido encontrar el dato prefabricado, pero no confío mucho, no se cómo obtuvieron el dato y no se de donde vienen los estimados. Así que tomé los datos del FMI, que a su vez los toma de los banco centrales. Probablemente habría sido más fácil obtener los datos directamente del Banco de México, pero quería ver cómo estaban los datos de Fondo Monetario. Resulta que esos datos tenían todos los problemas que podrían existir al tomar una base de datos.

Para esto tomé todos los datos desde enero hasta diciembre de 2012. La aplicación me da tres opciones, una era Excel, que por comodidad fue la primera que intenté bajar. Pero estos datos al importarlos en Mathematica me daba toda la fila como un sólo String, por lo que pensé que mejor intentaría otro tipo de datos.

Curiosamente tienen entre sus tipos de datos una extensión *.tsv, es decir tab-separated values, que pensé que sería muy similar al *.csv, separados por comas.

Así que al importar, tuve que quitar la información al inicio y al final. Como en las columnas el dato que me interesaba estaba en medio, tuve que transponer la matriz y repetir el proceso de limpia de datos. el programa se veía así:

tdc = Import["/Users/(...)/Exchange_Rate_Report.tsv"];
tdc = Drop[tdc, 3];
tdc = Drop[tdc, -13];
tdc = Transpose[tdc];
tdc = Drop[tdc, 2];
tdc = Drop[tdc, -2];
tdc = First[tdc];

Probablemente había una forma más rápida de hacerlo, no lo se… el punto es que quedó un vector limpio con sólo los tipos de cambio. El problema es que pasó los datos como String, y peor aún, como son datos separados por el tabulador, los últimos valores de la cadena de datos de cada uno de los valores tienen espacios en blanco que no nos sirven.

Por eso hice este pequeño programa que elimina los valores en blanco y a la vez se deshace de los días en que no hay registros:

temp = {};
For[i = 1, i < Length[tdc], i++,
 If[
  StringLength[Part[tdc, i]] > 3,
  temp = Append[temp, StringDrop[Part[tdc, i], -2]],
  Null
  ]
 ]
tdc = temp;

 

Notarán que he incluido un If que ejecuta la acción sólo si la cadena tiene más de tres elementos, esto ayuda a eliminar los datos que no tienen registro, de lo contrario el programa dejaría más basura de la que elimina.

Finalmente, he usado por primera vez (para mi) la función ToExpression, que convierte un String en expresión, lo cual ha resultado bastante útil. Ya una vez convertido a expresión, el vector es realmente manipulable, se puede realizar gráficos con él y realizar cálculos, como la media.

temp = {};
For[i = 1, i < Length[tdc], i++,
 temp = Append[temp, ToExpression[Part[tdc, i]]]
 ]
tdc = temp
Clear[temp];

 

Imagen

 

PS: La media del tipo de cambio MXN/USD en 2012 fue de 13.166.