<a href="/images/genderspace_cluster_choice.png"><img src="/images/genderspace_cluster_choice.png" width="532" height="421" alt="genderspace cluster choice"></a>
+<aside class="boxout"><strong>Figure.</strong> A schematic visualization of genderspace using fictitious but hopefully illustrative data <a href="/ancillary/categories-scatterplot-source/">(scatterplot source code)</a>. Suppose that the distributions of cis men (represented by the <span style="color: #1E90FF;">light blue</span> datapoints) and cis women (the <span style="color: #FF1493;">hot pink</span> points) have the same variance, but their means differ by 3.5 standard deviations in each of the <em>x₁</em>, <em>x₂</em>, and <em>x₃</em> variables, and that the distribution of non-exclusively-androphilic trans women (the <span style="color: #B000B0;">purple</span> points) is the same as that of cis men for the <em>x₁</em> and <em>x₂</em> variables, but resembles that of cis women for <em>x₃</em>. People who care more about predicting <em>x₁</em> and <em>x₂</em> have reason to prefer categories and corresponding language that group by biological sex (<span style="color: #0000C8;">blue</span> category boundary); people who care more about predicting <em>x₃</em> have reason to prefer categories and language that group by gender identity (<span style="color: #E00000;">red</span> boundary).</aside>
+
In less tolerant places and decades, where MtF transsexuals were very rare and had to try very hard to pass as (natal) women out of dire necessity, their impact on the social order and how people think about gender was minimal—there were just too few trans people to make much of a difference. [This is why](/2018/Feb/blegg-mode/) experienced crossdressers often report it being easier to pass in rural or suburban areas rather than cities with a larger LGBT presence—not as a matter of tolerant social attitudes, but as a matter of _base rates_: it's harder to get [clocked](https://www.urbandictionary.com/define.php?term=clocked&defid=4884301) by people who aren't aware that being trans is even a thing.[ref]In [predictive processing](http://slatestarcodex.com/2017/09/05/book-review-surfing-uncertainty/) terms: the prediction errors caused by observations of a trans woman failing to match the observer's generative model of women get silenced for lack of alternative hypotheses if "She's trans" isn't in the observer's hypothesis space.[/ref]
Nowadays, in progressive enclaves of Western countries, transness is definitely known to be a thing—and in particular subcultures that form around [non-sex-balanced interests](http://slatestarcodex.com/2017/08/07/contra-grant-on-exaggerated-differences/), the numbers can be quite dramatic. For example, on the [2018 _Slate Star Codex_ reader survey](http://slatestarcodex.com/2018/01/03/ssc-survey-results-2018/), 9.4% of respondents selected _F (cisgender)_ for the gender question, compared to 1.4% of respondents selecting _F (transgender m → f)_. So, if trans women are women, _13.4%_ (!!) of women who read _Slate Star Codex_ are trans.
--- /dev/null
+Title: Source Code for Scatterplot Figure in "The Categories Were Made for Man to Make Predictions"
+Status: Hidden
+
+Requires [NumPy](http://www.numpy.org/), [Matplotlib](https://matplotlib.org/).
+
+```python
+import functools
+import itertools
+
+import matplotlib.pyplot as plot
+from matplotlib.colors import ListedColormap
+from mpl_toolkits.mplot3d import Axes3D
+from numpy import array
+from numpy.random import normal
+
+
+class Person:
+ def __init__(self, a, b, c):
+ self.a = a
+ self.b = b
+ self.c = c
+
+ def trait_vector(self):
+ return [self.a, self.b, self.c]
+
+ @classmethod
+ def generate_cis_male(cls):
+ a = normal(0, 1)
+ b = normal(0, 1)
+ c = normal(0, 1)
+ return cls(a, b, c)
+
+ @classmethod
+ def generate_cis_female(cls):
+ a = normal(3.5, 1)
+ b = normal(3.5, 1)
+ c = normal(3.5, 1)
+ return cls(a, b, c)
+
+ @classmethod
+ def generate_agp(cls):
+ a = normal(0, 1)
+ b = normal(0, 1)
+ c = normal(3.8, 1)
+ return cls(a, b, c)
+
+def my_plot():
+ group_size = 50
+
+ p1 = [Person.generate_cis_female().trait_vector()
+ for _ in range(group_size)]
+ p2 = [Person.generate_agp().trait_vector()
+ for _ in range(group_size)]
+ p3 = [Person.generate_cis_male().trait_vector()
+ for _ in range(group_size)]
+
+ p = array(p1 + p2 + p3)
+
+ target = list(functools.reduce(itertools.chain,
+ [itertools.repeat(i, group_size)
+ for i in range(1, 4)]))
+
+ figure = plot.figure(figsize=(6, 5))
+ axes = Axes3D(figure)
+
+ axes.scatter(p[:, 0], p[:, 1], p[:, 2],
+ c=target,
+ cmap=ListedColormap(["#FF1493", "#B000B0", "#1E90FF"]))
+ plot.show()
+
+
+if __name__ == "__main__":
+ my_plot()
+
+```
\ No newline at end of file