Publié simultanément sur le blog: https://leoluistudio.com/blog/24/python%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e6%9d%b1%e4%ba%ac%e9%83%bd%e5%ae%b6%e8%b3%83%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e3%81%ae%e7%a0%94%e7%a9%b6-4%e3%81%ae2/
--Source des données: https://suumo.jp --Bibliothèque utilisée: requêtes, BeautifulSoup, re, time, sqlite3
Structure de la base de données
info | |
---|---|
id | 1 (PRIMARY KEY) |
municipal | Quartier Chiyoda |
train | 7 (Marcher jusqu'à la gare) |
type | appartement |
date | 1983 |
structure | Acier renforcé |
floor | 8 |
carpark | 0 (0 est aucun, 1 est oui) |
price | |
---|---|
id | 1 (PRIMARY KEY) |
pid | 160000 (Cercle) |
1 (=ID info) | 7 (Marcher jusqu'à la gare) |
area | 42.9 (Carré) |
date | est |
Première 5e ligne pour chaque table
Installez d'abord les bibliothèques nécessaires
import sqlite3
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from plotly.offline import plot
from sklearn.decomposition import PCA
Connectez la base de données
#Si le résultat est sorti uniquement
conn = sqlite3.connect(‘info.db’)
c = conn.cursor()
cursor = c.execute("Code SQL")
for row in cursor:
print(résultat)
conn.close()
#Pour traitement en sauvegardant le résultat
conn = sqlite3.connect(‘info.db’)
df = pd.read_sql_query("Code SQL", conn)
conn.close()
Premier regard sur la distribution des données
#Nombre de lignes d'informations
SELECT COUNT(id) FROM info
#Résultat: 82,812
#Nombre de lignes dans le prix
SELECT COUNT(id) FROM price
#Résultat: 624,499
#Nombre d '"appartements" et "appartements"
SELECT type,COUNT(type) FROM info GROUP BY type
#Résultat: Appartement 33,110 /Manoir 49,702
Répartition des dates d'achèvement
# SQL
SELECT date AS year,COUNT(date) AS count FROM info WHERE date > 0 GROUP BY date
#Graphique
fig = px.bar(df, x=’year’, y=’count’, height=500, width=1000)
Répartition de la structure du bâtiment
# SQL
SELECT structure,COUNT(structure) AS count FROM info WHERE structure != 0 GROUP BY structure
#Graphique
fig = px.bar(df, x=structure, y=’count’, height=500, width=1000)
Répartition des sols
# SQL
SELECT floor,COUNT(floor) AS count FROM info WHERE floor != 0 GROUP BY floor
#Graphique
fig = px.bar(df, x=floor, y=’count’, height=500, width=1000)
Dans le tableau ci-dessus, la distribution au 20e étage et au-dessus ne peut pas du tout être vue, alors regardons de plus près ici.
# SQL
SELECT floor,COUNT(floor) AS count FROM info WHERE floor > 20 GROUP BY floor
#Graphique
fig = px.bar(df, x=floor, y=’count’, height=500, width=1000)
Les variables continues (par exemple le prix) doivent être regroupées avant de pouvoir être analysées.
def pricegroup(df):
if df[‘price’] < 30000:
return ‘<30,000’
elif df[‘price’] < 60000:
return ‘30,000-60,000’
……
else:
return ‘>270,000’
pricegroup_list = [‘<30,000’,
‘30,000-60,000’,
‘60,000-90,000’,
……
‘240,000-270,000’,
‘>270,000’]
Répartition des prix
# SQL
SELECT price FROM price
#Traitement des trames de données df[‘pricegroup’] = df.apply(pricegroup, axis=1)
dfcount = df.groupby([‘pricegroup’]).count()
#Graphique
fig = px.bar(dfcount, x=dfcount.index, y=’price’, height=500, width=1000)
fig.update_layout(xaxis={‘categoryorder’:’array’, ‘categoryarray’:pricegroup_list}, yaxis_title=’count’)
La répartition de la zone est la même
def pricegroup(df):
if df[‘area’] < 5:
return ‘<5’
elif df[‘area’] < 10:
return ‘5-10’
……
else:
return ‘>45’
pricegroup_list = [‘<5′, ’5-10′, ’10-15′, ’15-20′,
’20-25′, ’25-30′, ’30-35′, ’35-40′,
’40-45′,’>45′]
# SQL
SELECT area FROM price
#Traitement des trames de données
df[‘areagroup’] = df.apply(areagroup, axis=1)
dfcount = df.groupby([‘areagroup’]).count()
#Graphique
fig = px.bar(dfcount, x=dfcount.index, y=’area’, height=500, width=1000)
fig.update_layout(xaxis={‘categoryorder’:’array’, ‘categoryarray’:areagroup_list}, yaxis_title=’count’)
Distribution directionnelle
# SQL
SELECT direction,COUNT(direction) AS count FROM price WHERE direction != ‘-‘ GROUP BY direction
#Graphique
fig = px.bar(df, x=direction, y=’count’, height=500, width=1000)
Avant d'analyser les quartiers, les villes, les villes et les villages, divisez-les en 23 quartiers et villes.
m23_list = [«Chiyoda Ward»,«Chuo-ku»,«Minato-ku»,«Quartier Shinjuku»,«Bunkyo Ward»,«Taito»,«Sumida Ward»,
«Koto Ward»,«Quartier Shinagawa»,«Meguro»,«Ota-ku»,«Setagaya»,«Quartier de Shibuya»,«Nakano»,
«Suginami»,«Quartier de Toshima»,«Kita Ward»,«Arakawa»,«Itabashi Ward»,«Nerima Ward»,«Adachi Ward»,
«Katsushika»,«Edogawa Ward»]
municipal_dict = {}
conn = sqlite3.connect(‘info.db’)
c = conn.cursor()
cursor = c.execute(“SELECT id,municipal FROM info”)
for row in cursor:
municipal_dict.update({row[0]:row[1]})
conn.close()
def municipal(df):
return municipal_dict[df[‘pid’]]
def municipal23(df):
if df[‘municipal’] in m23_list:
return ‘Special Wards’
else:
return ‘Non Special Wards’
Relation entre le prix et la superficie (divisé en 23 quartiers et zones urbaines)
# SQL
SELECT pid,price,area FROM price
#Traitement des trames de données
df[‘municipal’] = df.apply(municipal, axis=1)
df[‘municipal23’] = df.apply(municipal23, axis=1)
dfmedian = df.groupby([‘pid’, ‘municipal23’])[‘price’, ‘area’].median()
dfmedian_reset = dfmedian.reset_index(level=’municipal23′)
#Graphique
fig = px.scatter(dfmedian_reset, x=’area’, y=’price’, color=’municipal23′, labels={‘municipal23’: ‘Special Wards’}, height=500, width=1000)
Recommended Posts