décembre 21, 2025
20 min de lecture

Questions d'entretien pour Analyste de Données Senior : Guide Complet

interview
career-advice
job-search
Questions d'entretien pour Analyste de Données Senior : Guide Complet
MB

Milad Bonakdar

Auteur

Maîtrisez l'analyse de données avancée avec des questions d'entretien essentielles couvrant le SQL avancé, l'analyse statistique, la modélisation des données, les processus ETL, la conception de tableaux de bord et la gestion des parties prenantes pour les analystes de données senior.


Introduction

On attend des analystes de données seniors qu'ils mènent des projets analytiques complexes, conçoivent des solutions de données robustes, optimisent les processus métier et communiquent des informations qui guident les décisions stratégiques. Ce rôle exige une expertise en SQL avancé, en analyse statistique, en modélisation de données, en processus ETL et en gestion des parties prenantes.

Ce guide complet couvre les questions d'entretien essentielles pour les analystes de données seniors, allant des techniques SQL avancées à l'analyse statistique, en passant par la modélisation des données, les processus ETL, l'optimisation des tableaux de bord et la stratégie commerciale. Chaque question comprend des réponses détaillées, une évaluation de la rareté et des niveaux de difficulté.


SQL Avancé (6 Questions)

1. Expliquez les fonctions de fenêtrage et donnez des exemples.

Réponse: Les fonctions de fenêtrage effectuent des calculs sur un ensemble de lignes liées à la ligne actuelle sans réduire le résultat.

  • Fonctions de fenêtrage courantes :
    • ROW_NUMBER() : Numéro séquentiel unique
    • RANK() : Rang avec des écarts pour les égalités
    • DENSE_RANK() : Rang sans écarts
    • LAG/LEAD() : Accès à la ligne précédente/suivante
    • SUM/AVG/COUNT() OVER() : Totaux/moyennes cumulés
-- ROW_NUMBER : Attribuer des numéros uniques
SELECT 
    employee_id,
    first_name,
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;

-- RANK : Classer les employés par salaire au sein de chaque département
SELECT 
    department,
    employee_id,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

-- LAG : Comparer avec la ligne précédente
SELECT 
    year,
    revenue,
    LAG(revenue) OVER (ORDER BY year) AS prev_year_revenue,
    revenue - LAG(revenue) OVER (ORDER BY year) AS revenue_change
FROM annual_sales;

-- Total cumulé
SELECT 
    order_date,
    amount,
    SUM(amount) OVER (ORDER BY order_date) AS running_total
FROM orders;

-- Moyenne mobile (3 derniers mois)
SELECT 
    month,
    sales,
    AVG(sales) OVER (
        ORDER BY month 
        ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
    ) AS moving_avg_3m
FROM monthly_sales;

Rareté : Très courant Difficulté : Difficile


2. Comment optimiser les requêtes SQL lentes ?

Réponse : L'optimisation des requêtes améliore les performances et réduit l'utilisation des ressources.

  • Techniques :
    • Indexation : Créer des index sur les colonnes fréquemment interrogées
    • Éviter SELECT * : Sélectionner uniquement les colonnes nécessaires
    • Utiliser WHERE efficacement : Filtrer tôt
    • Optimiser les JOIN : Joindre sur les colonnes indexées
    • Éviter les sous-requêtes : Utiliser plutôt des JOIN ou des CTE
    • Utiliser EXPLAIN : Analyser le plan d'exécution de la requête
    • Partitionner les tables : Pour les très grandes tables
    • Agrégation efficace : Utiliser GROUP BY approprié
-- Mauvais : SELECT * et sous-requête
SELECT * FROM orders
WHERE customer_id IN (
    SELECT customer_id FROM customers WHERE country = 'USA'
);

-- Bon : Colonnes spécifiques et JOIN
SELECT o.order_id, o.order_date, o.amount
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
WHERE c.country = 'USA';

-- Utiliser EXPLAIN pour analyser
EXPLAIN SELECT * FROM orders WHERE order_date > '2023-01-01';

-- Créer un index pour de meilleures performances
CREATE INDEX idx_order_date ON orders(order_date);

-- Utiliser un index couvrant (inclut toutes les colonnes nécessaires)
CREATE INDEX idx_orders_covering ON orders(customer_id, order_date, amount);

-- Partitionner les grandes tables
CREATE TABLE orders_2023 PARTITION OF orders
FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');

