Avancerede statistiske begreber i datavidenskab

Kildeknude: 1103921

Avancerede statistiske begreber i datavidenskab

Artiklen indeholder nogle af de mest almindeligt anvendte avancerede statistiske koncepter sammen med deres Python-implementering.


Figur
Credits: https://www.congruentsoft.com/business-intelligence.aspx

 

I mine tidligere artikler Begynderguide til statistik i datavidenskab , Inferential Statistics Data Scientists should know vi har talt om næsten alt det grundlæggende(Beskrivende og inferentiel) af statistikker, der almindeligvis bruges til at forstå og arbejde med ethvert datavidenskabscasestudie. Lad os i denne artikel gå lidt ud over og tale om nogle forhåndsbegreber, som ikke er en del af buzzen.

QQ(kvantil-kvantit) plots

 
 
Før du forstår QQ-plot, skal du først forstå, hvad der er en Kvantil?

En kvantil definerer en bestemt del af et datasæt, dvs. en kvantil bestemmer, hvor mange værdier i en fordeling der er over eller under en vis grænse. Særlige kvantiler er kvartilen (kvartil), kvintilen (femtedel) og percentiler (hundrededel).

Et eksempel:

Hvis vi deler en fordeling i fire lige store dele, vil vi tale om fire kvartiler. Den første kvartil omfatter alle værdier, der er mindre end en fjerdedel af alle værdier. I en grafisk fremstilling svarer det til 25 % af det samlede udbredelsesområde. De to nederste kvartiler udgør 50 % af alle fordelingsværdier. Interkvartilområdet mellem første og tredje kvartil er lig med det område, hvori 50 % af alle værdier ligger, der er fordelt omkring middelværdien.

I statistik, A QQ(kvantil-kvantil) plot er et scatterplot skabt ved at plotte to sæt kvantiler mod hinanden. Hvis begge sæt kvantiler kom fra den samme fordeling, skulle vi se punkterne danne en linje, der er nogenlunde lige (y=x).

QQ plot

For eksempel er medianen en kvantil, hvor 50 % af dataene falder under det punkt, og 50 % ligger over det. Formålet med QQ-plot er at finde ud af, om to sæt data kommer fra samme fordeling. EN 45-grad vinklen er plottet på QQ-plottet; hvis de to datasæt kommer fra en fælles fordeling, vil punkterne falde på den referencelinje.

Det er meget vigtigt for dig at vide, om fordelingen er normal eller ej, så du kan anvende forskellige statistiske mål på dataene og fortolke dem i meget mere menneskeligt forståelig visualisering, og deres QQ-plot kommer ind i billedet. Det mest fundamentale spørgsmål, som QQ-plottet besvarer, er, om kurven er normalfordelt eller ej.

Normalt fordelt, men hvorfor?

QQ-plottene bruges til at finde typen af ​​fordeling for en tilfældig variabel, uanset om det er en Gauss-fordeling, ensartet fordeling, eksponentiel fordeling eller endda pareto-fordeling osv.

Du kan fortælle typen af ​​distribution ved at bruge styrken af ​​QQ-plotten blot ved at se på plottet. Generelt taler vi kun om normalfordelinger, fordi vi har et meget smukt koncept af 68–95–99.7 reglen, som passer perfekt ind i normalfordelingen. Så vi ved, hvor meget af dataene, der ligger i området for den første standardafvigelse, anden standardafvigelse og tredje standardafvigelse fra middelværdien. Så at vide, om en distribution er Normal, åbner nye døre for os at eksperimentere med

Typer af QQ-plot. Kilde

Skæve QQ-plot

 
QQ-plot kan finde skævhed (mål for asymmetri) af fordelingen.

Hvis den nederste ende af QQ-plottet afviger fra den rette linje, men den øvre ende ikke er det, så er fordelingen Venstre skæv (Negativt skæv).

Hvis den øverste ende af QQ-plottet nu afviger fra den stjernelige linje, og den nederste ikke er det, så er fordelingen Højre skævt(positivt skævt).

Tailed QQ plots

 
QQ-plot kan finde Kurtosis (mål for tailedness) af fordelingen.

Fordelingen med den fede hale vil have begge enderne af QQ-plottet til at afvige fra den rette linje, og dens centrum følger linjen, hvor en tyndhalet fordeling vil betegne QQ-plot med meget mindre eller ubetydelig afvigelse i enderne og dermed gøre den en perfekt pasform til normal fordeling.

QQ plots i Python(Kilde)

 
Antag, at vi har følgende datasæt med 100 værdier:

import numpy as np #create dataset with 100 values that follow a normal distribution
np.random.seed(0)
data = np.random.normal(0,1, 1000) #view first 10 values
data[:10] 
array([ 1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.86755799, -0.97727788, 0.95008842, -0.15135721, -0.10321885, 0.4105985 ])

For at oprette et QQ-plot for dette datasæt kan vi bruge qqplot() funktion fra statsmodels bibliotek:

import statsmodels.api as sm
import matplotlib.pyplot as plt #create Q-Q plot with 45-degree line added to plot
fig = sm.qqplot(data, line='45')
plt.show()

I et QQ-plot viser x-aksen teoretiske kvantiler. Det betyder, at den ikke viser dine faktiske data, men i stedet repræsenterer, hvor dine data ville være, hvis de var normalt distribueret.

Y-aksen viser din faktiske data. Det betyder, at hvis dataværdierne falder langs en nogenlunde lige linje i en 45-graders vinkel, så er dataene normalfordelt.

Vi kan se i vores QQ-plot ovenfor, at dataværdierne har en tendens til tæt at følge 45-grader, hvilket betyder, at dataene sandsynligvis er normalfordelte. Dette burde ikke være overraskende, da vi genererede de 100 dataværdier ved at bruge numpy.random.normal() funktion.

Overvej i stedet, om vi genererede et datasæt med 100 ensartet fordelte værdier og oprettede et QQ-plot for dette datasæt:

#create dataset of 100 uniformally distributed values
data = np.random.uniform(0,1, 1000) #generate Q-Q plot for the dataset
fig = sm.qqplot(data, line='45')
plt.show()

Dataværdierne følger tydeligvis ikke den røde 45-graders linje, hvilket er en indikation af, at de ikke følger en normalfordeling.

Chebyshevs ulighed

 
 
Efter sandsynlighed, Chebyshevs ulighed, også kendt som "Bienayme-Chebyshev” Ulighed garanterer, at for en bred klasse af sandsynlighedsfordelinger vil kun en bestemt brøkdel af værdier blive fundet inden for en bestemt afstand fra middelværdien af ​​en fordeling.

Kilde: https://www.thoughtco.com/chebyshevs-inequality-3126547

Chebyshevs ulighed ligner Den empiriske regel (68-95-99.7); sidstnævnte regel gælder dog kun for normalfordelinger. Chebyshevs ulighed er bredere; den kan anvendes på enhver fordeling, så længe fordelingen inkluderer en defineret varians og middelværdi.

Så Chebyshevs ulighed siger det i hvert fald (1-1/k^2) af data fra en stikprøve skal falde inden for K standardafvigelser fra gennemsnittet (eller tilsvarende ikke mere end 1/k^2 af fordelingens værdier kan være mere end k standardafvigelser væk fra middelværdien).

Hvor K –> Positivt reelt tal

Hvis dataene ikke er normalfordelt, kan forskellige mængder data være i en standardafvigelse. Chebyshevs ulighed giver en måde at vide, hvilken brøkdel af data der falder inden for K standardafvigelser fra gennemsnittet for enhver datafordeling.

Credits: https://calcworkshop.com/joint-probability-distribution/chebyshev-inequality/

Chebyshevs ulighed er af stor værdi, fordi den kan anvendes på enhver sandsynlighedsfordeling, hvor middelværdien og variansen er angivet.

Lad os overveje et eksempel: Antag, at 1,000 deltagere møder op til en jobsamtale, men der er kun 70 ledige stillinger. For at udvælge de bedste 70 deltagere blandt de samlede deltagere, giver indehaveren tests for at bedømme deres potentiale. Den gennemsnitlige score på testen er 60, med en standardafvigelse på 6. Hvis en ansøger scorer 84, kan de så gå ud fra, at de får jobbet?

Resultaterne viser, at omkring 63 personer scorede over 60, så med 70 ledige stillinger kan en deltager, der scorer 84, være sikker på, at de fik jobbet.

Chebyshevs Ulighed i Python(Kilde)

 
Opret en population på 1,000,000 værdier, jeg bruger en gammafordeling (fungerer også med andre distributioner) med form = 2 og skala = 2.

import numpy as np
import random
import matplotlib.pyplot as plt #create a population with a gamma distribution
shape, scale = 2., 2. #mean=4, std=2*sqrt(2)
mu = shape*scale #mean and standard deviation
sigma = scale*np.sqrt(shape) s = np.random.gamma(shape, scale, 1000000)

Prøv nu 10,000 værdier fra befolkningen.

#sample 10000 values
rs = random.choices(s, k=10000)

Tæl prøven, der har en afstand fra den forventede værdi større end k standardafvigelse, og brug tællingen til at beregne sandsynligheden. Jeg vil gerne skildre en tendens af sandsynligheder, når k er stigende, så jeg bruger et interval på k fra 0.1 til 3.

#set k
ks = [0.1,0.5,1.0,1.5,2.0,2.5,3.0] #probability list
probs = [] #for each k for k in ks: #start count c = 0 for i in rs: # count if far from mean in k standard deviation if abs(i - mu) > k * sigma : c += 1 probs.append(c/10000)

Plot resultaterne:

plot = plt.figure(figsize=(20,10))
#plot each probability
plt.xlabel('K')
plt.ylabel('probability')
plt.plot(ks,probs, marker='o')
plot.show()
#print each probability
print("Probability of a sample far from mean more than k standard deviation:")
for i, prob in enumerate(probs): print("k:" + str(ks[i]) + ", probability: " + str(prob)[0:5] + " | in theory, probability should less than: " + str(1/ks[i]**2)[0:5])


Ud fra ovenstående plot og resultat kan vi se, at når k stiger, falder sandsynligheden, og sandsynligheden for hver k følger uligheden. Desuden er kun det tilfælde, at k er større end 1, nyttigt. Hvis k er mindre end 1, er højre side af uligheden større end 1, hvilket ikke er nyttigt, fordi sandsynligheden ikke kan være større end 1.

Log-normal fordeling

 
 
I sandsynlighedsteori, en Log-normalfordeling også kendt som Galtons distribution er en kontinuerlig sandsynlighedsfordeling af en stokastisk variabel, hvis logaritme er normalfordelt.

Således, hvis den stokastiske variabel X er log-normalfordelt, så Y = ln(X) har en normalfordeling. Tilsvarende, hvis Y har en normalfordeling, så er eksponentialfunktionen af Y dvs. X = exp(Y), har en log-normalfordeling.

Skæve fordelinger med lav middel og høj varians og alle positive værdier passer ind under denne type fordeling. En stokastisk variabel, der er log-normalfordelt, tager kun positive reelle værdier.

Den generelle formel for sandsynlighedstæthedsfunktionen af ​​lognormalfordelingen er:

Placerings- og skalaparametrene svarer til middelværdien og standardafvigelsen af ​​logaritmen for den stokastiske variabel.

Formen af ​​lognormal fordeling er defineret af 3 parametre:

  1. σ er formparameteren (og er standardafvigelsen for fordelingens log)
  2. θ or μ er placeringsparameteren (og er middelværdien af ​​fordelingen)
  3. m er skalaparameteren (og er også medianen af ​​fordelingen)

Placerings- og skalaparametrene er ækvivalente med middelværdien og standardafvigelsen af ​​logaritmen af ​​den stokastiske variabel som forklaret ovenfor.

If x = θ, derefter f(x) = 0. Sagen hvor θ = 0 , m = 1 kaldes standard lognormalfordeling. Sagen hvor θ er lig med nul kaldes 2-parameter lognormalfordeling.

Følgende graf illustrerer effekten af placering (μ) , vægt(σ) parameter på sandsynlighedstæthedsfunktionen for lognormalfordelingen:

Kilde: https://www.sciencedirect.com/topics/mathematics/lognormal-distribution

Log-normal distribution i Python(Kilde)

 
Lad os overveje et eksempel til at generere tilfældige tal fra en log-normalfordeling med μ = 1 , σ=0.5 ved hjælp af scipy.stats.lognorm-funktionen.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import lognorm np.random.seed(42) data = lognorm.rvs(s=0.5, loc=1, scale=1000, size=1000) plt.figure(figsize=(10,6))
ax = plt.subplot(111)
plt.title('Generate wrandom numbers from a Log-normal distribution')
ax.hist(data, bins=np.logspace(0,5,200), density=True)
ax.set_xscale("log") shape,loc,scale = lognorm.fit(data) x = np.logspace(0, 5, 200)
pdf = lognorm.pdf(x, shape, loc, scale) ax.plot(x, pdf, 'y')
plt.show()

Magtlovens fordeling

 
 
