본문 바로가기
데이터 시각화 및 애플리케이션 개발/AI 컴퓨터 비전프로젝트

[ML] 선형 회귀_Rent값 예측 모델 만들기(1)

by 바다의 공간 2024. 7. 2.

머신러닝을 공부했다면! 

이정도 알고리즘을 알아야하는것들을 학습&반복했습니다.

솔직히 데이터시각화까지는 바지밑단잡고 질질 끌려가는느낌이었지만 ML들어가면서 

수학적인부분이 확실히 들어가다보니 많이 이해하기가 힘들었습니다.

그래서 수업에 그치지않고 유튜브, GPT을 이용해서 조금 더 공부를 해보려고 노력했습니다.

 

Rent값 예측 모델 만들기

전체 과정

  1. 데이터 분할: 데이터를 훈련 데이터와 테스트 데이터로 나누기.
  2. 모델 학습: 훈련 데이터를 사용해 모델을 학습시키기.
  3. 모델 평가: 테스트 데이터를 사용해 모델이 얼마나 잘 예측하는지 평가하기.
  4. 예측: 학습된 모델을 사용해 새로운 데이터의 임대료를 예측하기.

으로 구성되어있고 이번 글은 1번에 해당하는 글 입니다.


1. Rent 데이터셋

(따로 받은 데이터셋입니다. 데이터를 이용해서 Rent값을 예측할 수 있는 알고리즘을 만들어 보려고 합니다.

import numpy as np
import pandas as pd
import seaborn as sns
rent_df = pd.read_csv('구글드라이브 마운트~.csv')
rent_df

rent_df.info()

컬럼 확인하기

  • Posted On: 매물 등록 날짜
  • BHK: 베드, 홀, 키친의 개수
  • Rent: 렌트비
  • Size: 집 크기
  • Floor: 총 층수 중 몇층
  • Area Type: 공용공간을 포함하는지, 집의 면적만 포함하는지
  • Area Locality: 지역
  • City: 도시
  • Furnishing Status: 풀옵션 여부
  • Tenant Preferred: 선호하는 가족형태
  • Bathroom: 화장실 개수
  • Point of Contact: 연락할 곳

수치데이터 간단정보 확인 

rent_df.describe()

 

round(rent_df.describe(), 2)

 

 

 

 

 


그래프로 확인해보기 (displot)

기준 : BHK

sns.displot(rent_df['BHK'])

 

 

 

 

 

 

기준 : 렌트비

 

sns.displot(rent_df['Rent'])

Rent값은 0.1달러,1달러 등 되게 많음

 

3.5라는 x축이 나온 이유는 보이지 않아도 1개라도 데이터가 있다는 뜻 입니다.

 

실제 3.5에있는 렌트값을 숫자로 확인하기(오름차순)

rent_df['Rent'].sort_values()

 


이상치 확인하기

sns.boxplot(y=rent_df['Rent']) #1837 데이터는 이상치로 예상


 

모델에 데이터를 넣을때는 na값을 넣을 수 없기에

na값이 있는지 확인하기 

rent_df.isna().sum()

 

비율로 환산해보기

 

rent_df.isna().mean()

0.1, 0.06 비율이 null값입니다. 이런 데이터들은 제해주는것도 좋을 것 같습니다.


원하는 행만 Drop하기

rent_df.dropna(subset=['BHK'])

 

subset을 하게되면 BHK에 NaN이 있는 행만 삭제하게 됩니다.

Size가 na값이 있는 곳의 index를 찍어보기 

na_index = rent_df[rent_df['Size'].isna()].index
na_index

 

 

사이즈 na값이 있는 값의 size의 평균값을 넣어보기

rent_df['Size'].fillna(rent_df['Size'].median()).loc[na_index]

 

중간값 판다스ver.

rent_df = rent_df.fillna(rent_df.median(numeric_only=True))
umeric_only=True 
이 부분을 꼭 써줘야 분법이 성립됩니다.
안하면 error납니다.

 

 

 na값이 없어졌는지 확인하기

rent_df.isna().mean()

모든na값에 중앙값을 만들어서 넣어줬습니다.


 

rent_df.info()

 

삭제데이터가된 이유

rent_df['Floor'].value_counts()

 

 

 

종류가 480개인데 이런것들은 나중에 하나하나 나누는 방법 보다는 저층,중층,고층 이런식으로 나눈 후 합친다고 합니다

원핫인코딩하기

(여기까지하면 데이터전처리는 다 했다고 보면 됩니다)

rent_df['Area Type'].nunique()​

#3

유니크의 숫자를 세어줌

rent_df['Area Type'].unique()

 

 

 

for i in ['Floor','Area Type', 'Area Locality', 'City', 'Furnishing Status', 'Tenant Preferred','Bathroom', 'Point of Contact']:
    print(i, rent_df[i].nunique())

 

몇가지 종류가 있는지 확인할 수 있습니다.

이렇게 함으로서 원핫인코딩을 어떻게 해야할지 그룹을 나눌 수 있는지 등 확인할 수 있습니다.

3개이상인 것들은 원핫인코딩가능합니다. 3개이상인경우에는 관계성이 있다고 생각할 수 있습니다.

100개 미만인것들은 할 수 있습니다. 너무 높은숫자면 가중치가 높아서 비중을 많이 차지하기에 이번경우에는 drop해주겠습니다.

 

사용하지 않을 데이터 drop

rent_df.drop(['Floor', 'Area Locality', 'Tenant Preferred', 'Point of Contact', 'Posted On'], axis=1, inplace=True)

 

열을 나타나기에 axis=1로 잡고 바로 적용하기에 인플레이스 true로 했습니다.

rent_df.info()

 

칼럼이 굉장히 많이 줄었고 데이터들고 일치가 많이 된것같고

서로 관계성을 끊어주기 위해서 object를 끊어줘야하니까 원핫인코딩을 해주겠습니다.

rent_df = pd.get_dummies(rent_df, columns=['Area Type', 'City','Furnishing Status'])
rent_df.head()

 

 


 모델에 넣기 위해서 독립,종속변수 분할하기

X = rent_df.drop('Rent', axis=1) #독립변수
y = rent_df['Rent'] #종속변수

x=rent만 제거했으니 독립변수가 됩니다.

y=종속변수

 

모델 학습시키기

데이터 전처리.

트레이닝, 테스트 데이터 나누어주기

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2024)

test_size=0.2= 20%입니다.

X_train.shape, X_test.shape

#((3796, 15), (950, 15))

 

y_train.shape, y_test.shape

#((3796,), (950,))

이 결과의 뜻은

 

  • (3796, 15): 3796개의 집 정보를 가지고 모델을 학습시킨다는 뜻이야. 각 집 정보에는 15가지 특징이 포함됨
  • (950, 15): 950개의 집 정보를 가지고 모델을 테스트한다는 뜻이야. 각 집 정보에도 15가지 특징이 포함됨.

입니다. 

 

 

 

 

리뷰

학습할 것 설명
describe() 간단한 수치데이터 정보 확인
round(df..discribe(),2) 소수점 둘째자리에서 반올림
unique() 갯수를 말해줌
nunique() unique의 숫자를 세어줌