{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#Snippets and Programs from Chapter 3: Describing Data with Statistics" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean donation over the last 12 days is 477.75\n" ] } ], "source": [ "#P62: Calculating the mean\n", "'''\n", "Calculating the mean\n", "'''\n", "def calculate_mean(numbers):\n", " s = sum(numbers)\n", " N = len(numbers)\n", " # calculate the mean\n", " mean = s/N\n", " return mean\n", "if __name__ == '__main__':\n", " donations = [100, 60, 70, 900, 100, 200, 500, 500, 503, 600, 1000, 1200]\n", " mean = calculate_mean(donations)\n", " N = len(donations)\n", " print('Mean donation over the last {0} days is {1}'.format(N, mean))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Median donation over the last 12 days is 500.0\n" ] } ], "source": [ "#P63: Calculating the median\n", "'''\n", "Calculating the median\n", "'''\n", "def calculate_median(numbers):\n", " N = len(numbers)\n", " numbers.sort()\n", "\n", " # find the median\n", " if N % 2 == 0:\n", " # if N is even\n", " m1 = N/2\n", " m2 = (N/2) + 1\n", " # convert to integer, match position\n", " m1 = int(m1) - 1\n", " m2 = int(m2) - 1\n", " median = (numbers[m1] + numbers[m2])/2\n", " else:\n", " m = (N+1)/2\n", " # convert to integer, match position\n", " m = int(m) - 1\n", " median = numbers[m]\n", " return median\n", "\n", "if __name__ == '__main__':\n", " donations = [100, 60, 70, 900, 100, 200, 500, 500, 503, 600, 1000, 1200]\n", " median = calculate_median(donations)\n", " N = len(donations)\n", " print('Median donation over the last {0} days is {1}'.format(N, median))\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#P66/67: Example of calculating the mode\n", ">>> simplelist = [4, 2, 1, 3, 4]\n", ">>> from collections import Counter\n", ">>> c = Counter(simplelist)\n", ">>> mode = c.most_common(1)\n", ">>> mode\n", ">>> mode[0]\n", ">>> mode[0][0]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The mode of the list of numbers is: 9\n" ] } ], "source": [ "#P67: Calculating the mode\n", "'''\n", "Calculating the mode\n", "'''\n", "from collections import Counter\n", "def calculate_mode(numbers):\n", " c = Counter(numbers)\n", " mode = c.most_common(1)\n", " return mode[0][0]\n", "\n", "if __name__=='__main__':\n", " scores = [7,8,9,2,10,9,9,9,9,4,5,6,1,5,6,7,8,6,1,10]\n", " mode = calculate_mode(scores)\n", " print('The mode of the list of numbers is: {0}'.format(mode))\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The mode(s) of the list of numbers are:\n", "4\n", "5\n" ] } ], "source": [ "#P68: \n", "\n", "'''\n", "Calculating the mode when the list of numbers may have multiple modes\n", "'''\n", "from collections import Counter\n", "def calculate_mode(numbers):\n", " c = Counter(numbers)\n", " numbers_freq = c.most_common()\n", " max_count = numbers_freq[0][1]\n", " modes = []\n", " for num in numbers_freq:\n", " if num[1] == max_count:\n", " modes.append(num[0])\n", " return modes\n", "if __name__ == '__main__':\n", " scores = [5, 5, 5, 4, 4, 4, 9, 1, 3]\n", " modes = calculate_mode(scores)\n", " print('The mode(s) of the list of numbers are:')\n", " for mode in modes:\n", " print(mode)\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number\tFrequency\n", "9\t5\n", "6\t3\n", "1\t2\n", "5\t2\n", "7\t2\n", "8\t2\n", "10\t2\n", "2\t1\n", "4\t1\n" ] } ], "source": [ "#P69: Frequency table\n", "'''\n", "Frequency table for a list of numbers\n", "'''\n", "from collections import Counter\n", "def frequency_table(numbers):\n", " table = Counter(numbers)\n", " print('Number\\tFrequency')\n", " for number in table.most_common():\n", " print('{0}\\t{1}'.format(number[0], number[1]))\n", "\n", "if __name__=='__main__':\n", " scores = [7, 8, 9, 2, 10, 9, 9, 9, 9, 4, 5, 6, 1, 5, 6, 7, 8, 6, 1, 10]\n", " frequency_table(scores)\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number\tFrequency\n", "1\t2\n", "2\t1\n", "4\t1\n", "5\t2\n", "6\t3\n", "7\t2\n", "8\t2\n", "9\t5\n", "10\t2\n" ] } ], "source": [ "#P70: Frequency table with the numbers sorted\n", "\n", "'''\n", "Frequency table for a list of numbers\n", "Enhanced to display the table sorted by the numbers\n", "'''\n", "from collections import Counter\n", "def frequency_table(numbers):\n", " table = Counter(numbers)\n", " numbers_freq = table.most_common()\n", " numbers_freq.sort()\n", "\n", " print('Number\\tFrequency')\n", " for number in numbers_freq:\n", " print('{0}\\t{1}'.format(number[0], number[1]))\n", "\n", "if __name__ == '__main__':\n", " scores = [7,8,9,2,10,9,9,9,9,4,5,6,1,5,6,7,8,6,1,10]\n", " frequency_table(scores)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Lowest: 60 Highest: 1200 Range: 1140\n" ] } ], "source": [ "#P72\n", "\n", "'''\n", "Find the range\n", "'''\n", "def find_range(numbers):\n", " lowest = min(numbers)\n", " highest = max(numbers)\n", " # find the range\n", " r = highest-lowest\n", " return lowest, highest, r\n", "if __name__ == '__main__':\n", " donations = [100, 60, 70, 900, 100, 200, 500, 500, 503, 600, 1000, 1200]\n", " lowest, highest, r = find_range(donations)\n", " print('Lowest: {0} Highest: {1} Range: {2}'.format(lowest, highest, r))\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Lowest: 60 Highest: 1200 Range: 1140\n" ] } ], "source": [ "\n", "\n", "'''\n", "Find the range using a dictionary to return values, Appendix B\n", "'''\n", "def find_range(numbers):\n", " lowest = min(numbers)\n", " highest = max(numbers)\n", " # find the range\n", " r = highest-lowest\n", " return {'lowest':lowest, 'highest':highest, 'range':r}\n", "if __name__ == '__main__':\n", " donations = [100, 60, 70, 900, 100, 200, 500, 500, 503, 600, 1000, 1200]\n", " result = find_range(donations)\n", " print('Lowest: {0} Highest: {1} Range: {2}'.\n", " format(result['lowest'], result['highest'], result['range']))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The variance of the list of numbers is 141047.35416666666\n", "The standard deviation of the list of numbers is 375.5627166887931\n" ] } ], "source": [ "#P73: Find the variance and standard deviation\n", "\n", "'''\n", "Find the variance and standard deviation of a list of numbers\n", "'''\n", "def calculate_mean(numbers):\n", " s = sum(numbers)\n", " N = len(numbers)\n", " # calculate the mean\n", " mean = s/N\n", " return mean\n", "\n", "def find_differences(numbers):\n", " # find the mean\n", " mean = calculate_mean(numbers)\n", " # find the differences from the mean\n", " diff = []\n", " \n", " for num in numbers:\n", " diff.append(num-mean)\n", " return diff\n", "def calculate_variance(numbers):\n", " # find the list of differences\n", " diff = find_differences(numbers)\n", " # find the squared differences\n", " squared_diff = []\n", " for d in diff:\n", " squared_diff.append(d**2)\n", " #find the variance\n", " sum_squared_diff = sum(squared_diff)\n", " variance = sum_squared_diff/len(numbers)\n", " return variance\n", "\n", "if __name__ == '__main__':\n", " donations = [100, 60, 70, 900, 100, 200, 500, 500, 503, 600, 1000, 1200]\n", " variance = calculate_variance(donations)\n", " print('The variance of the list of numbers is {0}'.format(variance))\n", " std = variance**0.5\n", " print('The standard deviation of the list of numbers is {0}'.format(std))\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 4\n", "2 5\n", "3 6\n" ] } ], "source": [ "#P77: How the zip() function works\n", ">>> simple_list1 = [1, 2, 3]\n", ">>> simple_list2 = [4, 5, 6]\n", ">>> for x,y in zip(simple_list1, simple_list2):\n", " print(x, y)\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# P81: Example of creating a scatter plot\n", ">>> x = [1, 2, 3, 4]\n", ">>> y = [2, 4, 6, 8]\n", ">>> import matplotlib.pyplot as plt\n", ">>> plt.scatter(x, y)\n", ">>> plt.show()\n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sum of the numbers: 5733.0\n" ] } ], "source": [ "#P84: Sum of the numbers read from a file\n", "\n", "# Find the sum of numbers stored in a file\n", "def sum_data(filename):\n", " s = 0\n", " with open(filename) as f:\n", " for line in f:\n", " s = s + float(line)\n", " print('Sum of the numbers: {0}'.format(s))\n", "\n", "if __name__ == '__main__':\n", " sum_data('mydata.txt')\n" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean: 477.75\n" ] } ], "source": [ "#P85: Calculate the mean of numbers stored in a file\n", "\n", "'''\n", "Calculating the mean of numbers stored in a file\n", "'''\n", "def read_data(filename):\n", " numbers = []\n", " with open(filename) as f:\n", " for line in f:\n", " numbers.append(float(line))\n", " return numbers\n", "\n", "def calculate_mean(numbers):\n", " s = sum(numbers)\n", " N = len(numbers)\n", " mean = s/N\n", " \n", " return mean\n", "\n", "if __name__ == '__main__':\n", " data = read_data('mydata.txt')\n", " mean = calculate_mean(data)\n", " print('Mean: {0}'.format(mean))\n" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#P86: Read a CSV file and create a scatter plot\n", "\n", "import csv\n", "import matplotlib.pyplot as plt\n", "\n", "def scatter_plot(x, y):\n", " plt.scatter(x, y)\n", " plt.xlabel('Number')\n", " plt.ylabel('Square')\n", " plt.show()\n", " \n", "def read_csv(filename):\n", " numbers = []\n", " squared = []\n", " with open(filename) as f:\n", " reader = csv.reader(f)\n", " next(reader)\n", " for row in reader:\n", " numbers.append(int(row[0]))\n", " squared.append(int(row[1]))\n", " return numbers, squared\n", "\n", "if __name__ == '__main__':\n", " numbers, squared = read_csv('numbers.csv')\n", " scatter_plot(numbers, squared)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#P77: Function to calculate the linear correlation\n", "def find_corr_x_y(x,y): \n", " n = len(x)\n", " # find the sum of the products\n", " prod = []\n", " for xi,yi in zip(x,y):\n", " prod.append(xi*yi)\n", " sum_prod_x_y = sum(prod)\n", " sum_x = sum(x)\n", " sum_y = sum(y)\n", " squared_sum_x = sum_x**2\n", " squared_sum_y = sum_y**2\n", " x_square = []\n", " for xi in x:\n", " x_square.append(xi**2)\n", " # find the sum\n", " x_square_sum = sum(x_square)\n", " y_square=[]\n", " for yi in y:\n", " y_square.append(yi**2)\n", " # find the sum\n", " y_square_sum = sum(y_square)\n", " \n", " # use formula to calculate correlation\n", " numerator = n*sum_prod_x_y - sum_x*sum_y\n", " denominator_term1 = n*x_square_sum - squared_sum_x\n", " denominator_term2 = n*y_square_sum - squared_sum_y\n", " denominator = (denominator_term1*denominator_term2)**0.5\n", " correlation = numerator/denominator\n", " \n", " return correlation\n", "\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Highest correlation: None\n" ] }, { "data": { "image/png": "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\nREQknvw//ef3H/RM6h0AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#P86/88: Calculate correlation and create a scatter plot similar to that \n", "# on Google correlate\n", "import matplotlib.pyplot as plt\n", "import csv\n", "\n", "def read_csv(filename):\n", " with open(filename) as f:\n", " reader = csv.reader(f)\n", " next(reader)\n", " summer = []\n", " highest_correlated = []\n", " for row in reader:\n", " summer.append(float(row[1]))\n", " highest_correlated.append(float(row[2]))\n", " return summer, highest_correlated\n", "\n", "if __name__ == '__main__':\n", " summer, highest_correlated = read_csv('correlate-summer.csv')\n", " corr = find_corr_x_y(summer, highest_correlated)\n", " print('Highest correlation: {0}'.format(corr))\n", " scatter_plot(summer, highest_correlated)\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Correlation coefficient: 0.3183785775683751\n" ] } ], "source": [ "#P79/80: Correlation\n", "\n", "# Find the correlation for high school grades and college admission scores\n", "if __name__=='__main__':\n", " high_school_math = [90, 92, 95, 96, 87, 87, 90, 95, 98, 96]\n", " college_admission = [85, 87, 86, 97, 96, 88, 89, 98, 98, 87]\n", " corr = find_corr_x_y(high_school_math, college_admission)\n", " print('Correlation coefficient: {0}'.format(corr))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Correlation coefficient: 0.9989633063220916\n" ] } ], "source": [ "#P79/80: Correlation\n", "\n", "# Find the correlation for high school math grades and college admission scores\n", "if __name__=='__main__':\n", " high_school_math = [83, 85, 84, 96, 94, 86, 87, 97, 97, 85]\n", " college_admission = [85, 87, 86, 97, 96, 88, 89, 98, 98, 87]\n", " corr = find_corr_x_y(high_school_math, college_admission)\n", " print('Correlation coefficient: {0}'.format(corr))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(1, 3.25), (3.25, 5.5), (5.5, 7.75), (7.75, 11)]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#P91: Create classes for grouped frequency table\n", "def create_classes(numbers, n):\n", " low = min(numbers)\n", " high = max(numbers)\n", " # Width of each class\n", " width = (high - low)/n\n", " classes = []\n", " a = low\n", " b = low + width\n", " classes = []\n", " while a < (high-width):\n", " classes.append((a, b)) \n", " a= b\n", " b = a + width\n", " # The last class may be of a size that is less than width\n", " classes.append((a, high+1))\n", " return classes\n", "\n", "create_classes([7, 8, 9, 2, 10, 9, 9, 9, 9, 4, 5, 6, 1, 5, 6, 7, 8, 6, 1, 10], 4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }