[Python] Prédire le loyer approprié pour les appartements

Pour déterminer le loyer approprié pour un studio dans une certaine zone Construisons un modèle en Python capable de prédire le loyer avec une grande précision à partir d'autres variables.

Données à utiliser

41 ensembles de données (souba.csv) sur les studios dans une certaine zone

Contenu de l'ensemble de données

id: ID de la propriété loyer: Loyer (yen) surface: surface (m2m2) âge: Âge (années) minutes: Station à pied (minutes)

Flux global

  1. Préparation des données
  2. Saisissez les données de différents axes
  3. Sélection de la quantité de caractéristiques et comparaison de modèles
  4. Apprendre et évaluer le modèle

Entraine toi

1) Préparation des données

Tout d'abord, importez et confirmez les données.

import numpy  as np
import pandas as pd
import seaborn as sns

df = pd.read_csv("souba.csv")
df.head()

	id	rent	area	age	minutes
0	1	4.3	13.00	26	6
1	2	4.2	14.35	35	5
2	3	5.0	15.60	33	9
3	4	4.5	13.09	32	5
4	5	4.6	12.92	38	7

Suppression des ID de variable sans signification qui ne sont pas pertinents pour l'analyse.

data = df.drop(["id"], axis = 1)
data.head()

rent	area	age	minutes
0	4.3	13.00	26	6
1	4.2	14.35	35	5
2	5.0	15.60	33	9
3	4.5	13.09	32	5
4	4.6	12.92	38	7

Divisez en données d'entraînement et en données de test à 7: 3.

#Divisé en données d'entraînement et données de test
X = data[["area", "age", "minutes"]].values
y = data["rent"].values

from sklearn.model_selection import train_test_split, cross_validate, KFold
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)
X_train.shape, X_test.shape

((28, 3), (13, 3))

Créez un Dataframe pour chacune des données d'entraînement et des données de test.

#Créer un Dataframe
data_train = pd.DataFrame(X_train,columns = ["area", "age", "minutes"])
data_train["rent"] = y_train

data_test = pd.DataFrame(X_test,columns = ["area", "age", "minutes"])
data_test["rent"] = y_test

2) Saisissez les données de différents axes

Tout d'abord, visualisons les données d'entraînement. Le but de la visualisation est ① Saisir grossièrement la relation de l'ensemble des données ② Découvrez les valeurs aberrantes

sns.pairplot(data_train)

image.png

En regardant la relation entre le loyer et d'autres variables, ・ La zone semble être corrélée ・ Les minutes (à pied de la gare) ne sont pas aussi fortes que la zone, mais il semble y avoir une faible corrélation ・ L'âge (âge) semble être proche de la corrélation inverse On peut le lire.

Il n'y a qu'une seule valeur aberrante dans la zone, alors excluez-la.

#Correspondance des valeurs aberrantes
data_train = data_train.query("area < 40")
sns.pairplot(data_train)

image.png

Ensuite, calculons le coefficient de corrélation.

data_train.corr()

    area	age	minutes	rent
area	1.000000	-0.148793	0.207465	0.925012
age	-0.148793	1.000000	-0.088959	-0.315480
minutes	0.207465	-0.088959	1.000000	0.154623
rent	0.925012	-0.315480	0.154623	1.000000

En regardant la corrélation entre le loyer et chaque variable, La zone a une corrélation très élevée, mais l'âge a une faible corrélation inverse, et les minutes n'ont pratiquement aucune corrélation.

De ce qui précède. Il semble bon de le prendre comme un montant de fonction dans l'ordre zone> âge> minutes.

3) Sélection de la quantité de caractéristiques et comparaison de modèles

【point】 ・ Assurez-vous de sélectionner un modèle en utilisant uniquement les données d'entraînement.

Tout d'abord, créons un modèle de régression linéaire lorsque les variables explicatives sont toutes des variables. Ici, nous utilisons la validation croisée en trois volets.

X_train = data_train[["area", "age","minutes"]].values
y_train = data_train["rent"].values

LR = LinearRegression()
res_1 = cross_validate(LR, X = X_train, y = y_train, scoring = "r2", cv = KFold(n_splits = 3, shuffle = True), return_train_score = True)
res_1

