<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@vachana</title><author><name>@vachana</name></author><id>https://teletype.in/atom/vachana</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/vachana?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@vachana?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vachana"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/vachana?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-13T23:29:59.750Z</updated><entry><id>vachana:SJ9iSCVyQ</id><link rel="alternate" type="text/html" href="https://teletype.in/@vachana/SJ9iSCVyQ?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vachana"></link><title>Реклама.Гуру или как стать маркетологом</title><published>2018-05-30T06:37:27.057Z</published><updated>2018-06-08T16:24:56.520Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/dc/dca29384-99d2-4452-b5ab-c7726e7d6b1d.png"></media:thumbnail><category term="topic245" label="Аналитика"></category><category term="python" label="python"></category><category term="sql" label="sql"></category><summary type="html">&lt;img src=&quot;https://lh6.googleusercontent.com/zsGgVW52RSU0yxrR0SNaf9WwGgtOWKbXoExIuYLoQ7NzPwcKVOT-MhS7nGdYvb7w0sXrQ2Dq-iqMdZtATKL7sfrQZT69_8vVjsLT5QK2k0cZfz93nwNEJVvAM5w7oIWKNSvq2_uV&quot;&gt;Здесь все предельно просто: задачка на sql, задачка на анализ и логический квестик.</summary><content type="html">
  &lt;p&gt;Здесь все предельно просто: задачка на sql, задачка на анализ и логический квестик.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Задача на Sql:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Есть три таблицы:&lt;/p&gt;
  &lt;p&gt;1. Справочник категорий (id, name). &lt;em&gt;Тут просто лежат названия категорий и айдишки, ничего сложного.&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;2. Справочник сущностей (id, category_id, name). &lt;em&gt;Сущности, как я понимаю, что-то вроде подкатегорий или типов транзакций, но для нас они просто склейка между таблицами. Внутри одной категории может быть несколько сущностей, а к одной сущности может относиться несколько операций.&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;3. Основная таблица записи операций (id, date_time, item_id, cost, revenue, profit). &lt;em&gt;Здесь item_id=id сущности, а profit это cost-revenue. Также сказано, что прибыль функционально зависит от цен покупки и продажи, таблица умышленно денормализована для упрощения выборок (кажется, это просто пояснение колонки profit).&lt;/em&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://lh6.googleusercontent.com/zsGgVW52RSU0yxrR0SNaf9WwGgtOWKbXoExIuYLoQ7NzPwcKVOT-MhS7nGdYvb7w0sXrQ2Dq-iqMdZtATKL7sfrQZT69_8vVjsLT5QK2k0cZfz93nwNEJVvAM5w7oIWKNSvq2_uV&quot; width=&quot;505&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Задача&lt;/strong&gt;:&lt;/p&gt;
  &lt;p&gt;получить топ-10 по прибыльности операций за текущий день в разрезе категорий.&lt;/p&gt;
  &lt;h2&gt;&lt;strong&gt;Решение&lt;/strong&gt;:&lt;/h2&gt;
  &lt;p&gt;Сначала нужно закрепить названия за таблицами, так как в первичных данных этого нет.&lt;/p&gt;
  &lt;p&gt;Допустим, что:&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;справочник категорий - categories_table,&lt;/li&gt;
    &lt;li&gt;справочник сущностей - items_table,&lt;/li&gt;
    &lt;li&gt;таблица записи операций - operations_table.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;Теперь нам нужна база данных, чтобы проверять на ней наши запросы. Я использую MariaDB. Insert code:&lt;/p&gt;
  &lt;pre&gt;/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=&amp;#x27;NO_AUTO_VALUE_ON_ZERO&amp;#x27; */;

-- Дамп структуры для таблица reclama_guru.categories_table
CREATE TABLE IF NOT EXISTS &amp;#x60;categories_table&amp;#x60; (
  &amp;#x60;id&amp;#x60; int(11) DEFAULT NULL,
  &amp;#x60;name&amp;#x60; varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Дамп данных таблицы reclama_guru.categories_table: ~3 rows (приблизительно)
