-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerate_pdf_clean.py
More file actions
111 lines (95 loc) · 5.1 KB
/
generate_pdf_clean.py
File metadata and controls
111 lines (95 loc) · 5.1 KB
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
import os
import sys
from fpdf import FPDF
from datetime import datetime
class RapportPDF(FPDF):
def __init__(self):
super().__init__()
self.set_auto_page_break(auto=True, margin=15)
self.add_page()
self.set_font('Helvetica', '', 11)
def _s(self, t):
return t.encode('latin-1', 'replace').decode('latin-1')
def header(self):
self.set_font('Helvetica', 'I', 8)
self.cell(0, 10, self._s('Examen Final Data Science - Adam Beloucif & Emilien MORICE'), align='R')
self.ln(10)
def footer(self):
self.set_y(-15)
self.set_font('Helvetica', 'I', 8)
self.cell(0, 10, self._s(f'Page {self.page_no()}'), align='C')
pdf = RapportPDF()
pdf.set_font('Helvetica', 'B', 24)
pdf.cell(0, 15, pdf._s('Analyse Data Science Initiale'), align='C')
pdf.ln(15)
pdf.set_font('Helvetica', 'I', 16)
pdf.cell(0, 10, pdf._s('Prediction du Prix des Loyers aux USA'), align='C')
pdf.ln(30)
pdf.set_font('Helvetica', 'B', 12)
pdf.cell(0, 8, pdf._s('Realise par:'), align='C')
pdf.ln(8)
pdf.set_font('Helvetica', '', 12)
pdf.cell(0, 8, pdf._s('Adam Beloucif & Emilien MORICE'), align='C')
pdf.ln(8)
pdf.add_page()
pdf.set_font('Helvetica', 'B', 16)
pdf.cell(0, 10, pdf._s('1. Contexte de la Problematique Business'), align='L')
pdf.ln(10)
pdf.set_font('Helvetica', '', 11)
pdf.multi_cell(0, 6, pdf._s('Dans le cadre de cet examen, nous avons endosse le role de Data Scientists pour une agence immobiliere.'))
pdf.multi_cell(0, 6, pdf._s('La mission consiste a estimer de maniere fiable et justifiable le prix des loyers d appartements sur l ensemble du territoire americain. En automatisant cette tache via du Machine Learning, l agence s assure d aligner ses biens avec le marche en temps reel et maximise ses rendements.'))
pdf.ln(5)
pdf.set_font('Helvetica', 'B', 16)
pdf.cell(0, 10, pdf._s('2. Exploration et Nettoyage de la Donnee'), align='L')
pdf.ln(10)
pdf.set_font('Helvetica', '', 11)
pdf.multi_cell(0, 6, pdf._s('Le jeu de donnees contenait 10000 annonces brutes avec d eventuels prix deraisonnables. Des valeurs critiques manquaient dans les indications de confort.'))
pdf.multi_cell(0, 6, pdf._s('- Choix Metier : Isoler les biens dans la fourchette realiste (300$ a 10 000$).'))
pdf.multi_cell(0, 6, pdf._s('- Traitement Algorithmique : Suppression des lignes incompletes pour eviter l imputation artificielle des prix.'))
pdf.multi_cell(0, 6, pdf._s('- Pre-processing : Mise a l echelle Standardise (StandardScaler) afin d accelerer la convergence des modeles de ML.'))
pdf.ln(5)
pdf.add_page()
pdf.set_font('Helvetica', 'B', 16)
pdf.cell(0, 10, pdf._s('3. Strategie de Modelisation'), align='L')
pdf.ln(10)
pdf.set_font('Helvetica', '', 11)
pdf.multi_cell(0, 6, pdf._s('Nous avons evalue une Regression Lineaire et un Arbre de decision, mais l architecture Random Forest a offert des resultats formidables en captant la non-linearite spatiale.'))
pdf.multi_cell(0, 6, pdf._s('Avec un R2 superieur a 0.70, le modele Random Forest est capable d expliquer 72% de la variance des prix a travers le territoire uniquement grace a ses informations geographiques et de surface. C est exceptionnel sans meme integrer la valeur monetaire du quartier.'))
pdf.ln(5)
if os.path.exists('output/feature_importance.png'):
pdf.image('output/feature_importance.png', w=160)
pdf.add_page()
pdf.set_font('Helvetica', 'B', 16)
pdf.cell(0, 10, pdf._s('4. Modele Non Supervise (K-Means)'), align='L')
pdf.ln(10)
pdf.set_font('Helvetica', '', 11)
pdf.multi_cell(0, 6, pdf._s('Afin d aider le departement commercial, nous avons aussi decoupe le marche immobilier en 4 grands Profils ou clusters (ex: Studios, Appartements Familiaux...). Le modele K-Means l a decouvert spontanement sans qu on lui fournisse le prix.'))
pdf.ln(5)
if os.path.exists('output/clustering_analysis.png'):
pdf.image('output/clustering_analysis.png', w=160)
pdf.add_page()
pdf.set_font('Helvetica', 'B', 16)
pdf.cell(0, 10, pdf._s('5. Deploiement Cloud (API)'), align='L')
pdf.ln(10)
pdf.set_font('Helvetica', '', 11)
pdf.multi_cell(0, 6, pdf._s('Le modele a ete deploye sous forme de Microservice avec FastAPI. Il repond aux appels REST des applications Front-End ou Mobiles pour l agence.'))
pdf.ln(5)
pdf.set_font('Courier', '', 9)
code_str = """@app.post("/predict")
def predict_rent(payload: ApartmentFeatures):
input_data = pd.DataFrame([payload.model_dump()])
input_scaled = scaler.transform(input_data)
return {"prediction_usd": round(model.predict(input_scaled)[0], 2)}"""
pdf.multi_cell(0, 6, pdf._s(code_str))
pdf.ln(10)
pdf.set_font('Helvetica', 'B', 16)
pdf.cell(0, 10, pdf._s('Conclusion'), align='L')
pdf.ln(10)
pdf.set_font('Helvetica', '', 11)
pdf.multi_cell(0, 6, pdf._s('L IA a accompli avec brio sa mission de rentabilisation. Il est recommande, a l avenir, d y adjoindre du NLP (Natural Language Processing) pour analyser les descriptions des annonces et detecter les mentions Piscine ou Renove, impactant fortement le prix.'))
pdf.output('rapport_analyse_business.pdf')
print('✅ PDF generee avec succes')
# Nettoyage automatique
script_name = os.path.basename(__file__)
if os.path.exists(script_name):
os.remove(script_name)