이번 6차 미니 프로젝트는 IT 인프라 요구사항 기반 DX 솔루션 기획 및 인프라 설계를 주제로 진행되었다.

5월 한 달 동안 인프라, 클라우드, 제안서 작성에 대해 배웠으며, 이를 바탕으로 요구사항을 분석하고 KT 엔터프라이즈 기술들을 활용해 작성하는 시간이었다.

요구사항 분석표에서 요구사항을 보고 세부 솔루션과 기능을 적는 것은 비교적 수월했으나, 서비스, 인프라, 클라우드 구성도를 작성하는 부분은 어려웠다.

사실 난 클라우드를 맡지 않아서 지금도 잘 모르지만 (?)  교육받을 때도 어려웠고, 이번 프로젝트에서도 역시 어려움을 느꼈다 ...  클라우드 관련 지식이 부족하다는 것을 느껴서 추가적인 공부가 필요하다고 생각했는데 우리 팀원들이 잘해서 이번 프로젝트는 그냥 넘어갔다...?

하지만 이번 빅프로젝트를 진행할 때는 클라우드 공부를 다시 해야겠다고 느꼈다.

 

 

- 서비스 구성도

 

 

 

- 인프라 구성도

 

 

 

5월 교육과 6,7차 미프는 이렇게 제안서와 구성도를 작성해 보는 시간이다.

대학생 때도 코딩 위주로 공부를 했기 때문에 제안서 작성 과정은 아직 낯설고 어렵게만 느껴진다. 그래도 입사 후 이러한 작업을 자주 하게 될 것 같아서 지금 미리 경험해 보는 것도 나쁘지 않다고 생각한다. 또한, 면접 때도 충분히 어필할 수 있을 것 같아서 한 번씩 다시 공부할 예정이다. 

 

p.s. 튜터님께서 현재 KT 직원분 같았는데 굉장히 무서웠다....

하지만 많은 도움을 주신 좋은 분이시다... 

 

 

그럼 뿅 !

 

허거걱 5기 자소서 쓰고 인적성 공부한 게 얼마 전 같은데 벌써 6기라니 ... 기분이 이상하네요 ㅋㅋㅋㅋ 🥹

현재 5기가 빅프로젝트를 남겨두고 있는 상황에서 6기 모집 시작이 되었습니다 !

 

에이블스쿨이란?

KT의 ‘AI 인재 양성 경험과 노하우’를 내부에서 외부로 확장하여, 고용노동부 K-Digital Training과 함께 대한민국 청년들을 ‘기업 실무형 AI/DX인재’로 양성하고, 일자리 창출에 기여하는 교육 프로그램입니다.

 

AI 개발자 Track

 

DX 컨설턴트 Track

 

 

 

모집기간  24.06.10(월) – 07.01(월) 17시까지

지원방법  aivle.kt.co.kr 접속 후 지원서 작성

 

 

가장 중요한 모집기간은 7월 1일 17시까지 !! 

혹시 이 글을 6월 30일... 7월 1일 ... 에 봤다고 해서 너무 슬퍼하지 마세요 

저도 마감 전 날 새벽에 알게 돼서 급하게 자소서 + 서류 준비해서 제출했답니다 🥹

물론 자소서는 써놓은 게 있어서 수정만 했지만 핵심은 언제든 늦지 않았다는 것 !

 

지원자격은 34세 이하(90.9.1 이후 출생자) 이고 국내외 정규 4년제 대학(학사 이상) 졸업자 및 졸업 예정자(~25년 2월) 이면 누구든 가능합니다! 전공 무관하며, 실제로 비전공자들도 많이 있습니다.

그리고 국민내일배움카드는 필수로 보유 또는 발급 가능해야 합니다 ! (국취제는 자유입니다)

 

에이블스쿨 6기 교육기간은 2024년 9월 초 ~ 부터 6개월이라고 하네요 !

이번에 졸업하는데 뭘 해야 할지 모르겠다. 포트폴리오를 쌓고 싶다. 생각이 들면 도전해 보는 게 좋을 듯합니다 :D

 

선발 절차는 다음과 같습니다. 참고하시면 좋을 것 같아요 😆

 

 

👉여기를 클릭👈 하면 홈페이지 접속 후 지원서 작성하실 수 있습니다 !

 

 

