Práctica Final - Ciencia de Datos

 

Tarea Clase 08

 

Autor: Nicolás Fernández Cinquepalmi

 

Breve descripción: En el presente trabajo se pide analizar un conjunto de datos brindados por los profesores del curso, con el fin obtener las posibles relaciones entre ellos, y luego mostrar gráficos relacionados mediante la utilización de Python o ROOT.  

Los datos a utilizar en este trabajo fueron extraídos de la siguiente fuente:  

https://gitmilab.redclara.net/tutoriales/tutorial-mkdocs/-/blob/master/docs/modulo-datos/claseMD07/materialesMD07/data/analisis.csv

 

 

Paso 1: Comenzamos con importar los módulos necesarios para analizar los datos.

In [1]:
import pandas as pd
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from collections import OrderedDict
from scipy.optimize import curve_fit
import math
import matplotlib.mlab as mlab
import scipy
from scipy.stats import norm

 

Paso 2: Importamos el archivo .csv y lo almacenamos como Data Frame en la variable "datos".

In [2]:
file = '/home/student/ejercicios-clase-08-datos/data-used/data_analisis.csv'

datos = pd.read_csv(file,header=0)
datos
Out[2]:
individuo origen peso tamano
0 cam01 Alemania 18 26.0
1 cam02 Alemania 38 62.0
2 cam03 Alemania 39 59.0
3 cam04 Alemania 28 41.0
4 cam05 Alemania 7 13.5
5 cam06 Alemania 29 46.5
6 cam07 Alemania 19 25.5
7 cam08 Alemania 25 40.5
8 cam09 Alemania 40 59.0
9 cam10 Alemania 16 19.0
10 tur01 Inglaterra 26 39.0
11 tur02 Inglaterra 17 21.5
12 tur03 Inglaterra 32 49.0
13 tur04 Inglaterra 21 31.5
14 tur05 Inglaterra 21 27.5
15 pet01 Inglaterra 6 11.0
16 pet02 Italia 8 12.0
17 pet03 Italia 28 40.0
18 pet04 Italia 10 15.0
19 pet05 Italia 19 28.5
20 pet06 Italia 13 17.5
21 pet07 Italia 16 29.0
22 pet08 Italia 15 20.5
23 pet09 Italia 36 54.0
24 pet10 Francia 39 53.5
25 tur06 Francia 33 49.5
26 tur07 Francia 31 43.5
27 tur08 Francia 9 15.5
28 tur09 Francia 10 17.0
29 tur10 Francia 5 11.5
30 tur11 Francia 20 26.0
31 tur12 Francia 27 43.5

 

Paso 3: Separamos los valores correspondientes a las columnas 'peso' y 'tamano' por origen, y obtenemos el total.

In [3]:
pesoalem = 0
pesoingla = 0
pesoita = 0
pesofra = 0

pesolistalem = []
pesolistingla = []
pesolistita = []
pesolistfra = []

for i in range(len(datos.individuo)):
    if datos.origen[i]=='Alemania':
        pesoalem += datos.peso[i]
        pesolistalem.append(datos.peso[i])
    elif datos.origen[i]=='Inglaterra':
        pesoingla += datos.peso[i]
        pesolistingla.append(datos.peso[i])
    elif datos.origen[i]=='Italia':
        pesoita += datos.peso[i]
        pesolistita.append(datos.peso[i])
    elif datos.origen[i]=='Francia':
        pesofra += datos.peso[i]
        pesolistfra.append(datos.peso[i])
    
print('El peso total por país de origen es: ')
print('')
print('Ale, Ingla, Ita, Fra')
pesoalem, pesoingla, pesoita, pesofra
print('')
print('Alemania: ', pesolistalem)
print('Inglaterra: ', pesolistingla)
print('Italia: ', pesolistita)
print('Francia: ', pesolistfra)
El peso total por país de origen es: 

Ale, Ingla, Ita, Fra