/*!40000 ALTER TABLE &amp;#x60;categories_table&amp;#x60; DISABLE KEYS */;
INSERT INTO &amp;#x60;categories_table&amp;#x60; (&amp;#x60;id&amp;#x60;, &amp;#x60;name&amp;#x60;) VALUES
	(1, &amp;#x27; Category 1&amp;#x27;),
	(2, &amp;#x27; Category 2&amp;#x27;),
	(3, &amp;#x27; Category 3&amp;#x27;),
  (4, &amp;#x27; Category 4&amp;#x27;);

/*!40000 ALTER TABLE &amp;#x60;categories_table&amp;#x60; ENABLE KEYS */;

-- Дамп структуры для таблица reclama_guru.items_table
CREATE TABLE IF NOT EXISTS &amp;#x60;items_table&amp;#x60; (
  &amp;#x60;id&amp;#x60; int(11) DEFAULT NULL,
  &amp;#x60;category_id&amp;#x60; int(11) DEFAULT NULL,
  &amp;#x60;name&amp;#x60; varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

-- Дамп данных таблицы reclama_guru.items_table: ~3 rows (приблизительно)
/*!40000 ALTER TABLE &amp;#x60;items_table&amp;#x60; DISABLE KEYS */;
INSERT INTO &amp;#x60;items_table&amp;#x60; (&amp;#x60;id&amp;#x60;, &amp;#x60;category_id&amp;#x60;, &amp;#x60;name&amp;#x60;) VALUES
	(1, 1, &amp;#x27;Item 100001&amp;#x27;),
	(2, 1, &amp;#x27;Item 100002&amp;#x27;),
	(3, 2, &amp;#x27;Item 100003&amp;#x27;),
  (4, 5, &amp;#x27;Item 100004&amp;#x27;),
  (5, 3, &amp;#x27;Item 100005&amp;#x27;);
/*!40000 ALTER TABLE &amp;#x60;items_table&amp;#x60; ENABLE KEYS */;

-- Дамп структуры для таблица reclama_guru.operations_table
CREATE TABLE IF NOT EXISTS &amp;#x60;operations_table&amp;#x60; (
  &amp;#x60;id&amp;#x60; int(11) DEFAULT NULL,
  &amp;#x60;date_time&amp;#x60; datetime DEFAULT NULL,
  &amp;#x60;item_id&amp;#x60; int(11) DEFAULT NULL,
  &amp;#x60;cost&amp;#x60; float DEFAULT NULL,
  &amp;#x60;revenue&amp;#x60; float DEFAULT NULL,
  &amp;#x60;profit&amp;#x60; float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Дамп данных таблицы reclama_guru.operations_table: ~3 rows (приблизительно)
/*!40000 ALTER TABLE &amp;#x60;operations_table&amp;#x60; DISABLE KEYS */;
INSERT INTO &amp;#x60;operations_table&amp;#x60; (&amp;#x60;id&amp;#x60;, &amp;#x60;date_time&amp;#x60;, &amp;#x60;item_id&amp;#x60;, &amp;#x60;cost&amp;#x60;, &amp;#x60;revenue&amp;#x60;, &amp;#x60;profit&amp;#x60;) VALUES
	(1,&amp;#x27;2018-04-18 0:00:01&amp;#x27;,1,3.5,10,6.5),
(2,&amp;#x27;2018-04-18 0:00:01&amp;#x27;,1,3.8,9.8,6.0),
  (3,&amp;#x27;2018-04-18 0:00:02&amp;#x27;,3,5,4.9,-0.1),
  (4,&amp;#x27;2018-04-18 0:00:02&amp;#x27;,3,8,12,4.0),
  (5,&amp;#x27;2018-04-18 0:00:01&amp;#x27;,2,2,9.5,7.5),
  (6,&amp;#x27;2018-04-18 0:00:01&amp;#x27;,2,8,9.2,1.2),
  (7,&amp;#x27;2018-04-18 0:00:02&amp;#x27;,8,12,4.7,-7.3),
  (8,&amp;#x27;2018-04-18 0:00:04&amp;#x27;,1,3,3.4,0.4),
  (9,&amp;#x27;2018-04-18 0:00:01&amp;#x27;,1,0,9,9.0),
  (10,&amp;#x27;2018-04-17 0:00:02&amp;#x27;,2,4.3,1.2,-3.1),
  (11,&amp;#x27;2018-04-18 0:00:01&amp;#x27;,2,7.7,4.1,-3.6),
  (13,&amp;#x27;2018-04-18 0:00:02&amp;#x27;,3,0.3,9,8.7),
  (14,&amp;#x27;2018-04-19 0:00:02&amp;#x27;,9,5,7,2.0);

/*!40000 ALTER TABLE &amp;#x60;operations_table&amp;#x60; ENABLE KEYS */;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, &amp;#x27;&amp;#x27;) */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

&lt;/pre&gt;
  &lt;p&gt;Далее определимся с итоговой выгрузкой, а именно ее видом. Нам точно понадобиться название и, для перестраховки, айди категории, прибыльность (profit), дата и время проведения операции и айди той самой операции, что бы если что восстановить все данные о ней.&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://lh6.googleusercontent.com/bvlJdIA8RxZnflolLlY3ZG2lrBthn8VZVxCwG9jI9Fz4tTT6Pv4LmNZUrkRKj5nXJ1qjyqAzc3G16JghSCmi6GCjeHcZTQiqXMszDC17i6R2fKmdXsiUXHEF7BXA2ck_hseqSr2C&quot; width=&quot;602&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Подготовка на этом закончена, пора и код писать.&lt;/p&gt;
  &lt;p&gt;Основа кода здесь это соединение 3х таблиц. Я выбрала inner join для справочников, поскольку нам нужны только те категории, в которых прописаны сущности и наоборот. Для соединения с таблицей операций я использовала left join, поскольку операции без категорий тоже могут быть полезны при анализе. В случае если такие появлялись в выборке, они помечались как &amp;#x27;no_catagory&amp;#x27; и считались отдельной категорией.&lt;/p&gt;
  &lt;p&gt;Для выборки топ 10, я использовала функцию row_number() с сортировкой по прибыли и выбрала только те строки, где значение было ниже 10.&lt;/p&gt;
  &lt;p&gt;Вот и все . Никакой магии.&lt;/p&gt;
  &lt;pre&gt;select id as transaction_id, coalesce(category,&amp;#x27;no_catagory&amp;#x27;) as category_name, item_id, date_time, profit, top
from
(select *,
row_number() over (partition by category order by profit desc) as top
from
(select *
from operations_table
where date(date_time)=date(&amp;#x27;2018-04-18&amp;#x27;))a
left join
(select a.name as category,a.id as category_id, b.id as item_id from
(select * from categories_table)a
inner join
(select * from items_table)b
on a.id=b.category_id
group by a.name,a.id,b.id)b
using(item_id))a where top&amp;lt;=10
group by id,category, item_id, date_time, profit, top
order by category_name, top

&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Задача на статистику:&lt;/h2&gt;
  &lt;p&gt;Представлено 200 измерений (первые 200 строк), каждое содержит значение 5 признаков(A,B,C,D,E) и 1 показатель (R).&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;http://dl4.joxi.net/drive/2018/05/24/0021/3146/1432650/50/b62f95e2c1.png&quot; width=&quot;607&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Задача:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;1. построить модель зависимости показателя от признаков (подсказка: не все из признаков могут влиять на показатель),&lt;/p&gt;
  &lt;p&gt;2. предсказать значение показателя на основе значений признаков для последних 10 строк.&lt;/p&gt;
  &lt;h2&gt;Решение:&lt;/h2&gt;
  &lt;p&gt;Для начала посмотрим, чем это можно решать.&lt;/p&gt;
  &lt;p&gt;Первое, что приходит в голову, кончено же, excel, а точнее google spreadsheets. Для них есть хороший пакет &lt;strong&gt;XLMiner Analysis ToolPak &lt;/strong&gt;с полным набором всякой аналитической всячины. Тут тебе и регрессии, и Anova, и вообще много чего. Но как и всякий пакет на таблицы, эта штука работает сложно и поверить ей - не самое легкое дело.&lt;/p&gt;
  &lt;p&gt;По результатам не долгих игр с линейной регрессией, кажется будто влияют на показатель данные из B,D,E.&lt;/p&gt;
  &lt;p&gt;Тут не выдержало мое сердечко трудностей использования excel, и мы переходим к Python.&lt;/p&gt;
  &lt;p&gt;В основном я пользовалась статьей о множественной регрессии с &lt;a href=&quot;https://habr.com/post/206306/&quot; target=&quot;_blank&quot;&gt;Хабра&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;Итак мы смотрим на корреляцию показателей.&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;http://dl3.joxi.net/drive/2018/05/25/0030/0356/2023780/80/29d0ba2b7e.png&quot; width=&quot;440&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Тут явно видно, что B и D имеют хоть какой то вес и влияние. В принципе, E тоже ничего, но маловато. Посмотрим через тепловую карту.&lt;/p&gt;
  &lt;p&gt;И снова с R сильно коррелируют B и D. Далее все вычисления производились в Ipython notebook: &lt;a href=&quot;https://github.com/anyvachana/Guru/tree/master&quot; target=&quot;_blank&quot;&gt;проект в Git&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;В итоге победила KNeighborsRegressor модель. Предсказанные значения R:&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;http://dl3.joxi.net/drive/2018/06/08/0030/0356/2023780/80/1066bfef5d.png&quot; width=&quot;812&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Задача на логику:&lt;/h2&gt;
  &lt;p&gt;Василий каждый день приходит на работу в офис. Каждый раз когда Василий заходит в свой кабинет в офисе раздаётся звук кукушки, оповещающий сотрудников о начале рабочего дня.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Задача&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;Является ли приход Василия на работу причиной звука кукушки?&lt;/li&gt;
    &lt;li&gt;Как можно доказать наличие или отсутствие причинно-следственной связи?&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2&gt;Решение:&lt;/h2&gt;
  &lt;p&gt;Итак, у нас есть событие A - появление Василия в офисе с целью немного поработать, и событие B - крик пушки - кукушки.&lt;/p&gt;
  &lt;p&gt;Возможно, Василий и есть кукушка?&lt;/p&gt;
  &lt;p&gt;Так или иначе, для доказательства связи между событиями, нам нужно определить есть ли ситуации, когда кукушка выполняет свой долг без Василия или, может, Василий пришел на работу раньше и кукушка сработала до срока?&lt;/p&gt;
  &lt;p&gt;Получив дополнительные данные можно было бы воспользоваться методом сопутствующих изменений.&lt;/p&gt;
  &lt;blockquote&gt;&lt;strong&gt;Метод сопутствующих изменений &lt;/strong&gt;заключается в том, что, если какое-либо отдельно взятое явление изменяется каждый раз при изменении другого явления, с определенной степенью вероятности можно предположить, что второе явление влечет изменение первого и, следовательно, они находятся в причинной взаимозависимости.&lt;/blockquote&gt;
  &lt;p&gt;Однако, на данный момент, взаимосвязь между событиями кажется очевидной, но невозможно утверждать является ли событие A следствием или причиной события B.&lt;/p&gt;

</content></entry></feed>