Análisis de los datos obtenidos

Uso de ipython para el análsis y muestra de los datos obtenidos durante la producción. Los datos analizados son del filamento de bq el día 20 de Julio del 2015


In [34]:
#Importamos las librerías utilizadas
import numpy as np
import pandas as pd
import seaborn as sns
import sklearn as sk
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

In [35]:
#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__))
print ("Sklearn v{}".format(sk.__version__))


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

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

In [37]:
datos_filtrados = datos[(datos['Diametro X'] >= 1.2) & (datos['Diametro Y'] >= 1.2)]

In [38]:
%pylab inline


Populating the interactive namespace from numpy and matplotlib

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


Out[39]:
time Tmp Husillo Tmp Nozzle Diametro X Diametro Y MARCHA PARO RPM EXTR RPM TRAC
count 2960.000000 2960.000000 2960.000000 2960.000000 2960.000000 2960 2960 2960.000000 2960.000000
mean 1577.391554 62.654122 138.123480 1.515017 1.493301 1 0.9915541 1.975000 4.030974
std 872.202567 3.034398 0.763071 0.150635 0.145693 0 0.09152837 0.156151 0.284767
min 4.000000 58.500000 136.100000 1.200000 1.200000 True False 1.000000 3.814816
25% 828.750000 59.500000 137.500000 1.410000 1.390000 1 1 2.000000 3.814816
50% 1568.500000 63.000000 138.200000 1.490000 1.480000 1 1 2.000000 3.814816
75% 2320.250000 65.500000 138.600000 1.590000 1.570000 1 1 2.000000 4.410560
max 3181.000000 67.700000 140.100000 2.510000 2.200000 True True 2.000000 4.410560

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

In [41]:
#Mostramos en varias gráficas la información obtenida tras el ensayo
datos_filtrados[columns].plot(secondary_y=['RPM TRAC'],figsize=(20,20))
#datos_filtrados['RPM TRAC'].plot(secondary_y=True,style='g',figsize=(20,20)).set_ylabel=('RPM')


Out[41]:
<matplotlib.axes._subplots.AxesSubplot at 0x1480a6d0>

In [83]:
# Buscamos el polinomio de orden 4 que determina la distribución de los datos
reg = np.polyfit(datos_filtrados['time'],datos_filtrados['Diametro X'],4)
# Calculamos los valores de y con la regresión
ry = np.polyval(reg,datos_filtrados['time'])
print ('P(x)= {} {}*X {}*X^2 {}*X^3 {}*X^4'.format(reg[0],reg[1],reg[2],reg[3],reg[4]) )


P(x)= 4.16551515485159e-14 -2.9663810637727765e-10*X 6.829989512087881e-07*X^2 -0.0006281979629074546*X^3 1.7445228255001501*X^4

In [73]:
plt.plot(datos_filtrados['time'],datos_filtrados['Diametro X'],'*', label=('f(x)'))
plt.plot(datos_filtrados['time'],ry,'ro', label=('regression'))
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')


Out[73]:
<matplotlib.text.Text at 0x15e94a50>

Representamos ambos diámetros en la misma gráfica


In [40]:
datos_filtrados.ix[:, "Diametro X":"Diametro Y"].plot(figsize=(16,3))


Out[40]:
<matplotlib.axes._subplots.AxesSubplot at 0x50eb230>

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


Out[41]:
<matplotlib.axes._subplots.AxesSubplot at 0xff7ba30>

Mostramos la representación gráfica de la media de las muestras


In [42]:
pd.rolling_mean(datos[columns], 50).plot(subplots=True, figsize=(12,12))


Out[42]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x13AE40F0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x13B13B50>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x13D622B0>], dtype=object)

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


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


---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-43-23c594e5b634> in <module>()
----> 1 plt.scatter(x=datos['Diametro X [mm]'], y=datos['Diametro Y [mm]'], marker='.')

C:\Python34\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   1795             return self._getitem_multilevel(key)
   1796         else:
-> 1797             return self._getitem_column(key)
   1798 
   1799     def _getitem_column(self, key):

C:\Python34\lib\site-packages\pandas\core\frame.py in _getitem_column(self, key)
   1802         # get column
   1803         if self.columns.is_unique:
-> 1804             return self._get_item_cache(key)
   1805 
   1806         # duplicate columns & possible reduce dimensionaility

C:\Python34\lib\site-packages\pandas\core\generic.py in _get_item_cache(self, item)
   1082         res = cache.get(item)
   1083         if res is None:
-> 1084             values = self._data.get(item)
   1085             res = self._box_item_values(item, values)
   1086             cache[item] = res

C:\Python34\lib\site-packages\pandas\core\internals.py in get(self, item, fastpath)
   2849 
   2850             if not isnull(item):
-> 2851                 loc = self.items.get_loc(item)
   2852             else:
   2853                 indexer = np.arange(len(self.items))[isnull(self.items)]

C:\Python34\lib\site-packages\pandas\core\index.py in get_loc(self, key, method)
   1570         """
   1571         if method is None:
-> 1572             return self._engine.get_loc(_values_from_object(key))
   1573 
   1574         indexer = self.get_indexer([key], method=method)

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:3838)()

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:3718)()

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12294)()

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12245)()

KeyError: 'Diametro X [mm]'

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 [ ]:
datos_filtrados = datos[(datos['Diametro X [mm]'] >= 0.9) & (datos['Diametro Y [mm]'] >= 0.9)]

Representación de X/Y


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

Analizamos datos del ratio


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

In [ ]:
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))

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 [ ]:
Th_u = 1.85
Th_d = 1.65

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

In [ ]:
data_violations.describe()

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

In [ ]: