Those reasons seem rather straight forward and we explain causes for these errors in detail in this article (don't wonder, this article is covering line-statuses but they are causing certain hangup reasons).
However, you might indeed get confused when you see three different types of hangup reasons:
hangup: Calls that never reached a queue and were ended by the customer will end in "hangup". So for instance, this happens if a customer decides to end the call while in the IVR or while listening to an out of office prompt. Also calls that were hung up by the customer in the queue have this finish reason.
passive-hangup: This hangup type covers all calls that were connected to an agent. They are either ended by the agent or the caller - to know who ended the call, you must check the finish reason of the matching Outbound call.
system-hangup: Whenever a caller reaches the end of a call flow we see the hangup type "system-hangup". It literally means what it says: the system hung up the call, not the customer. This happens, for instance, if you decide to take a caller out of a queue when she reached a certain time limit. Your prompt might inform the customer that the call will end, if the customer doesn't hangup herself, the system will do the job for her.
- transferred: this finish reason is shown if calls have been transferred to another agent. The reason only exists for the inbound leg.
hangup: These calls were connected with an agent and the agent ended the call.
passive-hangup: This finish reason covers all calls that were successfully connected and ended by the customer.
- system-hangup: This is a special kind of hangup reason that is especially important for QA reasons. Whenever you have an outbound call that ends in "system-hangup" it means that your agent didn't pick up the call. You might translate it to "Timeout". The agent simply missed the call, maybe didn't hear it or ignored it. However, babelforce tried connecting the call for as long as you defined it in your queue settings.