Rareté : Très courant Difficulté : Difficile


3. Que sont les CTE (Common Table Expressions) et quand les utiliseriez-vous ?

Réponse : Les CTE créent des ensembles de résultats nommés temporaires qui n'existent que pendant l'exécution de la requête.

  • Avantages :
    • Améliorer la lisibilité
    • Permettre la récursion
    • Réutiliser dans la même requête
    • Mieux que les sous-requêtes pour une logique complexe
-- CTE de base
WITH high_earners AS (
    SELECT employee_id, first_name, salary
    FROM employees
    WHERE salary > 80000
)
SELECT * FROM high_earners
WHERE first_name LIKE 'J%';

-- CTE multiples
WITH 
sales_summary AS (
    SELECT 
        product_id,
        SUM(quantity) AS total_quantity,
        SUM(amount) AS total_revenue
    FROM sales
    GROUP BY product_id
),
product_info AS (
    SELECT product_id, product_name, category
    FROM products
)
SELECT 
    p.product_name,
    p.category,
    s.total_quantity,
    s.total_revenue
FROM sales_summary s
JOIN product_info p ON s.product_id = p.product_id
ORDER BY s.total_revenue DESC;

-- CTE récursive (hiérarchie organisationnelle)
WITH RECURSIVE employee_hierarchy AS (
    -- Cas de base : employés de niveau supérieur
    SELECT employee_id, first_name, manager_id, 1 AS level
    FROM employees
    WHERE manager_id IS NULL
    
    UNION ALL
    
    -- Cas récursif : employés rapportant au niveau précédent
    SELECT e.employee_id, e.first_name, e.manager_id, eh.level + 1
    FROM employees e
    JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM employee_hierarchy
ORDER BY level, employee_id;

Rareté : Courant Difficulté : Moyenne


4. Expliquez la différence entre UNION et UNION ALL.

Réponse : Les deux combinent les résultats de plusieurs instructions SELECT.

  • UNION :
    • Supprime les lignes en double
    • Plus lent (nécessite un tri/comparaison)
    • À utiliser lorsque les doublons doivent être éliminés
  • UNION ALL :
    • Conserve toutes les lignes, y compris les doublons
    • Plus rapide (pas de déduplication)
    • À utiliser lorsque les doublons sont acceptables ou impossibles
-- UNION - supprime les doublons
SELECT customer_id FROM orders_2022
UNION
SELECT customer_id FROM orders_2023;
-- Résultat : identifiants de client uniques des deux années

-- UNION ALL - conserve les doublons
SELECT customer_id FROM orders_2022
UNION ALL
SELECT customer_id FROM orders_2023;
-- Résultat : tous les identifiants de client (peut avoir des doublons)

-- Comparaison des performances
-- UNION ALL est plus rapide lorsque vous savez qu'il n'y a pas de doublons
SELECT 'Q1' AS quarter, revenue FROM q1_sales
UNION ALL
SELECT 'Q2', revenue FROM q2_sales
UNION ALL
SELECT 'Q3', revenue FROM q3_sales
UNION ALL
SELECT 'Q4', revenue FROM q4_sales;

Rareté : Courant Difficulté : Facile


5. Comment gérez-vous les valeurs NULL en SQL ?

Réponse : NULL représente des données manquantes ou inconnues et nécessite une gestion spéciale.

-- Vérifier la présence de NULL
SELECT * FROM employees
WHERE manager_id IS NULL;  -- Pas : = NULL

-- COALESCE : Retourner la première valeur non NULL
SELECT 
    first_name,
    COALESCE(middle_name, '') AS middle_name,
    COALESCE(bonus, 0) AS bonus
FROM employees;

-- NULLIF : Retourner NULL si les valeurs sont égales
SELECT 
    product_name,
    NULLIF(discount, 0) AS discount  -- NULL si la remise est 0
FROM products;

-- NULL dans les calculs (NULL se propage)
SELECT 
    salary,
    bonus,
    salary + bonus AS total  -- NULL si le bonus est NULL
FROM employees;

-- Gérer NULL dans les agrégations
SELECT 
    department,
    COUNT(*) AS total_employees,
    COUNT(manager_id) AS employees_with_manager,  -- Exclut les NULL
    AVG(COALESCE(bonus, 0)) AS avg_bonus
FROM employees
GROUP BY department;

-- NULL dans les JOIN
SELECT e.first_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE d.department_id IS NULL;  -- Employés sans département

Rareté : Très courant Difficulté : Moyenne


6. Que sont les sous-requêtes et quand les utiliseriez-vous par rapport aux JOIN ?

Réponse : Les sous-requêtes sont des requêtes imbriquées dans une autre requête.

  • Types :
    • Scalaire : Retourne une seule valeur
    • Ligne : Retourne une seule ligne
    • Table : Retourne plusieurs lignes/colonnes
  • Utiliser les sous-requêtes lorsque :
    • Besoin de filtrer en fonction de données agrégées
    • Vérification de l'existence (EXISTS)
    • Comparaison à des valeurs agrégées
  • Utiliser les JOIN lorsque :
    • Besoin de colonnes de plusieurs tables
    • Meilleures performances (généralement)
-- Sous-requête scalaire
SELECT first_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- Sous-requête corrélée (s'exécute pour chaque ligne)
SELECT e1.first_name, e1.salary
FROM employees e1
WHERE e1.salary > (
    SELECT AVG(e2.salary)
    FROM employees e2
    WHERE e2.department = e1.department
);

-- EXISTS (efficace pour vérifier l'existence)
SELECT c.customer_name
FROM customers c
WHERE EXISTS (
    SELECT 1 FROM orders o
    WHERE o.customer_id = c.customer_id
    AND o.order_date > '2023-01-01'
);

-- IN avec sous-requête
SELECT product_name
FROM products
WHERE product_id IN (
    SELECT DISTINCT product_id
    FROM sales
    WHERE sale_date > '2023-01-01'
);

-- Alternative JOIN (souvent plus rapide)
SELECT DISTINCT p.product_name
FROM products p
INNER JOIN sales s ON p.product_id = s.product_id
WHERE s.sale_date > '2023-01-01';

Rareté : Très courant Difficulté : Moyenne


Analyse Statistique (4 Questions)

7. Comment effectuez-vous une analyse de cohorte ?

Réponse : L'analyse de cohorte regroupe les utilisateurs par caractéristiques communes et suit leur comportement au fil du temps.

  • Cas d'utilisation courants :
    • Fidélisation de la clientèle
    • Engagement des utilisateurs
    • Tendances des revenus par période d'acquisition
-- Analyse de cohorte : Fidélisation mensuelle
WITH user_cohorts AS (
    SELECT 
        user_id,
        DATE_TRUNC('month', first_purchase_date) AS cohort_month
    FROM users
),
user_activities AS (
    SELECT 
        user_id,
        DATE_TRUNC('month', activity_date) AS activity_month
    FROM activities
)
SELECT 
    uc.cohort_month,
    ua.activity_month,
    COUNT(DISTINCT ua.user_id) AS active_users,
    COUNT(DISTINCT ua.user_id) * 100.0 / 
        COUNT(DISTINCT uc.user_id) AS retention_rate
FROM user_cohorts uc
LEFT JOIN user_activities ua ON uc.user_id = ua.user_id
GROUP BY uc.cohort_month, ua.activity_month
ORDER BY uc.cohort_month, ua.activity_month;

-- Analyse de cohorte des revenus
SELECT 
    cohort_month,
    months_since_cohort,
    SUM(revenue) AS cohort_revenue,
    AVG(revenue) AS avg_revenue_per_user
FROM (
    SELECT 
        DATE_TRUNC('month', u.signup_date) AS cohort_month,
        EXTRACT(MONTH FROM AGE(o.order_date, u.signup_date)) AS months_since_cohort,
        o.revenue,
        u.user_id
    FROM users u
    JOIN orders o ON u.user_id = o.user_id
) cohort_data
GROUP BY cohort_month, months_since_cohort
ORDER BY cohort_month, months_since_cohort;

Rareté : Courant Difficulté : Difficile


8. Expliquez l'analyse des tests A/B et la signification statistique.

Réponse : Les tests A/B comparent deux versions pour déterminer laquelle est la plus performante.

  • Indicateurs clés :
    • Taux de conversion
    • Signification statistique (p-value < 0,05)
    • Intervalle de confiance
    • Taille de l'échantillon
  • Processus :
    1. Définir l'hypothèse
    2. Déterminer la taille de l'échantillon
    3. Exécuter le test
    4. Analyser les résultats
    5. Prendre une décision
-- Analyse des résultats des tests A/B
WITH test_results AS (
    SELECT 
        variant,
        COUNT(*) AS visitors,
        SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) AS conversions,
        SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS conversion_rate
    FROM ab_test_data
    GROUP BY variant
)
SELECT 
    variant,
    visitors,
    conversions,
    ROUND(conversion_rate, 2) AS conversion_rate_pct,
    -- Calculer l'augmentation
    ROUND((conversion_rate - LAG(conversion_rate) OVER (ORDER BY variant)) / 
          LAG(conversion_rate) OVER (ORDER BY variant) * 100, 2) AS lift_pct
FROM test_results;

-- Calcul de la signification statistique (test du chi carré)
-- Généralement effectué en Python/R, mais peut calculer les composants en SQL
SELECT 
    variant,
    conversions,
    visitors - conversions AS non_conversions,
    visitors
FROM ab_test_data
GROUP BY variant;

Rareté : Courant Difficulté : Difficile


9. Comment calculez-vous et interprétez-vous les percentiles ?

Réponse : Les percentiles divisent les données en 100 parties égales.

  • Percentiles courants :
    • 25e (Q1), 50e (Médiane/Q2), 75e (Q3)
    • 90e, 95e, 99e pour la détection des valeurs aberrantes
  • Cas d'utilisation :
    • Analyse comparative des salaires
    • Mesures de performance
    • Surveillance des SLA
-- Calculer les percentiles
SELECT 
    PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY salary) AS p25,
    PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY salary) AS median,
    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY salary) AS p75,
    PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY salary) AS p90,
    PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY salary) AS p95
