percentiel berekenen

Status
Niet open voor verdere reacties.

jwaque

Verenigingslid
Lid geworden
16 aug 2006
Berichten
443
ik zou graag het percentiel van een rij getallen berekenen. Nu heb ik daar een code voor gevonden: http://www.tek-tips.com/viewthread.cfm?qid=54516

Maar hoe nu te gebruiken.
Ik heb de code in een module gekopieerd.
vervolgens in mijn query: Expr1: percentile([uitslag];0,9) waarbij uitslag het veld uit mijn tabel is met de getallen.

Dit geeft een mooie lijst met waarde weer maar dat is dezelfde lijst die ik al in mijn uitslagen heb.

De code is te ingewikkeld voor mij en ik weet nu niet waar de fout te zoeken.
 
Hoi,
percentiel is chinees voor mij en de rest van uw vraag ook, of heb je een voorbeeldje? Wat wil je bereiken? De code dat je gevonden hebt is voor access, maar wat is uw bedoeling? Een rij getallen berekenen is normaal gezien voor excel
Greetz
 
Hoi,
percentiel is chinees voor mij en de rest van uw vraag ook, of heb je een voorbeeldje? Wat wil je bereiken? De code dat je gevonden hebt is voor access, maar wat is uw bedoeling? Een rij getallen berekenen is normaal gezien voor excel
Greetz

Voor mij was het ook een raadsel. Als je interesse hebt, google eens op "Percentiel". Misschien wordt het dan wel duidelijk voor je.
 
Ik zou zeggen: doe er vooral een voorbeeldje bij; ik sta niet te popelen om een tabel in te kloppen zonder te weten wat er in moet staan :).
 
percentiel: punt in een gesorteerde reeks getallen, gelegen op de plek waar een vooraf gesteld percentage van de getallen onder ligt.
Ik heb een reeks getallen en ik wil weten bij welk getal, 90% van de getallen lager dan dit getal liggen.
bv reeks 1,2,3,4,5,6,7,8,9,10 dan ligt het 90% percentiel bij 9 (excel rekent 9.1). 90% van 10 getallen=1 getal. 1 getal is de 10. Dus het volgende getal is het 90% percentiel de 9

@octafish: alvast dank. Ik zou ondertussen moeten weten dat een voorbeeldje gewenst is.

tabel: uitslagen
veld: uitslag
query: query4
code: in module3

Bekijk bijlage test percentiel.zip
 
Een vraagje, waar gebruik je in uw geval zo een evaluatie constructie voor? Ik maak veel uitslagen voor wedstrijden; is het de bedoeling om bv te laten weergeven hoeveel atleten er trager waren dan de bewuste atleet en hoeveel er sneller waren?
 
We gebruiken het als grenswaarde.
In onze steriele ruimte monitoren we hoeveel 'bacterieen' er vallen tijden het werk. het maximale aantal wat we vinden in 90 van de 100 metingen beschouwen we als normaal. Helaas is het aantal bacterien niet normaal verdeeld waardoor standaard statistiek waarden (gemiddelde) niet gebruikt kunnen worden.
Dit komt denk ongeveel wel overeen met hoeveel atleten sneller of minder snel zijn. Maar dan voor atleten uit verschillende klasse door elkaar. dan is het niet meer eerlijk te zeggen dat de gemiddelde tijd x minuten is, de spreiding in hun eindtijd is enorm). Omdat atleten uit een lagere klasse er logisch langer over doen dan degene uit de hogere klasse. Maar je kan wel zeggen 90% van de atleten doet er x minuten over.
 
Ik ga het bekijken. Mediaan is het 50ste percentiel. Maar ik zou nr 90 kunnen opzoeken.
 
Je functie werkt prima, maar niet in een query. En dat is logisch; in een query werk je op veld/record basis. Maar je wilt een resultaat (lees: één) uit de complete tabel hebben. Daarvoor heb je dus maar één resultaatveld nodig, bijvoorbeeld op een formulier. Je hebt dus sowieso een recordset nodig die alle waarden inleest in een string. Die string 'voer' je aan de functie Percentile en die gaat dan rekenen. De functies zelf kunnen ook wat beter en korter, dus een voorbeeldje ziet er dan zo uit, op basis van een formulier met een tekstveld txtPercentile:

Code:
Private Sub Form_Current()
Dim sUitslag As String
Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT Uitslag FROM uitslagen")
    With rs
        Do Until .EOF
            If Not sUitslag = "" Then sUitslag = sUitslag & ","
            sUitslag = sUitslag & .Fields(0)
            .MoveNext
        Loop
    End With
    Me.txtPercentile = Percentile(sUitslag, 0.9)
End Sub

De functie Percentile heb ik ongemoeid gelaten, want die zal wel kloppen. De functie CountCSVWords kan dus makkelijker:
Code:
Function CountCSVWords(S) As Integer
Dim arr As Variant
    arr = Split(S, ",")
    CountCSVWords = UBound(arr) + 1
End Function
 
Octafish dank je wel voor de uitleg. Het werkte niet direct maar met een kleine aanpassing wel. Ik heb de getallen op volgorde gezet:
Code:
Set rs = CurrentDb.OpenRecordset("SELECT Uitslag FROM uitslagen order by uitslag")

en in de percentiel functie Z laten berekenen mbt van de varindex ipv de varindex af te ronden naar 1. ik weet niet helemaal wat de maker van de code met het getal 20 wilde maar misschien had hij standaard 20 getallen.

Code:
Public Function Percentile(varValues As String, varIndex As Double) As Variant

'Public Function Percentile(varValues As String, varIndex As Integer) As Variant
' Given n = number of values
' 1st => z = (n+1)/20
' 19th => z = 19*(n+1)/20
' If n is odd, take the zth number in the set
' If n is even, take the zth number, then take the remainder of z * the difference of the zth number and the next number
'MsgBox "varindex" & varIndex, vbOKCancel

'If varIndex >= 1 And varIndex <= 20 Then
    
    Dim n As Integer
    Dim z As Variant
    Dim varTemp1 As Variant
    Dim varTemp2 As Variant
    Dim varDiff As Variant
    'How many values are there?
    n = CountCSVWords(varValues)
    
    If n = 1 Then
        Percentile = Int(GetCSVWord(varValues, 1))
      Else
        'z = varIndex * (n + 1) / 20
        z = varIndex * n
        
        If n Mod 2 = 0 And n <> Int(z) Then 'Even Number of values
            varTemp1 = GetCSVWord(varValues, Int(z))
            varTemp2 = GetCSVWord(varValues, Int(z) + 1)
            varDiff = varTemp2 - varTemp1
            Percentile = Int(varTemp1 + (varDiff * (z - Int(z))))
            
          Else ' Odd number of values
            Percentile = Int(GetCSVWord(varValues, Int(z)))
        End If
      End If
      
 ' Else
  '  Percentile = "N/A"
'End If

End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan