Python 데이터 분석(5)

문병두·2024년 11월 25일

python

목록 보기
5/5

데이터 핸들링

01-01.Data 형태 확인

import pandas as pd

Data 형태 확인

df.shape

Data type 확인

df.info()

Null 값 확인

df.isnull().sum()

01-02.Unique한 Value별 카운팅

df['col'].unique()

01-03.DataFrame 특정값 치환

import numpy as np
import pandas as pd
df.replace(-200, np.NaN)

01-04.Null 값 이전 값으로 채워넣기

import numpy as np
df.fillna(method='ffill')

특정 col만 가져오기

df[['col1', 'col2']]

조건에 맞는 DataFrame 출력

df[ (df['T'] >= 25) & (df['T'] <= 27) ]

오름차순, 내림차순 정렬

df['col'].sort_values(ascending=False)

특정값이 포함된 Data 찾기

df[df['col'].astype(str).str.contains('text')]

특정 조건 만족하는 값, 변경하기

import numpy as np
np.where(df['col'] <= 5, 1, 0)

groupby 활용 카운팅

df['y'].groupby(df['job']).value_counts()

pivot table 활용 데이터 처리

df_job = pd.pivot_table(df_job, # 피벗할 데이터프레임
index = 'index', # 행 위치에 들어갈 열
columns = 'col', # 열 위치에 들어갈 열
values = 'value') # 데이터로 사용할 열

중복 데이터 처리

df.drop_duplicates(['col'], keep = 'first', inplace=True)

데이터 시각화

Numeric(연속형) 변수 분포 확인

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use(['dark_background'])

displot 활용 분포 그리기

sns.displot(df['col']);

분포의 평균도 같이 출력

print("col :", df['col'].mean())

Plot size 조절

import matplotlib.pyplot as plt

(20, 5) → 가로 inch, 세로 inch

plt.gcf().set_size_inches(20, 5)

산점도(Scatter plot) 그리기

sns.scatterplot(x=df['x'], y=df['y'], hue = df['hue'], data=df)

line plot 그리기

plt.plot(df['x'], df['y'], label='label')

pairplot 상관관계 분석

모든 변수 조합에 관한 Scatter plot

df_pair = df[['col1', 'col2', 'col3', 'col4']]
sns.pairplot(df_pair)
plt.show()

catplot 그리기

plt.style.use(['dark_background'])

sns.catplot(x="x", hue="y", kind="count",palette="pastel", edgecolor=".6",data=df);
plt.gcf().set_size_inches(25, 3)

데이터 분석 및 모델링

Train/Test set 분할

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics

X=df_merge.drop(['y'], axis=1)
Y=df_merge['y']

x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, stratify=Y)

print(x_train.shape)
print(y_train.shape)

print(x_test.shape)
print(y_test.shape)

모델 학습 및 예측

from sklearn.ensemble import RandomForestClassifier

모델 학습

rfc = RandomForestClassifier(random_state=123456)
rfc.fit(x_train, y_train)

예측

예측은 학습에 사용된 Data와 Test Data 모두 예측하고 평가함(※ 과적합 여부 판별)

y_pred_train = rfc.predict(x_train)
y_pred_test = rfc.predict(x_test)

이진분류 모델 성능 확인

from sklearn.metrics import classification_report
print(classification_report(y_train, y_pred_train))
print(classification_report(y_test, y_pred_test))

하이퍼 파라미터 튜닝

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

params = { 'n_estimators' : [400, 500],
'max_depth' : [6, 8, 10, 12]
}

RandomForestClassifier 객체 생성 후 GridSearchCV 수행

rf_clf = RandomForestClassifier(random_state = 123456, n_jobs = -1)
grid_cv = GridSearchCV(rf_clf, param_grid = params, cv = 3, n_jobs = -1, scoring='recall')
grid_cv.fit(x_train, y_train)

print('최적 하이퍼 파라미터: ', gridcv.best_params)
print('최고 예측 정확도: {:.4f}'.format(gridcv.best_score))

중요 변수 파악(Feature Importance)

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use(['dark_background'])

rfc → 생성한 Model에 name 기재

ftrimportances_values = rfc.feature_importances
ftr_importances = pd.Series(ftr_importances_values, index = x_train.columns)
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20]

plt.figure(figsize=(8,6))
plt.title('Feature Importances')
sns.barplot(x=ftr_top20, y=ftr_top20.index)
plt.show()

모델 Save & Read

import pickle

모델 저장

saved_model = pickle.dumps(model)

모델 Read

model_from_pickle = pickle.loads(saved_model)

상관계수 값 출력

import scipy.stats as stats
stats.pearsonr(x=df['x'], y=df['y'])

선형회귀 상관계수 확인

dfcoef = pd.DataFrame({'col':X.columns, 'coef':mlr.coef}).reset_index(drop=True)
df_coef

min-max scale 활용 정규화

from sklearn.preprocessing import minmax_scale

rfm['Recency'] = minmax_scale(rfm['Recency'], axis=0, copy=True)

profile
데이터분석가

0개의 댓글