Oh my where do I begin -- Yarn (to me) appears to be faster, and breaks less (if ever). With NPM I kept finding things not working, and having to delete node_modules and re-installing. Yarn just works, and I haven't even considered using NPM since installing yarn.
Ehh, I have a `yarn depreset` command in my package.json files on most projects at work because I still often have to delete node_modules and reinstall everything. I got tired of typing out the whole thing.
Granted this is oftentimes because our dependencies float a bit, especially since we've been migrating to a new major version of one of our major dependencies, but it's still usually the quickest way to fix weird dependency issues.
For us, npm tends to be really wonky in a CI environment. Partially because our CI container needs updating, but also because `npm install` doesn't actually do what you think it does. Gotta use `npm ci`. But the npm in our CI container is old enough that it doesn't actually support that command (yeah yeah, I know -- I don't have access to that part of our build process).
As of npm 6 though, the differences between yarn and npm have been whittled away considerably. Really, the biggest reason we use yarn is because we also use React and a number of other libraries that come from Facebook, so we're just staying under the same umbrella. We don't expect Facebook to break their own tooling, basically, while npm has indeed broken a few things for us in the past, many times critical things.
Not the most compelling of reasons to be sure, but that's why.
It caches locally and doesn't hit the net for most redownloads, the lockfiles are significantly more reliable, there's the ability to "force" a transitive dependency to another version, the workspaces system lets you work with monorepos with multiple packages much easier, tools like "upgrade-interactive" are built in and make upgrades much easier, and more that i'm probably missing.