Because the architects of Unix decided that file I/O was best done with per-process arrays inside the kernel, exposing the integer indices as part of the ABI. And that C, Unix's main language, uses zero-based indices for arrays. And that standard I/O, redirect-able and pipeline-able, was best accomplished with three file descriptors, the first three, and assigning them (arbitrarily) in order as input, output, and error. And naming them thus, and providing predefined constants thereof, and utility programs (like the shell) that set all new executing processes up that way...
A Unix process doesn't have to use the standard I/O, it's free to move things around and use them any which way, but that's what every one that's created with the standard tools for doing so will wake up with, and that almost every program that already exists expects to find when it wakes up.
TL/DR? Because that's how Unix works.