Analyse exploratoire des données
Ce document fournit quelques exemples de base et bonnes pratiques pour utiliser Data Distiller afin d’explorer et d’analyser les données d’un notebook Python.
Prise en main
Avant de poursuivre avec ce guide, assurez-vous d’avoir établi une connexion à Data Distiller dans votre notebook Python. Consultez la documentation pour obtenir des instructions sur la connexion d’un notebook Python Distiller de données.
Acquisition des statistiques de base basic-statistics
Utilisez le code ci-dessous pour récupérer le nombre de lignes et de profils distincts dans un jeu de données.
table_name = 'ecommerce_events'
basic_statistics_query = f"""
SELECT
COUNT(_id) as "totalRows",
COUNT(DISTINCT _id) as "distinctUsers"
FROM {table_name}"""
df = qs_cursor.query(basic_statistics_query, output="dataframe")
df
Exemple de sortie
Créer une version échantillonnée de jeux de données volumineux create-dataset-sample
Si le jeu de données que vous souhaitez interroger est très volumineux ou si des résultats exacts de requêtes exploratoires ne sont pas nécessaires, utilisez la fonctionnalité d’échantillonnage disponible pour les requêtes de Distiller de données. Il s’agit d’un processus en deux étapes :
- Tout d’abord, analysez le jeu de données pour créer une version échantillonnée avec un taux d’échantillonnage spécifié
- Ensuite, interrogez la version échantillonnée du jeu de données. Selon les fonctions que vous appliquez au jeu de données échantillonné, vous pouvez mettre à l’échelle la sortie pour obtenir les nombres du jeu de données complet
Création d’un échantillon de 5 % create-sample
L’exemple ci-dessous analyse le jeu de données et crée un échantillon de 5 % :
# A sampling rate of 10 is 100% in Query Service, so for 5% use a sampling rate 0.5
sampling_rate = 0.5
analyze_table_query=f"""
SET aqp=true;
ANALYZE TABLE {table_name} TABLESAMPLE SAMPLERATE {sampling_rate}"""
qs_cursor.query(analyze_table_query, output="raw")
Afficher vos exemples view-sample
Vous pouvez utiliser la fonction sample_meta pour afficher tous les exemples qui ont été créés à partir d’un jeu de données donné. Le fragment de code ci-dessous montre comment utiliser la fonction sample_meta.
sampled_version_of_table_query = f'''SELECT sample_meta('{table_name}')'''
df_samples = qs_cursor.query(sampled_version_of_table_query, output="dataframe")
df_samples
Exemple de sortie :
Interroger votre exemple query-sample-data
Vous pouvez interroger directement votre échantillon en référençant le nom de la table d’échantillons à partir des métadonnées renvoyées. Vous pouvez ensuite multiplier les résultats par le taux d’échantillonnage pour obtenir une estimation.
sample_table_name = df_samples[df_samples["sampling_rate"] == sampling_rate]["sample_table_name"].iloc[0]
count_query=f'''SELECT count(*) as cnt from {sample_table_name}'''
df = qs_cursor.query(count_query, output="dataframe")
# Divide by the sampling rate to extrapolate to the full dataset
approx_count = df["cnt"].iloc[0] / (sampling_rate / 100)
print(f"Approximate count: {approx_count} using {sampling_rate *10}% sample")
Exemple de sortie
Approximate count: 1284600.0 using 5.0% sample
Analyse du funnel des emails email-funnel-analysis
L’analyse funnel est une méthode permettant de comprendre les étapes nécessaires pour atteindre un résultat cible et le nombre d’utilisateurs et d’utilisatrices qui passent par chacune de ces étapes. L’exemple ci-dessous illustre une analyse funnel simple des étapes menant à l’abonnement d’un utilisateur ou d’une utilisatrice à une newsletter. Le résultat de l’abonnement est représenté par un type d’événement de web.formFilledOut.
Tout d’abord, exécutez une requête pour obtenir le nombre d’utilisateurs à chaque étape.
simple_funnel_analysis_query = f'''SELECT eventType, COUNT(DISTINCT _id) as "distinctUsers",COUNT(_id) as "distinctEvents" FROM {table_name} GROUP BY eventType ORDER BY distinctUsers DESC'''
funnel_df = qs_cursor.query(simple_funnel_analysis_query, output="dataframe")
funnel_df
Exemple de sortie
Tracer les résultats de la requête plot-results
Ensuite, tracez les résultats de la requête à l’aide de la bibliothèque Python plotly :
import plotly.express as px
email_funnel_events = ["directMarketing.emailSent", "directMarketing.emailOpened", "directMarketing.emailClicked", "web.formFilledOut"]
email_funnel_df = funnel_df[funnel_df["eventType"].isin(email_funnel_events)]
fig = px.funnel(email_funnel_df, y='eventType', x='distinctUsers')
fig.show()
Exemple de sortie
Corrélations des événements event-correlations
Une autre analyse courante consiste à calculer les corrélations entre les types d’événements et un type d’événement de conversion cible. Dans cet exemple, l’événement d’abonnement est représenté par web.formFilledOut. Cet exemple utilise les fonctions Spark disponibles dans les requêtes de Distiller de données pour réaliser les étapes suivantes :
- Comptez le nombre d’événements pour chaque type d’événement par profil.
- Agrégez les nombres de chaque type d’événement sur plusieurs profils et calculez les corrélations de chaque type d’événement avec
web,formFilledOut. - Transformer le cadre de données des décomptes et des corrélations en un tableau des coefficients de corrélation Pearson de chaque caractéristique (décomptes de type événement) avec l’événement cible.
- Visualisez les résultats dans un graphique.
Les fonctions Spark agrégent les données pour renvoyer une petite table de résultats. Vous pouvez donc exécuter ce type de requête sur le jeu de données complet.
large_correlation_query=f'''
SELECT SUM(webFormsFilled) as webFormsFilled_totalUsers,
SUM(advertisingClicks) as advertisingClicks_totalUsers,
SUM(productViews) as productViews_totalUsers,
SUM(productPurchases) as productPurchases_totalUsers,
SUM(propositionDismisses) as propositionDismisses_totaUsers,
SUM(propositionDisplays) as propositionDisplays_totaUsers,
SUM(propositionInteracts) as propositionInteracts_totalUsers,
SUM(emailClicks) as emailClicks_totalUsers,
SUM(emailOpens) as emailOpens_totalUsers,
SUM(webLinkClicks) as webLinksClicks_totalUsers,
SUM(webPageViews) as webPageViews_totalusers,
corr(webFormsFilled, emailOpens) as webForms_EmailOpens,
corr(webFormsFilled, advertisingClicks) as webForms_advertisingClicks,
corr(webFormsFilled, productViews) as webForms_productViews,
corr(webFormsFilled, productPurchases) as webForms_productPurchases,
corr(webFormsFilled, propositionDismisses) as webForms_propositionDismisses,
corr(webFormsFilled, propositionInteracts) as webForms_propositionInteracts,
corr(webFormsFilled, emailClicks) as webForms_emailClicks,
corr(webFormsFilled, emailOpens) as webForms_emailOpens,
corr(webFormsFilled, emailSends) as webForms_emailSends,
corr(webFormsFilled, webLinkClicks) as webForms_webLinkClicks,
corr(webFormsFilled, webPageViews) as webForms_webPageViews
FROM(
SELECT _{tenant_id}.cmle_id as userID,
SUM(CASE WHEN eventType='web.formFilledOut' THEN 1 ELSE 0 END) as webFormsFilled,
SUM(CASE WHEN eventType='advertising.clicks' THEN 1 ELSE 0 END) as advertisingClicks,
SUM(CASE WHEN eventType='commerce.productViews' THEN 1 ELSE 0 END) as productViews,
SUM(CASE WHEN eventType='commerce.productPurchases' THEN 1 ELSE 0 END) as productPurchases,
SUM(CASE WHEN eventType='decisioning.propositionDismiss' THEN 1 ELSE 0 END) as propositionDismisses,
SUM(CASE WHEN eventType='decisioning.propositionDisplay' THEN 1 ELSE 0 END) as propositionDisplays,
SUM(CASE WHEN eventType='decisioning.propositionInteract' THEN 1 ELSE 0 END) as propositionInteracts,
SUM(CASE WHEN eventType='directMarketing.emailClicked' THEN 1 ELSE 0 END) as emailClicks,
SUM(CASE WHEN eventType='directMarketing.emailOpened' THEN 1 ELSE 0 END) as emailOpens,
SUM(CASE WHEN eventType='directMarketing.emailSent' THEN 1 ELSE 0 END) as emailSends,
SUM(CASE WHEN eventType='web.webinteraction.linkClicks' THEN 1 ELSE 0 END) as webLinkClicks,
SUM(CASE WHEN eventType='web.webinteraction.pageViews' THEN 1 ELSE 0 END) as webPageViews
FROM {table_name}
GROUP BY userId
)
'''
large_correlation_df = qs_cursor.query(large_correlation_query, output="dataframe")
large_correlation_df
Exemple de sortie :
Transformer la ligne en corrélation de type d’événement event-type-correlation
Transformez ensuite la seule ligne de données de la sortie de la requête ci-dessus en un tableau présentant les corrélations de chaque type d’événement avec l’événement d’abonnement cible :
cols = large_correlation_df.columns
corrdf = large_correlation_df[[col for col in cols if ("webForms_" in col)]].melt()
corrdf["feature"] = corrdf["variable"].apply(lambda x: x.replace("webForms_", ""))
corrdf["pearsonCorrelation"] = corrdf["value"]
corrdf.fillna(0)
Exemple de sortie :
webForms_EmailOpenswebForms_advertisingClickswebForms_productViewswebForms_productPurchaseswebForms_propositionDismisseswebForms_propositionInteractswebForms_emailClickswebForms_emailOpenswebForms_emailSendswebForms_webLinkClickswebForms_webPageViewsEnfin, vous pouvez visualiser les corrélations avec la bibliothèque matplotlib Python :
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5,10))
sns.barplot(data=corrdf.fillna(0), y="feature", x="pearsonCorrelation")
ax.set_title("Pearson Correlation of Events with the outcome event")
Étapes suivantes
En lisant ce document, vous avez appris à utiliser Data Distiller pour explorer et analyser les données d’un notebook Python. L’étape suivante de la création de pipelines de fonctionnalités à partir d’Experience Platform pour alimenter des modèles personnalisés dans votre environnement de machine learning consiste à concevoir des fonctionnalités pour le machine learning.