In [1]:
%matplotlib inline
%pylab inline
from IPython.display import display
from IPython.display import Image


Populating the interactive namespace from numpy and matplotlib

Python e o Cientista de Dados

Jackson Gomes

jgomes@ceulp.edu.br

Big Data = Ciência + Dados

In the past few years, Big Data has morphed from being yet another IT buzzword into a virtual tsunami sweeping over enterprises and consumers alike. Humans, organizations, devices, and machines of all types now contribute huge waves of data into what’s being called the data universe. And just like the other, real universe, the data universe continues to expand rapidly.

MIT Technology Review - Big Data: Creating the power to move heaven and earth

Alguns números

Total de dados produzidos em 2013: 4.4 zettabytes (trilhões de gigabytes)

Previsão para 2020: 44 zettabytes

75% dos dados digitais são criados por clientes (usuários)

4,5 bilhões de likes no Facebook

111 MB por usuário do Facebook

154 bilhões de e-mails enviados por dia

99.5% dos dados não foram analisados

Receita do Facebook no segundo semestre de 2014?

US$ 2,9 bilhões

Cientista de Dados

O cientista de dados, nome dado ao profissional desta área, vive em três mundos: o dos negócios, o da matemática e o de TI.

Canaltech - Cientista de Dados: A profissão da moda

Que tipo de pessoa faz isso tudo? Que habilidades garantem o sucesso de um cientista de dados? Imagine um profissional que seja um híbrido de hacker de dados, analista, comunicador e assessor de confiança. É uma combinação formidável — e rara.

Harvard Business Review - Cientista de Dados: O profissional mais cobiçado do século 21

Escrever código em linguagem de programação

Curiosidade e disciplina

Para definir, sistematicamente, uma metodologia de trabalho que envolve experimentos para validar hipóteses

Habilidades específicas

Estatística, matemática, probabilidade e ciência da computação

Habilidades de negócios

Faro para questões de mercado e empatia com o cliente

Talvez esteja ficando claro por que o termo “cientista” se aplica a essa nova função. O pessoal da física experimental, por exemplo, também tem de conceber equipamentos, coletar dados, conduzir experimentos e informar resultados obtidos.

Harvard Business Review - Cientista de Dados: O profissional mais cobiçado do século 21

Cientistas de dados

Profissionais capacitados em estatística, ciência da computação e/ou matemática capazes de analisar grandes volumes de dados e extrair deles insights que criem novas oportunidades de negócio;

Analistas de negócio

Profissionais que, conhecendo bem o negócio em que atuam, consigam formular as perguntas corretas. Analisar as respostas e tomar decisões estratégicas e táticas que alavanquem novos negócios ou aumentem a lucratividade da empresa. Estas função tende a ser acoplada às funções do cientista de dados.

Profissionais de tecnologia

Profissionais que cuidarão da infraestrutura e seu suporte técnico para suportar Big Data.


In [17]:
Image(filename='imagens/mds-me.png')


Out[17]:

In [18]:
Image(filename='imagens/mds-cdhe.png')


Out[18]:

In [19]:
Image(filename='imagens/mds-pdb.png')


Out[19]:

In [20]:
Image(filename='imagens/mds-cv.png')


Out[20]:

In [21]:
Image(filename='imagens/bsrcover2.jpg')


Out[21]:

Como se tornar um cientista de dados?


In [22]:
Image(filename='imagens/coursera.png')


Out[22]:

Cargo no Governo Obama (EUA): Chief Data Scientist and Deputy Chief Technology Officer for Data Policy

Sigla do cargo

CDSaDCTODP


In [23]:
Image(filename='imagens/dj-patil.jpg')


Out[23]:

Uma cultura de negócio orientada a dados é o sonho de todo dono de negócio.

Cappra Data Science - Data Driven Culture

Alguns fatores comprovam que isso não é uma moda, e sim, a cultura orientada a dados será cada vez mais comum, seja qual for o tipo ou tamanho de empresa

Dados exatos levam a decisões mais racionais, e menos emocionais

Existem mais Ferramentas baratas e de simples uso (softwares de análise, reports em tempo real, dashboards,…)

A velocidade de acesso a informação acelera o processo de tomada de decisão

O empoderamento das pessoas de negócios da empresa, através da informação tratada e organizadas, fazem com que as análises sejam mais coerentes para o negócio

5 coisas precisam ser feitas para acelerar a criação de uma cultura de negócios orientada a dados:

  1. Democratização de dados: Todo mundo agora pode ser um analista de dados;
  2. Investir nas ferramentas certas: A compreensão dos dados precisa ser rápida e fácil;
  3. Investir nas pessoas certas: Especialistas podem acelerar a tradução dos dados para o negócio;
  4. Ensinar os executivos a cultura de dados: Eles precisam compreender os princípios analíticos;
  5. Inovar nas visões de dados: Descobrir coisas importantes através de dados estruturados podem ser um grande diferencial competitivo para inovar.

