超基础版游戏运营数据分析(python+mysql
·
MySQL 创建数据库数据表
-- 创建库
CREATE database if not exists game_operantion;
USE game_operantion;
-- 创建表/用户表
CREATE TABLE if not exists user_info(
user_id int auto_increment PRIMARY KEY,
user_name varchar(20) not null, -- 用户名
level int not null DEFAULT(1), -- 等级
lastLoginTime DATE NOT NULL -- 登录时间
);
-- 创建表/充值表
CREATE TABLE if not exists recharge_info(
r_id int auto_increment PRIMARY KEY,
user_id int not null,
r_money decimal(10,2) not null, -- 金额
r_date date not null, -- 充值日期
foreign key (user_id) REFERENCES user_info(user_id)
);
INSERT INTO user_info (user_name, level,lastLoginTime)
VALUES
('玩家1', 25, '2025-08-10'),
('玩家2', 55, '2025-08-10'), -- 高等级用户
('玩家3', 18, '2025-08-11'),
('玩家4', 42, '2025-08-11'),
('玩家5', 60, '2025-08-12'), -- 高等级用户
('玩家6', 33, '2025-08-12'),
('玩家7', 22, '2025-08-13'),
('玩家8', 58, '2025-08-16'), -- 高等级用户
('玩家9', 15, '2025-08-14'),
('玩家10', 45, '2025-08-14'),
('玩家11', 30, '2025-08-10'),
('玩家12', 28, '2025-08-11'),
('玩家13', 52, '2025-08-12'), -- 高等级用户
('玩家14', 40, '2025-08-13'),
('玩家15', 35, '2025-08-14'),
('玩家16', 20, '2025-08-16'),
('玩家17', 12, '2025-08-11'),
('玩家18', 48, '2025-08-12'),
('玩家19', 38, '2025-08-13'),
('玩家20', 55, '2025-08-17'); -- 高等级用户
-- 插入充值数据(5个用户有充值,金额10-200元)
INSERT INTO recharge_info (user_id, r_money, r_date)
VALUES
(2, 150.00, '2025-08-10'), -- 玩家2(高等级+充值)
(5, 80.00, '2025-08-12'), -- 玩家5(高等级+充值)
(8, 2000.00, '2025-08-16'), -- 玩家8(高等级+高充值)
(13, 120.00, '2025-08-12'), -- 玩家13(高等级+充值)
(20, 90.00, '2025-08-14'); -- 玩家20(高等级+充值)
python
import pymysql
import pandas as pd
import matplotlib.pyplot as plt
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文显示为 SimHei(宋体)
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题
# 连接数据库
conn=pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123456',
database='game_operantion',
# charset='utf-8'
)
# 计算每日活跃用户数
def get_dau():
sql="""
select
date(lastLoginTime) as 登录日期,
COUNT(user_id) as 活跃用户数
from user_info
group by 登录日期
order by 登录日期;
"""
return pd.read_sql(sql,conn, index_col=None)
# 查询等级>50 充值价格>100的用户id 用户名
def get_hight_users():
sql="""
select
u.user_id as 用户id,
u.user_name as 用户名,
u.level as 等级,
ifnull(sum(r.r_money),0) as 总充值
from user_info u
left join recharge_info r on u.user_id = r.user_id
group by u.user_id
having 等级>50 or 总充值 > 100
order by 总充值 desc;
"""
return pd.read_sql(sql,conn, index_col=None)
# 数据可视化
def show_charts(dau_data, high_value_data):
plt.figure(figsize=(15,7))
# 将画布划分为1行2列的子图布局
# 操作第1个子图
plt.subplot(1,2,1)
# dau_data['日期']作为x轴数据(日期),dau_data['活跃用户数']作为y轴数据(活跃用户数量),
# 'bo-'表示绘制的点为蓝色(b)圆形(o),并使用实线(-)连接这些点。
plt.plot(dau_data['登录日期'],dau_data['活跃用户数'],'bo-')
# plt.plot(dau_data['登录日期'], dau_data['活跃用户数'], 'r*--') # 红星虚线
# plt.plot(dau_data['登录日期'], dau_data['活跃用户数'], 'g^-') # 绿三角实线
plt.title('每日活跃用户人数')
plt.xticks(rotation=45)
# 操作第2个子图
plt.subplot(1,2,2)
plt.bar(high_value_data['用户名'],high_value_data['总充值'],color='pink')
plt.title('高充值玩家数据')
plt.xticks(rotation=90,fontsize=10)
# :自动优化子图的布局
plt.tight_layout()
plt.show()
if __name__ == '__main__':
d=get_dau()
h=get_hight_users()
print("每日活跃用户数量")
print(d)
print("\n高充值用户列表")
print(h)
# 调用show_charts函数,传入获取到的两个DataFrame数据,绘制并显示可视化图表。
show_charts(d,h)
conn.close()
效果图



更多推荐
所有评论(0)