Slide 1

Slide 1 text

Twitter Breakout Detection Para detección de anomalías en series de datos

Slide 2

Slide 2 text

$ whoami Valery Calderón Briz @valerybriz guatebot.com/blog Ingeniera en Telecomunicaciones Systems Development Specialist en Skyguard GPS Co-fundadora de @PythonGuatemala

Slide 3

Slide 3 text

Soy de Guatemala

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Breakout Detection Este paquete desarrollado en el Lenguaje R por Twitter sirve para detectar cambios o anomalías en una serie de datos respecto al tiempo. Pueden encontrar más información del paquete en: http://bit.ly/bkoutinthewild

Slide 6

Slide 6 text

¿Cómo funciona el Breakout Detection? Usualmente las anomalías o breakouts están caracterizadas por dos estados que se mantienen y un período de transición intermedia. Para detectar esto el paquete utiliza una técnica de estadísticas llamada E-Divisive with Medians (EDM) que es utilizada ampliamente para detectar cambios de nivel o saltos. Documentación en: http://bit.ly/edmBreakingBad

Slide 7

Slide 7 text

¿Cómo funciona el EDM? • Detección de Divergencia • Mean Shift • Ramp Up • Detección de cambios en la distribución

Slide 8

Slide 8 text

Mean Shift

Slide 9

Slide 9 text

Mean Shift

Slide 10

Slide 10 text

Ramp Up

Slide 11

Slide 11 text

Cambios en la distribución

Slide 12

Slide 12 text

Ventajas • Es robusto en presencia de anomalías. • EDM no es paramétrico. • Es más rapido que otros algorítmos.

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Robusto en presencia de anomalías Las anomalías no son lo mismo que un Breakout

Slide 15

Slide 15 text

Robusto en presencia de anomalías

Slide 16

Slide 16 text

EDM no es paramétrico

Slide 17

Slide 17 text

Data Points E-Divisive EDM 6,000 29 Min. 24 Seg. 600 7 Seg. 1 Seg. 3.5x más rápido que otros algoritmos Fuente: https://anomaly.io/anomaly-detection-using-twitter-breakout/ De detección de Breakouts

Slide 18

Slide 18 text

Desventajas • Se debe combinar con otros algorítmos si se necesita descartar breakouts específicos. • Es necesario encontrar la combinación correcta de parametros dependiendo de la serie de datos.

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Escalar datos de 0 a 1 zi = xi - min(x) max(x) - min(x) Valor = ( x - ValorMinX ) / ( ValorMaxX - ValorMinX ) )

Slide 21

Slide 21 text

1 Data: Serie de datos que serán analizados. 2 Min.size: El valor minimo de observaciones entre puntos de cambio. 3 Method: "amoc" (al menos un cambio) o "multi" (multiples cambios). 4 Degree: El grado de regresión polinomial. 5 Beta: Constante paraun futuro control en la penalización. 6 Plot: Este indica si se generará un Ploteo luego de la ejecución. Las variables del algoritmo

Slide 22

Slide 22 text

Instalación de R # sudo apt-key adv --keyserver keyserver.ubuntu.com -- recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 # sudo add-apt-repository 'deb [arch=amd64,i386] https://cran.rstudio.com/bin/linux/ubuntu xenial/‘ # sudo apt-get update # sudo apt-get install r-base # sudo apt-get install libssl-dev

Slide 23

Slide 23 text

Instalación del paquete # sudo -i R > install.packages("devtools") > devtools::install_github("twitter/BreakoutDetection") > library(BreakoutDetection)

Slide 24

Slide 24 text

Código en R library(BreakoutDetection) Detect <- function(tsdata, min, met, deg ) { res = breakout(tsdata, min.size=min, method=met, beta=.001, degree=deg, plot=FALSE) return(res) }

Slide 25

Slide 25 text

Requerimientos en Python # sudo pip rpy2 # sudo pip install pandas # sudo pip install numpy

Slide 26

Slide 26 text

Importando desde R from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage from rpy2.robjects.packages import importr from rpy2.robjects.vectors import IntVector, FloatVector import rpy2.robjects as ro

Slide 27

Slide 27 text

Obteniendo los datos mydata = [] with open('datos.csv', 'r') as csvfile: dat = csv.reader(csvfile) for line in dat: mydata.append(float(line[0]))

Slide 28

Slide 28 text

Importando desde R minsize = 30 method = 'multi' degree = 0 with open('Codigo.R') as code: rcode = os.linesep.join(code.readlines()) wrapper = SignatureTranslatedAnonymousPackage(rcode, "Codigo")

Slide 29

Slide 29 text

Ejecutando la función result = wrapper.Detect( FloatVector(mydata), minsize, method, degree) print (result) >>>>>> $loc [1] 74 116 147 177 209 $time [1] 0.013 $pval [1] NA

Slide 30

Slide 30 text

Obteniendo los datos relevantes if len(result) > 0 : for val in result[0]: print (val) >>>>>> 74 116 147 177 209

Slide 31

Slide 31 text

Resultados A1 min.size=25, method='multi', beta=.001, degree=1

Slide 32

Slide 32 text

Resultados A2 min.size=50, method='multi', beta=.001, degree=2

Slide 33

Slide 33 text

Caso Práctico: Sensor de combustible

Slide 34

Slide 34 text

Resultados B1 min.size=100, method='multi', beta=.001, degree=1

Slide 35

Slide 35 text

Resultados B2 min.size=30, method='multi', beta=.001, degree=2

Slide 36

Slide 36 text

Resultados B3 min.size=30, method='multi', beta=.001, degree=0

Slide 37

Slide 37 text

Resultados B4 min.size=30, method='multi', beta=.001, degree=1

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

Preguntas / comentarios @valerybriz [email protected]