Qual situação-problema você escolheu para criar o seu projeto de intervenção?
Situação-problema 1
Uma empresa de logística especializada em entregas rápidas está enfrentando desafios no gerenciamento eficiente de sua frota de veículos. Para resolver esse problema, eles decidiram adotar uma abordagem baseada em dados e estão buscando realizar uma análise descritiva sobre uma grande massa de dados coletados de sua frota de veículos. É claro que chamaram seu melhor analista para essa missão. O objetivo é identificar padrões, tendências e fatores que afetam o desempenho da frota, a fim de otimizar a eficiência operacional, reduzir custos e melhorar a satisfação dos clientes.
Situação-Problema Escolhida
Gestão eficiente da frota de veículos de uma empresa de logística especializada em entregas rápidas.
Objetivo
O objetivo deste projeto é identificar padrões, tendências e fatores que impactam o desempenho da frota de veículos. A meta é otimizar a eficiência operacional, reduzir custos e aumentar a satisfação dos clientes por meio de uma análise descritiva baseada em dados históricos.
Revisão de Conceito
A análise de dados descritiva é uma etapa essencial para compreender o comportamento de variáveis e padrões em grandes conjuntos de dados. Utilizando bibliotecas como Pandas e Matplotlib, é possível realizar estatísticas básicas, identificar tendências e criar visualizações úteis. Neste contexto, a gestão eficiente de frota depende de métricas como tempo de viagem, consumo de combustível e feedback dos clientes.
Metodologia
1. Coleta de Dados:
Importação de dados de um arquivo CSV contendo informações sobre entregas realizadas, incluindo tempo de viagem, velocidade média, consumo de combustível e feedback dos clientes.
2. Preparação dos Dados:
Tratamento de dados ausentes, padronização e limpeza para assegurar consistência e qualidade no processo analítico.
3. Análise Descritiva:
Cálculo de estatísticas descritivas (média, mediana, desvio padrão) para identificar comportamentos gerais.
Identificação de tendências ao longo do tempo (por exemplo, tempo médio de viagem por dia).
4. Visualização:
Criação de gráficos de barras, linhas, histogramas e box plots para ilustrar os insights.
5. Discussão e Propostas:
Identificação dos veículos e motoristas mais eficientes.
Sugestões para otimizar rotas, horários de operação e políticas de incentivo para melhorar o desempenho.
Tempo
O projeto será desenvolvido em três semanas, divididas da seguinte forma:
Semana 1: Coleta e preparação de dados.
Semana 2: Análise descritiva e criação de visualizações.
Semana 3: Discussão, conclusão e documentação dos resultados.
Procedimento e Material Utilizado
Material:
Arquivo CSV contendo os dados históricos da frota.
Ambiente Python com bibliotecas Pandas e Matplotlib.
IDE: Jupyter Notebook ou similar.
Procedimentos:
Importar os dados para o Python.
Limpar e tratar os dados para padronização.
import pandas as pd
import io
# Criar um DataFrame a partir da string
data_string = """
D,data,tempo_de_viagem,velocidade_média,consumo_de_combustível,carga_transportada,ID_do_motorista,feedback_do_cliente
1,2022-01-01 08:15:00,30,60,10,100,101,4.5
...
""" # Copie e cole os dados restantes aqui
data = io.StringIO(data_string)
df = pd.read_csv(data)
df['data'] = pd.to_datetime(df['data'])
Realizar estatísticas descritivas.
1. Estatísticas básicas por coluna relevante:
⦁ Tempo médio de viagem.
⦁ Velocidade média por viagem.
Consumo médio de combustível.
import pandas as pd
import io
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Criar um DataFrame a partir da string
data_string = """
D,data,tempo_de_viagem,velocidade_média,consumo_de_combustível,carga_transportada,ID_do_motorista,feedback_do_cliente
1,2022-01-01 08:15:00,30,60,10,100,101,4.5
1,2022-01-01 08:15:00,30,60,10,100,101,4.5
2,2022-01-02 14:30:00,45,55,15,200,102,4.2
3,2022-01-02 10:45:00,20,40,8,50,103,4.8
4,2022-01-03 09:20:00,35,50,12,150,101,3.9
5,2022-01-04 12:10:00,50,45,18,250,104,4.6
6,2022-01-04 11:30:00,25,55,9,80,103,4.1
7,2022-01-05 16:45:00,40,40,14,180,105,3.7
8,2022-01-05 13:20:00,55,35,20,300,106,4.3
9,2022-01-06 09:30:00,30,50,10,100,102,4.5
10,2022-01-07 11:45:00,40,45,13,150,101,4.0
11,2022-01-08 09:30:00,35,55,12,120,103,4.4
12,2022-01-09 15:20:00,50,40,18,250,104,3.9
13,2022-01-10 14:10:00,30,50,10,100,102,4.5
14,2022-01-11 12:45:00,45,45,15,200,105,4.2
15,2022-01-12 10:30:00,25,60,9,80,103,4.8
16,2022-01-13 16:40:00,40,40,14,180,106,4.3
17,2022-01-14 13:15:00,55,35,20,300,107,4.7
18,2022-01-15 09:45:00,35,50,11,120,101,4.1
19,2022-01-16 11:20:00,40,45,13,150,102,4.6
20,2022-01-17 15:10:00,50,40,17,220,104,4.2
21,2022-01-18 14:00:00,30,55,10,100,103,4.7
22,2022-01-19 12:30:00,45,50,15,200,105,4.3
23,2022-01-20 10:15:00,25,60,8,80,106,4.9
24,2022-01-21 16:35:00,40,40,14,180,107,4.4
25,2022-01-22 13:10:00,55,35,19,280,108,4.1
26,2022-01-23 09:40:00,35,50,12,120,101,4.6
27,2022-01-24 11:15:00,40,45,13,150,102,4.2
28,2022-01-25 15:05:00,50,40,18,220,105,4.7
29,2022-01-26 14:00:00,30,55,10,100,103,4.3
30,2022-01-27 12:25:00,45,50,15,200,104,4.8
31,2022-01-28 10:10:00,25,60,9,80,106,4.4
32,2022-01-29 16:30:00,40,40,14,180,107,4.0
33,2022-01-30 13:05:00,55,35,19,280,108,4.6
34,2022-01-31 09:35:00,35,50,11,120,101,4.2
35,2022-02-01 11:10:00,40,45,13,150,102,4.7
36,2022-02-02 14:55:00,50,40,17,220,104,4.3
37,2022-02-03 13:50:00,30,55,10,100,103,4.8
38,2022-02-04 12:15:00,45,50,15,200,105,4.4
39,2022-02-05 16:05:00,25,60,9,80,106,4.9
40,2022-02-06 14:50:00,40,40,14,180,107,4.5
41,2022-02-07 13:25:00,55,35,19,280,108,4.1
42,2022-02-08 09:55:00,35,50,11,120,101,4.6
43,2022-02-09 11:30:00,40,45,13,150,102,4.2
44,2022-02-10 15:20:00,50,40,17,220,104,4.7
45,2022-02-11 14:15:00,30,55,10,100,103,4.3
46,2022-02-12 12:40:00,45,50,15,200,105,4.8
47,2022-02-13 16:30:00,25,60,9,80,106,4.4
48,2022-02-14 14:55:00,40,40,14,180,107,4.9
49,2022-02-15 13:50:00,55,35,19,280,108,4.5
50,2022-02-16 10:25:00,35,50,11,120,101,4.1
51,2022-02-17 12:00:00,40,45,13,150,102,4.6
52,2022-02-18 15:50:00,50,40,17,220,104,4.2
53,2022-02-19 14:45:00,30,55,10,100,103,4.7
54,2022-02-20 13:10:00,45,50,15,200,105,4.3
55,2022-02-21 17:00:00,25,60,9,80,106,4.8
56,2022-02-22 15:45:00,40,40,14,180,107,4.4
57,2022-02-23 14:40:00,55,35,19,280,108,4.9
58,2022-02-24 11:15:00,35,50,11,120,101,4.5
59,2022-02-25 12:50:00,40,45,13,150,102,4.1
60,2022-02-26 16:40:00,50,40,17,220,104,4.6
61,2022-02-27 15:35:00,30,55,10,100,103,4.2
62,2022-02-28 14:00:00,45,50,15,200,105,4.7
63,2022-03-01 17:50:00,25,60,9,80,106,4.3
64,2022-03-02 16:35:00,40,40,14,180,107,4.8
65,2022-03-03 15:30:00,55,35,19,280,108,4.4
66,2022-03-04 12:05:00,35,50,11,120,101,4.9
67,2022-03-05 13:40:00,40,45,13,150,102,4.5
68,2022-03-06 17:30:00,50,40,17,220,104,4.1
69,2022-03-07 16:25:00,30,55,10,100,103,4.6
70,2022-03-08 14:50:00,45,50,15,200,105,4.2
71,2022-03-09 18:40:00,25,60,9,80,106,4.7
72,2022-03-10 17:35:00,40,40,14,180,107,4.3
73,2022-03-11 16:30:00,55,35,19,280,108,4.8
74,2022-03-12 13:05:00,35,50,11,120,101,4.4
75,2022-03-13 14:40:00,40,45,13,150,102,4.9
76,2022-03-14 18:30:00,50,40,17,220,104,4.5
77,2022-03-15 17:25:00,30,55,10,100,103,4.1
78,2022-03-16 15:50:00,45,50,15,200,105,4.6
79,2022-03-17 19:40:00,25,60,9,80,106,4.2
80,2022-03-18 18:35:00,40,40,14,180,107,4.7
81,2022-03-19 17:30:00,55,35,19,280,108,4.3
82,2022-03-20 14:05:00,35,50,11,120,101,4.8
83,2022-03-21 15:40:00,40,45,13,150,102,4.4
84,2022-03-22 19:30:00,50,40,17,220,104,4.9
85,2022-03-23 18:25:00,30,55,10,100,103,4.5
86,2022-03-24 16:50:00,45,50,15,200,105,4.1
87,2022-03-25 20:40:00,25,60,9,80,106,4.6
88,2022-03-26 19:35:00,40,40,14,180,107,4.2
89,2022-03-27 18:30:00,55,35,19,280,108,4.7
90,2022-03-28 15:05:00,35,50,11,120,101,4.3
91,2022-03-29 16:40:00,40,45,13,150,102,4.8
92,2022-03-30 20:30:00,50,40,17,220,104,4.4
93,2022-03-31 19:25:00,30,55,10,100,103,4.9
94,2022-04-01 17:50:00,45,50,15,200,105,4.5
95,2022-04-02 21:40:00,25,60,9,80,106,4.1
96,2022-04-03 20:35:00,40,40,14,180,107,4.6
97,2022-04-04 19:30:00,55,35,19,280,108,4.2
98,2022-04-05 16:05:00,35,50,11,120,101,4.7
99,2022-04-06 17:40:00,40,45,13,150,102,4.3
100,2022-04-07 21:30:00,50,40,17,220,104,4.8
"""
data = io.StringIO(data_string)
df = pd.read_csv(data)
df['data'] = pd.to_datetime(df['data'])
print(df)
# Verificar informações sobre o DataFrame
print(df.info())
# Verificar a quantidade de valores NaN em cada coluna
print(df.isnull().sum())
# Assumindo que você já tratou os valores NaN e os tipos de dados
# Calcular a matriz de correlação
correlation_matrix = df[['velocidade_média', 'consumo_de_combustível']].corr()
# Verificar se a matriz de correlação tem algum valor
if not correlation_matrix.empty:
# Visualizar a matriz de correlação
sns.heatmap(correlation_matrix, annot=True)
plt.show()
else:
print("Não foi possível calcular a matriz de correlação. Verifique os dados.")
# Histograma da velocidade média
plt.hist(df['velocidade_média'], bins=20)
plt.xlabel('Velocidade Média')
plt.ylabel('Frequência')
plt.show()
# Boxplot do consumo de combustível
sns.boxplot(x=df['consumo_de_combustível'])
plt.show()
# Scatter plot de velocidade média vs. consumo de combustível
sns.scatterplot(x='velocidade_média', y='consumo_de_combustível', data=df)
plt.show()
# Matriz de correlação completa
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True)
plt.show()
# Agrupando por motorista e calculando a média do feedback
feedback_por_motorista = df.groupby('ID_do_motorista')['feedback_do_cliente'].mean()
print(feedback_por_motorista)
# Identificando outliers no consumo de combustível (exemplo)
Q1 = df['consumo_de_combustível'].quantile(0.25)
Q3 = df['consumo_de_combustível'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['consumo_de_combustível'] < Q1 - 1.5*IQR) | (df['consumo_de_combustível'] > Q3 + 1.5*IQR)]
print(outliers)
D data tempo_de_viagem velocidade_média \
0 1 2022-01-01 08:15:00 30 60
1 1 2022-01-01 08:15:00 30 60
2 2 2022-01-02 14:30:00 45 55
3 3 2022-01-02 10:45:00 20 40
4 4 2022-01-03 09:20:00 35 50
.. ... ... ... ...
96 96 2022-04-03 20:35:00 40 40
97 97 2022-04-04 19:30:00 55 35
98 98 2022-04-05 16:05:00 35 50
99 99 2022-04-06 17:40:00 40 45
100 100 2022-04-07 21:30:00 50 40
consumo_de_combustível carga_transportada ID_do_motorista \
0 10 100 101
1 10 100 101
2 15 200 102
3 8 50 103
4 12 150 101
.. ... ... ...
96 14 180 107
97 19 280 108
98 11 120 101
99 13 150 102
100 17 220 104
feedback_do_cliente
0 4.5
1 4.5
2 4.2
3 4.8
4 3.9
.. ...
96 4.6
97 4.2
98 4.7
99 4.3
100 4.8
[101 rows x 8 columns]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 101 entries, 0 to 100
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 D 101 non-null int64
1 data 101 non-null datetime64[ns]
2 tempo_de_viagem 101 non-null int64
3 velocidade_média 101 non-null int64
4 consumo_de_combustível 101 non-null int64
5 carga_transportada 101 non-null int64
6 ID_do_motorista 101 non-null int64
7 feedback_do_cliente 101 non-null float64
dtypes: datetime64[ns](1), float64(1), int64(6)
memory usage: 6.4 KB
None
D 0
data 0
tempo_de_viagem 0
velocidade_média 0
consumo_de_combustível 0
carga_transportada 0
ID_do_motorista 0
feedback_do_cliente 0
dtype: int64
ID_do_motorista
101 4.406667
102 4.464286
103 4.514286
104 4.461538
105 4.375000
106 4.491667
107 4.500000
108 4.460000
Name: feedback_do_cliente, dtype: float64
Empty DataFrame
Columns: [D, data, tempo_de_viagem, velocidade_média, consumo_de_combustível, carga_transportada, ID_do_motorista, feedback_do_cliente]
Index: []

# Agrupar por hora e contar o número de viagens
df['data'] = pd.to_datetime(df['data'], format='%Y-%m-%d %H:%M:%S')
# Verificando os tipos de dados
print(df.dtypes)
# Criando a coluna 'hora' (se ainda não existir)
df['hora'] = df['data'].dt.hour
# Contando ocorrências por hora e filtrando os horários de pico (opcional)
horas_pico = df['hora'].value_counts()
horas_pico_entre_17_20 = df[df['hora'].isin(range(17, 21))]['hora'].value_counts()
# Plotando o gráfico de barras
horas_pico.sort_index().plot(kind='bar', figsize=(10, 6), color='blue')
plt.title('Distribuição de Entregas por Hora do Dia')
plt.xlabel('Hora do Dia')
plt.ylabel('Quantidade de Entregas')
plt.xticks(rotation=45) # Rotacionando os rótulos do eixo x para melhor visualização
plt.show()
# Plotando o gráfico de barras para as horas entre 17h e 20h (opcional)
horas_pico_entre_17_20.plot(kind='bar', figsize=(8, 4), color='green')
plt.title('Distribuição de Entregas entre 17h e 20h')
plt.xlabel('Hora do Dia')
plt.ylabel('Quantidade de Entregas')
plt.show()
D int64
data datetime64[ns]
tempo_de_viagem int64
velocidade_média int64
consumo_de_combustível int64
carga_transportada int64
ID_do_motorista int64
feedback_do_cliente float64
dtype: object

# Convertendo a coluna 'data' para datetime
df['data'] = pd.to_datetime(df['data'], format='%Y-%m-%d %H:%M:%S')
# Criando a coluna 'hora'
df['hora'] = df['data'].dt.hour
# Agrupando por hora e calculando estatísticas
agrupado_por_hora = df.groupby('hora')['hora'].count()
estatisticas = agrupado_por_hora.describe()
print(estatisticas)
# Plotando o gráfico de linha
agrupado_por_hora.plot(kind='line', figsize=(10, 6))
plt.title('Tendência de Entregas por Hora do Dia')
plt.xlabel('Hora do Dia')
plt.ylabel('Quantidade de Entregas')
plt.show()
# Plotando um boxplot para visualizar a distribuição das entregas por hora
sns.boxplot(x='hora', y='hora', data=df)
plt.title('Distribuição das Entregas por Hora')
plt.xlabel('Hora do Dia')
plt.ylabel('Quantidade de Entregas')
plt.show()
count 14.000000
mean 7.214286
std 3.846648
min 2.000000
25% 5.000000
50% 7.000000
75% 9.750000
max 14.000000
Name: hora, dtype: float64
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Assuming you have a DataFrame named 'df'
# Handle missing values
df.fillna(df.mean(), inplace=True) # Replace with more sophisticated methods
# Detect outliers using IQR
Q1 = df['consumo_de_combustível'].quantile(0.25)
Q3 = df['consumo_de_combustível'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['consumo_de_combustível'] < (Q1 - 1.5 * IQR)) |
(df['consumo_de_combustível'] > (Q3 + 1.5 * IQR)))]
# Create a new feature: distance traveled
df['distance'] = df['velocidade_média'] * df['tempo_de_viagem']
# Group by driver and calculate average feedback
feedback_by_driver = df.groupby('ID_do_motorista')['feedback_do_cliente'].mean()
# Visualize correlation matrix
sns.heatmap(df.corr(), annot=True)
plt.show()
# Create a scatter plot with hue for driver
sns.scatterplot(x='velocidade_média', y='consumo_de_combustível', hue='ID_do_motorista', data=df)
plt.show()