Alemania:  [18, 38, 39, 28, 7, 29, 19, 25, 40, 16]
Inglaterra:  [26, 17, 32, 21, 21, 6]
Italia:  [8, 28, 10, 19, 13, 16, 15, 36]
Francia:  [39, 33, 31, 9, 10, 5, 20, 27]
In [4]:
tamalem = 0
tamingla = 0
tamita = 0
tamfra = 0

tamlistalem = []
tamlistingla = []
tamlistita = []
tamlistfra = []

for i in range(len(datos.individuo)):
    if datos.origen[i]=='Alemania':
        tamalem += datos.tamano[i]
        tamlistalem.append(datos.tamano[i])
    elif datos.origen[i]=='Inglaterra':
        tamingla += datos.tamano[i]
        tamlistingla.append(datos.tamano[i])
    elif datos.origen[i]=='Italia':
        tamita += datos.tamano[i]
        tamlistita.append(datos.tamano[i])
    elif datos.origen[i]=='Francia':
        tamfra += datos.tamano[i]
        tamlistfra.append(datos.tamano[i])
        
print('El tamano total por país de origen es: ')
print('')
print('  Ale,  Ingla,  Ita,   Fra')
tamalem, tamingla, tamita, tamfra
print('')
print('Alemania: ', tamlistalem)
print('Inglaterra: ', tamlistingla)
print('Italia: ', tamlistita)
print('Francia: ', tamlistfra)
El tamano total por país de origen es: 

  Ale,  Ingla,  Ita,   Fra

Alemania:  [26.0, 62.0, 59.0, 41.0, 13.5, 46.5, 25.5, 40.5, 59.0, 19.0]
Inglaterra:  [39.0, 21.5, 49.0, 31.5, 27.5, 11.0]
Italia:  [12.0, 40.0, 15.0, 28.5, 17.5, 29.0, 20.5, 54.0]
Francia:  [53.5, 49.5, 43.5, 15.5, 17.0, 11.5, 26.0, 43.5]

 

Paso 4: Obtenemos las cantidades totales de individuos por país de origen.

In [5]:
cantalem = 0
cantingla = 0
cantita = 0
cantfra = 0

for i in range(len(datos.individuo)):
    if datos.origen[i]=='Alemania':
        cantalem += 1
    elif datos.origen[i]=='Inglaterra':
        cantingla += 1
    elif datos.origen[i]=='Italia':
        cantita += 1
    elif datos.origen[i]=='Francia':
        cantfra += 1
        
print('El peso total por país de origen es: ')
print('')
print('Ale, Ingla, Ita, Fra')
cantalem, cantingla, cantita, cantfra
El peso total por país de origen es: 

Ale, Ingla, Ita, Fra
Out[5]:
(10, 6, 8, 8)

 

Paso 5: Calculamos los valores promedios de peso y tamano por país.

In [6]:
print('El peso promedio en Alemania es: ', "{:.2f}".format(pesoalem/cantalem))
print('El peso promedio en Inglaterra es: ', "{:.2f}".format(pesoingla/cantingla))
print('El peso promedio en Italia es: ', "{:.2f}".format(pesoita/cantita))
print('El peso promedio en Francia es: ', "{:.2f}".format(pesofra/cantfra))

print('')

print('El tamaño promedio en Alemania es: ', "{:.2f}".format(tamalem/cantalem))
print('El tamaño promedio en Inglaterra es: ', "{:.2f}".format(tamingla/cantingla))
print('El tamaño promedio en Italia es: ', "{:.2f}".format(tamita/cantita))
print('El tamaño promedio en Francia es: ', "{:.2f}".format(tamfra/cantfra))
El peso promedio en Alemania es:  25.90
El peso promedio en Inglaterra es:  20.50
El peso promedio en Italia es:  18.12
El peso promedio en Francia es:  21.75

El tamaño promedio en Alemania es:  39.20
El tamaño promedio en Inglaterra es:  29.92
El tamaño promedio en Italia es:  27.06
El tamaño promedio en Francia es:  32.50

 

Paso 6: Con el fin de tener una mejor visualización de la distribución de individuos por país de origen, realizamos un gráfico de torta.

In [7]:
data = [cantalem, cantingla, cantita, cantfra]
pais = ['Alemania','Inglaterra','Italia','Francia']

fig, ax = plt.subplots()
g = ax.pie(data, labels = pais, colors = ['SteelBlue','Gold','LightCoral','LimeGreen'],
           shadow=True, explode = (0.1,0.1,0.1,0.1), autopct = '%1.2f%%')
plt.show
Out[7]:
<function matplotlib.pyplot.show(*args, **kw)>

 

Paso 7: Realizamos histogramas con los pesos y tamanos por país de origen con el objetivo de visualizar la disperción de los valores en cada uno.

In [8]:
fig, axs = plt.subplots(1, 4, sharey=True, tight_layout=True)
bins = 8

axs[0].hist(pesolistalem, bins)
axs[0].set_title('Peso Alemania')
axs[0].set_xlabel("{:.2f}".format(np.mean(pesolistalem)))

axs[1].hist(pesolistingla, bins)
axs[1].set_title('Peso Inglaterra')
axs[1].set_xlabel("{:.2f}".format(np.mean(pesolistingla)))

axs[2].hist(pesolistita, bins)
axs[2].set_title('Peso Italia')
axs[2].set_xlabel("{:.2f}".format(np.mean(pesolistita)))

axs[3].hist(pesolistfra, bins)
axs[3].set_title('Peso Francia')
axs[3].set_xlabel("{:.2f}".format(np.mean(pesolistfra)))
Out[8]:
Text(0.5, 0, '21.75')
In [9]:
fig, axs = plt.subplots(1, 4, sharey=True, tight_layout=True)
bins = 8

axs[0].hist(tamlistalem, bins)
axs[0].set_title('Tam. Alemania')
axs[0].set_xlabel("{:.2f}".format(np.mean(tamlistalem)))

axs[1].hist(tamlistingla, bins)
axs[1].set_title('Tam. Inglaterra')
axs[1].set_xlabel("{:.2f}".format(np.mean(tamlistingla)))

axs[2].hist(tamlistita, bins)
axs[2].set_title('Tam. Italia')
axs[2].set_xlabel("{:.2f}".format(np.mean(tamlistita)))

axs[3].hist(tamlistfra, bins)
axs[3].set_title('Tam. Francia')
axs[3].set_xlabel("{:.2f}".format(np.mean(tamlistfra)))
Out[9]:
Text(0.5, 0, '32.50')

 

Paso 8: Además de utizar python, utilizaremos ROOT con fines de aprendizaje. Comenzamos importando los módulos necesarios.

In [10]:
import ROOT
import sys
from ROOT import TCanvas, TPad, TFile, TPaveLabel, TPaveText
from ROOT import gROOT
%jsroot on
Welcome to JupyROOT 6.18/04
In [11]:
!pip3 install root-pandas
import root_pandas
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: root-pandas in /home/student/.local/lib/python3.6/site-packages (0.7.0)
Requirement already satisfied: numpy in /home/student/.local/lib/python3.6/site-packages (from root-pandas) (1.18.1)
Requirement already satisfied: root-numpy in /home/student/.local/lib/python3.6/site-packages (from root-pandas) (4.8.0)
Requirement already satisfied: pandas>=0.18.0 in /home/student/.local/lib/python3.6/site-packages (from root-pandas) (1.0.1)
Requirement already satisfied: pytz>=2017.2 in /usr/lib/python3/dist-packages (from pandas>=0.18.0->root-pandas) (2018.3)
Requirement already satisfied: python-dateutil>=2.6.1 in /home/student/.local/lib/python3.6/site-packages (from pandas>=0.18.0->root-pandas) (2.8.1)
Requirement already satisfied: six>=1.5 in /home/student/.local/lib/python3.6/site-packages (from python-dateutil>=2.6.1->pandas>=0.18.0->root-pandas) (1.13.0)
WARNING: You are using pip version 20.0.2; however, version 21.0.1 is available.
You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.

 

Paso 9: Realizamos un análisis sobre los datos en general, es decir, sin considerar el país de origen. Primero cargamos el archivo .csv como Data Frame y luego lo visualizamos.

In [12]:
file = '/home/student/ejercicios-clase-08-datos/data-used/data_analisis.csv'
df1 = pd.read_csv(file,header=0)
df1
Out[12]:
individuo origen peso tamano
0 cam01 Alemania 18 26.0
1 cam02 Alemania 38 62.0
2 cam03 Alemania 39 59.0
3 cam04 Alemania 28 41.0
4 cam05 Alemania 7 13.5
5 cam06 Alemania 29 46.5
6 cam07 Alemania 19 25.5
7 cam08 Alemania 25 40.5
8 cam09 Alemania 40 59.0
9 cam10 Alemania 16 19.0
10 tur01 Inglaterra 26 39.0
11 tur02 Inglaterra 17 21.5
12 tur03 Inglaterra 32 49.0
13 tur04 Inglaterra 21 31.5
14 tur05 Inglaterra 21 27.5
15 pet01 Inglaterra 6 11.0
16 pet02 Italia 8 12.0
17 pet03 Italia 28 40.0
18 pet04 Italia 10 15.0
19 pet05 Italia 19 28.5
20 pet06 Italia 13 17.5
21 pet07 Italia 16 29.0
22 pet08 Italia 15 20.5
23 pet09 Italia 36 54.0
24 pet10 Francia 39 53.5
25 tur06 Francia 33 49.5
26 tur07 Francia 31 43.5
27 tur08 Francia 9 15.5
28 tur09 Francia 10 17.0
29 tur10 Francia 5 11.5
30 tur11 Francia 20 26.0
31 tur12 Francia 27 43.5

 

Paso 10: Realizamos la conversión 'Data Frame - .root'

In [13]:
df1.to_root('/home/student/ejercicios-clase-08-datos/data-used/data_analisis.root', key='mytree')
/home/student/.local/lib/python3.6/site-packages/root_numpy/_tree.py:575: UserWarning: converter for dtype('O') is not implemented (skipping)
  cobj = _librootnumpy.array2tree_toCObj(arr, name=name, tree=incobj)
In [14]:
f = ROOT.TFile.Open('/home/student/ejercicios-clase-08-datos/data-used/data_analisis.root')

 

Paso 11: Creamos una canvas para luego poder graficar nuestros histogramas.

In [15]:
canvas = ROOT.TCanvas("Canvas","a first way to plot a variable",800,600)
In [16]:
tree = f.Get("mytree")
tree.GetEntries()
Out[16]:
32

 

Paso 12: Creamos un histograma con la Distribución de Pesos y le ajustamos una curva gaussiana.

In [17]:
hist = ROOT.TH1F("Variable: Peso","Distribucion de Pesos; Valor de Peso ; Events ",8,0,45)
for event in tree:
    hist.Fill(tree.peso)
    
print("Done!")

hist.SetFillColor(ROOT.kBlue-10)
canvas.Draw()
hist.Fit("gaus");
Done!
 FCN=2.72155 FROM MIGRAD    STATUS=CONVERGED      58 CALLS          59 TOTAL
                     EDM=2.33796e-08    STRATEGY= 1      ERROR MATRIX ACCURATE 
  EXT PARAMETER                                   STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  Constant     6.07339e+00   1.41538e+00   1.05736e-03   1.53433e-04
   2  Mean         2.18406e+01   2.38978e+00   2.24715e-03  -5.29036e-05
   3  Sigma        1.13300e+01   2.08095e+00   4.82966e-05   1.82003e-03

 

Paso 13: Creamos un histograma con la Distribución de Tamanos y le ajustamos una curva gaussiana.

In [18]:
hist = ROOT.TH1F("Variable: Tamano","Distribucion de Tamanos; Valor de Tamano ; Events ",8,10,66)
for event in tree:
    hist.Fill(tree.tamano)
    
print("Done!")

