Data Science Academy - Python Fundamentos - Capítulo 8

Download: http://github.com/dsacademybr


In [1]:
# Versão da Linguagem Python
from platform import python_version
print('Versão da Linguagem Python Usada Neste Jupyter Notebook:', python_version())


Versão da Linguagem Python Usada Neste Jupyter Notebook: 3.7.6

In [2]:
# Versão da Linguagem Python
from platform import python_version
print('Versão da Linguagem Python Usada Neste Jupyter Notebook:', python_version())


Versão da Linguagem Python Usada Neste Jupyter Notebook: 3.7.6

Scikit-learn


In [3]:
from IPython.display import Image
Image('ml_map.png')


Out[3]:

Prevendo o Preço da Pizza

Suponha que você queira prever o preço da pizza. Para isso, vamos criar um modelo de regressão linear para prever o preço da pizza, baseado em um atributo da pizza que podemos observar. Vamos modelar a relação entre o tamanho (diâmetro) de uma pizza e seu preço. Escreveremos então um programa com sckit-learn, que prevê o preço da pizza dado seu tamanho.

O conjunto de técnicas de regressão é muito provavelmente um dos mais simples modelos utilizadoa em análises de dados que procuram entender a relação entre o comportamento de determinado fenômeno e o comportamento de uma ou mais variáveis potencialmente preditoras, sem que haja, entretanto uma obrigatória relação de causa e efeito.

É de fundamental importância que o pesquisador seja bastante cuidadoso e criterioso ao interpretar os resultados de uma modelagem de regressão. A existência de um modelo de regressão não significa que ocorra, obrigatoriamente, relação de causa e efeito entre as variáveis consideradas.


In [4]:
# Importando Matplotlib e Numpy
import matplotlib.pyplot as plt
import matplotlib as mat
import numpy as np
%matplotlib inline

In [5]:
mat.__version__


Out[5]:
'3.2.1'

In [6]:
np.__version__


Out[6]:
'1.18.2'

Vamos supor que você registrou o tamanho e preço de pizzas que você comeu nos últimos meses com a sua família.

Instância Diâmetro(cm) Preço(R$)
1 7 8
2 10 11
3 15 16
4 30 38.5
5 45 52

In [7]:
# Diâmetros (cm)
Diametros = [[7], [10], [15], [30], [45]]

# Preços (R$)
Precos = [[8], [11], [16], [38.5], [52]]

Vamos visualizar estes dados construindo um plot


In [8]:
plt.figure()
plt.xlabel('Diâmetro(cm)')
plt.ylabel('Preço(R$)')
plt.title('Diâmetro x Preço')
plt.plot(Diametros, Precos, 'k.')
plt.axis([0, 60, 0, 60])
plt.grid(True)
plt.show()


Pelo gráfico podemos ver que existe uma relação positiva entre diâmetro da pizza e seu preço (o que é confirmado pela experiência de comer a pizza com sua família). À medida que o diâmetro da pizza aumenta, geralmente aumenta também o preço da pizza.

Vamos agora modelar o relacionamento usando regressão linear e criar um modelo para prever o preço da Pizza.

A classe sklearn.linear_model.LinearRegression é um estimador. Um estimador prevê um valor baseado em dados observados. Em scikit-learn, todos os estimadores implementam os métodos fit() e predict(). O método fit() é usado para aprender os parâmetros de um modelo e o método predict() é usado para prever o valor de uma variável dependente em relação a uma variável explanatória usando os parâmetros aprendidos.


In [9]:
import sklearn
sklearn.__version__


Out[9]:
'0.22.2'

In [10]:
# Importando o módulo de Regressão Linear do scikit-learn
from sklearn.linear_model import LinearRegression

In [11]:
# Preparando os dados de treino

# Vamos chamar de X os dados de diâmetro da Pizza.
X = [[7], [10], [15], [30], [45]]

# Vamos chamar de Y os dados de preço da Pizza.
Y = [[8], [11], [16], [38.5], [52]]

In [12]:
# Criando o modelo
modelo = LinearRegression()

In [13]:
type(modelo)


Out[13]:
sklearn.linear_model._base.LinearRegression

In [14]:
# Treinando o modelo
modelo.fit(X, Y)


Out[14]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

In [15]:
# Prevendo o preço de uma pizza de 20 cm de diâmetro

# Não usamos mais esta sintaxe:
# print("Uma pizza de 20 cm de diâmetro deve custar: R$%.2f" % modelo.predict([20][0]))

# Usamos agora esta sintaxe:
print("Uma pizza de 20 cm de diâmetro deve custar: R$%.2f" % modelo.predict([[20]]))


Uma pizza de 20 cm de diâmetro deve custar: R$23.41

O método fit() do módulo LinearRegression aprende os parâmetros do seguinte modelo de regressão linear simples:


In [16]:
from IPython.display import Image
Image('linear.png')


Out[16]:

Y – é o valor previsto da variável dependente (em nosso exemplo o preço da Pizza)

X – é a variável explanatória (em nosso exemplo o diâmetro da Pizza)

Alfa é o termo de intercepção ou coeficiente linear

Beta é o coeficiente de cada variável ou coeficiente angular

Alfa e Beta são parâmetros do modelo que são aprendidos pelo algoritmo de aprendizagem.

Construindo um Scatter Plot


In [17]:
# Coeficientes
print('Coeficiente: \n', modelo.coef_)

# MSE (mean square error)
print("MSE: %.2f" % np.mean((modelo.predict(X) - Y) ** 2))

# Score de variação: 1 representa predição perfeita
print('Score de variação: %.2f' % modelo.score(X, Y))


Coeficiente: 
 [[1.20422117]]
MSE: 2.74
Score de variação: 0.99

In [18]:
# Scatter Plot representando a regressão linear
plt.scatter(X, Y,  color = 'black')
plt.plot(X, modelo.predict(X), color = 'blue', linewidth = 3)
plt.xlabel('X')
plt.ylabel('Y')
plt.xticks(())
plt.yticks(())

plt.show()



In [19]:
# Importando os módulos necessários
import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import sklearn
%matplotlib inline

In [20]:
np.__version__


Out[20]:
'1.18.2'

In [21]:
pd.__version__


Out[21]:
'1.0.3'

In [22]:
# O dataset boston já está disponível no scikit-learn. Precisamos apenas carregá-lo.
from sklearn.datasets import load_boston
boston = load_boston()

In [23]:
# Verificando o tipo da variável boston
type(boston)


Out[23]:
sklearn.utils.Bunch

In [24]:
# Visualizando o shape do dataset, neste caso 506 instâncias (linhas) e 13 atributos (colunas)
boston.data.shape


Out[24]:
(506, 13)

In [25]:
# Descrição do Dataset
print(boston.DESCR)


.. _boston_dataset:

Boston house prices dataset
---------------------------

**Data Set Characteristics:**  

    :Number of Instances: 506 

    :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.

    :Attribute Information (in order):
        - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business acres per town
        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
        - NOX      nitric oxides concentration (parts per 10 million)
        - RM       average number of rooms per dwelling
        - AGE      proportion of owner-occupied units built prior to 1940
        - DIS      weighted distances to five Boston employment centres
        - RAD      index of accessibility to radial highways
        - TAX      full-value property-tax rate per $10,000
        - PTRATIO  pupil-teacher ratio by town
        - B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
        - LSTAT    % lower status of the population
        - MEDV     Median value of owner-occupied homes in $1000's

    :Missing Attribute Values: None

    :Creator: Harrison, D. and Rubinfeld, D.L.

This is a copy of UCI ML housing dataset.
https://archive.ics.uci.edu/ml/machine-learning-databases/housing/


This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.

The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic
prices and the demand for clean air', J. Environ. Economics & Management,
vol.5, 81-102, 1978.   Used in Belsley, Kuh & Welsch, 'Regression diagnostics
...', Wiley, 1980.   N.B. Various transformations are used in the table on
pages 244-261 of the latter.

The Boston house-price data has been used in many machine learning papers that address regression
problems.   
     
.. topic:: References

   - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.
   - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.


In [26]:
print(boston.feature_names)


['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']

In [27]:
# Convertendo o dataset em um DataFrame pandas
df = pd.DataFrame(boston.data)
df.head()


Out[27]:
0 1 2 3 4 5 6 7 8 9 10 11 12
0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98
1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14
2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 17.8 392.83 4.03
3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94
4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 18.7 396.90 5.33

