Benutzer Diskussion:Vanger/Marktanteil der Webbrowser/Tabellen und Diagramme

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

NetApplications[Quelltext bearbeiten]

Da NetApplications sehr viele verschiedene Browser erfasst und die Übersichtlichkeit leidet, gilt für die Aufnahme in diese Tabelle eine Bedingungen. Für die Erfassung muss ein Browser die Verbreitung des rechnerischen Rests der aufgenommen Browser inklusive des Aufnahmekandidaten übertreffen. Die errechneten Werte werden hierbei immer auf zwei Nachkommastellen abgerundet.

Beispiele[Quelltext bearbeiten]

September 2008: „Google Chrome“ soll aufgenommen werden[Quelltext bearbeiten]

  • 71,52 % (Internet Explorer) + 19,46 % (Mozilla Firefox) + 6,65 % (Safari) + 0,63 % (Netscape) + 0,69 % (Opera) + 0,09 % (Mozilla) = 99,04 % (Summe aufgenommener Browser)
  • 100 % - 99,04 % (Summe aufgenommener Browser) - 0,78 % (Google Chrome) = 0,18 % (Rest)
  • Ja: 0,78 % (Google Chrome) > 0,18 % (Rest)

Dezember 2008: „Opera Mini“ soll aufgenommen werden[Quelltext bearbeiten]

  • 68,15 % (Internet Explorer) + 21,34 % (Mozilla Firefox) + 7,93 % (Safari) + 0,57 % (Netscape) + 0,71 % (Opera) + 0,08 % (Mozilla) + 1,04 % (Google Chrome) = 99,82 % (Summe aufgenommener Browser)
  • 100 % - 99,82 % (Summe aufgenommener Browser) - 0,07 % (Opera Mini) = 0,11 % (Rest)
  • Nein: 0,07 % (Opera Mini) < 0,11 % (Rest)

AT Internet Institute[Quelltext bearbeiten]

Das AT Internet Institute (vormals XiTi Monitor) veröffentlichte erst ab September 2007 regelmäßig Statistiken, die auch andere Webbrowser neben Mozilla Firefox erfassen. Die Aufnahme älterer Daten ist nicht erwünscht da diese nur sehr lückenhaft und teilweise nicht als Monatsdurchschnitt sondern nur als Wochendurchschnitt, welcher teilweise zum Monatsdurchschnitt erklärt wird, vorliegt.

Beginnend mit der Browserstatistik vom März 2008 befindet sich in der Statistik von TheCounter ein Fehler der die Zugriffe seit dem 1. Februar 2008 als Basis zur Berechnung der Marktanteile nutzt. Mit Hilfe eines einfachen in PHP geschriebenen Skripts ist es möglich die Statistik von diesem Fehler zu bereinigen:

<?php

error_reporting(E_ALL);
define('START_YEAR', 2008);
define('END_MONTH', intval(date('n'))-1);
define('END_YEAR', intval(date('Y')));

class TheCounter {
    protected $document;
    protected $month;
    protected $year;

    protected $browserData = array();
    protected $browserMarketShare = array();
    protected $views = 0;

    protected $monthList = array(
        'January',
        'February',
        'March',
        'April',
        'May',
        'June',
        'July',
        'August',
        'September',
        'October',
        'November',
        'December'
    );

    public function __construct($month, $year) {
        $this->month = intval($month);
        $this->year = intval($year);
    }

    public function openDocument() {
        $file = fopen($this->getUri(), 'r');

        if($file === false) {
            echo "** fatal error\n";
            echo "can not open '".$this->getUri()."'.\n";
            echo "stopping...";
            die();
        }

        $data = '';
        $this->document = new DOMDocument();

        while(!feof($file)) {
            $data .= fread($file, 8192);
        }

        fclose($file);
        $this->document->loadHTML($data);
    }

    protected function getUri() {
        return 'http://www.thecounter.com/stats/'.$this->year.'/'.$this->monthList[$this->month - 1].'/browser.php';
    }

    public function readData() {
        $dataNodeList = $this->document->getElementsByTagName('h4')->item(0)->parentNode->childNodes->item(5)->childNodes;

        for($i = 0; $i < $dataNodeList->length; $i++) {
            $browserDataNodeList = $dataNodeList->item($i)->childNodes;

            $browserName = trim(substr($browserDataNodeList->item(0)->firstChild->firstChild->nodeValue, 3, -3));
            $browserValue = intval($browserDataNodeList->item(4)->firstChild->firstChild->nodeValue);

            $browserName = $this->checkBrowserNameException($browserName, $browserValue);

            $this->addBrowserData($browserName, $browserValue);
            $this->addViews($browserValue);
        }
    }

    protected function checkBrowserNameException($browserName, $browserValue) {
        // January 2003
        if(($this->year == 2003) && ($this->month == 1) && ($browserName == '')) {
            if($browserValue == 198167845) {
                $browserName = 'MSIE 6.x';
            }

            if($browserValue == 1370817) {
                $browserName = 'Netscape 6.x';
            }
        }

        // January 2005
        if(($this->year == 2005) && ($this->month == 1) && ($browserName == '')) {
            $browserName = 'FireFox';
        }

        // Netscape compatible
        if(($browserName == 'Netscape comp.') || ($browserName == 'Unknown Netscape compatible')) {
            $browserName = 'MSIE';
        }

        return $browserName;
    }

