반응형

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 마르띤
,
반응형

Google에서 bubble chart로 검색을 해 보았다.

 

A bubble chart is a type of chart that displays three dimensions of data. Each entity with its triplet (v1, v2, v3) of associated data is plotted as a disk that expresses two of the vi values through the disk's xy location and the third through its size.

 

해석을 하자면 버블 차트는 데이터의 세 가지 차원을 표현하는 차트 중 하나입니다. 각 엔터티는 연관된 데이터의 세 값 (v1, v2, v3)을 가지며, 이를 디스크로 표현하여 디스크의 xy 위치로 두 개의 vi 값과 크기로 세 번째 값을 나타냅니다.

 

개념과 그래프의 예시는 아래 위키피디아 링크를 가보면 된다.

https://en.wikipedia.org/wiki/Bubble_chart

 

Bubble chart - Wikipedia

From Wikipedia, the free encyclopedia Type of chart Bubble chart displaying the relationship between poverty and violent and property crime rates by state. Larger bubbles indicate higher percentage of state residents at or below the poverty level. Trend su

en.wikipedia.org

 

seaborn 패키지와 함께 그릴 수 있는 예제도 검색하면 쉽게 찾아볼 수 있다. 

https://python-graph-gallery.com/bubble-plot-with-seaborn/

 

Bubble Plot with Seaborn | The Python Graph Gallery

How to draw a bubble plot using the scatterplot function of seaborn library

python-graph-gallery.com

 위 링크의 예시를 하나 가져와보자. gapminder 데이터 패키지를 설치하면 쉽게 그려볼 수 있다. gapminder는 국가별 경제 수준과 의료 수준 동향을 정리한 DataSet으로 분석에 다양하게 쓰인다. 

 

# 라이브러리 불러오기
import matplotlib.pyplot as plt
import seaborn as sns
from gapminder import gapminder # import data set 

# 사이즈 크기 설정
plt.rcParams['figure.figsize'] = [8, 8]

# 데이터 가져오기
data = gapminder.loc[gapminder.year == 2007]
 
# 버블차트를 그리기
sns.scatterplot(data=data, x="gdpPercap", y="lifeExp", size="pop", legend=False, sizes=(20, 2000))

# 그래프 출력
plt.show()

 

[결과값]

파이썬 공부를 해 본 사람이라면 한번씩은 봤을 그 그래프다!

(1) 버블차트를 그리는 방법은 다양하다.

import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
num_points = 30
x = np.random.rand(num_points)
y = np.random.rand(num_points)
sizes = np.random.rand(num_points) * 100  # 크기 정보

# 버블 차트 그리기
plt.scatter(x, y, s=sizes, alpha=0.5)

# 그래프 설정
plt.title('Bubble Chart Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.grid(True)

# 그래프 표시
plt.show()

 

[결과값]

버블 차트(Bubble Chart)는 산점도(Scatter Plot)와 유사하지만, 각 데이터 포인트에 크기 정보를 추가한 그래프입니다. 각각의 데이터 포인트는 x축, y축으로 위치가 지정되고, 동시에 해당 데이터 포인트의 크기가 버블의 크기로 표현됩니다. 파이썬에서 버블 차트를 그리기 위해 주로 matplotlib 라이브러리를 사용합니다. 이 코드에서는 plt.scatter 함수를 사용하여 각 데이터 포인트를 표현하고, s 인자를 통해 크기 정보를 전달합니다. alpha 인자는 투명도를 나타내며, 0에서 1 사이의 값을 가집니다. num_points 변수를 통해 데이터 포인트의 개수를 조절하고, sizes 배열을 통해 각 데이터 포인트의 크기를 랜덤하게 생성합니다. 그 결과로 더 많은 버블이 표현된 그래프가 나타납니다. 데이터의 특성에 따라서 원하는 개수나 크기로 조절하실 수 있습니다.

 

(2) 버블차트의 색상을 다양하게 그려보자

import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
num_points = 30
x = np.random.rand(num_points)
y = np.random.rand(num_points)
sizes = np.random.rand(num_points) * 100  # 크기 정보
colors = np.random.rand(num_points)  # 색상 정보

# 버블 차트 그리기
plt.scatter(x, y, s=sizes, c=colors, cmap='viridis', alpha=0.5)

# 컬러바 추가
plt.colorbar()

# 그래프 설정
plt.title('Colored Bubble Chart Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.grid(True)

# 그래프 표시
plt.show()

 

[결과값]

위 코드에서는 c 매개변수를 통해 각 데이터 포인트의 색상을 설정하고, cmap 매개변수로는 사용할 컬러 맵을 지정합니다. 여기서는 'viridis' 컬러 맵을 사용하였습니다. 그리고 plt.colorbar() 함수를 사용하여 컬러바를 추가하였습니다. 컬러 맵은 matplotlib에서 제공하는 여러 가지 컬러 스키마 중에서 선택할 수 있습니다. 

 

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

(1) boxplot은 왜 쓸까?

박스 플롯(Box Plot)은 통계적 데이터의 요약된 시각화 도구로, 데이터의 중앙 경향, 분포, 이상치를 효과적으로 보여주는 차트입니다. 다른 이름으로는 상자 수염 그림(Box-and-Whisker Plot)이라고도 불립니다. 박스 플롯은 다음과 같은 주요 구성 요소로 이루어져 있습니다:

 

1. 상자 (Box):

- 상자의 하단 변은 데이터의 1사분위수(Q1)를 나타냅니다.

- 상자의 상단 변은 데이터의 3사분위수(Q3)를 나타냅니다.

- 상자의 중앙에 수평선은 데이터의 중앙값(median)을 나타냅니다.

 

2. 수염 (Whiskers):

- 수염은 데이터의 최솟값과 최댓값을 나타냅니다. 일반적으로 1.5배의 사분위 범위(IQR)를 벗어나는 값은 이상치로 간주됩니다.

 

3. 이상치 (Outliers):

- 수염 부분을 벗어나는 점은 이상치로 간주됩니다.

 

박스 플롯은 데이터의 분포를 쉽게 이해하고, 여러 그룹 간의 비교를 통해 통계적 특성을 시각적으로 비교할 수 있는 강력한 도구입니다. 특히, 중앙값과 사분위수를 통해 데이터의 중심 경향과 분포를 한눈에 파악할 수 있어 다양한 분야에서 널리 사용되고 있습니다.

 

(2) boxplot 한 개를 그려보자

# 라이브러리 불러오기
import matplotlib.pyplot as plt
import numpy as np

# 예제 데이터 생성
np.random.seed(10) # 난수 생성 시드 설정
data = np.random.normal(0, 1, 100) # 평균이 0이고 표준 편차가 1인 정규 분포에서 100개의 데이터 생성

# 그래프 사이즈 조정
fig = plt.figure(figsize =(10, 7))

# 박스 플롯 그리기
plt.boxplot(data)

# 그래프 표시
plt.show()

 

[결과값]

위 코드를 실행하면 평균이 0이고 표준 편차가 1인 정규 분포에서 생성된 데이터에 대한 박스 플롯이 그려진 그래프 창이 표시됩니다. 

 

(3) boxplot 여러 개를 그려보자

# 라이브러리 불러오기
import matplotlib.pyplot as plt
import numpy as np

# 예제 데이터 생성
np.random.seed(10)

data_1 = np.random.normal(10, 5, 100)
data_2 = np.random.normal(9, 10, 100)
data_3 = np.random.normal(8, 15, 100)
data_4 = np.random.normal(7, 20, 100)
data = [data_1, data_2, data_3, data_4]

# 그래프 사이즈 및 간격 조정
fig = plt.figure(figsize =(10, 7))
ax = fig.add_axes([0, 0, 1, 1])

# 박스 플롯 그리기
bp = ax.boxplot(data)

# 그래프 표시
plt.show()

 

[결과값]

네 개의 상자 플롯이 그려져 있으며, 각각의 상자 플롯은 다른 그룹에 해당합니다. 각 그룹의 중심 경향과 분포를 나타내기 위해 상자의 위치와 크기가 다릅니다. 그래프 상단의 표시는 각 그룹의 중앙값(median)을 나타냅니다. 수염은 각 그룹의 데이터의 전체 분포를 나타냅니다. 이상치가 몇몇 그룹에 존재합니다.

 

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

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

(1) 리스트 다루기

fruits = ["사과", "바나나", "딸기", "포도"]
print("과일 목록:", fruits)

 

[결과값]

과일 목록: ['사과', '바나나', '딸기', '포도']

 

파이썬 리스트는 순서가 있는 데이터의 컬렉션으로, 여러 값을 담을 수 있는 가변(mutable)한 자료형입니다. 리스트는 대괄호 []를 사용하여 정의되며, 각 항목은 콤마 ,로 구분됩니다.

 

(2) 딕셔너리 활용하기

student = {"이름": "철수", "나이": 15, "성적": 90}
print("학생 정보:", student)

 

[결과값]

학생 정보: {'이름': '철수', '나이': 15, '성적': 90}

 

리스트는 순수가 있는 데이터의 컬렉션으로 각 항목은 콤마로 구분. 딕셔너리는 순서가 없는 데이터의 컬렉션으로 각 항목은 키와 밸류의 한 상으로 구분, 중괄호를 사용하고, 각 쌍은 콤마로 구분된다.

 

(3) 제곱근

import math

result = math.sqrt(25)
print("제곱근:", result)

 

[결과값]

제곱근: 5.0

 

(4) 예외처리

try:
    result = 10 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

 

[결과값]

0으로 나눌 수 없습니다.

 

1.    try 블록:

-       try 키워드 아래의 블록은 예외가 발생할 수 있는 코드를 포함합니다.

-       여기서는 10 / 0이라는 수식이 있습니다. 이는 0으로 나누는 연산으로, 이는 ZeroDivisionError 예외를 발생시킵니다.

 

2.    except 블록:

-       except 키워드는 try 블록에서 발생한 예외를 처리하기 위한 블록을 나타냅니다.

-       ZeroDivisionError 0으로 나누려고 할 때 발생하는 예외입니다. 이 예외가 발생하면 해당 블록이 실행됩니다.

-       여기서는 예외가 발생했을 때 출력할 메시지를 print("0으로 나눌 수 없습니다.")로 지정했습니다.

 

3.    실행 흐름:

-       try 블록의 코드가 실행됩니다.

-       예외가 발생하면 프로그램의 흐름이 except 블록으로 이동하고, 지정된 메시지가 출력됩니다.

-       예외가 발생하지 않으면 except 블록은 건너뛰어집니다.

 

 

이 코드는 0으로 나누는 오류에 대한 처리를 담고 있습니다. 예외 처리를 통해 프로그램이 비정상적인 상황에서도 적절히 대응할 수 있도록 도와줍니다.

 

try:
    result = 10 / 2
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

 

예외가 발생하지 않으므로 except 블록은 건너뛰어지고 아무 결과값도 나오지 않는다.

 

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

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

(1) 변수 x에 5를 할당하고, 변수 y에 3을 할당한 후, 두 변수를 더한 값을 출력하는 코드를 작성하세요.

x = 5
y = 3
result = x + y
print(result)

 

(2) 사용자로부터 이름을 입력 받아 환영 메시지를 출력하는 코드를 작성하세요.

name = input("이름을 입력하세요: ")
print("안녕하세요, " + name + "님!")

 

(3) 1부터 10까지의 숫자 중에서 짝수만 출력하는 코드를 작성하세요.

for i in range(1, 11):
    if i % 2 == 0:
        print(i)

1. for 루프: for i in range(1, 11):은 1부터 10까지의 숫자를 반복하는 루프를 나타냅니다. range(1, 11)은 1부터 10까지의 범위를 생성합니다.

2. 짝수 확인: if i % 2 == 0:는 현재의 i가 짝수인지를 확인합니다. 여기서 %는 나머지를 계산하는 연산자이며, i % 2가 0이면 i는 짝수입니다.

3. 짝수 출력: 짝수인 경우에만 print(i)가 실행되어 현재의 i를 출력합니다.

 

(4) 주어진 리스트에서 최대값을 찾는 함수를 작성하세요.

# 정의
def find_max(lst):
    max_value = max(lst)
    return max_value

# 사용 예시
numbers = [3, 8, 1, 5, 10]
result = find_max(numbers)
print("최대값:", result)

1. 함수 정의: find_max 함수는 리스트를 받아 해당 리스트에서 최대값을 찾아 반환하는 함수입니다. 함수는 max 내장 함수를 활용합니다.

2. 사용 예시: numbers라는 리스트를 만들고, 이 리스트를 find_max 함수에 전달하여 최대값을 찾습니다.

3. 결과 출력: 최대값을 변수 result에 저장하고, 이를 화면에 출력합니다.

 

이 코드는 임의의 숫자 리스트에서 최대값을 찾는 함수를 정의하고, 이 함수를 사용하여 주어진 예시 리스트의 최대값을 찾아 출력하는 예시입니다. 함수를 활용하면 언제든지 다른 리스트에 대해서도 최대값을 쉽게 찾을 수 있습니다.

 

 

 

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

2024년에는 행복한 데이터 과학자 되세요!  :-)

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

1. G마켓 크롤링

지난 번 웹  크롤링을 통해 올리브영의 랭킹 정보를 긁어 모았고, 이번에는 G 마켓의 랭킹 정보를 크롤링 해 보려 한다.

https://kmrho1103.tistory.com/entry/Python-%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%98%AC%EB%A6%AC%EB%B8%8C%EC%98%81-%EB%9E%AD%ED%82%B9-%ED%81%AC%EB%A1%A4%EB%A7%81

 

[Python] 웹 크롤링 - 올리브영 랭킹 크롤링

0. 웹 크롤링이 뭐야? 크롤링은 인터넷 상에서 웹 페이지를 순회하고, 웹 사이트에서 정보를 추출하는 자동화된 프로세스를 말합니다. 크롤링은 웹 크롤러 또는 스파이더라고 불리는 소프트웨어

kmrho1103.tistory.com

 

2. G마켓 랭킹

https://category.gmarket.co.kr/listview/L100000005.aspx

 

G마켓-화장품/향수

컨실러란? 기미,잡티,주근깨,여드름흔적등을 감쪽같이 커버하여 깨끗한피부연출을 해주는 제품.국소부위용과 얼굴전체커버용 닫기

category.gmarket.co.kr

위 주소로 들어가면 아래 처럼 G마켓에서 잘 팔리는 상품들의 랭킹 정보를 볼 수 있다.

 

3. 파이썬 코드

import pandas as pd
import requests
from bs4 import BeautifulSoup

url = requests.get('https://www.gmarket.co.kr/n/best?jaehuid=200011415&viewType=C&largeCategoryCode=100000005')
html = BeautifulSoup(url.text)

products = []
for i in html.find_all('div',class_='thumb'):
    products.append(i.find('img')['alt']) # 이미지 태그의 'alt' 속성에 상품 이름이 들어 있다
    
price = []
for i in html.find_all('div',class_='s-price'):
    price.append(i.text.split('할인가')[1].split('원')[0])
    
df = pd.DataFrame({'상품명':products,'가격':price})
df

 

가격 태그 정보를 좀 더 분석해보면 깔끔하게 가져올 수 있을 것 같다는 생각이 드는데 좀 더 공부해야겠다.

 

 

 

 

 

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

1. 결측치 확인

import pandas as pd

# 데이터프레임 생성 (예시)
data = {'A': [1, 2, None, 4],
        'B': [None, 5, 6, 7],
        'C': [10, 20, 30, 40]}
df = pd.DataFrame(data)

# 결측값 확인
print(df.isnull())
print(df.isnull().sum())

 

2. 결측치 제거

1) 행 삭제

# 결측값이 있는 행 삭제
df = df.dropna()
df

2) 열 삭제

# 결측값이 있는 열 삭제
df = df.dropna(axis=1)
df

 

3. 결측치 대체

1) 평균값

# 평균값으로 대체
mean_value = df['A'].mean()
df_filled = df.fillna(mean_value)
df_filled

2) 중앙값 또는 최빈값

# 중간값(median)이나 최빈값(mode)으로 대체 가능
median_value = df['B'].median()
df_filled = df.fillna(median_value)
df_filled

3) 사전에 정의한 값

# 사전에 정의된 값으로 대체
df_filled = df.fillna({'A': 0, 'B': 1, 'C': 2})
df_filled

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

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 마르띤
,