I statistikker er en Magtloven er et funktionelt forhold mellem to størrelser, hvor en relativ ændring i en størrelse resulterer i en proportional relativ ændring i den anden størrelse, uafhængig af den oprindelige størrelse af disse størrelser: en størrelse varierer som en potens af en anden.

Tager man for eksempel arealet af et kvadrat i forhold til længden af ​​dets side i betragtning, hvis længden fordobles, multipliceres arealet med en faktor fire.

En magtlovsfordeling har formen Y = k Xa,

hvor:

  • X , Y er variabler af interesse,
  • α er lovens eksponent,
  • k er en konstant.

Kilde: https://en.wikipedia.org/wiki/Power_law

Magtlovsfordeling er blot en af ​​mange sandsynlighedsfordelinger, men den anses for at være et værdifuldt værktøj til at vurdere usikkerhedsproblemer, som normalfordeling ikke kan håndtere, når de opstår med en vis sandsynlighed.

Mange processer har vist sig at følge magtlove over betydelige værdiområder. Fra fordelingen i indkomster, størrelse af meteoroider, jordskælvsstørrelser, spektraltætheden af ​​vægtmatricer i dybe neurale netværk, ordbrug, antal naboer i forskellige netværk osv. (Bemærk: Magtloven her er en kontinuerlig fordeling. Den sidste to eksempler er diskrete, men kan i stor skala modelleres som om de er kontinuerlige).

Power-lov distribution i Python(Kilde)

 
Lad os plotte Pareto distribution som er en form for en magtlovssandsynlighedsfordeling. Pareto-fordeling er nogle gange kendt som Pareto-princippet eller '80-20' reglen, da reglen siger, at 80 % af samfundets rigdom ejes af 20 % af befolkningen. Paretofordeling er ikke en naturlov, men en observation. Det er nyttigt i mange problemer i den virkelige verden. Det er en skæv kraftig halefordeling.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pareto x_m = 1 #scale
alpha = [1, 2, 3] #list of values of shape parameters
plt.figure(figsize=(10,6))
samples = np.linspace(start=0, stop=5, num=1000)
for a in alpha: output = np.array([pareto.pdf(x=samples, b=a, loc=0, scale=x_m)]) plt.plot(samples, output.T, label='alpha {0}' .format(a)) plt.xlabel('samples', fontsize=15)
plt.ylabel('PDF', fontsize=15)
plt.title('Probability Density function', fontsize=15)
plt.legend(loc='best')
plt.show()

Box cox transformation

 
 
Box-Cox transformation transformerer vores data, så de minder meget om en normalfordeling.

Box-Cox-transformationerne med én parameter er defineret som I mange statistiske teknikker antager vi, at fejlene er normalfordelte. Denne antagelse giver os mulighed for at konstruere konfidensintervaller og udføre hypotesetest. Ved at transformere din målvariabel kan vi (forhåbentlig) normalisere vores fejl (hvis de ikke allerede er normale).

Derudover kan transformation af vores variable forbedre vores modellers forudsigelsesevne, fordi transformationer kan fjerne hvid støj.

Originalfordeling (venstre) og næsten normal fordeling efter anvendelse af Box cox-transformation. Kilde

Kernen i Box-Cox transformationen er en eksponent, lambda (λ), som varierer fra -5 til 5. Alle værdier på λ overvejes, og den optimale værdi for dine data er valgt; Den "optimale værdi" er den, der resulterer i den bedste tilnærmelse af en normalfordelingskurve.

Box-Cox-transformationerne med én parameter er defineret som:

og de to-parameter Box-Cox transformationer som:

Desuden gælder en-parameter Box-Cox-transformationen y > 0, dvs. kun for positive værdier og to-parameter Box-Cox transformation for y > -λ, altså negative værdier.

Parameteren λ estimeres ved hjælp af profilsandsynlighed funktion og brug af godhedstests.

Hvis vi taler om nogle ulemper ved Box-cox-transformation, så hvis fortolkning er det, du vil gøre, så anbefales Box-cox ikke. Fordi hvis λ er et tal, der ikke er nul, så kan den transformerede målvariabel være sværere at fortolke, end hvis vi blot anvendte en logtransformation.

En anden anstødssten er, at Box-Cox-transformationen normalt giver medianen af ​​prognosefordelingen, når vi vender de transformerede data tilbage til dens oprindelige skala. Nogle gange vil vi have middelværdien og ikke medianen.

Box-Cox transformation i Python(Kilde)

 
SciPys statistikpakke indeholder en funktion kaldet boxcox til at udføre box-cox-effekttransformation, der tager originale ikke-normale data ind som input og returnerer tilpassede data sammen med lambda-værdien, der blev brugt til at tilpasse den ikke-normale fordeling til normalfordelingen.

#load necessary packages
import numpy as np from scipy.stats import boxcox import seaborn as sns #make this example reproducible
np.random.seed(0) #generate dataset
data = np.random.exponential(size=1000) fig, ax = plt.subplots(1, 2)
#plot the distribution of data values
sns.distplot(data, hist=False, kde=True, kde_kws = {'shade': True, 'linewidth': 2}, label = "Non-Normal", color ="red", ax = ax[0]) #perform Box-Cox transformation on original data
transformed_data, best_lambda = boxcox(data) sns.distplot(transformed_data, hist = False, kde = True, kde_kws = {'shade': True, 'linewidth': 2}, label = "Normal", color ="red", ax = ax[1]) #adding legends to the subplots
plt.legend(loc = "upper right") #rescaling the subplots
fig.set_figheight(5)
fig.set_figwidth(10)
#display optimal lambda value
print(f"Lambda value used for Transformation: {best_lambda}")

Poisonfordeling

 
 
I sandsynlighedsteori og statistik er Poisonfordeling er en diskret sandsynlighedsfordeling, der udtrykker sandsynligheden for, at et givet antal hændelser indtræffer i et fast interval af tid eller rum, hvis disse hændelser forekommer med en kendt konstant middelhastighed og uafhængigt af tiden siden den sidste hændelse.

I meget enkle vendinger kan en Poisson-fordeling bruges til at estimere, hvor sandsynligt det er, at noget vil ske "X" antal gange.

Nogle eksempler på Poisson-processer er kunder, der ringer til et hjælpecenter, radioaktivt henfald i atomer, besøgende på et websted, fotoner, der ankommer til et rumteleskop, og bevægelser i en aktiekurs. Poisson-processer er normalt forbundet med tid, men det behøver de ikke at være.

Formlen for Poisson-fordelingen er:

Hvor:

  • e er Eulers tal (e = 2.71828...)
  • k er antallet af forekomster
  • k! er factorial af k
  • λ er lig med den forventede værdi af k når det også er lig med dens varians

Lambda(λ) kan opfattes som det forventede antal hændelser i intervallet. Når vi ændrer hastighedsparameteren, λ, ændrer vi sandsynligheden for at se forskellige antal hændelser i et interval. Nedenstående graf er sandsynlighedsmassefunktionen af ​​Poisson-fordelingen, der viser sandsynligheden for, at et antal hændelser forekommer i et interval med forskellige hastighedsparametre.

Sandsynlighedsmassefunktion for Poisson Distribution med varierende hastighedsparametre.Kilde

Poisson-fordelingen bruges også almindeligvis til at modellere økonomiske tælledata, hvor tallet er lille og ofte er nul. For et eksempel, i finans, kan det bruges til at modellere antallet af handler, som en typisk investor vil foretage på en given dag, som kan være 0 (ofte) eller 1 eller 2 osv.

Som et andet eksempel kan denne model bruges til at forudsige antallet af "chok" på markedet, der vil forekomme i en given tidsperiode, f.eks. over et årti.

Poisson-fordeling i Python

from numpy import random
import matplotlib.pyplot as plt
import seaborn as sns lam_list = [1, 4, 9] #list of Lambda values  plt.figure(figsize=(10,6))
samples = np.linspace(start=0, stop=5, num=1000) for lam in lam_list: sns.distplot(random.poisson(lam=lam, size=10), hist=False, label='lambda {0}'.format(lam)) plt.xlabel('Poisson Distribution', fontsize=15)
plt.ylabel('Frequency', fontsize=15)
plt.legend(loc='best')
plt.show()

As λ bliver større, ligner grafen mere en normalfordeling.

Jeg håber, du har nydt at læse denne artikel. Hvis du har spørgsmål eller forslag, så læg en kommentar.

Du er velkommen til at forbinde mig LinkedIn for enhver forespørgsel.

Tak fordi du læste med!!!

 
Referencer

 
Original. Genopslået med tilladelse.

Relateret:

Kilde: https://www.kdnuggets.com/2021/09/advanced-statistical-concepts-data-science.html

Tidsstempel:

Mere fra KDnuggets