{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

Lehtikauppiaan ongelma

\n", "\n", "Lehtikauppias on tilastoinut iltapäivälehden kysyntää. Kysyntä vaihtelee jonkin verran viikonpäivän \n", "mukaan. Lehtikauppias on laskenut tilaston perusteella kunkin viikonpäivän kysynnälle keskiarvon \n", "ja keskihajonnan. Tietyn viikonpäivän kysynnän voidaan olettaa noudattavan normaalijakaumaa.\n", "\n", "Lehtikauppiaan täytyy ilmoittaa etukäteen tilattavien lehtien lukumäärä. Lehtikauppias pyrkii\n", "tietenkin tyydyttämään kysynnän mahdollisimman hyvin ja toisaalta hankkimaan itselleen \n", "mahdollisimman korkean voiton. Simulointimallissa simuloidaan kysynnän määriä normaalijakaumasta ja lasketaan simulaatiokierrosten tilastolliset tunnusluvut voitolle ja puuttuvien lehtien määrälle.\n", "\n", "Lehtikauppias voisi solmia nk. palautussopimuksen, jolloin myymättömistä lehdistä saa täyden \n", "hyvityksen lehtitalolta. Tässä tapauksessa lehden hinta on kauppiaalle korkeampi. Simulointimallissa on laskettu voiton tunnusluvut myös palautussopimusta käyttäen." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Palautus, 510) 331.468966\n", "(Ei palautusta, 510) 366.008184\n", "(Ilman lehteä, 510) 25.208100\n", "(Palautus, 520) 335.184920\n", "(Ei palautusta, 520) 368.698080\n", "(Ilman lehteä, 520) 20.028000\n", "(Palautus, 530) 338.061900\n", "(Ei palautusta, 530) 370.035600\n", "(Ilman lehteä, 530) 15.319300\n", "(Palautus, 540) 340.713090\n", "(Ei palautusta, 540) 371.009160\n", "(Ilman lehteä, 540) 11.460100\n", "(Palautus, 550) 342.851998\n", "(Ei palautusta, 550) 371.156952\n", "(Ilman lehteä, 550) 8.321900\n", "(Palautus, 560) 343.883463\n", "(Ei palautusta, 560) 369.519612\n", "(Ilman lehteä, 560) 5.877200\n", "(Palautus, 570) 345.022396\n", "(Ei palautusta, 570) 368.055504\n", "(Ilman lehteä, 570) 4.184500\n", "(Palautus, 580) 346.469060\n", "(Ei palautusta, 580) 367.087440\n", "(Ilman lehteä, 580) 2.886600\n", "(Palautus, 590) 346.997623\n", "(Ei palautusta, 590) 364.639452\n", "(Ilman lehteä, 590) 1.811700\n", "dtype: float64" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "TOISTOJA = 10000 #simulointikierrosten lukumäärä\n", "KESKIARVO = 520 #päivämyynnin keskiarvo\n", "KESKIHAJONTA = 50 #päivämyynnin keskihajonta\n", "OSTOHINTA_EI_PALAUTUSTA = 0.25\n", "OSTOHINTA_PALAUTUS = 0.33\n", "MYYNTIHINTA = 1\n", "yhteenveto = pd.DataFrame()\n", "\n", "for tilaus in range(510, 600, 10):\n", " kysyntä = np.random.normal(loc = KESKIARVO, scale = KESKIHAJONTA, size = TOISTOJA)\n", " kysyntä = np.round(kysyntä)\n", "\n", " myynti = (kysyntä > tilaus) * tilaus + (kysyntä <= tilaus) * kysyntä\n", "\n", " voitto_palautus = myynti * (MYYNTIHINTA-OSTOHINTA_PALAUTUS)\n", "\n", " voitto_ei_palautusta = myynti * (MYYNTIHINTA - OSTOHINTA_EI_PALAUTUSTA) - (tilaus-myynti) * OSTOHINTA_PALAUTUS \n", " \n", " ilman_lehteä = kysyntä - myynti\n", "\n", " yhteenveto['Palautus', tilaus] = voitto_palautus\n", " yhteenveto['Ei palautusta', tilaus] = voitto_ei_palautusta\n", " yhteenveto['Ilman lehteä', tilaus] = ilman_lehteä \n", "\n", "yhteenveto.mean() #voittojen ja ilman lehteä jääneiden keskiarvot eri tapauksissa" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
('Palautus', 510) ('Ei palautusta', 510) ('Ilman lehteä', 510) ('Palautus', 520) ('Ei palautusta', 520) ('Ilman lehteä', 520) ('Palautus', 530) ('Ei palautusta', 530) ('Ilman lehteä', 530) ('Palautus', 540) ('Ei palautusta', 540) ('Ilman lehteä', 540) ('Palautus', 550) ('Ei palautusta', 550) ('Ilman lehteä', 550) ('Palautus', 560) ('Ei palautusta', 560) ('Ilman lehteä', 560) ('Palautus', 570) ('Ei palautusta', 570) ('Ilman lehteä', 570) ('Palautus', 580) ('Ei palautusta', 580) ('Ilman lehteä', 580) ('Palautus', 590) ('Ei palautusta', 590) ('Ilman lehteä', 590)
count100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000
mean3313662533536920338370153413711134337183443706345368434636733473652
std17283220312922352624382226421928451629471330491131509
min225195020616102281920216170021216102061480214158020914602181570
25%326357032635403263500326348032634403253390325336032633303263310
50%3423821034839013483870348383034838003483760348372034837003483670
75%3423824434839034355398233624051436841233714140371410037140703714030
max342382188348390208355398194362405164368412145375420134382428148389435129395442129
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yhteenveto.describe().style.format('{:.0f}') #tarkempi analyysi eri tapauksista" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "nbformat": 4, "nbformat_minor": 2 }