#But
{'fit_time': array([0.        , 0.00254989, 0.00099754]),
 'score_time': array([0.00401378, 0.        , 0.        ]),
 'test_score': array([-0.11587073,  0.67717773,  0.65301948]),
 'train_score': array([0.96132849, 0.66332986, 0.90608152])}

Ensuite, créons un modèle de régression linéaire en excluant la marche de la station des variables explicatives.

X_train = data_train[["area", "age"]].values
y_train = data_train["rent"].values

LR = LinearRegression()
res_2 = cross_validate(LR, X = X_train, y = y_train, scoring = "r2", cv = KFold(n_splits = 3, shuffle = True), return_train_score = True)
res_2

#But
{'fit_time': array([0.00318336, 0.0009973 , 0.0010891 ]),
 'score_time': array([0.        , 0.00185704, 0.        ]),
 'test_score': array([0.32138226, 0.87606109, 0.83912145]),
 'train_score': array([0.94496232, 0.88506422, 0.80168397])}

En comparant chaque test_score, Puisque ce dernier modèle, qui exclut la marche en station des variables explicatives, a un coefficient de détermination plus élevé, nous l'adopterons comme modèle.

4) Apprendre et évaluer le modèle

Apprenez le modèle avec les caractéristiques comme la superficie et l'âge.

X_train = data_train[["area", "age"]].values
y_train = data_train["rent"].values

LR = LinearRegression()
LR.fit(X_train, y_train)

Placez les données de test dans le modèle créé et vérifiez l'exactitude.

X_test = data_test[["area", "age"]].values
y_test = data_test["rent"].values

y_pred = LR.predict(X_test)
r2_score(y_true = y_test, y_pred = y_pred) 

#Évaluation du modèle
0.8623439786705054

En conséquence, le coefficient de décision dans les données de test était de 0,8 ou plus. Cela semble être un modèle avec un certain degré de précision.

Recommended Posts

[Python] Prédire le loyer approprié pour les appartements
Voir python pour la première fois
À quoi sert le trait de soulignement Python (_)?
Premiers pas avec Python pour les non-ingénieurs
Commande pour le répertoire courant Python
Créer un environnement pour Python intégré à Blender
MongoDB avec Python pour la première fois
Pandas du débutant, par le débutant, pour le débutant [Python]
Une introduction à Python pour l'apprentissage automatique
Une introduction à Python pour les programmeurs en langage C
[Note] La solution pour celle où Python devient une erreur avec import hashlib sur MacOSX
Le moyen le plus rapide pour les débutants de maîtriser Python
[Python] J'ai essayé de remplacer le nom de la fonction par le nom de la fonction
Création d'un wrapper Python pour l'API Qiita
vprof - J'ai essayé d'utiliser le profileur pour Python
[Python] matplotlib: Formatez le diagramme de votre mémoire
Créer un environnement pour exécuter des scripts Python (pour Mac)
Construire un environnement Anaconda pour Python avec pyenv
Wagtail est le meilleur CMS pour Python! (Peut-être)
Utilisez Logger avec Python pour le moment
J'ai essayé la programmation python pour la première fois.
Installez le package python dans un environnement hors ligne
Python: préparez un sérialiseur pour l'instance de classe:
[Python] J'ai cherché le plus long Pokémon Shiritori
Traitement d'image? L'histoire du démarrage de Python pour
Obtenez un jeton d'accès pour l'API Pocket
Code pour vérifier le fonctionnement de Python Matplot lib
Appeler Polly à partir du kit SDK AWS pour Python
Un article résumant les pièges accro au python
30/10/2016 else pour Python3> pour:
python [pour moi]
Obtenez AccessToken pour le compte de service avec le SDK Firebase Admin Python
Créez un environnement interactif pour l'apprentissage automatique avec Python
Ce que je suis entré dans Python pour la première fois
Faire de l'application Python CUI une application pour Mac
J'ai essayé Python sur Mac pour la première fois.
HoloViews peut devenir la norme pour les outils de visualisation Python
Informations pour contrôler les moteurs avec Python sur RaspberryPi
Créer un environnement pour le traitement du langage naturel avec Python
Electron est la meilleure solution pour le développement multi-plateforme de Python
Programme Python qui recherche le même nom de fichier
Python: obtenir une liste de méthodes pour un objet
mémo python (pour moi-même): À propos de l'environnement de développement virtualenv
python (2) nécessite self car la méthode est une méthode d'instance