Python w ekonometrii — pandas, statsmodels i sklearn
Streszczenie
Python dla ekonometrii: instalacja, pandas, numpy, statsmodels, wizualizacje matplotlib/seaborn i modele regresji
Python a R — porównanie
| Kryterium | R | Python |
|---|---|---|
| Statystyka | ★★★★★ | ★★★★ |
| Machine learning | ★★★ | ★★★★★ |
| Wizualizacje | ★★★★★ | ★★★★ |
| Popularność w przemyśle | ★★★ | ★★★★★ |
| Krzywa uczenia się | łagodna | umiarkowana |
Wniosek: Do czystej ekonometrii R jest wygodniejszy, ale Python jest bardziej wszechstronny i łatwiej o pracę. Warto znać oba.
Instalacja
Opcja 1: Anaconda (zalecana)
Anaconda to dystrybucja Pythona z gotowym środowiskiem do data science.
- Pobierz z anaconda.com
- Zainstaluj
- Uruchom Jupyter Notebook lub Jupyter Lab
Opcja 2: pip + VSCode
# Zainstaluj Python z python.org
# Następnie:
pip install notebook numpy pandas statsmodels matplotlib seaborn scipy
# Uruchom notebook
jupyter notebook
Środowisko wirtualne (dobra praktyka)
python -m venv ekonometria_env
source ekonometria_env/bin/activate # macOS/Linux
# lub
ekonometria_env\Scripts\activate # Windows
pip install numpy pandas statsmodels
Podstawy Pythona
# Typy podstawowe
x = 3.14 # float
n = 42 # int
tekst = "Witaj" # str
logiczne = True # bool
brak = None # odpowiednik NA z R
# Arytmetyka
5 ** 2 # 25 (potęga)
10 // 3 # 3 (dzielenie całkowite)
10 % 3 # 1 (reszta z dzielenia)
# Listy (odpowiednik wektorów)
x = [1, 2, 3, 4, 5]
x[0] # 1 (Python zaczyna od 0!)
x[-1] # 5 (ostatni element)
x[1:3] # [2, 3] (slice)
x.append(6) # dodaj element
# Słowniki
dane = {"imie": "Anna", "wiek": 25, "dochod": 4500}
dane["dochod"] # 4500
NumPy — obliczenia numeryczne
import numpy as np
# Wektory (arrays)
x = np.array([1, 2, 3, 4, 5])
y = np.linspace(0, 1, 11) # 11 punktów od 0 do 1
z = np.zeros(5) # [0, 0, 0, 0, 0]
I = np.eye(3) # macierz identycznościowa 3x3
# Operacje wektorowe
x * 2 # [2, 4, 6, 8, 10]
np.log(x) # logarytm każdego elementu
np.sqrt(x) # pierwiastek
# Statystyki
np.mean(x) # 3.0
np.std(x, ddof=1) # odchylenie std próby
np.corrcoef(x, y[:5]) # macierz korelacji
# Macierze — algebra liniowa
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
A @ B # mnożenie macierzy
np.linalg.inv(A) # odwrotność
np.linalg.det(A) # wyznacznik
# MNK ręcznie (dla ilustracji)
# beta = (X'X)^{-1} X'y
X = np.column_stack([np.ones(len(x)), x]) # dodaj kolumnę jedynek
y_sim = 2 + 3*x + np.random.randn(5)
beta = np.linalg.inv(X.T @ X) @ X.T @ y_sim
print(beta) # [intercept, slope]
Pandas — manipulacja danych
import pandas as pd
# Wczytywanie danych
df = pd.read_csv("dane.csv")
df = pd.read_excel("dane.xlsx", sheet_name="Arkusz1")
# Podgląd
df.head() # pierwsze 5 wierszy
df.tail(10) # ostatnie 10
df.shape # (n_wierszy, n_kolumn)
df.dtypes # typy kolumn
df.describe() # statystyki opisowe
df.info() # info o DataFrame
# Dostęp do kolumn
df["dochod"] # Serie (jedna kolumna)
df[["imie", "dochod"]] # DataFrame (wiele kolumn)
df.iloc[0] # pierwszy wiersz (po indeksie)
df.loc[0, "dochod"] # konkretna komórka
# Filtrowanie
bogatsi = df[df["dochod"] > 5000]
kobiety = df[df["plec"] == "K"]
selekcja = df[(df["dochod"] > 3000) & (df["wiek"] < 40)]
# Nowe kolumny
df["ln_dochod"] = np.log(df["dochod"])
df["wiek_kw"] = df["wiek"] ** 2
# Grupowanie
df.groupby("region")["dochod"].mean()
df.groupby(["region", "plec"])["dochod"].agg(["mean", "std", "count"])
# Sortowanie
df.sort_values("dochod", ascending=False).head(10)
Statsmodels — regresja i testy
import statsmodels.formula.api as smf
import statsmodels.api as sm
# Wczytaj dane przykładowe
from statsmodels.datasets import wage
data = wage.load_pandas().data
# Prosta regresja (formula interface — jak R!)
model = smf.ols('np.log(WAGE) ~ ED', data=data).fit()
print(model.summary())
# Regresja wieloraka
model2 = smf.ols(
'np.log(WAGE) ~ ED + EX + I(EX**2) + C(SOUTH) + C(SEX)',
data=data
).fit()
print(model2.summary())
# Kluczowe atrybuty
model2.params # współczynniki
model2.pvalues # p-wartości
model2.rsquared # R^2
model2.rsquared_adj # R^2 adjusted
model2.fvalue # statystyka F
model2.resid # reszty
model2.fittedvalues # dopasowane wartości
# Odporne błędy standardowe
model_robust = smf.ols('np.log(WAGE) ~ ED + EX', data=data)\
.fit(cov_type='HC3')
print(model_robust.summary())
Interpretacja summary
OLS Regression Results
================================================================
Dep. Variable: np.log(WAGE) R-squared: 0.253
Method: OLS Adj. R-squared: 0.251
F-statistic: 119.2
Prob (F-statistic): 2.05e-44
================================================================
coef std err t P>|t| [0.025 0.975]
----------------------------------------------------------------
Intercept 0.7574 0.088 8.607 0.000 0.585 0.930
ED 0.0891 0.007 12.803 0.000 0.076 0.103
EX 0.0125 0.003 4.048 0.000 0.006 0.019
Wizualizacje
Matplotlib (niskopoziomowe)
import matplotlib.pyplot as plt
import numpy as np
# Wykres funkcji
x = np.linspace(-3, 3, 100)
y_norm = (1/np.sqrt(2*np.pi)) * np.exp(-x**2/2)
plt.figure(figsize=(8, 4))
plt.plot(x, y_norm, 'b-', linewidth=2, label='N(0,1)')
plt.fill_between(x, y_norm, where=(x >= -1.96) & (x <= 1.96),
alpha=0.3, label='95% area')
plt.axvline(-1.96, color='r', linestyle='--')
plt.axvline(1.96, color='r', linestyle='--')
plt.xlabel('z')
plt.ylabel('f(z)')
plt.title('Standardowy rozkład normalny')
plt.legend()
plt.tight_layout()
plt.savefig('normal.png', dpi=150)
plt.show()
Seaborn (statystyczne wykresy)
import seaborn as sns
# Scatter z regresją
sns.regplot(x='ED', y='WAGE', data=data,
scatter_kws={'alpha': 0.4})
# Histogram z krzywą gęstości
sns.histplot(data['WAGE'], bins=30, kde=True)
# Heatmapa korelacji
corr_matrix = data[['WAGE', 'ED', 'EX', 'AGE']].corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)
# Boxplot
sns.boxplot(x='SEX', y='WAGE', data=data)
# Pairplot — macierz scatter plot
sns.pairplot(data[['WAGE', 'ED', 'EX', 'AGE']])
Jupyter Notebook — workflow
# Jupyter to interaktywne środowisko:
# - komórki kodu (Shift+Enter = wykonaj)
# - komórki Markdown (dokumentacja, wzory LaTeX)
# - wykresy wyświetlają się inline
# Przydatne komendy:
%matplotlib inline # wykresy inline
%timeit x.mean() # zmierz czas wykonania
?pd.read_csv # dokumentacja funkcji
# Eksport do HTML/PDF
# File → Download As → HTML (lub Ctrl+Shift+P → Export)
Przykład: kompletna analiza
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# 1. Wczytaj i zbadaj dane
from statsmodels.datasets import cpunish
df = cpunish.load_pandas().data
print(df.describe())
# 2. Wizualizacja
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
sns.histplot(df['INCOME'], kde=True, ax=axes[0])
axes[0].set_title('Rozkład dochodu')
sns.scatterplot(x='INCOME', y='EXECUTIONS', data=df, ax=axes[1])
axes[1].set_title('Dochód vs. Egzekucje')
plt.tight_layout()
plt.show()
# 3. Regresja
model = smf.ols('EXECUTIONS ~ INCOME + SOUTH + DEGREE', data=df).fit()
print(model.summary())
# 4. Diagnostyka
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].scatter(model.fittedvalues, model.resid, alpha=0.5)
axes[0].axhline(0, color='r', linestyle='--')
axes[0].set_xlabel('Dopasowane wartości')
axes[0].set_ylabel('Reszty')
stats.probplot(model.resid, plot=axes[1])
plt.tight_layout()
plt.show()
Następnie: Zasoby do nauki ekonometrii
📚 Zasoby do nauki
- Anaconda — dystrybucja Pythona do data science
- statsmodels — dokumentacja
- pandas — dokumentacja
- YouTube: Corey Schafer — Python Tutorial
- Podręcznik: VanderPlas, Python Data Science Handbook (darmowy online)
💻 Kod źródłowy
Instalacja (przez Anaconda lub pip):
# Przez pip
pip install numpy pandas matplotlib seaborn statsmodels scipy scikit-learn jupyter
# Przez conda (zalecane dla data science)
conda install numpy pandas matplotlib seaborn statsmodels scipy scikit-learn
conda install -c conda-forge linearmodels # dane panelowe