[Python] Je veux être une personne gourmande [Approche basée sur les données] Choisir un magasin pour les fêtes de fin d'année et du Nouvel An

1. Motivation

** "Utilisez le grattage pour trouver un restaurant délicieux et puissant quel que soit le score du journal de consommation! 』**

En tant qu'indice reflétant la voix des utilisateurs, le système est tel que le score augmente à mesure que des évaluations plus élevées sont collectées auprès des utilisateurs qui ont une influence. Par exemple, si le degré d'influence est le même, un magasin avec 100 évaluations à 5 points obtiendra un score plus élevé qu'un magasin avec seulement 2 évaluations à 5 points.

2. Code implémenté

Code pour obtenir des informations de manger le journal en Python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup
import math
import time

root_url = 'https://tabelog.com/'
res = requests.get(root_url)
soup = BeautifulSoup(res.content, 'html.parser')
a = soup.find_all('a', class_='rsttop-area-search__target js-area-swicher-target')

area_url = {}
for area in a:
    area_dict = {}
    splitted = area.get('data-swicher-area-list').split('"')
    for i in range(int((len(splitted)-1)/8)):
        area_dict[splitted[i*8+3]] = splitted[i*8+7]
    area_url[area.get('data-swicher-city').split('"')[3]] = area_dict

visit_areas = ['Shibuya / Ebisu / Daikanyama']
url_dict = {}
for visit_area in visit_areas:
    url = area_url['Tokyo'][visit_area]
    time.sleep(1)
    res = requests.get(root_url + url[1:])
    soup = BeautifulSoup(res.content, 'html.parser')
    a = soup.find_all('a', class_='c-link-arrow')
    for area in a:
        href = area['href']
        if href[-21:-8]!=url:
            continue
        else:
            url_dict[area.text] = href

max_page = 20
restaurant_data = []
for area, url in url_dict.items():
    time.sleep(1)
    res_area = requests.get(url)
    soup_area = BeautifulSoup(res_area.content, 'html.parser')
    rc_count = int(soup_area.find_all('span', class_='list-condition__count')[0].text)
    print('There are ' + str(rc_count) + ' restaurants in ' + area)
    for i in range(1,min(math.ceil(rc_count/20)+1,max_page+1,61)):
        print('Processing...  ' + str(i) + '/' + str(min(math.ceil(rc_count/20)+1,max_page+1,61)-1))
        url_rc = url + 'rstLst/RC/' + str(i) + '/?Srt=D&SrtT=nod'
        res_rc = requests.get(url_rc)
        soup_rc = BeautifulSoup(res_rc.content, 'html.parser')
        for rc_div in soup_rc.find_all('div', class_='list-rst__wrap js-open-new-window'):
            rc_name = rc_div.find('a', class_='list-rst__rst-name-target cpy-rst-name').text
            rc_url = rc_div.find('a', class_='list-rst__rst-name-target cpy-rst-name')['href']
            rc_score = rc_div.find('span', class_='c-rating__val c-rating__val--strong list-rst__rating-val')
            if rc_score is None:
                rc_score = -1.
            else:
                rc_score = float(rc_score.text)
            rc_review_num = rc_div.find('em', class_='list-rst__rvw-count-num cpy-review-count').text
            if rc_review_num != ' - ':
                page = 1
                score = []
                while True:
                    rc_url_pg = rc_url + 'dtlrvwlst/COND-2/smp0/?smp=0&lc=2&rvw_part=all&PG=' + str(page)
                    time.sleep(1)
                    res_pg = requests.get(rc_url_pg)
                    soup_pg = BeautifulSoup(res_pg.content, 'html.parser')
                    if 'Je ne trouve pas la page que je recherche' in soup_pg.find('title').text:
                        break
                    try:
                        station = soup_pg.find_all('dl', class_='rdheader-subinfo__item')[0].find('span', class_='linktree__parent-target-text').text
                    except:
                        try:
                            station = soup_pg.find_all('dl', class_='rdheader-subinfo__item')[0].find('dd', class_='rdheader-subinfo__item-text').text.replace('\n','').replace(' ','')
                        except:
                            station = ''
                    genre = '/'.join([genre_.text for genre_ in soup_pg.find_all('dl', class_='rdheader-subinfo__item')[1].find_all('span', class_='linktree__parent-target-text')])
                    price = soup_pg.find_all('dl', class_='rdheader-subinfo__item')[2].find('p', class_='rdheader-budget__icon rdheader-budget__icon--dinner').find('a', class_='rdheader-budget__price-target').text
                    score = score + [score_.next_sibling.next_sibling.text for score_ in soup_pg.find_all('span', class_='c-rating__time c-rating__time--dinner')]
                    page += 1
                    if page == math.ceil(int(rc_review_num)/100)+1:
                        break
                restaurant_data.append([area, rc_count, rc_name, rc_url, rc_score, rc_review_num, station, genre, price, score])

De plus, pour des explications sur le code et des détails, consultez Journal de raclage et de consommation - Je veux trouver un bon restaurant! ~ (Travail), alors jetez un œil si vous êtes intéressé.

3. Quel est le résultat qui vous intéresse? ??

Tracer et visualiser les données

Le résultat est le suivant! Les 400 meilleurs restaurants de Shibuya, Ebisu et Daikanyama sont visés par ordre d'ouverture. save.png

Implication

Ce que vous pouvez lire sur ce diagramme de dispersion est ...

4. Examen plus approfondi

A partir de là, je vais y réfléchir un peu plus, avec ma curiosité.

Distribution des scores

En regardant le diagramme de dispersion plus tôt, j'étais curieux de voir que la distribution des scores du journal des repas était déformée et que les restaurants étaient concentrés sur un score spécifique. Donc, si vous regardez la distribution save.png Je suis également préoccupé par le fait que les restaurants sont concentrés sur un score spécifique, mais je suis également préoccupé par le fait qu'il y ait extrêmement peu de restaurants sur un score spécifique.

J'ai enquêté sur la relation avec le nombre d'avis, mais je n'ai pas pu obtenir de résultat qui pourrait expliquer cela ... Peut-être que la clé est les données non acquises cette fois, comme le nombre de jours depuis l'ouverture. Selon la rumeur, il existe une théorie selon laquelle la cotisation annuelle payée par le restaurant au journal alimentaire limite le score du journal alimentaire, ce qui peut également avoir un effet. Cependant, selon la façon de penser, le score du journal alimentaire est faible en raison de la fixation de la limite supérieure du score, mais le score de bouche-à-oreille est un facteur qui provoque des restaurants élevés. Vous pouvez trouver un magasin **.

5. Résumé

Recommended Posts

[Python] Je veux être une personne gourmande [Approche basée sur les données] Choisir un magasin pour les fêtes de fin d'année et du Nouvel An
Je veux créer un bel environnement de développement Python pour mon nouveau Mac
Je veux pouvoir analyser des données avec Python (partie 3)
Je veux pouvoir analyser des données avec Python (partie 4)
Je veux pouvoir analyser des données avec Python (partie 2)
Créer un environnement Python et transférer des données vers le serveur
Je veux connaître la nature de Python et pip
Je veux découper uniquement le visage d'une image de personne avec Python et l'enregistrer ~ Détection de visage et rognage avec face_recognition ~
Je veux créer un Dockerfile pour le moment.
Je veux clarifier la question de la méthode "__init__" et de l'argument "self" de la classe Python.
Je souhaite enregistrer l'heure d'exécution et conserver un journal.
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Je souhaite créer une application Web en utilisant React et Python flask
Je veux créer un environnement Python
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Je veux créer un lecteur de musique et enregistrer de la musique en même temps
Je veux exécuter et distribuer un programme qui redimensionne les images Python3 + pyinstaller
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
J'ai recherché les compétences nécessaires pour devenir ingénieur web avec Python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Je veux créer une fenêtre avec Python
Je veux faire un jeu avec Python
Je veux écrire dans un fichier avec Python
Je veux afficher la progression en Python!
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
Je veux juste trouver l'intervalle de confiance à 95% de la différence de ratio de population en Python
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
J'ai dessiné un graphique Python en utilisant des données publiques sur le nombre de nouveaux patients positifs au coronavirus (COVID-19) à Tokyo + avec un lien vers la version nationale des données de pratique
Je veux facilement implémenter le délai d'expiration en python
Je veux répéter plusieurs fois un générateur Python
Je veux donner un group_id à une trame de données pandas
Je veux gérer l'optimisation avec python et cplex
Je veux écrire en Python! (2) Écrivons un test
Je veux échantillonner au hasard un fichier avec Python
Je veux hériter de l'arrière avec la classe de données python
Je veux travailler avec un robot en python.
[Python] Je veux faire d'une liste imbriquée un taple
Je veux utiliser le jeu de données R avec python
Je veux faire fonctionner un ordinateur quantique avec Python
Python --Lisez des données à partir d'un fichier de données numériques pour trouver des matrices, des valeurs propres et des vecteurs propres distribués co-distribués
Je veux trouver l'intersection d'une courbe de Bézier et d'une ligne droite (méthode de découpage de Bézier)
Je souhaite créer une source sonore de karaoké en séparant les instruments et les voix en utilisant Python
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
Je veux faire un changeur de voix en utilisant Python et SPTK en référence à un site célèbre
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées