반응형

1. 로지스틱 회귀분석

로지스틱 회귀(Logistic Regression)는 주로 이진 분류(binary classification) 문제를 다루는 머신러닝 알고리즘 중 하나입니다. 이 알고리즘은 선형 회귀(Linear Regression)와 달리 종속 변수가 이항 분포(binomial distribution)를 따르며, 결과값이 0 또는 1인 경우에 사용됩니다. 예를 들어, 고객이 제품을 구매할지 여부, 메일이 스팸인지 아닌지, 환자가 양성 종양을 가지고 있는지 여부 등을 예측하는 데 활용됩니다.

 

2. 파이썬 코드 예제

1) 데이터 불러오기

# 필요한 라이브러리 임포트
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

# breast_cancer 데이터셋 로드
data = load_breast_cancer()
X = data.data
y = data.target

 

breast_cancer 데이터셋은 유방암 진단에 관련된 특성을 담고 있는 데이터셋입니다. 이 데이터셋은 유방암 세포의 특징을 기반으로 악성(malignant)과 양성(benign) 종양을 분류하는 문제를 다룹니다. 해당 데이터셋은 미국 위스콘신 대학의 Dr. William H. Wolberg가 수집한 Fine Needle Aspirate(FNA) 검사 결과를 기반으로 만들어졌습니다.

  1. 반지름(Radius): 세포 핵의 평균 반지름.
  2. 질감(Texture): 회색조 값의 표준편차.
  3. 둘레(Perimeter): 세포 핵의 둘레 길이.
  4. 면적(Area): 세포 핵의 면적.
  5. 비율(Compactness): 둘레^2 / (면적 - 1.0).
  6. 곱셈(Mean concavity): 세포 핵의 평균 오목함.
  7. 오목점(Mean concave points): 세포 핵의 평균 오목한 지점의 수.
  8. 대칭(Symmetry): 대칭성.
  9. 프랙탈 차원(Fractal dimension): 프랙탈 차원.

각 특성은 평균(mean), 표준오차(standard error), 최대값(worst)의 세 가지 측정값으로 제공됩니다. 이 데이터셋은 569개의 샘플로 이루어져 있습니다.

 

2) 학습용(training)과 테스트용(test)으로 나누기

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

 

이 과정은 모델을 훈련시키고 나서 모델의 성능을 평가하기 위해 데이터를 분리하는 데 사용됩니다. train_test_split 함수는 데이터를 80%의 학습 데이터와 20%의 테스트 데이터로 분할합니다. 이렇게 나누어진 데이터는 각각 X_train, X_test, y_train, y_test에 저장되며, 이를 활용하여 모델을 훈련하고 평가합니다. 데이터셋이 상대적으로 작을 때 7:3의 비율을 사용하고 일반적으로 8:2의 비율을 사용합니다. random_state는 데이터를 무작위로 섞거나 분할할 때 사용되는 난수 발생기의 시드(seed) 값입니다. 난수 발생기는 초기 시드 값을 기반으로 난수를 생성하며, 동일한 시드 값을 사용하면 항상 동일한 난수가 생성됩니다.

 

3) 모델 만들기

# 로지스틱 회귀 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)

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

 

# 정확도 및 혼동 행렬 출력
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print('Confusion Matrix:')
print(conf_matrix)
Accuracy: 0.9649122807017544
Confusion Matrix:
[[40  3]
 [ 1 70]]

- 정확도가 약 0.96으로 굉장히 높게 나왔습니다. 정확도는 전체 예측 중 올바르게 예측한 비율을 나타냅니다. 정확도는 다음과 같이 계산됩니다: Accuracy=올바른 예측 수전체 예측 수 ÷ 

혼동 행렬은 모델의 성능을 더 세부적으로 평가하기 위한 표입니다. 이는 각 클래스에 대해 모델이 얼마나 맞추었는지, 틀렸는지를 나타냅니다. 혼동 행렬은 예측값과 실제값을 기반으로 다음과 같이 구성됩니다.

출처: 나무위키

  1. True Negative (TN )
    • 실제 값이 Negative이고 모델이 Negative로 예측한 경우입니다.
    • 예를 들어, 실제로 건강한 사람을 건강한 것으로 정확하게 예측한 경우입니다.
  2. False Positive (FP )
    • 실제 값이 Negative이지만 모델이 Positive로 잘못 예측한 경우입니다.
    • 예를 들어, 실제로 건강한 사람을 질병이 있는 것으로 잘못 예측한 경우입니다.
  3. False Negative (FN)
    • 실제 값이 Positive이지만 모델이 Negative로 잘못 예측한 경우입니다.
    • 예를 들어, 실제로 질병이 있는 사람을 건강한 것으로 잘못 예측한 경우입니다.
  4. True Positive (TP)
    • 실제 값이 Positive이고 모델이 Positive로 정확하게 예측한 경우입니다.
    • 예를 들어, 실제로 질병이 있는 사람을 정확하게 질병이 있는 것으로 예측한 경우입니다.

5) 회귀 계수 그래프

# 회귀계수 그래프
plt.figure(figsize=(12, 6))
plt.bar(range(len(model.coef_[0])), model.coef_[0], color='green', alpha=0.7)
plt.title('Logistic Regression Coefficients')
plt.xlabel('Feature Index')
plt.ylabel('Coefficient Value')
plt.show()

 

로지스틱 회귀 모델에서 각 특성(feature)의 회귀 계수(coefficients)를 시각화한 것입니다. 로지스틱 회귀에서는 각 특성의 가중치를 나타내는 회귀 계수가 있으며, 이 값은 해당 특성이 모델의 예측에 얼마나 영향을 미치는지를 나타냅니다.

 

여기서 하나 고민할 문제가 있습니다. 모든 변수를 사용할 경우 다중공선성 문제로 인해 제대로 된 문제를 만들 수 없게 됩니다.다중공선성(multicollinearity)은 회귀 분석에서 독립 변수들 간에 강한 선형 의존성이 있는 경우 발생하는 문제를 나타냅니다. 즉, 하나의 독립 변수가 다른 독립 변수들의 조합으로 잘 예측될 수 있는 상황을 의미합니다. 아래는 상관계수가 낮은 변수만을 활용하여 동일한 분석을 진행한 코드 예시입니다.

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

# breast_cancer 데이터셋 로드
data = load_breast_cancer()
X = data.data
y = data.target

# 데이터프레임 생성
df = pd.DataFrame(X, columns=data.feature_names)
df['target'] = y

# 상관 계수가 일정 임계값 이하인 변수 선택
threshold = 0.3  # 임계값 설정 (상관 계수의 절대값이 이 값 이하인 변수 선택)
corr_matrix = df.corr().abs()
lower_tri = corr_matrix.where(np.tril(np.ones(corr_matrix.shape), k=-1).astype(np.bool))
to_drop = [column for column in lower_tri.columns if any(lower_tri[column] < threshold)]

# 상관 계수가 일정 임계값 이하인 변수만 선택
X_selected = df.drop(columns=to_drop)
y_selected = df['target']

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

# 로지스틱 회귀 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)

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

# 정확도 및 혼동 행렬 출력
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print('Confusion Matrix:')
print(conf_matrix)
Accuracy: 1.0
Confusion Matrix:
[[43  0]
 [ 0 71]]

 

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

 

if-else 문은 프로그램에서 조건에 따라 다른 동작을 수행해야 할 때 사용됩니다. 여러 가지 상황에서 if-else 문이 유용하게 쓰입니다.

 

(1) 조건부 실행: 특정 조건이 참일 때는 한 블록의 코드를 실행하고, 거짓일 때는 다른 블록의 코드를 실행하도록 할 때 사용됩니다.

if condition: # 조건이 참일 때 실행되는 코드 

else: # 조건이 거짓일 때 실행되는 코드

 

(예시)

# 숫자 입력
number = float(input("숫자를 입력하세요: "))

# 조건부 실행
if number > 0:
    print("입력한 숫자는 양수입니다.")
else:
    print("입력한 숫자는 음수 또는 0입니다.")

 

[결과값]

숫자를 입력하세요: 10
입력한 숫자는 양수입니다.

위 코드에서 if 문은 사용자가 입력한 숫자가 양수인지를 판별하고, 조건이 참일 경우 "입력한 숫자는 양수입니다."를 출력합니다. 만약 조건이 거짓이라면 else 블록이 실행되어 "입력한 숫자는 음수 또는 0입니다."를 출력합니다.

 

 

(2) 둘 중 하나 선택: 두 가지 중 하나의 옵션을 선택하고자 할 때 사용됩니다.

if option == "A":
    # A를 선택한 경우 실행되는 코드
else:
    # A 이외의 경우 (즉, B를 선택한 경우) 실행되는 코드

 

(예시)

# 정수 입력
number = int(input("정수를 입력하세요: "))

# 둘 중 하나 선택
if number % 2 == 0:
    print("입력한 정수는 짝수입니다.")
else:
    print("입력한 정수는 홀수입니다.")

 

[결과값]

정수를 입력하세요: 10
입력한 정수는 짝수입니다.

이 코드에서 if 문은 사용자가 입력한 정수가 짝수인지를 판별하고, 조건이 참일 경우 "입력한 정수는 짝수입니다."를 출력합니다. 만약 조건이 거짓이라면 else 블록이 실행되어 "입력한 정수는 홀수입니다."를 출력합니다.

 

 

(3) 범위 지정: 조건에 따라 여러 범위 중 하나를 선택하고자 할 때 사용됩니다.

if value < 0:
    # 음수인 경우
elif value == 0:
    # 0인 경우
else:
    # 양수인 경우

 

(예시)

# 점수 입력
score = float(input("점수를 입력하세요: "))

# 범위 지정
if score >= 90:
    grade = 'A'
elif score >= 80:
    grade = 'B'
elif score >= 70:
    grade = 'C'
elif score >= 60:
    grade = 'D'
else:
    grade = 'F'

# 학점 출력
print(f"입력한 점수에 대한 학점은 {grade}입니다.")

 

[결과값]

점수를 입력하세요: 85
입력한 점수에 대한 학점은 B입니다.

elif라는 코드가 출현하였는데, elif는 "else if"의 줄임말로, 여러 개의 조건을 순차적으로 검사하는 데 사용되는 파이썬의 코드입니다. if 문이 거짓인 경우에만 실행되며, 새로운 조건을 검사합니다. 여러 elif 블록을 사용하여 여러 개의 조건을 처리할 수 있습니다.위 코드에서 if-elif-else 문은 사용자가 입력한 점수에 따라 다양한 범위를 지정하고, 해당하는 학점을 출력합니다. 만약 입력한 점수가 90 이상이면 'A', 80 이상이면 'B', 70 이상이면 'C', 60 이상이면 'D', 그 이하이면 'F'를 부여합니다. 저는 점수를 85점으로 부여하였고 학점 B를 출력하였습니다.

 

 

 

(4) 예외 처리: 특정 조건에 따라 예외 상황을 처리하고자 할 때 사용됩니다.

if error_condition:
    # 예외 상황 처리 코드
else:
    # 일반적인 코드

 

(예시)

# 숫자 입력
try:
    number = float(input("숫자를 입력하세요: "))
    
    # 입력한 숫자 출력
    print("입력한 숫자:", number)

# 예외 처리
except ValueError:
    print("유효한 숫자가 아닙니다. 다시 시도하세요.")

 

[결과값]

숫자를 입력하세요: a
유효한 숫자가 아닙니다. 다시 시도하세요.

이 코드에서 try 블록 안에서는 사용자로부터 숫자를 입력받고, 입력받은 숫자를 출력하려고 시도합니다. 그러나 만약 유효한 숫자가 아닌 다른 값을 입력하면 ValueError가 발생하게 됩니다. 이때 except 블록으로 이동하여 해당 예외를 처리하고 메시지를 출력합니다. a를 예시로 입력하였고 '유효한 숫자가 아니다'라는 출력값을 얻었습니다.

 

 

이번 포스팅도 파이썬 공부에 많은 도움이 되었기를 바랍니다. :-)

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

Gapminder 데이터셋은 세계 각 국가에 대한 시간에 따른 다양한 경제 지표 및 사회 지표를 수집한 데이터입니다. 이 데이터셋은 Gapminder Foundation에서 수집하고 제공하며, 세계의 국가들에 대한 주요 지표들의 시계열 데이터를 담고 있습니다. Gapminder 데이터셋에 포함된 주요 변수들로는 국내총생산(Gross Domestic Product, GDP), 인구, 기대수명, 출생률, 사망률, 대륙 등이 있습니다. 이 데이터셋은 연도별로 국가들의 상황을 기록하고 있어, 다양한 시각화 및 데이터 분석에 활용됩니다.

 

 

 

(1) 데이터 불러오기

# 라이브러리 불러오기
import pandas as pd
from gapminder import gapminder

# 데이터 불러오기
data = gapminder.copy()

# 데이터 크기 확인
data.shape

 

[결과값]

(1704, 6)

 

(2) 데이터 살펴보기

#데이터 정보 요약
data.info()

 

[결과값]

