{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":1325689,"sourceType":"datasetVersion","datasetId":417892},{"sourceId":6871818,"sourceType":"datasetVersion","datasetId":3948845},{"sourceId":7013346,"sourceType":"datasetVersion","datasetId":4032413}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **SAE DATAMINING** : Syndrome des ovaires polykistiques\n\n**Groupe : NTANG MADE Corine - JOMAA Yasmine - ES-SAFI Zaynaeb - AMIMI Sabrina**\n\n## **Partie 1** : EDA | Analyse exploratoire","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.decomposition import PCA\nfrom sklearn.preprocessing import StandardScaler\nimport scipy\nfrom sklearn import datasets, linear_model\nimport statistics \nfrom sklearn.tree import DecisionTreeClassifier, plot_tree\nfrom sklearn import tree\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split, cross_val_score, KFold\nfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom random import randint","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-20T20:51:53.619191Z","iopub.execute_input":"2023-11-20T20:51:53.619531Z","iopub.status.idle":"2023-11-20T20:51:55.97089Z","shell.execute_reply.started":"2023-11-20T20:51:53.619507Z","shell.execute_reply":"2023-11-20T20:51:55.970069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#importer les données de la feuille Full_new\ndataWI = pd.read_excel('/kaggle/input/dataset/PCOS_data_without_infertility_sabrina.xlsx',sheet_name='Full_new')\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:55.973316Z","iopub.execute_input":"2023-11-20T20:51:55.974207Z","iopub.status.idle":"2023-11-20T20:51:56.660885Z","shell.execute_reply.started":"2023-11-20T20:51:55.974168Z","shell.execute_reply":"2023-11-20T20:51:56.659899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataWI","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:56.662178Z","iopub.execute_input":"2023-11-20T20:51:56.662832Z","iopub.status.idle":"2023-11-20T20:51:56.707063Z","shell.execute_reply.started":"2023-11-20T20:51:56.662762Z","shell.execute_reply":"2023-11-20T20:51:56.706111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.mean(dataWI[dataWI['PCOS(Y/N)'] == 1]['Cyclelength(days)'])","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:56.709807Z","iopub.execute_input":"2023-11-20T20:51:56.710587Z","iopub.status.idle":"2023-11-20T20:51:56.71966Z","shell.execute_reply.started":"2023-11-20T20:51:56.710554Z","shell.execute_reply":"2023-11-20T20:51:56.718499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataI = pd.read_csv('/kaggle/input/polycystic-ovary-syndrome-pcos/PCOS_infertility.csv',sep = ',')","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:56.720819Z","iopub.execute_input":"2023-11-20T20:51:56.721176Z","iopub.status.idle":"2023-11-20T20:51:56.741355Z","shell.execute_reply.started":"2023-11-20T20:51:56.721147Z","shell.execute_reply":"2023-11-20T20:51:56.74069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataI","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:56.74269Z","iopub.execute_input":"2023-11-20T20:51:56.743302Z","iopub.status.idle":"2023-11-20T20:51:56.758083Z","shell.execute_reply.started":"2023-11-20T20:51:56.743269Z","shell.execute_reply":"2023-11-20T20:51:56.756989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataWI.dtypes","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:56.759363Z","iopub.execute_input":"2023-11-20T20:51:56.759651Z","iopub.status.idle":"2023-11-20T20:51:56.773642Z","shell.execute_reply.started":"2023-11-20T20:51:56.759622Z","shell.execute_reply":"2023-11-20T20:51:56.771998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataWI.drop","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:56.775793Z","iopub.execute_input":"2023-11-20T20:51:56.776936Z","iopub.status.idle":"2023-11-20T20:51:56.798023Z","shell.execute_reply.started":"2023-11-20T20:51:56.776899Z","shell.execute_reply":"2023-11-20T20:51:56.796674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"corr_df = dataWI.corr(method=\"pearson\")\n\nplt.matshow(corr_df)\nplt.figure(figsize=(80,60), dpi=100)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:56.799488Z","iopub.execute_input":"2023-11-20T20:51:56.800051Z","iopub.status.idle":"2023-11-20T20:51:57.083348Z","shell.execute_reply.started":"2023-11-20T20:51:56.800023Z","shell.execute_reply":"2023-11-20T20:51:57.082336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"corr=dataWI.corr()\ncorr.style.background_gradient(cmap='coolwarm')","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:57.087325Z","iopub.execute_input":"2023-11-20T20:51:57.088508Z","iopub.status.idle":"2023-11-20T20:51:57.380458Z","shell.execute_reply.started":"2023-11-20T20:51:57.088481Z","shell.execute_reply":"2023-11-20T20:51:57.379508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Variables les plus corrélées à la target:\n    - FollicleNo(L)\n    - FollicleNo(R)\n    \nVariables corrélées entre elles :\n    - Weight et (BMI, Hip, Waist)\n    - Waist:hip ratio and AMH\n    - FSH/LH et PRL\n    - FSH and Follicle(l) and Follicle(r)","metadata":{}},{"cell_type":"code","source":"corr=dataWI.corr()\ncorr.style.background_gradient(cmap='coolwarm')\n\ncorrelation_df=pd.DataFrame(corr)\nlimite=0.7\nfiltred_correlation_df=correlation_df[correlation_df>limite]\ncolumns_with_high_correlation=filtred_correlation_df.columns.tolist()\nprint(columns_with_high_correlation)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:57.381714Z","iopub.execute_input":"2023-11-20T20:51:57.382338Z","iopub.status.idle":"2023-11-20T20:51:57.393948Z","shell.execute_reply.started":"2023-11-20T20:51:57.382305Z","shell.execute_reply":"2023-11-20T20:51:57.39257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Affichez les paires de variables corrélées\n\ncorr = dataWI.corr()\ncorrelation_df = pd.DataFrame(corr)\nlimit = 0.7\nfiltered_correlation_df = correlation_df[correlation_df > limit]\n\n#Créez une liste pour stocker les paires de variables corrélées\ncorrelated_pairs = []\n\n#Parcourir la matrice de corrélation filtrée\nfor column in filtered_correlation_df.columns:\n    correlated_vars = filtered_correlation_df.index[filtered_correlation_df[column].notna()].tolist()\n    for var in correlated_vars:\n        if column != var:\n            correlated_pairs.append((column, var))\n\n#Affichez les paires de variables corrélées\nprint(correlated_pairs)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:57.394941Z","iopub.execute_input":"2023-11-20T20:51:57.395243Z","iopub.status.idle":"2023-11-20T20:51:57.420161Z","shell.execute_reply.started":"2023-11-20T20:51:57.395219Z","shell.execute_reply":"2023-11-20T20:51:57.419284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"corr = dataWI.corr()\ncorrelation_df = pd.DataFrame(corr)\nlimit = 0.6\nfiltered_correlation_df = correlation_df[correlation_df > limit]","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:57.421219Z","iopub.execute_input":"2023-11-20T20:51:57.42163Z","iopub.status.idle":"2023-11-20T20:51:57.429821Z","shell.execute_reply.started":"2023-11-20T20:51:57.421603Z","shell.execute_reply":"2023-11-20T20:51:57.428327Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"correlated_pairs = []\nfor column in filtered_correlation_df.columns:\n    correlated_vars = filtered_correlation_df.index[filtered_correlation_df[column].notna()].tolist()\n    for var in correlated_vars:\n        if column != var:\n            correlated_pairs.append((column, var))","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:57.431516Z","iopub.execute_input":"2023-11-20T20:51:57.432551Z","iopub.status.idle":"2023-11-20T20:51:57.445152Z","shell.execute_reply.started":"2023-11-20T20:51:57.432516Z","shell.execute_reply":"2023-11-20T20:51:57.443923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"correlated_pairs_array = np.array(correlated_pairs)\nprint(correlated_pairs_array)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:57.447087Z","iopub.execute_input":"2023-11-20T20:51:57.447512Z","iopub.status.idle":"2023-11-20T20:51:57.459216Z","shell.execute_reply.started":"2023-11-20T20:51:57.447477Z","shell.execute_reply":"2023-11-20T20:51:57.458127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataWI.isnull().values.any()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:57.460723Z","iopub.execute_input":"2023-11-20T20:51:57.461078Z","iopub.status.idle":"2023-11-20T20:51:57.474765Z","shell.execute_reply.started":"2023-11-20T20:51:57.461048Z","shell.execute_reply":"2023-11-20T20:51:57.473401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Nettoyage de Données","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 8))  \nheatmap = sns.heatmap(dataWI.isnull(), cmap='plasma', cbar=True, yticklabels=False)\n\nfor i in range(dataWI.shape[1]):\n    plt.axvline(x=i, color='white', linewidth=1)\n\nplt.title(\"Carte thermique de valeurs nulles\")\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:57.476257Z","iopub.execute_input":"2023-11-20T20:51:57.476531Z","iopub.status.idle":"2023-11-20T20:51:58.000349Z","shell.execute_reply.started":"2023-11-20T20:51:57.476506Z","shell.execute_reply":"2023-11-20T20:51:57.999246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Les colonnes BMI, MaritalStatus, FSH/LH, Waist:HipRatio et Fastfood contiennent des valeurs nulles.\n\nBMI= Weight/(Height)². Pour cette variable, on pourrait:\n* La recalculer\n* Supprimer la colonne BMI étant donné qu'avoir le poids et la taille nous donne cette mesure. On évite ainsi les erreurs de calcule, d'approximation. \n\nLa colonne Waist:HipRatio, et FSH/LH sont dans la même situation que BMI, une colonne calculée et donc on peut soit les recalculer ou les supprimer\n\nEn ce qui concerne les colonnes Fastfood et MaritalStatus, un seul individu a un null dans cette variable donc on peut le retrancher de notre échantillon (variable binaire : Oui Non)","metadata":{}},{"cell_type":"markdown","source":"Les colonnes à supprimer sont:\n* SINo\n* PatientNo\n* Peut-être BMI, Waist:HipRatio, FSH/LH\n","metadata":{}},{"cell_type":"markdown","source":"### Calcul BMI\n\nOn recalcule l'IMC avec les valeurs du poids et de la taille.","metadata":{}},{"cell_type":"code","source":"dataWI['BMI']=(dataWI['Weight(Kg)']/dataWI['Height(Cm)']**2)*10000","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.001648Z","iopub.execute_input":"2023-11-20T20:51:58.002028Z","iopub.status.idle":"2023-11-20T20:51:58.010327Z","shell.execute_reply.started":"2023-11-20T20:51:58.001985Z","shell.execute_reply":"2023-11-20T20:51:58.008764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Catégorie d'IMC\nOn a attribué des codes par intervalles d'IMC","metadata":{}},{"cell_type":"code","source":"def determiner_categorie_imc(imc):\n    if imc < 16.5: # Anorexie\n        return 0\n    elif imc >= 16.5 and imc < 18.5: #Maigreur\n        return 1\n    elif imc >= 18.5 and imc < 24.9: #Normal\n        return 2\n    elif imc >= 25 and imc < 29.9: #Surpoids\n        return 3\n    else: #Obesité\n        return 4 \n# Ajouter une nouvelle colonne 'Catégorie IMC' à votre DataFrame\ndataWI['Catégorie IMC'] = dataWI['BMI'].apply(determiner_categorie_imc)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.011955Z","iopub.execute_input":"2023-11-20T20:51:58.012276Z","iopub.status.idle":"2023-11-20T20:51:58.021994Z","shell.execute_reply.started":"2023-11-20T20:51:58.012249Z","shell.execute_reply":"2023-11-20T20:51:58.020946Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Supression des lignes avec valeurs manquantes\nEtant donné qu'il y avait seulement 2 individus concernés, on a décidé de les supprimer.","metadata":{}},{"cell_type":"code","source":"dataWI=dataWI.dropna(subset=['MarraigeStatus(Yrs)','Fastfood(Y/N)'])","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.023307Z","iopub.execute_input":"2023-11-20T20:51:58.023582Z","iopub.status.idle":"2023-11-20T20:51:58.036675Z","shell.execute_reply.started":"2023-11-20T20:51:58.023559Z","shell.execute_reply":"2023-11-20T20:51:58.035526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Recalcul des ratios qui comportaient des valeurs manquantes","metadata":{}},{"cell_type":"code","source":"dataWI['Waist:HipRatio'] = dataWI['Waist(inch)']/dataWI['Hip(inch)']","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.038739Z","iopub.execute_input":"2023-11-20T20:51:58.039152Z","iopub.status.idle":"2023-11-20T20:51:58.052775Z","shell.execute_reply.started":"2023-11-20T20:51:58.039124Z","shell.execute_reply":"2023-11-20T20:51:58.051808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataWI['FSH/LH'] = dataWI['FSH(mIU/mL)']/dataWI['LH(mIU/mL)']\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.053883Z","iopub.execute_input":"2023-11-20T20:51:58.055005Z","iopub.status.idle":"2023-11-20T20:51:58.069197Z","shell.execute_reply.started":"2023-11-20T20:51:58.054972Z","shell.execute_reply":"2023-11-20T20:51:58.068086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Verification du nettoyage","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 8))  # Increase the figure size (adjust the width and height as needed)\nheatmap = sns.heatmap(dataWI.isnull(), cmap='plasma', cbar=True, yticklabels=False)\n\n# Add vertical lines to separate the columns\nfor i in range(dataWI.shape[1]):\n    plt.axvline(x=i, color='white', linewidth=1)\n\nplt.title(\"Carte thermique de valeurs nulles\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.070249Z","iopub.execute_input":"2023-11-20T20:51:58.07112Z","iopub.status.idle":"2023-11-20T20:51:58.616092Z","shell.execute_reply.started":"2023-11-20T20:51:58.071092Z","shell.execute_reply":"2023-11-20T20:51:58.61448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Etudes de Variables","metadata":{}},{"cell_type":"markdown","source":"### La variable Age","metadata":{}},{"cell_type":"code","source":"print(\"le jeu de données contient des femmes entre\", min(dataWI['Age(yrs)']), \"et\", max(dataWI['Age(yrs)']),\"ans\")","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.619965Z","iopub.execute_input":"2023-11-20T20:51:58.620373Z","iopub.status.idle":"2023-11-20T20:51:58.62732Z","shell.execute_reply.started":"2023-11-20T20:51:58.620345Z","shell.execute_reply":"2023-11-20T20:51:58.625891Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_bins = int(np.ceil(np.log2(len(dataWI['Age(yrs)'])) + 1))\n\nplt.hist(dataWI['Age(yrs)'], bins=num_bins, color='pink', edgecolor='black')\nplt.xlabel('Age(Yrs)')\nplt.ylabel('Nombres de personnes')\nplt.title('Histogramme des Ages')\n\nbin_edges = np.histogram_bin_edges(dataWI['Age(yrs)'], bins=num_bins)\nfor edge in bin_edges:\n    plt.axvline(x=edge, color='gray', linestyle='--', linewidth=1)\n\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.628804Z","iopub.execute_input":"2023-11-20T20:51:58.629117Z","iopub.status.idle":"2023-11-20T20:51:58.826701Z","shell.execute_reply.started":"2023-11-20T20:51:58.629087Z","shell.execute_reply":"2023-11-20T20:51:58.825426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Pas de outliers dans le jeu de données","metadata":{}},{"cell_type":"code","source":"repar=dataWI['PCOS(Y/N)'].value_counts()\ncolors = ['firebrick','paleturquoise']\nfig,ax=plt.subplots()\nax.pie(repar,labels=['Non','Oui'], colors=colors, autopct='%1.1f%%', startangle=90)\nax.set_title(\"Répartition des femmes avec SOPK\")","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.82812Z","iopub.execute_input":"2023-11-20T20:51:58.828436Z","iopub.status.idle":"2023-11-20T20:51:58.944423Z","shell.execute_reply.started":"2023-11-20T20:51:58.828408Z","shell.execute_reply":"2023-11-20T20:51:58.943303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Dans la vraie vie on a environ 10% des femmes qui ont le syndrome des ovaires polykystiques, mais dans notre jeu de données nous en sommes à plus de 30%. C'est pourquoi nous allons rééchantilloné notre base de données","metadata":{}},{"cell_type":"markdown","source":"## Rééchantillonage de la base d'apprentissage","metadata":{}},{"cell_type":"markdown","source":"On consate que notre jeu de données n'est pas représentatif de la réalité. Si nous construisons notre modèle sur la base tel quel,les resultats seront biaisés (Notre modèle aura tendance à classer les patientes comme ayant le syndrome).","metadata":{}},{"cell_type":"code","source":"datatest1=dataWI.drop(['PatientFileNo'], axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.946066Z","iopub.execute_input":"2023-11-20T20:51:58.946845Z","iopub.status.idle":"2023-11-20T20:51:58.952775Z","shell.execute_reply.started":"2023-11-20T20:51:58.946806Z","shell.execute_reply":"2023-11-20T20:51:58.951389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datatest1_non=datatest1[datatest1['PCOS(Y/N)']==0]\nlen(datatest1_non)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.961112Z","iopub.execute_input":"2023-11-20T20:51:58.961668Z","iopub.status.idle":"2023-11-20T20:51:58.970518Z","shell.execute_reply.started":"2023-11-20T20:51:58.961636Z","shell.execute_reply":"2023-11-20T20:51:58.969175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Notre base contient 363 patientes n'ayant pas le syndrome. Selon une étude de la ..., on sait que sur 100 femmes, 10 ont SOPK en moyenne, donc 90 sont négatif au SOPK. \n\nDans notre cas on a 363 patientes non malade donc il nous faut trouver le nombre de patientes malades correspondantes pour equilibrer la base et réduire un des nombreux  biais.\n\nLa calcul est le suivant:","metadata":{}},{"cell_type":"markdown","source":"$90 = 362$\n\n$\\Rightarrow 10 = x$\n\n$90 \\times x = 362 \\times 10$\n\n\n$x = 41$\n","metadata":{}},{"cell_type":"markdown","source":"Donc dans notre base de personnes atteintes du SPOK, on tire 41 patientes au hasard (avec l'aide de la fonction sample, qui utilise construit un échantillon sur une loi uniforme: toutes les patientes ont la même probabilité d'être tirée). On précise bien qu'aucune répétition d'individu.","metadata":{}},{"cell_type":"code","source":"datatest1_oui=datatest1[datatest1['PCOS(Y/N)']==1]\ndatatest1_non=datatest1[datatest1['PCOS(Y/N)']==0]\nseed_value = 42\nsample_size=41\nsample_oui =datatest1_oui.sample(n=sample_size, replace=False, random_state=seed_value)\nsample_non =datatest1_non.sample(n=362)\nresampled_data=pd.concat([sample_non, sample_oui], ignore_index=True)\nresampled_data[:10]","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:58.972407Z","iopub.execute_input":"2023-11-20T20:51:58.973013Z","iopub.status.idle":"2023-11-20T20:51:59.006773Z","shell.execute_reply.started":"2023-11-20T20:51:58.972975Z","shell.execute_reply":"2023-11-20T20:51:59.005643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Les individus pas prit dans le nouvel échantillon, tous = 1 ici\nindices_oui = sample_oui.index\nindices_non = sample_non.index\nindices_restant = datatest1.index.difference(indices_oui.union(indices_non))\ntest_data = datatest1.loc[indices_restant]","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.008393Z","iopub.execute_input":"2023-11-20T20:51:59.009021Z","iopub.status.idle":"2023-11-20T20:51:59.019172Z","shell.execute_reply.started":"2023-11-20T20:51:59.008985Z","shell.execute_reply":"2023-11-20T20:51:59.017548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Echantillon de taille n au hasard dans toute la base\nn = 100\ntest_data1 = datatest1.sample(n, replace=True)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.02063Z","iopub.execute_input":"2023-11-20T20:51:59.02164Z","iopub.status.idle":"2023-11-20T20:51:59.032319Z","shell.execute_reply.started":"2023-11-20T20:51:59.021601Z","shell.execute_reply":"2023-11-20T20:51:59.030659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resampled_data['PCOS(Y/N)'].value_counts()/len(resampled_data)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.033782Z","iopub.execute_input":"2023-11-20T20:51:59.034227Z","iopub.status.idle":"2023-11-20T20:51:59.048002Z","shell.execute_reply.started":"2023-11-20T20:51:59.034192Z","shell.execute_reply":"2023-11-20T20:51:59.046703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On obtient une répartition qui reflete plus la réalité (Avec **environ une chance sur dix** d'avoir le PCOS)","metadata":{}},{"cell_type":"markdown","source":"### La variable répartition oui/non après réechantillonage","metadata":{}},{"cell_type":"code","source":"repar=resampled_data['PCOS(Y/N)'].value_counts()\ncolors = ['firebrick','paleturquoise']\nfig,ax=plt.subplots()\nax.pie(repar,labels=['Non','Oui'], colors=colors, autopct='%1.1f%%', startangle=90)\nax.set_title(\"Répartition des femmes avec SOPK\")","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.049162Z","iopub.execute_input":"2023-11-20T20:51:59.049453Z","iopub.status.idle":"2023-11-20T20:51:59.156136Z","shell.execute_reply.started":"2023-11-20T20:51:59.049428Z","shell.execute_reply":"2023-11-20T20:51:59.154784Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Après le réechantillonage, on voit une représentation de la répartition des femmes ayant les ovaires polykistique beaucoup plus représentative de la réalité.","metadata":{}},{"cell_type":"markdown","source":"### Variable Age après réechantillonage","metadata":{"execution":{"iopub.status.busy":"2023-11-20T17:00:49.083191Z","iopub.execute_input":"2023-11-20T17:00:49.083651Z","iopub.status.idle":"2023-11-20T17:00:49.08894Z","shell.execute_reply.started":"2023-11-20T17:00:49.083615Z","shell.execute_reply":"2023-11-20T17:00:49.08778Z"}}},{"cell_type":"code","source":"print(\"le jeu de données contient des femmes entre\", min(resampled_data['Age(yrs)']), \"et\", max(resampled_data['Age(yrs)']),\"ans\")","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.157428Z","iopub.execute_input":"2023-11-20T20:51:59.158968Z","iopub.status.idle":"2023-11-20T20:51:59.170314Z","shell.execute_reply.started":"2023-11-20T20:51:59.158934Z","shell.execute_reply":"2023-11-20T20:51:59.164267Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_bins = int(np.ceil(np.log2(len(resampled_data['Age(yrs)'])) + 1))\n\nplt.hist(resampled_data['Age(yrs)'], bins=num_bins, color='pink', edgecolor='black')\nplt.xlabel('Age(Yrs)')\nplt.ylabel('Nombres de personnes')\nplt.title('Histogramme des Ages')\n\nbin_edges = np.histogram_bin_edges(resampled_data['Age(yrs)'], bins=num_bins)\nfor edge in bin_edges:\n    plt.axvline(x=edge, color='gray', linestyle='--', linewidth=1)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.171828Z","iopub.execute_input":"2023-11-20T20:51:59.172876Z","iopub.status.idle":"2023-11-20T20:51:59.388674Z","shell.execute_reply.started":"2023-11-20T20:51:59.172841Z","shell.execute_reply":"2023-11-20T20:51:59.387794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Pas de outliers dans le jeu de données","metadata":{}},{"cell_type":"markdown","source":"### Ont-elles déjà avorté ou sont-elles enceinte?","metadata":{}},{"cell_type":"markdown","source":"L'un des risques des ovaires polykistique est de ne pas réussir à avoir d'enfants, alors regardons si les femmes de notre base ont déjà avorté ou sont elles enceintes, si ce n'est pas le cas ça ne veut pas dire qu'elle sont infertile mais ça peut nous aider à montrer par la suite avec de potentielles corrélations (comme l'âge et le mariage) la difficulté à enfanter.","metadata":{}},{"cell_type":"code","source":"#OVAIRESPOLY|ENCEINTE\noui_enceinte = resampled_data.loc[resampled_data['PCOS(Y/N)'] == 1, 'Pregnant(Y/N)']\nnon_enceinte = resampled_data.loc[resampled_data['PCOS(Y/N)'] == 0, 'Pregnant(Y/N)']\n\n#OVAIRESPOLY|AVORTEMENT\noui_avortement = resampled_data.loc[resampled_data['PCOS(Y/N)'] == 1, 'Noofaborptions']\nnon_avortement = resampled_data.loc[resampled_data['PCOS(Y/N)'] == 0, 'Noofaborptions']\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.390002Z","iopub.execute_input":"2023-11-20T20:51:59.390385Z","iopub.status.idle":"2023-11-20T20:51:59.399686Z","shell.execute_reply.started":"2023-11-20T20:51:59.390353Z","shell.execute_reply":"2023-11-20T20:51:59.398439Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"poly_oui_bebe = resampled_data[(resampled_data['PCOS(Y/N)'] == 1) & ((resampled_data['Pregnant(Y/N)'] >= 1) | (resampled_data['Noofaborptions'] >= 1))]\npoly_non_bebe = resampled_data[(resampled_data['PCOS(Y/N)'] == 1) & (resampled_data['Pregnant(Y/N)'] == 0) & (resampled_data['Noofaborptions'] == 0)]\nlen_poly=len(poly_oui_bebe)+len(poly_non_bebe)\n\npaspoly_oui_bebe = resampled_data[(resampled_data['PCOS(Y/N)'] == 0) & ((resampled_data['Pregnant(Y/N)'] >= 1) | (resampled_data['Noofaborptions'] >= 1))]\npaspoly_non_bebe = resampled_data[(resampled_data['PCOS(Y/N)'] == 0) & (resampled_data['Pregnant(Y/N)'] == 0) & (resampled_data['Noofaborptions'] == 0)]\nlen_pas_poly=len(paspoly_oui_bebe)+len(paspoly_non_bebe)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.401023Z","iopub.execute_input":"2023-11-20T20:51:59.401663Z","iopub.status.idle":"2023-11-20T20:51:59.416826Z","shell.execute_reply.started":"2023-11-20T20:51:59.401629Z","shell.execute_reply":"2023-11-20T20:51:59.415664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Comparaison en % du nombre de femmes tomber enceinte et pas tombé enceinte entre celles ayant le syndrome et celles ne l'ayant pas\n\n# Données tombées enceintes\ncat1 = [\"Avec SOPK\", \"Sans SOPK\"]\nval1 = [(len(poly_oui_bebe) / len_poly) * 100, (len(paspoly_oui_bebe) / len_pas_poly) * 100]\n\n# Données pas tombées enceinte\ncat2 = [\"Avec SOPK\", \"Sans SOPK\"]\nval2 = [(len(poly_non_bebe) / len_poly) * 100, (len(paspoly_non_bebe) / len_pas_poly) * 100]\n\n# Créer une figure avec deux sous-graphiques côte à côte\nfig, axes = plt.subplots(1, 2, figsize=(12, 5))\n\n# Tomber enceinte\nbarchart1 = axes[0].bar(cat1, val1, color=[\"darksalmon\",\"teal\"])\nfor bar, valeur in zip(barchart1, val1):\n    axes[0].annotate(f'{valeur:.2f}%', \n                     xy=(bar.get_x() + bar.get_width() / 2, bar.get_height()), \n                     xytext=(0, 3),  # Ajustez ces valeurs pour positionner le texte\n                     textcoords='offset points',\n                     ha='center')\naxes[0].set_xlabel('Avec ou sans SOPK')\naxes[0].set_ylabel('Fréquence')\naxes[0].set_title('Répartition des femmes ayant pu tomber enceinte en %')\n\n# Pas tomber enceinte\nbarchart2 = axes[1].bar(cat2, val2,color=[\"darksalmon\",\"teal\"])\nfor bar, valeur in zip(barchart2, val2):\n    axes[1].annotate(f'{valeur:.2f}%', \n                     xy=(bar.get_x() + bar.get_width() / 2, bar.get_height()), \n                     xytext=(0, 3),  # Ajustez ces valeurs pour positionner le texte\n                     textcoords='offset points',\n                     ha='center')\naxes[1].set_xlabel('Avec ou sans SOPK')\naxes[1].set_ylabel('Fréquence')\naxes[1].set_title('Répartition des femmes n\"étant ou n\"ayant pas encore pu tomber enceinte en %')\n\nfig.suptitle('Comparaison en % du nombre de femmes tombées enceinte et pas tombées enceinte entre celles ayant le syndrome et celles ne l\"ayant pas')\nplt.tight_layout()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.418217Z","iopub.execute_input":"2023-11-20T20:51:59.418506Z","iopub.status.idle":"2023-11-20T20:51:59.786908Z","shell.execute_reply.started":"2023-11-20T20:51:59.418481Z","shell.execute_reply":"2023-11-20T20:51:59.785795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Bien que le fait que ne pas encore être tombé enceinte ne signifie pas être stérile, on peut voir quand même une différence assez important entre les femmes ayant le syndrôme et celles de l'ayant pas. Celles avec le syndrome sont moins tombées enceinte que celles sans.","metadata":{}},{"cell_type":"markdown","source":"### Taille de l'endomètre","metadata":{}},{"cell_type":"code","source":"#Histogrammes de comparaisons de taille d'endomètre par tranche d'âge\n# Données avec SOPK\nendo_taille = resampled_data['Endometrium(mm)'][resampled_data['PCOS(Y/N)'] == 1]\nage = resampled_data['Age(yrs)'][resampled_data['PCOS(Y/N)'] == 1]\n\n# Données sans SOPK\nendo_taille2 = resampled_data['Endometrium(mm)'][resampled_data['PCOS(Y/N)'] == 0]\nage2 = resampled_data['Age(yrs)'][resampled_data['PCOS(Y/N)'] == 0]\n\n# Division par groupe d'âge\ngroupe_age = [20, 30, 40, 50]  # Notre min = 21 & 20 et max = 42&48\n\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))\n\n# Histogramme avec SOPK\nfor i in range(len(groupe_age) - 1):\n    age_min = groupe_age[i]\n    age_max = groupe_age[i + 1]\n    age_range = f\"{age_min}-{age_max} ans\"\n    endo_data = [taille for age_val, taille in zip(age, endo_taille) if age_min <= age_val < age_max]\n    \n    ax1.hist(endo_data, bins=10, edgecolor='k', alpha=0.7, label=age_range)\n\nax1.set_xlabel('Épaisseur de l\\'endomètre (mm)')\nax1.set_ylabel('Fréquence')\nax1.set_title('Avec SOPK')\nax1.legend()\n\n# Histogramme sans SOPK\nfor i in range(len(groupe_age) - 1):\n    age_min2 = groupe_age[i]\n    age_max2 = groupe_age[i + 1]\n    age_range2 = f\"{age_min2}-{age_max2} ans\"\n    endo_data2 = [taille for age_val, taille in zip(age2, endo_taille2) if age_min2 <= age_val < age_max2]\n    \n    ax2.hist(endo_data2, bins=10, edgecolor='k', alpha=0.7, label=age_range2)\n\nax2.set_xlabel('Épaisseur de l\\'endomètre (mm)')\nax2.set_ylabel('Fréquence')\nax2.set_title('Sans SOPK')\nax2.legend()\n\nfig.suptitle('Comparaison des tailles de l\"endomètre entre les femmes avec et sans SOPK et selon l\"âge')    \nplt.tight_layout()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:51:59.788206Z","iopub.execute_input":"2023-11-20T20:51:59.789008Z","iopub.status.idle":"2023-11-20T20:52:00.476944Z","shell.execute_reply.started":"2023-11-20T20:51:59.788979Z","shell.execute_reply":"2023-11-20T20:52:00.47551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On voit que pour les femmes sans SOPK, on a des tailles d'endomètre compris entre 0 & 17.5, ce qui est beaucoup plus dispersé que celles avec. ","metadata":{}},{"cell_type":"markdown","source":"### La variable Bloodgroup","metadata":{}},{"cell_type":"code","source":"bloodgroup_mapping = {11: 'A+', 12: 'A-', 13: 'B+', 14: 'B-', 15: 'O+', 16: 'O-', 17: 'AB+', 18: 'AB-'}\n#On remplace nos valeurs chiffrés par leurs correspondance\nresampled_data['BloodGroup'] = resampled_data['BloodGroup'].replace(bloodgroup_mapping)\n#print(resampled_data)\n\nbloodgroups_SOPK = resampled_data['BloodGroup'][resampled_data['PCOS(Y/N)'] == 1].value_counts()\nbloodgroups_sansSOPK = resampled_data['BloodGroup'][resampled_data['PCOS(Y/N)'] == 0].value_counts()\n\nfig, ax = plt.subplots(1, 2, figsize=(12, 6))\n\n#Créez un histogramme pour les groupes sanguins avec PCOS\nax[0].bar(bloodgroups_SOPK.index, bloodgroups_SOPK.values,color='Pink')\nax[0].set_xlabel('Groupes sanguins')\nax[0].set_ylabel('Nombre de femmes')\nax[0].set_title('Groupes sanguins des femmes avec PCOS')\n\n#Créez un histogramme pour les groupes sanguins sans PCOS\nax[1].bar(bloodgroups_sansSOPK.index, bloodgroups_sansSOPK.values,color='Green')\nax[1].set_xlabel('Groupes sanguins')\nax[1].set_ylabel('Nombre de femmes')\nax[1].set_title('Groupes sanguins des femmes sans PCOS')\n\nfig.suptitle('Comparaison des tailles des groupes sanguins entre les femmes avec et sans SOPK')    \nplt.tight_layout()\n\n#Affichez le graphique\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:00.478372Z","iopub.execute_input":"2023-11-20T20:52:00.478658Z","iopub.status.idle":"2023-11-20T20:52:00.888662Z","shell.execute_reply.started":"2023-11-20T20:52:00.478634Z","shell.execute_reply":"2023-11-20T20:52:00.887828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On ne remarque pas de différencesparticulières sur les groupes sanguins entre celles avec SOPK et celles sans.","metadata":{}},{"cell_type":"code","source":"bloodgroup_mapping = {'A+':11,'A-':12, 'B+':13, 'B-': 14,'O+':15,'O-':16,'AB+':17,'AB-':18}\nresampled_data['BloodGroup'] = resampled_data['BloodGroup'].replace(bloodgroup_mapping)\nresampled_data['BloodGroup']","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:00.890173Z","iopub.execute_input":"2023-11-20T20:52:00.89073Z","iopub.status.idle":"2023-11-20T20:52:00.903113Z","shell.execute_reply.started":"2023-11-20T20:52:00.890694Z","shell.execute_reply":"2023-11-20T20:52:00.90212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Etude des taux d'hormones","metadata":{}},{"cell_type":"markdown","source":"### FSH","metadata":{}},{"cell_type":"markdown","source":"Commençons par la variable FSH. FSH (Follicle Stimulating Hormone), ou hormone folliculo-stimulante, aussi appelée « folliculo-stimuline » est associée au cycle menstruel et développement des ovules chez la femme. Elle intervient avec l'hormone lutéinisante (LH) dans la croissance et la maturation des follicules ovariens chez la femme.\n\n1.4 to 9.9 mIU/mL (follicular phase)\n\n6.2 to 17.2 mIU/mL (ovulatory peak)\n\n1.1 to 9.2 mIU/mL (luteal phase)","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['FSH(mIU/mL)'], marker='o',c=resampled_data['PCOS(Y/N)'])\nplt.xlabel('Individu')\nplt.ylabel('Taux de FSH (mIU/mL)')\nplt.title('Taux de FSH par Individu')\nplt.colorbar(label='PCOS(Y/N)')\nplt.xticks(rotation=90)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:00.904433Z","iopub.execute_input":"2023-11-20T20:52:00.904736Z","iopub.status.idle":"2023-11-20T20:52:01.186892Z","shell.execute_reply.started":"2023-11-20T20:52:00.904706Z","shell.execute_reply":"2023-11-20T20:52:01.185527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"max(resampled_data['FSH(mIU/mL)'])\n#Grosse valeur abérrante là","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:01.188435Z","iopub.execute_input":"2023-11-20T20:52:01.18879Z","iopub.status.idle":"2023-11-20T20:52:01.194423Z","shell.execute_reply.started":"2023-11-20T20:52:01.188715Z","shell.execute_reply":"2023-11-20T20:52:01.193375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resampled_data[resampled_data['FSH(mIU/mL)']==5052.0]\n#resampled_data['PCOS(Y/N)']","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:01.196251Z","iopub.execute_input":"2023-11-20T20:52:01.196689Z","iopub.status.idle":"2023-11-20T20:52:01.225062Z","shell.execute_reply.started":"2023-11-20T20:52:01.196651Z","shell.execute_reply":"2023-11-20T20:52:01.223774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Nous observons une valeur abérrante au niveau des taux de FSH pour l'individu numéro 330.\nNous pouvons choisir de supprimer cet individu du dataset ou bien de remplacer le taux par la valeur médiane.","metadata":{}},{"cell_type":"markdown","source":"J'utilise numpy pour calculer la valeur de FSH médianne en ne prenant pas la valeur abérrante. Puis j'affecte la valeur médiane au FSH égal à 5052.","metadata":{}},{"cell_type":"code","source":"median_fsh = np.median(resampled_data['FSH(mIU/mL)'][resampled_data['FSH(mIU/mL)'] != 5083])\nresampled_data.loc[resampled_data['FSH(mIU/mL)'] == 5052.0, 'FSH(mIU/mL)'] = median_fsh","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:01.226691Z","iopub.execute_input":"2023-11-20T20:52:01.227156Z","iopub.status.idle":"2023-11-20T20:52:01.23934Z","shell.execute_reply.started":"2023-11-20T20:52:01.22712Z","shell.execute_reply":"2023-11-20T20:52:01.237948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['FSH(mIU/mL)'], c=resampled_data['PCOS(Y/N)'], cmap='viridis', marker='o')\nplt.xlabel('Individu')\nplt.ylabel('Taux de FSH (mIU/mL)')\nplt.title('Taux de FSH par Individu')\nplt.xticks(rotation=90)\nplt.colorbar(label='PCOS(Y/N)')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:01.241153Z","iopub.execute_input":"2023-11-20T20:52:01.241668Z","iopub.status.idle":"2023-11-20T20:52:01.550322Z","shell.execute_reply.started":"2023-11-20T20:52:01.241634Z","shell.execute_reply":"2023-11-20T20:52:01.548967Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resampled_data['FSH_Norme'] = 0\nfor index, row in resampled_data.iterrows():\n    fsh_value = row['FSH(mIU/mL)']\n    if 3.0 <= fsh_value <= 13.0:\n        resampled_data.at[index, 'FSH_Norme'] = 1\n        \ntest_data['FSH_Norme'] = 0\nfor index, row in test_data.iterrows():\n    fsh_value = row['FSH(mIU/mL)']\n    if 3.0 <= fsh_value <= 13.0:\n        test_data.at[index, 'FSH_Norme'] = 1\n        \ntest_data1['FSH_Norme'] = 0\nfor index, row in test_data1.iterrows():\n    fsh_value = row['FSH(mIU/mL)']\n    if 3.0 <= fsh_value <= 13.0:\n        test_data1.at[index, 'FSH_Norme'] = 1","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:01.551271Z","iopub.execute_input":"2023-11-20T20:52:01.551522Z","iopub.status.idle":"2023-11-20T20:52:01.615343Z","shell.execute_reply.started":"2023-11-20T20:52:01.5515Z","shell.execute_reply":"2023-11-20T20:52:01.614315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"La variable FSH, ne permet pas de clairement distinguer entre les femmes atteintes du syndrome et celles qui ne le sont pas.","metadata":{}},{"cell_type":"code","source":"resampled_data['FSH_Norme'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:01.616448Z","iopub.execute_input":"2023-11-20T20:52:01.617713Z","iopub.status.idle":"2023-11-20T20:52:01.627296Z","shell.execute_reply.started":"2023-11-20T20:52:01.61766Z","shell.execute_reply":"2023-11-20T20:52:01.62602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## LH","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['LH(mIU/mL)'], c=resampled_data['PCOS(Y/N)'], cmap='viridis', marker='o')\nplt.xlabel('Individu')\nplt.ylabel('Taux de LH (mIU/mL)')\nplt.title('Taux de LH par Individu')\nplt.xticks(rotation=90)\nplt.colorbar(label='PCOS(Y/N)')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:01.628482Z","iopub.execute_input":"2023-11-20T20:52:01.628841Z","iopub.status.idle":"2023-11-20T20:52:01.947485Z","shell.execute_reply.started":"2023-11-20T20:52:01.628812Z","shell.execute_reply":"2023-11-20T20:52:01.946289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resampled_data['LH_Norme'] = 0\nfor index, row in resampled_data.iterrows():\n    lh_value = row['LH(mIU/mL)']\n    if 2.0 <= lh_value <= 10.0:\n        resampled_data.at[index, 'LH_Norme'] = 1\n        \nresampled_data['LH_Norme'].value_counts()\n\n\n\ntest_data['LH_Norme'] = 0\nfor index, row in test_data.iterrows():\n    lh_value = row['LH(mIU/mL)']\n    if 2.0 <= lh_value <= 10.0:\n        test_data.at[index, 'LH_Norme'] = 1\n        \n        \ntest_data1['LH_Norme'] = 0\nfor index, row in test_data1.iterrows():\n    lh_value = row['LH(mIU/mL)']\n    if 2.0 <= lh_value <= 10.0:\n        test_data1.at[index, 'LH_Norme'] = 1","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:01.948829Z","iopub.execute_input":"2023-11-20T20:52:01.949357Z","iopub.status.idle":"2023-11-20T20:52:02.006796Z","shell.execute_reply.started":"2023-11-20T20:52:01.949321Z","shell.execute_reply":"2023-11-20T20:52:02.005435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## TSH","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['TSH(mIU/L)'], c=resampled_data['PCOS(Y/N)'], cmap='viridis', marker='o')\nplt.xlabel('Individu')\nplt.ylabel('Taux de TSH (mIU/L)')\nplt.title('Taux de TSH par Individu')\nplt.colorbar(label='PCOS(Y/N)')\nplt.xticks(rotation=90)\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:02.008232Z","iopub.execute_input":"2023-11-20T20:52:02.008552Z","iopub.status.idle":"2023-11-20T20:52:02.324948Z","shell.execute_reply.started":"2023-11-20T20:52:02.008524Z","shell.execute_reply":"2023-11-20T20:52:02.323915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resampled_data['TSH_Norme'] = 0\nfor index, row in resampled_data.iterrows():\n    tsh_value = row['TSH(mIU/L)']\n    if 0.15 <= tsh_value <= 5.0:\n        resampled_data.at[index, 'TSH_Norme'] = 1\n        \nresampled_data['TSH_Norme'].value_counts()\n\ntest_data['TSH_Norme'] = 0\nfor index, row in test_data.iterrows():\n    tsh_value = row['TSH(mIU/L)']\n    if 0.15 <= tsh_value <= 5.0:\n        test_data.at[index, 'TSH_Norme'] = 1\n        \ntest_data1['TSH_Norme'] = 0\nfor index, row in test_data1.iterrows():\n    tsh_value = row['TSH(mIU/L)']\n    if 0.15 <= tsh_value <= 5.0:\n        test_data1.at[index, 'TSH_Norme'] = 1","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:02.326325Z","iopub.execute_input":"2023-11-20T20:52:02.326683Z","iopub.status.idle":"2023-11-20T20:52:02.395589Z","shell.execute_reply.started":"2023-11-20T20:52:02.326652Z","shell.execute_reply":"2023-11-20T20:52:02.394591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## AMH","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['AMH(ng/mL)'], c=resampled_data['PCOS(Y/N)'], cmap='viridis', marker='o')\nplt.xlabel('Individu')\nplt.ylabel('Taux de AMH(ng/mL)')\nplt.title('Taux de AMH par Individu')\nplt.colorbar(label='PCOS(Y/N)')\nplt.xticks(rotation=90)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:02.397386Z","iopub.execute_input":"2023-11-20T20:52:02.397812Z","iopub.status.idle":"2023-11-20T20:52:02.708541Z","shell.execute_reply.started":"2023-11-20T20:52:02.397782Z","shell.execute_reply":"2023-11-20T20:52:02.707452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## PRL","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['PRL(ng/mL)'], c=resampled_data['PCOS(Y/N)'], cmap='viridis', marker='o')\nplt.xlabel('Individu')\nplt.ylabel('Taux de PRL(ng/mL)')\nplt.title('Taux de PRL par Individu')\nplt.colorbar(label='PCOS(Y/N)')\nplt.xticks(rotation=90)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:02.71017Z","iopub.execute_input":"2023-11-20T20:52:02.710558Z","iopub.status.idle":"2023-11-20T20:52:03.007088Z","shell.execute_reply.started":"2023-11-20T20:52:02.710525Z","shell.execute_reply":"2023-11-20T20:52:03.006223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## PRG","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['PRG(ng/mL)'], c=resampled_data['PCOS(Y/N)'], cmap='viridis', marker='o')\nplt.xlabel('Individu')\nplt.ylabel('Taux de PRG(ng/mL)')\nplt.title('Taux de PRG par Individu')\nplt.colorbar(label='PCOS(Y/N)')\nplt.xticks(rotation=90)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:03.00829Z","iopub.execute_input":"2023-11-20T20:52:03.009514Z","iopub.status.idle":"2023-11-20T20:52:03.329813Z","shell.execute_reply.started":"2023-11-20T20:52:03.009465Z","shell.execute_reply":"2023-11-20T20:52:03.32873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Follicule","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['FollicleNo(L)'], c=resampled_data['PCOS(Y/N)'], cmap='viridis', marker='o')\nplt.xlabel('Individu')\nplt.ylabel('Follicle')\nplt.title('Follicle Gauche Individu')\nplt.xticks(rotation=90)\nplt.colorbar(label='PCOS(Y/N)')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:03.331088Z","iopub.execute_input":"2023-11-20T20:52:03.331388Z","iopub.status.idle":"2023-11-20T20:52:03.63221Z","shell.execute_reply.started":"2023-11-20T20:52:03.331364Z","shell.execute_reply":"2023-11-20T20:52:03.631249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.scatter(resampled_data['SlNo'], resampled_data['FollicleNo(R)'], c=resampled_data['PCOS(Y/N)'], cmap='viridis', marker='o')\nplt.xlabel('Individu')\nplt.ylabel('Follicle')\nplt.title('Follicle Droit Individu')\nplt.xticks(rotation=90)\nplt.colorbar(label='PCOS(Y/N)')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:03.633541Z","iopub.execute_input":"2023-11-20T20:52:03.633915Z","iopub.status.idle":"2023-11-20T20:52:03.936155Z","shell.execute_reply.started":"2023-11-20T20:52:03.633886Z","shell.execute_reply":"2023-11-20T20:52:03.934975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.scatter(resampled_data['Age(yrs)'],resampled_data['Pulserate(bpm)'], c=resampled_data['PCOS(Y/N)'])\nplt.colorbar(label='PCOS(Y/N)')\nplt.title(\"Distribution de la variable Pulserate\")","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:03.937366Z","iopub.execute_input":"2023-11-20T20:52:03.937629Z","iopub.status.idle":"2023-11-20T20:52:04.417523Z","shell.execute_reply.started":"2023-11-20T20:52:03.937608Z","shell.execute_reply":"2023-11-20T20:52:04.416239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Par la suite, nous exploiterons fortement les variables ci-dessus déterminant les taux \"normaux\" d'hormones et permettant de reperer quand c'est \"anormal\" et donc potentiellement polykistique.","metadata":{}},{"cell_type":"markdown","source":"## La variable poids ","metadata":{}},{"cell_type":"code","source":"plt.hist(resampled_data['Weight(Kg)'], color='cyan', edgecolor='black')\nplt.xlabel('Poids en Kg')\nplt.ylabel('Nombres de personnes')\nplt.title('Histogramme des Poids')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:04.419031Z","iopub.execute_input":"2023-11-20T20:52:04.419327Z","iopub.status.idle":"2023-11-20T20:52:04.644054Z","shell.execute_reply.started":"2023-11-20T20:52:04.419302Z","shell.execute_reply":"2023-11-20T20:52:04.642809Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## La variable taille des hanches ","metadata":{}},{"cell_type":"code","source":"plt.hist(resampled_data['Hip(inch)'], color='blue', edgecolor='black')\nplt.xlabel('Taille des Hanches en inch')\nplt.ylabel('Nombres de personnes')\nplt.title('Histogramme de la taille des hanches')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:04.647269Z","iopub.execute_input":"2023-11-20T20:52:04.647592Z","iopub.status.idle":"2023-11-20T20:52:04.848671Z","shell.execute_reply.started":"2023-11-20T20:52:04.647565Z","shell.execute_reply":"2023-11-20T20:52:04.847818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## La variable taille (height) ","metadata":{}},{"cell_type":"code","source":"plt.hist(resampled_data['Waist(inch)'], color='pink', edgecolor='black')\nplt.xlabel('Mesure de la Taille en inch')\nplt.ylabel('Nombres de personnes')\nplt.title('Histogramme des mesures de la Taille')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:04.849861Z","iopub.execute_input":"2023-11-20T20:52:04.85112Z","iopub.status.idle":"2023-11-20T20:52:05.037136Z","shell.execute_reply.started":"2023-11-20T20:52:04.851082Z","shell.execute_reply":"2023-11-20T20:52:05.035768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## La durée du cycle menstruel  ","metadata":{}},{"cell_type":"code","source":"cycle_lengths_SOPK = resampled_data['Cyclelength(days)'][resampled_data['PCOS(Y/N)'] == 1]\ncycle_lengths_sansSOPK = resampled_data['Cyclelength(days)'][resampled_data['PCOS(Y/N)'] == 0]\n\ncount_per_cycle_SOPK_length = cycle_lengths_SOPK.value_counts().sort_index()\ncount_per_cycle_sansSOPK_length = cycle_lengths_sansSOPK.value_counts().sort_index()\n\nfig, ax = plt.subplots(figsize=(12, 6))\nax.plot(count_per_cycle_SOPK_length.index, count_per_cycle_SOPK_length.values, marker='o', linestyle='-', label='Avec PCOS')\nax.plot(count_per_cycle_sansSOPK_length.index, count_per_cycle_sansSOPK_length.values, marker='o', linestyle='-', label='Sans PCOS')\n\nax.set_xlabel('Nombre de jours de cycle menstruel')\nax.set_ylabel('Nombre de femmes')\nax.set_title('Répartition du cycle menstruel des femmes')\n\n\nax.legend()\nplt.grid(True) \nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.038595Z","iopub.execute_input":"2023-11-20T20:52:05.039021Z","iopub.status.idle":"2023-11-20T20:52:05.30311Z","shell.execute_reply.started":"2023-11-20T20:52:05.038972Z","shell.execute_reply":"2023-11-20T20:52:05.301903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Chez les femmes sans SOPK on remarque un pic à 5 jours de règles qui correspond à la moyenne; pour les femmes avec on est réparti à peu près de façon équivalente, c'est peu surprenant sachant que le cycle d'une femme avec SOPK est très irrégulier, on aura donc des femmes avec des cycles très court ou très long.","metadata":{}},{"cell_type":"code","source":"np.mean(resampled_data[resampled_data['PCOS(Y/N)'] == 0]['Cyclelength(days)'])","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.307077Z","iopub.execute_input":"2023-11-20T20:52:05.307424Z","iopub.status.idle":"2023-11-20T20:52:05.316861Z","shell.execute_reply.started":"2023-11-20T20:52:05.307396Z","shell.execute_reply":"2023-11-20T20:52:05.315678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Le nombre moyen de durée du cycle menstruel est de 5 jours.","metadata":{}},{"cell_type":"markdown","source":"## La répartition FastFood et Sports","metadata":{}},{"cell_type":"code","source":"fastfood_col_true = resampled_data['Fastfood(Y/N)'][resampled_data['PCOS(Y/N)']==1]\nfastfood_col_false = resampled_data['Fastfood(Y/N)'][resampled_data['PCOS(Y/N)']==0]\nreg_exercise_col_false = resampled_data['RegExercise(Y/N)'][resampled_data['PCOS(Y/N)']==0]\nreg_exercise_col_true = resampled_data['RegExercise(Y/N)'][resampled_data['PCOS(Y/N)']==1]\n\n# Comptez le nombre de \"oui\" et \"non\" pour chaque colonne\nfastfood_true_counts = fastfood_col_true.value_counts()\nfastfood_false_counts = fastfood_col_false.value_counts()\nreg_exercise_true_counts = reg_exercise_col_true.value_counts()\nreg_exercise_false_counts = reg_exercise_col_false.value_counts()\n\n# Camemberts\nlabels = ['Oui', 'Non']\nfastfood_true_data = [fastfood_true_counts.get(1, 0), fastfood_true_counts.get(0, 0)]\nfastfood_false_data = [fastfood_false_counts.get(1, 0), fastfood_false_counts.get(0, 0)]\nreg_exercise_true_data = [reg_exercise_true_counts.get(1, 0), reg_exercise_true_counts.get(0, 0)]\nreg_exercise_false_data = [reg_exercise_false_counts.get(1, 0), reg_exercise_false_counts.get(0, 0)]\n\n\nfig, axes = plt.subplots(2, 2, figsize=(12, 6))\n\n# 'Fastfood(Y/N)' SOPK\naxes[0,0].pie(fastfood_true_data, labels=labels, autopct='%1.1f%%', startangle=90, colors=['Pink','DarkRed'])\naxes[0,0].set_title('Fastfood SOPK')\n\n# 'Fastfood(Y/N)' sans SOPK\naxes[0,1].pie(fastfood_false_data, labels=labels, autopct='%1.1f%%', startangle=90, colors=['Lightgreen','DarkBlue'])\naxes[0,1].set_title('Fastfood PAS SOPK')\n\n#'RegExercise(Y/N)' SOPK\naxes[1,0].pie(reg_exercise_true_data, labels=labels, autopct='%1.1f%%', startangle=90, colors=['Pink','DarkRed'])\naxes[1,0].set_title('RegExercise SOPK')\n\n# 'RegExercise(Y/N)' sans SOPK\naxes[1,1].pie(reg_exercise_false_data, labels=labels, autopct='%1.1f%%', startangle=90,colors=['Lightgreen','DarkBlue'])\naxes[1,1].set_title('RegExercise PAS SOPK')\n\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.318419Z","iopub.execute_input":"2023-11-20T20:52:05.318967Z","iopub.status.idle":"2023-11-20T20:52:05.629849Z","shell.execute_reply.started":"2023-11-20T20:52:05.318938Z","shell.execute_reply":"2023-11-20T20:52:05.628939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On peut dire que les femmes avec SOPK mangent plus de fast food que celles sans, mais font quasiment autant de sport, ce n'est donc pas équilibré. Rappelons que c'est un facteur de l'obeisité, rapport assez négatif alors.","metadata":{}},{"cell_type":"markdown","source":"# Suite SAE","metadata":{}},{"cell_type":"code","source":"# Compter le nombre de personnes de la catégorie \"Normal\" ayant le PCOS\npersonnes_normales_avec_pcos = resampled_data[resampled_data['Catégorie IMC'] == 2]['PCOS(Y/N)'].value_counts()\n\n# Afficher le résultat\nprint(personnes_normales_avec_pcos)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.630932Z","iopub.execute_input":"2023-11-20T20:52:05.631236Z","iopub.status.idle":"2023-11-20T20:52:05.63952Z","shell.execute_reply.started":"2023-11-20T20:52:05.63121Z","shell.execute_reply":"2023-11-20T20:52:05.638667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Compter le nombre de personnes de la catégorie Surpoids ayant le PCOS\npersonnes_surpoids_avec_pcos = resampled_data[resampled_data['Catégorie IMC'] == 3]['PCOS(Y/N)'].value_counts()\n\n# Afficher le résultat\nprint(personnes_surpoids_avec_pcos)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.640429Z","iopub.execute_input":"2023-11-20T20:52:05.640718Z","iopub.status.idle":"2023-11-20T20:52:05.658504Z","shell.execute_reply.started":"2023-11-20T20:52:05.640692Z","shell.execute_reply":"2023-11-20T20:52:05.657804Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Compter le nombre de personnes de la catégorie Obeses ayant le PCOS\npersonnes_obeses_avec_pcos = resampled_data[resampled_data['Catégorie IMC'] == 4]['PCOS(Y/N)'].value_counts()\n\n# Afficher le résultat\nprint(personnes_obeses_avec_pcos)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.659454Z","iopub.execute_input":"2023-11-20T20:52:05.65976Z","iopub.status.idle":"2023-11-20T20:52:05.672493Z","shell.execute_reply.started":"2023-11-20T20:52:05.659718Z","shell.execute_reply":"2023-11-20T20:52:05.671571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Filtrer le DataFrame pour inclure uniquement les personnes ayant le PCOS\npersonnes_avec_pcos = resampled_data[resampled_data['PCOS(Y/N)'] == 1]\n\n# Calculer les proportions de chaque catégorie IMC parmi les personnes ayant le PCOS\npourcentage_par_categorie_imc = personnes_avec_pcos[\"Catégorie IMC\"].value_counts(normalize=True) * 100\n\n# Afficher le résultat\nprint(pourcentage_par_categorie_imc)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.673844Z","iopub.execute_input":"2023-11-20T20:52:05.674119Z","iopub.status.idle":"2023-11-20T20:52:05.685813Z","shell.execute_reply.started":"2023-11-20T20:52:05.674095Z","shell.execute_reply":"2023-11-20T20:52:05.684828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Parmi celles qui ont PCOS, 46% sont en surpoids, 41% ont un poids normal, 10% sont obèses, et 2,5% en \"maigreur\".","metadata":{}},{"cell_type":"markdown","source":"# Creation des modèles","metadata":{}},{"cell_type":"markdown","source":"# ACP","metadata":{}},{"cell_type":"markdown","source":"L'Analyse de composante principales nous permet de réduire les axes. Avec une base de plus de 40 attributs, on a décidé de faire de l'ACP pour regarder les axes qui sont négligeables comparé aux autres.","metadata":{}},{"cell_type":"code","source":"cols=list(resampled_data.columns)\ncols=cols[1:]","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.686958Z","iopub.execute_input":"2023-11-20T20:52:05.687233Z","iopub.status.idle":"2023-11-20T20:52:05.697403Z","shell.execute_reply.started":"2023-11-20T20:52:05.68721Z","shell.execute_reply":"2023-11-20T20:52:05.696135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Créez un exemple de DataFrame (remplacez cela par vos propres données)\ncols=resampled_data.columns\ndata = resampled_data\ndf = pd.DataFrame(data)\n\n# Standardisation des données\nscaler = StandardScaler()\ndf_scaled = scaler.fit_transform(df)\n\n# Appliquer l'ACP\npca = PCA()\ndf_pca = pca.fit_transform(df_scaled)\n\n# Créer un DataFrame avec les composantes principales\ndf_pca_result = pd.DataFrame(df_pca)\n\n# Afficher la variance expliquée par chaque composante principale\nexplained_variance_ratio = pca.explained_variance_ratio_\nprint(\"Variance expliquée par chaque composante principale:\", explained_variance_ratio)\n\n# Graphique de la variance expliquée cumulative\ncumulative_explained_variance = explained_variance_ratio.cumsum()\n\nplt.figure(figsize=(8, 6))\nplt.bar(range(1, len(cumulative_explained_variance) + 1), cumulative_explained_variance, alpha=0.75, align='center')\nplt.step(range(1, len(cumulative_explained_variance) + 1), cumulative_explained_variance, where='mid')\nplt.xlabel('Nombre de composantes principales')\nplt.ylabel('Variance expliquée cumulative')\nplt.title('Variance expliquée cumulative par composante principale')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.698564Z","iopub.execute_input":"2023-11-20T20:52:05.698867Z","iopub.status.idle":"2023-11-20T20:52:05.998784Z","shell.execute_reply.started":"2023-11-20T20:52:05.698845Z","shell.execute_reply":"2023-11-20T20:52:05.997274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Avec l'ACP,le graphique suivant nous montre que toutes les composantes contribuent de façon plutôt équitable à expliquer la variation dans les données. \n\nAvec 10 variables, on n'arrive pas à expliquer 50% de la variabilité des données. La réduction de dimensions avec l'ACP n'est pas une bonne idée, car on perdrait beaucoup d'informations.","metadata":{}},{"cell_type":"markdown","source":"trois axes, on n'est même pas à 50% d'explication de la variation des données.","metadata":{}},{"cell_type":"code","source":"cols=list(resampled_data)\ncols=cols[2:]","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:05.999859Z","iopub.execute_input":"2023-11-20T20:52:06.000144Z","iopub.status.idle":"2023-11-20T20:52:06.006062Z","shell.execute_reply.started":"2023-11-20T20:52:06.000118Z","shell.execute_reply":"2023-11-20T20:52:06.004664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Regression logistique","metadata":{}},{"cell_type":"code","source":"X = resampled_data[cols]\nY = list(resampled_data[\"PCOS(Y/N)\"])\nY = pd.Series(Y)\nx_train, x_test, y_train, y_test = train_test_split(X,Y, test_size = 0.2, random_state = 65)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:06.007406Z","iopub.execute_input":"2023-11-20T20:52:06.007724Z","iopub.status.idle":"2023-11-20T20:52:06.021109Z","shell.execute_reply.started":"2023-11-20T20:52:06.007701Z","shell.execute_reply":"2023-11-20T20:52:06.020023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"regr = linear_model.LogisticRegression()\nregr.fit(X, Y)\nY_pred = regr.predict(X)\nregr.score(X, Y)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:06.022997Z","iopub.execute_input":"2023-11-20T20:52:06.023343Z","iopub.status.idle":"2023-11-20T20:52:06.07915Z","shell.execute_reply.started":"2023-11-20T20:52:06.023313Z","shell.execute_reply":"2023-11-20T20:52:06.078495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Après test sur R pour trouver les variables les plus significatives au modèle","metadata":{}},{"cell_type":"markdown","source":"#### Récupération de la liste de variables retenues ","metadata":{}},{"cell_type":"code","source":"# Ouvrir un fichier en mode lecture ('r' pour read)\nwith open('/kaggle/input/colonne-a-garder/colonnes_a_garder.txt', 'r') as fichier:\n    # Lire toutes les lignes du fichier dans une liste\n    lignes = fichier.readlines()\n\n# Stocker chaque mot dans une liste\nmots = []\nfor ligne in lignes:\n    mots.extend([mot.strip('`') for mot in ligne.split()])\n\n# Afficher chaque mot stocké dans la liste\nprint(mots)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:06.080078Z","iopub.execute_input":"2023-11-20T20:52:06.080805Z","iopub.status.idle":"2023-11-20T20:52:06.09339Z","shell.execute_reply.started":"2023-11-20T20:52:06.080778Z","shell.execute_reply":"2023-11-20T20:52:06.092474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Construction du modèle avec les variables sélectionées ","metadata":{}},{"cell_type":"code","source":"X = resampled_data[mots]\nY = list(resampled_data[\"PCOS(Y/N)\"])\nY = pd.Series(Y)\nx_train, x_test, y_train, y_test = train_test_split(X,Y, test_size = 0.2, random_state = 65)\n\nregr = linear_model.LogisticRegression()\nregr.fit(X, Y)\nY_pred = regr.predict(X)\nregr.score(x_test, y_test)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:06.094757Z","iopub.execute_input":"2023-11-20T20:52:06.095717Z","iopub.status.idle":"2023-11-20T20:52:06.138974Z","shell.execute_reply.started":"2023-11-20T20:52:06.095687Z","shell.execute_reply":"2023-11-20T20:52:06.138272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Prédiction avec le modèle logistique","metadata":{}},{"cell_type":"markdown","source":"Au réechantillonage, nous avions mit de côté des données pour les prédire par la suite, sauf qu'au vu du nombre d'individus dans notre base, ces données sont tous des femmes ayant le syndrome des ovaires polykystiques. Alors, les resultats ne seront pas concluant.","metadata":{}},{"cell_type":"code","source":"#Avec les femmes restantes =1\nY_pred_test = regr.predict(test_data[mots])\naccuracy_score(test_data['PCOS(Y/N)'],Y_pred_test)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:06.139967Z","iopub.execute_input":"2023-11-20T20:52:06.140532Z","iopub.status.idle":"2023-11-20T20:52:06.150797Z","shell.execute_reply.started":"2023-11-20T20:52:06.140506Z","shell.execute_reply":"2023-11-20T20:52:06.150057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Au vu des resultats précédents nous avons aussi créer un échantillon de taille 100 en aléatoire.","metadata":{}},{"cell_type":"code","source":"#Avec l'échantillon n=100 au hasard\nY_pred_test_random = regr.predict(test_data1[mots])\naccuracy_score(test_data1['PCOS(Y/N)'],Y_pred_test_random)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:06.151984Z","iopub.execute_input":"2023-11-20T20:52:06.153063Z","iopub.status.idle":"2023-11-20T20:52:06.169324Z","shell.execute_reply.started":"2023-11-20T20:52:06.153029Z","shell.execute_reply":"2023-11-20T20:52:06.168577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On obtient un très bon score pour le modèle logistique.","metadata":{}},{"cell_type":"markdown","source":"#### Cross-validation pour obtenir le meilleur nombre de plis","metadata":{}},{"cell_type":"code","source":"X = resampled_data[mots]\nY = list(resampled_data[\"PCOS(Y/N)\"])\nY = pd.Series(Y)\n\ncv_range = range(2, 10)\n\nerrors = []\n\nlogistic_regr = LogisticRegression()\n\n\nfor cv in cv_range:\n    fold_errors = []\n\n    kf = KFold(n_splits=cv, shuffle=True, random_state=42)  # Added shuffle and random_state for reproducibility\n\n    for train_fold, valid_fold in kf.split(X):\n        X_train_fold, X_valid_fold = X.iloc[train_fold], X.iloc[valid_fold]\n        y_train_fold, y_valid_fold = Y.iloc[train_fold], Y.iloc[valid_fold]\n\n        model = logistic_regr.fit(X=X_train_fold, y=y_train_fold)\n        valid_acc = model.score(X=X_valid_fold, y=y_valid_fold)\n        fold_errors.append(1 - valid_acc)\n\n    avg_error = sum(fold_errors) / len(fold_errors)\n    errors.append(avg_error)\n\ndf = pd.DataFrame({\"Number of Folds\": cv_range, \"Error\": errors})\nmin_error_row = df[df['Error'] == df['Error'].min()]\n\nbest_cv = min_error_row['Number of Folds'].values[0]\n\nprint(\"Optimal number of folds for Logistic Regression:\", best_cv)\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:06.170515Z","iopub.execute_input":"2023-11-20T20:52:06.171583Z","iopub.status.idle":"2023-11-20T20:52:07.465275Z","shell.execute_reply.started":"2023-11-20T20:52:06.17154Z","shell.execute_reply":"2023-11-20T20:52:07.464402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mse_scores = cross_val_score(logistic_regr, X, Y, cv=best_cv, scoring='neg_mean_squared_error')\nnp.mean(mse_scores*mse_scores)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:07.466164Z","iopub.execute_input":"2023-11-20T20:52:07.466483Z","iopub.status.idle":"2023-11-20T20:52:07.659857Z","shell.execute_reply.started":"2023-11-20T20:52:07.466455Z","shell.execute_reply":"2023-11-20T20:52:07.658978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Le resultat du risque quadratique est très faible, on a donc peu d'erreurs, ce qui est positif.","metadata":{}},{"cell_type":"markdown","source":"## Decision tree","metadata":{}},{"cell_type":"markdown","source":"#### Construction du modèle ","metadata":{}},{"cell_type":"code","source":"dt = DecisionTreeClassifier()\ndt_model = dt.fit(x_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:07.661228Z","iopub.execute_input":"2023-11-20T20:52:07.661795Z","iopub.status.idle":"2023-11-20T20:52:07.673601Z","shell.execute_reply.started":"2023-11-20T20:52:07.661737Z","shell.execute_reply":"2023-11-20T20:52:07.672678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(12,10))\ntree.plot_tree(dt_model,feature_names=cols,class_names=['Not PCOS','PCOS'])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:07.675011Z","iopub.execute_input":"2023-11-20T20:52:07.675353Z","iopub.status.idle":"2023-11-20T20:52:09.069511Z","shell.execute_reply.started":"2023-11-20T20:52:07.675321Z","shell.execute_reply":"2023-11-20T20:52:09.06794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Cross-validation pour trouver le meilleur nombre de plis","metadata":{}},{"cell_type":"code","source":"cv_range = range(2, 20)\n\nerrors = []\n\n\ntree_model = DecisionTreeClassifier()\n\n\nfor cv in cv_range:\n    fold_errors = []\n\n    kf = KFold(n_splits=cv)\n\n    for train_fold, valid_fold in kf.split(X):\n        X_train_fold, X_valid_fold = X.iloc[train_fold], X.iloc[valid_fold]\n        y_train_fold, y_valid_fold = Y.iloc[train_fold], Y.iloc[valid_fold]\n\n        model = tree_model.fit(X=X_train_fold, y=y_train_fold)\n        valid_acc = model.score(X=X_valid_fold, y=y_valid_fold)\n        fold_errors.append(1 - valid_acc)\n\n    avg_error = sum(fold_errors) / len(fold_errors)\n    errors.append(avg_error)\n\n\ndf = pd.DataFrame({\"Number of Folds\": cv_range, \"Error\": errors})\nblabla=df[df['Error'] == df['Error'].min()]","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:09.07908Z","iopub.execute_input":"2023-11-20T20:52:09.079418Z","iopub.status.idle":"2023-11-20T20:52:10.373152Z","shell.execute_reply.started":"2023-11-20T20:52:09.079393Z","shell.execute_reply":"2023-11-20T20:52:10.3719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"min_fold=blabla[\"Number of Folds\"].min()\nmin_fold\nprint(\"On a l'érreur moyenne minimale lorsqu'on choisit un cv de\",min_fold)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:10.374202Z","iopub.execute_input":"2023-11-20T20:52:10.374473Z","iopub.status.idle":"2023-11-20T20:52:10.380519Z","shell.execute_reply.started":"2023-11-20T20:52:10.374446Z","shell.execute_reply":"2023-11-20T20:52:10.379201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 6))\nplt.plot(cv_range, errors, marker='o', linestyle='-')\nplt.title('Mean Error Plot')\nplt.xlabel('Number of Folds')\nplt.ylabel('Errors')\nplt.grid(True)\n\nplt.xticks(cv_range)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:10.381569Z","iopub.execute_input":"2023-11-20T20:52:10.382357Z","iopub.status.idle":"2023-11-20T20:52:10.649059Z","shell.execute_reply.started":"2023-11-20T20:52:10.382286Z","shell.execute_reply":"2023-11-20T20:52:10.647766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Détermination de la meilleur profondeur à prendre pour l'arbre de décision ","metadata":{}},{"cell_type":"code","source":"cv = KFold(n_splits=min_fold)\ndepth_range = range(1, 11)  \n\nerrors = []\n\n# Boucle sur les différentes profondeurs\nfor depth in depth_range:\n    fold_accuracy = []\n    tree_model = DecisionTreeClassifier(max_depth=depth)\n    \n    for train_fold, valid_fold in cv.split(X):\n        X_train_fold, X_valid_fold = X.iloc[train_fold], X.iloc[valid_fold]\n        y_train_fold, y_valid_fold = Y.iloc[train_fold], Y.iloc[valid_fold]\n\n        model = tree_model.fit(X=X_train_fold, y=y_train_fold)\n        valid_acc = model.score(X=X_valid_fold, y=y_valid_fold)\n        fold_accuracy.append(1-valid_acc)\n\n    avg = sum(fold_accuracy) / len(fold_accuracy)\n    errors.append(avg)\n\n# Création d'un DataFrame pour afficher les résultats\ndf = pd.DataFrame({\"max_depth\": depth_range, \"Erreur\": errors})\nprint(df.to_string(index=False))\nprof=df[df['Erreur'] == df['Erreur'].min()]\nminprof=prof[\"max_depth\"].min()\nminprof","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:10.650344Z","iopub.execute_input":"2023-11-20T20:52:10.650658Z","iopub.status.idle":"2023-11-20T20:52:11.760911Z","shell.execute_reply.started":"2023-11-20T20:52:10.650633Z","shell.execute_reply":"2023-11-20T20:52:11.759811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Réprésentation graphique pour trouver la meilleure profondeur","metadata":{}},{"cell_type":"code","source":"#ce plot permet d'afficher le meilleur score en fonction du depth_range\n\nplt.figure(figsize=(10, 6))\nplt.plot(depth_range, errors, marker='o', linestyle='-')\nplt.title('precision plot')\nplt.xlabel('depth_range')\nplt.ylabel('errors')\nplt.grid(True)\nplt.show()\n\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:11.762198Z","iopub.execute_input":"2023-11-20T20:52:11.762501Z","iopub.status.idle":"2023-11-20T20:52:11.991154Z","shell.execute_reply.started":"2023-11-20T20:52:11.762475Z","shell.execute_reply":"2023-11-20T20:52:11.989931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"On obtient une profondeur max de\", 3 ,\"qui correspond au nombre de niveau sur lequel l'arbre s'étend pour avoir la meilleur représentation\")","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:11.992682Z","iopub.execute_input":"2023-11-20T20:52:11.993033Z","iopub.status.idle":"2023-11-20T20:52:11.998939Z","shell.execute_reply.started":"2023-11-20T20:52:11.993005Z","shell.execute_reply":"2023-11-20T20:52:11.99776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dt_model = DecisionTreeClassifier(max_depth=minprof)\ndt_model.fit(x_train, y_train)\nplt.figure(figsize=(14, 8))\n\nfig = plt.figure(figsize=(14,8))\ntree.plot_tree(dt_model,filled=True,feature_names=cols,class_names=['Not PCOS','PCOS'])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:12.000252Z","iopub.execute_input":"2023-11-20T20:52:12.000493Z","iopub.status.idle":"2023-11-20T20:52:12.345125Z","shell.execute_reply.started":"2023-11-20T20:52:12.000471Z","shell.execute_reply":"2023-11-20T20:52:12.344146Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dt_model.score(x_test,y_test)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:12.346404Z","iopub.execute_input":"2023-11-20T20:52:12.346662Z","iopub.status.idle":"2023-11-20T20:52:12.355403Z","shell.execute_reply.started":"2023-11-20T20:52:12.34664Z","shell.execute_reply":"2023-11-20T20:52:12.354478Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Avec l'arbre de décision, nous obtenons un très bon score de 0,88.\nVoici une interprétation de l'arbre pour le PCOS :\n- J'ai un taux de PRG supérieur à 11,5 ng/mL (niveau 1)\n- J'ai un taux de FSH inférieur ou égal 113 mIU/mL (niveau 2)\n- J'ai un rythme respiratoire inférieur ou égal à 0,5 (niveau 3)\n\nAlors j'ai PCOS.\n","metadata":{}},{"cell_type":"markdown","source":"#### Erreur sur l'arbre de décision","metadata":{}},{"cell_type":"code","source":"#Risque quadratique\nmse_scores = cross_val_score(dt, X, Y, cv=min_fold, scoring='neg_mean_squared_error')\nnp.mean(mse_scores*mse_scores)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:12.35713Z","iopub.execute_input":"2023-11-20T20:52:12.357615Z","iopub.status.idle":"2023-11-20T20:52:12.475394Z","shell.execute_reply.started":"2023-11-20T20:52:12.35759Z","shell.execute_reply":"2023-11-20T20:52:12.474163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Le risque quadratique tourne autour de zéro, cela signifie que notre modèle est bien construit.","metadata":{}},{"cell_type":"markdown","source":"## CrossValidation : KNN","metadata":{}},{"cell_type":"code","source":"scaler = StandardScaler()\nx_train = scaler.fit_transform(x_train)\nx_test = scaler.transform(x_test)\nbest_accuracy = 0\nbest_metric = ''\ndistances = ['euclidean', 'manhattan', 'chebyshev', 'minkowski','hamming']  # Ajoutez d'autres distances au besoin\nk=5\nfor distance_metric in distances:\n    # Création et entraînement du modèle k-NN avec la distance actuelle\n    knn_model = KNeighborsClassifier(n_neighbors=k, metric=distance_metric)\n    knn_model.fit(x_train, y_train)\n    # Prédictions sur l'ensemble de test\n    y_pred = knn_model.predict(x_test)\n\n    # Évaluation des performances du modèle\n    accuracy = accuracy_score(y_test, y_pred)\n\n    # Si la précision actuelle est meilleure que la précédente, la mettre à jour\n    if accuracy > best_accuracy:\n        best_accuracy = accuracy\n        best_metric = distance_metric\n\n\nprint(\"Meilleure distance :\", best_metric)\nprint(\"Meilleure précision (accuracy) :\", best_accuracy)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:12.477161Z","iopub.execute_input":"2023-11-20T20:52:12.477454Z","iopub.status.idle":"2023-11-20T20:52:12.569255Z","shell.execute_reply.started":"2023-11-20T20:52:12.477431Z","shell.execute_reply":"2023-11-20T20:52:12.568063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_error_rate(x_train, y_train, x_test, y_test, max_k=32):\n    taux_erreurs = []\n\n    for k in range(1, max_k + 1):\n        modele = KNeighborsClassifier(n_neighbors=k, metric='hamming')\n        modele.fit(x_train, y_train)\n        Y_test_pred = modele.predict(x_test)\n        taux_erreur = 1 - accuracy_score(y_test, Y_test_pred)\n        taux_erreurs.append(taux_erreur)\n\n    plt.figure(figsize=(10, 6))\n    plt.plot(range(1, max_k + 1), taux_erreurs, marker='o', linestyle='-', color='b', label='Taux d Erreur')\n\n    # Axes et titre\n    plt.xlabel('Nombre de voisins (k)', fontsize=12)\n    plt.ylabel(\"Taux d'Erreur\", fontsize=12)\n    plt.title(\"Taux d'Erreur en fonction du Nombre de Voisins (k)\", fontsize=14)\n    plt.grid(True, linestyle='--', alpha=0.6)\n    plt.legend(loc='best', fontsize=12)\n\n    plt.xticks(range(1, max_k + 1), fontsize=10)\n    plt.yticks(fontsize=10)\n\n    plt.show()\n\n\n    # Trouve le meilleur choix pour k (taux d'erreur le plus bas)\n    meilleur_k= np.argmin(taux_erreurs) + 1\n    meilleur_taux_erreur = taux_erreurs[meilleur_k - 1]\n    print(f'Meilleur choix pour k : {meilleur_k}')\n    print(f\"Taux d'Erreur Minimum : {meilleur_taux_erreur:.4f}\")\n    \nplot_error_rate(x_train, y_train, x_test, y_test, max_k=32)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:12.570612Z","iopub.execute_input":"2023-11-20T20:52:12.571058Z","iopub.status.idle":"2023-11-20T20:52:13.14166Z","shell.execute_reply.started":"2023-11-20T20:52:12.571012Z","shell.execute_reply":"2023-11-20T20:52:13.139354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def knn_mk(x_train, y_train, x_test, y_test, max_k=32):\n    taux_erreurs = []\n\n    for k in range(1, max_k + 1):\n        modele = KNeighborsClassifier(n_neighbors=k, metric='hamming')\n        modele.fit(x_train, y_train)\n        Y_test_pred = modele.predict(x_test)\n        taux_erreur = 1 - accuracy_score(y_test, Y_test_pred)\n        taux_erreurs.append(taux_erreur)\n\n\n    # Trouve le meilleur choix pour k (taux d'erreur le plus bas)\n    meilleur_k= np.argmin(taux_erreurs) + 1\n    meilleur_taux_erreur = taux_erreurs[meilleur_k - 1]\n    return(meilleur_k)\n    print(f'Meilleur choix pour k : {meilleur_k}')\n    print(f\"Taux d'Erreur Minimum : {meilleur_taux_erreur:.4f}\")\n    \nknn_mk(x_train, y_train, x_test, y_test, max_k=32)\n\nmk=knn_mk(x_train, y_train, x_test, y_test, max_k=32)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:13.143191Z","iopub.execute_input":"2023-11-20T20:52:13.143837Z","iopub.status.idle":"2023-11-20T20:52:13.59451Z","shell.execute_reply.started":"2023-11-20T20:52:13.143738Z","shell.execute_reply":"2023-11-20T20:52:13.593254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = resampled_data[mots]\nY = list(resampled_data[\"PCOS(Y/N)\"])\nY = pd.Series(Y)\n\ncv_range = range(2, 10)\n\nerrors = []\n\nknn_fonction = KNeighborsClassifier(n_neighbors=mk, metric=best_metric)\n\n\nfor cv in cv_range:\n    fold_errors = []\n\n    kf = KFold(n_splits=cv, shuffle=True, random_state=42)  # Added shuffle and random_state for reproducibility\n\n    for train_fold, valid_fold in kf.split(X):\n        X_train_fold, X_valid_fold = X.iloc[train_fold], X.iloc[valid_fold]\n        y_train_fold, y_valid_fold = Y.iloc[train_fold], Y.iloc[valid_fold]\n\n        model = knn_fonction.fit(X=X_train_fold, y=y_train_fold)\n        valid_acc = model.score(X=X_valid_fold, y=y_valid_fold)\n        fold_errors.append(1 - valid_acc)\n\n    avg_error = sum(fold_errors) / len(fold_errors)\n    errors.append(avg_error)\n\ndf = pd.DataFrame({\"Number of Folds\": cv_range, \"Error\": errors})\nmin_error_row = df[df['Error'] == df['Error'].min()]\n\nbest_cv = min_error_row['Number of Folds'].values[0]\n\nprint(\"Optimal number of folds for KNN:\", best_cv)\n","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:13.595937Z","iopub.execute_input":"2023-11-20T20:52:13.596221Z","iopub.status.idle":"2023-11-20T20:52:14.065704Z","shell.execute_reply.started":"2023-11-20T20:52:13.596197Z","shell.execute_reply":"2023-11-20T20:52:14.064539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Risque quadratique pour KNN\nmse_scores = cross_val_score(knn_fonction, X, Y, cv=min_fold, scoring='neg_mean_squared_error')\nnp.mean(mse_scores*mse_scores)","metadata":{"execution":{"iopub.status.busy":"2023-11-20T20:52:14.067419Z","iopub.execute_input":"2023-11-20T20:52:14.067823Z","iopub.status.idle":"2023-11-20T20:52:14.227054Z","shell.execute_reply.started":"2023-11-20T20:52:14.067791Z","shell.execute_reply":"2023-11-20T20:52:14.225535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Le risque quadratique pour le modèle KNN est très proche de zéro, donc on peut dire que le modèle est bien construit.","metadata":{}},{"cell_type":"markdown","source":"## Conclusion\nAprès avoir tester les trois différents modèles,on a l'inégalité suivante:\n\n**MSE(Logistic Regression)<MSE(Arbre de Décision)<MSE(KNN)**\n\nDonc le meilleur modèle ici, qui minimise les erreurs est le modèle de regression logistique","metadata":{}}]}