Salta el contingut

Estadística exploratòria

Exercici exploratory-statistics-annex.pdf · PDF

Sense executar res: quant costa un joc típic de Steam? Digues un nombre. Apunta'l, fins i tot.

Fa setmanes que neteges games_clean. En sàpigues les columnes de memòria. I tot i això has d'endevinar, perquè encara ningú no ha fet cap pregunta a la taula. Avui en fas. La resposta seran dos nombres que no coincideixen, i entendre per què no coincideixen és el tros d'estadística més útil que aprendràs mai.

Què aprendràs

  • Calcular la mitjana i la mediana d'una columna en SQL, i dir quina de les dues mou un sol valor extrem
  • Descriure la dispersió d'una columna: mínim, màxim, quartils i desviació estàndard
  • Construir una taula de freqüències amb width_bucket i llegir-ne la forma d'una distribució
  • Distingir una columna asimètrica d'una de simètrica només comparant mitjana i mediana
  • Triar el nombre que respon amb honestedat a "què és típic?"
  • El parany: per què "el joc mitjà costa 7.91" descriu un joc que gairebé no existeix

Avui produeixes els nombres; la lliçó següent els converteix en l'informe.

La cua: dos tipus de mig

L'estadística exploratòria consisteix a descriure una columna amb un grapat de nombres abans de dibuixar o concloure res: on és el seu mig, com de dispersa està i quina forma té.

Cinc amics comparen què guanyen en un mes. Quatre tenen feines normals. El cinquè és un streamer que ha tingut un mes molt bo.

1 200    1 300    1 400    1 500    30 000

Què guanya un amic típic? Hi ha dues maneres honestes de respondre.

La mitjana (la "mitjana aritmètica" de tota la vida) és el que obtindria cadascun si se sumés tot i es repartís a parts iguals.

Suma els cinc: 35,400. Reparteix entre cinc: 7,080.

La mediana és el valor del que queda al mig quan tothom fa cua de menor a major.

Posa'ls en una cua per ingressos. El tercer de cinc és al mig: 1,400.

Com Aquí Què li fa el streamer
Mitjana Suma-ho tot, reparteix-ho a parts iguals 7,080 La puja. Ningú del grup guanya res que s'hi acosti
Mediana Fes cua per mida, agafa el del mig 1,400 Res. El streamer és simplement "l'últim de la cua", guanyi el que guanyi

Dona al streamer 300,000 en lloc de 30,000. La mitjana salta a 61,080. La mediana continua sent 1,400.

Mantenim la cua durant tota la pàgina. Posa les dades en una cua, el més petit primer. La meitat són davant de la mediana, la meitat al darrere. Tot el que calcules avui és una pregunta sobre aquesta cua:

Pregunta A la cua SQL
Centre On és el mig? AVG, PERCENTILE_CONT(0.5)
Dispersió Quant de lluny són el primer i l'últim? I la meitat central? MIN, MAX, STDDEV, percentils 0.25 i 0.75
Forma On s'amuntega la cua? width_bucket + COUNT(*)

Centre: el mateix en 26,685 jocs

Ara la cua de veritat. Abans d'executar-ho, aposta: la mitjana del preu serà superior o inferior a la mediana?

SELECT ROUND(AVG(price), 2)                               AS mean,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price) AS median
FROM games_clean;
mean median
7.91 4.99

La mitjana és AVG, una vella amiga d'SQL Lab: grups. La mediana necessita una línia més llarga. Llegeix-la tros a tros:

Tros A la cua
WITHIN GROUP (ORDER BY price) "Fes la cua per preu"
PERCENTILE_CONT(0.5) "Camina fins al 50% de la cua i llegeix-hi el valor"

Un percentil és una posició a la cua, expressada com una fracció: 0.5 és el mig, 0.25 és un quart del camí.

PostgreSQL no té cap funció MEDIAN(). La mediana és el percentil 0.5.

Aleshores, quin és: un joc costa 7.91 dòlars o 4.99? Tots dos nombres són correctes. Responen preguntes diferents. Per saber quina pregunta, necessites la resta de la cua.

Dispersió: com de lluny

Un centre sol amaga massa coses. "El joc del mig costa 4.99" és cert tant si tots els jocs costen 4.99 com si els preus van de zero a centenars. Comença pels dos extrems de la cua:

SELECT COUNT(*) AS n, MIN(price) AS lowest, MAX(price) AS highest,
       ROUND(AVG(price), 2) AS mean,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price) AS median
FROM games_clean;
n lowest highest mean median
26,685 0.00 595.99 7.91 4.99

Un joc a 595.99? No informis mai d'un màxim sense mirar de qui és:

SELECT game, price FROM games_clean ORDER BY price DESC LIMIT 3;
game price
ADR-Labelling Game 595.99
GameMaker Studio 2 UWP 399.99
VEGAS Pro 16 Edit Steam Edition 399.00

El segon és una eina per fer jocs i el tercer és un editor de vídeo. Són programari que es ven a Steam, no jocs. Aquests són els streamers de la nostra cua.

Els extrems de la cua els fixa una sola fila cadascun. Una manera més sòlida de descriure la dispersió és tallar la cua en quatre parts iguals.

Els quartils són els tres talls que divideixen la cua en quatre parts amb el mateix nombre de files: Q1 al 25%, la mediana al 50%, Q3 al 75%.

La desviació estàndard és, aproximadament, la distància típica entre un valor i la mitjana. (La fórmula exacta eleva primer les distàncies al quadrat; avui no la necessites, i STDDEV ho fa per tu.)

SELECT ROUND(STDDEV(price), 2) AS std_dev,
       PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY price) AS q1,
       PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY price) AS q3
FROM games_clean;
std_dev q1 q3
11.79 1.99 9.99

Entre Q1 i Q3 hi ha la meitat central de la cua. Així que pots escriure una frase que és curta, exacta i certa: la meitat de tots els jocs costen entre 1.99 i 9.99 dòlars.

Compte: la desviació estàndard no és un interval de preus

És temptador llegir "mitjana 7.91, desviació estàndard 11.79" com "els preus van de 7.91 − 11.79 a 7.91 + 11.79". L'extrem inferior seria negatiu, i cap joc no costa menys que res. En una columna com aquesta, la desviació estàndard queda inflada pels pocs valors enormes del final de la cua. Els quartils descriuen millor la dispersió.

Forma: on s'amuntega la cua

Centre i dispersió continuen sent només nombres. Per veure la cua en necessites la forma.

Una distribució és com es reparteixen els valors d'una columna: quins valors són comuns i quins són rars.

La manera més senzilla de veure-la és una taula de freqüències: talla el rang en caixes d'amplada igual i compta quantes files cauen a cada caixa.

width_bucket(value, from, to, n) et diu en quina de les n caixes iguals entre from i to cau un valor. A continuació: sis caixes de 10 dòlars de 0 a 60. Qualsevol cosa per sobre de 60 va a una caixa extra, la número 7. L'última columna dibuixa una barra: un # per cada 500 jocs.

SELECT width_bucket(price, 0, 60, 6) AS bucket,
       MIN(price) AS lowest, MAX(price) AS highest, COUNT(*) AS games,
       REPEAT('#', (COUNT(*) / 500)::int) AS bar
FROM games_clean GROUP BY bucket ORDER BY bucket;
 bucket | lowest | highest | games | bar
--------+--------+---------+-------+--------------------------------------------
      1 |   0.00 |    9.99 | 21318 | ##########################################
      2 |  10.00 |   19.99 |  4101 | ########
      3 |  20.00 |   29.99 |   701 | #
      4 |  30.00 |   39.99 |   269 |
      5 |  40.00 |   49.99 |   117 |
      6 |  54.99 |   59.99 |    96 |
      7 |  64.99 |  595.99 |    83 |

Aquí tens la cua. Gairebé tothom està apilat a la primera caixa: 21,318 jocs de 26,685 costen menys de 10 dòlars. Després una línia llarga i prima de rezagats s'estén cap a la dreta, fins a 595.99.

Per què la caixa 6 comença a 54.99 i no a 50?

Les columnes lowest i highest mostren el joc més barat i el més car trobats a cada caixa, no els límits de la caixa. La caixa 6 cobreix de 50 a 60, però cap joc d'aquesta taula no costa entre 50.00 i 54.98.

Fes el mateix amb una segona columna, metascore, la puntuació de les ressenyes de 0 a 100. Dos canvis: només els jocs que tenen puntuació (WHERE has_metascore), i una conversió a numeric, perquè ROUND amb decimals no accepta directament el tipus d'aquesta columna.

SELECT COUNT(*) AS n, MIN(metascore) AS lowest, MAX(metascore) AS highest,
       ROUND(AVG(metascore)::numeric, 1) AS mean,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY metascore) AS median,
       ROUND(STDDEV(metascore)::numeric, 1) AS std_dev,
       PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY metascore) AS q1,
       PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY metascore) AS q3
FROM games_clean WHERE has_metascore;
n lowest highest mean median std_dev q1 q3
2,849 20 98 71.9 73 11.0 66 80
SELECT width_bucket(metascore, 20, 100, 8) AS bucket,
       MIN(metascore) AS lowest, MAX(metascore) AS highest, COUNT(*) AS games,
       REPEAT('#', (COUNT(*) / 25)::int) AS bar
FROM games_clean WHERE has_metascore GROUP BY bucket ORDER BY bucket;
 bucket | lowest | highest | games | bar
--------+--------+---------+-------+--------------------------------------------
      1 |     20 |      29 |     8 |
      2 |     30 |      39 |    21 |
      3 |     40 |      49 |    85 | ###
      4 |     50 |      59 |   261 | ##########
      5 |     60 |      69 |   666 | ##########################
      6 |     70 |      79 |  1055 | ##########################################
      7 |     80 |      89 |   677 | ###########################
      8 |     90 |      98 |    76 | ###

Una cua completament diferent. Aquesta és un turó: pocs jocs a baix, pocs a dalt, i una multitud al mig, entre 70 i 79.

Dues formes: la cua i el turó

Aquí tens les dues taules de freqüències com a imatge, amb la mitjana i la mediana marcades.

Dos gràfics de barres un al costat de l'altre. A l'esquerra, el preu: una barra molt alta per als jocs de menys de 10 dòlars (21,318 jocs) i barres que s'encongeixen ràpidament cap a la dreta; la mediana 4.99 i la mitjana 7.91 es marquen separades. A la dreta, el Metascore: un turó amb el cim als 70 (1,055 jocs); la mitjana 71.9 i la mediana 73 es marquen gairebé al mateix lloc.

Una distribució és asimètrica quan la majoria de valors s'amunteguen a un costat i una llarga cua de valors rars s'estén a l'altre. És simètrica quan els dos costats del centre s'assemblen més o menys.

price metascore
Forma Una barra alta i una cua llarga a la dreta: asimètrica Un turó: més o menys simètrica
Mitjana 7.91 71.9
Mediana 4.99 73
Mitjana contra mediana Molt separades: la mitjana és un 58% més alta Properes: un punt de diferència aproximadament
Qui estira la mitjana 83 productes de 60 dòlars o més, fins a 595.99 Ningú en particular

Ara pots dir la forma sense dibuixar res. Compara els dos centres. Molt separats vol dir que hi ha una cua, i la mitjana ha estat arrossegada cap a ella. Propers vol dir un turó.

Compte: la mitjana no sempre és el valor típic

"La majoria de jocs costen uns 7.91" sona raonable i és fals. Només 10,218 dels 26,685 jocs costen més que la mitjana; el 62% costa menys. És l'efecte streamer: uns quants productes molt cars allunyen la mitjana d'on la cua realment es troba.

Quan mitjana i mediana discrepen, la mediana descriu el cas típic i la mitjana descriu el total (multiplica-la pel nombre de jocs i obtens la suma de tots els preus). Cap de les dues no és errònia. Responen preguntes diferents.

Quin nombre imprimim?

Torna al nombre que vas apuntar al principi. T'hi havies acostat? A quin dels dos?

A la lliçó següent escrius un informe, i una línia dirà què costa un joc. Si imprimeixes 7.91, descrius un joc que gairebé no existeix. Aquí tens el mateix fet, escrit de tres maneres:

Frase Veredicte
"El preu mitjà és 7.91." Cert, i enganyós: sense unitat, i sense avisar que la majoria de jocs costen menys
"Els jocs costen uns 5 dòlars." Més a prop, però vague: quin nombre és aquest, i com de segur n'estàs?
"El joc típic costa 4.99 USD (mediana). La meitat de tots els jocs costen entre 1.99 i 9.99 USD. La mitjana és més alta, 7.91 USD, perquè uns quants productes costen fins a 595.99 USD." El centre, la dispersió i la forma, en tres frases curtes

Un nombre sense la seva forma és mitja veritat. Imprimeix la mediana, els quartils, i digues amb paraules que hi ha una cua.

Prova-ho

Usa games_clean a SQL Lab (base de dades Dades classe, esquema public). Construeix la teva pròpia fitxa estadística: una taula petita amb vuit nombres per columna.

n lowest highest mean median std_dev Q1 Q3
price
metascore

Pas 1 — Executa les consultes d'aquesta pàgina i omple les dues files. Els teus nombres han de coincidir amb els de dalt.

Pas 2 — Compta quants jocs costen més que la mitjana, amb WHERE price > 7.91. Hauries d'obtenir 10,218.

Pas 3 — Sobre paper, fes un esbós de les set barres de price i les vuit barres de metascore. Marca on cauen la mitjana i la mediana a cada esbós.

Pas 4 — Els jocs Hit costen més? Afegeix un grup a la primera consulta:

SELECT owners_tier, ROUND(AVG(price), 2) AS mean,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price) AS median
FROM games_clean GROUP BY owners_tier;
owners_tier mean median
Hit 13.99 9.99
Mid 8.60 4.99
Niche 7.38 4.99

Pas 5 — Acaba les dues frases: "Un joc típic costa __ perquè..." i "Un joc típic amb ressenyes puntua __ perquè...". Guarda la fitxa: és la matèria primera del teu informe.

Si SQL Lab es queixa

function round(double precision, integer) does not exist vol dir que estàs arrodonint la columna metascore tal com és. Converteix-la primer: ROUND(AVG(metascore)::numeric, 1). I si apareix una fila amb un bucket buit, falta el WHERE has_metascore: els jocs sense puntuació no cauen a cap caixa.

Idees clau

  • L'estadística exploratòria descriu una columna amb uns quants nombres: centre, dispersió i forma.
  • La mitjana ho suma tot i ho reparteix a parts iguals; la mediana és el mig de la cua. Un valor extrem mou la mitjana i deixa la mediana on era.
  • PostgreSQL no té MEDIAN(): usa PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY column). Els quartils Q1 i Q3 són els percentils 0.25 i 0.75.
  • Una taula de freqüències amb width_bucket i COUNT(*) mostra la distribució: on s'amunteguen els valors.
  • price és asimètrica (mitjana 7.91, mediana 4.99, una cua fins a 595.99). metascore és més o menys simètrica (mitjana 71.9, mediana 73).
  • Mitjana i mediana molt separades vol dir que hi ha una cua. En una columna asimètrica, informa de la mediana i els quartils, i digues que hi ha una cua.

Comprovació ràpida

1. Cinc amics guanyen 1,200, 1,300, 1,400, 1,500 i 30,000. Els ingressos de l'últim pugen a 300,000. Què passa?
  • Pugen tant la mitjana com la mediana
  • La mitjana puja molt; la mediana es queda a 1,400
  • La mediana puja molt; la mitjana es queda a 7,080
  • No canvia res, perquè només és una persona

