fjt — Metodoloji: Yaş ve Kazanılan/Kaybedilen Zaman Nasıl Hesaplanır
Bu belge, fjt uygulamasındaki "kazanılan / kaybedilen zaman" sisteminin tam tanımıdır.
Tüm katsayılar src/lib/scoring-config.ts dosyasında, tüm hesaplama mantığı
src/lib/scoring-core.ts (saf çekirdek) ve src/lib/scoring.ts (okuma/yazma,
toplam, VO2max) dosyalarındadır. Uygulamada bu dosyalar dışında hiçbir yerde
zaman/puan sabiti kullanılmaz.
1. Genel model
Her sağlık aksiyonu time_ledger tablosuna bir satır olarak yazılır:
| Alan | Açıklama |
|---|---|
id | Satır kimliği |
user_id | Kullanıcı |
created_at | Kayıt zamanı |
source | meal_photo, steps, checkin, sleep, workout, heart_rate, manual |
delta_minutes | Kazanılan (+) veya kaybedilen (−) dakika |
details | Hesaplama ayrıntıları (ölçüm, birim, yoğunluk, tahmin rozeti vb.) |
is_simulated | Simülasyon verisi mi (true ise kullanıcı toplamlarına karışmaz) |
- Pozitif değer = kazanılan zaman, negatif = kaybedilen zaman.
- Gün sınırları kullanıcının seçtiği şehrin saat dilimine göre hesaplanır
(
resolveTimeZone/dayKeyInTz); telefon saat dilimi yalnızca hiç kayıtlı saat dilimi yoksa kullanılır. - Eski "yıl cinsinden yaş etkisi" gösterimi dakikaya
MINUTES_PER_YEAR = 365,25 × 24 × 60sabitiyle çevrilir.
2. Kaynak katsayıları (scoring-config.ts)
Her kaynak için birim başına dakika ve günlük üst sınır (mutlak değer, hem kazanç hem kayıp için uygulanır):
| Kaynak | Birim | dk / birim | Günlük sınır (dk) | Açıklama |
|---|---|---|---|---|
meal_photo | beslenme kalite puanı (−5…+5) | 12 | 180 | Öğün fotoğrafının beslenme kalitesi; işlenmiş/şekerli öğünler kaybettirir |
steps | 1.000 adım | 9 | 240 | Her 1.000 adım kazanılan zamana eklenir |
checkin | ortalama cevap puanı (−2…+2) | 18 | 150 | Günlük/haftalık check-in cevaplarının ortalaması (WHO-5 tabanlı) |
sleep | ideal uykuya göre sapma (saat) | 36 | 200 | Çok az veya çok fazla uyku kaybettirir |
workout | antrenman dakikası (yoğunluk ölçekli) | 4,5 | 320 | Süre × yoğunluk çarpanı |
heart_rate | referans dinlenme nabzından sapma (atım) | 5 | 160 | Dinlenme nabzının referansa göre durumu |
manual | dakika | 1 | 300 | Elle eklenen aktivite/düzeltme (ör. sigara kaybı) |
2.1 Ölçüm → birim dönüşümü (scoring-core.ts)
Ham ölçüm önce birime çevrilir, sonra birim × dk/birim hesaplanır ve günlük
sınıra kırpılır: delta = clamp(yuvarla(birim × dk), −sınır, +sınır).
| Kaynak | Birim formülü | Sabitler |
|---|---|---|
steps | adım / 1000 | stepsPerUnit = 1000 |
checkin | puan − 3 | checkinNeutral = 3 (1–5 ölçeğinin ortası) |
sleep | −|uyku_saati − 7,5| + 0,5 | idealSleepHours = 7,5; idealin ±0,5 saati içi nötr/pozitif |
heart_rate | 62 − dinlenme_nabzı | referenceRestingHr = 62 atım/dk |
workout | dakika × yoğunluk | yoğunluk: düşük 0,7 · orta 1,0 · yüksek 1,4 |
meal_photo / manual | ölçüm doğrudan birim | — |
3. VO2max — NTNU / HUNT non-exercise modeli
Kaynak: Nes BM ve ark., "Estimating V̇O2peak from a nonexercise prediction model: the HUNT Study, Norway", Medicine & Science in Sports & Exercise, 2011. fjt, modele dinlenme nabzı ve aktivite indeksi terimleri eklenmiş uyarlamayı kullanır.
VO2max = intercept(sex)
+ (−0,296) × yaş
+ (−0,552) × BMI
+ (−0,135) × dinlenme nabzı
+ 0,869 × aktivite indeksi
intercept: erkek 100,27 · kadın 88,72- Aktivite indeksi (0–5):
sedentary=0, light=1,5, moderate=3, active=4, athlete=5; antrenman sıklığı biliniyorsa doğrudan o değer (0–5'e kırpılır) kullanılır.
Nabızlı / nabızsız mod farkı
- Nabız verisi varsa (Apple Watch / Health dinlenme nabzı): formül gerçek
dinlenme nabzıyla çalışır,
estimated: false. - Nabız verisi yoksa: dinlenme nabzı yaş, cinsiyet ve aktivite seviyesinden
tahmin edilir ve sonuç
estimated: truerozetiyle işaretlenir:
tahmini nabız = yuvarla( taban(sex) + 0,18 × yaş + (−3,5) × aktivite indeksi )
taban: erkek 58 · kadın 60
Ayrıca nabız verisi olan kullanıcılar heart_rate kaynağından günlük dakika
kazanır/kaybeder; cihazı olmayan kullanıcılar bu katkıyı alamaz.
4. Diğer kaynaklar
- WHO-5 Well-Being Index: günlük "hissedilen yaş / canlılık" check-in'lerinin
temel ölçeği (1–5 cevap puanı →
checkinkaynağı). - Uyku: ideal süre 7,5 saat referansı yaygın uyku süresi kılavuzlarına dayanır (National Sleep Foundation yetişkin aralığı 7–9 saat).
- Adım: 1.000 adım başına sabit kazanç; günlük 240 dk üst sınırı aşırı tek-gün katkısını sınırlar.
5. Gösterim (formatDuration)
formatDuration(minutes, { lang, signed }) dakikayı okunur süreye çevirir:
|dk| ≥ 1440→ gün,≥ 60→ saat, altı → dakika- Negatifler "−" ile döner;
signed: truepozitiflere "+" ekler - Diller: tr, de, en (varsayılan), es, fr — ondalık ayıracı en dışında virgül
Örnek: formatDuration(2983, {lang:"tr"}) → "2,1 gün", formatDuration(−90) → "−1,5 saat".
6. Simülasyon hesapları — 1 haftalık sonuç tablosu
Beş test hesabı (is_simulated = true, analitiklerden hariç) için deterministik
(sabit tohumlu) 7 günlük veri üretilir: src/lib/sim-seed.ts. Aşağıdaki tablo
23 Eylül 2026'da biten hafta için üretilen gerçek çıktıdır (değerler dakika):
| Hesap | 17.09 | 18.09 | 19.09* | 20.09* | 21.09 | 22.09 | 23.09 | Hafta | Hafta içi | Hafta sonu |
|---|---|---|---|---|---|---|---|---|---|---|
| Sim 1 — 25y kadın, aktif, Watch | +250 | +555 | +612 | +269 | +593 | +233 | +471 | +2.983 (≈2,1 gün) | +2.102 | +881 |
| Sim 2 — 34y erkek, masa başı | +43 | +46 | +63 | +156 | +39 | +59 | +133 | +539 (≈9,0 saat) | +320 | +219 |
| Sim 3 — 45y erkek, sigara, düzensiz uyku | −289 | −141 | −211 | −326 | −159 | −262 | −262 | −1.650 (≈−1,1 gün) | −1.113 | −537 |
| Sim 4 — 58y kadın, orta aktif, Watch | +300 | +333 | +151 | +260 | +259 | +131 | +277 | +1.711 (≈1,2 gün) | +1.300 | +411 |
| Sim 5 — 67y erkek, düşük aktivite, check-in atlıyor | −8 | +93 | +29 | −11 | +15 | +85 | +6 | +209 (≈3,5 saat) | +191 | +18 |
* 19–20 Eylül hafta sonu. Sigara kaybı manual kaynağından günlük
−min(300, adet × 11) dakika olarak düşülür (Sim 3).
Nabızlı / nabızsız VO2max karşılaştırması
| Hesap | Gerçek nabız | Tahmini nabız | VO2max (nabızlı) | VO2max (nabızsız) | Fark | Nabız katkısı (hafta) |
|---|---|---|---|---|---|---|
| Sim 1 — 25y kadın, aktif | 54 | 51 | 65,8 | 66,2 | −0,4 | +280 dk |
| Sim 2 — 34y erkek, masa başı | — | 59 | — | 69,2 | — | 0 |
| Sim 3 — 45y erkek, sigara | — | 66 | — | 61,6 | — | 0 |
| Sim 4 — 58y kadın, orta aktif | 64 | 60 | 51,6 | 52,1 | −0,5 | −60 dk |
| Sim 5 — 67y erkek, düşük aktivite | — | 70 | — | 56,4 | — | 0 |
Yorum: gerçek nabızla hesaplanan VO2max tahmine çok yakın (fark ≤ 0,5), bu da tahmin modelinin tutarlılığını doğrular. Nabız katkısı Sim 1'de haftalık +280 dk (düşük dinlenme nabzı ödüllendiriliyor), Sim 4'te −60 dk (nabız 62 referansının üzerinde) — cihazı olan kullanıcılar bu ek hassasiyet ve katkıyı alır.