1. Rent 데이터셋
# 필요한 데이터셋 로그 및 탐색
import numpy as np
import pandas as pd
import seaborn as sns
rent_df = pd.read_csv('/content/drive/MyDrive/KDT v2/머신러닝과 딥러닝/ data/rent.csv')
rent_df
# rent_df의 파일내용 확인
rent_df.info()
# 데이터프레임에 대한 기술 통계를 빠르게 요약하여 보여줍니다.
rent_df.describe()
- count : 각 컬럼의 유효한 데이터 개수입니다. 결측치는 제외.
- mean : 수치 데이터에 대한 평균값
- std : 표준편차로, 데이터의 분산 정도
- min : 각 컬럼의 최소값
- 25% : 하위 25%(1사분위수)에 해당 값
- 50% : 중간값 또는 2사분위수(median)
- 75% : 하위 75%(3사분위수)에 해당 값
- max : 각 컬럼의 최대값
# describe() : 각 컬럼에 대해 기본적인 통계적인 정보(카운트, 평균, 표준편차, 최소값, 최대값)을 보여줌.
# rount(..., 2) : describe()로 부터 얻은 결과를 반올림하여 소수점 두 번째 자리 까지 표시합니다.
round(rent_df.describe(), 2)
# seaborn라이브러리를 사용하여 rent_df의 'BHK'라는 이름의 컬럼에 대한 분포도(히스토그램)을 그린다.
sns.displot(rent_df['BHK'])
sns.displot(rent_df['Rent'])
# seaborn라이브러리를 사용하여 rent_df 데이터 프레임의 'Rent'컬럼에 대한 박스 플롯을 생성
sns.boxplot(y=rent_df['Rent'])
sns.boxplot(y=rent_df['BHK'])
# rent_df 데이터프레임에서 'BHK' 컬럼에 NaN (결측치)가 있는 모든 행을 제거
rent_df.dropna(subset=['BHK'])
# rend_df에서 Size가 Nan인 데이터의 index를 저장 후 출력
na_index = rent_df[rent_df['Size'].isna()].index
# 결과값 => Int64Index([425, 430, 4703, 4731, 4732], dtype='int64')
rent_df.fillna(rent_df.median()).loc[na_index]
# 1. rent_df.fillna(rent_df.median()) : rent_df 데이터프레임의 모든 결측치(NaN 값)를 각 컬럼의 중앙값으로 대체
# 2. .loc[na_index] : 변경된 데이터프레임에서 특정 행들을 선택, loc[]는 pandas에서 행 또는 열을 선택할 때 사용하는 함수
na_index = rent_df[rent_df['BHK'].isna()].index
# 결과값 => Int64Index([3, 53, 89], dtype='int64')
rent_df['BHK'].fillna(rent_df['BHK'].median()).loc[na_index]
# 결과값 =>
# 3 2.0
# 53 2.0
# 89 2.0
# Name: BHK, dtype: float64
sns.boxplot(y=rent_df['BHK'].fillna(rent_df['BHK'].median()).loc[na_index])
rent_df = rent_df.fillna(rent_df.median())
rent_df['Area Type'].unique()
# 결과값 => array(['Super Area', 'Carpet Area', 'Built Area'], dtype=object)
# 겹치지 않는 데이터 검색
rent_df['Area Type'].nunique()
# 결과값 => 3
# 유니크한 종류의 개수
# Floor, Area Type, Area Locality, City, Furnishing Status, Tenant Preferred, Point of Contact
for i in ['Floor', 'Area Type', 'Area Locality', 'City', 'Furnishing Status', 'Tenant Preferred', 'Point of Contact']:
print(i, rent_df[i].nunique())
# 결과값 =>
# Floor 480
# Area Type 3
# Area Locality 2235
# City 6
# Furnishing Status 3
# Tenant Preferred 3
# Point of Contact 3
rent_df.drop(['Floor', 'Area Locality', 'Tenant Preferred', 'Point of Contact', 'Posted On'], axis=1, inplace=True)
# object -> 숫자로 변경, 딥러닝을 할때 무조건 숫자이여야하기 때문
rent_df = pd.get_dummies(rent_df, columns=['Area Type', 'City', 'Furnishing Status'])
X = rent_df.drop('Rent', axis=1) # 독립변수
y = rent_df['Rent'] # 종속 변수
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=10)
X_train.shape, y_train.shape
# 결과값 => ((3796, 15), (3796,))
X_test.shape, y_test.shape
# 결과값 => ((950, 15), (950,))
2. 선형 회귀(Linear Regression)
- 데이터를 통해 가장 잘 설명할 수 있는 직선으로 데이터를 분석하는 방법
- 단순 선형 회귀분석(단일 독립변수를 이용)
- 다중 선형 회귀분석(다중 독립변수를 이용)
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
pred = lr.predict(X_test)
3. 평가지표 만들기
p = np.array([3, 4, 5]) # 예측값
act = np.array([1, 2, 3]) # 실제값
def my_mse(pred, actual):
return ((pred - actual) ** 2).mean()
my_mse(p, act)
# 결과값 => 4.0
def my_mae(pred, actual):
return np.abs(pred - actual).mean()
my_mae(p, act)
# 결과값 => 2.0
def my_rmse(pred, actual):
return np.sqrt(my_mse(pred, actual))
my_rmse(p, act)
# 결과값 => 2.0
from sklearn.metrics import mean_absolute_error, mean_squared_error
mean_absolute_error(p, act)
# 결과값 => 2.0
mean_squared_error(p, act)
# 결과값 => 4.0
mean_squared_error(p, act, squared=False) # False로 하면 RMSE가 된다.
# 결과값 => 2.0
mean_squared_error(y_test, pred) # y_test 정답
# 결과값 => 13885731490.56186
mean_absolute_error(y_test, pred)
# 결과값 => 25837.60324256433
mean_squared_error(y_test, pred, squared=False)
# 결과값 => 117837.73372974321
X_train.drop(1837, inplace=True)
y_train.drop(1837, inplace=True)
lr.fit(X_train, y_train)
pred = lr.predict(X_test)
mean_squared_error(y_test, pred, squared=False)
# 결과값 => 41377.57030234839
# 1837 삭제 전 : 41438.9403701652
# 1837 삭제 후 : 41377.57030234839
41438.9403701652 - 41377.57030234839 # 오차가 줄었음
# 결과값 => 61.37006781680975
'Study > 머신러닝과 딥러닝' 카테고리의 다른 글
[머신러닝과 딥러닝] 7. 로지스틱 회귀 (0) | 2024.01.02 |
---|---|
[머신러닝과 딥러닝] 6. 의사 결정 나무 (0) | 2023.12.29 |
[머신러닝과 딥러닝] 4. 타이타닉 데이터셋 (0) | 2023.12.27 |
[머신러닝과 딥러닝] 3. 아이리스 데이터셋 (0) | 2023.12.23 |
[머신러닝과 딥러닝] 2. 사이킷런(Scikit-learn) (0) | 2023.12.22 |