探索的データ分析
このドキュメントでは、Data Distillerを使用して Python ノートブックのデータを調査および分析するための基本的な例とベストプラクティスを説明します。
はじめに
このガイドを進める前に、Python ノートブックにデータDistillerへの接続が作成されていることを確認します。 ノートブックをデータDistillerに接続する手順については Python ドキュメントを参照してください。
基本統計の取得 basic-statistics
データセット内の行数と個別プロファイル数を取得するには、以下のコードを使用します。
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
出力例
大規模なデータセットのサンプルバージョンの作成 create-dataset-sample
クエリするデータセットが非常に大きい場合、または探索的なクエリによる正確な結果が必要でない場合は、データDistillerのクエリで使用できる サンプリング機能を使用します。 これは 2 段階のプロセスです。
- まず、データセットを 分析 して、指定したサンプリング率のサンプルバージョンを作成します
- 次に、データセットのサンプルバージョンをクエリします。 サンプリングされたデータセットに適用する関数に応じて、出力を数値にスケーリングして、データセット全体に対応することができます
5% サンプルの作成 create-sample
次の例では、データセットを分析して 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")
サンプルを表示 view-sample
sample_meta
関数を使用して、特定のデータセットから作成されたサンプルを表示できます。 以下のコードスニペットに、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
サンプル出力:
サンプルのクエリ query-sample-data
返されたメタデータからサンプルテーブル名を参照することで、サンプルを直接クエリできます。 その後、結果にサンプリング率を掛けて推定値を求めることができます。
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")
出力例
Approximate count: 1284600.0 using 5.0% sample
メールファネル分析 email-funnel-analysis
ファネル分析は、ターゲット結果に到達するために必要な手順と、それらの各手順を完了するユーザー数を理解する方法です。 次の例は、ニュースレターの購読ユーザーに向けた手順の簡単なファネル分析を示しています。 購読の結果は、web.formFilledOut
のイベントタイプで表されます。
最初に、クエリを実行して、各ステップのユーザー数を取得します。
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
出力例
クエリー結果を印刷 plot-results
次に、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()
出力例
イベントの相関関係 event-correlations
もう 1 つの一般的な分析は、イベントタイプとターゲットコンバージョンイベントタイプの間の相関関係を計算することです。 この例では、購読イベントは web.formFilledOut
で表されます。 この例では、データDistillerクエリで使用できる Spark の関数を使用して、次の手順を実行します。
- プロファイル別に、各イベントタイプのイベント数をカウントします。
- プロファイル全体で各イベントタイプのカウントを集計し、各イベントタイプと
web,formFilledOut
の相関関係を計算します。 - カウントと相関関係のデータフレームを、各フィーチャー(イベントタイプのカウント)のピアソン相関係数とターゲットイベントのテーブルに変換します。
- 結果をプロットで視覚化します。
Spark 関数は、データを集計して結果の小さなテーブルを返すので、このタイプのクエリをデータセット全体に対して実行できます。
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
サンプル出力:
行をイベントタイプの相関関係に変換 event-type-correlation
次に、上記のクエリ出力のデータの単一行を、各イベントタイプとターゲットの購読イベントの相関関係を示すテーブルに変換します。
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)
サンプル出力:
webForms_EmailOpens
webForms_advertisingClicks
webForms_productViews
webForms_productPurchases
webForms_propositionDismisses
webForms_propositionInteracts
webForms_emailClicks
webForms_emailOpens
webForms_emailSends
webForms_webLinkClicks
webForms_webPageViews
最後に、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")
次の手順
このドキュメントでは、Data Distillerを使用して Python ノートブックのデータを調査および分析する方法について説明しました。 Experience Platformから機能パイプラインを作成し、機械学習環境でカスタムモデルをフィードする次の手順は、 機械学習用の機能をエンジニアリングすることです。