La détermination des rôles de nos contacts
Adobe Stock
  • Gaëtan Evain
Temps de lecture estimé : 5 à 9 minutes

Article 7. Cet article explore deux méthodes efficaces pour caractériser les rôles de vos contacts LinkedIn en utilisant des données préalablement nettoyées.

Il s'agit ici d'identifier les fonctions occupées par les différents contacts dans notre base de données. Pour ce faire, deux méthodes ont été employées :

  • Méthode 1 - Récupérer les fonctions déjà définies dans d'autres bases de données,
  • Méthode 2  - Définir arbitrairement des rôles en utilisant des expressions régulières pour établir des règles d'attribution.

Je vous encourage également à consulter l'article sur la mise en place d'un environnement de travail ; il vous aidera à mieux comprendre quelles technologies ont été utilisées pour développer ces applications.

Récupération des rôles déjà définis

La première étape consiste à importer nos données nettoyées.

DIR = '/content/gdrive/MyDrive/projetlinkedin/Data'
file = os.path.join(f'{DIR}/DataTraitées/Connections_nettoyées.csv')
df_connections = pd.read_csv(file)
file = os.path.join(f'{DIR}/CarnetsAdresses/Rôle_par_organisations.csv')
df_RolesParOrganisations = pd.read_csv(file)

Fonction regex_mapper

def regex_mapper(df_a_actualiser, df_de_reference, col1, col2):
    df_a_actualiser[col2] = pd.Series(dtype=df_de_reference[col2].dtype)
    for _, row in df_de_reference.iterrows():
        regex_pattern = str(row[col1]).lower()
        match_value = row[col2]
        mask = df_a_actualiser[col1].astype(str).str.lower().str.contains(regex_pattern, regex=True, na=False)
        df_a_actualiser.loc[mask, col2] = match_value
    return df_a_actualiser

Cette fonction met à jour un DataFrame (df_a_actualiser) en utilisant un autre DataFrame de référence (df_de_reference) basé sur des correspondances de motifs regex. Pour cela, elle :

  • Initialise la colonne : crée une nouvelle colonne dans df_a_actualiser avec le même type de données que celle dans df_de_reference.
  • Boucle sur df_de_reference : pour chaque ligne de df_de_reference, crée un motif regex  à partir d'une colonne et récupère la valeur correspondante de mise à jour.
  • Crée un masque en vérifiant si les valeurs de df_a_actualiser contiennent le motif regex.
  • Met à jour les valeurs : utilise le masque pour mettre à jour les valeurs dans df_a_actualiser avec la valeur correspondante de df_de_reference.
  • Retourne le DataFrame mis à jour : retourne df_a_actualiser après toutes les mises à jour.

Application de la fonction regex_mapper

df_a_actualiser = df_ConnectionContact
df_de_reference = df_RoleParOrganisation
col1 = 'Organisation'
col2 = 'Rôles'
df_FullContacts = regex_mapper(df_a_actualiser, df_de_reference, col1, col2)

Déterminer des nouveaux rôles

Fonction attribuer_role

La fonction attribuer_role attribue un rôle basé sur des expressions régulières définies. Cela offre une flexibilité pour identifier et classer diverses fonctions professionnelles.

Définition des rôles
regles = {
    r'juriste|avocat': 'Juriste',
    r'web|veloppeur|full stack|veloper|logiciel': 'Développeur',
    r'consultant': 'Consultant',
    r'commer|vente|busin|achat|ache|aff|compt': 'Commercial',
    r'cyber|syst|inform' : 'Consultants système et cybersécurité',
    r'digi|mark' : 'Consultant Digital',
    r'coach':'coach',
    r'finan|compta|banq|patri': 'Conseiller financier',
    r'rh|recrut' : 'Recruteur',
    # Ajoutez d'autres règles selon vos besoins
}

Intégrer les rôles dans la fonction
def attribuer_role(row, regles):
    if pd.notna(row['Rôles']) and row['Rôles'] != 'Autre':
        return row['Rôles']
    for regex, role in regles.items():
        if re.search(regex, row['Position_Trad'], re.IGNORECASE):
            return role
    return 'Autre'

Elle attribue un rôle à chaque ligne d'un DataFrame (Row) en fonction de règles régulières prédéfinies (Règle).

Pour cela, elle retourne la valeur de la cellule si celle-ci n'est pas nulle et différente de 'autre'.

Elle itère également sur le dictionnaire de règles établi plus tôt et attribue à chaque valeur du DataFrame le rôle de l'expression régulière correspondante. Elle utilise re.search pour chercher l'expression régulière dans la colonne 'Position_Trad' de manière insensible à la casse (re.IGNORECASE).

Si une correspondance est trouvée, elle retourne le rôle associé.

Si aucune correspondance n'est trouvée après l'application des règles, le rôle 'Autre' est attribué par défaut.

