가설 : 하루 사료 섭취량이 우유 생산량에 가장 큰 영향을 미칠 것이다
정규성 검정 및 등분산성 검정
# 1-1. 정규성 검정 (Shapiro-Wilk는 5000개 이상 데이터에 제한적이므로 Kolmogorov-Smirnov 사용)
# 분석 대상: 사료 섭취량 (Feed_Quantity_kg)
feed_data = df_final['Feed_Quantity_kg']
ks_stat, ks_p = stats.kstest((feed_data - feed_data.mean()) / feed_data.std(), 'norm')
# 1-2. 등분산성 검정 (Levene's Test)
# 비교군: 착유 단계(Lactation_Stage)에 따른 사료 섭취량의 분산이 같은가?
stages = df_final['Lactation_Stage'].unique()
feed_groups = [df_final[df_final['Lactation_Stage'] == stage]['Feed_Quantity_kg'] for stage in stages]
levene_stat, levene_p = stats.levene(*feed_groups)
# 시각화 설정
plt.figure(figsize=(15, 6))
# 1. 정규성 확인을 위한 Q-Q Plot
plt.subplot(1, 2, 1)
stats.probplot(df_final['Feed_Quantity_kg'], dist="norm", plot=plt)
plt.title('Q-Q Plot (Normality Check)', fontsize=14, fontweight='bold')
# 2. 등분산성 확인을 위한 Box Plot (Lactation Stage별 Feed Quantity)
plt.subplot(1, 2, 2)
sns.boxplot(x='Lactation_Stage', y='Feed_Quantity_kg', data=df_final, palette='Set2')
plt.title('Box Plot by Stage (Homoscedasticity Check)', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.savefig('normality_homoscedasticity_graphs.png', dpi=300)
plt.show()
print(f"--- 1단계: 정규성 및 등분산성 검정 결과 ---")
print(f"[정규성 - KS Test] 통계량: {ks_stat:.4f}, p-value: {ks_p:.4e}")
print(f"[등분산성 - Levene Test] 통계량: {levene_stat:.4f}, p-value: {levene_p:.4e}")
- -- 1단계: 정규성 및 등분산성 검정 결과 --- [정규성 - KS Test] 통계량: 0.0112, p-value: 8.1516e-24 [등분산성 - Levene Test] 통계량: 0.4220, p-value: 6.5570e-01
- 결과 : 정규성 검정을 통한 p-value값이 매우작아 정규분포를 따르지 않는다는 뜻이다. 등 분산성검정을 통한 p-value값이 0.6165이므로 사료 섭취량의 변동은 통계적으로 비슷하다 라는것을 의미
상관관계 분석
#2-1. 상관계수 계산 (Pearson & Spearman)
# 정규성이 부족하므로 순위 기반인 Spearman 상관계수도 함께 확인합니다.
pearson_corr, pearson_p = stats.pearsonr(df_final['Feed_Quantity_kg'], df_final['Milk_Yield_L'])
spearman_corr, spearman_p = stats.spearmanr(df_final['Feed_Quantity_kg'], df_final['Milk_Yield_L'])
print(f"--- 2단계: 상관관계 분석 결과 ---")
print(f"[Pearson 상관계수] {pearson_corr:.4f} (p-value: {pearson_p:.4e})")
print(f"[Spearman 상관계수] {spearman_corr:.4f} (p-value: {spearman_p:.4e})")
# 2-2. 시각화 (Scatter Plot with Regression Line)
plt.figure(figsize=(10, 6))
sns.regplot(x='Feed_Quantity_kg', y='Milk_Yield_L', data=df_final,
scatter_kws={'alpha':0.05, 'color':'blue'},
line_kws={'color':'red'})
plt.title(f'Correlation between Feed Quantity and Milk Yield\n(Pearson: {pearson_corr:.4f})', fontsize=14, fontweight='bold')
plt.xlabel('Feed Quantity (kg)')
plt.ylabel('Milk Yield (L)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.savefig('correlation_analysis.png', dpi=300)
plt.show()
통계적 검정 단계(회귀분석)
import statsmodels.api as sm
# --- [3단계: 통계적 분석 (단순 선형 회귀)] ---
# 독립변수(X): 사료 섭취량, 종속변수(y): 우유 생산량
X = df_final['Feed_Quantity_kg']
y = df_final['Milk_Yield_L']
# 상수항 추가 (Intercept)
X_with_const = sm.add_constant(X)
# OLS(최소자승법) 모델 생성 및 학습
model = sm.OLS(y, X_with_const).fit()
# 결과 출력
print("--- 3단계: 통계적 분석 (Regression Summary) ---")
print(model.summary().tables[1]) # 계수 테이블
print(f"\n[모델 결정계수 (R-squared)] {model.rsquared:.4f}")
print(f"[F-통계량 p-value] {model.f_pvalue:.4e}")
머신러닝
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# 2. 머신러닝 준비
le = LabelEncoder()
df_final['Disease_Encoded'] = le.fit_transform(df_final['Disease_Status'])
df_final['Stage_Encoded'] = le.fit_transform(df_final['Lactation_Stage'])
features = ['Feed_Quantity_kg', 'Water_Intake_L', 'Walking_Distance_km',
'Body_Temperature_C', 'Rumination_Time_hrs', 'THI',
'Disease_Encoded', 'Stage_Encoded']
X = df_final[features]
y = df_final['Milk_Yield_L']
# 학습 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습 (Random Forest)
rf = RandomForestRegressor(n_estimators=50, random_state=42, n_jobs=-1)
rf.fit(X_train, y_train)
# 중요도 추출 및 시각화
importances = pd.Series(rf.feature_importances_, index=features).sort_values(ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x=importances.values, y=importances.index, palette='magma')
plt.title('Machine Learning: Feature Importance for Milk Yield', fontsize=14, fontweight='bold')
plt.xlabel('Importance Score')
plt.tight_layout()
plt.savefig('ml_final_importance.png', dpi=300)
plt.show()
print("--- 4단계: 머신러닝 분석 결과 ---")
print(importances)
사료 섭취량은 상위권에 위치하여 우유 생산에 중요한 역할을 하는 것은 맞지만, 실제로는 THI(환경 스트레스)와 물 섭취량, 질병 상태가 사료량보다 더 큰 영향력을 미치는 것으로 나타남
상관관계/통계: 사료와 우유 생산량은 통계적으로 유의미한 정(+)의 관계에 있으나, 그 직선적인 영향력(r^2)은 매우 낮았습니다.머신러닝: 전체적인 관점에서 사료량은 중요 지표 중 하나(5위)였으며, 소의 생산성에는 사료만큼이나 주변 온도(THI)와 수분 공급이 결정적이라는 인사이트를 얻을수 잇따
'내일배움캠프(QA,QC_5기)' 카테고리의 다른 글
| [내일배움캠프] QA/QC_5기 ( 50일차 ) (1) | 2026.05.19 |
|---|---|
| [내일배움캠프] QA/QC_5기 ( 49일차 ) (0) | 2026.05.18 |
| [내일배움캠프] QA/QC_5기 ( 39일차 ) (0) | 2026.04.30 |
| [내일배움캠프] QA/QC_5기 ( 38일차 ) (0) | 2026.04.29 |
| [내일배움캠프] QA/QC_5기 ( 37일차 ) (0) | 2026.04.28 |