top of page

Recursos didácticos de Machine Learning: Generación automática de datos IoT y detección de anomalías. Una introducción práctica

  • fjroar
  • hace 5 días
  • 5 Min. de lectura

En esta entrada voy a describir y completar como fue parte de mi última clase de Machine Learning que impartí ayer sábado 31-01-2026 en el máster de la UIC: https://www.uic.es/en/estudis-uic/business-administration/masters-degree-data-science-advanced-analytics


Para ello y mucho antes de la clase, me puse a ver varios cursos de coursera y vídeos de youtube para poder hacer prototipos mecánicos cercanos a lo que se denomina Internet de las Cosas y que fuesen capaces de generar datos realistas que posteriormente pudieran ser procesados, ya que muchas industrias hacen uso de este tipo de técnicas tanto para realizar experimentos de productos a lanzar en el mercado, como para llevar el control sistemático de distintos sistemas que pueden ser mecánicos, de refrigeración, etc.


Por tanto tras invertir un tiempo en mi propia autoformación me dispuse a desarrollar una de las ideas que tenía en la cabeza en base a un tema que tenía que explicar en el citado máster, por lo que me dispuse a llevar el proyecto a la realidad y así fue como me hice con esta serie de artilugios que muestro en la anterior foto no costándome todo el conjunto más de 13-14€ (dándome además juego para reutilizarlos en otros prototipos). Así pues, lo que se ve sería lo siguiente (que sólo menciono pero no describo ya que me interesa más centrarme en el análisis posterior):



En total, a nivel unitario no me gasté más de 13€ que me lo gasto cualquier fin de semana en unas pocas cervezas y tapas que no siempre me ayudan a mejorar la salud...


El circuito anterior se base en el siguiente esquema:


Sin embargo, yo añado un componente adicional como es el lector de tarjetas SD y permito que el arduino nano conecte la lectura de las revoluciones por segundo con dicho lector de tarjetas para que guarde lecturas cada 5 segundos. Más informaciones sobre las conexiones en concreto que hay que hacer estarían en mi git y en concreto aquí: https://github.com/FJROAR/ArduinoIoTVentialdores


A continuación dejo las conexiones realizadas (por si alguien se quiere poner a reproducir el experimento) que utilicé destacando la del pin D2 que es la que cuenta las revoluciones por minuto del ventilador y va al cable amarillo, mientras que los cables rojos van a los 5V que proporciona arduino y el negro va a tierra:


Elemento

Pin Arduino Nano

Ventilador (control)

D9

Botón ON/OFF

D5

Ventilador (TACH)

D2

Módulo SD – CS

D10

Módulo SD – MOSI

D11

Módulo SD – MISO

D12

Módulo SD – SCK

D13

Pues bien, el sistema anterior escribe en un fichero denominado RPM.txt el cual he vuelto a regenerar, ya en casa hoy domingo 01-02-2026 que lo ejecuté durante unos 11 minutos a partir de las 11.29 eliminado el primer minuto que es cuando el motor se pone en marcha y va pillando rodaje. Por tanto, he dejado las últimas 120 lecturas que se han tomado cada 5 segundos y se guardan en un fichero que he renombrado como RPM_20260201_113000.txt, que podéis observar en el git al que he hecho mención. Dicho fichero tiene la siguiente estructura que se resume con la siguiente imagen:



Es a partir de aquí en el que comienza el trabajo del Data Scientist, en el que lo primero que se va a hacer es crear un programa python que me construya una serie temporal con 2 variables, en una el tiempo, donde la primera observación va a ser 20260201113000, la siguiente 20260201113005 y así sucesivamente, mientras que la segunda variable contendrá el dato del valor de las RPM y se denominará rpm.


El programa python denominado AnalisisRPM01 que está también el git de este proyecto permite no sólo preparar los datos si no mostrar los siguientes gráficos:



Donde claramente se muestran una serie de anomalías y es que frente a su funcionamiento normal, yo le he metido un bolígrafo físicamente a las aspas del ventilador que obviamente hacía que se detuviese o casi se detuviese y en consecuencia, en función de la intensidad, la caída de las revoluciones por minuto es más que evidente.


Y ahora es cuando metemos el análisis no supervisado y nos preguntamos ¿Puede detectarse lo anterior sin recurrir a un método heurístico? ¿Que pasaría si quiero controlar más variables? Es aquí donde aparece una función de la librería sklearn de python y que se denomina GaussianMixture(). Esta función es capaz de hacer uso de normales multivariantes para trabajar con varias variables y detectar los correspondientes atípicos, en concreto, para este caso en el que hay una única variable el siguiente fragmento de código resulta clave para establecer un punto de corte y es totalmente extrapolable, con tan solo modificar el parámetro n_components al número de variables a considerar:


from sklearn.mixture import GaussianMixture


X_rpm = df[['RPM']].values

modelo_gmm = GaussianMixture(n_components=1,

n_init=5,

random_state=0)

modelo_gmm.fit(X_rpm)

score = modelo_gmm.score_samples(X_rpm)

pct_threshold = np.percentile(score, 3)

df['anomalia'] = [1 if s < pct_threshold else 0 for s in score]


El anterior fragmento detectará las anomalías al percentil del 3% y por tanto sólo queda observar si es capaz de detectarlas, cosa que si lo consigue tal y como se observa a continuación:



En este caso se ha ido hacia anomalías muy graves, pero en función de análisis tipo coste beneficio se puede pensar en si cambiar el percentil del 3% por otro por ejemplo del 5% con tan sólo modificar la línea:


pct_threshold = np.percentile(score, 5)


En ese caso, el coste del mantenimiento del sistema sería más elevado ya que la probabilidad de una revisión sería mayor, pero obviamente, se podría detectar una mayor cantidad de errores. Lo anterior se obtiene re-ejecutando el programa y cambiando el 3 por el 5 llegándose a:



Todo lo realizado cabe ser resumido como un recurso didáctico listo para hacer una introducción al análisis de anomalías con python. Para ello he creado un artilugio mecánico que puede usarse directamente en clase ya que es muy visual y de reducido tamaño mediante arduino ide. El artilugio genera datos que posteriormente son analizados mediante un programa python que los recoge de una determinada ubicación y genera por un lado unos gráficos exploratorios y finalmente introduce una función específica del entorno sklearn como es GaussianMixture() para que literalmente se cree un método que a partir de los datos y sin supervisión previa se detecten automáticamente los puntos de incidencia de modo que se puede ser más o menos fino en esa detección y el método es generalizable a una cantidad p de variables cualesquiera, no sólo una.


Finalmente espero que sea de utilidad este tipo de entradas y desde luego si alguien las valora y desea más información puede contactarme al respecto vía Linkedin o/y suscribirse al este blog donde iré creando más recursos como este.

Comentarios


© 2021 by Francisco J. Rodríguez Aragón. Proudly created with Wix.com

bottom of page