GitHub - kevinnbass/state_action_against_online_speech_globally · GitHub
/" data-turbo-transient="true" />
Skip to content
Search or jump to...
Search code, repositories, users, issues, pull requests...
-->
Search
Clear
Search syntax tips
Provide feedback
--><br>We read every piece of feedback, and take your input very seriously.
Include my email address so I can be contacted
Cancel
Submit feedback
Saved searches
Use saved searches to filter your results more quickly
-->
Name
Query
To see all available qualifiers, see our documentation.
Cancel
Create saved search
Sign in
/;ref_cta:Sign up;ref_loc:header logged out"}"<br>Sign up
Appearance settings
Resetting focus
You signed in with another tab or window. Reload to refresh your session.<br>You signed out in another tab or window. Reload to refresh your session.<br>You switched accounts on another tab or window. Reload to refresh your session.
Dismiss alert
{{ message }}
kevinnbass
state_action_against_online_speech_globally
Public
Notifications<br>You must be signed in to change notification settings
Fork
Star
main
BranchesTags
Go to file
CodeOpen more actions menu
Folders and files<br>NameNameLast commit message<br>Last commit date<br>Latest commit
History<br>1 Commit<br>1 Commit
data
data
output
output
.gitignore
.gitignore
LICENSE
LICENSE
README.md
README.md
make_chart.py
make_chart.py
requirements.txt
requirements.txt
View all files
Repository files navigation
State actions against people for online speech — per capita
A single, sourced figure: how many people each state arrested, charged, prosecuted,<br>convicted or fined for online speech, per million residents, per year.
Run it
output/arrests_per_capita.png">pip install -r requirements.txt<br>python make_chart.py # -> output/arrests_per_capita.png
That's it — make_chart.py reads data/arrests.csv and renders the chart.
What it shows (and what it deliberately leaves out)
A naive "arrests for online speech" ranking is misleading, for two reasons this chart<br>corrects:
The transparency penalty. A country that publishes its numbers looks worse than<br>one that hides them. South Korea's 29,258 are cases reported to police — mostly<br>private defamation/insult complaints, most dismissed — not the state censoring<br>anyone. It is excluded .
The opacity dividend. China's figure is one four-month campaign ÷ 1.4 billion people<br>= ~1/million, which makes the most repressive state look the freest. It is excluded .
So the chart applies four rules (each exclusion is a one-line comment in make_chart.py):
State enforcement of speech only. Out: private-complaint volume (South Korea,<br>Philippines, Lebanon); off-topic harassment / image-abuse statutes (New Zealand,<br>Australia, Mexico); content-orders that don't touch a person (Singapore). Kept:<br>Germany ("Hasspostings" offences recorded by the BKA) and Canada (StatCan<br>cyber-hate-crime accused) — the authorities' own records of online-speech offences,<br>which is categorically different from private suits.
No one-off snapshots. A single campaign or protest week ÷ a national population is<br>not a rate (this is what would put China at ~1/million).
No opacity fragments that read as falsely free. Documented floors of opaque or<br>under-tallying states whose per-capita value is misleadingly near-zero: China, India,<br>Pakistan, Nigeria, Venezuela, Tanzania, Uganda.
Annualized. A multi-year cumulative total is divided by its documented span<br>(Russia's 3-year total reads ~25/M·yr, not ~75), and the bar is tagged /yr (div Nyr).<br>Cumulative figures with no clean per-year span (Iran 2011–2023, Ireland) drop out.
Bars are coloured by confidence in the figure (high / medium / low), and each carries<br>its exact metric + period, because the numbers are not natively comparable.
Data & provenance
data/arrests.csv is the dataset. Every row carries source_name, source_url and a<br>candid caveat, so each figure is checkable against its primary source. The CSV covers<br>every country researched — including the metrics and caveats of the ones this chart<br>excludes, so the editorial filters above are auditable — not just the bars shown.
The figures mix metrics (arrest vs. charge vs. conviction vs. recorded offence vs.<br>administrative penalty) and time bases — that heterogeneity is the point, and it's why<br>every bar is tagged. Read the tags, not just the length.
License
Code (make_chart.py): MIT — see LICENSE.
Data (data/arrests.csv): CC BY 4.0.<br>Compiled from public official, NGO and press sources, cited per row — attribute and<br>verify against the linked sources before reuse.
About
No description, website, or topics provided.
Resources
Readme
License
View license
Uh oh!
There was an error while loading. Please reload this page.
Activity
Stars
stars
Watchers
watching
Forks
forks
Report repository
Releases
No releases published
Packages
Uh oh!
There was an error while loading. Please reload this page.
Contributors
Uh oh!
There was an error while loading. Please reload...