Menu
flag Ar iconالعربيةdown icon

المدرج التكراري في R: شرح hist() بأمثلة

كيفية إنشاء مدرج تكراري في R بدالة hist(): اختيار الفواصل، وتنسيق الأعمدة، والتحويل إلى مقياس الكثافة، وتراكب منحنى طبيعي، ونسخة ggplot2.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

ما الذي يظهره المدرج التكراري

يجيب المدرج التكراري عن سؤال واحد بخصوص متغير عددي واحد: كيف تتوزع القيم؟ فهو يقطّع مدى البيانات إلى فترات متتالية (سلال)، ويعدّ كم ملاحظة تقع في كل منها، ويرسم عمودًا لكل سلة ارتفاعه هو ذلك العدد. فحيث تكون البيانات كثيفة ترتفع الأعمدة، وحيث تتناثر تقصر.

وتخبرك تلك الصورة الواحدة بأشياء لا يستطيع المتوسط والانحراف المعياري إخبارك بها: هل للبيانات قمة واحدة أم قمتان، وهل هي متماثلة أم ملتوية نحو أحد الذيلين، وهل توجد قيم شاردة بعيدة عن البقية. وهي عادةً أول رسم تصنعه عند مقابلة مجموعة بيانات جديدة، جنبًا إلى جنب مع أرقام الإحصاءات الوصفية.

والدالة في R هي hist()، وهي سطر واحد.

أول مدرج تكراري لك بـ hist()

لنحاكِ أطوال 200 شخص موزعة توزيعًا طبيعيًا حول 170 سم بانحراف معياري 10 (راجع الأعداد العشوائية لمعرفة ما تفعله set.seed() وrnorm()):

set.seed(42)
heights <- rnorm(200, mean = 170, sd = 10)

hist(heights)

يختار R السلال بنفسه ويرسم كومة أعمدة على شكل جرس: أعمدة قصيرة قرب 145 سم، ترتفع خلال الستينيات، وتبلغ ذروتها حول 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" لقاعدة فريدمان-دياكونيس، التي تختار العرض من تشتت البيانات وحجم العينة وتتصرف جيدًا مع البيانات الملتوية.

مدرجات الكثافة والمنحنى الطبيعي

افتراضيًا تكون ارتفاعات الأعمدة أعدادًا (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 مكانها حين يحتاج المدرج إلى تقسيمات أو مجموعات أو سمة موحدة مع بقية أشكالك.

الخلاصة

  • يُظهر المدرج التكراري توزيع متغير عددي واحد: استدعِ 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 بنفسك.

في المستند التالي: مخطط الصندوق، وهو رسم التوزيع الذي يتألق فعلًا حين تقارن مجموعات جنبًا إلى جنب.

الأسئلة الشائعة

كيف تنشئ مدرجًا تكراريًا في R؟

استدعِ hist(x) على متجه عددي. يقسّم R مدى x إلى سلال ويرسم عمودًا لكل سلة، ويبيّن ارتفاع العمود عدد القيم الواقعة داخلها. أضف breaks = للتحكم في عدد السلال وcol = لتلوين الأعمدة.

ماذا يفعل الوسيط breaks في hist()؟

يتحكم في التقسيم إلى سلال. فالرقم المفرد مثل breaks = 30 اقتراح لعدد السلال (ويقرّبه R إلى حدود مرتبة)، والمتجه مثل breaks = seq(140, 200, by = 5) يحدد نقاط القطع بالضبط، وbreaks = "FD" يستخدم قاعدة فريدمان-دياكونيس.

كيف تراكب منحنى طبيعيًا على مدرج تكراري في R؟

ارسم المدرج على مقياس الكثافة عبر freq = FALSE، ثم أضف المنحنى بـ curve(dnorm(x, mean = mean(data), sd = sd(data)), add = TRUE). فعلى مقياس الترددات سيقبع المنحنى قرب الصفر بلا فائدة، لذا freq = FALSE ضرورية.

ما الفرق بين المدرج التكراري والمخطط الشريطي؟

يقسّم المدرج التكراري متغيرًا عدديًا واحدًا إلى سلال، فيكون المحور الأفقي مقياسًا متصلًا وتتلامس الأعمدة. أما المخطط الشريطي فيقارن فئات منفصلة، لذا تكون الأعمدة متباعدة. وفي R تُستخدم hist() للأعداد وbarplot() لأعداد الفئات.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن