Scoring Services
Die Scoring-Services berechnen normalisierte Performance-Scores für Profile und Videos. Beide verwenden ein tier-normalisiertes System, das faire Vergleiche innerhalb von Größenklassen ermöglicht.
ProfileScoreCalculator
Location: app/Services/Scoring/ProfileScoreCalculator.php
Berechnet den Postbox Score (0-100) für Social Profiles. Der Score ist tier-normalisiert, sodass kleine Creator nicht gegen Mega-Channels konkurrieren müssen.
Public Methods
| Method | Parameter | Return | Beschreibung |
|---|---|---|---|
calculate() | SocialProfile $profile | array | Score berechnen und Komponenten zurückgeben |
determineTier() | int $followers | string | Follower-Tier bestimmen |
getDataPointsInfo() | SocialProfile $profile | array | Datenpunkt-Status (Anzahl, Status) |
Score-Komponenten
| Komponente | Gewicht | Messung |
|---|---|---|
| Growth | 40% | Follower-Wachstum relativ zum Tier-Durchschnitt |
| Momentum | 30% | Beschleunigung des Wachstums (2. Ableitung) |
| Consistency | 20% | Regelmäßigkeit des Wachstums (geringe Varianz) |
| Engagement | 10% | Plattform-spezifisch (Views/Subs bei YouTube, Likes/Follower bei Instagram) |
Tier-Definitionen
| Tier | Follower-Bereich | Normalisierung |
|---|---|---|
micro | < 10.000 | Innerhalb Micro verglichen |
small | 10.000 - 99.999 | Innerhalb Small verglichen |
medium | 100.000 - 499.999 | Innerhalb Medium verglichen |
large | 500.000 - 999.999 | Innerhalb Large verglichen |
mega | >= 1.000.000 | Innerhalb Mega verglichen |
Status-Lifecycle
Der Score durchläuft verschiedene Reifestufen basierend auf der Anzahl verfügbarer Datenpunkte:
| Status | Datenpunkte | Beschreibung |
|---|---|---|
no_data | 0 | Kein Datenpunkt vorhanden |
pending | 1-6 | Zu wenig Daten für verlässlichen Score |
preliminary | 7-9 | Vorläufiger Score, kann noch schwanken |
stable | >= 10 | Stabiler Score mit ausreichender Datenbasis |
Manual Penalty
Admins können über das Feld manual_penalty (0-100%) einen Score-Abzug verhängen:
$finalScore = $rawScore * (1 - $profile->manual_penalty / 100);
Ein Profil mit manual_penalty = 50 und einem Raw-Score von 80 erhält einen finalen Score von 40.
Berechnung im Detail
$result = [
'score' => 72, // Finaler Score (0-100)
'growth_score' => 80, // Growth-Komponente
'momentum_score' => 65, // Momentum-Komponente
'consistency_score' => 70, // Consistency-Komponente
'engagement_score' => 55, // Engagement-Komponente
'tier' => 'small', // Aktueller Tier
'status' => 'stable', // Reife-Status
'data_points' => 28, // Verfügbare Datenpunkte
'manual_penalty' => 0, // Admin-Penalty
];
Low-Priority-Profile
Für Low-Priority-Profile (unter dem Follower-Threshold, seltener gescrapt) werden angepasste Parameter verwendet:
| Parameter | Regulär | Low-Priority | Grund |
|---|---|---|---|
LOOKBACK_DAYS | 28 | 49 | 4 Wochen — bei 3-Tage-Rotation liefert dies ~9 Datenpunkte (über MIN_DATA_POINTS=7) |
MAX_DATA_GAP_DAYS | 5 | 8 | Toleranz für längere Lücken zwischen Scrapes |
Die Erkennung erfolgt automatisch über $profile->isLowPriorityProfile() beim Score-Berechnen.
Abhängigkeiten
SocialProfileModel,SocialProfileDailyMetricModel,SocialProfileExploreMetricsModel
Verwendet von
CalculateProfileScores-Command (täglich 05:00 UTC), Admin Social Profiles View, Explore Profile Cards
VideoScoreCalculator
Location: app/Services/Scoring/VideoScoreCalculator.php
Berechnet den Performance-Score (0-100) für einzelne YouTube-Videos. Berücksichtigt View-Performance, Engagement, Wachstumsdynamik und Aktualität.
Public Methods
| Method | Parameter | Return | Beschreibung |
|---|---|---|---|
calculate() | YouTubeVideo $video | array | Video-Score berechnen und Komponenten zurückgeben |
hasShortDuration() | YouTubeVideo $video | bool | Prüfen ob Video ein Short ist (< 62 Sekunden) |
Score-Komponenten
| Komponente | Gewicht | Messung |
|---|---|---|
| View Performance | 40% | Views relativ zum Channel-Durchschnitt und Tier |
| Engagement | 25% | Like-Rate, Comment-Rate relativ zu Views |
| Growth | 20% | View-Wachstumsrate in den letzten Tagen |
| Freshness | 15% | Alter des Videos (neuere Videos erhalten Bonus) |
Freshness-Berechnung
| Video-Alter | Freshness-Score |
|---|---|
| < 7 Tage | 100 |
| 7-14 Tage | 80 |
| 14-30 Tage | 60 |
| 30-90 Tage | 40 |
| 90-180 Tage | 20 |
| > 180 Tage | 10 |
Shorts-Erkennung
Videos mit einer Dauer unter 62 Sekunden werden als YouTube Shorts klassifiziert. Der Score-Algorithmus berücksichtigt dies bei der View-Performance-Berechnung, da Shorts typischerweise höhere View-Zahlen aber niedrigere Engagement-Raten haben.
Return-Struktur
$result = [
'score' => 68, // Finaler Score (0-100)
'view_score' => 75, // View-Performance
'engagement_score' => 60, // Engagement-Rate
'growth_score' => 70, // View-Wachstum
'freshness_score' => 80, // Aktualität
'is_short' => false, // Shorts-Flag
];
Abhängigkeiten
YouTubeVideoModel,YouTubeVideoStatModel,SocialProfileModel
Verwendet von
CalculateVideoScores-Command (täglich), Explore Trending Videos, Video-Detailansicht