Application de la fonction

df_FullContacts['Rôles'] = df_FullContacts.apply(lambda row: attribuer_role(row, regles), axis=1)

Je vous propose une explication terme à terme de la ligne de code.

  • df_FullContacts['Rôles'] : cible la colonne Rôles dans la DataFrame..
  • .apply() : applique une fonction le long de l'axe des lignes (axis=1) de la DataFrame df_FullContacts.
  • lambda row : définit une fonction anonyme (lambda) qui prend une ligne (row) comme argument et appelle la fonction attribuer_role, en lui passant cette ligne et un ensemble prédéfini de règles (regles).
  • attribuer_role(row, regles) : fonction qui analyse une ligne donnée et détermine le rôle basé sur les règles spécifiées.
  • axis=1 : indique que l'opération doit être appliquée sur les lignes plutôt que sur les colonnes.

Exploitation des résultats

Une fois nos résultats obtenus, il s'agit maintenant de les rendre lisibles afin que nous puissions les exploiter.

Représentation des résultats sous forme de tableau

df_role_count = df_FullContacts.groupby('Rôles', dropna=False)['URL'].nunique().sort_values(ascending = False)
df_role_count = df_role_count.reset_index().rename(columns={'URL':'Count'})

Ce petit morceau de code nous permet de trier les résultats. Avec la fonction groupby, nous comptons les URL uniques à l'aide de ['URL'].nunique() et les regroupons par ‘rôles’, en supprimant les valeurs nulles (dropna=False). Ensuite, nous les trions par ordre décroissant avec sort_values(ascending=False).

La deuxième ligne nous permet de réinitialiser la colonne index du tableau  et de renommer la colonne URL.

Le tableau final obtenu est le suivant :

Détermination des rôles

Représentation graphique du résultats

plt.figure(figsize=(10, 8))
colormap = matplotlib.colormaps['viridis']
colors = colormap(np.linspace(0, 1, len(df_role_count['Rôles'])))
plt.bar(df_role_count['Rôles'], df_role_count['Count'], color=colors)
plt.title('Répartition des quantités par catégorie')
plt.xlabel('Rôles')
plt.ylabel('Quantités')
plt.xticks(rotation=90)  
plt.tight_layout()
plt.show()

Nous définissons d'abord la taille du graphique plt.figure(figsize=(10, 8))

Avant de commencer, il est nécessaire de choisir une palette de couleurs appropriée. Ici, nous utilisons viridis, une colormap fournie par Matplotlib. Viridis est l'une des nombreuses colormaps disponibles dans Matplotlib. Elle offre une gamme de couleurs allant du bleu au jaune, reconnue pour sa perceptibilité et son esthétique.

Nous utilisons np.linspace pour attribuer à chaque barre du graphique une teinte distincte, correspondant à une catégorie unique de notre ensemble de données.

Avec ces couleurs et les données disponibles, le code génère un graphique en barres.

Après avoir tracé les barres, le code ajoute des éléments essentiels pour rendre le graphique plus informatif et lisible : un titre au graphique, les noms des axes, et fait pivoter les étiquettes de l'axe des x de 90 degrés pour une meilleure lisibilité.

Enfin, le graphique est affiché en ajustant la disposition pour éviter tout chevauchement :

Répartition des quantités par catégorie

 

En conclusion

Cet article a exploré deux méthodes efficaces pour caractériser les rôles des contacts LinkedIn, en utilisant des données préalablement nettoyées. La première méthode consiste à récupérer les fonctions déjà définies dans d'autres bases de données, tandis que la seconde définit arbitrairement des rôles en utilisant des expressions régulières pour établir des règles d'attribution.

Nous avons présenté la fonction regex_mapper, qui joue un rôle crucial dans la mise à jour des rôles des contacts en utilisant des expressions régulières pour faire correspondre et actualiser les informations basées sur une base de données de référence. De plus, la fonction attribuer_role permet une classification cohérente et automatisée des fonctions en attribuant des rôles basés sur des expressions régulières prédéfinies.

L'analyse des données a révélé qu'il reste encore de nombreux rôles à catégoriser malgré les filtres utilisés. Des rôles tels que "dirigeant" ou "fondateur" peuvent être catégorisés en tentant de déduire leur catégorie à travers les champs professionnels des entreprises associées.

En fin de compte, la caractérisation des contacts LinkedIn est une tâche continue qui nécessite une approche flexible et itérative. En utilisant les méthodes présentées dans cet article, les professionnels peuvent mieux comprendre la composition de leur réseau et optimiser leurs interactions pour atteindre leurs objectifs professionnels.

Gaëtan EVAIN
Gaëtan EVAIN
Stagiaire chez Isitix en hiver 2024. Engagé dans une reconversion professionnelle en BTS SIO option SLAM grâce au GRETA. Sur LinkedIn