Entre Matlab y Python, ¿qué lenguaje es bueno para el análisis estadístico general de datos? ¿Cuáles son los pros y los contras, aparte de la accesibilidad, de cada uno?
Respuestas
¿Demasiados anuncios?Como usuario acérrimo de Matlab desde hace más de 10 años, te recomiendo que aprendas Python. Una vez que seas lo suficientemente hábil en un lenguaje, cuando trabajes en un lenguaje que estás aprendiendo, te parecerá que no estás siendo lo suficientemente productivo, y volverás a usar tu mejor lenguaje por defecto. Como mínimo, te sugeriría que intentaras llegar a ser igual de competente en varios lenguajes (también te sugeriría R).
Lo que me gusta de Matlab:
- Lo domino.
- Es la lingua franca entre los analistas numéricos.
- la herramienta de creación de perfiles es muy buena. Esta es la única razón por la que utilizo Matlab en lugar de octave.
- Existe un clon freeware, octave, que se ajusta bastante a la implementación de referencia.
Lo que no me gusta de Matlab:
- No existe un buen sistema para gestionar paquetes y scripts de terceros (gratuitos o no). Mathworks controla el 'intercambio central de archivos', y la instalación de paquetes adicionales parece muy torpe, nada que ver con el excelente sistema que tiene R. Además, Mathworks no tiene ningún incentivo para mejorar esta situación, porque ganan dinero con la venta de cajas de herramientas, que compiten con los paquetes freeware;
- Las licencias de cálculo paralelo en Matlab son increíblemente caras;
- Gran parte del m-code, incluidas muchas de las funciones de la caja de herramientas, y algunos builtins, se diseñaron para ser obviamente correctos, a expensas de la eficiencia y/o la usabilidad. El ejemplo más evidente es el código de Matlab
median
que realiza una ordenación de los datos, luego toma el valor medio . Este ha sido el algoritmo equivocado desde los años 70. - guardar gráficos en un archivo es, en el mejor de los casos, dudoso en Matlab.
- Mi experiencia de usuario no ha mejorado en los últimos 5 años (cuando empecé a utilizar Matlab en lugar de octave), a pesar de que Mathworks sigue añadiendo campanas y silbatos. Esto indica que no soy su cliente objetivo, sino que buscan ampliar su cuota de mercado empeorando las cosas para los usuarios avanzados.
- Ahora hay 2 maneras de hacer programación orientada a objetos en Matlab, lo cual es confuso en el mejor de los casos. El código heredado que utiliza el estilo antiguo persistirá durante algún tiempo.
- La interfaz de usuario de Matlab está escrita en Java, que tiene ideas desagradables sobre la gestión de memoria.
Vamos a dividirlo en tres áreas (que se me ocurren a mí) en las que la programación se encuentra con la estadística: procesamiento de datos, rutinas numéricas (optimización, etc.) y bibliotecas estadísticas (modelización, etc.).
En cuanto a la primera, la mayor diferencia es que Python es un lenguaje de programación de propósito general. Matlab es estupendo siempre que tu mundo sea aproximadamente isomorfo a una matriz numérica de Fortran. Una vez que empiezas a tratar con la manipulación de datos y cuestiones relacionadas, Python eclipsa a Matlab. Por ejemplo, véase el libro de Greg Wilson: Data Crunching: Resuelva problemas cotidianos con Java, Python y mucho más .
En cuanto al segundo, Matlab realmente brilla con el trabajo numérico. Gran parte de la comunidad investigadora lo utiliza, y si buscas, por ejemplo, algún algoritmo relacionado con un artículo sobre detección comprimida, estás en el lugar adecuado. lejos más probabilidades de encontrar una implementación en Matlab. Por otra parte, Matlab es una especie de PHP de la informática científica: se esfuerza por tener una función para todo. La estética y la arquitectura resultantes son enloquecedoras si eres un friki de los lenguajes de programación, pero en términos utilitarios, hace el trabajo. Mucho de esto se ha vuelto menos relevante con el auge de Numpy/Scipy, es igual de probable encontrar librerías de optimización y aprendizaje automático disponibles para Python. La interfaz con C es igual de fácil en ambos lenguajes.
En cuanto a la disponibilidad de bibliotecas estadísticas para la modelización y similares, ambas son algo deficientes en comparación con algo como R. (Aunque sospecho que ambas satisfarán las necesidades del 80% de las personas que realizan trabajos estadísticos). Para el lado Python de las cosas ver esta pregunta: Python como banco de trabajo estadístico . Por lo que respecta a Matlab, sé que hay una caja de herramientas de estadística, pero dejaré que alguien con más conocimientos lo aclare (mi experiencia con Matlab se limita a trabajos numéricos no relacionados con la estadística).
También soy un ávido usuario de Matlab desde hace más de 10 años. Durante muchos de esos años no tuve ningún motivo para trabajar más allá de la caja de herramientas que había creado para mi trabajo. Aunque se crearon muchas funciones para una caja de herramientas, a menudo necesitaba crear algoritmos para análisis rápidos. Como estos algoritmos suelen utilizar matemáticas matriciales, Matlab era un candidato ideal para mi trabajo. Además de mi caja de herramientas de código Matlab, otros miembros de mi grupo trabajaban mucho en Java, ya que había una clara interoperabilidad entre los lenguajes. Durante años fui completamente feliz con Matlab, pero hace unos 3 años decidí iniciar la lenta transición de alejamiento de Matlab y me alegra decir que hace aproximadamente un año que no lo abro. Estas son las razones de mi cambio:
- Trabajo con sistemas informáticos en línea y fuera de línea, el sistema de licencias siempre fue un quebradero de cabeza. Siempre parecía ocurrir que cuando más necesitábamos Matlab, la licencia caducaba o de repente tenía problemas. Siempre era un quebradero de cabeza. Además, si alguna vez necesitábamos compartir código, y la otra parte no tenía licencias para las mismas cajas de herramientas, esto creaba un dolor de cabeza. No es gratis
- A menudo tengo que crear presentaciones. Aunque Matlab proporciona amplias herramientas para crear figuras, lo que lo hace muy potente para el diseño de algoritmos, pero guardar la figura de forma que pueda insertarse en una presentación y tener buen aspecto no es tarea sencilla. A menudo tenía que insertar un archivo EPS en Adobe illustrator para eliminar toda la basura, arreglar las fuentes y limpiar las líneas. Sin embargo, en el intercambio de archivos hay algunas herramientas que ayudan a hacerlo (export_fig.m).
- A menudo recibo código Matlab de otros. Cuando esto ocurre, casi siempre lo reescribo porque: su API no es compatible con mis datos, su código no tiene sentido, es lento, no da la salida que necesito,... Básicamente la gente que desarrolla en Matlab no son ingenieros de software y Matlab no fomenta ningún tipo de principio de diseño.
- Soy un usuario avanzado. Me gustan los terminales. Odio la GUI la odio. Y cuando añadieron la cinta de estilo "windows", la odié aún más. Básicamente, sus ajustes a la interfaz gráfica de usuario y la terrible gestión de la memoria pulsaron mi último botón y decidí marcharme. Usando el
-nodesktop
es buena la mayor parte del tiempo, pero tiene sus problemas. - Muchas posibilidades para el diseño de funciones (usando OO, o diseño funcional), pero ninguna siente cierto, la mayoría se sienten adhoc. No me satisface diseñar buenas funciones en Matlab.
- La comunidad es grande, pero no es fácil compartir y encontrar buen código. El intercambio de archivos no es tan bueno.
Estas son sólo algunas de mis muchas quejas con Matlab. Tiene un atributo brillante: es fácil, realmente fácil escribir código rápidamente (si no es feo). Lo dejé, sin embargo, y mi búsqueda me llevó a través de Clojure->JavaScript->Python<->Julia; sí, he estado por todas partes.
- Clojure: hermoso lenguaje funcional. Mi razón para usar Clojure fue su capacidad para programar Java. Gran parte de nuestro "gran" código base está en Java, así que esto tenía mucho sentido. En aquel momento no había mucho procesamiento científico disponible, y tampoco mucho con visualización. Pero creo que esto está cambiando.
- Javascript: después de ver los puntos de referencia en http://julialang.org/ y como yo estaba definitivamente interesado en la capacidad de visualización de D3 decidí probar con JavaScript. JavaScript es sorprendentemente muy rápido. Pero si realmente quieres odiarte a ti mismo, aprende JavaScript.
- Python: Python tiene una comunidad increíble y cuenta con un montón de grandes proyectos en marcha. El IPython Notebook es increíble por muchas razones (una de ellas es copiar y pegar figuras en PowerPoint). Proyectos como NumPy/SciPy/Scikit-Learn/Pandas han hecho que Python sea realmente divertido y fácil de usar. Es tan fácil de usar en múltiples núcleos o clusters. Estoy muy contento con el cambio.
- Julia: Julia es increíble. Especialmente para los usuarios de Matlab. Está en su infancia, sin embargo, por lo que un montón de cambios en curso. Uno de los mayores inconvenientes de Python es que no tiene toda la funcionalidad incorporada que tiene Matlab. Claro que NumPy/SciPy traen esa funcionalidad, pero no está incorporada y tienes que tomar decisiones sobre si ser objetos python puros u objetos numpy. Julia básicamente tiene todo lo que desearías que Python tuviera viniendo de Matlab. Yo esperaría, pero esta es la mejor opción para los usuarios de Matlab en el futuro.