
명목형 데이터 컬럼
'지역별'
순서형 데이터 컬럼
'시점'
for i in range(17):
for j in range(96):
df_final.loc[j+96*(i),'시점']=95-j
df_final['시점']

-> 시의 데이터가 17개라서 정확히 다 잘 들어갔다.
# 원핫인코딩
df_final_onehoted = pd.get_dummies(df_final, columns=['지역별'], drop_first=True)

-> 각 행정구역이 하나의 컬럼으로 생성되었다. 강원도는 제외. 모두 0일때 강원도임을 알 수 있다.
# object 데이터형인 컬럼 확인
object_col = df_final_onehoted.select_dtypes('object').columns
len(object_col), object_col
for col in mi_col:
df_final_onehoted[col] = df_final_onehoted[col].str.replace(',','').astype(float)
회의에서 필요없다고 판단되거나, 결측치가 많은 데이터 버림


# 인덱스 0~47까지 훈련 모델
x_sejong = df_mulga.iloc[0:48,:].drop(['세종특별자치시','월'], axis = 1)
y_sejong= df_mulga.iloc[0:48,:]['세종특별자치시']
x_train_mul, x_val_mul, y_train_mul, y_val_mul = train_test_split(x_sejong,
y_sejong,
test_size=0.1,
random_state=42,
)
x_train_mul = sm.add_constant(x_train_mul)
x_val_mul = sm.add_constant(x_val_mul)
lm = sm.OLS(y_train_mul, x_train_mul).fit()
pred_mul = lm.predict(x_val_mul)
fig, ax = plt.subplots(figsize=(5,4))
sns.scatterplot(x=y_val_mul, y=pred_mul , ax=ax)
plt.plot([min(y_val_mul), max(y_val_mul)], [min(y_val_mul), max(y_val_mul)], 'r', ls='--', lw=1)
plt.show()
lm.summary()

-> 지표가 매우 좋으므로 결측치에 채워넣는다

-> 잘 채워진 것을 확인
전체 경향 확인

-> 어떤 흐름을 따르지 않는다.
피처의 그래프

-> 선형회귀로 결측치를 채울 수 있을 것 같다.

model_sejong = LinearRegression()
model_sejong.fit(x_train_sejong, y_train_sejong)
pred_sejong = model_sejong.predict(x_test_sejong)
sejong[nan_index] = pred_sejong

-> 잘 채워진 것을 확인
전체 경향 확인

-> 경향을 따라가므로 OLS 로 결측치 채우기
결측있는 컬럼만 확인

-> 0~60까지 결측이라 그래프에 나오지 않음
OLS 로 결측치 채우기

-> 꽤 유효한 값이 나오므로 결측치를 채운다.

-> 매우 잘 채워진 것을 알 수 있다.


model_sejong = LinearRegression()
model_sejong.fit(x_train_sejong, y_train_sejong)
pred_sejong = model_sejong.predict(x_test_sejong)
sejong[nan_index] = pred_sejong



model_sejong = LinearRegression()
model_sejong.fit(x_train_sejong, y_train_sejong)
pred_sejong = model_sejong.predict(x_test_sejong)
sejong[nan_index] = pred_sejong



model_sejong = LinearRegression()
model_sejong.fit(x_train_sejong, y_train_sejong)
pred_sejong = model_sejong.predict(x_test_sejong)
sejong[nan_index] = pred_sejong

데이터 확인

-> IQR로 이상치 제거하면 다 없어질 것 같다. 따라서 너무 심하게 떨어진 값만 제거
제거 기준
중앙값 ~ 상한경계 길이의 5배가 넘으면 제거한다.
많은 값들이 뭉처있는 경우 제거하지 않는다.
연속적인 경향을 보이는 경우 제거하지 않는다.
제거한 데이터
고용보험 신규취득자수 (명) - 1개
실업자수 (천명) - 1개
주택매매가격변동률 (%) - 2개
건축허가면적증감률 (%) - 1개
민간아파트신규분양대수 - 3개
소매점, 생활서비스 - 3개

-> 여전히 극단적인 값이 많지만 전보다 안정된거 같다.
클래스의 히스토그램

피처의 히스토그램

-> 정규분포를 따르는 것도 있고 아닌 것도 있다. 함부로 판단하기가 어려었다.

-> 모두 0이 나올 수 있는 피처들이여서 이상함을 느끼지 못했다.
mi_col = []
nan_col = []
for col in minus_col:
if df_final_onehoted[col].isin(['-']).sum() == 0 :
mi_col.append(col)
else:
nan_col.append(col)
print('마이너스 가진 문자형 컬럼 : ',mi_col)
print()
print('결측치가 -로 표기된 컬럼 : ',nan_col)
for col in nan_col:
df_final_onehoted[col] = df_final_onehoted[col].str.replace(',','').replace('-', np.nan).astype(float)
결측값을 채워 넣는 단계에서만 시간이 오래 결렸다.
shape 도 같고, 에러도 발생하지 않는데, 왜 채워지지 않는 건지 정말 화가 났다.
해결 - 아래의 모든 조건이 맞아야 데이터프레임의 값이 바뀐다
1.데이터프레임에 값을 변경하기 위해서 접근항때는 iloc를 사용하면 안된다. 무조건 loc로 접근해야한다.