데이터분석라이브러리함수모음

Ove·2024년 6월 20일
0
post-thumbnail

1.scikit-learn를 별칭(alias)sk로 임포트하는 코드를 작성하고 실행하세요

import sklearn as sk

2.Pandas는 데이터 분석을 위해 널리 사용되는 파이썬 라이브러리입니다.

Pandas를 사용할 수 있도록 별칭 (alias)을 pd로 해서 불러오세요

import pandas as pd

3. Pandas함수 2개 데이터 파일을 읽고 합쳐서 1개의 데이터프레임 변수명 df에 할당하는 코드를 작성하세요

A0007IT.json 파일을 읽어 데이터 프레임 변수명 df_a에 할당하세요

signal.csv 파일을 읽어 데이터 프레임 변수명 df_b에 할당하세요

df_a와 df_b 데이터프레임을 판다스의 merge 함수를 활용하여 합쳐 데이터프레임 변수명 df에 저장하세요

합칠 때 사용하는 키(on):'RID'

합치는 방법 (how):'inner'

df_a = pd.read_json('A0007IT.json')
df_b = pd.read_csv('signal.csv')
df = pd.merge(df_a, df_b, on = 'RID', how='inner')

4.Address1에 대해 countplot그래프로 만드는코드와 답안을 작성하세요

Seaborn활용

Address1에 대해서 분포를 보여주는 countplot그래프

지역명이 없는 '-'에 해당하는 row(행) 삭제

import seaborn as sns

sns.countplot(data = df , x = 'Address1')
df = df[df['Address1'] !='-']
plt.show()

5. 실주행시간과 평균시속의 분포의 길이를 다음과 같이 확인하려고합니다

Time_Driving(실주행시간)과 Speed_Per_Hour(평균시속)을 jointplot그래프로 만드세요

Seaborn 활용

x축에는 Time_Driving표시, Y축에는 Speed_per_Hour 표시하세요

sns.jointplot(data= df, x = 'Time_Driving', y= 'Speed_Per_Hour')
plt.show()

6. 위의 jointplot 그래프에서 시속 300이 넘는 이상치를 발견할 수 있었습니다. 가이드에 따라서 전처리를 수행하고 저장하세요

대상 데이터프레임:df

jointplot그래프를 보고 시속 300이상이 되는 이상치를 찾아 해당 행(Row)을 삭제하세요

불필요한 'RID'컬럼 삭제

전저리 반영 후 새로운 데이터프레임 변수명 df_temp에 저장

df=df[df['Speed_Per_Hour']<300]
df_temp = df = df.drop(columns = 'RID')

7. 모델링 성능을 제대로 얻기 위해서 결측치 처리는 필수입니다.

대상 데이터프레임 : df_temp

결측치를 확인하는 코드 작성

결측치가 있는 행(raw) 삭제

전처리 반영된 결과를 새로운 데이터프레임 변수명 df_na에 저장

df_temp.isna().sum()
df_na = df_temp.dropna(axis= 0)

8. 모델링 성능을 제대로 얻기 위해서 불필요한 변수는 삭제해야합니다.

대상 데이터프레임: df_na

'Time_Departure', 'Time_Arrival' 2개 컬럼을 삭제하세요

전처리 반영된 결과를 새로운 데이터프레임 변수명 df_del에 저장하세요

df_del = df_na.drop(['Time_Departure','Time_Arrival'], axis = 1)

9. 원-핫 인코딩(One-hoe encoding)은 범주형 변수를 1과 0의 이진형 백터로 변환하기 위해 사용하는 방법입니다.

원-핫 인코딩으로 아래 조건에 해당하는 컬럼 데이터를 변환하세요

대상 데이터프레임: df_del

원-핫 인코딩 대상: object타입의 전체컬럼

활용함수: Pandas의 get_dummies

해당 전처리가 반영된 결과를 데이터프레임 변수 df_preset에 저장

cols = df_del.select_dtypes('object').columns
df_preset = pd.get_dummies(data = df_del, columns = cols)

10.훈련과 검증 각가에 사용할 데이터셋 분리

Time_Driving(실주행시간)컬럼을 label값 y로, 나머지 컬럼을 feature값 x로 할당한 후 훈련데이터셋과 검증데이터셋으로 분리

대상 데이터프레임: df_preset

훈련과 검증 데이터셋 분리

훈련 데이터셋 label : y_train, 훈련 데이터셋 Feature: x_train

검증 데이터셋 label: y_valid, 검증 데이터셋 Feature: x_valid

훈련 데이터셋과 검증데이터셋 비율은 80:20

random_state: 42

Scikit-learn 의 train_test_split 함수를 활용

RobustScaler 스케일링 수행

sklearn.preprocessing의 RobustScaler함수 사용

훈련데이터셋의 Feature는 RobustScaler의 fit_transform 함수를 활용하여 x_train변수로 할당

검증데이터셋의 Feature는 RobustScaler의 transform 함수를 활용하여 x_test변수로 할당

from sklearn.model_selection import train_test_split

x = df_preset.drop('Time_Driving', axis = 1)
y = df_preset['Time_Driving']

x_train, x_test, y_train, y_test = train_test_split( x, y , test_size = 0.2, random_state =42)
# 스케일링 수행
scaler = RobustScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)

