Berdasarkan isu #158: Statistik Dasar (kurtosis, stdev, skew)
Referensi Isu:
Deskripsi Isu:
Diskusi Isu:
Strategi:
import numpy as np
import pandas as pd
from scipy import stats
# contoh data diambil dari buku
# Rekayasa Statistika untuk Teknik Pengairan h.32-33
_H = np.array(
[176, 102, 276, 254, 122, 320, 297, 203, 245, 268,
236, 210, 214, 151, 277, 149, 245, 154, 261, 255]
)
data = pd.DataFrame(data=_H, columns=['H'])
data
H | |
---|---|
0 | 176 |
1 | 102 |
2 | 276 |
3 | 254 |
4 | 122 |
5 | 320 |
6 | 297 |
7 | 203 |
8 | 245 |
9 | 268 |
10 | 236 |
11 | 210 |
12 | 214 |
13 | 151 |
14 | 277 |
15 | 149 |
16 | 245 |
17 | 154 |
18 | 261 |
19 | 255 |
def _var(x):
n = x.size
return ((x-x.mean())**2).sum()/(n-1)
def _std(x):
return np.sqrt(_var(x))
def _momen(x, r):
n = x.size
return 1/n * ((x-x.mean())**r).sum()
def _skew(x):
n = x.size
return n**2 / ((n-1)*(n-2)) * _momen(x, 3) / _std(x)**3
def _kurt(x):
n = x.size
return n**3 / ((n-1)*(n-2)*(n-3)) * _momen(x, 4) / _std(x)**4
def _Cv(x):
return _std(x) / x.mean()
def calc_coef(x):
"""Return (Cv, Cs, Ck)"""
return (_Cv(x), _skew(x), _kurt(x))
def check_distribution(x, show_stat=False, show_detail=False):
Cv, Cs, Ck = calc_coef(x)
if show_stat:
print(
f'Cv = {Cv:.5f}',
f'Cs = {Cs:.5f}',
f'Ck = {Ck:.5f}',
sep='\n', end='\n'
)
b_normal = True if np.isclose(Cs, 0, atol=0.1) and np.isclose(Ck, 3, atol=0.1) else False
b_lognormal = True if np.isclose(Cs, 3, atol=0.1) and np.greater(Cs, 0) and np.isclose(Cs, 3*Cv, atol=0.1) else False
b_gumbel = True if np.isclose(Cs, 1.1396, atol=0.0001) and np.isclose(Ck, 5.4002, atol=0.0001) else False
b_logpearson = True #selalu benar terlepas nilai Cv, Cs, Ck
_kriteria = lambda x: "Memenuhi" if x else "Tidak Memenuhi"
print(
f'{"Normal":<20}: {_kriteria(b_normal)}',
f'{"Log Normal":<20}: {_kriteria(b_lognormal)}',
f'{"Gumbel Tipe I":<20}: {_kriteria(b_gumbel)}',
f'{"Log Pearson Tipe III":<20}: {_kriteria(b_logpearson)}',
sep='\n', end='\n'
)
if show_detail:
print(
'-----------------------------------------------',
'> Distribusi Normal [syarat](nilai)',
f'[Cs ~ 0](Cs = {Cs:.5f})',
f'[Ck ~ 3](Ck = {Ck:.5f})',
'> Log Normal',
f'[Cs ~ 3](Cs = {Cs:.5f})',
f'[Cs > 0](Cs = {Cs:.5f})',
f'[Cs ~ 3Cv](Cs = {Cs:.5f} ~ 3Cv = {3*Cv:.5f})',
'> Gumbel Tipe I',
f'[Cs ~ 1.1396](Cs = {Cs:.5f})',
f'[Ck ~ 5.4002](Ck = {Ck:.5f})',
'> Log Pearson Tipe III',
'Tidak memiliki ciri khas (Cs/Ck/Cv = Bebas)',
'-----------------------------------------------',
sep='\n', end='\n'
)
_var(), _std(), _momen(), _skew(), _kurt(), _Cv()
¶Pada modul ini dibuat fungsi untuk menghitung parameter statistik berupa:
_var(x)
: menghitung ragam (variance)_std(x)
: menghitung simpangan baku / standar deviasi (standard deviation)_momen(x, r)
: menghitung momen dengan besar momen r
_skew(x)
: menghitung kepencengan (skewness)_kurt(x)
: menghitung ukuran kepuncakkan (kurtosis)_Cv(x)
: menghitung koefisien variancedengan x
merupakan array
dan r
merupakan besar momen.
# karena fungsi parameter statistik tersebut
# juga sudah tersedia di numpy dan scipy
# maka akan dibandingkan hasilnya
# variance
print('var [hk == numpy]:', _var(data.H) == np.var(data.H, ddof=1))
# standard deviation
print('std [hk == numpy]:', _std(data.H) == np.std(data.H, ddof=1))
# skewness
print('skew [hk == scipy]:', _skew(data.H) == stats.skew(data.H, bias=False))
# kurtosis
print('kurt [hk == scipy]:', _kurt(data.H) == stats.kurtosis(data.H, bias=False))
print(
f'kurt [hk] = {_kurt(data.H)}',
f'kurt [scipy] = {stats.kurtosis(data.H, bias=False)}', sep='\n'
)
var [hk == numpy]: True std [hk == numpy]: True skew [hk == scipy]: True kurt [hk == scipy]: False kurt [hk] = 2.665512982820046 kurt [scipy] = -0.7404270543134617
Disimpulkan bahwa untuk perhitungan kurtosis memiliki perbedaan antara menggunakan formula dari referensi dengan paket scipy
.
calc_coef(x)
:¶Fungsi calc_coef(...)
digunakan untuk menghitung nilai koefisien variance ($C_v$), koefisien skewness ($C_s$), koefisien kurtosis ($C_k$). Argumen yang diminta adalah x
berupa array
. Catatan: Perhitungan koefisien skewness dan kurtosis merupakan perhitungan parameter statistik skewness dan kurtosis.
Cv, Cs, Ck = calc_coef(data.H)
print(Cv, Cs, Ck)
0.27539643336275177 -0.4406607753164903 2.665512982820046
check_distribution(x, show_stat=False)
¶Fungsi check_distribution()
digunakan untuk memeriksa jenis sebaran dari data.
x
: array
show_stat=False
: Jika True
maka menampilkan nilai Cv, Cs, dan Ck.show_detail=False
: Jika True
maka menampilkan persyaratan jenis sebaran (distribusi).check_distribution(data.H)
Normal : Tidak Memenuhi Log Normal : Tidak Memenuhi Gumbel Tipe I : Tidak Memenuhi Log Pearson Tipe III: Memenuhi
check_distribution(data.H, show_stat=True)
Cv = 0.27540 Cs = -0.44066 Ck = 2.66551 Normal : Tidak Memenuhi Log Normal : Tidak Memenuhi Gumbel Tipe I : Tidak Memenuhi Log Pearson Tipe III: Memenuhi
check_distribution(data.H, show_detail=True)
Normal : Tidak Memenuhi Log Normal : Tidak Memenuhi Gumbel Tipe I : Tidak Memenuhi Log Pearson Tipe III: Memenuhi ----------------------------------------------- > Distribusi Normal [syarat](nilai) [Cs ~ 0](Cs = -0.44066) [Ck ~ 3](Ck = 2.66551) > Log Normal [Cs ~ 3](Cs = -0.44066) [Cs > 0](Cs = -0.44066) [Cs ~ 3Cv](Cs = -0.44066 ~ 3Cv = 0.82619) > Gumbel Tipe I [Cs ~ 1.1396](Cs = -0.44066) [Ck ~ 5.4002](Ck = 2.66551) > Log Pearson Tipe III Tidak memiliki ciri khas (Cs/Ck/Cv = Bebas) -----------------------------------------------
- 20220324 - 1.1.0 - tambah argumen show_detail=False untuk check_distribution()
- 20220304 - 1.0.0 - Initial
Source code in this notebook is licensed under a MIT License. Data in this notebook is licensed under a Creative Common Attribution 4.0 International.