La mitjana ho suma tot, així que un sol valor enorme l'arrossega: de 7,080 a 61,080. La mediana només es fixa en qui queda al mig de la cua. El streamer continua sent "l'últim", guanyi el que guanyi.

2. Quin SQL dona la mediana del preu a PostgreSQL?
  • AVG(price)
  • (MIN(price) + MAX(price)) / 2
  • PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price)
  • STDDEV(price)

La mediana és el percentil 0.5: fes la cua per preu, camina fins al 50% i llegeix-hi el valor. A mig camí entre el més baix i el més alt hi hauria uns 298, un preu que gairebé cap joc no té. La mediana real és 4.99.

3. El preu mitjà és 7.91 i la mediana és 4.99. Què et diu la diferència?
  • Que una de les dues consultes té un error
  • Que la meitat dels jocs costen exactament 7.91
  • Que la distribució és asimètrica: una cua de productes cars estira la mitjana cap amunt
  • Que els preus es reparteixen uniformement entre 4.99 i 7.91

Quan mitjana i mediana són molt separades, hi ha una cua. Aquí 83 productes costen 60 dòlars o més, fins a 595.99, i arrosseguen la mitjana. A metascore, un turó, els dos centres són a un punt de distància aproximadament.

4. Q1 de price és 1.99 i Q3 és 9.99. Quina frase és correcta?
  • La meitat de tots els jocs costen entre 1.99 i 9.99
  • Un quart de tots els jocs costen entre 1.99 i 9.99
  • Cap joc no costa menys d'1.99 ni més de 9.99
  • La mitjana ha de ser exactament al mig, a 5.99

Els quartils tallen la cua en quatre parts iguals. Entre Q1 (25%) i Q3 (75%) hi ha la meitat central de les files. Un quart dels jocs són més barats que Q1 i un altre quart són més cars que Q3.

5. Un company escriu: la majoria de jocs costen uns 7.91, la mitjana. Què té de malament aquesta frase?
  • Res: la mitjana és sempre el valor típic
  • La mitjana en realitat és 4.99
  • Només 10,218 dels 26,685 jocs costen més de 7.91; el 62% costa menys
  • No es pot calcular una mitjana sobre preus

L'aritmètica és correcta, la lectura és errònia. En una columna asimètrica la mitjana queda per sobre de la majoria de files. La mediana, 4.99, descriu el joc típic; la mitjana descriu el total.

6. Què fa width_bucket(price, 0, 60, 6)?
  • Arrodoneix cada preu als 6 dòlars més propers
  • Es queda només amb els sis jocs més barats
  • Diu en quina de sis caixes iguals entre 0 i 60 cau cada preu
  • Divideix la taula en sis taules

Sis caixes de 10 dòlars cadascuna. Juntament amb GROUP BY i COUNT(*) construeix una taula de freqüències, que mostra la forma de la distribució. Els preus de 60 o més cauen a una caixa extra, la número 7.

7. Un poble té 99 pisos llogats a 700-900 euros al mes (uns 800 de mitjana) i una mansió a 40,000. El diari imprimeix: lloguer mitjà, uns 1,190 euros. Tria les dues afirmacions certes.
  • La xifra és aritmèticament correcta, però 99 de cada 100 llogaters paguen menys que això
  • La mediana, uns 800 euros, descriu millor el lloguer típic
  • La xifra és falsa: el diari ha comès un error de càlcul
  • La mansió s'hauria de comptar dues vegades perquè la mitjana sigui justa

Torna a ser el streamer. (99 × 800 + 40,000) ÷ 100 ≈ 1,190, així que la mitjana és correcta i no descriu ningú. Imprimeix la mediana, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY rent), i esmenta el rang de la meitat central.

Ja tens una fitxa plena de nombres honestos. Però els nombres sols no són un informe. Ara toca L'informe descriptiu, on converteixes la fitxa estadística en una pàgina de la qual algú altre es pot fiar.