Trasteando con el Notebook de Sofia2, pero esta vez no con Zeppelin si no con Anaconda / Jupyter / Python y con uno de los dataset típicos que hay en la red, el de los accidentes de aviones desde 1908 (Airplane Crashes Since 1908), me encuentro que el modelo de avión Douglas DC-3 tiene en su haber la triste marca de más de 4000 muertos en accidentes de vuelo más de 4 veces que el siguiente modelo. ¿Por qué?
Es una pena que en el dataset sólo venga información de los accidentes y no de todos lo vuelos porque de cara a extraer conclusiones sobre los accidentes es necesario contrastar siniestros frente a uso, pero es lo que hay.
In [1]:
# Importamos las librerías necesarias
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import re
import operator
from IPython.core.display import display, HTML
import matplotlib
%matplotlib inline
In [2]:
# Carga de los datos de los accidentes de avión deslde 1908
data=pd.read_csv("./Downloads/PythonRecursos/3-Airplane_Crashes_Since_1908.txt",sep=',')
In [3]:
data.sample()
Out[3]:
In [4]:
matplotlib.rcParams['figure.figsize'] = (16.0, 8.0)
In [5]:
# Gráfica con los muertos en accidentes para los distintos modelos de avión
type_fatalities_sum = data[['Type','Fatalities']].groupby('Type').agg(['sum'])
type_fatalities_sum['Fatalities','sum'].sort_values(ascending=False).head(20).plot(kind='bar')
Out[5]:

In [7]:
# Creamos la columna con el año
data['Date'] = pd.to_datetime(data['Date'])
data['year'] = data['Date'].dt.year
In [8]:
# Filtrado de datos para el modelo de avión Douglas DC-3
data_Douglas_DC_3 = data[(data.Type == 'Douglas DC-3')]
# Y a partir del año 1937
data_Douglas_DC_3_1937 = data[(data.Type == 'Douglas DC-3') & (data.year >= 1937)]
In [9]:
# Gráfico de muertos por año en accidentes de avión Douglas DC-3
year_Douglas_DC_3_1937 = data_Douglas_DC_3_1937[['year','Fatalities']].groupby('year').agg(['sum'])
data_Douglas_DC_3_1937[['year','Fatalities']].groupby('year').agg(['sum']).plot(kind='bar')
Out[9]:

In [11]:
# Gráfico con las aerolineas con más accidentes con el avión Douglas DC-3
operador_Douglas = data_Douglas_DC_3[['Operator','Fatalities']].groupby('Operator').agg(['count'])
operador_Douglas['Fatalities','count'].sort_values(ascending=False).head(25).plot(kind='bar')
Out[11]:

In [13]:
# Muertos por aerolínea por año divididos en tres bloques los 10 primeros, del 10 al 20 y del 20 al 30
accidents_Douglas = operador_Douglas['Fatalities','count'].sort_values(ascending=False)
topOps_10 = accidents_Douglas.index.values.tolist()[0:10]
topOps_20 = accidents_Douglas.index.values.tolist()[10:20]
topOps_30 = accidents_Douglas.index.values.tolist()[20:30]
fig,ax = plt.subplots(3,1,figsize=(15,10))
for op in topOps_10:
ope = data_Douglas_DC_3[data_Douglas_DC_3['Operator']==op]
ope[['year','Fatalities']].groupby('year').agg(['sum']).plot(ax=ax[0],grid=True,linewidth=2)
for op in topOps_20:
ope = data_Douglas_DC_3[data_Douglas_DC_3['Operator']==op]
ope[['year','Fatalities']].groupby('year').agg(['sum']).plot(ax=ax[1],grid=True,linewidth=2)
for op in topOps_30:
ope = data_Douglas_DC_3[data_Douglas_DC_3['Operator']==op]
ope[['year','Fatalities']].groupby('year').agg(['sum']).plot(ax=ax[2],grid=True,linewidth=2)
ax[0].set_title('Fatality Trend by Operator 0-10')
ax[1].set_title('Fatality Trend by Operator 10-20')
ax[2].set_title('Fatality Trend by Operator 20-30')
lines_10, labels_10 = ax[0].get_legend_handles_labels()
lines_20, labels_20 = ax[1].get_legend_handles_labels()
lines_30, labels_30 = ax[2].get_legend_handles_labels()
ax[0].legend(lines_10, topOps_10)
ax[1].legend(lines_20, topOps_20)
ax[2].legend(lines_30, topOps_30)
plt.tight_layout()

In [15]:
# Gráfico de accidentes del Douglas DC-3 por localización
location_accidents_Douglas_DC_3 = data_Douglas_DC_3[['Location','Fatalities']].groupby('Location').agg(['count'])
location_accidents_Douglas_DC_3['Fatalities','count'].sort_values(ascending=False).head(30).plot(kind='bar')
Out[15]:

In [17]:
# Algunas de las causas de los accidentes para el Douglas DC 3
# Se utiliza una función es de la página https://www.kaggle.com/junzis/d/saurograndi/airplane-crashes-since-1908/causes-of-aircraft-crash
# Funciona mediante expresiones regulares y no identifica la mayor parte de los casos
failures = {
'pilot error': '(pilot|crew) (error|fatigue)',
'engine failure': 'engine.*(fire|fail|falling|failure)',
'structure failure': '(structural fail)|(fuel leak)|(langing gear)',
'electrical problem': 'electrical',
'poor weather': '((poor|bad).*(weather|visibility)|thunderstorm)',
'stall': 'stall',
'on fire': '(caught fire)|(caught on fire)',
'turbulence': 'turbulence',
'fuel exhaustion': '(out of fuel)|(fuel.*exhaust)',
'terrorism': 'terrorist|terrorism',
'shot down': 'shot down',
}
failure_counts = {'other':0}
for s in data_Douglas_DC_3.Summary.dropna():
other = True
for failure, exp in failures.items():
if re.search(exp, s.lower()):
other = False
if failure in failure_counts:
failure_counts[failure] += 1
else:
failure_counts[failure] = 1
if other:
failure_counts['other'] += 1
nan_counts = len(data_Douglas_DC_3.Summary.isnull())
print('causes not avaiable: %d' % nan_counts)
print('unindentified causes: %d' % failure_counts['other'])
del failure_counts['other']
sortedcauses = sorted(failure_counts.items(), key=operator.itemgetter(1), reverse=True)
for k, v in sortedcauses:
print(k, v)
plt.figure(figsize=(14, 8))
x, y = zip(*sortedcauses)
sns.barplot(x=x, y=y)
plt.xticks(rotation=25, horizontalalignment='right')
plt.show()

In [18]:
# Algunas de las causas de los accidentes para todos los modelos de aviones
failure_counts = {'other':0}
for s in data.Summary.dropna():
other = True
for failure, exp in failures.items():
if re.search(exp, s.lower()):
other = False
if failure in failure_counts:
failure_counts[failure] += 1
else:
failure_counts[failure] = 1
if other:
failure_counts['other'] += 1
nan_counts = len(data.Summary.isnull())
print('causes not avaiable: %d' % nan_counts)
print('unindentified causes: %d' % failure_counts['other'])
del failure_counts['other']
sortedcauses = sorted(failure_counts.items(), key=operator.itemgetter(1), reverse=True)
for k, v in sortedcauses:
print(k, v)
plt.figure(figsize=(14, 8))
x, y = zip(*sortedcauses)
sns.barplot(x=x, y=y)
plt.xticks(rotation=25, horizontalalignment='right')
plt.show()


Deja un comentario