【大数据】—美国交通事故分析(2016 年 2 月至 2020 年 12 月) ...

打印 上一主题 下一主题

主题 657|帖子 657|积分 1971

引言

在当今快速发展的数字时代,大数据已成为我们理解世界、做出决策的重要工具。特别是在交通安全范畴,大数据分析能够揭示事故模式、辨认风险因素,并资助订定防备措施,从而挽救生命。本文将深入探讨2016年2月至2020年12月期间,美国交通事故的大数据集,旨在通过数据分析揭示交通事故的内涵规律和趋势。
配景

这是一个美国天下性的车祸数据集,涵盖美国 49 个州。事故数据是在 2016 年 2 月至 2020 年 12 月期间网络的,利用多个提供流式交通事件(或事件)数据的 API。这些 API 由各种实体捕捉的交通数据,例如美国和州交通部门、执法机构、交通摄像头和门路网络内的交通传感器获取。目前,该数据会合约有 773万条事故记录。
目的

从Excel 2007开始,读取行数上限增加到了1,048,576行,超出的行数就不能被打开了,工作中目前能碰到的也就1万多不到2万条数据。今天用下图数据集测试家用电脑的数据承载能力,3.06G相当大了,工作中基本是遇不到这么大的数据。

数据集信息



  • ID: 事故记录的唯一标识符。
  • Severity: 事故严峻水平,从1到4的数字,1表示对交通影响最小,4表示影响最大。
  • Start_Time 和 End_Time: 事故开始和竣事时间,以当地时间表示。
  • Start_Lat 和 Start_Lng: 事故开始点的经纬度坐标。
  • End_Lat 和 End_Lng: 事故影响竣事点的经纬度坐标,可能为空。
  • 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, Bump, Crossing, Give_Way, Junction, No_Exit, Railway,
    Roundabout, Station, Stop, Traffic_Calming, Traffic_Signal,
    Turning_Loop: 事故地点附近的各种兴趣点(POI)的表明。
探索性分析(EDA):

读入数据:

  1. # import all necesary libraries
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. import matplotlib.ticker as ticker
  6. import matplotlib.patches as mpatches
  7. %matplotlib inline
  8. import seaborn as sns
  9. import calendar
  10. import plotly as pt
  11. from plotly import graph_objs as go
  12. import plotly.express as px
  13. import plotly.figure_factory as ff
  14. from pylab import *
  15. import matplotlib.patheffects as PathEffects
  16. import descartes
  17. import geopandas as gpd
  18. from Levenshtein import distance
  19. from itertools import product
  20. from fuzzywuzzy import fuzz
  21. from fuzzywuzzy import process
  22. from scipy.spatial.distance import pdist, squareform
  23. from shapely.geometry import Point, Polygon
  24. import geoplot
  25. from geopy.geocoders import Nominatim
  26. import warnings
  27. warnings.filterwarnings('ignore')
  28. plt.rcParams['font.family'] = "Microsoft JhengHei UI Light"
  29. plt.rcParams['font.serif'] = ["Microsoft JhengHei UI Light"]
复制代码

上面我们测试了一下将7728394行,46列数据读入内存的时间,总用时35.2秒:

CPU时间:


  • 用户时间(User time):25.1秒。这是步伐在用户模式下运行所花费的时间,即步伐执行自己的代码(不包括操作体系调用)所花费的时间。这个时间重要反映了步伐自己的工作负载。
  • 体系时间(Systime):7.32秒。这是步伐在内核模式下运行所花费的时间,即步伐执行操作体系调用(如文件I/O、内存管理等)所花费的时间。这个时间反映了步伐与操作体系交互的频率和复杂度。
  • 总CPU时间(Total CPU time):32.4秒。这是用户时间和体系时间的总和,表示步伐在CPU上总共花费的时间。
墙钟时间(Wall time):
总共用时35.2秒。这是从开始执行步伐到步伐竣事所经过的现实时间,包括CPU时间、等候时间(如等候I/O操作完成)、步伐不运行的时间(如等候其他进程释放资源)等。
数据可视化

  1. city_df = pd.DataFrame(df['City'].value_counts()).reset_index().rename(columns={'index':'City', 'City':'Cases'})
  2. top_10_cities = pd.DataFrame(city_df.head(10))
  3. fig, ax = plt.subplots(figsize = (12,7), dpi = 80)
  4. cmap = cm.get_cmap('rainbow', 10)   
  5. clrs = [matplotlib.colors.rgb2hex(cmap(i)) for i in range(cmap.N)]
  6. ax=sns.barplot(y=top_10_cities['Cases'], x=top_10_cities['City'], palette='rainbow')
  7. total = sum(city_df['Cases'])
  8. for i in ax.patches:
  9.     ax.text(i.get_x()+.03, i.get_height()-2500, \
  10.             str(round((i.get_height()/total)*100, 2))+'%', fontsize=15, weight='bold',
  11.                 color='white')
  12. plt.title('\nTop 10 Cities in US with most no. of \nRoad Accident Cases (2016-2020)\n', size=20, color='grey')
  13. plt.rcParams['font.family'] = "Microsoft JhengHei UI Light"
  14. plt.rcParams['font.serif'] = ["Microsoft JhengHei UI Light"]
  15. plt.ylim(1000, 50000)
  16. plt.xticks(rotation=10, fontsize=12)
  17. plt.yticks(fontsize=12)
  18. ax.set_xlabel('\nCities\n', fontsize=15, color='grey')
  19. ax.set_ylabel('\nAccident Cases\n', fontsize=15, color='grey')
  20. for i in ['bottom', 'left']:
  21.     ax.spines[i].set_color('white')
  22.     ax.spines[i].set_linewidth(1.5)
  23.    
  24. right_side = ax.spines["right"]
  25. right_side.set_visible(False)
  26. top_side = ax.spines["top"]
  27. top_side.set_visible(False)
  28. ax.set_axisbelow(True)
  29. ax.grid(color='#b2d6c7', linewidth=1, axis='y', alpha=.3)
  30. MA = mpatches.Patch(color=clrs[0], label='City with Maximum\n no. of Road Accidents')
  31. ax.legend(handles=[MA], prop={'size': 10.5}, loc='best', borderpad=1,
  32.           labelcolor=clrs[0], edgecolor='white');
  33. plt.show()
