Mendeteksi anomali data


Dokumen ini menjelaskan cara menggunakan Dataplex Explore untuk mendeteksi anomali dalam set data transaksi retail.

Workbench eksplorasi data, atau Jelajahi, memungkinkan analis data membuat kueri dan menjelajahi set data besar secara interaktif dalam waktu nyata. Jelajahi membantu Anda mendapatkan insight dari data, dan memungkinkan Anda membuat kueri data yang disimpan di Cloud Storage dan BigQuery. Jelajahi penggunaan platform Spark tanpa server, sehingga Anda tidak perlu mengelola dan menskalakan infrastruktur yang mendasarinya.

Tujuan

Tutorial ini menunjukkan kepada Anda cara menyelesaikan tugas-tugas berikut:

  • Gunakan workbench Spark SQL Jelajah untuk menulis dan menjalankan kueri Spark SQL.
  • Gunakan notebook JupyterLab untuk melihat hasilnya.
  • Jadwalkan notebook untuk eksekusi berulang, sehingga Anda dapat memantau anomali data.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  9. Make sure that billing is enabled for your Google Cloud project.

Menyiapkan data untuk eksplorasi

  1. Download file Parquet, retail_offline_sales_march.

    Mendownload file Parquet

  2. Buat bucket Cloud Storage bernama offlinesales_curated sebagai berikut:

    1. In the Google Cloud console, go to the Cloud Storage Buckets page.

      Go to Buckets page

    2. Click Create bucket.
    3. On the Create a bucket page, enter your bucket information. To go to the next step, click Continue.
      • For Name your bucket, enter a name that meets the bucket naming requirements.
      • For Choose where to store your data, do the following:
        • Select a Location type option.
        • Select a Location option.
      • For Choose a default storage class for your data, select a storage class.
      • For Choose how to control access to objects, select an Access control option.
      • For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
    4. Click Create.

  3. Upload file offlinesales_march_parquet yang Anda download ke bucket Cloud Storage offlinesales_curated yang Anda buat, dengan mengikuti langkah-langkah di Mengupload objek dari sistem file.

  4. Buat Dataplex lake dan beri nama operations, dengan mengikuti langkah-langkah di Membuat data lake.

  5. Di lake operations, tambahkan zona dan beri nama procurement, dengan mengikuti langkah-langkah di Menambahkan zona.

  6. Di zona procurement, tambahkan bucket Cloud Storage offlinesales_curated yang Anda buat sebagai aset, dengan mengikuti langkah-langkah di Menambahkan aset.

Pilih tabel yang akan dijelajahi

  1. Di konsol Google Cloud, buka halaman Jelajahi Dataplex.

  2. Di kolom Lake, pilih danau operations.

  3. Klik danau operations.

  4. Buka zona procurement dan klik tabel untuk menjelajahi metadatanya.

    Pada gambar berikut, zona pengadaan yang dipilih memiliki tabel bernama Offline, yang memiliki metadata: orderid, product, quantityordered, unitprice, orderdate, dan purchaseaddress.

    Pilih tabel untuk dijelajahi

  5. Di Spark SQL Editor, klik Add. Skrip Spark SQL akan muncul.

  6. Opsional: Buka skrip dalam tampilan tab terpisah untuk melihat metadata dan skrip baru secara berdampingan. Klik Lainnya di tab skrip baru, lalu pilih Pisahkan tab ke kanan atau Pisahkan tab ke kiri.

Menjelajahi data

Lingkungan menyediakan resource komputasi serverless untuk kueri dan notebook Spark SQL Anda agar dapat berjalan dalam data lake. Sebelum menulis kueri Spark SQL, buat lingkungan tempat menjalankan kueri.

Jelajahi data Anda menggunakan kueri SparkSQL berikut. Di SparkSQL Editor, masukkan kueri ke panel New Script.

Contoh 10 baris tabel

  1. Masukkan kueri berikut:

    select * from procurement.offlinesales where orderid != 'orderid' limit 10;
    
  2. Klik Run.

Mendapatkan jumlah total transaksi dalam set data

  1. Masukkan kueri berikut:

    select count(*) from procurement.offlinesales where orderid!='orderid';
    
  2. Klik Run.

Menemukan jumlah jenis produk yang berbeda dalam set data

  1. Masukkan kueri berikut:

    select count(distinct product) from procurement.offlinesales where orderid!='orderid';
    
  2. Klik Run.

Menemukan produk yang memiliki nilai transaksi besar

Pahami produk mana yang memiliki nilai transaksi besar dengan mengelompokkan penjualan berdasarkan jenis produk dan harga jual rata-rata.

  1. Masukkan kueri berikut:

    select product,avg(quantityordered * unitprice) as avg_sales_amount from procurement.offlinesales where orderid!='orderid' group by product order by avg_sales_amount desc;
    
  2. Klik Run.

Gambar berikut menampilkan panel Results yang menggunakan kolom bernama product untuk mengidentifikasi item penjualan dengan nilai transaksi besar, yang ditampilkan di kolom bernama avg_sales_amount.

Lihat hasil skrip.

Mendeteksi anomali menggunakan koefisien variasi

Kueri terakhir menunjukkan bahwa laptop memiliki jumlah transaksi rata-rata yang tinggi. Kueri berikut menunjukkan cara mendeteksi transaksi laptop yang tidak bersifat anomali dalam set data.

