This data is published under an Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) license

The Washington Post analyzed safety and reliability figures for the nine largest U.S. heavy rail systems. All data is from the Federal Transit Administration’s National Transit Database (NTD). The American Public Transportation Association (APTA) assisted in obtaining some data from the NTD, but The Post conducted the analysis and interpretation of it.

Read the Washington Post story: “In safety and reliability, Metro ranks in middle of the pack of nation’s big systems”

The figures used are the most recent available. 2015 safety event rates were computed using service volume figures from 2014.

The NTD’s thresholds and reporting guidelines for safety and security events differ from many of those used internally by WMATA and other transit agencies.

The NTD’s thresholds and guidelines have changed over the years. In 2008, for instance, the NTD reduced thresholds for reporting events that resulted in an injury from two injuries to one. For a full discussion of the NTD’s reporting guidelines see https://www.transit.dot.gov/ntd/transit-agency-profiles/safety-security-major-only-time-series-data.

For the above reason, we are calculating average rates for safety and security events using data from 2008 to 2015. However, we are using four-year averages (2011 to 2014) for maintenance data on mechanical failures due to a 2011 change in reporting methodology by Miami-Dade Transit (MDT) that reclassified many of their major mechanical failures as other mechanical failures. 2015 maintenance data was not available at publication time.

To take account of the systems’ widely varying sizes, The Post calculated annual rates for each type of incident, according to criteria recommended by government, industry and academic experts. For instance, passenger fatalities and injuries were measured per billion passenger miles traveled. Collisions, derailments and fires were calculated per million train miles traveled, when trains were in service.

While safety incidents are reported according to calendar years, service volumes and mechanical failures are reported according to each system’s fiscal year. Government, industry and academic experts said it was typical practice to calculate rates as we have, despite the fact that the years don’t coincide precisely.

People waiting or leaving refers to people who are injured or killed while waiting for a train or leaving a station, including crime and falling onto the tracks. None of the fatality rates includes suicide.

Major security events comprise different kinds of incidents including: one or more fatalities; one or more injuries requiring immediate medical transport away from the scene (with exceptions); total property damage exceeding $25,000; collisions; evacuations; derailments. For details, see https://www.transit.dot.gov/sites/fta.dot.gov/files/docs/2016%20S%26S%20Reporting%20Manual.pdf

A “major” vehicle mechanical failure is one in which a train is incapable of moving. “Other” mechanical failures include incidents in which a train is able to move but is taken out of service because of problems such as a jammed door or broken air conditioning.

ntd <- read.csv('data/ntd_heavy_rail_corrected_2005.csv') %>%
  filter(mode == "HR")
safety <- read.csv('data/ntd_safety_9_8.csv') %>%
  filter(Mode == "HR")

NTDID   <- c("20008", "90003", "30030", "50066", "10003", "40022", "30019", "90154", "40034")
system.name <- c("New York City Transit", "San Francisco Bay Area Rapid Transit", "Washington Metropolitan Area Transit Authority", "Chicago Transit Authority", "Southeastern Pennsylvania Transportation Authority", "Massachusetts Bay Transportation Authority", "Metropolitan Atlanta Rapid Transit Authority", "Los Angeles County Metropolitan Transportation Authority", "Miami-Dade Transit")
acronym <- c("NYCT", "BART", "WMATA", "CTA", "MBTA", "MARTA", "SEPTA", "LACMTA", "MDT")
years <- c(2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015)
ntdid.lookup <- data.frame(NTDID, acronym)
ntdid.lookup$acronym <- factor(ntdid.lookup$acronym, levels=acronym)
  
ntd.safety <-
  ntd %>%
  merge(safety, by=c('Year', 'NTDID'), all.y = TRUE, suffixes=c("", ".safety")) %>%
  merge(ntdid.lookup, by='NTDID') %>%
  mutate(acronym = reorder(acronym, desc(Passenger.Miles.Traveled.safety)))

# Calculate average system size metrics for 2008-2014
ntd.safety.avg <-
  ntd.safety %>%
  filter(Year < 2015, Year > 2007) %>%
  group_by(acronym) %>%
  summarise(
    Vehicle...Pass..Car.Revenue.Miles = mean(Vehicle...Pass..Car.Revenue.Miles),
    Passenger.Miles.Traveled.safety = mean(Passenger.Miles.Traveled.safety),
    Unlinked.Passenger.Trips = mean(Unlinked.Passenger.Trips),
    Train.Revenue.Miles = mean(Train.Revenue.Miles)
  ) %>%
  mutate(
    acronym.vrm = reorder(acronym, Vehicle...Pass..Car.Revenue.Miles),
    acronym.pmt = reorder(acronym, as.numeric(Passenger.Miles.Traveled.safety)),
    acronym.upt = reorder(acronym, Unlinked.Passenger.Trips),
    acronym.trm = reorder(acronym, Train.Revenue.Miles)
  )

ratemap <- function(data) {
  data$acronym <- factor(data$acronym, levels=rev(levels(data$acronym)))
  ggplot(select(data, acronym, Year, rate), aes(Year, acronym, fill=rate, label=signif(rate, digits=2))) + 
  scale_fill_gradient2(low='white', high='red') +
  geom_tile() +
  geom_text(size=2) +
  theme_minimal() +
  theme(axis.text=element_text(size=9)) +
  scale_x_continuous(breaks=years) +
  coord_fixed(ratio = 0.7) +
  scale_y_discrete(limits = levels(acronym))
}

ntd.total.table <- function(variable) {
  ntd.safety %>%
    select_("acronym", "Year", variable) %>%
    spread_("Year", variable) %>%
    kable(align = "r", format.args = list(big.mark=","), digits = 0)
}

ntd.average <- function(variable, adjustment, startYear, endYear, multiplier) {
  ntd.safety %>%
    filter(Year > startYear - 1, Year < endYear + 1) %>%
    group_by(acronym) %>%
    summarise_(
      average = interp(~signif(sum(var1) / sum(as.numeric(var2)) * multiplier, 3), 
                       var1 = as.name(variable), var2 = as.name(adjustment)))
}

avg.table <- . %>%
  arrange(desc(average)) %>%
  select(acronym, average) %>%
  mutate(ranking=rank(-average)) %>%
  kable(align = "r", format.args = list(big.mark=","), digits = 3)

kable(data.frame(system.name, acronym))
system.name acronym
New York City Transit NYCT
San Francisco Bay Area Rapid Transit BART
Washington Metropolitan Area Transit Authority WMATA
Chicago Transit Authority CTA
Southeastern Pennsylvania Transportation Authority MBTA
Massachusetts Bay Transportation Authority MARTA
Metropolitan Atlanta Rapid Transit Authority SEPTA
Los Angeles County Metropolitan Transportation Authority LACMTA
Miami-Dade Transit MDT

Sizing up U.S. heavy rail systems

ggplot(ntd.safety.avg, aes(acronym.upt, Unlinked.Passenger.Trips)) +
  geom_point() +
  coord_flip() +
  theme_minimal() +
  labs(title="Heavy rail by Unlinked Passenger Trips", y="Mean Unlinked Passenger Trips (2008-2014)", x="Agency")

ggplot(ntd.safety.avg, aes(acronym.trm, Train.Revenue.Miles)) +
  geom_point() +
  coord_flip() +
  theme_minimal() +
  labs(title="Heavy rail by Train Revenue Miles", y="Mean Train Revenue Miles (2008-2014)", x="Agency")

ggplot(ntd.safety.avg, aes(acronym.pmt, Passenger.Miles.Traveled.safety)) +
  geom_point() +
  coord_flip() +
  theme_minimal() +
  labs(title="Heavy rail by Passenger Miles Traveled", y="Mean Passenger Miles Traveled (2008-2014)", x="Agency")

ggplot(ntd.safety.avg, aes(acronym.vrm, Vehicle...Pass..Car.Revenue.Miles)) +
  geom_point() +
  coord_flip() +
  theme_minimal() +
  labs(title="Heavy rail by Vehicle Revenue Miles", y="Mean Vehicle Revenue Miles (2008-2014)", x="Agency")

Safety Data

Collision total

ntd.total.table("Collision.Total")
acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 66 64 31 64 71 89 98 80 71 94
WMATA 5 7 2 6 2 9 1 2 5 6
BART 0 2 5 4 3 3 3 4 2 1
CTA 10 17 10 9 11 7 12 10 10 10
MBTA 3 2 2 4 2 2 6 3 3 4
MARTA 0 0 0 2 3 1 1 0 0 0
SEPTA 12 8 0 5 4 4 4 6 3 5
LACMTA 0 1 0 0 0 0 0 0 0 0
MDT 1 0 0 0 0 0 2 0 0 0

Collision rate (per million train revenue miles)

ntd.safety %>%
  mutate(rate = Collision.Total / as.numeric(Train.Revenue.Miles) * 10**6) %>% 
  ratemap()

8-year average rate, 2008-2015

collision.8avg <- ntd.average("Collision.Total", "Train.Revenue.Miles", 2008, 2015, 10**6)
avg.table(collision.8avg)
acronym average ranking
NYCT 1.960 1
SEPTA 1.190 2
CTA 0.851 3
MBTA 0.836 4
WMATA 0.359 5
BART 0.350 6
MARTA 0.245 7
MDT 0.167 8
LACMTA 0.000 9

Derailment total

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 7 9 2 2 0 3 2 1 1 2
WMATA 1 1 1 1 1 1 3 2 0 3
BART 1 0 0 1 1 2 3 0 2 0
CTA 4 10 4 2 2 1 3 5 5 2
MBTA 12 3 3 1 1 1 0 0 0 0
MARTA 0 0 0 0 0 2 0 0 0 0
SEPTA 1 0 0 0 0 0 1 2 0 1
LACMTA 0 0 0 0 0 0 0 0 0 0
MDT 0 0 0 1 0 0 0 0 0 0

Derailment rate (per million train revenue miles)

8-year average rate, 2008-2015

acronym average ranking
CTA 0.258 1
MBTA 0.193 2
SEPTA 0.154 3
WMATA 0.130 4
BART 0.126 5
MDT 0.084 6
MARTA 0.070 7
NYCT 0.043 8
LACMTA 0.000 9

Fire total

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 1,322 1,464 1,270 1,079 1,101 1,037 952 898 953 1,052
WMATA 109 82 26 2 14 28 22 18 33 49
BART 3 4 6 4 3 1 3 4 1 2
CTA 72 129 107 58 99 90 108 79 67 78
MBTA 86 183 170 115 74 96 76 45 26 60
MARTA 0 1 12 3 6 2 18 6 5 1
SEPTA 0 0 0 0 2 2 0 3 7 3
LACMTA 7 1 5 0 0 0 0 0 0 0
MDT 2 10 2 13 6 4 1 0 0 0

Fire rate (per million train revenue miles)

8-year average rate, 2008-2015

acronym average ranking
NYCT 27.300 1
MBTA 21.300 2
CTA 7.390 3
MDT 2.170 4
WMATA 2.090 5
MARTA 1.850 6
SEPTA 0.655 7
LACMTA 0.448 8
BART 0.336 9

Major security events

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 0 0 51 66 172 213 250 195 172 237
WMATA 8 1 5 23 54 82 66 45 32 37
BART 0 0 4 3 1 7 39 15 31 31
CTA 1 0 16 43 39 58 99 72 86 72
MBTA 0 0 3 4 7 5 11 20 28 35
MARTA 2 3 17 20 22 19 16 17 34 28
SEPTA 0 0 7 8 18 60 53 47 67 47
LACMTA 3 2 3 4 4 14 8 22 26 13
MDT 1 2 5 4 2 2 2 1 0 1

Major security event rate (per million train revenue miles)

8-year average rate, 2008-2015

acronym average ranking
SEPTA 11.80 1
LACMTA 8.43 2
MARTA 6.05 3
CTA 5.22 4
NYCT 4.44 5
WMATA 3.74 6
MBTA 3.63 7
BART 1.83 8
MDT 1.42 9

