QAQC 부트캠프 퀘스트

[2025/01/24]~[2025/02/03]통계학/머신러닝 개인과제

essay2892 2025. 1. 31. 19:03
더보기

# 라이브러리 실행

import pandas as pd
import numpy as np
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt

from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

plt.rcParams['axes.unicode_minus'] = False
 
# 데이터 불러오기
df = pd.read_csv('C:/Users/chn45/Desktop/code/통계학 실습/Breast_Cancer_data.csv')
df.info()
 
df.columns
 
- 특성들은 네 가지 주요 카테고리로 분류됩니다
    1. **크기/형태 관련 특성**은 종양의 기본적인 물리적 특성을 나타냅니다. 이러한 측정값들은 종양의 성장 정도를 직접적으로 반영하며, 일반적으로 악성 종양이 양성 종양보다 더 큰 경향을 보입니다.
        1. **radius (반지름)**
        2. **perimeter (둘레)**
        3. **area (면적)**
    2. **표면 특성**은 종양 세포의 표면 상태를 분석합니다. 악성 종양 세포는 종종 표면이 더 거칠고 불규칙한 특징을 보이므로, 이러한 특성들은 진단에 중요한 정보를 제공합니다.
        1. **texture (질감)**
        2. **smoothness (매끄러움)**
    3. **형태 복잡도 특성**은 종양의 경계와 구조의 불규칙성을 측정합니다. 악성 종양은 주변 조직으로의 침습성이 높아 더 복잡한 형태를 보이는 경향이 있어, 이러한 특성들은 종양의 악성도를 판단하는 데 핵심적인 역할을 합니다.
        1. **compactness (조밀도)**
        2. **concavity (오목성)**
        3. **concave points (오목점)**
    4. **구조적 특성**은 종양의 전반적인 구조와 성장 패턴을 분석합니다. 이는 종양의 발달 과정과 성장 특성을 이해하는 데 도움을 줍니다.
        1. **symmetry (대칭성)**
        2. **fractal dimension (프랙탈 차원)**
 
df.describe(include='all')

**필수 1. 기초 통계**

 
- Breast Cancer 데이터셋의 종양 특성들을 카테고리별로 **진단 결과(diagnosis)**에 따라 분석해보세요.
   
    각 카테고리에 속한 특성들의 **평균과 중앙값**을 구하고 해석해주세요.
   
    1. **크기/형태 관련 특성의 기초통계**
        - radius_mean, perimeter_mean, area_mean에 대한 진단별 평균과 중앙값을 구하세요.
    2. **표면 특성의 기초통계**
        - texture_mean, smoothness_mean에 대한 진단별 평균과 중앙값을 구하세요.
    3. **형태 복잡도 특성의 기초통계**
        - compactness_mean, concavity_mean, concave points_mean에 대한 진단별 평균과 중앙값을 구하세요.
    4. **구조적 특성의 기초통계**
        - symmetry_mean, fractal_dimension_mean에 대한 진단별 평균과 중앙값을 구하세요.
- **유의 사항**
    - 결과는 **소수점 둘째자리**까지 표현해주세요.
    - 각 카테고리별로 **간단한 해석**을 덧붙여주세요.
더보기
# 필수 1. 기초 통계
size_figure_data = df[['diagnosis', 'radius_mean', 'perimeter_mean', 'area_mean']]
surface_data = df[['diagnosis', 'texture_mean', 'smoothness_mean']]
complexity_data = df[['diagnosis', 'compactness_mean', 'concavity_mean', 'concave points_mean']]
structural_data = df[['diagnosis', 'symmetry_mean', 'fractal_dimension_mean']]

def get_mean_med(data) :
    print(f"===양성(B) 종양===")
    for i in data.columns[1:] :
        print(f"{i}: 평균{np.mean(data[data['diagnosis'] == 'B'][i]) : .2f}, 중앙값{np.median(data[data['diagnosis'] == 'B'][i]) : .2f}")
    print(f"\n===악성(M) 종양===")
    for i in data.columns[1:] :
        print(f"{i}: 평균{np.mean(data[data['diagnosis'] == 'M'][i]) : .2f}, 중앙값{np.median(data[data['diagnosis'] == 'M'][i]) : .2f}")

 

