1.0 Nota Introdutória

Uma produtora de cervejas, investe em média anual 8 milhões de Meticais em publicidade televisiva, 4 milhões em patrocínios em eventos desportivos e culturais. A realização média anual em receita após o investimento em publicidade em televisão, descontos e patrocínios chega a 2,4 mil milhões de Meticais. Neste caso, a produtora pretende saber qual é o segmento promocial que mais contribue na receita? É possível prever a receita dos próximos anos tendo em conta o segmento promocional que mais contribui na receita?

2.0 Concepção estratégica de plano de venda

Os dados Cervejas em análise são referentes a um período de 24 meses, com 4 variáveis em estudo, designadamente: Receitas, TV, Desconto e Patrocínio. Estes dados mostram receitas em mil milhões de meticais para vendas de diferentes marcas de cervejas, como resultado de orçamento em milhões de Meticais alocados a publicidade em televisão, desconto e patrocínio.

Para que se conceba um plano estratégico capaz de prever o aumento nas receitas nos próximos anos, analisar-se-á o caso para verificar que, se:

2.1 Perguntas de Pesquisa

  1. Existe uma relação entre a receita e os segmentos promocionais?
  2. Se a primeira questão for sim, quão forte é a relação entre receita e os segmentos promocionais?
  3. Qual é a promoção que mais contribue na receita?
  4. Existe uma relação linear entre a variável explicativa e resposta?
  5. Com que precisão pode-se prever futuras receitas?

Para responder a cada uma das questões acima, recorrer-se-á a um método estatístico, designado Regressão Linear Simples (RLS) capaz de oferecer um modelo explicativo do investimento e a receita, e prever futuras receitas.

Pode-se assumir \(X\) como patrocínio e \(Y\) como receitas, como variáveis do modelo, tendo a equação: \(Y=\beta_0+\beta_1\ast\)\(X\) + \(\varepsilon\)

2.2 Análise Exploratória

Parafraseando John Wilder Tukey (1977), a análise exploratória é uma técnica que emprega grande variedade de técnicas quantitativas e gráficas visando maximizar a obtençao de informações das variáveis em causa.

Primeiro, aplica-se esta etapa de forma a se familiarizar com o conjunto de dados que se tem por analisar.

# Importação de Bibliotecas
library(reticulate)
import pandas as pd
import numpy as np
import matplotlib.pylab as plb
import statsmodels.api as sm
from statsmodels.formula.api import ols
import seaborn as sns
from statsmodels.graphics.gofplots import ProbPlot
plb.style.use('seaborn')
plb.rc('axes', titlesize=10) 
#Carregamento dos dados
dados = pd.read_csv("Cervejas.csv")
dados.head(4)
##    Mes  Receitas  TV  Desconto  Patrocinio
## 0    1       4.1  17         4           6
## 1    2       3.9  14         4           6
## 2    3       5.0  20         4           8
## 3    4       4.8  18         4           7

Após carregar os dados, pode-se observar que a coluna Mês é irrelevante para a análise, sendo assim, remover-se-á e visualizar-se-á o cabeçalho com as primeiras 5 linhas do ficheiro.

df = dados.drop(columns=['Mes'])
df.head()
##    Receitas  TV  Desconto  Patrocinio
## 0       4.1  17         4           6
## 1       3.9  14         4           6
## 2       5.0  20         4           8
## 3       4.8  18         4           7
## 4       4.7  16         3           7
#Estatística Descritiva
df.describe()
##         Receitas         TV   Desconto  Patrocinio
## count  24.000000  24.000000  24.000000   24.000000
## mean    4.816667  16.791667   3.041667    8.000000
## std     0.426988   1.284664   0.690253    1.103355
## min     3.900000  14.000000   2.000000    6.000000
## 25%     4.600000  16.000000   3.000000    7.750000
## 50%     4.800000  17.000000   3.000000    8.000000
## 75%     5.125000  17.000000   3.250000    9.000000
## max     5.500000  20.000000   4.000000   10.000000
#Correlação entre as variáveis em estudo
df.corr()
##             Receitas        TV  Desconto  Patrocinio
## Receitas    1.000000  0.648630 -0.386008    0.784441
## TV          0.648630  1.000000  0.059246    0.337412
## Desconto   -0.386008  0.059246  1.000000   -0.456708
## Patrocinio  0.784441  0.337412 -0.456708    1.000000

3.0 Análise de Regressão Linear Simples

A Análise de Regressão Linear Simples é uma metodologia estatística que utiliza a relação estatística entre duas variáveis quantitativas, tal que a variável resposta possa ser estimada ou prevista atráves da variável explicativa.

3.1 Estimação dos Coeficientes

Esta etapa, consiste em obter os coeficientes \(\beta_0\) e \(\beta_1\) (intercepto e declive) de tal forma que se possa encontrar uma linha que se ajuste ao modelo de dados.

Recorde-se que os dados tem 24 observações, referentes a receita e os tipos de investimentos (publicidade em TV, descontos e patrocínio).

X = np.array(df["Patrocinio"]).reshape((-1,1))
Y = np.array(df["Receitas"])

plb.figure(figsize=(15, 4))
plb.suptitle("Gráficos de Dispersão")
plb.ylabel("Receitas")

plb.subplot(131)
plb.scatter(df["Patrocinio"],Y)
plb.xlabel("Patrocínio")
plb.subplot(132)
plb.scatter(df["TV"],Y)
plb.xlabel("Publicidade em TV")
plb.subplot(133)
plb.scatter(df["Desconto"],Y)
plb.xlabel("Desconto")

3.2 Construção do Modelo

Pode-se obter coeficientes \(\beta_0\) e \(\beta_1\) a partir da função OLS da biblioteca statsmodels existente na linguagem python para encontrar um modelo que se ajuste aos dados atráves do Método dos Míninos Quadrados.

modelo = sm.OLS(Y, sm.add_constant(X)).fit()
print(modelo.summary())
##                             OLS Regression Results                            
## ==============================================================================
## Dep. Variable:                      y   R-squared:                       0.615
## Model:                            OLS   Adj. R-squared:                  0.598
## Method:                 Least Squares   F-statistic:                     35.19
## Date:                Mon, 27 Apr 2020   Prob (F-statistic):           5.71e-06
## Time:                        12:52:55   Log-Likelihood:                -1.6549
## No. Observations:                  24   AIC:                             7.310
## Df Residuals:                      22   BIC:                             9.666
## Df Model:                           1                                         
## Covariance Type:            nonrobust                                         
## ==============================================================================
##                  coef    std err          t      P>|t|      [0.025      0.975]
## ------------------------------------------------------------------------------
## const          2.3881      0.413      5.781      0.000       1.531       3.245
## x1             0.3036      0.051      5.932      0.000       0.197       0.410
## ==============================================================================
## Omnibus:                        2.089   Durbin-Watson:                   1.246
## Prob(Omnibus):                  0.352   Jarque-Bera (JB):                1.471
## Skew:                          -0.390   Prob(JB):                        0.479
## Kurtosis:                       2.071   Cond. No.                         61.2
## ==============================================================================
## 
## Warnings:
## [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

Os coeficientes estimados são: \(\beta_0=2.38\) e \(\beta_1=0.30\), sendo assim o modelo tem a forma de \(Y=2.38 + 0.30X\) + \(\varepsilon\). De acordo com a aproximação, um acréscimo de 1 000 000 MT gasto em patrocínio de eventos está associado a receita de 300 000 unidades adicionais.

O p-valor para Pr(>|t|)<0.05, com isto, pode-se afirmar que \(\beta_1\) é significadamente diferente de zero, ou seja, o patrocínio é significativamente relacionada com a receita.
De seguida, analisar-se-á o intervalo de confiança do parâmetro \(\beta_1\) a 95%, que para regressão linear assume aproximadamente a forma \(\left [\hat{\beta_1} \pm 2.SE(\hat{\beta_1}) \right]\). Isto siginifica que existe aproximadamente 95% de chance de que o intervalo \(\left [ \hat{\beta_1} -2.SE(\hat{\beta_1}), \hat{\beta_1} + 2.SE(\hat{\beta_1}) \right ]\) contenha o real valor de \(\beta_1\).

Para \(\beta_0\), o intervalo de confiança a 95% é de \(\left [1.531;3.245 \right]\) e para \(\beta_1\), o intervalo de confiança a 95% é de \(\left [0.197;0.410 \right]\), isto significa que se o patrocínio for zero, a receita média estará entre 1.5 mil milhões a 3.2 mil milhões de meticais e para cada aumento em 1 000.000 MT em patrocínio haverá um aumento médio de receita de entre 197 000 a 410 000 uniddades.

3.3 Avaliação da precisão do modelo

Em primeiro, avaliar-se-á a qualidade de ajuste da recta de regressão que é obtida atráves de Soma de Quadrados de Resíduos (SQR) e \(R^2\). Também, pode-se usar a estatística F que é usado para testar se pelo menos uma variável preditora possui um coeficiente diferente de zero (muito interessante em Regressão Linear Múltipla).

3.3.1 Soma de Quadrados de Erros (SQE)

A SQE é uma estimativa do desvio padrão de \(\varepsilon\). Esta estatística pode ser calculada atráves da fórmula:
\(SQE = \sqrt{\frac{QM}{n-2}}\) = \(\sqrt{\frac{\sum_{i=1}^{n}(y_{i}-\hat{y_{i}})^2}{n-2}}\). Sabendo que: \(QM = \sum_{i=1}^{n}(y_{i}-\hat{y_{i}})^2\).

sm.stats.anova_lm(ols('Receitas ~ Patrocinio', data=df).fit())
##               df    sum_sq   mean_sq          F    PR(>F)
## Patrocinio   1.0  2.580357  2.580357  35.194479  0.000006
## Residual    22.0  1.612976  0.073317        NaN       NaN

Assim sendo a \(SQE\) = 1.612,ou seja, 1.612 é o erro médio na previsão da receita a partir do patrocínio neste modelo. A margem de erro percentual é de 33% para uma média de aproximadamente 4.8 mil milhões de meticais em receita.

3.3.2 Coeficiente de Determinação (\(R^2\))

O coeficiente de determinação ou \(R^2\), mede a proporção de variabilidade total em \(Y\) que pode ser explicada pela recta de regressão linear com \(X\) como variável explicativa, e assume sempre valores de 0 e 1. Se \(R^2\simeq\) 1, indica que uma grande proporção da variabilidade na resposta foi explicada pela regressão e \(R^2\simeq\) 0 indica que a regressão não explicou grande parte da variabilidade na resposta.

Neste presente estudo, \(R^2=\) 0.615, 61.5% da variação total na receita é explicada pela equação de regressão estimada tendo patrocínio como variável explicativa.

3.4 Recta de Regressão

plb.figure(figsize=(8, 4))
plb.scatter(X,Y)
plb.plot(X, modelo.predict(), color="r")
plb.xlabel("Patrocínio (Milhões de Meticais)")
plb.ylabel("Receita (Mil Milhões de Meticais)")

4.0 Análise de Resíduos

Os pressupostos do modelo ajustado precisam ser validadas para que os resultados sejam confiáveis. A Análise dos Resíduos investiga a adequabilidade de um modelo de regressão com base nos resíduos que é dado pela diferença entre a variável resposta observada \((Y_i)\) e a variável resposta estimada \((\widehat{Y}_i)\).

A ideia básica da análise dos resíduos é que, se o modelo for apropriado, os resíduos devem refletir os pressupostos impostos pelo termo de erro do modelo que são:

4.1 Pressupostos sobre a regressão

  1. Linearidade - a relação entre x e y é linear;
  2. Homoscedasticidade - assume que os resíduos tem variância constante;
  3. Indepêndencia - assume que os termos de erro são independentes;
  4. Normalidade - assume que os resíduos são normalmente distribuídos;

No processo de análise de resíduos, é possível que se potenciais problemas surjam, como: não linearidade, variação não constante dos termos de erro, presença de valores influentes nos dados como: outliers e valores extremos.

Para o presente caso, usar-se-á testes informais (técnicas gráficas para análise dos resíduos).

4.2 Gráficos de Diagnóstico de erros residuais

São gráficos de diagnóstico de erros residuais, os seguintes:

  1. Residuals vs Fitted - indica a existência de padrões não lineares nos resíduos. Uma das suposições matemáticas na construção de um modelo usando Mínimos Quadrados é que os dados podem ser ajustados por uma linha. Se essa suposição for válida e os dados puderem ser ajustados por um modelo linear, uma linha aproximadamente horizontal sem padrões aparecerá no gráfico.

  2. Normal Q-Q - examina se os resíduos são normalmente distribuídos. É bom que os pontos residuais sigam a linha recta.

  3. Homoscedasticidade - verifica a homogeneidade de variância dos resíduos. A linha horizontal com pontos igualmente dispersos é uma boa indicação de homoscedasticidade.

  4. Residuals vs Leverage - identifica casos influentes, ou seja, valores extremos que podem influenciar os resultados da regressão quando incluídos ou excluídos da análise.

Antes de se construir os gráficos, em primeiro construir-se-á o modelo de resíduo para cada diagnóstico.

# Construção de diagnóstico para os gráficos
modelo_ajust_y = modelo.fittedvalues # Valores do modelo ajustados
modelo_residuos = modelo.resid # Residuos
modelo_norm_resid = modelo.get_influence().resid_studentized_internal # Residuos normalizados
modelo_norm_resid_abs = np.sqrt(np.abs(modelo_norm_resid)) # Quadrados dos residuos normalizados
modelo_outliers = modelo.get_influence().hat_matrix_diag # Outliers
distancia_cook = modelo.get_influence().cooks_distance[0] # Distanci de Cook
dataframe = pd.concat([df['Patrocinio'], df['Receitas']], axis=1)

4.2.1 Teste de Linearidade

Nestes gráficos a presença de um padrão nos resíduos pode indicar um problema com algum aspecto do modelo linear.

plot_lm_1 = plb.figure()
plot_lm_1.axes[0] = sns.residplot(modelo_ajust_y, dataframe.columns[-1], data=dataframe,
                          scatter_kws={'alpha': 0.5},
                          line_kws={'color': 'red', 'lw': 1, 'alpha': 0.8})
                          
plot_lm_1.axes[0].set_title('Residuals vs Fitted')
plot_lm_1.axes[0].set_xlabel('Fitted values')
plot_lm_1.axes[0].set_ylabel('Residuals')

Para este caso, os resíduos não mostram ter padrão no gráfico residual e a linha está em zero, assim sendo, podemos assumir a existência de linearidade entre a variável resposta e predictora.

4.2.3 Teste de Normalidade

O gráfico QQ de resíduos pode ser usado para verificar visualmente a suposição de normalidade. Sendo que para que se aceite que os resíduos estão normalmente distribuidos deve seguir aproximadamente uma linha recta.

QQ = ProbPlot(modelo_norm_resid)
plot_lm_2 = QQ.qqplot(line='45', alpha=0.5, color='#4C72B0', lw=1)
plot_lm_2.axes[0].set_title('Normal Q-Q')
plot_lm_2.axes[0].set_xlabel('Theoretical Quantiles')
plot_lm_2.axes[0].set_ylabel('Standardized Residuals')

O gráfico mostra todos os pontos que estão aproximadamente na linha de referência, para que se possa assumir a normalidade.

4.2.2 Teste de Homoscedasticidade

O gráfico Scale-Location mostra os resíduos que são distribuídos igualmente ao longo dos intervalos de preditores. Uma linha horizontal com pontos igualmente dispersos, é bom.

plot_lm_3 = plb.figure()
plb.scatter(modelo_ajust_y, modelo_norm_resid_abs, alpha=0.5);
sns.regplot(modelo_ajust_y, modelo_norm_resid_abs,
            scatter=False,
            ci=False,
            line_kws={'color': 'red', 'lw': 1, 'alpha': 0.8});
plot_lm_3.axes[0].set_xlim(4, max(modelo_ajust_y)+0.05)
## (4.0, 5.47380952380952)
plot_lm_3.axes[0].set_ylim(0, 2)
## (0.0, 2.0)
plot_lm_3.axes[0].set_title('Scale-Location')
plot_lm_3.axes[0].set_xlabel('Fitted values')
plot_lm_3.axes[0].set_ylabel('$\sqrt{|Standardized Residuals|}$')

No presente caso, podemos assumir que os resíduos tem variância constante. Observando a linha no gráfico pode-se ver que é aproximadamente a horizontal.

4.2.4 Pontos influentes e valores extremos

Outliers:

Um valor extremo ou valor atípico (outlier) é uma observação com “alto” resíduo. Em RLS, o gráfico de dispersão pode nos mostrar quais observações não correspondem ao modelo ajustado. No entanto, para uma melhor detecção de outliers em \(Y\), diversas formas “padronizadas” foram propostas.

Para Resíduos Normalizados, se os erros têm distribuição normal, então aproximadamente 95% dos resíduos normalizado \((d_i)\) devem estar no intervalo de (-2,2). Note que, resíduos fora desse intervalo podem indicar a presença de outliers.

Valores de alavancagem

Os pontos de alavancagem são problemas desagradáveis na regressão. Diferentemente dos outliers, que têm um tamanho anormalmente grande, os pontos de alavancagem têm extrema x valores. Isso pode não parecer muito mau no valor nominal, mas pode ter efeitos prejudiciais no modelo, porque o \(\beta\) coeficientes são muito sensíveis aos pontos de alavancagem. O objetivo do gráfico Residuals vs Leverage é identificar essas observações problemáticas.

plot_lm_4 = plb.figure();
plb.scatter(modelo_outliers, modelo_norm_resid, alpha=0.5);
sns.regplot(modelo_outliers, modelo_norm_resid,
            scatter=False,
            ci=False,
            line_kws={'color': 'red', 'lw': 1, 'alpha': 0.8});
plot_lm_4.axes[0].set_xlim(0, max(modelo_outliers)+0.01)
## (0.0, 0.19452380952380977)
plot_lm_4.axes[0].set_ylim(-3, 3)
## (-3.0, 3.0)
plot_lm_4.axes[0].set_title('Residuals vs Leverage')
plot_lm_4.axes[0].set_xlabel('Leverage')
plot_lm_4.axes[0].set_ylabel('Standardized Residuals');

# annotations
leverage_top_3 = np.flip(np.argsort(distancia_cook), 0)[:3]
for i in leverage_top_3:
    plot_lm_4.axes[0].annotate(i,
                                 xy=(modelo_outliers[i],
                                     modelo_norm_resid[i]))

O gráfico (Residual vs Leverage) mostra os três principais pontos mais extremos (1, 14 e 15), com resíduos padronizados acima de −2. No entanto, não há discrepantes que excedam 3 desvios padrão, o que é bom.

Em seguida, verifica-se a existência de valores discrepantes em relação as variáveis explicativas (valores de alavancagem), onde se compara o erro (\(e_{i}\)) com \(\frac{2p}{n} = \frac{2\ast4}{24} = 0,16\). Os casos 1, 14 e 15 não apresentam valores de alavancagem maior que 0,16.

5.0 Discussão

Aplicação de Python

O pano de fundo para este caso, é a demonstração da aplicação da linguagem Python para análise de dados, sobretudo na Regressão Linear simples. Um cenário interressante de discutir são as funções existentes em Python comparadamente a linguagem R.

Exemplo, a combinação de gráficos em R, pode ser usada atráves da função par(nfrow=c(nrow,ncol)), sendo que o nrow e ncol indica o número de gráficos a se construir em horizontal e vertical, respectivamente. Em python, usa-se a função subplot(nrow,ngraph,ncol), i.e, nrow, ngraph e ncol, indica o número de linhas, gráficos e colunas a se construir, respectivamente.

Um outro aspecto, é o tamanho de código para construir gráficos de diagnóstico de resíduos em python, é muita maratona, mas compreensível e fácil, enquanto que o R, simplifica este código em apenas plot(modelo,ngraph), que é o modelo de regressão linear e o número de gráfico por diagnóstico, n = 1,..,4.

Regressão Linear simples

A RLS é uma técnica apropriada para prever uma resposta a partir de uma única variável preditora, gerando um modelo que que ajuste aos dados para possível previsão.

A partir da variável resposta observada \((Y_i)\) e a variável resposta estimada \((\widehat{Y}_i)\), gera-se resíduos dos quais devem observar os pressupostos do modelo ajustado que precisam ser validadas para que os resultados sejam confiáveis.

A não existência de linearidade entre a variável resposta e predictora e o não cumprimento dos pressupostos sob a regressão, tranformações em \(X\) e ou \(Y\), logaritmicas, termos polinomiais e termo quadrático, entre outros, podem ser aplicados de forma a ajustar os dados na aceitação das suposições sob a RLS.

6.0 Referências Bibliográficas

  1. Tukey, John (1977).Exploratory Data Analysis.Addison-Wesley Publishing Company;
  2. Gujarati, Damodar (2011).Econometria Básica. \(5^a\) edição.The McGraw-Hill Companies, Inc., Nova Iorque.