boxplot() i R: Hvordan lage BoxTomter i RStudio

⚡ Smart oppsummering

BoxPlottet i R oppsummerer en numerisk fordeling gjennom median, kvartiler, værhår og uteliggere ved hjelp av geom_boxplot() fra ggplot2. Denne gjennomgangen bygger et boksplott på luftkvalitetsdatasettet og legger lag på farge, prikker, jitter, hakk og gruppesammenligninger.

  • 📐 Fem-talls sammendrag: Boksen spenner over første til tredje kvartil, linjen markerer medianen, og værhårene når 1.5 ganger interkvartilområdet.
  • 🧱 Basissyntaks: ggplot(df, aes(x = gruppe, y = verdi)) + geom_boxplot() produserer én boks per nivå i gruppenping faktor.
  • ???? Outlier-styling: outlier.colour, outlier.shape og outlier.size styrer hvordan punkter bak værhårene tegnes.
  • 💠 Viser observasjoner: geom_jitter() forskyver overlappingping peker sidelengs, og avslører utvalgsstørrelsen bak hver boks.
  • 📉 hakk Boxer: hakk = SANN tegner konfidensintervallet til medianen, og ikke-overlappendeping hakk indikerer en reell forskjell.
  • 🎨 Grouping: kartping `fill inside geom_boxplot()` deler hver kategori inn i flere bokser side om side.

Boxplott i R

boxplot() i R

boxplot() i R hjelper til med å visualisere fordelingen av dataene etter kvartil og oppdage tilstedeværelsen av uteliggere. Du kan bruke det geometriske objektet geom_boxplot() fra ggplot2-biblioteket til å tegne et boxplot() i R.

Vi vil bruke luftkvalitetsdatasettet til å introdusere boxplot() i R med ggplot. Datasettet registrerer daglige luftkvalitetsmålinger i New York fra mai til september 1973 og inneholder 153 observasjoner. Vi vil bruke følgende variabler:

  • Ozon: Numerisk variabel
  • Vind: Numerisk variabel
  • Måned: mai til september. Numerisk variabel

Før du tegner en, er det verdt å vite nøyaktig hva hver del av boksen representerer.

Hvordan lese en Box Plott: Kvartiler, IQR og uteliggere

Hvert element i et boksplott koder for ett tall fra femtallssammendraget. Å vite hvilket som er hvilket, forvandler diagrammet fra dekorasjon til analyse.

  • Nedre hengsel: den første kvartilen, Q1. Tjuefem prosent av observasjonene ligger under den.
  • Median linje: den andre kvartilen. Plasseringen inne i boksen avslører skjevhet: en linje som er skjøvet mot bunnen betyr at dataene er høyreskjev.
  • Øvre hengsel: den tredje kvartilen, Q3. Syttifem prosent av observasjonene ligger under den.
  • Box høyde: interkvartilområdet, IQR = Q3 – Q1, som inneholder den midterste halvdelen av dataene og er det standard robuste målet på spredning.
  • værhår: De strekker seg til den mest ekstreme observasjonen, fortsatt innenfor 1.5 ganger IQR-en til nærmeste hengsel. De er ikke minimum og maksimum.
  • Poeng bak værhårene: observasjoner markert som avvikere av den 1.5 IQR-regelen.

To advarsler. For det første er en «avviker» her et statistisk flagg, ikke en feil: i en skjev fordeling, som for eksempel ozonkonsentrasjon, forventes høye verdier og bør ikke slettes. For det andre skjuler et boksplott formen på fordelingen, slik at to grupper med identiske bokser kan ha svært forskjellige underliggende data. Å legge til skjevpunkter, som vist nedenfor, beskytter mot dette.

Box Plott vs. histogram vs. fiolinplott i R

Alle tre diagrammene beskriver en numerisk fordeling, men hver avslører noe de andre skjuler.

Kriterier Box Plott histogram Fiolinplot
Viser Median, kvartiler, uteliggere Frekvens i hver beholder Full tetthetskurve
Revoppnår flere topper Nei Ja Ja
Flagger avvikere Ja, eksplisitt Bare visuelt Ikke direkte
Sammenligning av mange grupper Utmerket Pinlig Flink
Trenger et valg av tuning Nei Ja, antall søppelbøtter Ja, båndbredde
ggplot2-objekt geom_boksplott() geom_histogram() geom_fiolin()

