借线性回归模型、逻辑回归模型、聚类分析模型做数据分析的入门,机器学习包括两类学习,线性回归与逻辑回归为监督式学习,聚类分析为非监督学习;其中用到的几个库:pandas为数据分析工具集用以数据清洗、Matplotlib\Seaborn为可视化库、sklearn为机器学习第三方模块,封装了多种机器学习方法方便取用
前提:新建DataFrame命名为store
store.info() — 读取数据
index_col=0 — 第一列就是index值,不用新增一列unnamed;
(index_col=none/false — 重新设置一列为成为index值)
用法:store=pd.read_csv(‘w2_store_rev.csv’,index_col=0)store.isnull().sum() — .isnull()判断数据集store每一列是否是空,是的话标1,不是的话标0;.sum()最后加总
store.describe() — 了解数据分布、大小情况;
前提:导入数据分析处理的核心库
import pandas as pd;
store.event.unique() / store[‘event’].unique()— 数据来源.变量名.unique()以数组形式返回该列所有唯一值;
store.groupby([‘event’])[‘revenue’].describe() — 将收入按事件分类统计;
store=pd.get_dummies(store) — 对store中所有类别变量进行量化,值存在为1,否则0;
store=pd.get_dummies(store[‘event’]) — 只对event变量进行量化;
store.corr() — 查看所有变量之间的相关性;
store.corr()[[‘revenue’]].sort_value(‘revenue’,ascending=False) — 查看所有变量与‘revenue’变量的相关性(注意revenue的为双中括号,否则变成series),sort_values()根据某一字段做升降序排列,不加ascending则默认升序,ascending=False为降序;
前提:导入可视化库
import seaborn as sns;
import matplotlib.pyplot as plt
%matplotlib inline;
sns.regplot(‘local_tv’,‘revenue’,store) — sns.regplot(字段1:自变量,字段2:因变量,数据),对自变量进行线性关系可视化分析,生成散点图以及一条线性回归的拟合参考线;
案例:宝洁销售额预测
代码如下(示例):
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
store = pd.read_csv('w2_store_rev.csv',index_col=0)
代码如下(示例):
store = pd.get_dummies(store['event']) #类别变量转为数值型变量(哑变量)
store.drop(['local_tv_no','person_no'],axis=1,inplace=True) #删除不需要的哑变量,axis=1表示跨列,axis=0表示跨行,inplace=true表示对原始对象进行修改,不创建新对象,inplace=false表示创建新对象承载结果;
store.isnull().sum() #统计数据空值
store = store.fillna(0) / store = store.fillna(store.local_tv.mean()) #缺失值用0或均值填补;缺失数量在5%左右可直接填充
store.columns = store.columns.str.lower() #统一字段的大小写方便书写不出错误,columns表示列变量名,str.lower()表示大写转小写,str.upper()表示小写转大写
store = store.rename(columns={'churn_yes':'flag'}) #变量重命名
代码如下(示例):
from sklearn.linear_model import LinearRegression #从skleaen库的linear_model线性模型库中导入LinearRegression
model=LinearRegression() #设置模型为线性回归
y = store['revenue']
x = store[['local_tv','person','instore']] #设置自变量和因变量
model.fit(x,y) #训练模型
score = model.score(x,y) #x和y打分
predictions = model.predict(x) #计算y预测值
error = predictions-y #计算误差
rmse = (error**2).mean()**.5 #计算rmse(均方根误差)
mae = abs(error).mean() #计算mae(平均绝对误差)
print(rmse) #值越小误差越小
print(mae)
案例:消费者行为预测:客户流失预测
代码如下(示例):
churn.flag.value_counts()/churn.flag.value_counts(1) #统计流失中的0和1数量/比例,一般样本0和1分布比例不能有太大偏差,1不能低于5%
代码如下(示例):
#新建DataFrame为summary,将其他变量值以flag为依据进行分类统计,取均值,得知导致高流失率的变量
summary=churn.groupby('flag')
summary.mean()
#可视化展示不同变量与流失率的关系
sns.countplot(y='contact_month',hue='flag',data=churn) #y为需要查看的变量,hue=flag将数据按照0/1分组,data=churn为数据来源
#相关性分析
churn.corr()[['flag']].sort_values('flag',ascending=False)
代码如下(示例):
#设定x和y变量
y = churn['flag']
x = churn[['contact_month','internet_other','streamingtv']]
#加载数据切分工具包
from sklearn.model_selection import train_test_split
#切分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=100)
#建模并拟合模型
from sklearn.linear_model import LogisticRegression
Ir=LogisticRegression()
Ir.fit(x_train,y_train)
#模型系数解读:查看模型截距和系数
Ir.intercept_
Ir.coef_
#基于模型的结果,对训练集与测试集中X的真实值预测对应的Y
y_pred_train=Ir.predict(x_train)
y_pred_test=Ir.predict(x_test)
#模型评估
#搭建训练集混淆矩阵
import sklearn.metrics as metrics
metrics.confusion_matrix(y_train,y_pred_train)
#计算训练集准确率
metrics.accuracy_score(y_train,y_pred_train)
#搭建测试集混淆矩阵
metrics.confusion_matrix(y_test,y_pred_test)
#计算测试集准确率
metrics.accuracy_score(y_test,y_pred_test)
#模型优化
改变test_size/选取其他相关性更强X变量
不同于线性回归模型系数直接反映X对Y的增加和减少,逻辑回归模型的系数表达的是一种概率的概念;
例,p表示目标为1的概率,1-p表示目标为0的概率,当系数为2时:
log(p/1-p)=2
即p/1-p=exp(2)=7.39
对应该变量下事件发生是不发生的7.39倍;
代码如下(示例):
#年龄变量异常值处理:把年龄限制在18-80
airbnb=airbnb[airbnb['age']<=80]
airbnb=airbnb[airbnb['age']>=18]
#变量'date_account_created',to_datetime转变为日期格式
airbnb['date_account_created']=pd.to_datetime(airbnb['date_account_created'])
airbnb['year_since_account_created']=airbnb['date_account_created'].apply(lambda x:2019-x.year) #生成衍生变量,".year"将年份提取出来,apply(lambda)-应用lambda所阐述的规则
#删除前面生成的日期变量,可以根据数据格式进行drop
airbnb.drop(airbnb.select_dtypes(['datetime64']),inplace=True,axis=1)
#类别变量转为哑变量
airbnb=pd.get_dummies(airbnb)
lambda为匿名函数,即没有具体名称的函数,它允许快速定义单行函数,可以用在任何需要函数的地方;
lambda原型为:lambda 参数:操作(参数)
lambda表达式“ : ”后面,只能有一个表达式
代码如下(示例):
#选择用于聚类分析的变量并标准化
airbnb_5=airbnb[['age','web','moweb','ios','android']]
#使用sklearn中的preprocessing将数据标准化并存入x变量:调用preprocessing库,scale()实现标准化并存入x变量中
from sklearn.preprocessing import scale
x=pd.DataFrame(scale(airbnb_5))
#使用sklearn模块的cluster建立模型,尝试分为3类并拟合模型
from sklearn import cluster
model=cluster.KMeans(n_clusters=3,random_stata=10)
model.fit(x)
#从模型中提取簇标签存入labels这个数组中查看前20行分类情况
airbnb_5['cluster']=model.labels_
airbnb_5.head(20)
#查看分群效果是否明显
airbnb_5.groupby(['cluster'])['age'].describe()
airbnb_5.groupby(['cluster'])['ios'].describe()
#模型评估:计算轮廓系数,评分越高,个体与群距离越近
from sklearn import metrics
x_cluster=model.fit_predict(x) #计算个体与群的距离
score=metrics.silhouette_score(x,x_cluster)
print(score)
#模型优化
哪个变量的分群效果弱即将其调整为其他变量进行模型拟合/调整分群数
#业务解读:导出结果到文件进行
centers=pd.DataFrame(model.cluster_center_)
centers.to_csv('center_3.csv')
人群在某个特征变量上数据的绝对值越大,说明这个人群在这个特征上有较明显的区分度。