【项目01】 知乎数据清洗整理和结论研究
要求:
1、数据清洗 - 去除空值
要求:创建函数
提示:fillna方法填充缺失数据,注意inplace参数,文本型字段空值改为“缺失数据”,数字型字段空值改为 0
2、问题1 知友全国地域分布情况,分析出TOP20
要求:
① 按照地域统计 知友数量、知友密度(知友数量/城市常住人口),不要求创建函数
② 知友数量,知友密度,标准化处理,取值0-100,要求创建函数
③ 通过多系列柱状图,做图表可视化
提示:
① 标准化计算方法 = (X - Xmin) / (Xmax - Xmin)
② 可自行设置图表风格
3、问题2 知友全国地域分布情况,分析出TOP20
要求:
① 按照学校(教育经历字段) 统计粉丝数(‘关注者’)、关注人数(‘关注’),并筛选出粉丝数TOP20的学校,不要求创建函数
② 通过散点图 → 横坐标为关注人数,纵坐标为粉丝数,做图表可视化
③ 散点图中,标记出平均关注人数(x参考线),平均粉丝数(y参考线)
提示:
① 可自行设置图表风格
import pandas as pd
import numpy as np
data1 = pd.read_csv('./知乎数据_201701.csv',engine='python')
data2 = pd.read_csv('./六普常住人口数.csv',engine='python')
1、数据清洗 - 去除空值
def fill_null(df):
cols=df.columns
for col in cols:
if df[col].dtype=='object':
df[col].fillna('缺失数据',inplace=True)
else:
df[col].fillna(0,inplace=True)
return df
data1_c=fill_null(data1)
问题1 知友全国地域分布情况,分析出TOP20
要求:
① 按照地域统计 知友数量、知友密度(知友数量/城市常住人口),不要求创建函数
② 知友数量,知友密度,标准化处理,取值0-100,要求创建函数
③ 通过多系列柱状图,做图表可视化
提示:
① 标准化计算方法 = (X - Xmin) / (Xmax - Xmin)
data1_c.rename(columns={'_id':'id'},inplace=True)
df_city = data1_c.groupby('居住地').count()
data2['city']=data2['地区'].str[:-1]
q1data=pd.merge(df_city,data2,left_index=True,right_on='city',how='inner')[['id','city','常住人口']]
q1data['知友密度']=q1data['id']/q1data['常住人口']
q1data
数据标准化
def data_nor(df,*cols):
colnames=[]
for col in cols:
colname=col+'_nor'
df[colname]=(df[col]-df[col].min())/(df[col].max()-df[col].min())*100
colnames.append(colname)
return(df,colnames)
result_cols=data_nor(q1data,'id','知友密度')[1]
result_data=data_nor(q1data,'id','知友密度')[0]
q1data_top20_sl=result_data.sort_values(result_cols[0],ascending=False)[['city',result_cols[0]]].iloc[:20]
q1data_top20_md=result_data.sort_values(result_cols[1],ascending=False)[['city',result_cols[1]]].iloc[:20]
import matplotlib.pyplot as plt
#中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
fig1=plt.figure(num=1,figsize=(12,8))
y1=q1data_top20_sl[result_cols[0]]
plt.bar(range(20),
y1,
width=0.8,
facecolor='cyan',
edgecolor='k',
align='center',
tick_label=q1data_top20_sl['city']
)
plt.title('知友数量TOP20\n',fontsize=20)
plt.xlabel('城市',fontsize=20)
plt.ylabel('知友数量',fontsize=20)
#坐标轴刻度的字体大小
plt.tick_params(labelsize=13)
#给图形添加数据标签
for i,j in zip(range(20),y1):
plt.text(i, j+0.2, '%.0f' %j, ha='center', va= 'bottom',fontsize=12)
fig2 = plt.figure(num=2,figsize=(12,8))
y2 = q1data_top20_md[result_cols[1]]
plt.bar(range(20),
y2,
width = 0.8,
facecolor = 'lightskyblue',
edgecolor = 'k',
tick_label = q1data_top20_md['city'])
plt.title('知友密度TOP20\n',fontsize=20)
plt.xlabel('城市',fontsize=20)
plt.ylabel('知友密度',fontsize=20)
for i,j in zip(range(20),y2):
plt.text(i, j+0.2, '%.1f' %j, ha='center', va= 'bottom',fontsize=12)
问题2 不同高校知友关注和被关注情况
要求:
① 按照学校(教育经历字段) 统计粉丝数(‘关注者’)、关注人数(‘关注’),并筛选出粉丝数TOP20的学校,不要求创建函数
② 通过散点图 → 横坐标为关注人数,纵坐标为粉丝数,做图表可视化
③ 散点图中,标记出平均关注人数(x参考线),平均粉丝数(y参考线)
q2data=data1_c.groupby('教育经历').sum()[['关注者','关注']].drop(['缺失数据','大学','本科'])
q2data_c=q2data.sort_values('关注者',ascending=False)[:20]
q2data_c.rename(columns={'关注者':'粉丝数','关注':'关注人数'},inplace=True)
y=q2data_c['粉丝数']
x=q2data_c['关注人数']
plt.figure(figsize=(18,12))
follow_mean=q2data_c['关注人数'].mean()
fans_mean=q2data_c['粉丝数'].mean()
plt.scatter(x,y,marker='.',
s = y/1000,
cmap = 'rainbow',
c = y,
label = '学校')
plt.axvline(follow_mean,hold=None,label="平均关注人数:%i人" % follow_mean,color='r',linestyle="--",alpha=0.8)
plt.axhline(fans_mean,hold=None,label="平均粉丝数:%i人" % fans_mean,color='g',linestyle="--",alpha=0.8)
plt.legend(loc = 'upper left')
for i,j,n in zip(x,y,q2data_c.index):
plt.text(i+500,j,n, color = 'k')