关于飞机失事的相关因素——大数据分析

一、选题的背景

   一般飞机出现事故,都会付出惨痛的代价。所有只有通过分析飞机空中失事的案例,明确飞机失控的主要潜在因素、威胁、和飞行机组差错,结合事故调查统计分析,提出了预防措施和政策建议,这样才能更好的为今后的飞行带去有效的保障。近年来对于民航客机失事的概率在逐渐减少,但对于民用直升飞机的出事率却屡见不鲜。

二、大数据分析方案

   数据集来源:kaggle,网址:https://www.kaggle.com/ 数据集的有效值更新到2023年,数据总计88889行

   使用第三方库:运用pandas、matplotlib、numpy、seaborn等库对数据进行可视化。

   实现思路:对数据集进行分析→进行数据清洗→根据所需内容对数据进行可视化→得到图像并分析结果

三、大数据分析步骤

(1)下载数据集

 

 

 

(2)导入数据库

1 import numpy as np
2 import pandas as pd
3 import seaborn as sns
4 import json
5 import folium
6 import matplotlib.pyplot as plt
7 from matplotlib.ticker import PercentFormatter
8 from pylab import mpl
9 mpl.rcParams["font.sans-serif"] = ["SimHei"]

(3)读取数据

1 #读取数据
2 data = pd.read_csv(r"C:\Users\35060\Pictures\AviationData.csv", encoding = 'ISO-8859-1', low_memory = False)
3 data.head()

四、数据处理

1 data.shape
2 data.dtypes
3 data.isna().sum()/len(data)*100
4 data.info()
5 data.isnull().sum()
6 data.describe().T
7 data.describe()

 

(1)处理缺失值

1 #处理缺失值
2 rows = len(data)
3 missing = data.isna().sum()
4 percentage_missing = missing / rows
5 # 数据排序
6 percentage_missing_df = pd.DataFrame({'Missing' : percentage_missing})
7 percentage_missing_df.sort_values('Missing', ascending = False, inplace = True)
8 # 只打印缺失值超过10%的列
9 print(percentage_missing_df[percentage_missing_df['Missing'] > 0.1])

1 # 缺失数据的热图
2 data.sort_values('Event.Date', inplace = True)
3 plt.figure(figsize = (12,4))
4 sns.heatmap(data.isna(),yticklabels = False, cbar = False)

  这个热图显示了目前(黑色)和失踪(白色)的数据。它是按事件日期排序的,早期的事故在上面,最近的事故在下面。很明显,某些数据点在很长一段时间内没有被追踪到。

 

  根据数据集的内容我们需要在分析前解决:调查类型应该只涉及 "事故"。地点有城市和州合并在一起。国家应该只涉及 "美国"。机场名称有多种方式表示一个私人机场。伤害严重程度表示伤害的数量。这个数据已经存在于其他列中。注册号对 "无 "有不同的大小写。制造有不同的大写字母。

 

 1 # 检查是否有重复的行
 2 print(data.duplicated().sum())
 3 # 计算所有列中所有数值的出现次数
 4 cols = ['Investigation.Type', 'Location', 'Country', 'Airport.Code', 'Airport.Name', 'Injury.Severity', 'Registration.Number', 'Make', 'Amateur.Built', 'Publication.Date', 'Weather.Condition', 'Purpose.of.flight']
 5 for col in data[cols].columns:
 6     print(data[col].value_counts().nlargest(5))
 7     print('\n---\n')
 8 # 删除缺失值超过50%的列
 9 cols_to_drop = list(percentage_missing_df[percentage_missing_df['Missing'] > 0.5].index)
10 data.drop(columns = cols_to_drop, axis = 1, inplace = True)
11 print(cols_to_drop)
12 before = len(data)
13 data = data[(data['Investigation.Type'] == 'Accident') & (data['Country'] == 'United States')]
14 dropped = before - len(data)
15 print(str(dropped) + ' rows dropped.')

 

(2)对数据进行进一步处理、为后续分析做好准备

 1 # 将日期转换为数据时间,添加年月栏,并删除1982年之前的数据
 2 data['Event.Date'] = pd.to_datetime(data['Event.Date'])
 3 #添加日、月、年一栏
 4 data['Year'] = data['Event.Date'].dt.year
 5 data['Month.Abbr'] = data['Event.Date'].dt.month_name().str[:3]
 6 data['Day.Name.Abbr'] = data['Event.Date'].dt.day_name().str[:3]
 7 # 增加一个周末专栏
 8 data.loc[(data['Day.Name.Abbr'] == 'Sat') | (data['Day.Name.Abbr'] == 'Sun'), 'Weekend'] = True
 9 data.loc[(data['Day.Name.Abbr'] != 'Sat') & (data['Day.Name.Abbr'] != 'Sun'), 'Weekend'] = False
10 # 删除1982年以前的数据
11 data = data[data['Year'] >= 1982]
12 print(data['Event.Date'].dtype)
 1 # 将相同的机场名称合并在一起
 2 data['Airport.Name'].replace(to_replace = '(?i)^.*private.*$', value = 'PRIVATE', inplace = True, regex = True)
 3 data['Airport.Name'].replace(to_replace = '(?i)none', value = 'NONE', inplace = True, regex = True)
 4 data['Airport.Name'].value_counts().nlargest(5)
 5 # 将相同的注册号码合并在一起
 6 data['Registration.Number'].replace(to_replace = '(?i)none', value = 'NONE', inplace = True, regex = True)
 7 data['Registration.Number'].value_counts().nlargest(5)
 8 data['Make'] = data['Make'].str.title()
 9 data['Make'].value_counts().nlargest(5)
10 data['Amateur.Built'].replace(to_replace = ['Yes', 'Y'], value = True, inplace = True, regex = False)
11 data['Amateur.Built'].replace(to_replace = ['No', 'N'], value = False, inplace = True, regex = False)
12 data['Amateur.Built'].value_counts()
13 # 所有在城市、州
14 data['City'] = data['Location'].str.split(',').str[0]
15 data['State'] = data['Location'].str.split(',').str[1]
16 data[['City', 'State']].head()
17 # 删除受伤人数因为这已经在另一栏里了。
18 data['Injury.Severity'] = data['Injury.Severity'].str.split('(').str[0]
19 data['Injury.Severity'].value_counts()
20 # 合并天气状况
21 data['Weather.Condition'].replace(to_replace = ['Unk', 'UNK'], value = 'Unknown', inplace = True, regex = False)
22 data['Weather.Condition'].value_counts()
23 # 有已知受伤情况的数据
24 injury_data = data[data['Injury.Severity'] != 'Unavailable']

 

