반응형

0. 개요

보스턴 주택 가격 데이터셋은 머신 러닝과 회귀 분석 연습용으로 널리 활용되는 데이터셋 중 하나입니다. 이 데이터셋은 미국 매사추세츠주 보스턴 내 다양한 지역의 주택 가격과 주택 가격에 영향을 미치는 여러 가지 특성들을 포함하고 있습니다. 주로 회귀 분석의 예제로 사용되며, 집값을 예측하는 모델을 만들기 위한 데이터로 활용됩니다. 이 데이터셋은 Scikit-learn 라이브러리에 기본으로 내장되어 있어서 불러와서 사용할 수 있는데, 해당 파일을 블로그에도 첨부하였으니 자유롭게 다운하셔도 됩니다. 주요 칼럼값은 아래와 같습니다.

 

- CRIM: 지역별 1인당 범죄율

- ZN: 25,000 평방피트당 주거용 토지 비율

- INDUS: 비소매상업지역 면적 비율

- CHAS: 찰스 강 인접 여부 (1: 강 인접, 0: 강 미인접)

- NOX: 일산화질소 농도 RM: 주택당 평균 방 개수

- AGE: 1940년 이전에 건축된 주택의 비율

- DIS: 5개의 보스턴 고용 센터와의 거리에 대한 가중치

- RAD: 방사형 고속도로 접근성 지수

- TAX: $10,000당 재산세율

- PTRATIO: 학생-교사 비율

- B: 1000(Bk - 0.63)^2, 여기서 Bk는 지역별 흑인 비율

- LSTAT: 저소득 계층의 비율

- MEDV: 주택 가격의 중앙값

 

이 데이터셋을 활용하여 다양한 회귀 모델을 학습하고 집값을 예측하는 연습을 할 수 있습니다. 데이터의 다양한 특성을 이해하고 활용하여 모델을 개선하며, 데이터 분석 및 예측 능력을 향상시킬 수 있는 좋은 예제 중 하나입니다.

 

1. 파이썬 코드 - 회귀분석

#라이브러리 불러오기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

#데이터 불러오기
boston_data = pd.read_csv('HousingData.csv')

#결측치 확인 및 제거
boston_data.isnull().sum()
boston_data = boston_data.dropna(axis=0)

#데이터 분할
X=boston_data.drop('MEDV',axis=1)
y=boston_data['MEDV']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X_train, y_train)

#테스트 데이터에 대한 예측
y_pred = model.predict(X_test)

# 평가: 평균 제곱 오차(Mean Squared Error) 계산
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')

 

2. 탐색적 데이터 분석(EDA)

1) 데이터 구조

boston_data.head()

CRIM부터 MEDV까지 총 14개의 칼럼값을 가지고 있습니다.

 

2) 상관 분석

# 상관 분석 시각화
correlation_matrix = boston_data.corr()
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=True)
plt.title('Correlation Matrix')
plt.show()

- 'RM' (방 개수)은 'MEDV' (주택 가격)와 양의 상관 관계를 가지는 밝은 색을 보여줍니다. 이는 방의 개수가 증가할수록 주택 가격도 증가하는 경향을 나타냅니다.

- 'LSTAT' (저소득 계층의 비율)은 'MEDV'와 음의 상관 관계를 가집니다. 이는 저소득 계층의 비율이 높을수록 주택 가격이 낮아지는 경향을 나타냅니다.

- 'RAD' (방사형 고속도로 접근성 지수)와 'TAX' ($10,000당 재산세율)는 서로 강한 상관 관계를 보입니다. 

 

 

3) 주택 가격 분포

# 주택 가격 분포
plt.figure(figsize=(8, 6))
sns.histplot(data=boston_data, x='MEDV', bins=30, kde=True)
plt.title('Distribution of Housing Prices (MEDV)')
plt.show()

4) 방 개수와 주택 가격간 관계

# 방 개수와 주택 가격 분포
plt.figure(figsize=(8, 6))
sns.scatterplot(data=boston_data, x='RM', y='MEDV')
plt.title('Relationship between Rooms (RM) and Housing Prices (MEDV)')
plt.show()

3. 결측값 확인

파이썬에서 결측값을 확인하고 처리하는 방법은 데이터 전처리 과정에서 중요한 부분입니다.

boston_data.isnull().sum()

 

결측값을 지우는 방법도 있고, 평균이나 최빈값으로 대체하는 방법도 있는데 나는 지우는 방법을 선택하였습니다.

boston_data = boston_data.dropna(axis=0)

 

4. 모델 성능 평가

1) 성능 평가

