Análisis de los datos obtenidos

Producción del día 20 de Julio de 2015

Los datos del experimento:

  • Hora de inicio: 16:08
  • Hora final : 16:35
  • $T: 150ºC$
  • $V_{min} tractora: 1 mm/s$
  • $V_{max} tractora: 3 mm/s$

Se desea comprobar si el filamento que podemos llegar a extruir con el sistema de la tractora puede llegar a ser bueno como para regularlo.


In [1]:
%pylab inline
#Importamos las librerías utilizadas
import numpy as np
import pandas as pd
import seaborn as sns


Populating the interactive namespace from numpy and matplotlib

In [2]:
#Mostramos las versiones usadas de cada librerías
print ("Numpy v{}".format(np.__version__))
print ("Pandas v{}".format(pd.__version__))
print ("Seaborn v{}".format(sns.__version__))


Numpy v1.9.2
Pandas v0.16.2
Seaborn v0.6.0

In [3]:
#Abrimos el fichero csv con los datos de la muestra
datos = pd.read_csv('datos.csv')

In [11]:
#Almacenamos en una lista las columnas del fichero con las que vamos a trabajar
columns = ['Diametro X','Diametro Y','VELOCIDAD']

In [7]:
#Mostramos un resumen de los datos obtenidoss
datos[columns].describe()
#datos.describe().loc['mean',['Diametro X [mm]', 'Diametro Y [mm]']]


Out[7]:
Diametro X Diametro Y VELOCIDAD
count 203.000000 203.000000 203.000000
mean 1.595262 1.567753 2.780788
std 0.253779 0.229362 2.128159
min 1.080699 1.103673 0.750000
25% 1.396121 1.413985 0.750000
50% 1.585374 1.505929 0.750000
75% 1.809036 1.781762 5.000000
max 2.193277 2.034608 5.000000

Representamos ambos diámetro y la velocidad de la tractora en la misma gráfica


In [14]:
#datos.ix[:, "Diametro X":"Diametro Y"].plot(secondary_y=['VELOCIDAD'],figsize=(16,10),ylim=(0.5,3)).hlines([1.85,1.65],0,3500,colors='r')
datos[columns].plot(secondary_y=['VELOCIDAD'],figsize=(10,5),title='Modelo matemático del sistema').hlines([1.6 ,1.8],0,2000,colors='r')

#datos['RPM TRAC'].plot(secondary_y='RPM TRAC')


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-7f0904eecf00> in <module>()
      1 #datos.ix[:, "Diametro X":"Diametro Y"].plot(secondary_y=['VELOCIDAD'],figsize=(16,10),ylim=(0.5,3)).hlines([1.85,1.65],0,3500,colors='r')
----> 2 datos[columns].plot(secondary_y=datos['VELOCIDAD'],figsize=(10,5),title='Modelo matemático del sistema').hlines([1.6 ,1.8],0,2000,colors='r')
      3 
      4 #datos['RPM TRAC'].plot(secondary_y='RPM TRAC')

C:\Python34\lib\site-packages\pandas\tools\plotting.py in plot_frame(data, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)
   2486                  yerr=yerr, xerr=xerr,
   2487                  secondary_y=secondary_y, sort_columns=sort_columns,
-> 2488                  **kwds)
   2489 
   2490 

C:\Python34\lib\site-packages\pandas\tools\plotting.py in _plot(data, x, y, subplots, ax, kind, **kwds)
   2320                             pass
   2321                 data = series
-> 2322         plot_obj = klass(data, subplots=subplots, ax=ax, kind=kind, **kwds)
   2323 
   2324     plot_obj.generate()

C:\Python34\lib\site-packages\pandas\tools\plotting.py in __init__(self, data, **kwargs)
   1544 
   1545     def __init__(self, data, **kwargs):
-> 1546         MPLPlot.__init__(self, data, **kwargs)
   1547         if self.stacked:
   1548             self.data = self.data.fillna(value=0)

C:\Python34\lib\site-packages\pandas\tools\plotting.py in __init__(self, data, kind, by, subplots, sharex, sharey, use_index, figsize, grid, legend, rot, ax, fig, title, xlim, ylim, xticks, yticks, sort_columns, fontsize, secondary_y, colormap, table, layout, **kwds)
    811 
    812         if grid is None:
--> 813             grid = False if secondary_y else self.plt.rcParams['axes.grid']
    814 
    815         self.grid = grid

C:\Python34\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
    712         raise ValueError("The truth value of a {0} is ambiguous. "
    713                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 714                          .format(self.__class__.__name__))
    715 
    716     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

In [8]:
datos.ix[:, "Diametro X":"Diametro Y"].boxplot(return_type='axes')


Out[8]:
<matplotlib.axes._subplots.AxesSubplot at 0x7dd2ed0>

Con esta segunda aproximación se ha conseguido estabilizar los datos. Se va a tratar de bajar ese porcentaje. Como cuarta aproximación, vamos a modificar las velocidades de tracción. El rango de velocidades propuesto es de 1.5 a 5.3, manteniendo los incrementos del sistema experto como en el actual ensayo.

Comparativa de Diametro X frente a Diametro Y para ver el ratio del filamento


In [9]:
plt.scatter(x=datos['Diametro X'], y=datos['Diametro Y'], marker='.')


Out[9]:
<matplotlib.collections.PathCollection at 0x8d612b0>

Filtrado de datos

Las muestras tomadas $d_x >= 0.9$ or $d_y >= 0.9$ las asumimos como error del sensor, por ello las filtramos de las muestras tomadas.


In [10]:
datos_filtrados = datos[(datos['Diametro X'] >= 0.9) & (datos['Diametro Y'] >= 0.9)]

In [11]:
#datos_filtrados.ix[:, "Diametro X":"Diametro Y"].boxplot(return_type='axes')

Representación de X/Y


In [12]:
plt.scatter(x=datos_filtrados['Diametro X'], y=datos_filtrados['Diametro Y'], marker='.')


Out[12]:
<matplotlib.collections.PathCollection at 0x8da11b0>

Analizamos datos del ratio


In [13]:
ratio = datos_filtrados['Diametro X']/datos_filtrados['Diametro Y']
ratio.describe()


Out[13]:
count    992.000000
mean       1.016456
std        0.135163
min        0.618503
25%        0.936906
50%        1.005276
75%        1.083876
max        1.643703
dtype: float64

In [14]:
rolling_mean = pd.rolling_mean(ratio, 50)
rolling_std = pd.rolling_std(ratio, 50)
rolling_mean.plot(figsize=(12,6))
# plt.fill_between(ratio, y1=rolling_mean+rolling_std, y2=rolling_mean-rolling_std, alpha=0.5)
ratio.plot(figsize=(12,6), alpha=0.6, ylim=(0.5,1.5))


Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x8e552b0>

Límites de calidad

Calculamos el número de veces que traspasamos unos límites de calidad. $Th^+ = 1.85$ and $Th^- = 1.65$


In [15]:
Th_u = 1.85
Th_d = 1.65

In [16]:
data_violations = datos[(datos['Diametro X'] > Th_u) | (datos['Diametro X'] < Th_d) |
                       (datos['Diametro Y'] > Th_u) | (datos['Diametro Y'] < Th_d)]

In [17]:
data_violations.describe()


Out[17]:
Tmp Husillo Tmp Nozzle Diametro X Diametro Y MARCHA PARO RPM EXTR RPM TRAC
count 942.000000 942.000000 942.000000 942.000000 942 942 942 942.00000
mean 64.429299 151.112633 1.641566 1.620457 1 1 0 2.20265
std 1.698887 0.745685 0.302790 0.324456 0 0 0 0.91965
min 60.700000 149.700000 0.977470 0.000342 True True 0 1.49750
25% 63.200000 150.500000 1.413326 1.436971 1 1 0 1.49750
50% 64.700000 151.000000 1.585374 1.563394 1 1 0 1.49750
75% 65.900000 151.700000 1.872121 1.885199 1 1 0 3.50000
max 66.900000 152.900000 2.583253 2.436864 True True 0 3.50000

In [18]:
data_violations.plot(subplots=True, figsize=(12,12))


Out[18]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x08E5AFF0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x0AE6BBB0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x0AE93FB0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x0AEB7670>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x0AEE2950>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x0AF00DD0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x0AF2AF90>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x0AF342D0>], dtype=object)

In [ ]: