US Accidents 美国交通事故分析
数据来源
从2016/02到2019/12美国49州所有交通事故数据集,包含300万行,一共49列,1个G的数据.
分析目的
①哪个州事故发生的最多?
②哪个时间最容易发生事故,发生的事故是怎么样一个变换趋势?
③事故与天气有什么样的关系?
数据理解
通过在Kaggle中的详情知道数据各个字段的含义如下.
ID 事故标识符 。 Source 事故数据来源。 TMC 交通事故可能具有交通消息通道(TMC)代码,该代码可提供事件的更详细描述 。Severity 显示事故的严重程度,1最小,4最严重的的影响 。 Start_Time 在本地时区显示事故的开始时间。 End_Time 在当地时区显示事故的结束时间。 Start_Lat 在起点的GPS坐标中显示纬度。 Start_Lng 在起点的GPS坐标中显示经度。 End_Lat 在终点的GPS坐标中显示纬度。 End_Lng 在终点的GPS坐标中显示经度。 Distance(mi) 受事故影响的道路范围的长度(英里)。 Description 显示事故的自然语言描述。 Number 在地址栏中显示街道号码。 Street 在地址字段中显示街道名称。 Side 在地址字段中显示街道的相对侧(右/左)。 City 在地址字段中显示城市。 County 在地址栏中显示县 State 在地址字段中显示状态。 Zipcode 在地址字段中显示邮政编码。 Country 在地址字段中显示国家。 Timezone 根据事故地点(东部,中部等)显示时区。 Airport_Code 表示一个基于机场的气象站,它离事故地点最近。 Weather_Timestamp 显示天气预报的时间戳(以当地时间为单位)。 Temperature(F) 显示温度(以华氏度为单位)。 Wind_Chill(F) 显示风寒(华氏度)。 Humidity(%) 显示湿度(百分比)。 Pressure(in) 显示气压(以英寸为单位)。 Visibility(mi) 显示可见性(以英里为单位)。 Wind_Direction 显示风向。 Wind_Speed(mph) 显示风速(以英里/小时为单位)。 Precipitation(in) 显示降水量(以英寸为单位)(如果有)。 Weather_Condition 显示天气状况(雨,雪,雷暴,雾等)。 Amenity 兴趣点(POI)批注,指示附近有便利设施。 Bump 一个POI注释,指示附近有减速带或驼峰。 Crossing 一个POI注释,指示附近有交叉路口。 Give_Way 一个POI注释,指示在附近位置存在Give_way标志。 Junction 一个POI注释,指示附近有交界处。 No_Exit 指示附近位置存在no_exit标志的POI注释。 Railway 一个POI注释,指示附近有铁路。 Roundabout 一个POI注释,指示附近有回旋处。 Station 一个POI注释,指示附近位置有车站(公交车,火车等)。 Stop 一个POI注释,指示在附近位置存在停车标志。 Traffic_Calming 指示在附近位置存在traffic_calming装置的POI注释。 Traffic_Signal 一个POI注释,指示在附近位置存在交通标识。 Turning_Loop 一个POI注释,指示在附近的位置是否存在转弯提示。 Sunrise_Sunset 根据日出/日落显示白天(即白天或晚上)。 Civil_Twilight 显示基于民间暮光的白天时段(即白天或晚上)。 Nautical_Twilight 显示基于航海暮光的白天时段(即白天或晚上)。 Astronomical_Twilight 根据天文暮光显示白天(即白天或晚上)。
可以看出,数据量十分巨大,不适合使用Excel进行分析。选择Python进行处理,IDE选择Jupyter Notebook。
数据处理
1.导入数据
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("./US_Accidents_Dec19.csv", sep=',')#使用逗号分隔各列数据,不传sep这个参数会导致打开的数据只有一列
直接使用pandas进行CSV读取
2.查看数据行列数
data.shape
#输出 (2974335, 49)
#数据集大概300W行,49列
3.查看数据概述信息
data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2974335 entries, 0 to 2974334 Data columns (total 49 columns):
ID object
Source object
TMC float64
Severity int64
Start_Time object
End_Time object
Start_Lat float64
Start_Lng float64
End_Lat float64
End_Lng float64
Distance(mi) float64
Description object
Number float64
Street object
Side object
City object
County object
State object
Zipcode object
Country object
Timezone object
Airport_Code object
Weather_Timestamp object
Temperature(F) float64
Wind_Chill(F) float64
Humidity(%) float64
Pressure(in) float64
Visibility(mi) float64
Wind_Direction object
Wind_Speed(mph) float64
Precipitation(in) float64
Weather_Condition object
Amenity bool
Bump bool
Crossing bool
Give_Way bool
Junction bool
No_Exit bool
Railway bool
Roundabout bool
Station bool
Stop bool
Traffic_Calming bool
Traffic_Signal bool
Turning_Loop bool
Sunrise_Sunset object
Civil_Twilight object
Nautical_Twilight object
Astronomical_Twilight object
dtypes: bool(13), float64(14), int64(1), object(21) memory usage: 853.8+ MB
49列数据的列名,数据类型,但未能从此概述信息中看出缺失信息。选择另外一个函数查看。
4.查看数据缺失值
data.isnull().sum()
ID 0
Source 0
TMC 728071
Severity 0
Start_Time 0
End_Time 0
Start_Lat 0
Start_Lng 0
End_Lat 2246264
End_Lng 2246264
Distance(mi) 0
Description 1
Number 1917605
Street 0
Side 0
City 83
County 0
State 0
Zipcode 880
Country 0
Timezone 3163
Airport_Code 5691
Weather_Timestamp 36705
Temperature(F) 56063
Wind_Chill(F) 1852623
Humidity(%) 59173
Pressure(in) 48142
Visibility(mi) 65691
Wind_Direction 45101
Wind_Speed(mph) 440840
Precipitation(in) 1998358
Weather_Condition 65932
Amenity 0
Bump 0
Crossing 0
Give_Way 0
Junction 0
No_Exit 0
Railway 0
Roundabout 0
Station 0
Stop 0
Traffic_Calming 0
Traffic_Signal 0
Turning_Loop 0
Sunrise_Sunset 93
Civil_Twilight 93
Nautical_Twilight 93
Astronomical_Twilight 93
dtype: int64
可以看出缺失值较多,不适合使用通用填充法填充。选择不填充,等需要用到该列数据时单独进行缺失值填充。
数据分析
①事故发生最多的州
data.State.value_counts()
CA 663204
TX 298062
FL 223746
SC 146689
NC 142460
NY 137799
PA 90395
MI 88694
IL 86390
GA 83620
VA 79957
OR 70840
MN 62727
AZ 62330
WA 61367
TN 58289
OH 55863
LA 52481
OK 51297
NJ 49942
MD 43328
UT 41385
CO 40124
AL 36369
MA 33014
IN 30040
MO 29012
CT 22803
NE 22505
KY 19122
WI 17580
RI 10483
IA 10346
NV 9524
NH 7064
KS 6887
MS 5961
NM 5020
DE 4434
DC 3653
WV 2274
ME 2065
ID 1757
AR 1749
VT 585
MT 504
WY 492
SD 60
ND 43
Name: State, dtype: int64
可以看出,简称为CA的州的交通事故最多。通过查询美国各州的简称,可以知道CA意指加利福尼亚。其为美国最大的州,经济总量约等于世界第五大经济体,而其他几个交通事故排名靠前的州也是美国经济较为发达的州。判断经济活动较多的州发生交通事故越多。
2.哪个时间最容易发生事故,发生的事故是怎么样一个变化趋势?
#查看每年的事故发生 #先将发生事故的时间转换为时间格式
data["time"]=pd.to_datetime(data.Start_Time, format='%Y-%m-%d %H:%M:%S')
#查看每年事故数量
pd.DatetimeIndex(data["time"]).year.value_counts()
2019 953630
2018 892615
2017 717483
2016 410600
2020 6
2015 1
Name: time, dtype: int64
数据来源于2016/2至2019/12月份数据,明显2020年和2015年的数据异常。前文计划需要使用某列数据时发现异常值进行现场处理。在这里将年份2015数据归于2016年,2020年数据归于2019年,即:
#处理异常值
data[pd.DatetimeIndex(data["time"]).year == 2015]="2016"
data[pd.DatetimeIndex(data["time"]).year == 2020]="2019"
#再次查看年份数据
pd.DatetimeIndex(data["time"]).year.value_counts()
2019 953636
2018 892615
2017 717483
2016 410601
Name: time, dtype: int64
#年份数据变化趋势
pd.DatetimeIndex(data["time"]).year.value_counts().plot(kind='line',title="accident count by year")
随着年份的增长,事故呈现上升的趋势,其中2016年到2017事故增长率最高,同时,2016年的事故大概只有2019年的一半(2016年缺失一个月的数据,2月到12月)。
对月份进行分析
#按月份事故的分布,并用条形图表示
pd.DatetimeIndex(data["time"]).year.value_counts().plot(kind='bar',title="accident by month")
可以看出后半年的事故前半年的事故多,下半年时间开车更需要注意安全。
按照每周的上班时间的进行分析
#每周事故异常
pd.DatetimeIndex(data["time"]).weekday.value_counts().plot(kind = "bar",title="accident by weekday")
由上图,发生在周二的事故最多,平均上班时间的事故远远多于周末时间的交通事故。
对每天事故发生时间段数据分析
#每天各个时间段的事故数量 pd.DatetimeIndex(data["time"]).hour.value_counts().plot(kind = "bar",title="accident by DayHour") #输出
如上图,事故发生比较集中在早晚高峰,人流上线班的时间。事故发生的最多。
3.事故与天气有什么样的关系?
根据上述信息,我们需要观察weather_condition与事故的关系,但是字段weather__condition有较多的缺失值。需要进行空值处理。
#在数据集中我们可以明显的看到,数据集的事故是根据事故发生的时间进行排序的,所以我们可以使用后值填充前值进行,向前填充
data["Weather_Condition"]=data["Weather_Condition"].fillna(method='bfill')#使用空值后面的值向前填充,同理也可以向前填充
#数值填充后对字段进行空值检查
data["Weather_Condition"].isnull().sum()
0
从上述可以看出,字段weather_condition已经没有空值了,可以对其进行后续分析。
#事故发生时前二十大天气
data["Weather_Condition"].value_counts().head(20).plot(kind = "bar",title = "The accident counts by Weather_Condition",color="orange")
#输出
可以看出,事故发生时大都是有良好的天气条件下。而这些天气对事故具体有哪些影响?我们选取排名前五的事故天气和五个极端的天气条件,分别观察这些天气下各种事故占比.
for s in ["Clear","Mostly Cloudy","Overcast","Fair","Partly Cloudy","Fog","Light Rain","Rain","Heavy Rain","Snow"]:
plt.subplots(1,2,figsize=(20,8))
plt.suptitle('accident count by' + s,fontsize=20)
plt.subplot(1,2,1)
data.loc[data["Weather_Condition"] == s]['Severity'].value_counts().plot.bar()
plt.xlabel('Severity',fontsize=20)