Finding the better option to buy a Hyundai Tucson car


The idea is to find some options to buy a Hyundai Tucson car. There is a specialized site to buy and sell cars and motorbikes (http://www.webmotors.com.br). The cars/motorbikes can be new or used. There are many advertisements that are published every day in this place. So many options: color, year, model, price, etc. And I visit this site every day to find out a good opportunity.

How work: I created an app in python to extract (crawler) these data from this site. Then I saved these data in a sqlite database, called 'crawler-motors.db'. The next step was to analyze these data. So, I created this notebook. This notebook has seven parts. In general I use pandas for data manipulation, some statistical analysis and matplotlib to create some graphics. Also, I am using approaches of machine learning to do a prediction of the sale's price throught by a linear regression model.

In [1]:
import pandas as pd
import numpy as np
import sqlite3 as bd
import matplotlib.pyplot as plt

%matplotlib inline
In [2]:
path = '/home/lserra/Temp/'
database = 'crawler-motors.db'
In [3]:
cnn = bd.connect(path + database)
df = pd.read_sql_query('select * from webmotors;', cnn)
In [4]:
df.shape
Out[4]:
(4385, 21)
In [5]:
df.columns
Out[5]:
Index(['anuncio', 'estado', 'cidade', 'marca', 'modelo', 'modelo_marca', 'mmv',
       'combustivel', 'cambio', 'cod_anuncio', 'cor', 'preco', 'carroceria',
       'ano_modelo', 'tipo_pessoa', 'tipo_carro', 'km', 'final_placa',
       'dt_anuncio', 'fonte', 'dt_extraction'],
      dtype='object')
In [6]:
df.dtypes
Out[6]:
anuncio           object
estado            object
cidade            object
marca             object
modelo            object
modelo_marca      object
mmv               object
combustivel       object
cambio            object
cod_anuncio       object
cor               object
preco            float64
carroceria        object
ano_modelo         int64
tipo_pessoa       object
tipo_carro        object
km                object
final_placa       object
dt_anuncio        object
fonte             object
dt_extraction     object
dtype: object
In [7]:
df.head()
Out[7]:
anuncio estado cidade marca modelo modelo_marca mmv combustivel cambio cod_anuncio ... preco carroceria ano_modelo tipo_pessoa tipo_carro km final_placa dt_anuncio fonte dt_extraction
0 det_anunc_c São Paulo (SP) Sumaré HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD GASO... Gasolina Automática 18520094 ... 36890.0 Utilitário esportivo 2013 concessionaria usado None None None webmotors 22-12-2016
1 det_anunc_c São Paulo (SP) Campinas HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD GASO... Gasolina Automática 18421807 ... 39900.0 Utilitário esportivo 2013 concessionaria usado None None None webmotors 22-12-2016
2 det_anunc_c São Paulo (SP) São Paulo HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GL 16V 142CV 2WD GASOL... Gasolina Manual 18495068 ... 41790.0 Utilitário esportivo 2013 concessionaria usado None None None webmotors 22-12-2016
3 det_anunc_c São Paulo (SP) São Paulo HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GL 16V 142CV 2WD GASOL... Gasolina Manual 17887895 ... 41800.0 Utilitário esportivo 2013 pessoafisica usado None None None webmotors 22-12-2016
4 det_anunc_c Goiás (GO) Goiânia HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18507774 ... 41990.0 Utilitário esportivo 2013 concessionaria usado None None None webmotors 22-12-2016

5 rows × 21 columns

Part 1 - Quantitative Analysis


1. Qty. advertisements by date extraction

In [8]:
sel_cols = ['dt_extraction']
analysis1 = df.groupby(sel_cols)
results1 = analysis1[sel_cols].count()
In [9]:
results1.plot(kind='bar', figsize=[5, 5])
plt.title(u'Qty. advertisements by date extraction')
plt.ylabel(u'Qty.')
plt.xlabel(u'Date Extraction')
plt.show()

2. Qty. advertisements by State

In [10]:
sel_cols = ['estado']
analysis2 = df.groupby(sel_cols)
results2 = analysis2[sel_cols].count()
In [11]:
results2.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by State')
plt.ylabel(u'Qty.')
plt.xlabel(u'State')
plt.show()

3. Qty. advertisements by Fuel

In [12]:
sel_cols = ['combustivel']
analysis3 = df.groupby(sel_cols)
results3 = analysis3[sel_cols].count()
In [13]:
results3.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by Fuel')
plt.ylabel(u'Qty.')
plt.xlabel(u'Fuel')
plt.show()

4. Qty. advertisements by Year/Model

In [14]:
sel_cols = ['ano_modelo']
analysis4 = df.groupby(sel_cols)
results4 = analysis4[sel_cols].count()
In [15]:
results4.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by Year/Model')
plt.ylabel(u'Qty.')
plt.xlabel(u'Year/Model')
plt.show()

5. Qty. advertisements by Color

In [16]:
sel_cols = ['cor']
analysis5 = df.groupby(sel_cols)
results5 = analysis5[sel_cols].count()
In [17]:
results5.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by Color')
plt.ylabel(u'Qty.')
plt.xlabel(u'Color')
plt.show()

6. Qty. advertisements by Category

In [18]:
sel_cols = ['tipo_pessoa']
analysis6 = df.groupby(sel_cols)
results6 = analysis6[sel_cols].count()
In [19]:
results6.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by Category')
plt.ylabel(u'Qty.')
plt.xlabel(u'Category')
plt.show()

7. Qty. advertisements by Gear

In [20]:
sel_cols = ['cambio']
analysis7 = df.groupby(sel_cols)
results7 = analysis7[sel_cols].count()
In [21]:
results7.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by Gear')
plt.ylabel(u'Qty.')
plt.xlabel(u'Gear')
plt.show()

Part 2 - Statistical Analysis


1. Sale's price (min and max)

In [22]:
pmin = df[df['preco'] == df['preco'].min()]
pmin
Out[22]:
anuncio estado cidade marca modelo modelo_marca mmv combustivel cambio cod_anuncio ... preco carroceria ano_modelo tipo_pessoa tipo_carro km final_placa dt_anuncio fonte dt_extraction
0 det_anunc_c São Paulo (SP) Sumaré HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD GASO... Gasolina Automática 18520094 ... 36890.0 Utilitário esportivo 2013 concessionaria usado None None None webmotors 22-12-2016
273 det_anunc_c São Paulo (SP) Sumaré HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD GASO... Gasolina Automática 18520094 ... 36890.0 Utilitário esportivo 2013 concessionaria usado None None None webmotors 23-12-2016
563 det_anunc_c São Paulo (SP) Sumaré HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD GASO... Gasolina Automática 18520094 ... 36890.0 Utilitário esportivo 2013 concessionaria usado None None None webmotors 24-12-2016
779 det_anunc_c São Paulo (SP) Sumaré HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD GASO... Gasolina Automática 18520094 ... 36890.0 Utilitário esportivo 2013 concessionaria usado None None None webmotors 25-12-2016

4 rows × 21 columns

In [23]:
pmax = df[df['preco'] == df['preco'].max()]
pmax
Out[23]:
anuncio estado cidade marca modelo modelo_marca mmv combustivel cambio cod_anuncio ... preco carroceria ano_modelo tipo_pessoa tipo_carro km final_placa dt_anuncio fonte dt_extraction
272 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado None None None webmotors 22-12-2016
562 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado None None None webmotors 23-12-2016
778 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado None None None webmotors 24-12-2016
1124 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado None None None webmotors 25-12-2016
1471 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado None None None webmotors 27-12-2016
1753 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado None None None webmotors 27-12-2016
2102 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado None None None webmotors 28-12-2016
2438 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado None None None webmotors 29-12-2016
2782 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado webmotors 03-01-2017
3138 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado webmotors 05-01-2017
4025 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado webmotors 08-01-2017
4384 det_anunc_c São Paulo (SP) Santo André HYUNDAI TUCSON HYUNDAI|TUCSON HYUNDAI|TUCSON|2.0 MPFI GLS 16V 143CV 2WD FLEX... Gasolina e álcool Automática 18024676 ... 103000.0 Utilitário esportivo 2017 loja usado webmotors 09-01-2017

12 rows × 21 columns

2. Sale's price (Histogram)

In [24]:
pv = df['preco']
# pv.convert_objects(convert_numeric=True).plot.hist(bins=10)
pv.plot.hist(bins=10)
Out[24]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f1c421b4c88>

3. Sale's price (mean by state)

In [25]:
pv_by_uf = df[['estado', 'preco']].groupby(['estado']).mean()
pv_by_uf.plot(kind='bar', figsize=[5,5])
plt.title(u'Sale Price (mean by state)')
plt.ylabel(u'Price (R$)')
plt.xlabel(u'State')
plt.show()

Part 3 - Creating KPIs


1. Price by Year

In [26]:
df.dtypes
Out[26]:
anuncio           object
estado            object
cidade            object
marca             object
modelo            object
modelo_marca      object
mmv               object
combustivel       object
cambio            object
cod_anuncio       object
cor               object
preco            float64
carroceria        object
ano_modelo         int64
tipo_pessoa       object
tipo_carro        object
km                object
final_placa       object
dt_anuncio        object
fonte             object
dt_extraction     object
dtype: object
In [27]:
pa = df[['cod_anuncio','estado','combustivel','cambio','cor','ano_modelo','tipo_pessoa','preco']]
pa['preco_by_ano'] = df['preco']/df['ano_modelo']
pa.head()
/home/lserra/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  from ipykernel import kernelapp as app
Out[27]:
cod_anuncio estado combustivel cambio cor ano_modelo tipo_pessoa preco preco_by_ano
0 18520094 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 36890.0 18.325882
1 18421807 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 39900.0 19.821162
2 18495068 São Paulo (SP) Gasolina Manual Preto 2013 concessionaria 41790.0 20.760060
3 17887895 São Paulo (SP) Gasolina Manual Preto 2013 pessoafisica 41800.0 20.765027
4 18507774 Goiás (GO) Gasolina e álcool Automática Preto 2013 concessionaria 41990.0 20.859414

2. Advertisement Time

In [28]:
ta = pa.copy()
ta['qtde_dias'] = 1
ta.head()
Out[28]:
cod_anuncio estado combustivel cambio cor ano_modelo tipo_pessoa preco preco_by_ano qtde_dias
0 18520094 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 36890.0 18.325882 1
1 18421807 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 39900.0 19.821162 1
2 18495068 São Paulo (SP) Gasolina Manual Preto 2013 concessionaria 41790.0 20.760060 1
3 17887895 São Paulo (SP) Gasolina Manual Preto 2013 pessoafisica 41800.0 20.765027 1
4 18507774 Goiás (GO) Gasolina e álcool Automática Preto 2013 concessionaria 41990.0 20.859414 1
In [29]:
ta['qtde_dias'] = ta.groupby(['cod_anuncio']).transform(len)
ta.head()
Out[29]:
cod_anuncio estado combustivel cambio cor ano_modelo tipo_pessoa preco preco_by_ano qtde_dias
0 18520094 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 36890.0 18.325882 4
1 18421807 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 39900.0 19.821162 8
2 18495068 São Paulo (SP) Gasolina Manual Preto 2013 concessionaria 41790.0 20.760060 4
3 17887895 São Paulo (SP) Gasolina Manual Preto 2013 pessoafisica 41800.0 20.765027 14
4 18507774 Goiás (GO) Gasolina e álcool Automática Preto 2013 concessionaria 41990.0 20.859414 14
In [30]:
ta.shape
Out[30]:
(4385, 10)

Part 4 - Selecting data for a deep analysis


In [31]:
kpi = ta.copy()
In [32]:
kpi.dtypes
Out[32]:
cod_anuncio      object
estado           object
combustivel      object
cambio           object
cor              object
ano_modelo        int64
tipo_pessoa      object
preco           float64
preco_by_ano    float64
qtde_dias         int64
dtype: object
In [33]:
knd = kpi.drop_duplicates([u'cod_anuncio'])  # knd = kpi no duplicates
knd.shape
Out[33]:
(541, 10)
In [34]:
# knd = knd[knd['combustivel'] == u'Gasolina e álcool']
knd = knd[knd[u'cambio'] == u'Automática']
knd = knd[knd[u'cor'] == u'Preto']
# knd = knd[knd['ano_modelo'] == 2013]
knd = knd[knd[u'tipo_pessoa'] != u'pessoafisica']
In [35]:
knd.shape
Out[35]:
(109, 10)
In [36]:
knd.sort_values(u'preco_by_ano').head()
Out[36]:
cod_anuncio estado combustivel cambio cor ano_modelo tipo_pessoa preco preco_by_ano qtde_dias
0 18520094 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 36890.0 18.325882 4
1 18421807 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 39900.0 19.821162 8
4 18507774 Goiás (GO) Gasolina e álcool Automática Preto 2013 concessionaria 41990.0 20.859414 14
10 18451424 São Paulo (SP) Gasolina Automática Preto 2013 loja 42990.0 21.356185 9
15 18456711 São Paulo (SP) Gasolina Automática Preto 2013 concessionaria 43490.0 21.604570 5
In [37]:
sel_cols = [u'estado']
analysis = knd.groupby(sel_cols)
results = analysis[sel_cols].count()
print(results)

results.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by State')
plt.ylabel(u'Qty.')
plt.xlabel(u'State')
plt.show()
                          estado
estado                          
Bahia (BA)                     2
Ceará (CE)                     1
Distrito Federal (DF)          2
Espírito Santo (ES)            2
Goiás (GO)                     2
Minas Gerais (MG)              5
Paraná (PR)                    6
Pará (PA)                      1
Pernambuco (PE)                5
Rio Grande do Norte (RN)       3
Rio Grande do Sul (RS)         5
Rio de Janeiro (RJ)            6
Santa Catarina (SC)            8
São Paulo (SP)                61
In [38]:
sel_cols = [u'combustivel']
analysis = knd.groupby(sel_cols)
results = analysis[sel_cols].count()
print(results)

results.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by Fuel')
plt.ylabel(u'Qty.')
plt.xlabel(u'Fuel')
plt.show()
                   combustivel
combustivel                   
Gasolina                    21
Gasolina e álcool           88
In [39]:
sel_cols = [u'ano_modelo']
analysis = knd.groupby(sel_cols)
results = analysis[sel_cols].count()
print(results)

results.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by Year')
plt.ylabel(u'Qty.')
plt.xlabel(u'Year')
plt.show()
            ano_modelo
ano_modelo            
2013                31
2014                39
2015                17
2016                16
2017                 6
In [40]:
sel_cols = [u'tipo_pessoa']
analysis = knd.groupby(sel_cols)
results = analysis[sel_cols].count()
print(results)

results.plot(kind='bar', figsize=[5,5])
plt.title(u'Qty. advertisements by Category')
plt.ylabel(u'Qty.')
plt.xlabel(u'Category')
plt.show()
                tipo_pessoa
tipo_pessoa                
concessionaria           39
loja                     70
In [41]:
plt.figure(1)
plt.subplot(311)
plt.scatter(knd.qtde_dias, knd.preco)
plt.xlabel(u'Advertisement Time')
plt.ylabel(u'Price (R$)')

plt.figure(2)
plt.subplot(312)
plt.scatter(knd.preco_by_ano, knd.preco)
plt.xlabel(u'Price/Year')
plt.ylabel(u'Price (R$)')

plt.figure(3)
plt.subplot(313)
plt.scatter(knd.ano_modelo, knd.preco)
plt.xlabel(u'Model')
plt.ylabel(u'Price (R$)')

plt.show()

Part 5 - Applying machine learning to predict the sale's price


The machine learning algorithm used to do this prediction is the generalized linear regression.

In [42]:
from sklearn import datasets, linear_model
In [43]:
# Function to get data
def get_data(data_frame):
    """
    This function get our data into X values (qty_days) Y values (price)
    """
    x_parameter = []
    y_parameter = []
    for single_qty_days, single_price_value in zip(data_frame['qtde_dias'], data_frame['preco']):
        x_parameter.append(int(single_qty_days))
        y_parameter.append(int(single_price_value))
    return x_parameter,y_parameter

We converted data to X_parameters and Y_parameter so let’s fit our X_parameters and Y_parameters to Linear Regression model. So we gonna write a function which will take x_parameters, y_parameter and the value you gonna predict as input and return the θ0 ,θ1 and predicted value.

In [44]:
# Function for fitting data to linear model
def linear_model_main(X_parameters, Y_parameters, predict_value):
    # Create linear regression object
    X_parameters = np.array(X_parameters).reshape(len(X_parameters), -1)
    
    regr = linear_model.LinearRegression()
    regr.fit(X_parameters, Y_parameters)
    predict_outcome = regr.predict(predict_value)
    predictions = {}
    predictions['intercept'] = regr.intercept_
    predictions['coefficient'] = regr.coef_
    predictions['predicted_value'] = predict_outcome
    return predictions 
In [45]:
# Function to show the resutls of linear fit model
def show_linear_line(X_parameters, Y_parameters):
    # Create linear regression object
    X_parameters = np.array(X_parameters).reshape(len(X_parameters), -1)
    
    regr = linear_model.LinearRegression()
    regr.fit(X_parameters, Y_parameters)
    plt.scatter(X_parameters,Y_parameters,color='blue')
    plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4)
    plt.xticks(())
    plt.yticks(())
    plt.show()

