如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,
欢迎移步宝藏公众号「小火龙说数据」,无广告、无软文、纯干货,更多精彩原创文章与你分享!
01 引入常用包
# ====================
# 1、引入常用包
# ====================
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.cluster import KMeans
import warnings
warnings.filterwarnings('ignore')
plt.style.use('ggplot') # 设置图表风格
pd.set_option('display.max_columns', 50) # 显示最多50列
02 数据加载与初探
# ====================
# 2、数据加载与初探
# ====================
# 示例数据(可替换为实际数据)
url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv'
df = pd.read_csv(url)
print(f"数据维度: {df.shape}")
print("\n前5行数据:")
print(df.head())
print("\n数据摘要:")
print(df.info())
print("\n描述统计:")
print(df.describe(include='all'))
03 数据清洗与预处理
# ====================
# 3、数据清洗与预处理
# ====================
# 缺失值分析
def missing_analysis(df):
missing = df.isnull().sum().sort_values(ascending=False)
missing_percent = (missing / len(df)) * 100
return pd.concat([missing, missing_percent], axis=1, keys=['缺失数量', '缺失比例'])
print("\n缺失值分析:")
print(missing_analysis(df))
# 处理缺失值
df['age'].fillna(df['age'].median(), inplace=True) # 年龄用中位数填充
df['embarked'].fillna(df['embarked'].mode()[0], inplace=True) # 登船港口用众数填充
df.drop('deck', axis=1, inplace=True) # 删除缺失率过高的列
# 异常值处理
z_scores = np.abs(stats.zscore(df[['age', 'fare']]))
df = df[(z_scores < 3.allaxis='1)]' z-score>3的异常值
# 特征转换
df['age_group'] = pd.cut(df['age'],
bins=[0, 18, 30, 50, 100],
labels=['儿童', '青年', '中年', '老年'])
# 编码分类变量
le = LabelEncoder()
df['sex_code'] = le.fit_transform(df['sex']) # 性别编码
04 探索性分析(EDA)
# ====================
# 4、探索性分析(EDA)
# ====================
# 单变量分析
plt.figure(figsize=(12, 6))
sns.histplot(df['age'], kde=True, bins=20)
plt.title('年龄分布')
plt.show()
# 双变量分析
plt.figure(figsize=(10, 6))
sns.boxplot(x='pclass', y='fare', hue='survived', data=df)
plt.title('不同舱位票价与生存率关系')
plt.show()
# 相关性分析
corr_matrix = df[['survived', 'age', 'fare', 'pclass', 'sex_code']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('特征相关性矩阵')
plt.show()
05 常用分析方法
# ====================
# 5、常用分析方法
# ====================
# RFM分析示例(适用于电商)
def rfm_analysis(df):
# 假设df包含用户交易数据
rfm = df.groupby('user_id').agg({
'order_date': lambda x: (df['order_date'].max() - x.max()).days, # Recency
'order_id': 'count', # Frequency
'amount': 'sum' # Monetary
}).rename(columns={'order_date': 'Recency',
'order_id': 'Frequency',
'amount': 'Monetary'})
# 分箱评分
rfm['R_Score'] = pd.qcut(rfm['Recency'], 5, labels=range(5,0,-1))
rfm['F_Score'] = pd.qcut(rfm['Frequency'], 5, labels=range(1,6))
rfm['M_Score'] = pd.qcut(rfm['Monetary'], 5, labels=range(1,6))
rfm['RFM'] = rfm['R_Score'].astype(str) + rfm['F_Score'].astype(str) + rfm['M_Score'].astype(str)
return rfm
# 时间序列分析
df['date'] = pd.to_datetime(df['date']) # 假设有日期列
ts_data = df.set_index('date').resample('W')['sales'].sum() # 按周聚合
plt.figure(figsize=(12,6))
ts_data.plot()
plt.title('周销售额趋势分析')
plt.ylabel('销售额')
plt.show()
06 特征工程
# ====================
# 6、特征工程
# ====================
# 创建新特征
df['family_size'] = df['sibsp'] + df['parch'] + 1
df['is_alone'] = (df['family_size'] == 1).astype(int)
# 标准化处理
scaler = StandardScaler()
df[['age_scaled', 'fare_scaled']] = scaler.fit_transform(df[['age', 'fare']])
# 分类型特征编码
df = pd.get_dummies(df, columns=['embarked', 'age_group'], drop_first=True)
07 模型搭建及评估
# ====================
# 7、模型搭建及评估
# ====================
# 分类模型(预测生存率)
X = df[['pclass', 'sex_code', 'age_scaled', 'fare_scaled', 'family_size']]
y = df['survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 逻辑回归
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
# 模型评估
y_pred = model.predict(X_test)
print("\n分类报告:")
print(classification_report(y_test, y_pred))
# 特征重要性可视化
importance = pd.DataFrame({'feature': X.columns, 'coef': model.coef_[0]})
importance = importance.sort_values('coef', ascending=False)
plt.figure(figsize=(10,6))
sns.barplot(x='coef', y='feature', data=importance)
plt.title('逻辑回归特征系数')
plt.show()
最后,推荐一本数据分析进阶书籍《数据分析实践:专业知识和职场技巧》
侧重案例讲解,对于初、中级数据分析师的帮助极大!!!