kleine Mathe-Spielereien

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

28.12.23
Hier eine Liste mit wIchtigen Begriffen und Parametern
für die Statistik
Gute Zeit ODSWALD

Python Statistik wIchtige Begriffe und Parameter, die man kennen sollte.
Methode Beschreibung

count Anzahl der Nicht-NA-Werte
min, max Berechnung der Mindest- und Höchstwerte
argmin, argmax Berechnung der Indexstellen (ganze Zahlen),
an denen der Mindest- bzw. Höchstwert erreicht wurde
idxmin, idxmax Berechnung der Indexbeschriftungen, an denen der
Mindest- bzw. Höchstwert erreicht wurde

quantile Berechnung des Stichprobenquantils im Bereich von 0 bis 1
sum Summe der Werte
mean Arithmetisches Mittel der Werte
median Arithmetischer Median (50%-Quantil) der Werte
mad Mittlere absolute Abweichung vom Mittelwert

prod Produkt aller Werte
var Stichprobenvarianz der Werte
std Stichprobenstandardabweichung der Werte
skew Stichprobenschiefe (drittes Moment) der Werte
kurt Stichprobenwölbung (viertes Moment) der Werte
cumsum Kumulierte Summe der Werte
cummin, cummax Kumuliertes Minimum bzw. Maximum der Werte

cumprod Kumuliertes Produkt der Werte
diff Berechnung der ersten arithmetischen Differenz (nützlich für Zeitreihen)
pct_change Berechnung der prozentualen Veränderungen

µ Mittelwert, Erwartungswert
σ oder ϕ (phi) Standardabweichung
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

29.12.2023
Warum brauchen wir Tests auf die Eignung von
Zufallszahlen für bestimmte Verteilungen ?
Das soll am Beispiel des Kolmolgorov-Tests
für die Nomalverteilung gezeigt werden

Die Normalverteilung ist die wichtigste Verteilung.
Erst wenn wir diese richtig verstanden haben
können wir 'Statistik' verstehen
Gute Zeit OSWALD

Code: Alles auswählen


#Nehmen wir an, wir hätten soeben eine
#Zufallsstichprobe aus einer Poissont-Verteilung gezogen
#und möchten jetzt wissen, ob  diese Zufallszahlen jetzt 
#auch normalverteilt wären.

import numpy as np
from numpy.random import seed
from numpy.random import poisson

# Dieses Beispiel reproduzierbar machen
seed(100)

# Generieren Sie einen Datensatz mit 100 Werten, die einer Poisson-Verteilung mit Mittelwert = 5 folgen
data = poisson(5, 100)
#Der folgende Code zeigt, wie ein Kolmogorov-Smirnov-Test an dieser Stichprobe von 100 Datenwerten durchgeführt wird, um festzustellen, ob sie aus einer Normalverteilung stammen:

from scipy.stats import kstest
# Kolmogorov-Smirnov-Test durchführen
print(kstest(data, 'norm'))

#KstestResult(statistic=0.9072498680518208, pvalue=1.0908062873170218e-103)
#Aus der Ausgabe können wir erkennen, dass die Teststatistik 0,9072 und der entsprechende p-Wert 1,0908e-103 beträgt.
#Da der p-Wert kleiner als 0,05 ist, lehnen wir die Nullhypothese ab. Wir haben genügend Beweise, um zu sagen,
#dass die Probendaten nicht aus einer Normalverteilung stammen.

#Dieses Ergebnis sollte auch nicht überraschen,
#da wir die Beispieldaten mit der Funktion poisson() generiert haben,
#die Zufallswerte generiert, die einer Poisson-Verteilung folgen.

#Beispiel 2: Kolmogorov-Smirnov-Test mit zwei Proben
#Angenommen, wir haben die folgenden zwei Beispieldatensätze:

from numpy.random import seed
from numpy.random import randn
from numpy.random import lognormal

# Dieses Beispiel reproduzierbar machen
seed(1000)

# Generieren Sie zwei Datensätze
data1 = randn(100)
data2 = lognormal(3, 1, 100)
#Der folgende Code zeigt, wie ein Kolmogorov-Smirnov-Test an diesen beiden Proben durchgeführt wird,
#um festzustellen, ob sie aus derselben Verteilung stammen:

from scipy.stats import ks_2samp

# Kolmogorov-Smirnov-Test durchführen
print(ks_2samp(data1, data2))
#Beide  Ergebnisse sind ==NULL.
#KstestResult(statistic=0.99, pvalue=4.417521386399011e-57)
#Aus der Ausgabe können wir erkennen, dass die Teststatistik 0,99 und der entsprechende p-Wert 4,4175e-57 beträgt.
#Da der p-Wert kleiner als 0,05 ist, lehnen wir die Nullhypothese ab.
#Wir haben genügend Beweise, um zu sagen, dass die beiden Beispieldatensätze nicht aus derselben Verteilung stammen.

OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

29.12.23
Ich muss mich jetzt intensiv mit der Normalverteilung
befassen, denn sie ist in der Regel die Grundlage
für jede Statistik.
Hier ein ein Beispiel. My und Sigma dabei die
ersten Parameter, die auch in der VFormel von Gauß
enthalten sind.
Auch alle anderen Verteilungen basieren auf (komplizierten)
Formeln. Die visuelle Darstellung der Verteilungen helfen
dabei die Zusammenhänge besser zu verstehen.

Code: Alles auswählen

import numpy as np
import matplotlib. pyplot as plt
from scipy. stats import norm

#x-axis ranges from -3 and 3 with .001 steps
x = np. arange (-3, 3, 0.01)

# Normalverteilung 
# Mttelwert  = 0   /   negativ  =  Linksveerschiebung  ,positiv  Rechtsverschiebung
# Standardabweichung(std)   =1         Std steigend  --> Amplitude sinkend, Basis breiter   
                                                           # und umgekehrt

#x-axis ranges from -3 and 3 with .001 steps
x = np. arange (-3, 3, 0.001)

print("Zwei veränderliche Parameter wirksam ")  
plt. plot (x, norm. pdf (x, 0, 0.4))         #  pdf = Wahrscheinlichkeitsdichte
plt. plot(x,norm. cdf (x, 2, 1))             #  cdf =  Wahrscheinlichkeitsverteiliung
plt.title("Standartiisierte Normalverteilung (MY =0,Std =1) ") 
plt.grid()
plt.show()
















OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

29.1223
Und noch zwei wichtige Tools
zur Kontrolle von Verteilungen.
OSWALD
#########################
Schiefe
ist eine Möglichkeit, die Form einer Verteilung abzuschätzen und zu messen.
Es ist eine wichtige statistische Methode zur Schätzung asymmetrischen Verhaltens
und nicht zur Berechnung der Häufigkeitsverteilung.
Sein Wert kann entweder positiv oder negativ sein.


Kurtosis . Ein Maß für den Umfang, in dem es Ausreißer gibt.
Bei einer Normalverteilung ist der Wert der Kurtosis gleich 0.
Ein positiver Wert für die Kurtosis gibt an,
dass die Daten mehr extreme Ausreißer als eine normale Verteilung enthalten.# Importing library


Code: Alles auswählen

#################################################
from scipy.stats import skew 
  
# Creating a dataset 
dataset = [88, 85, 82, 97, 67, 77, 74, 86,  
           81, 95, 77, 88, 85, 76, 81] 
  
# Calculate the skewness =Schiefe
print(skew(dataset, axis=0, bias=True))
from scipy.stats import kurtosis 
  
# Creating a dataset 
dataset = [88, 85, 82, 97, 67, 77, 74, 86, 
           81, 95, 77, 88, 85, 76, 81] 
  
  
# Calculate the kurtosis =Kurtosis
print(kurtosis(dataset, axis=0, bias=True))

OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

30.12.2023
In der Statstik spielt die Varianzanalyse eine wichtige Rolle.
Deshalb muss ich den Begriff Varianz ganz besonders
gut untersuchen.

Die Varianz ist ein Streuungsmaß,
welches die Verteilung von Werten um den Mittelwert kennzeichnet.
Sie ist das Quadrat der Standardabweichung.
Berechnet wird die Varianz,
indem die Summe der quadrierten Abweichungen aller Messwerte vom arithmetischen Mittel
durch die Anzahl der Messwerte dividiert wird.
Man kann die Varianz aus Datensätzen einfach ermitteln.
Hier ein Beispiel für die Berechnung der Varianz aus Datensätzen
OSWALD

Code: Alles auswählen

 


########################
import statistics

# Berechne  die Varianz bei unterschiedlichen Streuungen von  Msswerten 
print(statistics.variance([1, 3, 5, 7, 3, 1]))
print(statistics.variance([2, 2.5, 1.25, 3.1, 1.75, 2.8]))
print(statistics.variance([-11, 5.5, -3.4, 7.1]))
print(statistics.variance([1, 1, 1, 1]))
########################
 
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

2.1.2024
Der zentrale Grenzwertsatz ist für das Verständnis
der sog. 'Wahrscheinlichkeit' von größter Bedeutung.
Der zentrale Grenzwertsatz
besagt, dass eine Summe von sehr vielen unabhängigen identisch
verteilten Zufallsvariablen mit endlicher Varianz approximativ normalverteilt ist.
Mit anderen Worten:
Je höher die Anzahl der Zufallszahlen in einer beliebigen Verteilung,
umso mehr nähert sich die Form j e d e r Verteilung einer Normalverteilung.
Dafür jetzt ein Beispiel anhand der Binomial-Verteilung.
Die Binomialverteilung ermittelt die Wahrscheinlichkeit z.B. für den
Mümzwurf. Es gibt hier nur zwei Möglichkeiten,JA oder Nein. Wie oft muss
die Münze geworfen werden, um eine gewisse Wahrscheinlichkeit für die
eine oder andere Seite der Münze zu bestimmen.

In der gezeigten Binomialverteilung verändern wir n (Anzahl der Würfe)
z.B. von 10 auf 10000.
Wir sehen auf der Grafik, wie sich die die Kurve immer mehr der einer Normalverteilung
nähert. Gleichzeitig ändern sich auch alle Parameter,

Code: Alles auswählen

import numpy as np
from scipy.stats import binom
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
 
#################################
#Zufällige Variablen.
#pmf(k, n, p, loc=0)         =     Wahrscheinlichkeitsmassenfunktion.
#cdf(k, n, p, loc=0)           =    Verteilungsfunktion.
#logcdf(k, n, p, loc=0)      =     Protokoll der kumulativen Verteilungsfunktion.
#ppf(q, n, p, loc=0)          =     Prozentpunktfunktion (Kehrwert von cdf– Perzentilen).
###################################
#Berechnen Sie die ersten fünf Momente:
n = 10
#n = 100,10000 usw  
p = 0.8
mean, var, skew, kurt = binom.stats(n, p, moments='mvsk')
print("Mittel-o.Erwartungswert",mean)
print("Varianz",var)
print("Schiefe",skew)
print("Kurtosis",kurt)
print("Standartabweichung",(var**(1/2)))

#Zeigen Sie die Wahrscheinlichkeitsmassenfunktion an ( pmf):
x = np.arange(binom.ppf(0.01, n, p),
              binom.ppf(0.99, n, p))
ax.plot(x, binom.pmf(x, n, p), 'bo', ms=8, label='binom pmf')
ax.vlines(x, 0, binom.pmf(x, n, p), colors='b', lw=5, alpha=0.5)

#Alternativ kann das Verteilungsobjekt (als Funktion) aufgerufen werden,
#um Form und Position festzulegen.
#Dies gibt ein „eingefrorenes“ RV-Objekt zurück, das die angegebenen Parameter festhält.
#Frieren Sie die Verteilung ein und zeigen Sie das eingefrorene an pmf:

rv = binom(n, p)
ax.vlines(x, 0, rv.pmf(x), colors='k', linestyles='-', lw=1,
        label='frozen pmf')
ax.legend(loc='best', frameon=False)
plt.show() 



OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

]3.1.2024
Nach der Binomialverteilung war es nicht weit
zum Binnomialkoeffizienten , inhaltlich jedoch
ein völlig anderes und komliziertes Thema..
Nicht etwa für Python, jedoch mathmeatisch , was seine
Anwendung in Kombination mit der Verteilung anbelangt.

Binomialkoeffizient
Anwendung in der Binomialverteilung.
Münzwurf Wahrscheinlichkeit 50%
Der Binomialkoeffizient gibt die Anzahl der Möglichkeiten an,
aus einer Menge von n Elementen k Elemente auszuwählen, ohne dass
es auf die Reihenfolge der Auswahl ankommt

Berechnung :
Beispiel : 5 über 3 = 5 über (5-2) = 10
Das bedeutet: wieviele Würfe sind noch notwendig ,
um aus fünf geworfenen Münzen 3 mal Kopf (=Erfolg) zu erhalten:
# Formel : 5 über 3/ bzw [ n über (n-k)]
Gute Zeit OSWALD

Code: Alles auswählen


import math
n = int(input("Anzahl der(erfolgten) Würfe "))  
k = int(input("Anzahl gewünschter Erfolge: "))  

if k == 1 or k == n:
     if k > n:
        print(0)        
else:
    a = math.factorial(n)
    b = math.factorial(k)
    div = a // (b*(n-k))
   # print(div)  
  
print("Bei einer Wahrscheinlchkeit von 50%  ")
print("benötigt man  " , div , " Würfe, um ",k  ,"ERFOLGE  zu erreichen.")













[/code]
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

3.1.2024
Das ist eelgante Lösung des gkeichen Problems
import scipy.special
print(scipy.special.binom(5, 3))
#########################
Oswald
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

4.1.2024
Mit meinem heutigen Wissensstand über Python und Co
müsste ich eigentlich in der Lage sein, den Inhalt dieses Codes
zu verstehen und nachzuvollziehen.
Es handelt sich um eine ANOVA,, also eine Varianzanalyse.
Python ist quasi aus 'einzelnen "Bausteinen" aufgebaut,
die man in fertigen Programmen erkenen und damit
den Lernprozess beschleunigen kann.
Ich werde mich jetzt damit intensiv beschäftigen.
Gute Zeit OSWALD

Code: Alles auswählen


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats


sample_size = 100

groupA = np.random.normal(10, 10, sample_size)
groupB = np.random.normal(70, 10, sample_size)
groupC = np.random.normal(40, 10, sample_size)

category = ['GroupA']*sample_size + ['GroupB']*sample_size + ['GroupC']*sample_size

df = pd.DataFrame({'value': np.concatenate([groupA, groupB, groupC]),
                   'category': category})

groupA = df[df['category']=='GroupA']['value']
groupB = df[df['category']=='GroupB']['value']
groupC = df[df['category']=='GroupC']['value']

 
# Perform a paired t-test
F_statistic, p_value = stats.f_oneway(groupA, groupB, groupC)

# Get means
mean_groupA = groupA.mean()
mean_groupB = groupB.mean()
mean_groupC = groupC.mean()

# Print the results
print("T-statistic:", F_statistic)
print("P-value:", p_value)
print("Mean groupA:", mean_groupA)
print("Mean groupB:", mean_groupB)
print("Mean groupC:", mean_groupC)
#T-statistic: 960.8980055803397 P-value: 2.0225642197230424e-130 Mean groupA: 8.745526783582141 Mean groupB: 70.56101076624377 Mean groupC: 40.310280651985394

#Let's round them in order to make the chart more readable at the end

F_statistic = round(F_statistic,2)
p_value = round(p_value,5) # more decimal since it's a lower value in general
mean_groupA = round(mean_groupA,2)
mean_groupB = round(mean_groupB,2)
mean_groupC = round(mean_groupC,2)
#Boxplot with statistical elements
#Now let's use the stats we got above and add them to the plot of boxplots of each group using the text() function from matplotlib.

#For this graph, we'll also add the average of each group next to its associated boxplot.


# Group our dataset with our 'Group' variable
grouped = df.groupby('category')['value']

# Init a figure and axes
fig, ax = plt.subplots(figsize=(8, 6))

# Create the plot with different colors for each group
boxplot = ax.boxplot(x=[group.values for name, group in grouped],
                     labels=grouped.groups.keys(),
                     patch_artist=True,
                     medianprops={'color': 'black'}
                    ) 

# Define colors for each group
colors = ['orange', 'purple', '#69b3a2']

# Assign colors to each box in the boxplot
for box, color in zip(boxplot['boxes'], colors):
    box.set_facecolor(color)
    
# Add the p value and the t
p_value_text = f'p-value: {p_value}'
ax.text(0.7, 50, p_value_text, weight='bold')
f_value_text = f'F-value: {F_statistic}'
ax.text(0.7, 45, f_value_text, weight='bold')

# Add the mean for each group
ax.text(1.2, mean_groupA, f'Mean of Group A: {mean_groupA}', fontsize=10)
ax.text(2.2, mean_groupB, f'Mean of Group B: {mean_groupB}', fontsize=10)
ax.text(2, mean_groupC, f'Mean of Group C: {mean_groupC}', fontsize=10)

# Add a title and axis label
ax.set_title('One way Anova between group A, B and C')

# Add a legend
legend_labels = ['Group A', 'Group B', 'Group C']
legend_handles = [plt.Rectangle((0,0),1,1, color=color) for color in colors]
ax.legend(legend_handles, legend_labels)

# Display it
plt.show()

#Violin plot with statistical elements
# Group our dataset with our 'Group' variable
grouped = df.groupby('category')['value']

# Init a figure and axes
fig, ax = plt.subplots(figsize=(8, 6))

# Create the plot with different colors for each group
violins = ax.violinplot([group.values for name, group in grouped],
                     #labels=grouped.groups.keys()
                    ) 

# Define colors for each group
colors = ['orange', 'purple', '#69b3a2']

# Assign colors to each box in the boxplot
for violin, color in zip(violins['bodies'], colors):
    violin.set_facecolor(color)
    
# Add the p value and the t
p_value_text = f'p-value: {p_value}'
ax.text(0.7, 50, p_value_text, weight='bold')
F_value_text = f'F-value: {F_statistic}'
ax.text(0.7, 45, F_value_text, weight='bold')

# Add the mean for each group
ax.text(1.25, mean_groupA, f'Mean of Group A: {mean_groupA}', fontsize=10)
ax.text(2.25, mean_groupB, f'Mean of Group B: {mean_groupB}', fontsize=10)
ax.text(2, mean_groupC, f'Mean of Group C: {mean_groupC}', fontsize=10)

# Add a title and axis label
ax.set_title('One way Anova between group A, B and C')

# Add a legend
legend_labels = ['Group A', 'Group B', 'Group C']
legend_handles = [plt.Rectangle((0,0),1,1, color=color) for color in colors]
ax.legend(legend_handles, legend_labels)

# Display it
plt.show()

#Customized violin plot with statistics
# Group our dataset with our 'Group' variable
grouped = df.groupby('category')['value']

# Init a figure and axes
fig, ax = plt.subplots(figsize=(8, 6))

# Create the plot with different colors for each group
violins = ax.violinplot([group.values for name, group in grouped],
                     #labels=grouped.groups.keys()
                    ) 

# Define colors for each group
colors = ['orange', 'purple', '#69b3a2']

# Assign colors to each box in the boxplot
for violin, color in zip(violins['bodies'], colors):
    violin.set_facecolor(color)
    
# Add the p value and the t
p_value_text = f'p-value: {p_value}'
ax.text(0.7, 60, p_value_text)
F_value_text = f'F-value: {F_statistic}'
ax.text(0.7, 55, F_value_text)

# Add the mean for each group
ax.text(1.3, mean_groupA, f'Mean Group A: {mean_groupA}',
        style='italic', fontsize=8)
ax.text(2.3, mean_groupB, f'Mean Group B: {mean_groupB}',
        style='italic', fontsize=8)
ax.text(2.2, mean_groupC, f'Mean Group C: {mean_groupC}',
        style='italic', fontsize=8)

# Remove axis labels
ax.set_xticks([])
ax.set_yticks([])

# Removes spines
ax.spines[['right', 'top', 'left', 'bottom']].set_visible(False)

# Add a title and axis label
ax.set_title('One way Anova\nbetween group A, B and C', weight='bold')

# Add a legend
legend_labels = ['Group A', 'Group B', 'Group C']
legend_handles = [plt.Rectangle((0,0),1,1, color=color, alpha=0.5) for color in colors]
ax.legend(legend_handles, legend_labels, loc='upper left')

# Display it
plt.show()


OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

5.1.2024
Um die Struktur dieser Anova besser zu verstehen,
habe ich eine zusätzliche Gruppe eingerichtet und
zwar nicht mit dem Mittelwert, sondern mit dem Wert der Varianz.
Es wäre natürlich möglich noch zusätzlich zwei weitere
Gruppen mit den Werten der Varianz einzusetzen.
Die Varianz ändert sich so wie der Mittelwert mit
jedem Lauf, denn die Daten sind Zuafallswerte.
Der nächste Schritt ist , die jetzt 4 Gruppen alle auf
Varianz umzustellen, denn auch die Varianz lässt die
Abweichungen von den Mittelwerten gut erkennen.
Gute Zeit OSWALD
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

7.1.2024
Eine weitere wichtige Wahrscheinlichkeits-Verteilung
ist die MultinomialVerteilung , quasi eine
Erweiterung der inomiaVerteilung in der
"unendlichen Geschichte der Statistik".
Gute Zeit OSWALD


Code: Alles auswählen

# Die Multinomialverteilung oder Polynomialverteilung ist eine Wahrscheinlichkeitsverteilung
# in der Stochastik. Sie ist eine diskrete Wahrscheinlichkeitsverteilung
# und kann als multivariate Verallgemeinerung der Binomialverteilung aufgefasst werden.
# Beide  arbeiten  nach dem gleichen Prinzip.

#:Beispiele
#Bei einer Dreierwahl zum Bürgermeister erhält
#        Kandidat A 10% der Stimmen,
#        Kandidat B 40% der Stimmen und
#      Kandidat C 50% der Stimmen.
#Wenn wir eine Zufallsstichprobe von 10 Wählern auswählen, wie groß ist die Wahrscheinlichkeit,dass
#         2 für Kandidat A,
#       4 für Kandidat B und
#     4 für Kandidat C gestimmt haben?
#Wir können den folgenden Code in Python verwenden, um diese Frage zu beantworten:

from scipy.stats import multinomial
#multinomiale Wahrscheinlichkeit berechnen
print(multinomial.pmf(x=[2, 4, 4], n=10, p=[.1, .4, .5]))

                                        
#           Wenn wir  eine Zufallsstichprobe von 12 Wählern auswählen,
##         wie groß ist die Wahrscheinlichkeit, dass
#                        3    für Kandidat A,
#                        2    für Kandidat B , 
#                        3    für Kandidat C ,                 
#                        4    für Kandidat D              gestimmt haben?   
#Wir können den folgenden Code in Python verwenden, um diese Frage zu beantworten:
from scipy.stats import multinomial
#multinomiale Wahrscheinlichkeit berechnen
 
print(multinomial.pmf(x=[ 3, 3 ,2 ,4  ], n=12, p=[0.2, 0.2 ,0.3 ,0.3 ]))
###############################################
 
 
#Angenommen, eine Urne enthält 6 gelbe Kugeln, 2 rote Kugeln und 2 rosa Kugeln.
#Wenn wir zufällig 4 Kugeln aus der Urne auswählen und sie ersetzen,
#wie groß ist die Wahrscheinlichkeit, dass alle 4 Kugeln gelb sind?

 #multinomiale Wahrscheinlichkeit
print( multinomial .pmf (x=[4, 0, 0], n=4, p=[0.6,0.2,0.2]))


##########################################################
#     Zwei Schüler spielen Schach gegeneinander.
#     Die Wahrscheinlichkeit, dass Schüler A ein bestimmtes Spiel gewinnt, beträgt 0,5,
#     die Wahrscheinlichkeit,  dass Schüler B ein bestimmtes Spiel gewinnt, beträgt 0,3
#     und die Wahrscheinlichkeit, dass sie in einem bestimmten Spiel unentschieden spielen, beträgt 0,2.

#     Wenn sie 10 Spiele spielen, wie groß ist die Wahrscheinlichkeit,      dass
#     Spieler A viermal gewinnt,
#     Spieler B fünfmal gewinnt
#     und das Spiel  einmal unentschieden ausgeht? 

#multinomiale Wahrscheinlichkeit
print( multinomial.pmf (x=[4, 5, 1], n=10, p=[0.5,0.3,0.2]))

OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

8.1.2024
arange und linspace
Immer wieder erwische ich mich dabei,
diese beiden numpy-Fumktionen falsch einzusetzen.
Deshalb habe ich mir diese Aufstellung zusammengestellt.
Gute Zeit OSWALD

Code: Alles auswählen


#wichtige NUMPY-Funktionen
1.Die numpy.arange-Funktion
Syntax

numpy.arange(start, stop, step, dtype)   #####################

Start: Beginn des Intervalls für np.arange in der Python-Funktion.
Stoppen: Ende des Intervalls.
Schritt: Abstand zwischen Werten. Der Standardschritt ist 1.
Dtyp: Ist eine Art Array-Ausgabe für NumPy arange in Python.

Beispiel:
np.arange(1, 11)
Wenn Sie den Schritt in dieser NumPy-Arange-Funktion im Python-Beispiel ändern möchten,
können Sie eine dritte Zahl in die Klammer einfügen. Es wird den Schritt ändern.

np.arange(1, 14, 4)
Ausgang:
array([ 1,  5,  9, 13]
########################

2.NumPy Linspace-Funktion
Linspace liefert gleichmäßig verteilte Samples.
Syntax:

numpy.linspace(start, stop, num, endpoint)               ######################

Start: Startwert der Sequenz
Stoppen: Endwert der Sequenz
Num: Anzahl der zu generierenden Proben.   (   Der Standardwert ist 50)
Endpunkt: Wenn True (Standard), ist stop der letzte Wert
 Bei „False“ wird der Stoppwert nicht berücksichtigt.

Beispiel:
Damit können damit z.B.  10 Werte von 1 bis 5 in gleichmäßigen Abständen erstellt werden.
np.linspace(1.0, 5.0, num=10)
Ausgang:
array([1.        , 1.44444444, 1.88888889, 2.33333333, 2.77777778,  3.22222222, 3.66666667, 4.11111111, 4.55555556, 5.        ])

Wenn man die letzte Ziffer nicht in das Intervall einbeziehen möchte , kann man den Endpunkt   auf false setzen
np.linspace(1.0, 5.0, num=5, endpoint=False)
Ausgang:
array([1. , 1.8, 2.6, 3.4, 4.2])
 
[code]
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

14.1.2024
Die ebenfalls diskrete hypergeometrische Verteilung wird nicht so
häufig eingesetzt und ist ähnlich der BinomialVerteilung,
jedoch mit dem Unterschied, dass bei der Hyp.Vert.
die gezogenen Werte nicht zurückgeholt werden.
Die Grundgesamtzahl verändert sich dabei.
Am Beispiel von " Lotto 6 aus 49 " habe ich diese Verteilung ausprobiert.
Sie ist besser für große Zahlen geeignet. Deshalb werden hier
die sehr kleinen Werte gar nicht mehr dargestellt.
Die Arbeit mit dieser Materie trägt jedenfalls sehr zum Verständnis bei.
Gute Zeit OSWALD

Code: Alles auswählen


#                              Die hypergeometrische Verteilung 
 #       die diskrete Wahrscheinlichkeitsfunktion  ( pmf) ,
 #       bestimmte Anzahl von Erfolgen (k )
#        bestimmte Anzahl von Ziehungen ( n)
#        erfolgeriche Ziehungen(M)
#        endliche Grundgesamtheit (N )
#        kann   auch  in Lotto "6 aus 49 "oder "5 aus  50"   eingesetzt  werden.
#        Wie hoch   ist die Wahrscheinlichkeit (pmf) , z.B.
#        um  man  bei  6 Ziehungen       4 Richtige aus  49   zu ziehen.                                            
#        Wahrscheinlichkeit ist <=1  oder NULL)                                   
#        Jede  gezogene Zahl hat eine eigene pmf imGegensatz  rur binomial-V.

import numpy as np
from scipy.stats import hypergeom
import matplotlib.pyplot as plt
 
 
N=49                         #Anzahl  der  Zufallszahlen
n= 6                           #Anzahl der möglichen  Ziehungen
M=4
#erfolgreiche Ziehung


rv = hypergeom(N, n, M)
x = np.arange(0, n +1)
pmf = rv.pmf(x)
print("Wahrscheinlichkeits-Funktion", (pmf))
 
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, pmf, 'ro')
ax.vlines(x, 0, pmf, lw=4)
 
