The first thing you need to do is keep a record of the historical state of the opportunity. There are several ways to do this; one way is to have one date field per level, each of which is updated by client script when the opportunity is set to that level. Another option would be to run process every week to record the current state of each opportunity.
Once you've done that you can write the report to determine the movement over time