优秀的编程知识分享平台

网站首页 > 技术文章 正文

超实用Python数据分析案例,轻松搞定复杂数据!

nanyue 2025-03-06 17:56:41 技术文章 4 ℃

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,

欢迎移步宝藏公众号「小火龙说数据」,无广告、无软文、纯干货,更多精彩原创文章与你分享!


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()

最后,推荐一本数据分析进阶书籍《数据分析实践:专业知识和职场技巧》

侧重案例讲解,对于初、中级数据分析师的帮助极大!!!



最近发表
标签列表