# 평가: 평균 제곱 오차(Mean Squared Error) 계산
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
Mean Squared Error: 31.45
 

 

파이썬 머신러닝에서 모델 성능 평가는 매우 중요한 이유가 있습니다. 모델의 성능을 평가하는 것은 모델이 얼마나 좋은 예측을 하는지를 이해하고 개선하는 데 도움을 주는 핵심적인 단계입니다.

 - 비즈니스 의사 결정에 활용: 머신러닝 모델은 비즈니스 의사 결정을 지원하는 데 사용될 수 있습니다. 모델의 예측 능력이나 신뢰도를 평가함으로써, 예를 들어 상품 판매 예측, 금융 리스크 평가 등과 같은 중요한 결정에 도움을 줄 수 있습니다.

- 성능 개선: 성능 평가를 통해 모델의 약점이나 부족한 부분을 파악하고 개선할 수 있습니다. 예측의 정확도를 높이거나 편향을 줄이는 등 모델을 보다 강력하게 만들기 위한 방법을 찾을 수 있습니다.

- 과적합 및 과소적합 판단: 모델 성능 평가는 과적합(Overfitting)이나 과소적합(Underfitting)과 같은 문제를 판단하는데 도움을 줍니다. 훈련 데이터에 대한 예측 능력과 테스트 데이터에 대한 예측 능력을 비교하여 모델의 일반화 능력을 평가할 수 있습니다.

- 모델 해석: 모델의 성능 평가 결과는 모델이 어떤 특성을 중요하게 생각하는지, 어떤 특성이 예측에 큰 영향을 주는지 등을 파악하는 데 도움을 줍니다.

 

2) 시각화 - 실제값과 예측값을 비교하는 그래프

#라이브러리 
import matplotlib.pyplot as plt

#그래프 설정
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, color='blue')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], linestyle='--', color='red', linewidth=2)
plt.xlabel('Actual Price')
plt.ylabel('Predicted Price')
plt.title('Actual vs Predicted House Prices')
plt.show()

 

HousingData.csv
0.03MB

반응형
Posted by 마르띤
,
반응형

0. 개요

- 타이타닉 사건: 타이타닉은 역사상 가장 유명한 해상 사고 중 하나로, 1912년 4월 15일에 발생한 비극적인 사건

- 타이타닉 데이터셋은 머신 러닝과 데이터 분석 분야에서 많이 활용되는 이유는 여러 가지가 있습니다. 이해하기 쉬운 구조와 다양한 특성들로 구성되어 있어 머신 러닝의 기본 개념을 학습하고 모델을 구축하는 데 사용하기에 적합합니다.  타이타닉 데이터셋은 생존 여부를 예측하는 이진 분류 문제로도 활용되고, 승객의 나이나 운임 등을 예측하는 회귀 문제로도 활용될 수 있습니다. 이로 인해 다양한 머신 러닝 알고리즘과 기법을 연습할 수 있습니다. 이러한 이유들로 인해 타이타닉 데이터셋은 머신 러닝과 데이터 분석의 입문자부터 전문가까지 다양한 수준의 사람들에게 인기있는 연습 및 학습용 데이터셋 중 하나로 널리 사용되고 있습니다. 

 

1. 파이썬 코드

#라이브러리 불러오기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

#데이터 불러오기
titanic_data = pd.read_csv('titanic.csv')

#필요한 열값만 선택
features = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']

#결측치 처리 및 범주형 데이터 변환
titanic_data = titanic_data[features].dropna()
titanic_data['Sex'] = titanic_data['Sex'].map({'male': 0, 'female': 1})
titanic_data['Embarked'] = titanic_data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2})

#X값 Y값 정의 
X = titanic_data.drop('Survived', axis=1)
y = titanic_data['Survived']

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 머신러닝 모델 - 랜덤포레스트 생성 및 학습
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

# 테스트 데이터에 대한 예측
y_pred = model.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

 

2. 탐색적 데이터 분석(EDA)

1) 데이터가 어떻게 생겼는지 확인

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 불러오기
titanic_data = pd.read_csv('titanic.csv')

# 데이터의 일부를 살펴봅니다.
titanic_data.head()

 

대부분의 칼럼값은 이름만 봐도 쉽게 알 수 있다. 가장 중요한 survived는 생존 유무인데 1이 생존이다.  sibsp 형제 혹은 부부의 수이고 parch는 부모 혹은 자녀의 수이다.

 

2) 생존자와 사망자의 수 확인

sns.countplot(x='Survived', data=titanic_data)
plt.title('Survivors vs. Non-Survivors')
plt.show()

 

 

3) 성별에 따른 생존 여부 확인

sns.countplot(x='Survived', hue='Sex', data=titanic_data)
plt.title('Survivors and Non-Survivors by Sex')
plt.show()

 

 

4) 나이 분포 확인

sns.histplot(data=titanic_data, x='Age', bins=20, kde=True)
plt.title('Age Distribution')
plt.show()

3. 머신러닝 - 랜덤포레스트(Random Forest)

이번 모델링에서는 랜덤 포레스트를 활용하였습니다. 랜덤 포레스트는 머신 러닝 알고리즘 중 하나로, 앙상블 학습 방법 중의 하나입니다. 앙상블 학습은 여러 개의 간단한 모델을 결합하여 더 강력하고 안정적인 모델을 만드는 기법으로, 랜덤 포레스트는 이 중에서 대표적인 알고리즘입니다. 

 

랜덤 포레스트는 마치 여러 명의 전문가들이 함께 의사 결정을 내리는 것과 비슷합니다. 각 전문가는 다른 정보를 가지고 있고, 각자의 의견을 내놓습니다. 그런 다음, 모든 의견을 모아서 가장 현명한 결정을 내리는 방식입니다.

 

랜덤 포레스트는 컴퓨터에게 이런 방식을 가르쳐서 데이터를 예측하게 만든 것입니다. 데이터를 여러 조각으로 나누어서 작은 모델들이 각각 조각을 예측하도록 합니다. 그리고 이 작은 모델들의 의견을 모아서 예측 결과를 만들어 내죠. 이렇게 함으로써 하나의 모델보다 더 똑똑하고 정확한 예측을 할 수 있답니다. 그리고 랜덤 포레스트는 모델이 예측을 할 때, 일부 정보만을 사용하게 됩니다. 마치 몇몇 정보만 보고 결정을 내리는 것처럼요. 이렇게 함으로써 각각의 작은 모델이 더 다양한 측면을 보게 되고, 전체적으로 더 좋은 예측을 할 수 있게 되는 것이죠. 랜덤 포레스트는 간단하게 말하면 다양한 의견을 모아서 더 현명한 결정을 내리는 방법이라고 생각하시면 됩니다. 이렇게 하면 데이터 예측이 더 정확해지고 안정적으로 작동하게 되는 거죠!

 

4. 머신러닝과 예측분석

처음 머신러닝을 공부할 때 결과값 0.78만 나오고 이게 뭔가? 하였다. 결국은 내가 만든 모델을 가지고 평가를 해야하고 랜덤포레스트가 최적의 선택이었는지, 또 테스트 사이즈가 20%로 설정되었는데 이 보다 더 나은 방법은 없는지도 고민해봐야 한다. 

 

그리고 이번 데이터 분석 결과가 0.78이라고 나왔는데, 실제 데이터 셋에서 그러니까 y값 survived가 없는 상태에서 데이터를 인풋 하였을 때, 그러니까 성별, 연령,함께 탄 가족 수, 좌석 등급 등 x값을 넣었을 때 얼마나 정확하게 survived 생존여부를 예측할 수냐!를 활용하는 것이 관건일 것이다.

titanic.csv
0.06MB

반응형
Posted by 마르띤
,
반응형

오늘은 Selenium으로 네이버 로그인 하는 연습을 해 보자.

Selenium이란?

웹 애플리케이션을 테스트하거나 웹 브라우징을 자동화하기 위한 도구와 라이브러리다. 주로 웹 페이지를 제어하고 상호작용하며 웹 사이트를 테스트하거나 데이터를 수집하는 등의 작업에 사용된다. Selenium은 다양한 프로그래밍 언어로 지원되며, 파이썬에서도 많이 사용된다. Selenium의 주요 기능과 특징은 다음과 같다:
1. 웹 브라우저 제어: Selenium을 사용하여 웹 브라우저(예: Chrome, Firefox, Edge 등)를 자동으로 제어할 수 있다. 이를 통해 웹 페이지를 열거나 조작할 수 있다.
2. 웹 페이지 상호작용: Selenium을 통해 웹 페이지의 버튼 클릭, 입력 필드 입력, 폼 제출 등의 상호작용을 자동으로 수행할 수 있다.
3. 웹 스크레이핑 및 데이터 수집: Selenium을 이용하여 웹 페이지의 데이터를 추출하고 원하는 정보를 수집할 수 있다.
4. 웹 테스트 자동화: 웹 애플리케이션의 테스트를 자동화하는 데 사용된다. 웹 페이지의 기능과 동작을 테스트하고 결과를 확인하는데 활용된다.
5. 다양한 언어와 테스트 프레임워크 지원: Selenium은 다양한 프로그래밍 언어와 테스트 프레임워크를 지원하며, 파이썬에서는 selenium 라이브러리를 사용하여 Selenium을 활용할 수 있다.

