In [1]:
# 导入工具包
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')  #屏蔽警告信息
In [2]:
# 读取数据
df = pd.read_excel(r'.\基础数据.xlsx', sheet_name='脱敏数据')
df.head()
Out[2]:
周 投放费用周日均 下载量周日均
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
In [3]:
# 计算下载单价
df['下载单价'] = round(df['投放费用周日均']/df['下载量周日均'], 4)
df.head()
Out[3]:
周 投放费用周日均 下载量周日均 下载单价
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

探索性分析:¶

In [4]:
# 散点图
sns.scatterplot(x=df['投放费用周日均'], y=df['下载单价'])
Out[4]:
<AxesSubplot:xlabel='投放费用周日均', ylabel='下载单价'>
In [5]:
# 相关系数
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

通过散点图和相关系数能够看出来,投放费用和下载单价是有较强的相关性的,尤其是做对数变换后。

建模:¶

In [6]:
# 导入工具包
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
In [7]:
# 定义数据集
data = df[['周', '投放费用周日均', '下载单价']]
data['log投放费用周日均'] = round(np.log(data['投放费用周日均']), 6)
data.set_index(data['周'], inplace=True)
data.drop(axis=1, columns=['周'], inplace=True)
data.head()
Out[7]:
投放费用周日均 下载单价 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
In [8]:
# 定义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)
In [9]:
# 训练模型
model = LinearRegression(normalize=True)
model.fit(X_train , y_train)
Out[9]:
LinearRegression(normalize=True)
In [10]:
# 模型评估
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
In [11]:
# 求出拟合方程
'''
最佳拟合线: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)