Como usei a análise de regressão para analisar a expectativa de vida com os modelos Scikit-Learn e Stats
Neste artigo, usarei alguns dados sobre a dengue para avaliar os seguintes modelos: Linear, Ridge, LASSO, ElasticNet e Regressão polinomial. Então, vamos pular direto.
Eu estava explorando a tendência da dengue em Cingapura, onde houve um aumento recente nos casos de dengue – especialmente no Zona vermelha da dengue onde eu estou morando. No entanto, não consegui extrair dados brutos do site da NEA.
Fiquei me perguntando: a dengue afetou a expectativa de vida das pessoas em algum país em particular? As pessoas nas nações ricas vivem mais? Quais são os fatores que afetam a expectativa de vida de um país?
Então, explorei a expectativa de vida e procurei dados sobre os seguintes aspectos (recursos):
O alvo é Expectativa de vida, medido em número de anos.
As premissas são:
- Estas são médias ao nível do país
- Não há distinção entre homem e mulher
O código Python está disponível no meu GitHub.
Processo de Ciência de Dados
Eu usei o seguinte processo de ciência de dados em minha análise:
- coleta de dados, limpeza de dados, análise exploratória de dados
- seleção de recursos, engenharia de recursos
- seleção de modelo, ajuste de modelo e ajuste de hiperparâmetro
- otimização de modelo com base na métrica de desempenho selecionada
As ferramentas usadas para esta análise incluem:
Análise exploratória de dados
Primeiro, verifico a multicolinearidade entre os recursos. Parece haver uma forte colinearidade, indicada por caixas em vermelho escuro e azul escuro, como você pode ver na imagem abaixo.
sns.set(rc={'figure.figsize':(10,7)})sns.heatmap(df.corr(), cmap="seismic", annot=True, vmin=-1, vmax=1)
Por exemplo, os países que gastaram mais em saúde têm uma pontuação no EPI mais alta. Quando os gastos com saúde são maiores, a taxa de AVC também é menor. E uma área maior gera uma população maior.
E a correlação entre os recursos e o destino?
Para viver uma vida longa, você deve ter uma baixa taxa de AVC, alto gasto em saúde, cuidar bem do meio ambiente e ter menos bebês (de acordo com a tabela de correlação).
Vamos ver o gráfico inicial de pares.
sns.pairplot(df, height=1.5, aspect=1.5)
Parece haver a necessidade de remover discrepâncias em muitos recursos, por exemplo. Casos de dengue, PIB, população, área e densidade populacional.
Após remover os valores discrepantes, as parcelas ainda estão inclinadas para a direita (os pontos são espremidos firmemente no lado esquerdo). Portanto, isso sugere que alguma transformação pode ser necessária.
Para procurar recursos significativos, abandonei um recurso de cada vez para ver seu impacto no modelo de regressão simples. Analisando a pontuação R², esses três recursos (Taxa de natalidade, EPI, Taxa de AVC) são escolhidos, porque o modelo será afetado adversamente sem eles.
Em seguida, removi outliers e revise os valores p em Statsmodels. Eu ganhei mais uma característica significativa (densidade populacional). Quando o valor-p de um recurso é menor que 0,05, ele é considerado um bom recurso, pois escolhi 5% como nível de significância.
Depois disso, apliquei REGISTRO funções para todos os recursos e ganhou mais 4 recursos significativos (PIB, taxa de doenças cardíacas, população e área).
Também fiz outras transformações (por exemplo, recíproco, poder 2, raiz quadrada), mas não há mais melhorias.
Os recursos também podem ser selecionados usando o LassoCV recurso em SkLearn.
Finalmente, olhei novamente para o gráfico de pares com todos os recursos significativos. Os gráficos de dispersão estão agora bem distribuídos com algumas tendências claras.
Agora estou pronto para ajustar os seguintes modelos no conjunto de dados de trem:
- Linear Regressão (uma linha reta que aproxima a relação entre as variáveis dependentes e a variável alvo independente)
- Cume Regressão (isso reduz a complexidade do modelo, mantendo todos os coeficientes no modelo, conhecidos como penalidade L2)
- euASSO Regressão (O operador absolutamente absoluto de retração e seleção reduz a complexidade do modelo penalizando os coeficientes do modelo para zero, ou seja, penalidade L1)
- Polinômio de grau 2 Regressão (uma linha curva para aproximar o relacionamento entre as variáveis dependentes e a variável alvo independente)
Também validei o desempenho deles no conjunto de dados de validação. O modelo de regressão linear simples parece ter o potencial de ser o modelo com melhor desempenho.
Isto é confirmado por Validação cruzada usando KFold (com 5 divisões).
Finalmente, verifiquei o erro de resíduo com base em suposições. Os erros de resíduos devem ser normalmente distribuídos com igual variação em torno do zero médio. A plotagem normal de quartil a quartil também parece aceitável normal.
Como tenho apenas 250 linhas (dados limitados pelo número de países no mundo), usei todo o conjunto de dados para simular o conjunto de dados de teste. eu usei Validação Cruzada do KFold com 10 divisões para avaliar o desempenho do modelo.
from sklearn.model_selection import cross_val_scorefrom sklearn.model_selection import KFoldkf = KFold(n_splits=5, shuffle=True, random_state = 1)lm = LinearRegression()lm.fit(X_train, y_train)cvs_lm = cross_val_score(lm, X, y, cv=kf, scoring='r2')print(cvs_lm)
Há bastante variação nos valores de R² de 0,49 a 0,82, mas o resultado médio é de cerca de 0,69, o que é bastante satisfatório.
df = pd.read_csv('df3.csv')X = df[ ['Birth Rate', 'EPI', 'GDP', 'Heart Disease Rate', 'Population', 'Area', 'Pop Density', 'Stroke Rate'] ].astype(float)X = np.log(X)y = df[ "Life Expectancy" ].astype(float)X = sm.add_constant(X)model = sm.OLS(y, X)results = model.fit()results.summary()
Se você não for afetado pelos recursos, sua expectativa de vida é de 62 anos. Se o seu país tiver uma baixa taxa de natalidade, adicione mais 5 anos à sua vida. Se o EPI (índice de desempenho ambiental) for alto, adicione mais 8 anos à sua vida. Se você mora em um país rico, adicione meio ano à sua vida. Finalmente, para cada diminuição da taxa de AVC em cada unidade (ou melhor, na unidade LOG), mais 5 anos podem ser adicionados à sua vida.
Eu poderia coletar mais dados expandindo o escopo para cidades em vez de países e explorando outros recursos (fatores) que afetam a expectativa de vida. Além disso, eu poderia dividir os dados em categorias masculina e feminina para essa análise de regressão à expectativa de vida.
Para concluir, aqui estão algumas idéias interessantes:
- O Japão tem a maior expectativa de vida (83,7 anos). A República Centro-Africana (49,5 anos) e muitos países do continente africano estão na parte inferior da escala. Cingapura está classificada em 5º lugar (82,7 anos).
2. Cuide bem do meio ambiente. Possui o maior coeficiente (ou seja, impacto) na expectativa de vida de um país.
O código Python para a análise acima está disponível no meu GitHub – sinta-se livre para se referir a ele.
https://github.com/JNYH/Project-Luther
Apresentação em vídeo: https://youtu.be/gC2m_lvouu8
Obrigado pela leitura.