-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCRM.py
267 lines (207 loc) · 10.2 KB
/
CRM.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
import pandas as pd
import matplotlib.pyplot as plt
import sklearn as sk
import seaborn as sea
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.metrics import accuracy_score,confusion_matrix,precision_score,recall_score
from sklearn.model_selection import cross_val_score, cross_val_predict
#CARICAMENTO DEL DATASET
dati_crm=pd.read_csv("CRM_data.csv",sep=";")
print(dati_crm.head())
print(dati_crm.describe())
print(dati_crm.dtypes)
print("\n ")
print("LUNGHEZZA DATASET")
print(dati_crm.shape)
#GIA QUI POSSIAMO NOTARE CHE ABBIAMO IL TIPO FLOAT, CHE DOVREBBE ESSERE INTERO
#CHIARAMENTE FAREMO IL PREPROCESSING SUCCESSIVAMENTE
###########################################################################################################
#1 LA COLONNA ID VIENE ELIMINATA. CONTIENE DATI TUTTI DIVERSI E QUINDI IN FASE DI ANALISI MI AGGIUNGE ENTROPIA
#I DATI MANCANTI VENGONO RIEMPITI CON IL VALORE ZERO.
#SOSTITUZIONE CON LA MEDIA
#from sklearn.impute import SimpleImputer
#imp = SimpleImputer(missing_values=np.nan, strategy=”mean”)
#Quindi vado a sostitire i valori Nan con la media.
#PER FIRST AMOUNTH SPENT E NUMBER OF PRODUCT:
# 0- 0 SIGNIFICA CHE NON HANNO COMPRATO NULLA QUINDI LA RIGA VIENE ELIMINATA (SI PUO LAVORARE PER IL FITRAGGIO
#SU EXCEL
#1-0 E 0-1 SOSTITUISCO LA CELLA CON VALORE ZERO CON LA MEDIA
#PER LE FASCIE DI ETA CREO UNA COLONNA DOVE FACCIO LA SOMMA CHE DOVRA' DARMI UNO, ALTRIMENTI ELIMINO LA RIGA
#########################################################################################################
#QUI ANDIAMO A CARICARE IL DATA SET PREPROCESSATO
dati_crm_preprocessed=pd.read_csv("CRM_data2.csv",sep=";")
####################################
#STATISTICHE ELABORATE.
####################################
# 1) NUMERO DI CLIENTI CON IL PAGAMENTO RATEALE
installment=dati_crm_preprocessed[dati_crm_preprocessed['installment']==1]
print("\n Analisi Spesa a rate ")
acquisto_rate=installment['first_amount_spent']
print(acquisto_rate.describe())
#3) PERSONE CHE NON HANNO FATTO SPESA A RATE
print("\n Analisi Spesa NON a rate ")
installment_no_rate=dati_crm_preprocessed[dati_crm_preprocessed['installment']==0]
acquisto_rate0=installment_no_rate['first_amount_spent']
print(acquisto_rate0.describe())
#DIFFERISCONO LA SPESA MINIMA E IL 50%
#ANALISI DEL NUMERO DI PRODOTTO
num_prodotti=dati_crm_preprocessed['first_amount_spent']
#istogramma=num_prodotti.hist(bins=50)
#SETTAGGIO DEGLI ASSI
#istogramma.set_title("distribuzione spesa-numero prodotti primo aquisto")
#istogramma.set_xlabel("valore della spesa")
#istogramma.set_ylabel("numero prodotti")
# DALLE API DI MATLPLOTLIB.PYPLOT, E' POSSIBILE ELININARE LA NOTAZIONE SCIENTIFICA
#plt.ticklabel_format(style='plain')
#plt.show()
#DA QUI, TROVATA LA SPESA EFFETTUATA DAL CLIENTE NEL PRIMO ACQUISTO
#ANDIAMO A CALCOLARE LA SOMMA (VALORE COMPLESSIVO PER I DIVERSI VALORI DI NUMBER)
number_product=dati_crm_preprocessed[['number_of_product','first_amount_spent']].groupby('number_of_product')
somma=number_product.sum().sort_values('first_amount_spent')
somma.plot.barh()
#plt.show()
#FACCIAMO LA STESSA COSA PER AG
eta_51_89=dati_crm_preprocessed[['age51_89','first_amount_spent']].groupby('age51_89')
somma1=eta_51_89.sum().sort_values('first_amount_spent')
#somma1.plot.barh()
#plt.show()
eta_36_50=dati_crm_preprocessed[['age36_50','first_amount_spent']].groupby('age36_50')
somma2=eta_36_50.sum().sort_values('first_amount_spent')
#somma2.plot.barh()
#plt.show()
eta_15_35=dati_crm_preprocessed[['age15_35','first_amount_spent']].groupby('age15_35')
somma3=eta_15_35.sum().sort_values('first_amount_spent')
#somma3.plot.barh()
#plt.show()
#AGENZIA
agenzia_nord=dati_crm_preprocessed[['north','first_amount_spent']].groupby('north')
somma4=agenzia_nord.sum().sort_values('first_amount_spent')
#somma4.plot.barh()
#plt.show()
agenzia_centro=dati_crm_preprocessed[['center','first_amount_spent']].groupby('center')
somma5=agenzia_centro.sum().sort_values('first_amount_spent')
#somma5.plot.barh()
#plt.show()
agenzia_sud=dati_crm_preprocessed[['south_and_islands','first_amount_spent']].groupby('south_and_islands')
somma6=agenzia_sud.sum().sort_values('first_amount_spent')
#somma6.plot.barh()
#plt.show()
#NON ESSENDO PRESENTI DATI CATEGORIALI , POSSIAMO PROSEGUIRE LA NOSTRA ANALISI
#MATRICE DI CORRELAZIONE PER CAPIRE COME SI HA CORRELAZIONE CON LA VARIABILE TARGET
#USIAMO LA FUNZIONE CORR() OFFERTA DA PANDAS
#PER UNA VISIONE GRAFICA IMPORTIAMO SEABORN
matrice_correlazione=dati_crm_preprocessed.corr()
#CREAZIONE DI UNA FIGURA
#plt.figure(figsize=(10,20))
#MATRICE DI CONFUSIONE (LIBRERIA SEABORN)
#PARAMETRI PASSATI:
#1) LA MATRIC
#2) VMAX(SFUMATURE),
#3)SQUARE(OGNI CELLA HA FORMA QUADRRATA)
#4) ANNOT SCRIVE IL VALORE IN OGNI CELLA
#5) FMT con 2f sono il numero di decimali
#6) CMAP E' IL COLORE (esempio: plasma, magma,cividis)
#7) CBAR-kws ARGOMENTI PAROLE CHIAVE
#8) ROBUST SE E' TRUE E NON CI STA VMAX E VMIN VIENE CALCOLATO CON QUANTII ROBUSTI
grafica= sea.heatmap(matrice_correlazione,vmax=2,square=True,annot=True,fmt='.2f',
cmap='magma',cbar_kws={"shrink": .5},robust=True)
plt.title('MATRICE DI CORRELAZIONE',fontsize=20)
#plt.show()
#CORRELAZIONE TRA VARIABILE TARGET E ALTRE VARIAILI
print("\n \n ----------------------------------------")
print("CORRELAZIONE TRA Y E ALTRE VARIABILI ")
x=dati_crm_preprocessed.corr()
print(x["Y"].sort_values(ascending=False))
#plt.show()
print("--------------------------------------------------")
data=pd.read_csv("CRM_data2.csv",sep=";")
###################################################################################
#CON .VALUES RITORNIAMO LA VERSIONE NUMPY DEL DATAFRAME FORNITO
#NUMPY E' LA LIBRERIA CHE SERVE PER LA GESTIONE DI ARRAY E MATRICI
array=data.values
###################################################################################
x=array[:] #E' UNA COPIA DELL ARRAY
print("stampa degli array \n ",x)
###################################################################################
#COLONNE DELLA VARIABILE TARGHET
###################################################################################
y= array[:,3] #sono le coordinate della variabile targhet (quindi prendo
#le colonne)
print("stampa di Y ")
print(y)
###################################################################################
#DALLA LIBRERIA SKLEARN MODEL SELECTION ANDIAMO A DIVIDERE IN TRAIN E TEST
x_train, x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
#quindi andiamo a passare il dataset delle istanze di x
#target: il dataset delle etichette
#test size, 0.3 perchè il 30 percento è per il test, ma potevo usare anche il 70,20
#random state e' l'indicatore di randomizzaione
#OUTPUT
# INSIEME DI ATDDESTRAMENTO
# INSIEME DI TEST
# Y TRAIN SONO LE ETICHETTE DELL'INSIEME DI ADDESTRAMENTO
#Y RTET SONO LE ETICHETTE DEL INSIEME DI TEST
###################################################################################
#STAMPIAMO I VALORI TRAMITE LO SHAPE
print("\n \n \n ")
print("------------------------------- ")
print("SHAPE OF X : ",x.shape)
print("SHAPE OF Y : ",y.shape)
print("------------------------------- ")
print("SHAPE OF X train: ",x_train.shape)
print("SHAPE OF Y train: ",y_train.shape)
print("------------------------------- ")
print("SHAPE OF X test: ",x_test.shape)
print("SHAPE OF Y test: ",y_test.shape)
print("------------------------------- ")
###################################################################################################
#CREO UN ARRAY CON I NOMI DEI CLASSIFICATORI
nomi_classificatori = ["Nearest Neigbours","Decision Tree","Random Forest","Naive Bayles", "Logistic Regression",
"Gradient Boosting","Gaussian Process"]
###################################################################################################
#CREO UN ARRAY CON I CLASSIFICATORI UTILIZZATI. CHIARAMENTE VANNO IMPORTATE LE LIBRERIE APPOSITE
classifiers = [KNeighborsClassifier(3),
DecisionTreeClassifier(max_depth=5),
RandomForestClassifier(max_depth=5,n_estimators=10,max_features=1),
GaussianNB(),
LogisticRegression(solver="lbfgs"),
GradientBoostingClassifier(n_estimators=1000),
GaussianProcessClassifier()]
#IN QUESTO MODO QUA ANZICHE' SCORRERE IL SINGOLO ARRAY LI SCORRO A COPPIA
for nomi_classificatori, x in zip(nomi_classificatori,classifiers):
print(nomi_classificatori)
#ADDESTRAMENTO DEGLI ALGORITMI
x.fit(x_train,y_train)
#PREVISIONE DEGLI ALGORITMI SUI NOSTRI DATI DI TEST
y_predict=x.predict(x_test)
#STAMPIAMO L'ACCURACY SCORE PER L'ACCURATEZZA DEL CLASSIFICATORE
print(accuracy_score(y_test,y_predict))
print("ACCURATEZZA %0.2f\n" % accuracy_score(y_test,y_predict))
#CROSS VALIDATION
#DIVIDIAMO I DATI IN SOTTOINSIEMI K CHE SONO CHIAMATI FOLD. SE IMMAGINIAMO
#DI DIVIDERE IN 10 FOLD IL MODELLO SCELTO VIENE ADDESTRATO VALUTATO 10 VOLTE
#USANDO UN FOLD DIVERSO OGNI VOLTA
dt=DecisionTreeClassifier(max_depth=5)
score=cross_val_score(dt,x_train,y_train,cv=10,scoring="accuracy")
print("scores",score)
print("Media",score.mean())
print("deviazione standard",score.std())
#MATRICE DI CONFUSIONE
errori_classificatore= cross_val_predict(DecisionTreeClassifier(),x_train,y_train,cv=3)
matrice=confusion_matrix(y_train,errori_classificatore)
print("\n \n \n")
print("________________________________________________________")
print(matrice)
#sulla diagonale ci sono le classifixazioni corrette
print("________________________________________________________")
print("PRECISION",precision_score(y_train,errori_classificatore))
print("________________________________________________________")
print("RECALL",recall_score(y_train,errori_classificatore))
print("________________________________________________________")