数据分析技术
Python商业数据分析入门课程 - 从零开始掌握数据分析核心技能
1数据分析概述
🎯 什么是商业数据分析?
商业数据分析是指运用统计学、数据挖掘等方法,对企业经营数据进行分析,从中发现规律、预测趋势,为商业决策提供数据支持的过程。
核心流程:
- 明确问题 - 确定分析目标和业务问题
- 数据采集 - 收集相关数据(数据库、Excel、API等)
- 数据清洗 - 处理缺失值、异常值、重复数据
- 数据分析 - 运用统计方法和工具进行分析
- 数据可视化 - 将分析结果以图表形式呈现
- 结论输出 - 形成分析报告,提供决策建议
🛠️ Python数据分析工具库
Python是数据分析领域最流行的编程语言,拥有丰富的第三方库:
- NumPy - 数值计算基础库,提供高效的多维数组操作
- Pandas - 数据处理与分析的核心库,提供DataFrame数据结构
- Matplotlib - 基础数据可视化库
- Seaborn - 基于Matplotlib的高级可视化库
# 导入常用数据分析库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
2Pandas数据处理基础
📊 DataFrame - 数据分析的核心
DataFrame是Pandas中最重要的数据结构,类似于Excel表格,由行和列组成。
# 创建DataFrame import pandas as pd # 从字典创建 data = { '姓名': ['张三', '李四', '王五'], '年龄': [25, 30, 28], '销售额': [15000, 22000, 18000] } df = pd.DataFrame(data) print(df)
🔍 常用数据查看方法
df.head() # 查看前5行 df.tail() # 查看后5行 df.shape # 查看数据形状 (行数, 列数) df.info() # 查看数据信息 df.describe() # 统计描述 df.columns # 查看列名
✂️ 数据筛选与过滤
# 筛选单列 df['姓名'] # 筛选多列 df[['姓名', '销售额']] # 条件筛选 df[df['销售额'] > 16000] # 销售额大于16000的记录 # 多条件筛选 df[(df['销售额'] > 16000) & (df['年龄'] < 30)]
3数据清洗与预处理
🧹 处理缺失值
真实数据往往存在缺失值,需要进行处理:
# 查看缺失值 df.isnull().sum() # 删除含有缺失值的行 df.dropna() # 用均值填充缺失值 df['销售额'].fillna(df['销售额'].mean()) # 用特定值填充 df['类别'].fillna('未知')
🔄 数据类型转换
# 转换数据类型 df['年龄'] = df['年龄'].astype('int') df['日期'] = pd.to_datetime(df['日期']) # 删除重复值 df.drop_duplicates() # 重命名列 df.rename(columns={'旧名': '新名'})
4数据统计分析
📐 基础统计量
df['销售额'].mean() # 平均值 df['销售额'].median() # 中位数 df['销售额'].sum() # 总和 df['销售额'].max() # 最大值 df['销售额'].min() # 最小值 df['销售额'].std() # 标准差
📊 分组统计 - groupby
按照某一列进行分组,然后对每组进行统计:
# 按类别分组,计算每组销售额的平均值 df.groupby('类别')['销售额'].mean() # 多列分组 df.groupby(['类别', '地区'])['销售额'].agg(['mean', 'sum', 'count'])
5数据可视化入门
📈 常用图表类型
import matplotlib.pyplot as plt # 柱状图 df['销售额'].plot(kind='bar') plt.show() # 折线图 df['销售额'].plot(kind='line') plt.show() # 饼图 df['类别'].value_counts().plot(kind='pie') plt.show()
6编程练习题
请根据题目要求编写Python代码,完成后点击查看参考答案。
创建一个包含以下销售数据的DataFrame:张三销售额15000元,李四销售额22000元,王五销售额18000元,赵六销售额25000元。然后筛选出销售额大于18000元的员工。
✅ 参考答案
import pandas as pd # 创建DataFrame data = { '姓名': ['张三', '李四', '王五', '赵六'], '销售额': [15000, 22000, 18000, 25000] } df = pd.DataFrame(data) # 筛选销售额大于18000的员工 result = df[df['销售额'] > 18000] print(result)
解析:首先用字典创建数据,然后用pd.DataFrame()转换为DataFrame。筛选时使用布尔索引 df['销售额'] > 18000,返回True的行会被保留。
给定销售数据 [12000, 15000, 18000, 22000, 25000, 28000, 30000],计算平均销售额、最高销售额、最低销售额,并找出超过平均值的销售记录。
✅ 参考答案
import numpy as np sales = np.array([12000, 15000, 18000, 22000, 25000, 28000, 30000]) # 计算统计指标 mean_sales = sales.mean() max_sales = sales.max() min_sales = sales.min() print(f"平均销售额: {mean_sales}") print(f"最高销售额: {max_sales}") print(f"最低销售额: {min_sales}") # 找出超过平均值的记录 above_average = sales[sales > mean_sales] print(f"超过平均值的销售: {above_average}")
解析:将列表转换为NumPy数组后,可以直接调用.mean()、.max()、.min()方法。布尔索引 sales > mean_sales 会返回一个布尔数组,再用它筛选原数组。
给定一个包含缺失值的销售数据DataFrame,包含列:日期、销售额、地区。其中部分销售额为缺失值。请用该列的平均值填充缺失值,然后按地区分组计算平均销售额。
✅ 参考答案
import pandas as pd import numpy as np data = { '日期': ['2024-01', '2024-01', '2024-02', '2024-02', '2024-03'], '销售额': [15000, np.nan, 22000, np.nan, 18000], '地区': ['华南', '华南', '华北', '华北', '华南'] } df = pd.DataFrame(data) # 用平均值填充缺失值 df['销售额'] = df['销售额'].fillna(df['销售额'].mean()) # 按地区分组计算平均销售额 region_avg = df.groupby('地区')['销售额'].mean() print(region_avg)
解析:fillna()方法可以填充缺失值,传入该列的均值即可。groupby('地区')按地区分组后,用.mean()计算每组的平均值。
有一个包含产品名称、销售额、利润的数据集。请按销售额降序排列,并为每个产品添加利润排名列(利润最高的排名为1)。
✅ 参考答案
import pandas as pd data = { '产品': ['产品A', '产品B', '产品C', '产品D', '产品E'], '销售额': [50000, 35000, 42000, 28000, 55000], '利润': [12000, 8000, 15000, 5000, 18000] } df = pd.DataFrame(data) # 按销售额降序排列 df_sorted = df.sort_values('销售额', ascending=False) # 添加利润排名(降序,利润最高的排名为1) df_sorted['利润排名'] = df_sorted['利润'].rank(ascending=False) print(df_sorted)
解析:sort_values()默认升序,设置ascending=False实现降序。rank()默认升序排名,ascending=False让最大值排名为1。
给定员工数据,包含姓名、部门、工龄、月薪。请筛选出:工龄大于2年且月薪低于8000的员工,计算这部分员工的平均月薪和人数。
✅ 参考答案
import pandas as pd data = { '姓名': ['张三', '李四', '王五', '赵六', '孙七', '周八'], '部门': ['销售', '技术', '销售', '技术', '销售', '技术'], '工龄': [1, 3, 5, 2, 4, 6], '月薪': [6000, 9000, 7500, 8500, 7000, 12000] } df = pd.DataFrame(data) # 筛选工龄>2且月薪<8000的员工 filtered = df[(df['工龄'] > 2) & (df['月薪'] < 8000)] # 计算平均月薪和人数 avg_salary = filtered['月薪'].mean() count = len(filtered) print(f"符合条件的员工人数: {count}") print(f"平均月薪: {avg_salary:.2f}") print(filtered)
解析:多条件筛选时,每个条件要用括号括起来,条件之间用 &(与)或 |(或)连接。len()可以获取DataFrame的行数。
有一份销售数据,包含月份、产品类别、销售额。请按产品类别分组,计算每个类别的总销售额、平均销售额、销售次数,并找出销售额最高的类别。
✅ 参考答案
import pandas as pd data = { '月份': ['1月', '1月', '2月', '2月', '3月', '3月'], '产品类别': ['电子产品', '服装', '电子产品', '服装', '电子产品', '服装'], '销售额': [50000, 30000, 55000, 28000, 60000, 35000] } df = pd.DataFrame(data) # 按类别分组聚合 category_stats = df.groupby('产品类别')['销售额'].agg(['sum', 'mean', 'count']) category_stats.columns = ['总销售额', '平均销售额', '销售次数'] print(category_stats) # 找出总销售额最高的类别 top_category = category_stats['总销售额'].idxmax() print(f"销售额最高的类别: {top_category}")
解析:agg()可以同时计算多个统计量,传入列表['sum', 'mean', 'count']。idxmax()返回最大值对应的索引,即销售额最高的类别名称。
有两张表:员工表(员工ID、姓名、部门ID)和部门表(部门ID、部门名称、部门预算)。请将两张表合并,显示每个员工的姓名、部门名称和部门预算。
✅ 参考答案
import pandas as pd employees = { '员工ID': [1, 2, 3, 4], '姓名': ['张三', '李四', '王五', '赵六'], '部门ID': ['D01', 'D02', 'D01', 'D03'] } df_emp = pd.DataFrame(employees) departments = { '部门ID': ['D01', 'D02', 'D03'], '部门名称': ['销售部', '技术部', '财务部'], '部门预算': [500000, 800000, 300000] } df_dept = pd.DataFrame(departments) # 合并两张表 merged = pd.merge(df_emp, df_dept, on='部门ID') # 选择需要的列 result = merged[['姓名', '部门名称', '部门预算']] print(result)
解析:merge()类似SQL的JOIN操作,on参数指定关联键。合并后选择需要的列即可。默认是内连接(inner join),只保留匹配的记录。
有一份按月统计的销售额数据。请计算每个月的环比增长率和同比增长率(假设数据为2023年和2024年各12个月),并找出增长率最高的月份。
✅ 参考答案
import pandas as pd data = { '月份': pd.date_range('2024-01', periods=12, freq='M'), '销售额': [100, 120, 110, 130, 140, 135, 150, 160, 155, 170, 180, 190] } df = pd.DataFrame(data) # 计算环比增长率 df['环比增长率'] = df['销售额'].pct_change() * 100 # 找出增长率最高的月份 max_growth_idx = df['环比增长率'].idxmax() max_growth_month = df.loc[max_growth_idx, '月份'] max_growth_rate = df.loc[max_growth_idx, '环比增长率'] print(df) print(f"增长率最高的月份: {max_growth_month.strftime('%Y-%m')}") print(f"增长率: {max_growth_rate:.2f}%")
解析:pct_change()计算当前行与前一行的百分比变化,即环比增长率。idxmax()找到最大值的索引,再用loc定位具体月份。
有一份销售数据,包含销售员、产品类别、季度、销售额。请创建数据透视表,显示每个销售员在每个季度的销售额,并计算每个销售员的总销售额。
✅ 参考答案
import pandas as pd data = { '销售员': ['张三', '张三', '李四', '李四', '王五', '王五'], '产品类别': ['电子', '服装', '电子', '服装', '电子', '服装'], '季度': ['Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2'], '销售额': [50000, 30000, 45000, 35000, 60000, 25000] } df = pd.DataFrame(data) # 创建数据透视表 pivot = df.pivot_table( values='销售额', index='销售员', columns='季度', aggfunc='sum', margins=True, margins_name='总计' ) print(pivot)
解析:pivot_table()参数:values是要聚合的数据,index是行标签,columns是列标签,aggfunc是聚合函数。margins=True会在行列末尾添加汇总。
给定一份完整的销售数据(包含日期、产品、地区、销售额、成本),请完成以下分析: 1. 计算每个产品的利润(销售额-成本)和利润率(利润/销售额) 2. 找出利润率最高的产品 3. 按地区统计总销售额和平均利润率 4. 筛选出利润率高于20%且销售额超过50000的记录
✅ 参考答案
import pandas as pd data = { '日期': ['2024-01-15', '2024-02-20', '2024-03-10', '2024-01-25', '2024-02-15'], '产品': ['产品A', '产品B', '产品A', '产品C', '产品B'], '地区': ['华南', '华北', '华南', '华东', '华北'], '销售额': [60000, 80000, 55000, 45000, 70000], '成本': [40000, 50000, 35000, 38000, 45000] } df = pd.DataFrame(data) # 1. 计算利润和利润率 df['利润'] = df['销售额'] - df['成本'] df['利润率'] = (df['利润'] / df['销售额']) * 100 # 2. 找出利润率最高的产品 product_profit = df.groupby('产品')['利润率'].mean() top_product = product_profit.idxmax() print(f"利润率最高的产品: {top_product}") # 3. 按地区统计 region_stats = df.groupby('地区').agg({ '销售额': 'sum', '利润率': 'mean' }) print(region_stats) # 4. 筛选高利润高销售额记录 high_performers = df[(df['利润率'] > 20) & (df['销售额'] > 50000)] print(high_performers)
解析:这是一道综合题,涉及列计算、分组聚合、条件筛选。关键是先计算利润相关列,然后逐步进行分析。agg()可以同时对多列进行不同的聚合操作。
🎉 恭喜完成所有练习!
你已经掌握了Python数据分析的基础技能。继续加油,探索更多数据分析的奥秘!