Définition
Ces métriques SEMrush estiment le volume de trafic qu’un site web reçoit respectivement de ses positions dans les résultats organiques et de ses campagnes publicitaires payantes. Ces données permettent de comparer la performance SEO vs SEA et d’évaluer la stratégie de visibilité globale d’un site.
Trafic des positions organiques
Calcul du trafic organique estimé
def calculate_organic_traffic_estimate(keywords_positions):
"""
Estime le trafic organique basé sur positions SEMrush
"""
# CTR moyens par position (desktop)
ctr_rates = {
1: 0.284, 2: 0.152, 3: 0.103, 4: 0.073, 5: 0.055,
6: 0.042, 7: 0.031, 8: 0.024, 9: 0.018, 10: 0.014,
11: 0.012, 12: 0.009, 13: 0.007, 14: 0.005, 15: 0.004
}
total_estimated_traffic = 0
detailed_breakdown = []
for keyword_data in keywords_positions:
position = keyword_data['position']
volume = keyword_data['search_volume']
keyword = keyword_data['keyword']
# CTR selon position
ctr = ctr_rates.get(position, 0.002)
# Trafic estimé pour ce mot-clé
estimated_clicks = volume * ctr
total_estimated_traffic += estimated_clicks
detailed_breakdown.append({
'keyword': keyword,
'position': position,
'volume': volume,
'estimated_clicks': int(estimated_clicks),
'ctr': ctr
})
return {
'total_organic_traffic': int(total_estimated_traffic),
'keywords_count': len(keywords_positions),
'avg_position': sum(kw['position'] for kw in keywords_positions) / len(keywords_positions),
'breakdown': sorted(detailed_breakdown, key=lambda x: x['estimated_clicks'], reverse=True)
}
# Exemple
organic_keywords = [
{'keyword': 'consultant SEO', 'position': 2, 'search_volume': 880},
{'keyword': 'audit SEO', 'position': 5, 'search_volume': 590},
{'keyword': 'agence SEO Paris', 'position': 8, 'search_volume': 320}
]
organic_traffic = calculate_organic_traffic_estimate(organic_keywords)
# Résultat: {'total_organic_traffic': 174, 'keywords_count': 3, 'avg_position': 5.0}
Facteurs d’ajustement
// Facteurs influençant précision estimation
const organicTrafficFactors = {
device_variations: {
desktop_ctr: 'Base calculation',
mobile_ctr: 'Generally -20% vs desktop',
tablet_ctr: 'Between desktop and mobile'
},
serp_features_impact: {
featured_snippets: 'Can increase CTR +30%',
paa_present: 'May decrease CTR -10%',
image_pack: 'Reduces text results CTR',
local_pack: 'Impacts local business queries',
shopping_results: 'Reduces e-commerce CTR'
},
brand_recognition: {
known_brand: 'CTR boost +15-40%',
unknown_brand: 'Standard CTR rates',
negative_reputation: 'CTR penalty -20%'
},
seasonal_variations: {
peak_season: 'Volume +50-200%',
off_season: 'Volume -30-60%',
trending_events: 'Temporary spikes'
}
};
Trafic des positions publicitaires
Estimation SEA traffic
def calculate_paid_traffic_estimate(ad_positions):
"""
Estime le trafic des campagnes publicitaires
"""
# CTR moyens Google Ads par position
paid_ctr_rates = {
1: 0.071, # Position 1 ads
2: 0.054, # Position 2 ads
3: 0.041, # Position 3 ads
4: 0.032, # Position 4 ads
}
total_paid_traffic = 0
campaign_breakdown = []
for ad_data in ad_positions:
position = ad_data['ad_position']
volume = ad_data['search_volume']
keyword = ad_data['keyword']
cpc = ad_data['cpc']
# CTR selon position publicitaire
ctr = paid_ctr_rates.get(position, 0.025)
# Trafic et coût estimés
estimated_clicks = volume * ctr
estimated_cost = estimated_clicks * cpc
total_paid_traffic += estimated_clicks
campaign_breakdown.append({
'keyword': keyword,
'ad_position': position,
'volume': volume,
'cpc': cpc,
'estimated_clicks': int(estimated_clicks),
'estimated_cost': round(estimated_cost, 2),
'ctr': ctr
})
total_cost = sum(item['estimated_cost'] for item in campaign_breakdown)
return {
'total_paid_traffic': int(total_paid_traffic),
'total_estimated_cost': round(total_cost, 2),
'avg_cpc': round(total_cost / total_paid_traffic, 2) if total_paid_traffic > 0 else 0,
'campaigns_count': len(ad_positions),
'breakdown': sorted(campaign_breakdown, key=lambda x: x['estimated_cost'], reverse=True)
}
Analyse comparative SEO vs SEA
Dashboard comparatif
<!-- Comparaison trafic organique vs payant -->
<div class="seo-sea-comparison">
<div class="organic-metrics">
<h3>Trafic Organique Estimé</h3>
<div class="metric-card">
<span class="value">12,450</span>
<span class="label">Visiteurs/mois</span>
</div>
<div class="metric-card">
<span class="value">€0</span>
<span class="label">Coût direct</span>
</div>
<div class="metric-card">
<span class="value">347</span>
<span class="label">Mots-clés positionnés</span>
</div>
</div>
<div class="paid-metrics">
<h3>Trafic Publicitaire Estimé</h3>
<div class="metric-card">
<span class="value">3,280</span>
<span class="label">Clics/mois</span>
</div>
<div class="metric-card">
<span class="value">€8,450</span>
<span class="label">Budget estimé</span>
</div>
<div class="metric-card">
<span class="value">28</span>
<span class="label">Mots-clés achetés</span>
</div>
</div>
<div class="insights">
<h3>Insights Stratégiques</h3>
<ul>
<li>Ratio SEO/SEA : 79% / 21%</li>
<li>Coût par visiteur SEO : €0</li>
<li>Coût par clic SEA : €2.58</li>
<li>Économies SEO : €32,100/mois</li>
</ul>
</div>
</div>
Matrice stratégique
# Analyse stratégique SEO vs SEA
def strategic_seo_sea_analysis(organic_data, paid_data):
"""
Analyse la répartition et les opportunités SEO/SEA
"""
analysis = {
'coverage_analysis': {},
'cost_efficiency': {},
'strategic_recommendations': []
}
# Mots-clés en commun
organic_keywords = set(kw['keyword'] for kw in organic_data)
paid_keywords = set(kw['keyword'] for kw in paid_data)
overlap = organic_keywords.intersection(paid_keywords)
organic_only = organic_keywords - paid_keywords
paid_only = paid_keywords - organic_keywords
analysis['coverage_analysis'] = {
'total_keywords_organic': len(organic_keywords),
'total_keywords_paid': len(paid_keywords),
'overlap_count': len(overlap),
'organic_exclusive': len(organic_only),
'paid_exclusive': len(paid_only),
'overlap_percentage': (len(overlap) / len(paid_keywords)) * 100 if paid_keywords else 0
}
# Recommandations basées sur l'analyse
if analysis['coverage_analysis']['overlap_percentage'] > 60:
analysis['strategic_recommendations'].append(
'High SEO/SEA overlap detected - Consider reducing paid spend on organic-strong keywords'
)
if len(paid_only) > len(organic_only):
analysis['strategic_recommendations'].append(
'Many paid-only keywords - SEO opportunity to reduce acquisition costs'
)
return analysis
Limites et précision
Facteurs d’imprécision
// Limites des estimations SEMrush
const estimationLimitations = {
data_collection: {
sampling_method: 'Based on limited keyword set',
update_frequency: 'Monthly snapshots',
geographic_coverage: 'May miss local variations',
long_tail_gap: 'Underrepresents long-tail traffic'
},
ctr_assumptions: {
industry_variations: 'Generic CTR vs sector-specific',
brand_effects: 'Doesn\'t account for brand recognition',
serp_features: 'Limited SERP features impact',
device_differences: 'Desktop-centric calculations'
},
real_world_factors: {
click_distribution: 'Actual user behavior varies',
seasonal_patterns: 'Static volume assumptions',
competition_changes: 'Dynamic SERP landscape',
user_intent_evolution: 'Search behavior shifts'
}
};
Amélioration précision
# Méthodes améliorer précision estimations
def improve_estimation_accuracy():
return {
'data_enrichment': {
'google_analytics': 'Compare with actual traffic data',
'search_console': 'Real CTR and impression data',
'google_ads': 'Actual paid performance metrics',
'heat_mapping': 'User behavior insights'
},
'model_adjustments': {
'industry_benchmarks': 'Sector-specific CTR rates',
'brand_factor': 'Adjust for brand recognition',
'device_split': 'Mobile vs desktop variations',
'seasonal_indexing': 'Time-based adjustments'
},
'validation_methods': {
'month_over_month': 'Track estimation vs reality',
'competitor_benchmarking': 'Cross-validate with peers',
'statistical_modeling': 'Confidence intervals',
'expert_judgment': 'Manual review and adjustments'
}
}
Applications pratiques
Optimisation budget
# Allocation budget SEO/SEA optimale
def optimize_seo_sea_budget(current_performance):
"""
Recommande allocation budget entre SEO et SEA
"""
recommendations = []
# Analyse coût par acquisition
organic_cpa = current_performance['organic_cpa']
paid_cpa = current_performance['paid_cpa']
if organic_cpa < paid_cpa * 0.3: # SEO 70% moins cher
recommendations.append({
'action': 'Increase SEO investment',
'reasoning': f'Organic CPA (€{organic_cpa}) significantly lower than paid (€{paid_cpa})',
'priority': 'High'
})
# Keywords en overlap
overlap_waste = current_performance['overlap_keywords_cost']
if overlap_waste > 1000: # Plus de 1000€/mois
recommendations.append({
'action': 'Reduce paid spend on organic-ranking keywords',
'reasoning': f'€{overlap_waste}/month spent on keywords already ranking organically',
'priority': 'Medium'
})
return recommendations
Ces métriques SEMrush offrent une vue d’ensemble précieuse pour optimiser la stratégie de visibilité digitale en équilibrant efficacement les investissements SEO et SEA.