מה היסטוגרמה מראה
היסטוגרמה עונה על שאלה אחת לגבי משתנה מספרי אחד: איך הערכים מתפלגים? היא חותכת את טווח הנתונים למרווחים עוקבים (תאים, bins), סופרת כמה תצפיות נופלות בכל אחד, ומציירת עמודה לכל תא שגובהה הוא הספירה הזו. היכן שהנתונים צפופים, העמודות גבוהות; היכן שהם דלילים, הן נמוכות.
התמונה האחת הזו מגלה דברים שממוצע וסטיית תקן לא יכולים לגלות: האם לנתונים יש שיא אחד או שניים, האם הם סימטריים או מוטים לכיוון זנב אחד, והאם יש ערכים חריגים רחוקים משאר הנתונים. בדרך כלל זה הגרף הראשון שכדאי ליצור כשפוגשים מאגר נתונים חדש, לצד המספרים של סטטיסטיקה תיאורית.
ב-R הפונקציה היא hist(), והיא שורה אחת.
ההיסטוגרמה הראשונה שלכם עם hist()
נדמה גבהים של 200 אנשים, בהתפלגות נורמלית סביב 170 ס"מ עם סטיית תקן של 10 (ראו מספרים אקראיים כדי להבין מה עושים set.seed() ו-rnorm()):
set.seed(42)
heights <- rnorm(200, mean = 170, sd = 10)
hist(heights)
R בוחר את התאים בעצמו ומצייר ערימת עמודות בצורת פעמון: עמודות נמוכות סביב 145 ס"מ, עולות לאורך שנות ה-160, מגיעות לשיא סביב 170 ויורדות באופן סימטרי אחרי 190. הציר האנכי מסומן "Frequency", כלומר ספירות גולמיות, והכותרת ותווית הציר נלקחות משם המשתנה.
ברירות המחדל פשוטות בכוונה. כל הארגומנטים הרגילים לעיצוב עובדים גם כאן:
hist(heights,
main = "Distribution of heights",
xlab = "Height (cm)",
col = "steelblue",
border = "white")
col ממלא את העמודות ו-border צובע את קווי המתאר שלהן. border = "white" נותן את המראה הנקי של עמודות מופרדות שרואים ברוב הפרסומים. כל מה שהמדריך ל-plot() אומר על צבעים וכותרות חל כאן בלי שינוי.
רוחב התא: הארגומנט breaks
הארגומנט החשוב ביותר של hist() הוא breaks, כי רוחב התא קובע איזה סיפור הגרף מספר. אותם נתונים, שתי הגדרות:
hist(heights, breaks = 5) # five wide bins: a crude, blocky bell
hist(heights, breaks = 30) # thirty narrow bins: detail, plus noise
עם breaks = 5 ההיסטוגרמה גסה כל כך שהכול נראה כמו גבעה חלקה אחת: אשכול שני או פער בנתונים היו נעלמים. עם breaks = 30 רואים מבנה עדין, אבל תנודות אקראיות מתחילות להתחזות לתכונות אמיתיות. אף אחת מהן אינה "נכונה"; הצעד הכן הוא לנסות כמה הגדרות ולראות אילו תכונות שורדות.
breaks מקבל שלוש צורות:
- מספר,
breaks = 30: הצעה למספר התאים. R מתאים אותו כדי לנחות על גבולות מסודרים, כך שייתכן שתקבלו 28 או 33 תאים. זה מפתיע את כולם פעם אחת. - וקטור של נקודות חיתוך,
breaks = seq(140, 200, by = 5): גבולות תאים מדויקים, בלי משא ומתן. השתמשו בזה כשהתאים חייבים להיות מיושרים בין כמה היסטוגרמות שאתם משווים. - שם של כלל,
breaks = "FD"עבור Freedman-Diaconis, שבוחר את הרוחב לפי פיזור הנתונים וגודל המדגם ומתנהג היטב על נתונים מוטים.
היסטוגרמות צפיפות והעקומה הנורמלית
כברירת מחדל גובה העמודות הוא ספירות (freq = TRUE). הגדרה של freq = FALSE משנה את קנה המידה של העמודות כך שהשטח הכולל שלהן הוא 1: סקאלת הצפיפות. הצורה לא משתנה; הציר האנכי כן. הטעם בזה הוא שהיסטוגרמת צפיפות נמצאת על אותה סקאלה כמו פונקציית צפיפות הסתברות, כך שאפשר לשים עקומה תיאורטית ישירות מעל הנתונים:
hist(heights,
freq = FALSE,
col = "gray90",
main = "Heights vs. a normal curve",
xlab = "Height (cm)")
curve(dnorm(x, mean = mean(heights), sd = sd(heights)),
add = TRUE, col = "tomato", lwd = 2)
curve() עם add = TRUE מצייר את עקומת הפעמון מעל ההיסטוגרמה הקיימת (ה-x שבתוך dnorm(x, ...) הוא ממלא מקום ש-curve() ממלא בעצמו, לא משתנה שלכם). אם העמודות צמודות לעקומה, מודל נורמלי סביר; היכן שהן בולטות ממנה, זנב כבד או שיא שני, המודל מפספס משהו. דלגו על freq = FALSE והעקומה תזחל בלי תועלת לאורך תחתית הגרף, כי ספירות וצפיפויות נמצאות על סקאלות שונות.
המספרים שמאחורי העמודות
hist() לא רק מצייר: הוא מחזיר את החלוקה לתאים כרשימה. עם plot = FALSE הוא מדלג לגמרי על הציור ורק מחשב, כלומר אפשר להריץ את הקוד הזה כאן:
h$counts הוא ההיסטוגרמה כנתונים: כל מספר הוא הגובה של עמודה אחת. השורה table(cut(...)) היא המקבילה במצב טקסט: cut() מחלק את הערכים לתאים ו-table() סופר כל תא, וזו בדיקת שפיות טובה להדפיס לפני הגרף או במקומו. אם מבצעים השמה בלי plot = FALSE (h <- hist(heights)), R מצייר וגם מחזיר את הרשימה; ההשמה לא מבטלת את הגרף.
היסטוגרמות עם ggplot2
הגרסה של ggplot2 מחליפה את breaks ב-binwidth, שהוא לעיתים קרובות הכפתור הטבעי יותר: אומרים כמה רחב תא ביחידות של הנתונים במקום כמה תאים רוצים:
library(ggplot2)
ggplot(data.frame(heights), aes(x = heights)) +
geom_histogram(binwidth = 5, fill = "steelblue", color = "white") +
labs(title = "Distribution of heights", x = "Height (cm)", y = "Count")
binwidth = 5 אומר שכל עמודה מכסה 5 ס"מ. ggplot2 מזהיר אם משאירים את binwidth בלי הגדרה, ובשקט בוחר ברירת מחדל של 30 תאים. שימו לב לאזהרה, כי ברירת המחדל כמעט אף פעם אינה הרוחב הנכון לנתונים שלכם. למבט מהיר על משתנה אחד, hist() דורש פחות הקלדה; ggplot2 מצדיק את עצמו כשההיסטוגרמה צריכה facets, קבוצות או ערכת עיצוב אחידה עם שאר הגרפים שלכם.
מה לקחת מכאן
- היסטוגרמה מראה את ההתפלגות של משתנה מספרי אחד:
hist(x)וסיימתם. breaksהוא הארגומנט שחשוב: מספר הוא רק הצעה, וקטור קובע גבולות מדויקים,"FD"בוחר רוחב שאפשר להגן עליו. תמיד נסו יותר מהגדרה אחת.freq = FALSEעובר לסקאלת הצפיפות, וזה מה שמאפשר ל-curve(dnorm(...), add = TRUE)להוסיף עקומה נורמלית בצורה משמעותית.hist(x, plot = FALSE)מחזיר את התאים כנתונים ($breaks,$counts,$mids);table(cut(x, breaks))הוא המקבילה בטקסט בלבד.- ב-ggplot2,
geom_histogram(binwidth = ...), והגדירו אתbinwidthבעצמכם.
בהמשך: ה-boxplot, גרף ההתפלגות שבאמת זורח כשמשווים קבוצות זו לצד זו.
שאלות נפוצות
איך יוצרים היסטוגרמה ב-R?
קראו ל-hist(x) על וקטור מספרי. R מחלק את הטווח של x לתאים (bins) ומצייר עמודה אחת לכל תא, כשגובה העמודה מראה כמה ערכים נופלים בתוכו. הוסיפו breaks = כדי לשלוט במספר התאים ו-col = כדי לצבוע את העמודות.
מה עושה הארגומנט breaks ב-hist()?
הוא שולט בחלוקה לתאים. מספר בודד כמו breaks = 30 הוא הצעה לכמות התאים (R מעגל לגבולות מסודרים), וקטור כמו breaks = seq(140, 200, by = 5) קובע את נקודות החיתוך המדויקות, ו-breaks = "FD" משתמש בכלל Freedman-Diaconis.
איך מוסיפים עקומה נורמלית מעל היסטוגרמה ב-R?
ציירו את ההיסטוגרמה בסקאלת הצפיפות עם freq = FALSE, ואז הוסיפו את העקומה עם curve(dnorm(x, mean = mean(data), sd = sd(data)), add = TRUE). בסקאלת השכיחויות העקומה הייתה נשארת צמודה לאפס בלי שום תועלת, ולכן freq = FALSE הכרחי.
מה ההבדל בין היסטוגרמה לתרשים עמודות?
היסטוגרמה מחלקת לתאים משתנה מספרי אחד, ולכן הציר האופקי הוא סקאלה רציפה והעמודות נוגעות זו בזו. תרשים עמודות משווה קטגוריות נפרדות, ולכן העמודות מופרדות. ב-R זה hist() למספרים ו-barplot() לספירות של קטגוריות.