Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Harmittel statt Mittelwert

Begonnen von fred-neumann, Februar 19, 2016, 16:22:37

⏪ vorheriges - nächstes ⏩

fred-neumann

Ich ermittel Durchschnittswerte, welche als Basis für weitere Berechnungen dienen (beispielsweise zur Berechnung von Abweichung und Varianz).
Vor allem wenn man Werte in Dezimalzahlen nutzt ist es der falsche Ansatz, einfach nur das arithmetische Mittel der zu analysierenden Werte zu bilden,- dies führt oft zu einem irreführenden Ergebnis.

Excel bietet neben der Funktion Mittelwert() die zB für Dezimalwerte wesentlich genauere Funktion Harmittel()
Beispiel:
Mittelwert (arithmetische Mittel)
(2,75 + 1,48 + 2,41 + 1,45 + 1,36) / 5 = 1,89000

Harmittel (harmonische Mittel)
5 / ((1 / 2,75) + (1 / 1,48) + (1 / 2,41) + (1 / 1,45) + (1 / 1,36)) = 1,73659

Man kann deutlich sehen, dass die beiden Berechnungen zu unterschiedlichen Ergebnissen führen!
Leider finde ich in Access die Funktion Harmittel() nicht,- kann mir ein Experte evt. diese Funktion bitte für meine Abfragen schreiben?

DF6GL

Hallo,

eine Access-Routine kann (will) ich Dir nicht schreiben, aber beschrieben, wie die Excel-Funktion aus Access aufrufbar wird:

--Verweis auf die entspr. Excel-Library setzen

--Eine Instanz von Excel erzeugen (und ggfls. wieder schließen).

Die Funktion etwa so aufrufen:

dblHarmonMittel = Excel.Application.WorksheetFunction.HarMittel(1 / 2.75 + 1 / 1.48 + 1 / 2.41 + 1 / 1.45 + 1 / 1.36 )
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

database

Hallo,

schau mal hier - den letzten Beispielseintrag:

https://www.vb-paradise.de/index.php/Thread/9687-Mathematik-mit-VBA-Teil-1-Primzahlen-Bruchrechnen-Kombinatronik-und-Statistik/

fred-neumann

Hallo DF6GL & database,
danke für die Aufmerksamkeit und Tipp`s!
_____________
database, der vba-code ...

Function harmMittel(ParamArray x() As Variant) As Double
    'Liefert das harmonische Mittel der "x"-Werte.
    Dim n As Integer, i As Integer
    n = UBound(x) + 1
    harmMittel = 0
    For i = 0 To n - 1
       harmMittel = harmMittel + 1 / x(i)
    Next
    harmMittel = n / harmMittel
End Function

... ist das harmonische Mittel, welches ich aus Excel kenne und auch in Access anwenden werde,- danke für den Link.
Der vba-code bezieht sich ja auf Werte in einem Datensatz, kann man nun diesen code umwandeln, so das er das "harmonische Mittel" der Werte eines Feldes (Spalte) ermittelt?

database

Hi,

nein bezieht sich nicht auf Werte in einem Datensatz sondern auf Werte, die in einem Array übergeben werden.

Und wo stehen deine Werte? In einer Excel-Tabelle oder einer Access-Tabelle?

fred-neumann

jo database,- bin echt nicht fit in Access!
Die Werte, denen ich den (harmonischen) Mittelwert entnehmen möchte, stehen in der Access Tabelle "Stamm" mit dem Feldname "Quote".

database

Na dann...  ;)

Du könntest also folgendes machen:

Du erstellst dir eine weitere Funktion, welche die Daten für das Array sammelt

Public Function QuoteEinlesen() As Variant

     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim varQuote() As Variant
     'Die aktuelle Datenbank zuweisen
     Set db = CurrentDb
     'Das Recordset mit den Quoten-Werten erstellen
     Set rst = db.OpenRecordset("SELECT Quote FROM Stamm", dbOpenDynaset)

    'Werte ins Array schreiben
     Do While Not rst.EOF
         ReDim Preserve varQuote(rst.AbsolutePosition)
         varQuote(rst.AbsolutePosition) = rst!Quote
         rst.MoveNext
     Loop
     'Alles sauber machen
     Set db = Nothing
     Set rst = Nothing
     'Array an die aufrufende Function abliefern
     QuoteEinlesen = varQuote
End Function



Und diese Function rufst du aus deiner Arbeitsfunktion auf um das Array mit den Werten zu bekommen



Function harmMittel() As Double
   
    Dim n As Integer, i As Integer
    Dim varQuote() As Variant
    'Füllen des Array veranlassen
    varQuote = QuoteEinlesen

    'Liefert das harmonische Mittel der "x"-Werte.
    n = UBound(varQuote) + 1
    harmMittel = 0
    For i = 0 To n - 1
       harmMittel = harmMittel + 1 / varQuote(i)
    Next
    harmMittel = n / harmMittel
End Function



Natürlich könnte das Ganze auch noch verkürzt in einer einzigen Function zusammengefasst werden - so ist's etwas übersichtlicher - glaub' ich

fred-neumann

Okay Peter,
ich setz das heute Abend mal um und melde mich am Samstag (jauchzend oder jubelnd) nochmals,- bis denne

database

Na dann trainiere mal das Jauchzen!    :) :D ;D

fred-neumann

Prima database,
der code ist zwar sehr speziell (auf eine bestimmte Datei und Feldnamen ausgerichtet) aber er hilft mir, das harmonische Mittel zu ermitteln.
Ich hoffe, dass ich eines Tages dies auch mal selbst gebacken bekomme :-)
Peter, danke für die viele Mühe!

Beaker s.a.

Hallo Fred,
Zitatder code ist zwar sehr speziell (auf eine bestimmte Datei und Feldnamen ausgerichtet)
SQL-Strings kann man auch mit Variablen zusammen setzen.
Übergebe der Function also Tabellen- und Feldname als Parameter, und setze den SQL-String entsprechend zusammen:
"SELECT " & Feldname & " FROM " & Tabellenname
hth
ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

fred-neumann

Na kloar Ekkehard,
aber dafür ist mein Access-Wissen noch zu Banane :-)
Die Lösung von database nutze ich;
Alternativ könnte ich die Abfrage mit Feld "Quote" um einen Ausdruck ergänzen zB,

QuotenTeiler: 1 / [Quote]


.. und in einer weiteren Abfrage (die ohnehin vorhanden ist) einen Ausdruck einsetzen,

Harmittel:Anzahl([Quote]) / Summe([QuotenTeiler])


Auch so errechnet sich das harmonische Mittel.

Ich danke euch beiden und werde bestimmt bald wieder mit ner Frage auftauchen,-
bis denne