Et vanlig kompromiss er å tegne et fiolinplott med et smalt boksplott inni, som beholder tetthetsformen og kvartilsammendraget i et enkelt diagram. Se histogram-veiledning for binning-siden av sammenligningen.

Opprett Box Plott

Før du begynner å lage ditt første boxplot() i R, må du manipulere dataene som følger:

  • Trinn 1: Importer dataene
  • Trinn 2: Slipp unødvendige variabler
  • Trinn 3: Konverter Måned til en ordnet faktor
  • Trinn 4: Opprett en ny kategorisk variabel som deler hver måned inn i tre deler: Start, Midt og Slutt
  • Trinn 5: Fjern manglende observasjoner

Alle disse trinnene gjøres med dplyr og rørledningsoperatøren %>%.

library(dplyr)
library(ggplot2)
# Step 1
data_air <- airquality %>%

#Step 2
select(-c(Solar.R, Temp)) %>%

#Step 3
mutate(Month = factor(Month, order = TRUE, labels = c("May", "June", "July", "August", "September")), 
       
#Step 4 
day_cat = factor(ifelse(Day < 10, "Begin", ifelse(Day < 20, "Middle", "End"))))

En god praksis er å sjekke strukturen til dataene med funksjonen glimpse().

glimpse(data_air)

Utgang:

## Observations: 153
## Variables: 5
## $ Ozone   <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, ...
## $ Wind    <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6...
## $ Month   <ord> May, May, May, May, May, May, May, May, May, May, May,...
## $ Day     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,...
## $ day_cat <fctr> Begin, Begin, Begin, Begin, Begin, Begin, Begin, Begi...

Både Ozone og Solar.R inneholder NA-verdier. Fordi geom_boxplot() ville slette dem i stillhet og skrive ut en advarsel, er det renere å fjerne dem eksplisitt.

# Step 5
data_air_nona <-data_air %>% na.omit()	

Grunnleggende boksplott

Plott nå fordelingen av ozon per måned.

# Store the graph
box_plot <- ggplot(data_air_nona, aes(x = Month, y = Ozone))
# Add the geometric object box plot
box_plot +
    geom_boxplot()

Code Forklaring

  • Lagre grafen for videre bruk
    • box_plot: basisplottet lagres i objektet box_plot, som lar deg legge til lag senere uten å gjenta hele kallet
  • Legg til det geometriske objektet
    • Du sender datasettet data_air_nona til ggplot boxplot.
    • Inne i aes()-argumentet legger du til x-aksen og y-aksen.
    • +-tegnet betyr at du vil at R skal fortsette å lese koden. Det gjør koden mer lesbar ved å bryte den.
    • Bruk geom_boxplot() for å lage et boksplott

Utgang:

Basic Box Plott

Bytt side av grafen

Du kan snu siden av grafen.

box_plot +
  geom_boxplot()+
  coord_flip()

Code Forklaring

  • box_plot: Du bruker grafen du lagret. Den unngår å skrive om alle kodene hver gang du legger til ny informasjon i grafen.
  • geom_boxplot(): tegn boksene og værhårene
  • coord_flip(): Vend siden av grafen

Utgang:

Bytt side av grafen

Endre farge på ytterside

Du kan endre farge, form og størrelse på uteliggere.

box_plot +
    geom_boxplot(outlier.colour = "red",
        outlier.shape = 2,
        outlier.size = 3) +
    theme_classic()

Code Forklaring

  • outlier.colour=”rød”: Kontroller fargen på uteliggere
  • outlier.shape=2: Endre formen på uteliggeren. 2 refererer til trekant
  • outlier.size=3: Endre størrelsen på trekanten. Større tall tegner større markører.

Utgang:

Endre Farge på Outlier

Legg til en sammendragsstatistikk

Du kan legge over en sammendragsstatistikk, for eksempel gruppegjennomsnittet, som selve boksplottet ikke viser.

box_plot +
    geom_boxplot() +
    stat_summary(fun.y = mean,
        geom = "point",
        size = 3,
        color = "steelblue") +
    theme_classic()

Code Forklaring

  • stat_summary() legger til en beregnet statistikk oppå boksplottet
  • Argumentet fun styrer hvilken statistikk som returneres. Her er det gjennomsnittet. Merk at eldre kode bruker fun.y, som ggplot2 ble avskrevet i versjon 3.3.0.
  • Merk: Annen statistikk er tilgjengelig som min og maks. Mer enn én statistikk kan vises i samme graf
  • geom = "punkt": Plott gjennomsnittet med et punkt
  • størrelse=3: Størrelsen på punktet
  • farge =”stålblå”: Farge på punktene

Utgang:

Legg til en sammendragsstatistikk

Box Plott med prikker

Deretter legger du til et punktplottlag oppå boksene. Hver prikk representerer én observasjon, noe som gjør utvalgsstørrelsen bak hver boks synlig.

box_plot +
    geom_boxplot() +
    geom_dotplot(binaxis = 'y',
        dotsize = 1,
        stackdir = 'center') +
    theme_classic()

Code Forklaring

  • geom_dotplot() tegner én prikk per observasjon, stablet innenfor hver beholder
  • binaxis='y': Endre posisjonen til prikkene langs y-aksen. Som standard, x-aksen
  • dotsize=1: Størrelsen på prikkene
  • stackdir='center': Måte å stable prikkene på: Fire verdier:
    • "opp" (standard),
    • "ned"
    • "senter"
    • "hele midten"

Utgang:

Box Plott med prikker

Kontroll Estetikk av Box Plott

Endre fargen på boksen

Du kan endre fargene på gruppen.

ggplot(data_air_nona, aes(x = Month, y = Ozone, color = Month)) +
    geom_boxplot() +
    theme_classic()

Code Forklaring

  • Fargene på gruppene kontrolleres i aes()-kartetpingDu kan bruke color=Month for å endre fargen på boks-og-hår-plottet i henhold til månedene.

Utgang:

Endre fargen på Box

Box plott med flere grupper

Det er også mulig å legge til flere grupper. Du kan visualisere forskjellen i luftkvaliteten i henhold til måledagen.

ggplot(data_air_nona, aes(Month, Ozone)) +
    geom_boxplot(aes(fill = day_cat)) +
    theme_classic()

Code Forklaring

  • aes()-kartetping av det geometriske objektet styrer gruppene som skal vises (denne variabelen må være en faktor)
  • aes(fill= day_cat) lar deg lage tre bokser for hver måned i x-aksen

Utgang:

Box Plott med flere grupper

Box Plott med rystede prikker

En annen måte å vise individuelle observasjoner på er med dirrende punkter. Dirring er det vanlige valget når en kategorisk x-akse fører til at mange punkter lander på samme posisjon.

Denne metoden unngår overlappingping av de diskrete dataene.

box_plot +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(width = 0.21)) +
    theme_classic()

Code Forklaring

  • geom_jitter() legger til en liten tilfeldig forskyvning til hvert punkt slik at overlappingen skjerping verdier blir synlige.
  • shape=15 endrer formen på punktene. 15 representerer rutene
  • farge = "stålblå": Endre fargen på punktet
  • posisjon = posisjonsjitter(bredde = 0.21): kontrollerer hvor langt punktene forskyves sidelengs, målt i x-akseenheter. Standardverdien er 40 prosent av avstanden mellom kategoriene.

Utgang:

Box Plott med rystede prikker

Du kan se forskjellen mellom den første grafen med jittermetoden og den andre med punktmetoden.

box_plot +
    geom_boxplot() +
    geom_point(shape = 5,
        color = "steelblue") +
    theme_classic()

Box Plott med rystede prikker

hakk Box Plott

Et interessant trekk ved geom_boxplot(), er en notched boxplot-funksjon i R. Notchplotten begrenser boksen rundt medianen. Hovedformålet med et hakkede boksplott er å sammenligne betydningen av medianen mellom grupper. Det er sterke bevis for at to grupper har forskjellige medianer når hakkene ikke overlapper hverandre. Et hakk beregnes som følger:

hakk Box Plott

Her er IQR interkvartilområdet og n er antall observasjoner i gruppen. Hakket spenner omtrent over 95 prosent konfidensintervall for medianen.