hist.SetFillColor(ROOT.kBlue-10)
canvas.Draw()
hist.Fit("gaus");
Done!
 FCN=8.33439 FROM HESSE     STATUS=NOT POSDEF     26 CALLS        1105 TOTAL
                     EDM=5.20343e-09    STRATEGY= 1      ERR MATRIX NOT POS-DEF
  EXT PARAMETER                APPROXIMATE        STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  Constant     1.22835e+03   3.26288e+03   7.52706e-02   1.07954e-07
   2  Mean        -5.13994e+02   1.26111e+02   2.80883e-03   3.33000e-06
   3  Sigma        1.58227e+02   1.38177e+02   9.62716e-02  -8.22320e-05

 

Paso 14: Realizamos un análisis particular sobre los datos refentes a los individuos de origen Alemán.

In [19]:
file1 = '/home/student/ejercicios-clase-08-datos/data-used/data_analisis1.csv'
df2 = pd.read_csv(file1,header=0)
df2
Out[19]:
individuo origen peso tamano
0 cam01 Alemania 18 26.0
1 cam02 Alemania 38 62.0
2 cam03 Alemania 39 59.0
3 cam04 Alemania 28 41.0
4 cam05 Alemania 7 13.5
5 cam06 Alemania 29 46.5
6 cam07 Alemania 19 25.5
7 cam08 Alemania 25 40.5
8 cam09 Alemania 40 59.0
9 cam10 Alemania 16 19.0
In [20]:
df2.to_root('/home/student/ejercicios-clase-08-datos/data-used/data_analisis1.root', key='mytree1')
/home/student/.local/lib/python3.6/site-packages/root_numpy/_tree.py:575: UserWarning: converter for dtype('O') is not implemented (skipping)
  cobj = _librootnumpy.array2tree_toCObj(arr, name=name, tree=incobj)
In [21]:
f = ROOT.TFile.Open('/home/student/ejercicios-clase-08-datos/data-used/data_analisis1.root')
In [22]:
canvas1 = ROOT.TCanvas("Canvas1","a first way to plot a variable",800,600)
In [23]:
tree1 = f.Get("mytree1")
tree1.GetEntries()
Out[23]:
10

 

Paso 15: Creamos un histograma con la Distribución de Pesos y le ajustamos una curva gaussiana.

In [24]:
hist1 = ROOT.TH1F("Variable: Peso","Distribucion de Pesos Alemania; Valor de Peso ; Events ",8,0,45)
for event in tree1:
    hist1.Fill(tree1.peso)
    
print("Done!")

hist1.SetFillColor(ROOT.kBlue-10)
canvas1.Draw()
hist1.Fit("gaus");
Done!
 FCN=0.790887 FROM MIGRAD    STATUS=CONVERGED      95 CALLS          96 TOTAL
                     EDM=4.07479e-08    STRATEGY= 1      ERROR MATRIX ACCURATE 
  EXT PARAMETER                                   STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  Constant     1.59428e+00   7.58121e-01   3.43176e-04   4.05154e-04
   2  Mean         2.62351e+01   9.97291e+00   6.34626e-03   1.49117e-06
   3  Sigma        1.74952e+01   1.65989e+01   1.98725e-04   9.09955e-04

 

Paso 16: Creamos un histograma con la Distribución de Tamanos y le ajustamos una curva gaussiana.

In [25]:
hist1 = ROOT.TH1F("Variable: Tamano","Distribucion de Tamanos Alemania; Valor de Tamano ; Events ",8,10,66)
for event in tree1:
    hist1.Fill(tree1.tamano)
    
print("Done!")

hist1.SetFillColor(ROOT.kBlue-10)
canvas1.Draw()
hist1.Fit("gaus");
Done!
 FCN=1.17864 FROM MIGRAD    STATUS=CONVERGED     862 CALLS         863 TOTAL
                     EDM=2.51442e-06    STRATEGY= 1      ERROR MATRIX ACCURATE 
  EXT PARAMETER                                   STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  Constant     5.64369e+01   4.87558e+02   1.38247e-02  -6.39699e-05
   2  Mean         5.04141e+02   5.57585e+02   1.55813e-02   5.41138e-05
   3  Sigma        1.72723e+02   1.36627e+02   2.08398e-03  -4.61140e-04