Exploratory Data Analysis 4
#zadatak
"""
* Pivot + heatmap: Napravi pivot tabelu Region × Month (mean AvgTemperature) i
vizuelizuj seaborn heatmap. Napiši 2 zapažanja.
* Barplot: Nacrtaj grafikon koji prikazuje prosečne temperature po regionima po godinama.
* ANOVA: Proveri da li za Evropu postoji statistički značajna
razlika prosečne temperature u različitim godinama.
"""
#importi
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
from pathlib import Path
from scipy.stats import f_oneway #3. zad
#ucitavanje
plt.rcParams["figure.figsize"] = (10,5)
DATA_PATH = Path("city_temperature.csv")
df = pd.read_csv(DATA_PATH)
#ciscenje i dopune
df.loc[df["AvgTemperature"] == -99, "AvgTemperature"] = np.nan
df.loc[df["Day"] == 0, "Day"] = np.nan
df["Year"] = df["Year"].replace({200: np.nan, 201: np.nan})
if "State" in df.columns:
df = df.drop("State", axis=1)
df['AvgTemperature'] = df['AvgTemperature'].ffill()
df = df.dropna(axis=0)
#celzijus
df["AvgTemperature_C"] = (df["AvgTemperature"] - 32) * (5/9)
print("Shape:", df.shape)
print(df.head()) #d
#1. pravljenje pivot tabele: redovi = region, kolone = meseci, srednja vrednost
#pivot tabela
pivot_rm = (df.groupy(["Region", "Month"], as_index=False)\
["AvgTemperature_C"]\
.mean()\
.pivot(index="Region", columns="Month", values="AvgTemperature_C")\
.sort_index()
)
#vizuelizacija kao heatmap
print(pivot_rm.round(2)) #d
plt.figure(figsize=(10,6))
sb.heatmap(pivot_rm, annot=False, cmap="coolwarm", linewidths=.5)
plt.title("Heatmap")
plt.tight_layout()
plt.show()
#zapazanje 1: najtopliji mesec u regionu:
max_month_per_region = pivot_rm.idxmax(axis=1)
#globalni najtopliji region, po mesecnom proseku
mean_per_region = pivot_rm.mean(axis=1)
glob_warmest_region = mean_per_region.idxmax()
print("Najtopliji mesec po regionu:")
print(max_month_per_region.to_frame("Najtopliji mesec")) #d
#zapazanje 2:
# - u evropi i americi postoje znacajne promene temperature
# tokom godine, dok ih u africi i centralnoj americi gotovo
# i nema
#2. barplot:, region x year:
years_sorted = sorted(df["Year"].unique())[-3:]
g2 = df[df["Year"].isin(years_sorted)]
sb.barplot(data=g2, x="Year", y="AvgTemperature", hue="Region")
plt.legend(title="Region", bbox_to_anchor=(1.02, 1), loc="upper left")
plt.show()
#3. anova (1 factor):
eu = df[df["Region"]=="Europe"].copy()
groups = []
for _, g in eu.groupby("Year"):
groups.append(g["AvgTemperature"].values)
F, p = f_oneway(*groups)
print(f"ANOVA F={F:.2f}, p-value={p:.3e}")
# p < 0.05: postoji statistički značajna razlika prosečne
# temperature između godina u Evropi (p < 0.05)
# p > 0.05: nema statistički značajne razlike prosečne temperature
# između godina u Evropi (p ≥ 0.05)
#sredine po godinama radi uvida
means_by_year = eu.groupby("Year")["AvgTemperature_C"].mean()
print(means_by_year.to_frame("Mean_Europe_AvgTemp_C").round(2)) #d