Reddit AmItheAsshole on mukavampi naisille kuin miehille – SQL-todiste?
Kun redditorit kysyvät ”olenko minä kusipää” puhuessaan naisista, heillä on suurempi muutos tulla tuomituksi kusipääksi. Katsotaanpa näitä mittareita – BigQueryllä, dbt:llä ja Data Studiolla
Varmista, ettet pidä mitään, mitä kirjoitin tänne, absoluuttisena totuutena. Useat ihmiset Twitterissä huomasivat ongelmia ja lisäsivät korjauksia tarjoamaani analyysiin. Tämän viestin lukeminen alkuperäisessä muodossaan – ja reaktiot – voi olla hyvä tapa oppia yhtä paljon kuin minä vastauksia lukiessani. Löydät monia heidän suodattamattomia ajatuksiaan seuraamalla tätä Twitter-ketjua.
Konteksti
/r/amItheAsshole on kasvanut neljänneksi aktiivisimmaksi subredditiksi – kommenttien määrän perusteella. Ihmiset tulevat tähän subredditiin kertomaan tarinoitaan, ja he kysyvät muilta redditoijilta ”olenko minä se kusipää täällä?”. Kävi ilmi, että useimmat ihmiset arvioidaan ”ei kusipääksi”, kuten tästä kaaviosta näkyy:
Voidaan huomata, että sukupuolittuneiden pronominien ja sanojen määrä esimerkissä vastaa sitä, kenestä jutussa on kyse. Nämä tarinat kertovat miespuolisesta asiakkaasta, naispuolisesta tyttöystävästä, miespuolisesta naapurista, miespuolisesta pojasta ja naispuolisesta teini-ikäisestä tyttärestä.
Näillä luvuilla voimme nyt asettaa mielivaltaisen säännön: Jos miespuolisia pronomineja on yli kaksi kertaa enemmän kuin naispuolisia, kyseinen viesti kertoo miehestä. Voimme käyttää päinvastaista sääntöä sanoaksemme, että viesti kertoo naisesta. Jos luvut ovat liian lähellä toisiaan tai nolla, sanomme viestiä ”neutraaliksi”.
Toinen sääntö, jonka voimme asettaa analyysin yksinkertaistamiseksi:
- Jos tuomio on ”ei a-ukko” tai ”täällä ei ole a-ukkoja”, niin voimme sanoa ”viestin kirjoittaja ei ole kusipää”.
- Jos tuomio on ’kusipää’ tai ’kaikki ovat kusipäitä’ niin voimme sanoa ’postaaja on kusipää’.
Jos yhdistämme kaikki nämä viestit, saamme luvut:
Kun esittelin nämä tulokset ensimmäisen kerran, minulle sanottiin, että ”nämä luvut ovat liian lähellä toisiaan, ne voivat olla tilastovirhe”.
Tilastollinen merkitsevyys?
Miten voimme sanoa, etteivät luvut ole vain tilastovirhe? Katsotaan trendi kuukausi kuukaudelta – onko se vakaa?
Joo! Trendi vaihtelee kuukausittain, mutta naisista puhuttaessa on selvästi suurempi mahdollisuus olla kusipää kuin miehistä puhuttaessa. Jos pieni ero olisi vain tilastollinen sattuma, odottaisimme trendin sen sijaan hyppäävän hurjasti.
Ja huomaa, että nämä tulokset ovat hyvin spesifisiä, kuten tässä twiitissä todetaan:
Johon vastasin
How-to
Tällä kerralla käytän dbt
ensimmäistä kertaa ja jätin kaiken koodini GitHubiin. Kiitos Claire Carrollille avusta tämän mahtavan työkalun käyttöönotossa!
Purkaaksesi kaikki /r/AmItheAsshole-postaukset BigQueryssä uuteen taulukkoon, voit tehdä näin:
CREATE TABLE temp.data ASSELECT *
FROM `fh-bigquery.reddit_posts.20*'
WHERE subreddit = 'AmItheAsshole'
AND _table_suffix > '19_'
Sitten jokaisen postauksen sukupuoli ja tuomio voidaan määrittää seuraavanlaisella kyselyllä:
WITH data AS (
SELECT *
, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(CONCAT(selftext, title), r'(?i)\bhe\b')) hes
, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(CONCAT(selftext, title), r'(?i)\bshe\b')) shes
, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(CONCAT(selftext, title), r'(?i)\bher\b')) hers
, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(CONCAT(selftext, title), r'(?i)\bhis\b')) hiss
, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(CONCAT(selftext, title), r'(?i)\bthey\b')) theys
, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(CONCAT(selftext, title), r'(?i)\bgirlfriend\b')) gfs
, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(CONCAT(selftext, title), r'(?i)\bboyfriend\b')) bfs
FROM {{ref('aita_posts')}}
WHERE link_flair_text IS NOT NULL
)
, gendered_data AS (
SELECT *
, CASE
WHEN males > 2+females*2 THEN 'to_male'
WHEN females > 2+males*2 THEN 'to_female'
ELSE 'neutral'
END to_gender
FROM (
SELECT *, hes+shes+hers+hiss+theys+gfs+bfs totalgender, hes+hiss+bfs males, shes+hers+gfs females
FROM data
)
)
SELECT CASE link_flair_text
WHEN 'not the a-hole' THEN 'no asshole'
WHEN 'no a-holes here' THEN 'no asshole'
WHEN 'everyone sucks' THEN 'asshole'
WHEN 'asshole' THEN 'asshole'
END judgement
, *
FROM gendered_data
WHERE link_flair_text IS NOT NULL
Ja lopuksi tässä esitetyt tilastot:
SELECT *, c/total_gender AS perc
FROM (
SELECT *, SUM(c) OVER(PARTITION BY to_gender, MONTH ) total_gender, SUM(c) OVER(PARTITION BY judgement, MONTH) total_judgement
FROM (
SELECT to_gender, judgement, CONCAT(to_gender, ': ', judgement) to_gender_judgement, month, COUNT(*) c, ARRAY_AGG(STRUCT(title, selftext) ORDER BY RAND() LIMIT 1) sample_title
FROM {{ref('aita_posts_gendered')}}
WHERE judgement IS NOT null
AND to_gender != 'neutral'
GROUP BY 1,2,3,4
)
)
WHERE c/total_gender > 0.01
AND total_judgement > 10
ORDER BY to_gender, perc DESC
Keskustelu
Tämän viestin Twitter-ketjusta löydät runsaasti oivaltavia ja viihdyttäviä vastauksia:
Keskusteluun voi vapaasti osallistua (ja kertoa, jos olen väärässä?). Muistakaa olla mukavia toisillenne – suurin osa ihmisistä ei kuitenkaan ole kusipäitä.
Tahdotko lisää?
Peitin vain elokuuhun 2019 asti, koska silloin nykyinen täysi reddit-arkisto BigQueryssä loppuu – kunnes tulevat odotetut päivitykset tulevat. Katso edellisestä viestistäni lisätietoja live-datan keräämisestä pushshift.iosta. Kiitos Jason Baumgartnerille jatkuvasta tarjonnasta!
Olen Felipe Hoffa, Google Cloudin Developer Advocate. Seuraa minua osoitteessa @felipehoffa, löydä aiemmat postaukseni osoitteesta medium.com/@hoffa ja kaiken BigQuerystä reddit.com/r/bigquery.