Documente Academic
Documente Profesional
Documente Cultură
Noțiuni de Statistică
Statistica
Studiul fenomenelor si parametrilor variabili
Ex.: din testarea unui vaccin pe un lot de voluntari se trag concluzii care
trebuie sa fie valabile pentru intreaga populatie.
Eșantionarea / Sampling
caracter aleator:
indivizii din eşantion sunt selectaţi aleator;
fiecare membru al populaţiei are o şansă cunoscută, dar posibil ne-
egală de a fi inclus în eşantion.
caracter independent:
un eşantion nu trebuie să afecteze sau să fie afectat de alte eşantioane
selectate din cadrul populaţiei ţintă, sau a altor populaţii.
Eșantionarea / Sampling
Metode de obtinere a esantioanelor:
Proprietăți:
Media aritmetica este influentata de valorile extreme
Exemplu: (0+1+1+2+9)/5 Atenție la outliers!
Suma diferentelor dintre valorile individuale ale esantionului si medie
este totdeauna zero!
Tendinte Centrale - Measures of center
Median –se calculează luând valoarea din mijloc dintr-un set de date
ordonat.
Proprietati:
medianul nu este afectat de valorile extreme
medianul poate fi nereprezentativ pentru distributie daca valorile
individuale nu se grupeaza in jurul valorii centrale!
Medianul este:
- termenul al (n+1)/2-lea → daca n este impar
- media dintre termenii n/2 si n/2+1 → daca n este par
Median - a 50% valoare a datelor - 50% dintre valori sunt mai mari decât
medianul și 50% sunt mai mici decât medianul - 2nd cuartile (Q2)
Measures of center
O folosim pentru a descrie date categorice sau pentru forma distribu ției
pentru date continue.
IQR = (Q3-Q1)/2
Mod de calcul:
- se ordonează datele
- se calculează:
valoarea mediana a jumătăţii superioare (Q3=UQ: upper cuartile)
valoarea mediana a jumătăţii inferioare (Q1=LQ: lower cuartile)
Tendinte Centrale - Measures of center
Tendinte Centrale - Measures of center
Coeficientul de dispersie cuartil (CDC)/ quartile coefficient of
dispersion(QCD)- măsură a centrului median
Proprietăți:
QCD este independent de unitatile de masura
QCD se foloseste pentru compararea variabilitatii relative a două seturi
de date
Tendinte Centrale - Measures of center
Coeficientul de dispersie cuartil (CDC)/ quartile coefficient of
dispersion(QCD)- măsură a centrului median
Proprietăți:
QCD este independent de unitatile de masura
QCD se foloseste pentru compararea variabilitatii relative a două seturi
de date
Tendinte Centrale - Measures of center
Am văzut multe exemple de statistici descriptive pe care le putem folosi
pentru a rezuma datele prin centru
Tukey plot - Measures of center
Liniile orizontale se extind spre minim si maxim.
Tot ceea ce e in afara acestor limite sunt outliers.
Histograma - date discrete si continue
Cum se calculează:
trebuie definit setul de categorii ("bins") in care sa fie grupate valorile
se adaugă bare cu înălțimi diferite reprezentand numărul de valori pe care
le avem în fiecare bin
Tendinte de variabilitate - Measures of spread
Cum este distribuția noastră, cât de subțire (dispersie îngustă) sau largă
(foarte răspândită)
Distanța dintre cea mai mare valoare (maximă) și cea mai mică valoare
(minimă).
range=max(X) – min(X)
Dezavantaje:
Proprietăți:
CV este independent de unitatile de masura
CV se foloseste pentru compararea variabilitatii relative a două seturi de
date
CV intervine în studiul omogenității unor populații:
= 0 distributie simetrica
> 0 distributie cu coada spre dreapta
< 0 distributie cu coada spre stanga
Boltirea – Kurtosis - date continue
= 0 distributie normala
> 0 distributie mai inalta decat cea normala
< 0 distributie mai joasa
Statistica inferentiala
https://seaborn.pydata.org/
Seaborn
Seaborn
In[]: %pylab
In[]: import seaborn as sns
In[]: import pandas as pd
In[]:fb=pd.read_csv( 'fb_stock2018.csv',
index_col='date',
parse_dates=True)
In[]: qu = pd.read_csv('cutremur.csv')
Fișier de date
Conținutul fișierului fb_stock2018.csv :
Fișier de date
Conținutul fișierului cutremur.csv :
In[]: qu.columns
Index(['mag', 'magType', 'time', 'place', 'tsunami', 'parsed_place'],
dtype='object')
Analizăm datele:
In[]: c=qu.assign(time=lambda x: pd.to_datetime(x.time,
unit='ms')) .set_index('time').loc['2018-09-28'].query('parsed_place ==
"Indonesia" ')
Seaborn - stripplot()
In[]:sns.heatmap(fb.sort_index().assign( log_volume=np.log(fb.volume),
max_abs_change=fb.high – fb.low).corr(), annot=True, center=0,
vmin=-1, vmax=1 )
In[]: sns.pairplot(fb.assign(quarter=lambda x:
x.index.quarter),diag_kind='kde', hue='quarter')
https://seaborn.pydata.org/
In[]: random.seed(0)
In[]: salariu = [round(random.random()*1000000, -3) for _ in range(100)]
1 Comparați rezultatul calculand media datelor salariu în două moduri: folosind functia
mean() si cu formula.
import math
def calcul_median(x):
x.sort()
mijloc = (len(x) + 1) / 2 - 1 # scad 1, indexare de la 0
if len(x) % 2:
# x are numar impar de valori
return x[int(mijloc)]
else:
return (x[math.floor(mijloc)] + x[math.ceil(mijloc)]) / 2
Counter(salariu).most_common(1)[0][0]
4. Comparați rezultatul calculand varianta datelor salariu în două moduri: folosind
functia variance() si apeland urmatoarea formula, respectand corectia Bessel:
Out[]: 995000.0
Out[]: 0.45386998894439035
Out[]: 0.3417928776094965
Mărimea covarianței nu este ușor de interpretat, dar semnul ei ne spune dacă variabilele
sunt corelate pozitiv sau negativ.
import numpy as np
In[]: np.cov(x_scalat, z_score)
Out[]:
array([[0.07137603, 0.26716293],
[0.26716293, 1. ]])
cov = mean(total)
Out[]: 0.26449129918250414
Calculati P:
In[]: P= cov / (stdev(x_scalat) * stdev(z_score))
Out[]: 0.9900000000000001
Bibliografie
https://www.statology.org/
Laborator Scikit Learn- Regresie
C. Pipelines - make_pipeline
In[]: ml = make_pipeline(Imputer(strategy='mean'),
PolynomialFeatures(degree=2),
LinearRegression())
Această se va putea folosi ca oricare obiect standard Scikit-Learn
In[]: ml.fit(X, y)
In[]: print(y)
In[]: print(ml.predict(X))
[14 16 -1 8 -5]
[ 14. 16. -1. 8. -5.]
Folosim modelul liniar generat de make_pipeline pentru a potrivi
relații mult mai complicate între x și y.
C. Exercițiu (IPython):
Vrem sa modelam date neliniare - o funcție sinusoidala (cu ceva
zgomot) cu un model polinomial de grad 7
a)Aveti urmatorul set de date:
In[]: rng = np.random.RandomState(1)
In[]: : x = 10 * rng.rand(50)
In[]: y = np.sin(x) + 0.1 * rng.randn(50)
In[]: plt.scatter(x, y)
b) Folosinf make_pipeline generati modelul unui polinom de grad 7.
c) Folosind functiile fit() și predict() potriviti modelul generat de
make_pipeline.
D Exemplu complet - Iris
Pasii ce trebuie urmati in orice proiect ML (folosind Scikit) :
#Am scris codul in general, folosindu-ma de librariile necesare
1.Pregatim/ verificam datele
2.Impartim datele in seturi : train/(validation)/test
3.Cream o instanta a unui model
4.Aplicam functia fit() pe model
5.Facem predictii, aplicam functia predict()
6.Evaluam modelul
# vizualizam datele
In[]: fig = plt.figure(figsize=(8,5))
In[]: plt.plot(X, y,'o',color='c')
In[]: plt.show()
# impartim datele in seturi
In[]: from sklearn.model_selection import train_test_split
In[]: from sklearn import metrics
In[]: np.random.seed(5)
In[]: Xtrain, Xtest, ytrain, ytest = train_test_split(X,y, test_size=.3)
# fit model
lm.fit(Xtrain, ytrain)
In[]: scatter(X.ravel(), y)
In[]: X_test = np.linspace(-0.1, 1.1, 500)[:, None]
In[]: y_test = PolynomialRegression(3).fit(X, y).predict(X_test)
In[]: plot(X_test.ravel(), y_test)
Bibliografie
https://scikit-learn.org/stable/
https://scikit-learn.org/stable/modules/linear_model.html
https://www.statsmodels.org/stable/index.html
https://scikit-learn.org/stable/modules/
learning_curve.html#validation-curve
https://en.wikipedia.org/wiki/Coefficient_of_determination
https://scikit-learn.org/stable/modules/sgd.html#regression
θnext step = θ - α
In[]: alfa = 0.1 # learning rate
In[]: n_iterations = 1000
In[]: m = 100
In[]: theta = np.random.randn(2,1)
# initializare random
In[]: for iteration in range(n_iterations):
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
theta = theta - alfa * gradients
In[]: theta
Out[]: array([[4.21509616],
[2.77011339]])
Laborator Scikit-Learn
K-menas
PCA
In[]: model.labels_
In[]: from sklearn.metrics import silhouette_score
In[]: silhouette_score(X, model.labels_)
Out[]: 0.6819938690643478
Atenție!
Algoritmul k-means așteaptă să îi spuneți câte clustere doriți, nu
poate afla numărul de clustere din setul de date. Puteti selecta
numărul de clustere în prealabil:
Unele imagini pot avea mai puține canale, imagini în tonuri de gri
(un canal), altele pot avea mai multe canale, cum ar fi imagini cu un
canal alfa suplimentar pentru transparență, sau imagini din satelit,
care conțin canale pentru multe frecvențe luminoase (infrared).
Incarcam o imagine:
from sklearn.datasets import load_sample_image
image = load_sample_image("flower.jpg")
data = image / 255.0 # folosim 0...1 scale
In[]: imagine.shape
Out[]:?
X = data.reshape(-1, 3)
In[]: X.shape
Out[]: (273280, 3)
plt.show()
Se identifica un cluster de culoare pentru toate nuanțele de verde.
Următorul, pentru fiecare culoare (de exemplu, verde închis), caută
culoarea medie a pixelilor clusterelor de culori. Toate nuan țele de
verde pot fi înlocuite cu aceeași culoare verde deschis (presupunând
că culoarea medie a clusterului verde este verde deschis).
Dacă folosiți mai puțin de opt clustere, observați că culoarea mai
roșie din mijlocul florii nu reușește să obțină un cluster propriu: se
îmbină cu culorile din mediu inconjurator. Acest lucru se datorează
faptului că K-Means preferă clustere de dimensiuni similare.
print(pca.components_)
# [[-0.94446029 -0.32862557]
[-0.32862557 0.94446029]]
print(pca.explained_variance_)
# [ 0.75871884 0.01838551]
Pentru a vedea ce înseamnă aceste numere, le vizualizăm ca vectori
suprapusi pe datele de intrare. Folosind „componentele” pentru a
defini direcția vectorului și „explainded_variance” pentru a defini
lungimea vectorului
# plot data
ax[0].scatter(X[:, 0], X[:, 1], c= 'k', alpha=0.2)
for length, vector in zip(pca.explained_variance_,pca.components_):
v = vector * 3 * np.sqrt(length)
draw_vector(pca.mean_, pca.mean_ + v, ax=ax[0])
ax[0].axis('equal');
ax[0].set(xlabel='x', ylabel='y', title='input')
X_new = pca.inverse_transform(X_pca)
plt.scatter(X[:, 0], X[:, 1], alpha=0.2)
plt.scatter(X_new[:, 0], X_new[:, 1], alpha=0.8)
plt.axis('equal')
# desenam resultate
fig, ax = plt.subplots(2, 10, figsize=(10, 2.5),
subplot_kw={'xticks':[], 'yticks':[]},
gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i in range(10):
ax[0, i].imshow(faces.data[i].reshape(62, 47), cmap='binary_r')
ax[1, i].imshow(projected[i].reshape(62, 47), cmap='binary_r')
ax[0, 0].set_ylabel('full-dim\ninput')
ax[1, 0].set_ylabel('150-dim\nreconstruction')
import numpy as np
import pandas as pd
from sklearn.datasets import load_diabetes
diabet = load_diabetes()
#print(diabet.DESCR)
diabet.data
diabet.feature_names
fig = plt.figure(figsize=(8,5))
plt.plot(Xtest, ytest, 'o', color='c', label='Actual')
plt.plot(Xtest, ypred, color='r', label='Prezis')
plt.legend()
plt.show()
iris.shape
sns.heatmap(iris.corr())
cancer.target_names
cancer.feature_names
df=pd.DataFrame(cancer.data,columns =[cancer.feature_names])
#df['target']=pd.Series(data=cancer.target,index=df.index)
df=df.drop(df.columns[:20],axis=1) #!are 30 de coloane in total
df
df[-4:]
df.corr
#varianta 2
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
cancer.target_names
cancer.data
cancer.feature_names
df=pd.DataFrame(cancer.data,columns =[cancer.feature_names])
df['target']=pd.Series(data=cancer.target,index=df.index)
df.head()
sns.heatmap(df.corr())
import seaborn as sns
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
print(cancer.target_names)
cancer.data
print(cancer.feature_names)
df=pd.DataFrame(cancer.data,columns =[cancer.feature_names])
df['target']=pd.Series(data=cancer.target,index=df.index)
a = list (df[cancer.feature_names[0:10]])
df[a].head(7)
c = sns.heatmap(df[a].corr(),annot = True)