1) Keeps track of system state. Tracks packages installed as dependencies, and remove them when necessary meaning no orphaned packages.
2) Handles recommends well. apt-get fails to handle recommends, which many packages depend on to pull in dependencies.
3) Searching. More intuitive and better formatted than apt-cache search. There is also the text UI when running aptitude directly. For example, how do I find all installed python packages?
$ apt-cache search python
Returns all packages with python in title or description.
vs $ aptitude search '~ipython'
or $ aptitude search python | grep ^i # installed packages are flagged with i on the first line