using System; using System.Collections.Generic; namespace Statystyka { public static class Statystyka { public static double Suma(IEnumerable wartości) { double suma = 0; foreach (double wartość in wartości) suma += wartość; return suma; } public static int Liczba(IEnumerable wartości) { int liczba = 0; foreach (double wartość in wartości) liczba++; return liczba; } public static double Średnia(IEnumerable wartości) { if (wartości == null) throw new ArgumentNullException("Przesłano obiekt pusty"); int liczba = Liczba(wartości); if (liczba == 0) throw new ArgumentException("W tablicy nie ma elementów"); return Suma(wartości) / liczba; } //tu nie korzystam z metody Suma, żeby uniknąć dwóch pętli zamiast jednej public static double Średnia2(IEnumerable wartości) { if (wartości == null) throw new ArgumentNullException("Przesłano obiekt pusty"); int liczba = 0; double suma = 0; foreach (double wartość in wartości) { liczba++; suma += wartość; } if (liczba == 0) throw new ArgumentException("W tablicy nie ma elementów"); return suma / liczba; } public static double Wariancja(IEnumerable wartości) { double średnia = Średnia(wartości); double wariancja = 0; foreach (double wartość in wartości) { double odchylenie = wartość - średnia; wariancja += odchylenie * odchylenie; } return wariancja / Liczba(wartości); } public static double OdchylenieStandardowe(IEnumerable wartości) { return Math.Sqrt(Wariancja(wartości)); } public static void Ekstrema(IEnumerable wartości, out double minimum, out double maksimum) { if (wartości == null) throw new ArgumentNullException("Przesłano obiekt pusty"); if (Liczba(wartości) == 0) throw new ArgumentException("W tablicy nie ma elementów"); IEnumerator iterator = wartości.GetEnumerator(); iterator.MoveNext(); double wartości0 = iterator.Current; minimum = wartości0; maksimum = wartości0; while (iterator.MoveNext()) { double element = iterator.Current; if (element < minimum) { minimum = element; } if (element > maksimum) { maksimum = element; } } } public static double Zakres(IEnumerable wartości) { double minimum, maksimum; Ekstrema(wartości, out minimum, out maksimum); return maksimum - minimum; } public static double[] KopiujDoTablicy(IEnumerable wartości) { double[] tablica = new double[Liczba(wartości)]; int i = 0; foreach (double wartość in wartości) { tablica[i] = wartość; i++; } return tablica; } public static double Mediana(IEnumerable wartości) { if (wartości == null) throw new ArgumentNullException("Przesłano obiekt pusty"); if (Liczba(wartości) == 0) throw new ArgumentException("W tablicy nie ma elementów"); //Array.Sort(wartości); double[] _wartości = KopiujDoTablicy(wartości); Array.Sort(_wartości); if (_wartości.Length % 2 != 0) return _wartości[_wartości.Length / 2]; else return (_wartości[_wartości.Length / 2 - 1] + _wartości[_wartości.Length / 2]) / 2.0; } public static double Skośność(IEnumerable wartości) { return (Średnia(wartości) - Mediana(wartości)) / OdchylenieStandardowe(wartości); } public static int[] Histogram(IEnumerable wartości, int liczbaPrzedziałów) { double rozmiarPrzedziału = Zakres(wartości) / liczbaPrzedziałów; if (rozmiarPrzedziału == 0) throw new Exception("Niepoprawne dane"); double minimum, maksimum; Ekstrema(wartości, out minimum, out maksimum); int[] histogram = new int[liczbaPrzedziałów]; foreach (double wartość in wartości) { int i = (int)((wartość - minimum) / rozmiarPrzedziału); if (i == liczbaPrzedziałów) i = liczbaPrzedziałów - 1; //skrajny punkt wkładamy do ostatniego przedziału histogram[i]++; } return histogram; } } public class ParametryStatystyczne { public double Suma { get; private set; } public double Rozmiar { get; private set; } public double Średnia { get; private set; } public double Wariancja { get; private set; } public double OdchylenieStandardowe { get; private set; } public double Minimum { get; private set; } public double Maksimum { get; private set; } public double Zakres { get; private set; } public double Mediana { get; private set; } public double Skośność { get; private set; } public ParametryStatystyczne(IEnumerable dane) { Suma = Statystyka.Suma(dane); Rozmiar = Statystyka.Liczba(dane); Średnia = Statystyka.Średnia(dane); Wariancja = Statystyka.Wariancja(dane); OdchylenieStandardowe = Statystyka.OdchylenieStandardowe(dane); double minimum, maksimum; Statystyka.Ekstrema(dane, out minimum, out maksimum); Minimum = minimum; Maksimum = maksimum; Zakres = maksimum - minimum; Mediana = Statystyka.Mediana(dane); Skośność = Statystyka.Skośność(dane); } public override string ToString() { string s = ""; s += "Liczba elementów: " + Rozmiar + "\n"; s += "Suma: " + Suma + "\n"; s += "Średnia: " + Średnia + "\n"; s += "Wariancja: " + Wariancja + "\n"; s += "Odchylenie standardowe: " + OdchylenieStandardowe + "\n"; s += "Wartości od " + Minimum + " do " + Maksimum + "\n"; s += "Zakres: " + Zakres + "\n"; s += "Mediana: " + Mediana + "\n"; s += "Skośność: " + Skośność + "\n"; return s; } public static string Opis(IEnumerable dane) { return new ParametryStatystyczne(dane).ToString(); } } public class ParametryStatystyczneZHistogramem : ParametryStatystyczne { public int[] Histogram { get; private set; } public ParametryStatystyczneZHistogramem(IEnumerable dane, int liczbaPrzedziałów) : base(dane) { Histogram = Statystyka.Histogram(dane, liczbaPrzedziałów); } public override string ToString() { string s = base.ToString(); s += "Histogram: "; foreach (int liczebność in Histogram) s += liczebność.ToString() + '\t'; s = s.TrimEnd('\t') + '\n'; return s; } } }