#!/usr/bin/env python
# coding: utf-8

# # Calidad del dato 3

# ## Caso Fabricación

# In[2]:


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
warnings.filterwarnings('ignore')

pd.options.display.float_format = '{:.2f}'.format #Desactivar notación científica en pandas:
np.set_printoptions(suppress=True) #Desactivar notación científica en numpy:
pd.set_option('display.max_columns', None) #comando para mostrar todas las columnas


# In[5]:


df1 = pd.read_csv("./datos/calidad_3.csv", sep=",", decimal=".", encoding="WINDOWS-1252")


# In[6]:


df1.head()


# In[7]:


df1.describe()


# In[8]:


df1.info()


# In[23]:


sns.histplot(df1.iloc[:,0])


# In[25]:


import seaborn as sns
import matplotlib.pyplot as plt

for a in range(len(df1.columns)):
    sns.histplot(df1.iloc[:,a])
    plt.show()

    
#ns.histplot(df1.G2)
#lt.show()


# Se pueden ver valores dispersos en todas las zonas de medida (G1:G9).
# Un buen método para ver si son outliers es a través de Boxplot
# 

# In[27]:


for a in range(len(df1.columns)):
    sns.boxplot(df1.iloc[:,a])
    plt.show()


# In[41]:


# Existen diferentes métodos para detectar outliers que veremos más adelante.  Para este ejemplo usaremos la fórmula:
# Rango Outliers superior = Q3 + 1.5*IRQ
# Rango Outliers inferior = Q1 - 1.5*IRQ

def deteccion_outliers(x):
    sorted(x)
    Q1,Q3 = np.percentile(x , [25,75])
    IQR = Q3 - Q1
    rango_inf = Q1 - (1.5 * IQR)
    rango_sup = Q3 + (1.5 * IQR)
    
    x = x[x>rango_inf]
    x = x[x<rango_sup]
    
    return x


# In[42]:


g1 = deteccion_outliers(df1.G1)


# In[43]:


g1


# In[44]:


#Pintamos el resultado de los datos, con y sin outliers
sns.boxplot(df1.G1)
plt.show()
sns.boxplot(g1)
plt.show()


# Ejercicio:
# - Localiza y elimina los outliers en el resto de las columnas.
# - Genera un nuevo dataset sin outliers
# - Comprueba mediante histograma que las variables y no tienen valores atípicos.