ax.set_ylabel('%-SatzWahrscheinlichkeit')
ax.set_xlabel("Anzahl der Ziehungen")
ax.set_ylabel("Wahrscheinlichkeit")
plt.title( '6 aus49  und gezogene Zahlen ohne Zurücklegen')

plt.show()
print("Erwartungswert   mean  ",  (n*M)/N)

OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

20.012024
Wieder einmal konnte ich meinem Spieltrieb nicht widerstehen.
und 'sinnlos' mit der äusserst flexiblen Gauss-Formel zur Summenbildung
'gespielt .Alles nur zur Entspannung.
Mit dem kleien Programmlassnen sich die viefältigsten Daten gewinnen.
Die gewonnenen Daten jabe ich in ein Programm zur Bildung
von kordinaten eingesetzt.
Die abgewandelte Gauss-Formel und das Ergebns zeige ch
nun.
Gute Zeit OSWALD

Code: Alles auswählen

#Gauss-Summen ,  abgewandelt zur Erzeugung von    
#    Original - Formel                          s =   n(n+1) / 2

s= 0
k =0                                         
n = 10

while k <= n:
    k =  k  +  1
    s = s + k
    k = k  - 0.02
    print(k)
    print(s)    
###############################

mport matplotlib.pyplot as plt
import numpy as np

plt.rcParams["figure.figsize"] = [10, 10]
plt.rcParams["figure.autolayout"] = True

N = 20

x =  [0.99,
1,
1.98,
2.99,
2.97,
5.97000000000001,
3.9600000000000004,
9.940000000000001,
4.950000000000001,
14.900000000000002,
5.940000000000001,
20.85,
6.9300000000000015,
27.790000000000003,
7.920000000000002,
35.720000000000006,
8.910000000000002,
44.64000000000001,
9.900000000000002,
54.55000000000001,
10.890000000000002,
65.45000000000002]
                                                                                      #  np.random.rand(N)
y = np.random.rand(22)

plt.plot(x, y, 'ro')

for xy in zip(x, y):
   plt.annotate('(%.2f, %.2f)' % xy, xy=xy)
plt.grid(True)
plt.title("Jeder Punkt mit Koordinaten")
plt.show()

OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

24.01.2024
In der Statistik wurde seit jeher auch die sog. Kontingenz-Tabelle
sehr häufig in der Datenanalyse eingesetzt.
Früher war das oft sehr mühevoll, heute
dank der Pandas-Bibliothedk eine Leichtigkeit.
Gute Zeit OSWALD

Code: Alles auswählen


#Aus der Pandas - Bibliothek
#Die Kreuztabelle oder Kontingenztabelle ist ein häufig verwendetes Datenanalyse Werkzeug,
#das dabei hilft, komplexe Daten aufzuschlüsseln,
#um sinnvolle Beziehungen zwischen mehreren Variablen abzuleiten.

import pandas  as pd
df = pd.DataFrame({'Beruf': ['Arzt','Arzt','Ärztin','Physiker','Physiker',' Physiker','Physiker', 'Biologin', 'Biologin', 'Geologe'],
                                'Alter': [28, 26, 30, 26, 29, 24, 28, 23, 36, 29],
                                'Geschlecht': ['m','m',' w', 'w', 'm', 'm', 'm',' w', 'm', 'm'],
                                'Gehalt € '   :  [ 3600, 3450,3500,3900 ,3200,4000,4200,4100,3100,2900]}) 
print(df)
 
pd.crosstab(index=df['Beruf'], columns='count')
print(pd.crosstab(index=df['Beruf'], columns='count'))
 
pd.crosstab(index=df['Alter'], columns='count') 
print(pd.crosstab(index=df['Alter'], columns='count') )

 
tab = pd.crosstab(index=df['Alter'], columns='count')
print(pd.crosstab(index=df['Alter'], columns='count'))
tab/tab.sum()
pd.crosstab(index=df['Alter'], columns=['Beruf'])

OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

27z.01.2024
Noch einmal zurück zum Thema
Hypergeometrische Verteilung .
Nach langer Beschäftigung mit dem ' Fall 6 aus 49'
stellte sich heraus, dass die Berechnung
von exakten Ergebnissen mit der visualisierten
Darstellung problemnatisch ist. Diese können
nur mathematsch, also auf Basis der Kombinatorik,
sprich mittels Fakultäten und dem Binomialkoeffizient erreicht werden.
Wie etwa berechnet man ' 49 über 43' schnell und richtig ?
Oder wie wird der richtige Bin -Koeff. berechnet ?
"cipy. spezial"
stellt eine geeignete Funktion zur Verfügung.
Gute Zeit OSWALD

Code: Alles auswählen

#Berechnung von Fakultäten  
import scipy.special

print(scipy.special.binom(49,43 ))
print(scipy.special.binom(6, 2 ))
print(scipy.special.binom(6, 3 ))
print(scipy.special.binom(6, 4 ))
print(scipy.special.binom(6, 5 ))
print(scipy.special.binom(6, 6 ))

OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

27.01.2024
Mit scipy.spezial und numpy
kann mit fakultät auch in narrays
gerechnet werden.
Ein Beispiel
OSWALD

Code: Alles auswählen

from scipy.special import factorial
import numpy as np

array = np.array([[1, 3, 5], [2, 4, 6]])
factorials = factorial(array)
print(factorials)

array2 = np.array([[6, 3, 4], [5, 4, 7]])
factorials = factorial(array2)
print(factorials)
 






OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

28.01.2024
Gleiches geht natürlich auch mit sympy.
OSWALD

Code: Alles auswählen

from sympy import Symbol, Rational, binomial, expand_func
n = Symbol('n', integer=True, positive=True)
print(binomial(49,43) )
print(binomial(6,6 ))
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

28.01.2024Eine wichtige Funktion aus der
numpy-Bibliothek,die vielleicht in
Srfochastik gerbraucht wird.
OSWALD

Code: Alles auswählen

 
import numpy as np
from numpy import *

#Teilung duech beliebige Skalare 
 
arr = np.array([8, 2*np.cos(3), 15, 18, 22, 34])
arr2 = np.divide(arr,np.sin(pi))
print(arr2)
 
#Teilung elemmentweise
arr = [16, 28, 33, 38, 45]
arr1 = [4, 8, 13, 5, 3]
arr2 = np.divide(arr, arr1)
print(arr2)
# Operator- Einsatz
arr = np.array([16, 28, 33, 38, 45])
arr1 = np.array([4.7, 8, 13, 5, 3])
arr2 = arr/arr1
print(arr2)
#Teilung zwischen Multiarrays 
 
arr = [[15, 23, 32], [9, -17, 25]]
arr1 = [[3, 5, 8], [-2, 4, 7]]
arr2 = np.divide(arr, arr1) 
print(arr2)
print("DIVIDE durch NULL      Fehler       ")
#arr = [16, 28, 33, 38, 45]
#arr1 = [4, 8, 0, 5, 0]
#arr2 = np.divide(arr, arr1)
 
 
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

Python und seine Bibliotheken stellen alle Funktionen bereit, die für die Berechnungen in
Stochastik und Statistik notwendig werden.Es geht also hier wieder einmal über Zufall.
Das Wort Stochastik ist ein Sammelbegriff für die Gebiete Wahrscheinlichkeitstheorie und Statistik.
Dieses Teilgebiet der Mathematik untersucht die mathematische Modellierung zufälliger Ereignisse
und findet daher in praktisch allen empirischen Disziplinen Anwendung.

Die sog. Nullhypothese bedeutet, dass zwischen den betrachteten Variablen k e i n e Korrelation besteht.
Die Nullhypothese wird umgekehrt abgelehnt , wenn eine solche Beziehung besteht. (Antihypothese)

Die scipy.stats.pearsonr() Methode zum Finden des Korrelationskoeffizienten

Der Korrelationswert kann zwischen -1 und + 1 liegen:
+1 – vollständige positive Korrelation
+0,8 – starke positive Korrelation
+0,6 – mäßige positive Korrelation
0 – überhaupt keine Korrelation
-0,6 – mäßige negative Korrelation
-0,8 – starke negative Korrelation
-1 – vollständige negative Korrelation
Der Pearson Korreationstest:
hier als einfaches ein Beispiel für zahlreiche andere Methoden
zur Berechnung der Korrelation
OSWALD

Code: Alles auswählen

import scipy
from scipy import stats

arr1 = [3, 6, 9, 12]
arr2 = [12, 10, 11, 11]
r, p = scipy.stats.pearsonr(arr1, arr2)

print("Der Pearson-KorrelationsKoeffizient(r)  = :", r)
print("Die Wahrscheinlichkeit ( p-value)            = :", p)
 
p-Wert: ist der   sog.Wahrscheinlichkeits-Signifikanzwert.


Antworten