Un enfocament de ciència de dades per optimitzar l’estructura d’enllaços interns


Optimitzar l’enllaç intern és important si us preocupa que les pàgines del vostre lloc tinguin prou autoritat per classificar-se per a les seves paraules clau objectiu. Per enllaços interns, entenem pàgines del vostre lloc web que reben enllaços d’altres pàgines.

Això és important perquè aquesta és la base per la qual Google i altres cerques calculen la importància de la pàgina en relació amb altres pàgines del vostre lloc web.

També afecta la probabilitat que un usuari descobreixi contingut al vostre lloc. El descobriment de contingut és la base del Google PageRank algorisme.

Avui, estem explorant un enfocament basat en dades per millorar l’enllaç intern d’un lloc web amb l’objectiu d’un SEO tècnic més eficaç. Això és per garantir que la distribució de l’autoritat interna del domini estigui optimitzada segons l’estructura del lloc.

Millora de les estructures d’enllaç intern amb Data Science

El nostre enfocament basat en dades se centrarà en només un aspecte de l’optimització de l’arquitectura d’enllaços interns, que és modelar la distribució dels enllaços interns per profunditat del lloc i després orientar les pàgines que no tenen enllaços per a la profunditat del lloc en particular.

Anunci

Continueu llegint a continuació

Comencem important les biblioteques i les dades, netejant els noms de les columnes abans de previsualitzar-los:

import pandas as pd
import numpy as np
site_name="ON24"
site_filename="on24"
website="www.on24.com"

# import Crawl Data
crawl_data = pd.read_csv('data/'+ site_filename + '_crawl.csv')
crawl_data.columns = crawl_data.columns.str.replace(' ','_')
crawl_data.columns = crawl_data.columns.str.replace('.','')
crawl_data.columns = crawl_data.columns.str.replace('(','')
crawl_data.columns = crawl_data.columns.str.replace(')','')
crawl_data.columns = map(str.lower, crawl_data.columns)
print(crawl_data.shape)
print(crawl_data.dtypes)
Crawl_data

(8611, 104)

url                          object
base_url                     object
crawl_depth                  object
crawl_status                 object
host                         object
                             ...   
redirect_type                object
redirect_url                 object
redirect_url_status          object
redirect_url_status_code     object
unnamed:_103                float64
Length: 104, dtype: object
Dades de SitebulbAndreas Voniatis, novembre de 2021

L’anterior mostra una vista prèvia de les dades importades des de l’aplicació de rastreig d’escriptori de Sitebulb. Hi ha més de 8.000 files i no totes seran exclusives del domini, ja que també inclourà URL de recursos i URL d’enllaços de sortida externs.

També tenim més de 100 columnes que són superflues per als requisits, de manera que caldrà seleccionar algunes columnes.

Anunci

Continueu llegint a continuació

Abans d’entrar-hi, però, volem veure ràpidament quants nivells de lloc hi ha:

crawl_depth
0             1
1            70
10            5
11            1
12            1
13            2
14            1
2           303
3           378
4           347
5           253
6           194
7            96
8            33
9            19
Not Set    2351
dtype: int64

Així, a partir de l’anterior, podem veure que hi ha 14 nivells de lloc i la majoria d’ells no es troben a l’arquitectura del lloc, sinó al mapa del lloc XML.

És possible que noteu que Pandas (el paquet Python per a la gestió de dades) ordena els nivells del lloc per dígits.

Això és perquè els nivells del lloc són en aquesta etapa cadenes de caràcters en lloc de numèrics. Això s’ajustarà en el codi posterior, ja que afectarà la visualització de dades (‘viz’).

Ara, filtrarem files i seleccionarem columnes.

# Filter for redirected and live links
redir_live_urls = crawl_data[['url', 'crawl_depth', 'http_status_code', 'indexable_status', 'no_internal_links_to_url', 'host', 'title']]
redir_live_urls = redir_live_urls.loc[redir_live_urls.http_status_code.str.startswith(('2'), na=False)]
redir_live_urls['crawl_depth'] = redir_live_urls['crawl_depth'].astype('category')
redir_live_urls['crawl_depth'] = redir_live_urls['crawl_depth'].cat.reorder_categories(['0', '1', '2', '3', '4',
                                                                                 '5', '6', '7', '8', '9',
                                                                                        '10', '11', '12', '13', '14',
                                                                                        'Not Set',
                                                                                       ])
redir_live_urls = redir_live_urls.loc[redir_live_urls.host == website]
del redir_live_urls['host']
print(redir_live_urls.shape)
Redir_live_urls

(4055, 6)
Dades de SitebulbAndreas Voniatis, novembre de 2021

En filtrar les files per als URL indexables i seleccionar les columnes rellevants, ara tenim un marc de dades més simplificat (penseu a la versió Pandas d’una pestanya de full de càlcul).

Explorant la distribució d’enllaços interns

Ara estem preparats per a les dades i tenir una idea de com enllaços interns es distribueixen globalment i per profunditat del lloc.

from plotnine import *
import matplotlib.pyplot as plt
pd.set_option('display.max_colwidth', None)
%matplotlib inline

# Distribution of internal links to URL by site level
ove_intlink_dist_plt = (ggplot(redir_live_urls, aes(x = 'no_internal_links_to_url')) + 
                    geom_histogram(fill="blue", alpha = 0.6, bins = 7) +
                    labs(y = '# Internal Links to URL') + 
                    theme_classic() +            
                    theme(legend_position = 'none')
                   )

ove_intlink_dist_plt
Enllaços interns a l'URL vs No hi ha enllaços interns a l'URLAndreas Voniatis, novembre de 2021

A partir de l’anterior podem veure de manera aclaparadora que la majoria de pàgines no tenen enllaços, per la qual cosa millorar l’enllaç intern seria una oportunitat important per millorar el SEO aquí.

Obtenim algunes estadístiques a nivell de lloc.

Anunci

Continueu llegint a continuació

crawl_depth
0             1
1            70
10            5
11            1
12            1
13            2
14            1
2           303
3           378
4           347
5           253
6           194
7            96
8            33
9            19
Not Set    2351
dtype: int64

La taula anterior mostra la distribució aproximada dels enllaços interns per nivell de lloc, incloent la mitjana (mitjana) i la mediana (50% quantil).

Això és juntament amb la variació dins del nivell del lloc (std per a la desviació estàndard), que ens indica a quina distància de la mitjana es troben les pàgines dins del nivell del lloc; és a dir, com de coherent és la distribució de l’enllaç intern amb la mitjana.

A partir de l’anterior, podem suposar que la mitjana per nivell de lloc, amb l’excepció de la pàgina d’inici (profunditat de rastreig 0) i les pàgines de primer nivell (profunditat de rastreig 1), oscil·la entre 0 i 4 per URL.

Per a un enfocament més visual:

# Distribution of internal links to URL by site level
intlink_dist_plt = (ggplot(redir_live_urls, aes(x = 'crawl_depth', y = 'no_internal_links_to_url')) + 
                    geom_boxplot(fill="blue", alpha = 0.8) +
                    labs(y = '# Internal Links to URL', x = 'Site Level') + 
                    theme_classic() +            
                    theme(legend_position = 'none')
                   )

intlink_dist_plt.save(filename="images/1_intlink_dist_plt.png", height=5, width=5, units="in", dpi=1000)
intlink_dist_plt
Enllaços interns a URL vs enllaços a nivell de llocAndreas Voniatis, novembre de 2021

La trama anterior confirma els nostres comentaris anteriors que la pàgina d’inici i les pàgines directament enllaçades des d’ella reben la part del lleó dels enllaços.

Anunci

Continueu llegint a continuació

Amb les escales tal com són, no tenim gaire visió de la distribució dels nivells inferiors. Modificarem això prenent un logaritme de l’eix y:

# Distribution of internal links to URL by site level
from mizani.formatters import comma_format

