数据分析实战一:教育课程案例线上平台数据分析

教育课程案例线上平台数据分析

大家好!我是未来村村长!就是那个“请你跟我这样做,我就跟你那样做”的村长‍!

一、数据预处理

请添加图片描述

# coding=gbk
import pandas as pd
import math

df_login = pd.read_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\login.csv",encoding='gbk')
df_study_info = pd.read_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\study_information.csv",encoding='gbk')
df_users = pd.read_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\users.csv",encoding='gbk')
#各表数据总览
print('================df_login=================')
df_login.info()
print('==================df_study_info===============')
df_study_info.info()
print('=================df_users==============')
df_users.info()

#一、异常值处理
#1、缺失值处理
#1)缺失值行列缺失情况统计
login_col_null = df_login.isnull().sum(axis=0)
study_info_col_null = df_study_info.isnull().sum(axis=0)
users_col_null = df_users.isnull().sum(axis=0)
print('\nlogin表缺失情况:\n',login_col_null)
print('\nstudy_info表缺失情况:\n',study_info_col_null)
print('\nusers表缺失情况:\n',users_col_null)
#2)缺失值处理
#a.users表user_id的缺失值占比较小直接作丢弃处理,school数据缺失占比较大,无关紧要不作处理
df_users.dropna(how='any',subset=['user_id'],inplace=True)
#b.study_info表的price字段数据量较大,根据出现的课程作平均值处理,未出现课程作丢弃处理
#课程聚类求均值,空值循环填充,填充失败作丢弃
df_study_info_del =  df_study_info.dropna(how='any',subset=['price'],inplace=False)
df_price_mean = df_study_info_del.drop_duplicates().loc[:,['course_id','price']].groupby('course_id').mean()
dict_price_mean = df_price_mean.T.to_dict(orient='list')
for i in range(len(df_study_info)):
    if math.isnan(df_study_info['price'][i]):
        for j in dict_price_mean.keys():
            if df_study_info['course_id'][i] == j:
                df_study_info.loc[i,['price']]= dict_price_mean[j][0]
#非常值处理
#a.用注册时间代替--(recently_login)
df_users_alter = df_users.reindex(range(len(df_users['user_id'])))
for i in range(len(df_users_alter['user_id'])):
    if df_users_alter['recently_logged'][i] == '--':
        df_users_alter.loc[i,['recently_logged']] = df_users_alter['register_time'][i]
#重复值处理
df_users_alter.drop_duplicates()
df_login.drop_duplicates()
df_study_info.drop_duplicates()


df_users_alter.to_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_users_alter.csv",encoding='gbk',index=None)
df_login.to_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_login.csv",encoding='gbk',index=None)
df_study_info.to_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_study_info.csv",encoding='gbk',index=None)

二、平台用户活跃度分析

1、绘制各省份与各城市平台登录次数热力地图,分析用户分布情况。

先以城市进行统计分组

import pandas as pd

df_login = pd.read_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_login.csv",encoding='gbk')
df_login_place = df_login.loc[:,['user_id','login_place']].groupby('login_place').count()
df_place_sum = pd.DataFrame(df_login_place)
df_place_sum.to_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_place_sum.csv",encoding='gbk')

然后分别对国家和身份进行统计,由于国家数量少,我们只需要对中国的地区进行求和,然后分开对省份进行求和。

import pandas as pd

df_place_sum = pd.read_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_place_sum.csv",encoding='gbk',names=['login_place','user_sum'],header=0)
China_sum = 0
for i in range(len(df_place_sum)):
    if df_place_sum['login_place'][i].count('中国')>0:
        China_sum += df_place_sum['user_sum'][i]
print(China_sum)

province_sum = {
     '北京':0,'天津':0,'上海':0,'重庆':0,'河北':0,'山西':0,'辽宁':0,
                '吉林':0,'黑龙江':0,'江苏':0,'浙江':0,'安徽':0,'福建':0,'江西':0,
                '山东':0,'河南':0,'湖北':0,'湖南':0,'广东':0,'海南':0,'四川':0,
                '贵州':0,'云南':0,'陕西':0,'甘肃':0,'青海':0,'台湾':0, '内蒙古':0,
                '广西':0,'西藏':0,'宁夏':0,'新疆':0,'香港区':0,'澳门':0
                }
