EduLab / documentation /ANALYTICS_SYSTEM.md
rinogeek's picture
Initial deploy to Hugging Face
062d102
# 📊 Système d'Analytics & Tracking des Recherches
## Vue d'ensemble
Le système d'analytics d'EduConnect Africa collecte et analyse toutes les recherches effectuées sur la plateforme pour comprendre les intérêts et comportements des utilisateurs.
## Architecture
### Modèles de Données
#### SearchLog
Enregistre chaque recherche individuelle avec :
- **Utilisateur** : Qui a effectué la recherche (null si anonyme)
- **Catégorie** : Type de contenu recherché (QUESTIONS, MENTORS, OPPORTUNITIES, etc.)
- **Requête** : Terme de recherche saisi
- **Filtres** : Filtres appliqués (JSON flexible)
- **Résultats** : Nombre de résultats retournés
- **Métadonnées** : Session ID, IP, User Agent, URL
- **Interaction** : Résultat cliqué et sa position
#### PopularSearch
Vue matérialisée des recherches les plus populaires :
- Catégorie
- Requête
- Nombre de fois recherchée
- Dernière recherche
### API Endpoints
#### 1. Enregistrer une recherche
```http
POST /api/analytics/search-log/
Content-Type: application/json
{
"category": "QUESTIONS",
"search_query": "python django",
"filters_applied": {
"status": "unsolved",
"tags": ["python"]
},
"results_count": 15
}
Response: 201 Created
{
"id": 123,
"category": "QUESTIONS",
"search_query": "python django",
"filters_applied": {...},
"results_count": 15,
"created_at": "2024-12-04T23:00:00Z"
}
```
#### 2. Enregistrer un clic sur un résultat
```http
POST /api/analytics/result-click/
Content-Type: application/json
{
"search_log_id": 123,
"result_id": "456",
"position": 2
}
Response: 200 OK
{
"status": "success"
}
```
#### 3. Récupérer les recherches populaires
```http
GET /api/analytics/popular-searches/?category=QUESTIONS&limit=10
Response: 200 OK
[
{
"category": "QUESTIONS",
"search_query": "python",
"search_count": 245,
"last_searched": "2024-12-04T22:30:00Z"
},
...
]
```
#### 4. Récupérer les recherches tendances
```http
GET /api/analytics/trending-searches/?category=QUESTIONS&days=7&limit=10
Response: 200 OK
[
{
"search_query": "django rest framework",
"count": 45
},
...
]
```
## Utilisation Frontend
### Hook React : `useSearchTracking`
Le hook personnalisé facilite l'intégration du tracking dans les composants.
#### Exemple d'intégration dans Questions.tsx
```tsx
import { useSearchTracking } from '../hooks/useSearchTracking';
const Questions: React.FC = () => {
const [searchTerm, setSearchTerm] = useState('');
const [filter, setFilter] = useState<'all' | 'solved' | 'unsolved'>('all');
const [questions, setQuestions] = useState<Question[]>([]);
// Initialiser le tracking pour la catégorie QUESTIONS
const { trackSearch, trackClick } = useSearchTracking('QUESTIONS');
const fetchQuestions = async () => {
try {
const data = await forumService.getQuestions({
page: currentPage,
search: searchTerm,
filter: filter === 'all' ? undefined : filter
});
setQuestions(data.results);
// Tracker la recherche
await trackSearch(
searchTerm,
{ filter, page: currentPage },
data.count
);
} catch (error) {
console.error("Failed to fetch questions", error);
}
};
const handleQuestionClick = (questionId: string, position: number) => {
// Tracker le clic sur le résultat
trackClick(null, questionId, position);
// Naviguer vers la question
navigate(`/questions/${questionId}`);
};
return (
// ... JSX
);
};
```
### Service Direct
Si vous préférez utiliser le service directement :
```tsx
import { analyticsService } from '../services/analytics';
// Enregistrer une recherche
const logId = await analyticsService.logSearch({
category: 'MENTORS',
search_query: 'python expert',
filters_applied: { specialties: ['python', 'django'] },
results_count: 8
});
// Enregistrer un clic
await analyticsService.logResultClick({
search_log_id: logId.id,
result_id: 'mentor-123',
position: 0
});
// Récupérer les recherches populaires
const popular = await analyticsService.getPopularSearches('QUESTIONS', 10);
// Récupérer les tendances
const trending = await analyticsService.getTrendingSearches('MENTORS', 7, 10);
```
## Catégories de Recherche
| Catégorie | Description | Pages concernées |
|-----------|-------------|------------------|
| `QUESTIONS` | Questions du forum | `/questions` |
| `MENTORS` | Recherche de mentors | `/mentors` |
| `OPPORTUNITIES` | Bourses, stages, concours | `/opportunities` |
| `TOOLS` | Outils pédagogiques | `/tools` |
| `USERS` | Recherche d'utilisateurs | Divers |
| `GENERAL` | Recherche globale | Barre de recherche générale |
## Analyses Disponibles
### 1. Recherches Populaires
- Top 10/20/50 des recherches les plus fréquentes
- Par catégorie ou globalement
- Mise à jour en temps réel
### 2. Tendances
- Recherches en hausse sur les 7/14/30 derniers jours
- Détection de nouveaux sujets d'intérêt
- Comparaison temporelle
### 3. Taux de Clic (CTR)
- Pourcentage de recherches suivies d'un clic
- Position moyenne des clics
- Résultats les plus cliqués
### 4. Recherches Sans Résultats
- Identifier les lacunes de contenu
- Opportunités d'amélioration
- Suggestions de nouveaux contenus
## Exemples de Requêtes SQL Utiles
### Top 10 des recherches cette semaine
```sql
SELECT search_query, COUNT(*) as count
FROM search_logs
WHERE created_at >= NOW() - INTERVAL '7 days'
AND category = 'QUESTIONS'
GROUP BY search_query
ORDER BY count DESC
LIMIT 10;
```
### Recherches sans résultats
```sql
SELECT search_query, COUNT(*) as count
FROM search_logs
WHERE results_count = 0
AND created_at >= NOW() - INTERVAL '30 days'
GROUP BY search_query
ORDER BY count DESC
LIMIT 20;
```
### Taux de clic par catégorie
```sql
SELECT
category,
COUNT(*) as total_searches,
COUNT(clicked_result_id) as clicks,
ROUND(100.0 * COUNT(clicked_result_id) / COUNT(*), 2) as ctr_percentage
FROM search_logs
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY category
ORDER BY ctr_percentage DESC;
```
## Intégration Recommandée
### Pages à Tracker
1. **Questions** (`/questions`)
- Recherche par mots-clés
- Filtres : solved/unsolved, tags
2. **Mentors** (`/mentors`)
- Recherche par nom, spécialités
- Filtres : rating, disponibilité
3. **Opportunités** (`/opportunities`)
- Recherche par titre, provider
- Filtres : type, deadline, location
4. **Outils** (`/tools`)
- Recherche par nom d'outil
- Filtres : catégorie
### Bonnes Pratiques
1. **Debounce** : Attendre 300-500ms après la dernière frappe avant de tracker
2. **Minimum de caractères** : Ne tracker que si ≥ 2 caractères
3. **Anonymisation** : Respecter la vie privée (pas de données sensibles)
4. **Performance** : Tracker en arrière-plan (async, non-bloquant)
5. **Erreurs** : Ne jamais bloquer l'UX si le tracking échoue
## Dashboard Admin
Dans l'admin Django (`/admin/analytics/`), vous pouvez :
- Consulter tous les logs de recherche
- Filtrer par catégorie, date, utilisateur
- Voir les recherches populaires
- Exporter les données pour analyse externe
## Prochaines Étapes
1. **Dashboard Analytics** : Interface dédiée pour visualiser les tendances
2. **Suggestions Intelligentes** : Autocomplétion basée sur les recherches populaires
3. **A/B Testing** : Tester différentes interfaces de recherche
4. **Machine Learning** : Recommandations personnalisées basées sur l'historique
5. **Alertes** : Notification quand un nouveau sujet devient tendance
---
**Développé avec ❤️ par Marino ATOHOUN pour Hypee**