Jun's Blog
클래스 분류와 KNN의 활용 예시 본문
KNN(K-Nearest Neighbors, K 최근접 이웃)은 머신러닝에서 사용되는 분류(classification) 또는 회귀(regression) 알고리즘 중 하나입니다.
KNN은 주변의 가까운 데이터를 기반으로 예측을 수행하는 알고리즘입니다.
# 기본 라이브러리 불러오기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 그래프의 폰트를 'Malgun Gothic'으로 설정하여 한글 폰트가 잘 보이도록 함
plt.rc('font', family='Malgun Gothic')
# 그래프에서 음수 기호를 제대로 표시하도록 설정
plt.rcParams['axes.unicode_minus'] = False
# [Step 1] 데이터 준비
# Seaborn에서 제공하는 Titanic 데이터셋을 불러와서 분석을 시작합니다.
# Seaborn의 load_dataset 함수를 사용하여 Titanic 데이터셋을 데이터프레임으로 불러옵니다.
df = sns.load_dataset('titanic')
# 데이터셋의 처음 5개 행을 출력하여 데이터의 구조를 확인합니다.
print('\n# df.head()')
print(df.head())
# [Step 2] 데이터 탐색
# 데이터의 구조와 통계적 특성을 살펴봅니다.
print('\n# 데이터 자료형 확인')
# 각 열의 데이터 자료형을 확인합니다.
print('\n# df.info()')
print(df.info())
print('\n# 데이터 통계 요약 정보 확인')
# 수치형 데이터에 대한 기본적인 통계 요약 정보를 출력합니다.
print(df.describe())
print('\n# 데이터 통계 요약 정보 확인 (범주형)')
# 범주형 데이터에 대한 기본적인 통계 요약 정보를 출력합니다.
print(df.describe(include='object'))
print('\n# 누락 데이터 확인')
# 각 열에 대해 누락된 데이터의 개수를 확인합니다.
print(df.isnull().sum())
print('\n# 중복 데이터 확인')
# 중복된 데이터가 있는지 확인합니다.
print(df.duplicated().sum())
print('\n# 종속 변수')
# 'survived' 열의 값을 카운트하여 생존자와 사망자의 수를 확인합니다.
print(df['survived'].value_counts())
print('\n# 종속 변수 - 시각화')
# 생존 여부에 대한 막대 그래프를 시각화합니다.
ax = sns.countplot(data=df, x='survived')
# x축의 라벨을 '사망'과 '생존'으로 설정합니다.
ax.set_xticks([0, 1])
ax.set_xticklabels(['사망', '생존'])
# 막대 가운데 숫자값 추가
for p in ax.patches:
width = p.get_width()
height = p.get_height()
x = p.get_x() + width / 2
y = p.get_y() + height / 2
ax.annotate(f'{height}', (x, y), ha='center', va='center', color='white', fontsize=12)
plt.title('종속 변수 시각화', size=15)
dataOut = './../dataOut/'
plt.savefig(dataOut + 'image01.png')
# 여러 개의 단면(Facet)을 격자 형식으로 보여주는 그래프
fg = sns.FacetGrid(df, col='survived', row='pclass', hue='sex')
fg.map(sns.kdeplot, 'age', alpha=0.5, fill=True)
fg.add_legend()
dataOut = './../dataOut/'
plt.savefig(dataOut + 'image02.png')
# 동반한 형제 또는 배우자의 수
sns.displot(x='sibsp', kind='hist', hue='survived', data=df, multiple='fill')
plt.savefig(dataOut + 'image03.png')
# 동반한 부모나 자녀의 수
sns.displot(x='parch', kind='hist', hue='survived', data=df, multiple='fill')
plt.savefig(dataOut + 'image04.png')
# 중복된 데이터 제거
print('중복 제거 이전: ', df.shape)
df = df.drop_duplicates()
print('중복 제거 이후: ', df.shape)
# NaN값이 많은 'deck' 열과 'embark_town' 열을 삭제합니다.
rdf = df.drop(['deck', 'embark_town'], axis=1)
print(rdf.columns.values)
# 'age' 열에 NaN값이 있는 행을 삭제합니다.
rdf = rdf.dropna(subset=['age'], how='any', axis=0)
print(len(rdf))
# 'embarked' 열의 NaN값을 가장 많이 출현한 값으로 치환합니다.
# 'embarked' 열의 최빈값을 구합니다.
# 방법01 : 범주형 발생 최빈도 구하기
most_freq = rdf['embarked'].value_counts(dropna=True).idxmax()
print(most_freq)
# 방법02 : 범주형 발생 최빈도 구하기
most_freq2 = rdf['embarked'].mode()[0]
print(most_freq2)
# 'embarked' 컬럼의 결측치 정보를 최빈도 값으로 치환합니다.
rdf['embarked'] = rdf['embarked'].fillna(most_freq)
# describe 메소드를 활용하여 범주형 변수의 통계적 요약 정보를 출력합니다.
print('\n# 결측치를 최빈값으로 치환 이후')
print('count 행 위주로 확인 요망')
print(rdf.describe(include='object'))
print('\n# 결측치가 있는 지 다시 확인')
print(rdf.isnull().sum())
# 분석에 사용할 열을 선택합니다.
ndf = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'embarked']]
print(ndf.head())
# 'sex' 열을 원핫 인코딩하여 수치형 데이터로 변환합니다.
onehot_sex = pd.get_dummies(ndf['sex'])
ndf = pd.concat([ndf, onehot_sex], axis=1)
# 'embarked' 열을 원핫 인코딩하여 수치형 데이터로 변환합니다.
onehot_embarked = pd.get_dummies(ndf['embarked'], prefix='town')
ndf = pd.concat([ndf, onehot_embarked], axis=1)
# 원본 열 'sex'와 'embarked'를 제거합니다.
ndf = ndf.drop(['sex', 'embarked'], axis=1)
print(ndf.head())
# svm, knn 등은 거리 기반의 알고리즘으로 정규화가 필요합니다.
scaler = StandardScaler()
scaler.fit(x)
x = scaler.transform(x)
x_train, x_test, y_train, y_test =\
train_test_split(x, y, test_size=0.3, random_state=10)
# 모델 객체 생성
model = KNeighborsClassifier(n_neighbors=5)
model.fit(x_train, y_train)
prediction = model.predict(x_test)
knn_matrix = confusion_matrix(y_test, prediction)
plt.figure(figsize=(8,8))
sns.heatmap(knn_matrix, annot=True, fmt='d', cmap='Blues',
xticklabels=['Positive', 'Negative'],
yticklabels=['Positive', 'Negative'])
plt.title('confusion matrix')
plt.xlabel('actual label')
plt.ylabel('prediction label')
dataOut = './../dataOut/'
filename = dataOut + 'image06.png'
plt.savefig(filename)
print(filename + ' 파일이 저장되었습니다.')
'Python > 머신 러닝' 카테고리의 다른 글
클래스 분류의 정의와 SVM의 활용 예시 - (2) (0) | 2025.03.20 |
---|---|
클래스 분류의 정의와 SVM의 활용 예시 - (1) (0) | 2025.03.20 |
다중 회귀 분석 및 활용 예시 (0) | 2025.03.20 |
기본 용어 간단 정리 및 실습 -(2) (0) | 2025.03.19 |
기본 용어 간단 정리 및 실습 -(1) (0) | 2025.03.18 |