for i in range(len(df_place_sum)):
    for j in province_sum.keys():
        if df_place_sum['login_place'][i].count(j)>0:
            province_sum[j] += df_place_sum['user_sum'][i]
df_province_sum = pd.DataFrame(list(province_sum.items()),columns=['省份','用户数量'])
df_province_sum.to_csv(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_province_sum.csv",encoding='gbk',index=None)

根据导出的excel我们可以到Tableau进行绘图,分别绘制了地图热力图和条形统计图。

数据分析实战一:教育课程案例线上平台数据分析_第1张图片

数据分析实战一:教育课程案例线上平台数据分析_第2张图片

2、绘制工作日与非工作日各时段的用户登录次数柱状图,分析用户活跃的主要时间段。

先对时间字段进行日期和时间的拆分,然后将时间字段转换为字符串,再将时间字段转化为小时,分钟,秒三个字段

将日期分为工作日和非工作日两个表格,根据小时字段进行cout操作,即为各个时间段的登录频次。

# coding=gbk
import pandas as pd
from openpyxl.workbook import Workbook
import numpy as np
from chinese_calendar import is_workday, is_holiday,is_in_lieu

df_login = pd.read_excel(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_login.xlsx")
df_login_split = df_login['login_time'].str.split(' ',expand=True)
df_login_split.columns = ['data','time']
df_login_new = df_login.join(df_login_split)
df_login_new['data'] = pd.to_datetime(df_login_new['data'])
df_login_new['is_workday'] = df_login_new['data'].map(lambda x:is_workday(x))
df_login_new['time'] = pd.to_datetime(df_login_new['time'])
df_login_new['time'] = df_login_new['time'].dt.strftime('%H-%M-%S')
df_time_area_split = df_login_new['time'].str.split('-',expand=True)
df_time_area_split.columns = ['hour','minute','second']
df_login_new = df_login_new.join(df_time_area_split)
df_login_workday = df_login_new[df_login_new['is_workday']==True]
df_login_restday = df_login_new[df_login_new['is_workday']==False]
df_login_workday_group = df_login_workday.groupby(['hour']).count()
df_login_restday_group = df_login_restday.groupby(['hour']).count()
df_login_workday_group.to_excel(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_login_workday.xlsx",encoding='gbk')
df_login_restday_group.to_excel(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_login_restday.xlsx",encoding='gbk')

使用tabluea画出条形统计图如下:

数据分析实战一:教育课程案例线上平台数据分析_第3张图片

数据分析实战一:教育课程案例线上平台数据分析_第4张图片

请添加图片描述

将login_time转换为时间格式,将截止日期转换为时间格式,直接进行-计算

通过循环取到时间的.days属性,即得到相隔天数。

# coding=gbk
import pandas as pd

df_login = pd.read_excel(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_login.xlsx")
df_login['login_time'] = pd.to_datetime(df_login['login_time'])
tem_day = pd.to_datetime('2020-06-18 00:00:00')
recent_login_data = df_login.groupby('user_id').max()
recent_login_data['losing_day'] = tem_day - recent_login_data['login_time']
recent_login_data['losing_day']=[i.days for i in recent_login_data['losing_day'].to_list()]
recent_login_data.to_excel(r"C:\Users\官二的磊子\Desktop\泰迪杯\df_login_losing.xlsx",encoding='gbk')

losing_rate = len(recent_login_data[recent_login_data['losing_day']>90])/len(recent_login_data['losing_day'])
print(len(recent_login_data[recent_login_data['losing_day']>90]))
print(len(recent_login_data['losing_day']))
print(losing_rate)

可得流失率为58.34%

数据分析实战一:教育课程案例线上平台数据分析_第5张图片

使用tabluea画出分组统计图和频次统计图如下:

数据分析实战一:教育课程案例线上平台数据分析_第6张图片

数据分析实战一:教育课程案例线上平台数据分析_第7张图片

你可能感兴趣的:(数据分析之路,数据分析,python,数据挖掘)