<jupyter_start><jupyter_text>Data Mining & Machine Learning for analysing misdemeanours and crimes recorded by the french police and gendarmerie since 1996 **Auteur** : *<NAME>* **Temps de réalisation** :Sur temps libre entre Février - Juillet 2020 **Objectif / Aim** : Dans un premier temps, exploiter des données gouvernementales afin de montrer des tendances, et/ou des évolutions potentielles concernant les crimes et les délits en France. Dans un second temps, développer plusieurs algorithmes d'apprentissage automatique de manière empirique pour prévoir l'apparition des crimes et délits en France. Table des matières[1. Préparation des données pour l'analyse](section1)&emsp; [1.1. Importations des outils](section1.1) &emsp; [1.2. Importations du Jeu de donnée](section1.2) &emsp; [1.3. Transposition des données](section1.3) &emsp; [1.4. Gestion multiple des feuilles](section1.4) &emsp; [1.5. Récupération du champ date](section1.5) &emsp; [1.6. Fixation des types de données](section1.6) &emsp; [1.7. Colonnes inutilisées](section1.7) [2. Analyse macro du jeu de données](section2) &emsp; [2.1. Description élémentaire](section2.1) &emsp; [2.2. Crimes et délit par département](section2.2) &emsp; [2.3. Analyse focalisée](section2.3)  0. PréambuleAprès avoir visionné plusieurs vidéos ([première](https://youtu.be/RBQ-IoHfimQ "Partie 1 : Attention la vidéo peut choquer"), [deuxième](https://youtu.be/nKDgFCojiT8 "Partie 2 : Attention la vidéo peut choquer")) concernant la crise des migrants en Europe, j'ai pris conscience que le monde dans lequel nous vivions pouvait très rapidement évoluer. Pire, en essayant de chercher à comprendre ce phénomène et de trouver des causes et des raisons, j'ai rapidement compris qu'un individu comme moi était incapable de pouvoir arranger les choses.Étant une personne appréciant une vie stable, j'ai essayé de déterminer si "cela" pouvait un jour m'arriver. Puis en prenant du recul sur cette situation, une question m'est survenue : **suis je en danger là où j'habite ?** Afin d'apporter des éléments de réponses concrètes, j'ai essayé de chercher quels pouvaient être les facteurs pouvant me mener à une situation ou à un environnement dangereux. Mais avant cela, il m'a fallu comprendre et définir comment évaluer des danger. Dans ce travail, je le définis comme tout acte humain volontaire mettant en péril la sureté (ou stabilité) et pouvant entrainer ou exposer mes proches, mon entourage, à des conséquences préjudiciables.Pour factuellement déterminer ce "danger", j'ai réfléchi à comment mesurer les actes nuisibles à mon échelle et la réponse a été simple : en analysant les crimes et les délits enregistrés dans mon pays.  1. Préparation des données pour l'analyse / Preparing the data for analysisSource : - [Estimation de la population INSEE](https://www.insee.fr/fr/statistiques/1893198)([Document source](https://www.insee.fr/fr/statistiques/fichier/1893198/estim-pop-dep-sexe-gca-1975-2020.xls))- [Crimes et délits enregistrés en France](https://www.data.gouv.fr/fr/datasets/chiffres-departementaux-mensuels-relatifs-aux-crimes-et-delits-enregistres-par-les-services-de-police-et-de-gendarmerie-depuis-janvier-1996/)([Document source](https://www.data.gouv.fr/fr/datasets/r/fdf5afbf-ed3c-4c54-a4f0-3581c8a1eca4)) *1.1. Importation des outils / Tools import*<jupyter_code>import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set(color_codes=True)<jupyter_output><empty_output><jupyter_text>*1.2. Importation du Jeu de donnée / DataSet import*<jupyter_code>### Generique variables definition to import
source = 'source/'
xl_misdemeanours_crimes_path = source + 'tableaux-4001-ts.xlsx'
xl_population_path = source + 'estim-pop-dep-sexe-gca-1975-2020.xls'

### Excel file import
crime_xl_data = pd.ExcelFile(xl_misdemeanours_crimes_path)
population_xl_data = pd.ExcelFile(xl_population_path)

### Get a look on sheet pages in the excel
print(crime_xl_data.sheet_names)<jupyter_output>['France_Entière', 'France_Métro', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2A', '2B', '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', '971', '972', '973', '974', '975', '976', '977', '978', '986', '987', '988']<jupyter_text>Le jeu de donnée est composé de plusieurs pages qui peuvent être traitées de manière indépendante. Nous allons nous focaliser sur la feuille "France métropolitaine".<jupyter_code># Define France metropolitaine
current_sheet = crime_xl_data.sheet_names[1]

# Read one sheet to begin ('France_Métro') --> libellée index to write minus two lines
df = pd.read_excel(crime_xl_data, current_sheet, index_col = 'libellé index')

# Examine the head of the DataFrame
df.head(3)<jupyter_output><empty_output><jupyter_text>Le jeu de donnée possède des données temporelles en tant que dimensions. Afin de rendre les variables plus exploitables, nous allons opérer à une transformation de transposition. De plus afin de pouvoir faciliter la visualisation de nos prochains graphiques, nous allons aussi en profiter pour dissocier le champ date en années et mois et réindexer le jeu de donnée. *1.3. Transposition des données  / Transpose Data and get date values*<jupyter_code># Drop init 'index' columns, and Transpose Data
df = df.drop(columns=['Index'])
df = df.T
df.head()<jupyter_output><empty_output><jupyter_text>Une fois les données transposées, nous pouvons facilement nous rendre compte que nous avons un problème de typage concernant l'index. Elle n'est pas considérée comme un type datetime. Corrigeons cela. Il va aussi falloir tenir compte du document original et des multiples pages. *1.4. Gestion multiples des feuilles xl crime*<jupyter_code>df_all = pd.DataFrame(columns=df.columns.values)
df_all['departement'] = np.nan

all_name_sheet = crime_xl_data.sheet_names
invalid_sheet = ['France_Entière','France_Métro']
all_name_sheet = [e for e in all_name_sheet if e not in invalid_sheet]

for i in all_name_sheet:
    df_tmp = pd.read_excel(crime_xl_data, sheet_name=str(i), index_col = 'libellé index')
    df_tmp = df_tmp.drop(columns=['Index'])
    df_tmp = df_tmp.T
    df_tmp['departement'] = str(i)
    df_all = df_all.append(df_tmp)

df_all.departement = df_all.departement.astype(str)
df_all.head()<jupyter_output><empty_output><jupyter_text>*1.5. Récupération du champ date*Mettons à jour l'index du jeu de donnée pour qu'il puisse correspondre au type Datetime. Cela permettra de faciliter sa visualisation plus tard. *1.5.1. Sur une feuille*<jupyter_code># Sur le jeu de donnée France métropolitaine
# Reset index, Get Year, Get Month
df = df.reset_index()
df['year'] = df['index'].astype(str).str[0:4]
df['month'] = df['index'].astype(str).str[5:7]

# Define new date column
combined = df.year.str.cat(df.month,sep=' ')
df['date'] = pd.to_datetime(combined)

# Drop 'index' column and set new index on date
df = df.drop(columns='index')
df = df.set_index('date')

df.head()<jupyter_output><empty_output><jupyter_text>*1.5.2. Sur toutes les feuilles*<jupyter_code># Sur le jeu de donnée complet
# Reset index, Get Year, Get Month
df_all = df_all.reset_index()
df_all['year'] = df_all['index'].astype(str).str[0:4]
df_all['month'] = df_all['index'].astype(str).str[5:7]

# Define new date column
combined = df_all.year.str.cat(df_all.month,sep=' ')
df_all['date'] = pd.to_datetime(combined)

# Drop 'index' column and set new index on date
df_all = df_all.drop(columns='index')
df_all = df_all.set_index('date')

df_all.head()<jupyter_output><empty_output><jupyter_text>Le champ date est maintenant l'index. Voyons maintenant les types de données.  *1.6. Fixation des types de données / Fixing a data type*Regardons si plusieurs colonnes ne possèderaient pas un typage non conventionnel ou potentiellement inapproprié pour notre analyse.<jupyter_code>df.dtypes.values
df.dtypes<jupyter_output><empty_output><jupyter_text>Fixons les types des champs 'year' et 'month'<jupyter_code>df.year = df.year.astype(str).astype(int)
df.month = df.month.astype(str)<jupyter_output><empty_output><jupyter_text>En regardant de plus près, nous pouvons constater que plusieurs colonnes se nomment 'index non utilisé', penchons-nous dessus. *1.7. Colonnes inutilisées*<jupyter_code># Define names of index and columns
df.index.names = ['index']
df.columns.names = ['libellé columns']

df['Index non utilisé'].sum()<jupyter_output><empty_output><jupyter_text>En visualisant ces résultats, nous pouvons constater que ces dimensions nommées 'Index non utilisé' ne représentent pas une grande quantité d'information. Aussi nous n'allons pas en tenir compte.<jupyter_code>print(df.shape)
df_all = df_all.drop(columns='Index non utilisé')
df = df.drop(columns='Index non utilisé')
print(df.shape)<jupyter_output>(289, 109)
(289, 105)
StarcoderdataJupyterStructuredCleanDedup