NMOS inverter with enchancement load behaving weirdly in LTspice
You are using a basic .dc simulation, which gives a finite amount of points, here 200 (from 0 to 2, in 0.01 steps). The waveform arithmetic derivative, d(), operates directly on the saved .raw data, data that is saved as soon as the buffer is filled, as the simulation is going. If you are performing the derivative, you are doing it for a unity value, which means any differences you may have at higher than 10...100 times the frequency, will be exaggerated.
In .tran, this can be alleviated by using .opt plotwinsize=0, which disables waveform compression. In .dc, your only bet is to use more points. Since a .dc is WYSIWYG as far as the number of simulation points go, you can increase them to your heart desire, but the simulation will go slower.
If you can tolerate it, use .tran (with .opt plotwinsize=0) involving a ramp at the input (e.g. make V2 to be pwl 0 0 1 2, or 2 V/s). You can then use whatever timestep suits you and disable compression, which will give you more accurate displays of d().
However, if you'll be using .tran, I'd recommend not using d() for the derivative, instead use a VCCS and an inductor for that:

I used .tran and the display of d() and the derivative performed with G1+L1 are quite the same, and not noisy. This is also because the default number of points for .tran is 1024. Note that I haven't used plotwinsize, but that would only increase the resolution (at the cost of a larger .raw file).