复制代码
从上图可以看出,美国的门路交通事故(2016-2020 年)数量最多的都会是洛杉矶,占全部交通事故的比重为2.64%,排名第二的都会是迈阿密,占全部交通事故的比重为2.39%。已往5年中大约有14%的事故仅来自美国10657个都会中的这10个都会。
已往 5 年(2016-2020 年)中,洛杉矶每年均匀发生 7,997 起交通事故.
  1. states = gpd.read_file('../input/us-states-map')
  2. def lat(city):
  3.     address=city
  4.     geolocator = Nominatim(user_agent="Your_Name")
  5.     location = geolocator.geocode(address)
  6.     return (location.latitude)
  7. def lng(city):
  8.     address=city
  9.     geolocator = Nominatim(user_agent="Your_Name")
  10.     location = geolocator.geocode(address)
  11.     return (location.longitude)
  12. # list of top 10 cities
  13. top_ten_city_list = list(city_df.City.head(10))
  14. top_ten_city_lat_dict = {}
  15. top_ten_city_lng_dict = {}
  16. for i in top_ten_city_list:
  17.     top_ten_city_lat_dict[i] = lat(i)
  18.     top_ten_city_lng_dict[i] = lng(i)
  19.    
  20. top_10_cities_df = df[df['City'].isin(list(top_10_cities.City))]
  21. top_10_cities_df['New_Start_Lat'] = top_10_cities_df['City'].map(top_ten_city_lat_dict)
  22. top_10_cities_df['New_Start_Lng'] = top_10_cities_df['City'].map(top_ten_city_lng_dict)
复制代码
  1. geometry_cities = [Point(xy) for xy in zip(top_10_cities_df['New_Start_Lng'], top_10_cities_df['New_Start_Lat'])]
  2. geo_df_cities = gpd.GeoDataFrame(top_10_cities_df, geometry=geometry_cities)
复制代码
  1. fig, ax = plt.subplots(figsize=(15,15))
  2. ax.set_xlim([-125,-65])
  3. ax.set_ylim([22,55])
  4. states.boundary.plot(ax=ax, color='grey');
  5. colors = ['#e6194B','#f58231','#ffe119','#bfef45','#3cb44b', '#aaffc3','#42d4f4','#4363d8','#911eb4','#f032e6']
  6. markersizes = [50+(i*20) for i in range(10)][::-1]
  7. for i in range(10):
  8.     geo_df_cities[geo_df_cities['City'] == top_ten_city_list[i]].plot(ax=ax, markersize=markersizes[i],
  9.                                                                       color=colors[i], marker='o',
  10.                                                                       label=top_ten_city_list[i], alpha=0.7);
  11.    
  12. plt.legend(prop={'size': 13}, loc='best', bbox_to_anchor=(0.5, 0., 0.5, 0.5), edgecolor='white', title="Cities", title_fontsize=15);
  13. for i in ['bottom', 'top', 'left', 'right']:
  14.     side = ax.spines[i]
  15.     side.set_visible(False)
  16.    
  17. plt.tick_params(top=False, bottom=False, left=False, right=False,
  18.                 labelleft=False, labelbottom=False)
  19. plt.title('\nVisualization of Top 10 Accident Prone Cities in US (2016-2020)', size=20, color='grey');
复制代码
交通事故排名前10的都会有3个不属于加利福尼亚州。
  1. def city_cases_percentage(val, operator):
  2.     if operator == '<':
  3.         res = city_df[city_df['Cases']<val].shape[0]
  4.     elif operator == '>':
  5.         res = city_df[city_df['Cases']>val].shape[0]
  6.     elif operator == '=':
  7.         res = city_df[city_df['Cases']==val].shape[0]
  8.     print(f'{res} Cities, {round(res*100/city_df.shape[0], 2)}%')
  9.    
  10.    
  11. city_cases_percentage(1, '=')
  12. city_cases_percentage(100, '<')
  13. city_cases_percentage(1000, '<')
  14. city_cases_percentage(1000, '>')
  15. city_cases_percentage(5000, '>')
  16. city_cases_percentage(10000, '>')
复制代码

在此数据会合,我们总共有 10,657 个都会的记录:
在已往5年,只发生1起事故的都会有1167个,占美国全部都会的比重为11%。
在已往5年,美国全部的都会中,有8682个都会事故少于100起,占美国全部都会的比重为81%。
在已往5年,美国全部的都会中,有10406个都会事故少于1000起。
在已往5年,美国全部的都会中,有251个都会事故多于1000起。
在已往5年,美国全部的都会中,有40个都会事故多于5000起。
在已往5年,美国只有13个都会事故凌驾10000起。

  1. # create a dictionary using US State code and their corresponding Name
  2. us_states = {'AK': 'Alaska',
  3. 'AL': 'Alabama',
  4. 'AR': 'Arkansas',
  5. 'AS': 'American Samoa',
  6. 'AZ': 'Arizona',
  7. 'CA': 'California',
  8. 'CO': 'Colorado',
  9. 'CT': 'Connecticut',
  10. 'DC': 'District of Columbia',
  11. 'DE': 'Delaware',
  12. 'FL': 'Florida',
  13. 'GA': 'Georgia',
  14. 'GU': 'Guam',
  15. 'HI': 'Hawaii',
  16. 'IA': 'Iowa',
  17. 'ID': 'Idaho',
  18. 'IL': 'Illinois',
  19. 'IN': 'Indiana',
  20. 'KS': 'Kansas',
  21. 'KY': 'Kentucky',
  22. 'LA': 'Louisiana',
  23. 'MA': 'Massachusetts',
  24. 'MD': 'Maryland',
  25. 'ME': 'Maine',
  26. 'MI': 'Michigan',
  27. 'MN': 'Minnesota',
  28. 'MO': 'Missouri',
  29. 'MP': 'Northern Mariana Islands',
  30. 'MS': 'Mississippi',
  31. 'MT': 'Montana',
  32. 'NC': 'North Carolina',
  33. 'ND': 'North Dakota',
  34. 'NE': 'Nebraska',
  35. 'NH': 'New Hampshire',
  36. 'NJ': 'New Jersey',
  37. 'NM': 'New Mexico',
  38. 'NV': 'Nevada',
  39. 'NY': 'New York',
  40. 'OH': 'Ohio',
  41. 'OK': 'Oklahoma',
  42. 'OR': 'Oregon',
  43. 'PA': 'Pennsylvania',
  44. 'PR': 'Puerto Rico',
  45. 'RI': 'Rhode Island',
  46. 'SC': 'South Carolina',
  47. 'SD': 'South Dakota',
  48. 'TN': 'Tennessee',
  49. 'TX': 'Texas',
  50. 'UT': 'Utah',
  51. 'VA': 'Virginia',
  52. 'VI': 'Virgin Islands',
  53. 'VT': 'Vermont',
  54. 'WA': 'Washington',
  55. 'WI': 'Wisconsin',
  56. 'WV': 'West Virginia',
  57. 'WY': 'Wyoming'}
  58. # create a dataframe of State and their corresponding accident cases
  59. state_df = pd.DataFrame(df['State'].value_counts()).reset_index().rename(columns={'index':'State', 'State':'Cases'})
  60. # Function to convert the State Code with the actual corressponding Name
  61. def convert(x): return us_states[x]
  62. state_df['State'] = state_df['State'].apply(convert)
  63. top_ten_states_name = list(state_df['State'].head(10))
复制代码
  1. fig, ax = plt.subplots(figsize = (12,6), dpi = 80)
  2. cmap = cm.get_cmap('winter', 10)   
  3. clrs = [matplotlib.colors.rgb2hex(cmap(i)) for i in range(cmap.N)]
  4. ax=sns.barplot(y=state_df['Cases'].head(10), x=state_df['State'].head(10), palette='winter')
  5. ax1 = ax.twinx()
  6. sns.lineplot(data = state_df[:10], marker='o', x='State', y='Cases', color = 'white', alpha = .8)
  7. total = df.shape[0]
  8. for i in ax.patches:
  9.     ax.text(i.get_x()-0.2, i.get_height()+10000, \
  10.             ' {:,d}\n  ({}%) '.format(int(i.get_height()), round(100*i.get_height()/total, 1)), fontsize=15,
  11.                 color='black')
  12. ax.set(ylim =(-10000, 600000))
  13. ax1.set(ylim =(-100000, 1700000))
  14. plt.title('\nTop 10 States with most no. of \nAccident cases in US (2016-2020)\n', size=20, color='grey')
  15. ax1.axes.yaxis.set_visible(False)
  16. ax.set_xlabel('\nStates\n', fontsize=15, color='grey')
  17. ax.set_ylabel('\nAccident Cases\n', fontsize=15, color='grey')
  18. for i in ['top','right']:
  19.     side1 = ax.spines[i]
  20.     side1.set_visible(False)
  21.     side2 = ax1.spines[i]
  22.     side2.set_visible(False)
  23.    
  24. ax.set_axisbelow(True)
  25. ax.grid(color='#b2d6c7', linewidth=1, axis='y', alpha=.3)
  26. ax.spines['bottom'].set_bounds(0.005, 9)
  27. ax.spines['left'].set_bounds(0, 600000)
  28. ax1.spines['bottom'].set_bounds(0.005, 9)
  29. ax1.spines['left'].set_bounds(0, 600000)
  30. ax.tick_params(axis='y', which='major', labelsize=10.6)
  31. ax.tick_params(axis='x', which='major', labelsize=10.6, rotation=10)
  32. MA = mpatches.Patch(color=clrs[0], label='State with Maximum\n no. of Road Accidents')
  33. ax.legend(handles=[MA], prop={'size': 10.5}, loc='best', borderpad=1,
  34.           labelcolor=clrs[0], edgecolor='white');
复制代码
在已往5年,美国全部的都会中,加利福尼亚州是事故排名最高的州,约占全部交通事故的比重为30%,均匀每天发生246起事故,意味着每小时约10起交通事故。
佛罗里达州是事故排名第二的州,约占全部交通事故的比重为10%。
  1. geometry = [Point(xy) for xy in zip(df['Start_Lng'], df['Start_Lat'])]
  2. geo_df = gpd.GeoDataFrame(df, geometry=geometry)
  3. geo_df['year'] = geo_df.Start_Time.dt.year
  4. geo_df['State'] = geo_df['State'].apply(convert)
复制代码
  1. fig, ax = plt.subplots(figsize=(15,15))
  2. ax.set_xlim([-125,-65])
  3. ax.set_ylim([22,55])
  4. states.boundary.plot(ax=ax, color='grey');
  5. states.apply(lambda x: None if (x.NAME not in top_ten_states_name) else ax.annotate(s=x.NAME, xy=x.geometry.centroid.coords[0], ha='center', color='black', weight='bold', fontsize=12.5), axis=1);
  6. # CFOTNYMVNPI
  7. colors = ['#FF5252','#9575CD','#FF8A80','#FF4081','#FFEE58','#7C4DFF','#00E5FF','#81D4FA','#64FFDA','#8C9EFF']
  8. count = 0
  9. for i in list(state_df['State'].head(10)):
  10.     geo_df[geo_df['State'] == i].plot(ax=ax, markersize=1, color=colors[count], marker='o');
  11.     count += 1
  12. for i in ['bottom', 'top', 'left', 'right']:
  13.     side = ax.spines[i]
  14.     side.set_visible(False)
  15.    
  16. plt.tick_params(top=False, bottom=False, left=False, right=False,
  17.                 labelleft=False, labelbottom=False)
  18. plt.title('\nVisualization of Top 10 Accident Prone States in US (2016-2020)', size=20, color='grey');
复制代码

  1. fig, ax = plt.subplots(figsize = (12,6), dpi = 80)
  2. cmap = cm.get_cmap('cool', 10)   
  3. clrs = [matplotlib.colors.rgb2hex(cmap(i)) for i in range(cmap.N)]
  4. ax=sns.barplot(y=state_df['Cases'].tail(10), x=state_df['State'].tail(10), palette='cool')
  5. ax1 = ax.twinx()
  6. sns.lineplot(data = state_df[-10:], marker='o', x='State', y='Cases', color = 'white', alpha = .8)
  7. total = df.shape[0]
  8. for i in ax.patches:
  9.     ax.text(i.get_x()-0.1, i.get_height()+100, \
  10.             '  {:,d}\n({}%) '.format(int(i.get_height()), round(100*i.get_height()/total, 2)), fontsize=15,
  11.                 color='black')
  12. ax.set(ylim =(-50, 5000))
  13. ax1.set(ylim =(-50, 6000))
  14. plt.title('\nTop 10 States with least no. of \nAccident cases in US (2016-2020)\n', size=20, color='grey')
  15. ax1.axes.yaxis.set_visible(False)
  16. ax.set_xlabel('\nStates\n', fontsize=15, color='grey')
  17. ax.set_ylabel('\nAccident Cases\n', fontsize=15, color='grey')
  18. for i in ['top', 'right']:
  19.     side = ax.spines[i]
  20.     side.set_visible(False)
  21.     side1 = ax1.spines[i]
  22.     side1.set_visible(False)
  23.    
  24.    
  25. ax.set_axisbelow(True)
  26. ax.grid(color='#b2d6c7', linewidth=1, axis='y', alpha=.3)
  27. ax.spines['bottom'].set_bounds(0.005, 9)
  28. ax.spines['left'].set_bounds(0, 5000)
  29. ax1.spines['bottom'].set_bounds(0.005, 9)
  30. ax1.spines['left'].set_bounds(0, 5000)
  31. ax.tick_params(axis='y', which='major', labelsize=11)
  32. ax.tick_params(axis='x', which='major', labelsize=11, rotation=15)
  33. MI = mpatches.Patch(color=clrs[-1], label='State with Minimum\n no. of Road Accidents')
  34. ax.legend(handles=[MI], prop={'size': 10.5}, loc='best', borderpad=1,
  35.           labelcolor=clrs[-1], edgecolor='white');
复制代码
在已往5年,美国全部的都会中,南达科他州是事故排名数量最低的都会,仅发生了213起事故,意味着均匀每年发生42起事故。
  1. timezone_df = pd.DataFrame(df['Timezone'].value_counts()).reset_index().rename(columns={'index':'Timezone', 'Timezone':'Cases'})
复制代码
  1. fig, ax = plt.subplots(figsize = (10,6), dpi = 80)
  2. cmap = cm.get_cmap('spring', 4)   
  3. clrs = [matplotlib.colors.rgb2hex(cmap(i)) for i in range(cmap.N)]
  4. ax=sns.barplot(y=timezone_df['Cases'], x=timezone_df['Timezone'], palette='spring')
  5. total = df.shape[0]
  6. for i in ax.patches:
  7.     ax.text(i.get_x()+0.3, i.get_height()-50000, \
  8.             '{}%'.format(round(i.get_height()*100/total)), fontsize=15,weight='bold',
  9.                 color='white')
  10.    
  11. plt.ylim(-20000, 700000)
  12. plt.title('\nPercentage of Accident Cases for \ndifferent Timezone in US (2016-2020)\n', size=20, color='grey')
  13. plt.ylabel('\nAccident Cases\n', fontsize=15, color='grey')
  14. plt.xlabel('\nTimezones\n', fontsize=15, color='grey')
  15. plt.xticks(fontsize=13)
  16. plt.yticks(fontsize=12)
  17. for i in ['top', 'right']:
  18.     side = ax.spines[i]
  19.     side.set_visible(False)
  20.    
  21. ax.set_axisbelow(True)
  22. ax.grid(color='#b2d6c7', linewidth=1, axis='y', alpha=.3)
  23. ax.spines['bottom'].set_bounds(0.005, 3)
  24. ax.spines['left'].set_bounds(0, 700000)
  25. MA = mpatches.Patch(color=clrs[0], label='Timezone with Maximum\n no. of Road Accidents')
  26. MI = mpatches.Patch(color=clrs[-1], label='Timezone with Minimum\n no. of Road Accidents')
  27. ax.legend(handles=[MA, MI], prop={'size': 10.5}, loc='best', borderpad=1,
  28.           labelcolor=[clrs[0], 'grey'], edgecolor='white');
复制代码
从时区来看,美国东部时区交通事故案件最高,占全部事故案件比重为39%,山区时区数量最低,占比仅为6%。
  1. fig, ax = plt.subplots(figsize=(15,15))
  2. ax.set_xlim([-125,-65])
  3. ax.set_ylim([22,55])
  4. states.boundary.plot(ax=ax, color='black');
  5. colors = ['#00db49', '#ff5e29', '#88ff33', '#fffb29']
  6. #4132
  7. count = 0
  8. for i in list(timezone_df.Timezone):
  9.     geo_df[geo_df['Timezone'] == i].plot(ax=ax, markersize=1, color=colors[count], marker='o', label=i);
  10.     count += 1
  11. plt.legend(markerscale=10., prop={'size': 15}, edgecolor='white', title="Timezones", title_fontsize=15, loc='lower right');
  12. for i in ['bottom', 'top', 'left', 'right']:
  13.     side = ax.spines[i]
  14.     side.set_visible(False)
  15.    
  16. plt.tick_params(top=False, bottom=False, left=False, right=False,
  17.                 labelleft=False, labelbottom=False)
  18. plt.title('\nVisualization of Road Accidents \nfor different Timezones in US (2016-2020)', size=20, color='grey');
复制代码

  1. street_df = pd.DataFrame(df['Street'].value_counts()).reset_index().rename(columns={'index':'Street No.', 'Street':'Cases'})
  2. top_ten_streets_df = pd.DataFrame(street_df.head(10))
复制代码
  1. fig, ax = plt.subplots(figsize = (12,6), dpi = 80)
  2.         
  3. cmap = cm.get_cmap('gnuplot2', 10)   
  4. clrs = [matplotlib.colors.rgb2hex(cmap(i)) for i in range(cmap.N)]
  5. ax=sns.barplot(y=top_ten_streets_df['Cases'], x=top_ten_streets_df['Street No.'], palette='gnuplot2')
  6. ax1 = ax.twinx()
  7. sns.lineplot(data = top_ten_streets_df, marker='o', x='Street No.', y='Cases', color = 'white', alpha = .8)
  8. total = df.shape[0]
  9. for i in ax.patches:
  10.     ax.text(i.get_x()+0.04, i.get_height()-2000, \
  11.             '{:,d}'.format(int(i.get_height())), fontsize=12.5,weight='bold',
  12.                 color='white')
  13.    
  14. ax.axes.set_ylim(-1000, 30000)
  15. ax1.axes.set_ylim(-1000, 40000)
  16. plt.title('\nTop 10 Accident Prone Streets in US (2016-2020)\n', size=20, color='grey')
  17. ax1.axes.yaxis.set_visible(False)
  18. ax.set_xlabel('\nStreet No.\n', fontsize=15, color='grey')
  19. ax.set_ylabel('\nAccident Cases\n', fontsize=15, color='grey')
  20. for i in ['top','right']:
  21.     side1 = ax.spines[i]
  22.     side1.set_visible(False)
  23.     side2 = ax1.spines[i]
  24.     side2.set_visible(False)
  25.    
  26. ax.set_axisbelow(True)
  27. ax.grid(color='#b2d6c7', linewidth=1, axis='y', alpha=.3)
  28. ax.spines['bottom'].set_bounds(0.005, 9)
  29. ax.spines['left'].set_bounds(0, 30000)
  30. ax1.spines['bottom'].set_bounds(0.005, 9)
  31. ax1.spines['left'].set_bounds(0, 30000)
  32. ax.tick_params(axis='both', which='major', labelsize=12)
  33. MA = mpatches.Patch(color=clrs[1], label='Street with Maximum\n no. of Road Accidents')
  34. MI = mpatches.Patch(color=clrs[-2], label='Street with Minimum\n no. of Road Accidents')
  35. ax.legend(handles=[MA, MI], prop={'size': 10.5}, loc='best', borderpad=1,
  36.           labelcolor=[clrs[1], 'grey'], edgecolor='white');
复制代码

在已往5年,美国全部的街道中,I-5 N 号街道事故记录最高,均匀每天发生14起事故。
  1. def street_cases_percentage(val, operator):
  2.     if operator == '=':
  3.         val = street_df[street_df['Cases']==val].shape[0]
  4.     elif operator == '>':
  5.         val = street_df[street_df['Cases']>val].shape[0]
  6.     elif operator == '<':
  7.         val = street_df[street_df['Cases']<val].shape[0]
  8.     print('{:,d} Streets, {}%'.format(val, round(val*100/street_df.shape[0], 2)))
  9.    
  10.    
  11. street_cases_percentage(1, '=')
  12. street_cases_percentage(100, '<')
  13. street_cases_percentage(1000, '<')
  14. street_cases_percentage(1000, '>')
  15. street_cases_percentage(5000, '>')
复制代码
在已往5年,美国有93048条街道发买卖外事故。此中,36441条街道(39%)在已往5年只有1起事故;98%的街道事故少于100起;街道事故凌驾1000起的仅占0.2%。有24条街道事故超5000起。
  1. severity_df = pd.DataFrame(df['Severity'].value_counts()).rename(columns={'index':'Severity', 'Severity':'Cases'})
  2. fig = go.Figure(go.Funnelarea(
  3.     text = ["Severity - 2","Severity - 3", "Severity - 4", "Severity - 1"],
  4.     values = severity_df.Cases,
  5.     title = {"position": "top center",
  6.              "text": "<b>Impact on the Traffic due to the Accidents</b>",
  7.              'font':dict(size=18,color="#7f7f7f")},
  8.     marker = {"colors": ['#14a3ee', '#b4e6ee', '#fdf4b8', '#ff4f4e'],
  9.                 "line": {"color": ["#e8e8e8", "wheat", "wheat", "wheat"], "width": [7, 0, 0, 2]}}
  10.     ))
  11. fig.show()
复制代码

在已往5年中,有80%事故对交通影响为中等,严峻影响的仅占7.5%。
  1. fig, ax = plt.subplots(figsize=(15,15))
  2. ax.set_xlim([-125,-65])
  3. ax.set_ylim([22,55])
  4. states.boundary.plot(ax=ax, color='black');
  5. geo_df[geo_df['Severity'] == 1].plot(ax=ax, markersize=50, color='#5cff4a', marker='o', label='Severity 1');
  6. geo_df[geo_df['Severity'] == 3].plot(ax=ax, markersize=10, color='#ff1c1c', marker='x', label='Severity 3');
  7. geo_df[geo_df['Severity'] == 4].plot(ax=ax, markersize=1, color='#6459ff', marker='v', label='Severity 4');
  8. geo_df[geo_df['Severity'] == 2].plot(ax=ax, markersize=5, color='#ffb340', marker='+', label='Severity 2');
  9. for i in ['bottom', 'top', 'left', 'right']:
  10.     side = ax.spines[i]
  11.     side.set_visible(False)
  12.    
  13. plt.tick_params(top=False, bottom=False, left=False, right=False,
  14.                 labelleft=False, labelbottom=False)
  15. plt.title('\nDifferent level of Severity visualization in US map', size=20, color='grey');
  16. One = mpatches.Patch(color='#5cff4a', label='Severity 1')
  17. Two = mpatches.Patch(color='#ffb340', label='Severity 2')
  18. Three = mpatches.Patch(color='#ff1c1c', label='Severity 3')
  19. Four = mpatches.Patch(color='#6459ff', label='Severity 4')
  20. ax.legend(handles=[One, Two, Three, Four], prop={'size': 15}, loc='lower right', borderpad=1,
  21.           labelcolor=['#5cff4a', '#ffb340', '#ff1c1c', '#6459ff'], edgecolor='white');