get_mean_med(size_figure_data)
get_mean_med(surface_data)
get_mean_med(complexity_data)
get_mean_med(structural_data)

 

**필수 1 답안**
1. 크기/형태 관련 특성 통계량 :
    - 양성(B) 종양 :
        - radius_mean: 평균 `12.15` , 중앙값 `12.20`
        - perimeter_mean: 평균 `78.08`, 중앙값 `78.18`
        - area_mean: 평균 `462.79`, 중앙값 `458.40`
    - 악성(M) 종양 :
        - radius_mean: 평균 `17.46` , 중앙값 `17.33`
        - perimeter_mean: 평균 `115.37`, 중앙값 `114.20`
        - area_mean: 평균 `978.38`, 중앙값 `932.00`
    - 해석 :
        - `크기/형태 관련 특성 통계량 중 면적은 평균과 중앙값의 차이가 약간 존재하지만 대부분 평균과 중앙값이 유사하다.`
        - `악성 종양의 경우 양성 종양에 비해 반지름, 둘레, 면적이 모두 큰 것으로 나타나므로 악성 종양은 양성 종양보다 크기가 크다고 볼 수 있다.`
        - `가장 큰 차이를 보이는 것은 면적으로, 크기/형태 관련 특성 중 종양의 양성, 악성을 구분하는 기준으로 가장 적절해 보인다.`

2. 표면 관련 특성 통계량 :
    - 양성(B) 종양 :
        - texture_mean: 평균 `17.91` , 중앙값 `17.39`
        - smoothness_mean: 평균 `0.09`, 중앙값 `0.09`
    - 악성(M) 종양 :
        - texture_mean: 평균 `21.60` , 중앙값 `21.46`
        - smoothness_mean: 평균 `0.10`, 중앙값 `0.10`
    - 해석 :
        - `매끄러움은 양성 종양과 악성 종양에서 차이를 보이지 않으므로 종양의 양성, 악성을 나누는 기준으로는 부적합해 보인다.`
        - `질감의 경우 양성 종양과 악성 종양에서 확실한 차이가 보이며, 악성 종양의 경우 더 높은 값을 갖는다.`

3. 형태 복잡도 특성 통계량 :
    - 양성(B) 종양 :
        - compactness_mean: 평균 `0.08` , 중앙값 `0.08`
        - concavity_mean: 평균 `0.05`, 중앙값 `0.04`
        - concave points_mean: 평균 `0.16`, 중앙값 `0.16`
    - 악성(M) 종양 :
        - compactness_mean: 평균 `0.15` , 중앙값 `0.13`
        - concavity_mean: 평균 `0.16`, 중앙값 `0.15`
        - concave points_mean: 평균 `0.09`, 중앙값 `0.09`
    - 해석 :
        - `조밀도, 오목성, 오목 점 모두 양성 종양과 악성 종양에서의 차이가 드러난다.`
        - `조밀도와 오목성은 악성 종양에서 높은 값을 가지지만, 오목 점의 경우 악성 종양에서 더 낮은 값을 갖는다.`
        - `조밀도와 오목성이 높고, 오목 점이 낮은 값을 가지는 경우 악성 종양으로 구분할 수 있어 보인다.`

4. 구조적 특성 통계량 :
    - 양성(B) 종양 :
        - symmetry_mean: 평균 `0.17` , 중앙값 `0.17`
        - fractal_dimension_mean: 평균 `0.06`, 중앙값 `0.06`
    - 악성(M) 종양 :
        - symmetry_mean: 평균 `0.19` , 중앙값 `0.19`
        - fractal_dimension_mean: 평균 `0.06`, 중앙값 `0.06`
    - 해석 :
        - `프랙탈 차원의 경우 양성 종양과 악성 종양에서 비슷한 값을 가져 구분 기준으로는 적합하지 않아 보인다.`
        - `대칭성은 악성 종양에서 조금 더 높은 값을 보이지만 양성 종양과 큰 차이는 보이지 않아 구분 기준으로 적합하지 않아 보인다.`