In [28]:
# Convertendo o título das colunas
df.columns = boston.feature_names
df.head()


Out[28]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98
1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14
2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 17.8 392.83 4.03
3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94
4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 18.7 396.90 5.33

In [29]:
# boston.target é uma array com o preço das casas 
boston.target


Out[29]:
array([24. , 21.6, 34.7, 33.4, 36.2, 28.7, 22.9, 27.1, 16.5, 18.9, 15. ,
       18.9, 21.7, 20.4, 18.2, 19.9, 23.1, 17.5, 20.2, 18.2, 13.6, 19.6,
       15.2, 14.5, 15.6, 13.9, 16.6, 14.8, 18.4, 21. , 12.7, 14.5, 13.2,
       13.1, 13.5, 18.9, 20. , 21. , 24.7, 30.8, 34.9, 26.6, 25.3, 24.7,
       21.2, 19.3, 20. , 16.6, 14.4, 19.4, 19.7, 20.5, 25. , 23.4, 18.9,
       35.4, 24.7, 31.6, 23.3, 19.6, 18.7, 16. , 22.2, 25. , 33. , 23.5,
       19.4, 22. , 17.4, 20.9, 24.2, 21.7, 22.8, 23.4, 24.1, 21.4, 20. ,
       20.8, 21.2, 20.3, 28. , 23.9, 24.8, 22.9, 23.9, 26.6, 22.5, 22.2,
       23.6, 28.7, 22.6, 22. , 22.9, 25. , 20.6, 28.4, 21.4, 38.7, 43.8,
       33.2, 27.5, 26.5, 18.6, 19.3, 20.1, 19.5, 19.5, 20.4, 19.8, 19.4,
       21.7, 22.8, 18.8, 18.7, 18.5, 18.3, 21.2, 19.2, 20.4, 19.3, 22. ,
       20.3, 20.5, 17.3, 18.8, 21.4, 15.7, 16.2, 18. , 14.3, 19.2, 19.6,
       23. , 18.4, 15.6, 18.1, 17.4, 17.1, 13.3, 17.8, 14. , 14.4, 13.4,
       15.6, 11.8, 13.8, 15.6, 14.6, 17.8, 15.4, 21.5, 19.6, 15.3, 19.4,
       17. , 15.6, 13.1, 41.3, 24.3, 23.3, 27. , 50. , 50. , 50. , 22.7,
       25. , 50. , 23.8, 23.8, 22.3, 17.4, 19.1, 23.1, 23.6, 22.6, 29.4,
       23.2, 24.6, 29.9, 37.2, 39.8, 36.2, 37.9, 32.5, 26.4, 29.6, 50. ,
       32. , 29.8, 34.9, 37. , 30.5, 36.4, 31.1, 29.1, 50. , 33.3, 30.3,
       34.6, 34.9, 32.9, 24.1, 42.3, 48.5, 50. , 22.6, 24.4, 22.5, 24.4,
       20. , 21.7, 19.3, 22.4, 28.1, 23.7, 25. , 23.3, 28.7, 21.5, 23. ,
       26.7, 21.7, 27.5, 30.1, 44.8, 50. , 37.6, 31.6, 46.7, 31.5, 24.3,
       31.7, 41.7, 48.3, 29. , 24. , 25.1, 31.5, 23.7, 23.3, 22. , 20.1,
       22.2, 23.7, 17.6, 18.5, 24.3, 20.5, 24.5, 26.2, 24.4, 24.8, 29.6,
       42.8, 21.9, 20.9, 44. , 50. , 36. , 30.1, 33.8, 43.1, 48.8, 31. ,
       36.5, 22.8, 30.7, 50. , 43.5, 20.7, 21.1, 25.2, 24.4, 35.2, 32.4,
       32. , 33.2, 33.1, 29.1, 35.1, 45.4, 35.4, 46. , 50. , 32.2, 22. ,
       20.1, 23.2, 22.3, 24.8, 28.5, 37.3, 27.9, 23.9, 21.7, 28.6, 27.1,
       20.3, 22.5, 29. , 24.8, 22. , 26.4, 33.1, 36.1, 28.4, 33.4, 28.2,
       22.8, 20.3, 16.1, 22.1, 19.4, 21.6, 23.8, 16.2, 17.8, 19.8, 23.1,
       21. , 23.8, 23.1, 20.4, 18.5, 25. , 24.6, 23. , 22.2, 19.3, 22.6,
       19.8, 17.1, 19.4, 22.2, 20.7, 21.1, 19.5, 18.5, 20.6, 19. , 18.7,
       32.7, 16.5, 23.9, 31.2, 17.5, 17.2, 23.1, 24.5, 26.6, 22.9, 24.1,
       18.6, 30.1, 18.2, 20.6, 17.8, 21.7, 22.7, 22.6, 25. , 19.9, 20.8,
       16.8, 21.9, 27.5, 21.9, 23.1, 50. , 50. , 50. , 50. , 50. , 13.8,
       13.8, 15. , 13.9, 13.3, 13.1, 10.2, 10.4, 10.9, 11.3, 12.3,  8.8,
        7.2, 10.5,  7.4, 10.2, 11.5, 15.1, 23.2,  9.7, 13.8, 12.7, 13.1,
       12.5,  8.5,  5. ,  6.3,  5.6,  7.2, 12.1,  8.3,  8.5,  5. , 11.9,
       27.9, 17.2, 27.5, 15. , 17.2, 17.9, 16.3,  7. ,  7.2,  7.5, 10.4,
        8.8,  8.4, 16.7, 14.2, 20.8, 13.4, 11.7,  8.3, 10.2, 10.9, 11. ,
        9.5, 14.5, 14.1, 16.1, 14.3, 11.7, 13.4,  9.6,  8.7,  8.4, 12.8,
       10.5, 17.1, 18.4, 15.4, 10.8, 11.8, 14.9, 12.6, 14.1, 13. , 13.4,
       15.2, 16.1, 17.8, 14.9, 14.1, 12.7, 13.5, 14.9, 20. , 16.4, 17.7,
       19.5, 20.2, 21.4, 19.9, 19. , 19.1, 19.1, 20.1, 19.9, 19.6, 23.2,
       29.8, 13.8, 13.3, 16.7, 12. , 14.6, 21.4, 23. , 23.7, 25. , 21.8,
       20.6, 21.2, 19.1, 20.6, 15.2,  7. ,  8.1, 13.6, 20.1, 21.8, 24.5,
       23.1, 19.7, 18.3, 21.2, 17.5, 16.8, 22.4, 20.6, 23.9, 22. , 11.9])

