如果这篇博文对您有所帮助,您可以请我喝一杯咖啡。
CC-BY-NC-ND 4.0(除特别声明或转载文章外)
背景提要
前段时间参加的一个比赛的问卷回收结果比较一般,里面有不少问题没收到有意义的答案,总的来说其中有意思的变量不是很够,想做回归分析之类的比较麻烦。综合考虑之下的替代方案的第一个部分是用回答者提交问卷的IP地址和他们对某一问题(问题A)的回答结果做数据的转化处理,从而获得一个新的变量。
在这一步骤中,考虑将回答者划分为三类群体:来自于西部地区的、来自于中部地区的和来自于东部地区的。
判断依据
考虑过后,我们选择按照以下的逻辑对回答者其所来自的地域进行判断:
- 如果IP地址和问题A的回答指向同一地区(跨省亦可,例如IP在北京,问题A的答复在山东,同属东部地区),那么将回答者划分进入这一地区。
- 如果IP地址和问题A的回答指向不同地区,那么将回答者划分进入问题A的回答所在的地区。
- 对于其他情况手动判断处理。
实现代码
代码实现还是非常简单的。结果表明有4例情况需要手动处理,2例提交样本来自境外,其他来自东、中、西地区的问卷回答者的样本数量大概分别占样本总数的40%、30%、30%。
import numpy as np
import pandas as pd
import csv
def in_chich_range(str_ip,str_gk):
judge_if_same=[0 for i in range(len(str_ip))]
for i in range(len(str_ip)):
for j in east_range:
if j in str_ip[i] and j in str_gk[i]:
judge_if_same[i]=1
for j in middle_range:
if j in str_ip[i] and j in str_gk[i]:
judge_if_same[i]=2
for j in west_range:
if j in str_ip[i] and j in str_gk[i]:
judge_if_same[i]=3
print(judge_if_same)
need_to_further_judge=[]
for i in range(len(judge_if_same)):
if judge_if_same[i]==0:
need_to_further_judge.append(i)
return judge_if_same,need_to_further_judge
def show_to_judge(need,str_ip,str_gk):
for i in need:
print(i,str_ip[i],str_gk[i])
def just_judge_gk(need,judge_if_same,str_gk):
for i in need:
flag=False
for j in east_range:
if j in str_gk[i]:
judge_if_same[i]=1
flag=True
for j in middle_range:
if j in str_gk[i]:
judge_if_same[i]=2
flag=True
for j in west_range:
if j in str_gk[i]:
judge_if_same[i]=3
flag=True
if flag==False:
if '澳门' in str_gk[i] or '澳門' in str_gk[i]:
judge_if_same[i]=4
return judge_if_same
east_string='北京、天津、河北、辽宁、上海、江苏、浙江、福建、山东、广东、海南'
middle_string='山西、吉林、黑龙江、安徽、江西、河南、湖北、湖南'
west_string='四川、重庆、贵州、云南、西藏、陕西、甘肃、青海、宁夏、新疆、广西、内蒙古'
east_range=east_string.split('、')
middle_range=middle_string.split('、')
west_range=west_string.split('、')
str_ip=[]
str_gk=[]
with open('311.csv',encoding='utf-8') as f:
f_csv=csv.reader(f)
flag=False
for row in f_csv:
if flag==False:
str1=str(row[5])
str2=str(row[13])
print(row[5])
print(row[13])
flag=True
else:
str_ip.append(row[5])
str_gk.append(row[13])
print(str_ip)
print(str_gk)
judge_if_same,need_to_further_judge=in_chich_range(str_ip,str_gk)
print(need_to_further_judge)
print(len(need_to_further_judge))
show_to_judge(need_to_further_judge,str_ip,str_gk)
judge_if_same=just_judge_gk(need_to_further_judge,judge_if_same,str_gk)
print(judge_if_same)
for i in range(5):
count=0
for j in judge_if_same:
if i==j:
count=count+1
print(count)
更进一步
其实个人倾向于认为按照一二三四线城市进行分级操作是更加合理的,毕竟地区这个指标还是太粗糙了。不过其中有一些如下的麻烦需要解决:
- 部分IP地址所对应的地区是错误的。问卷回收中得到的提交者的IP地址并不总是能够对应到正确的城市,例如问卷中部分回答者的IP被错误的定位到了克孜勒苏,这样的情况下是没有办法得知他们提交问卷时所在的真实城市的。
- 部分回答是不清晰的,实际上问卷并没有规定问题A的回答的格式,有相当数量的回答者给出的细节仅仅精确到了省的级别,而他们所在的IP位置有时候与这一省的位置是矛盾的(需要怀疑的是,部分回答者似乎理解错了问题A的含义),这里的取舍需要谨慎考虑。
实际上诸如此类的小问题非常多,如果某一数据上仅仅出现其中的一个问题是很好处理的,但是有较多的数据同时出现了多个问题,这就使得精准的数据转化变得麻烦(甚至是不可能)了。