#!/usr/bin/env python # coding: utf-8 # ![title](https://i.ytimg.com/vi/Cgu5y-6VWfo/maxresdefault.jpg) # # On va nous déménager: un cas d’intelligence de localisation pour compare locations entre Paris, Lyon et Marseille # #
Roque Leal
# # Déménager dans une autre ville est toujours excitant mais implique également de nombreuses décisions. L'une des plus grandes décisions est: où dois-je vivre? # Le quartier dans lequel vous vivez peut avoir un impact considérable sur votre première impression de la nouvelle ville, sans oublier que c'est une décision que vous DEVEZ prendre avant de déménager! # Certaines personnes vivaient dans des endroits très fréquentés et aimeraient changer de rythme lorsqu'elles bougent. D'autres voudraient la même énergie qu'ils vivaient dans leur vieille ville! Ce projet vise à comparer certains quartiers entre deux villes et à voir quelles zones sont similaires et lesquelles pourraient être complètement opposées. # # Après quelques recherches de quartier, nous comparerons le quartier à déménager dans Paris, Lyon oú Marselle. # # Les données que nous utiliserons seront des données de lieu de Foursquare. Les lieux que nous rassemblerons concerneront de nombreuses choses qu'une personne rechercherait lorsqu'elle vivrait, par exemple: # - Épiceries # - Abordabilité de ces lieux # - Restaurants # - Centres commerciaux # ...et plus! # # Voyons voir si nous pouvons les aider à décider. # In[5]: import numpy as np import pandas as pd pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) import json from geopy.geocoders import Nominatim # latitude/longitude converter import requests from pandas.io.json import json_normalize #json files to pandas dataframe import matplotlib.cm as cm import matplotlib.colors as colors import folium print('Bibliothèques importées.') # ### Configurer l'API´s # In[1]: CLIENT_ID = 'xxxxxx' CLIENT_SECRET = 'xxxxxx' VERSION = 'xxxxxx' print('Client ID: ' + CLIENT_ID) print('Client Secret: ' + CLIENT_SECRET) print('Version: '+ VERSION) # # Méthodologie # ### Adresse Principale: importez à Paris les données de l'API Foursquare et créez DataFrame # In[6]: c_address = '13 Rue de Poissy, 75005 Paris, Francia' c_geolocator = Nominatim(user_agent='foursquare_agent') c_location = c_geolocator.geocode(c_address) c_latitude = c_location.latitude c_longitude = c_location.longitude print('13 Rue de Poissy, 75005 Paris, Francia, coordinates: ', c_latitude, c_longitude) # In[8]: radius = 500 LIMIT = 100000 c_url = 'xxxxxx'.format( CLIENT_ID, CLIENT_SECRET, c_latitude, c_longitude, VERSION, radius, LIMIT ) print(c_url) # In[95]: results = requests.get(c_url).json() # In[96]: def get_category_type(row): try: category_list = row['categories'] except: category_list = row['venue.categories'] if len(category_list) == 0: return None else: return category_list[0]['name'] # In[97]: venues = results['response']['groups'][0]['items'] nearby_venues = json_normalize(venues) #flattens JSON filtered_columns = ['venue.name', 'venue.id', 'venue.categories', 'venue.location.lat', 'venue.location.lng'] nearby_venues = nearby_venues.loc[:, filtered_columns] nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis = 1) # In[98]: nearby_venues.head(10) # In[99]: nearby_venues.info() # 94 "venues" sont revenus dans les résultats du 13 rue de Poissy. # Juste en regardant quelques endroits sur la liste, nous pouvons voir qu'il y a pas mal de variations. # In[100]: nearby_venues.columns = [col.split('.')[-1] for col in nearby_venues.columns] # In[101]: nearby_venues_map = nearby_venues[0:51] # In[146]: tileset = r'xxxxxx' attribution = (r'Map data © OpenStreetMap' ' contributors, Imagery © MapBox') wp_venues_map = folium.Map(location=[c_latitude, c_longitude], zoom_start=16, tiles=tileset, attr=attribution) #red marker added for main location folium.CircleMarker( [c_latitude,c_longitude], radius=10, color='red', popup='Adresse principale', fill=True, fill_color= 'red', fill_opacity = 0.6 ).add_to(wp_venues_map) #blue markers for search results for lat, lng, label in zip(nearby_venues_map.lat, nearby_venues_map.lng, nearby_venues_map.categories): folium.CircleMarker( [lat, lng], radius = 5, color='blue', popup=label, fill=True, fill_color='blue', fill_opacity=0.6 ).add_to(wp_venues_map) wp_venues_map # ### Découverte de l'adresseur principal: 13 Rue de Poissy, 75005 Paris # In[105]: nearby_venues.count() # Il y a 94 venues dans un rayon de 500 mètres du centre de 13 Rue de Poissy, 75005 Paris. # In[106]: wp_unique = nearby_venues['categories'].unique() nearby_venues['categories'].nunique() # Il existe 44 types de lieux différents dans le quartier. # In[107]: top_categories = nearby_venues.groupby('categories').count()['name'].sort_values(ascending=False).head(10) top_categories # La catégorie avec le plus de lieux autour sont les French Restaurants, suivie par les Cafés. # ### 13 Rue de Poissy, tarifs et likes # Jetons un coup d'œil à 15 venues sites et à son prix et likes avoir pour une idée del quartier. # In[127]: def get_venue_info(dataframe_col): venue_info = [] for venue_id in dataframe_col[0:15]: v_url = 'https://api.foursquare.com/v2/venues/{}?client_id={}&client_secret={}&v={}'.format(venue_id, CLIENT_ID, CLIENT_SECRET, VERSION) v_results = requests.get(v_url).json() try: venue_name = v_results['response']['venue']['name'] except: venue_name = 'Not Available' try: venue_price = v_results['response']['venue']['price'] except: venue_price = 'Not Available' try: venue_likes = v_results['response']['venue']['likes']['count'] except: venue_likes = 'Not Available' venue_info.append([venue_name, venue_price, venue_likes]) return venue_info # In[132]: paris_venue_info = get_venue_info(nearby_venues['id']) print(wicker_venue_info) # In[133]: paris_df = pd.DataFrame(wicker_venue_info, columns=['name', 'price_tier', 'likes']) paris_df # In[135]: def get_price_tier(df): price_tier = df['price_tier'] if len(price_tier) == 0: return None elif price_tier == 'Not Available': return None else: return price_tier['message'] # In[136]: paris_df['price_tier'] = wicker_df.apply(get_price_tier, axis=1) # In[137]: paris_df.sort_values('likes', ascending=False) # De ces 15 "venues", il semblerait que le prix moyen d'un magasin autour du 13 rue de Poissy soit dans la fourchette modérée-bon marché. Sur les 15, quatre seulement sont considérés comme chers. Le nombre de «Likes» pour ces lieux n'est pas trop faible, ce qui suggère qu'ils ne sont pas mal notés non plus. # ### Importer les données de localisation de Lyon depuis l'API Foursquare # In[13]: qa_address = '6 Rue Gasparin, 69002 Lyon, France' qa_geolocator = Nominatim(user_agent='foursquare_agent') qa_location = qa_geolocator.geocode(qa_address) qa_lat = qa_location.latitude qa_lng = qa_location.longitude print('6 Rue Gasparin, 69002 Lyon, France: ', qa_lat, qa_lng) # In[14]: qa_url = 'xxxxxx'.format( CLIENT_ID, CLIENT_SECRET, qa_lat, qa_lng, VERSION, radius, LIMIT ) print(qa_url) # In[141]: qa_results = requests.get(qa_url).json() # In[142]: qa_venues = qa_results['response']['groups'][0]['items'] qa_nearby_venues = json_normalize(qa_venues) qa_nearby_venues = qa_nearby_venues.loc[:, filtered_columns] # In[143]: qa_nearby_venues['venue.categories'] = qa_nearby_venues.apply(get_category_type, axis=1) qa_nearby_venues.columns = [col.split('.')[-1] for col in qa_nearby_venues.columns] qa_nearby_venues.head(10) # In[144]: qa_nearby_venues.info() # 65 "venues" sont revenus dans les résultats du Rue Gasparin, 69002 Lyon. # In[204]: qa_venues_map = folium.Map(location=[qa_lat, qa_lng], zoom_start=16, tiles=tileset, attr=attribution) folium.CircleMarker( [qa_lat,qa_lng], radius=10, color='red', popup='Rue Gasparin', fill=True, fill_color= 'red', fill_opacity = 0.6 ).add_to(qa_venues_map) for lat, lng, label in zip(qa_nearby_venues.lat, qa_nearby_venues.lng, qa_nearby_venues.categories): folium.CircleMarker( [lat, lng], radius = 5, color='blue', popup=label, fill=True, fill_color='blue', fill_opacity=0.6 ).add_to(qa_venues_map) qa_venues_map # ### Explorer le quartier # In[149]: qa_unique = qa_nearby_venues['categories'].unique() qa_nearby_venues['categories'].nunique() # Rue Gasparin dispose de 39 types de "venues" différents. # In[150]: qa_wp_same = [] qa_has = [] for x in qa_unique: if x in wp_unique: qa_wp_same.append(x) else: qa_has.append(x) print('Emplacement en Lyon et Emplacement en Paris: ', '\n', qa_wp_same) print('\n') print('Emplacement en Lyon: ', '\n', qa_has) wp_has = [] for x in wp_unique: if x in qa_unique: continue else: wp_has.append(x) print('\n') print('Emplacement en Paris: ', '\n', wp_has) # Ci-dessus, nous pouvons voir qu'il y a beaucoup plus de types de "venues" différents dans le quartier en Paris que dans Lyon. Cela suggère qu'il y a plus de variété à Paris qu'à Lyon. # In[151]: qa_nearby_venues.groupby('categories').count()['name'].sort_values(ascending=False).head(10) # Les catégories de "venues" sont énumérées la plus fréquente à la liste. Nous listons ici le top 10. # ### Rue Gasparin, 69002 Lyon, tarifs et likes # Jetons un coup d'œil à 15 venues sites et à son prix et likes avoir pour une idée del quartier. # In[152]: qa_venue_info = get_venue_info(qa_nearby_venues['id']) # In[153]: qa_venue_info # In[154]: qa_df = pd.DataFrame(qa_venue_info, columns=['name', 'price_tier', 'likes']) qa_df # In[155]: qa_df['price_tier'] = qa_df.apply(get_price_tier, axis=1) qa_df.sort_values('likes', ascending=False) # Il semble que ce quartier de Lyon soit plus attractif pour les touristes, cependant il a des locaux plus chers par rapport à Paris # ### Importer les données de localisation de Marseille depuis l'API Foursquare # In[11]: address = '2 Rue du Chevalier Roze 13002 Marseille, France' ch_geolocator = Nominatim(user_agent='foursquare_agent') ch_location = ch_geolocator.geocode(address) ch_lat = ch_location.latitude ch_lng = ch_location.longitude print('2 Rue du Chevalier Roze 13002 Marseille, France: ', ch_lat, ch_lng) # In[12]: ch_url = 'xxxxxx'.format( CLIENT_ID, CLIENT_SECRET, ch_lat, ch_lng, VERSION, radius, LIMIT ) print(ch_url) # In[192]: ch_results = requests.get(ch_url).json() # In[193]: ch_venues = ch_results['response']['groups'][0]['items'] ch_nearby_venues = json_normalize(ch_venues) ch_nearby_venues = ch_nearby_venues.loc[:,filtered_columns] ch_nearby_venues.head() # In[194]: ch_nearby_venues['venue.categories'] = ch_nearby_venues.apply(get_category_type,axis = 1) ch_nearby_venues.columns = [col.split('.')[-1] for col in ch_nearby_venues.columns] ch_nearby_venues.head(10) # In[195]: ch_nearby_venues.info() # 83 "venues" sont revenus dans les résultats du 2 Rue du Chevalier Roze 13002 Marseille. # In[196]: ch_nearby_venues_map = ch_nearby_venues[0:10] # In[205]: ch_venues_map = folium.Map(location=[ch_lat, ch_lng], zoom_start=17, tiles=tileset, attr=attribution) #red marker added for main location folium.CircleMarker( [ch_lat,ch_lng], radius=10, color='red', popup='2 Rue du Chevalier Roze 13002 Marseille, France', fill=True, fill_color= 'red', fill_opacity = 0.6 ).add_to(ch_venues_map) #blue markers for search results for lat, lng, label in zip(ch_nearby_venues_map.lat, ch_nearby_venues_map.lng, ch_nearby_venues_map.categories): folium.CircleMarker( [lat, lng], radius = 5, color='blue', popup=label, fill=True, fill_color='blue', fill_opacity=0.6 ).add_to(ch_venues_map) ch_venues_map # ### Explorer le quartier # In[199]: ch_unique = ch_nearby_venues['categories'].unique() ch_nearby_venues['categories'].nunique() # Il y a 46 types uniques de lieux autour du Rue Lulli 13001 Marseille. # In[200]: ch_wp_same = [] ch_has = [] for x in ch_unique: if x in wp_unique: ch_wp_same.append(x) else: ch_has.append(x) print('Emplacement en Marseille et Emplacement en Paris: ', '\n', ch_wp_same) print('\n') print('Emplacement en Marseille: ', '\n', ch_has) wp_has = [] for x in wp_unique: if x in ch_unique: continue else: wp_has.append(x) print('\n') print('Emplacement en Paris: ', '\n', wp_has) # Marseille a similar variété de "venues" que Paris. # In[206]: ch_nearby_venues.groupby('categories').count()['name'].sort_values(ascending=False).head(10) # ### 2 Rue du Chevalier Roze 13002 Marseille, tarifs et likes # Jetons un coup d'œil aux informations sur du quartier # In[201]: ch_venue_info = get_venue_info(ch_nearby_venues['id']) # In[202]: ch_venue_info # In[203]: ch_df = pd.DataFrame(ch_venue_info, columns=['name', 'price_tier', 'likes']) ch_df['price_tier'] = ch_df.apply(get_price_tier, axis=1) ch_df.sort_values('likes', ascending=False) # On dirait que Lyon a des restaurants beaucoup plus chers. # # Résultats # ##### Échelle des prix # # Sur la base de l'analyse, il semblerait que Marseille ait une gamme de prix plus proche de Paris que de Lyon. Cependant, en raison du nombre limité d'appels premium par jour, il est possible que les restaurants chers à Lyon aient simplement été manqués. Lyon avait également plus de sites qui n'ont pas de niveau de prix étiqueté, ce qui rend également la comparaison plus difficile. aussi les nouveaux sites (lyon et marseille) ont moins de restaurants que Paris. # ##### Popularity # # Les lieux de Lyon ont beaucoup plus de likes que Paris ou Marseille. Cela signifie que Lyon pourrait être une zone plus fréquentée avec plus de trafic piétonnier. Ou les gens sont très enthousiaste dans ce domaine. # # Discussion # Après l'anaylsis, il semblerait que Lyon soit le meilleur choix pour quelqu'un qui cherche une expérience plus similaire à Paris. C'est un peu plus cher, mais cela fournira également un style de vie divertissant. # # Marseille semble plus calme et tranquille. Ce serait un bon choix pour quelqu'un qui voudrait changer ce qu'il a obtenu à Paris. # # Références # The Battle of Neighborhoods: Coursera Capstone Project # # Geopy Geocoders # # Foursquare API # # MapBox Location Data Visualization library for Jupyter Notebooks # ## 👍👍
Partagez vos idées et vos commentaires, écrivez-moi 🌍
##