intlink_dist_plt = (ggplot(redir_live_urls, aes(x = 'crawl_depth', y = 'no_internal_links_to_url')) + 
                    geom_boxplot(fill="blue", alpha = 0.8) +
                    labs(y = '# Internal Links to URL', x = 'Site Level') + 
                    scale_y_log10(labels = comma_format()) + 
                    theme_classic() +            
                    theme(legend_position = 'none')
                   )

intlink_dist_plt.save(filename="images/1_log_intlink_dist_plt.png", height=5, width=5, units="in", dpi=1000)
intlink_dist_plt
Enllaços interns a URL vs enllaços a nivell de llocAndreas Voniatis, novembre de 2021

L’anterior mostra la mateixa distribució dels enllaços amb la visió logarítmica, que ens ajuda a confirmar les mitjanes de distribució dels nivells inferiors. Això és molt més fàcil de visualitzar.

Atesa la disparitat entre els dos primers nivells de lloc i el lloc restant, això és indicatiu d’una distribució esbiaixada.

Anunci

Continueu llegint a continuació

Com a resultat, prendré un logaritme dels enllaços interns, que ajudarà a normalitzar la distribució.

Ara tenim el nombre normalitzat d’enllaços, que visualitzarem:

# Distribution of internal links to URL by site level
intlink_dist_plt = (ggplot(redir_live_urls, aes(x = 'crawl_depth', y = 'log_intlinks')) + 
                    geom_boxplot(fill="blue", alpha = 0.8) +
                    labs(y = '# Log Internal Links to URL', x = 'Site Level') + 
                    #scale_y_log10(labels = comma_format()) + 
                    theme_classic() +            
                    theme(legend_position = 'none')
                   )

intlink_dist_plt
Registre els enllaços interns a l'URL i els enllaços a nivell de llocAndreas Voniatis, novembre de 2021

A partir de l’anterior, la distribució sembla molt menys esbiaixada, ja que les caixes (ranges interquartils) tenen un canvi de pas més gradual des del nivell del lloc al nivell del lloc.

Això ens prepara molt bé per analitzar les dades abans de diagnosticar quins URL estan poc optimitzats des del punt de vista dels enllaços interns.

Anunci

Continueu llegint a continuació

Quantificació dels problemes

El codi següent calcularà el quantil 35 inferior (terme de ciència de dades per percentil) per a cada profunditat del lloc.

# internal links in under/over indexing at site level
# count of URLs under indexed for internal link counts

quantiled_intlinks = redir_live_urls.groupby('crawl_depth').agg({'log_intlinks': 
                                                                 [quantile_lower]}).reset_index()
quantiled_intlinks = quantiled_intlinks.rename(columns = {'crawl_depth_': 'crawl_depth', 
                                                          'log_intlinks_quantile_lower': 'sd_intlink_lowqua'})
quantiled_intlinks
Profunditat de rastreig i enllaços internsAndreas Voniatis, novembre de 2021

L’anterior mostra els càlculs. Els números no tenen sentit per a un professional de SEO en aquesta etapa, ja que són arbitraris i tenen el propòsit de proporcionar un tall per als URL subenllaçats a cada nivell de lloc.

Ara que tenim la taula, les combinarem amb el conjunt de dades principal per determinar si l’URL fila per fila està subenllaçada o no.

Anunci

Continueu llegint a continuació

# join quantiles to main df and then count
redir_live_urls_underidx = redir_live_urls.merge(quantiled_intlinks, on = 'crawl_depth', how = 'left')

redir_live_urls_underidx['sd_int_uidx'] = redir_live_urls_underidx.apply(sd_intlinkscount_underover, axis=1)
redir_live_urls_underidx['sd_int_uidx'] = np.where(redir_live_urls_underidx['crawl_depth'] == 'Not Set', 1,
                                                   redir_live_urls_underidx['sd_int_uidx'])

redir_live_urls_underidx

Ara tenim un marc de dades amb cada URL marcat com a enllaç inferior sota la columna ”sd_int_uidx’ com a 1.

Això ens posa en condicions de sumar la quantitat de pàgines del lloc amb enllaços inferiors per profunditat del lloc:

# Summarise int_udx by site level
intlinks_agged = redir_live_urls_underidx.groupby('crawl_depth').agg({'sd_int_uidx': ['sum', 'count']}).reset_index()
intlinks_agged = intlinks_agged.rename(columns = {'crawl_depth_': 'crawl_depth'})
intlinks_agged['sd_uidx_prop'] = intlinks_agged.sd_int_uidx_sum / intlinks_agged.sd_int_uidx_count * 100
print(intlinks_agged)

  crawl_depth  sd_int_uidx_sum  sd_int_uidx_count  sd_uidx_prop
0            0                0                  1      0.000000
1            1               41                 70     58.571429
2            2               66                303     21.782178
3            3              110                378     29.100529
4            4              109                347     31.412104
5            5               68                253     26.877470
6            6               63                194     32.474227
7            7                9                 96      9.375000
8            8                6                 33     18.181818
9            9                6                 19     31.578947
10          10                0                  5      0.000000
11          11                0                  1      0.000000
12          12                0                  1      0.000000
13          13                0                  2      0.000000
14          14                0                  1      0.000000
15     Not Set             2351               2351    100.000000

Ara veiem que, malgrat que la pàgina de profunditat del lloc 1 té un nombre d’enllaços per URL superior a la mitjana, encara hi ha 41 pàgines que estan subenllaçades.

Per ser més visual:

# plot the table
depth_uidx_plt = (ggplot(intlinks_agged, aes(x = 'crawl_depth', y = 'sd_int_uidx_sum')) + 
                    geom_bar(stat="identity", fill="blue", alpha = 0.8) +
                    labs(y = '# Under Linked URLs', x = 'Site Level') + 
                    scale_y_log10() + 
                    theme_classic() +            
                    theme(legend_position = 'none')
                   )

depth_uidx_plt.save(filename="images/1_depth_uidx_plt.png", height=5, width=5, units="in", dpi=1000)
depth_uidx_plt
A URL enllaçats versus nivell de llocAndreas Voniatis, novembre de 2021

Amb l’excepció de la Mapa del lloc XML URL, la distribució dels URL subenllaçats sembla normal tal com indica la forma de campana propera. La majoria dels URL subenllaçats es troben als nivells 3 i 4 del lloc.

Anunci

Continueu llegint a continuació

Exportació de la llista d’URL subenllaçats

Ara que tenim un control dels URL subenllaçats per nivell de lloc, podem exportar les dades i proposar solucions creatives per salvar els buits en profunditat del lloc, tal com es mostra a continuació.

# data dump of under performing backlinks
underlinked_urls = redir_live_urls_underidx.loc[redir_live_urls_underidx.sd_int_uidx == 1]
underlinked_urls = underlinked_urls.sort_values(['crawl_depth', 'no_internal_links_to_url'])
underlinked_urls.to_csv('exports/underlinked_urls.csv')
underlinked_urls
Dades de SitebulbAndreas Voniatis, novembre de 2021

Altres tècniques de ciència de dades per a l’enllaç intern

Vam cobrir breument la motivació per millorar els enllaços interns d’un lloc abans d’explorar com es distribueixen els enllaços interns al lloc per nivell de lloc.

Anunci

Continueu llegint a continuació

A continuació, vam procedir a quantificar l’abast del problema de subenllaç tant numèrica com visualment abans d’exportar els resultats per a recomanacions.

Naturalment, el nivell de lloc és només un aspecte dels enllaços interns que es poden explorar i analitzar estadísticament.

Altres aspectes que podrien aplicar tècniques de ciència de dades als enllaços interns inclouen i òbviament no es limiten a:

  • Autoritat a nivell de pàgina fora del lloc.
  • Rellevància del text d’ancoratge.
  • Intenció de cerca.
  • Cerca el recorregut de l’usuari.

Quins aspectes t’agradaria que es cobrissin?

Si us plau, deixeu un comentari a continuació.

Més recursos:

Anunci

Continueu llegint a continuació


Imatge destacada: Shutterstock/Optimarc





Source link

Un enfocament de ciència de dades per optimitzar l’estructura d’enllaços interns