From e4410b30bd73eff86e7029b7c91153291c88151e Mon Sep 17 00:00:00 2001 From: Evan Sparks Date: Wed, 9 Apr 2014 11:50:57 -0700 Subject: [PATCH] Adding lab3 and lab5 solutions. --- lab3/soln.ipynb | 71 +++ lab3/solutions.md | 255 +++++++++++ lab5/Lab 5 Answers.ipynb | 940 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 1266 insertions(+) create mode 100644 lab3/soln.ipynb create mode 100644 lab3/solutions.md create mode 100644 lab5/Lab 5 Answers.ipynb diff --git a/lab3/soln.ipynb b/lab3/soln.ipynb new file mode 100644 index 0000000..20278ad --- /dev/null +++ b/lab3/soln.ipynb @@ -0,0 +1,71 @@ +{ + "metadata": { + "name": "Untitled0" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": "%matplotlib inline\nimport pandas as pd\ndata = pd.read_csv(\"emdata-tsv (1).csv\")\n ", + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": "data.describe()\ndata.shape\ndata.Country.describe()\ndata.Type.describe()", + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 18, + "text": "count 17828\nunique 15\ntop Transport Accident\nfreq 4351\nName: Type, dtype: object" + } + ], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": "data.describe()", + "language": "python", + "metadata": {}, + "outputs": [ + { + "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
StartEndDurationKilledCostAffectedColumn 12
count 17828.000000 17828.000000 17828.000000 13996.000000 1.108500e+04 3772.000000 0
mean 1990.883049 1990.918387 0.035338 2718.355173 5.586713e+05 488.759659NaN
std 17.851370 17.836943 0.302913 75162.832728 6.951056e+06 3384.235083NaN
min 1900.000000 1900.000000 0.000000 1.000000 1.000000e+00 0.003000NaN
25% 1986.000000 1986.000000 0.000000 12.000000 6.000000e+01 5.000000NaN
50% 1996.000000 1996.000000 0.000000 24.000000 1.000000e+03 35.000000NaN
75% 2003.000000 2003.000000 0.000000 57.000000 1.975000e+04 200.000000NaN
max 2008.000000 2009.000000 9.000000 5000000.000000 3.000000e+08 125000.000000NaN
\n

8 rows \u00d7 7 columns

\n
", + "metadata": {}, + "output_type": "pyout", + "prompt_number": 19, + "text": " Start End Duration Killed Cost \\\ncount 17828.000000 17828.000000 17828.000000 13996.000000 1.108500e+04 \nmean 1990.883049 1990.918387 0.035338 2718.355173 5.586713e+05 \nstd 17.851370 17.836943 0.302913 75162.832728 6.951056e+06 \nmin 1900.000000 1900.000000 0.000000 1.000000 1.000000e+00 \n25% 1986.000000 1986.000000 0.000000 12.000000 6.000000e+01 \n50% 1996.000000 1996.000000 0.000000 24.000000 1.000000e+03 \n75% 2003.000000 2003.000000 0.000000 57.000000 1.975000e+04 \nmax 2008.000000 2009.000000 9.000000 5000000.000000 3.000000e+08 \n\n Affected Column 12 \ncount 3772.000000 0 \nmean 488.759659 NaN \nstd 3384.235083 NaN \nmin 0.003000 NaN \n25% 5.000000 NaN \n50% 35.000000 NaN \n75% 200.000000 NaN \nmax 125000.000000 NaN \n\n[8 rows x 7 columns]" + } + ], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": "print data.Killed.groupby(data.Type).sum().order()", + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Type\nWildfire 3287\nMass movement dry 4919\nIndustrial Accident 49797\nMass movement wet 55040\nMiscellaneous accident 58121\nVolcano 95979\nExtreme temperature 108938\nTransport Accident 201053\nStorm 1373104\nEarthquake (seismic activity) 2311491\nComplex Disasters 5610000\nFlood 6911040\nEpidemic 9555059\nDrought 11708271\nInsect infestation NaN\ndtype: float64\n" + } + ], + "prompt_number": 23 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/lab3/solutions.md b/lab3/solutions.md new file mode 100644 index 0000000..be53008 --- /dev/null +++ b/lab3/solutions.md @@ -0,0 +1,255 @@ +# Automated Data Cleaning with OpenRefine and Exploratory Data Analysis + +So far in this class, we've looked at command-line data cleaning with UNIX utilities, and a bit of structured data analysis with Pandas. +In Homework 1, you're looking at a Data Integration problem - namely, entity resolution. +As we've seen already, data cleaning is an unpleasant, often repetitive task. +Fortunately, there are a number of modern tools that make this task easier, one of which we'll look at today using an example dataset. + +Once your data is cleaned and integrated, you'll want to start the process of *analyzing* it. +One good way to start an analysis is using a family of techniques collectively referred to as *Exploratory Data Analysis*. +Once we've cleaned up our sample dataset, we'll look at a few of these techniques and see if they help suggest hypotheses we may want to test with the data. + +## Getting The Dataset + +We'll be working with a dataset that contains a record of natural disasters worldwide since 1900. It contains information about when a disaster happened, what kind of disaster, where in the world it was, and how many people were affected or killed by it, in addition to estimated cost. + +On your VM, go [here](http://www.infochimps.com/datasets/disasters-worldwide-from-1900-2008) and download and unzip the dataset to a new folder in your home directory, called "datasets". If you download with Firefox, the file will be saved to ~/Downloads. When your'e done, you should have a directory that looks something like this. + + saasbook@saasbook:~/datasets/infochimps_dataset_12691_download_16174$ ls -altr + total 1644 + -rw------- 1 saasbook saasbook 3730 2010-02-09 14:50 SCHEMA.txt + -rw-r--r-- 1 saasbook saasbook 908 2010-02-09 14:50 README-infochimps + -rw-r--r-- 1 saasbook saasbook 7821 2010-02-09 14:50 infochimps_dataset_12691_download_16174.icss.yaml + -rw------- 1 saasbook saasbook 1656312 2010-02-09 14:50 emdata.tsv + drwxrwxr-x 3 saasbook saasbook 4096 2014-02-23 17:18 .. + drwxrwxr-x 2 saasbook saasbook 4096 2014-02-23 17:18 . + +## Installing OpenRefine + +[OpenRefine](http://openrefine.org/) (formerly Google Refine) is an open source tool to automate data cleaning on small to medium datasets and works well on datasets that are up to a few hundred thousand rows. + +It contains several advanced features for data cleaning - some of which we'll use, but many of which we won't touch. You'll notice that the branding and filenames still say Google on them - this will change in version 2.6, which is currently in beta. + +Download OpenRefine to your VM and launch it (you'll need to install the java runtime first): + + sudo apt-get install openjdk-7-jre-headless + mkdir ~/refine/ + cd ~/refine/ + wget https://github.com/OpenRefine/OpenRefine/releases/download/2.5/google-refine-2.5-r2407.tar.gz + tar zxvf google-refine-2.5-r2407.tar.gz + ./google-refine-2.5-r2407/refine + +This whole process will take a few minutes, so while it's running, let's watch an [intro video](http://www.youtube.com/watch?v=B70J_H_zAWM). + +Once that's done, you can open your web browser and navigate to http://127.0.0.1:3333/ to access the tool. + +## Importing The Dataset + +OpenRefine supports importing data in several formats, but luckily our file is already a well formatted data table. +Loading it up should be no problem! + +From the "Create Project" tab, select 'Choose Files' and select the file 'emdata.tsv' from the directory that contains your dataset. + +OpenRefine will show you a preview of your dataset - it should look ok, so select 'Create Project'. + +### DIY + +1. Import the file "emdata.tsv" from the InfoChimps data directory into OpenRefine. There's a "Create Project" button when you're done. + + +## Facets and Filters + +The workflow in OpenRefine is observe, filter, change, repeat. +A central concept in the system is the idea of a "Facet". +You can think of a facet as a knob you get to play with to determine which data rows to show. +This knob is conditioned on data in one ore more columns. +These knobs can be combine to form complex filters on your dataset. + +Once data is selected, you can edit it *en masse*. If there's a transformation you want to apply, you can apply it to all the data that matches the current selection. + +Importantly, once you've selected items within a facet, any changes you make are only applied to the current selection! + +OpenRefine has several facet types. Click the arrow above "Type" and select "Text Facet" from the "Facets" menu. + +A new facet will appear on the left - with a bunch of disease types in it. Click on a few and observe what happens in the main screen. +When you're done with it, click "Reset" in the facet. + +Do you notice anything unusual about the items on this list? (Duplicates?) + +### DIY +1. Create a Text Facet for the "Type" field. **SOLUTION**: *Click the arrow next to 'Type', then click Facet -> Text Facet* +2. Change the sort order from name to "Count" - what is the most common type of disaster? **SOLUTION**: *In the filter that shows up, select 'Sort by: Count'. Transport Accident should be most common.* + +## Cleaning Text Data + +As we saw with our text facet, there's dirty data here! +But, how do we use the tool to clean this up? +There are a number of ways to clean text data in OpenRefine. We'll cover two common ways. + +*If you make a mistake, don't worry, OpenRefine keeps a full history of everything you've done - you can always go back and undo changes that were wrong.* + +### Direct Editing in Facet +For common one-off cases, as in the case of typos or case mismatch issues like the one we saw above, we can just edit those values directly. +Click "Edit" next to "Mass Movement Wet" on the left side - we want to assign this to the more common case "Mass movement wet". +In this case, simply changing the string suffices. +Look at the count of "Mass movement wet" in the type facet - it's gone up! +This is because the values have now been merged. + +### Cluster Editing +This kind of manual editing can get pretty tedious, even if you're updating hundreds of rows at once. +Also, it introduces the possibility for human error - what if "Mass movement wet" had been written "Bass movement wet" - we likely never would have caught this. + +Luckily, OpenRefine offers a feature to address this called "Clustering" - click the "Cluster" button above the Type facet to start this feature. If cluster doesn't show anything, try again after clicking "reset" on the + +It automatically caught two additional duplicates in this column, and if you select all the proposals and click "Merge Selected and Close", the transformations will happen for you automatically. + +This feature is quite powerful and supports other kinds of "Clustering" functions - it even has the ability to cluster based on the way the values "sound" with phoenetic clustering - this works particularly well for the names of people or places that come from languages other than English that are then translated to English multiple ways. + +#### DIY +1. Make sure you've cleaned up the 'Type' field. **SOLUTION**: *You should clean up three clusters in the 'Type' field.* +2. Try cleaning the "Country" and "Name" fields in the same way. **SOLUTION**: *You should clean up one cluster in the 'Country' field and several (around 50) in the name field. You may have to increase a setting in your facets to cluster names.* + +## Cleaning Numeric/Date Data + +Look at the "Start" and "End" columns in the current display - they're kind of weird, aren't they? They're numbers, but they kind of look like dates. But then again, they don't have a consistent format. + +It turns out that they're not so straightforward to convert to dates - some are YYYY, some are MMDDYYYY, some MMYYYY, and some are outright errors. + +We could have refine filter these and create dates out of all of them, but for lack of time here, we're going to take a short cut and just get the years. +So, in the "Start" and "End" columns, we just want to select the last 4 characters of the column and make it a number. +But, how do we do that? + +### GREL + +Luckily, OpenRefine has its own programming language for just such a task, called Google Refine Evaluation Language - or GREL. +Thankfully, the language isn't particuarly complicated, and is pretty well described [here](http://co-synergy.com/GREL%20Quick%20Reference.pdf). +Additionally, it's possible to use Jython or Clojure to do the transformation as well, but we'll stick with GREL for the next few examples. + +### Cleaning Those Dates + +First, make sure all your facets have been reset (click "Reset All" on the left). + +Now, select the arrow next to "Start", and select "Edit Cells" -> "Transform". +Here you'll see an "Expression" input box and a preview output. +OpenRefine lets you preview the effect of your transformations on the fly. + + +In the Expression box, there is the word `value` - this is the name of the object that contains the current value of the cell being transformed. +Enter `value.length()` - the preview should show you the length of those strings. +Now try `value.slice(2)` - what happens now? + +Can you come up with an expression for the last four characters of this string? + +Finally - we want our result to be a number, but the result of `.slice()` is a string. Use `.toNumber()` to convert your final answer to a number. + +#### DIY +1. Transform the "Start" column to just the year portion of the field, using the method above. **SOLUTION**: *The expression is toNumber(value.slice(length(value)-4))* +2. Do the same for the "End" column. **SOLUTION**: *Same as above. Use the History tab instead of copying and pasting.* + +### Derived Columns + +Once you've got start and end columns as numbers, we'd like to be able to focus on records for just the really *long* natural disasters. +You could do this with a scatterplot facet (which is insanely cool, BTW), or, you could do it with a derived column. +We'll calculate a derived column that we'll call "Duration" that is the end time of the event minus the start time. + +To create a derived column, select the "End" column, select "Edit Column" -> "Add Column Based on This Column" + +In our case, we'll want a column that combines information from two columns. In the GREL expression evaluation environment, an object called `cells` is exposed. +Cells is a dictionary that allows you to look up any cell in the current row. To get a value in another column, the syntax is `cells["ColumnName"].value`. + +Given this, you should be able to create a "Duration" column. + +#### DIY +1. Create a "Duration" column which contains the difference between End and Start. **SOLUTION**: *The expression is: value - cells["Start"].value* +2. Create a facet on duration. Filter to rows which have a Duration above 2 years. What kind of disaster is most common? **SOLUTION**: *The most common disaster that lasts more than two years is 'Drought'. You can see this in the "Type" facet.* + +## Provenance, Repeatability, and External Integration + +As we mentioned, OpenRefine supports full history of everything you've done. +This is important to support an idea referred to as [data provenance](http://en.wikipedia.org/wiki/Provenance#Data_provenance) - that is, we can trace our derived data back to our base data. + +It also means that the process of transforming/cleaning the data is *repeatable*, on this dataset or a new one that looks like it. +This means we can use refine to automate a lot of this nasty data cleaning work - do it once and forget it! + +Finally, OpenRefine supports calling out to webservices as part of its cleaning process. +This means that we can pretty easily integrate data from other sources all in this tool. +More on external integration next week! + +# Exploratory Data Analysis + +Exploratory data analysis (EDA) is the process of summarizing datasets to help understand their main characteristics. +It's an approach that was championed by [John Tukey](http://en.wikipedia.org/wiki/John_Tukey) and led directly to the development of the S (and later R) programming languages, and indirectly to environments like pandas and iPython - that is, the tools you're using are *built* for EDA. + +The collection of tools used to perform EDA is large and we will cover more of them later in the class, but for today, we're going to look at two of them - summary statistics and histogramming. + +You've already seen both of these in the last class - but this time we'll go into a little more depth and see how we can can use these tools to better "get to know" our data. + +## Loading Our Cleaned Dataset + +In OpenRefine, export your dataset to a csv file using the "Export" button at the top right. +If you haven't changed your project name, it will be saved to a file called `~/Downloads/emdata-tsv.csv`. + +Now, fire up an ipython notebook with the command `ipython notebook` from the terminal. + +In a new notebook, import pandas and load your dataset. + + %matplotlib inline + import pandas as pd + data = pd.read_csv("~/Downloads/emdata-tsv.csv") + +Next, make sure you understand the basic properties of your data - its size and shape, etc. + + data.describe() + data.shape + data.Country.describe() + data.Type.describe() + +### DIY +1. Make sure you've loaded your cleaned dataset. +2. Given the output of above - what's the largest number of people killed by a single disaster? **SOLUTION**: *5000000 is the max value for Killed in the output of data.describe().* + +## Digging into Conditional Distributions +Knowing the summary statistics for our whole dataset is great, but what if we want to know summary statistics for a field by disaster type? + +Pandas makes that really easy with the split/apply/combine strategy we talked about last time. +Try the following command: + + data.Cost.groupby(data.Type).describe().unstack().sort(columns='mean') + +What have we done here? We've taken the cost column and grouped it by type. +We've then applied the summary statistics to each group and called "unstack" which just reshapes the result for us to make things a little more readable. +Finally, we've sorted by the 'mean' column - this tells us the average cost of a given disaster by type. + +At the top, we see that traffic accidents are least costly. At bottom, we see that Drought is most costly. + +### DIY +1. Come up with an expression to compute the total # of people killed by Type - which is highest? Second highest? **SOLUTION**: *Drought is highest, epidemic second highest. print data.Killed.groupby(data.Type).sum().order()* + +## Plotting Distributions and Seeing Relationships +Now let's look at some plots of our data to understand it better. We'll look at two tools here, but there are many more. + +### Box Plots +Box plots are a visual representation of the same kind of information that we saw in our descriptive statistics. +Namely, they let us look at things like mean, median, min, max, and IQR (middle 50%) of some set of data. +They also show outliers. + +Try these commands out: + + ax = data.boxplot(column='Cost', by='Type', figsize=(12,12), rot=90, grid=False) + ax.set_yscale('log') + +With these commands we're plotting cost by type and seeing the results visually. +*Note, because of the heavy skew in the data, we've plotted on a log scale.* + +### Scatter Matrixes +A scatter plot matrix is a powerful tool to help you identify relationships between pairs of columns in your dataset. + +Try this command in your notebook: + + _ = pd.scatter_matrix(data[['Cost','Killed','Affected','Duration']], figsize=(12,12)) + +Here, we're plotting the relationships between Cost, Killed, Affected, and Duration across the whole dataset. +Do you notice any patterns? + +#### DIY +1. Write down a pattern you see when looking at the dataset visually that wasn't previously evident. **SOLUTION**: *Commenting on which values seem to be discrete and which are continuous, the heavy distribution near zero but long tail of many of the scatter plots, etc, are all good observations.* diff --git a/lab5/Lab 5 Answers.ipynb b/lab5/Lab 5 Answers.ipynb new file mode 100644 index 0000000..35e8e1c --- /dev/null +++ b/lab5/Lab 5 Answers.ipynb @@ -0,0 +1,940 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#Exploring Click Logs and Testing Statistical Hypotheses\n", + "\n", + "For class today, you read a chapter on Exploratory Data Analysis from the book \"Doing Data Science.\" Today, we'll be walking through an analysis of the same data presented in that chapter and extending it with Multiple Hypothesis testing.\n", + "\n", + "## Statistical Hypothesis Testing\n", + "Hypothesis testing is a powerful tool used in statistical analysis to support claims like \"Drug X is better than Drug Y\", or \"Campers who attend a safety course led by a talking bear are effective at preventing forest fires.\" You'll see questions about whether or not an experiment was effective or results from two processes are different all over the place in your data science career.\n", + "\n", + "Hypothesis testing allows us to answer these questions with statistical rigor. Generally, we establish a \"null hypothesis\", and then conduct a test which will tell us, given the data, whether or not we can *reject* this null hypothesis. Usually, the null hypothesis is something like \"These two drugs are the *same*.\" or \"This measure's mean is no different than zero.\"\n", + "\n", + "We're going to work with one such tool, namely the Student's Two-Sample t-Test. \n", + "\n", + "### Historical Anecdote\n", + "This was not a test designed for students, instead, it was designed by a statistician William Gosset who [published](http://www.york.ac.uk/depts/maths/histstat/student.pdf) under the pseudonym \"Student,\" while working for the Guinness brewing company.\n", + "\n", + "### Back to Statistics\n", + "\n", + "Student's t-Test is used when comparing samples of normally distributed variables. This assumption of normality is important, but not strict. If the data is very much not normally distributed, a non-parameteric method (that is, distribution agnostic) like the Wilcoxon signed-rank test can be used. We are looking at Welch's t-Test, a variant of the classic Student's test which allows for two samples of different size, and possibly different variance.\n", + "\n", + "To perform a t-Test, we compute a \"t statistic\" or \"t score\" with the two samples as input, the formula is:\n", + "\n", + "$t = \\frac{mean(X_1) - mean(X_2)}{s_{X_1-X_2}}$\n", + "\n", + "where $s_{X_1-X_2} = \\sqrt{\\frac{s^2_1}{n_1} - \\frac{s^2_2}{n_2}}$, and $s_i$ is the sample standard deviation of sample $i$ and $n_i$ is the size of sample $i$.\n", + "\n", + "This score comes from a T-distribution, which looks like a normal distribution but with fatter tails. If the two samples are similar, the t-statistic will be close to 0. If they're not, the t-statistic will be high in absolute value. \n", + "\n", + "Take a moment and think about the math. Under what conditions is the statistic highest? When the means are very different and their respective sample standard deviations are very small.\n", + "\n", + "We'll use Welch's t-Test, an adaptation of the two-sample independent Student's t-test that takes into account samples that may have unequal sizes and variances (which, we can see from our distribution above, may be true in our data set!)\n", + "\n", + "Since the t-statistic comes from a statistical distribution, we can map this value to a probability of sampling that value under the null hypothesis. The probability of realizing a high t-statistic when two samples come from the same distribution is very small, thus it's p-value is also small. \n", + "\n", + "![T-stat](http://upload.wikimedia.org/wikipedia/commons/4/41/Student_t_pdf.svg)\n", + "Courtesy of Wikipedia, the probability density function for the Student's t-Distribution. V indicates the number of samples in our distribution.\n", + "\n", + "So, the output of a T-test is usually a pair of statistics, the \"t score\", and a \"p value\". The p value has a natural interpretation as a probability. We can say: \"With $100 \\times (1-p)$ percent confidence, I reject the null hypothesis that these two samples are the same.\" Meaning, that when p is very small, the two samples are statistically likely to be different.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##Lab Work\n", + "\n", + "##Setup - Install Scipy\n", + "\n", + "You'll need to install a python package to your VM using the following command at the shell: `sudo apt-get install python-scipy`\n", + "\n", + "##Setup - Data Loading\n", + "\n", + "We'll be working with a single day's worth of session log data from the New York Times website. The data is available [here](http://stat.columbia.edu/~rachel/datasets/nyt1.csv) as well as in the class github repo. The data has been nicely cleaned and aggregated for us (no janitor work!) Load up a single day's data into a `DataFrame`, and summarize it." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import pandas as pd\n", + "\n", + "data = pd.read_csv(\"nyt1.csv\")\n", + "data.describe()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "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", + "
AgeGenderImpressionsClicksSigned_In
count 458441.000000 458441.000000 458441.000000 458441.000000 458441.000000
mean 29.482551 0.367037 5.007316 0.092594 0.700930
std 23.607034 0.481997 2.239349 0.309973 0.457851
min 0.000000 0.000000 0.000000 0.000000 0.000000
25% 0.000000 0.000000 3.000000 0.000000 0.000000
50% 31.000000 0.000000 5.000000 0.000000 1.000000
75% 48.000000 1.000000 6.000000 0.000000 1.000000
max 108.000000 1.000000 20.000000 4.000000 1.000000
\n", + "

8 rows \u00d7 5 columns

\n", + "
" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 4, + "text": [ + " Age Gender Impressions Clicks \\\n", + "count 458441.000000 458441.000000 458441.000000 458441.000000 \n", + "mean 29.482551 0.367037 5.007316 0.092594 \n", + "std 23.607034 0.481997 2.239349 0.309973 \n", + "min 0.000000 0.000000 0.000000 0.000000 \n", + "25% 0.000000 0.000000 3.000000 0.000000 \n", + "50% 31.000000 0.000000 5.000000 0.000000 \n", + "75% 48.000000 1.000000 6.000000 0.000000 \n", + "max 108.000000 1.000000 20.000000 4.000000 \n", + "\n", + " Signed_In \n", + "count 458441.000000 \n", + "mean 0.700930 \n", + "std 0.457851 \n", + "min 0.000000 \n", + "25% 0.000000 \n", + "50% 1.000000 \n", + "75% 1.000000 \n", + "max 1.000000 \n", + "\n", + "[8 rows x 5 columns]" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print data.shape\n", + "data.head()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "(458441, 5)\n" + ] + }, + { + "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", + "
AgeGenderImpressionsClicksSigned_In
0 36 0 3 0 1
1 73 1 3 0 1
2 30 0 3 0 1
3 49 1 3 0 1
4 47 1 11 0 1
\n", + "

5 rows \u00d7 5 columns

\n", + "
" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 7, + "text": [ + " Age Gender Impressions Clicks Signed_In\n", + "0 36 0 3 0 1\n", + "1 73 1 3 0 1\n", + "2 30 0 3 0 1\n", + "3 49 1 3 0 1\n", + "4 47 1 11 0 1\n", + "\n", + "[5 rows x 5 columns]" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the data contains roughly 450,000 rows, and 5 columns. These columns are Age, Gender, Impressions (the number of pages the user viewed), Clicks (the number of ads a user clicked on), and whether or not the user was signed in.\n", + "\n", + "Let's plot the data to get a sense of the distributions." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline\n", + "data.hist(figsize=(10,8))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + }, + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 16, + "text": [ + "array([[,\n", + " ,\n", + " ],\n", + " [,\n", + " ,\n", + " ]], dtype=object)" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\ngbS0tM5dSSKiFrCz1oVuXML/86Lk1oqUNRoNJk+ejMWLF8PZ2RmHDh3CunXrWpz37rvvxnvvvYdn\nn30WTk5O0Ol0ytWlNTU1eOmll3D77bdj0KBBuHDhAlJTUwEA27Ztg7+/P/r06YO5c+ciJydHuS3C\nzTGys7Nx4sQJDB48GI8++iiWLFmC+++/v9H6NbdurcUmakufPn2Qn5+PUaNGoXfv3rjnnnswYsQI\nvPbaawD+s50NGDAA//M//4P58+djwIABOHr0KEaOHNloW25t/1uzZg1qa2vh5+cHJycnPP7440pn\n76mnnsK4ceMQGBiIkSNHYtKkSSZdYMDbeBBRh7VW0DZt2jQZOHCg+Pv7K235+fkSEhIiQUFBMnLk\nSCkoKFCeW7p0qXh5eYmPj49s27ZNad+/f7/4+/uLl5eXPP/880r71atXJSYmRry8vGTUqFFy4sQJ\n5bnMzEzR6XSi0+kkKyvL7OI8W5WQkCB/+tOfrJ0GteDKlSsSGhoqgYGBMmzYMFmwYIGINFxs4ebm\nJkFBQRIUFCRbtmxR5uF+0nWuX78ugwcPFr1eb+1UiIhM1mpnbffu3XLw4MFGnbX77rtPcnNzRURk\ny5YtEhYWJiINV/4FBgZKbW2tFBcXi6enp9TX14uISEhIiHK10/jx42Xr1q0iIvLWW29JUlKSiIjk\n5ORIbGysiIiUlZXJnXfeKRUVFVJRUaH8bY/i4+PZWVO5S5cuiYjItWvXZNSoUbJnzx5JSUmR1157\nrclruZ9Y3rZt26SiokKuXr0qr7zyigwePFiuXr1q7bSIiEzW6mnQsWPHon///o3aBg0apNwTqLKy\nUqmd2rRpE+Li4tCzZ094eHjAy8sL+fn5MBqNqKqqQmhoKABg6tSp2LhxIwBg8+bNiI+PBwBMmjRJ\nGY5p27ZtiIqKgqOjIxwdHREZGdnoxpX2hHc/V78bVxTW1tbi+vXryj4jzdQocj+xvL1798LLywu3\n3347PvnkE2zcuNHiIx307t0bffr0afL44osvLBqXiOxDh8cmSktLw7333os//vGPqK+vx969ewE0\nXDI/evRo5XVarRYlJSXo2bNno6sF3dzclCLhkpIS5VJ4BwcH9OvXD2VlZU0uv7+xLHu0evVqa6dA\nbaivr8ddd92F48ePIykpCcOHD8eGDRvw5ptvYs2aNRg5ciRee+01ODo6cj/pAosWLcKiRYu6NCZv\n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\nRnAAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What can you say about the distributions of these fields?\n", + "\n", + "Some observations.\n", + "\n", + "1. Age - looks like a bell curve, but with a bunch of 0 values. How many new york times visitors do you think are 0? Do you think that 0 represents some kind of default value? Maybe some finer granularity plotting will help us here.\n", + "2. Gender - Ok, it's binary, but would we expect this much of a skew (64/36) in the distribution of genders of readers on sites like the New York Times? Do you think something similar to age is happening here?\n", + "3. Clicks - looks like it's discrete valued, with the vast majority of the values with 0 clicks.\n", + "4. Impressions - kind of looks like a bell curve, but not quite - maybe plotting at finer granularity will help.\n", + "5. Signed In - Looks like another binary variable with more people signed in than not. Can you think of why this might be?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### DIY\n", + "\n", + "1. Plot these histograms at finer granularity by setting the number of histogram bins to 50. What kind of distribution does it look like Impressions follows?\n", + "2. Does the behavior for age look more clear?\n", + "3. Plot a histogram (or summarize the distribution otherwise - maybe a groupby and a describe?) of gender for sessions where the user is signed in (Signed_In == 1) vs not. Do you notice any differences?" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "data.groupby('Signed_In').Gender.describe()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 53, + "text": [ + "Signed_In \n", + "0 count 136177.000000\n", + " mean 0.000000\n", + " std 0.000000\n", + " min 0.000000\n", + " 25% 0.000000\n", + " 50% 0.000000\n", + " 75% 0.000000\n", + " max 0.000000\n", + "1 count 319198.000000\n", + " mean 0.523644\n", + " std 0.499441\n", + " min 0.000000\n", + " 25% 0.000000\n", + " 50% 1.000000\n", + " 75% 1.000000\n", + " max 1.000000\n", + "dtype: float64" + ] + } + ], + "prompt_number": 53 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining New Variables for Analysis\n", + "\n", + "Let's create two new columns of interest. The first is Click Thru Rate (CTR), this is a measure commonly used in online advertising to measure the effectiveness of an Ad Campaign. We will use it to measure differences in behavior between groups of users.\n", + "\n", + "The second thing we'll do is use pandas' `cut` method to turn a continuous variable (Age), into a discrete one - AgeGroup. This makes things like plotting and measuring differences between groups easier.\n", + "\n", + "Before doing any of this, though, we'll copy our data to a new data frame where we remove the cases where there are 0 impressions, because this will cause a divide by zero and possibly bias our analysis. The number of rows affected by this filter is small but non-trivial - these rows may warrant further investigation later!" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "data1 = data[data.Impressions > 0]\n", + "data1['CTR'] = data1['Clicks']/data1['Impressions']\n", + "data1['AgeGroup'] = pd.cut(data1['Age'], [-1,0,18,24,34,44,54,64,1000])\n", + "data1.head()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "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", + "
AgeGenderImpressionsClicksSigned_InCTRAgeGroup
0 36 0 3 0 1 0 (34, 44]
1 73 1 3 0 1 0 (64, 1000]
2 30 0 3 0 1 0 (24, 34]
3 49 1 3 0 1 0 (44, 54]
4 47 1 11 0 1 0 (44, 54]
\n", + "

5 rows \u00d7 7 columns

\n", + "
" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 38, + "text": [ + " Age Gender Impressions Clicks Signed_In CTR AgeGroup\n", + "0 36 0 3 0 1 0 (34, 44]\n", + "1 73 1 3 0 1 0 (64, 1000]\n", + "2 30 0 3 0 1 0 (24, 34]\n", + "3 49 1 3 0 1 0 (44, 54]\n", + "4 47 1 11 0 1 0 (44, 54]\n", + "\n", + "[5 rows x 7 columns]" + ] + } + ], + "prompt_number": 38 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exploring New Metrics" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print data1.shape\n", + "data1.describe()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "(455375, 7)\n" + ] + }, + { + "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", + "
AgeGenderImpressionsClicksSigned_InCTR
count 455375.000000 455375.000000 455375.000000 455375.000000 455375.000000 455375.000000
mean 29.484010 0.367051 5.041030 0.093218 0.700956 0.018471
std 23.606697 0.482001 2.208731 0.310922 0.457839 0.069034
min 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000
25% 0.000000 0.000000 3.000000 0.000000 0.000000 0.000000
50% 31.000000 0.000000 5.000000 0.000000 1.000000 0.000000
75% 48.000000 1.000000 6.000000 0.000000 1.000000 0.000000
max 108.000000 1.000000 20.000000 4.000000 1.000000 1.000000
\n", + "

8 rows \u00d7 6 columns

\n", + "
" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 37, + "text": [ + " Age Gender Impressions Clicks \\\n", + "count 455375.000000 455375.000000 455375.000000 455375.000000 \n", + "mean 29.484010 0.367051 5.041030 0.093218 \n", + "std 23.606697 0.482001 2.208731 0.310922 \n", + "min 0.000000 0.000000 1.000000 0.000000 \n", + "25% 0.000000 0.000000 3.000000 0.000000 \n", + "50% 31.000000 0.000000 5.000000 0.000000 \n", + "75% 48.000000 1.000000 6.000000 0.000000 \n", + "max 108.000000 1.000000 20.000000 4.000000 \n", + "\n", + " Signed_In CTR \n", + "count 455375.000000 455375.000000 \n", + "mean 0.700956 0.018471 \n", + "std 0.457839 0.069034 \n", + "min 0.000000 0.000000 \n", + "25% 0.000000 0.000000 \n", + "50% 1.000000 0.000000 \n", + "75% 1.000000 0.000000 \n", + "max 1.000000 1.000000 \n", + "\n", + "[8 rows x 6 columns]" + ] + } + ], + "prompt_number": 37 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's plot total impressions and clicks by Age Group and whether or not the user is signed in." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "impressionsByAgeSignIn = data1.groupby(['AgeGroup','Signed_In'])['Clicks'].sum()\n", + "impressionsByAgeSignIn.plot(kind='bar')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 60, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n7wNqXvANDg5GRESEdewzaNAgRERE4LbbbtMX1iLXDhVm7Nix6pNPPlGlpaV17rtw4YJKTk5WY8aM\n0VB21R//+EcVGhqqEhIS1Jo1a9SaNWvUkiVLVGhoqFq8eLHWNqWU+uijj5Srq6vy8fFRX3zxherX\nr58aMWKE8vDwUImJibrzbJSUlKi5c+eq2NhY1bt3b905dUjvU0p+o+S+6OholZGRUe99ffr0admY\nWhxy5v/TTz9hxYoVWLduHdq2bYtevXpBKYWioiJUVVVh6tSp+O1vfws3NzetnQcPHsSGDRts3vot\nNjYWgYGBWruuqKiogLOzM9q0aWOd/ffr10/71+16pL7F3xXS+wD5jRL7iouL0b59e9x+++26U2w4\n5OJfW1FREY4dOwag5jrvVy5RTE13+PDheq9Gqovkt5psbW8zCch+q0lpbzMpmrb/c2hUXV1tl8c0\np9YwmroeT09P3QlKKaW2bNmiPDw8lKurq4qJiVFHjx613ifh3caSk5PVHXfcofr166dSUlJUnz59\n1H333ae8vLzUxo0bdecppZR666236vxydXVVy5YtU8uWLdOdp+Lj462//+abb5SXl5eKjo5WHh4e\n6osvvtBYJp9Dnu0THR2N8ePHY8KECXUu8fD9998jJSUFX375pdbrqv/1r3/FihUrsGDBguuOphIT\nE7X1ST2DobZ58+bhH//4BwIDA7F+/XrExMRg9erVuOuuu3SnAQAWL16M/fv3o6ysDEFBQdi9ezf8\n/f1x7NgxTJ48WesVH69YsGABxo0bZx01KqVQXV2NkpISzWU1vvvuO+vvX3vtNaSkpGDgwIE4evQo\nJk+ejHHjxmmsk80hxz7l5eX429/+hqSkJOzfvx+dO3eGUgoXLlxAcHAwHnnkETz88MN6X4mvReJo\nqnPnznjrrbfQrl07ODk5WbcrpfDCCy/gzJkzGutqhISE2JznfeDAAetbTS5atEj7z3XU/tmSoKAg\nHDhwoN77dDp+/Dh+97vfoV+/fta3muzbt6/17C7dan+drv2aSfkaiqXzvx0SVFVVqaKiIlVUVKSq\nqqp051hJH01JPYOhtoiICFVYWGiz7cSJEyokJER17NhRU9VVYWFh6vLly0oppbKysqzbKysrbd6Y\nXILPP/9c3XXXXeqTTz5R3t7eunOs2rdvr4KDg1VwcLDq2LGjKi4uVkrV/LuW9jW81quvvqoSEhLU\n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\njs9OuKAAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 60 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "By Now, we understand that we need to treat groups differently. Let's take our data and divide it into CTRs by age group for those users that *have clicked* on something (CTR > 0) **and** are signed in (Signed_In > 0)." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "loggedInCTRsByAgeGroup = data1[(data1.CTR > 0) & (data1.Signed_In > 0)].groupby('AgeGroup').CTR\n", + "\n", + "loggedInCTRsByAgeGroup.describe()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 102, + "text": [ + "AgeGroup \n", + "(0, 18] count 2371.000000\n", + " mean 0.214738\n", + " std 0.122203\n", + " min 0.058824\n", + " 25% 0.142857\n", + " 50% 0.200000\n", + " 75% 0.250000\n", + " max 1.000000\n", + "(18, 24] count 1669.000000\n", + " mean 0.203926\n", + " std 0.116896\n", + " min 0.066667\n", + " 25% 0.125000\n", + " 50% 0.166667\n", + " 75% 0.250000\n", + " max 1.000000\n", + "(24, 34] count 2870.000000\n", + " mean 0.204344\n", + " std 0.111438\n", + " min 0.066667\n", + " 25% 0.142857\n", + " 50% 0.166667\n", + " 75% 0.250000\n", + " max 1.000000\n", + "(34, 44] count 3592.000000\n", + " mean 0.201586\n", + " std 0.112516\n", + " min 0.066667\n", + " 25% 0.142857\n", + " 50% 0.166667\n", + " 75% 0.250000\n", + " max 1.000000\n", + "(44, 54] count 3139.000000\n", + " mean 0.202531\n", + " std 0.108735\n", + " min 0.062500\n", + " 25% 0.142857\n", + " 50% 0.166667\n", + " 75% 0.250000\n", + " max 1.000000\n", + "(54, 64] count 4337.000000\n", + " mean 0.208181\n", + " std 0.117601\n", + " min 0.062500\n", + " 25% 0.142857\n", + " 50% 0.166667\n", + " 75% 0.250000\n", + " max 1.000000\n", + "(64, 1000] count 4084.000000\n", + " mean 0.208385\n", + " std 0.110372\n", + " min 0.062500\n", + " 25% 0.142857\n", + " 50% 0.166667\n", + " 75% 0.250000\n", + " max 1.000000\n", + "Length: 56, dtype: float64" + ] + } + ], + "prompt_number": 102 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hypothesis Testing\n", + "\n", + "Now that we have several samples of user's click-through behavior. What's a question that we can ask ourselves about these samples?\n", + "\n", + "One question we might ask is \"Which groups of users is **most different**?\" Or, more precisely: Are any groups of users different? If any groups are different, which ones are?\n", + "\n", + "First, we'll collect our groups as separate lists, then, we'll run a T-Test between each pair of groups. Finally, we'll collect the p-values for each pair of groups into a `DataFrame`." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from scipy.stats import ttest_ind\n", + "\n", + "groups = [s for s in loggedInCTRsByAgeGroup]\n", + "\n", + "def run_pairwise_tests(groups):\n", + " for g in groups:\n", + " for g2 in groups:\n", + " if g[0] < g2[0]:\n", + " yield g[0], g2[0], ttest_ind(g[1], g2[1], equal_var=False)[1]\n", + " \n", + "testResults = pd.DataFrame(run_pairwise_tests(groups))" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 105 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### DIY\n", + "\n", + "1. The object `testResults` contains the p-value for the T-test between CTR samples of all pairs of age groups in our data set. Using this sample, what pairs of groups are different at the 95% confidence level? Which groups are most likely to be different, according to these p-values?\n", + "2. What about the other end of the spectrum? Which are least likely to be different? Do these results make intuitive sense to you?" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "testResults[testResults[2] < 0.05].sort(columns=[2])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "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", + "
012
2 (0, 18] (34, 44] 0.000028
3 (0, 18] (44, 54] 0.000121
1 (0, 18] (24, 34] 0.001439
0 (0, 18] (18, 24] 0.004526
17 (34, 44] (64, 1000] 0.007703
16 (34, 44] (54, 64] 0.010931
19 (44, 54] (64, 1000] 0.024254
18 (44, 54] (54, 64] 0.032186
4 (0, 18] (54, 64] 0.033328
5 (0, 18] (64, 1000] 0.037107
\n", + "

10 rows \u00d7 3 columns

\n", + "
" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 108, + "text": [ + " 0 1 2\n", + "2 (0, 18] (34, 44] 0.000028\n", + "3 (0, 18] (44, 54] 0.000121\n", + "1 (0, 18] (24, 34] 0.001439\n", + "0 (0, 18] (18, 24] 0.004526\n", + "17 (34, 44] (64, 1000] 0.007703\n", + "16 (34, 44] (54, 64] 0.010931\n", + "19 (44, 54] (64, 1000] 0.024254\n", + "18 (44, 54] (54, 64] 0.032186\n", + "4 (0, 18] (54, 64] 0.033328\n", + "5 (0, 18] (64, 1000] 0.037107\n", + "\n", + "[10 rows x 3 columns]" + ] + } + ], + "prompt_number": 108 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file