Cara menggunakan PECENTILE pada Python

Cara menggunakan PECENTILE pada Python

Photo by Carlos Muza on Unsplash

Buat saya, statistik deskriptif adalah salam kenal antara kita dengan data yang kita hadapi. Sederhananya, statistik deskriptif memberikan deskripsi data secara ringkas dari bagaimana bentuk distribusi datanya, sampai ukuran penyebaran dari data tersebut.

Dan kali ini, saya akan dibantu dengan salah satu dataset terkenal yaitu dataset Titanic. Dimana umumnya, dataset ini digunakan untuk menganalisa kelangsungan hidup seseorang (survival analysis).

Dataset ini saya ambil dari library Seaborn, yang dapat diakses dengan:

# pip install seaborn
import seaborn as sns
titanic = sns.load_dataset('titanic')
titanic.head() # menunjukkan lima data teratas

Outputnya adalah sebuah Pandas.DataFrame, yang dapat dilihat di bawah:

Cara menggunakan PECENTILE pada Python

Bisa dilihat terdapat missing value (NaN) pada dataset. Namun dalam artikel ini, saya tidak akan membahasnya. Jadi sebaiknya, saya biarkan tetap begitu. Kemudian pada pandas.DataFrame terdapat sebuah method yaitu .describe(). Yang tentunya, akan sangat membantu kita menunjukkan deskripsi pada data Titanic di atas.

# pip install numpy
import numpy as np
titanic.describe() # Untuk fitur numerik (atau continous)
titanic.describe(exclude = np.number) # Untuk fitur kategorik

Yang outputnya:

Cara menggunakan PECENTILE pada Python

Pada fitur age, deck, dan embark_town punya jumlah data (count) yang lebih sedikit di antara fitur lainnya, dikarenakan adanya missing value (NaN) yang telah disinggung sebelumnya.

Kalau misalnya saja, kita ambil fitur harga tiket (fare), kita bisa lihat bahwa distribusi fitur ini mempunyai skew yang positif (atau menceng ke kanan). Itu dapat dilihat dari fitur fare yang punya mean > median(50%)-nya. Untuk distribusinya dapat dilihat di bawah:

plt.figure(figsize = (10, 6))
plt.axvline(titanic['fare'].describe()['mean'], color = 'red', label = 'mean')
plt.axvline(titanic['fare'].describe()['50%'], color = 'yellow', label = 'median')
sns.distplot(titanic['fare'])
plt.legend()

Cara menggunakan PECENTILE pada Python

Bentuk distribusi ini sering terjadi dikarenakan pada fitur ini mempunyai outliers. Karena saya telah menyingung istilah median (50%) dan mean, ada baiknya saya lanjutkan dengan suatu istilah di statistik yang disebut Measures of Central Tendency.

Measures of Central Tendency

Seperti yang dapat kita tebak, ini membicarakan atau mendeskripsikan posisi tengah pada distribusi data. Pada umumnya, kita hanya akan membicarakan mean, median, dan mode.

  1. Mean
    Mean
    bisa didapatkan dengan menjumlahkan seluruh data kemudian membaginya dengan banyaknya data. Secara pribadi, saya jarang menggunakan mean sebagai central tendency saya (meski memang ada beberapa kesempatan, dimana saya harus menggunakannya). Mengingat kebanyakan data-data yang saya temukan memiliki outliers. Dan outliers sangat mempengaruhi Mean. Tapi setau saya, Mean adalah central tendency paling sering digunakan.
  2. Median
    Sedangkan untuk Median, cara mendapatkannya lebih sederhana. Kita urutkan datanya, kemudian kita pilih yang nilai yang di tengah. Median tidak dipengaruhi Outliers. Jadi sebaiknya kita menggunakan Median sebagai central tendency kita,jika data memiliki banyak outliers. Karena biasanya, Mean tidak begitu baik dalam menjelaskan data yang punya banyak outliers.
  3. Mode
    Ngomong-ngomong, Mean dan Median itu untuk data yang numerik. Sedangkan Mode untuk data kategorik. Yang dimana pada data kategorik kita dapat menghitung frekuensinya. Dan Mode didapat dengan melihat data yang paling sering muncul (atau dengan kata lain, frekuensi terbesar). Pada contoh data Titanic di atas, dia adalah yang berindeks top dan freq adalah banyaknya.

Bagaimana dengan sisanya? std? 25%? 50%? atau yang lainnya? Dari sini kita akan membicarakan istilah lainnya pada statistik yang disebut Measure of Spread.

Measure of Spread

Sekali lagi, bisa kita tebak, ini membicarakan seberapa tersebarnya data yang kita miliki. Ukuran yang umumnya digunakan:

  1. Standard Deviation dan Variance
    Sebetulnya saya selalu mencoba untuk menjelaskan sesuatu tanpa matematik. Namun saya pikir, persamaannya tidak terlalu rumit dan ini juga akan membuat lebih mudah dimengerti. Begini persamaan untuk Standard Deviation:

Persamaan Standard Deviation untuk Populasi

Persamaan Standard Deviation untuk Sample

Dimana n adalah jumlah data, adalah rata-rata data (memang biasanya, untuk populasi, tidak menggunakan simbol x̄, tapi menggunakan simbol μ. Tapi mari kita biarkan tetap begitu). Jadi dari sini, kita dapat menarik kesimpulan, semakin jauh data dengan rata-ratanya, semakin besar juga Standard Deviation-nya. Dan untuk Variance dia adalahkuadrat dari Standard Deviation:

Persamaan variansi untuk populasi

Persamaan variansi untuk sample

Karena Variance dikuadratkan, maka yang semakin jauh akan semakin membuat variansi besar. Itu kenapa menurut saya, Variance lebih intuitif, saya melihatnya seperti jarak, lebar pada distribusi data.

Standard Deviationjuga menjadi variabel yang penting dari suatu aturan di statistik yang dinamakan Empirical Ruleatau68–95–99.7 rule. Begini aturannya, jika misalnya data kita berbentuk Distribusi Normal (beberapa orang menyebutnya Gauss atau Bell-Curve) maka:

  1. ≈68% data berada di dalam satu standar deviasi rata-rata.
  2. ≈95% data berada di dalam dua standar deviasi rata-rata.
  3. ≈99.7% data berada di dalam tiga standar deviasi rata-rata.

Atau jika di visualisasikan:

import numpy as np # pip install numpy
import scipy.stats # pip install scipy
import matplotlib.pyplot as plt # pip install matplotlib
mean = 0
std = 1
var = np.square(std)
plt.figure(figsize = (15, 8))
x = np.linspace(mean - 3*std, mean + 3*std, 100)
plt.plot(x, scipy.stats.norm.pdf(x, mean, std))
plt.axvline(x = mean - std, c = 'blue')
plt.axvline(x = mean + std, c = 'blue')
plt.axvline(x = mean - 2*std, c = 'red')
plt.axvline(x = mean + 2*std, c = 'red')
plt.axvline(x = mean - 3*std, c = 'black')
plt.axvline(x = mean + 3*std, c = 'black')

Cara menggunakan PECENTILE pada Python

Distribusi Normal di atas, mempunyai rata-rata = 0 dan standar deviasi = 1 atau seringkali, disebut standard normal distribution. Jadi misalnya, kalau saya tulis ulang poin 1, artinya ≈68% data berada di antara garis biru. atau pada poin 2, artinya ≈95% data berada di antara garis merah. Dan begitu seterusnya.

Namun memang, adanya kekurangan pada Standar Deviasi. Mengingat dari persamaan di atas, standar deviasi tergantung pada rata-rata data. Itu kenapa, standar deviasi juga terpengaruh dengan outliers. Jika mean tidak terlalu baik dalam menjelaskan data, maka sebaiknya gunakan alternatif lain. Yaitu gunakan Quartile dan Median.

2. Quartile

Bayangkan data kita dipotong menjadi empat bagian dan nilai-nilai yang membagi data itulah yang disebut Quartile. Dan bagiannya disebut Quarter.

Ada tiga jenis Quartile, yaitu Q1 (nilai di antara median dengan data terkecil), Q2 (median), dan Q3 (nilai di antara median dengan data terbesar).

Kalau kita kembali ke tabel deskripsi statistik di awal, kalian akan melihat ‘25%’, ‘50%’, dan ‘75%’ itu adalah Percentile. Namun menurut saya, itu sama saja dengan Quartile. Misalnya, untuk Q1 = 25th percentile, Q2 = 50th Percentile danQ3 = 75th percentile. Tapi memang, ini tergantung masing-masing orang, lebih senang menggunakan istilah yang mana.

Adanya konsep penting pada statistik yang berhubungan dengan Quartile disebut InterQuartile Range (IQR). Secara persamaan, dapat ditulis begini:

Jadi kalian dapat menyimpulkan, bahwa 50% data berada di sini. Buat saya, ini menjadi konsep penting, karena saya sendiri paling sering menggunakannya untuk mendeteksi outliers.

Mendeteksi outliers, menggunakan metode IQR cukup mudah dilakukan. Kita hanya perlu membuat dua batas, yaitu batas atas dan batas bawah yang dimana:

Agar lebih jelas, saya akan meminta bantuan Boxplot dalam memvisualkan Quartile. Ambil saja, fitur umur (age) pada dataset Titanic di atas.

plt.figure(figsize = (10, 5))
sns.boxplot(titanic['age'])
plt.axvline(titanic['age'].describe()['25%'], color = 'red', label = 'Q1')
plt.axvline(titanic['age'].describe()['50%'], color = 'yellow', label = 'Q2')
plt.axvline(titanic['age'].describe()['75%'], color = 'blue', label = 'Q3')
plt.annotate('Outlier', (titanic['age'].describe()['max'],0.1), xytext = (titanic['age'].describe()['max'],0.3),
arrowprops = dict(facecolor = 'blue'), fontsize = 13 )
IQR = titanic['age'].describe()['75%'] - titanic['age'].describe()['25%']plt.annotate('Batas Atas', (titanic['age'].describe()['75%'] + 1.5*IQR, 0.2),
xytext = (titanic['age'].describe()['75%'] + 1.5*IQR, 0.4),
arrowprops = dict(facecolor = 'blue'), fontsize = 13 )
plt.annotate('Batas Bawah', (titanic['age'].describe()['min'], 0.2),
xytext = (titanic['age'].describe()['min'], 0.4),
arrowprops = dict(facecolor = 'blue'), fontsize = 13 )
plt.legend()

Cara menggunakan PECENTILE pada Python

boxplot

Dikarenakan tidak adanya orang yang berumur di bawah nol, jadi batas bawahnya adalah orang dengan umur terendah di dataset Titanic ini, sepertinya seorang bayi.

Untuk mendapatkan data-data outliers, kita hanya perlu memilih data yang kondisinya di luar batas bawah atau batas atas. Cara memilih data dengan suatu kondisi, pernah saya tulis sebelumnya, yang dapat di cek di sini.

Saya harap tulisan ini dapat membantu… Terimakasih telah membacanya sampai selesai…