<jupyter_start><jupyter_text>0. 학습 환경 설정하기 1. 데이터셋 불러오기 2. EDA 3. 모델 학습을 위한 데이터 전처리 4. 모델 학습하기 5. 모델 평가하기 6. 모델 학습 결과 심화 분석하기출처 : 신제용 강사 (패스트캠퍼스)  0 . 학습 환경 설정하기<jupyter_code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os

from sklearn.model_selection import train_test_split
from xgboost import XGBRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
from math import sqrt
# os.environ을 이용하여 Kaggle API Username, Key 세팅하기
os.environ['KAGGLE_USERNAME'] = 'fastcampuskim'
os.environ['KAGGLE_KEY'] = 'c939a1e37f5ca93b6406a66fc8bb08e5'<jupyter_output><empty_output><jupyter_text>1. 데이터셋 불러오기* 데이터 출처: https://www.kaggle.com/dgomonov/new-york-city-airbnb-open-data* 컬럼    id: 항목의 ID         name: 항목의 이름 (타이틀)         host_id: 호스트 ID         host_name: 호스트의 이름         neighbourhood_group: 방이 있는 구역 그룹         neighbourhood: 방이 있는 구역         latitude: 방이 위치한 위도         longitude: 방이 위치한 경도         room_type: 방의 종류         price: 가격 (미 달러)         minimum_nights: 최소 숙박 일수         number_of_reviews: 리뷰의 개수         last_review: 마지막 리뷰 일자         reviews_per_month: 월별 리뷰 개수         calculated_host_listings_count: 호스트가 올린 방 개수         availability_365: 365일 중 가능한 일수<jupyter_code># Linux 명령어로 Kaggle API를 이용하여 데이터셋 다운로드하기 (!kaggle ~)
# Linux 명령어로 압축 해제하기
!rm *.*
!kaggle datasets download -d dgomonov/new-york-city-airbnb-open-data
!unzip '*.zip'
df = pd.read_csv('AB_NYC_2019.csv')
df<jupyter_output><empty_output><jupyter_text>2. EDA<jupyter_code>df.head()
df['room_type'].value_counts()
df.info()
df.isna().sum()
(df['reviews_per_month'].isna() & df['last_review'].isna()).sum()
df['reviews_per_month'].isna().sum()
(df['number_of_reviews'] == 0).sum()
df['availability_365'].hist()
(df['availability_365'] == 0).sum()
df.describe()
df.columns
df.drop(['id', 'name', 'host_name', 'latitude', 'longitude'], axis=1, inplace=True)
df.head()
df.columns
sns.jointplot(x='host_id', y='price', data=df, kind='hex')
sns.jointplot(x='reviews_per_month', y='price', data=df, kind='hex')
sns.heatmap(df.corr(), annot=True, cmap='YlOrRd')
df.columns
sns.boxplot(x='neighbourhood_group', y='price', data=df)
sns.boxplot(x='room_type', y='price', data=df)
df.columns
df.isna().sum()
df['neighbourhood_group'].value_counts()
neigh = df['neighbourhood'].value_counts()
plt.plot(range(len(neigh)), neigh)
df['neighbourhood'] = df['neighbourhood'].apply(lambda s: s if str(s) not in neigh[50:] else 'others')
df['neighbourhood'].value_counts()
df['room_type'].value_counts()
df.columns
sns.rugplot(x='price', data=df, height=1)
print(df['price'].quantile(0.95))
print(df['price'].quantile(0.005))
sns.rugplot(x='minimum_nights', data=df, height=1)
print(df['minimum_nights'].quantile(0.98))
sns.rugplot(x='availability_365', data=df, height=1)
print(df['availability_365'].quantile(0.3))
# quantile(), drop() 등 메소드를 이용하여 outlier 제거하고 통계 재분석하기
p1 = df['price'].quantile(0.95)
p2 = df['price'].quantile(0.005)
print(p1, p2)
df = df[(df['price'] < p1) & (df['price'] > p2)]
df['price'].hist()
mn1 = df['minimum_nights'].quantile(0.98)
print(mn1)
df = df[df['minimum_nights'] < mn1]
df['minimum_nights'].hist()
df['is_avail_zero'] = df['availability_365'].apply(lambda x: 'Zero' if x==0 else 'Nonzero')
# fill(), dropna() 등으로 미기입된 데이터를 처리하기
df['review_exists'] = df['reviews_per_month'].isna().apply(lambda x: 'No' if x is True else 'Yes')
df.fillna(0, inplace=True)
df.isna().sum()<jupyter_output><empty_output><jupyter_text>3. 모델 학습을 위한 데이터 전처리<jupyter_code>df.columns
X_cat = df[['neighbourhood_group', 'neighbourhood', 'room_type', 'is_avail_zero', 'review_exists']]
X_cat = pd.get_dummies(X_cat)
from sklearn.preprocessing import StandardScaler
df.columns
# StandardScaler를 이용해 수치형 데이터를 표준화하기
scaler = StandardScaler()
X_num = df.drop(['neighbourhood_group', 'neighbourhood', 'room_type', 'price', 
                 'last_review', 'is_avail_zero', 'review_exists'], axis=1)

scaler.fit(X_num)
X_scaled = scaler.transform(X_num)
X_scaled = pd.DataFrame(X_scaled, index=X_num.index, columns=X_num.columns)

X = pd.concat([X_scaled, X_cat], axis=1)
y = df['price']
X.head()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)<jupyter_output><empty_output><jupyter_text>4. 모델 학습하기<jupyter_code>model_reg = XGBRegressor()
model_reg.fit(X_train, y_train)<jupyter_output>[20:13:03] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.<jupyter_text>5. 모델 평가하기<jupyter_code>pred = model_reg.predict(X_test)
print(mean_absolute_error(y_test, pred))
print(sqrt(mean_squared_error(y_test, pred)))<jupyter_output>35.37089085317669
49.393558422539826<jupyter_text>6. 모델 학습 결과 심화 분석하기<jupyter_code># y_test vs. pred Scatter 플랏으로 시각적으로 분석하기
plt.scatter(x=y_test, y=pred, alpha=0.1)
plt.plot([0,350], [0, 350], 'r-')
# err의 히스토그램으로 에러율 히스토그램 확인하기
err = (pred - y_test) / y_test
sns.histplot(err)
plt.grid()
# err의 히스토그램으로 에러율 히스토그램 확인하기
err = pred - y_test
sns.histplot(err)
plt.grid()<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup