Might you consider easing the depth limits at the higher levels? From what I understand, Stockfish sometimes goes very deep into the evaluation between, say, two moves that are already early on obviously better than others.
By the way, I think the skill level code in Stockfish itself (separate from the depth and time limitations implemented here) could sometimes produce odd results. The meat is here, in the do_skill_level() function:
github.com/mcostalba/Stockfish/blob/master/src/search.cppWhat happens is that if, for example, there is only one move that is any good, Stockfish would always pick that one, even if that move is to avoid or exploit some obscure tactic that happens to be available, even at the lowest skill level.
The depth limits for the AI on lichess seem to prevent that, though, when it comes to tactics, but from how I understand it, the above would still mean that Stockfish level 1 will simply never, for example, just drop a piece.