C Szablony

Uwagi

  • Arkusze Google są oczywiście udostępnione tylko do odczytu. Aby skorzystać z szablonów, należy zalogować się na konto Google, a następnie wybrać z menu Plik > Utwórz kopię.

  • W arkuszach starałem się zachować następującą konwencję, jeżeli chodzi o kolory:

    • Zielony kolor oznacza miejsca, które należy zmienić (np. wprowadzić dane).

    • Żółtym kolorem zaznaczono najważniejsze wyniki, nie powinno się zmieniać formuł w tych polach ani nic wpisywać.

  • Niektóre komórki mogą zawierać obliczenia, mimo że wyglądają na puste. Należy zachować ostrożność i nie nadpisywać tych komórek.

  • Szablony w Excel mogą nie działać w Excelu 2007 ze względu na ograniczoną dostępność funkcji statystycznych w tej wersji Excela. Użytkowników Excela 2007 proszę o zgłaszanie, które arkusze nie działają – być może uda się znaleźć obejście.

C.1 Wzór Bayesa

Wzór Bayesa — arkusz Google

Wzór Bayesa — szablon w Excelu: Bayes.xlsx

# Oznaczenia hipotez (opcjonalnie)
hipotezy <- c("Choroba", "Brak choroby")

# Zaczątek (rozkład a priori, ang. prior)
prior <- c(.001, .999)

# Zdarzalność (prawdopodobieństwa warunkowe danych, ang. likelihood)
likelihood <- c(.95, .01)

# Wyznaczenie wyniku (rozkładu a posteriori, ang. posterior)
posterior <- prior*likelihood
posterior <- posterior/sum(posterior)

# Sprawdzenie
if(length(prior)!=length(likelihood))
{print("Liczebność wektorów prior (zaczątek) i likelihood (zdarzalność) powinna być równa. ")}
if(sum(prior)!=1){
  print("Suma prawdopodobieństw w rozkładzie zaczątkowym (prior) powinna być równa 1.")}
if (!exists("hipotezy") || length(hipotezy)!=length(prior)) {
  hipotezy <- paste0('H', 1:length(prior))
}

# Wynik w formie ramki danych:
print(data.frame(
  Hipotezy = hipotezy, `Zaczątek` = prior, `Zdarzalność` = likelihood, `Wynik` = posterior
))
##       Hipotezy Zaczątek Zdarzalność      Wynik
## 1      Choroba    0.001        0.95 0.08683729
## 2 Brak choroby    0.999        0.01 0.91316271
# Wykres
library(ggplot2)

hipotezy<-factor(hipotezy, levels=hipotezy)

df <- data.frame(Hipotezy = c(hipotezy, hipotezy),
                 `Rozkład` = factor(c(rep("zaczątek", length(prior)), rep("wynik", length(posterior))), 
                                    levels=c("zaczątek", "wynik")
                 ),
                 `Prawdopodobieństwo` = c(prior, posterior)
)

ggplot(data=df, aes(x=Hipotezy, y=`Prawdopodobieństwo`, fill=`Rozkład`)) +
  geom_bar(stat="identity", position=position_dodge())+
  geom_text(aes(label = format(round(`Prawdopodobieństwo`,4), nsmall=4), group=`Rozkład`), 
            position = position_dodge(width = .9), vjust = -0.2)

# Oznaczenia hipotez (opcjonalnie)
hipotezy = ["Choroba", "Brak choroby"]

# Zaczątek (rozkład a priori, ang. prior)
prior = [.001, .999]

# Zdarzalność (prawdopodobieństwa warunkowe danych, ang. likelihood)
likelihood = [.95, .01]

# Wyznaczenie wyniku (rozkładu a posteriori, ang. posterior)
posterior = [a*b for a, b in zip(prior, likelihood)]
posterior = [p/sum(posterior) for p in posterior]

# Sprawdzenie
if len(prior) != len(likelihood):
    print("Liczebność wektorów prior (zaczątek) i likelihood (zdarzalność) powinna być równa.")
if sum(prior) != 1:
    print("Suma prawdopodobieństw w rozkładzie zaczątkowym (prior) powinna być równa 1.")
if not "hipotezy" in locals() or len(hipotezy) != len(prior):
    hipotezy = ["H" + str(i) for i in range(1, len(prior)+1)]

# Wynik w formie ramki danych:
import pandas as pd
df = pd.DataFrame({
    "Hipotezy": hipotezy,
    "Zaczątek": prior,
    "Zdarzalność": likelihood,
    "Wynik": posterior
})
print(df)
##        Hipotezy  Zaczątek  Zdarzalność     Wynik
## 0       Choroba     0.001         0.95  0.086837
## 1  Brak choroby     0.999         0.01  0.913163
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(len(hipotezy)) 
width = 0.375

fig, ax = plt.subplots(layout='constrained')

rects = ax.bar(x-width/2, np.round(prior, 4), width, label = 'zaczątek')
ax.bar_label(rects, padding=3)

rects = ax.bar(x+width/2, np.round(posterior, 4), width, label = 'wynik')
ax.bar_label(rects, padding=3)
ax.set_ylabel('prawdopodobieństwo')
ax.set_xlabel('hipotezy')
ax.set_xticks(x, hipotezy)
ax.legend(loc='upper left', ncols=2)
#ax.set_ylim(0, np.max([prior, posterior])*1.2)
plt.show()

C.2 Rozkłady

C.2.1 Dyskretna zmienna losowa

Dyskretna zmienna losowa – kalkulator — arkusz Google

Dyskretna zmienna losowa – kalkulator — szablon w Excelu

# Rozkład dyskretny jednej zmiennej
x <- c(0, 1, 4)
Px <- c(1/3, 1/3, 1/3)

# Sprawdzenie
if(length(x)!=length(Px))
{print("Oba wektory powinny być równej długości.")}
if(!sum(Px)==1)
{print("Prawdopodobieństwa powinny sumować się do 1. ")}
if(any(Px<0))
{print("Prawdopodobieństwa nie mogą być ujemne. ")}

# Obliczenia
EX <- sum(x*Px)
VarX <- sum((x-EX)^2*Px)
SDX <- sqrt(VarX)
SkX <- sum((x-EX)^3*Px)/SDX^3
KurtX <- sum((x-EX)^4*Px)/SDX^4 - 3

print(c('Wartość oczekiwana' = EX, 
        'Wariancja' = VarX,
        'Odchylenie standardowe' = SDX,
        'Skośność' = SkX,
        '(Nadwyżkowa) kurtoza' = KurtX))
##     Wartość oczekiwana              Wariancja Odchylenie standardowe 
##               1.666667               2.888889               1.699673 
##               Skośność   (Nadwyżkowa) kurtoza 
##               0.528005              -1.500000
# Rozkład dyskretny dwóch zmiennych
x <- c(2, -1, -1)
y <- c(-1, 1, -1)
Pxy <- c(1/2, 1/3, 1-1/2-1/3) #sum(c(1/2, 1/3, 1/6))==1 zwraca czasem FALSE z powodów numerycznych
# Sprawdzenie
if(length(x)!=length(y) || length(x)!=length(Pxy))
{print("Wektory powinny być równej długości. ")}
if(!sum(Pxy)==1)
{print("Prawdopodobieństwa powinny sumować się do 1. ")}
if(any(Pxy<0))
{print("Prawdopodobieństwa nie mogą być ujemne. ")}

EX <- sum(x*Pxy)
VarX <- sum((x-EX)^2*Pxy)
SDX <- sqrt(VarX)
SkX <- sum((x-EX)^3*Pxy)/SDX^3
KurtX <- sum((x-EX)^4*Pxy)/SDX^4 - 3

EY <- sum(y*Pxy)
VarY <- sum((y-EY)^2*Pxy)
SDY <- sqrt(VarY)
SkY <- sum((y-EY)^3*Pxy)/SDY^3
KurtY <- sum((y-EY)^4*Pxy)/SDY^4 - 3

CovXY <- sum((x-EX)*(y-EY)*Pxy)
CorXY <- CovXY/(SDX*SDY)

print(c('Wartość oczekiwana X' = EX, 
        'Wariancja X' = VarX,
        'Odchylenie standardowe X' = SDX,
        'Skośność X' = SkX,
        '(Nadwyżkowa) kurtoza X' = KurtX,
        'Wartość oczekiwana Y' = EY, 
        'Wariancja Y' = VarY,
        'Odchylenie standardowe Y' = SDY,
        'Skośność Y' = SkY,
        '(Nadwyżkowa) kurtoza Y' = KurtY,
        'Kowariancja X i Y' = CovXY,
        'Korelacja X i Y' = CorXY
))
##     Wartość oczekiwana X              Wariancja X Odchylenie standardowe X 
##             5.000000e-01             2.250000e+00             1.500000e+00 
##               Skośność X   (Nadwyżkowa) kurtoza X     Wartość oczekiwana Y 
##            -3.289550e-17            -2.000000e+00            -3.333333e-01 
##              Wariancja Y Odchylenie standardowe Y               Skośność Y 
##             8.888889e-01             9.428090e-01             7.071068e-01 
##   (Nadwyżkowa) kurtoza Y        Kowariancja X i Y          Korelacja X i Y 
##            -1.500000e+00            -1.000000e+00            -7.071068e-01
# Rozkład dyskretny jednej zmiennej
x = [0, 1, 4]
Px = [1/3, 1/3, 1/3]

# Sprawdzenie
if len(x) != len(Px):
    print("Oba wektory powinny być równej długości.")
if sum(Px) != 1:
    print("Prawdopodobieństwa powinny sumować się do 1. ")
if any(p < 0 for p in Px):
    print("Prawdopodobieństwa nie mogą być ujemne. ")

# Obliczenia
EX = sum([a*b for a, b in zip(x, Px)])
VarX = sum([(a-EX)**2*b for a, b in zip(x, Px)])
SDX = VarX**0.5
SkX = sum([(a-EX)**3*b for a, b in zip(x, Px)]) / SDX**3
KurtX = sum([(a-EX)**4*b for a, b in zip(x, Px)]) / SDX**4 - 3

# Wyniki
print({'Wartość oczekiwana': EX,
       'Wariancja': VarX,
       'Odchylenie standardowe': SDX,
       'Skośność': SkX,
       '(Nadwyżkowa) kurtoza': KurtX})
## {'Wartość oczekiwana': 1.6666666666666665, 'Wariancja': 2.888888888888889, 'Odchylenie standardowe': 1.699673171197595, 'Skośność': 0.5280049792181879, '(Nadwyżkowa) kurtoza': -1.5000000000000002}
# Rozkład dyskretny dwóch zmiennych
x = [2, -1, -1]
y = [-1, 1, -1]
Pxy = [1/2, 1/3, 1-1/2-1/3]

# Sprawdzenie
if len(x) != len(y) or len(x) != len(Pxy):
    print("Wektory powinny być równej długości. ")
if sum(Pxy) != 1:
    print("Prawdopodobieństwa powinny sumować się do 1. ")
if any(p < 0 for p in Pxy):
    print("Prawdopodobieństwa nie mogą być ujemne. ")

# Obliczenia
EX = sum([a*b for a, b in zip(x, Pxy)])
VarX = sum([(a-EX)**2*b for a, b in zip(x, Pxy)])
SDX = VarX**0.5
SkX = sum([(a-EX)**3*b for a, b in zip(x, Pxy)]) / SDX**3
KurtX = sum([(a-EX)**4*b for a, b in zip(x, Pxy)]) / SDX**4 - 3

EY = sum([a*b for a, b in zip(y, Pxy)])
VarY = sum([(a-EY)**2*b for a, b in zip(y, Pxy)])
SDY = VarY**0.5
SkY = sum([(a-EY)**3*b for a, b in zip(y, Pxy)]) / SDY**3
KurtY = sum([(a-EY)**4*b for a, b in zip(y, Pxy)]) / SDY**4 - 3

CovXY = sum([(a-EX)*(b-EY)*c for a, b, c in zip(x, y, Pxy)])
CorXY = CovXY / (SDX*SDY)

# Wyniki
print({'Wartość oczekiwana X': EX,
       'Wariancja X': VarX,
       'Odchylenie standardowe X': SDX,
       'Skośność X': SkX,
       '(Nadwyżkowa) kurtoza X': KurtX,
       'Wartość oczekiwana Y': EY,
       'Wariancja Y': VarY,
       'Odchylenie standardowe Y': SDY,
       'Skośność Y': SkY,
       '(Nadwyżkowa) kurtoza Y': KurtY,
       'Kowariancja X i Y': CovXY,
       'Korelacja X i Y': CorXY
})
## {'Wartość oczekiwana X': 0.5, 'Wariancja X': 2.25, 'Odchylenie standardowe X': 1.5, 'Skośność X': -3.289549702593056e-17, '(Nadwyżkowa) kurtoza X': -2.0, 'Wartość oczekiwana Y': -0.33333333333333337, 'Wariancja Y': 0.888888888888889, 'Odchylenie standardowe Y': 0.9428090415820634, 'Skośność Y': 0.7071067811865478, '(Nadwyżkowa) kurtoza Y': -1.4999999999999991, 'Kowariancja X i Y': -1.0, 'Korelacja X i Y': -0.7071067811865476}

C.2.2 Sparametryzowane rozkłady dyskretne

Kalkulator dla rozkładów dyskretnych — arkusz Google

Kalkulator dla rozkładów dyskretnych — szablon w Excelu: Rozkłady_dyskretne.xlsx

# Rozkład dwumianowy
n <- 18
p <- 0.6
from <- 12
to <- 14

result <- pbinom(to, n, p)-pbinom(from-1, n, p)
if (from > to) {
  # błąd od > do
  print("!!! Wartość 'od' nie może być większa od wartości 'do' !!!")
} else {
  p=paste0("P(", from, " <= X <= ", to, ")")
  print(p)
  print(result)
}
## [1] "P(12 <= X <= 14)"
## [1] 0.3414956
# Rozkład Poissona
lambda <- 5/3
from <- 2
to <- Inf

result <- ppois(to, lambda)-ppois(from-1, lambda)
if (from > to) {
  # błąd od > do
  print("!!! Wartość 'od' nie może być większa od wartości 'do' !!!")
} else {
  p=paste0("P(", from, " <= X <= ", to, ")")
  print(p)
  print(result)
}
## [1] "P(2 <= X <= Inf)"
## [1] 0.4963317
# Rozkład hipergeometryczny
N <- 49
r <- 6
n <- 6
from <- 3
to <- 6

result <- phyper(to, r, N-r, n)-phyper(from-1, r, N-r, n)
if (from > to) {
  # błąd od > do
  print("!!! Wartość 'od' nie może być większa od wartości 'do' !!!")
} else {
  p=paste0("P(", from, " <= X <= ", to, ")")
  print(p)
  print(result)
}
## [1] "P(3 <= X <= 6)"
## [1] 0.01863755
from scipy.stats import binom, poisson, hypergeom

# Rozkład dwumianowy
n = 18
p = 0.6
_from = 12
_to = 14
result = binom.cdf(_to, n, p) - binom.cdf(_from-1, n, p)
if _from > _to:
    print("!!! Wartość 'od' nie może być większa od wartości 'do' !!!")
else:
    p = "P(" + str(_from) + " <= X <= " + str(_to) + ")"
    print(p)
    print(result)
## P(12 <= X <= 14)
## 0.34149556326865305
    
# Rozkład Poissona
lambda_val = 5/3
from_val = 2
to_val = float('inf')

result = poisson.cdf(to_val, lambda_val) - poisson.cdf(from_val-1, lambda_val)

if from_val > to_val:
    print("!!! Wartość 'od' nie może być większa od wartości 'do' !!!")
else:
    p = "P(" + str(from_val) + " <= X <= " + str(to_val) + ")"
    print(p)
    print(result)
## P(2 <= X <= inf)
## 0.49633172576650164
    
# Rozkład hipergeometryczny
N = 49
r = 6
n = 6
_from = 3
_to = 6

result = hypergeom.cdf(_to, N, r, n) - hypergeom.cdf(_from-1, N, r, n)

if _from > _to:
    print("!!! Wartość 'od' nie może być większa od wartości 'do' !!!")
else:
    p = "P(" + str(_from) + " <= X <= " + str(_to) + ")"
    print(p)
    print(result) 
## P(3 <= X <= 6)
## 0.018637545002022304

C.2.3 Rozkłady ciągłe

Kalkulator dla rozkładu normalnego — arkusz Google

Kalkulator dla rozkładu normalnego — szablon w Excelu: Kalkulator_rozkladu_normalnego.xlsx

##### 1. Pole pod krzywą #####
# Parametry rozkładu Gaussa:
# średnia:
m <- 0
# odchylenie standardowe:
sd <- 2

# Będziemy obliczać pole pod krzywą gęstości rozkładu Gaussa
# od 
# *można wpisać from <- -Inf, co oznacza minus nieskończoność
from <- -Inf
# do
# *można wpisać to <- Inf, co oznacza (plus) nieskończoność
to <- 2

# Sprawdzenie danych, obliczenie pola pod krzywą
if (from > to) {
  # błąd od > do
  print("!!! Wartość 'od' powinna być niższa od wartości 'do' !!!")
} else {
  
  # Zapis prawdopodobieństwa
  
  if (to==Inf) {
    p=paste0("P(X>", from, ")")
  } else if (from==-Inf) {
    p=paste0("P(X<", to, ")")
  } else {
    p=paste0("P(", from, "<X<", to, ")")
  }
  print(p)
  
  # Obliczenie prawdopodobieństwa, czyli pole pod wycinkiem krzywej:
  result<-pnorm(to, m, sd)-pnorm(from, m, sd)
  print(result)
}
## [1] "P(X<2)"
## [1] 0.8413447
# Rysunek
library(ggplot2)

x1=if(from==-Inf){min(-4*sd+m, to-2*sd)} else {min(from-2*sd, -4*sd+m)}
x2=if(to==Inf){max(4*sd+m, from+2*sd)} else {max(to+2*sd, 4*sd+m)}

df<-data.frame(y=c(0, 0), 
               x=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}),
               label=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}))

plt<-ggplot(NULL, aes(c(x1, x2))) +
  theme_minimal() +
  xlab('') +
  ylab('') +
  geom_area(stat = "function", 
            fun = function(x){dnorm(x, m, sd)}, 
            fill = "orange", 
            xlim = c(if(from==-Inf){x1}else{from}, if(to==Inf){x2}else{to})) +
  geom_line(stat = "function", fun = function(x){dnorm(x, m, sd)}, col = "blue", lty=2, lwd=1) +
  scale_x_continuous(breaks=c(m, m-sd, m-2*sd, m+sd, m+2*sd, m-3*sd, m+3*sd, m-4*sd, m+4*sd)) +
  geom_point(data = df, aes(x=x, y=y), shape=4) +
  geom_text(data = df, aes(x=x, y=y, label=signif(label, 6)), vjust=1.4) +
  annotate("text", label = paste0("M = ", m, "\nSD = ", sd, "\n", p, " = ", signif(result,6)), 
           x = x1, y = dnorm(m, m, sd)*1.2, size = 6, hjust="inward", vjust = "inward")

suppressWarnings(print(plt))

##### 2. Szukaj x #####
# Parametry rozkładu Gaussa:
# średnia:
m <- 1
# odchylenie standardowe:
sd <- 3

# Zadane pole pod krzywą:
P <- 0.95

# 'L' - lewostronne, 'P' - prawostronne, 'S' - symetryczne
typ <- 'L'

# Obliczenia
from <- -qnorm(if(typ=='L'){1} else if(typ=='P'){P} else {1-(1-P)/2})*sd+m
to <- qnorm(if(typ=='L'){P} else if(typ=='P'){1} else {1-(1-P)/2})*sd+m

# Zapis prawdopodobieństwa
if (to==Inf) {
  p=paste0("P(X>", signif(from, 6), ")")
} else if (from==-Inf) {
  p=paste0("P(X<", signif(to, 6), ")")
} else {
  p=paste0("P(", signif(from, 6), " < X < ", signif(to, 6), ")")
}
print(paste0(p, " = ", P))
## [1] "P(X<5.93456) = 0.95"
# Rysunek
library(ggplot2)

x1=if(from==-Inf){min(-4*sd+m, to-2*sd)} else {min(from-2*sd, -4*sd+m)}
x2=if(to==Inf){max(4*sd+m, from+2*sd)} else {max(to+2*sd, 4*sd+m)}

df<-data.frame(y=c(0, 0), 
               x=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}),
               label=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}))

plt<-ggplot(NULL, aes(c(x1, x2))) +
  theme_minimal() +
  xlab('') +
  ylab('') +
  geom_area(stat = "function", 
            fun = function(x){dnorm(x, m, sd)}, 
            fill = "orange", 
            xlim = c(if(from==-Inf){x1}else{from}, if(to==Inf){x2}else{to})) +
  geom_line(stat = "function", fun = function(x){dnorm(x, m, sd)}, col = "blue", lty=2, lwd=1) +
  scale_x_continuous(breaks=c(m, m-sd, m-2*sd, m+sd, m+2*sd, m-3*sd, m+3*sd, m-4*sd, m+4*sd)) +
  geom_point(data = df, aes(x=x, y=y), shape=4) +
  geom_text(data = df, aes(x=x, y=y, label=signif(label, 6)), vjust=1.4) +
  annotate("text", label = paste0("M = ", m, "\nSD = ", sd, "\n", p, " = ", P), 
           x = x1, y = dnorm(m, m, sd)*1.2, size = 6, hjust="inward", vjust = "inward")

suppressWarnings(print(plt))

from scipy.stats import norm
##### 1. Pole pod krzywą #####
# Parametry rozkładu Gaussa:
# średnia:
m = 0
# odchylenie standardowe:
sd = 2
# Będziemy obliczać pole pod krzywą gęstości rozkładu Gaussa
# od 
# *można wpisać _from = float('-inf'), co oznacza minus nieskończoność
_from = float('-inf')
# to
_to = 2

if _from > _to:
    print("!!! Wartość 'od' powinna być niższa od wartości 'do' !!!")
else:
    if _to == float('inf'):
        p = "P(X>" + str(_from) + ")"
    elif _from == float('-inf'):
        p = "P(X<" + str(_to) + ")"
    else:
        p = "P(" + str(_from) + "<X<" + str(_to) + ")"
    print(p)

    result = norm.cdf(_to, m, sd) - norm.cdf(_from, m, sd)
    print(result)
## P(X<2)
## 0.8413447460685429
##### 2. Szukaj x #####

import numpy as np
from scipy.stats import norm

# Parametry rozkładu Gaussa:
# średnia:
m = 1
# odchylenie standardowe:
sd = 3

# Zadane pole pod krzywą:
P = 0.95

# 'L' - lewostronne, 'P' - prawostronne, 'S' - symetryczne
typ = 'L'

# Obliczenia
if typ == 'L':
    _from = -norm.ppf(1) * sd + m
    _to = norm.ppf(P) * sd + m
elif typ == 'P':
    _from = -norm.ppf(P) * sd + m
    _to = norm.ppf(1) * sd + m
else:
    _from = -norm.ppf(1-(1-P)/2) * sd + m
    _to = norm.ppf(1-(1-P)/2) * sd + m

# Zapis prawdopodobieństwa
if np.isinf(_to):
    p = f"P(X>{np.round(_from, 6)})"
elif np.isinf(_from):
    p = f"P(X<{np.round(_to, 6)})"
else:
    p = f"P({np.round(_from, 6)} < X < {np.round(_to, 6)})"
print(f"{p} = {P}")
## P(X<5.934561) = 0.95

Kalkulator dla rozkładu t-Studenta — arkusz Google

Kalkulator dla rozkładu t-Studenta — szablon w Excelu: Kalkulator_rozkładu_t.xlsx

##### 1. Pole pod krzywą #####
# Parametr rozkładu t:
# liczba stopni swobody:
nu <- 23

# Będziemy obliczać pole pod krzywą gęstości rozkładu t-Studenta
# od 
# *można wpisać from <- -Inf, co oznacza minus nieskończoność
from <- 1
# do
# *można wpisać to <- Inf, co oznacza (plus) nieskończoność
to <- Inf

# Sprawdzenie danych, obliczenie pola pod krzywą
if (from > to) {
  # błąd od > do
  print("!!! Wartość 'od' powinna być niższa od wartości 'do' !!!")
} else {
  
  # Zapis prawdopodobieństwa
  
  if (to==Inf) {
    p=paste0("P(X>", from, ")")
  } else if (from==-Inf) {
    p=paste0("P(X<", to, ")")
  } else {
    p=paste0("P(", from, "<X<", to, ")")
  }
  print(p)
  
  # Obliczenie prawdopodobieństwa, czyli pole pod wycinkiem krzywej:
  result<-pt(to, nu)-pt(from, nu)
  print(result)
}
## [1] "P(X>1)"
## [1] 0.1638579
# Rysunek
library(ggplot2)

x1=-5
x2=5

df<-data.frame(y=c(0, 0), 
               x=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}),
               label=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}))

plt<-ggplot(NULL, aes(c(x1, x2))) +
  theme_minimal() +
  xlab('') +
  ylab('') +
  geom_area(stat = "function", 
            fun = function(x){dt(x, nu)}, 
            fill = "orange", 
            xlim = c(if(from==-Inf){x1}else{from}, if(to==Inf){x2}else{to})) +
  geom_line(stat = "function", fun = function(x){dt(x, nu)}, col = "blue", lty=2, lwd=1) +
  geom_point(data = df, aes(x=x, y=y), shape=4) +
  geom_text(data = df, aes(x=x, y=y, label=signif(label, 6)), vjust=1.4) +
  annotate("text", label = paste0("ν = ", nu, "\n", p, " = ", signif(result,6)), 
           x = x1, y = dt(0, nu)*1.2, size = 6, hjust="inward", vjust = "inward")

suppressWarnings(print(plt))

##### 2. Szukaj x #####
# Parametr rozkładu t:
# liczba stopni swobody:
nu <- 23

# Zadane pole pod krzywą:
P <- 0.95

# 'L' - lewostronne, 'P' - prawostronne, 'S' - symetryczne
typ <- 'S'

# Obliczenia
from <- -qt(if(typ=='L'){1} else if(typ=='P'){P} else {1-(1-P)/2}, nu)
to <- qt(if(typ=='L'){P} else if(typ=='P'){1} else {1-(1-P)/2}, nu)

# Zapis prawdopodobieństwa
if (to==Inf) {
  p=paste0("P(X>", signif(from, 6), ")")
} else if (from==-Inf) {
  p=paste0("P(X<", signif(to, 6), ")")
} else {
  p=paste0("P(", signif(from, 6), " < X < ", signif(to, 6), ")")
}
print(paste0(p, " = ", P))
## [1] "P(-2.06866 < X < 2.06866) = 0.95"
# Rysunek
library(ggplot2)

x1=-5
x2=5

df<-data.frame(y=c(0, 0), 
               x=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}),
               label=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}))

plt<-ggplot(NULL, aes(c(x1, x2))) +
  theme_minimal() +
  xlab('') +
  ylab('') +
  geom_area(stat = "function", 
            fun = function(x){dt(x, nu)}, 
            fill = "orange", 
            xlim = c(if(from==-Inf){x1}else{from}, if(to==Inf){x2}else{to})) +
  geom_line(stat = "function", fun = function(x){dt(x, nu)}, col = "blue", lty=2, lwd=1) +
  geom_point(data = df, aes(x=x, y=y), shape=4) +
  geom_text(data = df, aes(x=x, y=y, label=signif(label, 6)), vjust=1.4) +
  annotate("text", label = paste0("ν = ", nu, "\n", p, " = ", P), 
           x = x1, y = dt(0, nu)*1.2, size = 6, hjust="inward", vjust = "inward")

suppressWarnings(print(plt))

from scipy.stats import t
##### 1. Pole pod krzywą #####
# Parametr rozkładu t-Studenta:
# Liczba stopni swobody:
nu = 23

# Będziemy obliczać pole pod krzywą gęstości rozkładu t
# od 
# *można wpisać _from = float('-inf'), co oznacza minus nieskończoność
_from = 1
# to
# *można wpisać _from = float('inf'), co oznacza plus nieskończoność
_to = float('inf')

if _from > _to:
    print("!!! Wartość 'od' powinna być niższa od wartości 'do' !!!")
else:
    if _to == float('inf'):
        p = "P(X>" + str(_from) + ")"
    elif _from == float('-inf'):
        p = "P(X<" + str(_to) + ")"
    else:
        p = "P(" + str(_from) + "<X<" + str(_to) + ")"
    print(p)
    result = t.cdf(_to, nu) - t.cdf(_from, nu)
    print(result)
## P(X>1)
## 0.16385790307142933
    
##### 2. Szukaj x #####

import numpy as np
from scipy.stats import t

# Parametr rozkładu t-Studenta:
# Liczba stopni swobody:
nu = 23

# Zadane pole pod krzywą:
P = 0.95

# 'L' - lewostronne, 'P' - prawostronne, 'S' - symetryczne
typ = 'S'

# Obliczenia
if typ == 'L':
    _from = -t.ppf(1, nu)
    _to = t.ppf(P, nu)
elif typ == 'P':
    _from = -t.ppf(P, nu)
    _to = t.ppf(1)
else:
    _from = -t.ppf(1-(1-P)/2, nu)
    _to = t.ppf(1-(1-P)/2, nu)

# Zapis prawdopodobieństwa
if np.isinf(_to):
    p = f"P(X>{np.round(_from, 6)})"
elif np.isinf(_from):
    p = f"P(X<{np.round(_to, 6)})"
else:
    p = f"P({np.round(_from, 6)} < X < {np.round(_to, 6)})"
print(f"{p} = {P}")
## P(-2.068658 < X < 2.068658) = 0.95

Kalkulator dla rozkładu chi-kwadrat — arkusz Google

##### 1. Pole pod krzywą #####
# Parametr rozkładu chi-kwadrat:
# liczba stopni swobody:
nu <- 4

# Będziemy obliczać pole pod krzywą gęstości rozkładu chi-kwadrat
# od 
# *można wpisać from <- -Inf, co oznacza minus nieskończoność
from <- 10
# do
# *można wpisać to <- Inf, co oznacza (plus) nieskończoność
to <- Inf

# Sprawdzenie danych, obliczenie pola pod krzywą
if (from > to) {
  # błąd od > do
  print("!!! Wartość 'od' powinna być niższa od wartości 'do' !!!")
} else {
  
  # Zapis prawdopodobieństwa
  
  if (to==Inf) {
    p=paste0("P(X>", from, ")")
  } else if (from==-Inf) {
    p=paste0("P(X<", to, ")")
  } else {
    p=paste0("P(", from, "<X<", to, ")")
  }
  print(p)
  
  # Obliczenie prawdopodobieństwa, czyli pole pod wycinkiem krzywej:
  result<-pchisq(to, nu)-pchisq(from, nu)
  print(result)
}
## [1] "P(X>10)"
## [1] 0.04042768
# Rysunek
library(ggplot2)

x1=0
x2=nu*4

df<-data.frame(y=c(0, 0), 
               x=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}),
               label=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}))

plt<-ggplot(NULL, aes(c(x1, x2))) +
  theme_minimal() +
  xlab('') +
  ylab('') +
  geom_area(stat = "function", 
            fun = function(x){dchisq(x, nu)}, 
            fill = "orange", 
            xlim = c(if(from==-Inf){x1}else{from}, if(to==Inf){x2}else{to})) +
  geom_line(stat = "function", fun = function(x){dchisq(x, nu)}, col = "blue", lty=2, lwd=1) +
  geom_point(data = df, aes(x=x, y=y), shape=4) +
  geom_text(data = df, aes(x=x, y=y, label=signif(label, 6)), vjust=1.4) +
  annotate("text", label = paste0("ν = ", nu, "\n", p, " = ", signif(result,4)), 
           x = 4*nu, y = dchisq(max(nu-2,0), nu), size = 6, hjust="inward", vjust = "inward")

suppressWarnings(print(plt))

##### 2. Szukaj x #####
# Parametr rozkładu chi-kwadrat:
# liczba stopni swobody:
nu <- 4

# Zadane pole pod krzywą:
P <- 0.05

# 'L' - lewostronne, 'P' - prawostronne, 'S' - symetryczne
typ <- 'P'

# Obliczenia
from <- qchisq(if(typ=='L'){0} else if(typ=='P'){1-P} else {(1-P)/2}, nu)
to <- qchisq(if(typ=='L'){P} else if(typ=='P'){1} else {1-(1-P)/2}, nu)

# Zapis prawdopodobieństwa
if (to==Inf) {
  p=paste0("P(X>", signif(from, 6), ")")
} else if (from==-Inf) {
  p=paste0("P(X<", signif(to, 6), ")")
} else {
  p=paste0("P(", signif(from, 6), " < X < ", signif(to, 6), ")")
}
print(paste0(p, " = ", P))
## [1] "P(X>9.48773) = 0.05"
# Rysunek
library(ggplot2)

x1=0
x2=nu*4

df<-data.frame(y=c(0, 0), 
               x=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}),
               label=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}))

plt<-ggplot(NULL, aes(c(x1, x2))) +
  theme_minimal() +
  xlab('') +
  ylab('') +
  geom_area(stat = "function", 
            fun = function(x){dchisq(x, nu)}, 
            fill = "orange", 
            xlim = c(if(from==-Inf){x1}else{from}, if(to==Inf){x2}else{to})) +
  geom_line(stat = "function", fun = function(x){dchisq(x, nu)}, col = "blue", lty=2, lwd=1) +
  geom_point(data = df, aes(x=x, y=y), shape=4) +
  geom_text(data = df, aes(x=x, y=y, label=signif(label, 6)), vjust=1.4) +
  annotate("text", label = paste0("ν = ", nu, "\n", p, " = ", P), 
           x = 4*nu, y = dchisq(max(nu-2,0), nu), size = 6, hjust="inward", vjust = "inward")


suppressWarnings(print(plt))

from scipy.stats import chi2
##### 1. Pole pod krzywą #####
# Parametr rozkładu chi-kwadrat:
# Liczba stopni swobody:
nu = 4

# Będziemy obliczać pole pod krzywą gęstości rozkładu chi-kwadrat:
# od 
# *można wpisać _from = float('-inf'), co oznacza minus nieskończoność
_from = 10
# to
# *można wpisać _from = float('inf'), co oznacza plus nieskończoność
_to = float('inf')

if _from > _to:
    print("!!! Wartość 'od' powinna być niższa od wartości 'do' !!!")
else:
    if _to == float('inf'):
        p = "P(X>" + str(_from) + ")"
    elif _from == float('-inf'):
        p = "P(X<" + str(_to) + ")"
    else:
        p = "P(" + str(_from) + "<X<" + str(_to) + ")"
    print(p)
    result = chi2.cdf(_to, nu) - chi2.cdf(_from, nu)
    print(result)
## P(X>10)
## 0.04042768199451274
    
##### 2. Szukaj x #####

import numpy as np
from scipy.stats import chi

# Parametr rozkładu chi-kwadrat:
# Liczba stopni swobody:
nu = 4

# Zadane pole pod krzywą:
P = 0.05

# 'L' - lewostronne, 'P' - prawostronne, 'S' - symetryczne
typ = 'P'

# Obliczenia
if typ == 'L':
    _from = chi2.ppf(0, nu)
    _to = chi2.ppf(P, nu)
elif typ == 'P':
    _from = chi2.ppf(1-P, nu)
    _to = chi2.ppf(1, nu)
else:
    _from = chi2.ppf((1-P)/2, nu)
    _to = chi2.ppf(1-(1-P)/2, nu)

# Zapis prawdopodobieństwa
if np.isinf(_to):
    p = f"P(X>{np.round(_from, 6)})"
elif np.isinf(_from):
    p = f"P(X<{np.round(_to, 6)})"
else:
    p = f"P({np.round(_from, 6)} < X < {np.round(_to, 6)})"
print(f"{p} = {P}")
## P(X>9.487729) = 0.05

Kalkulator rozkładu F — arkusz Google

##### 1. Pole pod krzywą #####
# Parametry rozkładu F:
# liczba stopni swobody 1:
nu1 <- 39
nu2 <- 34

# Będziemy obliczać pole pod krzywą gęstości rozkładu chi-kwadrat
# od 
# *można wpisać from <- -Inf, co oznacza minus nieskończoność
from <- 1
# do
# *można wpisać to <- Inf, co oznacza (plus) nieskończoność
to <- Inf

# Sprawdzenie danych, obliczenie pola pod krzywą
if (from > to) {
  # błąd od > do
  print("!!! Wartość 'od' powinna być niższa od wartości 'do' !!!")
} else {
  
  # Zapis prawdopodobieństwa
  
  if (to==Inf) {
    p=paste0("P(X>", from, ")")
  } else if (from==-Inf) {
    p=paste0("P(X<", to, ")")
  } else {
    p=paste0("P(", from, "<X<", to, ")")
  }
  print(p)
  
  # Obliczenie prawdopodobieństwa, czyli pole pod wycinkiem krzywej:
  result<-pf(to, nu1, nu2)-pf(from, nu1, nu2)
  print(result)
}
## [1] "P(X>1)"
## [1] 0.5030343
# Rysunek
library(ggplot2)

x1=0
x2=qf(.999, nu1, nu2)

df<-data.frame(y=c(0, 0), 
               x=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}),
               label=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}))

plt<-ggplot(NULL, aes(c(x1, x2))) +
  theme_minimal() +
  xlab('') +
  ylab('') +
  geom_line(stat = "function", fun = function(x){df(x, nu1, nu2)}, col = "blue", lty=2, lwd=1) +
  geom_area(stat = "function", 
            fun = function(x){df(x, nu1, nu2)}, 
            fill = "orange", 
            xlim = c(if(from==-Inf){x1}else{from}, if(to==Inf){x2}else{to})) +
  geom_point(data = df, aes(x=x, y=y), shape=4) +
  geom_text(data = df, aes(x=x, y=y, label=signif(label, 6)), vjust=1.4) +
  annotate("text", label = paste0("ν1 = ", nu1, "\n", "ν2 = ", nu2, "\n", p, " = ", signif(result,4)), 
           x = x2, y = df(max((nu1-2)/nu1*nu2/(nu2+2),0), nu1, nu2), size = 6, hjust="inward", vjust = "inward")

suppressWarnings(print(plt))

##### 2. Szukaj x #####
# Parametr rozkładu chi-kwadrat:
# liczba stopni swobody:
nu1 <- 34
nu2 <- 39
  
# Zadane pole pod krzywą:
P <- 0.05

# 'L' - lewostronne, 'P' - prawostronne, 'S' - symetryczne
typ <- 'P'

# Obliczenia
from <- qf(if(typ=='L'){0} else if(typ=='P'){1-P} else {(1-P)/2}, nu1, nu2)
to <- qf(if(typ=='L'){P} else if(typ=='P'){1} else {1-(1-P)/2}, nu1, nu2)

# Zapis prawdopodobieństwa
if (to==Inf) {
  p=paste0("P(X>", signif(from, 6), ")")
} else if (from==-Inf) {
  p=paste0("P(X<", signif(to, 6), ")")
} else {
  p=paste0("P(", signif(from, 6), " < X < ", signif(to, 6), ")")
}
print(paste0(p, " = ", P))
## [1] "P(X>1.72803) = 0.05"
# Rysunek
library(ggplot2)

x1=0
x2=qf(.9999, nu1, nu2)


df<-data.frame(y=c(0, 0), 
               x=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}),
               label=c(if(from==-Inf){NA}else{from}, if(to==-Inf){NA}else{to}))

plt<-ggplot(NULL, aes(c(x1, x2))) +
  theme_minimal() +
  xlab('') +
  ylab('') +
  geom_area(stat = "function", 
            fun = function(x){stats::df(x, nu1, nu2)}, 
            fill = "orange", 
            xlim = c(if(from==-Inf){x1}else{from}, if(to==Inf){x2}else{to})) +
  geom_line(stat = "function", fun = function(x){stats::df(x, nu1, nu2)}, col = "blue", lty=2, lwd=1) +
  geom_point(data = df, aes(x=x, y=y), shape=4) +
  geom_text(data = df, aes(x=x, y=y, label=signif(label, 6)), vjust=1.4) +
  annotate("text", label = paste0("ν1 = ", nu1, "\nν2 = ", nu2, "\n", p, " = ", P), 
           x = x2, y = df(max((nu1-2)/nu1*nu2/(nu2+2),0), nu1, nu2), size = 6, hjust="inward", vjust = "inward")


suppressWarnings(print(plt))

from scipy.stats import f
##### 1. Pole pod krzywą #####
# Parametr rozkładu chi-kwadrat:
# Liczba stopni swobody:
nu1 = 39
nu2 = 34

# Będziemy obliczać pole pod krzywą gęstości rozkładu chi-kwadrat:
# od 
# *można wpisać _from = float('-inf'), co oznacza minus nieskończoność
_from = 1
# to
# *można wpisać _from = float('inf'), co oznacza plus nieskończoność
_to = float('inf')

if _from > _to:
    print("!!! Wartość 'od' powinna być niższa od wartości 'do' !!!")
else:
    if _to == float('inf'):
        p = "P(X>" + str(_from) + ")"
    elif _from == float('-inf'):
        p = "P(X<" + str(_to) + ")"
    else:
        p = "P(" + str(_from) + "<X<" + str(_to) + ")"
    print(p)
    result = f.cdf(_to, nu1, nu2) - f.cdf(_from, nu1, nu2)
    print(result)
## P(X>1)
## 0.5030343220915879
    
##### 2. Szukaj x #####

import numpy as np
from scipy.stats import chi

# Parametr rozkładu chi-kwadrat:
# Liczba stopni swobody:
nu1 = 34
nu2 = 39

# Zadane pole pod krzywą:
P = 0.05

# 'L' - lewostronne, 'P' - prawostronne, 'S' - symetryczne
typ = 'P'

# Obliczenia
if typ == 'L':
    _from = f.ppf(0, nu1, nu2)
    _to = f.ppf(P, nu1, nu2)
elif typ == 'P':
    _from = f.ppf(1-P, nu1, nu2)
    _to = f.ppf(1, nu1, nu2)
else:
    _from = f.ppf((1-P)/2, nu1, nu2)
    _to = f.ppf(1-(1-P)/2, nu1, nu2)

# Zapis prawdopodobieństwa
if np.isinf(_to):
    p = f"P(X>{np.round(_from, 6)})"
elif np.isinf(_from):
    p = f"P(X<{np.round(_to, 6)})"
else:
    p = f"P({np.round(_from, 6)} < X < {np.round(_to, 6)})"
print(f"{p} = {P}")
## P(X>1.72803) = 0.05

C.3 Przedziały ufności

Przedział ufności dla proporcji — arkusz Google

Przedział ufności dla proporcji — szablon w Excelu

# Przedział ufności dla proporcji
# Dane:
# Liczba wszystkich obserwacji:
n <- 160
# Liczba obserwacji sprzyjających:
x <- 15
# Proporcja w próbie:
p <- x/n
# Poziom ufności:
conf <- 0.95

# Prosty wzór:
alpha <- 1 - conf
resa <- p + c(-qnorm(1-alpha/2), qnorm(1-alpha/2)) * sqrt((1/n)*p*(1-p))
# Wilson score:
resw <- prop.test(x, n, conf.level = 1-alpha, correct = FALSE)$conf.int

print(paste(
  list(
    "Przedział ufności - prosty wzór:",
    resa, 
    "Przedział ufności - Wilson score:", 
    resw)))
## [1] "Przedział ufności - prosty wzór:"        
## [2] "c(0.0485854437380776, 0.138914556261922)"
## [3] "Przedział ufności - Wilson score:"       
## [4] "c(0.0576380069455474, 0.148912026631301)"
# Przedział ufności dla proporcji
# Dane:
# Liczba wszystkich obserwacji:
n = 160
# Liczba obserwacji sprzyjających:
x = 15
# Proporcja w próbie:
p = x/n
# Poziom ufności:
conf = 0.95

from statsmodels.stats.proportion import proportion_confint
# Prosty wzór:
resa = proportion_confint(x, n, alpha=1-conf, method='normal')
# Wilson score:
resw = proportion_confint(x, n, alpha=1-conf, method='wilson')

print("Przedział ufności - prosty wzór:", resa, 
"\nPrzedział ufności - Wilson score:", resw)
## Przedział ufności - prosty wzór: (0.048585443738077556, 0.13891455626192245) 
## Przedział ufności - Wilson score: (0.05763800694554742, 0.14891202663130057)

Przedział ufności dla średniej — arkusz Google

Przedział ufności dla średniej — szablon w Excelu

# Przedział ufności dla średniej
# Dane:
# Wielkość próby:
n <- 24
# Średnia w próbie:
xbar <- 183
# Odchylenie standardowe w populacji lub w próbie:
s <- 5.19
# Poziom ufności:
conf <- 0.95

alpha <- 1 - conf

# z:
ci_z <- xbar + c(-qnorm(1-alpha/2), qnorm(1-alpha/2)) * s/sqrt(n)

# t:
df<- n-1
ci_t <- xbar + c(-qt(1-alpha/2, df), qt(1-alpha/2, df)) * s/sqrt(n)

print(paste(
  list(
    "Przedział ufności - z:",
    ci_z, 
    "Przedział ufności - t:", 
    ci_t)))
## [1] "Przedział ufności - z:"                "c(180.923605699976, 185.076394300024)"
## [3] "Przedział ufności - t:"                "c(180.808455203843, 185.191544796157)"
# Na podstawie danych:
dane <- c(34.1, 35.6, 34.2, 33.9, 25.1)
test_result<-t.test(dane, conf.level = 0.99)
print(test_result$conf.int)
## [1] 23.85964 41.30036
## attr(,"conf.level")
## [1] 0.99
import math
import scipy.stats as stats

n = 24
xbar = 183
s = 5.19
conf = 0.95
alpha = 1 - conf

ci_z = [xbar + (-stats.norm.ppf(1-alpha/2)) * s/math.sqrt(n), xbar + (stats.norm.ppf(1-alpha/2)) * s/math.sqrt(n)]

df = n-1
ci_t = [xbar + (-stats.t.ppf(1-alpha/2, df)) * s/math.sqrt(n), xbar + (stats.t.ppf(1-alpha/2, df)) * s/math.sqrt(n)]

print("Przedział ufności - z:", ci_z,
"\nPrzedział ufności - t:", ci_t)
## Przedział ufności - z: [180.92360569997632, 185.07639430002368] 
## Przedział ufności - t: [180.80845520384258, 185.19154479615742]
# Wersja 2

print(stats.norm.interval(confidence=conf, loc=xbar, scale=s/math.sqrt(n)), "\n",
stats.t.interval(confidence=conf, df=df, loc=xbar, scale=s/math.sqrt(n)))
## (180.92360569997632, 185.07639430002368) 
##  (180.80845520384258, 185.19154479615742)
# Na podstawie danych:
import numpy as np
from scipy import stats

dane = np.array([34.1, 35.6, 34.2, 33.9, 25.1])
test_result = stats.ttest_1samp(dane, popmean=np.mean(dane))
conf_int = test_result.confidence_interval(0.99)
print(conf_int)
## ConfidenceInterval(low=23.85964498330358, high=41.300355016696415)

C.3.1 Liczebność próby

Liczebność próby — arkusz Google

Liczebność próby — szablon w Excelu

C.4 Testy dla średnich i proporcji

C.4.1 Testy dla 1 średniej i proporcji

Testowanie 1 populacji (średnia i proporcja) — arkusz Google

Testowanie 1 populacji (średnia i proporcja) — szablon w Excelu

# Test dla jednej średniej
# Wielkość próby:
n <- 38
# Średnia w próbie:
xbar <- 184.21
# Odchylenie standardowe w populacji lub w próbie:
s <- 6.1034
# Poziom istotności:
alpha <- 0.05

# Wartość null w hipotezie zerowej:
mu0 <- 179
# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt <- ">"

# Obliczenia:
# stopnie swobody:
df <- n-1

# Wartość krytyczna (test t):
crit_t <- if (alt == "<") {qt(alpha, df)} else if (alt == ">") {qt(1-alpha, df)} else {qt(1-alpha/2, df)}

# Statystyka testowa t/z:
test_tz <- (xbar-mu0)/(s/sqrt(n))

# Wartość p (test t):
p.value = if(alt == ">"){1-pt(test_tz, df)} else if (alt == ">") {pt(test_tz, df)} else {2*(1-pt(abs(test_tz),df))}

# Wartość krytyczna (test z):
crit_z <- if (alt == "<") {qnorm(alpha)} else if (alt == ">") {qnorm(1-alpha)} else {qnorm(1-alpha/2)}

# Wartość p (test z):
p.value.z = if(alt == ">"){1-pnorm(test_tz)} else if (alt == ">") {pnorm(test_tz)} else {2*(1-pnorm(abs(test_tz)))}

print(c('Średnia' = xbar, 
        'Odchylenie st.' = s,
        'Liczebność' = n,
        'Hipoteza zerowa' = paste0('mu = ', mu0),
        'Hipoteza alt.' = paste0('mu ', alt, ' ', mu0),
        'Statystyka testowa t/z' = test_tz,
        'Wartość krytyczna t' = crit_t,
        'Wartość p (test t)' = p.value,
        'Wartość krytyczna z' = crit_z,
        'Wartość p (test z)' = p.value.z
))
##                Średnia         Odchylenie st.             Liczebność 
##               "184.21"               "6.1034"                   "38" 
##        Hipoteza zerowa          Hipoteza alt. Statystyka testowa t/z 
##             "mu = 179"             "mu > 179"     "5.26208293008297" 
##    Wartość krytyczna t     Wartość p (test t)    Wartość krytyczna z 
##     "1.68709361959626"  "3.1304551380007e-06"     "1.64485362695147" 
##     Wartość p (test z) 
## "7.12162456784071e-08"
# Na podstawie danych (test t):

# Wektor z danymi
data <- c(176.5267, 195.5237, 184.9741, 179.5349, 188.2120, 190.7425, 178.7593, 196.2744, 186.6965, 187.8559, 183.1323, 176.2569, 191.4752, 186.5975, 180.2120, 184.3434, 178.1691, 184.8852, 187.7973, 178.5013, 172.7343, 176.8545, 184.2068, 181.2395, 186.1983, 173.6317, 181.9529, 185.9135, 188.6081, 183.0285, 183.3375, 188.5512, 184.6348, 186.9657, 183.9622, 200.9014, 183.5353, 177.2538)

# Zapisanie wyników testu do obiektu
# Należy wybrać wartość parametru alternative: "two-sided" (domyślnie), "less" lub "greater" oraz wartość zerową (ang. null value), która domyślnie wynosi 0
test_result <- t.test(data, alternative = "greater", mu = 179)

# Wyświetlanie wyników testu. Można wyświetlać tylko poszczególne składowe wyniku (np. test_result$statistic)
print(test_result)
## 
##  One Sample t-test
## 
## data:  data
## t = 5.2621, df = 37, p-value = 3.13e-06
## alternative hypothesis: true mean is greater than 179
## 95 percent confidence interval:
##  182.5396      Inf
## sample estimates:
## mean of x 
##    184.21
# Test dla jednej średniej
from scipy.stats import t, norm
from math import sqrt

# Wielkość próby:
n = 38

# Średnia w próbie:
xbar = 184.21

# Odchylenie standardowe w populacji lub w próbie:
s = 6.1034

# Poziom istotności:
alpha = 0.05

# Wartość null w hipotezie zerowej
mu0 = 179

# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt = ">"

# Obliczenia:
# stopnie swobody:
df = n - 1

# Wartość krytyczna (test t):
if alt == "<":
    crit_t = t.ppf(alpha, df)
elif alt == ">":
    crit_t = t.ppf(1 - alpha, df)
else:
    crit_t = t.ppf(1 - alpha / 2, df)

# Statystyka testowa t/z:
test_tz = (xbar - mu0) / (s / sqrt(n))

# Wartość p (test t):
if alt == ">":
    p_value_t = 1 - t.cdf(test_tz, df)
elif alt == "<":
    p_value_t = t.cdf(test_tz, df)
else:
    p_value_t = 2 * (1 - t.cdf(abs(test_tz), df))

# Wartość krytyczna (test z):
if alt == "<":
    crit_z = norm.ppf(alpha)
elif alt == ">":
    crit_z = norm.ppf(1 - alpha)
else:
    crit_z = norm.ppf(1 - alpha / 2)

# Wartość p (test z):
if alt == ">":
    p_value_z = 1 - norm.cdf(test_tz)
elif alt == "<":
    p_value_z = norm.cdf(test_tz)
else:
    p_value_z = 2 * (1 - norm.cdf(abs(test_tz)))

results = {
    'Średnia': xbar,
    'Odchylenie st.': s,
    'Liczebność': n,
    'Hipoteza zerowa': f'mu = {mu0}',
    'Hipoteza alt.': f'mu {alt} {mu0}',
    'Statystyka testowa t/z': test_tz,
    'Wartość krytyczna t': crit_t,
    'Wartość p (test t)': p_value_t,
    'Wartość krytyczna z': crit_z,
    'Wartość p (test z)': p_value_z
}

for key, value in results.items():
    print(f"{key}: {value}")
## Średnia: 184.21
## Odchylenie st.: 6.1034
## Liczebność: 38
## Hipoteza zerowa: mu = 179
## Hipoteza alt.: mu > 179
## Statystyka testowa t/z: 5.262082930082973
## Wartość krytyczna t: 1.6870936167109873
## Wartość p (test t): 3.1304551380006984e-06
## Wartość krytyczna z: 1.6448536269514722
## Wartość p (test z): 7.121624567840712e-08
# Na podstawie danych (test t):

import scipy.stats as stats

data = [176.5267, 195.5237, 184.9741, 179.5349, 188.2120, 190.7425, 178.7593, 196.2744, 186.6965, 187.8559, 183.1323, 176.2569, 191.4752, 186.5975, 180.2120, 184.3434, 178.1691, 184.8852, 187.7973, 178.5013, 172.7343, 176.8545, 184.2068, 181.2395, 186.1983, 173.6317, 181.9529, 185.9135, 188.6081, 183.0285, 183.3375, 188.5512, 184.6348, 186.9657, 183.9622, 200.9014, 183.5353, 177.2538]

test_result = stats.ttest_1samp(data, popmean=179, alternative='greater')

print(test_result)
## TtestResult(statistic=5.262096550537936, pvalue=3.1303226590428976e-06, df=37)
# Przedział ufności dla proporcji
# Liczba wszystkich obserwacji:
n <- 200
# Liczba obserwacji sprzyjających:
x <- 90
# Proporcja w próbie:
p <- x/n
# Poziom istotności:
alpha <- 0.1
# Proporcja wartość zerowa:
p0 <- 0.5
# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt <- "≠"

alttext <- if(alt==">") {"greater"} else if(alt=="<") {"less"} else {"two.sided"}

test <- prop.test(x, n, p0, alternative=alttext, correct=FALSE)
test_z <- unname(sign(test$estimate-test$null.value)*sqrt(test$statistic))
crit_z <- if(test$alternative=="less") {qnorm(alpha)} else if(test$alternative=="greater") {qnorm(1-alpha)} else {qnorm(1-alpha/2)}

print(c('Proporcja w próbie' = test$estimate, 
        'Liczebność' = n,
        'Hipoteza zerowa' = paste0('p = ', test$null.value),
        'Hipoteza alt.' = paste0('p ', alt, ' ', test$null.value),
        'Stat. testowa z' = test_z,
        'Stat. testowa chi^2' = unname(test$statistic),
        'Wartość krytyczna z' = crit_z,
        'Wartość p' = test$p.value
))
## Proporcja w próbie.p           Liczebność      Hipoteza zerowa        Hipoteza alt. 
##               "0.45"                "200"            "p = 0.5"            "p ≠ 0.5" 
##      Stat. testowa z  Stat. testowa chi^2  Wartość krytyczna z            Wartość p 
##   "-1.4142135623731"                  "2"   "1.64485362695147"  "0.157299207050284"
# Przedział ufności dla proporcji
from statsmodels.stats.proportion import proportions_ztest

# Liczba wszystkich obserwacji:
n = 200
# Liczba obserwacji sprzyjających:
x = 90
# Proporcja w próbie:
p = x/n
# Poziom istotności:
alpha = 0.1
# Proporcja wartość zerowa:
p0 = 0.5
# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt = "≠"

if alt == ">":
    alttext = "larger"
elif alt == "<":
    alttext = "smaller"
else:
    alttext = "two-sided"

test_result = proportions_ztest(count = x, nobs = n, value = p0, alternative = alttext, prop_var=p0)

print("Statystyka testowa z:", test_result[0], "\np-value:", test_result[1])
## Statystyka testowa z: -1.4142135623730947 
## p-value: 0.15729920705028533

C.4.2 Testy i przedziały ufności dla 2 średnich

Test i przedziały dla 2 średnich — arkusz Google

Test i przedziały dla 2 średnich — szablon w Excelu

# Test z dla dwóch średnich
# Wielkość próby 1:
n1 <- 100
# Średnia w próbie 1:
xbar1 <- 76.5
# Odchylenie standardowe w próbie 1:
s1 <- 38.0

# Wielkość próby 2:
n2 <- 100
# Średnia w próbie 2:
xbar2 <- 88.1
# Odchylenie standardowe w próbie 2:
s2 <- 40.0

# Poziom istotności:
alpha <- 0.05

# Wartość null w hipotezie zerowej (zwykle 0):
mu0 <- 0

# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt <- "<"

# Obliczenia:
# Statystyka testowa z:
test_z <- (xbar1-xbar2-mu0)/sqrt(s1^2/n1+s2^2/n2)

# Wartość krytyczna (test z):
crit_z <- if (alt == "<") {qnorm(alpha)} else if (alt == ">") {qnorm(1-alpha)} else {qnorm(1-alpha/2)}

# Wartość p (test z):
p.value.z = if(alt == ">"){1-pnorm(test_z)} else if (alt == "<") {pnorm(test_z)} else {2*(1-pnorm(abs(test_z)))}

print(c('Średnia 1' = xbar1, 
        'Odchylenie st. 1' = s1,
        'Liczebność 1' = n1,
        'Średnia 2' = xbar2, 
        'Odchylenie st. 2' = s2,
        'Liczebność 2' = n2,
        'Hipoteza zerowa' = paste0('mu1-mu2 = ', mu0),
        'Hipoteza alt.' = paste0('mu1-mu2 ', alt, ' ', mu0),
        'Statystyka testowa z' = test_z,
        'Wartość krytyczna z' = crit_z,
        'Wartość p (test z)' = p.value.z
))
##            Średnia 1     Odchylenie st. 1         Liczebność 1            Średnia 2 
##               "76.5"                 "38"                "100"               "88.1" 
##     Odchylenie st. 2         Liczebność 2      Hipoteza zerowa        Hipoteza alt. 
##                 "40"                "100"        "mu1-mu2 = 0"        "mu1-mu2 < 0" 
## Statystyka testowa z  Wartość krytyczna z   Wartość p (test z) 
##   "-2.1024983574238"  "-1.64485362695147" "0.0177548216928505"
# Test t dla dwóch średnich
# Wielkość próby 1:
n1 <- 14
# Średnia w próbie 1:
xbar1 <- 185.2142
# Odchylenie standardowe w próbie 1:
s1 <- 7.5261

# Wielkość próby 2:
n2 <- 19
# Średnia w próbie 2:
xbar2 <- 184.8421
# Odchylenie standardowe w próbie 2:
s2 <- 5.0471

# Poziom istotności:
alpha <- 0.05

# Wartość null w hipotezie zerowej (zwykle 0):
mu0 <- 0

# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt <- "≠"

# Założenie o równości wariancji (TRUE/FALSE):
eqvar <- FALSE

# Obliczenia
# Zbiorcze odchylenie standardowe:
sp <- sqrt(((n1-1)*s1^2+(n2-1)*s2^2)/(n1+n2-2))

# Statystyka testowa t:
test_t <- if(eqvar) {(xbar1-xbar2-mu0)/sqrt(sp^2*(1/n1+1/n2))} else {(xbar1-xbar2-mu0)/sqrt(s1^2/n1+s2^2/n2)}

# Liczba stopni swobody:
df<-if(eqvar) {n1+n2-2} else {(s1^2/n1+s2^2/n2)^2/((s1^2/n1)^2/(n1-1)+(s2^2/n2)^2/(n2-1))}

# Wartość krytyczna (test t):
crit_t <- if (alt == "<") {qt(alpha, df)} else if (alt == ">") {qt(1-alpha, df)} else {qt(1-alpha/2, df)}

# Wartość p (test t):
p.value.t = if(alt == ">"){1-pt(test_t, df)} else if (alt == ">") {pt(test_t, df)} else {2*(1-pt(abs(test_t),df))}

print(c('Średnia 1' = xbar1, 
        'Odchylenie st. 1' = s1,
        'Liczebność 1' = n1,
        'Średnia 2' = xbar2, 
        'Odchylenie st. 2' = s2,
        'Liczebność 2' = n2,
        'Hipoteza zerowa' = paste0('mu1-mu2 = ', mu0),
        'Hipoteza alt.' = paste0('mu1-mu2 ', alt, ' ', mu0),
        'Statystyka testowa t' = test_t,
        'Wartość krytyczna t' = crit_t,
        'Wartość p (test t)' = p.value.t
))
##            Średnia 1     Odchylenie st. 1         Liczebność 1            Średnia 2 
##           "185.2142"             "7.5261"                 "14"           "184.8421" 
##     Odchylenie st. 2         Liczebność 2      Hipoteza zerowa        Hipoteza alt. 
##             "5.0471"                 "19"        "mu1-mu2 = 0"        "mu1-mu2 ≠ 0" 
## Statystyka testowa t  Wartość krytyczna t   Wartość p (test t) 
##  "0.160325899672522"   "2.07753969816904"     "0.874131604618"
# Na podstawie danych (test t)

# Dwa wektory z danymi:
data1 <- c(1.2, 3.1, 1.7, 2.8, 3.0)
data2 <- c(4.2, 2.7, 3.6, 3.9)

# Zapisanie wyników testu do obiektu
# Należy wybrać wartość parametru alternative: "two.sided" (domyślnie), "less" lub "greater" oraz założenie odnośnie do równości wariancji (domyślnie FALSE)
test_result <- t.test(data1, data2, alternative="two.sided", var.equal = TRUE)

# Wyświetlanie wyników testu. Można wyświetlać tylko poszczególne składowe wyniku (np. test_result$statistic)
print(test_result)
## 
##  Two Sample t-test
## 
## data:  data1 and data2
## t = -2.3887, df = 7, p-value = 0.04826
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.46752406 -0.01247594
## sample estimates:
## mean of x mean of y 
##      2.36      3.60
import math
from scipy.stats import norm

# Test z dla dwóch średnich
# Wielkość próby 1:
n1 = 100
# Średnia w próbie 1:
xbar1 = 76.5
# Odchylenie standardowe w próbie 1:
s1 = 38.0
# Wielkość próby 2:
n2 = 100
# Średnia w próbie 2:
xbar2 = 88.1
# Odchylenie standardowe w próbie 2:
s2 = 40.0
# Poziom istotności:
alpha = 0.05
# Wartość null w hipotezie zerowej (zwykle 0):
mu0 = 0
# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt = "<"

# Obliczenia:
# Statystyka testowa z:
test_z = (xbar1 - xbar2 - mu0) / math.sqrt(s1**2 / n1 + s2**2 / n2)

# Wartość krytyczna (test z):
if alt == "<":
    crit_z = norm.ppf(alpha)
elif alt == ">":
    crit_z = norm.ppf(1 - alpha)
else:
    crit_z = norm.ppf(1 - alpha / 2)

# Wartość p (test z):
if alt == ">":
    p_value_z = 1 - norm.cdf(test_z)
elif alt == "<":
    p_value_z = norm.cdf(test_z)
else:
    p_value_z = 2 * (1 - norm.cdf(abs(test_z)))

results = {
    'Średnia 1': xbar1,
    'Odchylenie st. 1': s1,
    'Liczebność 1': n1,
    'Średnia 2': xbar2,
    'Odchylenie st. 2': s2,
    'Liczebność 2': n2,
    'Hipoteza zerowa': f'mu1-mu2 = {mu0}',
    'Hipoteza alt.': f'mu1-mu2 {alt} {mu0}',
    'Statystyka testowa z': test_z,
    'Wartość krytyczna z': crit_z,
    'Wartość p (test z)': p_value_z
}

for key, value in results.items():
    print(f"{key}: {value}")
## Średnia 1: 76.5
## Odchylenie st. 1: 38.0
## Liczebność 1: 100
## Średnia 2: 88.1
## Odchylenie st. 2: 40.0
## Liczebność 2: 100
## Hipoteza zerowa: mu1-mu2 = 0
## Hipoteza alt.: mu1-mu2 < 0
## Statystyka testowa z: -2.102498357423799
## Wartość krytyczna z: -1.6448536269514729
## Wartość p (test z): 0.017754821692850486
# Test t dla dwóch średnich
from scipy.stats import t
# Wielkość próby 1:
n1 = 14
# Średnia w próbie 1:
xbar1 = 185.2142
# Odchylenie standardowe w próbie 1:
s1 = 7.5261
# Wielkość próby 2:
n2 = 19
# Średnia w próbie 2:
xbar2 = 184.8421
# Odchylenie standardowe w próbie 2:
s2 = 5.0471
# Poziom istotności:
alpha = 0.05
# Wartość null w hipotezie zerowej (zwykle 0):
mu0 = 0
# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt = "≠"
# Założenie o równości wariancji (True/False)
eqvar = False

# Obliczenia:
# Zbiorcze odchylenie standardowe:
sp = math.sqrt(((n1 - 1) * s1**2 + (n2 - 1) * s2**2) / (n1 + n2 - 2))

# Statystyka testowa t i liczba stopni swobody:
if eqvar:
    test_t = (xbar1 - xbar2 - mu0) / math.sqrt(sp**2 * (1/n1 + 1/n2))
    df = n1 + n2 - 2
else:
    test_t = (xbar1 - xbar2 - mu0) / math.sqrt(s1**2 / n1 + s2**2 / n2)
    df = (s1**2 / n1 + s2**2 / n2)**2 / ((s1**2 / n1)**2 / (n1 - 1) + (s2**2 / n2)**2 / (n2 - 1))

# Wartość krytyczna (test t):
if alt == "<":
    crit_t = t.ppf(alpha, df)
elif alt == ">":
    crit_t = t.ppf(1 - alpha, df)
else:
    crit_t = t.ppf(1 - alpha / 2, df)

# Wartość p (test t)
if alt == ">":
    p_value_t = 1 - t.cdf(test_t, df)
elif alt == "<":
    p_value_t = t.cdf(test_t, df)
else:
    p_value_t = 2 * (1 - t.cdf(abs(test_t), df))

results = {
    'Średnia 1': xbar1,
    'Odchylenie st. 1': s1,
    'Liczebność 1': n1,
    'Średnia 2': xbar2,
    'Odchylenie st. 2': s2,
    'Liczebność 2': n2,
    'Hipoteza zerowa': f'mu1-mu2 = {mu0}',
    'Hipoteza alt.': f'mu1-mu2 {alt} {mu0}',
    'Statystyka testowa t': test_t,
    'Wartość krytyczna t': crit_t,
    'Wartość p (test t)': p_value_t
}

for key, value in results.items():
    print(f"{key}: {value}")
## Średnia 1: 185.2142
## Odchylenie st. 1: 7.5261
## Liczebność 1: 14
## Średnia 2: 184.8421
## Odchylenie st. 2: 5.0471
## Liczebność 2: 19
## Hipoteza zerowa: mu1-mu2 = 0
## Hipoteza alt.: mu1-mu2 ≠ 0
## Statystyka testowa t: 0.16032589967252212
## Wartość krytyczna t: 2.0775396981690264
## Wartość p (test t): 0.8741316046180003
    
# Na podstawie danych (test t)
from scipy.stats import ttest_ind, t

# Dwa wektory z danymi:
data1 = [1.2, 3.1, 1.7, 2.8, 3.0]
data2 = [4.2, 2.7, 3.6, 3.9]

# Zapisanie wyników testu do obiektu
# Należy wybrać wartość parametru alternative: "two.sided" (domyślnie), "less" lub "greater" oraz założenie odnośnie do równości wariancji (domyślnie FALSE)
test_result = ttest_ind(data1, data2, alternative='two-sided', equal_var=True)

print(test_result)
## TtestResult(statistic=-2.3886571085065054, pvalue=0.04826397365151946, df=7.0)

C.4.3 Testy i przedziały ufności dla 2 proporcji

Test i przedziały dla 2 proporcji — arkusz Google

Test i przedziały dla 2 proporcji — szablon w Excelu

# Test dla dwóch proporcji
# Liczba wszystkich obserwacji w próbie 1:
n1 <- 24
# Liczba obserwacji sprzyjających w próbie 1:
x1 <- 21
# Proporcja w próbie 1:
phat1 <- x1/n1
# Liczba wszystkich obserwacji w próbie 2:
n2 <- 24
# Liczba obserwacji sprzyjających w próbie 2:
x2 <- 14
# Proporcja w próbie 2:
phat2 <- x2/n2


# Poziom istotności:
alpha <- 0.05
# Hipoteza alternatywna (znak): "<"; ">"; "<>"; "≠"
alt <- ">"

alttext <- if(alt==">") {"greater"} else if(alt=="<") {"less"} else {"two.sided"}

test <- prop.test(c(x1, x2), c(n1, n2), alternative=alttext, correct=FALSE)
test_z <- unname(-sign(diff(test$estimate))*sqrt(test$statistic))
crit_z <- if(test$alternative=="less") {qnorm(alpha)} else if(test$alternative=="greater") {qnorm(1-alpha)} else {qnorm(1-alpha/2)}

print(c('Proporcje w próbach ' = test$estimate, 
        'Liczebność ' = c(n1, n2),
        'Hipoteza zerowa' = paste0('p1-p2 = ', 0),
        'Hipoteza alt.' = paste0('p1-p2 ', alt, ' ', 0),
        'Stat. testowa z' = test_z,
        'Stat. testowa chi^2' = unname(test$statistic),
        'Wartość krytyczna z' = crit_z,
        'Wartość krytyczna chi^2' = crit_z^2,
        'Wartość p' = test$p.value
))
## Proporcje w próbach .prop 1 Proporcje w próbach .prop 2                Liczebność 1 
##                     "0.875"         "0.583333333333333"                        "24" 
##                Liczebność 2             Hipoteza zerowa               Hipoteza alt. 
##                        "24"                 "p1-p2 = 0"                 "p1-p2 > 0" 
##             Stat. testowa z         Stat. testowa chi^2         Wartość krytyczna z 
##          "2.27359424023522"          "5.16923076923077"          "1.64485362695147" 
##     Wartość krytyczna chi^2                   Wartość p 
##          "2.70554345409541"        "0.0114951970462325"
from statsmodels.stats.proportion import proportions_ztest
from scipy.stats import norm, chi2_contingency
import numpy as np

n1 = 24
x1 = 21
phat1 = x1 / n1

n2 = 24
x2 = 14
phat2 = x2 / n2

alpha = 0.05
alt = ">"

if alt == ">":
    alttext = "larger"
elif alt == "<":
    alttext = "smaller"
else:
    alttext = "two-sided"

test_result = proportions_ztest(count = np.array([x1, x2]), nobs = np.array([n1, n2]), alternative = alttext)

print("Statystyka testowa z:", test_result[0], 
"\np-value:", test_result[1])
## Statystyka testowa z: 2.2735942402352203 
## p-value: 0.011495197046232447

C.5 Testy chi-kwadrat

Test chi-kwadrat — arkusz Google

Test chi-kwadrat — szablon w Excelu

# Test niezależności/jednorodności chi-kwadrat

# Macierz z danymi (wektor wejściowy)
m <- c(
  21, 14,
  3, 10
)

# Liczba wierszy w macierzy
nrow <- 2

# Poziom istotności
alpha <- 0.05

# Przekształcenie wektora w macierz
m <- matrix(data=m, nrow=nrow, byrow=TRUE)

# Test chi-kwadrat bez poprawki Yatesa
test_chi <- chisq.test(m, correct=FALSE)

# Test chi-kwadrat z poprawką Yatesa w przypadku tabel 2x2
test_chi_corrected <- chisq.test(m)

# Test G
test_g <- AMR::g.test(m)

# Dokładny test Fishera
exact_fisher<-fisher.test(m)

print(c('Liczba stopni swobody' = test_chi$parameter, 
        'Wartość krytyczna' = qchisq(1-alpha, test_chi$parameter), 
        'Statystyka chi^2' = unname(test_chi$statistic),
        'Wartość p (test chi-kwadrat)' = test_chi$p.value,
        'V Cramera' = unname(sqrt(test_chi$statistic/sum(m)/min(dim(m)-1))),
        'Współczynnik fi (dla tabel 2x2)' = if(all(dim(m)==2)) {psych::phi(m, digits=10)},
        'Statystyka chi^2 z poprawką Yatesa' = unname(test_chi_corrected$statistic),
        'Wartość p (test chi^2 z poprawką Yatesa)' = test_chi_corrected$p.value,
        'Statystyka G' = unname(test_g$statistic),
        'Wartość p (test G)' = test_g$p.value,
        'Wartość p (test dokładny Fishera)' = exact_fisher$p.value
))
##                 Liczba stopni swobody.df                        Wartość krytyczna 
##                               1.00000000                               3.84145882 
##                         Statystyka chi^2             Wartość p (test chi-kwadrat) 
##                               5.16923077                               0.02299039 
##                                V Cramera          Współczynnik fi (dla tabel 2x2) 
##                               0.32816506                               0.32816506 
##       Statystyka chi^2 z poprawką Yatesa Wartość p (test chi^2 z poprawką Yatesa) 
##                               3.79780220                               0.05131990 
##                             Statystyka G                       Wartość p (test G) 
##                               5.38600494                               0.02029889 
##        Wartość p (test dokładny Fishera) 
##                               0.04899141
# Test zgodności chi-kwadrat

# Liczebności rzeczywiste:
observed <- c(70, 10, 20)

# Liczebności oczekiwane:
expected <- c(80, 10, 10)

# Ewentualna korekta liczebności oczekiwanych, żeby ich suma była na pewno równa sumie rzeczywistych:
expected <- expected / sum(expected) * sum(observed)

# Poziom istotności
alpha <- 0.05

test_chi <- chisq.test(x = observed, p = expected, rescale.p = TRUE)
test_g <- AMR::g.test(x = observed, p = expected, rescale.p = TRUE)


print(c('Liczba stopni swobody' = test_chi$parameter, 
        'Wartość krytyczna' = qchisq(1-alpha, test_chi$parameter), 
        'Statystyka chi^2' = unname(test_chi$statistic),
        'Wartość p (test chi-kwadrat)' = test_chi$p.value,
        'Statystyka G' = unname(test_g$statistic),
        'Wartość p (test G)' = test_g$p.value
))
##     Liczba stopni swobody.df            Wartość krytyczna 
##                  2.000000000                  5.991464547 
##             Statystyka chi^2 Wartość p (test chi-kwadrat) 
##                 11.250000000                  0.003606563 
##                 Statystyka G           Wartość p (test G) 
##                  9.031492255                  0.010935443
# Test niezależności/jednorodności chi-kwadrat
import numpy as np
import scipy.stats as stats
from scipy.stats import chi2
from statsmodels.stats.contingency_tables import Table2x2

# Dane (macierz):
m = np.array([
  [21, 14],
  [3, 10]
])

alpha = 0.05

# Test chi-kwadrat bez poprawki Yatesa:
test_chi = stats.chi2_contingency(m, correction=False)

# Test chi-kwadrat z poprawką Yatesa:
test_chi_corrected = stats.chi2_contingency(m)

# Test G:
g, p, dof, expected = stats.chi2_contingency(m, lambda_="log-likelihood")

# Dokładny test Fishera:
exact_fisher = stats.fisher_exact(m)

# V Cramera:
cramers_v = np.sqrt(test_chi[0] / m.sum() / min(m.shape[0]-1, m.shape[1]-1))

# Współczynnik fi dla tabeli 2x2:
phi_coefficient = None
if m.shape == (2, 2):
    phi_coefficient = cramers_v*np.sign(np.diagonal(m).prod()-np.diagonal(np.fliplr(m)).prod())

# Wyniki
results = {
    'Liczba stopni swobody': test_chi[2],
    'Wartość krytyczna': chi2.ppf(1-alpha, test_chi[2]),
    'Statystyka chi-kwadrat': test_chi[0],
    'p-value (test chi-kwadrat)': test_chi[1],
    "V Cramera": cramers_v,
    'Współczynnik fi (dla tabeli 2x2)': phi_coefficient,
    'Statystyka chi-kwadrat z poprawką Yatesa': test_chi_corrected[0],
    'p-value (test chi-kwadrat z poprawką Yatesa)': test_chi_corrected[1],
    'Statystyka G': g,
    'p-value (test G)': p,
    'p-value (dokładny test Fishera)': exact_fisher[1]
}

for key, value in results.items():
    print(f"{key}: {value}")
## Liczba stopni swobody: 1
## Wartość krytyczna: 3.841458820694124
## Statystyka chi-kwadrat: 5.169230769230769
## p-value (test chi-kwadrat): 0.022990394092464842
## V Cramera: 0.3281650616569468
## Współczynnik fi (dla tabeli 2x2): 0.3281650616569468
## Statystyka chi-kwadrat z poprawką Yatesa: 3.7978021978021976
## p-value (test chi-kwadrat z poprawką Yatesa): 0.05131990358807137
## Statystyka G: 3.9106978537750194
## p-value (test G): 0.04797967015430134
## p-value (dokładny test Fishera): 0.048991413058947844
# Test zgodności chi-kwadrat

from scipy.stats import chisquare, chi2
import numpy as np

# Liczebności rzeczywiste:
observed = np.array([70, 10, 20])
# Liczebności oczekiwane:
expected = np.array([80, 10, 10])

# Ewentualna korekta liczebności oczekiwanych, żeby ich suma była na pewno równa sumie rzeczywistych:
expected = expected / expected.sum() * observed.sum()

# Test chi-kwadrat:
chi_stat, chi_p = chisquare(f_obs=observed, f_exp=expected)

