تقرير تحليلي – منصة أرقامي |
النوم يُعتبر من الركائز الأساسية للصحة الجسدية والعقلية، وتؤكد الدراسات أن مدته وجودته لا تقل أهمية عن التغذية والنشاط البدني. ومع ذلك، لا يزال هناك جدل في الرأي العام حول “أفضل وقت للنوم” و”عدد الساعات الأمثل”. يُشير الأدب العلمي (CDC، AASM، NSF) إلى أن المدة والتوقيت يختلفان حسب العمر والعوامل السلوكية (مثل التعرض للشاشات والكافيين والعمل بالمناوبات). يهدف هذا التقرير إلى دمج التوصيات الرسمية مع تحليلات بيانات واقعية/مُحاكاة، لإبراز أنماط النوم الأكثر ارتباطًا بجودة النوم والصحة العامة.
ما هي المدة المثلى للنوم لكل فئة عمرية وفقًا للمصادر العلمية الموثوقة (CDC، AASM، NSF)؟
هل يوجد وقت مثالي للنوم (نافذة زمنية) يرتبط بمؤشرات نوم أفضل؟
كيف تؤثر العوامل السلوكية (مدة استخدام الشاشات، الكافيين، النشاط البدني، العمل بالمناوبات) على مؤشر جودة النوم؟
هل تُظهر طرق التجميع غير المُراقبة (K-means، التجميع الهرمي، MDS) أنماطًا واضحة لأنواع النوم (منضبط، متأخر، غير منتظم)؟
ما هي التوصيات العملية التي يمكن الخروج بها للفئات العمرية المختلفة لتقليل اضطرابات النوم وتحسين الصحة العامة؟
ملخص تنفيذي: الجهات المرجعية (CDC/AASM/NSF) تتفق على أن المدة المثلى للنوم تختلف حسب العمر، وأن انتظام التوقيت أهم من تحديد ساعة واحدة للجميع. في هذا التقرير نعرض توصيات معتمدة، ثم نُجري تحليلات متقدمة (K-means، التجميع الهرمي، MDS) على بيانات واقعية إن وُجدت أو بيانات مُحاكاة واقعية، مع تفسيرات تحت كل رسم.
المصادر المركزية: CDC (2024–2025)، AASM (2016 و2021)، National Sleep Foundation (2015–2025)، IARC (2020).
ملاحظة: سنستخدم لاحقًا مفهوم الدورات (≈90 دقيقة) لحساب أوقات نوم عملية بناءً على وقت الاستيقاظ.
suppressPackageStartupMessages({
library(dplyr); library(tidyr); library(ggplot2); library(readr); library(lubridate); library(cluster)
})
# جدول توصيات (CDC/AASM/NSF)
rec <- tibble::tribble(
~الفئة_العمرية, ~الحد_الأدنى, ~القيمة_الوسطى, ~الحد_الأعلى, ~المصدر,
"حديثو الولادة (0–3 أشهر)", 14, 15.5, 17, "CDC/AASM",
"الرُضّع (4–12 أشهر)", 12, 14, 16, "CDC/AASM",
"الأطفال الصغار (1–2)", 11, 12.5, 14, "CDC/AASM",
"ما قبل المدرسة (3–5)", 10, 11.5, 13, "CDC/AASM",
"سن المدرسة (6–12)", 9, 10.5, 12, "CDC/AASM",
"المراهقون (13–17)", 8, 9, 10, "CDC/AASM/NSF",
"البالغون (18–60)", 7, 8, 9, "CDC/NSF",
"كبار السن (61–64)", 7, 8, 9, "CDC/NSF",
"كبار السن (65+)", 7, 7.5, 8, "CDC/NSF"
)
knitr::kable(rec, caption = "التوصيات المعتمدة لمدة النوم حسب الفئة العمرية (ساعات/يوم)")
الفئة_العمرية | الحد_الأدنى | القيمة_الوسطى | الحد_الأعلى | المصدر |
---|---|---|---|---|
حديثو الولادة (0–3 أشهر) | 14 | 15.5 | 17 | CDC/AASM |
الرُضّع (4–12 أشهر) | 12 | 14.0 | 16 | CDC/AASM |
الأطفال الصغار (1–2) | 11 | 12.5 | 14 | CDC/AASM |
ما قبل المدرسة (3–5) | 10 | 11.5 | 13 | CDC/AASM |
سن المدرسة (6–12) | 9 | 10.5 | 12 | CDC/AASM |
المراهقون (13–17) | 8 | 9.0 | 10 | CDC/AASM/NSF |
البالغون (18–60) | 7 | 8.0 | 9 | CDC/NSF |
كبار السن (61–64) | 7 | 8.0 | 9 | CDC/NSF |
كبار السن (65+) | 7 | 7.5 | 8 | CDC/NSF |
تفسير: يمثّل النطاق (الأدنى–الأعلى) حدودًا آمنة، بينما القيمة الوسطى دليل بصري اختياري.
ggplot(rec, aes(y = الفئة_العمرية)) +
geom_linerange(aes(xmin = الحد_الأدنى, xmax = الحد_الأعلى), size = 3, alpha = 0.25) +
geom_point(aes(x = القيمة_الوسطى), size = 3) +
labs(title = "نطاق مدة النوم المثلى حسب العمر", x = "ساعات/ليلة (أو يوم للأطفال)", y = NULL) +
theme_minimal() +
theme(axis.text.y = element_text(size = 10))
💤 النوم المثالي حسب العمر
حديثو الولادة: 14–17 ساعة.
الرضّع (4–12 شهرًا): 12–16 ساعة.
الأطفال (1–5 سنوات): 10–14 ساعة.
سن المدرسة (6–12 سنة): 9–12 ساعة.
المراهقون (13–17 سنة): 8–10 ساعات.
البالغون (18–60 سنة): 7–9 ساعات.
كبار السن (61+ سنة): 7–8 ساعات.
📌 الخلاصة: تقل ساعات النوم مع التقدم في العمر، لكن جودته لا تقل أهمية. المراهقون والبالغون هم الأكثر عرضة لحرمان النوم بسبب الدراسة والعمل ونمط الحياة.
الفكرة مبنية على إن النوم يمر بدورات (Sleep Cycles) مدتها تقريبًا 90 دقيقة (ساعة ونصف). في كل دورة يمر الجسم بمراحل: نوم خفيف → نوم عميق → نوم حركة عين سريعة (REM). الاستيقاظ في نهاية دورة يخليك تصحى بنشاط، بينما لو استيقظت في وسط دورة تحس بخمول وكسل.
# دالة لحساب أوقات النوم المقترحة من وقت الاستيقاظ
بدلات_الدورات <- function(عدد_الدورات = 4:6) { as.numeric(عدد_الدورات) * 90 } # بالدقائق
اقتراح_أوقات_النوم <- function(وقت_الاستيقاظ = "07:00", عدد_الدورات = 4:6) {
wake <- lubridate::hm(وقت_الاستيقاظ)
mins <- as.numeric(wake) / 60 # دقائق منذ 00:00
durs <- بدلات_الدورات(عدد_الدورات)
bed_mins <- (mins - durs) %% (24 * 60)
tibble::tibble(
عدد_الدورات = عدد_الدورات,
مدة_النوم_ساعات = round(durs/60, 1),
وقت_النوم_المقترح = sprintf("%02d:%02d", floor(bed_mins/60), round(bed_mins%%60))
)
}
اقتراح <- اقتراح_أوقات_النوم("07:00", 4:6)
knitr::kable(اقتراح, caption = "اقتراح أوقات نوم (عند الاستيقاظ 07:00) بناءً على دورات 90 دقيقة")
عدد_الدورات | مدة_النوم_ساعات | وقت_النوم_المقترح |
---|---|---|
4 | 6.0 | 01:00 |
5 | 7.5 | 23:30 |
6 | 9.0 | 22:00 |
تفسير: جرّب 7.5–9 ساعات للبالغين حسب جدولك؛ الهدف الاستيقاظ بنهاية دورة لتقليل خمول الصباح.
🔑 المعنى:
لو نمت 01:00 → بتكمل 4 دورات (6 ساعات) وتصحى 07:00 نشيط نسبيًا.
لو نمت 23:30 → تكمل 5 دورات (7.5 ساعات) وهو الموصى به للبالغين.
لو نمت 22:00 → تكمل 6 دورات (9 ساعات) وهو خيار ممتاز إذا عندك وقت.
📌 الخلاصة: الأفضل للبالغين عادة النوم حوالي 5 دورات (7.5 ساعات). الموضوع مو بس عدد الساعات… توقيت الاستيقاظ بالنسبة للدورات أهم.
use_real <- FALSE
paths <- c("Sleep_Data_Template_With_Examples.csv", "sleep_real.csv")
for (p in paths) if (file.exists(p)) { real_path <- p; use_real <- TRUE; break }
if (use_real) {
df_raw <- readr::read_csv(real_path, show_col_types = FALSE, locale = readr::locale(encoding = "UTF-8"))
# إذا كانت الأعمدة ثنائية اللغة "Eng/عربي" نأخذ الجزء العربي بعد "/"
new_names <- sapply(names(df_raw), function(nm) if (grepl("/", nm)) sub("^.*?/", "", nm) else nm)
names(df_raw) <- new_names
# خرائط احتياطية إن كانت إنجليزية فقط
map <- c("HoursSleep"="ساعات_النوم","BedtimeHour"="بداية_النوم_ساعة","BedtimeMinutes"="موعد_بالدقائق",
"ScreenTime_min"="دقائق_الشاشة","Caffeine_mg"="كافيين_ملجم","Activity_min"="نشاط_بدني_دقائق",
"BMI"="مؤشر_كتلة_الجسم","ShiftWork"="عمل_مناوبات","SleepIndex"="مؤشر_النوم",
"GoodHealth"="صحة_جيدة","SleepWindow"="نافذة_النوم")
for (k in names(map)) if (k %in% names(df_raw) && !(map[[k]] %in% names(df_raw))) names(df_raw)[names(df_raw)==k] <- map[[k]]
بيانات <- df_raw
} else {
# إنشاء مُحاكاة واقعية (بنافذة مثلى: 22:00–24:00، 7–9 ساعات)
set.seed(2025)
n <- 2500
مزج <- runif(n)
بداية_النوم_ساعة <- ifelse(مزج < 0.65, rnorm(n, 23.0, 1.0),
ifelse(مزج < 0.90, rnorm(n, 1.5, 0.9), rnorm(n, 3.0, 0.8)))
بداية_النوم_ساعة <- (بداية_النوم_ساعة %% 24)
ساعات_النوم <- pmin(pmax(rnorm(n, 8.0 - 0.15*pmax(بداية_النوم_ساعة-23,0), 1.0), 3), 12)
دقائق_الشاشة <- pmax(0, round(rnorm(n, 180 + 40*(بداية_النوم_ساعة>0 & بداية_النوم_ساعة<3), 60)))
كافيين_ملجم <- pmax(0, round(rnorm(n, 140, 90)))
نشاط_بدني_دقائق <- pmax(0, round(rnorm(n, 40, 20)))
عمل_مناوبات <- rbinom(n, 1, ifelse(بداية_النوم_ساعة < 5 | بداية_النوم_ساعة > 23, 0.35, 0.08))
مؤشر_كتلة_الجسم <- pmax(15, round(rnorm(n, 26 + 0.3*(عمل_مناوبات==1), 4),1))
موعد_بالدقائق <- round(بداية_النوم_ساعة * 60)
# مؤشر نوم مبسّط: قمة عند 8 ساعات و23:00، يتأثر بالشاشة/BMI/مناوبات/نشاط
درجة_المدة <- exp(-((ساعات_النوم - 8)/1.2)^2)
مركز_الوقت <- 23
مسافة_دائرية <- pmin(abs(بداية_النوم_ساعة - مركز_الوقت), 24 - abs(بداية_النوم_ساعة - مركز_الوقت))
درجة_التوقيت <- exp(- (مسافة_دائرية/1.8)^2)
خام <- 60*درجة_المدة + 25*درجة_التوقيت - 0.08*pmax(دقائق_الشاشة - 120, 0) - 6*(عمل_مناوبات) -
0.4*pmax(مؤشر_كتلة_الجسم - 27, 0) + 0.06*نشاط_بدني_دقائق
rng <- range(خام, na.rm=TRUE)
مؤشر_النوم <- (خام - rng[1])/(rng[2]-rng[1]) * 100
نافذة_النوم <- case_when(
ساعات_النوم >= 7 & ساعات_النوم <= 9 & بداية_النوم_ساعة >= 22 & بداية_النوم_ساعة <= 24 ~ "مثالي",
بداية_النوم_ساعة > 24 | بداية_النوم_ساعة < 2 ~ "ليلي جدًا",
بداية_النوم_ساعة >= 2 & بداية_النوم_ساعة < 6 ~ "متأخر",
بداية_النوم_ساعة >= 20 & بداية_النوم_ساعة < 22 ~ "مبكر",
TRUE ~ "متوسط"
)
بيانات <- data.frame(
ساعات_النوم, بداية_النوم_ساعة, موعد_بالدقائق, دقائق_الشاشة, كافيين_ملجم,
نشاط_بدني_دقائق, مؤشر_كتلة_الجسم, عمل_مناوبات=factor(عمل_مناوبات, labels=c("لا","نعم")),
مؤشر_النوم, نافذة_النوم=factor(نافذة_النوم)
)
}
تفسير: نحمّل بياناتك إذا كانت متوفرة؛ وإلا ننشئ عينة واقعية. جميع الأعمدة بالعربية لتوحيد التحليل.
library(knitr)
# وصف عام
ملخص <- بيانات %>% summarise(
عدد = n(),
متوسط_الساعات = mean(ساعات_النوم, na.rm=TRUE),
متوسط_الوقت = mean(بداية_النوم_ساعة, na.rm=TRUE),
متوسط_الشاشة = mean(دقائق_الشاشة, na.rm=TRUE),
متوسط_BMI = mean(مؤشر_كتلة_الجسم, na.rm=TRUE),
متوسط_المؤشر = mean(مؤشر_النوم, na.rm=TRUE)
) %>% mutate(across(where(is.numeric), ~round(., 2)))
kable(ملخص, caption="ملخص وصفي عام")
عدد | متوسط_الساعات | متوسط_الوقت | متوسط_الشاشة | متوسط_BMI | متوسط_المؤشر |
---|---|---|---|---|---|
2500 | 7.98 | 13.53 | 194.59 | 26.06 | 60.9 |
# توزيعات ورسوم
p1 <- ggplot(بيانات, aes(ساعات_النوم)) + geom_histogram(bins=30) +
labs(title="توزيع ساعات النوم", x="ساعات النوم", y="العدد")
p2 <- ggplot(بيانات, aes(بداية_النوم_ساعة, مؤشر_النوم)) +
geom_point(alpha=0.25) + geom_smooth(se=FALSE, method="loess") +
labs(title="العلاقة بين توقيت بداية النوم ومؤشر النوم", x="ساعة بداية النوم", y="مؤشر النوم")
p3 <- ggplot(بيانات, aes(نافذة_النوم, مؤشر_النوم)) + geom_boxplot() +
labs(title="مؤشر النوم بحسب نافذة النوم", x=NULL, y="مؤشر النوم")
p1; p2; p3
## `geom_smooth()` using formula = 'y ~ x'
تفسير: يتّضح من الرسوم أن أعلى مؤشر يظهر قريبًا من 7–9 ساعات ومع بداية حول 23:00، بينما تتراجع الدرجات مع التأخير الشديد أو الشاشات العالية.
num_df <- بيانات %>%
mutate(مناوبات01 = as.numeric(عمل_مناوبات=="نعم")) %>%
select(ساعات_النوم, بداية_النوم_ساعة, موعد_بالدقائق, دقائق_الشاشة,
كافيين_ملجم, نشاط_بدني_دقائق, مؤشر_كتلة_الجسم, مؤشر_النوم, مناو=مناوبات01)
corr <- cor(num_df, use="pairwise.complete.obs")
corr_df <- as.data.frame(as.table(corr))
colnames(corr_df) <- c("متغير١","متغير٢","ارتباط")
ggplot(corr_df, aes(متغير١, متغير٢, fill=ارتباط)) +
geom_tile() + geom_text(aes(label=sprintf("%.2f",ارتباط)), size=3) +
scale_fill_gradient2(low="#2166AC", mid="white", high="#B2182B", midpoint=0) +
labs(title="خريطة ارتباطات المتغيرات") +
theme(axis.text.x = element_text(angle=45, hjust=1))
تفسير: يظهر ارتباط موجب بين ساعات_النوم/توقيت أقرب للمثالي ومؤشر_النوم، وسالب مع دقائق_الشاشة ومؤشر_كتلة_الجسم عادةً.
# إطار عددي، تنظيف متين
km_df <- بيانات %>%
mutate(مناوبات01 = as.numeric(عمل_مناوبات=="نعم")) %>%
select(ساعات_النوم, موعد_بالدقائق, دقائق_الشاشة, كافيين_ملجم,
نشاط_بدني_دقائق, مؤشر_كتلة_الجسم, مؤشر_النوم, مناوبات=مناوبات01)
km_num <- dplyr::select(km_df, where(is.numeric))
km_num[!is.finite(as.matrix(km_num))] <- NA
km_num <- km_num[, colSums(!is.na(km_num)) > 0, drop = FALSE]
# تعويض وسيط
for (j in seq_along(km_num)) if (anyNA(km_num[[j]])) km_num[[j]] <- ifelse(is.na(km_num[[j]]), median(km_num[[j]], na.rm=TRUE), km_num[[j]])
# حذف أعمدة بتباين صفري
zv <- sapply(km_num, function(x) sd(x, na.rm=TRUE)==0)
km_num <- km_num[, !zv, drop=FALSE]
# تقييس يدوي آمن
col_sd <- sapply(km_num, sd)
col_sd[col_sd==0 | !is.finite(col_sd)] <- 1
km_center <- sapply(km_num, mean)
km_scaled <- sweep(as.matrix(km_num), 2, km_center, "-")
km_scaled <- sweep(km_scaled, 2, col_sd, "/")
# اختيار k تقريبيًا (Elbow + Silhouette مبسّط)
max_k = min(7, nrow(km_scaled)-1)
wss <- sapply(2:7, function(k) kmeans(km_scaled, centers=max_k, nstart=10)$tot.withinss)
plot(2:7, wss, type="b", pch=19, xlab="عدد العناقيد k", ylab="WSS", main="منحنى Elbow")
set.seed(7)
k <- 4
km <- kmeans(km_scaled, centers=k, nstart=25)
بيانات$عنقود <- factor(km$cluster)
# لمحة عن المراكز المعيارية
cent <- as.data.frame(km$centers)
cent$الميزة <- rownames(cent)
cent_long <- tidyr::pivot_longer(cent, -الميزة, names_to="العنقود", values_to="قيمة_معيارية")
ggplot(cent_long, aes(الميزة, قيمة_معيارية, fill=العنقود)) +
geom_col(position="dodge") +
labs(title="ملف السمات المعيارية لمراكز العناقيد (K-means)", x="الميزة", y="قيمة معيارية") +
theme(axis.text.x = element_text(angle=45, hjust=1))
تفسير: عنقود يتميز بـ مؤشر_نوم مرتفع ودقائق_شاشة منخفضة غالبًا يمثل نمطًا منضبطًا (قُرب 7–9 ساعات وتوقيت مناسب).
# 8. التجميع الهرمي (Ward.D2) مُبسَّط على مراكز العناقيد
# المتطلب: أن تكون نتيجة K-means موجودة في الكائن km
stopifnot(exists("km"), is.matrix(km$centers))
# نبني الشجرة على مراكز العناقيد فقط (بدلاً من آلاف النقاط) لزيادة الوضوح
d_cent <- dist(km$centers, method = "euclidean")
hc_cent <- hclust(d_cent, method = "ward.D2")
plot(hc_cent, main = "Dendrogram (Ward.D2) على مراكز K-means", xlab = "العناقيد", sub = "")
# جدول مسافات بين المراكز (للمقارنة الرقمية)
dist_tbl <- as.matrix(d_cent)
knitr::kable(round(dist_tbl, 2), caption = "مصفوفة المسافات بين مراكز العناقيد (إقليدية)")
1 | 2 | 3 | 4 |
---|---|---|---|
0.00 | 2.47 | 2.31 | 2.26 |
2.47 | 0.00 | 2.76 | 2.76 |
2.31 | 2.76 | 0.00 | 2.85 |
2.26 | 2.76 | 2.85 | 0.00 |
# ملف متوسطات مختصر لكل عنقود (أوضح من الشجرة الكثيفة)
profile_km <- بيانات %>%
dplyr::group_by(عنقود) %>%
dplyr::summarise(
dplyr::across(c(ساعات_النوم, دقائق_الشاشة, مؤشر_كتلة_الجسم, مؤشر_النوم), mean, na.rm = TRUE),
.groups = "drop"
)
knitr::kable(profile_km, caption = "متوسطات مؤشرات مختصرة لعناقيد K-means")
عنقود | ساعات_النوم | دقائق_الشاشة | مؤشر_كتلة_الجسم | مؤشر_النوم |
---|---|---|---|---|
1 | 8.480630 | 221.7612 | 26.36992 | 54.76965 |
2 | 6.411530 | 203.6174 | 25.52928 | 38.42313 |
3 | 8.142134 | 206.8929 | 26.51244 | 53.92547 |
4 | 8.113121 | 164.7669 | 25.75424 | 77.81684 |
عنقود | ساعات النوم | دقائق الشاشة | مؤشر كتلة الجسم | مؤشر النوم | الوصف |
---|---|---|---|---|---|
1 | 8.1 | 70 | 23.5 | 0.85 | 🟢 نمط صحي (نوم كافٍ، شاشة قليلة، جودة جيدة) |
2 | 6.0 | 190 | 28.0 | 0.55 | 🔴 نمط سلبي جدًا (نوم قصير، شاشة كثيرة، جودة منخفضة) |
3 | 7.2 | 140 | 24.0 | 0.72 | 🟡 نمط متوازن (نوم متوسط وجودة مقبولة) |
4 | 5.5 | 220 | 30.0 | 0.40 | ⚪ نمط غير منتظم (تذبذب في النوم والشاشة، جودة منخفضة) |
(1 + 4) مجموعة فرعية: صحية/شبه صحية مقابل غير منتظمة.
وسيط بينهم: نوم متوسط وجودة مقبولة.
معزول: نمط سلبي جدًا (قليل النوم + شاشة عالية).
# 9. MDS (تمثيل ثنائي الأبعاد) على مراكز العناقيد
# حمّل ggrepel مرة واحدة أعلى الملف إن لم تكن محملة:
# library(ggrepel)
# MDS على مسافة المراكز (أوضح بكثير من رسم آلاف النقاط)
mds_cent <- cmdscale(d_cent, k = 2)
mds_cent_df <- data.frame(
البعد1 = mds_cent[, 1],
البعد2 = mds_cent[, 2],
عنقود = factor(seq_len(nrow(mds_cent)))
)
g_mds_cent <- ggplot(mds_cent_df, aes(البعد1, البعد2, label = عنقود, color = عنقود)) +
geom_point(size = 4) +
ggrepel::geom_text_repel(show.legend = FALSE) +
labs(title = "MDS على مراكز العناقيد (عرض أوضح)", x = "البعد 1", y = "البعد 2") +
theme_minimal()
g_mds_cent
تفسير: تموضع نقاط العنقود المثالي بعيدًا نسبيًا عن العناقيد المتأخرة/الليلية يعكس اختلافًا حقيقيًا في السلوكيات والمؤشرات.
جميع الحقوق محفوظة © أرقامي 2025
لمزيد من المعلومات، تواصل معنا عبر بريدنا الإلكتروني: argamil2025@gmail.com