6기 모집 이벤트

KT 에이블스쿨 6기 모집과 동시에 친구추천 EVENT 가 진행되고 있습니다!
추천인으로 AIVLE ID가 작성되면 커피쿠폰을 증정한다고 하네요 😆
추천인 작성란에 >> d051254 << 작성 어떠신가요~? 

이렇게 6기 모집에 대해 알아보았는데, 저의 글을 보고 지원하시는 모든 예비 에이블러분들!

다들 좋은 기 받아서 합격하셨으면 좋겠습니다 🍀🍀

 

 

#1 과 이어지는 주제의 본격적인 분석에 앞서,

여기서는 한번에 처리할 수 있게 함수를 쓰라는 이장래 강사님의 말씀에 함수를 많이 사용했다 !

 

1. 데이터 셋 구성하기

먼저 필요한 데이터만 불러오기 위해 조건을 넣는 작업을 했다.

 

44번 매장의 데이터만을 대상

대표 상품(3, 12, 42) 데이터만을 대상

최근 14일 간의 가격 평균 열 추가

Target 의 값은 LeadTime 이후의 판매량

 

 

이러한 데이터들로 구성된 데이터셋을 각각 상품별로 만들어줬다.

def data(Product_ID) : 
  ....
  ....

 

이런식으로 함수를 짜고 다음과 같이 불러주면 데이터셋이 정상적으로 나온다. 

data03 = data(3)
data03.head()

 

3번 상품의 데이터를 불러온 것이다. 

 

 

2. 1차 모델링

이제 위에서 만든 데이터셋으로 1차 모델링을 해보았다.

Linear Regression 알고리즘을 사용해 모델링을 하였고, 검증용 데이터는 학습용 데이터에서 최근 120일간의 데이터를 사용하였다. 그리고 모델의 검증성도 평가하였다. 

 

+ 120일간의 데이터를 사용하고 싶을 때는 test_size=120 으로 설정하면 된다. 

 

1) 상품 3 - Beverage

RMSE: 3063.895212895694
MAE: 2181.3976205973186
MAPE: 5.635373376172825e+17
R2: 0.2786334942555373

 

2) 상품 12 - Milk

RMSE: 3190.3232296105966
MAE: 2310.713867862975
MAPE: 6.10442905302347e+17
R2: 0.28143214450362497

 

3) 상품 42 - Agricultural products

RMSE: 12.84332528024306
MAE: 10.598845521250416
MAPE: 0.10828094682732756
R2: 0.6941449525224404

 

 

[1차 모델링 결과]

 

전체적으로 값이 정확히 예측되지 않는 것을 볼 수 있다. 

데이터셋을 구성할 때 조건이 부족했을 뿐더러 모델링을 할 때 모두 기본 값으로 해서 그런지 성능이 낮게 나왔다.

이를 보완하기 위해서는 (1) 데이터셋을 더 자세하게 여러개의 열을 추가 해야하며, 

(2) Linear Regression이 아닌 다른 알고리즘도 사용해보아야한다. 마지막으로 (3) 모델링을 할 때 성능 튜닝도 해야 한다. 

 

 

그럼 이어서 2차 데이터셋 구성과 모델링을 해보자 !

 

 

3. 2차 데이터셋 구성 

 

아래와 같은 조건들을 추가해서 2차 데이터셋을 구성했다. 

아마 열이 더 늘어났으니 예측이 잘 되지 않을까 ,,,, 하는 마음으로 ,,,, ㅎㅎ

 

Category_Qty: 동일 카테고리 판매량 합계

City_CustCount: 동일 지역 방문객 수

Qty_Lag_1: 1일 전 판매량

Qty_Lag_7_mean: 최근 7일간 판매량 평균

기타 등등...

 

4. 2차 모델링

2차 모델링에서도 우선 Linear Regression 알고리즘을 사용해서 모델링해보았다.

그래서 1차 모델링에서 사용했던 함수에 데이터셋을 그대로 넣어주었다. 

 

1) 상품 3 - Beverage

RMSE: 2718.7119042392924
MAE: 1792.8660983664802
MAPE: 5.6658938559277485e+17
R2: 0.43201804933180843

 

 

2) 상품 12 - Milk

RMSE: 2919.9146095209367
MAE: 2026.2294404895947
MAPE: 6.001107786942954e+17
R2: 0.39808008101954195

 

 

3) 상품 42 - Agricultural products

RMSE: 12.371496510507702
MAE: 9.897858574139157
MAPE: 0.10222201231399056
R2: 0.7162047240187923

 

 

 

[2차 모델링 결과]

 

1차 모델링의 MAE 값과 2차 모델링의 MAE (Mean Absolute Error) 값만 비교해보면,

 

 Beverage   2181.4  >>  1792.9
Milk   2310.7   >>  2025.2
Agricultural products   10.6   >>  9.9

 

이러한 결과는 모델링 과정에서의 개선이 예측 성능에 긍정적인 영향을 미쳤음을 보여준다.

특히, 1차 모델링과 비교했을 때, 전반적으로 모든 항목에서 MAE 값이 낮아진 것은 모델의 정확도가 향상되었음을 의미한다. 그러나 일부 항목에서는 여전히 상대적으로 큰 MAE 값을 보이고 있어, 예측 성능을 더욱 향상시키기 위해서는 데이터셋의 구성 및 모델링 방법론의 추가적인 개선이 필요하다.

 

데이터셋을 구성하는 과정이 더욱 복잡하고 세밀해질수록, 예측 성능이 개선될 가능성이 크다는 것을 이번 분석을 통해 알게 되었다. 이는 보다 정교한 데이터 수집과 전처리 과정이 중요하다는 것을 시사한다. 이를 바탕으로, 앞으로는 데이터의 질을 높이고, 다양한 특성을 고려하는 방향으로 데이터셋을 구성할 필요가 있다.

 

따라서, 다음 단계에서는 Linear Regression 알고리즘이 아닌 다른 알고리즘을 활용하여 모델링을 시도할 계획이다.

이를 통해 보다 높은 예측 성능을 달성할 수 있을 것으로 기대된다. 다양한 알고리즘을 적용해 봄으로써, 각 알고리즘의 특성과 데이터에 대한 적합성을 평가하고, 최적의 모델을 찾아가는 과정이 될 것이다.

 

5. 3차 모델링

  Random Forest LightGBM
Beverage 1816.34 1984.72
Milk 2038.35 2398.19
Agricultural products 10.55 11.39

 

 

3차 모델링의 예측 결과값을 한눈에 비교하기 위해서 각 모델의 MAE (Mean Absolute Error) 값만을 추출하여 비교해 보았다. 이 비교를 통해 전체적인 성능 차이를 명확히 알 수 있었다.

먼저, LightGBM과 Random Forest의 성능을 비교해 보면, Random Forest가 전반적으로 더 우수한 성능을 보였다. 이는 Random Forest가 다양한 결정 트리를 결합하여 예측 성능을 향상시키는 특성이 반영된 결과로 보인다.

그러나, Linear Regression 모델과 비교했을 때는 이야기가 달라진다. Linear Regression 모델의 MAE 값이 가장 낮게 나타나, 다른 모델들보다 예측 정확도가 높은 것으로 나타났다. 이는 Linear Regression이 주어진 데이터 세트에서 가장 적합한 모델임을 시사한다. 

따라서, 이번 분석에서는 여러 복잡한 모델들이 존재함에도 불구하고, Linear Regression이 가장 좋은 성능을 보였음을 확인할 수 있었다. 이 결과는 데이터의 특성이나 모델의 적합성에 따라 간단한 모델이 오히려 더 나은 성능을 발휘할 수 있음을 보여준다.

 

마지막으로 데이터 프레임을 joblib를 사용해 저장할 때는 다음과 같이 저장 할 수 있다.

joblib.dump(data03, path + 'data03.pkl')

 

 

이렇게 5차 미니 프로젝트도 끝 !

사실 다른 프로젝트들도 있고 한 건 더 많지만 내가 복습하고 싶었던 부분은 여기까지이다.

그럼 뿅

 

벌써 5차 미니 프로젝트 .... (끝난지 한달됨) 의 주제는

 

유통 판매량 예측 및 재고 최적화

 

