Both can be used for deployment for almost anything. Personally I found, if deployment is small, I use changeset but for larger deployments(and first time deployment of large project) we prefer Ant(Migration Tool).
Reason - in changeset- if i've to deploy say 100 fields for some object. I've to make individual selection of each field to add in changeset before uploading to other environment. Consider If you've 10-15 such object!. This is too much time consuming and error-prone.
Through Ant, all what I've to do is to mention object in XML, all fields will automatically get deployed
Other thing, If I've to delete components in production, I've option to do through ANT( Destructive.XML) while no such option is available in changeset
last thing changeset is only used for deployment in connected orgs, while through ANT you can deploy in any org.