2017-04-01 7 views
-1

Sagen wir, ich habe einen großen Datensatz, wo ich alles in einer Art Analyse manipulieren kann. Welche können Werte in einer Wahrscheinlichkeitsverteilung betrachten.Plotten von Datenpunkten auf, wo sie in einer Verteilung fallen

Jetzt, da ich diesen großen Datensatz habe, möchte ich dann bekannte, aktuelle Daten dazu vergleichen. In erster Linie, wie viele der Werte in meinem Datensatz haben den gleichen Wert oder Eigenschaft mit den bekannten Daten. Zum Beispiel:

enter image description here

Dies ist eine kumulative Verteilung. Die durchgezogenen Linien stammen aus generierten Daten aus Simulationen und die abnehmenden Intensitäten sind nur prognostizierte Prozentsätze. Die Sterne sind dann beobachtbare (bekannte) Daten, die gegen die erzeugten Daten aufgetragen sind.

Ein weiteres Beispiel, das ich gemacht habe, ist, wie visuell die Punkte möglicherweise auf einem Histogramm projiziert werden können:

enter image description here

ich Schwierigkeiten habe Markierung, wo setzen die bekannten Datenpunkte in den erzeugten Daten fallen und Grundstück kumulativ neben der Verteilung der generierten Daten.

Wenn ich versuchen, die Anzahl der Punkte abrufen, die in der Nähe der erzeugten Daten fallen, würde ich so beginnen (es ist nicht rechts):

def SameValue(SimData, DefData, uncert): 
    numb = [(DefData-uncert) < i < (DefData+uncert) for i in SimData] 
    return sum(numb) 

Aber ich habe Probleme Buchhaltung für die Punkte, die in die Wertebereiche fallen, und dann alles so einrichten, dass ich es plotten kann. Irgendeine Idee, wie man diese Daten sammelt und diese auf eine kumulative Verteilung projiziert?

+0

, wem Downvoted meinen Beitrag, würden Sie auf auszuarbeiten, warum so kann ich verbessern, was ich falsch mache? – DarthLazar

Antwort

1

Die Frage ist ziemlich chaotisch mit vielen irrelevanten Informationen, aber vage an den wesentlichen Punkten bleiben. Ich werde versuchen, es so gut wie möglich auszulegen.

Ich denke, was Sie suchen, ist das folgende: Bei einer endlichen Probe aus einer unbekannten Verteilung, wie groß ist die Wahrscheinlichkeit, eine neue Probe zu einem festen Wert zu erhalten?

Ich bin mir nicht sicher, ob es eine allgemeine Antwort darauf gibt, aber in jedem Fall wäre das eine Frage, die man an Statistik- oder Mathematik-Leute stellen sollte. Meine Vermutung ist, dass Sie einige Annahmen über die Verteilung selbst machen müssten.

Für den praktischen Fall könnte es jedoch ausreichen, herauszufinden, in welchem ​​Fach der Stichprobenverteilung der neue Wert liegen würde.

Also angenommen, wir haben eine Verteilung x, die wir in bins teilen. Wir können das Histogramm h unter Verwendung von numpy.histogram berechnen. Die Wahrscheinlichkeit, in jedem Bin einen Wert zu finden, wird dann durch h/h.sum() gegeben.
Mit einem Wert von v=0.77, von dem wir die Wahrscheinlichkeit gemäß der Verteilung wissen möchten, können wir den Bin herausfinden, in dem er nach dem Index ind im Bin-Array suchen würde, wo dieser Wert eingefügt werden müsste Das Array bleibt sortiert. Dies kann unter Verwendung von numpy.searchsorted erfolgen.

import numpy as np; np.random.seed(0) 

x = np.random.rayleigh(size=1000) 
bins = np.linspace(0,4,41) 
h, bins_ = np.histogram(x, bins=bins) 
prob = h/float(h.sum()) 

ind = np.searchsorted(bins, 0.77, side="right") 
print prob[ind] # which prints 0.058 

Also ist die Wahrscheinlichkeit 5,8%, um einen Wert in der Tonne um 0,77 zu probieren.

Eine andere Option wäre, das Histogramm zwischen den Bin-Zentren zu interpolieren, um die Wahrscheinlichkeit zu finden.

Im folgenden Code zeichnen wir eine Verteilung ähnlich der aus dem Bild in der Frage und verwenden beide Methoden, die erste für das Frequenzhistogramm, die zweite für die kumulative Verteilung.

import numpy as np; np.random.seed(0) 
import matplotlib.pyplot as plt 

x = np.random.rayleigh(size=1000) 
y = np.random.normal(size=1000) 
bins = np.linspace(0,4,41) 
h, bins_ = np.histogram(x, bins=bins) 
hcum = np.cumsum(h)/float(np.cumsum(h).max()) 

points = [[.77,-.55],[1.13,1.08],[2.15,-.3]] 
markers = [ur'$\u2660$',ur'$\u2665$',ur'$\u263B$'] 
colors = ["k", "crimson" , "gold"] 
labels = list("ABC") 

kws = dict(height_ratios=[1,1,2], hspace=0.0) 
fig, (axh, axc, ax) = plt.subplots(nrows=3, figsize=(6,6), gridspec_kw=kws, sharex=True) 

cbins = np.zeros(len(bins)+1) 
cbins[1:-1] = bins[1:]-np.diff(bins[:2])[0]/2. 
cbins[-1] = bins[-1] 
hcumc = np.linspace(0,1, len(cbins)) 
hcumc[1:-1] = hcum 
axc.plot(cbins, hcumc, marker=".", markersize="2", mfc="k", mec="k") 
axh.bar(bins[:-1], h, width=np.diff(bins[:2])[0], alpha=0.7, ec="C0", align="edge") 
ax.scatter(x,y, s=10, alpha=0.7) 

for p, m, l, c in zip(points, markers, labels, colors): 
    kw = dict(ls="", marker=m, color=c, label=l, markeredgewidth=0, ms=10) 
    # plot points in scatter distribution 
    ax.plot(p[0],p[1], **kw) 
    #plot points in bar histogram, find bin in which to plot point 
    # shift by half the bin width to plot it in the middle of bar 
    pix = np.searchsorted(bins, p[0], side="right") 
    axh.plot(bins[pix-1]+np.diff(bins[:2])[0]/2., h[pix-1]/2., **kw) 
    # plot in cumulative histogram, interpolate, such that point is on curve. 
    yi = np.interp(p[0], cbins, hcumc) 
    axc.plot(p[0],yi, **kw) 
ax.legend() 
plt.tight_layout() 
plt.show() 

enter image description here

+0

Vielen Dank, dass Sie sich die Zeit genommen haben, eine knappe Antwort zu geben. Ich werde sehen, ob ich diese Arbeit mit meinen Daten machen kann und sehen, wo ich von dort aus gehen kann. – DarthLazar

Verwandte Themen