    protected function addBrowserData($browserName, $browserValue) {
        $browserFamily = $this->getBrowserFamily($browserName);
        if(is_null($browserFamily)) return;

        if(isset($this->browserData[$browserFamily])) {
            $this->browserData[$browserFamily] += $browserValue;
        } else {
            $this->browserData[$browserFamily] = $browserValue;
        }
    }

    protected function getBrowserFamily($browserName) {
        switch($browserName) {
            case 'Internet Explorer 5.x':
            case 'Internet Explorer 4.x':
            case 'Internet Explorer 3.x':
            case 'Internet Explorer 2.x':
            case 'Internet Explorer 1.x':
            case 'MSIE 7.x':
            case 'MSIE 6.x':
            case 'MSIE 5.x':
            case 'MSIE 4.x':
            case 'MSIE 3.x':
            case 'MSIE 2.x':
            case 'MSIE 1.x':
            case 'MSIE':
                return 'Internet Explorer';

            case 'Netscape 7.x':
            case 'Netscape 6.x':
            case 'Netscape 5.x':
            case 'Netscape 4.x':
            case 'Netscape 3.x':
            case 'Netscape 2.x':
            case 'Netscape 1.x':
                return 'Netscape';

            case 'Mozilla':
            case 'Mozilla 5.x':
                return 'Mozilla';

            case 'FireFox':
                return 'Mozilla Firefox';

            case 'Opera x.x':
                return 'Opera';

            case 'Safari':
                return 'Safari';

            case 'Konqueror':
                return 'Konqueror';

            case '':
            case 'Unknow':
            case 'Unknown':
                return null;

            default:
                echo "** fatal error\n";
                echo "unknown browser family of '".$browserName."'.\n";
                echo "stopping...";
                die();
        }
    }

    protected function addViews($views) {
        $this->views += $views;
    }

    public function calcBrowserMarketShare() {
        foreach($this->browserData as $family => $value) {
            $this->browserMarketShare[$family] = (100 / $this->views * $value);
        } 
    }

    public function getViews() {
        return $this->views;
    }

    public function getBrowserData() {
        return $this->browserData;
    }

    public function getBrowserMarketShare() {
        return $this->browserMarketShare;
    }

    public function adjustViewsDown($adjust) {
        $this->views -= $adjust;
    }

    public function adjustBrowserDataDown($browserFamily, $adjust) {
        if(isset($this->browserData[$browserFamily])) {
            $this->browserData[$browserFamily] -= $adjust;
        }
    }
}

$objects = array();
$marketShare = array();
$familys = array();

for($year = START_YEAR; $year <= END_YEAR; $year++) {
    for($month = 1; $month <= 12; $month++) {
        if(($year == END_YEAR) && ($month == END_MONTH)) break;

        $objects[$year][$month] = new TheCounter($month, $year);
        $objects[$year][$month]->openDocument();
        $objects[$year][$month]->readData();

        if((($year >= 2008) && ($month >= 3)) || ($year > 2008)) {
            $adjustObjects = $objects;
            for($adjustYear = START_YEAR; $adjustYear < 2008; $adjustYear++) {
                unset($adjustObjects[$adjustYear]);
            }
            unset($adjustObjects[2008][1]);
            unset($adjustYear);

            foreach($adjustObjects as $adjustYear => $adjustYears) {
                foreach($adjustYears as $adjustMonth => $adjustObject) {
                    if(($adjustYear == $year) && ($adjustMonth == $month)) break;

                    $objects[$year][$month]->adjustViewsDown($objects[$adjustYear][$adjustMonth]->getViews());

                    foreach($objects[$adjustYear][$adjustMonth]->getBrowserData() as $family => $value) {
                        $objects[$year][$month]->adjustBrowserDataDown($family, $value);
                    }
                }
            }
        }

        $objects[$year][$month]->calcBrowserMarketShare();

        foreach($objects[$year][$month]->getBrowserMarketShare() as $family => $value) {
            $marketShare[$year][$month][$family] = $value;

            if(array_search($family, $familys) === false) {
                $familys[] = $family;
            }
        }
    }
}

echo "<pre>\n";
echo "\"Date\"";
foreach($familys as $family) {
    echo "\t\"".$family."\"";
}
echo "\n";

for($year = START_YEAR; $year <= END_YEAR; $year++) {
    for($month = 1; $month <= 12; $month++) {
        if(($year == END_YEAR) && ($month == END_MONTH)) break;

        echo $year."-".$month."-01";

        foreach($familys as $family) {
            $familyPercent = round($marketShare[$year][$month][$family], 2);
            echo "\t".str_replace('.', ',', $familyPercent).'%';
        }

        echo "\n";
    }
}
echo "</pre>\n";

?>