五、数据可视化

1.分析每年的航空事故总量和死亡事故的数量

# 每年的事故数
accidents_per_year = data.groupby(['Year'], as_index = False)['Event.Id'].count()
plot = sns.lineplot(x = 'Year', y = 'Event.Id', data = accidents_per_year, color = '#2990EA')
# 每年死亡事故的数量
fatal_accidents_per_year = data[data['Injury.Severity'] == 'Fatal'].groupby(['Year'], as_index = False)['Event.Id'].count()
sns.lineplot(x = 'Year', y = 'Event.Id', data = fatal_accidents_per_year, color = '#003366')
plot.set(ylabel = None, title = '每年的航空事故数量')
plt.legend(labels=["Total","Fatal"])
plt.ylim(0, 3600)

 结论:航空事故总量和死亡事故的数量在逐年减少

 

2.飞机失事的致死率

 1 #计算平均致死率
 2 averagefatal = len(injury_data[injury_data['Injury.Severity'] == 'Fatal'].index) / len(injury_data.index)
 3 print("平均致死率: " + str(round(averagefatal * 100, 2)) + '%')
 4 # 每年的致死率
 5 fatality_rate_per_year = pd.DataFrame()
 6 fatality_rate_per_year['Rate'] = fatal_accidents_per_year['Event.Id'] / accidents_per_year['Event.Id']
 7 fatality_rate_per_year['Year'] = accidents_per_year['Year']
 8 # 趋势线
 9 z = np.polyfit(fatality_rate_per_year['Year'], fatality_rate_per_year['Rate'], 1)
10 print('每年的死亡率下降: ' + str(-round(z[0]*100, 2)) + '%')
11 p = np.poly1d(z)
12 plt.plot(fatality_rate_per_year['Year'], p(fatality_rate_per_year['Year']), "--", color = 'y')
13 
14 # 与平均死亡人数一致
15 plt.axhline(y = averagefatal, color = 'r', linestyle = '-')
16 sns.lineplot(x = 'Year', y = 'Rate', data = fatality_rate_per_year, color = 'b')
17 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))

结论:与平均致死率相比,致死率从2000年开始趋势是下降的。

 

3.发生事故最多的月份

1 plot = sns.countplot(x = 'Month.Abbr', color = 'b', data = data)
2 plot.set(xlabel = 'Month', ylabel = None, title = '每月航空事故的数量')

结论:夏季发生事故的数量比冬季发生事故的数量更多

 

4.一周发生事故数最多的是哪一天

plot = sns.countplot(x = 'Day.Name.Abbr', order = ['Mon','Tue','Wed','Thu','Fri','Sat', 'Sun'], color = 'g', data = data)
plot.set(xlabel = 'day', ylabel = None, title = '一周内每天发生的航空事故数量')

结论:可以看见周末发生事故的概率更高,可能周末出行的人更多。

 

5.周末哪一些目的造成事故数更多

 1 #删除目的不明的数据
 2 purpose_data = data[data['Purpose.of.flight'] != 'Unknown']
 4 # 根据周末的情况,计算目的的相对重要性
 5 weekday_accidents = len(purpose_data[purpose_data['Weekend'] == False])
 6 weekday_data = purpose_data[purpose_data['Weekend'] == False]['Purpose.of.flight'].value_counts() / weekday_accidents
 7 weekend_accidents = len(purpose_data[purpose_data['Weekend'] == True])
 8 weekend_data = purpose_data[purpose_data['Weekend'] == True]['Purpose.of.flight'].value_counts() / weekend_accidents
 9 # 将数据合并在一起
10 purpose_day_data = pd.merge(weekday_data, weekend_data, left_index=True, right_index=True)
11 # 重新命名栏目,只保留前5个目的
12 purpose_day_data.reset_index(inplace = True)
13 purpose_day_data.rename(columns={'index': 'Purpose', 'Purpose.of.flight_x': 'Weekday', 'Purpose.of.flight_y': 'Weekend'}, inplace=True)
14 purpose_day_data = purpose_day_data.iloc[:5] 
15 # 在Seaborn图中使用
16 melted_pdd = purpose_day_data.melt('Purpose', var_name='day', value_name='percentage')
17 ax = sns.barplot(x='Purpose', y='percentage', hue='day', data = melted_pdd, palette = ['#003366','#2990EA'])
18 ax.set(ylabel = None, title = '飞行的目的取决于当天的情况')
19 plt.legend(title = "Day")
20 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))

 

 结论:在周末,涉及事故的航班更多的是出于个人目的,而从周一到周五,空中应用和业务的重要性就会增加。

 

6.在什么阶段会发生事故(造成事故的前5个阶段性航班:降落 起飞 巡航 机动性 进场)

1 stage_of_flight_data = data[(data['Broad.phase.of.flight'] != 'Unknown') & (data['Broad.phase.of.flight'] != 'Other')]
2 plot = sns.countplot(x = 'Broad.phase.of.flight', order = stage_of_flight_data['Broad.phase.of.flight'].value_counts().index, color = 'green', data = stage_of_flight_data)
3 plot.set(xlabel = '飞行阶段', ylabel = None, title = '每个飞行阶段的航空事故数量')
4 plot.set_xticklabels(plot.get_xticklabels(),rotation = 30, ha = 'right')

 结论:着陆的时候事故数量更多

 

7.在VMC飞行下还是IMC飞行下更容易出事故。(VMC=目视飞行,在晴朗的天气下;IMC=仪表飞行,通常在恶劣天气下)

# 删除没有天气状况和伤害严重程度的数据
weather = injury_data[injury_data['Weather.Condition'] != 'Unknown']
# 在某些天气条件下发生事故
weather.groupby('Weather.Condition')['Injury.Severity'].value_counts(normalize = True).unstack('Injury.Severity').plot.bar(stacked = True, color = ['#003366','#2990EA'])
plt.axhline(y = averagefatal, color = 'r', linestyle = '-')
plt.xticks(rotation = 0)
plt.title('目视飞行或仪表飞行期间的死亡率')
plt.xlabel('')
plt.legend(title = "伤害的严重程度", loc='upper right')
plt.gca().yaxis.set_major_formatter(PercentFormatter(1))

结论:在比较死亡和非死亡事故时,更多的死亡事故发生在恶劣天气下。

 

8.飞机的质量