# Liczba stopni swobody:
df = len(observed) - 1

# Poziom istotności:
alpha = 0.05  

# Wartość krytyczna:
critical_value = chi2.ppf(1 - alpha, df)

# Test G:
from scipy.stats import power_divergence
g_stat, g_p = power_divergence(f_obs=observed, f_exp=expected, lambda_="log-likelihood")

# Wyniki

results = {
    'Liczba stopni swobody': df,
    'Wartość krytyczna': critical_value,
    'Statystyka chi^2': chi_stat,
    'Wartość p (test chi-kwadrat)': chi_p,
    'Statystyka G': g_stat,
    'Wartość p (test G)': g_p
}

for key, value in results.items():
    print(f"{key}: {value}")
## Liczba stopni swobody: 2
## Wartość krytyczna: 5.991464547107979
## Statystyka chi^2: 11.25
## Wartość p (test chi-kwadrat): 0.0036065631360157305
## Statystyka G: 9.031492254964643
## Wartość p (test G): 0.010935442847719828

C.6 ANOVA i test Levene'a

ANOVA — arkusz Google

ANOVA — szablon w Excelu

# Przykładowe dane
group <- as.factor(c(rep("A",7), rep("B",7), rep("C",7), rep("D",7)))
result <- c(51, 87, 50, 48, 79, 61, 53, 82, 91, 92, 80, 52, 79, 73, 
            79, 84, 74, 98, 63, 83, 85, 85, 80, 65, 71, 67, 51, 80)
data<-data.frame(group, result)

#Aby obejrzeć dane, można uruchomić: View(data)            
#Aby zapisać dane do pliku tekstowego, można uruchomić: write.csv2(data, "data.csv")
#Aby wczytać dane z pliku tekstowego, można uruchomić: read.csv2("data.csv")

# Tabela z podsumowaniem
library(dplyr)
data %>% 
  group_by(group) %>% 
  summarize(n=n(), suma = sum(result), srednia = mean(result), odch_st=sd(result), mediana = median(result)) %>%
  data.frame() -> summary_table

# Tabela ANOVA
model<-aov(result~group, data=data)
anova_summary<-summary(model)

# Test Levene'a (Browna-Forsythe'a)
levene_result<-car::leveneTest(result~group, data=data)

# Procedura Tukeya
tukey_result<-TukeyHSD(x=model, conf.level=0.95)

print(list(`Podsumowanie` = summary_table, `Tabela ANOVA` = anova_summary, `Test Levene'a` = levene_result,
           `HSD Tukeya` = tukey_result))
## $Podsumowanie
##   group n suma  srednia  odch_st mediana
## 1     A 7  429 61.28571 15.56400      53
## 2     B 7  549 78.42857 13.45185      80
## 3     C 7  566 80.85714 10.76148      83
## 4     D 7  499 71.28571 11.61485      71
## 
## $`Tabela ANOVA`
##             Df Sum Sq Mean Sq F value Pr(>F)  
## group        3   1620   539.8   3.204 0.0412 *
## Residuals   24   4043   168.5                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## $`Test Levene'a`
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  3  0.1898 0.9023
##       24               
## 
## $`HSD Tukeya`
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = result ~ group, data = data)
## 
## $group
##          diff        lwr       upr     p adj
## B-A 17.142857  -1.996412 36.282127 0.0905494
## C-A 19.571429   0.432159 38.710698 0.0437429
## D-A 10.000000  -9.139270 29.139270 0.4870470
## C-B  2.428571 -16.710698 21.567841 0.9849136
## D-B -7.142857 -26.282127 11.996412 0.7340659
## D-C -9.571429 -28.710698  9.567841 0.5237024
import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.anova import anova_lm

# Ramka danych
group = ['A']*7 + ['B']*7 + ['C']*7 + ['D']*7
result = [51, 87, 50, 48, 79, 61, 53,
          82, 91, 92, 80, 52, 79, 73, 
          79, 84, 74, 98, 63, 83, 85, 
          85, 80, 65, 71, 67, 51, 80]
data = pd.DataFrame({'group': group, 'result': result})

# Tabela z podsumowaniem danych
summary_table = data.groupby('group')['result'].agg(['count', 'sum', 'mean', 'std', 'median']).reset_index()
summary_table.columns = ['group', 'n', 'suma', 'srednia', 'odch_st', 'mediana']

# ANOVA
model = ols('result ~ group', data=data).fit()
anova_summary = anova_lm(model, typ=2)

# Test Levene'a (Browna-Forsythe'a)
levene_result = stats.levene(data['result'][data['group'] == 'A'],
                             data['result'][data['group'] == 'B'],
                             data['result'][data['group'] == 'C'],
                             data['result'][data['group'] == 'D'])

# Procedura HSD Tukeya
tukey_result = pairwise_tukeyhsd(endog=data['result'], groups=data['group'], alpha=0.05)

print('Podsumowanie:\n\n', summary_table, '\n\nTabela ANOVA:\n\n', anova_summary, '\n\nTest Levene\'a:\n\n', levene_result,
       '\n\nHSD Tukeya:\n\n', tukey_result)
## Podsumowanie:
## 
##    group  n  suma    srednia    odch_st  mediana
## 0     A  7   429  61.285714  15.564000     53.0
## 1     B  7   549  78.428571  13.451854     80.0
## 2     C  7   566  80.857143  10.761483     83.0
## 3     D  7   499  71.285714  11.614851     71.0 
## 
## Tabela ANOVA:
## 
##                 sum_sq    df         F    PR(>F)
## group     1619.535714   3.0  3.204282  0.041204
## Residual  4043.428571  24.0       NaN       NaN 
## 
## Test Levene'a:
## 
##  LeveneResult(statistic=0.18975139523084725, pvalue=0.9023335775328473) 
## 
## HSD Tukeya:
## 
##   Multiple Comparison of Means - Tukey HSD, FWER=0.05 
## =====================================================
## group1 group2 meandiff p-adj   lower    upper  reject
## -----------------------------------------------------
##      A      B  17.1429 0.0905  -1.9964 36.2821  False
##      A      C  19.5714 0.0437   0.4322 38.7107   True
##      A      D     10.0  0.487  -9.1393 29.1393  False
##      B      C   2.4286 0.9849 -16.7107 21.5678  False
##      B      D  -7.1429 0.7341 -26.2821 11.9964  False
##      C      D  -9.5714 0.5237 -28.7107  9.5678  False
## -----------------------------------------------------

C.7 Najważniejsze testy nieparametryczne

C.7.1 Test Manna-Whitneya

Test Manna-Whitneya — arkusz Google

Test Manna-Whitneya — szablon w Excelu

C.7.2 Test Wilcoxona dla par obserwacji

Test Wilcoxona dla par obserwacji — arkusz Google

Test Wilcoxona dla par obserwacji — szablon w Excelu

C.7.3 Test Kruskalla-Wallisa

Test Kruskala-Wallisa — arkusz Google

Test Kruskala-Wallisa — szablon w Excelu

C.8 Inne testy

C.8.1 Regresja

Regresja prosta — arkusz Google

Regresja prosta — szablon w Excelu

Regresja wieloraka — arkusz Google

Regresja wieloraka — szablon w Excelu

C.8.2 Sprawdzanie normalności rozkładu

Sprawdzanie normalności — arkusz Google

Sprawdzanie normalności — szablon w Excelu

# Sprawdzenie normalności
# Dane
data<-c(76, 62, 55, 62, 56, 64, 44, 56, 94, 37, 72, 85, 72, 71, 60, 61, 64, 71, 69, 70, 64, 59, 71, 65, 84)
# Średnia
m<-mean(data)
# Odchylenie standardowe
s<-sd(data)
# Skośność
skew<-e1071::skewness(data, type=2)
# Kurtoza
kurt<-e1071::kurtosis(data, type=2)
# iloraz IQR do odchylenia standardowego
IQR_to_s<-IQR(data)/s
#udział obserwacji odległych o mniej niż 1 odchylenie standardowe od średniej
within1s<-mean(abs(data-m)<s)
#...o mniej niż 2 odchylenia...
within2s<-mean(abs(data-m)<2*s)
#...o mniej niż 3 odchylenia...
within3s<-mean(abs(data-m)<3*s)
# Test Shapiro-Wilka
SW_res<-shapiro.test(data)
# Test Jarque'a-Bery
JB_res<-tseries::jarque.bera.test(data)
# Test Andersona-Darlinga
AD_res<-nortest::ad.test(data)
# Test Kołmogorowa-Smirnowa
KS_res <- ks.test(data, function(x){pnorm(x, mean(data), sd(data))})

# Wyniki
print(c('Średnia' = m, 
        'Odchylenie st.' = s,
        'Liczebność' = length(data),
        'Skośność (~=0?)' = skew,
        'Kurtoza (~=0?)' = kurt,
        'IQR/s (~=1,3?)' = IQR_to_s,
        'Reguła 68%' = within1s*100,
        'Reguła 95%' = within2s*100,
        'Reguła 100%' = within3s*100,
        'Stat. test. - test SW' = SW_res$statistic,
        'Wartość p - test SW' = SW_res$p.value,
        'Stat. test. - test JB' = JB_res$statistic,
        'Wartość p - test JB' = JB_res$p.value,
        'Stat. test. - test AD' = AD_res$statistic,
        'Wartość p - test AD' = AD_res$p.value,
        'Stat. test. - test KS' = KS_res$statistic,
        'Wartość p - test KS' = KS_res$p.value
))
##                         Średnia                  Odchylenie st. 
##                    65.760000000                    12.145918382 
##                      Liczebność                 Skośność (~=0?) 
##                    25.000000000                    -0.002892879 
##                  Kurtoza (~=0?)                  IQR/s (~=1,3?) 
##                     1.121315636                     0.905654036 
##                      Reguła 68%                      Reguła 95% 
##                    80.000000000                    92.000000000 
##                     Reguła 100%         Stat. test. - test SW.W 
##                   100.000000000                     0.964892812 
##             Wartość p - test SW Stat. test. - test JB.X-squared 
##                     0.520206266                     0.479578632 
##             Wartość p - test JB         Stat. test. - test AD.A 
##                     0.786793609                     0.445513641 
##             Wartość p - test AD         Stat. test. - test KS.D 
##                     0.260454333                     0.143712404 
##             Wartość p - test KS 
##                     0.680154210
# Wykresy
hist(data, prob=TRUE)
curve(dnorm(x, m, s), col="darkblue", lwd=2, add=TRUE)

qqnorm(data, pch=16)
qqline(data, col='darkblue')

C.8.3 Współczynnik korelacji

Współczynnik korelacji – szablon — arkusz Google

Współczynnik korelacji – szablon — szablon w Excelu

#dane:
x <- c(4, 8, 6, 5, 3, 8, 6, 5, 5, 6, 3, 3, 3, 7, 3, 6, 4, 4, 8, 7)
y <- c(4, 6, 8, 3, 4, 6, 5, 8, 1, 4, 4, 3, 1, 6, 7, 5, 4, 4, 9, 5)
#test i przedział ufności:
cor.test(x, y, alternative = "two.sided", conf.level = 0.95)
## 
##  Pearson's product-moment correlation
## 
## data:  x and y
## t = 2.56, df = 18, p-value = 0.01968
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.09607185 0.78067292
## sample estimates:
##       cor 
## 0.5166288