box_plot +
    geom_boxplot(notch = TRUE) +
    theme_classic()

Code Forklaring

  • geom_boxplot(notch = TRUE): tegn boksplottet med hakk rundt medianen

Utgang:

hakk Box Plott

Slik legger du til titler, etiketter og egendefinerte farger i en Box Plott i R

Plottene ovenfor bruker ggplot2-standarder, som tar variabelnavn direkte fra datarammen. Et publiserbart diagram trenger lesbare etiketter og en bevisst palett.

Titler og akseetiketter. Ett labs()-kall setter hvert tekstelement:

box_plot +
    geom_boxplot(fill = "coral", alpha = 0.7) +
    labs(title = "Ozone concentration by month",
        subtitle = "New York, May to September 1973",
        x = "Month",
        y = "Ozone (parts per billion)",
        caption = "Source: airquality dataset") +
    theme_classic()

Å velge dine egne farger. Bruk scale_fill_manual() når fyll er kartlagt i aes(), og scale_colour_manual() når fargen er:

ggplot(data_air_nona, aes(x = Month, y = Ozone, fill = Month)) +
    geom_boxplot() +
    scale_fill_manual(values = c("#0e9cd1", "coral", "#7dc27d", "#c9a227", "grey60")) +
    theme_classic() +
    theme(legend.position = "none")

Forklaringen er slått av her fordi x-aksen allerede navngir hver måned, så å gjenta den ville sløse med plass.

Omorganisering av boksene. Faktornivåene styrer rekkefølgen på aksen. Fordi Måned ble opprettet som en ordnet faktor, leses den allerede kronologisk. For en uordnet faktor, sorter etter medianen i stedet:

ggplot(data_air_nona, aes(x = reorder(Month, Ozone, FUN = median), y = Ozone)) +
    geom_boxplot() +
    theme_classic()

Lagrer diagrammet. ggsave() skriver det siste plottet til disken med en oppløsning du kontrollerer:

ggsave("ozone_boxplot.png", width = 8, height = 5, dpi = 300)

Box Plott i R: Code Referanse

Tabellen nedenfor viser ggplot2-kallet for hver boksplotvariant som er dekket ovenfor:

Målet Code
Grunnleggende boksplott
ggplot(df, aes(x = x1, y = y)) + geom_boxplot()
Snu retningen
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + coord_flip()
Hakket boksplott
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(notch = TRUE)
Box plott med rystede prikker
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + geom_jitter(position = position_jitter(0.21))
Fargelegging etter gruppe
ggplot(df, aes(x = x1, y = y, color = x1)) + geom_boxplot()
Flere grupper per kategori
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(aes(fill = x2))
Legg til gruppens gjennomsnitt
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + stat_summary(fun = mean, geom = "point")

Sjekk også: - R-opplæring for nybegynnere: Lær R-programmeringsspråk

Spørsmål og svar

Værhårene når den mest ekstreme observasjonen innenfor 1.5 ganger interkvartilområdet til nærmeste kvartil. De er ikke minimum og maksimum, og alt utenfor dem tegnes som et avvikspunkt.

Ikke automatisk. 1.5 IQR-regelen er en konvensjon, ikke bevis på feil. Undersøk hvert punkt først: skjeve data som ozonavlesninger gir naturlig høye verdier som er ekte målinger.

overlappingping Hakkene tyder på at det ikke finnes sterke bevis for at de to medianene er forskjellige. Ikke-overlappendeping Hakk indikerer en sannsynlig reell forskjell, omtrent tilsvarende en 95 prosent konfidenssammenligning.

Box Plott er et standard utforskende trinn før trening: de eksponerer skjevhet, uteliggere og forskjellige funksjonsskalaer på tvers av klasser. Team bruker dem også til å sammenligne modellnøyaktighet på tvers av kryssvalideringsfoldinger.

Ja. AI-assistenter kan forklare feil som en kontinuerlig x-akse som produserer en enkelt boks, foreslå riktig aes()-kartping, og flagg utdaterte argumenter som fun.y. Kjør alltid den korrigerte koden på nytt på dine egne data.

Oppsummer dette innlegget med: