import fiona
import numpy as np
from shapely.geometry import shape
# extraction des point x,y du fichier shapefile
x, y = zip(*[(shape(point['geometry']).x, shape(point['geometry']).y) for point in fiona.open('points.shp'])
# calcul de la matrice de covariance
cov = np.cov(x,y) # calcul basé sur (n-1)
print cov
[[ 12208.04067225 2314.67141452]
[ 2314.67141452 2615.4249297 ]]
# extraction des valeurs et vecteurs propres
eigenval,eigenvec = np.linalg.eig(cov)
# rayons de l'ellipse (racine carrée des valeurs proprez
sigmay,sigmax = np.sqrt(eigenval)
print sigmax, sigmay
45.67393805, 112.85989981
# angle de l'ellipse à partir de la matrice de covariance
theta = np.arctan((2*cov[:,0][1])/(cov[:,0][0] - cov[:,1][1]))/2
# changement d'axe pour le N géographique
theta = 90 - np.rad2deg(theta)
print theta
77.1191513516
# angle de l'ellipse à partir des vecteurs propres
theta = 90 - np.rad2deg(np.arccos(eigenvec[0, 0]))
print theta
77.1191513516
# aire de l'ellipse
aire = np.pi * sigmax*sigmay
print aire
16194.143806210201
# excentricité de l'ellipse
exc = np.sqrt(1 - ((min(sigmax,sigmay)**2)/(max(sigmax,sigmay)**2)))
print exc
0.91445132916786864