Passenger fatality total

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 1 2 0 2 3 1 2 6 4 3
WMATA 0 0 0 8 0 0 0 0 0 2
BART 0 0 0 0 0 0 0 0 1 0
CTA 0 3 1 0 1 0 0 0 0 0
MBTA 1 0 0 0 0 0 0 0 0 0
MARTA 0 0 0 0 0 0 0 0 0 0
SEPTA 1 1 0 0 0 0 0 0 0 0
LACMTA 0 0 0 0 0 1 0 0 1 0
MDT 0 0 0 0 0 0 0 0 0 0

Passenger fatality rate (per billion passenger miles)

8-year average rate, 2008-2015

acronym average ranking
LACMTA 1.060 1.0
WMATA 0.785 2.0
NYCT 0.252 3.0
CTA 0.182 4.0
BART 0.082 5.0
MBTA 0.000 7.5
MARTA 0.000 7.5
SEPTA 0.000 7.5
MDT 0.000 7.5

Passenger injury total

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 210 820 28 20 1,740 83 56 30 75 72
WMATA 36 114 7 64 32 14 29 28 27 102
BART 74 56 0 8 45 97 103 88 60 23
CTA 362 314 45 58 41 45 90 101 107 65
MBTA 183 153 5 5 17 6 7 6 9 11
MARTA 30 25 20 20 21 19 15 5 4 3
SEPTA 39 100 15 13 6 50 20 45 28 23
LACMTA 6 5 3 5 0 7 2 5 6 4
MDT 8 43 1 13 10 7 4 10 11 5

Passenger injury rate (per billion passenger miles)

8-year average rate, 2008-2015

acronym average ranking
SEPTA 57.3 1
MDT 52.8 2
CTA 50.3 3
BART 34.7 4
MARTA 27.4 5
NYCT 25.2 6
WMATA 23.8 7
LACMTA 17.0 8
MBTA 14.5 9

Employee fatality total

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 0 2 0 0 1 0 0 1 0 2
WMATA 3 0 0 3 2 0 0 1 0 0
BART 0 0 1 0 0 0 0 2 0 0
CTA 0 0 0 0 0 0 0 0 0 0
MBTA 0 0 0 0 0 0 0 0 0 0
MARTA 0 0 0 0 0 0 0 0 0 0
SEPTA 0 0 0 0 0 0 0 0 0 0
LACMTA 0 0 0 0 0 0 0 0 0 0
MDT 0 0 0 0 0 0 1 0 0 1

Employee fatality rate (per billion train revenue miles)

8-year average rate, 2008-2015

acronym average ranking
MDT 167.0 1
WMATA 65.2 2
BART 42.0 3
NYCT 13.1 4
CTA 0.0 7
MBTA 0.0 7
MARTA 0.0 7
SEPTA 0.0 7
LACMTA 0.0 7

Employee injury total

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 2 29 31 21 18 24 33 30 26 22
WMATA 0 3 18 17 20 30 30 10 7 11
BART 0 0 0 1 0 0 2 2 0 1
CTA 3 6 4 10 14 21 22 61 37 43
MBTA 0 0 1 0 7 2 2 4 2 12
MARTA 0 2 13 8 12 7 4 3 3 2
SEPTA 1 0 13 8 5 4 9 14 17 12
LACMTA 0 0 0 0 1 2 4 5 7 0
MDT 0 0 0 3 1 0 0 0 0 1

Employee injury rate (per billion train revenue miles)

8-year average rate, 2008-2015

acronym average ranking
SEPTA 3,160.0 1
CTA 2,280.0 2
MARTA 1,820.0 3
LACMTA 1,700.0 4
WMATA 1,550.0 5
MBTA 965.0 6
NYCT 672.0 7
MDT 418.0 8
BART 83.9 9