한개의 게시글로 될 줄 알았는데 쓰면서 오랜만에 복습도 하다 보니까 내용이 길어져서 ... 아마 2개로 나눌 것 같다. 

내가 지금까지 했던 미니 프로젝트들 중에 가장 재미있었는데, 그래서 리뷰할 내용이 많은 것 일수도 있다. 

TMI 로 5차 미프에서 내 걸로 2번이나 제출했당 희희 쁘이~

 

1. 상품별 변화량 비교

여기서 먼저 단변량 분석을 해보았는데, 이 글에서는 Product ID가 42인 상품에 대해서만 분석을 할 예정이다.

먼저 42번 상품은Agricultural products 농산물이다. 

df['변수'].diff() 형태로 변화량을 확인할 수 있는 코드는 다음과 같다. 

 

sales_42['Qty_Diff'] = sales_42['Qty'].diff()

 

Product ID가 42인 상품 (농산물) 의 판매량과 변화량을 시각화해 보면 다음과 같은 그래프가 나온다. 

 

판매량
변화량

 

히스토그램으로도 시각화해 보았다. 

 

 

2. 요일별 변화량 비교

두 번째로 Product ID == 42 (농산물) 의 요일별 판매량과 변화량을 막대그래프로 시각화해 비교해 보자

 

먼저 요일은 sales_42['Weekday'] = sales_42['Date'].dt.weekday 형태로 얻을 수 있다.

map 으로 0 : '월요일' , 1 : '화요일' .... 으로 연결해준다.

 

sales_42.groupby('Weekday')[['Qty', 'Qty_Diff']].mean() 으로 요일별 판매량의 평균 테이블을 새로 작성해 주고,

한눈에 보기 위해 막대그래프로 시각화를 해주었다.

 

 

참고. 예쁘게 꾸미고 싶어서 파스텔 무지개색 팔레트색을 사용했다. 

pastel_rainbow_palette = sns.color_palette("pastel")

 

 

 

3. 결론

 

[5-10월에 농산물 판매량이 높음]
1. 계절적 요인 :  농산물 생산이 활발하게 이루어지는 따뜻한 계절이며, 다양한 종류의 작물이 수확되는 시기임. 이로 인해 시장에 공급되는 농산물의 양이 증가하게 되어 판매량이 높아질 수 있음.
=> 농산물의 수확량이 증가하면 구매할 수 있는 양도 더 많아짐 : 판매량 증가
2. 휴가철 : 여름철에는 학생들의 방학 및 휴가철이 겹치는 경우가 많이 있음. 이로 인해 가정 내 식품 소비가 증가하고, 여행객들도 지역적인 농산물을 구매하는 경향 => 수요 높아지면 판매량 높아짐

[주말이 판매량 가장 높음 / 월요일이 가장 낮음]
1. 주말에는 사람들이 외식을 즐기거나 집에서 요리를 하기 위해 재료를 구매하는 경향 => 판매량 높음
그래서 월요일에는 집에서 준비한 음식을 먹는 경우가 많아져서 판매량 감소할 수도 있음
2. 일부 소비자들은 주말에 휴식을 취하고 주중에는 바빠서 외식을 하거나 식료품을 구매하는 시간을 갖지 않을 수 있음 이는 특히 월요일에 나타남
3. 일부 소비자들은 주말에 큰 쇼핑을 하고 월요일에 무거운 소비를 자제하는 경향. 이는 주말에 구매한 식료품을 사용하고 소비를 줄이는 것과 관련이 있음
4. 공급망 요인: 공급망이 월요일에 활성화되지 않아 식료품 재고가 부족할 수 있음. 이는 판매량이 감소하는 요인이 될 수 있음

 

 

마지막으로 지금까지 분석한 판매량과 변화량의 상관 계수를 알아보았다.

시각화만으로도 충분히 연관이 있다고 느꼈고, 상관 계수는 0.65 로 중간 정도의 관계가 나왔다. 

사실 생각했던 것보단 낮아서 조금 충격이었다.

0.8은 나올 줄 알았,,,

correlation = weekday_mean['Qty'].corr(weekday_mean['Qty_Diff'])

print("판매량과 변화량의 상관 계수:", correlation)
판매량과 변화량의 상관 계수: 0.653969813069822

 

 

