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