Thanks a lot for documenting how you’ve done this – I never got around to trying this out myself, but was tempted to try because you made it so easy.
I wanted to take a slightly broader sample – pillow
is amazing, but not everyone does image manipulation; in contrast, requests
ends up being installed almost everywhere, and I also lifted the version restriction. After managing to set up pypinfo
myself (thanks @ofek for the thorough documentation!), I ran
pypinfo --all --days 28 --limit 10000 --json "requests" system distro-version > requests.json
Dropping Upping --limit
was important to actually get all relevant combinations. After some light munging
import json
import pandas as pd
with open("path/to/requests.json", "r") as f:
d = json.load(f)
df = pd.DataFrame(d["rows"])
mac = df.loc[df.system_name == "Darwin"]
# create column for consolidated version
mac = mac.assign(version=mac.distro_version.astype("str"))
# remove minor/patch versions from macos 1x.y.z, x!=0
mac.version = mac.version.str.replace(r"^(1[^0])(\.\d+)*", r"\1", regex=True)
# remove patch versions from macos 10.x.y
mac.version = mac.version.str.replace(r"^(10\.\d+)(\.\d+)*", r"\1", regex=True)
mac.groupby("version").sum("download_count")
# copy to google sheets; rest done there
The result is
version | downloads | percentage | cumulative | percentage | users >= version |
---|---|---|---|---|---|
10.4 | 3 | 0.0001% | 3 | 0.0001% | 100.0000% |
10.5 | 6 | 0.0001% | 9 | 0.0002% | 99.9999% |
10.6 | 19 | 0.0003% | 28 | 0.0005% | 99.9998% |
10.7 | 2 | 0.0000% | 30 | 0.0005% | 99.9995% |
10.8 | 2 | 0.0000% | 32 | 0.0006% | 99.9995% |
10.9 | 13 | 0.0002% | 45 | 0.0008% | 99.9994% |
10.10 | 26 | 0.0005% | 71 | 0.0012% | 99.9992% |
10.11 | 89 | 0.0016% | 160 | 0.0028% | 99.9988% |
10.12 | 179 | 0.0031% | 339 | 0.0060% | 99.9972% |
10.13 | 58,141 | 1.02% | 58,480 | 1.03% | 99.9940% |
10.14 | 31,749 | 0.56% | 90,229 | 1.59% | 98.97% |
10.15 | 26,091 | 0.46% | 116,320 | 2.04% | 98.41% |
10.16 | 305,672 | 5.37% | 421,992 | 7.42% | 97.96% |
11 | 20,617 | 0.36% | 442,609 | 7.78% | 92.58% |
12 | 141,727 | 2.49% | 584,336 | 10.27% | 92.22% |
13 | 873,061 | 15.34% | 1,457,397 | 25.61% | 89.73% |
14 | 3,260,588 | 57.30% | 4,717,985 | 82.92% | 74.39% |
15 | 798,499 | 14.03% | 5,516,484 | 96.95% | 17.08% |
None | 173,608 | 3.05% | 5,690,092 | 100.00% | 3.05% |
Note that I ignored the following versions, which I consider spurious
version | downloads | comment |
---|---|---|
16 | 428 | perhaps alpha version? |
17 | 2,227 | max released macOS is v15 |
18 | 6,155 | max released macOS is v15 |
19 | 71 | max released macOS is v15 |
22 | 1 | max released macOS is v15 |
20.04 | 237 | Looks like Ubuntu |
22.04 | 484 | Looks like Ubuntu |
24.04 | 32 | Looks like Ubuntu |
2024.4 | 1 | ??? |
8.1 | 74 | No macOS version below 10.0 exists |
8.6 | 1 | No macOS version below 10.0 exists |
9.4 | 4 | No macOS version below 10.0 exists |
9.5 | 1 | No macOS version below 10.0 exists |
What’s remarkable is the huge cliff between 10.12 and 10.13, indicating indeed that anything below 10.13 is effectively dead/unusable…
Finally, comparing the 339 downloads on macOS <10.12 with all downloads (not just on macOS), i.e. with df.download_count.sum()
, which ends up being 562’304’532, we see that this affects roughly 1 in 1.65 million users.
Using this broader sample, the numbers look ever so slightly different:
- 99.994% of mac users are on 10.13+
- 98.97% are on 10.14+
- 97.96% are on 11.0+ (10.16 is a misreported version)