ما الذي يظهره مخطط الانتشار
يعرض مخطط الانتشار العلاقة بين متغيرين عدديين اثنين: إذ تصبح كل ملاحظة نقطة واحدة، يحدد موضعها القيمة الأولى على المحور الأفقي والقيمة الثانية على المحور الرأسي. فإذا تحرك المتغيران معًا شكّلت النقاط نمطًا، وإن لم يفعلا حصلت على سحابة بلا شكل. وهو النظرة الأولى المعيارية قبل معايرة أي نموذج، ويرسمه 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 حصان. والصعود لا تخطئه العين لكنه ليس مرتبًا، فعند أي وزن معين تتوزع النقاط على نطاق لا بأس به من القدرة الحصانية.
والتنسيق هو صندوق أدوات الرسم المعتاد في base: pch = 19 للدوائر المصمتة (فالدائرة المجوفة الافتراضية تختفي في لقطات الشاشة)، وcol للون، وcex = 1.3 إن احتاجت النقاط إلى حجم أكبر. ولتلوين النقاط حسب متغير ثالث فئوي، افهرس متجه ألوان بعامل، فـ 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. ويفوز base 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() ثانيًا.