**필수 2. 통계적 가설검정 1**

 
- Breast Cancer 데이터셋의 종양 특성들을 카테고리별로 분석하려 합니다. 각 카테고리에 속한 특성들에 대해 **diagnosis(양성/악성)에 따른 독립표본 T-TEST**를 진행해주세요.
    - **크기/형태 관련 특성의 분석**
    - radius_mean, perimeter_mean, area_mean에 대한 t-test를 수행하세요.
    - **표면 특성의 분석**
    - texture_mean, smoothness_mean에 대한 t-test를 수행하세요.
    - **형태 복잡도 특성의 분석**
    - compactness_mean, concavity_mean, concave points_mean에 대한 t-test를 수행하세요.
    - **구조적 특성의 분석**
    - symmetry_mean, fractal_dimension_mean에 대한 t-test를 수행하세요.
- **가설검정 방법**은 각 카테고리별로:
    - **귀무가설과 대립가설**을 작성하세요.
    - **t-score와 p-value**를 구하세요.
    - **귀무가설의 채택/기각 여부**를 판단하세요.
    - 해당 카테고리 내에서 **어떤 특성이 악성 종양 판별에** **가장 큰 영향을** 미치는지 분석하세요.
더보기
# 필수 2. 통계적 가설검정 1
def get_ttest(data) :
    for i in data.columns[1:] :
        t_stat, t_p_val = stats.ttest_ind(data[data['diagnosis'] == 'B'][i], data[data['diagnosis'] == 'M'][i])
        print(f"{i} : t-score {t_stat : .3f}, p-value{t_p_val : .4e}")

 

get_ttest(size_figure_data)
get_ttest(surface_data)
get_ttest(complexity_data)
get_ttest(structural_data)

 

**필수 2 답안**
1. 크기/형태 관련 특성 분석 :
    - 가설 :
        - H0: 악성 종양과 양성 종양간에 유의미한 크기/형태의 차이는 없다.
        - H1: 악성 종양과 양성 종양간에 유의미한 크기/형태의 차이가 있다.
    - 검정 결과 :
        - radius_mean : t-score `-25.436` , p-value `0.000`
        - perimeter_mean : t-score `-26.405` , p-value `0.000`
        - area_mean : t-score `-23.939` , p-value `0.000`
    - 해석 :
        - `t검정통계량이 큰 값을 가지므로 악성 종양과 양성 종양의 크기/형태 관련 특성 평균 차이가 크며, 가장 큰 차이를 보이는 것은 둘레이다.`
        - `p-value가 0.05보다 작기 때문에 귀무가설을 기각한다.`
        - `즉, 악성 종양과 양성 종양간 크기/형태 차이는 유의하다.`

2. 표면 특성 분석 :
    - 가설 :
        - H0: 악성 종양과 양성 종양간에 유의미한 표면 특성 차이는 없다.
        - H1: 악성 종양과 양성 종양간에 유의미한 표면 특성 차이가 있다.
    - 검정 결과 :
        - texture_mean : t-score `-10.867` , p-value `0.000`
        - smoothness_mean : t-score `-9.146` , p-value `0.000`
    - 해석 :
        - `t검정통계량을 보니 표면의 매끄러운 정도보다 질감에서 더 큰 평균차이를 보인다.`
        - `p-value가 0.05보다 작은 값을 가지므로 귀무가설을 기각한다.`
        - `즉, 악성 종양과 양성 종양간 표면 특성 차이는 유의하다.`
 
3. 형태 복잡도 특성 분석 :
    - 가설 :
        - H0: 악성 종양과 양성 종양간에 유의미한 형태 복잡도 특성 차이는 없다.
        - H1: 악성 종양과 양성 종양간에 유의미한 형태 복잡도 특성 차이가 있다.
    - 검정 결과 :
        - compactness_mean : t-score `-17.698` , p-value `0.000`
        - concavity_mean : t-score `-23.104` , p-value `0.000`
        - concave points_mean: t-score `-29.354` , p-value `0.000`
    - 해석 :
        - `악성 종양과 양성 종양간 형태 복잡도 특성 중에서 가장 큰 평균 차이를 보이는 것은 오목 점이다.`
        - `p-value는 모두 0.05보다 작은 값을 가지므로 귀무가설을 기각한다.`
        - `악성 종양과 양성 종양간 형태 복잡도 특성 차이는 유의하다.`
 