전체 행의 수는 1704이고, 총 6개의 열을 가지고 있습니다. 데이터 타입은 문자열(object), 정수(int64), 실수(float64)로 구성되어 있고 누락된 값은 없습니다.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1704 entries, 0 to 1703
Data columns (total 6 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   country    1704 non-null   object 
 1   continent  1704 non-null   object 
 2   year       1704 non-null   int64  
 3   lifeExp    1704 non-null   float64
 4   pop        1704 non-null   int64  
 5   gdpPercap  1704 non-null   float64
dtypes: float64(2), int64(2), object(2)
memory usage: 80.0+ KB

 

(3) 여러가지 그래프를 그려보자

# 미국의 GDP 시계열 데이터
usa_data = data[data['country'] == 'United States']
plt.figure(figsize=(12, 6))
plt.plot(usa_data['year'], usa_data['gdpPercap'], marker='o')
plt.title('GDP per Capita Over Time (United States)')
plt.xlabel('Year')
plt.ylabel('GDP per Capita')
plt.show()

 

이 그래프를 통해 미국의 GDP per Capita가 연도에 따라 어떻게 변화했는지를 시각적으로 확인할 수 있습니다. 경제 성장이나 감소, 특정 시기의 변동성 등을 파악할 수 있습니다.

  1. X 축 (Year): 그래프의 x 축은 연도를 나타냅니다. 1952년부터 2007년까지의 미국의 GDP per Capita 변화를 보여줍니다.
  2. Y 축 (GDP per Capita): 그래프의 y 축은 GDP per Capita를 나타냅니다. 이 값은 해당 연도의 미국의 GDP를 인구 수로 나눈 값으로, 1인 당 평균 GDP를 의미합니다.
  3. 그래프의 형태: 그래프는 각 연도별로 미국의 GDP per Capita를 나타내는 점(line plot)으로 표현되어 있습니다. 각 점은 해당 연도의 GDP per Capita를 나타냅니다.
  4. Marker='o': 각 데이터 포인트는 동그라미(o)로 표시되어 있습니다.
  5. 그래프 제목: "GDP per Capita Over Time (United States)"라는 제목을 추가하였습니다.
  6. X 축 레이블 (Year): X 축에는 "Year"라는 레이블이 붙어 있어, X 축이 연도를 나타내는 것을 알려줍니다.
  7. Y 축 레이블 (GDP per Capita): Y 축에는 "GDP per Capita"라는 레이블이 붙어 있어, Y 축이 GDP per Capita를 나타내는 것을 알려줍니다.

 

 

# Top 10국가의 1인당 GDP 시각화
plt.figure(figsize=(14, 8))
sns.barplot(x='gdpPercap', y='country', data=top_gdp_countries, palette='viridis')
plt.title('Top 10 Countries by GDP per Capita (2007)')
plt.xlabel('GDP per Capita')
plt.ylabel('Country')
plt.show()

 

 

위 코드는 2007년 기준으로 상위 10개 국가의 1인당 GDP를 막대 그래프로 시각화하여 1인당 GDP가 높은 국가들을 한 눈에 볼 수 있는 장점이 있습니다.

 

 

#기대수명 vs. 1인당 GDP 산점도 그래프
plt.figure(figsize=(12, 8))
sns.scatterplot(x='gdpPercap', y='lifeExp', data=data_2007, hue='continent', palette='Set2', size='pop', sizes=(20, 2000))
plt.title('Life Expectancy vs. GDP per Capita (2007)')
plt.xlabel('GDP per Capita')
plt.ylabel('Life Expectancy')
plt.legend(title='Continent', loc='upper left')
plt.show()

 

  1. plt.figure(figsize=(12, 8)): 새로운 그림(figure)을 생성하고, 그림의 크기를 설정합니다. 이 경우에는 가로 12인치, 세로 8인치의 크기로 설정했습니다.
  2. sns.scatterplot(x='gdpPercap', y='lifeExp', data=data_2007, hue='continent', palette='Set2', size='pop', sizes=(20, 2000)): seaborn 라이브러리의 scatterplot 함수를 사용하여 산점도 그래프를 생성합니다. 
    • x='gdpPercap': x 축에는 1인당 GDP를 사용합니다.
    • y='lifeExp': y 축에는 기대수명을 사용합니다.
    • data=data_2007: 그래프에 사용할 데이터는 2007년의 데이터로 한정됩니다.
    • hue='continent': 대륙별로 데이터를 구분하여 다른 색상으로 표시합니다.
    • palette='Set2': 그래프에 사용할 색상 팔레트를 'Set2'로 지정합니다.
    • size='pop': 각 점의 크기는 해당 국가의 인구 크기로 나타냅니다.
    • sizes=(20, 2000): 인구 크기에 따라 표시되는 점의 크기 범위를 설정합니다.
  3. plt.legend(title='Continent', loc='upper left'): 대륙별로 다른 색상으로 표시된 점들에 대한 범례(legend)를 설정합니다. 범례의 위치는 왼쪽 상단으로 설정되어 있습니다.
  4. plt.show(): 그래프를 표시합니다.
# 상자 그림 (Box Plot) - 대륙 별 기대수명 (2007)
sns.boxplot(data=data[data['year'] == 2007], x='continent', y='lifeExp', palette='Set2')
plt.title('Box Plot - Life Expectancy by Continent (2007)')
plt.show()

 

위 코드는 2007년 기준으로 대륙별 기대수명에 대한 상자 그림(Box Plot)을 생성하는 코드입니다. 이 그래프를 통해 대륙별로 기대수명의 분포를 시각적으로 확인할 수 있습니다. 각 대륙의 중앙값, 사분위수, 이상치 등이 상자 그림으로 표현되어 있습니다.

반응형
Posted by 마르띤
,