Part 6 - Predicting the sale's price of the Tucson 2013


- What shall be the sale's price from this vehicule, if the time of advertisement is greater than fifteen days ?

In [46]:
df = knd.copy()
df = df[df['ano_modelo'] == 2013]
x, y = get_data(df[['preco', 'qtde_dias']])
predict_value = 20
result = linear_model_main(x, y, predict_value)
print(">> Intercept value = " , result['intercept'])
print(">> coefficient = " , result['coefficient'])
print(">> Predicted value = ", result['predicted_value'])
show_linear_line(x,y)
>> Intercept value =  44234.4314849
>> coefficient =  [ 171.09967919]
>> Predicted value =  [ 47656.42506874]

Part 7 - Predicting the sale's price of the Tucson 2014


- What shall be the sale's price from this vehicule, if the time of advertisement is greater than fifteen days ?

In [47]:
df = knd.copy()
df = df[df['ano_modelo'] == 2014]
x, y = get_data(df[['preco', 'qtde_dias']])
predict_value = 20
result = linear_model_main(x, y, predict_value)
print(">> Intercept value = " , result['intercept'])
print(">> coefficient = " , result['coefficient'])
print(">> Predicted value = ", result['predicted_value'])
show_linear_line(x,y)
>> Intercept value =  48955.1183427
>> coefficient =  [ 327.27344395]
>> Predicted value =  [ 55500.58722156]

These were my notice that can be expanded or contributed for who can be interesting. If you want contact me to explain some doubts, make suggestions or criticals...or to know my services - please send me an e-mail: laercio.serra@gmail.com, or visit my website for more details, in: http://lserra.datafresh.com.br