Kaggle은 대량의 데이터셋을 내려받을 수 있는 데이터포털입니다.
Kaggle 웹사이트에서 직접 CSV 파일을 다운로드한 뒤, 파이썬 코드로 데이터를 읽어와서 지수 함수로 피팅(Curve Fitting)하는 과정을 아주 쉽게 단계별로 안내해 드리겠습니다.
1단계: Kaggle에서 데이터 직접 다운로드하기
지수적 증가를 보여주는 가장 대표적인 데이터는 ‘전염병의 초기 확산 데이터’ 또는 **’인구/미생물 성장 데이터’**입니다.
- Kaggle 접속: Kaggle.com에 접속하여 로그인합니다.
- 검색: 검색창에 “COVID-19 Data Repository” 또는 **”Coronavirus dataset”**을 검색합니다.
- 다운로드: 원하는 데이터셋 페이지에 들어가서 우측 상단의 검은색 [Download] 버튼을 클릭합니다.
- 압축 풀기: 다운로드된 .zip 파일의 압축을 풀면 .csv 파일들이 나옵니다.
- 파일 이동: 파이썬 코드를 작성할 폴더(디렉토리)에 분석할 .csv 파일을 옮겨 놓습니다. (예: 파일명을 data.csv로 변경하면 코딩하기 편합니다.)
2단계: 필수 라이브러리 설치
데이터 처리를 위한 pandas, 계산을 위한 numpy와 scipy, 그래프를 그리기 위한 matplotlib이 필요합니다. 터미널(명령 프롬프트)에서 아래 명령어를 쳐서 설치해주세요.
pip install pandas numpy scipy matplotlib3단계: 파이썬 전체 코드
다운로드하신 데이터에 날짜(Date)와 누적 확진자수(Cases) 컬럼이 있다고 가정하고 코드를 작성했습니다. 실제 다운받은 CSV 파일의 컬럼명에 맞게 이름만 살짝 수정해서 실행하시면 됩니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# ==========================================
# 1. 데이터 불러오기 및 전처리
# ==========================================
# 다운받은 csv 파일 이름을 입력하세요.
file_path = 'data.csv'
df = pd.read_csv(file_path)
# 예시: 특정 국가(예: 이탈리아)의 데이터만 추출하고 싶을 때
# (만약 데이터가 이미 한 국가의 것이라면 이 부분은 생략 가능합니다)
if 'Country/Region' in df.columns:
df = df[df['Country/Region'] == 'Italy']
# 날짜 컬럼을 진짜 날짜 형식으로 변환하고 정렬
# (실제 csv 파일의 날짜 컬럼명으로 'Date' 부분을 변경하세요)
date_column = 'Date' # 예: 'ObservationDate', 'date' 등
value_column = 'Confirmed' # 예: 'Cases', 'Value' 등
df[date_column] = pd.to_datetime(df[date_column])
df = df.sort_values(date_column)
# 날짜별 누적합계 구하기
df_daily = df.groupby(date_column)[value_column].sum().reset_index()
# ★ 중요: 지수적 증가는 '초기 데이터'에서 뚜렷합니다.
# 초기 40일치 데이터만 잘라서 사용합니다.
df_early = df_daily.head(40).copy()
# X축 데이터: 경과 일수 (0, 1, 2, 3... 39)
x_data = np.arange(len(df_early))
# Y축 데이터: 실제 값 (확진자 수 등)
y_data = df_early[value_column].values
# ==========================================
# 2. 지수 함수 정의 및 피팅(Fitting)
# ==========================================
# 지수 함수 수식 정의: y = a * e^(bx)
def exponential_func(x, a, b):
return a * np.exp(b * x)
# curve_fit을 이용해 데이터에 가장 잘 맞는 a와 b 값을 찾습니다.
# p0는 초기 추정값입니다. (a=1, b=0.1 정도로 시작)
popt, pcov = curve_fit(exponential_func, x_data, y_data, p0=(1, 0.1))
# 찾은 최적의 매개변수
a_opt, b_opt = popt
print(f"찾아낸 최적의 함수: y = {a_opt:.2f} * e^({b_opt:.4f} * x)")
# ==========================================
# 3. 결과 시각화 (그래프 그리기)
# ==========================================
# 피팅된 함수로 만든 예측 Y값
y_fit = exponential_func(x_data, a_opt, b_opt)
plt.figure(figsize=(10, 6))
# 실제 데이터 (점)
plt.scatter(x_data, y_data, label='Actual Data (CSV)', color='blue', s=30)
# 피팅된 지수 함수 그래프 (빨간 선)
plt.plot(x_data, y_fit, label=f'Fitted Curve: $y={a_opt:.1f} e^{{{b_opt:.3f}x}}$', color='red', linewidth=2)
# 그래프 꾸미기
plt.title('Exponential Curve Fitting of Early Stage Data', fontsize=16)
plt.xlabel('Days Passed', fontsize=12)
plt.ylabel('Cumulative Values', fontsize=12)
plt.legend(fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
# 그래프 화면에 띄우기
plt.show()
댓글 남기기