מה תרשים פיזור מראה
תרשים פיזור מציג את הקשר בין שני משתנים מספריים: כל תצפית הופכת לנקודה אחת, שממוקמת לפי הערך הראשון שלה לאורך הציר האופקי והערך השני שלה לאורך הציר האנכי. אם שני המשתנים נעים יחד, הנקודות יוצרות דפוס; אם לא, מקבלים ענן חסר צורה. זה המבט הראשון המקובל לפני התאמה של כל מודל, ו-R מציירת אותו עם אותה פונקציית plot() שמוסברת ב-מדריך ל-plot().
נשתמש ב-mtcars, מאגר נתונים מובנה של 32 מכוניות, ונשאל שאלה פיזיקלית: האם למכוניות כבדות יותר יש מנועים חזקים יותר?
יצירת התרשים
wt הוא משקל באלפי ליברות, hp הוא כוח סוס:
plot(mtcars$wt, mtcars$hp,
main = "Horsepower vs. weight",
xlab = "Weight (1000 lbs)",
ylab = "Horsepower",
pch = 19,
col = "steelblue")
התמונה: שלושים ושתיים נקודות מלאות שמטפסות מהפינה הנמוכה של התרשים (מכוניות קלות, סביב 1.5 בסקאלת המשקל, בערך 60 עד 90 כוח סוס) לעבר מכוניות כבדות מעל 5 שעוברות את 200 כוח סוס. העלייה ברורה אבל לא מסודרת: בכל משקל נתון הנקודות מתפזרות על פני רצועה לא קטנה של כוח סוס.
העיצוב הוא ארגז הכלים הרגיל של תרשימים בסיסיים: pch = 19 לעיגולים מלאים (ברירת המחדל החלולה נעלמת בצילומי מסך), col לצבע, cex = 1.3 אם הנקודות צריכות להיות גדולות יותר. כדי לצבוע נקודות לפי משתנה שלישי קטגוריאלי, בחרו מתוך וקטור צבעים לפי factor: col = c("tomato", "steelblue", "darkgreen")[factor(mtcars$cyl)] נותן לכל מספר צילינדרים צבע משלו.
איך קוראים אותו: כיוון, עוצמה, צורה
שלוש שאלות, לפי הסדר, בכל פעם שמסתכלים על תרשים פיזור:
- כיוון. האם הנקודות עולות (קשר חיובי) או יורדות (שלילי) כשסורקים לאורך הציר האופקי? כאן הן עולות: כבד יותר פירושו חזק יותר. שרטטו במקום זאת את
mpgמולwtוהענן יורד: כבד יותר פירושו זולל דלק יותר. - עוצמה. עד כמה הנקודות צמודות למסלול אחד? רצועה דקה כמו עיפרון היא קשר חזק; ריסוס רופף הוא קשר חלש. הענן הזה צפוף במידה בינונית.
- צורה והפתעות. האם המסלול ישר או מעוקל? יש אשכולות, או נקודות רחוקות מכל השאר? ב-
mtcars, ה-Maserati Bora יושבת באופן בולט מעל כולן: 335 כוח סוס במשקל בינוני. נקודה אחת כזו יכולה למשוך קו מותאם באופן מורגש, וזו בדיוק הסיבה להסתכל לפני שמתאימים.
הוספת קו המגמה
תרשים פיזור מציג קשר; קו שעובר דרכו מסכם את הטענה. התאימו מודל ליניארי והעבירו אותו ישר ל-abline():
plot(mtcars$wt, mtcars$hp,
pch = 19, col = "steelblue",
xlab = "Weight (1000 lbs)", ylab = "Horsepower")
abline(lm(hp ~ wt, data = mtcars), col = "tomato", lwd = 2)
lm(hp ~ wt) מתאימה את קו הריבועים הפחותים (קראו את הנוסחה כ"hp מוסבר על ידי wt", כשהמשתנה של הציר האנכי בא לפני ה-~), ו-abline() מציירת אותו לאורך התרשים. הקו מטפס בכ-46 כוח סוס לכל אלף ליברות. מה המודל הזה אומר ואיך קוראים את הסיכום שלו, זה הנושא של רגרסיה ליניארית.
אם לא רוצים להניח קו ישר, lowess() מציירת עקומה חלקה שעוקבת אחרי הנתונים לאן שהם הולכים:
lines(lowess(mtcars$wt, mtcars$hp), col = "darkgreen", lwd = 2, lty = 2)
כשעקומת ה-lowess והקו הישר מסכימים בערך, סיכום ליניארי הוגן. כשהעקומה מתכופפת הרחק ממנו, הקשר אינו ליניארי וקו ישר יציג אותו באופן מטעה.
בדיקת המספרים עם cor()
התרשים נותן את הצורה; cor() נותנת את העוצמה כמספר אחד. השלב הזה הוא פלט טקסט בלבד, אז הריצו אותו כאן:
משקל וכוח סוס מתואמים בכ-0.66: הענן העולה והצפוף במידה בינונית, בתור מספר. המטריצה מוסיפה ש-mpg מתואם שלילית בחוזקה עם שניהם (כ-−0.87 עם המשקל). אבל שמרו על סדר הפעולות: קודם התרשים, אחר כך המקדם. ערך r יחיד יכול להסתיר עקומה או להתנפח בגלל חריג אחד. ראו מתאם לדרכים הקלאסיות שבהן הוא מטעה.
מטריצת תרשימי הפיזור: pairs()
כשיש כמה עמודות מספריות, ציור ידני של כל זוג נמאס מהר. pairs() עושה את זה בקריאה אחת:
pairs(mtcars[, c("mpg", "wt", "hp")],
pch = 19, col = "steelblue")
התוצאה היא רשת של 3 × 3: שמות המשתנים לאורך האלכסון, וכל חלונית מחוץ לאלכסון היא תרשים הפיזור של זוג אחד: mpg מול wt, mpg מול hp, wt מול hp, כל אחד מופיע פעמיים עם הצירים מוחלפים. זו הדרך המהירה ביותר למיין מאגר נתונים חדש: מבט אחד מראה אילו זוגות קשורים, אילו קשרים מתעקלים, ואיפה מסתתרים החריגים. בחרו תת-קבוצה של עמודות קודם, כמו כאן: מעבר לשישה או שבעה משתנים החלוניות מתכווצות עד שאי אפשר לקרוא אותן.
הגרסה של ggplot2
ב-ggplot2, תרשים הפיזור יחד עם קו מותאם הם שתי שכבות:
library(ggplot2)
ggplot(mtcars, aes(x = wt, y = hp)) +
geom_point(color = "steelblue", size = 2) +
geom_smooth(method = "lm", color = "tomato") +
labs(title = "Horsepower vs. weight",
x = "Weight (1000 lbs)", y = "Horsepower")
geom_smooth(method = "lm") הוא abline(lm(...)) עם בונוס: רצועת סמך מוצללת סביב הקו. השאירו את method בלי הגדרה והיא תתאים עקומת loess במקום, המקבילה של lowess() ב-ggplot2. R הבסיסית מנצחת במהירות ההקלדה למבט מהיר; ggplot2 מנצחת ברגע שרוצים נקודות צבועות לפי קבוצה עם מקרא אוטומטי.
מה לקחת מכאן
plot(x, y)עם שני וקטורים מספריים הוא תרשים פיזור;pch = 19וצירים עם תוויות הופכים אותו לייצוגי.- קראו כיוון, עוצמה וצורה, וזהו חריגים, לפני שמחשבים משהו.
abline(lm(y ~ x, data = df))מוסיפה את קו הרגרסיה;lines(lowess(x, y))מוסיפה עקומה שלא מניחה קו ישר.cor()מכמתת את מה שהתרשים מראה; התרשים שומר על המספר כן.pairs(df[, cols])מציירת את כל תרשימי הפיזור של הזוגות בבת אחת: המיון המהיר ביותר של מאגר נתונים חדש.
הבא בתור: תרשים העמודות. משאירים מאחור זוגות מספריים כדי להשוות ספירות בין קטגוריות.
שאלות נפוצות
איך יוצרים תרשים פיזור ב-R?
קוראים ל-plot(x, y) עם שני וקטורים מספריים, למשל plot(mtcars$wt, mtcars$hp). כל תצפית הופכת לנקודה אחת. הוסיפו pch = 19 לנקודות מלאות, ו-main, xlab, ylab לתוויות.
איך מוסיפים קו רגרסיה לתרשים פיזור ב-R?
מתאימים את המודל ומעבירים אותו ל-abline(): abline(lm(hp ~ wt, data = mtcars)) מצייר את קו הריבועים הפחותים מעל התרשים הקיים. שימו לב לסדר בנוסחה: המשתנה של הציר האנכי בא לפני ה-~.
איך משרטטים הרבה זוגות משתנים בבת אחת ב-R?
pairs(df) מציירת מטריצת תרשימי פיזור: חלונית קטנה אחת לכל זוג עמודות. בחרו תת-קבוצה קודם, pairs(mtcars[, c("mpg", "wt", "hp")]), כי מעבר לשש או שבע עמודות החלוניות נעשות קטנות מדי לקריאה.
מה תרשים פיזור מראה שמתאם לא מראה?
את הצורה. מקדם מתאם הוא מספר אחד, והוא יכול להיות זהה לקו נקי, לעקומה, או לענן עם חריג קיצוני אחד. תרשים הפיזור מראה עקמומיות, אשכולות וחריגים ישירות, ולכן משרטטים קודם ומחשבים cor() אחר כך.