APS 5 - Questões com auxílio do Pandas

Nome: Gabriel Heusi Pereira Bueno de Camargo

APS INDIVIDUAL

Data de Entrega: 26/Set até às 23h59 via GitHub.

Vamos trabalhar com dados do USGS (United States Geological Survey) para tentar determinar se os abalos detectados no hemisfério Norte têm grande probabilidade de serem testes nucleares.


In [43]:
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import expon
from numpy import arange
import scipy.stats as stats

In [44]:
#Abrir o arquivo
df = pd.read_csv('earthquake.csv')
#listar colunas
print(list(df))


['Date', 'Time', 'Latitude', 'Longitude', 'Type', 'Depth', 'Depth Error', 'Depth Seismic Stations', 'Magnitude', 'Magnitude Type', 'Magnitude Error', 'Magnitude Seismic Stations', 'Azimuthal Gap', 'Horizontal Distance', 'Horizontal Error', 'Root Mean Square', 'ID', 'Source', 'Location Source', 'Magnitude Source', 'Status']

Liste as primeiras linhas do DataFrame


In [45]:
df.head()


Out[45]:
Date Time Latitude Longitude Type Depth Depth Error Depth Seismic Stations Magnitude Magnitude Type ... Magnitude Seismic Stations Azimuthal Gap Horizontal Distance Horizontal Error Root Mean Square ID Source Location Source Magnitude Source Status
0 01/02/1965 13:44:18 19.246 145.616 Earthquake 131.6 NaN NaN 6.0 MW ... NaN NaN NaN NaN NaN ISCGEM860706 ISCGEM ISCGEM ISCGEM Automatic
1 01/04/1965 11:29:49 1.863 127.352 Earthquake 80.0 NaN NaN 5.8 MW ... NaN NaN NaN NaN NaN ISCGEM860737 ISCGEM ISCGEM ISCGEM Automatic
2 01/05/1965 18:05:58 -20.579 -173.972 Earthquake 20.0 NaN NaN 6.2 MW ... NaN NaN NaN NaN NaN ISCGEM860762 ISCGEM ISCGEM ISCGEM Automatic
3 01/08/1965 18:49:43 -59.076 -23.557 Earthquake 15.0 NaN NaN 5.8 MW ... NaN NaN NaN NaN NaN ISCGEM860856 ISCGEM ISCGEM ISCGEM Automatic
4 01/09/1965 13:32:50 11.938 126.427 Earthquake 15.0 NaN NaN 5.8 MW ... NaN NaN NaN NaN NaN ISCGEM860890 ISCGEM ISCGEM ISCGEM Automatic

5 rows × 21 columns

Q1 - Manipulando o DataFrame

Crie uma coluna chamada Hemisfério baseada na Latitude

A regra de formação é a seguinte:

Valor Critério
Norte Latitude positiva
Sul Latitude negativa

In [46]:
df.loc[(df.Latitude >=0), "Hemisfério"] = "Norte"
df.loc[(df.Latitude <0), "Hemisfério"] = "Sul"
df.head()


Out[46]:
Date Time Latitude Longitude Type Depth Depth Error Depth Seismic Stations Magnitude Magnitude Type ... Azimuthal Gap Horizontal Distance Horizontal Error Root Mean Square ID Source Location Source Magnitude Source Status Hemisfério
0 01/02/1965 13:44:18 19.246 145.616 Earthquake 131.6 NaN NaN 6.0 MW ... NaN NaN NaN NaN ISCGEM860706 ISCGEM ISCGEM ISCGEM Automatic Norte
1 01/04/1965 11:29:49 1.863 127.352 Earthquake 80.0 NaN NaN 5.8 MW ... NaN NaN NaN NaN ISCGEM860737 ISCGEM ISCGEM ISCGEM Automatic Norte
2 01/05/1965 18:05:58 -20.579 -173.972 Earthquake 20.0 NaN NaN 6.2 MW ... NaN NaN NaN NaN ISCGEM860762 ISCGEM ISCGEM ISCGEM Automatic Sul
3 01/08/1965 18:49:43 -59.076 -23.557 Earthquake 15.0 NaN NaN 5.8 MW ... NaN NaN NaN NaN ISCGEM860856 ISCGEM ISCGEM ISCGEM Automatic Sul
4 01/09/1965 13:32:50 11.938 126.427 Earthquake 15.0 NaN NaN 5.8 MW ... NaN NaN NaN NaN ISCGEM860890 ISCGEM ISCGEM ISCGEM Automatic Norte

5 rows × 22 columns


In [47]:
df.Magnitude.describe()


Out[47]:
count    23412.000000
mean         5.882531
std          0.423066
min          5.500000
25%          5.600000
50%          5.700000
75%          6.000000
max          9.100000
Name: Magnitude, dtype: float64

Q2 - Fit e Histograma

Faça o Histograma da Magnitude. Interprete.


In [70]:
f = plt.figure(figsize=(11,5))
faixas = arange(5,9,0.65)
plot = df.Magnitude.plot.hist(bins=faixas , title="Histograma de Magnitude",normed=1,alpha = 0.9,color="g")
plt.xlabel("Magnitude")
plt.ylabel("Densidade")
plt.show()


