微信好友数据分析案例

整体功能概述

这段 Python 代码主要用于对微信好友数据进行多维度的分析和可视化展示。它通过读取 CSV 和 Excel 文件中的数据,对微信好友的省份分布、性别比例、房间关系、签名情感强度等方面进行统计分析,并使用 pyecharts 库将分析结果以柱状图、饼图、关系图和地图等可视化形式呈现出来。

模块导入

import csv
from pyecharts.charts import Bar, Pie, Map, Graph
from pyecharts import options as opts
from collections import Counter
import xlrd
from snownlp import SnowNLP
import re
import jieba
import operator
import matplotlib.pyplot as plt
from PIL import Image
from wordcloud import WordCloud

 

  • csv:用于读取 CSV 文件。
  • pyecharts:用于创建各种可视化图表,如柱状图(Bar)、饼图(Pie)、地图(Map)和关系图(Graph)。
  • collections.Counter:用于统计元素出现的次数。
  • xlrd:用于读取 Excel 文件。
  • snownlp:用于进行中文文本的情感分析。
  • rejiebaoperatormatplotlib.pyplotPIL 和 wordcloud 虽然被导入,但在当前代码中部分未被使用。

函数分析 

 1. getPro(filename)

 

def getPro(filename):
    lst1 = []
    lst2 = []
    with open(filename, 'r') as fr:
        reader = csv.reader(fr)
        for i in reader:
            lst1.append(i[3])
            lst2.append(i[1])
    return lst1, lst2

 

  • 功能:从指定的 CSV 文件中读取数据,将每行的第 4 列(索引为 3)数据存入 lst1,第 2 列(索引为 1)数据存入 lst2,并返回这两个列表。
  • 参数filename 为 CSV 文件的文件名

 2. Visualpropyechart(lstprovince, lstcity)

 

def Visualpropyechart(lstprovince, lstcity):
    lstprovinceNew = []
    lst1 = []
    lst2 = []
    # 去掉空白的项,统计省份数据
    for i in lstprovince:
        if i == '' or i == 'City':
            pass
        else:
            lstprovinceNew.append(i)
    # 统计每个省份出现的次数
    data = Counter(lstprovinceNew).most_common(10)
    for j in data:
        lst1.append(j[0])
        lst2.append(j[1])
    # 初始化配置项,内部可设置颜色
    bar = (
        Bar()
        .add_xaxis(lst1)
        .add_yaxis("amount", lst2, color='teal')
        .set_global_opts(
            title_opts=opts.TitleOpts(title='微信好友省份分布数据分析'),
            yaxis_opts=opts.AxisOpts(name="省份数量"),
            xaxis_opts=opts.AxisOpts(name="省份名字")
        )
    ).render('好友省份比例柱状图.html')

 

  • 功能:对省份数据进行处理和可视化,绘制微信好友省份分布的柱状图。
  • 步骤
    1. 过滤掉空白项和值为 'City' 的项,得到有效的省份数据。
    2. 使用 Counter 统计每个省份出现的次数,并选取出现次数最多的前 10 个省份。
    3. 使用 pyecharts 的 Bar 类创建柱状图,设置 X 轴为省份名称,Y 轴为省份数量,并设置图表的标题和坐标轴名称。
    4. 将图表保存为 好友省份比例柱状图.html 文件。

 3. getSex(filename)

def getSex(filename):
    lstsex = []
    with open(filename, 'r') as fr:
        reader = csv.reader(fr)
        for i in reader:
            lstsex.append(i[4])
    return lstsex

 

  • 功能:从指定的 CSV 文件中读取每行的第 5 列(索引为 4)数据,即微信好友的性别信息,并返回一个包含所有性别信息的列表。
  • 参数filename 为 CSV 文件的文件名。

4. VisualSexpyechart(lstsex) 

def VisualSexpyechart(lstsex):
    sex = dict()
    # 提取好友性别信息,从1开始
    for f in lstsex[1:]:
        if f == '1':  # 男
            sex["man"] = sex.get("man", 0) + 1
        elif f == '2':  # 女
            sex["women"] = sex.get("women", 0) + 1
        else:  # 未知
            sex["unknown"] = sex.get("unknown", 0) + 1
    # 打印性别比例
    total = len(lstsex[1:])
    print("男性好友: %.2f%%" % (float(sex["man"]) / total * 100))
    print("女性好友: %.2f%%" % (float(sex["women"]) / total * 100))
    print("不明性别好友:%.2f%%" % (float(sex["unknown"]) / total * 100))
    # 使用echarts饼状图
    attr = ['男性好友', '女性好友', '不明性别好友']
    value = [sex['man'], sex['women'], sex['unknown']]
    # 初始化配置项
    bar = (
        Bar()
        .add_xaxis(attr)
        .add_yaxis("amount", value, color='teal')
        .set_global_opts(
            title_opts=opts.TitleOpts(title='微信数据分析'),
            yaxis_opts=opts.AxisOpts(name="人数"),
            xaxis_opts=opts.AxisOpts(name="性别")
        )
    ).render('好友性别比例柱状图.html')

 

  • 功能:对微信好友的性别信息进行统计和可视化,绘制性别比例的柱状图。
  • 步骤
    1. 统计男性、女性和不明性别好友的数量。
    2. 计算并打印出每种性别的好友占比。
    3. 使用 pyecharts 的 Bar 类创建柱状图,设置 X 轴为性别类别,Y 轴为人数,并设置图表的标题和坐标轴名称。
    4. 将图表保存为 好友性别比例柱状图.html 文件。

5. getRoom(filename) 

def getRoom(filename):
    Room = {}
    data = xlrd.open_workbook(filename)
    table = data.sheets()[0]
    rows = table.nrows
    for i in range(rows):
        if i == 0:
            continue
        Room[table.row_values(i)[3]] = table.row_values(i)[9]
    return Room
  • 功能:从指定的 Excel 文件中读取数据,将每行的第 4 列(索引为 3)作为键,第 10 列(索引为 9)作为值,存储在字典 Room 中,并返回该字典。
  • 参数filename 为 Excel 文件的文件名。

6. RoomSee(Room) 

def RoomSee(Room):
    nodes = []
    for i in Room:
        nodes.append({"name": i, "symbolSize": 5})
    links = []
    for i in Room:
        for j in Room:
            if Room[i] == Room[j]:
                links.append({"source": i, "target": j})
    # 初始化图表
    graph = Graph(init_opts=opts.InitOpts())
    graph.set_global_opts(title_opts=opts.TitleOpts(title="关系图示例"))
    graph.add(
        "",
        nodes,
        links,
        categories=None,
        is_focusnode=True,
        is_roam=True,
        label_opts=opts.LabelOpts(is_show=True, rotate=45),
        layout="force",
        edge_length=220,
        gravity=0.5,
        repulsion=100,
        linestyle_opts=opts.LineStyleOpts(curve=0.2)
    )
    graph.render("1.html")
  • 功能:根据房间信息绘制关系图。
  • 步骤
    1. 创建节点列表 nodes,每个节点包含名称和大小信息。
    2. 创建边列表 links,如果两个节点对应的房间信息相同,则添加一条边。
    3. 使用 pyecharts 的 Graph 类创建关系图,设置图表的标题和相关配置项。
    4. 将图表保存为 1.html 文件。

7. getcvsData(filename, index) 

 

def getcvsData(filename, index):
    lstdata = []
    with open(filename, 'r') as fr:
        reader = csv.reader(fr)
        for i in reader:
            if len(i) > index:
                lstdata.append(i[index])
    return lstdata

 

  • 功能:从指定的 CSV 文件中读取指定列(索引为 index)的数据,并返回一个包含该列所有数据的列表。
  • 参数filename 为 CSV 文件的文件名,index 为要读取的列的索引。

 8. analysemood(elist)

 

def analysemood(elist):
    del elist[0]
    listgood = 0
    listbad = 0
    for i in elist:
        if i == '':
            pass
        else:
            s = SnowNLP(i)
            if s.sentiments < 0.5:
                listbad += 1
            else:
                listgood += 1
    listEmotional = ['积极', '消极']
    listValue = [listgood, listbad]
    c = (
        Pie()
        .add(
            "",
            [list(z) for z in zip(listEmotional, listValue)],
            radius=["40%", "60%"],
            rosetype="radius",
        )
        .set_colors(["plum", "lightsteelblue"])
        .set_global_opts(
            title_opts=opts.TitleOpts(title="饼图"),
            legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),
        )
        .set_series_opts(
            label_opts=opts.LabelOpts(formatter="{b}:{c}")
        )
    )
    return c
  • 功能:对微信好友的签名信息进行情感分析,并绘制情感强度的饼图。
  • 步骤
    1. 去除列表中的第一个元素。
    2. 使用 SnowNLP 对每个签名进行情感分析,统计积极和消极情感的数量。
    3. 使用 pyecharts 的 Pie 类创建饼图,设置饼图的半径、颜色、标题和标签格式。
    4. 返回创建好的饼图对象。

 9. VisualPropyecharts(lstprovince)

 

def VisualPropyecharts(lstprovince):
    lstprovinceNew = []
    lst1 = []
    lst2 = []
    # 去掉空白的项
    for i in lstprovince:
        if i == '' or i == 'Province':
            pass
        else:
            lstprovinceNew.append(i)
    # 统计每个省份出现的次数
    data = Counter(lstprovinceNew).most_common(2)
    for j in data:
        # 处理直辖市和特别行政区
        if j[0] in ['北京', '上海', '天津', '重庆', '香港', '澳门']:
            lst1.append(j[0] + "市")
        else:
            lst1.append(j[0] + "省")
        lst2.append(j[1])
    # 根据省份数据生成地图
    c = (
        Map()
        .add(
            "例子",
            [list(z) for z in zip(lst1, lst2)],
            "china"
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="微信好友省份分布图", subtitle="数据来源:微信好友", pos_right="center"),
            visualmap_opts=opts.VisualMapOpts(max_=95),
            legend_opts=opts.LegendOpts(
                pos_right="right",
                pos_bottom="bottom"
            )
        )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=True))
    )
    return c
  • 功能:对省份数据进行处理和可视化,绘制微信好友省份分布的地图。
  • 步骤
    1. 过滤掉空白项和值为 'Province' 的项,得到有效的省份数据。
    2. 使用 Counter 统计每个省份出现的次数,并选取出现次数最多的前 2 个省份。
    3. 处理直辖市和特别行政区的名称。
    4. 使用 pyecharts 的 Map 类创建地图,设置地图的标题、视觉映射和图例,并设置显示省份名称。
    5. 返回创建好的地图对象。 

 主程序

 

if __name__ == "__main__":
    # 省份分布分析
    a, b = getPro('WudiFriendsAllData.csv')
    Visualpropyechart(a, b)

    # 性别分布分析
    VisualSexpyechart(getSex("WudiFriendsAllData.csv"))

    # 房间关系分析
    RoomSee(getRoom("软件223学生详细名单.xls"))

    # 签名情感强度分析
    analysemood(getcvsData('WudiFriendsAllData.csv', 5)).render(path='签名情感强度.html')

    # 好友所在省份分布地图
    alist = getcvsData('WudiFriendsAllData.csv', 3)
    VisualPropyecharts(alist).render(path="好友所在城市及省份分布.html")
  • 功能:依次调用上述各个函数,完成微信好友数据的多维度分析和可视化,生成相应的 HTML 文件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值