How to Find Consecutive count of a column based on a their status
The problem in your query actually comes from the first row.
It has the same Reason_type so it gives the extra ranking to the bottom records.

I think you can use CONDITIONAL_CHANGE_EVENT, maybe like:

select *,
    dense_rank() 
        over (partition by site,change_num,reason_type order by billing_date) as rank 
from (
   Select site,
     billing_date,
     Reason_type, 
     CONDITIONAL_CHANGE_EVENT(reason_type) 
         over (partition by site order by billing_date) as change_num
   from AVG_SCN  
   where site=3 
) foo 
order  by 1,2;