4. 구조적 특성 분석 :
    - 가설 :
        - H0: 악성 종양과 양성 종양간에 유의미한 구조적 특성 차이는 없다.
        - H1: 악성 종양과 양성 종양간에 유의미한 구조적 특성 차이가 있다.
    - 검정 결과 :
        - symmetry_mean : t-score `-8.338` , p-value `0.000`
        - fractal_dimension_mean : t-score `0.306` , p-value `0.760`
    - 해석 :
        - `프랙탈 차원 특성의 경우 양성 종양과 악성 종양간의 평균 차이가 거의 없으며, p-value가 0.05보다 높아 유의하지 않다.`
        - `대칭성 특성의 경우는 확실한 평균 차이가 존재하며, p-value가 0.05보다 작아 유의하다.`
        - `따라서 프랙탈 차원 특성의 경우에는 귀무가설을 채택하며, 대칭성 특성에 관해서는 귀무가설을 기각한다.`
        - `즉, 프랙탈 차원은 악성 종양과 양성 종양을 구분하는 데 사용할 수 없는 특성이다.`
       
   

종합 결론:

  - `크기, 형태 특성의 경우 세 특성 모두 비슷한 t검정통계량 값을 보이나 둘레가 가장 큰 값을 가진다. 즉, 양성 종양과 악성 종양간의 차이가 가장 큰 특성은 둘레이다.`
  - `표면 특성의 경우도 두 특성이 비슷한 t검정통계량 값을 가지지만 질감이 양성 종양, 악성 종양간 차이가 조금 더 크다.`
  - `형태 복잡도 특성에서는 오목점이 가장 높은 평균차이를 보이므로 오목점이 가장 큰 영향을 미친다.`
  - `구조적 특성에서는 프랙탈 차원이 유의하지 않으며, 대칭성에서 차이를 보인다.`
  - `결론적으로, 크기/형태 관련 특성이 종양 악성 여부 판단에 중요한 역할을 하며, 형태 복잡도 특성도 눈여겨 보아야 한다.`

**필수 3. 통계적 가설검정 2**


- Breast Cancer 데이터셋의 종양 특성들을 카테고리별로 분석하려 합니다. 각 카테고리에 속한 특성들의 측정치(mean, se, worst) 간 차이를 **ANOVA**로 분석해주세요.
    - **크기/형태 관련 특성**의 분석
    - radius (mean, se, worst), perimeter (mean, se, worst), area (mean, se, worst)에 대한 측정치 간 차이를 ANOVA로 분석하세요.
    - **표면 특성**의 분석
    - texture (mean, se, worst), smoothness (mean, se, worst)에 대한 측정치 간 차이를 ANOVA로 분석하세요.
    - **형태 복잡도 특성**의 분석
    - compactness (mean, se, worst), concavity (mean, se, worst), - concave points (mean, se, worst)에 대한 측정치 간 차이를 ANOVA로 분석하세요.
    - **구조적 특성**의 분석
    - symmetry (mean, se, worst), fractal dimension (mean, se, worst)에 대한 측정치 간 차이를 ANOVA로 분석하세요.
- **가설검정 방법**은 각 카테고리별로:
    - **귀무가설과 대립가설**을 작성하세요.
    - **t-score와 p-value**를 구하세요.
    - **귀무가설의 채택/기각 여부**를 판단하세요.
    - 해당 카테고리 내에서 **어떤 특성이 악성 종양 판별에** **가장 큰 영향을** 미치는지 분석하세요.
더보기
# 필수 3. 통계적 가설검정
def get_m_s_w(column) :
    data = df.filter(regex=column)
    f_stat, p_val = stats.f_oneway(data.iloc[:, 0], data.iloc[:, 1], data.iloc[:, 2])
    print(f"{column}: F-statistic{f_stat : .3f}, p-value{p_val : .4e}")
for i in ['radius', 'perimeter', 'area'] :
    get_m_s_w(i)
