They also have great secondary categorization (beyond fire, grass, and water).
Bulbasaur represents a sort of easy mode, but he actually has some trouble against Misty, with her Starmie. He is a “cute” starter as well, representing softer people.
Charmander represents the harder path, losing hard against the first two gyms. He’s also a “cool” starter, so kids who wanted to seem tough or liked “cool” things often started with him.
Squirtle is a sort of balance, often for people who find themselves in between the “predator” and the “prey”, in terms of personality. It works well that he’s water type, so that he is kind of a neutral, to the opposing sides of Bulbasaur and Charmander. In addition to that, he’s an average difficulty Pokemon, doing well against the first gym, and struggling in the second.
They’re pretty perfect, but they’re mostly that way because of how the original games were designed, which allowed people to imprint lots of personality and feelings onto the Pokemon, as they believed each Pokemon represented something about themselves.
I remember Charizardfags and Bulbasaurfags talking so much about who was better in game, and I was one of the only people that picked Squirtle in my class, so I saw both sides of it. While my story is anecdotal, I feel as though lots of people likely experienced a similar situation, where the mons weren’t repped for the mon’s sake, but for the person’t personal expression.
Nowadays, while I still like the starters generally, the distinction between “cute”, “cool”, and “tough” has been flanderized quite a bit, and dragged out.