Analyse concurrentielle des backlinks avec Python [Complete Script]


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

Cette fois, 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 définissons 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é du domaine (ou la notation de domaine équivalente Ahrefs) et la quantité est le nombre de domaines référents.

Là encore, 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 des données

Nous avons configuré les répertoires de fichiers pour lire plusieurs fichiers de données Ahrefs exportés dans un dossier, ce qui est beaucoup plus rapide, moins fastidieux 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 à un bloc de données.

Au fur et à mesure que nous lirons le 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 Ahrefs, mai 2022

Nous avons maintenant les données brutes pour 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 supprimée avec une fonction personnalisée ou une compréhension de liste, c’est une bonne pratique et plus facile pour les Pythonistes SEO débutants 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 la colonne à valeur unique (“projet”) sont utiles pour les opérations de regroupement et d’agrégation.

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

competitor_ahrefs_cleancols
Image Ahrefs, mai 2022

Les colonnes sont effacées, nous allons donc maintenant effacer les données dans les lignes.

competitor_ahrefs_clean_dtypes = competitor_ahrefs_cleancols

Pour les domaines de référence, nous remplaçons les traits d’union par des zéros et définissons le type de données sur un entier (c’est-à-dire un 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)

First Seen 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 du lien.

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 link_age, nous déduirons simplement la première date vue de la date d’aujourd’hui et convertirons la différence en 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 de destination nous aide à distinguer le site “client” des concurrents, ce qui est utile pour une consultation 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
Image Ahrefs, mai 2022

Maintenant que les données sont propres en termes d’en-têtes de colonne et de valeurs de ligne, nous sommes prêts à exposer et à commencer l’analyse.

La qualité du lien

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

Commençons par inspecter les propriétés distributionnelles de DR en traçant sa 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
Image Ahrefs, mai 2022

Le graphique compare les propriétés statistiques du site côte à côte, et plus particulièrement, la plage interquartile qui montre où se classent les domaines les plus référents 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 aux 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 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, c’est ainsi que nous obtenons notre somme courante.

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

competitor_count_cumsum_df
Image Ahrefs, mai 2022

Le résultat est une trame de données avec le site, month_year et count_runsum (la somme cumulée), qui est parfaitement formatée 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
Image Ahrefs, mai 2022

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 votre 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é à la mi-2021.

de plus en plus

Vous pouvez toujours faire une analyse plus scientifique.

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 obtenir une vue plus globale de la façon dont les sites se comparent en termes de référencement externe.

D’autres extensions consisteraient à modéliser les qualités de ces domaines de référence pour votre site et celui de votre concurrent afin de voir quelles caractéristiques 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 le site de votre concurrent. . .

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

Davantage de ressources:


Image en vedette : Studio F8/Shutterstock





Cet article a été traduit par searchenginejournal

Laisser un commentaire