Première approche
Vous pouvez essayer cette approche dans Mathematica.
Générons quelques données bivariées:
data = Table[RandomVariate[BinormalDistribution[{50, 50}, {5, 10}, .8]], {1000}];
Ensuite, nous devons charger ce package:
Needs["MultivariateStatistics`"]
Et maintenant:
ellPar=EllipsoidQuantile[data, {0.9}]
donne une sortie qui définit une ellipse de confiance à 90%. Les valeurs que vous obtenez à partir de cette sortie sont au format suivant:
{Ellipsoid[{x1, x2}, {r1, r2}, {{d1, d2}, {d3, d4}}]}
x1 et x2 spécifient le point auquel l'ellipse centrée, r1 et r2 spécifient les rayons semi-axes, et d1, d2, d3 et d4 spécifient la direction d'alignement.
Vous pouvez également tracer ceci:
Show[{ListPlot[data, PlotRange -> {{0, 100}, {0, 100}}, AspectRatio -> 1], Graphics[EllipsoidQuantile[data, 0.9]]}]
La forme paramétrique générale de l'ellipse est:
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]}
Et vous pouvez le tracer de cette façon:
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}}]
Vous pouvez effectuer une vérification basée sur des informations géométriques pures: si la distance euclidienne entre le centre de l'ellipse (ellPar [[1,1]]) et votre point de données est supérieure à la distance entre le centre de l'ellipse et la frontière de l'ellipse (évidemment, dans la même direction où se trouve votre point), alors ce point de données est en dehors de l'ellipse.
Deuxième approche
Cette approche est basée sur la distribution fluide du noyau.
Voici quelques données distribuées de manière similaire à vos données:
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];
Nous obtenons une distribution fluide du noyau sur ces valeurs de données:
skd = SmoothKernelDistribution[data];
Nous obtenons un résultat numérique pour chaque point de données:
eval = Table[{data[[i]], PDF[skd, data[[i]]]}, {i, Length[data]}];
Nous fixons un seuil et nous sélectionnons toutes les données supérieures à ce seuil:
threshold = 1.2;
dataIn = Select[eval, #1[[2]] > threshold &][[All, 1]];
Ici, nous obtenons les données qui se trouvent en dehors de la région:
dataOut = Complement[data, dataIn];
Et maintenant, nous pouvons tracer toutes les données:
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]]
Les points de couleur verte sont ceux au-dessus du seuil et les points de couleur rouge sont ceux au-dessous du seuil.