Python


In [24]:
Image(filename='imagens/toolbelt.jpg')


Out[24]:

In [25]:
Image(filename='imagens/ferramentas.png')


Out[25]:

In [26]:
Image(filename='imagens/distros.png')


Out[26]:

In [27]:
Image(filename='imagens/stark-science.jpg')


Out[27]:

Antecipando o futuro: predições

Como o volume de vendas é afetado por mudanças climáticas?

Como a quantidade de medicação absorvida varia com a dosagem e com o peso do paciente? Será que depende da pressão sanguínea?

Resposta: Modelo

Exemplo 1

Conjunto de dados:

  • Informações sobre fatores que influenciam a taxa de glicose no sangue do paciente
  • 442 amostras
  • 10 atributos
  • Atributos: valores numéricos; (-0,2 < x < 0,2)
  • Coluna de resultado: valores numéricos; (25 - 346)

In [28]:
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model

# Load the diabetes dataset
diabetes = datasets.load_diabetes()

# Use only one feature
diabetes_X = diabetes.data[:, np.newaxis]
diabetes_X_temp = diabetes_X[:, :, 2]

# Split the data into training/testing sets
diabetes_X_train = diabetes_X_temp[:-20]
diabetes_X_test = diabetes_X_temp[-20:]

# Split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]

In [29]:
# Create linear regression object
regr = linear_model.LinearRegression()

# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)

# The coefficients
print('Coeficientes: \n', regr.coef_)
# The mean square error
print("MSE: %.2f"
      % np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2))
# Explained variance score: 1 is perfect prediction
print('Variância: %.2f' % regr.score(diabetes_X_test, diabetes_y_test))


('Coeficientes: \n', array([ 938.23786125]))
MSE: 2548.07
Variância: 0.47

In [30]:
# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, regr.predict(diabetes_X_test), color='blue',
         linewidth=3)

plt.xticks(())
plt.yticks(())

plt.show()


Exemplo 2

Conjunto de dados

  • 506 valores de imóveis
  • 13 atributos (ex: taxa de criminalidade, índice de acessibilidade a rodovias)
  • Coluna de resultado: o valor médio do imóvel

In [31]:
from sklearn import datasets
from sklearn.feature_selection import SelectKBest, f_regression
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor
boston_dataset = datasets.load_boston()

In [32]:
X_full = boston_dataset.data
Y = boston_dataset.target

#selects most discriminative feature
selector = SelectKBest(f_regression, k=1)
selector.fit(X_full, Y)
X = X_full[:, selector.get_support()]
plt.scatter(X, Y, color='black')
plt.show()



In [33]:
regressor = LinearRegression(normalize=True)
regressor.fit(X, Y)
plt.scatter(X, Y, color='black')
plt.plot(X, regressor.predict(X), color='red', linewidth=3)
plt.show()



In [34]:
regressor = SVR()
regressor.fit(X, Y)
plt.scatter(X, Y, color='black')
plt.scatter(X, regressor.predict(X), color='red', linewidth=3)
plt.show()



In [35]:
regressor = RandomForestRegressor()
regressor.fit(X, Y)
plt.scatter(X, Y, color='black')
plt.scatter(X, regressor.predict(X), color='red', linewidth=3)
plt.show()


Pandas: consultando dados

Exemplo: Movielens

Movielens: avaliações de filmes


In [36]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
u_cols = ['user_id', 'age', 'gender', 'occupation', 'zip_code']
users = pd.read_table('datasets/u.user', header=None, names=u_cols, sep='|', index_col='user_id')
users.head(5)


Out[36]:
age gender occupation zip_code
user_id
1 24 M technician 85711
2 53 F other 94043
3 23 M writer 32067
4 24 M technician 43537
5 33 F other 15213

In [37]:
users.describe()


Out[37]:
age
count 943.000000
mean 34.051962
std 12.192740
min 7.000000
25% 25.000000
50% 31.000000
75% 43.000000
max 73.000000

In [38]:
users.info()


<class 'pandas.core.frame.DataFrame'>
Int64Index: 943 entries, 1 to 943
Data columns (total 4 columns):
age           943 non-null int64
gender        943 non-null object
occupation    943 non-null object
zip_code      943 non-null object
dtypes: int64(1), object(3)
memory usage: 36.8+ KB

In [39]:
users.gender.describe()


Out[39]:
count     943
unique      2
top         M
freq      670
Name: gender, dtype: object

In [40]:
users[['age', 'gender', 'occupation']][0:3]


Out[40]:
age gender occupation
user_id
1 24 M technician
2 53 F other
3 23 M writer

In [41]:
users.sort_index()
users.sort_index(by='age').head()


Out[41]:
age gender occupation zip_code
user_id
30 7 M student 55436
471 10 M student 77459
289 11 M none 94619
880 13 M student 83702
609 13 F student 55106

