Pendekatan pertama
Anda dapat mencoba pendekatan ini di Mathematica.
Mari kita buat beberapa data bivariat:
data = Table[RandomVariate[BinormalDistribution[{50, 50}, {5, 10}, .8]], {1000}];
Maka kita perlu memuat paket ini:
Needs["MultivariateStatistics`"]
Dan sekarang:
ellPar=EllipsoidQuantile[data, {0.9}]
memberikan output yang mendefinisikan elips kepercayaan 90%. Nilai yang Anda peroleh dari output ini adalah dalam format berikut:
{Ellipsoid[{x1, x2}, {r1, r2}, {{d1, d2}, {d3, d4}}]}
x1 dan x2 menentukan titik di mana elips di tengah, r1 dan r2 menentukan jari-jari semi-sumbu, dan d1, d2, d3 dan d4 menentukan arah penyelarasan.
Anda juga dapat merencanakan ini:
Show[{ListPlot[data, PlotRange -> {{0, 100}, {0, 100}}, AspectRatio -> 1], Graphics[EllipsoidQuantile[data, 0.9]]}]
Bentuk parametrik umum elips adalah:
ell[t_, xc_, yc_, a_, b_, angle_] := {xc + a Cos[t] Cos[angle] - b Sin[t] Sin[angle],
yc + a Cos[t] Sin[angle] + b Sin[t] Cos[angle]}
Dan Anda dapat memplotnya dengan cara ini:
ParametricPlot[
ell[t, ellPar[[1, 1, 1]], ellPar[[1, 1, 2]], ellPar[[1, 2, 1]], ellPar[[1, 2, 2]],
ArcTan[ellPar[[1, 3, 1, 2]]/ellPar[[1, 3, 1, 1]]]], {t, 0, 2 \[Pi]},
PlotRange -> {{0, 100}, {0, 100}}]
Anda dapat melakukan pemeriksaan berdasarkan informasi geometris murni: jika jarak Euclidean antara pusat elips (ellPar [[1,1]]) dan titik data Anda lebih besar daripada jarak antara pusat elips dan batas elips (jelas, dalam arah yang sama di mana titik Anda berada), maka titik data itu berada di luar elips.
Pendekatan kedua
Pendekatan ini didasarkan pada distribusi kernel yang halus.
Ini adalah beberapa data yang didistribusikan dengan cara yang mirip dengan data Anda:
data1 = RandomVariate[BinormalDistribution[{.3, .7}, {.2, .3}, .8], 500];
data2 = RandomVariate[BinormalDistribution[{.6, .3}, {.4, .15}, .8], 500];
data = Partition[Flatten[Join[{data1, data2}]], 2];
Kami mendapatkan distribusi kernel yang halus pada nilai data ini:
skd = SmoothKernelDistribution[data];
Kami memperoleh hasil numerik untuk setiap titik data:
eval = Table[{data[[i]], PDF[skd, data[[i]]]}, {i, Length[data]}];
Kami memperbaiki ambang batas dan kami memilih semua data yang lebih tinggi dari ambang ini:
threshold = 1.2;
dataIn = Select[eval, #1[[2]] > threshold &][[All, 1]];
Di sini kita mendapatkan data yang berada di luar wilayah:
dataOut = Complement[data, dataIn];
Dan sekarang kita dapat memplot semua data:
Show[ContourPlot[Evaluate@PDF[skd, {x, y}], {x, 0, 1}, {y, 0, 1}, PlotRange -> {{0, 1}, {0, 1}}, PlotPoints -> 50],
ListPlot[dataIn, PlotStyle -> Darker[Green]],
ListPlot[dataOut, PlotStyle -> Red]]
Titik berwarna hijau adalah titik di atas ambang batas dan titik berwarna merah adalah titik di bawah ambang batas.