for i in ['texture', 'smoothness'] :
    get_m_s_w(i)
for i in ['compactness', 'concavity', 'concave points'] :
    get_m_s_w(i)
for i in ['symmetry', 'fractal_dimension'] :
    get_m_s_w(i)

 

**필수 3 답안**
1. 크기/형태 관련 특성 분석 :
    - 가설 :
        - H0: 크기/형태 관련 특성들의 평균값, 표준오차, 최대값 간에 유의미한 차이는 없다.
        - H1: 크기/형태 관련 특성들의 평균값, 표준오차, 최대값 간에 적어도 한 쌍 이상에서 유의미한 차이가 있다.
    - 검정 결과 :
        - radius : F-statistic `3527.295` , p-value `0.000`
        - perimeter : F-statistic `3147.869` , p-value `0.000`
        - area : F-statistic `717.207` , p-value `0.000`
    - 해석 :
        - `모든 특성에서 pvalue가 0.05보다 작으므로 귀무가설을 기각한다.`
        - `F검정통계량 값이 굉장히 크므로 크기/형태 관련 특성들의 평균값, 표준오차, 최대값간 차이가 굉장히 크다.`
        - `반지름의 경우에서 가장 큰 F검정통계량 값을 보이므로 크기/형태 관련 특성 중 반지름의 평균값, 표준오차, 최대값간 통계학적으로 매우 유의미한 차이가 있다.`

2. 표면 특성 분석 :
    - 가설 :
        - H0: 표면 특성들의 평균값, 표준오차, 최대값 간에 유의미한 차이는 없다.
        - H1: 표면 특성들의 평균값, 표준오차, 최대값 간에 적어도 한 쌍 이상에서 유의미한 차이가 있다.
    - 검정 결과 :
        - texture : F-statistic `4856.018` , p-value `0.000`
        - smoothness : F-statistic `9760.901` , p-value `0.000`
    - 해석 :
        - `모든 특성에서 pvalue가 0.05보다 작으므로 귀무가설을 기각한다.`
        - `F검정통계량 값이 굉장히 크므로 표면 특성들의 평균값, 표준오차, 최대값간 차이가 굉장히 크다.`
        - `매끄러움이 가장 큰 F검정통계량 값을 보이므로 표면 특성 중 매끄러움의 평균값, 표준오차, 최대값간 통계학적으로 매우 유의미한 차이가 있다.`

3. 형태 복잡도 특성 분석 :
    - 가설 :
        - H0: 형태 복잡도 특성들의 평균값, 표준오차, 최대값 간에 유의미한 차이는 없다.
        - H1: 형태 복잡도 특성들의 평균값, 표준오차, 최대값 간에 적어도 한 쌍 이상에서 유의미한 차이가 있다.
    - 검정 결과 :
        - compactness : F-statistic `827.424` , p-value `0.000`
        - concavity : F-statistic `529.960` , p-value `0.000`
        - concave points : F-statistic `788.949` , p-value `0.000`
    - 해석 :
        - `모든 특성에서 pvalue가 0.05보다 작으므로 귀무가설을 기각한다.`
        - `F검정통계량 값이 굉장히 크므로 형태 복잡도 특성들의 평균값, 표준오차, 최대값간 차이가 굉장히 크다.`
        - `조밀도에서 가장 큰 F검정통계량 값을 보이므로 형태 복잡도 특성 중 조밀도의 평균값, 표준오차, 최대값간 통계학적으로 매우 유의미한 차이가 있다.`

4. 구조적 특성 분석 :
    - 가설 :
        - H0: 구조적 특성들의 평균값, 표준오차, 최대값 간에 유의미한 차이는 없다.
        - H1: 구조적 특성들의 평균값, 표준오차, 최대값 간에 적어도 한 쌍 이상에서 유의미한 차이가 있다.
    - 검정 결과 :
        - symmetry : F-statistic `6752.704` , p-value `0.000`
        - fractal_dimension: F-statistic `7689.017` , p-value `0.000`
    - 해석 :
        - `모든 특성에서 pvalue가 0.05보다 작으므로 귀무가설을 기각한다.`
        - `F검정통계량 값이 굉장히 크므로 구조적 특성들의 평균값, 표준오차, 최대값간 차이가 굉장히 크다.`
        - `프랙탈 차원에서 가장 큰 F검정통계량 값을 보이므로 구조적 특성 중 프랙탈 차원의 평균값, 표준오차, 최대값간 통계학적으로 매우 유의미한 차이가 있다.`
           
 

종합 결론:

 
 - `이 분석은 각 카테고리에 속한 특성들의 측정치(mean, se, worst) 간 차이를 분석한 것으로, 종양의 양성/악성 판정과는 관련이 없다.`
 - `표준오차값을 포함하여 분석하는 방법이 맞는 것인지 모르겠다. 평균과 최대값에 비해 너무 작은 값을 가져 F검정통계량이 크게 나오고 p-value가 낮게 나오는 것으로 보인다.`
 - `카테고리별로 가장 큰 차이를 보이는 특성은 반지름, 매끄러움, 조밀도, 프랙탈 차원이다.`

**필수 4. 머신러닝 1**

 
- **아래와 같은 데이터를 바탕으로 선형 회귀 모델을 훈련시키고, 회귀식을 작성해주세요.**
    - 독립 변수(X): radius_mean (평균 반지름)
    - 종속 변수(Y): area_mean (평균 면적)
- **이 두 변수는 직관적으로 서로 관계가 있을 것으로 예상됩니다**
   
    **(반지름이 커지면 면적도 커질 것).회귀 모델을 학습한 후:**
   
    - 결정계수(R²)를 계산해주세요.
    - 회귀식을 작성해주세요.
    - radius_mean이 25일 때의 area_mean을 예측해주세요.
- **유의 사항**
    - 데이터 전처리나 분할은 필요하지 않습니다. 전체 데이터를 사용하여 학습을 진행해주세요.
    - sklearn.linear_model의 LinearRegression을 사용해주세요.
더보기
# 필수 4. 머신러닝 1
from sklearn.metrics import mean_squared_error, r2_score
X = df[['radius_mean']]
y = df[['area_mean']]
model_lr1 = LinearRegression()
model_lr1.fit(X, y)
pred1 = model_lr1.predict(X)
mse1 = mean_squared_error(y, pred1)
r2_1 = r2_score(y, pred1)
coef1 = model_lr1.coef_
intercept1 = model_lr1.intercept_
print(f'평균 제곱 오차 :{mse1 : .3f}')
print(f'결정계수 :{r2_1 : .3f}')
print("회귀식 : y = {}X + ({})".format(coef1[0][0], intercept1[0]))
print('redius_mean이 25일 때, area_mean은', (coef1*25 + intercept1)[0][0])
#
평균 제곱 오차 : 3106.202
결정계수 : 0.975
회귀식 : y = 98.59821921514533X + (-738.0367041957495)
redius_mean이 25일 때, area_mean은 1726.9187761828837

**도전 1. 머신러닝 2**


- **과제**
   
    **크기/형태 관련 특성(radius_mean, perimeter_mean, area_mean)을 사용하여 종양의 악성 여부(diagnosis)를 예측하는 RandomForest 모델을 학습시켜주세요.**
   
    학습된 모델을 사용하여 다음 작업을 수행해주세요.
   
    1. 모델의 정확도를 계산해주세요.
    2. Feature Importance를 막대 그래프로 시각화해주세요.
    3. 각 특성의 중요도 수치를 출력하고 해석해주세요.
- **학습 방법**
    - y(종속변수)는 B/M으로 기재된 이진형 데이터이므로, 인코딩 작업이 필요합니다.
       
        구현을 위해 **LabelEncoder**를 사용해주세요.
       
    - 머신러닝 코드 작성 시, 전체 데이터셋을 Train set과 Test set으로 나눠주세요.
        - **Test set 비중 : 30%**
        - **random_state : 42**
    - **RandomForestClassifier**를 활용하여 모델 학습을 진행해주세요.
        - **random_state : 42**
더보기
#도전 1. 머신러닝 2
encoder = LabelEncoder()
encoded_diag = encoder.fit_transform(df['diagnosis'])
df['diagnosis_en'] = encoded_diag
 
X_size = df[['radius_mean', 'perimeter_mean', 'area_mean']]
y_size_true = df['diagnosis_en']
X_train1, X_test1, y_train1, y_test1 = train_test_split(X_size, y_size_true, test_size=0.3, random_state=42)

clf = RandomForestClassifier(random_state=42)
clf.fit(X_train1,y_train1)
 
size_pred = clf.predict(X_test1)
clf_acc = accuracy_score(y_test1, size_pred)
print(f"모델 정확도:{clf_acc*100 : .2f}%")

# 모델 정확도: 91.81%

 

plt.figure(figsize=(8,6))
sns.barplot(x = clf.feature_names_in_ , y =clf.feature_importances_, color = 'slateblue')
plt.xlabel('크기/형태 관련 특성')
plt.ylabel('특성 중요도')
plt.title('랜덤 포레스트 결과')
plt.show()
#

 

**3. Feature Importance 해석: 크기/형태 관련 특성들은 양성 종양 악성 종양 구분에 미치는 영향이 비슷하지만, 그 중 가장 높은 비율을 갖는 것은 둘레이다. 즉, 둘레가 종양의 악성 구분에 가장 큰 영향을 미친다.**

 

**도전 2. 머신러닝 3**


- **과제**
   
    **형태 복잡도 특성(compactness_mean, concavity_mean, concave points_mean)을 사용하여 종양의 악성 여부를 예측하는 로지스틱 회귀 모델을 학습시켜주세요.**
   
    학습된 모델을 사용하여 다음 작업을 수행해주세요.
   
    1. 모델의 정확도를 계산해주세요.
    2. 각 특성의 계수를 막대 그래프로 시각화해주세요.
    3. 아래의 조건에 맞춰, 새로운 종양의 악성 확률을 계산해주세요.
        - compactness_mean : `0.1`
        - concavity_mean : `0.1`
        - concave points_mean : `0.05`
- **학습 및 추론 방법**
    - y(종속변수)는 B/M으로 기재된 이진형 데이터이므로, 인코딩 작업이 필요합니다.
       
        구현을 위해 **LabelEncoder**를 사용해주세요.
       
    - 머신러닝 코드 작성 시, 전체 데이터셋을 Train set과 Test set으로 나눠주세요.
        - **Test set 비중 : 30%**
        - **random_state : 42**
    - **계수** 시각화 코드 작성 시, 각 특성의 계수 크기를 비교할 수 있도록 **막대 그래프**를 생성하세요.
        - 양수/음수를 다른 색상으로 표시해주세요.
    - 새로운 종양 데이터를 **`new_tumor`** 변수에 지정하고, **`model.predict_proba`**를 사용하여 악성 확률을 구해주세요.
더보기
# 도전 2. 머신러닝 3
X_comp = df[['compactness_mean', 'concavity_mean', 'concave points_mean']]
y_comp_true = df['diagnosis_en']
X_train, X_test, y_train, y_test = train_test_split(X_comp, y_comp_true, test_size=0.3, random_state=42)
model_lor = LogisticRegression()
model_lor.fit(X_train, y_train)

 

comp_pred = model_lor.predict(X_test)
comp_lor_acc = accuracy_score(y_test, comp_pred)
 
 
plt.figure(figsize = (8, 6))
sns.barplot(x = model_lor.feature_names_in_, y = model_lor.coef_[0], color = 'coral')
plt.xlabel('형태 복잡도 특성')
plt.ylabel('회귀 계수')
plt.title('로지스틱 회귀모델 결과')
plt.show()

#

 

new_tumor = np.array([0.1, 0.1, 0.05]).reshape(1,-1)
prediction = model_lor.predict_proba(new_tumor)

 

print(f'모델 정확도:{comp_lor_acc * 100 : .2f}%')
print(f'새로운 종양 양성 음성 예측 확률: 양성{prediction[0][0] * 100 : .2f}%, 음성{prediction[0][1] * 100 : .2f}%')

#

모델 정확도: 82.46%

새로운 종양 양성 음성 예측 확률: 양성 61.81%, 음성 38.19%