In [30]:
# Adicionando o preço da casa ao DataFrame
df['PRICE'] = boston.target
df.head()


Out[30]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT PRICE
0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 18.7 396.90 5.33 36.2

Prevendo o Preço das Casas em Boston

Y - variável dependente (preço das casas em Boston)

X - variáveis independentes ou explanatórias (todas as outras caracterísricas da casa)


In [31]:
# Importando o módulo de regressão linear 
from sklearn.linear_model import LinearRegression

In [32]:
# Não queremos o preço da casa como variável dependente
X = df.drop('PRICE', axis = 1)

In [33]:
# Definindo Y
Y = df.PRICE

In [34]:
plt.scatter(df.RM, Y)
plt.xlabel("Média do Número de Quartos por Casa")
plt.ylabel("Preço da Casa")
plt.title("Relação entre Número de Quartos e Preço")
plt.show()



In [35]:
# Criando o objeto de regressão linear
regr = LinearRegression()

In [36]:
# Tipo do objeto
type(regr)


Out[36]:
sklearn.linear_model._base.LinearRegression

In [37]:
# Treinando o modelo
regr.fit(X, Y)


Out[37]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

In [38]:
# Coeficientes
print("Coeficiente: ", regr.intercept_)
print("Número de Coeficientes: ", len(regr.coef_))


Coeficiente:  36.45948838509015
Número de Coeficientes:  13

In [39]:
# Prevendo o preço da casa
regr.predict(X)


Out[39]:
array([30.00384338, 25.02556238, 30.56759672, 28.60703649, 27.94352423,
       25.25628446, 23.00180827, 19.53598843, 11.52363685, 18.92026211,
       18.99949651, 21.58679568, 20.90652153, 19.55290281, 19.28348205,
       19.29748321, 20.52750979, 16.91140135, 16.17801106, 18.40613603,
       12.52385753, 17.67103669, 15.83288129, 13.80628535, 15.67833832,
       13.38668561, 15.46397655, 14.70847428, 19.54737285, 20.8764282 ,
       11.45511759, 18.05923295,  8.81105736, 14.28275814, 13.70675891,
       23.81463526, 22.34193708, 23.10891142, 22.91502612, 31.35762569,
       34.21510225, 28.02056414, 25.20386628, 24.60979273, 22.94149176,
       22.09669817, 20.42320032, 18.03655088,  9.10655377, 17.20607751,
       21.28152535, 23.97222285, 27.6558508 , 24.04901809, 15.3618477 ,
       31.15264947, 24.85686978, 33.10919806, 21.77537987, 21.08493555,
       17.8725804 , 18.51110208, 23.98742856, 22.55408869, 23.37308644,
       30.36148358, 25.53056512, 21.11338564, 17.42153786, 20.78483633,
       25.20148859, 21.7426577 , 24.55744957, 24.04295712, 25.50499716,
       23.9669302 , 22.94545403, 23.35699818, 21.26198266, 22.42817373,
       28.40576968, 26.99486086, 26.03576297, 25.05873482, 24.78456674,
       27.79049195, 22.16853423, 25.89276415, 30.67461827, 30.83110623,
       27.1190194 , 27.41266734, 28.94122762, 29.08105546, 27.03977365,
       28.62459949, 24.72744978, 35.78159518, 35.11454587, 32.25102801,
       24.58022019, 25.59413475, 19.79013684, 20.31167129, 21.43482591,
       18.53994008, 17.18755992, 20.75049026, 22.64829115, 19.7720367 ,
       20.64965864, 26.52586744, 20.77323638, 20.71548315, 25.17208881,
       20.43025591, 23.37724626, 23.69043261, 20.33578364, 20.79180873,
       21.91632071, 22.47107777, 20.55738556, 16.36661977, 20.56099819,
       22.48178446, 14.61706633, 15.17876684, 18.93868592, 14.05573285,
       20.03527399, 19.41013402, 20.06191566, 15.75807673, 13.25645238,
       17.26277735, 15.87841883, 19.36163954, 13.81483897, 16.44881475,
       13.57141932,  3.98885508, 14.59495478, 12.1488148 ,  8.72822362,
       12.03585343, 15.82082058,  8.5149902 ,  9.71844139, 14.80451374,
       20.83858153, 18.30101169, 20.12282558, 17.28601894, 22.36600228,
       20.10375923, 13.62125891, 33.25982697, 29.03017268, 25.56752769,
       32.70827666, 36.77467015, 40.55765844, 41.84728168, 24.78867379,
       25.37889238, 37.20347455, 23.08748747, 26.40273955, 26.65382114,
       22.5551466 , 24.29082812, 22.97657219, 29.07194308, 26.5219434 ,
       30.72209056, 25.61669307, 29.13740979, 31.43571968, 32.92231568,
       34.72440464, 27.76552111, 33.88787321, 30.99238036, 22.71820008,
       24.7664781 , 35.88497226, 33.42476722, 32.41199147, 34.51509949,
       30.76109485, 30.28934141, 32.91918714, 32.11260771, 31.55871004,
       40.84555721, 36.12770079, 32.6692081 , 34.70469116, 30.09345162,
       30.64393906, 29.28719501, 37.07148392, 42.03193124, 43.18949844,
       22.69034796, 23.68284712, 17.85447214, 23.49428992, 17.00587718,
       22.39251096, 17.06042754, 22.73892921, 25.21942554, 11.11916737,
       24.51049148, 26.60334775, 28.35518713, 24.91525464, 29.68652768,
       33.18419746, 23.77456656, 32.14051958, 29.7458199 , 38.37102453,
       39.81461867, 37.58605755, 32.3995325 , 35.45665242, 31.23411512,
       24.48449227, 33.28837292, 38.0481048 , 37.16328631, 31.71383523,
       25.26705571, 30.10010745, 32.71987156, 28.42717057, 28.42940678,
       27.29375938, 23.74262478, 24.12007891, 27.40208414, 16.3285756 ,
       13.39891261, 20.01638775, 19.86184428, 21.2883131 , 24.0798915 ,
       24.20633547, 25.04215821, 24.91964007, 29.94563374, 23.97228316,
       21.69580887, 37.51109239, 43.30239043, 36.48361421, 34.98988594,
       34.81211508, 37.16631331, 40.98928501, 34.44634089, 35.83397547,
       28.245743  , 31.22673593, 40.8395575 , 39.31792393, 25.70817905,
       22.30295533, 27.20340972, 28.51169472, 35.47676598, 36.10639164,
       33.79668274, 35.61085858, 34.83993382, 30.35192656, 35.30980701,
       38.79756966, 34.33123186, 40.33963075, 44.67308339, 31.59689086,
       27.3565923 , 20.10174154, 27.04206674, 27.2136458 , 26.91395839,
       33.43563311, 34.40349633, 31.8333982 , 25.81783237, 24.42982348,
       28.45764337, 27.36266999, 19.53928758, 29.11309844, 31.91054611,
       30.77159449, 28.94275871, 28.88191022, 32.79887232, 33.20905456,
       30.76831792, 35.56226857, 32.70905124, 28.64244237, 23.58965827,
       18.54266897, 26.87889843, 23.28133979, 25.54580246, 25.48120057,
       20.53909901, 17.61572573, 18.37581686, 24.29070277, 21.32529039,
       24.88682244, 24.86937282, 22.86952447, 19.45123791, 25.11783401,
       24.66786913, 23.68076177, 19.34089616, 21.17418105, 24.25249073,
       21.59260894, 19.98446605, 23.33888   , 22.14060692, 21.55509929,
       20.61872907, 20.16097176, 19.28490387, 22.1667232 , 21.24965774,
       21.42939305, 30.32788796, 22.04734975, 27.70647912, 28.54794117,
       16.54501121, 14.78359641, 25.27380082, 27.54205117, 22.14837562,
       20.45944095, 20.54605423, 16.88063827, 25.40253506, 14.32486632,
       16.59488462, 19.63704691, 22.71806607, 22.20218887, 19.20548057,
       22.66616105, 18.93192618, 18.22846804, 20.23150811, 37.4944739 ,
       14.28190734, 15.54286248, 10.83162324, 23.80072902, 32.6440736 ,
       34.60684042, 24.94331333, 25.9998091 ,  6.126325  ,  0.77779806,
       25.30713064, 17.74061065, 20.23274414, 15.83331301, 16.83512587,
       14.36994825, 18.47682833, 13.4276828 , 13.06177512,  3.27918116,
        8.06022171,  6.12842196,  5.6186481 ,  6.4519857 , 14.20764735,
       17.21225183, 17.29887265,  9.89116643, 20.22124193, 17.94181175,
       20.30445783, 19.29559075, 16.33632779,  6.55162319, 10.89016778,
       11.88145871, 17.81174507, 18.26126587, 12.97948781,  7.37816361,
        8.21115861,  8.06626193, 19.98294786, 13.70756369, 19.85268454,
       15.22308298, 16.96071981,  1.71851807, 11.80578387, -4.28131071,
        9.58376737, 13.36660811,  6.89562363,  6.14779852, 14.60661794,
       19.6000267 , 18.12427476, 18.52177132, 13.1752861 , 14.62617624,
        9.92374976, 16.34590647, 14.07519426, 14.25756243, 13.04234787,
       18.15955693, 18.69554354, 21.527283  , 17.03141861, 15.96090435,
       13.36141611, 14.52079384,  8.81976005,  4.86751102, 13.06591313,
       12.70609699, 17.29558059, 18.740485  , 18.05901029, 11.51474683,
       11.97400359, 17.68344618, 18.12695239, 17.5183465 , 17.22742507,
       16.52271631, 19.41291095, 18.58215236, 22.48944791, 15.28000133,
       15.82089335, 12.68725581, 12.8763379 , 17.18668531, 18.51247609,
       19.04860533, 20.17208927, 19.7740732 , 22.42940768, 20.31911854,
       17.88616253, 14.37478523, 16.94776851, 16.98405762, 18.58838397,
       20.16719441, 22.97718032, 22.45580726, 25.57824627, 16.39147632,
       16.1114628 , 20.534816  , 11.54272738, 19.20496304, 21.86276391,
       23.46878866, 27.09887315, 28.56994302, 21.08398783, 19.45516196,
       22.22225914, 19.65591961, 21.32536104, 11.85583717,  8.22386687,
        3.66399672, 13.75908538, 15.93118545, 20.62662054, 20.61249414,
       16.88541964, 14.01320787, 19.10854144, 21.29805174, 18.45498841,
       20.46870847, 23.53334055, 22.37571892, 27.6274261 , 26.12796681,
       22.34421229])

