Python数据分析实战:从入门到项目全流程代码_第1页
Python数据分析实战:从入门到项目全流程代码_第2页
Python数据分析实战:从入门到项目全流程代码_第3页
Python数据分析实战:从入门到项目全流程代码_第4页
Python数据分析实战:从入门到项目全流程代码_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-Python数据分析实战:从入门到项目全流程代码数据分析的核心不在于掌握多少库的函数,而在于构建从数据清洗、探索、建模到可视化的完整闭环思维。在真实的企业场景中,80%的时间往往消耗在数据获取与清洗上,只有20%的时间用于模型构建。本文将摒弃理论堆砌,直接通过一个完整的“电商用户流失预测”项目,还原从数据获取到最终决策支持的全流程代码实战,涵盖Pandas数据处理、Scikit-learn建模以及Matplotlib/Seaborn可视化的高级应用。任何分析项目的起点都是数据的获取。在真实业务中,数据通常存储在CSV、SQL数据库或API接口中。本案例假设我们有一份包含用户行为日志的CSV文件`user_behavior.csv`。importpandasaspd

importnumpyasnp

importmatplotlib.pyplotasplt

importseabornassns

fromsklearn.model_selectionimporttrain_test_split,GridSearchCV

fromsklearn.ensembleimportRandomForestClassifier

fromsklearn.metricsimportclassification_report,confusion_matrix,roc_auc_score

fromimblearn.over_samplingimportSMOTE

importwarnings

warnings.filterwarnings('ignore')

#设置绘图风格,确保中文显示正常(需系统支持中文字体)

plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus']=False

#1.数据加载与初步探查

df=pd.read_csv('user_behavior.csv',encoding='utf-8')

#快速查看数据概况:前5行、数据类型、非空值数量

print(f"数据形状:{df.shape}")

print(())

print(df.describe())

#2.检查缺失值与重复值

missing_rate=(df.isnull().sum()/len(df)*100).sort_values(ascending=False)

print(f"缺失值占比前5列:\n{missing_rate.head()}")

print(f"重复样本数量:{df.duplicated().sum()}")关键点解析:在加载数据后,必须立即执行`describe()`和`info()`。`describe()`能暴露数值型数据的异常极值(如年龄为负数),`info()`则能识别非数值型字段是否被错误识别为对象类型。缺失值的处理策略不能一概而论,若缺失率超过50%且该特征对模型贡献度低,直接删除;若缺失率较低,可采用中位数填充(数值型)或众数填充(类别型)。二、数据清洗与特征工程:挖掘价值核心清洗后的数据往往仍无法直接用于建模,特征工程才是决定模型上限的关键。在本项目中,我们需要处理时间戳、构建用户活跃度指标、处理类别不平衡问题。#3.时间特征提取与处理

df['register_time']=pd.to_datetime(df['register_time'],errors='coerce')

df['login_time']=pd.to_datetime(df['login_time'],errors='coerce')

#计算用户注册时长(天)

df['days_since_register']=(pd.Timestamp('2023-12-31')-df['register_time']).dt.days

#提取时间维度特征:注册月份、星期几

df['reg_month']=df['register_time'].dt.month

df['reg_weekday']=df['register_time'].dt.dayofweek

#4.构造衍生特征(FeatureEngineering)

#计算用户平均登录间隔

df['avg_login_gap']=df['days_since_register']/(df['login_count']+1)

#计算最近一次登录距现在的天数

df['days_since_last_login']=(pd.Timestamp('2023-12-31')-df['last_login_time']).dt.days

#5.处理类别变量:独热编码与标签编码

#对于高基数类别(如城市),使用目标编码或分桶;低基数使用独热编码

df=pd.get_dummies(df,columns=['device_type','city_level'],prefix=['dev','city'])

#6.处理目标变量与数据不平衡

#假设target列:1表示流失,0表示留存

#检查正负样本比例

print(f"流失率:{df['target'].mean():.2%}")

#如果流失率低于10%,数据严重不平衡,需使用SMOTE过采样

ifdf['target'].mean()<0.1:

print("检测到数据不平衡,正在应用SMOTE过采样...")

#分离特征与标签

X=df.drop(['target','user_id','register_time','last_login_time'],axis=1)

y=df['target']

#应用SMOTE

smote=SMOTE(random_state=42)

X_resampled,y_resampled=smote.fit_resample(X,y)

print(f"采样后流失率:{y_resampled.mean():.2%}")

else:

X_resampled,y_resampled=df.drop(['target','user_id','register_time','last_login_time'],axis=1),df['target']逻辑深度:在特征工程中,`avg_login_gap`和`days_since_last_login`是预测流失最有力的特征。如果用户注册很久但很久未登录,流失概率极高。SMOTE(SyntheticMinorityOver-samplingTechnique)算法通过合成少数类样本,而非简单重复,有效缓解了模型对多数类的偏倚。在电商场景中,流失用户通常只占5%-15%,直接使用原始数据训练会导致模型倾向于将所有用户预测为“留存”,从而失去业务指导意义。三、探索性数据分析(EDA):可视化驱动洞察在建模前,必须通过图表理解数据分布和相关性。这不仅能验证假设,还能发现数据异常。#7.可视化分析

plt.figure(figsize=(14,6))

#图1:目标变量分布

plt.subplot(1,2,1)

sns.countplot(x='target',data=df,palette='viridis')

plt.title('用户流失与留存分布')

plt.xlabel('目标变量(0:留存,1:流失)')

plt.ylabel('用户数量')

#图2:流失率与注册时长的关系(分箱处理)

plt.subplot(1,2,2)

df['days_bucket']=pd.cut(df['days_since_register'],bins=10)

loss_rate_by_reg=df.groupby('days_bucket')['target'].mean()

sns.barplot(x=loss_rate_by_reg.index.astype(str),y=loss_rate_by_reg.values,palette='Reds')

plt.title('不同注册时长下的流失率趋势')

plt.xlabel('注册时长(天)')

plt.ylabel('流失率')

plt.tight_layout()

plt.show()

#8.特征相关性热力图(仅针对数值型特征)

numeric_cols=df.select_dtypes(include=[np.number]).columns

corr_matrix=df[numeric_cols].corr()

plt.figure(figsize=(10,8))

sns.heatmap(corr_matrix,annot=False,cmap='coolwarm',center=0,fmt='.2f')

plt.title('特征相关性热力图')

plt.show()图表解读:*流失率趋势图:通常呈现“U”型或指数型。新注册用户(注册时长<7天)流失率可能较高(适应期),而注册半年以上的老用户若突然停止登录,流失风险也会激增。*相关性热力图:重点关注`days_since_last_login`与`target`的相关系数。如果相关系数绝对值低于0.1,说明该特征预测力弱;若高于0.3,则为强特征。同时需警惕多重共线性(如`login_count`与`total_spent`高度正相关),这可能导致模型过拟合,必要时需通过方差膨胀因子(VIF)检测并剔除冗余特征。四、模型构建与超参数调优:从基准到最优选择模型需权衡业务需求。对于二分类问题,随机森林(RandomForest)因其抗过拟合能力强、对缺失值不敏感且无需标准化,通常是首选基线模型。#9.数据集划分

X_train,X_test,y_train,y_test=train_test_split(

X_resampled,y_resampled,test_size=0.2,random_state=42,stratify=y_resampled

)

#10.构建随机森林基线模型

rf_model=RandomForestClassifier(random_state=42,n_jobs=-1)

rf_model.fit(X_train,y_train)

#11.基础评估

y_pred=rf_model.predict(X_test)

y_proba=rf_model.predict_proba(X_test)[:,1]

print("===基线模型评估===")

print(f"准确率(Accuracy):{rf_model.score(X_test,y_test):.4f}")

print(f"召回率(Recall):{classification_report(y_test,y_pred)['1']['recall']:.4f}")

print(f"AUC分数:{roc_auc_score(y_test,y_proba):.4f}")

#12.超参数网格搜索(GridSearchCV)

#针对随机森林的关键参数:树的数量、最大深度、叶子节点最小样本数

param_grid={

'n_estimators':[100,200,300],

'max_depth':[10,20,None],

'min_samples_split':[2,5,10],

'min_samples_leaf':[1,2,4]

}

grid_search=GridSearchCV(

estimator=RandomForestClassifier(random_state=42,n_jobs=-1),

param_grid=param_grid,

cv=5,

scoring='roc_auc',

n_jobs=-1,

verbose=1

)

grid_search.fit(X_train,y_train)

print("\n===最佳参数===")

print(grid_search.best_params_)

print(f"最佳交叉验证AUC:{grid_search.best_score_:.4f}")

#13.使用最佳模型进行最终测试

best_model=grid_search.best_estimator_

final_pred=best_model.predict(X_test)

final_proba=best_model.predict_proba(X_test)[:,1]

print("\n===优化后模型评估===")

print(classification_report(y_test,final_pred))策略分析:在电商场景中,我们通常更关注“召回率”(Recall),即尽可能多地找出那些真正会流失的用户,哪怕误伤一些留存用户(查准率降低)也是可接受的,因为召回用户进行挽留的边际成本通常低于用户永久流失的损失。`GridSearchCV`通过5折交叉验证,确保模型在不同数据子集上的稳定性,避免在特定训练集上过拟合。五、模型解释与业务落地:让代码产生价值模型训练完成只是第一步,业务方更关心“为什么”用户会流失。利用特征重要性(FeatureImportance)和SHAP值,可以将黑盒模型转化为可解释的业务策略。#14.特征重要性排序

importances=best_model.feature_importances_

feat_imp=pd.Series(importances,index=X_resampled.columns).sort_values(ascending=False)

plt.figure(figsize=(10,6))

feat_imp.head(10).plot(kind='barh',color='steelblue')

plt.title('Top10重要特征')

plt.xlabel('重要性得分')

plt.tight_layout()

plt.show()

#15.业务建议输出

print("\n===业务洞察与建议===")

print(f"1.核心流失驱动因素:{feat_imp.index[0]}(得分:{feat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论