Archivi tag: data scientist

Non solo Teoria

Ho ricevuto dei feedback negativi sull’ultimo post molto interessanti, sia da Filippo che da Francesco, organizzerò una cena a Formia per trattarli meglio. Una bella grigliata, una bottiglia di vino, un confronto in amicizia (in realtà io vorrei anche provare questo vermouth artigianale –>  https://amzn.to/2v0oles  che mi ha suggerito Luigi della Caffetteria, si dovrebbe trovare intorno ai 18/20€) ed imparare a fare un Negroni decente.

Ma non è di questo che voglio parlarvi!

Voglio parlarvi della dicotomia tra pratica e teoria.

Che sia il medico, che sia qualsiasi altra professione, studiare soltanto non è sufficiente, c’è bisogno di pratica.

Ma la pratica a sua volta ha bisogno di studio per affinare la tecnica.

Voi non vi fareste mai operare da un medico che ha studiato tutto sui libri ma non ha esperienza pratica, ne fareste fare esperienza sulla vostra pelle ad un medico che non ha studiato nulla.

Io tendo ad essere molto teorico, a studiare un problema in tutte le sue sfaccettature prima di arrivare al risultato finale e questa tendenza può essere estremamente negativa se non la si compensa con un po’ di pratica.

Questo è verissimo soprattutto con Python.

 

“La teoria è quando si sa tutto e niente funziona. La pratica è quando tutto funziona e nessuno sa il perchè. Noi abbiamo messo insieme la teoria e la pratica: non c’è niente che funzioni e nessuno sa il perchè”-Albert Einstein *

Durante le prossime settimane riuscirò a dedicare 20h a Python e l’errore che potrei commettere è quello di stare solo sui libri o sui corsi online e focalizzarmi sulla teoria.

Per evitare questo ho creato delle etichette per le attività che registro attraverso la Tecnica del Pomodoro.

Queste etichette servono per un piccolo programma (uno script) che riceve come input le informazioni su come ho distribuito il tempo nell’ultima settimana e mi restituisce la % di completamento, sulla base di una proporzione che deve esserci tra Pratica, Teoria e Comunicazione del Lavoro Svolto, in sintesi:

  • Lavoro 10 h
  • Studio 6 h
  • Marketing 4h

Lo script è molto grezzo e perfettibile, potevo sfruttare dei cicli for e renderlo più leggibile (vi ringrazio in anticipo per ogni feedback positivo su cosa va potenziato e negativo su cosa va migliorato).

 

La prima parte del programma mi aggiorna sul come sta procedendo l’esperienza con Python, uno script di cui vi avevo già parlato, la seconda parte è quella che valuta il “mix”.

 

Un abbraccio e grazie per aver letto il mio articolo.

 

Andrea

 

ps se noti qualche errore scrivimi pure, se ti è piaciuto ricondividilo! 🙂

 

In [2]:
import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta


va='Python'
tvoi='Length'

csvname="logs2.csv"
#read the csv	
columns_name=['Year', 'Month', 'Day', 'Time', 'Length', 'Start', 'End', 'Activity']
dfraw=pd.read_csv(csvname,names=columns_name,sep=',',skiprows=1,skipfooter=0, index_col=False)


dfraw[tvoi] = dfraw[tvoi].astype('str')
mask = (dfraw[tvoi].str.len() == 6) 
dfraw = dfraw.loc[mask]

dfraw[tvoi]=dfraw[tvoi].str.strip()

dfraw[tvoi]=pd.to_datetime(dfraw[tvoi], format='%M:%S')
dfraw['Date'] = dfraw.apply(lambda row: datetime(row['Year'], row['Month'], row['Day']), axis=1)


pythondf=dfraw[(dfraw['Activity'].str.contains("Python",na=False)) | (dfraw['Activity'].str.contains("python",na=False))] 
numacti=pythondf.groupby('Date').count()
numacti=numacti['Activity']
numacti=numacti.divide(2)
cumulata=numacti.cumsum()


day=pd.concat([numacti, cumulata], axis=1)
day.columns=['pgiorno','cumulata']
maxh=cumulata.max()
plt.plot(day.index,day['cumulata'])
plt.xticks(rotation=90)
plt.title('Totale ore di studio e lavoro con Python (%d ore)' %(maxh))
plt.tight_layout()
plt.show()
In [26]:
#Questa parte è per l'analisi della settimana 
python_work=10
python_study=6
sutdy='study'
marketing='marketing'

python_marketing=4
total=python_work+python_study+python_marketing

#Selezioniamo solo gli ultimi giorni oggetto di analisi 
days=7
cutoff_date= pythondf['Date'].iloc[-1]- pd.Timedelta(days=days)
print(cutoff_date)
last_7days= pythondf[pythondf['Date'] > cutoff_date] 
#Qualsiasi attivita' che non abbia come label "marketing" o "study" "datacamp" "ripasso" "libro" é considerata "work"
#Per del codice migliore cercherò nei prossimi log di avere solo tre label study work marketing come metag
study_mask=(last_7days['Activity'].str.contains("ripasso",na=False) | last_7days['Activity'].str.contains("datacamp",na=False)) | (last_7days['Activity'].str.contains("Libro",na=False))
pythondf_study=last_7days[study_mask]

pythondf_marketing=last_7days[last_7days['Activity'].str.contains("marketing",na=False)]


pythondf_work=last_7days[~study_mask]

#Ricordando che i pomodori sono slot da 30 min 
#dobbiamo contare per categoria il numero di pomodori e dividere per 2
#Qui sotto si poteva realizzare un ciclo for, scusate la pigrizia, suggerimenti ben accetti 

print("Weekly % of Python Working",round(pythondf_work['Activity'].count()/2/python_work*100,2))
print("Weekly % of Python Study", round(pythondf_study['Activity'].count()/2/python_study*100,2))
print("Weekly % of Python Marketng",round(pythondf_marketing['Activity'].count()/2/python_marketing*100,2))
2018-07-18 00:00:00
Weekly % of Python Working 45.0
Weekly % of Python Study 58.33
Weekly % of Python Marketng 0.0

 

*fonte da verificare

Annunci

Lascia un commento

Archiviato in riflessioni, Salute e Benessere, Scritti sparsi, Tecnologia

PCA Parte Prima

Tra i vari progetti di Luglio e Agosto ci potrebbe essere un progetto di ottimizzazione dei costi per una società UK (non è la stessa dei cupcakes) che potrebbe richiedere l’applicazione della PCA.
In questo articolo (e forse anche un successivo) proverò a spiegare un concetto fondamentale e particolarmente utile.

Devo premettere che la trattazione è volutamente semplificata ed esistono persone decisamente più competenti e brave di me che illustrano (in inglese) l’argomento, Youtube è pieno.
Allora perchè un articolo supernoioso?

Semplice! Per me spiegare le cose è uno dei migliori metodi per apprendere.

Questo lo insegna il sommo Feyman, mica Ciccio Paduccio, maggiori info sul metodo di apprendimento Feyman qui -> https://www.focus.it/comportamento/scuola-e-universita/le-tre-regole-di-feynman-per-preparare-un-esame-e-imparare-tutto

 

Tornando a noi.

L’analisi in componenti principali, in inglese PCA, è una trasformazione lineare.

Fare una PCA è come prendere la lista dei 50 “capisardi” della vita e ridurli a 3:
“La femmina, il danaro e la mortazza”.

La PCA permette di ridurre le variabili identificando quelle realmente importanti(termine statisticamente insignificante) e non correlate tra loro (termine statisticamente fondamentale).

In termini tecnici è una trasformata, un operatore matematico, in questo caso lineare, che trasforma una funzione in un’altra funzione.

E’ molto utilizzata nell’ambito del Machine Learning nella risoluzione dei probelmi di regressione e classificazione perchè permette di ridurre il numero di variabili in gioco (feature reduction) considerando quelle fondamentali.

Nell’esempio che vi propongo, si è applicata la PCA non tanto per ridurre il numero di variabili (che è rimasto il medesimo 2), ma per decorrelarle

E’ una versione leggermente modificata di un esercizio di DataCamp.Com di questo capitolo (https://www.datacamp.com/courses/unsupervised-learning-in-python).

Nella prima fase dell’esempio si studia la correlazione tra due variabili e nella seconda parte si applica una PCA

Sono stati presi 209 semi e si è misurata la loro lunghezza e larghezza e le informazioni sono state salvate in un file *csv

Inzialmente ho realizzato uno scatter plot per vedere quale fosse la correlazione tra le due variabili ed ho calcolato il coefficiente di pearson, successivamente ho applicato una PCA per decorrelare le due variabili e identificare le componenti principali che definiscono due nuove variabili, dove quella con la maggiore varianza raprpesenta il primo asse, mentre la seconda quella con varianza minore.

Nel caso noi avessimo avuto m variabili e dalla PCA avessimo ottenuto n variabili, con m>n, allora il secondo asse sarebbe stato descritto dalla seconda variabile con varianza maggiore, il terzo asse con la terza variabile con varianza maggiore fino alla n-essima variabile.

Nei prossimi articoli cercherò di illustrare meglio il concetto con esempi pratici, fino a quando non riuscirò a elaborare un articolo dal titolo “PCA Guida definitiva” o “PCA spiegata a mia nonna”.

In [10]:
#Analisi PCA 
# Importiamo le librerie necessarie matplot scipy.stats e pandas 
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
import pandas as pd
#Carichiamo il file 
grains=pd.read_csv("seeds-width-vs-length.csv")
#Vediam sempre di che si tratta e come si caratterizzano i nostri dati
print(grains.info())
print(grains.describe())
#Estraiamo dal dataframe solo i valori per poter successivamente lavorare con specifici array
grains=grains.values
#La 0-sima colonna del dataframe rappresenta la larghezza
width = grains[:,0]

#La 1-a colonna del dataframe rappresenta la lunghezza
length = grains[:,1]

# Grafichiamo tutto con uno scatter plot larghezza-lunghezza
plt.scatter(width, length)
plt.axis('equal')
plt.show()

#Calcoliamo il coefficiente di pearson detto anche coefficente di correlazione lineare ed il p-value dei dati
correlation, pvalue = pearsonr(width,length)

# Visualizziamo in due valori appena calcolati
print("Correlazione tra le due  variabili larghezza e lunghezza", round(correlation, 4))
print("P-value dei dati",pvalue)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 209 entries, 0 to 208
Data columns (total 2 columns):
3.312    209 non-null float64
5.763    209 non-null float64
dtypes: float64(2)
memory usage: 3.3 KB
None
            3.312       5.763
count  209.000000  209.000000
mean     3.258349    5.627890
std      0.378603    0.444029
min      2.630000    4.899000
25%      2.941000    5.262000
50%      3.232000    5.520000
75%      3.562000    5.980000
max      4.033000    6.675000
Correlazione tra le due  variabili larghezza e lunghezza 0.8604
P-value dei dati 1.5696623081483666e-62

Addesso possiamo valutare quelle che sono le componenti principali della nostra distribuzione e decorrelarre le due variabili attraverso una PCA

In [4]:
#Carichiamo il modulo della libreria che ci interessa per l'operazione
#PCA Analysis 
# Import PCA
from sklearn.decomposition import PCA

#Creiamo l'istanza pca modello
modello = PCA()

# Applichiamo il metodo fit_transform method al nostro dataset sul grano
#Otterremo un nuovo array con due nuove variabili decorrelate
pca_features = modello.fit_transform(grains)

# Assegniamo la 0-sima colonna di pca_features alla variabile xs
xs = pca_features[:,0]

# Assegniamo la 1-a colonna di pca_features alla variabile ys
ys = pca_features[:,1]

# Grafichiamo tutto con uno scatter plot le due nuove variabili
plt.scatter(xs, ys)
plt.axis('equal')
plt.show()

# Calcoliamo coefficiente di pearson per le due nuove variabili xs ys
correlation, pvalue = pearsonr(xs, ys)

# Visualizziamo i due risultati approssimati
print("Correlazione tra le due nuove variabili xs ed ys", round(correlation,4))
print("P-value dei dati",pvalue)
Correlazione tra le due nuove variabili xs ed ys -0.0
"P-value dei dati 1.0

1 Commento

Archiviato in Ingegneria

Back In Black

Giugno è stato un mese veramente intenso!

Partiamo dalle cose importanti, sono riuscito a rivedere con un aperitivo di InnovAction Lab Roma Nicola Greco!

L’ultima volta che l’avevo visto era due tre anni fa a Roma, insieme ad Enrico Bruschini, prima che entrasse al MIT a Boston, avevamo organizzato una cena molto ruspante a base di pomodori e mozzarella di bufala nel periodo di Natale. Ora  sta lavorando per File Coin l’azienda che ha realizzato la più grande ICO  Italiana (257 Milioni di dollari)

Non so spiegare bene cosa facciano questo video invece ci riesce egregiamente:

Inoltre sia il Negroni Sbagliato che il Cosmopolitan erano fatti a regola d’arte, particolare che non mi sento di trascurare.

Cambiando discorso, vi rircordate il rapporto che dovevo realizzare per la società di dolci?

La stesura del rapporto è quasi finita, tanto sudore e matrici, ma forse è più corretto chiamarlo “modello predittivo” che rapporto.

Se ho fatto bene i conti, forse, sono riuscito ad implementare una regressione linerare polinomiale che garantisce una accuratezza migliore del 50% sulle stime (per i tecnici del mestiere, valutazione effettuata su un campione di dati che ho splittato nel classico 70/30, con il tempo forse nei prossimi giorni implementerò una crossvalidation del modello)

Nonostante questo la presentazione del lavoro è ancora mediocre, senza considerare l’inglese con la quale l’ho scritta, anche questo da migliorare.

 

Tutto procede come imprevisto

Sarei dovuto ripartire a breve, fino ad un mese fa questo era il programma,  ma uno dei lavori che sto curando qui in Italia durerà fino a fine Settembre.

Ovviamente Tramontana (fondatore di una delle pagine italiane facebook più importanti di psicologia “Talking“)aveva previsto la mia permanenza estiva qui in Italia già in tempi non sospetti vincendo una scommessa.

Puoi leggere, leggere, leggere, che è la cosa più bella che si possa fare in gioventù: e piano piano ti sentirai arricchire dentro, sentirai formarsi dentro di te quell’esperienza speciale che è la cultura – Pier Paolo Pasolini

Vi ricordate la mia lista di libri?

Sto ancora leggendo Conrad Heart Of Darkness in lingua inglese e  nonostante siano solo un 100 di pagine ho scoperto di avere un dizionario veramente limitato

(Questo il link se volete prenderlo su Amazon)
Sabato mattina mi sono segnato tutte le ultime parole che avevo letto e delle quali non conoscevo il significato ed ho creato queste scorecard su Quizlet che potete usare.

https://quizlet.com/_50wbpb

Visto che io mi scordo tutto, in questo modo posso rileggere a distanza di tempo i termini che non conoscevo e rinforzare il processo di memorizzazione.

Il libro è particolare, le descrizioni dei luoghi molto belle, ma sicuramente non è un libro “allegro”.

Era dalla scorsa estate che non leggevo un romanzo, in generale mi sento più propenso alla lettura di saggi e libri tecnici, ma ogni tanto bisogna variare.

 

Se vuoi andare veloce vai da solo, se vuoi andare lontano vai in compagnia – Antico Proverbio Africano

 

Giovedì ho partecipato ad una conferenza sulle Reti Neurali da Enlabs.

Le reti neurali sono dei modelli matematici che simulano il funzionamento di una rete neurale biologica in modo estremamente semplificato.

Rientra nel fantastico mondo del Machine Learning e dell’Intelligenza Artificiale.

I campi di applicazione  sono veramente disparati, il dipartimento di Ingegneria Civile di Roma Tre negli anni ’90 (credo) , li utilizzava per determinare le cause degli incidenti stradali e trattati nel corso di Teoria delle Infrastrutture Viarie 

Durante la conferenza è stato presentato questo video meraviglioso:

Personalmente gli attuali sviluppi tecnologici delle reti neurali che più mi affascinano sono:

  • Individuazione dei tumori alla pelle attraverso analisi delle immagini con una precisione superiore a quella media dei dermatologi  https://cs.stanford.edu/people/esteva/nature/
  • Predizione della domanda/valore di determinate azioni in borsa
  • Riconoscimento di immagini ed elementi all’interno di queste sempre più sofisticati, esempio per analisi preliminari di immagini satellitari per valutare il cambiamento di fiumi, corsi d’acqua ecc… potrebbero essere utilizzati ad esempio nella lotta all’abusivismo edilizio

Personalmente con python e l’analisi dati mi sto affacciando ai modelli ARIMA sulle serie storiche ed anche in questo ambito, dei modelli predittivi, i risultati che stanno dando le reti neurali sono molto positivi in alcuni casi migliori dei modelli ARIMA come mostrato in questo studio https://www.hindawi.com/journals/jam/2014/614342/.

 

 

L’ultima grande scoperta di Giugno è http://philosophizethis.org l’autore del sito ha su spotify un podcast di Filosofia (in Inglese) spettacolare!

Capisco che per alcuni la cosa è strana (già mi è stato evidenziato da più persone), ma avere la possibilità di riscoprire Hegel, Sant’Agostino o la Scuola di Fracoforte mentre si è in treno o bloccati nel traffico è meraviglioso.

 

Un abbraccio e grazie per aver letto il mio articolo.

 

Andrea

 

ps se noti qualche errore scrivimi pure, se ti è piaciuto ricondividilo! 🙂

 

Lascia un commento

Archiviato in riflessioni, Scritti sparsi, Viaggi

Le 25 skills più richieste per un Data Scientist (tratto da una storia vera) prt 1

Non è facile essere un wannabe Data Scientist

Essere un Data Scientist è veramente difficile, essere un Data Scientist autodidatta ancora peggio.

Il tempo non è mai abbastanza, c’è bisogno di focalizzarsi e focalizzarsi verso quello che il mercato del lavoro vuole, in questo modo ci saranno più possibilità di farcela, almeno all’inizio.

Dove focalizzarsi?

Sono sempre convinto che bisogna definire una strategia di medio termine e seguirla con pazienza, altrimenti si rischierà di essere distratti da tutte le informazioni provenienti dalla rete.

Verso Settembre 2017 fino ad oggi, molto spesso dopo aver inviato il mio CV per annunci di lavoro come Data Scientist ho segnato manualmente su Google Foglio le competenze richieste per quel ruolo

Ho superato più di 430 righe ognuna contenente una informazione.

Oggi ho deciso di analizzare questo CSV in modo da capire quali fossero le competenze più richieste come Data Scientist ed esercitarmi.

In [80]:
#importing the libraries 

import pandas as pd
import matplotlib.pyplot as plt
In [40]:
csvname= "skill.csv"
df= pd.read_csv(csvname,sep= ",", header=None, index_col=False)
print(df.head(30))
                             0    1
0                       Agile   NaN
1                           AI  NaN
2                    Algorithm  NaN
3                    Algorithm  NaN
4                   Algorithms  NaN
5                    Analytics  NaN
6                      Apache   NaN
7                      Apache   NaN
8                          API  NaN
9   Artificial neural networks  NaN
10                         AWS  NaN
11                         AWS  NaN
12                         AWS  NaN
13                         AWS  NaN
14                         AWS  NaN
15                         AWS  NaN
16                         AWS  NaN
17                         AWS  NaN
18                       Azure  NaN
19                       Azure  NaN
20                       Azure  NaN
21                       Azure  NaN
22                       Azure  NaN
23              Bayesian Model  NaN
24              Bayesian Model  NaN
25              Bayesian Model  NaN
26         Bayesian Statistics  NaN
27                          BI  NaN
28                          BI  NaN
29                         BI   NaN
30                    Big Data  NaN
31                    Big Data  NaN
32                    Big Data  NaN
33                    Big Data  NaN
34                    Big Data  NaN
35                    Big Data  NaN
36                    Big Data  NaN
37                    Big Data  NaN
38                    BIgQuery  NaN
39                    BIgQuery  NaN
In [34]:
print(df.columns)
Int64Index([0, 1], dtype='int64')
In [50]:
df.columns=['skills','vuota']
In [51]:
print(df.head())
       skills vuota
0      Agile    NaN
1          AI   NaN
2   Algorithm   NaN
3   Algorithm   NaN
4  Algorithms   NaN
In [65]:
df_skill=pd.DataFrame(df.iloc[:,0], columns=['skills'])
print(df_skill.head(5))
       skills
0      Agile 
1          AI
2   Algorithm
3   Algorithm
4  Algorithms
In [71]:
print(df_skill.info())
RangeIndex: 423 entries, 0 to 422
Data columns (total 1 columns):
skills    423 non-null object
dtypes: object(1)
memory usage: 3.4+ KB
None
In [84]:
df_skill_grouped=df_skill.groupby(['skills']).size().sort_values(ascending=False)
In [85]:
print(df_skill_grouped)
skills
SQL                                        37
Python                                     36
Spark                                      16
Python                                     13
Handoop                                    12
Scala                                      10
Scikit Learn                               10
NLP                                        10
Machine Learning                           10
Statistics                                 10
AWS                                         8
Big Data                                    8
NOSQL                                       7
Kafka                                       7
TensorFlow                                  6
Tableau                                     6
Pandas                                      5
Numpy                                       5
Azure                                       5
SQL                                         5
Machine learning                            5
Financial Systems                           4
Predictive Model                            4
Neural Networks                             4
C++                                         4
Machine Learning                            4
Go                                          3
Bayesian Model                              3
MapReduce                                   3
Clustering                                  3
                                           ..
Sentiment Analysis                          1
NLP                                         1
Scraping                                    1
NOSQL                                       1
Naive Bayes classifier                      1
Natural language processing                 1
Numpy                                       1
Linear Model                                1
Latent semantic indexing                    1
Pig                                         1
Hashmaps                                    1
Flask                                       1
Flink                                       1
Gis                                         1
GitHub                                      1
Testing Software                            1
Google 360                                  1
Gradient Boosted Machine                    1
TF-IDF                                      1
Plotly                                      1
T-SQL                                       1
Html                                        1
Information Extraction                      1
Instantaneously trained neural networks     1
JQuery                                      1
JSON                                        1
Java                                        1
JavaScript                                  1
Jira                                        1
AI                                          1
Length: 150, dtype: int64
In [90]:
df_skill_grouped.head(25).plot.bar()
 25 skills
Queste analisi devono evidentemente essere migliorate:

 

1) Implementare delle Regex, in questo modo potrò correggere velocemente gli errori di battitura ed essere più preciso (ad esempio nel grafico si vede che “Python” e “Python ” (con spazio finale) sono stati trattati come elementi differenti

 

2) Web Scraping degli annunci di lavoro ai quali ho risposto per estrarre automaticamente le competenze richieste ed aggiornare automaticamente il foglio Google

 

3) Migliorare il codice del Pomodoro Workout Analyzer così da essere più consapevole dicome sto gestendo le ore di esercizio con Python.

 

Un abbraccio e grazie per aver letto il mio articolo.

 

Andrea

 

ps se noti qualche errore scrivimi pure

 

1 Commento

Archiviato in Ingegneria, riflessioni