In [40]:
# Comparando preços originais x preços previstos
plt.scatter(df.PRICE, regr.predict(X))
plt.xlabel("Preço Original")
plt.ylabel("Preço Previsto")
plt.title("Preço Original x Preço Previsto")
plt.show()


Podemos ver que existem alguns erros na predição do preço das casas


In [41]:
# Vamos calcular o MSE (Mean Squared Error)
mse1 = np.mean((df.PRICE - regr.predict(X)) ** 2)
print(mse1)


21.894831181729224

In [42]:
# Aplicando regressão linear para apenas uma variável e calculando o MSE
regr = LinearRegression()
regr.fit(X[['PTRATIO']], df.PRICE)
mse2 = np.mean((df.PRICE - regr.predict(X[['PTRATIO']])) ** 2)
print(mse2)


62.65220001376927

O MSE aumentou, indicando que uma única característica não é um bom predictor para o preço das casas.

Na prática, você não vai implementar regressão linear em todo o dataset. Você vai dividir o dataset em datasets de treino e de teste. Assim, você treina seu modelo nos dados de treino e depois verifica como o modelo se comporta nos seus dados de teste. Vejamos:


In [43]:
# Dividindo X em dados de treino e de teste
X_treino = X[:-50]
X_teste = X[-50:]

# Dividindo Y em dados de treino e de teste
Y_treino = df.PRICE[:-50]
Y_teste = df.PRICE[-50:]

# Imprimindo o shape dos datasets
print(X_treino.shape, X_teste.shape, Y_treino.shape, Y_teste.shape)


(456, 13) (50, 13) (456,) (50,)

Podemos criar nossos datasets de treino de forma manual, mas claro este não é método correto. Vamos então dividir os datasets randomicamente. O Scikit-Learn provê uma função chamada train_test_split() para isso.


In [44]:
from sklearn.model_selection import train_test_split

In [45]:
# Dividindo X e Y em dados de treino e de teste
X_treino, X_teste, Y_treino, Y_teste = train_test_split(X, df.PRICE, test_size = 0.33, random_state = 5)

In [46]:
# Imprimindo o shape dos datasets
print(X_treino.shape, X_teste.shape, Y_treino.shape, Y_teste.shape)


(339, 13) (167, 13) (339,) (167,)

In [47]:
# Construindo um modelo de regressão
regr = LinearRegression()

In [48]:
# Treinando o modelo
regr.fit(X_treino, Y_treino)


Out[48]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

In [49]:
# Definindo os dados de treino e teste
pred_treino = regr.predict(X_treino)
pred_teste = regr.predict(X_teste)

In [50]:
# Comparando preços originais x preços previstos
plt.scatter(regr.predict(X_treino), regr.predict(X_treino) - Y_treino, c = 'b', s = 40, alpha = 0.5)
plt.scatter(regr.predict(X_teste), regr.predict(X_teste) - Y_teste, c = 'g', s = 40, alpha = 0.5)
plt.hlines(y = 0, xmin = 0, xmax = 50)
plt.ylabel("Resíduo")
plt.title("Residual Plot - Treino(Azul), Teste(Verde)")
plt.show()


Conheça a Formação Cientista de Dados, um programa completo, 100% online e 100% em português, com mais de 400 horas de carga horária, mais de 1.200 aulas em vídeos e 26 projetos, que vão ajudá-lo a se tornar um dos profissionais mais cobiçados do mercado de análise de dados. Clique no link abaixo, faça sua inscrição, comece hoje mesmo e aumente sua empregabilidade:

https://www.datascienceacademy.com.br/pages/formacao-cientista-de-dados

Fim

Obrigado - Data Science Academy - facebook.com/dsacademybr