In [42]:
print 'Registros duplicados %s' % users.duplicated().sum()
users[users.duplicated()].head()


Registros duplicados 7
Out[42]:
age gender occupation zip_code
user_id
496 21 F student 55414
572 51 M educator 20003
621 17 M student 60402
684 28 M student 55414
733 44 F other 60630

In [43]:
users[users.age < 20].head()


Out[43]:
age gender occupation zip_code
user_id
30 7 M student 55436
36 19 F student 93117
52 18 F student 55105
57 16 M none 84010
67 17 M student 60402

In [44]:
users[(users.age < 20) & (users.gender=='M')].head()


Out[44]:
age gender occupation zip_code
user_id
30 7 M student 55436
57 16 M none 84010
67 17 M student 60402
68 19 M student 22904
101 15 M student 05146

In [45]:
users[users.occupation.isin(['doctor', 'lawyer'])].head()


Out[45]:
age gender occupation zip_code
user_id
10 53 M lawyer 90703
125 30 M lawyer 22202
126 28 F lawyer 20015
138 46 M doctor 53211
161 50 M lawyer 55104

In [46]:
print 'Idade média dos usuários %0.2fs' % users.age.mean()


Idade média dos usuários 34.05s

In [47]:
users.groupby('occupation').age.mean()


Out[47]:
occupation
administrator    38.746835
artist           31.392857
doctor           43.571429
educator         42.010526
engineer         36.388060
entertainment    29.222222
executive        38.718750
healthcare       41.562500
homemaker        32.571429
lawyer           36.750000
librarian        40.000000
marketing        37.615385
none             26.555556
other            34.523810
programmer       33.121212
retired          63.071429
salesman         35.666667
scientist        35.548387
student          22.081633
technician       33.148148
writer           36.311111
Name: age, dtype: float64

In [48]:
users.groupby('occupation').age.apply(lambda x: x.max() - x.min())


Out[48]:
occupation
administrator    49
artist           29
doctor           36
educator         40
engineer         48
entertainment    35
executive        47
healthcare       40
homemaker        30
lawyer           32
librarian        46
marketing        31
none             44
other            51
programmer       43
retired          22
salesman         48
scientist        32
student          35
technician       34
writer           42
Name: age, dtype: int64

In [49]:
r_cols = ['user_id', 'movie_id', 'rating', 'unix_timestamp']
ratings = pd.read_table('datasets/u.data', header=None, names=r_cols, sep='\t')
m_cols = ['movie_id', 'title']
movies = pd.read_table('datasets/u.item', header=None, names=m_cols, sep='|', usecols=[0,1])

In [50]:
ratings.head()


Out[50]:
user_id movie_id rating unix_timestamp
0 196 242 3 881250949
1 186 302 3 891717742
2 22 377 1 878887116
3 244 51 2 880606923
4 166 346 1 886397596

In [51]:
movies.head()


Out[51]:
movie_id title
0 1 Toy Story (1995)
1 2 GoldenEye (1995)
2 3 Four Rooms (1995)
3 4 Get Shorty (1995)
4 5 Copycat (1995)

In [52]:
movie_ratings = pd.merge(movies, ratings)
movie_ratings.head()


Out[52]:
movie_id title user_id rating unix_timestamp
0 1 Toy Story (1995) 308 4 887736532
1 1 Toy Story (1995) 287 5 875334088
2 1 Toy Story (1995) 148 4 877019411
3 1 Toy Story (1995) 280 4 891700426
4 1 Toy Story (1995) 66 3 883601324

In [53]:
movie_ratings.title.value_counts().head()


Out[53]:
Star Wars (1977)             583
Contact (1997)               509
Fargo (1996)                 508
Return of the Jedi (1983)    507
Liar Liar (1997)             485
dtype: int64

In [54]:
movie_ratings.groupby('title').rating.mean().order(ascending=False).head()


Out[54]:
title
Marlene Dietrich: Shadow and Light (1996)     5
Prefontaine (1997)                            5
Santa with Muscles (1996)                     5
Star Kid (1997)                               5
Someone Else's America (1995)                 5
Name: rating, dtype: float64

In [55]:
movie_stats = movie_ratings.groupby('title').agg({'rating': [np.size, np.mean]})
movie_stats.head()


Out[55]:
rating
size mean
title
'Til There Was You (1997) 9 2.333333
1-900 (1994) 5 2.600000
101 Dalmatians (1996) 109 2.908257
12 Angry Men (1957) 125 4.344000
187 (1997) 41 3.024390

In [56]:
movie_ratings.groupby('title').rating.mean().hist()


Out[56]:
<matplotlib.axes._subplots.AxesSubplot at 0x203a21d0>

In [57]:
Image(filename='imagens/data-science-meme.jpg')


Out[57]:

Python e o Cientista de dados

Jackson Gomes

jgomes@ceulp.edu.br