<jupyter_start><jupyter_text>Lezione 2 - Esercizi Utilizziamo ed esploariamo un dataset di Pandas.Provate a svolgere i seguenti esercizi: 1) [Plottare grafici per età di uomini e donne](section1) 2) [Rappresentare i morti/sopravvissuti per ogni classe](section2)3) [Creare un grafico a torta dei soldi spesi per i biglietti](section3) 4) [Fitting di un istogramma](section4) 5) [Correzione tra prezzo biglietto ed età?](section5) 6) [Correlazioni in SerieA?](section6)  Importiamo il dataset del Titanic<jupyter_code>import pandas as pd

titanic = pd.read_csv("data/train_dataset_titanic.csv")
titanic.head()<jupyter_output><empty_output><jupyter_text>Plottare grafici per età di uomini e donne Effettuare dei calcoli sulle età degli uomini e delle donne.Per risolvere l'esercizio:1. Calcolare le principali statistiche delle serie delle età delle donne e degli uomini2. Rappresentare le età degli uomini e delle donne su due distinti istrogrammi, per ognuno dei due istogrammi provare a fittare i dati con una fistribuzione normale e disegnare la funzione di fit calcolata.<jupyter_code>donne = titanic.loc[titanic.Sex == "female"]
media_donne = donne.Age.mean()
std_donne = donne.Age.std()
print("L'età media delle donne era di: %d anni e la deviazione standard %.2f." % (media_donne, std_donne))

uomini = titanic.loc[titanic.Sex == "male"]
media_uomini = uomini.Age.mean()
std_uomini = uomini.Age.std()
print("L'età media degli uomini era di: %d anni e la deviazione standard %.2f." % (media_uomini, std_uomini))
titanic.describe()
donne.Age.describe()
uomini.Age.describe()
from scipy.stats import norm
help(norm.pdf)
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

max_bin = 80
num_bin = 16
xmin, xmax = 0, max_bin

# Creiamo l'istogramma per le donne non normalizzato
plt.hist(donne.Age, bins=num_bin, range=[xmin, xmax], color="pink")
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, media_donne, std_donne)
# La funzione gaussiana va moltiplicata per una costante che è 
# l'integrale dell'istogramma (ovvero base per altezza di ogni bin)
p *= donne.Age.count() * max_bin/num_bin
plt.plot(x, p, 'k', color="red", linewidth=2)
plt.title("Età delle donne")
plt.show()

# Cresiamo l'istogramma per gli uomini normalizzando i dati
plt.hist(uomini.Age, bins=num_bin, range=[xmin, xmax], density=True, color="lightblue")
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, media_uomini, std_uomini)
plt.plot(x, p, 'k', color="blue", linewidth=2)
plt.title("Età degli uomini")
plt.show()<jupyter_output><empty_output><jupyter_text>Gli errori che si vedono derivano dal fatto che alcuni passeggeri hanno NaN come valore per l'età e quindi la libreria pyplot non sa come disegnare quel valore nell'istogramma.<jupyter_code>u = uomini[uomini.Age.notnull()]
d = donne[donne.Age.notnull()]
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

max_bin = 80
num_bin = 16
xmin, xmax = 0, max_bin

plt.hist(d.Age, bins=num_bin, range=[xmin, xmax], density=True, color="pink")
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, media_donne, std_donne)
plt.plot(x, p, 'k', color="red", linewidth=2)
plt.title("Età delle donne")
plt.show()

plt.hist(u.Age, bins=num_bin, range=[xmin, xmax], density=True, color="lightblue")
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, media_uomini, std_uomini)
plt.plot(x, p, 'k', color="red", linewidth=2)
plt.title("Età degli uomini")
plt.show()<jupyter_output><empty_output><jupyter_text>Rappresentare i morti/sopravvissuti per ogni classe Rappresentare in un grafico a pila il numero di morti e sopravvissuti per ogni classe di servizio del viaggio (prima classe, seconda classe, terza classe).<jupyter_code>byclass = titanic.groupby(['Pclass', 'Survived'])['PassengerId'].aggregate(['count'])
byclass<jupyter_output><empty_output><jupyter_text>Abbiamo ottenuto il risultato che ci interessava, ma i dati hanno due indici (PClass e Survived) e un solo valore.Utilizzando il metodo unstack possiamo far diventare l'indice Survived una nuova dimensione in modo da avere una matrice:<jupyter_code>chart_data = byclass.unstack()
chart_data = chart_data.rename_axis('classe')
chart_data
ax = chart_data.plot.barh(stacked=True)
plt.show()<jupyter_output><empty_output><jupyter_text>Creare un grafico a torta dei soldi spesi per i biglietti Creare un grafico a torta che rappresenti il costo complessivo dei biglietti degli uomini e delle donne.<jupyter_code>fare_bysex = titanic.groupby(['Sex'])['Fare'].aggregate(['sum']).unstack()
fare_bysex = fare_bysex.rename("prezzo")
fare_bysex
fare_bysex.plot.pie(colors=['pink', 'lightblue'], labels=['donne', 'uomini'], autopct='%1.1f%%')<jupyter_output><empty_output><jupyter_text>Fitting di un istogramma  Scaricate il file `data1.txt` e realizzate un programma che legga e fitti i dati in esso contenuti. Il fitting potrà essere effettuato con una funzione gaussiana. Quindi fittate i dati e mostrate i risultati del fitting. Fare lo stesso con i dati nel file `data2.txt`.In questo caso il fitting dovrà avvenire con una funzione risultato della composizione di più funzioni (una per il background e una per i segnali).<jupyter_code>from scipy.stats import norm
import matplotlib.pyplot as plt

data = pd.read_csv('data/data1.txt', header=None)
data.columns = ["values"]

(mu, sigma) = norm.fit(data["values"])
n, bins, patches = plt.hist(data["values"], bins=100, density=True)

# add a 'best fit' line
y = norm.pdf(bins, mu, sigma)
l = plt.plot(bins, y, 'r--', linewidth=2)

# let's compute chi-square
chi = sum([((b - a)**2)/a for a, b in zip(n, y)])
print(f'Il chi quando calcolato è: {chi}.')<jupyter_output><empty_output><jupyter_text>Proviamo a costruire il fit "a mano" partendo da una definzione di una funzione di fit e usando il metodo `curve_fit` (ci verrà comodo per l'altra parte dell'esercizio!).<jupyter_code>from scipy.stats import norm
from scipy.optimize import curve_fit

import matplotlib.pyplot as plt

def fit_fuct(x, mean, std):
    f = norm(mean, std)
    return f.pdf(x)

data = pd.read_csv('data/data1.txt', header=None)
data.columns = ["values"]

(mu, sigma) = norm.fit(data["values"])
n, bins, patches = plt.hist(data["values"], bins=100, density=True)

bin_starts = [b for b in bins[:-1]]

popt, _ = curve_fit(fit_fuct, bin_starts, n)
y = [fit_fuct(b, *popt) for b in bin_starts]

# add a 'best fit' line
l = plt.plot(bin_starts, y, 'r--', linewidth=2)

# let's compute chi-square
chi = sum([((b - a)**2)/a for a, b in zip(n, y)])
print(f'Il chi quando calcolato è: {chi}.')<jupyter_output><empty_output><jupyter_text>Così facendo ci è anche possibile creare una funzione di fit sull'istogramma non normalizzato (aggiungendo un fattore di scala K alla funzione della gaussiana).<jupyter_code>from scipy.stats import norm
from scipy.optimize import curve_fit

import matplotlib.pyplot as plt

def fit_fuct(x, mean, std, k):
    f = norm(mean, std)
    return k * f.pdf(x)

data = pd.read_csv('data/data1.txt', header=None)
data.columns = ["values"]

(mu, sigma) = norm.fit(data["values"])
n, bins, patches = plt.hist(data["values"], bins=100)

