Python/reports/persona_report/template.html

256 lines
7.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset=“UTF-8”>
<title>分析报告 - 结网</title>
<meta name="jwreport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type ="image/png" href="../icon.png">
<link rel="stylesheet" type="text/css" href="../stylesheet.css">
<script>
MathJax = {
tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]}
};
</script>
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
<script id="MathJax-script" type="text/javascript" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
</head>
<body>
<div class="document-container">
<p class="document-block-title">基于MovieLens的用户画像建模报告</p>
<div class="document-block-description">
<span>刘弼仁</span>
<span> | </span>
<span>{{report_date}}</span>
</div>
<h1>报告背景</h1>
<p>用户画像是一种将用户属性、行为和好恶等信息转化为标签并关联而形成的用户模型。其目的是连接用户需求和产品运营,帮助企业更高效、更精准的认识、理解用户,从而更有效的分配资源提供为用户提供产品和服务、提高运营效率。</p>
<blockquote>
<i>Ta是一个怎样的人</i>
<br>
男性中青年产品经理北方人喜欢美食、宠物和3C和网络游戏阴阳师和原神
</blockquote>
<p>本次报告数据来源于MovieLens通过介绍用户画像建模并将其应用于用户分群和电影推荐的流程希望读者能够对用户画像有所了解。</p>
<h1>用户画像建模</h1>
<h2>数据集解释</h2>
<p>本次报告使用的数据集为MovieLens10K。该数据集为GroupLens从MovieLens网站收集并提供的用户、电影和评分数据。发布时间为2009年1月1日。</p>
<h3>数据集文件结构</h3>
<img src="MovieLens数据集的文件结构.png"></img>
<h2>建模流程</h2>
<h3>获取数据</h3>
<p>通过打开本地数据文件获取数据集,其中用户数为{{users}},电影数为{{movies}},评分数为{{ratings}}。</p>
<h3>构建标签体系</h3>
<p>考虑本次报告所构建的用户画像将应用于用户分群和电影推荐,设计标签分类如下:</p>
<img src="标签分类.png"></img>
<p>因为在用户分群时将使用基于核函数的主成分分析算法和K均值聚类算法、电影推荐时将使用Apriori算法所以本次报告使用独热编码方法生成标签。</p>
<blockquote>
<i>独热编码One-Hot Encoding</i>
<br>
一种将称名或顺序型特征转化为机器学习算法容易处理的格式的方法它为特征的每个值衍生一个二进制的新特征。在该衍生特征中如果某份样本属于该特征值则为1否则为0。
<br>
<br>
例如“性别”特征将会衍生“gender: male”和“gender: female”两个新特征并会为所有样本按照衍生特征赋值0/1。其中男性为{“gender:male”: 1}{“gender:female”: 0};女性为{“gender:male”: 0}{“gender:female”: 1}。
</blockquote>
<h3>整体用户画像</h3>
<p>通过各特征来描绘用户整体画像。</p>
<h4>性别</h4>
<iframe src="label_genders.html"></iframe>
<h4>年龄</h4>
<p>定义年龄小于18岁为“age: under18”18至24岁为“age: 18~24”25至34岁为“age: 25~34”35至44岁为“age: 35~44”45至54岁至“age: 45~54”大于54岁为“age: above54”。</p>
<iframe src="label_ages.html"></iframe>
<h4>职业</h4>
<iframe src="label_occupations.html"></iframe>
<h4>州级行政区</h4>
<p>根据邮政编码(美国)解析州级行政区。</p>
<iframe src="label_states.html"></iframe>
<h4>评分数</h4>
<p>统计每位用户评分数并按照等频分箱、分箱数为5。</p>
<iframe src="label_ratings.html"></iframe>
<h4>平均评分</h4>
<p>统计每位用户平均评分并定义为平均评分并按照等频分箱、分箱数为5。</p>
<iframe src="label_rating.html"></iframe>
<h4>最近评分最高的电影TOP1至5</h4>
<p>统计每位用户最近评分最高的电影前五名并定义为最喜欢的电影TOP1至5。</p>
<iframe src="label_movies.html"></iframe>
<h4>喜欢的电影体裁TOP1至5</h4>
<p>统计每位用户评分过的电影体裁数前五名并定义为喜欢的电影体裁TOP1至5。</p>
<iframe src="label_genres.html"></iframe>
<h3>用户分群</h3>
<p>按照用户标签的关联性进行归类分组,企业可以将用户群体划分为具有相似属性、行为和好恶的细分群体。</p>
<h4>算法说明</h4>
<p>本次报告首先使用基于核函数的主成分分析算法就衍生特征进行降维处理最后使用K均值聚类算法进行聚类处理并基于间隔统计量确定最优聚类簇数最终实现用户分群目的。</p>
<blockquote>
<i>基于核函数的主成分分析</i>
<br>
首先使用核函数(例如径向基)方法,将高维且线性不可分的数据映射到更高维但线性可分的特征空间,最后在该特征空间使用主成分分析算法进行降维处理。
<br>
<br>
<i>主成分分析</i>
<br>
一种常用的数据降维和特征提取的统计方法,其假设是数据内在存在线性关系,通过将数据转换到由主成分构成的坐标系统,从而在最大保留数据信息的前提下降维。
<br>
<br>
<i>核函数</i>
<br>
考虑本次报告使用独热编码方法生成的标签数据具有高维性和稀疏性通常使用基于余弦相似度核函数Cosine Similarity Kernel的主成分分析算法的降维效果更好。
</blockquote>
<blockquote>
<i>K均值聚类</i>
<br>
一种无监督学习的基于距离的聚类算法其目标是将数据点划分为K个簇使得相同簇的数据点尽可能相同、不同簇的数据点尽可能不同。缺点是需要预先指定聚类簇数本报告使用间隔统计量确定最优聚类簇数。
<br>
<br>
<i>间隔统计量GapStatistic</i>
<br>
用于评估聚类效果的统计方法,公式如下:
\[Gap(K)=E(log{D}_{K})-log{D}_{K}\]
其中,\({D}_{K}=\sum {\sum {dist{(x,c)}^{2}}}\)。选择\(Gap(K)>=Gap(K+1)\)的最小K值作为最优聚类簇数。
</blockquote>
</div>
<footer>
<p>临渊羡鱼,不如退而结网</p>
</footer>
<script>
function resetIframeHeight(iframeId) {
const iframe = document.getElementById(iframeId);
iframe.style.height = '0px';
iframe.contentWindow.postMessage({action: 'requestHeight', iframeId: iframeId}, '*');
}
window.addEventListener('message', function(event) {
if (event.data.action === 'responseHeight') {
const iframe = document.getElementById(event.data.iframeId);
if (iframe) {
iframe.style.height = event.data.height + 'px';
}
}
}, false);
</script>
</body>
</html>