【项目03】数据清洗和结论研究

1、项目说明
读取数据,进行数据清洗,按照地域和学校统计知友的分布情况,做可视化图表

2、项目要求
2.1 数据清洗 - 去除空值

2.2 知友全国地域分布情况,分析出TOP20,要求:

  • 按照地域统计 知友数量、知友密度(知友数量/城市常住人口),不要求创建函数
  • 知友数量,知友密度,标准化处理,取值0-100,要求创建函数
  • 通过多系列柱状图,做图表可视化

2.3 知友全国地域分布情况,分析出TOP20,要求:

  • 按照学校(教育经历字段) 统计粉丝数(‘关注者’)、关注人数(‘关注’),并筛选出粉丝数TOP20的学校,不要求创建函数
  • 通过散点图 → 横坐标为关注人数,纵坐标为粉丝数,做图表可视化 ③ 散点图中,标记出平均关注人数(x参考线),平均粉丝数(y参考线)

3、实现思路

  • 数据清洗。需清洗数据主要有两种情况:一是 空值,二是无效数据。对于空值,Object 类型可以填充为“缺失数据”,数值型可以填充为0。无效数据,本案例中,可以用普查数据中的城市作为有效城市进行筛选。多个变量进行空值填充时,可考虑创建函数
  • 统计计算。统计时可以使用groupby 函数,统计粉丝数、关注人数、知友数量等,计算完毕后再进行密度等的计算。最后对数据进行排序,取前20条记录
  • 数据标准化。数据标准化也有多种方法。此处使用最大最小值归一化方法。标准化计算方法 = (X - Xmin) / (Xmax - Xmin)。映射到0-100,计算结果需乘以100
  • 图表可视化。知友密度、知友数量使用多系列柱状图做可视化;学校粉丝数使用散点图可视化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline

zhihu = pd.read_csv('知乎数据_201701.csv', engine = 'python')
people = pd.read_csv('六普常住人口数.csv', converters={'常住人口':float}, engine = 'python')

1、数据清洗 - 去除空值
可以创建函数,fillna方法填充缺失数据,注意inplace参数

# 数据清洗函数
def data_cleaning(df):
    cols = list(df.columns)
    for col in cols:
        if df[col].dtypes == 'object':
            df[col].fillna("缺失数据", inplace=True)
        else:
            df[col].fillna(0, inplace=True)
    return df

zhihu_c = data_cleaning(zhihu)

2、知友全国地域分布情况,分析出TOP20
要求:
① 按照地域统计,知友数量、知友密度(知友数量/城市常住人口),不要求创建函数
② 知友数量,知友密度,标准化处理,取值0-100,要求创建函数
③ 通过多系列柱状图,做图表可视化
提示:
① 标准化计算方法 = (X - Xmin) / (Xmax - Xmin)
② 可自行设置图表风格

data_city = zhihu_c.groupby('居住地')['_id'].count()
data_city = data_city.reset_index().rename(columns={'居住地': '地区','_id':'知友数量'})
people['地区'] = people['地区'].str[:-1]

#  使用join连接,因为有很多city无法识别,且有些city无统计数据, 无效数据处理
data_city = data_city.merge(people.iloc[:, [1,3]], how='inner', on = '地区')
data_city['知友密度'] = data_city['知友数量']/data_city["常住人口"]

def data_standard(df, col):
    xmin = np.min(df[col])
    xmax = np.max(df[col])
    if xmax != xmin:
        df[col+'_标准化']=  ((df[col]-xmin)/(xmax-xmin))*100
    else:
        df[col+'_标准化']=0
    return df

data_city = data_standard(data_city, '知友数量')
data_city = data_standard(data_city, '知友密度')

data_city_cnt_top20 = data_city.sort_values(by=['知友数量_标准化'], axis=0, ascending=0).iloc[0:20,[0,4]]
data_city_midu_top20 = data_city.sort_values(by=['知友密度_标准化'], axis=0, ascending=0).iloc[0:20,[0,5]]

# 可视化
plt.rcParams['font.sans-serif']=['SimHei']  
plt.rcParams['axes.unicode_minus'] = False  # 设置以显示中文

def data_plt(df, col, title, color='yellowgreen'):

    fig1 = plt.figure(num=1,figsize=(12,4))
    y1 = df[col[0]]
    plt.bar(range(20),
            y1,
            width = 0.8,
            facecolor = color,
            edgecolor = 'k',
            tick_label = df[col[1]])
    plt.title(title)
    plt.grid(True, linestyle = "-", color = "gray", linewidth = "0.5", axis = 'y')
    for i,j in zip(np.arange(20),y1):
        plt.text(i-0.25,2,'%.1f' % j, color = 'k', fontsize = 9)

data_plt(data_city_cnt_top20, ['知友数量_标准化','地区'], '知友数量 TOP20' )
data_plt(data_city_midu_top20, ['知友密度_标准化','地区'], '知友密度 TOP20', 'lightblue')

在这里插入图片描述
在这里插入图片描述

3、知友全国地域分布情况,分析出TOP20
要求:
① 按照学校(教育经历字段) 统计粉丝数(‘关注者’)、关注人数(‘关注’),并筛选出关注人数TOP20的学校,不要求创建函数
② 通过散点图 → 横坐标为关注人数,纵坐标为粉丝数,做图表可视化
③ 散点图中,标记出平均关注人数(x参考线),平均粉丝数(y参考线)
提示:
① 可自行设置图表风格

data_school = zhihu_c.groupby('教育经历')['关注者','关注'].sum()
data_school = data_school.reset_index().rename(columns={'关注者': '粉丝数','关注':'关注人数'})
data_school = data_school[~data_school['教育经历'].isin(['缺失数据','本科','医学','大学本科','大学'])]

data_school_fans = data_school.sort_values(by='关注人数', ascending=0).iloc[:20, :]

fans = data_school_fans.iloc[:,1]
follow = data_school_fans.iloc[:,2]
school = data_school_fans.iloc[:,0]
fans_mean = fans.mean()
follow_mean = follow.mean()

fig2 = plt.figure(num=1,figsize=(10,6))
plt.scatter(follow, fans,
        marker='o',
        s= fans/1000,
        cmap = 'Blues',
        c = fans,
        alpha = 0.8,
        label = '学校')
#  可视化
#  添加显示内容
plt.axvline(follow_mean,hold=None,label="平均关注人数:%i 人" % follow_mean, color='r',linestyle="--",alpha=0.8)  # 添加x轴参考线
plt.axhline(fans_mean,hold=None,label="平均粉丝数:%i 人" % fans_mean, color='g',linestyle="--",alpha=0.8)   # 添加y轴参考线
plt.legend(loc = 'upper left')
plt.grid()

# 添加注释
for i,j,n in zip(follow, fans, school):
    plt.text(i+500,j,n, color = 'k')

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值