# 导入工具包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 基本设置
plt.rcParams["font.sans-serif"] = ["SimHei"] #正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False #正常显示负号
import warnings
warnings.filterwarnings('ignore') #屏蔽警告信息
# 读取数据
df = pd.read_excel(r'.\基础数据.xlsx', sheet_name='脱敏数据')
df.head()
周 | 投放费用周日均 | 下载量周日均 | |
---|---|---|---|
0 | 2021-06-07 | 2453 | 2822 |
1 | 2021-06-14 | 3418 | 3022 |
2 | 2021-06-21 | 4165 | 3694 |
3 | 2021-06-28 | 3519 | 3157 |
4 | 2021-07-05 | 3931 | 3004 |
# 计算下载单价
df['下载单价'] = round(df['投放费用周日均']/df['下载量周日均'], 4)
df.head()
周 | 投放费用周日均 | 下载量周日均 | 下载单价 | |
---|---|---|---|---|
0 | 2021-06-07 | 2453 | 2822 | 0.8692 |
1 | 2021-06-14 | 3418 | 3022 | 1.1310 |
2 | 2021-06-21 | 4165 | 3694 | 1.1275 |
3 | 2021-06-28 | 3519 | 3157 | 1.1147 |
4 | 2021-07-05 | 3931 | 3004 | 1.3086 |
# 散点图
sns.scatterplot(x=df['投放费用周日均'], y=df['下载单价'])
<AxesSubplot:xlabel='投放费用周日均', ylabel='下载单价'>
# 相关系数
print('投放费用周日均和下载单价:', round(df['投放费用周日均'].corr(df['下载单价']), 6))
print('投放费用周日均对数和下载单价:', round(np.log(df['投放费用周日均']).corr(df['下载单价']), 6))
print('投放费用周日均对数和下载单价对数:', round(np.log(df['投放费用周日均']).corr(np.log(df['下载单价'])), 6))
投放费用周日均和下载单价: 0.777528 投放费用周日均对数和下载单价: 0.844981 投放费用周日均对数和下载单价对数: 0.831538
通过散点图和相关系数能够看出来,投放费用和下载单价是有较强的相关性的,尤其是做对数变换后。
# 导入工具包
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# 定义数据集
data = df[['周', '投放费用周日均', '下载单价']]
data['log投放费用周日均'] = round(np.log(data['投放费用周日均']), 6)
data.set_index(data['周'], inplace=True)
data.drop(axis=1, columns=['周'], inplace=True)
data.head()
投放费用周日均 | 下载单价 | log投放费用周日均 | |
---|---|---|---|
周 | |||
2021-06-07 | 2453 | 0.8692 | 7.805067 |
2021-06-14 | 3418 | 1.1310 | 8.136811 |
2021-06-21 | 4165 | 1.1275 | 8.334472 |
2021-06-28 | 3519 | 1.1147 | 8.165932 |
2021-07-05 | 3931 | 1.3086 | 8.276649 |
# 定义X, y
X = data['log投放费用周日均']
y = data['下载单价']
# 定义训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=1)
X_train = X_train.values.reshape(-1, 1)
y_train = y_train.values.reshape(-1, 1)
X_test = X_test.values.reshape(-1, 1)
y_test = y_test.values.reshape(-1, 1)
# 训练模型
model = LinearRegression(normalize=True)
model.fit(X_train , y_train)
LinearRegression(normalize=True)
# 模型评估
print('训练集决定系数R^2得分为:',round(model.score(X_train, y_train), 4))
print('测试集决定系数R^2得分为:',round(model.score(X_test, y_test), 4))
训练集决定系数R^2得分为: 0.7138 测试集决定系数R^2得分为: 0.6844
# 求出拟合方程
'''
最佳拟合线:y=a+bx
截距:a
回归系数:b
'''
# 截距
a = model.intercept_
# 回归系数
b = model.coef_
print('模型的回归方程是:y = %f + %fx' % (a, b))
模型的回归方程是:y = -5.353181 + 0.815448x
最终得到 投放费用x 与 下载单价y 之间的关系:y = -5.353181 + 0.815448 * log(x)