11. Time_Driving(실주행시간)을 예측하는 머신러닝 모델을 만들려고 합니다. 의사결정나무 (decision tree)와 랜덤포레스트(RandomForest)는 여러가지 규칙을 순차적으로 적용하면서 독립변수 공간을 분할하는 모형으로 분류(classification)와 회귀 분석 (regression)에 모두 사용될 수 있습니다. 아래 가이드에 따라 의사결정나무(decision tree)와 랜덤포레스트(RandomForest)모델을 만들고 학습을 진행하세요

의사결정나무(decision tree)

트리의 최대깊이: 5

노드를 분할하기 위한 최소한의 샘플 데이터수(min_samples_split):3

random_state: 120

의사결정나무(desicion tree)모델을 dt변수에 저장

랜덤포레스트(RandomForest)

트리의 최대깊이:5

노드를 분할하기 위한 최소한의 샘플 데이터수(min_samples_split): 3

random_state: 120

랜덤포레스트(RandomForest)모델을 rf변수에 저장

위의2개의 모델에 대해 fit을 활용해 모델을 학습해주세요. 학습시 훈련데이터 셋을 활용

from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor

dt = DecisionTreeRegressor(max_depth=5, min_samples_split=3, random_state = 120)
dt.fit(x_train, y_train)


rt = RandomForestRegressor(max_depth = 5, min_samples_split = 3, random_state=120)
rt.fit(x_train, y_train)

# 예측 수행
y_pred_dt = dt.predict(x_test)
y_pred_rt = rt.predict(x_test)

# 결과 출력
print("Decision Tree Predictions:", y_pred_dt)
print("Random Forest Predictions:", y_pred_rt)

두 모델의 평균 제곱 오차(MSE) 값을 비교한 결과:

의사결정나무(Decision Tree)의 MSE: 573
랜덤포레스트(Random Forest)의 MSE: 548
MSE 값은 낮을수록 모델의 예측 성능이 좋음을 나타냅니다. 따라서, 랜덤포레스트(Random Forest) 모델이 더 낮은 MSE 값을 가지므로 의사결정나무(Decision Tree) 모델보다 더 좋은 성능을 보이는 것으로 판단할 수 있습니다.

결론적으로, 주어진 결과에서 랜덤포레스트(Random Forest) 모델이 더 좋은 성능을 보입니다.

12. 위 의사결정나무와 랜덤포레스트 모델의 성능평가. 아래 가이드에 따라 예측결과의 mae(Mean Absolute Error)를 구하고 평가

성능 평가는 검증 데이터셋을 활용

11번 문제에서 만든 의사결정나무 (decision tree)모델로 y값을 예측(predict)하여 y_pred_dt에 저장

검증 정답(y_vaild)과 예측값(y_pred_dt)의 mae(Mean Absolute Error)를 구하고 dt_mae변수에 저장

11번 문제에서 만든 랜덤포레스트 모델로 y값을 예측 (predict)하여 y_pred_rd에 저장

검증 정답(y_valid)과 예측값(y_pred_rf)의 mae(Mean Absolute Error)를 구하고 rf_mae 변수에 저장

from sklearn.metrics import mean_absolute_error

dt_mae = mean_absolute_error(y_test, y_pred_dt)
rf_mae = mean_absolute_error(y_test, y_pred_rf)

print("Decision Tree - Mean Absolute Error:", dt_mae)
print("Random Forest - Mean Absolute Error:", rt_mae)

13.Time_Driving(실주행시간)을 예측하는 딥러닝모델

Tensonflow framework를 사용하여 딥러닝 모델을 만드세요

히든레이어(hidden layer) 2개 이상으로 모델을 구성하세요

손실함수는 MSE(Mean Squared Error)를 사용하세요

하이퍼파라미터 epochs:30, batch_size:16으로 설정

각 에포크마다 loss 와 metrics 평가하기 위한 데이터로 x_valid, y_valid 사용

학습 정보는 history변수에 저장

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import MeanSquareError

model = Sequential([
	Dense(64, activation='relu', input_shape = (x_train.shape[1],)),
    Dense(32, acitivatio='relu'),
    Dense(16, activation='relu'),
    Dense(1)
    ])
    
model.complie(optimizer=Adam(), loss= MeanSquaredError(), metrics=['mae'])

history = model.fit(
	x_train, y_train,
    epochs = 30, 
    batch_size=16,
    validation_data=(x_valid, y_valid)
)

14. 위 딥러닝 모델의 성능을 평가

Matplotlib 라이브러리 활용해서 학습 mse와 검증 mse를 그래프로 표시하ㅔ요

1개의 그래프에 학습 mse과 검증 mse 2가지를 모두 표시하세요

위 2가지 각각이 범례를 'mse', 'val_mse'로 표시하세요

그래프의 타이틀은 'Model MSE'로 표시

x축에는 'Epochs'라고 표시하고 y축에는 'MSE'라고 표시

import matplotlib.pyplot as plt

mse = history.history['loss']
val_mse = history.history['val_loss']

epochs = range(1, len(mse)+1)

plt.figure(figsize=(10,6))
plt.plot(epochs,mse,'ro-', label='val_mse')
plt.title('Model MSE')
plt.xlabel('Epochs')
plt.ylabel('MSE')
plt.legend()
plt.grid(True)
plt.show()

0개의 댓글