이 글에서는 여기까지만 리뷰를 하고 다음 글에서 이어서 분석을 하고 예측 모델을 만들 예정이다. 

그럼 뿅 

 

4월 22일 - 23일에 진행되었던 4차 미니 프로젝트는 AICE 자격증을 대비하는 날이었다. 

 

여기서 AICE 란?

 

인공지능 활용능력을 평가하는 AICE, 초등학생부터 성인까지, 비전공자부터 AI 개발자까지 모두 도전 가능하다.

 

 

 

1) AICE Basic

 - 응시중 일체의 참고자료 활용 불가

 

2) AICE Associate / AICE Professional

 - 응시중 인터넷 검색 가능 (인공지능 챗봇 활용 불가)

 - 듀얼 모니터 사용 불가

 


 

여기서부터는 ASSO 대비 특강에서 공부한 문제들을 정리한 것이다. 

 

 

1. 라이브러리 설치

!pip install seaborn
import numpy as np
import pandas as pd
import sklearn as sk
import seaborn as sns
import matplotlib.pyplot as plt

 

2. 데이터 불러오기

# 1.
path = 'voc_data.csv'
df = pd.read_csv(path)

# 2.
df = pd.read_csv('voc_data.csv')

 

데이터 불러오는 방법은 다음과 같이 2개가 있다.

 

3. 데이터 구성 확인

# 앞에서부터 5개
df.head()

# 뒤에서부터 5개
df.tail()
# 데이터프레임 정보(컬럼정보, Null 여부, 타입)
df.info()

# 인덱스 확인
df.index

# 컬럼 확인
df.columns

# 값(value) 확인
df.values

# 칼럼들의 데이터타입 확인
df.dtypes

# 통계치 확인
df.describe()

# Null 존재하는지 확인
df.isnull().sum()

 

4. 결측치 처리

- 열(column) 삭제

# 1. 
df = df.drop(['열'], axis=1)
# 2. 
df.drop(['열'], axis=1, inplace=True)

 

- 행(row) 삭제

df = df.drop(df[df['열'] == '값'].index)

 

- 이상치 삭제

df = df.drop(df[df['열']>=300].index)

 

- 결측치 삭제

df = df.dropna()

 

- replace, fillna, map

# '_' > null 값으로 변경
df = df.replace('_', np.nan)
# Null 값을 최빈값으로 변경
df['열'].fillna(df['열'].mode(), inplace = True)
# Null 값을 중앙값으로 변경
df['열'].fillna(df['열'].median(), inplace = True)

 

- 시각화 방법

# bar 차트
df['열'].value_counts().plot(kind='bar')

# 히스토그램
sns.histplot(df['열'])

# kdeplot
sns.kdeplot(x='열1', hue='열2', data=df)

# countplot
sns.countplot(x='열1', hue = '열2', data=df)

# jointplot
sns.jointplot(x = '열1', y = '열2' , data=df)

# 상관관계 > 히트맵
df_corr = df4[['..', '...', '....']].corr()

sns.heatmap(df_corr,
           annot=True,
           cmap = 'Blues')

 

5. 원핫 인코딩 (One-Hot-Encoding)

# object 컬럼에 대해서 One-Hot-Encoding

dummies = ['..', '...', '....']
df6 = pd.get_dummies(data=df5, columns=dummies, drop_first=True)
# 특정 데이터 타입만 One-Hot-Encoding

object_cols = df.select_dtypes('object').columns.values
df = pd.get_dummies(data=df, columns= object_cols, drop_first=True)

 

6. x, y 데이터 분리

from sklearn.model_selection import train_test_split

target = '...'

x = df.drop(target, axis=1)
y = df.loc[:, target]   

x_train, x_test, y_train, y_test = train_test_split(x, y,
                    test_size=0.2, stratify=y, random_state= 42)

 

7. 머신러닝 모델링

1. LogisticRegression

from sklearn.linear_model import LogisticRegression

model = LogisticRegression(C = 10, max_iter = 2000)

model.fit(x_train, y_train)

 

2. DecisionTree

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(max_depth=10, random_state=42)

model.fit(x_train, y_train)

 

3. KNN

from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors=5)

model.fit(x_train, y_train)

 

4. RandomForest

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100, random_state=42)

model.fit(x_train, y_train)

 

