Dans mon dernier article, nous avons analysé nos backlinks en utilisant les données d’Ahrefs.

Cette fois-ci, nous incluons les backlinks des concurrents dans notre analyse en utilisant la même source de données Ahrefs à des fins de comparaison.

Comme la dernière fois, nous avons défini la valeur des backlinks d’un site pour le référencement comme un produit de qualité et de quantité.

La qualité est l’autorité de domaine (ou l’évaluation de domaine équivalente d’Ahrefs) et la quantité est le nombre de domaines référents.

Encore une fois, nous évaluerons la qualité du lien avec les données disponibles avant d’évaluer la quantité.

Il est temps de coder.

import re
import time
import random
import pandas as pd
import numpy as np
import datetime
from datetime import timedelta
from plotnine import *
import matplotlib.pyplot as plt
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype
import uritools  

pd.set_option('display.max_colwidth', None)
%matplotlib inline
root_domain = 'johnsankey.co.uk'
hostdomain = 'www.johnsankey.co.uk'
hostname="johnsankey"
full_domain = 'https://www.johnsankey.co.uk'
target_name="John Sankey"

Importation et nettoyage de données

Nous avons configuré les répertoires de fichiers pour lire plusieurs fichiers de données exportés par Ahrefs dans un dossier, ce qui est beaucoup plus rapide, moins ennuyeux et plus efficace que la lecture de chaque fichier individuellement.

Surtout quand vous en avez plus de 10 !

ahrefs_path="data/"

La fonction listdir( ) du module OS nous permet de lister tous les fichiers d’un sous-répertoire.

ahrefs_filenames = os.listdir(ahrefs_path)
ahrefs_filenames.remove('.DS_Store')
ahrefs_filenames

File names now listed below:

['www.davidsonlondon.com--refdomains-subdomain__2022-03-13_23-37-29.csv',
 'www.stephenclasper.co.uk--refdomains-subdoma__2022-03-13_23-47-28.csv',
 'www.touchedinteriors.co.uk--refdomains-subdo__2022-03-13_23-42-05.csv',
 'www.lushinteriors.co--refdomains-subdomains__2022-03-13_23-44-34.csv',
 'www.kassavello.com--refdomains-subdomains__2022-03-13_23-43-19.csv',
 'www.tulipinterior.co.uk--refdomains-subdomai__2022-03-13_23-41-04.csv',
 'www.tgosling.com--refdomains-subdomains__2022-03-13_23-38-44.csv',
 'www.onlybespoke.com--refdomains-subdomains__2022-03-13_23-45-28.csv',
 'www.williamgarvey.co.uk--refdomains-subdomai__2022-03-13_23-43-45.csv',
 'www.hadleyrose.co.uk--refdomains-subdomains__2022-03-13_23-39-31.csv',
 'www.davidlinley.com--refdomains-subdomains__2022-03-13_23-40-25.csv',
 'johnsankey.co.uk-refdomains-subdomains__2022-03-18_15-15-47.csv']

Avec les fichiers répertoriés, nous allons maintenant lire chacun individuellement à l’aide d’une boucle for et les ajouter à une trame de données.

Lors de la lecture du fichier, nous utiliserons une manipulation de chaîne pour créer une nouvelle colonne avec le nom du site des données que nous importons.

ahrefs_df_lst = list()
ahrefs_colnames = list()

for filename in ahrefs_filenames:
    df = pd.read_csv(ahrefs_path + filename)
    df['site'] = filename
    df['site'] = df['site'].str.replace('www.', '', regex = False)    
    df['site'] = df['site'].str.replace('.csv', '', regex = False)
    df['site'] = df['site'].str.replace('-.+', '', regex = True)
    ahrefs_colnames.append(df.columns)
    ahrefs_df_lst.append(df)

ahrefs_df_raw = pd.concat(ahrefs_df_lst)
ahrefs_df_raw
ahrefs dofollow données brutes

Image d’Ahrefs, mai 2022

Nous avons maintenant les données brutes de chaque site dans une seule base de données. L’étape suivante consiste à ranger les noms de colonne et à les rendre un peu plus conviviaux.

Bien que la répétition puisse être éliminée avec une fonction personnalisée ou une compréhension de liste, c’est une bonne pratique et plus facile pour les Pythonistes débutants en SEO de voir ce qui se passe étape par étape. Comme on dit, « la répétition est la mère de la maîtrise », alors entraînez-vous !

competitor_ahrefs_cleancols = ahrefs_df_raw
competitor_ahrefs_cleancols.columns = [col.lower() for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace(' ','_') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace('.','_') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace('__','_') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace('(','') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace(')','') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace('%','') for col in competitor_ahrefs_cleancols.columns]

La colonne de comptage et le fait d’avoir une seule colonne de valeur (« projet ») sont utiles pour les opérations groupby et d’agrégation.

competitor_ahrefs_cleancols['rd_count'] = 1
competitor_ahrefs_cleancols['project'] = target_name

competitor_ahrefs_cleancols
Données sur les concurrents d'Ahrefs

Les colonnes sont nettoyées, nous allons donc maintenant nettoyer les données de ligne.

competitor_ahrefs_clean_dtypes = competitor_ahrefs_cleancols

Pour les domaines de référence, nous remplaçons les traits d’union par zéro et définissons le type de données comme un entier (c’est-à-dire un nombre entier).

Cela sera également répété pour les domaines liés.

competitor_ahrefs_clean_dtypes['dofollow_ref_domains'] = np.where(competitor_ahrefs_clean_dtypes['dofollow_ref_domains'] == '-',
                                                           0, competitor_ahrefs_clean_dtypes['dofollow_ref_domains'])
competitor_ahrefs_clean_dtypes['dofollow_ref_domains'] = competitor_ahrefs_clean_dtypes['dofollow_ref_domains'].astype(int)



# linked_domains

competitor_ahrefs_clean_dtypes['dofollow_linked_domains'] = np.where(competitor_ahrefs_clean_dtypes['dofollow_linked_domains'] == '-',
                                                           0, competitor_ahrefs_clean_dtypes['dofollow_linked_domains'])
competitor_ahrefs_clean_dtypes['dofollow_linked_domains'] = competitor_ahrefs_clean_dtypes['dofollow_linked_domains'].astype(int)

La première vue nous donne une date à laquelle les liens ont été trouvés, que nous pouvons utiliser pour tracer des séries chronologiques et dériver l’âge des liens.

Nous allons convertir au format date en utilisant la fonction to_datetime.

# first_seen
competitor_ahrefs_clean_dtypes['first_seen'] = pd.to_datetime(competitor_ahrefs_clean_dtypes['first_seen'], 
                                                              format="%d/%m/%Y %H:%M")
competitor_ahrefs_clean_dtypes['first_seen'] = competitor_ahrefs_clean_dtypes['first_seen'].dt.normalize()
competitor_ahrefs_clean_dtypes['month_year'] = competitor_ahrefs_clean_dtypes['first_seen'].dt.to_period('M')

Pour calculer le link_age, nous déduirons simplement la première date vue de la date d’aujourd’hui et convertirons la différence en un nombre.

# link age
competitor_ahrefs_clean_dtypes['link_age'] = dt.datetime.now() - competitor_ahrefs_clean_dtypes['first_seen']
competitor_ahrefs_clean_dtypes['link_age'] = competitor_ahrefs_clean_dtypes['link_age']
competitor_ahrefs_clean_dtypes['link_age'] = competitor_ahrefs_clean_dtypes['link_age'].astype(int)
competitor_ahrefs_clean_dtypes['link_age'] = (competitor_ahrefs_clean_dtypes['link_age']/(3600 * 24 * 1000000000)).round(0)

La colonne cible nous aide à distinguer le site « client » des concurrents, ce qui est utile pour une visualisation ultérieure.

competitor_ahrefs_clean_dtypes['target'] = np.where(competitor_ahrefs_clean_dtypes['site'].str.contains('johns'),
                                                                                            1, 0)
competitor_ahrefs_clean_dtypes['target'] = competitor_ahrefs_clean_dtypes['target'].astype('category')

competitor_ahrefs_clean_dtypes
Ahrefs nettoie les types de données

Maintenant que les données sont nettoyées à la fois en termes de titres de colonne et de valeurs de ligne, nous sommes prêts à présenter et à commencer l’analyse.

Qualité du lien

Nous commençons par la qualité des liens que nous accepterons comme mesure de la notation du domaine (DR).

Commençons par inspecter les propriétés distributives de DR en traçant leur distribution à l’aide de la fonction geom_bokplot.