Kueri berikut menggunakan metrik "koefisien variasi", rsd_value, untuk menemukan transaksi yang tidak biasa, dengan penyebaran nilai yang rendah dibandingkan dengan nilai rata-rata. Koefisien variasi yang lebih rendah menunjukkan lebih sedikit anomali.

  1. Masukkan kueri berikut:

    WITH stats AS (
    SELECT product,
          AVG(quantityordered * unitprice)  AS avg_value,
          STDDEV(quantityordered * unitprice) / AVG(quantityordered * unitprice) AS rsd_value
    FROM procurement.offlinesales
    GROUP BY product)
    SELECT orderid, orderdate, product, (quantityordered * unitprice) as sales_amount,
        ABS(1 - (quantityordered * unitprice)/ avg_value) AS distance_from_avg
    FROM procurement.offlinesales INNER JOIN stats USING (product)
    WHERE rsd_value <= 0.2
    ORDER BY distance_from_avg DESC
    LIMIT 10
    
  2. Klik Run.

  3. Lihat hasil skrip.

    Pada gambar berikut, panel Hasil menggunakan kolom yang disebut produk untuk mengidentifikasi item penjualan dengan nilai transaksi yang berada dalam koefisien variasi 0,2.

    Lihat hasil skrip.

Memvisualisasikan anomali menggunakan notebook JupyterLab

Buat model ML untuk mendeteksi dan memvisualisasikan anomali dalam skala besar.

  1. Buat notebook.

  2. Buka notebook di tab terpisah dan tunggu hingga dimuat. Sesi tempat Anda menjalankan kueri Spark SQL akan berlanjut.

  3. Impor paket yang diperlukan dan hubungkan ke tabel eksternal BigQuery yang berisi data transaksi. Jalankan kode berikut:

    from google.cloud import bigquery
    from google.api_core.client_options import ClientOptions
    import os
    import warnings
    warnings.filterwarnings('ignore')
    import pandas as pd
    
    project = os.environ['GOOGLE_CLOUD_PROJECT']
    options = ClientOptions(quota_project_id=project)
    client = bigquery.Client(client_options=options)
    client = bigquery.Client()
    
    #Load data into DataFrame
    
    sql = '''select * from procurement.offlinesales limit 100;'''
    df = client.query(sql).to_dataframe()
    
  4. Jalankan algoritma isolation forest untuk menemukan anomali dalam set data:

    to_model_columns = df.columns[2:4]
    from sklearn.ensemble import IsolationForest
    clf=IsolationForest(n_estimators=100, max_samples='auto', contamination=float(.12), \
                            max_features=1.0, bootstrap=False, n_jobs=-1, random_state=42, verbose=0)
    clf.fit(df[to_model_columns])
    pred = clf.predict(df[to_model_columns])
    df['anomaly']=pred
    outliers=df.loc[df['anomaly']==-1]
    outlier_index=list(outliers.index)
    #print(outlier_index)
    #Find the number of anomalies and normal points here points classified -1 are anomalous
    print(df['anomaly'].value_counts())
    
  5. Buat plot anomali yang diprediksi menggunakan visualisasi Matplotlib:

    import numpy as np
    from sklearn.decomposition import PCA
    pca = PCA(2)
    pca.fit(df[to_model_columns])
    res=pd.DataFrame(pca.transform(df[to_model_columns]))
    Z = np.array(res)
    plt.title("IsolationForest")
    plt.contourf( Z, cmap=plt.cm.Blues_r)
    b1 = plt.scatter(res[0], res[1], c='green',
                    s=20,label="normal points")
    b1 =plt.scatter(res.iloc[outlier_index,0],res.iloc[outlier_index,1], c='green',s=20,  edgecolor="red",label="predicted outliers")
    plt.legend(loc="upper right")
    plt.show()
    

Gambar ini menampilkan data transaksi dengan anomali yang ditandai dengan warna merah.

Data transaksi dengan anomali ditandai dengan warna merah

Menjadwalkan notebook

Jelajahi memungkinkan Anda menjadwalkan notebook untuk dijalankan secara berkala. Ikuti langkah-langkah untuk menjadwalkan Jupyter Notebook yang Anda buat.

Dataplex membuat tugas penjadwalan untuk menjalankan notebook Anda secara berkala. Untuk memantau progres tugas, klik Lihat jadwal.

Membagikan atau mengekspor notebook

Jelajahi memungkinkan Anda berbagi notebook dengan orang lain di organisasi menggunakan izin IAM.

Tinjau peran. Berikan atau cabut peran Dataplex Viewer (roles/dataplex.viewer), Dataplex Editor (roles/dataplex.editor), dan Dataplex Administrator (roles/dataplex.admin) kepada pengguna untuk notebook ini. Setelah Anda membagikan notebook, pengguna dengan peran pelihat atau editor di tingkat danau dapat membuka danau dan mengerjakan notebook bersama.

Untuk membagikan atau mengekspor notebook, lihat Membagikan notebook atau Mengekspor notebook.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Menghapus resource satu per satu

  1. Hapus bucket:
    gcloud storage buckets delete BUCKET_NAME
  2. Hapus instance:
    gcloud compute instances delete INSTANCE_NAME

Langkah selanjutnya