5. XGBoost

from xgboost import XGBClassifier

model = XGBClassifier(n_esimators=5)

model.fit(x_train, y_train)

 

6. LightGBM

from lightgbm import LGBMClassifier

model = LGBMClassifier(n_estimators=3)

model.fit(x_train, y_train)

 

7. Linear Regression

x_data = np.array([1.6, 2.3, 3.5, 4.6]).reshape(-1,1)
y_data = np.array([3.3, 5.5, 7.2, 9.9]
from sklearn.linear_model import LinearRegression

linear_model = LinearRegression()

linear_model.fit(x_data, y_data)

 

8. 딥러닝 모델링

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
model = Sequential()

model.add(Dense(64, activation='relu', input_shape=(x_train.shape[1],)))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(16, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', 
              loss='binary_crossentropy', 
              metrics=['acc'])
es = EarlyStopping(monitor='val_loss', 
                   patience=4, 
                   mode='min', 
                   verbose=1)

mc = ModelCheckpoint('best_model.keras', 
                     monitor='val_loss', 
                     save_best_only=True, 
                     verbose=1)
history = model.fit(x_train, y_train, 
                        batch_size=10, 
                        epochs=10, 
                        callbacks=[es, mc],
                        validation_data=(x_test, y_test), 
                        verbose=1)

 

이렇게 ASSO 대비 모의고사로 풀어봤던 문제들을 정리해 보았다. 

전처리, 머신러닝, 딥러닝까지 다 포괄하고 있는 시험이라 헷갈리는 코드들이 있었는데 한번 쭉 정리를 하면서

애매하게 알고 있었던 부분을 정확히 알게 된 계기가 되었다.

또한, 에이블스쿨에서의 AICE 시험은 6월이라 아직 한달 하고 조금 더 기간이 남아있는데,

시험공부를 할 때쯤 이 포스터를 보면서 같이 공부를 하면 도움이 될 것 같아서 정리를 해봤다.

다른 분들에게도 도움이 됐으면 좋겠다...!

 

그럼 6월에 합격 후기로 찾아와야지 키키

 

 

'KT AIVLE School' 카테고리의 다른 글

08. 5차 미니 프로젝트 후기 #2  (1) 2024.05.26
07. 5차 미니 프로젝트 후기 #1  (3) 2024.05.25
05. 3차 미니 프로젝트 후기  (2) 2024.04.29
04. 머신러닝 복습 #1  (4) 2024.04.23
03. 2차 미니 프로젝트 후기  (4) 2024.03.25

1차 미프는 2일이었는데 점점 길어지는 미프 ...

그래서 이번 3차는 4일동안 진행되었다 !

머신러닝은 해도 해도 어려운 것 같다 .... 아직 낯가리는 중 흑흑

 

이번 미프 주제는 단지별 등록 차량 수를 예측하는 것이다.

이에 맞게 전처리는 미리 끝낸 상태이고, 분석과 예측을 해볼 것이다.

 

1. 데이터 분석

  • Boxplot

  • histplot

 

해당 그래프는 실차량수, 총세대수, 임대료, 임대보증금의 분포를 boxplot 과 histplot 으로 분석해봤다.

최솟값, 최댓값, 중앙값 그리고 이상치 등등을 알 수 있으며 값의 분포를 시각적으로 볼 수 있다. 

 

 

2. 전체 숫자형 변수들 간의 상관관계

범주형 변수를 제외한 데이터셋을 이용하여 상관관계를 구하였다.

여기서 실차량수와 상관계수가 높은 상위 3개에 대해서 산점도를 그릴 것이다. 

 

 

실차량수와 상관계수가 높은 상위 3개 : 총 세대수, 전용면적 40-60, 임대보증금

 

 

1) 숫자형 feature --> 실차량수

 

- 총 세대수 : 0.71

- 전용면적 40-60 : 0.58 

- 임대보증금 : 0.36 

( * 사실상 임대보증금과 실차량수의 관계는 강하다고 볼 수 없음)

 

2) 범주형 feature --> 실차량수

 

아래의 그래프는 지역별 실차량수를 막대그래프로 나타낸 것이다. 세종, 서울, 경기의 실차량수가 많은 것을 볼 수 있다. 

 

이렇게 전처리를 하고 분석을 해본 데이터를 가지고 모델링을 할 것이다. 

 

3. 모델링

 

1) 선형 회귀

model1_1 = LinearRegression()
model1_1.fit(x_train, y_train)

pred1_1 = model1_1.predict(x_val)

 

 

순서대로 mse, mae, mape

187.69609754963906
145.5329087342875
0.9243237984713156

 

2) 릿지 회귀

model1_2 = Ridge()
model1_2.fit(x_train, y_train)

pred1_2 = model1_2.predict(x_val)

187.88044568149056
146.15736123439933
0.9219919741543334

 

3) 라쏘 회귀

model1_3 = Lasso()
model1_3.fit(x_train, y_train)

pred1_3 = model1_3.predict(x_val)

188.4371948847677
146.8571169591565
0.9214979465988398
선형 회귀 릿지 회귀 라쏘 회귀
145.53 146.15 146.85

 

위의 모델로 성능 결과를 비교해보면, 선형 회귀 모델의 성능이 가장 좋게 나왔다. 

각 모델들을 튜닝을 통해 더 좋은 성능을 가진 모델을 만들 수 있지만 이 게시글에서 여기까지만 할 예정이다!

모델을 만들어서 비교를 하는게 신기하면서도 어렵다고 느꼈다. 앞으로 이쪽 공부를 더 열심히 해서 익숙해지는 것부터 해야겠다. 그럼 3차 미프도 이렇게 끝 !

지금까지쉽고 할 만했지만 이번주부터는 머신러닝이기에 ...

어려운 걸 아니까 미리미리 복습을 할 거다 ! (라고 하고 2주만에 하는중 ...) 

빠이팅 ... !

 


 

1. 로지스틱 회귀 (LogisticRegression)

  • 알고리즘: LinearRegression
  • 평가방법: mean_absolute_error

 

[데이터 준비]

  • target 설정
target= 'medv'

 

 

  • x , y로 데이터 분리 : x는 target을 뺀 나머지, y는 target
x = data.drop(target, axis=1)
y = data.loc[:, target]
  • 모듈 불러오기
from sklern.model_selection import train_test_split
  • 7:3 으로 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3)

 

[모델링]

  • 모듈 불러오기
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
  • 선언하기
model = LinearRegression()
  • 학습하기
model.fit(x_train, y_train)
  • 예측하기 
y_pred = model.predict(x_test)
  • 평가하기
print('MAE', mean_absolute_error(y_test, y_pred))
MAE 3.5783053562430744

 

  • 시각화

 

위의 그래프는 예측 값과 실제 값을 선 그래프로 비교한 것이다. 

mae 값은 0에 가까울수록 좋으며 3.57 으로 정확도가 비교적 높은 편임을 알 수 있다. 

 


  • classification_report 
    1. y값을 예측하여 confusion matrix 를 구하고 히트맵으로 시각화
    2. classification_report 활용하여 성능 출력 
y_pred = model.predict(x_test)
print(classification_report(y_test, y_pred))

cm = confusion_matrix(y_test, y_pred)

sns.heatmap(cm,
           annot=True,
           cmap='Blues',
           fmt = 'd')
plt.show()

classification_report

 

히트맵

 

1차 미프가 얼마 안 된 것 같은데 벌써 2차 미프 !!!!!

2차 미프는 0320-0322 로 총 3일간 진행되었다. 

 

역시나 전농교육장으로 예약을 했고 아침 일찍 커피를 사들고 갔다,,, 총총

먼저 음식 사진부터 .... 참고로 난 사진을 잘 못 찍음 !

근데 사진 보니까 진짜 못 찍었네 ^^

 

 

이건 목요일 점심에 먹은 거 !!

첨엔 일식집으로 갔는데 다들 포장/배달 전문이더라 ....? 흑흑

그래서 김밥천국으로 노선 변경 ~.~ 

가서도 돈가스 먹기 ㅋㅋㅋㅋㅋ 근처에 있었음 !

 

 

금요일에는 마라탕을 먹었는데 진짜 맛있었음 ... ㅜㅜ

근데 문제는 점심을 넘 헤비 하게 먹어서 오후에 졸렸다 ... 

여기 아이스크림도 공짜 !!!! 꺅 넘 배 터지게 먹었는데 이름을 까먹었다.

 

 


 

 

그리고 이제 본론을 말해보자면, 

이번 미프 주제는 어느 지역에 정류장과 노선을 추가하는 것이 좋을까?이다. 

 

 

1. 가설

  • 인구 이동량이 많은 지역일수록 해당 지역의 노선 수요가 높을 것이다.
  • 노선 수가 적을수록 이동 시간이 높을 것이다.

 

2. 결과 분석

 

인구 이동량이 많은 지역일수록 해당 지역의 노선 수요가 높을 것이다.

 

 

상관계수:0.06575223775929234, P_value:0.7548369356689788

 

결과를 보면, 이동 인구의 합과 노선수는 관련이 없는 것을 볼 수 있다. 

점이 직선을 따라 분포되어 있지 않으며 상관계수는 0.06으로 매우 낮고 p-value 값 또한 유의미하지 않는 결과이다. 

그래서 승하차 승객수와 비교를 해보았는데, 

 

1) 승차 총 승객수

상관계수:0.6924297291710948, P_value:0.0001252983060152851

 

 

2) 하차 총 승객수

상관계수:0.6818200903353782, P_value:0.0001744480772107051

 

 

승차/하차 총승객수는 노선수와 강한 관계를 맺고 있으며 p-value 값도 매우 유의미한 것을 볼 수 있다. 

이로 인해 노선수는 이동 인구(합)가 아니라 승차/하차 총 승객수와 관련이 있다고 도출되었다. 

 

 


 

 

노선 수가 적을수록 이동 시간이 높을 것이다.

 

 

자치구별로 평균 이동 시간을 시각화해보았다. 

강동구, 강서구가 평균 이동 시간이 많이 걸리는 것을 볼 수 있다. 

 

상관계수:-0.5451657321744252, P_value:0.004828245942394804

 

다음 가설인 노선수가 적을수록 이동 시간은 높을 것이다. 를 증명하기 위해 평균 이동 시간(분)과 노선수를 분석해 보았다.

그래프를 보면 완전히 직선을 따라 분포돼있지는 않지만 어느 정도 규칙성이 보이며,

상관계수와 p-value 값을 보았을 때 관련이 있다는 것이 보인다. 

 

 

이제 정류장과 노선수를 어느 지역에 설치해야 할지 구제척으로 보기 위해 다음과 같은 그래프를 만들어 보았다. 

 

 

 

노선수와 평균 이동 시간의 관계는 중간 정도임을 위에서 확인하였다.

그리고 그래프를 보면 노선수가 적은 지역일수록 이동 시간이 많이 걸리는 것을 한눈에 볼 수 있다. 

 

 

그렇게 가설 검증을 한 결과, 노선수를 추가해야 하는 지역은 강동구라고 결론을 내렸다.

 

 

결론 :  인구가 많지만 정류장/노선수가 적은 지역은 이용자 편의성 감소, 이용률 저하, 지역 접근성 감소, 교통 혼잡 증가, 지역 발전 저해 등 의 문제점이 발생한다.  강동구, 강서구, 노원구와 같이 노선수에 비해 정류장 수가 많은 지역들은 주로 주거 지역으로 발전되어 왔다. 반면에 정류장 수보다 노선 수가 많은 종로구와 중구는 도심 지역으로 분류되며, 이에 따라 정류장 수는 적지만, 지하철과 버스 등 다양한 교통수단을 활용할 수 있는 특징을 가지고 있다.

또한, 평균 이동 시간이 긴 지역으로는 강동구 강서구가 있는데 이 지역들은 동시에 노선수가 적은 지역이기도 하다. 

이 처럼 정류장에 비해 노선수가 적고, 인구가 많이 분포되어 있는 강동구, 강서구가 교통의 불편함으로 인해 평균 이동시간이 많이 걸리는 것을 볼 수 있으며 반면, 노선수가 많은 지역인 중구, 용산구, 동작구는 평균 이동 시간이 적은 것을 볼 수 있다.

 


 

 

2차 미프 끝!! 끝나고 삼겹살 집에서 회식을 했다.

 

 

 

고기 뇸뇸

그럼 뿅 !

+ Recent posts