Sets are a basic restriction on where data from main memory can exist in the cache. If the set bits were the highest-order bits, then large consecutive ranges in the main memory would map to the same cache set, causing many conflicts and evictions. This would give poor cache performance due to all the misses.
The number of sets, times the block size (times the number of lines), tells you how many consecutive addresses from main memory you can store at one time.
On the other hand, the tag bits represent a "pressure valve" or "degree of freedom" that lets you store data from wildly different addresses in main memory together in the same cache.
In other words, low-order bits tend to change a lot when you are traversing an array or taking advantage of data locality. High-order bits tend to stay the same for those operations. You want to take advantage of different low-order bits to store a working set with good locality in a cache at the same time, to get a bunch of cache hits together.