bin_starts = [b for b in bins[:-1]]

popt, _ = curve_fit(fit_fuct, bin_starts, n)
y = [fit_fuct(b, *popt) for b in bin_starts]

# add a 'best fit' line
l = plt.plot(bin_starts, y, 'r--', linewidth=2)<jupyter_output><empty_output><jupyter_text>Proviamo ora a fittare i dati nel scondo file, usando una funziona di fit che è la composizione di background e segnali.<jupyter_code>from scipy.stats import norm
from scipy.optimize import curve_fit

import matplotlib.pyplot as plt

plt.figure(figsize=(16,8))

def fit_fuct(x, intercept, exp, k1, mean1, std1, k2, mean2, std2):
    # exponential background
    b = intercept * np.exp(-x/exp)
    
    # first signal
    f1 = norm(mean1, std1)
    
    # second signal
    f2 = norm(mean2, std2)

    return b + k1 * f1.pdf(x) + k2 * f2.pdf(x)

data = pd.read_csv('data/data2.txt', header=None)
data.columns = ["values"]

(mu, sigma) = norm.fit(data["values"])
n, bins, patches = plt.hist(data["values"], bins=100, density=True)

bin_centers = [bins[i] + (bins[i+1] - bins[i])/2 for i in range(len(bins)-1)]

#let's help the fit, all initial parameters default to 1 unless differently specified here
initial_params = [1, 1, 1, 130, 1, 1, 170, 1]
popt, _ = curve_fit(fit_fuct, bin_centers, n, initial_params)
y = [fit_fuct(b, *popt) for b in bin_centers]

# add a 'best fit' line
l = plt.plot(bin_centers, y, 'r--', linewidth=2)<jupyter_output><empty_output><jupyter_text>Correlazione tra prezzo biglietto ed età?  Verificare se esiste una correlazione tra l'età del passeggero e il prezzo pagato per il biglietto. La correlezione può essere vista ad occhio facendo un grafico scatter o calcolata con un indice di correlazione.<jupyter_code>titanic.plot.scatter(x='Age', y='Fare')
titanic[['Age', 'Fare']].corr()
import seaborn as sns

ax = sns.pairplot(titanic[['Age', 'Fare']])
plt.show()<jupyter_output><empty_output><jupyter_text>Correlazioni in SerieA?  Riprendiamo il dataset sulla classifica di Serie A e vediamo se il numero di gol e le partite vinte, pareggiate e perse (in casa e fuori casa) correlano con il punteggio ottenuto in classifica.<jupyter_code>classifica_serie_a = pd.read_html(io="http://www.legaseriea.it/it/serie-a/classifica", skiprows=1, header=0)
classifica_serie_a = classifica_serie_a[0]
classifica_serie_a
classifica_serie_a[['PUNTI', 'V.1', 'N.1', 'P.1', 'V.2', 'N.2', 'P.2', 'F', 'S']].corr()
import seaborn as sns

ax = sns.pairplot(classifica_serie_a[['PUNTI', 'V.1', 'N.1', 'P.1', 'V.2', 'N.2', 'P.2', 'F', 'S']])
plt.show()
import seaborn as sns

sns.heatmap(classifica_serie_a[['PUNTI', 'V.1', 'N.1', 'P.1', 'V.2', 'N.2', 'P.2', 'F', 'S']].corr(), cmap="Blues")
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1304170073589534, 'fraction_numerical': 0.012980376124284546, 'mean_word_length': 5.575940860215054, 'pattern_counts': {'":': 0, '<': 49, '<?xml version=': 0, '>': 49, 'https://': 0, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '213244', 'license': 'Apache-2.0', 'n_tokens_mistral': 3925, 'n_tokens_neox': 3827, 'n_words': 1074, 'path': 'Lezioni/Lezione 2.B - Soluzioni.ipynb', 'repo_name': 'biancini/DataScience-HEP', 'size': '9784'}