1 injury_data.groupby('Amateur.Built')['Injury.Severity'].value_counts(normalize = True).unstack('Injury.Severity').plot.bar(stacked = True, color = ['g','b'])
2 plt.axhline(y = averagefatal, color = 'r', linestyle = '-')
3 plt.xticks(rotation = 0)
4 plt.title('业余人员死亡率')
5 plt.xlabel('')
6 plt.legend(title = "受伤的严重程度", loc='upper right')
7 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))

结论:由业余爱好者制造的飞机,比如直升机,出现死亡率更高。

 

9.航空公司的出事率

 1 # 摘录最常发生事故的50个品牌名单
 2 make_top50 = data['Make'].value_counts().nlargest(50).index.tolist()
 3 #只保留顶部列表中具有品牌的数据
 4 make_data = injury_data[injury_data['Make'].isin(make_top50)]
 5 # 按品牌划分的死亡率百分比
 6 makefatal = make_data.groupby('Make')['Injury.Severity'].value_counts(normalize = True).unstack('Injury.Severity').reindex(make_top50)
 7 makefatal.plot.bar(stacked = True, figsize=(18,5), width = 0.8, color = ['#5F9EA0','#2F4F4F'])
 8 #与平均死亡人数一致
 9 plt.axhline(y = averagefatal, color = '#FFF0F5', linestyle = '-')
10 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))
11 plt.title('不同飞机品牌的死亡率')
12 plt.legend(title = "伤害的严重程度", loc='upper right')
13 plt.show()

结论:当比较涉及致命事故的飞机品牌时,我们看到Mitsubishi、Cirrus和North American 的飞机发生致命事故的比例更高。

data['Make'].value_counts().head(10)
# 10大最差的公司
plt.figure(figsize=(20,15))
data['Make'].str.upper().value_counts().sort_values(ascending=False)[:10].plot(kind='bar', color='Green')
plt.xticks(rotation=90)
plt.xlabel("Make", size=15)
plt.ylabel("Count of Accidents", size=15)
plt.title("美国十大很差的公司", size=20)
y=data['Make'].str.upper().value_counts().sort_values(ascending=False)[:10]
for i, v in enumerate(y):
    plt.text(i, v, str(v), fontsize=15, style='oblique', horizontalalignment='center')
plt.show()

 10.美国各州的事故发生率

 1 accidents = data['Country'].groupby(data['Country']).count()
 2 accidents
 3 plt.figure(figsize=(20,15))
 4 aviation_US = data[data['Country'] == 'United States']
 5 sns.countplot(x='State', data=aviation_US, order = aviation_US['State'].value_counts().index)
 6 plt.xticks(rotation=90)
 7 plt.xlabel("各州", size=20)
 8 plt.ylabel("事故数", size=15)
 9 plt.title("美国各州的事故分布", size=20)
10 y=aviation_US['State'].value_counts()
11 for i, v in enumerate(y):
12     plt.text(i,v,str(v), horizontalalignment='center', verticalalignment='bottom', fontsize=12, rotation=90)
13 plt.show()

结论:在阿拉斯加州的发生事故率最高

 

以阿拉斯加州为例,进行具体研究

data['Survival Rate'] = (data['Total.Serious.Injuries'] + data['Total.Minor.Injuries'] + data["Total.Uninjured"])/(data['Total.Fatal.Injuries'] + data['Total.Serious.Injuries'] + data['Total.Minor.Injuries'] + data["Total.Uninjured"])
data['Survival Rate'].dropna()
data.head()
data.info()

11.机场数统计

 1 ## 移除机场数<100
 2 # 得到典型数据
 3 data1 = pd.DataFrame(data)
 4 # 获取每个值的计数
 5 value_counts = data['Location'].value_counts()
 6 # 选择计数小于50的值
 7 to_remove = value_counts[value_counts <= 100].index
 8 # 保留城市列不在to_remove中的行。
 9 data = data1[~data1.Location.isin(to_remove)]
10 pd.DataFrame(data["Location"].value_counts())
11 f = plt.figure(figsize=(14, 22))
12 sns.catplot(y ='Location',data=data , kind= "count",palette="mako",
13            order = data["Location"].value_counts().index, height = 8)

 12.安克雷奇的出事率很高

ak= data[data["Location"].str.contains("ANCHORAGE, AK") == True]
ak.head(10)
f=plt.figure(figsize=(6,6))
sns.heatmap(data.corr(), vmin=-1, vmax=1, annot= True, fmt=".3f", cmap="mako" )

 13.飞机引擎数量对安全的影响

factor_numEngine= ak.groupby("Number.of.Engines").sum().reset_index()
factor_numEngine
f, axes=plt.subplots(3,1 , figsize= (12,20))
sns.barplot(x = 'Number.of.Engines',y='Total.Fatal.Injuries' , data = factor_numEngine.reset_index() , color = '#B0E0E6',ax= axes[0])
sns.barplot(x = 'Number.of.Engines',y='Total.Uninjured' , data = factor_numEngine.reset_index() , color = '#B0C4DE',ax= axes[1])
sns.barplot(x = 'Number.of.Engines',y='Survival Rate' , data = factor_numEngine.reset_index() , color = '#FFC0CB',ax= axes[2])

 结论:1台引擎的存活率较高,拥有4台引擎的未受伤人数更多。

 

14.飞机遭到破坏时

factor_damage= ak.groupby("Aircraft.damage").sum().reset_index()
factor_damage
f, axes=plt.subplots(1,3 , figsize= (15,8))
sns.barplot(x = 'Aircraft.damage',y='Total.Fatal.Injuries' , data = factor_damage.reset_index() , color = 'r', ax= axes[0])#致命伤害总数
sns.barplot(x = 'Aircraft.damage',y='Total.Uninjured' , data = factor_damage.reset_index() , color = 'g',ax= axes[1])#共计:未受伤
sns.barplot(x = 'Aircraft.damage',y='Survival Rate' , data = factor_damage.reset_index() , color = 'b', ax= axes[2])#幸存率

结论:当飞机破坏时,致命的伤害较高

 

15.怎样着陆存活率最高

phase = ak[ak['Broad.phase.of.flight'] != 'Unknown']
factor= phase.groupby("Broad.phase.of.flight").sum().reset_index()
factor
f, axes=plt.subplots(3,1 , figsize= (12,12))
sns.barplot(x = 'Broad.phase.of.flight',y='Survival Rate' , data = factor.reset_index() , color = '#708090',ax= axes[0])
sns.barplot(x = 'Broad.phase.of.flight',y='Total.Fatal.Injuries' , data = factor.reset_index() , color = '#EE82EE',ax= axes[1])
sns.barplot(x = 'Broad.phase.of.flight',y='Total.Uninjured' , data = factor.reset_index() , color = '#FFC0CB',ax= axes[2])

 

