Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SoraVargasDiegoFelipe2019
SoraVargasDiegoFelipe2019
Director:
Alejandro Paolo Daza
Revisor:
Jhon Freddy Parra
INTRODUCCIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
I CONTEXTUALIZACIÓN DE LA INVESTIGACIÓN 9
1. DESCRIPCIÓN DE LA INVESTIGACIÓN 11
1.1. Planteamiento del problema . . . . . . . . . . . . . . . . . . . . . . . 11
1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.1. Objetivo general . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.2. Objetivos especı́ficos . . . . . . . . . . . . . . . . . . . . . . . 12
1.3. Justificación de la investigación . . . . . . . . . . . . . . . . . . . . . 12
1.3.1. Justificación metodológica . . . . . . . . . . . . . . . . . . . . 12
1.4. Hipótesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5. Marco referencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.1. Marco Teórico . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.2. Marco Conceptual . . . . . . . . . . . . . . . . . . . . . . . . 25
1.5.3. Marco Espacial . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.6. Metodologı́a de la investigación . . . . . . . . . . . . . . . . . . . . . 28
1.7. Organización del trabajo de grado . . . . . . . . . . . . . . . . . . . . 29
1.8. Estudios de sistemas previos . . . . . . . . . . . . . . . . . . . . . . . 30
II DESARROLLO DE LA INVESTIGACIÓN 31
2. RECOPILACIÓN Y PREPROCESAMIENTO DE DATOS 33
2.1. Tecnologı́as de apoyo . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2. Fase I. Comprensión del negocio . . . . . . . . . . . . . . . . . . . . . 34
2.3. Fase II. Estudio y comprensión de los datos . . . . . . . . . . . . . . 36
2.4. Fase III. Preparación de los datos . . . . . . . . . . . . . . . . . . . . 43
3
4 ÍNDICE GENERAL
5. CONCLUSIONES 75
5.1. Verificación, contraste y evaluación de los objetivos . . . . . . . . . . 75
5.2. Sı́ntesis del modelo propuesto . . . . . . . . . . . . . . . . . . . . . . 76
5.3. Aportes originales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4. Trabajos o Publicaciones derivadas . . . . . . . . . . . . . . . . . . . 76
BIBLIOGRAFÍA 79
REFERENCIAS WEB 83
A. Módulos Python 85
Índice de figuras
5
6 ÍNDICE DE FIGURAS
7
8
Parte I
CONTEXTUALIZACIÓN DE LA
INVESTIGACIÓN
9
Capı́tulo 1
DESCRIPCIÓN DE LA
INVESTIGACIÓN
11
12 CAPÍTULO 1. DESCRIPCIÓN DE LA INVESTIGACIÓN
1.2. Objetivos
1.2.1. Objetivo general
Validar el modelo árboles de decisión como técnica de minerı́a de datos para el
análisis de la incidencia de los factores externos en la ocurrencia de siniestros viales.
1.4. Hipótesis
Construir una herramienta que analice el comportamiento de las variables externas
presentes en los siniestros viales, ayudará a sustentar la toma de decisiones en cuanto
a planes de acción para disminuir la cifra de vı́ctimas fatales en accidentes de tránsito
presentados en la ciudad.
14 CAPÍTULO 1. DESCRIPCIÓN DE LA INVESTIGACIÓN
Minerı́a de datos
La minerı́a de datos consiste en la extracción de información sensible que reside
de manera implı́cita en los datos. Dicha información es previamente desconocida y
podrá resultar útil para algún proceso. En otras palabras, la minerı́a de datos prepara,
1.5. MARCO REFERENCIAL 15
sondea y explora los datos para sacar la información oculta de ellos, de modo que un
pequeño hallazgo, una pequeña relación que se descubre, puede ser un hecho de gran
impacto en las ventas de una compañı́a. [2]
Otros términos relacionados pueden entenderse de manera similar al de la minerı́a
de datos son: minerı́a de conocimiento de datos, extracción de conocimiento, análisis
de datos y patrones, arqueologı́a de datos y dragado de datos. [3]
Entonces, la minerı́a de datos consiste en un conjunto de metodologı́as estadı́sticas
y computacionales que, junto a un enfoque desde las ciencias de la conducta, permite
el análisis de datos y la elaboración de modelos matemáticos descriptivos y predictivos
de la conducta del consumidor. [2]
La gran aplicación de la minerı́a de datos hace que sea posible incorporar técnicas
de otros campos de estudio, como por ejemplo la estadı́stica, sistemas de bases de
datos, machine learning, reconocimiento de patrones, entre otros.
Un proceso tı́pico de minerı́a de datos consta de los siguientes pasos generales:
1. Selección del conjunto de datos, tanto en lo que se refiere a las variables objetivo
(aquellas que se quiere predecir, calcular o inferir), como a las variables inde-
pendientes (las que sirven para hacer el cálculo o proceso), como posiblemente
al muestreo de los registros disponibles.
2. Análisis de las propiedades de los datos, en especial los histogramas, diagramas
de dispersión, presencia de valores atı́picos y ausencia de datos (valores nulos).
3. Transformación del conjunto de datos de entrada, se realizará de diversas formas
en función del análisis previo, con el objetivo de prepararlo para aplicar la
técnica de minerı́a de datos que mejor se adapte a los datos y al problema, a
este paso también se le conoce como pre-procesamiento de los datos.
4. Seleccionar y aplicar la técnica de minerı́a de datos, se construye el modelo
predictivo, de clasificación o segmentación.
5. Extracción de conocimiento, mediante una técnica de minerı́a de datos, se
obtiene un modelo de conocimiento, que representa patrones de comportamiento
observados en los valores de las variables del problema o relaciones de asociación
entre dichas variables. También pueden usarse varias técnicas a la vez para
generar distintos modelos, aunque generalmente cada técnica obliga a un pre
procesado diferente de los datos.
6. Interpretación y evaluación de datos, una vez obtenido el modelo, se debe
proceder a su validación comprobando que las conclusiones que arroja son
válidas y suficientemente satisfactorias [11].
16 CAPÍTULO 1. DESCRIPCIÓN DE LA INVESTIGACIÓN
Regresión logı́stica
La regresión logı́stica es un procedimiento cuantitativo que puede usarse como
método descriptivo, donde la variable dependiente tomas valores en un conjunto finito.
Para construir un modelo de regresión logı́stica se requiere de [12]:
Un conjunto de variables independientes o predictoras y una variable respuesta
dicotómica.
Los parámetros del modelo se calculan usando una estimación de máxima
verosimilitud.
No incluir variables innecesarias al modelo.
Ninguna variable relevante debe ser excluida.
La colinealidad es un problema como ocurre en la regresión lineal múltiple.
El modelo de regresión logı́stica puede describirse como:
p
log = b0 + b1 x1 + ... + bn xn (1.1)
1−p
Donde,
p es la probabilidad (riesgo) de que ocurra el evento de interés,
x, las variables independientes
b, los coeficientes asociados a cada variable.
La regresión logı́stica puede usarse para fines explicativos, donde se busca explicar la
relación de una variable con otras; o para fines predictivos, que es cuando se estima
el comportamiento de una variable en función de las otras variables que influencian
su comportamiento.
Una vez identificadas las funciones discriminantes a partir de las variables expli-
cativas, similares a las ecuaciones de regresión lineal múltiple, se puede realizar la
clasificación en dos grupos o clasificación en mas de dos grupos (análisis discriminante
múltiple). El modelo de análisis discriminante múltiple puede describirse como:
Cada una de las funciones discriminantes Di se obtiene como función lineal de las k
variables explicativas.
Donde,
Los G − 1 ejes vienen definidos respectivamente por los vectores u1 , u2 , ..., uG−1
u11 u21 uG−1,1
u12 u22 uG−1,2
u1 = , u2 = ,..., uG−1 =
.. .. ..
. . .
u1k u2k uG−1,k
Árboles de decisión
Los árboles de decisión son utilizados para representar y categorizar una serie de
condiciones que ocurre de forma sucesiva para la resolución de problemas. Se pueden
definir como un mapa de posibles resultados de una serie de decisiones relacionadas,
que comienza con un único nodo y luego se ramifica en resultados posibles. Cada
uno de esos resultados posibles crea nodos adicionales que se ramifican en otras
posibilidades.
Existe tres diferentes nodos: nodos de probabilidad, nodos de decisión y nodos
terminales. Los nodos de probabilidad muestran las probabilidades de ciertos resul-
tados. Un nodo de decisión muestra una decisión que se tomará y el nodo terminal
muestra el resultado definitivo de una ruta de decisión [14].
18 CAPÍTULO 1. DESCRIPCIÓN DE LA INVESTIGACIÓN
1. Nodo raı́z: inicio del árbol de decisión, se plantea la decisión entre alternativas
con resultados desconocidos.
2. Nodos de decisión: caminos de acción que pueden ser elegidos por el tomador
de decisión después de haber analizado los resultados de decisiones previas.
a+d
AC =
a+b+c+d
d
P =
b+d
Donde,
Donde,
IG(A,S) es la Ganancia de la información del conjunto S dividiéndolo mediante el
atributo A.
H(S) es la entropı́a del conjunto de datos S.
T son los subconjuntos de clases de S dividido por el atributo A.
p(t) la proporción de elementos de la clase t sobre el cardinal de S.
H(t) es la entropı́a del subconjunto t.
El KDD fue presentado por Fayyad en 1996, donde propone 5 fases secuenciales,
las cuales deben llevarse a cabo para poder descubrir conocimiento sobre un conjunto
de datos de estudio.
Estas fases son las siguientes, selección, preprocesamiento, transformación, minerı́a
de datos y evaluación e implantación.
Esta metodologı́a es propuesta por compañı́a SAS Institute Inc, la cual está
24 CAPÍTULO 1. DESCRIPCIÓN DE LA INVESTIGACIÓN
compuesta por 5 fases, que son: Sample, Explore, Modify, Model, Assess (Muestreo,
Exploración, Modificación, Modelado y Evaluación).
Principales Vı́as
Subsistema Red Metropolitana
- Avenida de las Américas. Hace parte del Sistema Transmilenio
- Avenida Manuel Cepeda Vargas
- Avenida Centenario (CL 13)
- Avenida Ciudad de Quito
- Avenida Cuidad de Villavicencio
- Avenida Ciudad de Cali
- Avenida Bosa
- Avenida Primero de Mayo
- Avenida Congreso Eucarı́stico (AK 68)
- Avenida Ferrocarril del Sur
Subsistema Ciudad – Región
- Avenida Longitudinal de Occidente (ALO)
- Avenida Boyacá
1.5. MARCO REFERENCIAL 27
- Autopista Sur
Subsistema Malla Arterial Complementaria
- Avenida Castilla (KR 78)
- Avenida Poporo Quimbaya
- Avenida del Rı́o
- Avenida Agoberto Mejia Cifuentes (KR 80)
- Avenida de la Constitución
- Avenida Santa Fe
- Avenida de los Muiscas
- Avenida Alsacia
- Avenida Tintal
28 CAPÍTULO 1. DESCRIPCIÓN DE LA INVESTIGACIÓN
Fase I. Comprensión del negocio: Se tendrá en cuenta los objetivos del pro-
yecto para identificar la mejor fuente de información para el mismo.
Fase II. Estudio y comprensión de los datos: Una vez se tenga la fuente de da-
tos, se descargarán y se estudiarán sus caracterı́sticas, esto con el fin de familiarizarse
con los datos y su relevancia dentro del estudio.
Fase III. Preparación de los datos: En esta fase, se empezará con el tratamiento
de los datos, normalizando y unificándolos con el fin de tener una única fuente de
información para el análisis.
Fase IV. Modelado: Aquı́ se aplicará la técnica de árboles de decisión, para el
estudio de las caracterı́sticas del set de datos construido. Al finalizar, se transformará
dicho árbol en código para su fácil ejecución.
Fase V. Evaluación: En esta fase se revisará el modelo obtenido, y se contrastará
con los objetivos planteados.
Fase VI. Despliegue: En esta fase se plantea llegar a la implementación del modelo
elegido, debido al alcance del proyecto.
1.7. ORGANIZACIÓN DEL TRABAJO DE GRADO 29
CAPÍTULO 5. CONCLUSIONES
En este capı́tulo se expresan las conclusiones del trabajo de investigación.
DESARROLLO DE LA
INVESTIGACIÓN
31
Capı́tulo 2
RECOPILACIÓN Y
PREPROCESAMIENTO DE
DATOS
33
34 CAPÍTULO 2. RECOPILACIÓN Y PREPROCESAMIENTO DE DATOS
Caracterı́stica Descripción
fecha Fecha en la que se registra el accidente.
gravedadnombre Descripción de la gravedad del accidente.
clasenombre Clasificación del tipo de accidente.
choquenombre Identifica con que tipo de objeto se produjo
el accidente.
objetofijonombre Identifica con que tipo de objeto fijo se pro-
dujo el accidente.
direccion Indica la dirección del accidente.
tipovia Indica si el lugar donde se presentó el acci-
dente es una calle, carrera, etc.
localidad Nombre de la localidad donde se presentó el
accidente.
horaocurrencia Hora en la que se presentó el accidente.
tipodiseño Nombre de la estructura vial donde se pre-
sentó el accidente (Glorienta, tramo via, in-
tersección, etc.).
tipotiempo Indica el tipo de tiempo o clima presente en
el accidente.
totalmuertos Número de muertos registrados en el acciden-
te.
totalheridos Número de heridos registrados en el accidente.
causaconductoridesc Descripción de la causa, si la autoridad de
tránsito determina que pertenece al conduc-
tor.
causapeatonidesc Descripción de la causa, si la autoridad de
tránsito determina que pertenece al peatón.
causavehiculoidesc Descripción de la causa, si la autoridad de
tránsito determina que pertenece al vehı́culo.
causapasajeroidesc Descripción de la causa, si la autoridad de
tránsito determina que pertenece al pasajero.
Fuente: Diseño propio.
2.3. FASE II. ESTUDIO Y COMPRENSIÓN DE LOS DATOS 39
Al validar el formato del atributo fecha que posee el año 2017, se encuentra que
difiere de los de los años 2015 y 2016, por lo que se hace necesario estandarizar
estos valores. De igual modo, vemos que existen palabras que contienen letras como
la ‘ñ’, y puede provocar algunos errores al momento de usar las herramientas de
procesamiento, ası́ que se ha tomado la decisión de reemplazarlas por la letra ‘n’.
40 CAPÍTULO 2. RECOPILACIÓN Y PREPROCESAMIENTO DE DATOS
En la figura 2.5, se puede observar esta misma tendencia en los datos, esta vez
marcando la cantidad de accidentes distribuidos por la gravedad de los mismos. Como
se observa, los accidentes marcados con la lı́nea naranja (accidentes registrados con
muertes) está presente a lo largo de todas las horas del dı́a, pero su valor es muy
pequeño en comparación a los demás accidentes registrados (826 casos, que equivalen
al 0.942 % del total de datos del dataset).
2.3. FASE II. ESTUDIO Y COMPRENSIÓN DE LOS DATOS 41
accidentes donde sólo se registran daños a los vehı́culos, está al rededor de la una y
las tres de la tarde.
Proceso ETL
Para manipular el gran conjunto de datos recopilado, nos apoyamos en el software
de integración de datos, Pentaho Data Integration. Version 8.1, en donde se crearon
diferentes transformaciones, enlazadas dentro de un job, para la consolidación de una
única base de datos NoSQL.
En la imagen 2.9, podemos ver el Job creado para el tratamiento de los datos
asociados a la accidentalidad en la ciudad de Bogotá, este está compuesto prin-
2.4. FASE III. PREPARACIÓN DE LOS DATOS 45
Las transformaciones fueron creadas para que cumplan cuatro tareas fundamenta-
les:
AccidentesXMLTransformation: En esta transformación se procesan los dataset
descargados en formato XML, y se exporta un solo archivo de extensión csv.
Accidentes2017Transformation: Esta transformación trabaja sobre el dataset en
formato csv, exportando un archivo del mismo tipo.
CSVConsolidado: Esta transformación es la encargada de generar un consolidado
total de los datos relacionados al estudio.
CargueBD: En esta transformación se toma el consolidado total de los registros
trabajados y se cargan a una base de datos Mongo, para su posterior uso.
La figura 2.11 muestra las condiciones usadas para el filtrado de los registros, para
este estudio se determinó trabajar con todas las localidades de la ciudad de Bogotá y
cuyo tipo de accidente corresponda a choque o volcamiento.
1. El dı́a de la semana.
2. Un valor para identificar si el dı́a de accidente fue festivo o no.
3. Un valor para indicar si el accidente ocurrió dentro de la franja de pico y placa
que está determinada para la ciudad de Bogotá, cuyo horario es de 06:00 a
08:30 y de 15:00 - 19:30.
Para calcular y actualizar estas variables dentro de la base de datos, se crean
varios archivos, uno principal llamado “procesamientoDataSet.py”, que contiene la
orquestación de las acciones necesarias para la actualización de variables y el archivo
“Funciones.py”, que contiene la lógica de cálculo y actualización de las mismas.
1016 finally :
#C i e r r e de l a c o n e x i o n a Base de Datos
1018 client . close ()
p r i n t ( ” Conexion c e r r a d a . ” )
50 CAPÍTULO 2. RECOPILACIÓN Y PREPROCESAMIENTO DE DATOS
El archivo Funciones.py tiene toda la lógica del cálculo de las variables ante-
riormente descritas y almacenadas en la base de datos de trabajo. En el siguiente
fragmento, se pueden ver algunas funciones de este archivo (Para ver en detalle las
funciones del archivo, dirigirse a los anexos).
1000 c l a s s Funciones ( ) :
# A c t u a l i z a l o s documentos con e l a t r i b u t o de d i a F e s t i v o
1002 d e f a c t u a l i z a D i a F e s t i v o ( s e l f , conn , d i a s L i s t ) :
””” ” A c t u a l i z a e l DataSet con l o s d i a s f e s t i v o s ”””
1004 #Se a c t u a l i z a n t o d o s l o s r e g i s t r o s con un nuevo campo llamado ’
F e s t i v o ’ su v a l o r i g u a l a ’No ’
conn . update many ( { } , {” $ s e t ” : { ” F e s t i v o ” : ”No” } } )
1006
#A c t u a i l z a c i o n de l o s r e g i s t r o s de l a Base de Datos en f u n c i o n de
l a s f e c h a s cargadas ( A c t u a l i z a c i o n a ” Festivo ”:” Si ”)
1008 for l i n e in diasList :
conn . update many ( { ’ F e c h a O c u r r e n c i a ’ : l i n e . s t r i p ( ) } , {” $ s e t ” : { ”
Festivo ” : ” Si ” }})
1010
p r i n t ( ” Fin de l a a c t u a l i z a c i o n de r e g i s t r o s con d i a f e s t i v o . ” )
1012
# A c t u a l i z a l o s documentos con e l a t r i b u t o d e l d i a de l a semana
1014 d e f a c t u a l i z a D i a S e m a n a ( s e l f , conn , ) :
””” ” A c t u a l i z a e l DataSet con e l d i a de l a semana ”””
1016 # Se buscan t o d a s l a s f e c h a s d e l data s e t
l i n e s = conn . d i s t i n c t ( ” F e c h a O c u r r e n c i a ” )
1018
for l i n e in l i n e s :
1020 sp = l i n e . s p l i t ( ”−” )
f e c h a = d a t e ( i n t ( sp [ 0 ] ) , i n t ( sp [ 1 ] ) , i n t ( sp [ 2 ] ) )
1022 conn . update many ( { ’ F e c h a O c u r r e n c i a ’ : l i n e . s t r i p ( ) } , {” $ s e t ” : { ”
DiaSemana” : diaSemana [ f e c h a . weekday ( ) ] } } )
1000 2015−01−01
2015−01−12
1002 2015−03−23
2015−03−29
1004 2015−04−02
2015−04−03
1006 2015−04−05
2015−05−01
1008 2015−05−18
2015−06−08
1010 2015−06−15
...
DISEÑO Y CONSTRUCCIÓN
DEL PROTOTIPO
Dando un vistazo a la figura 3.1, se puede identificar los tipos de variables existentes
dentro del dataset. Estas son las variables numéricas discretas y las variables categóri-
cas, también se puede observar al final del mismo la variable “GravedadAccidente”, la
cual será variable objetivo para el modelo.
57
58 CAPÍTULO 3. DISEÑO Y CONSTRUCCIÓN DEL PROTOTIPO
1012 f o r key , v a l i n d i c t A t r b A c c i d e n t e s . i t e m s ( ) :
f o r idx , v i n enumerate ( v a l ) :
1014 data = ( key , ” : ” , v , ” : ” , s t r ( i d x ) , ”\n” )
# p r i n t ( data )
1016 f . w r i t e l i n e s ( data )
1018 except :
p r i n t ( ” E r r o r : No s e pudo c r e a r e l a r c h i v o ” , f i l e )
1020 finally :
f . close ()
Una vez teniendo los valores para la normalización de cada una de las variables,
son aplicadas al dataset. En la figura 3.2, se puede observar el resultado al aplicar la
normalización anteriormente descrita.
Técnica Precisión
Regresión logı́stica 0.782499
Análisis de Discriminación Lineal 0.775698
Clasificador de Vecinos Cercanos 0.743117
Árbol de Decisión 0.780246
Clasificador Bayesiano 0.764305
Fuente: Diseño propio.
3.1. FASE IV. MODELADO 61
1000 d e f p r o f u n d i d a d A r b o l ( p r e d i c t o r s , X, y , s e e d ) :
1002 accuracies = l i s t ()
depth range = range (1 , len ( p r e d i c t o r s ) + 1)
1004 print ( depth range )
# I t e r a c i o n para cada una de l a s p o s i b l e s p r o f u n d i d a d e s d e l a r b o l ,
basado en l a s c a r a c t e r i s t i c a s d e l d a t a s e t
1006 f o r depth i n d e p t h r a n g e :
model = D e c i s i o n T r e e C l a s s i f i e r ( c r i t e r i o n= ’ e n t r o p y ’ ,
1008 m i n s a m p l e s s p l i t =10 ,
m i n s a m p l e s l e a f =5,
1010 max depth = depth )
k f o l d = m o d e l s e l e c t i o n . KFold ( n s p l i t s =10 , r a n d o m s t a t e=s e e d )
1012
c v r e s u l t s = m o d e l s e l e c t i o n . c r o s s v a l s c o r e ( model , X, y , cv=k f o l d ,
s c o r i n g=s c o r i n g )
1014 a c c u r a c i e s . append ( c v r e s u l t s . mean ( ) )
1016 # Mostramos l o s r e s u l t a d o s o b t e n i d o s
d f = pd . DataFrame ( { ” Profundidad Max” : d e p t h r a n g e , ” P r e c i s i o n Promedio ”
: a c c u r a c i e s })
1018 p r i n t ( d f . t o s t r i n g ( i n d e x=F a l s e ) )
Como se observa en la figura 3.3, en cuanto los niveles de profundidad del árbol
de decisión son más bajos, la precisión en más alta (alcanzando una precisión del
78.2499 %), y a medida que la profundidad aumenta, su precisión disminuye hasta
3.1. FASE IV. MODELADO 63
1004 #Carga d a t a s e t
p r i n t ( ” Cargue d a t a s e t ” )
1006 d a t a s e t = pd . r e a d c s v ( d a t a s e t F i l e )
Como se puede observar en el fragmento de código anterior, los datos del dataset
son cargados, y con la ayuda de la función dropna() de Pandas se eliminan los
registros donde haya ausencia de alguna de las variables definidas para el estudio,
esto es necesario ya que los algoritmos no permite valores nulos o faltantes dentro del
conjunto de entrenamiento.
El resultado de la función dropna elimina 11 registros, cuyo valor ausente es el estado
del tiempo, la cantidad de registros eliminados corresponden al 0.012 % del total de
datos del dataset, y se pueden ver en la imagen 3.4.
Por lo anterior, no se ve necesario reconstruir esta información, debido a que la
mayorı́a corresponde a la categorı́a de Solo Daños y el dataset cuenta con más de
60000 registros de este tipo.
GravedadAccidente Cantidad
Con Heridos 18714
Con Muertos 826
Solo Daños 68127
Fuente: Diseño propio.
Una vez construidos los modelos, estos son puestos a prueba haciendo que predigan
los registros del dataset, se realizan pruebas iterando este proceso 100, 1000 y 10000
3.1. FASE IV. MODELADO 65
veces. Los resultados se pueden apreciar en la siguiente tabla (los valores está dados
en milisegundos).
Modelos / Iteración 100 1000 10000
Regresión logı́stica 27624 28206 28291
Árbol de Decisión Prof. 1 24446 23558 23768
Árbol de Decisión Prof. 2 24186 24757 24347
Árbol de Decisión Prof. 3 25745 26548 26123
Árbol de Decisión Prof. 4 25815 26946 26996
Fuente: Diseño propio.
De acuerdo a los resultados obtenidos, el modelo que presenta mejor rendimiento
y mayor precisión es el Árbol de Decisión de 1 nodo de profundidad, por lo cual se
procede a la construcción de este modelo.
1000 d e f c o n s t r u i r A r b o l ( depth , X, y , X v a l i d a t i o n , Y v a l i d a t i o n ) :
#C o n s t r u i r e l a r b o l
1002 model = D e c i s i o n T r e e C l a s s i f i e r ( c r i t e r i o n= ’ e n t r o p y ’ ,
m i n s a m p l e s s p l i t =10 ,
1004 m i n s a m p l e s l e a f =5,
max depth = depth )
1006 model . f i t (X, y )
1018 p r e d i c t i o n s = model . p r e d i c t ( X v a l i d a t i o n )
p r i n t ( ’ ∗ ’ ∗4 , ’ P r e c i s i o n ’ , ’ ∗ ’ ∗4)
1020 print ( accuracy score ( Y validation , predictions ) )
p r i n t ( ’ ∗ ’ ∗ 2 , ’ Matriz de c o n f u s i o n ’ , ’ ∗ ’ ∗ 2 )
1022 print ( confusion matrix ( Y validation , predictions ) )
p r i n t ( ’ ∗ ’ ∗ 1 3 , ’ Reporte de c l a s i f i c a c i o n ’ , ’ ∗ ’ ∗ 1 3 )
1024 print ( c l a s s i f i c a t i o n r e p o r t ( Y validation , predictions ) )
66 CAPÍTULO 3. DISEÑO Y CONSTRUCCIÓN DEL PROTOTIPO
En la figura 3.7 se pueden apreciar los resultados del modelo generado sobre el
conjunto de datos de prueba (matriz de confusión).
En la figura 3.8 se observa la misma relación que en la figura 3.7, pero esta vez
indicando el porcentaje de aciertos, donde para la categorización de “Con Heridos”fue
del 4 % y para la categorı́a de “Solo Daños” fue del 99.7 %:
CIERRE DE LA
INVESTIGACIÓN
69
Capı́tulo 4
RESULTADOS Y DISCUSIÓN
Una vez revisada la literatura relacionada con análisis de datos, técnicas de mi-
nerı́a de datos y junto a los resultados obtenidos de la experimentación de estas,
se decide utilizar los arboles de decisión como técnica para el análisis de acciden-
talidad en la ciudad de Bogotá, dado que tuvo los mejores resultados en cuanto
a precisión y rendimiento frente a otras técnicas como Regresión logı́stica, Análi-
sis de discriminación lineal, Clasificador de Vecinos Cercanos y Clasificador Bayesiano.
En un acercamiento al nodo raı́z generado por los algoritmos de Sklearn (ver fi-
gura 4.1 ), vemos que la caracterı́stica principal para la toma de decisiones del árbol
generado es la de “TipoAccidente”, si esta es “Choque” orienta su resultado hacia la
categorización “Solo Daños”. En cambio, si el accidente es de tipo “Volcamiento”,
orienta la categorización del accidente al resultado “Con Heridos”.
71
72 CAPÍTULO 4. RESULTADOS Y DISCUSIÓN
Debido a que este proyecto no fue definido para ser probado con valores ajenos
a los del dataset, se realizan pruebas sobre los datos de validación, estos separados
previamente en el proceso de análisis. Los resultados de este ejercicio fueron de
13814 aciertos sobre los 17534 datos de prueba, ratificando el 78.78 % de escenarios
satisfactorios.
Capı́tulo 5
CONCLUSIONES
75
76 CAPÍTULO 5. CONCLUSIONES
77
78 CAPÍTULO 6. PROSPECTIVA DEL TRABAJO DE GRADO
Este proyecto fue construido y ejecutado en un ambiente local, por lo que una
indiscutible mejora es el poder hacer uso de herramientas en la nube, donde se pueden
tener mejoras de rendimiento de los algoritmos aquı́ utilizados y disponibilidad de
la herramienta desde diversos lugares. Una posible herramienta que impulsarı́a esta
mejora es la Google App Engine, aunque existen en el mercado muchas más.
BIBLIOGRAFÍA
[2] C. Palma, W. Palma, and R. Pérez, Data Mining El arte de Anticipar. RiL
editores, 2014.
[3] J. P. Jiawei Han, Micheline Kamber, Data Mining: Concepts and Techniques.
Elsevier, 2012.
[5] A. Azevedo and M. Filipe Santos, KDD, semma and CRISP-DM: A parallel
overview. 01 2008.
79
80 BIBLIOGRAFÍA
REFERENCIAS WEB
[7] E. H. W.E Vargas, E. Mozo P, “Análisis de los puntos más crı́ticos de accidentes
de tránsito de bogotá,” [Accedido: 21-abril-2019].
[12] F. T. M. F.J, Barón López, “Apuntes de bioestadı́stica [en lı́nea].” Disponible en:
https://www.bioestadistica.uma.es/baron/apuntes/ficheros/cap08.pdf. [Accedido:
mayo-2019].
81
82 REFERENCIAS WEB
[16] Minerva, “Kdd: ¿qué es el knowledge discovery in databases o kdd? [en lı́nea].”
Disponible en: https://mnrva.io/kdd-platform.html. [Accedido: 20-mar-2019].
[18] D. Calvo, “Modelo crisp dm – data mining [en lı́nea].” Disponible en:
http://www.diegocalvo.es/modelo-crisp-drm-data-mining. [Accedido: 20-mar-
2019].
[19] L. F. Mesa, “3 tipos de análisis de datos para mejorar la toma de decisiones [en
lı́nea].” Disponible en: https://www.pragma.com.co/blog/3-tipos-de-analisis-de-
datos-para-mejorar-la-toma-de-decisiones. [Accedido: 20-oct-2018].
Módulos Python
config.cfg
1000 [DATABASE]
d b S e r v e r=mongodb : / / l o c a l h o s t : 2 7 0 1 7 /
1002 dbName=AccidentesKND
c o l l e c t i o n N a m e=A c c i d e n t e s
1004
[ FILES ]
1006 d i a s F e s t i v o s=diasFestivosYMD . t x t
n o r m a l i z a c i o n=n o r m a l i z a c i o n P a r a m e t r o s D a t a S e t . t x t
1008 exportDS=datasetHomologado . c s v
datasetCSV Homolodado=datasetHomologado . c s v
1010
[VAR]
1012 v a r i a b l e s D a t a s e t=H,M, TipoAccidente , L o c a l i d a d , ZonaAccidente , TipoTiempo ,
F e s t i v o , DiaSemana , F r a n j a P i c o y P l a c a , GravedadAccidente
v a r N o r m a l i z a c i o n=TipoAccidente , L o c a l i d a d , ZonaAccidente , TipoTiempo ,
F e s t i v o , DiaSemana , F r a n j a P i c o y P l a c a
1014 p r e d i c t o r s=H,M, TipoAccidente , L o c a l i d a d , ZonaAccidente , TipoTiempo , F e s t i v o
, DiaSemana , F r a n j a P i c o y P l a c a
t a r g e t=GravedadAccidente
1016 t a r g e t c l a s s e s=Con Heridos , Con Muertos , S o l o Danos
procesamientoDataSet.py
1000 # −∗− c o d i n g : u t f −8 −∗−
import c o n f i g p a r s e r
1002 from pymongo import MongoClient
from F u n c i o n e s import F u n c i o n e s
1004
85
86 APÉNDICE A. MÓDULOS PYTHON
1024
d e f t r a n s f o r m a c i o n D e D a t o s ( conn ) :
1026 f u n c i o n e s = Funciones ( )
print (” Actualizacion dias festivos ”)
1028 #Leer a r c h i v o de d i a s f e s t i v o s
f e s t i v o s L i s t = funciones . leerArchivo ( diasFestivosFile )
1030 #A c t u a l i z a r documentos con l o s d i a s f e s t i v o s .
f u n c i o n e s . a c t u a l i z a D i a F e s t i v o ( conn , f e s t i v o s L i s t )
1032
p r i n t ( ” A c t u a l i z a c i o n d i a de l a semana ” )
1034 #A c t u a l i z a r documentos con e l nombre d e l d i a de l a semana .
f u n c i o n e s . a c t u a l i z a D i a S e m a n a ( conn )
1036
1042 d e f n o r m a l i z a c i o n ( conn ) :
f u n c i o n e s = Funciones ( )
1044 #D e f i n i c i o n y c r e a c i o n d e l a r c h i v o de t r a n s f o r m a c i o n .
p r i n t ( ” Generando a r c h i v o de t r a n s f o r m a c i o n ” )
1046 f u n c i o n e s . n o r m a l i z a c i o n D e A t r i b u t o s ( conn , n o r m a l i z a c i o n F i l e ,
varNormalizacion )
1048 #Leer a r c h i v o de T r a n s f o r m a c i o n
transformacionList = funciones . leerArchivo ( normalizacionFile )
87
1054
d e f e x p o r t D a t a s e t ( conn ) :
1056 f u n c i o n e s = Funciones ( )
f u n c i o n e s . e x p o r t D a t a b a s e ( conn , e x p o r t F i l e , v a r i a b l e s D a t a s e t )
1058
1060 if name == ’ m a i n ’ :
try :
1062 #Se c r e a l a c o n e x i o n con e l s e r v i d o r de Base de Datos
c l i e n t = MongoClient ( d b S e r v e r )
1064 #Se i n d i c a e l Nombre de l a Base de Datos
db = c l i e n t [ dbName ]
1066 #Se i n d i c a e l Nombre de l a C o l e c c i o n
c o l l e c t i o n = db [ c o l l e c t i o n N a m e ]
1068 p r i n t ( ” Conexion e s t a b l e c i d a . ” )
1070 # Se a c t u a l i z a n r e g i s t r o s d e n t r o d e l DataSet
# transformacionDeDatos ( c o l l e c t i o n )
1072
# Se n o r m a l i z a n l o s a t r i b u t o s d e l DataSet
1074 # normalizacion ( c o l l e c t i o n )
1080 except :
print ( ” Error : Fallo a l i n t e n t a r e s t a b l e c e r conexion . ” )
1082
finally :
1084 #C i e r r e de l a c o n e x i o n a Base de Datos
client . close ()
1086 p r i n t ( ” Conexion c e r r a d a . ” )
Funciones.py
1000 # −∗− c o d i n g : u t f −8 −∗−
from d a t e t i m e import d a t e
1002 from bson . o b j e c t i d import O b j e c t I d
88 APÉNDICE A. MÓDULOS PYTHON
import r e
1004
diaSemana = [ ” Lunes ” , ” Martes ” , ” M i e r c o l e s ” , ” J u e v e s ” , ” V i e r n e s ” , ”
Sabado ” , ”Domingo” ]
1006 franjaPyP1 = [ 6 0 0 0 0 , 8 3 0 0 0 ]
franjaPyP2 = [ 1 5 0 0 0 0 , 1 9 3 0 0 0 ]
1008
1010 c l a s s Funciones ( ) :
1012 # Lee un a r c h i v o y r e t o r n a un o b j e t o L i s t
def leerArchivo ( s e l f , f i l e ) :
1014 try :
#Se l e e e l a r c h i v o i n d i c a d o
1016 f = open ( f i l e , ’ r+ ’ )
#Se g u a r d a s l a s l i n e a s l e i d a s en un o b j e t o L i s t
1018 lines = f . readlines ()
#C i e r r e de l a i n s t r u c c i o n de l e c t u r a
1020 f . close ()
1022 return l i n e s
1024 except :
p r i n t ( ” E r r o r : No s e pudo l e e r e l a r c h i v o ” , f i l e )
1026
#A c t u a i l z a c i o n de l o s r e g i s t r o s de l a Base de Datos en f u n c i o n
de l a s f e c h a s c a r g a d a s ( A c t u a l i z a c i o n a ” F e s t i v o ” : ” S i ” )
1048 for l i n e in diasList :
conn . update many ( { ’ F e c h a O c u r r e n c i a ’ : l i n e . s t r i p ( ) } , {” $ s e t ”
: { ” Festivo ” : ” Si ” }})
1050
p r i n t ( ” Fin de l a a c t u a l i z a c i o n de r e g i s t r o s con d i a f e s t i v o . ” )
1052
1068
# A c t u a l i z a l o s documentos con e l a t r i b u t o f r a n j a p i c o y p l a c a
1070 d e f a c t u a l i z a F r a n j a P i c o y P l a c a ( s e l f , conn ) :
””” ” A c t u a l i z a e l DataSet con l a f r a n j a p i c o y p l a c a ”””
1072
#Se a c t u a l i z a n t o d o s l o s r e g i s t r o s con un nuevo campo llamado ’
F r a n j a P i c o y P l a c a ’ su v a l o r i g u a l a ’No ’
1074 conn . update many ( { } , {” $ s e t ” : { ” F r a n j a P i c o y P l a c a ” : ”No” } } )
DiaSemana ’ ] != ( ’ Domingo ’ ) )
1086 and ( s e l f . dentroDeLaFranja ( franjaPyP1 , h o r a A c c i d e n t e ) o r
s e l f . dentroDeLaFranja ( franjaPyP2 , h o r a A c c i d e n t e ) ) ) :
conn . update many ( { ’ i d ’ : O b j e c t I d ( l i n e ) } , { ” $ s e t ” : { ”
FranjaPicoyPlaca ” : ” Si ” }})
1088
# A c t u a l i z a campos Hora y Minutos
1090 hms=documento [ ’ HoraOcurrencia ’ ] . s p l i t ( ’ : ’ )
p r i n t ( ” Fin de l a a c t u a l i z a c i o n de r e g i s t r o s con l a f r a n j a p i c o
y placa . ”)
1096
1098
# A c t u a l i z a campos Hora y Minutos
1100 d e f actualizaHyM ( s e l f , conn ) :
””” ” A c t u a l i z a campos Hora y Minutos ”””
1102
#Se a c t u a l i z a n t o d o s l o s r e g i s t r o s con dos campos l l a m a d o s ”H”
y ”M”
1104 conn . update many ( { } , { ” $ s e t ” : { ”H” : ” 00 ” } } )
conn . update many ( { } , { ” $ s e t ” : { ”M” : ” 00 ” } } )
1106
# Se r e a l i z a l a busqueda de t o d o s l o s documentos d e l DataSet
1108 l i n e s = conn . d i s t i n c t ( ” i d ” )
1110 for l i n e in l i n e s :
# Para cada documento s e a c t u a l i z a n l o s campos de ”H” y ”M”
1112 documento = conn . f i n d o n e ( { ’ i d ’ : O b j e c t I d ( l i n e ) } )
# I d e n t i f i c a l o s d i f e r e n t e s v a l o r e s que p o s e e cada a t r i b u t o y l e s
a s i g n a un v a l o r numerico para n o r m a l i z a r l o
91
1122 d e f n o r m a l i z a c i o n D e A t r i b u t o s ( s e l f , conn , f i l e , v a r N o r m a l i z a c i o n ) :
d i c t A t r b A c c i d e n t e s = {}
1124
f = open ( f i l e , ’w+ ’ )
1126 try :
#Busca l o s v a l o r e s d i f e r e n t e s para cada uno de l o s
atributos
1128 f o r atrb in varNormalizacion :
d i c t A t r b A c c i d e n t e s [ a t r b ] = conn . d i s t i n c t ( a t r b )
1130
# print ( dictAtrbAccidentes )
1132
#Se e s c r i b e a r c h i v o de p r o p i e d a d e s con l o s v a l o r e s de
n o r m a l i z a c i o n a p l i c a d o s a l DataSet
1134 # p r i n t (” −”∗60)
f o r key , v a l i n d i c t A t r b A c c i d e n t e s . i t e m s ( ) :
1136 f o r idx , v i n enumerate ( v a l ) :
data = ( key , ” : ” , v , ” : ” , s t r ( i d x ) , ”\n” )
1138 # p r i n t ( data )
f . w r i t e l i n e s ( data )
1140
except :
1142 p r i n t ( ” E r r o r : No s e pudo c r e a r e l a r c h i v o ” , f i l e )
finally :
1144 f . close ()
1146
1148 d e f t r a n s f o r m a c i o n C o n N o r m a l i z a c i o n ( s e l f , conn , l i n e s ,
transf Int String ) :
1162 p r i n t ( ” Fin de l a a c t u a l i z a c i o n de r e g i s t r o s a v a l o r e s I n t . ”
)
else :
1164 p r i n t ( ” Fin de l a a c t u a l i z a c i o n de r e g i s t r o s a v a l o r e s
String . ”)
1166
d e f e x p o r t D a t a b a s e ( s e l f , conn , f i l e , a t t r s ) :
1168 p r i n t ( ” I n i c i o Export . ” )
attrUno = True
1170
f = open ( f i l e , ’w+ ’ )
1172 try :
#Se r e a l i z a l a busqueda de t o d o s l o s documentos d e l DataSet
1174 l i n e s = conn . d i s t i n c t ( ” i d ” )
1206 data+=’ \n ’
attrUno=True
1208 # p r i n t ( data )
f . w r i t e l i n e s ( data )
1210
except :
1212 p r i n t ( ” E r r o r : No s e pudo c r e a r e l a r c h i v o ” , f i l e )
finally :
1214 f . close ()