comp_dr_dist_box_plt = (
    ggplot(competitor_ahrefs_analysis.loc[competitor_ahrefs_analysis['dr'] > 0], 
           aes(x = 'reorder(site, dr)', y = 'dr', colour="target")) + 
    geom_boxplot(alpha = 0.6) +
    scale_y_continuous() +   
    theme(legend_position = 'none', 
          axis_text_x=element_text(rotation=90, hjust=1)
         ))

comp_dr_dist_box_plt.save(filename="images/4_comp_dr_dist_box_plt.png", 
                           height=5, width=10, units="in", dpi=1000)
comp_dr_dist_box_plt
types de distribution de compétition

Le graphique compare les propriétés statistiques du site côte à côte, et plus particulièrement, la plage interquartile indiquant où se situent la plupart des domaines de référence en termes de classement de domaine.

Nous constatons également que John Sankey a la quatrième note de domaine médiane la plus élevée, ce qui se compare bien à la qualité des liens par rapport à d’autres sites.

William Garvey a la gamme la plus diversifiée de DR par rapport à d’autres domaines, indiquant des critères légèrement plus souples pour l’acquisition de liens. Qui sait.

Liaison de volumes

C’est de la qualité. Qu’en est-il du volume de liens provenant des domaines référents ?

Pour résoudre ce problème, nous allons calculer une somme cumulée des domaines référents à l’aide de la fonction groupby.

competitor_count_cumsum_df = competitor_ahrefs_analysis

competitor_count_cumsum_df = competitor_count_cumsum_df.groupby(['site', 'month_year'])['rd_count'].sum().reset_index()

La fonction d’expansion permet à la fenêtre de calcul d’augmenter avec le nombre de lignes, ce qui nous permet d’obtenir notre somme courante.

competitor_count_cumsum_df['count_runsum'] = competitor_count_cumsum_df['rd_count'].expanding().sum()

competitor_count_cumsum_df
Données de somme cumulée Ahrefs

Le résultat est une trame de données avec le site, month_year et count_runsum (la somme courante), qui est dans le format parfait pour alimenter le graphique.

competitor_count_cumsum_plt = (
    ggplot(competitor_count_cumsum_df, aes(x = 'month_year', y = 'count_runsum', 
                                           group = 'site', colour="site")) + 
    geom_line(alpha = 0.6, size = 2) +
    labs(y = 'Running Sum of Referring Domains', x = 'Month Year') + 
    scale_y_continuous() + 
    scale_x_date() +
    theme(legend_position = 'right', 
          axis_text_x=element_text(rotation=90, hjust=1)
         ))
competitor_count_cumsum_plt.save(filename="images/5_count_cumsum_smooth_plt.png", 
                           height=5, width=10, units="in", dpi=1000)

competitor_count_cumsum_plt
graphique des concurrents

Le graphique montre le nombre de domaines référents pour chaque site depuis 2014.

Je trouve assez intéressantes les différentes positions de départ de chaque site lorsqu’ils commencent à acquérir des liens.

Par exemple, William Garvey a commencé avec plus de 5 000 domaines. J’aimerais savoir qui est leur agence de relations publiques !

Nous pouvons également voir le taux de croissance. Par exemple, bien que Hadley Rose ait commencé l’acquisition de liens en 2018, les choses ont vraiment décollé vers la mi-2021.

Plus, plus, et plus

Vous pouvez toujours faire plus d’analyses scientifiques.

Par exemple, une extension immédiate et naturelle de ce qui précède serait de combiner à la fois la qualité (DR) et la quantité (volume) pour une vue plus globale de la façon dont les sites se comparent en termes de référencement hors site.

D’autres extensions consisteraient à modéliser les qualités de ces domaines référents à la fois pour vous et vos sites concurrents pour voir quelles fonctionnalités de lien (telles que le nombre de mots ou la pertinence du contenu du lien) pourraient expliquer la différence de visibilité entre vous et vos concurrents. .

Cette extension de modèle serait une bonne application de ces techniques d’apprentissage automatique.

Davantage de ressources:

  • Qu’est-ce que l’analyse des fichiers journaux SEO ? Un guide du débutant
  • Pourquoi Google ne reconnaît-il pas les liens de mes concurrents comme manipulés ?
  • Référencement technique avancé : un guide complet

Image en vedette : studio F8/Shutterstock

LAISSER UN COMMENTAIRE

S'il vous plaît entrez votre commentaire!
S'il vous plaît entrez votre nom ici