结论:碰撞着陆的存活率最高

 

16.各个品牌在阿拉斯加州的存活率

factor= ak.groupby("Survival Rate").sum().reset_index()#存活率
factor
# 各个品牌在AK的存活率 
cessna =pd.DataFrame(ak[ak['Make'].str.contains("Cessna")==True])
piper =pd.DataFrame(ak[ak['Make'].str.contains("Piper")==True])
beech =pd.DataFrame(ak[ak['Make'].str.contains("Beech")==True])
boeing =pd.DataFrame(ak[ak['Make'].str.contains("Boeing")==True])
bell =pd.DataFrame(ak[ak['Make'].str.contains("Bell")==True])

print("Cessna Survival Rate: " , round((cessna["Survival Rate"].sum()/cessna["Survival Rate"].count())*100),2,"%")
print("Piper Survival Rate: " , round((piper["Survival Rate"].sum()/piper["Survival Rate"].count())*100),2,"%")
print("Beech Survival Rate: " , round((beech["Survival Rate"].sum()/beech["Survival Rate"].count())*100),2,"%")
print("Bell Survival Rate: " , round((bell["Survival Rate"].sum()/bell["Survival Rate"].count())*100),2,"%")
print("Boeing Survival Rate: " , round((boeing["Survival Rate"].sum()/boeing["Survival Rate"].count())*100),2,"%")

 

 17.发动机类型导致的伤害

engine = ak[ak['Engine.Type'] != 'Unknown']
factor= engine.groupby("Engine.Type").sum().reset_index()
factor
f, axes=plt.subplots(3,1 , figsize= (12,16))
sns.barplot(x = 'Engine.Type',y='Survival Rate' , data = factor.reset_index() , color = '#DB7093',ax= axes[0])
sns.barplot(x = 'Engine.Type',y='Total.Fatal.Injuries' , data = factor.reset_index() ,  color = '#AFEEEE',ax= axes[1])#致命伤害总数
sns.barplot(x = 'Engine.Type',y='Total.Uninjured' , data = factor.reset_index() , color = '#708090',ax= axes[2])#共计:未受伤

结论:涡轮风扇类型的发动机有很高的非伤亡率,复式发动机类型有更高的致命伤害。

 

18.以个人为目的的飞行发生的事故数是最高的。

print(data['Purpose.of.flight'].nunique())
print('')
print(data['Purpose.of.flight'].unique())
total_fatal = data[['Purpose.of.flight','Total.Fatal.Injuries']].groupby('Purpose.of.flight').agg(['sum','count'])
total_fatal = total_fatal['Total.Fatal.Injuries'].reset_index()
total_fatal['fatal_percentage'] = total_fatal['sum']/total_fatal['count']
total_fatal.columns = ['Purpose.of.flight','Total.Fatal.Injuries','Total_Accidents','Fatal_Percentage']
total_uninjured = data[['Purpose.of.flight','Total.Uninjured']].groupby('Purpose.of.flight').agg(['sum','count'])
total_uninjured = total_uninjured['Total.Uninjured'].reset_index()
total_uninjured['Uninjured_percentage'] = total_uninjured['sum']/total_uninjured['count']
total_uninjured.columns = ['Purpose.of.flight','Total.Uninjured','Total_Accidents','Uninjured_Percentage']
import plotly.express as px
import plotly.graph_objects as go
minacc = 10
propstoplot = total_fatal[total_fatal['Total_Accidents']>minacc]
propstoplot = propstoplot.sort_values('Fatal_Percentage').tail(50)
fig = go.Figure()
fig.add_trace(go.Bar(
   x=propstoplot['Purpose.of.flight'],
   y=propstoplot['Total_Accidents'],
   text=propstoplot['Total_Accidents'],
   name='Purpose Of Flight Accident > 10 Accidents',
   marker_color='grey'
))
fig.add_trace(go.Bar(
    x=propstoplot['Purpose.of.flight'],
    y=propstoplot['Total.Fatal.Injuries'],
    text=propstoplot['Total.Fatal.Injuries'],
    name='Fatal Injury Count',
    marker_color = 'silver'
))
fig.update_traces(textposition='outside', texttemplate='%{text:.2s}')
fig.update_layout(barmode='group', xaxis_tickangle=-45, height=600, width=1300,uniformtext_minsize=7, uniformtext_mode='show',
                 title='飞行目的 总事故数  总致命伤数 ')
fig.show()

19.飞行目的不同,死亡率不同

fig = px.bar(x=propstoplot['Purpose.of.flight'],
   y=propstoplot['Fatal_Percentage'],
   text=propstoplot['Fatal_Percentage'],
   title='飞行的目的 死亡的百分比')
fig.update_traces(textposition='outside', texttemplate='%{text:.4s}', marker = dict(color='antiquewhite', line=dict(color='peru', width=3)))
fig.update_layout( height=600, width=1100,uniformtext_minsize=8, uniformtext_mode='show')
fig.show()

20.未知的飞行目的还是占大多数

uninjured = total_uninjured[total_uninjured['Total_Accidents']>minacc]
uninjured = uninjured.sort_values('Uninjured_Percentage').tail(50)
fig = go.Figure()
fig.add_trace(go.Bar(
   x=uninjured['Purpose.of.flight'],
   y=uninjured['Total_Accidents'],
   text=uninjured['Total_Accidents'],
   name='Purpose Of Flight Accident > 10 Accidents',
   marker_color='yellowgreen'
))
fig.add_trace(go.Bar(
    x=uninjured['Purpose.of.flight'],
    y=uninjured['Total.Uninjured'],
    text=uninjured['Total.Uninjured'],
    name='Uninjured Count',
    marker_color = 'olive'
))
fig.update_traces(textposition='outside', texttemplate='%{text:.2s}')
fig.update_layout(barmode='group', xaxis_tickangle=-45, height=600, width=1300,uniformtext_minsize=7, uniformtext_mode='show',
                 title='飞行目的 事故总数  未受伤总数')
fig.show()
fig = px.bar(x=uninjured['Purpose.of.flight'],#飞行的目的
    y=uninjured['Uninjured_Percentage'],
    text=uninjured['Uninjured_Percentage'],
    title='飞行目的 未受伤的百分比')
fig.update_traces(textposition='outside', texttemplate='%{text:.3s}', marker = dict(color='mintcream', line=dict(color='teal', width=3)))
fig.update_layout( height=600, width=1100,uniformtext_minsize=8, uniformtext_mode='show')
fig.show()

21.大多数飞行器是由专业人士建造的

aircraft_built = data.groupby('Aircraft.damage')['Amateur.Built'].value_counts().reset_index(name='count')
aircraft_built = aircraft_built[aircraft_built['Amateur.Built']!='Unknown']
aircraft_built.style.background_gradient(cmap='BuGn')
fig= px.bar(x=aircraft_built['Aircraft.damage'],
           y=aircraft_built['count'],
           color=aircraft_built['Amateur.Built'],
           text=aircraft_built['count'],
           barmode='relative',
           height=500,
           width=600,
           color_discrete_sequence=['darkmagenta','plum'],
           title='飞机损坏和业余建造')
fig.show()

22.非专业制造的死亡人数与存活人数之比

severity = data[(data['Injury.Severity']=='Fatal') | (data['Injury.Severity']=='Non-Fatal') | (data['Injury.Severity']=='Minor') | (data['Injury.Severity']=='Serious')]
severity = severity.groupby('Amateur.Built')['Injury.Severity'].value_counts().reset_index(name='count')
severity.style.background_gradient(cmap='Blues')
fig = px.bar(x=severity['Amateur.Built'],
            y=severity['count'],
            color=severity['Injury.Severity'],
            barmode='group',
            height=500,
            width=700,
            title='非专业制造和损害严重程度')
fig.update_traces(marker=dict(color= ['beige','bisque'], line=dict(color='black', width=3)))
fig.show()

 结论:非专业制造的飞行器受伤程度也很高

 

 六、完整代码

  1 import numpy as np
  2 import pandas as pd
  3 import seaborn as sns
  4 import json
  5 import folium
  6 import matplotlib.pyplot as plt
  7 from matplotlib.ticker import PercentFormatter
  8 from pylab import mpl
  9 mpl.rcParams["font.sans-serif"] = ["SimHei"]
 10 #读取数据
 11 data = pd.read_csv(r"C:\Users\35060\Pictures\AviationData.csv", encoding = 'ISO-8859-1', low_memory = False)
 12 data.head()
 13 data.shape
 14 data.dtypes
 15 data.isna().sum()/len(data)*100
 16 data.info()
 17 data.isnull().sum()
 18 data.describe().T
 19 data.describe()
 20 #处理缺失值
 21 rows = len(data)
 22 missing = data.isna().sum()
 23 percentage_missing = missing / rows
 24 # 数据排序
 25 percentage_missing_df = pd.DataFrame({'Missing' : percentage_missing})
 26 percentage_missing_df.sort_values('Missing', ascending = False, inplace = True)
 27 # 只打印缺失值超过10%的列
 28 print(percentage_missing_df[percentage_missing_df['Missing'] > 0.1])
 29 # 缺失数据的热图
 30 data.sort_values('Event.Date', inplace = True)
 31 plt.figure(figsize = (12,4))
 32 sns.heatmap(data.isna(),yticklabels = False, cbar = False)
 33 print(data.duplicated().sum())
 34 # 计算所有列中所有数值的出现次数
 35 cols = ['Investigation.Type', 'Location', 'Country', 'Airport.Code', 'Airport.Name', 'Injury.Severity', 'Registration.Number', 'Make', 'Amateur.Built', 'Publication.Date', 'Weather.Condition', 'Purpose.of.flight']
 36 for col in data[cols].columns:
 37     print(data[col].value_counts().nlargest(5))
 38     print('\n---\n')
 39 # 删除缺失值超过50%的列
 40 cols_to_drop = list(percentage_missing_df[percentage_missing_df['Missing'] > 0.5].index)
 41 data.drop(columns = cols_to_drop, axis = 1, inplace = True)
 42 print(cols_to_drop)
 43 before = len(data)
 44 data = data[(data['Investigation.Type'] == 'Accident') & (data['Country'] == 'United States')]
 45 dropped = before - len(data)
 46 print(str(dropped) + ' rows dropped.')
 47 # 将日期转换为数据时间,添加年月栏,并删除1982年之前的数据
 48 data['Event.Date'] = pd.to_datetime(data['Event.Date'])
 49 #添加日、月、年一栏
 50 data['Year'] = data['Event.Date'].dt.year
 51 data['Month.Abbr'] = data['Event.Date'].dt.month_name().str[:3]
 52 data['Day.Name.Abbr'] = data['Event.Date'].dt.day_name().str[:3]
 53 # 增加一个周末专栏
 54 data.loc[(data['Day.Name.Abbr'] == 'Sat') | (data['Day.Name.Abbr'] == 'Sun'), 'Weekend'] = True
 55 data.loc[(data['Day.Name.Abbr'] != 'Sat') & (data['Day.Name.Abbr'] != 'Sun'), 'Weekend'] = False
 56 # 删除1982年以前的数据
 57 data = data[data['Year'] >= 1982]
 58 print(data['Event.Date'].dtype)
 59 # 将相同的机场名称合并在一起
 60 data['Airport.Name'].replace(to_replace = '(?i)^.*private.*$', value = 'PRIVATE', inplace = True, regex = True)
 61 data['Airport.Name'].replace(to_replace = '(?i)none', value = 'NONE', inplace = True, regex = True)
 62 data['Airport.Name'].value_counts().nlargest(5)
 63 data['Registration.Number'].replace(to_replace = '(?i)none', value = 'NONE', inplace = True, regex = True)
 64 data['Registration.Number'].value_counts().nlargest(5)
 65 data['Make'] = data['Make'].str.title()
 66 data['Make'].value_counts().nlargest(5)
 67 data['Amateur.Built'].replace(to_replace = ['Yes', 'Y'], value = True, inplace = True, regex = False)
 68 data['Amateur.Built'].replace(to_replace = ['No', 'N'], value = False, inplace = True, regex = False)
 69 data['Amateur.Built'].value_counts()
 70 data['City'] = data['Location'].str.split(',').str[0]
 71 data['State'] = data['Location'].str.split(',').str[1]
 72 data[['City', 'State']].head()
 73 data['Injury.Severity'] = data['Injury.Severity'].str.split('(').str[0]
 74 data['Injury.Severity'].value_counts()
 75 # 合并天气状况的未知数
 76 data['Weather.Condition'].replace(to_replace = ['Unk', 'UNK'], value = 'Unknown', inplace = True, regex = False)
 77 data['Weather.Condition'].value_counts()
 78 injury_data = data[data['Injury.Severity'] != 'Unavailable']
 79 # 每年的事故数
 80 accidents_per_year = data.groupby(['Year'], as_index = False)['Event.Id'].count()
 81 plot = sns.lineplot(x = 'Year', y = 'Event.Id', data = accidents_per_year, color = 'g')
 82 # 每年死亡事故的数量
 83 fatal_accidents_per_year = data[data['Injury.Severity'] == 'Fatal'].groupby(['Year'], as_index = False)['Event.Id'].count()
 84 sns.lineplot(x = 'Year', y = 'Event.Id', data = fatal_accidents_per_year, color = 'r')
 85 plot.set(ylabel = None, title = '每年的航空事故数量')
 86 plt.legend(labels=["Total","Fatal"])
 87 plt.ylim(0, 3600)
 88 #计算平均致死率
 89 averagefatal = len(injury_data[injury_data['Injury.Severity'] == 'Fatal'].index) / len(injury_data.index)
 90 print("平均致死率: " + str(round(averagefatal * 100, 2)) + '%')
 91 # 每年的致死率
 92 fatality_rate_per_year = pd.DataFrame()
 93 fatality_rate_per_year['Rate'] = fatal_accidents_per_year['Event.Id'] / accidents_per_year['Event.Id']
 94 fatality_rate_per_year['Year'] = accidents_per_year['Year']
 95 z = np.polyfit(fatality_rate_per_year['Year'], fatality_rate_per_year['Rate'], 1)
 96 print('每年的死亡率下降: ' + str(-round(z[0]*100, 2)) + '%')
 97 p = np.poly1d(z)
 98 plt.plot(fatality_rate_per_year['Year'], p(fatality_rate_per_year['Year']), "--", color = 'y')
 99 # 与平均死亡人数一致
100 plt.axhline(y = averagefatal, color = 'r', linestyle = '-')
101 sns.lineplot(x = 'Year', y = 'Rate', data = fatality_rate_per_year, color = 'b')
102 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))
103 # 发生事故最多的月份
104 plot = sns.countplot(x = 'Month.Abbr', color = 'b', data = data)
105 plot.set(xlabel = 'Month', ylabel = None, title = '每月航空事故的数量')
106 # 发生事故最多的日子
107 plot = sns.countplot(x = 'Day.Name.Abbr', order = ['Mon','Tue','Wed','Thu','Fri','Sat', 'Sun'], color = 'g', data = data)
108 plot.set(xlabel = 'day', ylabel = None, title = '一周内每天发生的航空事故数量')
109 #删除目的不明的数据
110 purpose_data = data[data['Purpose.of.flight'] != 'Unknown']
111 # 根据周末的情况,计算目的的相对重要性
112 weekday_accidents = len(purpose_data[purpose_data['Weekend'] == False])
113 weekday_data = purpose_data[purpose_data['Weekend'] == False]['Purpose.of.flight'].value_counts() / weekday_accidents
114 weekend_accidents = len(purpose_data[purpose_data['Weekend'] == True])
115 weekend_data = purpose_data[purpose_data['Weekend'] == True]['Purpose.of.flight'].value_counts() / weekend_accidents
116 # 将数据合并在一起
117 purpose_day_data = pd.merge(weekday_data, weekend_data, left_index=True, right_index=True)
118 # 重新命名栏目,只保留前5个目的
119 purpose_day_data.reset_index(inplace = True)
120 purpose_day_data.rename(columns={'index': 'Purpose', 'Purpose.of.flight_x': 'Weekday', 'Purpose.of.flight_y': 'Weekend'}, inplace=True)
121 purpose_day_data = purpose_day_data.iloc[:5] 
122 # 在Seaborn图中使用
123 melted_pdd = purpose_day_data.melt('Purpose', var_name='day', value_name='percentage')
124 ax = sns.barplot(x='Purpose', y='percentage', hue='day', data = melted_pdd, palette = ['#003366','#2990EA'])
125 ax.set(ylabel = None, title = '飞行的目的取决于当天的情况')
126 plt.legend(title = "Day")
127 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))
128 # 在什么阶段会发生事故
129 stage_of_flight_data = data[(data['Broad.phase.of.flight'] != 'Unknown') & (data['Broad.phase.of.flight'] != 'Other')]
130 plot = sns.countplot(x = 'Broad.phase.of.flight', order = stage_of_flight_data['Broad.phase.of.flight'].value_counts().index, color = 'green', data = stage_of_flight_data)
131 plot.set(xlabel = '飞行阶段', ylabel = None, title = '每个飞行阶段的航空事故数量')
132 plot.set_xticklabels(plot.get_xticklabels(),rotation = 30, ha = 'right')
133 # 删除没有天气状况和伤害严重程度的数据
134 weather = injury_data[injury_data['Weather.Condition'] != 'Unknown']
135 weather.groupby('Weather.Condition')['Injury.Severity'].value_counts(normalize = True).unstack('Injury.Severity').plot.bar(stacked = True, color = ['#003366','#2990EA'])
136 plt.axhline(y = averagefatal, color = 'r', linestyle = '-')
137 plt.xticks(rotation = 0)
138 plt.title('目视飞行或仪表飞行期间的死亡率')
139 plt.xlabel('')
140 plt.legend(title = "伤害的严重程度", loc='upper right')
141 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))
142 injury_data.groupby('Amateur.Built')['Injury.Severity'].value_counts(normalize = True).unstack('Injury.Severity').plot.bar(stacked = True, color = ['g','b'])
143 plt.axhline(y = averagefatal, color = 'r', linestyle = '-')
144 plt.xticks(rotation = 0)
145 plt.title('业余人员死亡率')
146 plt.xlabel('')
147 plt.legend(title = "受伤的严重程度", loc='upper right')
148 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))
149 # 摘录最常发生事故的50个品牌名单
150 make_top50 = data['Make'].value_counts().nlargest(50).index.tolist()
151 #只保留顶部列表中具有品牌的数据
152 make_data = injury_data[injury_data['Make'].isin(make_top50)]
153 # 按品牌划分的死亡率百分比
154 makefatal = make_data.groupby('Make')['Injury.Severity'].value_counts(normalize = True).unstack('Injury.Severity').reindex(make_top50)
155 makefatal.plot.bar(stacked = True, figsize=(18,5), width = 0.8, color = ['#5F9EA0','#2F4F4F'])
156 #与平均死亡人数一致
157 plt.axhline(y = averagefatal, color = '#FFF0F5', linestyle = '-')
158 plt.gca().yaxis.set_major_formatter(PercentFormatter(1))
159 plt.title('不同飞机品牌的死亡率')
160 plt.legend(title = "伤害的严重程度", loc='upper right')
161 plt.show()
162 data['Make'].value_counts().head(10)
163 # 10大最差的公司
164 plt.figure(figsize=(20,15))
165 data['Make'].str.upper().value_counts().sort_values(ascending=False)[:10].plot(kind='bar', color='Green')
166 plt.xticks(rotation=90)
167 plt.xlabel("Make", size=15)
168 plt.ylabel("Count of Accidents", size=15)
169 plt.title("美国十大很差的公司", size=20)
170 y=data['Make'].str.upper().value_counts().sort_values(ascending=False)[:10]
171 for i, v in enumerate(y):
172     plt.text(i, v, str(v), fontsize=15, style='oblique', horizontalalignment='center')
173 plt.show()
174 accidents = data['Country'].groupby(data['Country']).count()
175 accidents
176 plt.figure(figsize=(20,15))
177 aviation_US = data[data['Country'] == 'United States']
178 sns.countplot(x='State', data=aviation_US, order = aviation_US['State'].value_counts().index)
179 plt.xticks(rotation=90)
180 plt.xlabel("各州", size=20)
181 plt.ylabel("事故数", size=15)
182 plt.title("美国各州的事故分布", size=20)
183 y=aviation_US['State'].value_counts()
184 for i, v in enumerate(y):
185     plt.text(i,v,str(v), horizontalalignment='center', verticalalignment='bottom', fontsize=12, rotation=90)
186 plt.show()
187 data['Survival Rate'] = (data['Total.Serious.Injuries'] + data['Total.Minor.Injuries'] + data["Total.Uninjured"])/(data['Total.Fatal.Injuries'] + data['Total.Serious.Injuries'] + data['Total.Minor.Injuries'] + data["Total.Uninjured"])
188 data['Survival Rate'].dropna()
189 data.head()
190 data.info()
191 ## 移除机场数<100
192 data1 = pd.DataFrame(data)
193 # 获取每个值的计数
194 value_counts = data['Location'].value_counts()
195 # 选择计数小于50的值
196 to_remove = value_counts[value_counts <= 100].index
197 data = data1[~data1.Location.isin(to_remove)]
198 pd.DataFrame(data["Location"].value_counts())
199 f = plt.figure(figsize=(14, 22))
200 sns.catplot(y ='Location',data=data , kind= "count",palette="mako",
201            order = data["Location"].value_counts().index, height = 8)
202 ak= data[data["Location"].str.contains("ANCHORAGE, AK") == True]
203 ak.head(10)
204 f=plt.figure(figsize=(6,6))
205 sns.heatmap(data.corr(), vmin=-1, vmax=1, annot= True, fmt=".3f", cmap="mako" )
206 factor_numEngine= ak.groupby("Number.of.Engines").sum().reset_index()
207 factor_numEngine
208 f, axes=plt.subplots(3,1 , figsize= (12,20))
209 sns.barplot(x = 'Number.of.Engines',y='Total.Fatal.Injuries' , data = factor_numEngine.reset_index() , color = '#B0E0E6',ax= axes[0])
210 sns.barplot(x = 'Number.of.Engines',y='Total.Uninjured' , data = factor_numEngine.reset_index() , color = '#B0C4DE',ax= axes[1])
211 sns.barplot(x = 'Number.of.Engines',y='Survival Rate' , data = factor_numEngine.reset_index() , color = '#FFC0CB',ax= axes[2])
212 factor_damage= ak.groupby("Aircraft.damage").sum().reset_index()
213 factor_damage
214 f, axes=plt.subplots(1,3 , figsize= (15,8))
215 sns.barplot(x = 'Aircraft.damage',y='Total.Fatal.Injuries' , data = factor_damage.reset_index() , color = 'r', ax= axes[0])#致命伤害总数
216 sns.barplot(x = 'Aircraft.damage',y='Total.Uninjured' , data = factor_damage.reset_index() , color = 'g',ax= axes[1])#共计:未受伤
217 sns.barplot(x = 'Aircraft.damage',y='Survival Rate' , data = factor_damage.reset_index() , color = 'b', ax= axes[2])#幸存率
218 phase = ak[ak['Broad.phase.of.flight'] != 'Unknown']
219 factor= phase.groupby("Broad.phase.of.flight").sum().reset_index()
220 factor
221 f, axes=plt.subplots(3,1 , figsize= (12,12))
222 sns.barplot(x = 'Broad.phase.of.flight',y='Survival Rate' , data = factor.reset_index() , color = '#708090',ax= axes[0])
223 sns.barplot(x = 'Broad.phase.of.flight',y='Total.Fatal.Injuries' , data = factor.reset_index() , color = '#EE82EE',ax= axes[1])
224 sns.barplot(x = 'Broad.phase.of.flight',y='Total.Uninjured' , data = factor.reset_index() , color = '#FFC0CB',ax= axes[2])
225 factor= ak.groupby("Survival Rate").sum().reset_index()#存活率
226 factor
227 cessna =pd.DataFrame(ak[ak['Make'].str.contains("Cessna")==True])
228 piper =pd.DataFrame(ak[ak['Make'].str.contains("Piper")==True])
229 beech =pd.DataFrame(ak[ak['Make'].str.contains("Beech")==True])
230 boeing =pd.DataFrame(ak[ak['Make'].str.contains("Boeing")==True])
231 bell =pd.DataFrame(ak[ak['Make'].str.contains("Bell")==True])
232 
233 print("Cessna Survival Rate: " , round((cessna["Survival Rate"].sum()/cessna["Survival Rate"].count())*100),2,"%")
234 print("Piper Survival Rate: " , round((piper["Survival Rate"].sum()/piper["Survival Rate"].count())*100),2,"%")
235 print("Beech Survival Rate: " , round((beech["Survival Rate"].sum()/beech["Survival Rate"].count())*100),2,"%")
236 print("Bell Survival Rate: " , round((bell["Survival Rate"].sum()/bell["Survival Rate"].count())*100),2,"%")
237 print("Boeing Survival Rate: " , round((boeing["Survival Rate"].sum()/boeing["Survival Rate"].count())*100),2,"%")
238 engine = ak[ak['Engine.Type'] != 'Unknown']
239 factor= engine.groupby("Engine.Type").sum().reset_index()
240 factor
241 f, axes=plt.subplots(3,1 , figsize= (12,16))
242 sns.barplot(x = 'Engine.Type',y='Survival Rate' , data = factor.reset_index() , color = '#DB7093',ax= axes[0])
243 sns.barplot(x = 'Engine.Type',y='Total.Fatal.Injuries' , data = factor.reset_index() ,  color = '#AFEEEE',ax= axes[1])#致命伤害总数
244 sns.barplot(x = 'Engine.Type',y='Total.Uninjured' , data = factor.reset_index() , color = '#708090',ax= axes[2])#共计:未受伤
245 print(data['Purpose.of.flight'].nunique())
246 print('')
247 print(data['Purpose.of.flight'].unique())
248 total_fatal = data[['Purpose.of.flight','Total.Fatal.Injuries']].groupby('Purpose.of.flight').agg(['sum','count'])
249 total_fatal = total_fatal['Total.Fatal.Injuries'].reset_index()
250 total_fatal['fatal_percentage'] = total_fatal['sum']/total_fatal['count']
251 total_fatal.columns = ['Purpose.of.flight','Total.Fatal.Injuries','Total_Accidents','Fatal_Percentage']
252 total_uninjured = data[['Purpose.of.flight','Total.Uninjured']].groupby('Purpose.of.flight').agg(['sum','count'])
253 total_uninjured = total_uninjured['Total.Uninjured'].reset_index()
254 total_uninjured['Uninjured_percentage'] = total_uninjured['sum']/total_uninjured['count']
255 total_uninjured.columns = ['Purpose.of.flight','Total.Uninjured','Total_Accidents','Uninjured_Percentage']
256 import plotly.express as px
257 import plotly.graph_objects as go
258 minacc = 10
259 propstoplot = total_fatal[total_fatal['Total_Accidents']>minacc]
260 propstoplot = propstoplot.sort_values('Fatal_Percentage').tail(50)
261 fig = go.Figure()
262 fig.add_trace(go.Bar(
263    x=propstoplot['Purpose.of.flight'],
264    y=propstoplot['Total_Accidents'],
265    text=propstoplot['Total_Accidents'],
266    name='Purpose Of Flight Accident > 10 Accidents',
267    marker_color='grey'
268 ))
269 fig.add_trace(go.Bar(
270     x=propstoplot['Purpose.of.flight'],
271     y=propstoplot['Total.Fatal.Injuries'],
272     text=propstoplot['Total.Fatal.Injuries'],
273     name='Fatal Injury Count',
274     marker_color = 'silver'
275 ))
276 fig.update_traces(textposition='outside', texttemplate='%{text:.2s}')
277 fig.update_layout(barmode='group', xaxis_tickangle=-45, height=600, width=1300,uniformtext_minsize=7, uniformtext_mode='show',
278                  title='飞行目的 总事故数  总致命伤数 ')
279 fig.show()
280 fig = px.bar(x=propstoplot['Purpose.of.flight'],
281    y=propstoplot['Fatal_Percentage'],
282    text=propstoplot['Fatal_Percentage'],
283    title='飞行的目的 死亡的百分比')
284 fig.update_traces(textposition='outside', texttemplate='%{text:.4s}', marker = dict(color='antiquewhite', line=dict(color='peru', width=3)))
285 fig.update_layout( height=600, width=1100,uniformtext_minsize=8, uniformtext_mode='show')
286 fig.show()
287 uninjured = total_uninjured[total_uninjured['Total_Accidents']>minacc]
288 uninjured = uninjured.sort_values('Uninjured_Percentage').tail(50)
289 fig = go.Figure()
290 fig.add_trace(go.Bar(
291    x=uninjured['Purpose.of.flight'],
292    y=uninjured['Total_Accidents'],
293    text=uninjured['Total_Accidents'],
294    name='Purpose Of Flight Accident > 10 Accidents',
295    marker_color='yellowgreen'
296 ))
297 fig.add_trace(go.Bar(
298     x=uninjured['Purpose.of.flight'],
299     y=uninjured['Total.Uninjured'],
300     text=uninjured['Total.Uninjured'],
301     name='Uninjured Count',
302     marker_color = 'olive'
303 ))
304 fig.update_traces(textposition='outside', texttemplate='%{text:.2s}')
305 fig.update_layout(barmode='group', xaxis_tickangle=-45, height=600, width=1300,uniformtext_minsize=7, uniformtext_mode='show',
306                  title='飞行目的 事故总数  未受伤总数')
307 fig.show()
308 fig = px.bar(x=uninjured['Purpose.of.flight'],#飞行的目的
309     y=uninjured['Uninjured_Percentage'],
310     text=uninjured['Uninjured_Percentage'],
311     title='飞行目的 未受伤的百分比')
312 fig.update_traces(textposition='outside', texttemplate='%{text:.3s}', marker = dict(color='mintcream', line=dict(color='teal', width=3)))
313 fig.update_layout( height=600, width=1100,uniformtext_minsize=8, uniformtext_mode='show')
314 fig.show()
315 aircraft_built = data.groupby('Aircraft.damage')['Amateur.Built'].value_counts().reset_index(name='count')
316 aircraft_built = aircraft_built[aircraft_built['Amateur.Built']!='Unknown']
317 aircraft_built.style.background_gradient(cmap='BuGn')
318 fig= px.bar(x=aircraft_built['Aircraft.damage'],
319            y=aircraft_built['count'],
320            color=aircraft_built['Amateur.Built'],
321            text=aircraft_built['count'],
322            barmode='relative',
323            height=500,
324            width=600,
325            color_discrete_sequence=['darkmagenta','plum'],
326            title='飞机损坏和业余建造')
327 fig.show()
328 severity = data[(data['Injury.Severity']=='Fatal') | (data['Injury.Severity']=='Non-Fatal') | (data['Injury.Severity']=='Minor') | (data['Injury.Severity']=='Serious')]
329 severity = severity.groupby('Amateur.Built')['Injury.Severity'].value_counts().reset_index(name='count')
330 severity.style.background_gradient(cmap='Blues')
331 fig = px.bar(x=severity['Amateur.Built'],
332             y=severity['count'],
333             color=severity['Injury.Severity'],
334             barmode='group',
335             height=500,
336             width=700,
337             title='非专业制造和损害严重程度')
338 fig.update_traces(marker=dict(color= ['beige','bisque'], line=dict(color='black', width=3)))
339 fig.show()

七、总结

   虽然数据集大部分分析的是美国的飞行问题,但对于我们来说仍具有借鉴意义。飞行安全任重而道远,只有进一步的提高对飞机各方面安全隐患的注意,才能更好的为将来的飞行做好保障,对于飞行器来说我们要尽量选择有保障的公司,在天气等情况不好的时候尽量减少出行,飞行开始时也要注意对飞行器各项性能的检查。

   在完成次设计时,我熟练的掌握了可视化中各种图形的分析,但是对数据分析的算法运用较少,若能运用其他模型来处理数据可能会有更好的效果。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

posted @ 2023-06-04 22:18  alisalijiayi  阅读(304)  评论(0)    收藏  举报