FROM employees;

-- Percentile par groupe
SELECT 
    department,
    PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY salary) AS median_salary,
    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY salary) AS p75_salary
FROM employees
GROUP BY department;

-- Attribuer un rang de percentile à chaque ligne
SELECT 
    employee_id,
    salary,
    PERCENT_RANK() OVER (ORDER BY salary) AS percentile_rank,
    NTILE(4) OVER (ORDER BY salary) AS quartile
FROM employees;

-- Intervalle interquartile (IQR) pour la détection des valeurs aberrantes
WITH quartiles AS (
    SELECT 
        PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY salary) AS q1,
        PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY salary) AS q3
    FROM employees
)
SELECT 
    e.*,
    CASE 
        WHEN e.salary < q.q1 - 1.5 * (q.q3 - q.q1) THEN 'Low Outlier'
        WHEN e.salary > q.q3 + 1.5 * (q.q3 - q.q1) THEN 'High Outlier'
        ELSE 'Normal'
    END AS outlier_status
FROM employees e
CROSS JOIN quartiles q;

Rareté : Courant Difficulté : Moyenne


10. Qu'est-ce que l'analyse de séries chronologiques et comment gérez-vous la saisonnalité ?

Réponse : L'analyse de séries chronologiques examine les points de données collectés au fil du temps pour identifier des schémas.

  • Composants :
    • Tendance : Direction à long terme
    • Saisonnalité : Schémas réguliers (quotidiens, hebdomadaires, annuels)
    • Cyclique : Fluctuations irrégulières
    • Aléatoire : Bruit
  • Gestion de la saisonnalité :
    • Moyennes mobiles
    • Comparaison d'une année sur l'autre
    • Décomposition saisonnière
    • Ajustement saisonnier
-- Moyenne mobile (lisser la saisonnalité)
SELECT 
    date,
    sales,
    AVG(sales) OVER (
        ORDER BY date 
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ) AS moving_avg_7day
FROM daily_sales;

-- Comparaison d'une année sur l'autre
SELECT 
    EXTRACT(MONTH FROM sale_date) AS month,
    EXTRACT(YEAR FROM sale_date) AS year,
    SUM(amount) AS monthly_sales,
    LAG(SUM(amount), 12) OVER (ORDER BY sale_date) AS same_month_last_year,
    (SUM(amount) - LAG(SUM(amount), 12) OVER (ORDER BY sale_date)) / 
        LAG(SUM(amount), 12) OVER (ORDER BY sale_date) * 100 AS yoy_growth
FROM sales
GROUP BY EXTRACT(MONTH FROM sale_date), EXTRACT(YEAR FROM sale_date);

-- Calcul de l'indice saisonnier
WITH monthly_avg AS (
    SELECT 
        EXTRACT(MONTH FROM date) AS month,
        AVG(sales) AS avg_sales
    FROM daily_sales
    GROUP BY EXTRACT(MONTH FROM date)
),
overall_avg AS (
    SELECT AVG(sales) AS overall_avg
    FROM daily_sales
)
SELECT 
    m.month,
    m.avg_sales,
    o.overall_avg,
    m.avg_sales / o.overall_avg AS seasonal_index
FROM monthly_avg m
CROSS JOIN overall_avg o
ORDER BY m.month;

Rareté : Moyenne Difficulté : Difficile


Modélisation des Données et ETL (4 Questions)

11. Expliquez le schéma en étoile par rapport au schéma en flocon de neige.

Réponse : Les deux sont des modèles de conception d'entrepôt de données.

Loading diagram...
  • Schéma en étoile :
    • Table de faits entourée de tables de dimension dénormalisées
    • Requêtes simples (moins de jointures)
    • Performances de requête plus rapides
    • Plus de stockage (données redondantes)
  • Schéma en flocon de neige :
    • Tables de dimension normalisées
    • Moins de stockage (pas de redondance)
    • Requêtes plus complexes (plus de jointures)
    • Performances de requête plus lentes

Rareté : Courant Difficulté : Moyenne


12. Qu'est-ce que l'ETL et comment concevez-vous un pipeline ETL ?

Réponse : ETL (Extract, Transform, Load) déplace les données des sources vers la destination.

  • Extract : Extraire les données des sources (bases de données, API, fichiers)
  • Transform : Nettoyer, valider, agréger, enrichir
  • Load : Insérer dans la cible (entrepôt de données, base de données)
  • Considérations de conception :
    • Chargement incrémentiel vs complet
    • Gestion des erreurs et journalisation
    • Validation des données
    • Optimisation des performances
    • Planification et orchestration
-- Exemple de chargement incrémentiel
-- Extract : Obtenir les enregistrements nouveaux/mis à jour
CREATE TEMP TABLE staging_customers AS
SELECT *
FROM source_customers
WHERE updated_at > (
    SELECT MAX(last_updated) 
    FROM target_customers
);

-- Transform : Nettoyer et standardiser
UPDATE staging_customers
SET 
    email = LOWER(TRIM(email)),
    phone = REGEXP_REPLACE(phone, '[^0-9]', '', 'g'),
    country = UPPER(country);

-- Load : Upsert dans la cible
INSERT INTO target_customers
SELECT * FROM staging_customers
ON CONFLICT (customer_id) 
DO UPDATE SET
    email = EXCLUDED.email,
    phone = EXCLUDED.phone,
    updated_at = EXCLUDED.updated_at;

-- Enregistrer l'exécution de l'ETL
INSERT INTO etl_log (table_name, records_processed, run_date)
VALUES ('customers', (SELECT COUNT(*) FROM staging_customers), CURRENT_TIMESTAMP);

Rareté : Très courant Difficulté : Difficile


13. Comment assurez-vous la qualité des données ?

Réponse : La qualité des données garantit que les données sont exactes, complètes et fiables.

  • Dimensions :
    • Exactitude : Valeurs correctes
    • Exhaustivité : Pas de données manquantes
    • Cohérence : Identique dans tous les systèmes
    • Actualité : À jour
    • Validité : Conforme aux règles
  • Techniques :
    • Règles de validation des données
    • Tests automatisés
    • Profilage des données
    • Détection des anomalies
    • Audits réguliers
-- Contrôles de qualité des données
-- 1. Vérifier la présence de NULL dans les champs obligatoires
SELECT COUNT(*) AS null_emails
FROM customers
WHERE email IS NULL;

-- 2. Vérifier la présence de doublons
SELECT email, COUNT(*) AS duplicate_count
FROM customers
GROUP BY email
HAVING COUNT(*) > 1;

-- 3. Vérifier la présence de formats non valides
SELECT COUNT(*) AS invalid_emails
FROM customers
WHERE email NOT LIKE '%@%.%';

-- 4. Vérifier l'intégrité référentielle
SELECT COUNT(*) AS orphaned_orders
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id IS NULL;

-- 5. Vérifier la présence de valeurs aberrantes
SELECT COUNT(*) AS outlier_count
FROM orders
WHERE amount < 0 OR amount > 100000;

-- 6. Vérifier la fraîcheur des données
SELECT 
    MAX(updated_at) AS last_update,
    EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - MAX(updated_at))) / 3600 AS hours_since_update
FROM customers;

-- Créer un tableau de bord de qualité des données
CREATE VIEW data_quality_metrics AS
SELECT 
    'customers' AS table_name,
    COUNT(*) AS total_records,
    SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) AS null_emails,
    SUM(CASE WHEN email NOT LIKE '%@%.%' THEN 1 ELSE 0 END) AS invalid_emails,
    MAX(updated_at) AS last_updated
FROM customers;

Rareté : Très courant Difficulté : Moyenne


14. Qu'est-ce que la normalisation des données et quand dénormaliseriez-vous ?

Réponse :

  • Normalisation : Organisation des données pour réduire la redondance
    • 1NF, 2NF, 3NF, BCNF
    • Avantages : Intégrité des données, moins de stockage
    • Inconvénient : Plus de jointures, requêtes plus lentes
  • Dénormalisation : Ajout intentionnel de redondance
    • Avantages : Requêtes plus rapides, SQL plus simple
    • Inconvénients : Plus de stockage, anomalies de mise à jour
    • Utiliser pour : Entrepôts de données, rapports, systèmes à forte lecture
-- Normalisé (3NF)
-- Table des commandes
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    product_id INT,
    quantity INT
);

-- Nécessite des jointures pour la création de rapports
SELECT 
    c.customer_name,
    p.product_name,
    o.quantity
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN products p ON o.product_id = p.product_id;

-- Dénormalisé (pour la création de rapports)
CREATE TABLE orders_denormalized (
    order_id INT PRIMARY KEY,
    customer_id INT,
    customer_name VARCHAR(100),  -- Dénormalisé
    customer_email VARCHAR(100),  -- Dénormalisé
    product_id INT,
    product_name VARCHAR(100),  -- Dénormalisé
    product_category VARCHAR(50),  -- Dénormalisé
    quantity INT,
    unit_price DECIMAL(10,2)  -- Dénormalisé
);

-- Requête plus simple et plus rapide
SELECT customer_name, product_name, quantity
FROM orders_denormalized;

Rareté : Courant Difficulté : Moyenne


Tableau de Bord et Visualisation (3 Questions)

15. Comment concevez-vous un tableau de bord efficace ?

Réponse : Les tableaux de bord efficaces fournissent des informations exploitables en un coup d'œil.

  • Principes :
    • Connaître votre public : Cadres supérieurs vs analystes
    • Se concentrer sur les ICP : Indicateurs les plus importants en premier
    • Utiliser des visualisations appropriées : Bon graphique pour le type de données
    • Maintenir la cohérence : Couleurs, polices, mise en page
    • Activer l'interactivité : Filtres, explorations
    • Optimiser les performances : Pré-agréger les données
    • Raconter une histoire : Flux logique
  • Mise en page :
    • Haut : Indicateurs clés/ICP
    • Milieu : Tendances et comparaisons
    • Bas : Détails et ventilations

Rareté : Très courant Difficulté : Moyenne


16. Comment optimisez-vous les performances du tableau de bord ?

Réponse : Les tableaux de bord lents frustrent les utilisateurs et réduisent l'adoption.

  • Techniques d'optimisation :
    • Agrégation des données : Pré-calculer les indicateurs
    • Vues matérialisées : Stocker les résultats des requêtes
    • Actualisation incrémentielle : Mettre à jour uniquement les nouvelles données
    • Limiter les données : Utiliser des filtres, des plages de dates
    • Optimiser les requêtes : Index, SQL efficace
    • Extraire les données : Déplacer vers une source de données plus rapide
    • Réduire les visualisations : Moins de graphiques par tableau de bord
    • Utiliser des extraits : Extraits Tableau/Power BI
-- Créer une vue matérialisée pour le tableau de bord
CREATE MATERIALIZED VIEW daily_sales_summary AS
SELECT 
    DATE_TRUNC('day', order_date) AS date,
    product_category,
    region,
    COUNT(*) AS order_count,
    SUM(amount) AS total_revenue,
    AVG(amount) AS avg_order_value
FROM orders
GROUP BY DATE_TRUNC('day', order_date), product_category, region;

-- Créer un index pour un filtrage plus rapide
CREATE INDEX idx_daily_sales_date ON daily_sales_summary(date);

-- Actualiser la vue matérialisée (tâche planifiée)
REFRESH MATERIALIZED VIEW CONCURRENTLY daily_sales_summary;

-- Requête du tableau de bord (rapide, utilise des données pré-agrégées)
SELECT * FROM daily_sales_summary
WHERE date >= CURRENT_DATE - INTERVAL '30 days'
AND region = 'North America';

Rareté : Courant Difficulté : Moyenne


17. Quelles mesures suivriez-vous pour différentes fonctions commerciales ?

Réponse : Différents départements ont besoin de mesures différentes.

  • Ventes :
    • Chiffre d'affaires, taux de conversion, taille moyenne des transactions
    • Durée du cycle de vente, taux de réussite
    • Coût d'acquisition client (CAC)
  • Marketing :
    • ROI, coût par prospect, taux de conversion des prospects
    • Trafic du site web, taux d'engagement
    • Valeur à vie du client (CLV)
  • Opérations :
    • Délai d'exécution des commandes, taux d'erreur
    • Rotation des stocks, taux d'utilisation de la capacité
    • Taux de livraison à temps
  • Finances :
    • Marge bénéficiaire, flux de trésorerie, taux d'épuisement
    • Croissance du chiffre d'affaires, BAIIA
    • Vieillissement des comptes clients
  • Succès Client :
    • Satisfaction client (CSAT), Net Promoter Score (NPS)
    • Taux de désabonnement, taux de fidélisation
    • Temps de résolution des tickets d'assistance

Rareté : Courant Difficulté : Facile


Stratégie Commerciale et Communication (3 Questions)

18. Comment priorisez-vous les projets d'analyse ?

Réponse : La priorisation garantit un impact commercial maximal.

  • Cadre :
    • Impact : Valeur commerciale potentielle
    • Effort : Temps et ressources nécessaires
    • Urgence : Sensibilité au temps
    • Alignement des parties prenantes : Soutien de la direction
  • Matrice de priorisation :
    • Impact élevé, faible effort : À faire en premier
    • Impact élevé, effort élevé : Planifier soigneusement
    • Faible impact, faible effort : Gains rapides
    • Faible impact, effort élevé : Éviter
  • Questions à poser :
    • Quel problème commercial cela résout-il ?
    • Quel est le retour sur investissement attendu ?
    • Qui sont les parties prenantes ?
    • Quelles données sont disponibles ?
    • Quelles sont les dépendances ?

Rareté : Courant Difficulté : Moyenne


19. Comment gérez-vous les exigences conflictuelles des parties prenantes ?

Réponse : La gestion des parties prenantes est essentielle pour les analystes seniors.

  • Approche :
    • Comprendre les besoins : Poser des questions de clarification
    • Trouver un terrain d'entente : Objectifs communs
    • Prioriser : En fonction de l'impact commercial
    • Communiquer les compromis : Expliquer les contraintes
    • Proposer des alternatives : Solutions gagnant-gagnant
    • Escalader si nécessaire : Obtenir l'alignement de la direction
    • Documenter les décisions : Enregistrement clair
  • Exemple :
    • Le marketing veut un tableau de bord en temps réel
    • L'informatique dit que le temps réel est trop coûteux
    • Solution : Le quasi temps réel (actualisation de 15 minutes) équilibre les besoins et les coûts

Rareté : Courant Difficulté : Moyenne


20. Comment mesurez-vous le succès de votre travail d'analyse ?

Réponse : Démontrer la valeur est essentiel pour l'évolution de carrière.

  • Mesures :
    • Impact Commercial :
      • Augmentation des revenus
      • Réduction des coûts
      • Amélioration de l'efficacité
      • Meilleure prise de décision
    • Adoption :
Newsletter subscription

Conseils de carrière hebdomadaires qui fonctionnent vraiment

Recevez les dernières idées directement dans votre boîte de réception

Decorative doodle

Créez un CV qui Vous Fait Embaucher 60% Plus Vite

En quelques minutes, créez un CV personnalisé et compatible ATS qui a prouvé obtenir 6 fois plus d'entretiens.

Créer un meilleur CV

Partager cet article

Battez le Taux de Rejet ATS de 75%

3 CV sur 4 n'atteignent jamais un œil humain. Notre optimisation des mots-clés augmente votre taux de réussite jusqu'à 80%, garantissant que les recruteurs voient réellement votre potentiel.