diff --git a/.gitignore b/.gitignore
index 1c2d52b6c9c31d02d96bdbd5f5c273d8f68efcb9..397680eecc360e1cda8d18d964d0f90b47430f9a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,4 @@
 .idea/*
+build/
+skais.egg-info/
+*.coverage
\ No newline at end of file
diff --git a/skais/stats/__init__.py b/skais/stats/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/skais/stats/angluar.py b/skais/stats/angluar.py
new file mode 100644
index 0000000000000000000000000000000000000000..3fbac4263dda68700b39f813f412da10b52ebfaa
--- /dev/null
+++ b/skais/stats/angluar.py
@@ -0,0 +1,30 @@
+import numpy as np
+
+
+def angular_dispersion(x):
+    n = len(x)
+    X = np.sum(np.cos(x)) / n
+    Y = np.sum(np.sin(x)) / n
+
+    r = np.sqrt(X ** 2 + Y ** 2)
+
+    return r
+
+
+def angular_mean(x):
+    n = len(x)
+    X = np.sum(np.cos(x)) / n
+    Y = np.sum(np.sin(x)) / n
+
+    theta = abs(np.arctan2(X, Y))
+
+    if Y > 0 and X > 0:
+        return theta
+
+    if Y > 0 >= X:
+        return np.pi/2 - theta
+
+    if Y <= 0 < X:
+        return np.pi + theta
+    else:
+        return 2 * np.pi + theta
diff --git a/skais/tests/stats/test_angular.py b/skais/tests/stats/test_angular.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae524adc08fda2f4e0f6883e9efd50f68a3c11a4
--- /dev/null
+++ b/skais/tests/stats/test_angular.py
@@ -0,0 +1,42 @@
+import unittest
+
+import numpy as np
+
+from skais.stats.angluar import angular_mean
+
+
+class TestAngular(unittest.TestCase):
+    def test_angular_mean_simple(self):
+        x = np.radians(np.array([1, 359]))
+
+        self.assertEqual(0.0, angular_mean(x))
+
+    def test_angular_mean_simple_2(self):
+        x = np.radians(np.array([180, 180, 180, 180, 179, 181]))
+
+        self.assertEqual(np.pi, angular_mean(x))
+
+    def test_angular_mean_simple_3(self):
+        x = np.radians(np.array([0, 0, 0, 0, 359, 1]))
+
+        self.assertEqual(0.0, angular_mean(x))
+
+    def test_angular_mean_first_quadrant(self):
+        x = np.radians(np.array([43, 44, 45, 46, 47]))
+
+        self.assertEqual(np.pi / 4, angular_mean(x))
+
+    def test_angular_mean_second_quadrant(self):
+        x = np.radians(np.array([133, 134, 135, 136, 137]))
+
+        self.assertEqual(3*np.pi / 4, angular_mean(x))
+
+    def test_angular_mean_third_quadrant(self):
+        x = np.radians(np.array([223, 224, 225, 226, 227]))
+
+        self.assertEqual(5*np.pi / 4, angular_mean(x))
+
+    def test_angular_mean_fourth_quadrant(self):
+        x = np.radians(np.array([313, 314, 315, 316, 317]))
+
+        self.assertEqual(7*np.pi / 4, angular_mean(x))