본문 바로가기
프로그램

[파이썬] 문제 : sklearn LinearRegression

by 오디세이99 2023. 6. 10.
728x90
반응형
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# 주어진 데이터
# data = {
#     '분기': ['2019_1','2019_2','2019_3','2019_4','2020_1','2020_2','2020_3','2020_4','2022_1','2022_2'],
#     '서울 강남':[4.5, 4.5, 2.1, 3.1, 2.8, 2.5, 2.5, 2.5, 5.1, 3.4],
#     '서울 영등포신촌':[3.1, 1.3, 3.3, 2.9, 4.8, 4.7, 5, 7.8, 7.4, 8.3],
#     '서울 기타':[2.2, 2.4, 3.5, 3.9, 4.3, 4.4, 5.2, 6.8, 5.2, 5.6]
# }
data = {
    '분기': ['2019_1','2019_2','2019_3','2019_4','2020_1','2020_2','2020_3','2020_4','2022_1','2022_2'],
    '서울 강남':[4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
    '서울 영등포신촌':[2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    '서울 기타':[3, 3.5, 5.5, 5.5, 7.5, 8.5, 9.5, 10, 11, 12]
}

# 데이터프레임 생성
df = pd.DataFrame(data)                   # 딕셔너리데이터를 DataFrame으로 만듬

X = df[['서울 강남','서울 영등포신촌','서울 기타']]            # 3개 컬럼 데이터만 사용
y = df[['서울 강남','서울 영등포신촌','서울 기타']].shift(-1)  # y는 다음 분기 데이터. shift(-1)은 다음 분기 데이터를 가리킴

print('X=',X)
print('y=',y)
# X = X[:-1]    # y가 다음분기 데이터여서 
# y = y[:-1]

split_n = 2                  # 몇 개를 test용으로 사용할 것인지(뒤에서 2개)
train_x = X[:-(split_n)]     # X[:-2] 앞에서부터 뒤에서 2번째 전까지
train_y = y[:-(split_n)]
test_x = X[-(split_n):]      # X[-2:] 뒤에서 2번째부터 끝까지
test_y = y[-(split_n):]

print('\n\ntrain_x\n',train_x)
print('\n\ntrain_y\n',train_y)
print('\n\ntest_x\n',test_x)
print('\n\ntest_y\n',test_y)

# 모델 구축 및 학습
model = LinearRegression()
model.fit(train_x, train_y)   # 학습

# 예측
# predicted = model.predict(new_df.drop('분기', axis=1))
predicted = model.predict(test_x)   # 예측

print('\n\ntest_y\n',test_y)
print( '\n\npredicted\n',predicted)

# 예측 결과 시각화
# 1번째 예측
labels = X.columns.tolist()
plt.bar(labels, predicted[0])
plt.xlabel('서울 구역')
plt.ylabel('공실률')
plt.title('2022년 3분기 서울 구역별 공실률 예측')
plt.show()

# 2번째 예측(제일 끝)
plt.bar(labels, predicted[1])
plt.xlabel('서울 구역')
plt.ylabel('공실률')
plt.title('2022년 3분기 서울 구역별 공실률 예측')
plt.show()

-

X=    서울 강남  서울 영등포신촌  서울 기타
0      4         2    3.0
1      5         3    3.5
2      6         4    5.5
3      7         5    5.5
4      8         6    7.5
5      9         7    8.5
6     10         8    9.5
7     11         9   10.0
8     12        10   11.0
9     13        11   12.0
y=    서울 강남  서울 영등포신촌  서울 기타
0    5.0       3.0    3.5
1    6.0       4.0    5.5
2    7.0       5.0    5.5
3    8.0       6.0    7.5
4    9.0       7.0    8.5
5   10.0       8.0    9.5
6   11.0       9.0   10.0
7   12.0      10.0   11.0
8   13.0      11.0   12.0
9    NaN       NaN    NaN              <= y를 다음 데이터로 했기 때문에 제일 마지막은 Nan
                                          하지만 이 데이터는 예측용이기 때문에 문제 안됨
                                          실제 사용시에는 이 데이터를 즉 y 값을 예측하는 것임


train_x
    서울 강남  서울 영등포신촌  서울 기타
0      4         2    3.0
1      5         3    3.5
2      6         4    5.5
3      7         5    5.5
4      8         6    7.5
5      9         7    8.5
6     10         8    9.5
7     11         9   10.0


train_y
    서울 강남  서울 영등포신촌  서울 기타
0    5.0       3.0    3.5
1    6.0       4.0    5.5
2    7.0       5.0    5.5
3    8.0       6.0    7.5
4    9.0       7.0    8.5
5   10.0       8.0    9.5
6   11.0       9.0   10.0
7   12.0      10.0   11.0


test_x
    서울 강남  서울 영등포신촌  서울 기타
8     12        10   11.0
9     13        11   12.0


test_y
    서울 강남  서울 영등포신촌  서울 기타
8   13.0      11.0   12.0
9    NaN       NaN    NaN


test_y
    서울 강남  서울 영등포신촌  서울 기타
8   13.0      11.0   12.0
9    NaN       NaN    NaN


predicted
 [[13.         11.         12.53846154]
 [14.         12.         13.61794872]]

728x90
반응형

댓글