欢迎来到【一起学Python】第97天!
掌握描述性统计、相关性分析、数据透视表和时间序列这四大核心技能,你就能从海量数据中快速提炼业务洞察,让数据真正"开口说话"!
描述性统计:快速读懂数据"性格"
描述性统计是数据分析的"第一道关卡",用几个关键指标快速把握数据分布特征。
基础统计量计算
import pandas as pdimport numpy as np# 创建示例数据df = pd.DataFrame({ 'Sales': [1200, 1500, 1800, 2100, 2400, np.nan], 'Profit': [300, 450, 520, 680, 750, 820], 'Region': ['East', 'West', 'East', 'West', 'East', 'West']})# 均值:反映"平均水平"print("🔹 销售额均值:", df['Sales'].mean()) # 1800.0(自动忽略NaN)# 中位数:反映"中间水平",抗异常值print("🔹 利润中位数:", df['Profit'].median()) # 600.0# 方差/标准差:反映"波动程度"print("🔹 销售额标准差:", df['Sales'].std()) # 469.04# 分位数:定位数据分布位置print("🔹 利润25%/50%/75%分位数:\n", df['Profit'].quantile([0.25, 0.5, 0.75]))
一键生成统计报告
# describe() 一次性输出核心统计量print("\n🔹 数值列描述性统计:\n", df.describe())# 自定义统计量(更灵活!)custom_stats = df['Profit'].agg([ 'count', 'mean', 'median', 'std', 'min', lambda x: x.quantile(0.9), 'max' # 支持自定义函数!])print("\n🔹 自定义统计报告:\n", custom_stats)
业务应用:用 describe() 快速筛查异常值(如最大值远超99%分位数),为后续清洗提供依据。
相关性分析:发现变量间的"隐藏关系"
相关性分析帮你判断:销售额涨了,利润一定涨吗?广告投放和转化率有关联吗?
计算相关系数
# Pearson相关系数(线性关系,-1~1)corr_sales_profit = df['Sales'].corr(df['Profit'])print("🔹 销售额与利润的相关系数:", corr_sales_profit) # 0.98 → 强正相关# 多变量相关性矩阵corr_matrix = df[['Sales', 'Profit']].corr()print("\n🔹 相关性矩阵:\n", corr_matrix)
可视化相关性(热力图)
import matplotlib.pyplot as pltimport seaborn as sns# 设置中文字体(避免乱码)plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 绘制热力图plt.figure(figsize=(6, 4))sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)plt.title('变量相关性热力图')plt.tight_layout()plt.show()
效果:颜色越红表示正相关越强,越蓝表示负相关越强,数字直接显示相关系数。corr() 默认计算 Pearson 相关系数,仅衡量线性关系- 相关≠因果!高相关可能是巧合或受第三变量影响
- 非线性关系需用
df['A'].corr(df['B'], method='spearman')
数据透视表
数据透视表(Pivot Table)让你像操作Excel一样,轻松实现"拖拽式"多维汇总。基础透视:单维度汇总
# 创建业务数据df_pivot = pd.DataFrame({ 'Date': pd.date_range('2024-01-01', periods=6), 'Region': ['East', 'East', 'West', 'West', 'East', 'West'], 'Product': ['A', 'B', 'A', 'B', 'A', 'B'], 'Sales': [100, 150, 200, 250, 120, 180]})# 按区域汇总销售额pivot_region = df_pivot.pivot_table( values='Sales', index='Region', aggfunc='sum' # 汇总函数:sum/mean/count等)print("🔹 各区域总销售额:\n", pivot_region)
高级透视:多维度+多重聚合
# 按"区域×产品"交叉汇总,同时计算总和与均值pivot_multi = df_pivot.pivot_table( values='Sales', index='Region', columns='Product', # 列维度 aggfunc=['sum', 'mean'], # 多重聚合 fill_value=0, # 缺失值填充 margins=True, # 添加总计行/列 margins_name='总计')print("\n🔹 区域×产品多维透视表:\n", pivot_multi)
透视表 + 分组聚合(更灵活!)
# 用 groupby + agg 实现自定义透视逻辑custom_pivot = df_pivot.groupby(['Region', 'Product']).agg({ 'Sales': ['sum', 'mean', 'count'], 'Date': 'min' # 最早销售日期}).round(2) # 保留2位小数print("\n🔹 自定义聚合透视:\n", custom_pivot)
核心优势:pivot_table 适合快速探索,groupby+agg 适合复杂业务逻辑,两者结合威力翻倍!时间序列分析:捕捉趋势与周期
时间序列数据(如日活、股价、销量)蕴含趋势、季节性和周期性,是业务预测的基础。创建与索引时间序列
# 生成日期索引dates = pd.date_range(start='2024-01-01', periods=30, freq='D')# 创建时间序列DataFramedf_time = pd.DataFrame({ 'Date': dates, 'Daily_Sales': np.random.randint(100, 300, size=30)}).set_index('Date') # 关键:设日期为索引!print("🔹 时间序列前5行:\n", df_time.head())
重采样:粒度转换(日→周/月)
# 日数据 → 周汇总(求和)weekly_sales = df_time.resample('W').sum()print("\n🔹 周度销售额:\n", weekly_sales.head())# 日数据 → 月均值monthly_avg = df_time.resample('M').mean()print("\n🔹 月均销售额:\n", monthly_avg.head())
常用频率别名:'D'=天, 'W'=周, 'M'=月末, 'Q'=季度, 'Y'=年趋势可视化 + 移动平均
# 绘制原始数据 + 7日移动平均线df_time['MA7'] = df_time['Daily_Sales'].rolling(window=7).mean()plt.figure(figsize=(12, 5))plt.plot(df_time.index, df_time['Daily_Sales'], label='日销售额', alpha=0.6)plt.plot(df_time.index, df_time['MA7'], label='7日移动平均', linewidth=2, color='red')plt.title('销售额趋势分析')plt.xlabel('日期')plt.ylabel('销售额')plt.legend()plt.grid(True, alpha=0.3)plt.tight_layout()plt.show()
业务价值:移动平均可平滑短期波动,更清晰识别长期趋势,是预测模型的前置步骤。
核心避坑指南(实战必看)
综合实战:销售数据分析流水线
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 1. 构造业务数据np.random.seed(42)dates = pd.date_range('2024-01-01', periods=90, freq='D')df = pd.DataFrame({ 'Date': dates, 'Region': np.random.choice(['East', 'West', 'North'], 90), 'Product': np.random.choice(['A', 'B', 'C'], 90), 'Sales': np.random.randint(100, 500, 90) + np.sin(np.arange(90)/10)*50, # 加趋势 'Profit': np.random.randint(30, 150, 90)})df.loc[np.random.choice(df.index, 5), 'Sales'] = np.nan # 模拟缺失# 2. 描述性统计print("🔹 核心指标概览:")print(df[['Sales', 'Profit']].describe().round(2))# 3. 相关性分析corr = df[['Sales', 'Profit']].corr().round(3)print("\n🔹 销售-利润相关性:", corr.iloc[0,1])# 4. 数据透视:区域×产品销售额pivot = df.pivot_table( values='Sales', index='Region', columns='Product', aggfunc='sum', fill_value=0, margins=True, margins_name='合计').round(0)print("\n🔹 区域×产品透视表:\n", pivot)# 5. 时间序列分析df_ts = df.set_index('Date').sort_index()df_ts['Sales_MA7'] = df_ts['Sales'].rolling(7, min_periods=1).mean()# 6. 可视化fig, axes = plt.subplots(2, 1, figsize=(12, 8))# 热力图sns.heatmap(corr, annot=True, cmap='RdYlGn', ax=axes[0])axes[0].set_title('变量相关性热力图')# 趋势图axes[1].plot(df_ts.index, df_ts['Sales'], label='日销售额', alpha=0.5)axes[1].plot(df_ts.index, df_ts['Sales_MA7'], label='7日移动平均', color='red', linewidth=2)axes[1].set_title('销售额趋势分析')axes[1].legend()axes[1].grid(True, alpha=0.3)plt.tight_layout()plt.show()print("\n✅ 分析完成!关键结论:")print(f" • 销售与利润强相关 (r={corr.iloc[0,1]:.3f})")print(f" • West区域Product B销售额最高 ({pivot.loc['West', 'B']:.0f})")print(f" • 近期销售额呈上升趋势(移动平均线向上)")
今日知识点
核心心法:
- 分析前先
df.info() + df.describe(),快速建立数据认知 - 相关性分析务必结合业务逻辑解读,避免"伪相关"陷阱
- 时间序列分析三要素:趋势(长期方向)、季节性(固定周期波动)、残差(随机噪声)
一起学Python每天进步一点点,365天后遇见更优秀的自己!🎯 今日金句:"统计是数据的语言,透视是洞察的窗口;读懂数字背后的故事,才是分析的真正价值。"