Exercicio 3 - K-means
Esse exercicio é baseado no dataset Crash Car do Kaggle. O objetivo é analisar a base de dados, limpá-la e no final construir um modelo Metrics an Evaluation
Etapa 1 - Analise e instalação dos dados
O dataset foi carregado a partir de um arquivo Excel, contendo informações como tipo de colisão, tipo de lesão, dia da semana, fatores primários do acidente, data, hora e localização.
Carregando os dados
O dataset possui 53943 linha e 11 colunas.
As bibiliotecas utilizadas
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from io import StringIO
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
Explicação dos tipos de dados
Explicação
Int64: Dados numéricos inteiros, como Year, Month, Day, Hour e Latitude.
Object: Dados categóricos ou textuais, como Collision Type, Injury Type, Weekend?, Primary Factor e Time.
FLoat64: Dados numéricos com casas decimais, como Longitude, Latitude e Hora.
Estatisticas descritivas dos numéricos
Formato do dataset: (53943, 11) Estatísticas das colunas numéricas:
Year | Month | Day | Hour | Latitude | |
---|---|---|---|---|---|
32953 | 2008 | 9 | 3 | 2300.0 | 0.000000 |
47487 | 2004 | 7 | 7 | 1600.0 | 39.164240 |
49039 | 2004 | 5 | 6 | 900.0 | 0.000000 |
43976 | 2005 | 12 | 1 | 800.0 | 39.144848 |
7082 | 2014 | 5 | 4 | 1500.0 | 39.155567 |
33414 | 2007 | 11 | 2 | 1100.0 | 39.190672 |
37720 | 2006 | 7 | 2 | 800.0 | 39.179100 |
14653 | 2012 | 4 | 7 | 1400.0 | 39.164304 |
49267 | 2004 | 11 | 1 | 800.0 | 0.000000 |
8415 | 2014 | 12 | 4 | 1300.0 | 0.000000 |
Visualização dos dados
Visualizações: Foram criados gráficos de barras para o número de acidentes por tipo de veículo e por gravidade (fatal/não fatal), facilitando a compreensão dos dados.
Exploração inicial dos dados
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_excel("docs/arvore-decisao/crashcar.xlsx")
# Visualização inicial da base de dados
print(f'Formato do dataset: {df.shape}<br>')
# Explicação de tipo de dado em cada coluna
for col in df:
print(df[col].head(1), "<br>")
print('Valores nulos por coluna:')
print(df.isnull().sum(), "<br>")
################################################
# Estatísticas descritivas das colunas numéricas
print('Estatísticas das colunas numéricas:')
print(df[['Year', 'Month', 'Day', 'Hour', 'Latitude']].describe())
Etapa 2
Normalização de dados categóricos em numéricos
Collision Type | Collision Type Num | |
---|---|---|
0 | 2-Car | 1 |
1 | 2-Car | 1 |
2 | 2-Car | 1 |
3 | 2-Car | 1 |
4 | 2-Car | 1 |
5 | 2-Car | 1 |
6 | 2-Car | 1 |
7 | 1-Car | 1 |
8 | 2-Car | 1 |
9 | 1-Car | 1 |
def collision_to_num(collision):
if collision == '1-Car' or collision == '2-Car' or collision == '3+ Cars':
return 1
elif collision == 'Moped/Motorcycle':
return 2
elif collision == 'Bus':
return 3
elif collision == 'Pedestrian':
return 4
elif collision == 'Cyclist':
return 5
else:
return 0
df['Collision Type Num'] = df['Collision Type'].apply(collision_to_num)
Injury Type | Injury Type Num | |
---|---|---|
0 | No injury/unknown | 0 |
1 | No injury/unknown | 0 |
2 | Non-incapacitating | 0 |
3 | Non-incapacitating | 0 |
4 | No injury/unknown | 0 |
5 | No injury/unknown | 0 |
6 | No injury/unknown | 0 |
7 | Incapacitating | 0 |
8 | No injury/unknown | 0 |
9 | No injury/unknown | 0 |
Weekend? | Weekend Num | |
---|---|---|
0 | Weekday | 2 |
1 | Weekday | 2 |
2 | Weekend | 1 |
3 | Weekend | 1 |
4 | Weekend | 1 |
5 | Weekday | 2 |
6 | Weekday | 2 |
7 | Weekday | 2 |
8 | Weekend | 1 |
9 | Weekend | 1 |
Primary Factor | Primary Factor Num | |
---|---|---|
0 | OTHER (DRIVER) - EXPLAIN IN NARRATIVE | 0 |
1 | FOLLOWING TOO CLOSELY | 1 |
2 | DISREGARD SIGNAL/REG SIGN | 1 |
3 | FAILURE TO YIELD RIGHT OF WAY | 1 |
4 | FAILURE TO YIELD RIGHT OF WAY | 1 |
5 | FAILURE TO YIELD RIGHT OF WAY | 1 |
6 | DRIVER DISTRACTED - EXPLAIN IN NARRATIVE | 5 |
7 | ENGINE FAILURE OR DEFECTIVE | 3 |
8 | FOLLOWING TOO CLOSELY | 1 |
9 | RAN OFF ROAD RIGHT | 1 |
1 = Erros de julgamento do motorista
2 = Velocidade / comportamento arriscado
3 = Falhas mecânicas
4 = Condições da estrada / ambientais
5 = Distrações
6 = Uso de Substâncias
7 = Fatores diversos
8 = Outros
def primary_factor_to_num(factor):
if factor == 'Erros de julgamento do motorista':
return 1
elif factor == 'Velocidade / comportamento arriscado':
return 2
elif factor == 'Falhas mecânicas':
return 3
elif factor == 'Condições da estrada / ambientais':
return 4
elif factor == 'Distrações':
return 5
elif factor == 'Uso de Substâncias':
return 6
elif factor == 'Fatores diversos':
return 7
else:
return 0 # Outros / não especificado
df['Primary Factor Num'] = df['Primary Factor'].apply(primary_factor_to_num)
Conversão de variáveis categóricas em numéricas: tipo de colisão, tipo de lesão, dia da semana e fator primário foram transformados em variáveis numéricas para facilitar os proximos processos e estabelecer uma normalização.
Limpeza
Tamanho do dataset antes remoção de valores ausentes (53943, 11)
Tamanho do dataset após remoção de valores ausentes (52582, 11)
Todos os registros com valores ausentes foram removidos, garantindo a integridade dos dados para o treinamento do modelo
Etapa 3
Separação em treino e teste / Metrics
Formato do dataset: (53943, 11)
Primary Factor | Primary Factor Num | |
---|---|---|
0 | OTHER (DRIVER) - EXPLAIN IN NARRATIVE | 0 |
1 | FOLLOWING TOO CLOSELY | 1 |
2 | DISREGARD SIGNAL/REG SIGN | 1 |
3 | FAILURE TO YIELD RIGHT OF WAY | 1 |
4 | FAILURE TO YIELD RIGHT OF WAY | 1 |
5 | FAILURE TO YIELD RIGHT OF WAY | 1 |
6 | DRIVER DISTRACTED - EXPLAIN IN NARRATIVE | 5 |
7 | ENGINE FAILURE OR DEFECTIVE | 3 |
8 | FOLLOWING TOO CLOSELY | 1 |
9 | RAN OFF ROAD RIGHT | 1 |
Accuracy: 0.995 Precisão: 0.035 Recall: 0.074 F1-Score: 0.048
Roc
Formato do dataset: (53943, 11)
Primary Factor | Primary Factor Num | |
---|---|---|
0 | OTHER (DRIVER) - EXPLAIN IN NARRATIVE | 0 |
1 | FOLLOWING TOO CLOSELY | 1 |
2 | DISREGARD SIGNAL/REG SIGN | 1 |
3 | FAILURE TO YIELD RIGHT OF WAY | 1 |
4 | FAILURE TO YIELD RIGHT OF WAY | 1 |
5 | FAILURE TO YIELD RIGHT OF WAY | 1 |
6 | DRIVER DISTRACTED - EXPLAIN IN NARRATIVE | 5 |
7 | ENGINE FAILURE OR DEFECTIVE | 3 |
8 | FOLLOWING TOO CLOSELY | 1 |
9 | RAN OFF ROAD RIGHT | 1 |
Matriz
Formato do dataset: (53943, 11)
Primary Factor | Primary Factor Num | |
---|---|---|
0 | OTHER (DRIVER) - EXPLAIN IN NARRATIVE | 0 |
1 | FOLLOWING TOO CLOSELY | 1 |
2 | DISREGARD SIGNAL/REG SIGN | 1 |
3 | FAILURE TO YIELD RIGHT OF WAY | 1 |
4 | FAILURE TO YIELD RIGHT OF WAY | 1 |
5 | FAILURE TO YIELD RIGHT OF WAY | 1 |
6 | DRIVER DISTRACTED - EXPLAIN IN NARRATIVE | 5 |
7 | ENGINE FAILURE OR DEFECTIVE | 3 |
8 | FOLLOWING TOO CLOSELY | 1 |
9 | RAN OFF ROAD RIGHT | 1 |
Accuracy: 0.995 Precisão: 0.035 Recall: 0.074 F1-Score: 0.048 === SVG Matriz de Confusão ===