머신러닝 과제
과제 : 광고 예산(TV, Radio, Newspaper)과 판매량(Sales) 데이터를 사용하여 선형 회귀 모델을 학습시키고, 새로운 광고 예산이 주어졌을 때 판매량을 예측하는 프로그램을 작성하세요. 또한, 예측 결과와 실제 데이터를 시각화하여 모델의 성능을 직관적으로 확인하세요.
[세부 요구사항]
- 데이터 로드
- 캐글(https://www.kaggle.com/)에서 구글 계정으로 가입합니다.
- 캐글 메인에서 좌측 Datasets 메뉴 선택하고, 다음 화면 상단 검색창에서 Advertising을 검색합니다.
- 다음 화면에서 상단 Datasets를 클릭하고 조회된 결과에서 Advertising Dataset 선택한 후 Download 버튼 클릭하여 다운받습니다.
- 다운받은 파일은 로컬 PC dataset로 이동하여 저장합니다.
- dataset/Advertising.csv 경로에서 데이터를 로드합니다. (pandas 라이브러리 사용)
- 데이터 전처리
- 불필요한 ‘Unnamed: 0’ 컬럼을 제거합니다.
- 독립 변수(X)는 ‘TV’, ‘Radio’, ‘Newspaper’ 컬럼으로 설정합니다.
- 종속 변수(y)는 ‘Sales’ 컬럼으로 설정합니다.
- 데이터 분할
- 전체 데이터를 학습 데이터와 테스트 데이터로 8:2 비율로 분할합니다. (scikit-learn의 train_test_split 함수 사용)
-
모델 학습 선형 회귀 모델을 학습 데이터로 학습시킵니다. (scikit-learn의 LinearRegression 모델 사용)
- 예측
- 테스트 데이터에 대한 판매량을 예측합니다.
- 모델 평가
- 테스트 데이터에 대한 R-squared (결정 계수) 값을 계산하여 모델 성능을 평가합니다. (scikit-learn의 r2_score 함수 사용)
- 새로운 데이터 예측
- TV=200, Radio=50, Newspaper=30 일 때 판매량을 예측합니다.
- 결과 출력
- 테스트 데이터에 대한 R-squared 값을 출력합니다.
- 새로운 데이터에 대한 예측 판매량을 출력합니다.
- 시각화
- 실제 판매량 vs 예측 판매량 산점도: 테스트 데이터의 실제 판매량과 예측 판매량을 산점도로 시각화합니다. x축은 실제 판매량, y축은 예측 판매량으로 설정하고, 제목과 축 레이블을 명확하게 표시합니다.
- 각 독립변수와 판매량과의 관계 시각화: 각 독립 변수(‘TV’, ‘Radio’, ‘Newspaper’)와 ‘Sales’ 간의 산점도를 그리고, 회귀선을 추가하여 시각화합니다.
Tv ,sales의 산점도
// 각 독립변수와 판매량과의 관계 시각화: 각 독립 변수('TV', 'Radio', 'Newspaper')와 'Sales' 간의 산점도를 그리고,
// 회귀선을 추가하여 시각화합니다. (o)
// Tv와 Sales의 관계 산점도
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('/content/sample_data/Advertising.csv')
// print(dataset.head())
x = dataset.iloc[:, [0]].values
y = dataset.iloc[:, -1].values
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(x,y)
y_pred = reg.predict(x)
y_pred
// Tv ,sales의 산점도
plt.scatter(x,y, color='blue')
plt.plot(x, y_pred, color='green')
plt.title('Sales by Tv')
plt.xlabel('Tv')
plt.ylabel('Sales')
plt.show()
Radio, sales의 산점도
// Radio와 Sales의 관계 산점도
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('/content/sample_data/Advertising.csv')
// print(dataset.head())
x = dataset.iloc[:, [1]].values
y = dataset.iloc[:, -1].values
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(x,y)
y_pred = reg.predict(x)
// Radio ,sales의 산점도
plt.scatter(x,y, color='blue')
plt.plot(x, y_pred, color='green')
plt.title('Sales by Radio')
plt.xlabel('Radio')
plt.ylabel('Sales')
plt.show()
Newspaper와 ,sales의 산점도
// Newspaper와 Sales의 관계 산점도
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('/content/sample_data/Advertising.csv')
x = dataset.iloc[:, [2]].values
y = dataset.iloc[:, -1].values
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(x,y)
y_pred = reg.predict(x)
// Newspaper ,sales의 산점도
plt.scatter(x,y, color='blue')
plt.plot(x, y_pred, color='green')
plt.title('Sales by Newspaper')
plt.xlabel('Newspaper')
plt.ylabel('Sales')
plt.show()
모델 학습, 예측, 평가, 시각화
// - 독립 변수(X)는 'TV', 'Radio', 'Newspaper' 컬럼으로 설정합니다.
// - 종속 변수(y)는 'Sales' 컬럼으로 설정합니다.
// 3. 데이터 분할
// - 전체 데이터를 학습 데이터와 테스트 데이터로 8:2 비율로 분할합니다.
// (scikit-learn의 train_test_split 함수 사용)
// 4. 모델 학습
// 선형 회귀 모델을 학습 데이터로 학습시킵니다. (scikit-learn의 LinearRegression 모델 사용)
// 5. 예측
// - 테스트 데이터에 대한 판매량을 예측합니다.
// 6. 모델 평가
// - 테스트 데이터에 대한 R-squared (결정 계수) 값을 계산하여 모델 성능을 평가합니다.
// (scikit-learn의 r2_score 함수 사용)
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
import matplotlib.pyplot as plt
import seaborn as sns
// 한글 꺠짐 방지 글꼴 설정
plt.rc('font', family='Malgun Gothic')
// 데이터 로드
df = pd.read_csv('/content/sample_data/Advertising.csv')
// 독립변수(X)와 종속변수(y) 분리
X = df.drop('Sales', axis=1) # Sales 제외한 모든 특성
y = df['Sales']
// 학습데이터과 테스트데이터를 분할 , 20%데이터를 가져와서 테스트하기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
// 모델 생성 및 학습
model = LinearRegression() # 4번답
model.fit(X_train, y_train)
// 예측
y_pred = model.predict(X_test)
// 모델 평가
print("\n모델 성능:")
print("R²(결정 계수):", r2_score(y_test, y_pred))
print("예측값 :",y_pred)
print(f"절편: {model.intercept_:.4f}")
// 시각화: 실제값 vs 예측값
plt.figure(figsize=(8, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r-', lw=2)
plt.xlabel('실제 판매량')
plt.ylabel('예측 판매량')
plt.title('실제 판매량 vs 예측 판매량')
plt.tight_layout()
plt.show()출력 결과
모델 성능:
R²(결정 계수): 0.899438024100912
예측값 : [16.4080242 20.88988209 21.55384318 10.60850256 22.11237326 13.10559172
21.05719192 7.46101034 13.60634581 15.15506967 9.04831992 6.65328312
14.34554487 8.90349333 9.68959028 12.16494386 8.73628397 16.26507258
10.27759582 18.83109103 19.56036653 13.25103464 12.33620695 21.30695132
7.82740305 5.80957448 20.75753231 11.98138077 9.18349576 8.5066991
12.46646769 10.00337695 21.3876709 12.24966368 18.26661538 20.13766267
14.05514005 20.85411186 11.0174441 4.56899622]
절편: 2.9791
새로운 데이터 예측
// 7. 새로운 데이터 예측
// - TV=200, Radio=50, Newspaper=30 일 때 판매량을 예측합니다. (o)
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
import matplotlib.pyplot as plt
import seaborn as sns
// 데이터셋 불러오기
dataset = pd.read_csv('/content/sample_data/Advertising.csv')
// 독립 변수(X)와 종속 변수(y) 설정
X = dataset[['TV', 'Radio', 'Newspaper']].values
y = dataset['Sales'].values
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, y)
// 회귀 계수 및 절편 출력
print("회귀 계수(기울기):")
print(f"TV: {model.coef_[0]:.4f}")
print(f"Radio: {model.coef_[1]:.4f}")
print(f"Newspaper: {model.coef_[2]:.4f}")
print(f"절편: {model.intercept_:.4f}")
// 새로운 데이터로 예측
new_sales = np.array([[200, 50, 30]])
prediction = model.predict(new_sales)
print(f"\nTV=200, Radio=50, Newspaper=30일 때 예측 판매량: {prediction[0]:.1f}")
// 모델 성능 지수 (R-squared)
r_squared = model.score(X, y)
print(f"R2(결정계수): {r_squared:.6f}")출력 결과
회귀 계수(기울기):
TV: 0.0458
Radio: 0.1885
Newspaper: -0.0010
절편: 2.9389
TV=200, Radio=50, Newspaper=30일 때 예측 판매량: 21.5
R2(결정계수): 0.897211설명
회귀 계수 의미:
TV: 0.0458 - TV 광고 지출이 1단위 증가할 때 판매량은 약 0.0458단위 증가
Radio: 0.1885 - 라디오 광고 지출이 1단위 증가할 때 판매량은 약 0.1885단위 증가
Newspaper: -0.0010 - 신문 광고 지출이 1단위 증가할 때 판매량은 약 0.0010단위 감소(매우 미미한 부정적 영향)
상대적 영향력: 라디오 광고가 단위당 가장 큰 효과를 보이며, TV 광고가 그 다음입니다.
신문 광고는 판매량에 거의 영향을 미치지 않거나 미미한 부정적 영향을 줍니다.
예측 사례: TV=200, Radio=50, Newspaper=30일 때 예측 판매량은 21.5입니다.
이는 회귀식 (2.9389 + 0.0458×200 + 0.1885×50 - 0.0010×30 = 21.5)을 통해 계산됩니다.
모델 적합도: R²값이 0.897로, 이 모델이 판매량 변동의 약 89.7%를 설명할 수 있다는 의미입니다.
이는 상당히 높은 설명력을 가진 모델임을 나타냅니다.
결론적으로, 판매량 증대를 위해서는 라디오 광고에 더 많은 투자를 하는 것이 단위당 효율이 높으며,
TV 광고도 유의미한 효과가 있습니다. 반면 신문 광고는 투자 대비 효과가 거의 없어 보입니다.