People waiting or leaving fatality total

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 0 4 6 5 6 5 15 3 12 9
WMATA 0 0 0 1 2 1 1 1 0 1
BART 0 0 0 1 2 1 2 3 0 0
CTA 1 0 1 1 3 2 5 5 1 3
MBTA 0 0 0 1 0 1 0 1 0 1
MARTA 1 0 0 0 2 3 0 0 0 0
SEPTA 0 0 1 1 3 0 0 0 2 1
LACMTA 0 0 0 0 0 1 1 0 0 0
MDT 0 0 0 0 0 1 1 0 0 0

People waiting or leaving fatality rate (per billion unlinked passenger trips)

8-year average rate, 2008-2015

acronym average ranking
MDT 12.80 1
CTA 11.90 2
SEPTA 10.20 3
BART 9.51 4
MARTA 8.33 5
LACMTA 5.22 6
MBTA 3.12 7
WMATA 3.10 8
NYCT 2.99 9

People waiting or leaving injury total

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 2,325 1,934 4,920 5,138 3,291 4,758 3,268 5,070 3,933 3,841
WMATA 225 131 254 163 265 320 283 292 264 277
BART 431 393 523 511 408 444 484 660 488 396
CTA 69 38 268 268 242 319 366 353 316 293
MBTA 62 61 180 185 198 194 208 140 232 186
MARTA 190 173 223 202 201 160 150 140 151 90
SEPTA 0 0 50 64 113 54 40 45 90 88
LACMTA 62 59 58 45 52 62 63 75 63 51
MDT 22 6 42 74 93 38 79 89 66 58

People waiting or leaving injury rate (per billion unlinked passenger trips)

8-year average rate, 2008-2015

acronym average ranking
BART 4,140 1
MDT 3,460 2
MARTA 2,190 3
NYCT 1,670 4
CTA 1,370 5
LACMTA 1,230 6
MBTA 1,190 7
WMATA 938 8
SEPTA 692 9

Revenue vehicle maintenance performance data

We are using four year averages for maintenance data due to a 2011 change in reporting methodology by Miami-Dade Transit (MDT) that reclassified many of their major mechanical failures as other mechanical failures. 2015 data was not available at publication time, hence the averages for maintenance data are calculated from 2011 to 2014.

Major mechanical failure

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 2,173 2,260 2,547 2,250 2,038 1,997 2,112 2,260 2,443 NA
WMATA 726 706 1,076 1,334 1,552 1,525 1,483 1,223 1,406 NA
BART 288 218 214 229 201 182 185 176 182 NA
CTA 311 294 298 230 245 296 290 306 334 NA
MBTA 669 511 590 701 579 681 536 443 472 NA
MARTA 13,425 1,964 1,966 1,222 919 422 736 768 822 NA
SEPTA 157 158 157 166 41 90 95 208 112 NA
LACMTA 314 362 109 112 114 108 133 94 75 NA
MDT 1,430 1,355 1,407 2,507 2,017 167 192 213 224 NA

Major mechanical failure rate (per million vehicle revenue miles)

4-year average rate, 2011-2014

acronym average ranking
MARTA 38.00 1
MDT 27.40 2
MBTA 22.80 3
WMATA 19.60 4
LACMTA 15.80 5
SEPTA 7.42 6
NYCT 6.41 7
CTA 4.55 8
BART 2.82 9

Other mechanical failure

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 7,486 7,971 8,208 7,536 7,443 7,329 7,614 8,346 10,132 NA
WMATA 542 155 362 152 117 137 111 139 102 NA
BART 83 63 78 196 110 85 56 56 73 NA
CTA 19,148 25,007 20,947 17,727 18,206 17,973 18,124 16,693 13,719 NA
MBTA 64 60 27 35 38 40 35 33 44 NA
MARTA 1,150 98 97 60 74 160 182 146 160 NA
SEPTA 1,108 1,701 1,297 1,478 2,526 2,688 2,350 3,387 3,678 NA
LACMTA 1,304 1,672 38 50 52 37 38 21 44 NA
MDT 410 394 298 398 182 2,072 2,521 2,362 1,945 NA

Other mechanical failure rate (per million vehicle revenue miles)

4-year average rate, 2011-2014

acronym average ranking
MDT 306.00 1
CTA 247.00 2
SEPTA 178.00 3
NYCT 24.30 4
MARTA 8.97 5
LACMTA 5.39 6
WMATA 1.70 7
MBTA 1.62 8
BART 1.05 9

Total mechanical failure

acronym 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
NYCT 9,659 10,231 10,755 9,786 9,481 9,326 9,726 10,606 12,575 NA
WMATA 1,268 861 1,438 1,486 1,669 1,662 1,594 1,362 1,508 NA
BART 371 281 292 425 311 267 241 232 255 NA
CTA 19,459 25,301 21,245 17,957 18,451 18,269 18,414 16,999 14,053 NA
MBTA 733 571 617 736 617 721 571 476 516 NA
MARTA 14,575 2,062 2,063 1,282 993 582 918 914 982 NA
SEPTA 1,265 1,859 1,454 1,644 2,567 2,778 2,445 3,595 3,790 NA
LACMTA 1,618 2,034 147 162 166 145 171 115 119 NA
MDT 1,840 1,749 1,705 2,905 2,199 2,239 2,713 2,575 2,169 NA

Total mechanical failure rate (per million vehicle revenue miles)

4-year average rate, 2011-2014

acronym average ranking
MDT 334.00 1
CTA 252.00 2
SEPTA 185.00 3
MARTA 47.00 4
NYCT 30.70 5
MBTA 24.40 6
WMATA 21.30 7
LACMTA 21.20 8
BART 3.87 9
ggplot(filter(ntd.safety, acronym == "WMATA")) + 
  geom_line(aes(Year, Major.Mechanical.Failure)) + 
  geom_line(aes(Year, Other.Mechanical.Failure)) +
  geom_text(x=2014, y=1410, label="Major", hjust=-0.1) +
  geom_text(x=2014, y=100, label="Other", hjust=-0.1) +
  scale_x_continuous(breaks=years) +
  theme_minimal() +
  labs(y="Mechanical failure", title="WMATA mechanical failure, 2006-2014")

Summary table of rate averages

var NYCT WMATA BART CTA MBTA MARTA SEPTA LACMTA MDT
Collisions per million train revenue miles 1.96e+00 0.359 3.50e-01 0.851 0.836 2.45e-01 1.190 0.000 1.67e-01
Derailments per million train revenue miles 4.26e-02 0.130 1.26e-01 0.258 0.193 6.99e-02 0.154 0.000 8.36e-02
Employee fatalities per billion train revenue miles 1.31e+01 65.200 4.20e+01 0.000 0.000 0.00e+00 0.000 0.000 1.67e+02
Employee injuries per billion train revenue miles 6.72e+02 1,550.000 8.39e+01 2,280.000 965.000 1.82e+03 3,160.000 1,700.000 4.18e+02
Fires per million train revenue miles 2.73e+01 2.090 3.36e-01 7.390 21.300 1.85e+00 0.655 0.448 2.17e+00
Major mechanical failure per million vehicle revenue miles 6.41e+00 19.600 2.82e+00 4.550 22.800 3.80e+01 7.420 15.800 2.74e+01
Other mechanical failures per million vehicle revenue miles 2.43e+01 1.700 1.05e+00 247.000 1.620 8.97e+00 178.000 5.390 3.06e+02
Passenger fatalities per billion passenger miles 2.52e-01 0.785 8.18e-02 0.182 0.000 0.00e+00 0.000 1.060 0.00e+00
Passenger injuries per billion passenger miles 2.52e+01 23.800 3.47e+01 50.300 14.500 2.74e+01 57.300 17.000 5.28e+01
People waiting or leaving fatalities per billion unlinked passenger trips 2.99e+00 3.100 9.51e+00 11.900 3.120 8.33e+00 10.200 5.220 1.28e+01
People waiting or leaving injuries per billion unlinked passenger trips 1.67e+03 938.000 4.14e+03 1,370.000 1,190.000 2.19e+03 692.000 1,230.000 3.46e+03
Security events per million train revenue miles 4.44e+00 3.740 1.83e+00 5.220 3.630 6.05e+00 11.800 8.430 1.42e+00