Lewati ke konten utama

Memahami Skewness dan Kurtosis serta Cara Memvisualisasikannya

Panduan visual komprehensif tentang skewness/kurtosis dan bagaimana keduanya memengaruhi distribusi dan pada akhirnya, proyek data science Anda.
Diperbarui 5 Jun 2026  · 10 mnt baca

Setelah mengumpulkan data dan menghabiskan waktu berjam-jam untuk membersihkannya, Anda akhirnya bisa mulai mengeksplorasi! Tahap ini, yang sering disebut Exploratory Data Analysis (EDA), mungkin merupakan langkah terpenting dalam sebuah proyek data. Wawasan yang diperoleh dari EDA akan memengaruhi semua hal berikutnya.

Sebagai contoh, salah satu langkah wajib dalam EDA adalah memeriksa bentuk distribusi. Mengidentifikasi bentuk dengan benar akan memengaruhi banyak keputusan selanjutnya dalam proyek, seperti:

  • Langkah prapemrosesan lanjutan
  • Apakah perlu melakukan deteksi outlier dan mungkin, penghapusan
  • Transformasi fitur atau langkah penskalaan
  • Seleksi fitur
  • Pemilihan algoritma

dan seterusnya. Meskipun ada visual untuk membantu tugas ini, Anda memerlukan metrik yang lebih andal untuk mengkuantifikasi berbagai karakteristik distribusi. Dua metrik tersebut adalah skewness dan kurtosis. Keduanya dapat digunakan untuk menilai seberapa mirip distribusi Anda dengan distribusi normal yang sempurna.

Dengan menuntaskan artikel ini, Anda akan mempelajari secara rinci:

  • Apa itu skewness dan kurtosis
  • Jenis-jenis skewness dan kurtosis
  • Dampak skewness dan kurtosis pada model machine learning
  • Menghitung skewness dan kurtosis di Python secara manual dan dengan paket pihak ketiga
  • Memvisualisasikan distribusi untuk memverifikasi skor skewness dan kurtosis (bagian yang komprehensif dan menyenangkan)

Mari kita mulai!

Apa itu Skewness?

Kita melihat distribusi normal di mana-mana: pengukuran tubuh manusia, bobot objek, skor IQ, hasil tes, bahkan di gym:

Gambar mesin beban di gym. Lubang pin pada beban secara keseluruhan membentuk bentuk distribusi normal karena penggunaan berlebihan dalam waktu lama.

Sumber

Selain menjadi distribusi favorit alam, distribusi ini juga disukai hampir semua algoritma machine learning. Ada yang membutuhkannya untuk meningkatkan dan menstabilkan performa, ada juga yang enggan bekerja dengan baik pada apa pun selain distribusi normal (ya, model linear, ini tentang Anda).

Jadi, untuk memenuhi kebutuhan algoritme akan kenormalan, kita memerlukan cara untuk mengukur seberapa mirip (atau tidak mirip) distribusi kita dibandingkan kurva lonceng yang sempurna.

Kurva lonceng sempurna dari distribusi normal.

Mari mulai dari ekornya. Pada distribusi normal yang sempurna, kedua ekornya sama panjang. Namun, ketika ada ketidaksimetrian antar ekor sehingga tampak condong, tertekan ke satu sisi, kita menyebutnya skewed (miring). Dan benar, kita mengukur tingkat ketidaksimetrian ini dengan skewness.

Berbagai jenis skewness di sisi-sisi distribusi normal yang tidak miring.

Mengategorikan dan mengukur skewness dengan benar memberikan wawasan tentang bagaimana nilai tersebar di sekitar mean dan memengaruhi pilihan teknik statistik serta transformasi data. Misalnya, distribusi yang sangat miring mungkin diuntungkan oleh teknik normalisasi atau penskalaan agar lebih menyerupai distribusi normal. Ini akan membantu kinerja model.

Jenis-jenis Skewness

Ada tiga jenis skewness: positif, negatif, dan nol.

Mari mulai dari yang terakhir. Distribusi dengan skewness nol memiliki karakteristik berikut:

  • Distribusi simetris dengan nilai yang merata di sekitar mean.
  • Tidak ada kemiringan atau ekor ke sisi mana pun.
  • Mean, median, dan modus semuanya berada di titik tengah.

Distribusi normal (tanpa kemiringan) dengan mean, median, dan modus sejajar dalam satu garis.

Dalam praktiknya, mean, median, dan modus mungkin tidak membentuk garis lurus yang sempurna saling menumpuk. Posisi mereka bisa sedikit berjauhan, tetapi perbedaannya terlalu kecil untuk berarti.

Pada distribusi dengan skewness positif (right-skewed):

  • Ekor kanan distribusi lebih panjang atau lebih gemuk daripada ekor kiri.
  • Mean lebih besar daripada median, dan modus lebih kecil daripada mean dan median.
  • Nilai-nilai yang lebih rendah berkumpul di bagian "bukit" distribusi, sementara nilai ekstrem berada di ekor kanan yang panjang.
  • Disebut juga distribusi miring ke kanan.

Distribusi miring ke kanan dengan anotasi mean, median, dan modus.

Pada distribusi dengan skewness negatif (left-skewed):

  • Ekor kiri distribusi lebih panjang atau lebih gemuk daripada ekor kanan.
  • Mean lebih kecil daripada median, dan modus lebih besar daripada mean dan median.
  • Nilai-nilai yang lebih tinggi berkumpul di bagian "bukit" distribusi, sementara nilai ekstrem berada di ekor kiri yang panjang.
  • Disebut juga distribusi miring ke kiri.

Distribusi miring ke kiri dengan anotasi mean, median, dan modus

Untuk mengingat perbedaan antara skewness positif dan negatif, pikirkan seperti ini: jika Anda ingin menaikkan mean suatu distribusi, Anda harus menambahkan nilai yang jauh lebih tinggi daripada mean ke dalam distribusi. Untuk menurunkan mean, lakukan kebalikannya — masukkan nilai yang jauh lebih rendah daripada mean ke dalam distribusi. Jadi, jika mayoritas nilai ekstrem lebih tinggi daripada mean, skewness akan positif karena mereka menaikkan mean. Jika mayoritas nilai ekstrem lebih kecil daripada mean, skewness negatif karena mereka menurunkan mean.

Cara Menghitung Skewness di Python

Ada banyak cara untuk menghitung skewness, tetapi yang paling sederhana adalah koefisien skewness kedua Pearson, juga dikenal sebagai median skewness.

image.png

Mari kita implementasikan rumusnya secara manual di Python:

import numpy as np
import pandas as pd
import seaborn as sns

# Example dataset
diamonds = sns.load_dataset("diamonds")
diamond_prices = diamonds["price"]

mean_price = diamond_prices.mean()
median_price = diamond_prices.median()
std = diamond_prices.std()

skewness = (3 * (mean_price - median_price)) / std

>>> print(
   f"The Pierson's second skewness score of diamond prices distribution is {skewness:.5f}"
)

The Pierson's second skewness score of diamond prices distribution is 1.15189

Rumus lain yang sangat dipengaruhi oleh karya Karl Pearson adalah rumus berbasis momen untuk mengaproksimasi skewness. Rumus ini lebih andal dan diberikan sebagai berikut:

Rumus lain untuk menghitung skewness menggunakan momen

Di sini:

  • n menyatakan jumlah nilai dalam suatu distribusi
  • x_i menyatakan setiap titik data

Mari kita implementasikan di Python juga:

def moment_based_skew(distribution):
   n = len(distribution)
   mean = np.mean(distribution)
   std = np.std(distribution)

   # Divide the formula into two parts
   first_part = n / ((n - 1) * (n - 2))
   second_part = np.sum(((distribution - mean) / std) ** 3)

   skewness = first_part * second_part

   return skewness

>>> moment_based_skew(diamond_prices)
1.618440289857168

Jika Anda tidak ingin menghitung skewness secara manual (seperti saya), Anda bisa menggunakan metode bawaan dari pandas atau scipy:

# Pandas version
diamond_prices.skew()
1.618395283383529

# SciPy version
from scipy.stats import skew

skew(diamond_prices)
1.6183502776053016

Walaupun semua rumus aproksimasi skewness menghasilkan skor yang berbeda, perbedaannya terlalu kecil untuk signifikan atau mengubah kategorisasi kemiringan. Misalnya, semua metode yang kita gunakan hari ini memakai rumus berbeda di balik layar, namun hasilnya sangat berdekatan.

Setelah menghitung skewness, Anda dapat mengategorikan tingkat kemiringannya:

  • (-0.5, 0.5) — rendah atau kira-kira simetris.
  • (-1, -0.5) U (0.5, 1) — miring sedang.
  • Di luar -1 dan 1 — Sangat miring.

Apa itu Kurtosis dan Jenis-jenisnya?

Sementara skewness berfokus pada sebaran (ekor) dari distribusi normal, kurtosis lebih menyoroti tinggi puncak. Metode ini memberi tahu kita seberapa runcing atau datar distribusi normal (atau mirip normal) kita. Istilah ini, yang berarti melengkung atau melengkung busur dari bahasa Yunani, pertama kali diciptakan, tak mengejutkan, oleh matematikawan Inggris Karl Pearson (yang mendedikasikan hidupnya mempelajari distribusi peluang).

Kurtosis tinggi mengindikasikan:

  • Puncak yang sangat runcing di tengah distribusi.
  • Lebih banyak nilai terkonsentrasi di sekitar mean dibandingkan distribusi normal.
  • Ekor lebih berat karena konsentrasi nilai ekstrem atau outlier yang lebih tinggi di ekor.
  • Probabilitas kejadian ekstrem lebih besar.

Sebaliknya, kurtosis rendah mengindikasikan:

  • Puncak yang datar.
  • Lebih sedikit nilai yang terkonsentrasi di sekitar mean namun tetap lebih banyak daripada distribusi normal.
  • Ekor yang lebih ringan.
  • Probabilitas kejadian ekstrem lebih rendah.

Bergantung pada derajatnya, distribusi memiliki tiga jenis kurtosis:

  1. Distribusi mesokurtik (kurtosis = 3, excess kurtosis = 0): distribusi normal sempurna atau sangat mendekatinya.
  2. Distribusi leptokurtik (kurtosis > 3, excess kurtosis > 0): puncak tajam, ekor berat
  3. Distribusi platikurtik (kurtosis < 3, excess kurtosis < 0): puncak datar, ekor ringan

Tiga jenis distribusi: leptokurtik (kurtosis tinggi), mesokurtik (tanpa kurtosis) dan platikurtik (kurtosis rendah)

Perlu dicatat bahwa di sini, excess kurtosis didefinisikan sebagai kurtosis - 3, dengan menganggap kurtosis distribusi normal sebagai 0. Dengan cara ini, skor kurtosis menjadi lebih mudah ditafsirkan.

Cara Menghitung Kurtosis di Python

Anda dapat menghitung kurtosis di Python dengan cara yang sama seperti skewness menggunakan pandas atau SciPy:

from scipy.stats import kurtosis

kurtosis(diamond_prices)
2.177382669056634

Pandas menawarkan dua fungsi untuk kurtosis: kurt dan kurtosis. Yang pertama khusus untuk Pandas Series, sementara yang lainnya dapat digunakan pada DataFrame.

diamond_prices.kurt()
2.17769575924869

# Select numeric features and calculate kurtosis
diamonds.select_dtypes(include="number").kurtosis()
carat     1.256635
depth     5.739415
table     2.801857
price     2.177696
x        -0.618161
y        91.214557
z        47.086619
dtype: float64

Sekali lagi, angkanya berbeda untuk distribusi yang sama karena pandas dan SciPy menggunakan rumus yang berbeda.

Jika Anda menginginkan perhitungan kurtosis secara manual, Anda dapat menggunakan rumus berikut:

Rumus untuk menghitung kurtosis menggunakan momen, dipengaruhi oleh Karl Pearson

Di sini:

  • n menyatakan jumlah observasi dalam dataset
  • x_i menyatakan tiap titik data individual

Kita akan mengimplementasikan rumus tersebut di dalam sebuah fungsi lagi:

def moment_based_kurtosis(distribution):
   n = len(distribution)
   mean = np.mean(distribution)
   std = np.std(distribution)

   kurtosis = (1 / n) * sum(((distribution - mean) / std) ** 4) - 3

   return kurtosis

>>> moment_based_kurtosis(diamond_prices)
2.1773826690576463

Dan kita mengetahui bahwa harga berlian memiliki excess kurtosis sebesar 2,18, yang berarti jika kita plot distribusinya, ia akan memiliki puncak yang lebih tajam dibandingkan distribusi normal.

Jadi, mari kita lakukan!

Memvisualisasikan Skewness dan Kurtosis di Python

Salah satu visual terbaik untuk melihat bentuk, dan dengan demikian skewness serta kurtosis suatu distribusi, adalah plot kernel density estimate (KDE). Visual ini tersedia melalui Seaborn:

import matplotlib.pyplot as plt

sns.kdeplot(diamond_prices)

plt.title("KDE plot of diamond prices")
plt.xlabel("Price ($)")

Plot KDE harga berlian

Plot ini selaras dengan angka yang kita lihat sejauh ini: distribusinya memiliki ekor kanan yang panjang, menandakan skewness positif, dan memiliki puncak yang sangat tajam, yang sesuai dengan kurtosis tinggi.

KDE bukan satu-satunya plot untuk melihat bentuk. Kita juga bisa menggunakan histogram:

sns.histplot(diamonds["carat"])

plt.xlabel("Carat")
plt.title("A histogram of the carat of diamonds")

Histogram karat berlian

Kekurangan histogram adalah Anda harus memilih sendiri jumlah bin (jumlah batang). Di sini, batang terlalu banyak sehingga menimbulkan noise pada visual — kita tidak bisa mendefinisikan bentuknya dengan jelas. Jadi, mari kurangi jumlah bin:

sns.histplot(diamonds["carat"], bins=25)

plt.xlabel("Carat")
plt.title("A histogram of the carat of diamonds")

Histogram karat berlian dengan lebih sedikit bin

Sekarang, bentuknya lebih terdefinisi, tetapi kita masih bisa meningkatkannya. Dengan menyetel kde=True di dalam histplot, kita dapat memplot KDE distribusi di atas batang:

sns.histplot(diamonds["carat"], bins=25, kde=True)

plt.xlabel("Carat")
plt.title("A histogram of the carat of diamonds")

Histogram dengan KDE karat berlian di atasnya

Garis KDE yang ditumpangkan tampak bergerigi, bukan kurva halus yang memungkinkan kita melihat bentuk umum. Penyebabnya adalah distribusi karat secara alami bergerigi dan jauh dari distribusi normal.

Namun, kita bisa mengurangi sensitivitas KDE terhadap fluktuasi ini dengan menyesuaikan bandwidth. Ini dilakukan menggunakan parameter bw_adjust, yang nilai default-nya 1:

# Change the bandwidth from 1 to 3
sns.kdeplot(diamonds["carat"], bw_adjust=3, color="red")

plt.title("KDE of diamond carats");

KDE karat berlian dengan penyesuaian bandwidth lebih tinggi

Versi ini jauh lebih tidak bergerigi dibandingkan KDE yang ditumpangkan tadi. Untuk menyesuaikan bandwidth KDE saat menggunakan histogram yang ditumpangi KDE, Anda dapat menggunakan parameter kde_kws:

ax = sns.histplot(
   diamonds["carat"],
   kde=True,
   kde_kws=dict(bw_adjust=3),
   bins=25,
)

plt.title("An overlaid histogram of diamond carats");

Histogram yang ditumpangi plot KDE dengan bandwidth yang disesuaikan.

kde_kws menerima parameter apa pun yang dapat diterima oleh fungsi kdeplot untuk mengendalikan komputasi KDE.

Salah satu trik yang bisa Anda gunakan ketika memplot KDE adalah menghapus semua elemen selain garis KDE. Karena tujuan utama KDE adalah melihat bentuk distribusi, detail lain seperti penanda sumbu, garis tepi (spine), dan label terkadang tidak diperlukan:

sns.kdeplot(diamond_prices, color="red")

# Remove the spine from three sides
sns.despine(top=True, right=True, left=True)

# Remove the ticks and ticklabels
plt.xticks([])
plt.yticks([])
plt.ylabel("")
plt.xlabel("")

# Set a title
plt.title("Diamond prices", fontdict=dict(fontsize=20));

Plot KDE dengan semua elemen dihapus - kecuali garis KDE dan judul.

Plot ini jauh lebih rapi. Anda bisa lebih meningkatkannya dengan menambahkan garis untuk menandai posisi mean, median, dan modus:

sns.kdeplot(diamond_prices, color="red")

sns.despine(top=True, right=True, left=True)
plt.xticks([])
plt.yticks([])
plt.ylabel("")
plt.xlabel("")
plt.title("Diamond prices", fontdict=dict(fontsize=20))

# Find the mean, median, mode
mean_price = diamonds["price"].mean()
median_price = diamonds["price"].median()
mode_price = diamonds["price"].mode().squeeze()

# Add vertical lines at the position of mean, median, mode
plt.axvline(mean_price, label="Mean")
plt.axvline(median_price, color="black", label="Median")
plt.axvline(mode_price, color="green", label="Mode")

plt.legend();

Plot KDE yang hanya menampilkan garis KDE, judul, serta anotasi mean, median, dan modus.

Plot ini memverifikasi apa yang kita bahas di bagian jenis-jenis skewness: pada distribusi yang miring positif, mean lebih tinggi daripada median, dan modus lebih rendah daripada mean maupun median.

Kesimpulan

Skewness dan kurtosis, yang sering terlewat dalam Exploratory Data Analysis, mengungkap wawasan penting tentang sifat suatu distribusi.

Skewness mengisyaratkan kemiringan data, apakah condong ke kiri atau ke kanan, memperlihatkan ketidaksimetri (jika ada). Skew positif berarti ekor memanjang ke kanan, sedangkan skew negatif mengarah ke sebaliknya.

Kurtosis berkaitan dengan puncak dan ekor. Kurtosis tinggi mempertajam puncak dan memberatkan ekor, sementara kurtosis rendah menyebarkan data sehingga ekor menjadi lebih ringan.

Jika Anda ingin mempelajari lebih lanjut tentang skewness dan kurtosis, Anda dapat melihat kursus analisis kuantitatif unggulan yang diajarkan para pakar industri di DataCamp berikut ini:


Bex Tuychiev's photo
Author
Bex Tuychiev
LinkedIn

Saya adalah pembuat konten ilmu data dengan pengalaman lebih dari 2 tahun dan salah satu dengan jumlah pengikut terbesar di Medium. Saya suka menulis artikel mendetail tentang AI dan ML dengan sedikit gaya sarkastik karena harus ada sesuatu untuk membuatnya sedikit kurang membosankan. Saya telah menghasilkan lebih dari 130 artikel dan satu kursus DataCamp, dengan satu lagi sedang dalam proses. Konten saya telah dilihat oleh lebih dari 5 juta pasang mata, dengan 20 ribu di antaranya menjadi pengikut di Medium dan LinkedIn. 

Topik

Pelajari Lebih Lanjut! 

Kursus

Pengantar Manajemen Risiko Portofolio dengan Python

4 Hr
29K
Lihat DetailRight Arrow
Mulai Kursus
Lihat Lebih BanyakRight Arrow
Terkait

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat Lebih BanyakLihat Lebih Banyak