BSA03_Housing.ipynb
필요한 패키지
import pandas as pd
import numpy as np
# !pip install matplotlib
import matplotlib.pyplot as plt
# !pip install scikit-learn statsmodels
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
# from sklearn.impute import SimpleImputer
from sklearn.linear_model import LinearRegression
# import statsmodels.api as sm
데이터 불러오기 및 EDA
주택 = pd.read_csv("housing.csv")
주택.info()
주택.describe() # 기술통계
# hist(히스토그램), bins(계급의 수), figsize(이미지 크기)
주택.hist(bins=20, figsize=(20,15))
# 최종적으로 그래프를 보여달라는 의미
plt.show()
학습 데이터, 검증 데이터 분리
# 75% (15480개)는 train data, 25% (5160개)는 test data
train, test = train_test_split(주택, test_size=0.25, random_state=316)
test.info()
데이터 전처리
# cut함수: 수치형 데이터를 범주형 데이터로 변환해줌
# 'median_income'를 1,2,3,4,5로 범주화한 데이터를 '중위소득범주'라는 category 변수로 새로 만듦
주택['중위소득범주'] = pd.cut(주택['median_income'], bins=[0.0, 2, 4, 6, 10, np.inf], labels=[1,2,3,4,5])
주택.info()
주택['중위소득범주'].hist()
plt.show()
# 해당되는 범주에 몇 개의 데이터가 있는지 빈도 확인
# groupby 함수와 같이 사용할 수도 있음
주택['중위소득범주'].value_counts()
# '중위소득범주' 비율 계산
주택['중위소득범주'].value_counts()/len(주택)
# 범주형 -> 숫자형 자료 변환
해변접근성 = 주택[['ocean_proximity']]
해변접근성.head(5)
가변수처리 = OneHotEncoder()
해변가변수 = 가변수처리.fit_transform(해변접근성)
해변가변수.toarray()
# 5개 범주에 해당하는 값을 1,0으로 표시함
가변수처리.categories_
## 만약 순서자료라면
# 1H OCEAN (0), INLAND(1), ISLAND(2), NEAR BAY(3), NEAR OCEAN(4)
from sklearn.preprocessing import OrdinalEncoder
순서변환 = OrdinalEncoder()
해변순서 = 순서변환.fit_transform(해변접근성)
해변순서[:10]
# 중위소득범주 비율에 맞게 함수 검증 자료 분리
train_범주, test_범주 = train_test_split(주택, test_size=0.25, random_state=316, stratify=주택['중위소득범주'])
# inplace=True : 작업한 결과를 같은 이름('주택')으로 저장
주택.drop('중위소득범주', axis=1, inplace=True)
주택.info()
# 결측값 대체
대체주택 = 주택.copy()
# NA가 들어있는 개수
결측개수 = 대체주택['total_bedrooms'].isna().sum()
print(결측개수)
# 'total_bedrooms'의 결측값을 'total_bedrooms'의 중앙값으로 채워넣기
대체주택['total_bedrooms'].fillna(대체주택['total_bedrooms'].median, inplace=True)
결측개수 = 대체주택['total_bedrooms'].isna().sum()
print(결측개수)
# 전체에 적용하는 경우
대체방법 = SimpleImputer(strategy='median')
# 수치변수에 대해서만 적용
주택수치 = 주택.drop('ocean_proximity', axis=1)
주택수치.info()
대체방법.fit(주택수치)
대체방법.statistics_
주택수치.median().values
## 대체자료는 numpy.ndarray
대체자료 = 대체방법.transform(주택수치)
# 변수명 : 주택수치.columns
대체df = pd.DataFrame(대체자료, columns=주택수치.columns, index=주택수치.index)
대체df
데이터 시각화
plt.figure(figsize=(12,10))
plt.scatter(주택['longitude'], 주택['latitude'])
plt.show()
# alpha=0.1 : 그림을 10배로 연하게 그림
주택.plot(kind='scatter', x='longitude', y='latitude', alpha=0.1, figsize=(12,10))
plt.show()
주택.plot(kind='scatter', x='longitude', y='latitude', alpha=0.4, s=주택['population']/100, label='population',
figsize=(12,8), c='median_house_value', cmap=plt.get_cmap('jet'), colorbar=True, sharex=False)
plt.legend()
plt.show()
회귀분석
# 결측값이 있는 데이터(행) 제거해서 주택에 저장
주택.dropna(axis=0, inplace=True)
# matrix 형태로 분석
y = 주택['median_house_value']
# 수치형 데이터만 가지고
X일부 = 주택.drop(['median_house_value', 'ocean_proximity'], axis=1)
X가변수 = pd.DataFrame(해변가변수.toarray(), columns=["l1", "l2", "l3", "l4", "l5"], index=주택수치.index)
# 5개의 범주는 가변수 4개로 표현 가능하기 때문에 가변수 하나를 삭제함
X가변수.drop('l1', axis=1, inplace=True)
X = pd.merge(X일부, X가변수, left_index=True, right_index=True)
선형회귀 = LinearRegression()
선형회귀.fit(X,y) # 데이터를 넣음
print("절편(bias):",선형회귀.intercept_)
print("회귀계수(weights):",선형회귀.coef_)
선형회귀.predict(X)
# with statsmodels
X = sm.add_constant(X) # adding a constant (베타0 햇을 추정하기 위해)
model = sm.OLS(y,X).fit()
predictions = model.predict(X)
print_model = model.summary()
print(print_model)
predictions
'Statistics > BSA' 카테고리의 다른 글
230329 / BSA04. 다양한 형식의 데이터 파일 읽고 저장하기 (0) | 2023.04.02 |
---|---|
230327 / BSA04. 다양한 형태의 자료 파일 작업 속도 비교 (0) | 2023.04.02 |
230320 / BSA03. 가상환경에서 주피터랩 설치하기, 주피터노트북에서 자동완성 기능 구현하기 (0) | 2023.03.26 |
230320 / BSA03. 효율적인 메모리 관리와 프로그램 작성 (0) | 2023.03.26 |
230315 / BSA02. SNS 데이터 가져오기, 진행바(progress bar) 추가하기 (0) | 2023.03.26 |