Faça o fit de uma distribuição exponencial sobre os dados da Magnitude, achando os valores de loc e scale. Interprete loc e scale no caso da exponencial. Documentação: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.expon.html


In [ ]:

Refaça o Histograma plotando a fdp (função densidade de probabilidade) da exponencial com os parâmetros achados no fit em cima. Cuidado com o domínio utilizado. Interprete.


In [76]:
mu = df.Magnitude.mean()
dp = df.Magnitude.std()
fig = plt.figure(figsize=(11, 5))
plot= df.Magnitude.plot.hist(bins = faixas, title='HISTOGRAMA Magnitude ', normed=1, alpha=0.9,color = 'r')
a = sorted(df.Magnitude)
plt.plot(a, stats.norm.pdf(a, loc = mu, scale = dp))
plt.title('Histograma X Pdf')


Out[76]:
<matplotlib.text.Text at 0x2230106b710>

Q3 - Tabela cruzada

Faça uma tabela de cruzamento das variáveis Hemisfério e Type

Sua tabela deve ser normalizada


In [50]:
ct = pd.crosstab(df.Hemisfério,df.Type,margins=True,normalize = True)
ct


Out[50]:
Type Earthquake Explosion Nuclear Explosion Rock Burst All
Hemisfério
Norte 0.447164 0.000085 0.006279 0.000000 0.453528
Sul 0.545148 0.000085 0.001196 0.000043 0.546472
All 0.992312 0.000171 0.007475 0.000043 1.000000

Q3.1 - Qual a probabilidade de ocorrer um terremoto no hemisfério norte?

Adicione na célula abaixo o cálculo:


In [51]:
probNorte = ct.Earthquake.Norte/ct.Earthquake.All
print(probNorte)


0.450628443526

Explique o seu raciocínio

O cálculo da probabilidade nesse caso se baseia na análise dos casos que ocorrem no Norte em comparação com os casos totais de terremoto. Portanto para saber a probabilidade de ocorrer um terremoto no hemisfério Norte basta dividir esse valor, apresentado no crosstab, pela probabilidade total.

Q3.2 - Dado que aconteceu no Norte, qual a probabilidade de ele ter sido Nuclear Explosion?

Calcule a resposta abaixo, ou explique como a encontrou

Se for cálculo preencha a célula a seguir:


In [52]:
probNuclear = ct["Nuclear Explosion"]["Norte"]/ct.All.Norte
print(probNuclear)


0.0138444151441

Se conseguir obter a resposta sem calcular, insira a resposta abaixo:

  • A probabilidade de ter sido Nuclear Explosion é ...

In [ ]:

Q4 - Análise bivariada

Faça o plot de dispersão (scatter plot) entre as variáveis Magnitude Error e Depth


In [53]:
plt.scatter(x = df['Magnitude Error'],
            y = df['Depth'])
plt.show()


Calcule a correlação entre as variáveis Magnitude Error e Depth


In [54]:
df["Depth"].corr(df["Magnitude Error"])


Out[54]:
-0.076918438923387192

Explique o que significa o valor da correlação calculada acima?

A correlação apresentada acima mostra uma espécie de dependência entre as duas variáveis, no caso Magnitude Error e Depth, observando o gráfico mostrado acima os valores são bem distantes, mas é justamente isso e o valor da correlação mostrado, que é baixo, que mostra uma alta dependência entre as duas variáveis, não há grande discrepância entre os valores. O fato de ser negativo justificaria uma reta descrescente.

Q5 - Describe e boxplot

Faça o describe e o boxplot da Latitude e da Longitude. Explique os valores


In [55]:
Lat = df["Latitude"].describe()
Long = df["Longitude"].describe()
print(Lat,Long)


df.boxplot(column = ["Latitude","Longitude"])
plt.show()


count    23412.000000
mean         1.679033
std         30.113183
min        -77.080000
25%        -18.653000
50%         -3.568500
75%         26.190750
max         86.005000
Name: Latitude, dtype: float64 count    23412.000000
mean        39.639961
std        125.511959
min       -179.997000
25%        -76.349750
50%        103.982000
75%        145.026250
max        179.998000
Name: Longitude, dtype: float64

Q6 - Tirando conclusões com base nos dados

Em um certo lugar já ocorreram abalos com Magnitude Type MB e Type Nuclear Explosion.

Responda:

* É mais provável que tenha sido no norte ou no sul? 

Assuma que os Magnitude Type e Type são independentes


In [56]:
df.loc[(df.Type=="Nuclear Explosion")&(df["Magnitude Type"]=="MB")&(df["Hemisfério"]=="Sul"),"Hemis"]="Sul"
df.loc[(df.Type=="Nuclear Explosion")&(df["Magnitude Type"]=="MB")&(df["Hemisfério"]=="Norte"),"Hemis"]="Norte"
sul=df["Hemis"].value_counts("Sul")
sul


Out[56]:
Norte    0.828221
Sul      0.171779
Name: Hemis, dtype: float64

Observando os valores mostrados acima pode-se concluir que a probabilidade de se ocorrer um terremoto é maior no hemisfério Norte em comparação com o Sul. Mais precisamente afirma-se que o Norte tem uma probabilidade de 82,82% de se ocorrer um terremoto, enquanto o Sul apenas 17,17%.