复制代码

  1. accident_duration_df = pd.DataFrame(df['End_Time'] - df['Start_Time']).reset_index().rename(columns={'index':'Id', 0:'Duration'})
  2. top_10_accident_duration_df = pd.DataFrame(accident_duration_df['Duration'].value_counts().head(10).sample(frac = 1)).reset_index().rename(columns={'index':'Duration', 'Duration':'Cases'})
  3. Duration = [str(i).split('days')[-1].strip() for i in top_10_accident_duration_df.Duration]
  4. top_10_accident_duration_df['Duration'] = Duration
复制代码
  1. fig, ax = plt.subplots(figsize = (12,6), dpi = 80)
  2. ax.set_facecolor('#e6f2ed')
  3. fig.patch.set_facecolor('#e6f2ed')
  4. cmap = cm.get_cmap('bwr', 10)   
  5. clrs = [matplotlib.colors.rgb2hex(cmap(i)) for i in range(cmap.N)]
  6. ax=sns.barplot(y=top_10_accident_duration_df['Cases'], x=top_10_accident_duration_df['Duration'], palette='bwr')
  7. ax1 = ax.twinx()
  8. sns.lineplot(data = top_10_accident_duration_df, marker='o', x='Duration', y='Cases', color = 'white', alpha = 1)
  9. total = df.shape[0]
  10. for i in ax.patches:
  11.     ax.text(i.get_x(), i.get_height()+5000, \
  12.             str(round((i.get_height()/total)*100, 2))+'%', fontsize=15,
  13.                 color='black')
  14. ax.set(ylim =(1000, 400000))
  15. ax1.set(ylim =(1000, 500000))
  16. plt.title('\nMost Impacted Durations on the \nTraffic flow due to the Accidents \n', size=20, color='grey')
  17. ax1.axes.yaxis.set_visible(False)
  18. ax.set_xlabel('\nDuration of Accident (HH:MM:SS)\n', fontsize=15, color='grey')
  19. ax.set_ylabel('\nAccident Cases\n', fontsize=15, color='grey')
  20. for i in ['bottom', 'top', 'left', 'right']:
  21.     ax.spines[i].set_color('white')
  22.     ax.spines[i].set_linewidth(1.5)
  23.     ax1.spines[i].set_color('white')
  24.     ax1.spines[i].set_linewidth(1.5)
  25.    
  26. ax.set_axisbelow(True)
  27. ax.grid(color='white', linewidth=1.5)
  28. ax.tick_params(axis='both', which='major', labelsize=12)
  29. MA = mpatches.Patch(color=clrs[-3], label='Duration with Maximum\n no. of Road Accidents')
  30. ax.legend(handles=[MA], prop={'size': 10.5}, loc='best', borderpad=1,
  31.           labelcolor=clrs[-3], facecolor='#e6f2ed', edgecolor='#e6f2ed');
复制代码

从上图可以推断,大部分(24.25%)门路交通事故对交通流量的影响持续了6小时。
  1. year_df = pd.DataFrame(df.Start_Time.dt.year.value_counts()).reset_index().rename(columns={'index':'Year', 'Start_Time':'Cases'}).sort_values(by='Cases', ascending=True)
复制代码
  1. fig, ax = plt.subplots(figsize = (12,6), dpi = 80)
  2. ax=sns.barplot(y=year_df['Cases'], x=year_df['Year'], palette=['#9a90e8', '#5d82de', '#3ee6e0', '#40ff53','#2ee88e'])
  3. total = df.shape[0]
  4. for i in ax.patches:
  5.     ax.text(i.get_x()+0.2, i.get_height()-50000, \
  6.             str(round((i.get_height()/total)*100, 2))+'%', fontsize=15,weight='bold',
  7.                 color='white')
  8. plt.ylim(10000, 900000)
  9. plt.title('\nRoad Accident Percentage \nover past 5 Years in US (2016-2020)\n', size=20, color='grey')
  10. plt.ylabel('\nAccident Cases\n', fontsize=15, color='grey')
  11. plt.xlabel('\nYears\n', fontsize=15, color='grey')
  12. plt.xticks(fontsize=13)
  13. plt.yticks(fontsize=12)
  14. for i in ['bottom', 'top', 'left', 'right']:
  15.     ax.spines[i].set_color('white')
  16.     ax.spines[i].set_linewidth(1.5)
  17.    
  18. for k in ['top', 'right', "bottom", 'left']:
  19.         side = ax.spines[k]
  20.         side.set_visible(False)
  21. ax.set_axisbelow(True)
  22. ax.grid(color='#b2d6c7', linewidth=1, axis='y', alpha=0.3)
  23. MA = mpatches.Patch(color='#2ee88e', label='Year with Maximum\n no. of Road Accidents')
  24. MI = mpatches.Patch(color='#9a90e8', label='Year with Minimum\n no. of Road Accidents')
  25. ax.legend(handles=[MA, MI], prop={'size': 10.5}, loc='best', borderpad=1,
  26.           labelcolor=['#2ee88e', '#9a90e8'], edgecolor='white');
  27. plt.show()
复制代码

从上图可以看出,在已往 5 年(2016-2020 年)中,美国的事故百分比显着增加,有 70% 仅发生在已往 2 年(2019 年、2020 年)内。
  1. fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6)) = plt.subplots(nrows=3, ncols=2, figsize=(15, 10))
  2. fig.suptitle('Accident Cases over the past 5 years in US', fontsize=20,fontweight ="bold", color='grey')
  3. count = 0
  4. years = ['2016', '2017', '2018', '2019', '2020']
  5. colors = ['#77fa5a', '#ffff4d', '#ffab36', '#ff894a', '#ff513b']
  6. for i in [ax1, ax2, ax3, ax4, ax5]:
  7.     i.set_xlim([-125,-65])
  8.     i.set_ylim([22,55])
  9.     states.boundary.plot(ax=i, color='black');
  10.     geo_df[geo_df['year']==int(years[count])].plot(ax=i, markersize=1, color=colors[count], marker='+', alpha=0.5)
  11.     for j in ['bottom', 'top', 'left', 'right']:
  12.         side = i.spines[j]
  13.         side.set_visible(False)
  14.     i.set_title(years[count] + '\n({:,} Road Accident Cases)'.format(list(year_df.Cases)[count]), fontsize=12, color='grey', weight='bold')
  15.     i.axis('off')
  16.     count += 1
  17.    
  18. sns.lineplot(data = year_df, marker='o', x='Year', y='Cases', color = '#734dff', ax=ax6, label="Yearly Road Accidents");
  19. for k in ['bottom', 'top', 'left', 'right']:
  20.         side = ax6.spines[k]
  21.         side.set_visible(False)
  22. ax6.xaxis.set_ticks(year_df.Year);
  23. ax6.legend(prop={'size': 12}, loc='best', edgecolor='white');
复制代码

  1. accident_severity_df = geo_df.groupby(['year', 'Severity']).size().unstack()
复制代码
  1. ax = accident_severity_df.plot(kind='barh', stacked=True, figsize=(12, 6),
  2.                                color=['#fcfa5d', '#ffe066', '#fab666', '#f68f6a'],
  3.                                rot=0);
  4. ax.set_title('\nSeverity and Corresponding Accident \nPercentage for past 5 years in US\n', fontsize=20, color='grey');
  5. for i in ['top', 'left', 'right']:
  6.     side = ax.spines[i]
  7.     side.set_visible(False)
  8.    
  9. ax.spines['bottom'].set_bounds(0, 800000);
  10. ax.set_ylabel('\nYears\n', fontsize=15, color='grey');
  11. ax.set_xlabel('\nAccident Cases\n', fontsize=15, color='grey');
  12. ax.legend(prop={'size': 12.5}, loc='best', fancybox = True, title="Severity", title_fontsize=15, edgecolor='white');
  13. ax.tick_params(axis='both', which='major', labelsize=12.5)
  14. #ax.set_facecolor('#e6f2ed')
  15.    
  16. for p in ax.patches:
  17.     width, height = p.get_width(), p.get_height()
  18.     x, y = p.get_xy()
  19.     var = width*100/df.shape[0]
  20.     if var > 0:
  21.         if var > 4:
  22.             ax.text(x+width/2,
  23.                         y+height/2-0.05,
  24.                         '{:.2f}%'.format(width*100/df.shape[0]),
  25.                         fontsize=12,  color='black', alpha= 0.8)
  26.         elif var > 1.8 and var < 3.5:
  27.             ax.text(x+width/2-17000,
  28.                         y+height/2-0.05,
  29.                         '{:.2f}%'.format(width*100/df.shape[0]),
  30.                         fontsize=12,  color='black', alpha= 0.8)      
  31.         elif var>1.5 and var<1.8:
  32.             ax.text(x+width/2+7000,
  33.                     y+height/2-0.05,
  34.                     '  {:.2f}%'.format(width*100/df.shape[0]),
  35.                     fontsize=12,  color='black', alpha= 0.8)
  36.         elif var>1:
  37.             ax.text(x+width/2-20000,
  38.                     y+height/2-0.05,
  39.                     '  {:.2f}%'.format(width*100/df.shape[0]),
  40.                     fontsize=12,  color='black', alpha= 0.8)
  41.         else:
  42.             ax.text(x+width/2+10000,
  43.                     y+height/2-0.05,
  44.                     '  {:.2f}%'.format(width*100/df.shape[0]),
  45.                     fontsize=12,  color='black', alpha= 0.8)
复制代码
已往4年(2017-2020年),美国高度严峻的意外个案维持在1.55%至1.8%之间,仅在 2020 年发生的已往 5 年门路交通事故总数中,有 45% 是中度严峻。
小结

本文旨在测试大型数据集在家用电脑读入内存的上限,但数据量有限未能测试出结果,顺便研究了一下表现美国地图的模块,很费时间,表现中文也有问题,末了只能用翻译软件转为英文给大家展示,感兴趣的朋友可以继续研究,反正我是要放弃这款了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表