import pandas as pd
# Przykładowe dane jako seria Pandas
= pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
dane
# Obliczanie średniej
= dane.mean()
srednia
print(f"Średnia: {srednia}")
Średnia: 55.0
Miary statystyczne
Klasyfikacja miar statystycznych:
\[\overline{x} = \frac{1}{n} \sum_{i=1}^n x_i\]
Interpretacja średniej arytmetycznej polega na rozumieniu jej jako reprezentacji “środkowego” lub “typowego” poziomu cechy badanej zbiorowości. Średnia daje ogólne wyobrażenie o danych, ale może być myląca w przypadku obecności skrajnych wartości (outlierów), które mogą znacząco wpływać na jej wartość. Przydatna jest w wielu dziedzinach, od ekonomii po nauki społeczne, jako sposób na podsumowanie danych i porównanie różnych grup lub zestawów danych. Warto pamiętać, że średnia nie zawsze jest najlepszym wyborem dla skośnych rozkładów i może nie odzwierciedlać adekwatnie rozkładu danych, zwłaszcza w obecności skrajnych wartości.
import pandas as pd
# Przykładowe dane jako seria Pandas
= pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
dane
# Obliczanie średniej
= dane.mean()
srednia
print(f"Średnia: {srednia}")
Średnia: 55.0
import pandas as pd
# Przykładowe dane dla zmiennej skokowej
= pd.Series([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
dane_skokowe
# Obliczanie mody
= dane_skokowe.mode()
moda_skokowa
print(f"Moda dla zmiennej skokowej: {moda_skokowa.tolist()}")
Moda dla zmiennej skokowej: [4]
Uwagi:
Uwaga: częstym błędem jest mylenie wartości cechy z jej pozycją.
Kod
import pandas as pd
# Przykładowe dane w DataFrame
= pd.DataFrame({
df 'Kolumna1': [10, 20, 30, 40, 50],
'Kolumna2': [15, 25, 35, 45, 55]
})
# Obliczanie mediany dla każdej kolumny
= df.median()
mediany
print("Mediana dla każdej kolumny:")
print(mediany)
Mediana dla każdej kolumny:
Kolumna1 30.0
Kolumna2 35.0
dtype: float64
Interpretacja mediany:
Kwartyle
import pandas as pd
# Przykładowe dane jako seria Pandas
= pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
dane
# Obliczanie kwartylów
= dane.quantile(0.25) # Pierwszy kwartyl (Q1)
kwartyl_1 = dane.quantile(0.50) # Mediana (Q2)
mediana = dane.quantile(0.75) # Trzeci kwartyl (Q3)
kwartyl_3
print(f"Pierwszy kwartyl (Q1): {kwartyl_1}")
print(f"Mediana (Q2): {mediana}")
print(f"Trzeci kwartyl (Q3): {kwartyl_3}")
Pierwszy kwartyl (Q1): 32.5
Mediana (Q2): 55.0
Trzeci kwartyl (Q3): 77.5
import pandas as pd
# Przykładowe dane jako seria Pandas
= pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
dane
# Obliczanie maksimum i minimum
= dane.max()
maksimum = dane.min()
minimum
# Obliczanie różnicy między maksimum a minimum
= maksimum - minimum
roznica
print(f"Maksimum: {maksimum}")
print(f"Minimum: {minimum}")
print(f"Różnica między maksimum a minimum: {roznica}")
Maksimum: 100
Minimum: 10
Różnica między maksimum a minimum: 90
Wariancja informuje o tym, jak duże jest zróżnicowanie wyników w danym zbiorze wartości cechy. Inaczej mówiąc, czy wyniki są bardziej skoncentrowane wokół średniej, czy są małe różnice pomiędzy średnią a poszczególnymi wynikami czy może rozproszenie wyników jest duże, duża jest różnica poszczególnych wyników od średniej.
Odchylenie standardowe mierzy zróżnicowanie o mianie zgodnym z mianem badanej cechy, daje przeciętne różnice poszczególnych wartości cechy od średniej arytmetycznej.
import pandas as pd
# Przykładowe dane jako seria Pandas
= pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
dane
# Obliczanie wariancji
= dane.var() # Uwaga: Pandas domyślnie dzieli przez (n-1), co odpowiada wariancji z próby
wariancja
# Obliczanie odchylenia standardowego
= dane.std() # Domyślnie liczone z próby (n-1)
odchylenie_standardowe
print(f"Wariancja: {wariancja}")
print(f"Odchylenie standardowe: {odchylenie_standardowe}")
Wariancja: 916.6666666666666
Odchylenie standardowe: 30.276503540974915
W praktyce często zakłada się, że dane mają rozkład normalny. Założenie to nigdy nie jest całkowicie spełnione. Rozkład normalny ma bowiem niezerową gęstość prawdopodobieństwa dla każdej wartości ze zbioru liczb rzeczywistych, a w realnym świecie wartości zmiennych losowych są zawsze ograniczone, na przykład nie istnieją ludzie o ujemnym wzroście. Bardzo często jednak założenie to jest spełnione z wystarczająco dobrym przybliżeniem. Im lepiej jest ono uzasadnione, tym bliższe prawdy mogą być poniższe stwierdzenia:
https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule
Jak rozpoznać typ rozkładu?
rozkład symetryczny \[\overline{x} =Me=Do\]
rozkład o asymetrii prawostronnej \[\overline{x} >Me>Do\]
rozkład o asymetrii lewostronnej \[\overline{x}<Me<Do\]
klasyczny współczynnik asymetrii
wzór: \[A_s=\frac{m_3}{(s^2)^{\frac{3}{2}}}\]
Współczynnik kurtozy
Interpretacja kurtozy
Czasem bada się współczynnik ekcesu \(K’=K-3\).
Wysoka kurtoza oznacza większą liczbę wartości ekstremalnych (skrajnych), natomiast niska kurtoza wskazuje na rozkład bardziej płaski niż normalny.
import pandas as pd
# Przykładowe dane w serii
= pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
dane
# Obliczanie skośności
= dane.skew()
skosnosc
# Obliczanie kurtozy
= dane.kurt()
kurtoza
print(f"Skośność: {skosnosc}")
print(f"Kurtoza: {kurtoza}")
Skośność: 0.0
Kurtoza: -1.2000000000000002
import pandas as pd
import numpy as np
# Tworzymy ramkę danych
= {
data "Produkt": ["A", "B", "A", "C", "B", "A", "C", "B", "A", "C"],
"Sprzedaż": [200, 150, 250, 300, 200, 220, 310, 180, 240, 290],
"Koszt": [120, 100, 140, 180, 110, 130, 190, 105, 125, 170],
"Marża": [80, 50, 110, 120, 90, 90, 120, 75, 115, 120],
}
= pd.DataFrame(data)
df print(df)
Ramka danych:
Produkt | Sprzedaż | Koszt | Marża |
---|---|---|---|
A | 200 | 120 | 80 |
B | 150 | 100 | 50 |
A | 250 | 140 | 110 |
C | 300 | 180 | 120 |
B | 200 | 110 | 90 |
A | 220 | 130 | 90 |
C | 310 | 190 | 120 |
B | 180 | 105 | 75 |
A | 240 | 125 | 115 |
C | 290 | 170 | 120 |
Średnia dla wybranych dwóch kolumn
# Obliczamy średnią dla kolumn "Sprzedaż" i "Koszt"
= df[["Sprzedaż", "Koszt"]].mean()
mean_values print(mean_values)
Funkcja describe()
# Generujemy opisowe statystyki dla danych liczbowych
= df.describe()
description print(description)
Działanie funkcji agg
Funkcja agg
pozwala na zastosowanie różnych miar dla wielu kolumn.
# Zastosowanie funkcji agregujących
= df[["Sprzedaż", "Koszt"]].agg(["mean", "sum", "max"])
agg_results print(agg_results)
Działanie groupby
Grupowanie danych według kolumny kategorycznej (np. “Produkt”).
# Grupowanie i obliczanie średniej
= df.groupby("Produkt")[["Sprzedaż", "Koszt"]].mean()
grouped print(grouped)
Opcja numeric_only=True
Opcja numeric_only=True
pozwala analizować tylko kolumny liczbowe, pomijając kategoryczne.
# Obliczanie sumy tylko dla kolumn liczbowych
= df.sum(numeric_only=True)
numeric_sum print(numeric_sum)
Ćwiczenia: (ex11.py
- ex20.py
)
Sprawdź, dla których plików wygodnie jest liczenie odpowiednich charakerystyk.