Selenium은 웹 페이지 상호작용을 자동화하거나 웹 애플리케이션을 테스트하는 데 유용한 강력한 도구로, 웹 개발자나 테스트 엔지니어 등이 자동화 작업을 수행할 때 많이 활용된다.

 

네이버 사이트를 로그인 하기 위한 전체 파이썬 코드는 아래와 같다. (아래 코드는 네이버가 봇임을 감지하고 로그인이 되지 않습니다. 이를 회피하기 위한 코드는 맨 아래 내용을 확인해 주세요)

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/')

#ID 입력
id = driver.find_element(By.CSS_SELECTOR, "#id")
id.click()
id.send_keys('ID를 입력하세요')

#PW 입력
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pw.click()
pw.send_keys('PW를 입력하세요')

#로그인
login_btn = driver.find_element(By.CSS_SELECTOR, "#log\.login")
login_btn.click()

 

1. 필요한 패키지 불러오기

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

 

2. 네이버 사이트 불러오기

www.naver.com에서 로그인 부튼을 누르면 아래와 같은 화면으로 넘어간다. 이 부분의 URL을 불러와야 한다. 주소는 아래와 같다. 

 

 

네이버

네이버에 로그인 하고 나를 위한 다양한 서비스를 이용해 보세요

nid.naver.com

3. 네이버 로그인 정보 확인하기 - ID / PW

자 여기서 윈도우에서는 F12, 맥에서는 control키와 클릭을 함께 눌러 태그 정보를 확인해 보자.

 

네이버 화면을 키고 ID 부분의 태그를 알아보니 id="id"를 확인할 수 있다. Selenium에서는 find_element_by_id 함수를 이용해서 id 값을 가져올 수 있다.

 

위는 pw의 태그 정보를 볼 수 있다.  id/pw 부분 모두 우클릭을 통해 copy selector를 하여 css copy를 하자. 해당 파이썬 코드는 아래와 같다.

#ID 입력
id = driver.find_element(By.CSS_SELECTOR, "#id")
id.click()
id.send_keys('ID를 입력하세요')

#PW 입력
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pw.click()
pw.send_keys('PW를 입력하세요')

 

자! ID와 PW를 입력하였으면 이제 로그인 버튼을 눌러줘야 한다.

네이버의 로그인 부분에서 우클릭을 하고 css copy를 하면 아래와 같다.

login_btn = driver.find_element(By.CSS_SELECTOR, "#log\.login")
login_btn.click()

자 이제 모든게 마무리 되었다. 그러면 실행을 해 보자. 그랬더니!! 동작을 한다.

잠시 후 크롬 창 하나가 뜨면서 네이버 화면이 떴고, 아이디와 패스워드 항목란에 입력이 되면서 로그인 버튼이 자동으로 눌리더니 네이버에서는 사람이 아닌 봇임을 감지하고 아래 처럼 화면이 떴다.

혹시나 해서 id/pw 입력란에 time.sleep 함수를 사용해서 입력 시간을 늦춰보았지만 소용은 없었다. 네이버에서이를 잘 탐지 하였다. 방법은 뭘까? 이른바 복붙 신공이다. 아이디와 비번을 입력/복사하는 형태로 로그인 하는 방법이다.

이 방법은 통할까 싶었는데 다행히 잘 통하였다. 그 방법은 아래와 같다.

 

처음 코드와 달리 pyperclip을 불러왔고, time은 id/pw 입력시간 간 간격을 두기 위해 추가로 불러왔다.

 

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

import pyperclip
import time

driver = webdriver.Chrome()
driver.get('https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/')

#ID 입력
id = driver.find_element(By.CSS_SELECTOR, "#id")
id.click()
pyperclip.copy('ID를 입력하세요')
id.send_keys(Keys.COMMAND,'v') #윈도우면 command 대신 ctrl
time.sleep(3)

#PW 입력
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pw.click()
pyperclip.copy('PW를 입력하세요')
pw.send_keys(Keys.COMMAND,'v') #윈도우면 command 대신 ctrl
time.sleep(3)

#로그인
login_btn = driver.find_element(By.CSS_SELECTOR, "#log\.login")
login_btn.click()

다행히 잘 로그인이 된다. 

반응형
Posted by 마르띤
,